From 0a426c08ac419c558334d89ab79fbbef4e7e3af8 Mon Sep 17 00:00:00 2001
From: jyy <935090232@qq.com>
Date: Mon, 08 Mar 2021 14:15:31 +0800
Subject: [PATCH] Merge branch 'api' into test

---
 zq-erp/src/main/java/com/matrix/system/common/interceptor/HostInterceptor.java                                       |   17 
 zq-erp/src/main/resources/templates/views/admin/shop/templateMsg-list.html                                           |    1 
 zq-erp/src/main/java/com/matrix/system/hive/dto/OrderFlowListDto.java                                                |  126 
 zq-erp/src/main/resources/templates/views/admin/hive-erp/products/shoppinggoods-list.html                            |   18 
 zq-erp/src/main/java/com/matrix/component/wechat/externalInterface/common/HttpsRequest2.java                         |   59 
 zq-erp/src/main/java/com/matrix/system/hive/dao/SysFollowupDao.java                                                  |   44 
 zq-erp/src/main/resources/static/images/pay/wechat.png                                                               |    0 
 zq-erp/src/main/resources/templates/views/admin/hive/beautySalon/orderXq-form-bak2.html                              |  170 
 zq-erp/src/main/java/com/matrix/system/wechart/templateMsg/demo/MsgDemo2.java                                        |   71 
 zq-xcx/project.config.json                                                                                           |   16 
 zq-erp/src/main/resources/config/test/application.properties                                                         |   15 
 zq-erp/src/main/java/com/matrix/system/app/dto/PwdResetDto.java                                                      |   51 
 zq-erp/src/main/java/com/matrix/system/app/vo/ShoppingGoodsDetailVo.java                                             |  225 
 zq-erp/src/main/java/com/matrix/system/app/vo/SkinCheckDetailVo.java                                                 |   80 
 zq-erp/src/main/java/com/matrix/system/shopXcx/api/WeChatApiTools.java                                               |   50 
 zq-erp/src/main/java/com/matrix/component/wechat/externalInterface/service/BaseService.java                          |    4 
 zq-erp/src/main/java/com/matrix/system/hive/service/ShoppingGoodsCategoryService.java                                |    2 
 zq-erp/src/main/java/com/matrix/system/hiveErp/analysUtil/Caculate.java                                              |    4 
 zq-erp/src/main/java/com/matrix/system/hive/bean/SysVipLevel.java                                                    |    8 
 zq-erp/src/main/resources/config/system.properties                                                                   |   14 
 zq-erp/src/main/java/com/matrix/system/app/vo/VipInfoListVo.java                                                     |   90 
 zq-erp/src/main/java/com/matrix/system/wechart/templateMsg/Task/messageBulderDemo/DdqxTemplateMessageBulder.java     |  110 
 zq-erp/src/main/java/com/matrix/system/hive/service/SysVipInfoService.java                                           |   18 
 zq-erp/src/main/resources/templates/views/admin/hive/instore/store-list.html                                         |    3 
 zq-erp/src/main/java/com/matrix/system/hive/bean/AppVersion.java                                                     |   71 
 zq-erp/src/main/java/com/matrix/system/app/dto/ServiceOrderListDto.java                                              |  104 
 zq-erp/src/main/java/com/matrix/system/shopXcx/bean/ShopWxtemplateMsg.java                                           |   89 
 zq-erp/src/main/java/com/matrix/system/app/vo/ServiceOrderListVo.java                                                |  170 
 zq-erp/src/main/java/com/matrix/system/wechart/templateMsg/Task/messageBulderDemo/DefaultTemplateMessageBulder.java  |   99 
 zq-erp/src/main/java/com/matrix/system/hive/service/imp/SysProjUseServiceImpl.java                                   |   86 
 zq-erp/src/main/java/com/matrix/system/app/dto/ShoppingGoodsListDto.java                                             |   93 
 zq-erp/src/main/java/com/matrix/system/shopXcx/mqTask/VipCreateTask.java                                             |   13 
 zq-erp/src/main/resources/mybatis/mapper/hive/ShoppingGoodsDao.xml                                                   |   96 
 zq-erp/src/main/resources/static/images/pay/zhifubao.png                                                             |    0 
 zq-erp/src/main/java/com/matrix/system/hive/action/DepartInfoController.java                                         |    5 
 zq-erp/src/main/resources/config/lhx/system.properties                                                               |    3 
 zq-erp/src/main/resources/templates/views/admin/hive/statistics/jyls.html                                            |  306 
 zq-erp/src/main/java/com/matrix/system/app/dto/ModifyUserDto.java                                                    |  116 
 zq-erp/src/main/java/com/matrix/system/hive/statistics/ServiceStatisticsAction.java                                  |    1 
 zq-erp/src/main/resources/templates/views/admin/hive/beautySalon/underlineOrder.html                                 |    4 
 zq-erp/src/main/java/com/matrix/system/app/mapper/MoneyCardUseMapper.java                                            |   21 
 zq-erp/src/main/java/com/matrix/system/app/action/AppOccupancyController.java                                        |   60 
 zq-erp/src/main/java/com/matrix/system/hive/service/imp/CodeServiceImpl.java                                         |    6 
 zq-erp/src/main/java/com/matrix/system/shopXcx/api/vo/ErpServiceOrderListProjVo.java                                 |   45 
 zq-erp/src/main/java/com/matrix/component/tools/WxTempLateMsgUtil.java                                               |  108 
 zq-erp/src/main/resources/config/lhx/application.properties                                                          |    3 
 zq-erp/src/main/java/com/matrix/system/common/service/impl/InitShopProductCateService.java                           |    6 
 zq-erp/src/main/java/com/matrix/system/hive/service/imp/SysBeauticianStateServiceImpl.java                           |    8 
 zq-erp/src/main/resources/config/test/system.properties                                                              |   12 
 zq-erp/src/main/resources/templates/views/admin/hive/statistics/daily-sale-list.html                                 |  157 
 zq-erp/src/main/java/com/matrix/system/hive/action/OrderController.java                                              |  167 
 zq-erp/src/main/resources/templates/views/admin/hive/operate/label-form.html                                         |   59 
 zq-erp/src/main/java/com/matrix/system/common/actions/CustomerDictionaryAction.java                                  |    4 
 zq-erp/src/main/resources/templates/views/admin/hive/beautySalon/cz-form-bak.html                                    |  239 
 zq-erp/src/main/java/com/matrix/system/hive/service/SysBeauticianStateService.java                                   |    2 
 zq-erp/src/main/resources/templates/views/admin/hive-erp/order/orderXq-form.html                                     |  899 +
 zq-erp/src/main/java/com/matrix/system/hive/statistics/DailySaleVo.java                                              |  412 
 zq-erp/src/main/java/com/matrix/system/app/dto/AddVipDto.java                                                        |  167 
 zq-erp/src/main/resources/templates/views/admin/hive/store/outStore-form.html                                        |    6 
 zq-erp/src/main/java/com/matrix/system/hive/service/imp/SysOrderServiceImpl.java                                     |  771 +
 zq-erp/src/main/resources/templates/views/admin/hive/products/shoppinggoods-md-list.html                             |   14 
 zq-erp/src/main/java/com/matrix/system/app/vo/RankingVo.java                                                         |   69 
 zq-erp/src/main/resources/templates/views/admin/hive/vip/moneyCardUse-form.html                                      |    4 
 zq-erp/src/main/java/com/matrix/system/app/action/ApiStatisticsAction.java                                           |  313 
 zq-erp/src/main/java/com/matrix/system/hive/action/ProjServiceController.java                                        |   10 
 zq-erp/src/main/java/com/matrix/system/app/action/ApiShopInfoAction.java                                             |   43 
 zq-erp/src/main/java/com/matrix/system/app/vo/QuestionVo.java                                                        |   88 
 zq-erp/src/main/resources/config/db/increment/20210109.sql                                                           |    5 
 zq-erp/src/main/java/com/matrix/system/hiveErp/action/ErpShoppingGoodsController.java                                |    7 
 zq-erp/src/main/java/com/matrix/system/hive/action/ShoppingGoodsCategoryController.java                              |   19 
 zq-erp/src/main/java/com/matrix/system/shopXcx/mqTask/MQTaskRouting.java                                             |    6 
 zq-erp/src/main/java/com/matrix/system/hive/dao/MoneyCardAssembleDao.java                                            |    6 
 zq-erp/src/main/java/com/matrix/system/hive/service/SysProjServicesService.java                                      |    7 
 zq-erp/src/main/resources/mybatis/mapper/hive/SysWorkBeatuistaffDao.xml                                              |   28 
 zq-erp/src/main/java/com/matrix/system/app/action/ApiVipInfoAction.java                                              |  227 
 zq-erp/src/main/java/com/matrix/system/app/action/TestAction.java                                                    |   24 
 zq-erp/src/main/java/com/matrix/system/shopXcx/api/dto/ErpOrderListDto.java                                          |   78 
 zq-erp/src/main/java/com/matrix/system/shopXcx/dao/ShopProductDao.java                                               |    2 
 zq-erp/src/main/resources/mybatis/mapper/hive/SysOrderDao.xml                                                        |  202 
 zq-erp/src/main/java/com/matrix/system/hive/pojo/ShoppingCarItemsVo.java                                             |   12 
 zq-erp/src/main/java/com/matrix/system/hiveErp/analysUtil/StatisticsParamVo.java                                     |   35 
 zq-erp/src/main/resources/templates/views/admin/hive/beautySalon/updateOrderTime.html                                |    6 
 zq-erp/src/main/resources/mybatis/mapper/hive/MoneyCardAssembleDao.xml                                               |   20 
 zq-erp/src/main/java/com/matrix/system/hive/service/imp/MoneyCardUseServiceImpl.java                                 |   61 
 zq-erp/src/main/resources/templates/views/admin/hive/statistics/statistics-projuse-sumary.html                       |   17 
 zq-erp/src/main/java/com/matrix/system/app/vo/UserInfoVo.java                                                        |   67 
 zq-erp/src/main/java/com/matrix/system/shopXcx/api/vo/ErpServiceOrderListVo.java                                     |  147 
 zq-erp/src/main/java/com/matrix/system/app/action/ApiKnowledgeAction.java                                            |   66 
 zq-erp/src/main/java/com/matrix/system/app/mapper/SysStoreInfoMapper.java                                            |   33 
 zq-erp/src/main/java/com/matrix/system/app/vo/UserInfoDetailVo.java                                                  |  116 
 zq-erp/src/main/java/com/matrix/system/shopXcx/api/vo/ErpOrderDetailVo.java                                          |  158 
 zq-erp/src/main/resources/mybatis/mapper/hive/MoneyCardUseFlowDao.xml                                                |    2 
 zq-erp/src/main/java/com/matrix/system/hive/action/GoodsTypeController.java                                          |    5 
 zq-erp/src/main/java/com/matrix/system/common/service/SysUsersService.java                                           |    2 
 zq-erp/src/main/java/com/matrix/system/app/action/ApiUsersAction.java                                                |  184 
 zq-erp/src/main/java/com/matrix/system/hive/dao/ArticleDao.java                                                      |    5 
 zq-erp/src/main/java/com/matrix/system/hive/action/ArticleController.java                                            |    8 
 zq-erp/src/main/java/com/matrix/system/shopXcx/api/WeChatGzhApiTools.java                                            |  134 
 zq-erp/src/main/java/com/matrix/system/hive/action/ArticleTypeController.java                                        |   23 
 zq-erp/src/main/resources/mybatis/mapper/xcxShop/ShopWxtemplateMsgDao.xml                                            |   45 
 zq-erp/src/main/java/com/matrix/system/common/interceptor/ApiUserLoginInterceptor.java                               |  129 
 zq-erp/src/main/java/com/matrix/system/hive/dao/SysOrderDao.java                                                     |   21 
 zq-erp/src/main/java/com/matrix/system/hive/service/MoneyCardUseService.java                                         |    6 
 zq-erp/src/main/resources/templates/views/admin/hive/statistics/statistics-moneyCar-item.html                        |    2 
 zq-erp/src/main/resources/mybatis/mapper/hive/SysVipLabelDao.xml                                                     |  165 
 zq-erp/src/main/resources/mybatis/mapper/hive/ShoppingGoodsAssembleDao.xml                                           |   13 
 zq-erp/src/main/java/com/matrix/system/hiveErp/action/ErpVipInfoController.java                                      |   11 
 zq-erp/src/main/java/com/matrix/system/hive/dao/ShoppingGoodsCategoryDao.java                                        |    2 
 zq-erp/src/main/resources/templates/views/admin/hive-erp/statistics/statistics-projSercice-sumary.html               |   19 
 zq-erp/src/main/java/com/matrix/system/app/mapper/SysUsersMapper.java                                                |   53 
 zq-erp/src/main/java/com/matrix/system/app/vo/VipAchieveDataShowVo.java                                              |  147 
 zq-erp/src/main/resources/static/css/styleOne/style.min.css                                                          |    8 
 zq-erp/src/main/java/com/matrix/system/hive/action/OccupancyController.java                                          |   21 
 zq-erp/src/main/resources/generated-sources/annotations/com/matrix/system/app/mapper/MoneyCardUseMapperImpl.java     |   52 
 zq-erp/src/main/java/com/matrix/system/app/dto/VipStatisticsParamDto.java                                            |  100 
 zq-erp/src/main/resources/templates/views/admin/hive-erp/vip/vipInfo-list.html                                       |  104 
 zq-erp/src/main/java/com/matrix/system/wechart/templateMsg/UniformMsgPojo.java                                       |   32 
 zq-erp/src/main/resources/templates/views/admin/hive/vip/tc-form.html                                                |   15 
 zq-erp/src/main/resources/mybatis/mapper/hive/SysVipAlbumDao.xml                                                     |  241 
 zq-erp/src/main/resources/templates/views/admin/hive/beautySalon/updateServiceOrderTime.html                         |    6 
 zq-erp/src/main/resources/templates/views/admin/hive/beautySalon/bj-form-bak.html                                    |  348 
 zq-erp/src/main/java/com/matrix/system/hive/action/SysVipLabelController.java                                        |   65 
 zq-erp/src/main/java/com/matrix/system/app/mapper/QuestionMapper.java                                                |   31 
 zq-erp/src/main/java/com/matrix/system/app/utils/Sms106Send.java                                                     |   65 
 zq-erp/src/main/java/com/matrix/system/hive/service/ShoppingGoodsService.java                                        |    9 
 zq-erp/src/main/java/com/matrix/system/app/vo/ServiceOrderDetailItemVo.java                                          |  107 
 zq-erp/src/main/resources/mybatis/mapper/common/SysUsersDao.xml                                                      |    6 
 zq-erp/src/main/java/com/matrix/system/hive/bean/SysFollowup.java                                                    |  286 
 zq-erp/src/main/resources/static/images/pay/cash.png                                                                 |    0 
 zq-erp/src/main/java/com/matrix/system/hive/action/MoneyCardUseController.java                                       |  115 
 zq-erp/src/main/java/com/matrix/system/hive/bean/Article.java                                                        |   14 
 zq-erp/src/main/java/com/matrix/system/hive/action/SupplierInfoController.java                                       |   10 
 zq-erp/src/main/java/com/matrix/system/shopXcx/api/action/YuyueAction.java                                           |  297 
 zq-erp/src/main/java/com/matrix/system/wechart/templateMsg/UniformMsgParam.java                                      |   49 
 zq-erp/src/main/java/com/matrix/component/wechat/externalInterface/common/Signature.java                             |   20 
 zq-erp/src/main/resources/mybatis/mapper/hive/SysStoreInfoDao.xml                                                    |    8 
 zq-erp/src/main/java/com/matrix/system/constance/Dictionary.java                                                     |   15 
 zq-erp/src/main/resources/templates/views/admin/hive/operate/trainingMaterialsManage-form.html                       |   71 
 zq-erp/src/main/java/com/matrix/config/MvcCoreConfig.java                                                            |   22 
 zq-erp/src/main/java/com/matrix/system/hive/service/imp/SysOrderFlowServiceImpl.java                                 |   71 
 zq-erp/src/main/java/com/matrix/system/app/vo/UserAchieveVo.java                                                     |   91 
 zq-erp/src/main/java/com/matrix/system/hive/bean/SysVipInfo.java                                                     |   52 
 zq-erp/src/main/java/com/matrix/system/app/vo/OrderDetailVo.java                                                     |  184 
 zq-erp/src/main/java/com/matrix/system/hive/service/imp/SysOrderItemServiceImpl.java                                 |    4 
 zq-erp/src/main/resources/templates/views/admin/hive-erp/statistics/daily-sale-list.html                             |  157 
 zq-erp/src/main/resources/mybatis/mapper/hive/ArticleTypeDao.xml                                                     |   22 
 zq-erp/src/main/java/com/matrix/system/app/dto/LoginDto.java                                                         |   38 
 zq-erp/src/main/java/com/matrix/system/hive/bean/SysSkinCheckRecord.java                                             |   11 
 zq-erp/src/main/resources/mybatis/mapper/hive/SysBusinessDataDao.xml                                                 |  408 
 zq-erp/src/main/resources/templates/views/admin/hive-erp/statistics/statistics-projuse-item.html                     |   17 
 zq-erp/src/main/java/com/matrix/system/app/dto/StoreInOutListDto.java                                                |   54 
 zq-erp/src/main/java/com/matrix/system/app/action/ApiVipLabelAction.java                                             |   82 
 zq-erp/.gitignore                                                                                                    |    1 
 zq-erp/src/main/resources/config/prd/application.properties                                                          |   17 
 zq-erp/src/main/java/com/matrix/system/shopXcx/api/action/WxShopProduct.java                                         |    3 
 zq-erp/src/main/java/com/matrix/system/wechart/templateMsg/Task/messageBulderDemo/FwwcTemplateMessageBulder.java     |  109 
 zq-erp/src/main/java/com/matrix/system/app/vo/ShoppingGoodsListVo.java                                               |  118 
 zq-erp/src/main/java/com/matrix/system/hive/action/CardLevelController.java                                          |    1 
 zq-erp/src/main/java/com/matrix/system/wechart/templateMsg/Task/messageBulderDemo/YycgTemplateMessageBulder.java     |  113 
 zq-erp/src/main/resources/mybatis/mapper/hive/ShoppingGoodsCategoryDao.xml                                           |   16 
 zq-erp/src/main/resources/mybatis/mapper/hive/SysProjServicesDao.xml                                                 |  254 
 zq-erp/src/main/java/com/matrix/system/app/vo/ServiceTcVo.java                                                       |  126 
 zq-erp/src/main/resources/mybatis/mapper/hive/SysOrderFlowDao.xml                                                    |  190 
 zq-erp/src/main/java/com/matrix/system/hive/action/ProjUseController.java                                            |  107 
 zq-erp/src/main/resources/config/dev/system.properties                                                               |    6 
 zq-erp/src/main/java/com/matrix/system/app/dto/OrderListDto.java                                                     |   84 
 zq-erp/src/main/java/com/matrix/system/hive/bean/SysVipLabel.java                                                    |   72 
 zq-erp/src/main/java/com/matrix/core/pojo/PaginationDto.java                                                         |   75 
 zq-erp/src/main/java/com/matrix/system/hive/dao/SysFollowupCommentDao.java                                           |   42 
 zq-erp/src/main/java/com/matrix/system/hive/bean/SysInstoreInfo.java                                                 |    1 
 zq-erp/src/main/java/com/matrix/system/hive/dao/SysVipInfoDao.java                                                   |   10 
 zq-erp/src/main/java/com/matrix/system/hive/pojo/CzXkVo.java                                                         |   14 
 zq-erp/src/main/java/com/matrix/config/RabbitMqConfig.java                                                           |   11 
 zq-erp/src/main/java/com/matrix/system/hive/bean/AchieveNew.java                                                     |   37 
 zq-erp/src/main/resources/mybatis/mapper/hive/SysOrderItemDao.xml                                                    |   37 
 zq-erp/src/main/resources/mybatis/mapper/hive/SysFollowupCommentDao.xml                                              |  228 
 zq-erp/src/main/resources/templates/views/admin/hive/statistics/statistics-moneyCar-summary.html                     |   34 
 zq-erp/src/main/java/com/matrix/system/app/action/ApiServiceOrderAction.java                                         |  299 
 zq-erp/src/main/resources/templates/views/admin/hive-erp/statistics/statistics-moneyCar-summary.html                 |   35 
 zq-erp/src/main/java/com/matrix/system/app/dto/FollowupListDto.java                                                  |  135 
 zq-erp/src/main/java/com/matrix/system/hive/bean/SysOrderFlow.java                                                   |  200 
 zq-erp/src/main/java/com/matrix/system/common/constance/AppConstance.java                                            |   44 
 zq-erp/src/main/java/com/matrix/system/hive/service/imp/ShoppingGoodsCategoryServiceImpl.java                        |    7 
 zq-erp/src/main/java/com/matrix/system/app/action/ApiFollowupAction.java                                             |  184 
 zq-erp/src/main/resources/templates/views/admin/hive/statistics/statistics-projSercice-sumary.html                   |   19 
 zq-erp/src/main/java/com/matrix/system/app/dto/ModifyVipDto.java                                                     |  181 
 zq-erp/pom.xml                                                                                                       |   56 
 zq-erp/src/main/resources/templates/views/admin/hive-erp/statistics/jyls.html                                        |  332 
 zq-erp/src/main/java/com/matrix/system/app/dto/BusinessesDto.java                                                    |   45 
 zq-erp/src/main/resources/static/images/pay/yinlian.png                                                              |    0 
 zq-erp/src/main/resources/config/xcx/system.properties                                                               |   47 
 zq-erp/src/main/java/com/matrix/system/shopXcx/mqTask/templateMsg/AppointmentSuccess.java                            |    2 
 zq-erp/src/main/java/com/matrix/system/shopXcx/action/ShopRefundRecordAction.java                                    |    8 
 zq-erp/src/main/java/com/matrix/system/app/dto/CreateServiceOrderDto.java                                            |  100 
 zq-erp/src/main/java/com/matrix/system/shopXcx/action/ShopWxtemplateMsgAction.java                                   |   18 
 zq-erp/src/main/java/com/matrix/system/hive/bean/SysStoreInfo.java                                                   |   11 
 zq-erp/src/main/java/com/matrix/system/app/vo/StoreInOutListVo.java                                                  |   62 
 zq-erp/src/main/java/com/matrix/system/hive/bean/SysFollowupComment.java                                             |   90 
 zq-erp/src/main/java/com/matrix/system/hive/service/imp/ShoppingGoodsServiceImpl.java                                |   72 
 zq-erp/src/main/java/com/matrix/system/hive/bean/SysProjServices.java                                                |   41 
 zq-erp/src/main/java/com/matrix/system/hive/statistics/SysBusinessDataAction.java                                    |   57 
 zq-erp/src/main/java/com/matrix/system/hive/dao/SysBusinessDataDao.java                                              |   12 
 zq-erp/src/main/java/com/matrix/system/shopXcx/api/dto/ErpServiceCommentDto.java                                     |   41 
 zq-erp/src/main/java/com/matrix/system/app/vo/ServiceOrderDetailVo.java                                              |  140 
 zq-erp/src/main/java/com/matrix/system/hive/plugin/util/ImageUtil.java                                               |   86 
 zq-erp/src/main/java/com/matrix/system/hive/service/SysOrderService.java                                             |   14 
 zq-erp/src/main/java/com/matrix/system/job/ServiceOvertimeNoticeJob.java                                             |   65 
 zq-erp/src/main/java/com/matrix/system/app/vo/StoreListVo.java                                                       |   67 
 zq-erp/src/main/java/com/matrix/system/app/dto/UploadPhotoDto.java                                                   |   26 
 zq-erp/src/main/java/com/matrix/system/shopXcx/api/action/WXShopOrderAction.java                                     |    1 
 zq-erp/src/main/java/com/matrix/system/hive/dao/SysProjServicesDao.java                                              |   43 
 zq-erp/src/main/java/com/matrix/system/hive/dao/AchieveNewDao.java                                                   |   19 
 zq-erp/src/main/java/com/matrix/system/hive/service/SysProjUseService.java                                           |   21 
 zq-erp/src/main/java/com/matrix/system/app/vo/ServiceProductListVo.java                                              |   58 
 zq-erp/src/main/java/com/matrix/system/hive/bean/SysVipAlbum.java                                                    |   96 
 zq-erp/src/main/java/com/matrix/system/app/dto/ServiceVipProjDto.java                                                |   48 
 zq-erp/src/main/java/com/matrix/system/app/dto/VipInfoListDto.java                                                   |  122 
 zq-erp/src/main/java/com/matrix/system/app/vo/ServiceOrderListProjVo.java                                            |   47 
 zq-erp/src/main/java/com/matrix/system/hive/dao/SysVipLabelDao.java                                                  |   16 
 zq-erp/src/main/java/com/matrix/system/wechart/templateMsg/Task/UniformMsgSentTask.java                              |  115 
 zq-erp/src/main/java/com/matrix/system/app/mapper/SysBeauticianStateMapper.java                                      |   34 
 zq-erp/src/main/java/com/matrix/system/hive/bean/SysOrder.java                                                       |   43 
 zq-erp/src/main/resources/templates/views/admin/hive/statistics/statistics-projuse-item.html                         |   17 
 zq-erp/src/main/java/com/matrix/system/app/dto/BeauticianDto.java                                                    |   41 
 zq-erp/src/main/resources/templates/views/admin/shop/templateMsg-form.html                                           |   13 
 zq-erp/src/main/java/com/matrix/component/wechat/externalInterface/protocol/paramProtocol/BrandWCPayRequestData.java |    6 
 zq-erp/src/main/java/com/matrix/system/hive/bean/SysProjUse.java                                                     |   71 
 zq-erp/src/main/resources/templates/views/admin/shop/shopProduct-form.html                                           |   20 
 zq-erp/src/main/java/com/matrix/system/app/dto/CreateServiceOrderItemDto.java                                        |   41 
 zq-erp/src/main/resources/mybatis/mapper/xcxShop/ShopProductDao.xml                                                  |   10 
 zq-erp/src/main/java/com/matrix/system/hive/bean/ShoppingGoodsCategory2.java                                         |  112 
 zq-erp/src/main/java/com/matrix/system/hive/statistics/AchieveAction.java                                            |   45 
 zq-erp/src/main/java/com/matrix/system/app/action/ApiRankingAction.java                                              |   89 
 zq-erp/src/main/java/com/matrix/system/hive/dao/ShoppingGoodsDao.java                                                |    6 
 zq-erp/src/main/java/com/matrix/system/hiveErp/action/DataAnalysisCustomer.java                                      |   75 
 zq-erp/src/main/resources/config/application.properties                                                              |   12 
 zq-erp/src/main/resources/templates/views/admin/hive-erp/statistics/statistics-projuse-sumary.html                   |   17 
 zq-erp/src/main/java/com/matrix/system/hive/service/ArticleService.java                                              |    1 
 zq-erp/src/main/java/com/matrix/system/common/service/impl/SysUsersServiceImpl.java                                  |    5 
 zq-erp/src/main/resources/mybatis/mapper/hive/SysSkinCheckRecordDao.xml                                              |    9 
 zq-erp/src/main/resources/mybatis/mapper/hive/TjVipSumDao.xml                                                        |  641 +
 zq-erp/src/main/java/com/matrix/system/shopXcx/api/WxUserAction.java                                                 |    7 
 zq-erp/src/main/java/com/matrix/system/wechart/templateMsg/GzhTemplateMessagePojo.java                               |  134 
 zq-erp/src/main/java/com/matrix/system/hive/service/SysOrderFlowService.java                                         |   17 
 zq-erp/src/test/java/com/matrix/SourceFlowTests.java                                                                 |   86 
 zq-erp/src/main/java/com/matrix/system/shopXcx/api/service/impl/WxShopRefundRecordServiceImpl.java                   |    5 
 zq-erp/src/main/java/com/matrix/system/app/authority/AppAuthorityManager.java                                        |  223 
 zq-erp/src/main/java/com/matrix/system/app/dto/IdSubmitDto.java                                                      |   26 
 zq-erp/src/main/java/com/matrix/system/wechart/templateMsg/demo/MsgDemo3.java                                        |   35 
 zq-erp/src/main/java/com/matrix/system/app/dto/CreateOderItemDto.java                                                |   67 
 zq-erp/src/main/java/com/matrix/system/hive/service/imp/SysProjServicesServiceImpl.java                              |   89 
 zq-erp/src/main/java/com/matrix/system/hive/statistics/StatisticsBusinessDataJob.java                                |    2 
 zq-erp/src/main/java/com/matrix/system/app/dto/BasePageDto.java                                                      |   38 
 zq-erp/src/main/java/com/matrix/system/app/dto/QuestionAnswerDto.java                                                |   38 
 zq-erp/src/main/resources/mybatis/mapper/hive/SysFollowupDao.xml                                                     |  405 
 zq-erp/src/main/resources/templates/views/admin/hive/beautySalon/pbxq-form.html                                      |   51 
 zq-erp/src/main/java/com/matrix/core/pojo/PaginationVO.java                                                          |    2 
 zq-erp/src/main/java/com/matrix/system/app/dto/RankingDto.java                                                       |   43 
 zq-erp/src/main/resources/mybatis/mapper/hive/SysProjUseDao.xml                                                      |  201 
 zq-erp/src/main/java/com/matrix/system/app/action/ApiCommonAction.java                                               |  223 
 zq-erp/src/main/java/com/matrix/system/app/vo/VipInfoVo.java                                                         |  125 
 zq-erp/src/main/java/com/matrix/system/hive/action/TaocanController.java                                             |   66 
 zq-erp/src/main/resources/templates/views/super/sysCompany-form.html                                                 |    2 
 zq-erp/src/main/java/com/matrix/system/app/vo/VipInfoDetailVo.java                                                   |  195 
 zq-erp/src/main/java/com/matrix/system/hive/bean/ArticleType.java                                                    |   21 
 zq-erp/src/main/resources/templates/views/admin/hive/beautySalon/bj-form.html                                        |  680 
 zq-erp/src/main/java/com/matrix/system/shopXcx/mqTask/OrderTask.java                                                 |   42 
 zq-erp/src/main/java/com/matrix/system/hive/service/CodeService.java                                                 |    2 
 zq-erp/src/main/java/com/matrix/system/app/mapper/SysProjUseMapper.java                                              |   37 
 zq-erp/src/main/java/com/matrix/config/SwaggerConfig.java                                                            |   57 
 zq-erp/src/main/java/com/matrix/core/tools/rr/GroovyDome.java                                                        |   34 
 zq-erp/src/main/java/com/matrix/system/common/actions/AdminAction.java                                               |   34 
 zq-erp/src/main/resources/mybatis/mapper/hive/SysVipInfoDao.xml                                                      |  167 
 zq-erp/src/main/java/com/matrix/system/app/dto/ArticleListDto.java                                                   |   26 
 zq-erp/src/main/java/com/matrix/system/hive/dao/ShoppingGoodsAssembleDao.java                                        |    3 
 zq-erp/src/main/java/com/matrix/system/app/dto/SkinCheckListDto.java                                                 |   22 
 zq-erp/src/main/java/com/matrix/system/app/mapper/SysWorkBeatuistaffMapper.java                                      |   25 
 zq-erp/src/main/resources/mybatis/mybatis-config.xml                                                                 |    1 
 zq-erp/src/main/resources/templates/views/admin/hive/beautySalon/vip.html                                            |   94 
 zq-erp/src/main/java/com/matrix/system/hive/dao/SysVipAlbumDao.java                                                  |   42 
 zq-erp/src/main/java/com/matrix/system/app/dto/PwdModifyDto.java                                                     |   38 
 zq-erp/src/main/java/com/matrix/system/shopXcx/api/action/WxErpOrderAction.java                                      |  139 
 zq-erp/src/main/resources/static/images/pay/card.png                                                                 |    0 
 zq-erp/src/main/java/com/matrix/system/hive/service/SysOrderItemService.java                                         |    5 
 zq-erp/src/main/java/com/matrix/system/hive/service/imp/AchieveNewServiceImpl.java                                   |  104 
 zq-erp/src/main/java/com/matrix/component/wechat/externalInterface/protocol/payComProtocol/JsApiPayComReqData.java   |    6 
 zq-erp/src/main/java/com/matrix/system/app/vo/BeauticianVo.java                                                      |   61 
 zq-erp/src/main/java/com/matrix/system/hive/dao/SysOrderItemDao.java                                                 |    6 
 zq-erp/src/main/resources/config/xcx/application.properties                                                          |   40 
 zq-erp/src/main/resources/templates/views/admin/hive-erp/order/projService-list.html                                 |    2 
 zq-erp/src/main/java/com/matrix/system/hive/statistics/OrderFlowAction.java                                          |  137 
 zq-erp/src/main/java/com/matrix/system/app/vo/OrderDetailAchieveItemVo.java                                          |   36 
 zq-erp/src/main/java/com/matrix/system/app/vo/SkinCheckListVo.java                                                   |   69 
 zq-erp/src/main/resources/templates/views/admin/hive/beautySalon/orderXq-form.html                                   |  917 +
 zq-erp/src/main/resources/templates/views/admin/hive/beautySalon/order-form.html                                     |  654 +
 zq-erp/src/main/resources/templates/views/admin/hive-erp/statistics/statistics-projSercice-item.html                 |   29 
 zq-erp/src/main/java/com/matrix/system/hive/service/imp/DataAnalysisCustomerServiceImpl.java                         |  192 
 zq-erp/src/main/java/com/matrix/system/hiveErp/action/ErpOrderController.java                                        |    2 
 zq-erp/src/main/resources/mybatis/mapper/xcxShop/ShopProductAttributeDao.xml                                         |    4 
 zq-erp/src/main/java/com/matrix/system/app/dto/UsersQueryDto.java                                                    |   23 
 zq-erp/src/main/java/com/matrix/system/app/mapper/SysSkinCheckRecordMapper.java                                      |   38 
 zq-erp/src/main/resources/mybatis/mapper/hive/SysBeauticianStateDao.xml                                              |    9 
 zq-erp/src/main/java/com/matrix/system/app/vo/BusinessesDataShowVo.java                                              |  300 
 zq-erp/src/main/resources/templates/views/admin/hive/operate/label-list.html                                         |  146 
 zq-erp/src/main/java/com/matrix/system/hive/service/imp/SysVipInfoServiceImpl.java                                   |  224 
 zq-erp/src/main/resources/mybatis/mapper/hive/AchieveNewDao.xml                                                      |  154 
 zq-erp/src/main/java/com/matrix/component/tools/HttpClientUtil.java                                                  |   55 
 zq-erp/src/main/java/com/matrix/system/common/dao/SysUsersDao.java                                                   |    2 
 zq-erp/src/main/java/com/matrix/component/wechat/externalInterface/protocol/refundProtocol/RefundReqData.java        |    8 
 zq-erp/src/main/java/com/matrix/system/hive/dao/SysProjUseDao.java                                                   |   10 
 zq-erp/src/main/java/com/matrix/system/app/action/ApiStoreAction.java                                                |   82 
 zq-erp/src/main/resources/static/images/pay/tuan.png                                                                 |    0 
 zq-erp/src/main/java/com/matrix/system/app/vo/VipCardListVo.java                                                     |   78 
 zq-erp/src/main/java/com/matrix/system/hive/dao/SysOrderFlowDao.java                                                 |   26 
 zq-erp/src/main/resources/templates/views/admin/sys/admin-form.html                                                  |    2 
 zq-erp/src/main/java/com/matrix/system/hive/bean/MoneyCardUse.java                                                   |   15 
 zq-erp/src/main/java/com/matrix/system/wechart/templateMsg/Task/messageBulderDemo/GmcgTemplateMessageBulder.java     |  106 
 zq-erp/src/main/java/com/matrix/system/app/action/ApiSkinCheckAction.java                                            |   92 
 zq-erp/src/main/java/com/matrix/system/shopXcx/api/vo/ErpOrderDetailItemVo.java                                      |   63 
 zq-erp/src/main/java/com/matrix/component/wechat/externalInterface/weixinUtil/WeixinServiceUtil.java                 |   62 
 zq-erp/src/main/java/com/matrix/system/hiveErp/dao/TjVipSumDao.java                                                  |   90 
 zq-erp/src/main/java/com/matrix/system/app/vo/OrderDetailItemVo.java                                                 |  125 
 zq-erp/src/main/java/com/matrix/system/hive/bean/SysProjUseFlow.java                                                 |  200 
 zq-erp/src/main/java/com/matrix/system/hive/service/imp/ArticleServiceImpl.java                                      |    7 
 zq-erp/src/main/resources/mybatis/mapper/hive/ArticleDao.xml                                                         |   51 
 zq-erp/src/main/resources/mybatis/mapper/hive/SysVipLevelDao.xml                                                     |   16 
 zq-erp/src/main/java/com/matrix/system/shopXcx/api/action/WxCommonAction.java                                        |   13 
 zq-erp/src/main/java/com/matrix/system/app/vo/SkinCheckDiagnoseItemVo.java                                           |   31 
 zq-erp/src/main/java/com/matrix/system/wechart/templateMsg/Task/messageBulderDemo/CzcgTemplateMessageBulder.java     |  110 
 zq-erp/src/main/java/com/matrix/component/wechat/externalInterface/protocol/payProtocol/JsApiPayReqData.java         |   23 
 zq-erp/src/main/java/com/matrix/system/shopXcx/api/vo/ErpOrderDetailFlowVo.java                                      |   37 
 zq-erp/src/main/java/com/matrix/system/app/mapper/SysProjServiceMapper.java                                          |   22 
 zq-erp/src/main/resources/static/images/pay/qian.png                                                                 |    0 
 zq-erp/src/main/resources/templates/views/admin/hive-erp/statistics/statistics-moneyCar-item.html                    |    2 
 zq-erp/src/main/java/com/matrix/component/rabbitmq/RabiitMqTemplate.java                                             |    1 
 zq-erp/src/main/resources/templates/views/admin/hive/vip/projUse-form.html                                           |   21 
 zq-erp/src/main/resources/templates/views/admin/hive/statistics/statistics-projSercice-item.html                     |   34 
 zq-erp/src/main/java/com/matrix/system/app/dto/SmsCodeDto.java                                                       |   26 
 zq-erp/src/main/java/com/matrix/system/app/dto/LabelDto.java                                                         |   36 
 zq-erp/src/main/java/com/matrix/system/wechart/templateMsg/Task/TemplateMessageBulder.java                           |   19 
 zq-erp/src/main/java/com/matrix/system/app/dto/QuestionAnswerItemDto.java                                            |   56 
 zq-erp/src/main/resources/templates/views/admin/hive/beautySalon/service_all_list.html                               |    9 
 zq-erp/src/main/resources/templates/views/admin/hive/products/shoppinggoods-zb-list.html                             |   16 
 zq-erp/src/main/java/com/matrix/system/hive/bean/SysVipLabelRelate.java                                              |   41 
 zq-erp/src/main/resources/mybatis/mapper/hive/MoneyCardUseDao.xml                                                    |   11 
 zq-erp/src/main/resources/templates/views/admin/hive/beautySalon/cz-form.html                                        |  563 
 zq-erp/src/main/java/com/matrix/system/shopXcx/api/dto/ErpServiceOrderListDto.java                                   |   50 
 zq-erp/src/main/java/com/matrix/system/wechart/templateMsg/Task/messageBulderDemo/YydsTemplateMessageBulder.java     |  116 
 zq-erp/src/main/resources/static/js/systools/AjaxProxyVue.js                                                         |   11 
 zq-erp/src/main/resources/templates/views/admin/hive/beautySalon/projUseFlow-list.html                               |  128 
 zq-erp/src/main/java/com/matrix/system/app/action/ApiOrderAction.java                                                |  186 
 zq-erp/src/main/java/com/matrix/system/app/vo/SkinCheckAnalysisItems.java                                            |   77 
 zq-erp/src/main/java/com/matrix/system/hive/bean/SysOrderItem.java                                                   |   39 
 zq-erp/src/main/java/com/matrix/system/shopXcx/dao/ShopWxtemplateMsgDao.java                                         |    2 
 zq-erp/src/main/java/com/matrix/system/app/vo/ServiceProjVo.java                                                     |  115 
 zq-erp/src/main/java/com/matrix/component/wechat/externalInterface/protocol/queryProtocol/ScanPayQueryReqData.java   |    6 
 zq-erp/src/main/java/com/matrix/system/hive/action/ProjTypeController.java                                           |    5 
 zq-erp/src/main/resources/templates/views/admin/hive/vip/moneyCardUseFlow-list.html                                  |   70 
 zq-erp/src/main/java/com/matrix/system/app/dto/CreateOrderDto.java                                                   |   39 
 /dev/null                                                                                                            |   19 
 zq-erp/src/main/java/com/matrix/core/tools/rr/GlueFactory.java                                                       |   23 
 zq-erp/src/main/java/com/matrix/component/wechat/externalInterface/common/WechatConfigure.java                       |   19 
 zq-erp/src/main/java/com/matrix/system/hive/action/ShoppingGoodsController.java                                      |    7 
 zq-erp/src/main/java/com/matrix/system/hive/vo/OrderFlowVo.java                                                      |  152 
 zq-erp/src/main/resources/templates/views/admin/hive-erp/store/store-list.html                                       |    2 
 zq-erp/src/main/java/com/matrix/core/exception/GlobalExceptionHandler.java                                           |   34 
 zq-erp/src/main/java/com/matrix/system/hive/service/AchieveNewService.java                                           |    6 
 zq-erp/src/main/java/com/matrix/system/app/dto/StoreListDto.java                                                     |   23 
 368 files changed, 24,979 insertions(+), 2,887 deletions(-)

diff --git a/zq-erp/.gitignore b/zq-erp/.gitignore
index 2742ce7..7f64141 100644
--- a/zq-erp/.gitignore
+++ b/zq-erp/.gitignore
@@ -25,6 +25,7 @@
 .idea/sqlDataSources.xml
 .idea/dynamic.xml
 .idea/uiDesigner.xml
+*/resources/generated-sources/*
 # Gradle:
 .idea/gradle.xml
 .idea/
diff --git a/zq-erp/pom.xml b/zq-erp/pom.xml
index 1898a84..a1baf69 100644
--- a/zq-erp/pom.xml
+++ b/zq-erp/pom.xml
@@ -341,7 +341,43 @@
             <artifactId>alibaba-dingtalk-service-sdk</artifactId>
             <version>1.0.1</version>
         </dependency>
-      </dependencies>
+
+        <!-- swagger2 start -->
+        <dependency>
+            <groupId>io.springfox</groupId>
+            <artifactId>springfox-swagger2</artifactId>
+            <version>2.9.2</version>
+        </dependency>
+        <dependency>
+            <groupId>io.swagger</groupId>
+            <artifactId>swagger-annotations</artifactId>
+            <version>1.5.23</version>
+        </dependency>
+        <dependency>
+            <groupId>io.swagger</groupId>
+            <artifactId>swagger-models</artifactId>
+            <version>1.5.23</version>
+        </dependency>
+        <dependency>
+            <groupId>io.springfox</groupId>
+            <artifactId>springfox-swagger-ui</artifactId>
+            <version>2.9.2</version>
+        </dependency>
+        <!-- swagger2 end -->
+
+        <!-- https://mvnrepository.com/artifact/org.mapstruct/mapstruct -->
+        <dependency>
+            <groupId>org.mapstruct</groupId>
+            <artifactId>mapstruct</artifactId>
+            <version>1.3.0.Final</version>
+        </dependency>
+
+        <dependency>
+            <groupId>cn.hutool</groupId>
+            <artifactId>hutool-all</artifactId>
+            <version>5.3.1</version>
+        </dependency>
+    </dependencies>
     <build>
         <resources>
             <resource>
@@ -355,10 +391,10 @@
                     <exclude>config/xcx/*</exclude>
 
                     <!-- -->
+                    <exclude>config/config.json</exclude>
+                    <exclude>config/application.properties</exclude>
+                    <exclude>config/system.properties</exclude>
 
-                       <exclude>config/config.json</exclude>
-                         <exclude>config/application.properties</exclude>
-                         <exclude>config/system.properties</exclude>
 
 
 
@@ -394,6 +430,18 @@
             <plugin>
                 <groupId>org.apache.maven.plugins</groupId>
                 <artifactId>maven-compiler-plugin</artifactId>
+                <version>3.5.1</version>
+                <configuration>
+                    <source>1.8</source>
+                    <target>1.8</target>
+                    <annotationProcessorPaths>
+                        <path>
+                            <groupId>org.mapstruct</groupId>
+                            <artifactId>mapstruct-processor</artifactId>
+                            <version>1.3.0.Final</version>
+                        </path>
+                    </annotationProcessorPaths>
+                </configuration>
             </plugin>
 
             <!-- 热部署插件 -->
diff --git a/zq-erp/src/main/java/com/matrix/component/rabbitmq/RabiitMqTemplate.java b/zq-erp/src/main/java/com/matrix/component/rabbitmq/RabiitMqTemplate.java
index 89fea6d..bf51909 100644
--- a/zq-erp/src/main/java/com/matrix/component/rabbitmq/RabiitMqTemplate.java
+++ b/zq-erp/src/main/java/com/matrix/component/rabbitmq/RabiitMqTemplate.java
@@ -84,6 +84,7 @@
                 if (task != null) {
                     // 消息内容
                     if (StringUtils.isNotBlank(content)) {
+                        LogUtil.info("本次发送消息task.getExchange()="+task.getExchange()+";routingKey="+routingKey+";content="+content);
                         channel.basicPublish(task.getExchange(), routingKey, false, null, content.getBytes());
                     } else {
                         LogUtil.info("本次发送空消息");
diff --git a/zq-erp/src/main/java/com/matrix/component/tools/HttpClientUtil.java b/zq-erp/src/main/java/com/matrix/component/tools/HttpClientUtil.java
new file mode 100644
index 0000000..cbc64d4
--- /dev/null
+++ b/zq-erp/src/main/java/com/matrix/component/tools/HttpClientUtil.java
@@ -0,0 +1,55 @@
+package com.matrix.component.tools;
+
+import com.alibaba.fastjson.JSON;
+import com.alibaba.fastjson.JSONObject;
+import com.matrix.core.exception.GlobleException;
+import com.matrix.core.tools.LogUtil;
+import org.apache.http.client.ResponseHandler;
+import org.apache.http.client.methods.HttpPost;
+import org.apache.http.entity.StringEntity;
+import org.apache.http.impl.client.BasicResponseHandler;
+import org.apache.http.impl.client.CloseableHttpClient;
+import org.apache.http.impl.client.HttpClients;
+
+import java.io.IOException;
+
+/**
+ * POST 请求工具
+ */
+public class HttpClientUtil {
+
+    public static JSONObject sendPostWithJson(String url, String json) {
+
+        CloseableHttpClient httpClient = HttpClients.createDefault();
+        ResponseHandler<String> responseHandler = new BasicResponseHandler();
+        try {
+            //第一步:创建HttpClient对象
+            httpClient = HttpClients.createDefault();
+
+            //第二步:创建httpPost对象
+            HttpPost httpPost = new HttpPost(url);
+
+            //第三步:给httpPost设置JSON格式的参数
+            StringEntity requestEntity = new StringEntity(json, "utf-8");
+            requestEntity.setContentEncoding("UTF-8");
+            httpPost.setHeader("Content-type", "application/json");
+            httpPost.setEntity(requestEntity);
+            //第四步:发送HttpPost请求,获取返回值
+            String returnValue = httpClient.execute(httpPost, responseHandler); //调接口获取返回值时,必须用此方法
+            return JSON.parseObject(returnValue);
+        } catch (Exception e) {
+            e.printStackTrace();
+        } finally {
+            try {
+                httpClient.close();
+            } catch (IOException e) {
+                LogUtil.error("http请求发送失败", e);
+                throw new GlobleException(e.getMessage());
+            }
+        }
+        //第五步:处理返回值
+        return null;
+    }
+
+
+}
diff --git a/zq-erp/src/main/java/com/matrix/component/tools/WxTempLateMsgUtil.java b/zq-erp/src/main/java/com/matrix/component/tools/WxTempLateMsgUtil.java
index 35f2685..160f8b4 100644
--- a/zq-erp/src/main/java/com/matrix/component/tools/WxTempLateMsgUtil.java
+++ b/zq-erp/src/main/java/com/matrix/component/tools/WxTempLateMsgUtil.java
@@ -1,15 +1,7 @@
 package com.matrix.component.tools;
 
-import com.matrix.core.tools.LogUtil;
-import com.matrix.core.tools.StringUtils;
-import com.matrix.system.shopXcx.api.WeChatApiTools;
-import net.sf.json.JSONObject;
-
-import java.io.IOException;
 import java.util.Arrays;
-import java.util.HashMap;
 import java.util.List;
-import java.util.Map;
 
 /**
  * 小程序消息模板
@@ -141,87 +133,7 @@
     public static int sendWxTemplateMsg(List<String> valueList, String openId,
                                         String page, String tempId, String formId) {
 
-        if (StringUtils.isBlank(openId)) {
-            return 0;
-        }
 
-        String access_token = "";
-        try {
-            access_token = WeChatApiTools.getAccessToken();
-        } catch (IOException e1) {
-            LogUtil.error("获取accesstoken失败", e1.getMessage());
-        }
-        // 发送模板URL
-        String url = WxApiConstants.XCX_TEMPLATEMSG_SEN.replace("ACCESS_TOKEN", access_token);
-        WxTemplate temp = new WxTemplate();
-        // 跳转地址
-        if (StringUtils.isNotBlank(page)) {
-            temp.setPage(page);
-        }
-        temp.setTouser(openId);
-        // 消息模版ID
-        temp.setTemplateId(tempId);
-
-        Map<String, Object> tempLateMsgMap = new HashMap<String, Object>();
-        // 设置模板消息的值
-        for (int i = 0; i < valueList.size(); i++) {
-            TemplateData keyword = new TemplateData();
-            keyword.setValue(valueList.get(i));
-            tempLateMsgMap.put(TEMP_KEYWORD + (i + 1), keyword);
-        }
-        temp.setData(tempLateMsgMap);
-        String jsonString = JSONObject.fromObject(temp).toString();
-
-        LogUtil.info("组装模板消息={}", jsonString);
-        HttpRequest reqObj = new HttpRequest();
-        HttpResponse result = null;
-        try {
-            result = reqObj.sendHttpsPost(url, null, jsonString);
-        } catch (IOException e) {
-            LogUtil.error("发送模板通知出错了", e);
-        }
-        JSONObject json = JSONObject.fromObject(result.getDataString());
-        LogUtil.info("发送模板消息结果={}", json);
-        int res = 0;
-        if (json == null) {
-            return res;
-        } else {
-            res = json.getInt(ERRCODE);
-            if (res == Integer.parseInt(SEND_ERROR_40001)) {
-                String new_access_token = "";
-                try {
-                    new_access_token = WeChatApiTools.getAccessToken();
-                } catch (IOException e1) {
-                    LogUtil.error("获取new_access_token失败", e1.getMessage());
-                }
-                url = WxApiConstants.XCX_TEMPLATEMSG_SEN.replace("ACCESS_TOKEN", new_access_token);
-                try {
-                    result = reqObj.sendHttpsPost(url, null, jsonString);
-                } catch (IOException e) {
-                    LogUtil.error("发送new_access_token模板通知出错了", e);
-                }
-                json = JSONObject.fromObject(result.getDataString());
-                if (json == null) {
-                    return res;
-                } else {
-                    res = json.getInt(ERRCODE);
-                    if (res != 0) {
-                        // 添加发送失败 信息
-                        LogUtil.info("发送new_access_token模板消息错误错误 errcode:{} errmsg:{}" + "," + json.getInt("errcode")
-                                + "," + json.getString("errmsg"));
-                    } else {
-                        return 1;
-                    }
-                }
-            } else if (res != 0) {
-                // 添加发送失败 信息
-                LogUtil.info("发送模板消息错误错误 errcode:{} errmsg:{}" + "," + json.getInt("errcode") + ","
-                        + json.getString("errmsg"));
-            } else {
-                return 1;
-            }
-        }
-        LogUtil.info("模板消息发送结果:" + res);
         return 0;
     }
 
@@ -231,25 +143,7 @@
      * @param temp {temp}
      */
     public static void  sendSubscribeMsg(WxSubscribeDto temp) {
-        String access_token = "";
-        try {
-            access_token = WeChatApiTools.getAccessToken();
-        } catch (IOException e1) {
-            LogUtil.error("获取accesstoken失败", e1.getMessage());
-        }
-        // 发送模板URL
-        String url = WxApiConstants.XCX_TEMPLATEMSG_SEN.replace("ACCESS_TOKEN", access_token);
-        String jsonString = JSONObject.fromObject(temp).toString();
-        LogUtil.info("组装模板消息={}", jsonString);
-        HttpRequest reqObj = new HttpRequest();
-        HttpResponse result = null;
-        try {
-            result = reqObj.sendHttpsPost(url, null, jsonString);
-        } catch (IOException e) {
-            LogUtil.error("发送模板通知出错了", e);
-        }
-        JSONObject json = JSONObject.fromObject(result.getDataString());
-        LogUtil.info("发送模板消息结果={}", json);
+
     }
 
 
diff --git a/zq-erp/src/main/java/com/matrix/component/wechat/externalInterface/common/HttpsRequest2.java b/zq-erp/src/main/java/com/matrix/component/wechat/externalInterface/common/HttpsRequest2.java
index 12856ec..6e4594f 100644
--- a/zq-erp/src/main/java/com/matrix/component/wechat/externalInterface/common/HttpsRequest2.java
+++ b/zq-erp/src/main/java/com/matrix/component/wechat/externalInterface/common/HttpsRequest2.java
@@ -1,5 +1,9 @@
 package com.matrix.component.wechat.externalInterface.common;
 
+import com.matrix.core.tools.WebUtil;
+import com.matrix.system.common.bean.BusParameterSettings;
+import com.matrix.system.common.constance.AppConstance;
+import com.matrix.system.common.dao.BusParameterSettingsDao;
 import com.thoughtworks.xstream.XStream;
 import com.thoughtworks.xstream.io.xml.DomDriver;
 import com.thoughtworks.xstream.io.xml.XmlFriendlyNameCoder;
@@ -41,7 +45,7 @@
     }
 
     Logger log=Logger.getLogger(HttpRequest.class);
-    		
+
     //表示请求器是否已经做了初始化工作
     private boolean hasInit = false;
 
@@ -56,17 +60,21 @@
 
     //HTTP请求器
     private CloseableHttpClient httpClient;
+    //证书地址
+    private String  certLocalPath;
+    //商户号
+    private String mchId;
 
     public HttpsRequest2() throws UnrecoverableKeyException, KeyManagementException, NoSuchAlgorithmException, KeyStoreException, IOException {
-        init();
+
     }
 
     private void init() throws IOException, KeyStoreException, UnrecoverableKeyException, NoSuchAlgorithmException, KeyManagementException {
 
-       KeyStore keyStore = KeyStore.getInstance("PKCS12");
-       FileInputStream instream = new FileInputStream(new File(WechatConfigure.certLocalPath));//加载本地的证书进行https加密传输
+        KeyStore keyStore = KeyStore.getInstance("PKCS12");
+        FileInputStream instream = new FileInputStream(new File(certLocalPath));//加载本地的证书进行https加密传输
         try {
-            keyStore.load(instream,WechatConfigure.certPassword.toCharArray());//设置证书密码
+            keyStore.load(instream, mchId.toCharArray());//设置证书密码
         } catch (CertificateException e) {
             e.printStackTrace();
         } catch (NoSuchAlgorithmException e) {
@@ -76,7 +84,7 @@
         }
         // Trust own CA and all self-signed certs
         SSLContext sslcontext = SSLContexts.custom()
-                .loadKeyMaterial(keyStore, WechatConfigure.certPassword.toCharArray())
+                .loadKeyMaterial(keyStore, mchId.toCharArray())
                 .build();
         // Allow TLSv1 protocol only
         SSLConnectionSocketFactory sslsf = new SSLConnectionSocketFactory(
@@ -85,11 +93,11 @@
                 null,
                 SSLConnectionSocketFactory.BROWSER_COMPATIBLE_HOSTNAME_VERIFIER);
 
-        
-         httpClient = HttpClients.custom()
+
+        httpClient = HttpClients.custom()
                 .setSSLSocketFactory(sslsf)
                 .build();
-    	// httpClient = HttpClients.custom().build();
+        // httpClient = HttpClients.custom().build();
         //根据默认超时限制初始化requestConfig
         requestConfig = RequestConfig.custom().setSocketTimeout(socketTimeout).setConnectTimeout(connectTimeout).build();
         hasInit = true;
@@ -135,17 +143,17 @@
         httpPost.setConfig(requestConfig);
 
         log.info("executing request" + httpPost.getRequestLine());
-         
+
         try {
             HttpResponse response = httpClient.execute(httpPost);
 
             HttpEntity entity = response.getEntity();
 
             result = EntityUtils.toString(entity, "UTF-8");
-            
+
             log.info("POST back date:" + httpPost.getRequestLine());
-            
-            
+
+
 
         } catch (ConnectionPoolTimeoutException e) {
 //            log.e("http get throw ConnectionPoolTimeoutException(wait time out)");
@@ -157,7 +165,7 @@
 //            log.e("http get throw SocketTimeoutException");
 
         } catch (Exception e) {
-        	e.printStackTrace();
+            e.printStackTrace();
 //            log.e("http get throw Exception");
 
         } finally {
@@ -173,7 +181,7 @@
      * @param socketTimeout 连接时长,默认10秒
      */
     public void setSocketTimeout(int socketTimeout) {
-    	this.socketTimeout = socketTimeout;
+        this.socketTimeout = socketTimeout;
         resetRequestConfig();
     }
 
@@ -183,7 +191,7 @@
      * @param connectTimeout 传输时长,默认30秒
      */
     public void setConnectTimeout(int connectTimeout) {
-    	this.connectTimeout = connectTimeout;
+        this.connectTimeout = connectTimeout;
         resetRequestConfig();
     }
 
@@ -197,6 +205,23 @@
      * @param requestConfig 设置HttpsRequest的请求器配置
      */
     public void setRequestConfig(RequestConfig requestConfig) {
-    	this.requestConfig = requestConfig;
+        this.requestConfig = requestConfig;
+    }
+
+
+    public String getMchId() {
+        return mchId;
+    }
+
+    public void setMchId(String mchId) {
+        this.mchId = mchId;
+    }
+
+    public String getCertLocalPath() {
+        return certLocalPath;
+    }
+
+    public void setCertLocalPath(String certLocalPath) {
+        this.certLocalPath = certLocalPath;
     }
 }
diff --git a/zq-erp/src/main/java/com/matrix/component/wechat/externalInterface/common/Signature.java b/zq-erp/src/main/java/com/matrix/component/wechat/externalInterface/common/Signature.java
index 40300d5..c764cff 100644
--- a/zq-erp/src/main/java/com/matrix/component/wechat/externalInterface/common/Signature.java
+++ b/zq-erp/src/main/java/com/matrix/component/wechat/externalInterface/common/Signature.java
@@ -22,7 +22,7 @@
 	 * @return 签名
 	 * @throws IllegalAccessException
 	 */
-	public static String getSign(Object o) throws IllegalAccessException {
+	public static String getSign(Object o,String paySecret) throws IllegalAccessException {
 		ArrayList<String> list = new ArrayList<String>();
 		Class<? extends Object> cls = o.getClass();
 		Field[] fields = cls.getDeclaredFields();
@@ -40,14 +40,14 @@
 			sb.append(arrayToSort[i]);
 		}
 		String result = sb.toString();
-		result += "key=" + WechatConfigure.key;
+		result += "key=" +paySecret;
 		Util.log("Sign Before MD5:" + result);
 		result = MD5.MD5Encode(result).toUpperCase();
 		Util.log("Sign Result:" + result);
 		return result;
 	}
 
-	public static String getSign(Map<String, Object> map) {
+	public static String getSign(Map<String, Object> map,String paySecret) {
 		ArrayList<String> list = new ArrayList<String>();
 		for (Map.Entry<String, Object> entry : map.entrySet()) {
 			if (entry.getValue() != "") {
@@ -62,7 +62,7 @@
 			sb.append(arrayToSort[i]);
 		}
 		String result = sb.toString();
-		result += "key=" + WechatConfigure.key;
+		result += "key=" + paySecret;
 		Util.log("Sign Before MD5:" + result);
 		result = MD5.MD5Encode(result).toUpperCase();
 		Util.log("Sign Result:" + result);
@@ -79,13 +79,13 @@
 	 * @throws IOException
 	 * @throws SAXException
 	 */
-	public static String getSignFromResponseString(String responseString)
+	public static String getSignFromResponseString(String responseString,String paySecret)
 			throws IOException, SAXException, ParserConfigurationException {
 		Map<String, Object> map = XMLParser.getMapFromXML(responseString);
 		// 清掉返回数据对象里面的Sign数据(不能把这个数据也加进去进行签名),然后用签名算法进行签名
 		map.put("sign", "");
 		// 将API返回的数据根据用签名算法进行计算新的签名,用来跟API返回的签名进行比较
-		return Signature.getSign(map);
+		return Signature.getSign(map,paySecret);
 	}
 
 	/**
@@ -98,7 +98,7 @@
 	 * @throws IOException
 	 * @throws SAXException
 	 */
-	public static boolean checkIsSignValidFromResponseString(String responseString)
+	public static boolean checkIsSignValidFromResponseString(String responseString,String paySecret)
 			throws ParserConfigurationException, IOException, SAXException {
 
 		Map<String, Object> map = XMLParser.getMapFromXML(responseString);
@@ -113,7 +113,7 @@
 		// 清掉返回数据对象里面的Sign数据(不能把这个数据也加进去进行签名),然后用签名算法进行签名
 		map.put("sign", "");
 		// 将API返回的数据根据用签名算法进行计算新的签名,用来跟API返回的签名进行比较
-		String signForAPIResponse = Signature.getSign(map);
+		String signForAPIResponse = Signature.getSign(map,paySecret);
 
 		if (!signForAPIResponse.equals(signFromAPIResponse)) {
 			// 签名验不过,表示这个API返回的数据有可能已经被篡改了
@@ -124,9 +124,7 @@
 		return true;
 	}
 	
-	public static void main(String[] args) throws ParserConfigurationException, IOException, SAXException {
-		System.out.println(checkIsSignValidFromResponseString("<xml><appid><![CDATA[wx13515a9204ea669d]]></appid><attach><![CDATA[35f7170585ad4f09b5109cc985b1eec0]]></attach><bank_type><![CDATA[CFT]]></bank_type><cash_fee><![CDATA[1]]></cash_fee><fee_type><![CDATA[CNY]]></fee_type><is_subscribe><![CDATA[N]]></is_subscribe><mch_id><![CDATA[1486409192]]></mch_id><nonce_str><![CDATA[elqhnr10vzaq0wgalf9njjyqwyd7gyr7]]></nonce_str><openid><![CDATA[o8x8E5lqmD9c5rdsjTQ9KWN4-H40]]></openid><out_trade_no><![CDATA[2018090610284198419]]></out_trade_no><result_code><![CDATA[SUCCESS]]></result_code><return_code><![CDATA[SUCCESS]]></return_code><sign><![CDATA[DD04172CDAA60F834163AF3F5B63BE3F]]></sign><time_end><![CDATA[20180906102853]]></time_end><total_fee>1</total_fee><trade_type><![CDATA[JSAPI]]></trade_type><transaction_id><![CDATA[4200000169201809067369627940]]></transaction_id></xml>"));
-	}
+
 
 	/**
 	 * 
diff --git a/zq-erp/src/main/java/com/matrix/component/wechat/externalInterface/common/WechatConfigure.java b/zq-erp/src/main/java/com/matrix/component/wechat/externalInterface/common/WechatConfigure.java
index 30d2a22..0a37ebc 100644
--- a/zq-erp/src/main/java/com/matrix/component/wechat/externalInterface/common/WechatConfigure.java
+++ b/zq-erp/src/main/java/com/matrix/component/wechat/externalInterface/common/WechatConfigure.java
@@ -9,7 +9,7 @@
 	// 这个就是自己要保管好的私有Key了(切记只能放在自己的后台代码里,不能放在任何可能被看到源代码的客户端程序中)
 	// 每次自己Post数据给API的时候都要用这个key来对所有字段进行签名,生成的签名会放在Sign这个字段,API收到Post数据的时候也会用同样的签名算法对Post过来的数据进行签名和验证
 	// 收到API的返回的时候也要用这个key来对返回的数据算下签名,跟API的Sign数据进行比较,如果值不一致,有可能数据被第三方给篡改
-	public static final String PAY_NOTIFY_URL="https://xcxhive2.jyymatrix.cc/wxCommon/wxpayCallback";
+
 	// 交易类型
 	public static final String TRADE_TYPE_JSAPI = "JSAPI";
 	public static final String TRADE_TYPE_NATIVE = "NATIVE";
@@ -17,28 +17,15 @@
 	public static final String SIGN_MD5 = "MD5";
 	//域名
 
-	
-	// 微信支付秘钥
-	public static String key = "3hbNHPOSXx85rC0QEqvGgIHu1wduT4Qc";
-	
-	// 微信分配的公众号ID(开通公众号之后可以获取到)
-	public static String appID = "wx3836ab3c1490ff29";
-	
-	
 
-	// 微信支付分配的商户号ID(开通公众号的微信支付功能之后可以获取到)
-	public static String mchID = "1573208361";
-	
-	
-	public static String  web_appID = "1486409192";
+
 	// 受理模式下给子商户分配的子商户号
 	public static String subMchID = "";
 
 	// HTTPS证书的本地路径
 	public static String certLocalPath = "/home/cert/apiclient_cert.p12";
 
-	// HTTPS证书密码,默认密码等于商户号MCHID
-	public static String certPassword = "1573208361";
+
 
 	// 是否使用异步线程的方式来上报API测速,默认为异步模式
 	public static boolean useThreadToDoReport = true;
diff --git a/zq-erp/src/main/java/com/matrix/component/wechat/externalInterface/protocol/paramProtocol/BrandWCPayRequestData.java b/zq-erp/src/main/java/com/matrix/component/wechat/externalInterface/protocol/paramProtocol/BrandWCPayRequestData.java
index c367bf3..b0c8126 100644
--- a/zq-erp/src/main/java/com/matrix/component/wechat/externalInterface/protocol/paramProtocol/BrandWCPayRequestData.java
+++ b/zq-erp/src/main/java/com/matrix/component/wechat/externalInterface/protocol/paramProtocol/BrandWCPayRequestData.java
@@ -25,16 +25,16 @@
     private String signType = "";
     private String paySign = "";
     
-    public BrandWCPayRequestData(String prepay_id){
+    public BrandWCPayRequestData(String prepay_id,String appID,String paySecret){
     	//默认必须设置
-        setAppId(WechatConfigure.appID);
+        setAppId(appID);
         //随机字符串,不长于32 位
         setNonceStr(RandomStringGenerator.getRandomStringByLength(32));
         setTimeStamp(Long.toString(System.currentTimeMillis() / 1000L));
         setPrepay_id("prepay_id="+prepay_id);
         //根据API给的签名规则进行签名 【 必须要放在本方法的最后】
         setSignType(WechatConfigure.SIGN_MD5);
-        String sign = Signature.getSign(toMap());
+        String sign = Signature.getSign(toMap(),paySecret);
         setPaySign(sign);//把签名数据设置到Sign这个属性中
     }
     
diff --git a/zq-erp/src/main/java/com/matrix/component/wechat/externalInterface/protocol/payComProtocol/JsApiPayComReqData.java b/zq-erp/src/main/java/com/matrix/component/wechat/externalInterface/protocol/payComProtocol/JsApiPayComReqData.java
index 7313595..d38b928 100644
--- a/zq-erp/src/main/java/com/matrix/component/wechat/externalInterface/protocol/payComProtocol/JsApiPayComReqData.java
+++ b/zq-erp/src/main/java/com/matrix/component/wechat/externalInterface/protocol/payComProtocol/JsApiPayComReqData.java
@@ -70,16 +70,16 @@
      * @param bankTrueName 收款号姓名
      * @param bankCode     收款号开户行
      */
-    public JsApiPayComReqData(String desc, String outTradeNo, int totalFee, String bankNo, String bankTrueName, String bankCode) {
+    public JsApiPayComReqData(String mchID,String paySecret ,String desc, String outTradeNo, int totalFee, String bankNo, String bankTrueName, String bankCode) {
         //默认必须设置
-        setMch_id(WechatConfigure.mchID);
+        setMch_id(mchID);
         setDesc(desc);
         setPartner_trade_no(outTradeNo);
         setAmount(totalFee);
         //随机字符串,不长于32 位
         setNonce_str(RandomStringGenerator.getRandomStringByLength(32));
         //根据API给的签名规则进行签名 【 必须要放在本方法的最后】
-        String sign = Signature.getSign(toMap());
+        String sign = Signature.getSign(toMap(),paySecret);
         setSign(sign);//把签名数据设置到Sign这个属性中
 //        setEnc_bank_no();
 //        setEnc_true_name();
diff --git a/zq-erp/src/main/java/com/matrix/component/wechat/externalInterface/protocol/payProtocol/JsApiPayReqData.java b/zq-erp/src/main/java/com/matrix/component/wechat/externalInterface/protocol/payProtocol/JsApiPayReqData.java
index 2dc5f1e..819f58a 100644
--- a/zq-erp/src/main/java/com/matrix/component/wechat/externalInterface/protocol/payProtocol/JsApiPayReqData.java
+++ b/zq-erp/src/main/java/com/matrix/component/wechat/externalInterface/protocol/payProtocol/JsApiPayReqData.java
@@ -32,8 +32,8 @@
     /**
      * 接收微信支付异步通知回调地址
      */
-    private String notify_url = WechatConfigure.PAY_NOTIFY_URL;
     private String trade_type = WechatConfigure.TRADE_TYPE_JSAPI;
+    private String notify_url ;
     private String openid = "";
     private String limit_pay = "";
     private String spbill_create_ip = "";
@@ -47,7 +47,8 @@
     public JsApiPayReqData() {
 	}
     
-    /**
+    /**appID 收款应用id
+     * mchID 商户号
      * @param authCode 这个是扫码终端设备从用户手机上扫取到的支付授权号,这个号是跟用户用来支付的银行卡绑定的,有效期是1分钟
      * @param body 要支付的商品的描述信息,用户会在支付成功页面里看到这个信息
      * @param attach 支付订单里面可以填的附加数据,API会将提交的这个附加数据原样返回
@@ -59,10 +60,11 @@
      * @param timeExpire 订单失效时间,格式同上
      * @param goodsTag 商品标记,微信平台配置的商品标记,用于优惠券或者满减使用
      */
-    public JsApiPayReqData(String body,String outTradeNo,int totalFee,String spBillCreateIP,String openid,String attach){
+    public JsApiPayReqData(String appID, String mchID,String paySecret,String notify_url, String body,String outTradeNo,int totalFee,String spBillCreateIP,String openid,String attach){
     	//默认必须设置
-        setAppid(WechatConfigure.appID);
-        setMch_id(WechatConfigure.mchID);
+        setAppid(appID);
+        setMch_id(mchID);
+        setNotify_url(notify_url);
         setBody(body);
         setOut_trade_no(outTradeNo);
         setTotal_fee(totalFee);
@@ -72,16 +74,17 @@
         setNonce_str(RandomStringGenerator.getRandomStringByLength(32));
         setOpenid(openid);
         //根据API给的签名规则进行签名 【 必须要放在本方法的最后】
-        String sign = Signature.getSign(toMap());
+        String sign = Signature.getSign(toMap(),paySecret);
         setSign(sign);//把签名数据设置到Sign这个属性中
       
     }
 
-    public JsApiPayReqData(String body,String outTradeNo,int totalFee,String spBillCreateIP,String attach){
+    public JsApiPayReqData(String appID, String mchID,String paySecret,String notify_url,String body,String outTradeNo,int totalFee,String spBillCreateIP,String attach){
     	//默认必须设置
-        setAppid(WechatConfigure.web_appID);
-        setMch_id(WechatConfigure.mchID);
+        setAppid(appID);
+        setMch_id(mchID);
         setBody(body);
+        setNotify_url(notify_url);
         setOut_trade_no(outTradeNo);
         setTotal_fee(totalFee);
         setSpbill_create_ip(spBillCreateIP);
@@ -89,7 +92,7 @@
         //随机字符串,不长于32 位
         setNonce_str(RandomStringGenerator.getRandomStringByLength(32));
         //根据API给的签名规则进行签名 【 必须要放在本方法的最后】
-        String sign = Signature.getSign(toMap());
+        String sign = Signature.getSign(toMap(),paySecret);
         setSign(sign);//把签名数据设置到Sign这个属性中
     }
     
diff --git a/zq-erp/src/main/java/com/matrix/component/wechat/externalInterface/protocol/queryProtocol/JsApiPayReqData.java b/zq-erp/src/main/java/com/matrix/component/wechat/externalInterface/protocol/queryProtocol/JsApiPayReqData.java
deleted file mode 100644
index 8784f20..0000000
--- a/zq-erp/src/main/java/com/matrix/component/wechat/externalInterface/protocol/queryProtocol/JsApiPayReqData.java
+++ /dev/null
@@ -1,295 +0,0 @@
-package com.matrix.component.wechat.externalInterface.protocol.queryProtocol;
-
-
-import com.matrix.component.wechat.externalInterface.common.RandomStringGenerator;
-import com.matrix.component.wechat.externalInterface.common.Signature;
-import com.matrix.component.wechat.externalInterface.common.WechatConfigure;
-
-import java.lang.reflect.Field;
-import java.util.HashMap;
-import java.util.Map;
-
-/**
- * 
-*  预付订单请求参数
-* @author:姜友瑶 
-* @date 2016年10月14日
- */
-public class JsApiPayReqData {
-
-    //每个字段具体的意思请查看API文档
-    private String appid = "";
-    private String mch_id = "";
-    private String device_info = "";
-    private String nonce_str = "";
-    private String sign = "";
-    private String body = "";
-    private String detail = "";
-    private String attach = "";
-    private String out_trade_no = "";
-    private String fee_type = "";
-    private int total_fee = 0;
-    /**
-     * 接收微信支付异步通知回调地址
-     */
-    private String notify_url = WechatConfigure.PAY_NOTIFY_URL;
-    private String trade_type = WechatConfigure.TRADE_TYPE_JSAPI;
-    private String openid = "";
-    private String limit_pay = "";
-    private String spbill_create_ip = "";
-    private String product_id = "";
-    private String time_start = "";
-    private String time_expire = "";
-    private String goods_tag = "";
-    private String auth_code = "";
-
-    
-    public JsApiPayReqData() {
-	}
-    
-    /**
-     * @param authCode 这个是扫码终端设备从用户手机上扫取到的支付授权号,这个号是跟用户用来支付的银行卡绑定的,有效期是1分钟
-     * @param body 要支付的商品的描述信息,用户会在支付成功页面里看到这个信息
-     * @param attach 支付订单里面可以填的附加数据,API会将提交的这个附加数据原样返回
-     * @param outTradeNo 商户系统内部的订单号,32个字符内可包含字母, 确保在商户系统唯一
-     * @param totalFee 订单总金额,单位为“分”,只能整数
-     * @param deviceInfo 商户自己定义的扫码支付终端设备号,方便追溯这笔交易发生在哪台终端设备上
-     * @param spBillCreateIP 订单生成的机器IP
-     * @param timeStart 订单生成时间, 格式为yyyyMMddHHmmss,如2009年12 月25 日9 点10 分10 秒表示为20091225091010。时区为GMT+8 beijing。该时间取自商户服务器
-     * @param timeExpire 订单失效时间,格式同上
-     * @param goodsTag 商品标记,微信平台配置的商品标记,用于优惠券或者满减使用
-     */
-    public JsApiPayReqData(String body,String outTradeNo,int totalFee,String spBillCreateIP,String openid,String attach){
-    	//默认必须设置
-        setAppid(WechatConfigure.appID);
-        setMch_id(WechatConfigure.mchID);
-        setBody(body);
-        setOut_trade_no(outTradeNo);
-        setTotal_fee(totalFee);
-        setSpbill_create_ip(spBillCreateIP);
-        setAttach(attach);
-        //随机字符串,不长于32 位
-        setNonce_str(RandomStringGenerator.getRandomStringByLength(32));
-        setOpenid(openid);
-        //根据API给的签名规则进行签名 【 必须要放在本方法的最后】
-        String sign = Signature.getSign(toMap());
-        setSign(sign);//把签名数据设置到Sign这个属性中
-      
-    }
-
-    public JsApiPayReqData(String body,String outTradeNo,int totalFee,String spBillCreateIP,String attach){
-    	//默认必须设置
-        setAppid(WechatConfigure.web_appID);
-        setMch_id(WechatConfigure.mchID);
-        setBody(body);
-        setOut_trade_no(outTradeNo);
-        setTotal_fee(totalFee);
-        setSpbill_create_ip(spBillCreateIP);
-        setAttach(attach);
-        //随机字符串,不长于32 位
-        setNonce_str(RandomStringGenerator.getRandomStringByLength(32));
-        //根据API给的签名规则进行签名 【 必须要放在本方法的最后】
-        String sign = Signature.getSign(toMap());
-        setSign(sign);//把签名数据设置到Sign这个属性中
-    }
-    
-    public String getDetail() {
-		return detail;
-	}
-
-	public void setDetail(String detail) {
-		this.detail = detail;
-	}
-
-	public String getFee_type() {
-		return fee_type;
-	}
-
-	public void setFee_type(String fee_type) {
-		this.fee_type = fee_type;
-	}
-
-	public String getNotify_url() {
-		return notify_url;
-	}
-
-	public void setNotify_url(String notify_url) {
-		this.notify_url = notify_url;
-	}
-
-	public String getTrade_type() {
-		return trade_type;
-	}
-
-	public void setTrade_type(String trade_type) {
-		this.trade_type = trade_type;
-	}
-
-	public String getOpenid() {
-		return openid;
-	}
-
-	public void setOpenid(String openid) {
-		this.openid = openid;
-	}
-
-	public String getLimit_pay() {
-		return limit_pay;
-	}
-
-	public void setLimit_pay(String limit_pay) {
-		this.limit_pay = limit_pay;
-	}
-
-	public String getProduct_id() {
-		return product_id;
-	}
-
-	public void setProduct_id(String product_id) {
-		this.product_id = product_id;
-	}
-
-	public String getAppid() {
-        return appid;
-    }
-
-    public void setAppid(String appid) {
-        this.appid = appid;
-    }
-
-    public String getMch_id() {
-        return mch_id;
-    }
-
-    public void setMch_id(String mch_id) {
-        this.mch_id = mch_id;
-    }
-
-    public String getDevice_info() {
-        return device_info;
-    }
-
-    public void setDevice_info(String device_info) {
-        this.device_info = device_info;
-    }
-
-    public String getNonce_str() {
-        return nonce_str;
-    }
-
-    public void setNonce_str(String nonce_str) {
-        this.nonce_str = nonce_str;
-    }
-
-    public String getSign() {
-        return sign;
-    }
-
-    public void setSign(String sign) {
-        this.sign = sign;
-    }
-
-    public String getBody() {
-        return body;
-    }
-
-    /**
-     * 
-    * body最大长度128
-    * @author:姜友瑶
-    * @param body    
-    * 返回类型  void    
-    * @date 2016年10月13日
-     */
-    public void setBody(String body) {
-    
-    	if(body.length()>128){
-    		body=body.substring(0, 128);
-    	}
-        this.body = body;
-    }
-
-    public String getAttach() {
-        return attach;
-    }
-
-    public void setAttach(String attach) {
-        this.attach = attach;
-    }
-
-    public String getOut_trade_no() {
-        return out_trade_no;
-    }
-
-    public void setOut_trade_no(String out_trade_no) {
-        this.out_trade_no = out_trade_no;
-    }
-
-    public int getTotal_fee() {
-        return total_fee;
-    }
-
-    public void setTotal_fee(int total_fee) {
-        this.total_fee = total_fee;
-    }
-
-    public String getSpbill_create_ip() {
-        return spbill_create_ip;
-    }
-
-    public void setSpbill_create_ip(String spbill_create_ip) {
-        this.spbill_create_ip = spbill_create_ip;
-    }
-
-    public String getTime_start() {
-        return time_start;
-    }
-
-    public void setTime_start(String time_start) {
-        this.time_start = time_start;
-    }
-
-    public String getTime_expire() {
-        return time_expire;
-    }
-
-    public void setTime_expire(String time_expire) {
-        this.time_expire = time_expire;
-    }
-
-    public String getGoods_tag() {
-        return goods_tag;
-    }
-
-    public void setGoods_tag(String goods_tag) {
-        this.goods_tag = goods_tag;
-    }
-
-    public String getAuth_code() {
-        return auth_code;
-    }
-
-    public void setAuth_code(String auth_code) {
-        this.auth_code = auth_code;
-    }
-
-    public Map<String,Object> toMap(){
-        Map<String,Object> map = new HashMap<String, Object>();
-        Field[] fields = this.getClass().getDeclaredFields();
-        for (Field field : fields) {
-            Object obj;
-            try {
-                obj = field.get(this);
-                if(obj!=null){
-                    map.put(field.getName(), obj);
-                }
-            } catch (IllegalArgumentException e) {
-                e.printStackTrace();
-            } catch (IllegalAccessException e) {
-                e.printStackTrace();
-            }
-        }
-        return map;
-    }
-
-}
diff --git a/zq-erp/src/main/java/com/matrix/component/wechat/externalInterface/protocol/queryProtocol/ScanPayQueryReqData.java b/zq-erp/src/main/java/com/matrix/component/wechat/externalInterface/protocol/queryProtocol/ScanPayQueryReqData.java
index 42cc0c9..37855ba 100644
--- a/zq-erp/src/main/java/com/matrix/component/wechat/externalInterface/protocol/queryProtocol/ScanPayQueryReqData.java
+++ b/zq-erp/src/main/java/com/matrix/component/wechat/externalInterface/protocol/queryProtocol/ScanPayQueryReqData.java
@@ -37,10 +37,10 @@
         //--------------------------------------------------------------------
 
         //微信分配的公众号ID(开通公众号之后可以获取到)
-        setAppid(WechatConfigure.appID);
+        //setAppid(WechatConfigure.appID);
 
         //微信支付分配的商户号ID(开通公众号的微信支付功能之后可以获取到)
-        setMch_id(WechatConfigure.mchID);
+        // setMch_id(WechatConfigure.mchID);
 
         //transaction_id是微信系统为每一笔支付交易分配的订单号,通过这个订单号可以标识这笔交易,它由支付订单API支付成功时返回的数据里面获取到。
         setTransaction_id(transactionID);
@@ -52,7 +52,7 @@
         setNonce_str(RandomStringGenerator.getRandomStringByLength(32));
 
         //根据API给的签名规则进行签名
-        String sign = Signature.getSign(toMap());
+        //String sign = Signature.getSign(toMap());
         setSign(sign);//把签名数据设置到Sign这个属性中
 
 
diff --git a/zq-erp/src/main/java/com/matrix/component/wechat/externalInterface/protocol/refundProtocol/RefundReqData.java b/zq-erp/src/main/java/com/matrix/component/wechat/externalInterface/protocol/refundProtocol/RefundReqData.java
index 6aa739c..9cac6cf 100644
--- a/zq-erp/src/main/java/com/matrix/component/wechat/externalInterface/protocol/refundProtocol/RefundReqData.java
+++ b/zq-erp/src/main/java/com/matrix/component/wechat/externalInterface/protocol/refundProtocol/RefundReqData.java
@@ -40,13 +40,13 @@
      * @param opUserID 操作员帐号, 默认为商户号
      * @param refundFeeType 货币类型,符合ISO 4217标准的三位字母代码,默认为CNY(人民币)
      */
-    public RefundReqData(String outTradeNo,String outRefundNo,int totalFee,int refundFee,String opUserID){
+    public RefundReqData(String mchID,String appID,String paySecret ,String outTradeNo,String outRefundNo,int totalFee,int refundFee,String opUserID){
 
     	 //微信分配的公众号ID(开通公众号之后可以获取到)
-        setAppid(WechatConfigure.appID);
+        setAppid(appID);
 
         //微信支付分配的商户号ID(开通公众号的微信支付功能之后可以获取到)
-        setMch_id(WechatConfigure.mchID);
+        setMch_id(mchID);
 
         //transaction_id是微信系统为每一笔支付交易分配的订单号,通过这个订单号可以标识这笔交易,它由支付订单API支付成功时返回的数据里面获取到。
         //setTransaction_id(transactionID);
@@ -69,7 +69,7 @@
         setNonce_str(RandomStringGenerator.getRandomStringByLength(32));
 
         //根据API给的签名规则进行签名
-        String sign = Signature.getSign(toMap());
+        String sign = Signature.getSign(toMap(),paySecret);
         setSign(sign);//把签名数据设置到Sign这个属性中
 
     }
diff --git a/zq-erp/src/main/java/com/matrix/component/wechat/externalInterface/protocol/rsaProtocal/JsApiRSAReqData.java b/zq-erp/src/main/java/com/matrix/component/wechat/externalInterface/protocol/rsaProtocal/JsApiRSAReqData.java
deleted file mode 100644
index e694b90..0000000
--- a/zq-erp/src/main/java/com/matrix/component/wechat/externalInterface/protocol/rsaProtocal/JsApiRSAReqData.java
+++ /dev/null
@@ -1,50 +0,0 @@
-package com.matrix.component.wechat.externalInterface.protocol.rsaProtocal;
-
-
-import com.matrix.component.wechat.externalInterface.common.RandomStringGenerator;
-import com.matrix.component.wechat.externalInterface.common.Signature;
-import com.matrix.component.wechat.externalInterface.common.WechatConfigure;
-
-import java.lang.reflect.Field;
-import java.util.HashMap;
-import java.util.Map;
-
-/**
- * 公钥请求类
- *
- * @author  wzy
- */
-public class JsApiRSAReqData {
-
-    private String mch_id;
-    private String nonce_str;
-    private String sign;
-    private String sign_type;
-
-
-    public JsApiRSAReqData() {
-        this.mch_id = WechatConfigure.mchID;
-        this.nonce_str = RandomStringGenerator.getRandomStringByLength(32);
-        this.sign = Signature.getSign(toMap());
-        this.sign_type = "MD5";
-    }
-
-    public Map<String, Object> toMap() {
-        Map<String, Object> map = new HashMap<String, Object>();
-        Field[] fields = this.getClass().getDeclaredFields();
-        for (Field field : fields) {
-            Object obj;
-            try {
-                obj = field.get(this);
-                if (obj != null) {
-                    map.put(field.getName(), obj);
-                }
-            } catch (IllegalArgumentException e) {
-                e.printStackTrace();
-            } catch (IllegalAccessException e) {
-                e.printStackTrace();
-            }
-        }
-        return map;
-    }
-}
diff --git a/zq-erp/src/main/java/com/matrix/component/wechat/externalInterface/service/BaseService.java b/zq-erp/src/main/java/com/matrix/component/wechat/externalInterface/service/BaseService.java
index 1b9620d..8f9a680 100644
--- a/zq-erp/src/main/java/com/matrix/component/wechat/externalInterface/service/BaseService.java
+++ b/zq-erp/src/main/java/com/matrix/component/wechat/externalInterface/service/BaseService.java
@@ -38,4 +38,8 @@
     public void setServiceRequest(IServiceRequest request){
         serviceRequest = request;
     }
+
+    public IServiceRequest getServiceRequest() {
+        return serviceRequest;
+    }
 }
diff --git a/zq-erp/src/main/java/com/matrix/component/wechat/externalInterface/service/JsApiGetPublicKeyService.java b/zq-erp/src/main/java/com/matrix/component/wechat/externalInterface/service/JsApiGetPublicKeyService.java
deleted file mode 100644
index 173f31f..0000000
--- a/zq-erp/src/main/java/com/matrix/component/wechat/externalInterface/service/JsApiGetPublicKeyService.java
+++ /dev/null
@@ -1,19 +0,0 @@
-package com.matrix.component.wechat.externalInterface.service;
-
-import com.matrix.component.wechat.externalInterface.common.WechatConfigure;
-import com.matrix.component.wechat.externalInterface.protocol.payComProtocol.JsApiPayComReqData;
-import com.matrix.component.wechat.externalInterface.protocol.rsaProtocal.JsApiRSAReqData;
-
-public class JsApiGetPublicKeyService extends BaseService {
-
-    public JsApiGetPublicKeyService() throws ClassNotFoundException, IllegalAccessException, InstantiationException {
-        super(WechatConfigure.PUBLIC_KEY_GET_API, WechatConfigure.HttpsRequestClassName2);
-    }
-
-    public String request(JsApiRSAReqData jsApiRSAReqData) throws Exception {
-
-        String responseString = sendPost(jsApiRSAReqData);
-
-        return responseString;
-    }
-}
diff --git a/zq-erp/src/main/java/com/matrix/component/wechat/externalInterface/weixinUtil/WeixinServiceUtil.java b/zq-erp/src/main/java/com/matrix/component/wechat/externalInterface/weixinUtil/WeixinServiceUtil.java
index 771333f..30c7d4d 100644
--- a/zq-erp/src/main/java/com/matrix/component/wechat/externalInterface/weixinUtil/WeixinServiceUtil.java
+++ b/zq-erp/src/main/java/com/matrix/component/wechat/externalInterface/weixinUtil/WeixinServiceUtil.java
@@ -1,5 +1,6 @@
 package com.matrix.component.wechat.externalInterface.weixinUtil;
 
+import com.matrix.component.wechat.externalInterface.common.HttpsRequest2;
 import com.matrix.core.exception.GlobleException;
 import com.matrix.core.tools.LogUtil;
 import com.matrix.core.tools.StringUtils;
@@ -18,7 +19,10 @@
 import com.matrix.component.wechat.externalInterface.service.JsApiPayComService;
 import com.matrix.component.wechat.externalInterface.service.RefundService;
 import com.matrix.component.wechat.externalInterface.service.ScanPayQueryService;
+import com.matrix.system.common.bean.BusParameterSettings;
 import com.matrix.system.common.constance.AppConstance;
+import com.matrix.system.common.dao.BusParameterSettingsDao;
+import com.matrix.system.common.interceptor.HostInterceptor;
 import com.matrix.system.shopXcx.api.tools.WxShopOrderUtil;
 import org.apache.log4j.Logger;
 import org.springframework.beans.factory.annotation.Autowired;
@@ -43,6 +47,13 @@
 
 	@Autowired
 	private WxShopOrderUtil wxShopOrderUtil;
+
+	@Autowired
+	BusParameterSettingsDao busParameterSettingsDao;
+
+
+
+
 	
 	/**
 	 * 支付"175.9.82.254"
@@ -62,7 +73,20 @@
 		// 创建微信支付预付接口
 		JsApiPayBusiness jsApiPayBusiness = new JsApiPayBusiness();
 		String idAddr = getIpAddr(WebUtil.getRequest());
-		JsApiPayReqData jsApiPayReqData = new JsApiPayReqData(desc, outTradeNo, price, idAddr, openId, attach);
+
+		Long companyId=HostInterceptor.getCompanyId();
+
+		BusParameterSettings mchID = busParameterSettingsDao.selectCompanyParamByCode(AppConstance.WECHARPAY_MCHID, companyId);
+		BusParameterSettings paySecret = busParameterSettingsDao.selectCompanyParamByCode(AppConstance.WECHARPAY_SECRET, companyId);
+		BusParameterSettings notifyUrl = busParameterSettingsDao.selectCompanyParamByCode(AppConstance.WECHARPAY_NOTIFYURL, companyId);
+
+		BusParameterSettings appId = busParameterSettingsDao.selectCompanyParamByCode(AppConstance.MINIPROGRAM_APPID, companyId);
+
+		JsApiPayReqData jsApiPayReqData = new JsApiPayReqData(appId.getParamValue(),mchID.getParamValue(),
+				paySecret.getParamValue(),
+				notifyUrl.getParamValue(),
+				desc, outTradeNo, price, idAddr, openId, attach);
+
 		// 创建预付订单并返回请求结果
 		JsApiPayResData result = jsApiPayBusiness.createPrapareOrder(jsApiPayReqData);
 		// 把预付订单的信息存放在request域中
@@ -71,7 +95,7 @@
 		LogUtil.info("#---签名信息:return_msg = {}" , result.getReturn_msg());
 		if (result.getReturn_code().equals("SUCCESS")) {
 			// 请求成功, 构建BrandWCPayRequest发起支付需要的参数
-			BrandWCPayRequestData payData = new BrandWCPayRequestData(result.getPrepay_id());
+			BrandWCPayRequestData payData = new BrandWCPayRequestData(result.getPrepay_id(),appId.getParamValue(),paySecret.getParamValue());
 			WebUtil.getRequest().setAttribute("payData", payData);
 			return payData;
 		}else{
@@ -115,7 +139,6 @@
 	 * @param desc 描述
 	 * @param outTradeNo  提现申请编号
 	 * @param totalFee 提现金额(分)
-	 * @param spBillCreateIP 调用接口的IP
 	 * @param openid
 	 * @return
 	 */
@@ -125,7 +148,12 @@
 		try {
 			JsApiPayBusiness jsApiPayBusiness = new JsApiPayBusiness();
 			// TODO 企业付款
-			JsApiPayComReqData jsApiPayComReqData=new JsApiPayComReqData("","",0,"","","");
+			Long companyId=HostInterceptor.getCompanyId();
+			BusParameterSettings mchID = busParameterSettingsDao.selectCompanyParamByCode(AppConstance.WECHARPAY_MCHID, companyId);
+			BusParameterSettings paySecret = busParameterSettingsDao.selectCompanyParamByCode(AppConstance.WECHARPAY_SECRET, companyId);
+
+
+			JsApiPayComReqData jsApiPayComReqData=new JsApiPayComReqData(mchID.getParamValue(),paySecret.getParamValue(),"","",0,"","","");
 			JsApiPayComService jsApiPayComService=new JsApiPayComService();
 			result = jsApiPayBusiness.payComOrder(jsApiPayComService, jsApiPayComReqData);
 			LogUtil.info("#提现,企业付款到个人---result:{}",result);
@@ -155,15 +183,25 @@
 			int refundFee, String opUserID){
 		LogUtil.info("#---outTradeNo:{}#---outRefundNo:{}#---totalFee:{}#---refundFee:{}",
 				outTradeNo,outRefundNo,totalFee,refundFee);
+		BusParameterSettings mchID = busParameterSettingsDao.selectCompanyParamByCode(AppConstance.WECHARPAY_MCHID, HostInterceptor.getCompanyId());
 		if(opUserID==null){
-			opUserID=WechatConfigure.mchID;
+			opUserID=mchID.getParamValue();
 		}
 		RefundResData result=null;
 		boolean flag=false;
 		try {
 			JsApiPayBusiness jsApiPayBusiness = new JsApiPayBusiness();
-			RefundReqData refundReqData=new RefundReqData(outTradeNo, outRefundNo, totalFee, refundFee,opUserID);
+			Long companyId=HostInterceptor.getCompanyId();
+			BusParameterSettings paySecret = busParameterSettingsDao.selectCompanyParamByCode(AppConstance.WECHARPAY_SECRET, companyId);
+			BusParameterSettings appId = busParameterSettingsDao.selectCompanyParamByCode(AppConstance.MINIPROGRAM_APPID, companyId);
+			BusParameterSettings certLocalPath = busParameterSettingsDao.selectCompanyParamByCode(AppConstance.WECHARPAY_CERTLOCAL_PATH, companyId);
+
+			RefundReqData refundReqData=new RefundReqData(mchID.getParamValue(),appId.getParamValue(),paySecret.getParamValue(), outTradeNo, outRefundNo, totalFee, refundFee,opUserID);
 			RefundService refundService=new RefundService();
+			HttpsRequest2 request2= (HttpsRequest2) refundService.getServiceRequest();
+			request2.setCertLocalPath(certLocalPath.getParamValue());
+			request2.setMchId(mchID.getParamValue());
+
 			result = jsApiPayBusiness.refundComOrder(refundService, refundReqData);
 			LogUtil.info("#退款,企业付款到个人---result:{}",result);
 			//如果返回余额不足时
@@ -191,12 +229,12 @@
 	 * @return
 	 */
 	public String getIpAddr(HttpServletRequest request) { 
-	       String ip = request.getHeader("x-forwarded-for"); 
-	      /* if(ip == null || ip.length() == 0 || "unknown".equalsIgnoreCase(ip)) { 
-	           ip = request.getHeader("Proxy-Client-IP"); 
-	       } 
-	       if(ip == null || ip.length() == 0 || "unknown".equalsIgnoreCase(ip)) { 
-	           ip = request.getHeader("WL-Proxy-Client-IP"); 
+	       String ip = request.getHeader("x-forwarded-for");
+	      /* if(ip == null || ip.length() == 0 || "unknown".equalsIgnoreCase(ip)) {
+	           ip = request.getHeader("Proxy-Client-IP");
+	       }
+	       if(ip == null || ip.length() == 0 || "unknown".equalsIgnoreCase(ip)) {
+	           ip = request.getHeader("WL-Proxy-Client-IP");
 	       } */
 	       if(ip == null || ip.length() == 0 || "unknown".equalsIgnoreCase(ip)) { 
 	           ip = request.getRemoteAddr(); 
diff --git a/zq-erp/src/main/java/com/matrix/config/MvcCoreConfig.java b/zq-erp/src/main/java/com/matrix/config/MvcCoreConfig.java
index 989b5cc..c48dfe0 100644
--- a/zq-erp/src/main/java/com/matrix/config/MvcCoreConfig.java
+++ b/zq-erp/src/main/java/com/matrix/config/MvcCoreConfig.java
@@ -3,6 +3,7 @@
 
 
 import com.matrix.core.interceptor.WbeCommonInterceptor;
+import com.matrix.system.common.interceptor.ApiUserLoginInterceptor;
 import com.matrix.system.common.interceptor.HostInterceptor;
 import com.matrix.system.common.interceptor.SuAuthorityInterceptor;
 import com.matrix.system.common.interceptor.UserLoginInterceptor;
@@ -36,6 +37,9 @@
 	@Autowired
 	private WbeCommonInterceptor wbeCommonInterceptor;
 
+	@Autowired
+	private ApiUserLoginInterceptor apiUserLoginInterceptor;
+
 
 	/**
 	 * 添加拦截器
@@ -46,15 +50,29 @@
 	 */
 	@Override
 	public void addInterceptors(InterceptorRegistry registry) {
+		// 手机端拦截
+		registry.addInterceptor(apiUserLoginInterceptor)
+				.addPathPatterns("/api/**")
+				.excludePathPatterns("/api/common/**");
+
 		// 公共拦截
 		registry.addInterceptor(wbeCommonInterceptor)
 				.addPathPatterns("/**")
 				.excludePathPatterns("/css/**")
 				.excludePathPatterns("/js/**")
 				.excludePathPatterns("/images/**")
-				.excludePathPatterns("/plugin/**");
+				.excludePathPatterns("/plugin/**")
+				.excludePathPatterns("/swagger**/**")
+				.excludePathPatterns("/webjars/**");
 		// 用户认证拦截
-		registry.addInterceptor(userLoginInterceptor).addPathPatterns("/**").excludePathPatterns("/common/**").excludePathPatterns("/resource/**");
+		registry.addInterceptor(userLoginInterceptor)
+				.addPathPatterns("/**")
+				.excludePathPatterns("/common/**")
+				.excludePathPatterns("/resource/**")
+				.excludePathPatterns("/swagger**/**")
+				.excludePathPatterns("/webjars/**")
+				.excludePathPatterns("/api/**");
+
 		// url权限拦截
 		registry.addInterceptor(suAuthorityInterceptor).addPathPatterns("/**/su/**");
 		//小程序公司与域名对应关系拦截
diff --git a/zq-erp/src/main/java/com/matrix/config/RabbitMqConfig.java b/zq-erp/src/main/java/com/matrix/config/RabbitMqConfig.java
index 6ff44d6..b05d58b 100644
--- a/zq-erp/src/main/java/com/matrix/config/RabbitMqConfig.java
+++ b/zq-erp/src/main/java/com/matrix/config/RabbitMqConfig.java
@@ -4,7 +4,9 @@
 import com.matrix.component.rabbitmq.MqTask;
 import com.matrix.component.rabbitmq.RabiitMqTemplate;
 import com.matrix.component.rabbitmq.RabiitMqTemplateFactory;
+import com.matrix.core.tools.LogUtil;
 import com.matrix.system.shopXcx.mqTask.*;
+import com.matrix.system.wechart.templateMsg.Task.UniformMsgSentTask;
 import org.springframework.beans.factory.annotation.Value;
 import org.springframework.context.annotation.Bean;
 import org.springframework.context.annotation.Configuration;
@@ -48,6 +50,11 @@
         return new TemplateMsgTask();
     }
 
+  @Bean
+  UniformMsgSentTask UniformMsgSentTask(){
+        return new UniformMsgSentTask();
+    }
+
     @Bean
     OrderOutSotoreTask OrderOutSotoreTask(){
         return new OrderOutSotoreTask();
@@ -56,7 +63,7 @@
 
     @Bean
     public RabiitMqTemplate rabiitMqTemplate() throws IOException {
-
+        LogUtil.info("rabbitmq: {}, {}, {}, {}", host, port, username, password);
         RabiitMqTemplate rabiitMqTemplate = RabiitMqTemplateFactory.buildTemplate(host, port, username, password);
 
         //声明一个交换机
@@ -67,10 +74,10 @@
 
         //注册RabbitMq任务
         taskList.add(new MqTask(MQ_EXCHANGE_A + evn, MQTaskRouting.CREATE_VIP + evn, MQTaskRouting.CREATE_VIP + evn, VipCreateTask()));
-        taskList.add(new MqTask(MQ_EXCHANGE_A + "cf", MQTaskRouting.CREATE_VIP + evn, MQTaskRouting.CREATE_VIP + evn, null));
         taskList.add(new MqTask(MQ_EXCHANGE_A + evn, MQTaskRouting.CREATE_ORDER + evn,MQTaskRouting.CREATE_ORDER + evn,OrderrCreateTask()));
         taskList.add(new MqTask(MQ_EXCHANGE_A + evn, MQTaskRouting.SEND_TEMPLATE_MSG + evn,MQTaskRouting.SEND_TEMPLATE_MSG + evn, TemplateMsgTask()));
         taskList.add(new MqTask(MQ_EXCHANGE_A + evn, MQTaskRouting.ORDER_OUT_SOTORE + evn,MQTaskRouting.ORDER_OUT_SOTORE + evn, OrderOutSotoreTask()));
+        taskList.add(new MqTask(MQ_EXCHANGE_A + evn, MQTaskRouting.SEND_UNIFORM_TEMPLATE_MSG + evn,MQTaskRouting.SEND_UNIFORM_TEMPLATE_MSG + evn, UniformMsgSentTask()));
 
         rabiitMqTemplate.binding(taskList);
 
diff --git a/zq-erp/src/main/java/com/matrix/config/SwaggerConfig.java b/zq-erp/src/main/java/com/matrix/config/SwaggerConfig.java
new file mode 100644
index 0000000..d1cc052
--- /dev/null
+++ b/zq-erp/src/main/java/com/matrix/config/SwaggerConfig.java
@@ -0,0 +1,57 @@
+package com.matrix.config;
+
+import io.swagger.annotations.Api;
+import org.springframework.beans.factory.annotation.Value;
+import org.springframework.boot.autoconfigure.condition.ConditionalOnProperty;
+import org.springframework.boot.context.properties.ConfigurationProperties;
+import org.springframework.context.annotation.Bean;
+import org.springframework.context.annotation.Configuration;
+import springfox.documentation.builders.ApiInfoBuilder;
+import springfox.documentation.builders.ParameterBuilder;
+import springfox.documentation.builders.PathSelectors;
+import springfox.documentation.builders.RequestHandlerSelectors;
+import springfox.documentation.schema.ModelRef;
+import springfox.documentation.service.ApiInfo;
+import springfox.documentation.service.Parameter;
+import springfox.documentation.spi.DocumentationType;
+import springfox.documentation.spring.web.plugins.Docket;
+import springfox.documentation.swagger2.annotations.EnableSwagger2;
+
+import java.util.ArrayList;
+import java.util.List;
+
+/**
+ * @Author wzy
+ * @Date 2020/5/11
+ * @email wangdoubleone@gmail.com
+ * @Version V1.0
+ **/
+@Configuration
+@EnableSwagger2
+public class SwaggerConfig {
+
+
+    @Value("${swagger.enable}")
+    private boolean swaggerEnable;
+
+    @Bean
+    public Docket createRestApi(){
+        // 添加请求参数,我们这里把token作为请求头部参数传入后端
+        ParameterBuilder parameterBuilder = new ParameterBuilder();
+        List<Parameter> parameters = new ArrayList<Parameter>();
+        parameterBuilder.name("Authorization").description("令牌").modelRef(new ModelRef("string")).parameterType("header")
+                .required(false).build();
+        parameters.add(parameterBuilder.build());
+        return new Docket(DocumentationType.SWAGGER_2).apiInfo(apiInfo()).enable(swaggerEnable).select().apis(RequestHandlerSelectors.withClassAnnotation(Api.class))
+                .paths(PathSelectors.any()).build().globalOperationParameters(parameters);
+//                .ignoredParameterTypes(MemberEntity.class);
+    }
+
+    private ApiInfo apiInfo(){
+        return new ApiInfoBuilder()
+                .title("Hive")
+                .description("This is a restful api document of Hive.")
+                .version("1.0")
+                .build();
+    }
+}
diff --git a/zq-erp/src/main/java/com/matrix/core/exception/GlobalExceptionHandler.java b/zq-erp/src/main/java/com/matrix/core/exception/GlobalExceptionHandler.java
new file mode 100644
index 0000000..7602e17
--- /dev/null
+++ b/zq-erp/src/main/java/com/matrix/core/exception/GlobalExceptionHandler.java
@@ -0,0 +1,34 @@
+package com.matrix.core.exception;
+
+import com.matrix.core.pojo.AjaxResult;
+import org.springframework.validation.FieldError;
+import org.springframework.web.bind.MethodArgumentNotValidException;
+import org.springframework.web.bind.annotation.ExceptionHandler;
+import org.springframework.web.bind.annotation.RestControllerAdvice;
+
+import javax.validation.ValidationException;
+
+/**
+ * @author wzy
+ * @date 2020-05-08 15:40
+ **/
+@RestControllerAdvice
+public class GlobalExceptionHandler {
+
+    /**
+     * 方法参数校验
+     *
+     * @param e
+     * @return
+     */
+    @ExceptionHandler(value = {MethodArgumentNotValidException.class})
+    public AjaxResult handleException(MethodArgumentNotValidException e) {
+        FieldError fieldError = e.getBindingResult().getFieldError();
+        if (fieldError != null) {
+            return AjaxResult.buildFailInstance(fieldError.getDefaultMessage());
+        } else {
+            return AjaxResult.buildFailInstance("参数校验失败");
+        }
+    }
+
+}
diff --git a/zq-erp/src/main/java/com/matrix/core/pojo/PaginationDto.java b/zq-erp/src/main/java/com/matrix/core/pojo/PaginationDto.java
new file mode 100644
index 0000000..90f6c88
--- /dev/null
+++ b/zq-erp/src/main/java/com/matrix/core/pojo/PaginationDto.java
@@ -0,0 +1,75 @@
+package com.matrix.core.pojo;
+
+/**
+ * @author 姜友瑶 E-mail:<935090232@qq.com>
+ * @date 2021年1月15日
+ * @description 分页信息类
+ */
+public class PaginationDto {
+
+	/**
+	 * 起点
+	 */
+	private Integer offset = 0;
+	/**
+	 * 查询条数
+	 */
+	private Integer limit =15;
+
+	/**
+	 * 排序方式
+	 */
+	private String order;
+	/**
+	 * 排序字段
+	 */
+	private String sort;
+
+	public Integer getOffset() {
+		return offset;
+	}
+
+	public void setOffset(Integer offset) {
+		this.offset = offset;
+	}
+
+	public Integer getLimit() {
+		return limit;
+	}
+
+	public void setLimit(Integer limit) {
+		this.limit = limit;
+	}
+
+	public String getOrder() {
+		return order;
+	}
+
+	public void setOrder(String order) {
+		this.order = order;
+	}
+
+	public String getSort() {
+		return propertyToColumn(sort);
+	}
+
+	public void setSort(String sort) {
+		this.sort = sort;
+	}
+
+	public String propertyToColumn(String property) {
+		if(property==null){
+			return null;
+		}
+		StringBuffer columnName = new StringBuffer(property);
+		for (int i = 0; i < columnName.length(); i++) {
+			if (columnName.charAt(i) >= 'A' && columnName.charAt(i) <= 'Z') {
+				String upcase = "_" + (columnName.charAt(i) + "").toLowerCase();
+				columnName.replace(i, i + 1, upcase);
+			}
+		}
+		return columnName.toString();
+	}
+
+	
+}
diff --git a/zq-erp/src/main/java/com/matrix/core/pojo/PaginationVO.java b/zq-erp/src/main/java/com/matrix/core/pojo/PaginationVO.java
index 43bee19..8c11a72 100644
--- a/zq-erp/src/main/java/com/matrix/core/pojo/PaginationVO.java
+++ b/zq-erp/src/main/java/com/matrix/core/pojo/PaginationVO.java
@@ -5,7 +5,7 @@
  * @date 2016年6月24日
  * @description 分页信息类
  */
-public class PaginationVO extends EntityDTO{
+public class PaginationVO {
 
 	/**
 	 * 起点
diff --git a/zq-erp/src/main/java/com/matrix/core/tools/rr/GlueFactory.java b/zq-erp/src/main/java/com/matrix/core/tools/rr/GlueFactory.java
index 5f0f32f..d46fe06 100644
--- a/zq-erp/src/main/java/com/matrix/core/tools/rr/GlueFactory.java
+++ b/zq-erp/src/main/java/com/matrix/core/tools/rr/GlueFactory.java
@@ -104,4 +104,27 @@
 		throw new IllegalArgumentException(">>>>>>>>>>> xxl-glue, loadNewInstance error, instance is null");
 	}
 
+
+	/**
+	 * 根据字符串获取几个java实例
+	 * @param codeSource
+	 * @return
+	 * @throws Exception
+	 */
+	public Object loadInstance(String codeSource) throws Exception{
+		if (codeSource!=null && codeSource.trim().length()>0) {
+			Class<?> clazz = groovyClassLoader.parseClass(codeSource);
+			if (clazz != null) {
+				Object instance = clazz.newInstance();
+				if (instance!=null) {
+					this.injectService(instance);
+					return  instance;
+				}
+			}
+		}
+		throw new IllegalArgumentException(">>>>>>>>>>> xxl-glue, loadNewInstance error, instance is null");
+	}
+
+
+
 }
diff --git a/zq-erp/src/main/java/com/matrix/core/tools/rr/GroovyDome.java b/zq-erp/src/main/java/com/matrix/core/tools/rr/GroovyDome.java
index 8b849cb..07d7357 100644
--- a/zq-erp/src/main/java/com/matrix/core/tools/rr/GroovyDome.java
+++ b/zq-erp/src/main/java/com/matrix/core/tools/rr/GroovyDome.java
@@ -1,12 +1,42 @@
 package com.matrix.core.tools.rr;
 
+import com.alibaba.druid.pool.DruidDataSource;
+import com.alibaba.fastjson.JSONArray;
 import com.matrix.core.pojo.AjaxResult;
 import com.matrix.core.tools.LogUtil;
+import com.matrix.core.tools.StringUtils;
+import org.apache.commons.io.FileUtils;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.jdbc.core.JdbcOperations;
+import org.springframework.jdbc.core.namedparam.NamedParameterJdbcTemplate;
+
+import java.io.File;
+import java.io.IOException;
+import java.util.List;
+import java.util.Map;
 
 public class GroovyDome implements GroovyRunable {
 
-    @Override
+    @Autowired
+    DruidDataSource datasource;
     public AjaxResult run() {
-        return new AjaxResult();
+        String tables="back_no, back_test, chy_clean_vip_price, code_relation_ks, crm_order_operator_config, customer_test, dept_batch_no, detail, ds_order_record, erp_adjust_price, erp_adjust_price_detail, erp_approva_apply, erp_approval_record, erp_approver_configuration, erp_business_with_product, erp_business_with_store, erp_conservation_detail, erp_conservation_record, erp_cus_update_record, erp_custom_bf0624, erp_customer, erp_customer_copy1, erp_customer0618, erp_data_dictionary, erp_distribution_detail, erp_distribution_info, erp_ent_business_scope, erp_ent_certificate_info, erp_ent_contact_user, erp_ent_first_practice, erp_ent_first_practice_reocrd, erp_ent_prohibit, erp_enterprise_bank, erp_enterprise_info, erp_export_record, erp_field_update_record, erp_file_upload, erp_function_browse, erp_function_collection, erp_inventory_detail, erp_inventory_enter_detail, erp_inventory_enter_info, erp_inventory_plan_info, erp_message_receive, erp_message_send, erp_order_no_record, erp_order_record, erp_outbound_review, erp_overflow_loss_detail, erp_overflow_loss_info, erp_param_configure, erp_picking_detail, erp_picking_info, erp_print_record, erp_pro_certificate, erp_pro_first_practice, erp_pro_first_practice_reocrd, erp_product_img_detail, erp_product_info, erp_product_other_info, erp_product_prohibit, erp_product_quality_attr, erp_product_revise_price, erp_product_sale_attr, erp_product_stock, erp_purchase_back_detail, erp_purchase_backgoods, erp_purchase_backgoods_copy, erp_purchase_order_detail, erp_purchase_order_info, erp_purchase_plan_detail, erp_purchase_plan_info, erp_purchase_receivegoods, erp_purchase_receivegoods_detail, erp_purchase_rejection, erp_purchase_rejection_detail, erp_quality_review_detail, erp_quality_review_record, erp_recharge_record, erp_region, erp_resource_auth_role, erp_resources_auth, erp_resources_auth_value, erp_resources_group, erp_revise_price_detail, erp_revise_price_info, erp_settings, erp_stock_flow_detail, erp_store_info, erp_table_test_price, erp_value_card_flow, erp_vip_integral_flow, erp_vip_integral_record, erp_vip_integral_rule, erp_vip_type, erp_wait_conservation_record, erp_warehouse_area, erp_warehouses, erp_wave_detail, erp_wave_info, his_item_pay_detail, inventory_allocation, inventory_change_record, item, jiagetiaozheng, lingshoujia, menzhen_0927, pandian, pandianxiugai, pos_aaa, pos_activity, pos_activity_gift_info, pos_activity_gifts, pos_activity_integral, pos_activity_package, pos_activity_product, pos_activity_recharge, pos_activity_with_store, pos_approva_apply, pos_approval_record, pos_bill_template_detail, pos_bill_template_store_default, pos_bucket_record, pos_bucket_record_detail, pos_bucket_stock, pos_business_data, pos_business_data_detail, pos_cashier_handover, pos_conservation_detail, pos_conservation_record, pos_destory_loss_mode, pos_enter_invalid_detail, pos_integral_convert_money, pos_inventory_detail, pos_inventory_enter_detail, pos_inventory_enter_info, pos_inventory_plan_info, pos_item_pay_detail, pos_loss_destory, pos_no_qd_damaged_detail, pos_no_qd_damaged_info, pos_no_qd_move_record, pos_order_stock_detail, pos_overflow_loss_detail, pos_overflow_loss_info, pos_package_product, pos_prescription_record, pos_product_destroy, pos_product_info, pos_product_info_copy1, pos_product_sale_detail, pos_product_stock, pos_product_stock_temp, pos_product_update_record, pos_purchase_back_detail, pos_purchase_back_goods, pos_purchase_plan_detail, pos_purchase_plan_info, pos_purchase_rejection, pos_purchase_rejection_detail, pos_quality_review_detail, pos_quality_review_record, pos_receive_detail, pos_receive_goods, pos_refund_order, pos_refund_order_detail, pos_refund_stock_detail, pos_retail_order, pos_retail_order_detail, pos_retail_package_pro, pos_scatter_stock, pos_scattered_record, pos_scattered_stock, pos_special_product_detail, pos_special_product_info, pos_special_tube_record, pos_stock_flow_detail, pos_temperature_humidity, pos_transfer_slip, pos_transfer_slip_detail, pos_transfer_slip_out_stock, pos_wait_conservation, pos_wholesale_goods, pos_wholesale_plan_detail, pos_wholesale_plan_info, product_info, productCode, qrtz_calendars, qrtz_job_details, qrtz_locks, qrtz_paused_trigger_grps, qrtz_scheduler_state, receive_temp, retail_team, Sheet1, stock_init, stock_price, stock_test, sys_api_access_record, sys_app, sys_button, sys_company, sys_department, sys_fn_btn_rel, sys_function, sys_log, sys_role, sys_role_pwoer_fn, sys_role_pwoer_fn_audit, sys_user_login_record, sys_users, tementiaojia, test_jinheyuan, xlyb, xxl_job_group, xxl_job_info, xxl_job_lock, xxl_job_log, xxl_job_logglue, xxl_job_registry, xxl_job_user";
+        String tableArry[] = StringUtils.stringToArray(tables,",");
+        for(String table : tableArry) {
+
+            System.out.println("开始处理====》" + table);
+        }
+        AjaxResult r=  AjaxResult.buildSuccessInstance("成功");
+        return r;
+    }
+
+    public static void main(String[] args) {
+        String tables="back_no, back_test, chy_clean_vip_price, code_relation_ks, crm_order_operator_config, customer_test, dept_batch_no, detail, ds_order_record, erp_adjust_price, erp_adjust_price_detail, erp_approva_apply, erp_approval_record, erp_approver_configuration, erp_business_with_product, erp_business_with_store, erp_conservation_detail, erp_conservation_record, erp_cus_update_record, erp_custom_bf0624, erp_customer, erp_customer_copy1, erp_customer0618, erp_data_dictionary, erp_distribution_detail, erp_distribution_info, erp_ent_business_scope, erp_ent_certificate_info, erp_ent_contact_user, erp_ent_first_practice, erp_ent_first_practice_reocrd, erp_ent_prohibit, erp_enterprise_bank, erp_enterprise_info, erp_export_record, erp_field_update_record, erp_file_upload, erp_function_browse, erp_function_collection, erp_inventory_detail, erp_inventory_enter_detail, erp_inventory_enter_info, erp_inventory_plan_info, erp_message_receive, erp_message_send, erp_order_no_record, erp_order_record, erp_outbound_review, erp_overflow_loss_detail, erp_overflow_loss_info, erp_param_configure, erp_picking_detail, erp_picking_info, erp_print_record, erp_pro_certificate, erp_pro_first_practice, erp_pro_first_practice_reocrd, erp_product_img_detail, erp_product_info, erp_product_other_info, erp_product_prohibit, erp_product_quality_attr, erp_product_revise_price, erp_product_sale_attr, erp_product_stock, erp_purchase_back_detail, erp_purchase_backgoods, erp_purchase_backgoods_copy, erp_purchase_order_detail, erp_purchase_order_info, erp_purchase_plan_detail, erp_purchase_plan_info, erp_purchase_receivegoods, erp_purchase_receivegoods_detail, erp_purchase_rejection, erp_purchase_rejection_detail, erp_quality_review_detail, erp_quality_review_record, erp_recharge_record, erp_region, erp_resource_auth_role, erp_resources_auth, erp_resources_auth_value, erp_resources_group, erp_revise_price_detail, erp_revise_price_info, erp_settings, erp_stock_flow_detail, erp_store_info, erp_table_test_price, erp_value_card_flow, erp_vip_integral_flow, erp_vip_integral_record, erp_vip_integral_rule, erp_vip_type, erp_wait_conservation_record, erp_warehouse_area, erp_warehouses, erp_wave_detail, erp_wave_info, his_item_pay_detail, inventory_allocation, inventory_change_record, item, jiagetiaozheng, lingshoujia, menzhen_0927, pandian, pandianxiugai, pos_aaa, pos_activity, pos_activity_gift_info, pos_activity_gifts, pos_activity_integral, pos_activity_package, pos_activity_product, pos_activity_recharge, pos_activity_with_store, pos_approva_apply, pos_approval_record, pos_bill_template_detail, pos_bill_template_store_default, pos_bucket_record, pos_bucket_record_detail, pos_bucket_stock, pos_business_data, pos_business_data_detail, pos_cashier_handover, pos_conservation_detail, pos_conservation_record, pos_destory_loss_mode, pos_enter_invalid_detail, pos_integral_convert_money, pos_inventory_detail, pos_inventory_enter_detail, pos_inventory_enter_info, pos_inventory_plan_info, pos_item_pay_detail, pos_loss_destory, pos_no_qd_damaged_detail, pos_no_qd_damaged_info, pos_no_qd_move_record, pos_order_stock_detail, pos_overflow_loss_detail, pos_overflow_loss_info, pos_package_product, pos_prescription_record, pos_product_destroy, pos_product_info, pos_product_info_copy1, pos_product_sale_detail, pos_product_stock, pos_product_stock_temp, pos_product_update_record, pos_purchase_back_detail, pos_purchase_back_goods, pos_purchase_plan_detail, pos_purchase_plan_info, pos_purchase_rejection, pos_purchase_rejection_detail, pos_quality_review_detail, pos_quality_review_record, pos_receive_detail, pos_receive_goods, pos_refund_order, pos_refund_order_detail, pos_refund_stock_detail, pos_retail_order, pos_retail_order_detail, pos_retail_package_pro, pos_scatter_stock, pos_scattered_record, pos_scattered_stock, pos_special_product_detail, pos_special_product_info, pos_special_tube_record, pos_stock_flow_detail, pos_temperature_humidity, pos_transfer_slip, pos_transfer_slip_detail, pos_transfer_slip_out_stock, pos_wait_conservation, pos_wholesale_goods, pos_wholesale_plan_detail, pos_wholesale_plan_info, product_info, productCode, qrtz_calendars, qrtz_job_details, qrtz_locks, qrtz_paused_trigger_grps, qrtz_scheduler_state, receive_temp, retail_team, Sheet1, stock_init, stock_price, stock_test, sys_api_access_record, sys_app, sys_button, sys_company, sys_department, sys_fn_btn_rel, sys_function, sys_log, sys_role, sys_role_pwoer_fn, sys_role_pwoer_fn_audit, sys_user_login_record, sys_users, tementiaojia, test_jinheyuan, xlyb, xxl_job_group, xxl_job_info, xxl_job_lock, xxl_job_log, xxl_job_logglue, xxl_job_registry, xxl_job_user";
+        String tableArry[] = StringUtils.stringToArray(tables,",");
+        for(String table : tableArry) {
+
+            System.out.println("开始处理====》" + table);
+        }
+
     }
 }
diff --git a/zq-erp/src/main/java/com/matrix/system/app/action/ApiCommonAction.java b/zq-erp/src/main/java/com/matrix/system/app/action/ApiCommonAction.java
new file mode 100644
index 0000000..1ea1ccc
--- /dev/null
+++ b/zq-erp/src/main/java/com/matrix/system/app/action/ApiCommonAction.java
@@ -0,0 +1,223 @@
+package com.matrix.system.app.action;
+
+import com.alibaba.fastjson.JSONObject;
+import com.matrix.component.redis.RedisClient;
+import com.matrix.core.pojo.AjaxResult;
+import com.matrix.core.tools.*;
+import com.matrix.system.app.authority.AppAuthorityManager;
+import com.matrix.system.app.dto.LoginDto;
+import com.matrix.system.app.dto.PwdResetDto;
+import com.matrix.system.app.dto.SmsCodeDto;
+import com.matrix.system.app.dto.UploadPhotoDto;
+import com.matrix.system.app.utils.Sms106Send;
+import com.matrix.system.app.vo.UserInfoVo;
+import com.matrix.system.common.authority.DefaultAuthorityManager;
+import com.matrix.system.common.authority.strategy.AccountPasswordLogin;
+import com.matrix.system.common.authority.strategy.LoginStrategy;
+import com.matrix.system.common.bean.SysUsers;
+import com.matrix.system.common.service.SysUsersService;
+import com.matrix.system.common.tools.PasswordUtil;
+import com.matrix.system.common.tools.UploadUtil;
+import com.matrix.system.hive.bean.AppVersion;
+import com.matrix.system.hive.bean.SysShopInfo;
+import com.matrix.system.hive.plugin.util.CollectionUtils;
+import com.matrix.system.hive.plugin.util.ImageUtil;
+import com.matrix.system.hive.service.SysShopInfoService;
+import io.swagger.annotations.Api;
+import io.swagger.annotations.ApiOperation;
+import io.swagger.annotations.ApiResponse;
+import io.swagger.annotations.ApiResponses;
+import org.apache.commons.fileupload.FileUploadException;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.beans.factory.annotation.Value;
+import org.springframework.validation.annotation.Validated;
+import org.springframework.web.bind.annotation.*;
+import org.springframework.web.multipart.MultipartHttpServletRequest;
+
+import javax.servlet.http.HttpServletResponse;
+import java.io.File;
+import java.io.IOException;
+import java.io.UnsupportedEncodingException;
+import java.security.NoSuchAlgorithmException;
+import java.util.ArrayList;
+import java.util.Date;
+import java.util.List;
+import java.util.Map;
+
+/**
+ * @author wzy
+ * @date 2020-12-21
+ **/
+@CrossOrigin(origins = "*")
+@Api(value = "CommonAction", tags = "手机端公共请求类(含登陆)")
+@RestController
+@RequestMapping(value = "/api/common")
+public class ApiCommonAction {
+
+    @Autowired
+    private SysUsersService sysUsersService;
+
+    @Autowired
+    private SysShopInfoService sysShopInfoService;
+
+    @Autowired
+    private AppAuthorityManager authorityManager;
+
+    @Autowired
+    private RedisClient redisClient;
+
+    @Value("${file_storage_path}")
+    private String fileStoragePath;
+    @Value("${static_resource_url}")
+    private String nginxUrl;
+
+    @ApiOperation(value = "登陆接口", notes = "手机端登陆接口")
+    @ApiResponses({
+            @ApiResponse(code = 200, message = "OK",  response = UserInfoVo.class)
+    })
+    @PostMapping(value = "/login")
+    public AjaxResult login(@RequestBody @Validated LoginDto loginDto) {
+
+        SysUsers user = new SysUsers();
+        user.setSuAccount(loginDto.getUsername());
+        user.setSuPassword(loginDto.getPassword());
+        LoginStrategy apLogin = new AccountPasswordLogin(user, sysUsersService);
+        user = authorityManager.login(apLogin);
+
+        UserInfoVo userInfoVo = new UserInfoVo();
+        if(user.getShopId()!=null){
+            SysShopInfo shopInfo = sysShopInfoService.findById(user.getShopId());
+            user.setShopName(shopInfo.getShopName());
+            userInfoVo.setShopName(shopInfo.getShopShortName());
+        }
+        user.setSuPassword(null);
+
+        String token = UUIDUtil.getRandomID();
+        redisClient.saveValueForever(token, JSONObject.toJSONString(user));
+
+        userInfoVo.setId(user.getSuId());
+        userInfoVo.setName(user.getSuName());
+        userInfoVo.setRoleName(user.getRoleName());
+        userInfoVo.setPhoto(user.getSuPhoto());
+
+        AjaxResult result = AjaxResult.buildSuccessInstance("登陆成功");
+        authorityManager.initUserPower(result,user);
+        result.putInMap("user", userInfoVo);
+        result.putInMap("token", token);
+        return result;
+    }
+
+    @ApiOperation(value = "图片上传接口", notes = "图片上传接口")
+    @PostMapping(value = "/uploadPhotoBase64")
+    public AjaxResult uploadPhotoBase64(@RequestBody @Validated UploadPhotoDto uploadPhotoDto) {
+        // 文件保存目录路径
+        String savePath = fileStoragePath;
+        String abstractPath= DateUtil.dateFormatStr(new Date(),DateUtil.DATE_FORMAT_NO_SPLITE_DD);
+        savePath=savePath+File.separator+abstractPath;
+
+        String fileName =UUIDUtil.getRandomID() + ".png";
+
+
+        // 文件保存目录URL
+        String saveUrl = nginxUrl;
+        LogUtil.debug("图片保存目录路径={}",fileStoragePath);
+        LogUtil.debug("图片保存目录URL={}",nginxUrl);
+        // 保存和访问路径检查
+        if (StringUtils.isBlank(saveUrl) || StringUtils.isBlank(savePath)) {
+            return AjaxResult.buildFailInstance("文件上传失败错误代码:001");
+        }
+
+        // 检查目录
+        File uploadDir = new File(savePath);
+        if (!uploadDir.isDirectory()) {
+            uploadDir.mkdir();
+        }
+
+        ImageUtil.base64ToFile(uploadPhotoDto.getBase64(),savePath , fileName);
+        LogUtil.info("fileName : {}", fileName);
+
+        AjaxResult ajaxResult = AjaxResult.buildSuccessInstance("上传成功");
+        ajaxResult.putInMap("file", nginxUrl + abstractPath+"/"+fileName);
+        return ajaxResult;
+    }
+
+
+    String folderType = "image";
+    public final static List<FileType> EXT_LIST = new ArrayList<FileType>();
+    static {
+        EXT_LIST.add(FileType.JPEG);
+        EXT_LIST.add(FileType.PNG);
+    }
+
+    @ApiOperation(value = "表单图片上传接口", notes = "表单图片上传接口")
+    @PostMapping(value = "/uploadImg")
+    public AjaxResult uploadImg(HttpServletResponse response, MultipartHttpServletRequest request)
+            throws IOException, FileUploadException, NoSuchAlgorithmException {
+        Map<String, String> fileMap = UploadUtil.doUpload(request, EXT_LIST, folderType, 1L);
+        AjaxResult ajaxResult = AjaxResult.buildSuccessInstance("上传成功");
+        ajaxResult.putInMap("file", fileMap.get("visitPath"));
+        return ajaxResult;
+    }
+
+
+    @ApiOperation(value = "短信验证码发送", notes = "短信验证码发送")
+    @PostMapping(value = "/sendSmsCode")
+    public AjaxResult sendSmsCode(@RequestBody @Validated SmsCodeDto smsCodeDto) {
+        SysUsers user = new SysUsers();
+        user.setSuTel(smsCodeDto.getTelphone());
+        List<SysUsers> users = sysUsersService.findByModel(user);
+        if (CollectionUtils.isEmpty(users)) {
+            return AjaxResult.buildFailInstance("该手机号不存在");
+        }
+
+        String codeExist = redisClient.getCachedValue(smsCodeDto.getTelphone());
+        if (StringUtils.isNotBlank(codeExist)) {
+            return AjaxResult.buildFailInstance("请勿重复发送验证码");
+        }
+
+        Integer code =(int) ((Math.random() * 9 + 1) * 100000);
+        Sms106Send.sendVerifyCode(smsCodeDto.getTelphone(), code.toString(), 2);
+        redisClient.saveValue(smsCodeDto.getTelphone(), code.toString(), 120);
+        return AjaxResult.buildSuccessInstance("发送成功");
+    }
+
+    @ApiOperation(value = "重置登陆密码", notes = "重置登陆密码")
+    @PostMapping(value = "/resetLoginPwd")
+    public AjaxResult resetLoginPwd(@RequestBody @Validated PwdResetDto pwdResetDto) throws UnsupportedEncodingException, NoSuchAlgorithmException {
+        SysUsers user = new SysUsers();
+        user.setSuTel(pwdResetDto.getTelphone());
+        List<SysUsers> users = sysUsersService.findByModel(user);
+        if (CollectionUtils.isEmpty(users)) {
+            return AjaxResult.buildFailInstance("该手机号不存在");
+        }
+
+        String code = redisClient.getCachedValue(pwdResetDto.getTelphone());
+        if (StringUtils.isBlank(code)) {
+            return AjaxResult.buildFailInstance("验证码已失效,请重新发送");
+        }
+
+        if (!code.equals(pwdResetDto.getCode())) {
+            return AjaxResult.buildFailInstance("验证码错误");
+        }
+
+        user = users.get(0);
+        user.setSuPassword(pwdResetDto.getNewPwd());
+        String pwd = PasswordUtil.getEncrypUserPwd(user);
+
+        int i = sysUsersService.updateUserPassword(user.getSuId(), pwd);
+        if (i > 0) {
+            redisClient.removeObject(pwdResetDto.getTelphone());
+            return AjaxResult.buildSuccessInstance("修改成功");
+        }
+        return AjaxResult.buildFailInstance("修改失败");
+    }
+
+    @ApiOperation(value = "获取app版本", notes = "获取app版本")
+    @ApiResponses({
+            @ApiResponse(code = 200, message = "ok", response = AppVersion.class)
+    })
+    @GetMapping(value = "/findAppVersion")
+    public AjaxResult findAppVersion() {
+        return AjaxResult.buildSuccessInstance(sysUsersService.findAppVersion());
+    }
+}
diff --git a/zq-erp/src/main/java/com/matrix/system/app/action/ApiFollowupAction.java b/zq-erp/src/main/java/com/matrix/system/app/action/ApiFollowupAction.java
new file mode 100644
index 0000000..25fa419
--- /dev/null
+++ b/zq-erp/src/main/java/com/matrix/system/app/action/ApiFollowupAction.java
@@ -0,0 +1,184 @@
+package com.matrix.system.app.action;
+
+import com.matrix.core.constance.MatrixConstance;
+import com.matrix.core.pojo.AjaxResult;
+import com.matrix.core.tools.StringUtils;
+import com.matrix.core.tools.WebUtil;
+import com.matrix.system.app.dto.*;
+import com.matrix.system.common.bean.SysUsers;
+import com.matrix.system.common.tools.DataAuthUtil;
+import com.matrix.system.hive.action.util.QueryUtil;
+import com.matrix.system.hive.bean.*;
+import com.matrix.system.hive.dao.*;
+import com.matrix.system.hive.plugin.util.CollectionUtils;
+import io.swagger.annotations.Api;
+import io.swagger.annotations.ApiOperation;
+import io.swagger.annotations.ApiResponse;
+import io.swagger.annotations.ApiResponses;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.validation.annotation.Validated;
+import org.springframework.web.bind.annotation.*;
+
+import java.util.*;
+import java.util.stream.Collectors;
+
+/**
+ * @author jyy
+ * @date 2020-12-21
+ **/
+@Api(value = "ApiFollowupAction", tags = "跟进记录接口类")
+@RestController
+@RequestMapping(value = "/api/followup")
+public class ApiFollowupAction {
+
+    @Autowired
+    private SysFollowupDao followupDao;
+
+    @Autowired
+    private SysVipAlbumDao vipAlbumDao;
+
+    @Autowired
+    private SysVipInfoDao vipInfoDao;
+
+    @Autowired
+    private SysFollowupCommentDao followupCommentDao;
+
+
+
+    @Autowired
+    private SysOrderItemDao orderItemDao;
+
+    @Autowired
+    private SysBeauticianStateDao beauticianStateDao;
+
+
+    @ApiOperation(value = "新增跟进记录", notes = "新增跟进记录")
+    @ApiResponses({
+            @ApiResponse(code = 200, message = "ok", response = SysFollowup.class)
+    })
+    @PostMapping(value = "/addFollowup")
+    public AjaxResult addFollowup(@RequestBody @Validated SysFollowup followup) {
+        SysUsers user = WebUtil.getSessionAttribute(MatrixConstance.LOGIN_KEY);
+        followup.setCreateBy(user.getSuName());
+        followup.setUpdateBy(user.getSuName());
+        followup.setStaffId(user.getSuId());
+        followup.setCompanyId(user.getCompanyId());
+        followup.setShopId(user.getShopId());
+        //处理订单摘要
+        if(followup.getOrderId()!=null){
+            List<SysOrderItem> sysOrderItems = orderItemDao.selectByOrderId(followup.getOrderId());
+            String abs="";
+            if(sysOrderItems.size()>1){
+                abs= sysOrderItems.get(0).getShoppingGoods().getName()+"等"+sysOrderItems.size()+"件商品";
+            }else{
+                abs= sysOrderItems.get(0).getShoppingGoods().getName();
+            }
+           followup.setOrderAbstract(abs);
+        }
+        //服务单摘要
+        if(followup.getServiceId()!=null){
+            List<SysBeauticianState> sysBeauticianStates = beauticianStateDao.selectBySerIds(followup.getServiceId());
+            String abs="";
+            if(sysBeauticianStates.size()>1){
+                abs= sysBeauticianStates.get(0).getProjInfo().getName()+"等"+sysBeauticianStates.size()+"项服务";
+            }else{
+                abs= sysBeauticianStates.get(0).getProjInfo().getName();
+            }
+            followup.setOrderAbstract(abs);
+        }
+
+        followupDao.insert(followup);
+        //插入图片
+        List<SysVipAlbum> albums=followup.getAlbums();
+        if(CollectionUtils.isNotEmpty(albums)){
+            for (SysVipAlbum vipAlbum:albums){
+                if(StringUtils.isNotBlank(vipAlbum.getImg())){
+                    vipAlbum.setCreateBy(user.getSuName());
+                    vipAlbum.setUpdateBy(user.getSuName());
+                    vipAlbum.setSource(SysVipAlbum.SOURCE_FOLLOW);
+                    vipAlbum.setVipId(followup.getVipId());
+                    vipAlbum.setSourceId(followup.getId());
+                    vipAlbumDao.insert(vipAlbum);
+                }
+            }
+        }
+
+        return AjaxResult.buildSuccessInstance("保存成功");
+    }
+
+    @ApiOperation(value = "跟进记录点赞或者取消点赞", notes = "跟进记录点赞或者取消点赞")
+    @ApiResponses({
+            @ApiResponse(code = 200, message = "ok", response = AjaxResult.class)
+    })
+    @GetMapping(value = "/zanFollowup/{id}")
+    public AjaxResult zanFollowup(@PathVariable("id")Long id) {
+        SysUsers user = WebUtil.getSessionAttribute(MatrixConstance.LOGIN_KEY);
+        SysFollowup followup = followupDao.selectById(id);
+        String zans=followup.getZans();
+        if(StringUtils.isNotBlank(zans)){
+            List<Long> zanIds = StringUtils.strToCollToLong(zans, ",");
+            List<Long> zaned = zanIds.stream().filter(zanid -> zanid.equals(user.getSuId())).collect(Collectors.toList());
+            if(CollectionUtils.isNotEmpty(zaned)){
+                //取消赞
+                List<Long> newZaned = zanIds.stream().filter(zanid -> !zanid.equals(user.getSuId())).collect(Collectors.toList());
+                zans=StringUtils.collToStr(newZaned,",");
+
+            }else{
+                //点赞
+                zanIds.add(user.getSuId());
+                zans=StringUtils.collToStr(zanIds,",");
+            }
+        }else{
+            //直接点赞
+            zans=user.getSuId()+"";
+        }
+        followupDao.updateZan(id,zans);
+        return AjaxResult.buildSuccessInstance("修改成功");
+    }
+
+
+    @ApiOperation(value = "评论跟进", notes = "评论跟进")
+    @ApiResponses({
+            @ApiResponse(code = 200, message = "ok", response = AjaxResult.class)
+    })
+    @PostMapping(value = "/addFollowupComment")
+    public AjaxResult addFollowupComment(@RequestBody @Validated SysFollowupComment followupComment) {
+        SysUsers user = WebUtil.getSessionAttribute(MatrixConstance.LOGIN_KEY);
+        followupComment.setCreateBy(user.getSuName());
+        followupComment.setUpdateBy(user.getSuName());
+        followupComment.setStaffId(user.getSuId());
+        followupCommentDao.insert(followupComment);
+        return AjaxResult.buildSuccessInstance("评论成功");
+    }
+
+
+    @ApiOperation(value = "查询跟进记录", notes = "查询跟进记录")
+    @ApiResponses({
+            @ApiResponse(code = 200, message = "ok", response = SysFollowup.class)
+    })
+    @PostMapping(value = "/findFollowup")
+    public AjaxResult findFollowup(@RequestBody @Validated FollowupListDto followupListDto) {
+        SysUsers user = WebUtil.getSessionAttribute(MatrixConstance.LOGIN_KEY);
+        if(!DataAuthUtil.hasAllShopAuth()){
+            followupListDto.setShopId(user.getShopId());
+        }
+        followupListDto.setCompanyId(user.getCompanyId());
+        followupListDto.setSelfStaff(user.getSuId());
+        //TODO 需要设置跨店数据权限
+        List<SysFollowup> rows= followupDao.selectByAppDto(followupListDto);
+        return AjaxResult.buildSuccessInstance(rows,"查询成功");
+    }
+
+
+
+
+
+
+
+
+
+
+    
+    
+
+}
\ No newline at end of file
diff --git a/zq-erp/src/main/java/com/matrix/system/app/action/ApiKnowledgeAction.java b/zq-erp/src/main/java/com/matrix/system/app/action/ApiKnowledgeAction.java
new file mode 100644
index 0000000..5aaab06
--- /dev/null
+++ b/zq-erp/src/main/java/com/matrix/system/app/action/ApiKnowledgeAction.java
@@ -0,0 +1,66 @@
+package com.matrix.system.app.action;
+
+import com.matrix.core.pojo.AjaxResult;
+import com.matrix.core.pojo.PaginationVO;
+import com.matrix.system.app.dto.ArticleListDto;
+import com.matrix.system.hive.action.BaseController;
+import com.matrix.system.hive.action.util.QueryUtil;
+import com.matrix.system.hive.bean.Article;
+import com.matrix.system.hive.bean.ArticleType;
+import com.matrix.system.hive.bean.SysShopInfo;
+import com.matrix.system.hive.dao.ArticleDao;
+import com.matrix.system.hive.dao.SysShopInfoDao;
+import com.matrix.system.hive.service.ArticleService;
+import com.matrix.system.hive.service.ArticleTypeService;
+import io.swagger.annotations.Api;
+import io.swagger.annotations.ApiOperation;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.web.bind.annotation.*;
+
+/**
+ * @author wzy
+ * @date 2020-12-27
+ **/
+@Api(value = "ApiKnowledgeAction", tags = "知识库接口类")
+@RestController
+@RequestMapping(value = "/api/know")
+public class ApiKnowledgeAction extends BaseController {
+
+    @Autowired
+    private ArticleTypeService articleTypeService;
+
+
+    @Autowired
+    private ArticleService articleService;
+
+    @ApiOperation(value = "获取知识库分类", notes = "获取知识库分类")
+    @GetMapping(value = "/findKnowledgeType")
+    public AjaxResult findKnowledgeType() {
+        ArticleType type = new ArticleType();
+        type.setCompanyId(getMe().getCompanyId());
+        return AjaxResult.buildSuccessInstance(articleTypeService.findByModel(type));
+    }
+
+    @ApiOperation(value = "根据分类获取文章列表", notes = "根据分类获取文章列表")
+    @PostMapping(value = "/findArticleList")
+    public AjaxResult findArticleList(@RequestBody ArticleListDto articleListDto) {
+        PaginationVO pageVo = new PaginationVO();
+        pageVo.setOffset((articleListDto.getPageNum() - 1) * articleListDto.getPageSize());
+        pageVo.setLimit(articleListDto.getPageSize());
+
+        Article article = new Article();
+        QueryUtil.setQueryLimitCom(article);
+        article.setTypeId(articleListDto.getTypeId());
+        return AjaxResult.buildSuccessInstance(articleService.findApiArticleListInPage(article, pageVo));
+    }
+
+    @ApiOperation(value = "获取文章详情页", notes = "获取文章详情页")
+    @GetMapping(value = "/findArticleDetail/{id}")
+    public AjaxResult findArticleDetail(@PathVariable("id") Long id) {
+        Article article = articleService.findById(id);
+        AjaxResult ajaxResult = AjaxResult.buildSuccessInstance("获取成功");
+        ajaxResult.putInMap("article", article);
+        return ajaxResult;
+    }
+
+}
diff --git a/zq-erp/src/main/java/com/matrix/system/app/action/ApiOrderAction.java b/zq-erp/src/main/java/com/matrix/system/app/action/ApiOrderAction.java
new file mode 100644
index 0000000..67a8262
--- /dev/null
+++ b/zq-erp/src/main/java/com/matrix/system/app/action/ApiOrderAction.java
@@ -0,0 +1,186 @@
+package com.matrix.system.app.action;
+
+import com.matrix.core.constance.MatrixConstance;
+import com.matrix.core.exception.GlobleException;
+import com.matrix.core.pojo.AjaxResult;
+import com.matrix.core.pojo.PaginationVO;
+import com.matrix.core.tools.WebUtil;
+import com.matrix.system.app.dto.CreateOderItemDto;
+import com.matrix.system.app.dto.CreateOrderDto;
+import com.matrix.system.app.dto.OrderListDto;
+import com.matrix.system.app.dto.ShoppingGoodsListDto;
+import com.matrix.system.app.vo.OrderDetailVo;
+import com.matrix.system.app.vo.ShoppingGoodsDetailVo;
+import com.matrix.system.app.vo.ShoppingGoodsListVo;
+import com.matrix.system.common.bean.SysUsers;
+import com.matrix.system.common.tools.DataAuthUtil;
+import com.matrix.system.hive.action.util.QueryUtil;
+import com.matrix.system.hive.bean.*;
+import com.matrix.system.hive.dao.SysShopInfoDao;
+import com.matrix.system.hive.plugin.util.CollectionUtils;
+import com.matrix.system.hive.pojo.ShoppingCarItem;
+import com.matrix.system.hive.pojo.ShoppingCarItemsVo;
+import com.matrix.system.hive.service.ShoppingGoodsCategoryService;
+import com.matrix.system.hive.service.ShoppingGoodsService;
+import com.matrix.system.hive.service.SysOrderService;
+import io.swagger.annotations.Api;
+import io.swagger.annotations.ApiOperation;
+import io.swagger.annotations.ApiResponse;
+import io.swagger.annotations.ApiResponses;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.validation.annotation.Validated;
+import org.springframework.web.bind.annotation.*;
+
+import java.util.ArrayList;
+import java.util.Arrays;
+import java.util.List;
+
+/**
+ * @author wzy
+ * @date 2020-12-21
+ **/
+@Api(value = "ApiOrderAction", tags = "订单接口类")
+@RestController
+@RequestMapping(value = "/api/order")
+public class ApiOrderAction {
+
+    @Autowired
+    private ShoppingGoodsCategoryService shoppingGoodsCategoryService;
+
+    @Autowired
+    private ShoppingGoodsService shoppingGoodsService;
+
+    @Autowired
+    private SysOrderService sysOrderService;
+
+    @Autowired
+    private SysShopInfoDao shopInfoDao;
+
+    @ApiOperation(value = "获取商品类型列表", notes = "获取商品类型列表")
+    @ApiResponses({
+            @ApiResponse(code = 200, message = "ok", response = ShoppingGoodsCategory.class)
+    })
+    @GetMapping(value = "/findShoppingGoodsType")
+    public AjaxResult findShoppingGoodsType() {
+        SysUsers user = WebUtil.getSessionAttribute(MatrixConstance.LOGIN_KEY);
+
+        SysShopInfo zbShop = shopInfoDao.selectZbShop(user.getCompanyId());
+        ShoppingGoodsCategory category = new ShoppingGoodsCategory();
+        category.setShopId(zbShop.getId());
+        List<ShoppingGoodsCategory> list = new ArrayList<>();
+        List<ShoppingGoodsCategory> byModel = shoppingGoodsCategoryService.findByModel(category);
+        ShoppingGoodsCategory type = new ShoppingGoodsCategory();
+        type.setName("全部");
+        type.setParentId(0L);
+        list.add(type);
+        list.addAll(byModel);
+        return AjaxResult.buildSuccessInstance(list);
+    }
+
+    @ApiOperation(value = "获取商品列表", notes = "获取商品列表")
+    @ApiResponses({
+            @ApiResponse(code = 200, message = "ok", response = ShoppingGoodsListVo.class)
+    })
+    @PostMapping(value = "/findShoppingGoods")
+    public AjaxResult findShoppingGoods(@RequestBody @Validated ShoppingGoodsListDto shoppingGoodsListDto) {
+        SysUsers user = WebUtil.getSessionAttribute(MatrixConstance.LOGIN_KEY);
+        if (!DataAuthUtil.hasAllShopAuth()) {
+            shoppingGoodsListDto.setShopId(user.getShopId());
+        }
+        QueryUtil.setQueryLimitCom(shoppingGoodsListDto);
+        return AjaxResult.buildSuccessInstance(shoppingGoodsService.findShoppingGoodsListForApi(shoppingGoodsListDto), shoppingGoodsService.findShoppingGoodsListTotalForApi(shoppingGoodsListDto));
+    }
+
+
+    @ApiOperation(value = "获取商品详情", notes = "获取商品详情")
+    @ApiResponses({
+            @ApiResponse(code = 200, message = "ok", response = ShoppingGoodsDetailVo.class)
+    })
+    @GetMapping(value = "/findGoodsDetailById/{goodsId}")
+    public AjaxResult findGoodsDetailById(@PathVariable("goodsId") Long goodsId) {
+        ShoppingGoodsDetailVo goodsDetail = shoppingGoodsService.findApiShoppingGoodsDetailById(goodsId);
+        AjaxResult ajaxResult = AjaxResult.buildSuccessInstance("获取成功");
+        ajaxResult.putInMap("goods", goodsDetail);
+        return ajaxResult;
+    }
+
+
+    @ApiOperation(value = "创建订单", notes = "创建订单")
+    @PostMapping(value = "/createOrder")
+    public AjaxResult createOrder(@RequestBody @Validated CreateOrderDto createOrderDto) {
+        SysUsers user = WebUtil.getSessionAttribute(MatrixConstance.LOGIN_KEY);
+
+        ShoppingCarItemsVo car = new ShoppingCarItemsVo();
+        car.setVipId(createOrderDto.getVipId());
+
+        if (CollectionUtils.isNotEmpty(createOrderDto.getItems())) {
+            List<ShoppingCarItem> list = new ArrayList<>();
+            for (CreateOderItemDto item : createOrderDto.getItems()) {
+                ShoppingCarItem carItem = new ShoppingCarItem();
+                carItem.setCount(item.getCount());
+                carItem.setGoodsId(item.getGoodsId());
+                carItem.setIsFree(item.getIsFree());
+                carItem.setType(item.getGoodsType());
+
+                carItem.setShoppingGoods(shoppingGoodsService.findById(item.getGoodsId()));
+                list.add(carItem);
+            }
+            car.setCarItems(list);
+        }
+        int i = sysOrderService.createOrder(WebUtil.getSession(), car);
+        if (i > 0) {
+            return AjaxResult.buildSuccessInstance("下单成功");
+        }
+
+        return AjaxResult.buildFailInstance("下单失败");
+    }
+
+    @ApiOperation(value = "获取订单列表", notes = "获取订单列表")
+    @ApiResponses({
+            @ApiResponse(code = 200, message = "ok", response = OrderDetailVo.class)
+    })
+    @PostMapping(value = "/findOrderList")
+    public AjaxResult findOrderList(@RequestBody @Validated OrderListDto orderListDto) {
+        SysUsers user = WebUtil.getSessionAttribute(MatrixConstance.LOGIN_KEY);
+        int offset = (orderListDto.getPageNum() - 1) * orderListDto.getPageSize();
+        int limit = orderListDto.getPageSize();
+        PaginationVO pageVo = new PaginationVO();
+        pageVo.setOffset(offset);
+        pageVo.setLimit(limit);
+
+        if (!DataAuthUtil.hasAllShopAuth()) {
+            orderListDto.setShopId(user.getShopId());
+        }
+        QueryUtil.setQueryLimitCom(orderListDto);
+        return AjaxResult.buildSuccessInstance(sysOrderService.findApiOrderListInPage(orderListDto, pageVo), sysOrderService.findApiOrderListTotal(orderListDto));
+    }
+
+    @ApiOperation(value = "获取订单详情", notes = "获取订单详情")
+    @ApiResponses({
+            @ApiResponse(code = 200, message = "ok", response = OrderDetailVo.class)
+    })
+    @GetMapping(value = "/findOrderDetail/{orderId}")
+    public AjaxResult findOrderDetail(@PathVariable("orderId") Long orderId) {
+        OrderDetailVo orderDetail = sysOrderService.findApiOrderDetailByOrderId(orderId);
+        AjaxResult ajaxResult = AjaxResult.buildSuccessInstance("获取成功");
+        ajaxResult.putInMap("orderDetail", orderDetail);
+        return ajaxResult;
+    }
+
+    @ApiOperation(value = "取消订单", notes = "取消订单")
+    @GetMapping(value = "/cancelOrder/{orderId}")
+    public AjaxResult cancelOrder(@PathVariable("orderId") Long orderId) {
+        SysOrder order = sysOrderService.findById(orderId);
+        if (order == null) {
+            throw new GlobleException("订单不存在");
+        }
+
+
+        int i = sysOrderService.cancelOrder(orderId);
+        if (i > 0) {
+            return AjaxResult.buildSuccessInstance("取消成功");
+        }
+        return AjaxResult.buildFailInstance("取消失败");
+    }
+
+}
\ No newline at end of file
diff --git a/zq-erp/src/main/java/com/matrix/system/app/action/ApiRankingAction.java b/zq-erp/src/main/java/com/matrix/system/app/action/ApiRankingAction.java
new file mode 100644
index 0000000..f3d4d1f
--- /dev/null
+++ b/zq-erp/src/main/java/com/matrix/system/app/action/ApiRankingAction.java
@@ -0,0 +1,89 @@
+package com.matrix.system.app.action;
+
+import com.matrix.core.pojo.AjaxResult;
+import com.matrix.core.tools.DateUtil;
+import com.matrix.system.app.dto.RankingDto;
+import com.matrix.system.app.vo.RankingVo;
+import com.matrix.system.common.tools.DataAuthUtil;
+import com.matrix.system.hive.action.util.QueryUtil;
+import com.matrix.system.hive.bean.AchieveNew;
+import com.matrix.system.hive.bean.SysOrder;
+import com.matrix.system.hive.dao.AchieveNewDao;
+import com.matrix.system.hive.service.AchieveNewService;
+import com.matrix.system.hive.service.SysOrderService;
+import io.swagger.annotations.Api;
+import io.swagger.annotations.ApiOperation;
+import io.swagger.annotations.ApiResponse;
+import io.swagger.annotations.ApiResponses;
+import org.springframework.beans.factory.annotation.Autowired;
+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 java.util.Date;
+import java.util.List;
+
+/**
+ * @author wzy
+ * @date 2020-12-28
+ **/
+@Api(value = "ApiRankingAction", tags = "排行榜接口类")
+@RestController
+@RequestMapping(value ="/api/ranking")
+public class ApiRankingAction {
+
+    @Autowired
+    private SysOrderService sysOrderService;
+
+    @Autowired
+    private AchieveNewDao achieveNewDao;
+
+    @ApiOperation(value = "顾问业绩排行榜", notes = "顾问业绩排行榜")
+    @ApiResponses({
+            @ApiResponse(code = 200, message = "ok", response = RankingVo.class)
+    })
+    @PostMapping(value = "/findStaffAchieveRanking")
+    public AjaxResult findStaffAchieveRanking(@RequestBody RankingDto rankingDto) {
+        AchieveNew achieveNew = new AchieveNew();
+        QueryUtil.setQueryLimitCom(achieveNew);
+        achieveNew.setType(rankingDto.getType());
+        achieveNew.setDatatime(new Date());
+        return AjaxResult.buildSuccessInstance(achieveNewDao.selectStaffSaleAchieveRanking(achieveNew));
+    }
+
+    @ApiOperation(value = "门店业绩排行榜", notes = "门店业绩排行榜")
+    @ApiResponses({
+            @ApiResponse(code = 200, message = "ok", response = RankingVo.class)
+    })
+    @PostMapping(value = "/findShopAchieveRanking")
+    public AjaxResult findShopAchieveRanking(@RequestBody RankingDto rankingDto) {
+        AjaxResult ajaxResult = AjaxResult.buildSuccessInstance("");
+        AchieveNew achieveNew = new AchieveNew();
+        QueryUtil.setQueryLimitCom(achieveNew);
+        achieveNew.setT1(rankingDto.getType());
+        achieveNew.setDatatime(new Date());
+
+        if (RankingDto.SALE.equals(rankingDto.getDataType())) {
+            List<RankingVo> list = achieveNewDao.selectShopSaleAchieveRanking(achieveNew);
+            ajaxResult.setRows(list);
+        } else {
+            List<RankingVo> rankingVos = achieveNewDao.selectShopConsumeAchieveRanking(achieveNew);
+            ajaxResult.setRows(rankingVos);
+        }
+        return ajaxResult;
+    }
+
+    @ApiOperation(value = "美疗师业绩排行榜", notes = "美疗师业绩排行榜")
+    @ApiResponses({
+            @ApiResponse(code = 200, message = "ok", response = RankingVo.class)
+    })
+    @PostMapping(value = "/findBeauticianAchieveRanking")
+    public AjaxResult findBeauticianAchieveRanking(@RequestBody RankingDto rankingDto) {
+        AchieveNew achieveNew = new AchieveNew();
+        QueryUtil.setQueryLimitCom(achieveNew);
+        achieveNew.setDatatime(new Date());
+        achieveNew.setT1(rankingDto.getType());
+        return AjaxResult.buildSuccessInstance(achieveNewDao.selectBeauticianConsumeAchieveRanking(achieveNew));
+    }
+}
diff --git a/zq-erp/src/main/java/com/matrix/system/app/action/ApiServiceOrderAction.java b/zq-erp/src/main/java/com/matrix/system/app/action/ApiServiceOrderAction.java
new file mode 100644
index 0000000..d9285cb
--- /dev/null
+++ b/zq-erp/src/main/java/com/matrix/system/app/action/ApiServiceOrderAction.java
@@ -0,0 +1,299 @@
+package com.matrix.system.app.action;
+
+import com.matrix.component.rabbitmq.RabiitMqTemplate;
+import com.matrix.core.constance.MatrixConstance;
+import com.matrix.core.exception.GlobleException;
+import com.matrix.core.pojo.AjaxResult;
+import com.matrix.core.pojo.PaginationVO;
+import com.matrix.core.pojo.VerifyResult;
+import com.matrix.core.tools.DateUtil;
+import com.matrix.core.tools.StringUtils;
+import com.matrix.core.tools.WebUtil;
+import com.matrix.system.app.dto.CreateServiceOrderDto;
+import com.matrix.system.app.dto.IdSubmitDto;
+import com.matrix.system.app.dto.ServiceOrderListDto;
+import com.matrix.system.app.dto.ServiceVipProjDto;
+import com.matrix.system.app.mapper.SysBeauticianStateMapper;
+import com.matrix.system.app.mapper.SysProjServiceMapper;
+import com.matrix.system.app.mapper.SysProjUseMapper;
+import com.matrix.system.app.vo.*;
+import com.matrix.system.common.bean.SysUsers;
+import com.matrix.system.common.tools.DataAuthUtil;
+import com.matrix.system.constance.Dictionary;
+import com.matrix.system.hive.action.util.QueryUtil;
+import com.matrix.system.hive.bean.SysBeauticianState;
+import com.matrix.system.hive.bean.SysProjServices;
+import com.matrix.system.hive.bean.SysProjUse;
+import com.matrix.system.hive.bean.SysVipInfo;
+import com.matrix.system.hive.plugin.util.CollectionUtils;
+import com.matrix.system.hive.service.SysBeauticianStateService;
+import com.matrix.system.hive.service.SysProjServicesService;
+import com.matrix.system.hive.service.SysProjUseService;
+import com.matrix.system.hive.service.SysVipInfoService;
+import com.matrix.system.shopXcx.mqTask.MQTaskRouting;
+import com.matrix.system.wechart.templateMsg.UniformMsgParam;
+import io.swagger.annotations.Api;
+import io.swagger.annotations.ApiOperation;
+import io.swagger.annotations.ApiResponse;
+import io.swagger.annotations.ApiResponses;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.beans.factory.annotation.Value;
+import org.springframework.validation.annotation.Validated;
+import org.springframework.web.bind.annotation.*;
+
+import java.util.ArrayList;
+import java.util.Date;
+import java.util.List;
+
+/**
+ * @author wzy
+ * @date 2020-12-24
+ **/
+@Api(value = "ApiServiceOrderAction", tags = "服务单接口类")
+@RestController
+@RequestMapping(value = "/api/serviceOrder")
+public class ApiServiceOrderAction {
+
+    @Autowired
+    private SysProjUseService projUseService;
+
+    @Autowired
+    private SysVipInfoService sysVipInfoService;
+
+    @Autowired
+    private SysProjServicesService projServicesService;
+
+    @Autowired
+    private SysBeauticianStateService sysBeauticianStateService;
+
+    @Autowired
+    private RabiitMqTemplate rabiitMqTemplate;
+
+    @Value("${evn}")
+    private  String evn;
+
+    @ApiOperation(value ="获取用户项目/套餐列表", notes = "获取用户项目/套餐列表")
+    @ApiResponses({
+            @ApiResponse(code = 200, message = "ok", response = ServiceProductListVo.class)
+    })
+    @PostMapping(value = "/findVipProject")
+    public AjaxResult findVipProject(@RequestBody @Validated ServiceVipProjDto serviceVipProjDto) {
+        SysVipInfo vipInfo = sysVipInfoService.findById(serviceVipProjDto.getVipId());
+
+        if (vipInfo == null) {
+            throw new GlobleException("会员不存在");
+        }
+
+        ServiceProductListVo productListVo = new ServiceProductListVo();
+        productListVo.setName(vipInfo.getVipName());
+        productListVo.setVipId(serviceVipProjDto.getVipId());
+
+        SysProjUse queryUse = new SysProjUse();
+        queryUse.setVipId(serviceVipProjDto.getVipId());
+        queryUse.setType(Dictionary.SHOPPING_GOODS_TYPE_XM);
+        queryUse.setTaocanId(-1L);
+        if (serviceVipProjDto.getType() != null) {
+            switch (serviceVipProjDto.getType()) {
+                case "0":
+                    break;
+                case "1":
+                    queryUse.setStatus(Dictionary.TAOCAN_STATUS_YX);
+                    queryUse.setIsOver(Dictionary.FLAG_NO_N);
+                    break;
+                case "2":
+                    queryUse.setTargetFailTime(DateUtil.getDateAfterMonth(new Date(), 1));
+                    queryUse.setStatus(Dictionary.TAOCAN_STATUS_YX);
+                    queryUse.setIsOver(Dictionary.FLAG_NO_N);
+                    break;
+                case "3":
+                    queryUse.setStatus(Dictionary.TAOCAN_STATUS_WX);
+                    queryUse.setIsOver(Dictionary.FLAG_YES_Y);
+                    break;
+                default:
+                    queryUse.setStatus(Dictionary.TAOCAN_STATUS_YX);
+                    queryUse.setIsOver(Dictionary.FLAG_NO_N);
+                    break;
+            }
+        } else {
+            queryUse.setStatus(Dictionary.TAOCAN_STATUS_YX);
+            queryUse.setIsOver(Dictionary.FLAG_NO_N);
+        }
+
+        queryUse.setQueryKey(serviceVipProjDto.getQueryKey());
+        List<SysProjUse> projList = projUseService.findInPage(queryUse, null);
+        List<ServiceProjVo> serviceProjVos = SysProjUseMapper.INSTANCE.entityListToProjVoList(projList);
+
+        queryUse.setTaocanId(null);
+        queryUse.setType(Dictionary.SHOPPING_GOODS_TYPE_TC);
+        List<SysProjUse> taoCanList = projUseService.findInPage(queryUse, null);
+        List<ServiceTcVo> serviceTcVos = SysProjUseMapper.INSTANCE.entityListToTcVoList(taoCanList);
+
+        if (CollectionUtils.isNotEmpty(serviceTcVos)) {
+            serviceTcVos.forEach(item -> {
+                List<SysProjUse> sysProjUses = projUseService.selectTaocanProjUse(item.getId(), queryUse.getStatus());
+                List<ServiceProjVo> taocanProj = SysProjUseMapper.INSTANCE.entityListToProjVoList(sysProjUses);
+                item.setProj(taocanProj);
+            });
+        }
+
+        productListVo.setProj(serviceProjVos);
+        productListVo.setComposeProj(serviceTcVos);
+        AjaxResult ajaxResult = AjaxResult.buildSuccessInstance("获取成功");
+        ajaxResult.putInMap("proj", productListVo);
+        return ajaxResult;
+    }
+
+    @ApiOperation(value = "提交服务单", notes = "提交服务单")
+    @PostMapping(value = "/createServiceOrder")
+    public AjaxResult createServiceOrder(@RequestBody @Validated CreateServiceOrderDto serviceOrderDto) {
+        if (CollectionUtils.isEmpty(serviceOrderDto.getProjItems())) {
+            throw new GlobleException("请选择服务");
+        }
+        SysVipInfo vipInfo = sysVipInfoService.findById(serviceOrderDto.getVipId());
+//        if (StringUtils.isBlank(vipInfo.getPassWord())) {
+//            return AjaxResult.buildFailInstance("未设置资金密码");
+//        }
+
+        if (StringUtils.isNotBlank(vipInfo.getPassWord())) {
+            if (!vipInfo.getPassWord().equals(serviceOrderDto.getPassword())) {
+                return AjaxResult.buildFailInstance("资金密码错误");
+            }
+        }
+
+        SysProjServices sysProjServices = new SysProjServices();
+        sysProjServices.setVipId(serviceOrderDto.getVipId());
+        sysProjServices.setYyTime(serviceOrderDto.getYyTime());
+        sysProjServices.setRemark(serviceOrderDto.getRemark());
+
+        List<SysBeauticianState> sysBeauticianStates = new ArrayList<>();
+        serviceOrderDto.getProjItems().forEach(item ->{
+            SysBeauticianState sysBeauticianState = SysBeauticianStateMapper.INSTANCE.serviceOrderItemVoToEntity(item);
+
+            sysBeauticianState.setBeginTime(serviceOrderDto.getYyTime());
+            sysBeauticianState.setEndTime(DateUtil.getDateAfterMinute(serviceOrderDto.getYyTime(), serviceOrderDto.getTotalTime()));
+            sysBeauticianState.setStaffId(serviceOrderDto.getBeautyId());
+            sysBeauticianStates.add(sysBeauticianState);
+        });
+
+        sysProjServices.setServiceItems(sysBeauticianStates);
+
+        //检测欠款
+        VerifyResult arrearsVerifyResult = projServicesService.checkArrears(sysProjServices);
+        if (arrearsVerifyResult.isError()) {
+            return new AjaxResult(AjaxResult.STATUS_FAIL, arrearsVerifyResult.getMsg());
+        }
+        //检测余次
+        VerifyResult balanceverifyResult = projServicesService.checkBalance(sysProjServices);
+        if (balanceverifyResult.isError()) {
+            return new AjaxResult(AjaxResult.STATUS_FAIL, balanceverifyResult.getMsg());
+        }
+
+        // 设置状态为待预约
+        sysProjServices.setState(Dictionary.SERVICE_STATU_DYY);
+        SysProjServices newSysProjServices = projServicesService.addSysProjServices(sysProjServices);
+        if (newSysProjServices != null) {
+            return AjaxResult.buildSuccessInstance("下单成功");
+        } else {
+            return new AjaxResult(AjaxResult.STATUS_FAIL, "下单失败!");
+        }
+    }
+
+    @ApiOperation(value = "查询服务单列表", notes = "查询服务单列表")
+    @ApiResponses({
+            @ApiResponse(code = 200, message = "ok", response = ServiceOrderListVo.class)
+    })
+    @PostMapping(value = "/findServiceOrderList")
+    public AjaxResult findServiceOrderList(@RequestBody @Validated ServiceOrderListDto orderListDto) {
+        PaginationVO pageVo = new PaginationVO();
+        int offset = (orderListDto.getPageNum() - 1) * orderListDto.getPageSize();
+        int limit = orderListDto.getPageSize();
+        pageVo.setOffset(offset);
+        pageVo.setLimit(limit);
+
+        if (!DataAuthUtil.hasAllShopAuth()) {
+            SysUsers user = WebUtil.getSessionAttribute(MatrixConstance.LOGIN_KEY);
+            orderListDto.setShopId(user.getShopId());
+        }
+        QueryUtil.setQueryLimitCom(orderListDto);
+        return AjaxResult.buildSuccessInstance(projServicesService.findApiServiceOrderListInPage(orderListDto, pageVo), projServicesService.findApiServiceOrderListTotal(orderListDto));
+    }
+
+    @ApiOperation(value = "获取服务单详情", notes = "获取服务单详情")
+    @ApiResponses({
+            @ApiResponse(code = 200, message = "ok", response = ServiceOrderDetailVo.class)
+    })
+    @GetMapping(value = "/findServiceOrderDetail/{id}")
+    public AjaxResult findServiceOrderDetail(@PathVariable("id") Long id) {
+        SysProjServices projServices = projServicesService.findById(id);
+        if (projServices == null) {
+            return AjaxResult.buildFailInstance("服务单不存在");
+        }
+
+        ServiceOrderDetailVo detailVo = SysProjServiceMapper.INSTANCE.projServiceToDetailVo(projServices);
+
+        List<SysBeauticianState> beauticianStates = sysBeauticianStateService.findBySerId(projServices.getId());
+        List<ServiceOrderDetailItemVo> items = SysBeauticianStateMapper.INSTANCE.entitiesToDetailItemsVo(beauticianStates);
+        detailVo.setItems(items);
+
+        AjaxResult ajaxResult = AjaxResult.buildSuccessInstance("获取成功");
+        ajaxResult.putInMap("detail", detailVo);
+        return ajaxResult;
+    }
+
+    @ApiOperation(value = "开始服务", notes = "开始服务")
+    @GetMapping(value = "/startService/{id}")
+    public AjaxResult startService(@PathVariable("id") Long id) {
+        SysProjServices sysProjServices = new SysProjServices();
+        sysProjServices.setId(id);
+        int i = projServicesService.modifyFWKSProjServices(sysProjServices);
+        if (i > 0) {
+            return AjaxResult.buildSuccessInstance("开始服务成功");
+        }
+        return AjaxResult.buildFailInstance("开始服务失败");
+    }
+
+    @ApiOperation(value = "结束服务", notes = "结束服务")
+    @GetMapping(value = "/stopService/{id}")
+    public AjaxResult stopService(@PathVariable("id") Long id) {
+        SysProjServices projServvices = new SysProjServices();
+        projServvices.setId(id);
+        int result = projServicesService.modifyFWJSrojServices(projServvices);
+        if (result > 0) {
+            return new AjaxResult(AjaxResult.STATUS_SUCCESS, "结束服务成功");
+        } else {
+            return new AjaxResult(AjaxResult.STATUS_FAIL, "结束服务失败");
+        }
+    }
+
+    @ApiOperation(value = "取消服务", notes = "取消服务")
+    @GetMapping(value = "/cancelService/{id}")
+    public AjaxResult cancelService(@PathVariable("id") Long id) {
+        SysProjServices services = new SysProjServices();
+        services.setId(id);
+        int i = projServicesService.modifyCancelProjServices(services);
+        if (i > 0) {
+            return new AjaxResult(AjaxResult.STATUS_SUCCESS, "取消预约成功");
+        } else {
+            return new AjaxResult(AjaxResult.STATUS_FAIL, "取消预约失败");
+        }
+    }
+
+    @ApiOperation(value = "确认服务", notes = "确认服务")
+    @PostMapping(value = "/confirmServiceOrder")
+    public AjaxResult confirmServiceOrder(@RequestBody @Validated IdSubmitDto idSubmitDto) {
+        SysProjServices services = new SysProjServices();
+        services.setId(idSubmitDto.getId());
+        services.setState(Dictionary.BEATUI_STATE_DYY);
+        int i = projServicesService.modify(services);
+        if (i > 0) {
+            //发送微信公众号提醒
+            services=projServicesService.findById(services.getId());
+            UniformMsgParam uniformMsgParam=new UniformMsgParam(services.getCompanyId(),UniformMsgParam.GZH_YYCG);
+            uniformMsgParam.put("serviceId",services.getId());
+            rabiitMqTemplate.sendMsg(MQTaskRouting.SEND_UNIFORM_TEMPLATE_MSG+evn,uniformMsgParam.toJSONString());
+
+            return AjaxResult.buildSuccessInstance("确认成功");
+        }
+        return AjaxResult.buildFailInstance("确认失败");
+    }
+}
diff --git a/zq-erp/src/main/java/com/matrix/system/app/action/ApiShopInfoAction.java b/zq-erp/src/main/java/com/matrix/system/app/action/ApiShopInfoAction.java
new file mode 100644
index 0000000..afa562a
--- /dev/null
+++ b/zq-erp/src/main/java/com/matrix/system/app/action/ApiShopInfoAction.java
@@ -0,0 +1,43 @@
+package com.matrix.system.app.action;
+
+import com.matrix.core.constance.MatrixConstance;
+import com.matrix.core.pojo.AjaxResult;
+import com.matrix.core.tools.WebUtil;
+import com.matrix.system.common.bean.SysUsers;
+import com.matrix.system.common.constance.AppConstance;
+import com.matrix.system.common.tools.DataAuthUtil;
+import com.matrix.system.hive.action.util.QueryUtil;
+import com.matrix.system.hive.bean.SysShopInfo;
+import com.matrix.system.hive.service.SysShopInfoService;
+import io.swagger.annotations.Api;
+import io.swagger.annotations.ApiOperation;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.web.bind.annotation.GetMapping;
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.RestController;
+
+/**
+ * @author wzy
+ * @date 2020-12-30
+ **/
+@Api(value = "ApiShopInfoAction", tags = "店铺信息接口类")
+@RestController
+@RequestMapping(value = "/api/shop")
+public class ApiShopInfoAction {
+
+    @Autowired
+    private SysShopInfoService shopInfoService;
+
+    @ApiOperation(value = "获取门店列表", notes = "获取门店列表")
+    @GetMapping(value = "/findAllShopList")
+    public AjaxResult findAllShopList() {
+        SysShopInfo shopInfo = new SysShopInfo();
+        QueryUtil.setQueryLimitCom(shopInfo);
+        SysUsers sysUsers = (SysUsers) WebUtil.getSession().getAttribute(MatrixConstance.LOGIN_KEY);
+        if(!DataAuthUtil.hasAllShopAuth()){
+            shopInfo.setId(sysUsers.getShopId());
+        }
+
+        return AjaxResult.buildSuccessInstance(shopInfoService.findByModel(shopInfo));
+    }
+}
diff --git a/zq-erp/src/main/java/com/matrix/system/app/action/ApiSkinCheckAction.java b/zq-erp/src/main/java/com/matrix/system/app/action/ApiSkinCheckAction.java
new file mode 100644
index 0000000..1763057
--- /dev/null
+++ b/zq-erp/src/main/java/com/matrix/system/app/action/ApiSkinCheckAction.java
@@ -0,0 +1,92 @@
+package com.matrix.system.app.action;
+
+import com.matrix.core.pojo.AjaxResult;
+import com.matrix.core.pojo.PaginationVO;
+import com.matrix.core.tools.StringUtils;
+import com.matrix.system.app.dto.SkinCheckListDto;
+import com.matrix.system.app.mapper.SysSkinCheckRecordMapper;
+import com.matrix.system.app.vo.SkinCheckAnalysisItems;
+import com.matrix.system.app.vo.SkinCheckDetailVo;
+import com.matrix.system.app.vo.SkinCheckDiagnoseItemVo;
+import com.matrix.system.app.vo.SkinCheckListVo;
+import com.matrix.system.hive.bean.SysSkinCheckRecord;
+import com.matrix.system.hive.dao.SysSkinCheckRecordDao;
+import com.matrix.system.hive.plugin.util.CollectionUtils;
+import com.matrix.system.shopXcx.bean.ShopProduct;
+import com.matrix.system.shopXcx.dao.ShopProductDao;
+import io.swagger.annotations.Api;
+import io.swagger.annotations.ApiOperation;
+import io.swagger.annotations.ApiResponse;
+import io.swagger.annotations.ApiResponses;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.validation.annotation.Validated;
+import org.springframework.web.bind.annotation.*;
+
+import java.util.List;
+
+/**
+ * @author wzy
+ * @date 2020-12-27
+ **/
+@Api(value = "ApiSkinCheckAction", tags = "皮肤检测接口类")
+@RestController
+@RequestMapping(value = "/api/skinCheck")
+public class ApiSkinCheckAction {
+
+    @Autowired
+    private SysSkinCheckRecordDao sysSkinCheckRecordDao;
+
+    @Autowired
+    private ShopProductDao shopProductDao;
+
+    @ApiOperation(value = "获取皮肤检测列表", notes = "获取皮肤检测列表")
+    @PostMapping(value = "/findSkinCheckList")
+    public AjaxResult findSkinCheckList(@RequestBody @Validated SkinCheckListDto skinCheckListDto) {
+        SysSkinCheckRecord sysSkinCheckRecord = new SysSkinCheckRecord();
+        sysSkinCheckRecord.setUserId(skinCheckListDto.getVipId());
+
+        PaginationVO pageVo = new PaginationVO();
+        pageVo.setOffset((skinCheckListDto.getPageNum() - 1) * skinCheckListDto.getPageSize());
+        pageVo.setLimit(skinCheckListDto.getPageSize());
+        pageVo.setSort("t1.create_time");
+        pageVo.setOrder("desc");
+
+        List<SysSkinCheckRecord> dataList = sysSkinCheckRecordDao.selectInPage(sysSkinCheckRecord, pageVo);
+        List<SkinCheckListVo> list = SysSkinCheckRecordMapper.INSTANCE.entitiesToListVos(dataList);
+        AjaxResult result = new AjaxResult(AjaxResult.STATUS_SUCCESS, list,
+                sysSkinCheckRecordDao.selectTotalRecord(sysSkinCheckRecord));
+        return result;
+    }
+
+
+    @ApiOperation(value = "获取皮肤检测详情", notes = "获取皮肤检测详情")
+    @ApiResponses({
+            @ApiResponse(code = 200, message = "ok", response = SkinCheckDetailVo.class)
+    })
+    @GetMapping(value = "/findSkinCheckDetail/{id}")
+    public AjaxResult findSkinCheckDetail(@PathVariable("id") Long id) {
+
+        SysSkinCheckRecord sysSkinCheckRecord = sysSkinCheckRecordDao.selectById(id);
+
+        SysSkinCheckRecordMapper instance = SysSkinCheckRecordMapper.INSTANCE;
+        SkinCheckDetailVo detail = instance.entityToDetailVo(sysSkinCheckRecord);
+        detail.setSex(sysSkinCheckRecord.getSex());
+        List<SkinCheckDiagnoseItemVo> diagnoseItems = instance.entitiesToDiagnoseItems(sysSkinCheckRecord.getAnalysisDetail());
+        List<SkinCheckAnalysisItems> analysisItems = instance.entitiesToAnalysisItems(sysSkinCheckRecord.getSkinDetails());
+
+        analysisItems.forEach(item -> {
+            List<Integer> ids = StringUtils.strToCollToInteger(item.getProductIds(), ",");
+            if(CollectionUtils.isNotEmpty(ids)){
+                List<String> shopProducts = shopProductDao.selectProductNameByIds(ids);
+                item.setProducts(shopProducts);
+            }
+        });
+
+        detail.setDiagnoseItems(diagnoseItems);
+        detail.setAnalysisItems(analysisItems);
+
+        AjaxResult ajaxResult = AjaxResult.buildSuccessInstance("获取成功");
+        ajaxResult.putInMap("detail", detail);
+        return ajaxResult;
+    }
+}
diff --git a/zq-erp/src/main/java/com/matrix/system/app/action/ApiStatisticsAction.java b/zq-erp/src/main/java/com/matrix/system/app/action/ApiStatisticsAction.java
new file mode 100644
index 0000000..71d838c
--- /dev/null
+++ b/zq-erp/src/main/java/com/matrix/system/app/action/ApiStatisticsAction.java
@@ -0,0 +1,313 @@
+package com.matrix.system.app.action;
+
+import com.matrix.core.constance.MatrixConstance;
+import com.matrix.core.pojo.AjaxResult;
+import com.matrix.core.pojo.PaginationVO;
+import com.matrix.core.tools.DateUtil;
+import com.matrix.core.tools.WebUtil;
+import com.matrix.system.app.dto.BusinessesDto;
+import com.matrix.system.app.dto.VipStatisticsParamDto;
+import com.matrix.system.app.vo.BeauticianVo;
+import com.matrix.system.app.vo.BusinessesDataShowVo;
+import com.matrix.system.app.vo.VipAchieveDataShowVo;
+import com.matrix.system.common.bean.SysUsers;
+import com.matrix.system.hive.action.util.QueryUtil;
+import com.matrix.system.hive.bean.AchieveNew;
+import com.matrix.system.hive.bean.SysBusinessData;
+import com.matrix.system.hive.dao.SysBusinessDataDao;
+import com.matrix.system.hive.service.imp.DataAnalysisCustomerServiceImpl;
+import com.matrix.system.hiveErp.analysUtil.*;
+import com.matrix.system.hiveErp.dao.TjVipSumDao;
+import io.swagger.annotations.Api;
+import io.swagger.annotations.ApiOperation;
+import io.swagger.annotations.ApiResponse;
+import io.swagger.annotations.ApiResponses;
+import org.jsoup.helper.DataUtil;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.validation.annotation.Validated;
+import org.springframework.web.bind.annotation.*;
+
+import java.math.BigDecimal;
+import java.util.*;
+
+/**
+ * @author wzy
+ * @date 2020-12-28
+ **/
+@Api(value = "ApiStatisticsAction", tags = "报表接口类")
+@RestController
+@RequestMapping(value = "/api/statistics")
+public class ApiStatisticsAction {
+
+    @Autowired
+    TjVipSumDao tjVipSumDao;
+
+    @Autowired
+    private SysBusinessDataDao sysBusinessDataDao;
+
+    @Autowired
+    private DataAnalysisCustomerServiceImpl dataAnalysisCustomerService;
+
+    @ApiOperation(value = "公司经营报表/门店经营报表")
+    @ApiResponses({
+            @ApiResponse(code = 200, message = "ok", response = BusinessesDataShowVo.class)
+    })
+    @PostMapping(value = "/findShopBusinessesData")
+    public AjaxResult findShopBusinessesData(@RequestBody BusinessesDto businessesDto) {
+        String unit = "";
+        int calenderUnit;
+        if (BusinessesDto.DAY.equals(businessesDto.getType())) {
+            unit = "日";
+            calenderUnit = Calendar.DATE;
+        } else {
+            unit = "月";
+            calenderUnit = Calendar.MONTH;
+        }
+
+        SysUsers user = WebUtil.getSessionAttribute(MatrixConstance.LOGIN_KEY);
+        int start = (businessesDto.getPageNum() - 1) * businessesDto.getPageSize();
+        int size = businessesDto.getPageSize();
+        Calendar calendar = Calendar.getInstance();
+        calendar.add(calenderUnit, 1);
+        calendar.add(calenderUnit, -start);
+        String endTime = DateUtil.dateToString(calendar.getTime(), DateUtil.DATE_FORMAT_DD);
+        calendar.add(calenderUnit, -size);
+        String startTime = DateUtil.dateToString(calendar.getTime(), DateUtil.DATE_FORMAT_DD);
+        List<Date> xAxis = StatisticsTimeUtil.getTimeSpace(startTime, endTime, unit);
+        List<StatisticsTimeDaoParam> timeSpaceParam = StatisticsTimeUtil.buidParam(xAxis);
+        List<StatisticsTimeDaoParam> statisticsTimeDaoParams = timeSpaceParam.subList(0, timeSpaceParam.size() - 2);
+        List<BusinessesDataShowVo> list = sysBusinessDataDao.selectApiBusinessData(statisticsTimeDaoParams, businessesDto.getShopId(), user.getCompanyId());
+
+        List<BusinessesDataShowVo> result = new ArrayList<>();
+        for (int i = list.size() - 1; i >= 0; i--) {
+            BusinessesDataShowVo item = list.get(i);
+            String dataTime = item.getDataTime();
+            if (BusinessesDto.DAY.equals(businessesDto.getType())) {
+                item.setDataTime(DateUtil.dateToString(DateUtil.stringToDate(dataTime, DateUtil.DATE_FORMAT_DD), DateUtil.DATE_FORMAT_DD));
+            } else {
+                item.setDataTime(DateUtil.dateToString(DateUtil.stringToDate(dataTime, DateUtil.MONTH), DateUtil.MONTH));
+            }
+            result.add(item);
+        }
+        return AjaxResult.buildSuccessInstance(result);
+    }
+
+    public static void main(String[] args) {
+        int start = 1;
+
+        int end  = 10;
+
+        Calendar calendar = Calendar.getInstance();
+        calendar.add(Calendar.DATE, start);
+        Date time = calendar.getTime();
+        System.out.println(time);
+        calendar.add(Calendar.DATE, end);
+        System.out.println(calendar.getTime());
+
+    }
+
+    @ApiOperation(value = "专项", notes = "专项")
+    @PostMapping(value = "/findBusinessInCome")
+    public AjaxResult findBusinessInCome(@RequestBody @Validated StatisticsParamVo statisticsParam) {
+        if (statisticsParam.getShopId() != null) {
+            AjaxResult ajaxResult = dataAnalysisCustomerService.getAnalysisResult(statisticsParam, new Caculate<BigDecimal>() {
+                @Override
+                public Map<String, BigDecimal> exec(List<StatisticsTimeDaoParam> timeSpaceParam, Long shopId, Long companyId) {
+                    switch (statisticsParam.getType()) {
+                        case "1" :
+                            return tjVipSumDao.selectBusinessInCome(timeSpaceParam, shopId, null);
+                        case "2" :
+                            return tjVipSumDao.selectCashIncome(timeSpaceParam, shopId, null);
+                        case "3" :
+                            return tjVipSumDao.selectCardUse(timeSpaceParam, shopId, null);
+                        case "4" :
+                            return tjVipSumDao.selectArrears(timeSpaceParam, shopId, null);
+                        case "5" :
+                            return tjVipSumDao.selectCashRefund(timeSpaceParam, shopId, null);
+                        case "6" :
+                            return tjVipSumDao.selectCardRefund(timeSpaceParam, shopId, null);
+                        case "7":
+                            return tjVipSumDao.selectProductAchieve(timeSpaceParam, shopId, null);
+                        case "8":
+                            return tjVipSumDao.selectCardAchieve(timeSpaceParam, shopId, null);
+                        case "9":
+                            return tjVipSumDao.selectRepayment(timeSpaceParam, shopId, null);
+                        case "10":
+                            return tjVipSumDao.selectPerCustomCnt(timeSpaceParam, shopId, null);
+                        case "11":
+                            return tjVipSumDao.selectCustomGoodsCnt(timeSpaceParam, shopId, null);
+                        case "12":
+                            return tjVipSumDao.selectPerCustomPrice(timeSpaceParam, shopId, null);
+                        case "13":
+                            return tjVipSumDao.selectCost(timeSpaceParam, shopId, null);
+                        case "14":
+                            return tjVipSumDao.selectGrossProfit(timeSpaceParam, shopId, null);
+                        case "15":
+                            return tjVipSumDao.selectGrossProfitRate(timeSpaceParam, shopId, null);
+                        case "16" :
+                            return tjVipSumDao.selectHisConsume(timeSpaceParam, shopId, null);
+                        case "17" :
+                            return tjVipSumDao.selectFreeConsume(timeSpaceParam, shopId, null);
+                        case "18" :
+                            return tjVipSumDao.selectPeopleCnt(timeSpaceParam, shopId, null);
+                        case "19" :
+                            return tjVipSumDao.selectProjConsumeCnt(timeSpaceParam, shopId, null);
+                        case "20" :
+                            return tjVipSumDao.selectTimeLength(timeSpaceParam, shopId, null);
+                        default :
+                            return tjVipSumDao.selectBusinessInCome(timeSpaceParam, shopId, null);
+                    }
+                }
+            });
+            return setDataList(ajaxResult);
+        } else {
+            AjaxResult ajaxResult = dataAnalysisCustomerService.getCompanyAnalysisResult(statisticsParam, new Caculate<BigDecimal>() {
+                @Override
+                public Map<String, BigDecimal> exec(List<StatisticsTimeDaoParam> timeSpaceParam, Long shopId, Long companyId) {
+                    switch (statisticsParam.getType()) {
+                        case "1" :
+                            return tjVipSumDao.selectBusinessInCome(timeSpaceParam, null, companyId);
+                        case "2" :
+                            return tjVipSumDao.selectCashIncome(timeSpaceParam, null, companyId);
+                        case "3" :
+                            return tjVipSumDao.selectCardUse(timeSpaceParam, null, companyId);
+                        case "4" :
+                            return tjVipSumDao.selectArrears(timeSpaceParam, null, companyId);
+                        case "5" :
+                            return tjVipSumDao.selectCashRefund(timeSpaceParam, null, companyId);
+                        case "6" :
+                            return tjVipSumDao.selectCardRefund(timeSpaceParam, null, companyId);
+                        case "7":
+                            return tjVipSumDao.selectProductAchieve(timeSpaceParam, null, companyId);
+                        case "8":
+                            return tjVipSumDao.selectCardAchieve(timeSpaceParam, null, companyId);
+                        case "9":
+                            return tjVipSumDao.selectRepayment(timeSpaceParam, null, companyId);
+                        case "10":
+                            return tjVipSumDao.selectPerCustomCnt(timeSpaceParam, null, companyId);
+                        case "11":
+                            return tjVipSumDao.selectCustomGoodsCnt(timeSpaceParam, null, companyId);
+                        case "12":
+                            return tjVipSumDao.selectPerCustomPrice(timeSpaceParam, null, companyId);
+                        case "13":
+                            return tjVipSumDao.selectCost(timeSpaceParam, null, companyId);
+                        case "14":
+                            return tjVipSumDao.selectCost(timeSpaceParam, null, companyId);
+                        case "15":
+                            return tjVipSumDao.selectCost(timeSpaceParam, null, companyId);
+                        case "16" :
+                            return tjVipSumDao.selectHisConsume(timeSpaceParam, null, companyId);
+                        case "17" :
+                            return tjVipSumDao.selectFreeConsume(timeSpaceParam, null, companyId);
+                        case "18" :
+                            return tjVipSumDao.selectPeopleCnt(timeSpaceParam, null, companyId);
+                        case "19" :
+                            return tjVipSumDao.selectProjConsumeCnt(timeSpaceParam, null, companyId);
+                        case "20" :
+                            return tjVipSumDao.selectTimeLength(timeSpaceParam, null, companyId);
+                        default :
+                            return tjVipSumDao.selectBusinessInCome(timeSpaceParam, null, companyId);
+                    }
+                }
+            });
+            return setDataList(ajaxResult);
+        }
+    }
+
+    private AjaxResult setDataList(AjaxResult ajaxResult) {
+        List<SeriesVo> list = (List<SeriesVo>) ajaxResult.getMapInfo().get("series");
+        String[] xAxis = (String[]) ajaxResult.getMapInfo().get("xAxis");
+        String [] data = list.get(0).getData();
+        if (data != null && data.length != 0) {
+            List<Map<String, String>> dataList = new ArrayList<>();
+            for(int i = data.length - 1; i >= 0; i--) {
+                Map<String, String> map = new HashMap<>();
+                map.put(xAxis[i], data[i]);
+                dataList.add(map);
+            }
+            ajaxResult.setRows(dataList);
+        }
+
+        return ajaxResult;
+    }
+
+
+    @ApiOperation(value = "查询员工业绩报表", notes = "查询员工业绩报表")
+    @ApiResponses({
+            @ApiResponse(code = 200, message = "ok", response = VipAchieveDataShowVo.class)
+    })
+    @PostMapping(value = "/findVipAchieve")
+    public AjaxResult findVipAchieve(@RequestBody BusinessesDto businessesDto) {
+        String unit = "";
+        int calenderUnit;
+        if (BusinessesDto.DAY.equals(businessesDto.getType())) {
+            unit = "日";
+            calenderUnit = Calendar.DATE;
+        } else {
+            unit = "月";
+            calenderUnit = Calendar.MONTH;
+        }
+
+        int start = (businessesDto.getPageNum() - 1) * businessesDto.getPageSize();
+        int size = businessesDto.getPageSize();
+        Calendar calendar = Calendar.getInstance();
+        calendar.add(calenderUnit, 1);
+        calendar.add(calenderUnit, -start);
+        String endTime = DateUtil.dateToString(calendar.getTime(), DateUtil.DATE_FORMAT_DD);
+        calendar.add(calenderUnit, -size);
+        String startTime = DateUtil.dateToString(calendar.getTime(), DateUtil.DATE_FORMAT_DD);
+        List<Date> xAxis = StatisticsTimeUtil.getTimeSpace(startTime, endTime, unit);
+        List<StatisticsTimeDaoParam> timeSpaceParam = StatisticsTimeUtil.buidParam(xAxis);
+        List<StatisticsTimeDaoParam> statisticsTimeDaoParams = timeSpaceParam.subList(0, timeSpaceParam.size() - 2);
+        List<VipAchieveDataShowVo> list = tjVipSumDao.selectVipAchieveInPage(statisticsTimeDaoParams, businessesDto.getStaffId());
+
+        List<VipAchieveDataShowVo> result = new ArrayList<>();
+        for (int i = list.size() - 1; i >= 0; i--) {
+            VipAchieveDataShowVo item = list.get(i);
+            String dataTime = item.getTime();
+            if (BusinessesDto.DAY.equals(businessesDto.getType())) {
+                item.setTime(DateUtil.dateToString(DateUtil.stringToDate(dataTime, DateUtil.DATE_FORMAT_DD), DateUtil.DATE_FORMAT_DD));
+            } else {
+                item.setTime(DateUtil.dateToString(DateUtil.stringToDate(dataTime, DateUtil.MONTH), DateUtil.MONTH));
+            }
+            result.add(item);
+        }
+        return AjaxResult.buildSuccessInstance(result);
+    }
+
+    @ApiOperation(value = "员工专项", notes = "员工专项")
+    @PostMapping(value = "/findVipBusinessData")
+    public AjaxResult findVipBusinessData(@RequestBody @Validated VipStatisticsParamDto vipStatisticsParamDto) {
+        AjaxResult ajaxResult = dataAnalysisCustomerService.getStaffAnalysisResult(vipStatisticsParamDto, new Caculate<BigDecimal>() {
+            @Override
+            public Map<String, BigDecimal> exec(List<StatisticsTimeDaoParam> timeSpaceParam, Long shopId, Long staffId) {
+                switch (vipStatisticsParamDto.getType()) {
+                    case "1" :
+                        return tjVipSumDao.selectStaffOrderAchieve(timeSpaceParam, staffId);
+                    case "2" :
+                        return tjVipSumDao.selectStaffCashAchieve(timeSpaceParam, staffId);
+                    case "3" :
+                        return tjVipSumDao.selectStaffCardAchieve(timeSpaceParam, staffId);
+                    case "4" :
+                        return tjVipSumDao.selectStaffGoodsAchieve(timeSpaceParam, staffId);
+                    case "5" :
+                        return tjVipSumDao.selectStaffHisConsumeAchieve(timeSpaceParam, staffId);
+                    case "6" :
+                        return tjVipSumDao.selectStaffFreeConsumeAchieve(timeSpaceParam, staffId);
+                    case "7" :
+                        return tjVipSumDao.selectStaffCommissionAchieve(timeSpaceParam, staffId);
+                    case "8" :
+                        return tjVipSumDao.selectStaffPeopleNum(timeSpaceParam, staffId);
+                    case "9" :
+                        return tjVipSumDao.selectStaffProjNum(timeSpaceParam, staffId);
+                    case "10" :
+                        return tjVipSumDao.selectStaffProjTime(timeSpaceParam, staffId);
+                    default:
+                        return tjVipSumDao.selectStaffOrderAchieve(timeSpaceParam, staffId);
+                }
+            }
+        });
+
+        return setDataList(ajaxResult);
+    }
+}
diff --git a/zq-erp/src/main/java/com/matrix/system/app/action/ApiStoreAction.java b/zq-erp/src/main/java/com/matrix/system/app/action/ApiStoreAction.java
new file mode 100644
index 0000000..3be8eb5
--- /dev/null
+++ b/zq-erp/src/main/java/com/matrix/system/app/action/ApiStoreAction.java
@@ -0,0 +1,82 @@
+package com.matrix.system.app.action;
+
+import com.matrix.core.constance.MatrixConstance;
+import com.matrix.core.pojo.AjaxResult;
+import com.matrix.core.pojo.PaginationVO;
+import com.matrix.core.tools.WebUtil;
+import com.matrix.system.app.dto.StoreInOutListDto;
+import com.matrix.system.app.dto.StoreListDto;
+import com.matrix.system.app.mapper.SysStoreInfoMapper;
+import com.matrix.system.app.vo.StoreInOutListVo;
+import com.matrix.system.app.vo.StoreListVo;
+import com.matrix.system.common.bean.SysUsers;
+import com.matrix.system.common.tools.DataAuthUtil;
+import com.matrix.system.hive.bean.SysStoreInfo;
+import com.matrix.system.hive.dao.SysStoreInfoDao;
+import com.matrix.system.hive.pojo.StoreInOutRecordVO;
+import io.swagger.annotations.Api;
+import io.swagger.annotations.ApiOperation;
+import io.swagger.annotations.ApiResponse;
+import io.swagger.annotations.ApiResponses;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.validation.annotation.Validated;
+import org.springframework.web.bind.annotation.*;
+
+import java.util.List;
+
+/**
+ * @author wzy
+ * @date 2020-12-27
+ **/
+@Api(value = "ApiStoreAction", tags = "库存管理接口类")
+@RestController
+@RequestMapping(value = "/api/store")
+public class ApiStoreAction {
+
+    @Autowired
+    private SysStoreInfoDao sysStoreInfoDao;
+
+    @ApiOperation(value = "获取库存列表", notes = "获取库存列表")
+    @ApiResponses({
+            @ApiResponse(code = 200, message = "ok", response = StoreListVo.class)
+    })
+    @PostMapping(value = "/findStoreList")
+    public AjaxResult findStoreList(@RequestBody @Validated StoreListDto storeListDto) {
+        SysStoreInfo sysStoreInfo = new SysStoreInfo();
+
+        SysUsers users = WebUtil.getSessionAttribute(MatrixConstance.LOGIN_KEY);
+        sysStoreInfo.setShopId(users.getShopId());
+        sysStoreInfo.setCompanyId(users.getCompanyId());
+        sysStoreInfo.setQueryKey(storeListDto.getQueryKey());
+        PaginationVO pageVo = new PaginationVO();
+        pageVo.setOffset((storeListDto.getPageNum() - 1) * storeListDto.getPageSize());
+        pageVo.setLimit(storeListDto.getPageSize());
+        pageVo.setSort("c.goods_no");
+        pageVo.setOrder("asc");
+
+        List<SysStoreInfo> dataList = sysStoreInfoDao.selectCountInPage(sysStoreInfo, pageVo);
+        List<StoreListVo> resultList = SysStoreInfoMapper.INSTANCE.entitiesToStoreVos(dataList);
+
+        return new AjaxResult(AjaxResult.STATUS_SUCCESS,  resultList, sysStoreInfoDao.selectCountTotalRecord(sysStoreInfo));
+    }
+
+    @ApiOperation(value = "获取商品出入库列表", notes = "获取商品出入库列表")
+    @ApiResponses({
+            @ApiResponse(code = 200, message = "ok", response = StoreInOutListVo.class)
+    })
+    @PostMapping(value = "/findGoodsInOutInfo")
+    public AjaxResult findGoodsInOutInfo(@RequestBody @Validated StoreInOutListDto storeInOutListDto) {
+        StoreInOutRecordVO inOutRecordVO = new StoreInOutRecordVO();
+        inOutRecordVO.setBeginTime(storeInOutListDto.getStartTime());
+        inOutRecordVO.setEndTime(storeInOutListDto.getEndTime());
+        inOutRecordVO.setName(storeInOutListDto.getCode());
+
+        PaginationVO pageVo = new PaginationVO();
+        pageVo.setOffset((storeInOutListDto.getPageNum() - 1) * storeInOutListDto.getPageSize());
+        pageVo.setLimit(storeInOutListDto.getPageSize());
+        List<StoreInOutRecordVO> dataList =sysStoreInfoDao.findStoreInOutRecord(inOutRecordVO,pageVo);
+        List<StoreInOutListVo> list = SysStoreInfoMapper.INSTANCE.recordVosToInOutListVos(dataList);
+        return AjaxResult.buildSuccessInstance(list,sysStoreInfoDao.findStoreInOutTotal(inOutRecordVO));
+    }
+
+}
diff --git a/zq-erp/src/main/java/com/matrix/system/app/action/ApiUsersAction.java b/zq-erp/src/main/java/com/matrix/system/app/action/ApiUsersAction.java
new file mode 100644
index 0000000..c3cc658
--- /dev/null
+++ b/zq-erp/src/main/java/com/matrix/system/app/action/ApiUsersAction.java
@@ -0,0 +1,184 @@
+package com.matrix.system.app.action;
+
+import com.matrix.component.redis.RedisClient;
+import com.matrix.core.constance.MatrixConstance;
+import com.matrix.core.pojo.AjaxResult;
+import com.matrix.core.tools.DateUtil;
+import com.matrix.core.tools.WebUtil;
+import com.matrix.system.app.dto.*;
+import com.matrix.system.app.mapper.SysBeauticianStateMapper;
+import com.matrix.system.app.mapper.SysUsersMapper;
+import com.matrix.system.app.mapper.SysWorkBeatuistaffMapper;
+import com.matrix.system.app.vo.BeauticianVo;
+import com.matrix.system.app.vo.UserAchieveVo;
+import com.matrix.system.app.vo.UserInfoDetailVo;
+import com.matrix.system.common.bean.SysUsers;
+import com.matrix.system.common.interceptor.ApiUserLoginInterceptor;
+import com.matrix.system.common.service.SysUsersService;
+import com.matrix.system.common.tools.DataAuthUtil;
+import com.matrix.system.common.tools.PasswordUtil;
+import com.matrix.system.hive.action.BaseController;
+import com.matrix.system.hive.bean.SysBeauticianState;
+import com.matrix.system.hive.bean.SysWorkBeatuistaff;
+import com.matrix.system.hive.service.AchieveNewService;
+import com.matrix.system.hive.service.SysWorkBeatuistaffService;
+import com.matrix.system.hive.service.SysWorktimeService;
+import io.swagger.annotations.Api;
+import io.swagger.annotations.ApiOperation;
+import io.swagger.annotations.ApiResponse;
+import io.swagger.annotations.ApiResponses;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.beans.factory.annotation.Value;
+import org.springframework.validation.annotation.Validated;
+import org.springframework.web.bind.annotation.*;
+
+import javax.annotation.Resource;
+import javax.servlet.http.HttpServletRequest;
+import java.io.UnsupportedEncodingException;
+import java.security.NoSuchAlgorithmException;
+import java.util.ArrayList;
+import java.util.List;
+
+/**
+ * @author wzy
+ * @date 2020-12-21
+ **/
+@Api(value = "ApiUsersAction", tags = "用户中心接口类")
+@RestController
+@RequestMapping(value = "/api/user")
+public class ApiUsersAction extends BaseController {
+
+    @Autowired
+    private AchieveNewService achieveNewService;
+
+    @Autowired
+    private SysWorktimeService sysWorkTimeService;
+
+    @Autowired
+    private SysUsersService sysUsersService;
+
+    @Autowired
+    private SysWorkBeatuistaffService sysWorkBeatuistaffService;
+
+    @Autowired
+    private RedisClient redisClient;
+    @Value("${login_private_key}")
+    private  String privateKey;
+
+    @ApiOperation(value = "个人中心--获取用户业绩接口 type 1-今日 2-昨天 3-本月 4-上月")
+    @ApiResponses({
+            @ApiResponse(code = 200, message = "ok", response = UserAchieveVo.class)
+    })
+    @GetMapping(value = "/findUserAchieve/{type}")
+    public AjaxResult findUserAchieve(@PathVariable("type") Integer type) {
+        UserAchieveVo achieveVo = achieveNewService.findUserAchieveByTime(type);
+        AjaxResult ajaxResult = AjaxResult.buildSuccessInstance("获取成功");
+        ajaxResult.putInMap("achieve", achieveVo);
+        return ajaxResult;
+    }
+
+    @ApiOperation(value = "获取美疗师列表 - 开始时间结束时间")
+    @ApiResponses(
+            @ApiResponse(code = 200, message = "Ok", response = BeauticianVo.class)
+    )
+    @PostMapping(value = "/findBeauticianList")
+    public AjaxResult findBeauticianList(@RequestBody @Validated BeauticianDto beauticianDto) {
+//        SysBeauticianState sysBeauticianState = new SysBeauticianState();
+//        sysBeauticianState.setBeginTime(beauticianDto.getStartTime());
+//        sysBeauticianState.setEndTime(beauticianDto.getEndTime());
+//
+//        // 根据时间获取一段排班码
+//        String panBanCodes = DateUtil.dateToString(sysBeauticianState.getBeginTime(),DateUtil.DATE_FORMAT_NO_SPLITE_DD);
+//        // 获取登陆的用户
+//        SysUsers user = (SysUsers) WebUtil.getSession().getAttribute(MatrixConstance.LOGIN_KEY);
+//        List<SysUsers> staffs=new ArrayList<>();
+//        if(sysWorkTimeService.isInWorkTime(user.getShopId(),sysBeauticianState.getBeginTime(),sysBeauticianState.getEndTime())){
+//            staffs= sysUsersService.findByCodeBeaStateShop(user.getShopId(),
+//                    sysBeauticianState, panBanCodes);
+//        }
+
+        SysUsers user = (SysUsers) WebUtil.getSession().getAttribute(MatrixConstance.LOGIN_KEY);
+        String panBanCodes = DateUtil.dateToString(beauticianDto.getStartTime(),DateUtil.DATE_FORMAT_NO_SPLITE_DD);
+        List<SysWorkBeatuistaff> workBeauty = sysWorkBeatuistaffService.findByDateStr(panBanCodes, user.getShopId());
+        return new AjaxResult(AjaxResult.STATUS_SUCCESS, SysWorkBeatuistaffMapper.INSTANCE.workBeautysToBeautyVos(workBeauty), 0);
+    }
+
+    @ApiOperation(value = "退出登陆", notes = "退出登陆")
+    @GetMapping(value = "/loginOut")
+    public AjaxResult loginOut(HttpServletRequest request) {
+        String token=ApiUserLoginInterceptor.resolveToken(request,privateKey);
+        redisClient.removeObject(token);
+        return AjaxResult.buildSuccessInstance("退出成功");
+    }
+
+    @ApiOperation(value = "员工列表", notes = "员工列表")
+    @ApiResponses({
+            @ApiResponse(code = 200, message = "ok", response = BeauticianVo.class)
+    })
+    @PostMapping(value = "/findAllUsers")
+    public AjaxResult findAllUsers(@RequestBody UsersQueryDto usersQueryDto) {
+        SysUsers sysUsers = WebUtil.getSessionAttribute(MatrixConstance.LOGIN_KEY);
+
+        SysUsers query = new SysUsers();
+        if (DataAuthUtil.hasAllShopAuth()) {
+            query.setCompanyId(sysUsers.getCompanyId());
+        } else {
+            query.setCompanyId(sysUsers.getCompanyId());
+            query.setShopId(sysUsers.getShopId());
+        }
+        query.setSuUserType("employee");
+        query.setSuName(usersQueryDto.getQueryKey());
+        List<SysUsers> list = sysUsersService.findByModel(query);
+        List<BeauticianVo> dataList = SysUsersMapper.INSTANCE.usersListToBeautyList(list);
+        return AjaxResult.buildSuccessInstance(dataList);
+    }
+
+    @ApiOperation(value = "修改密码", notes = "修改密码")
+    @PostMapping(value = "/modifyPwd")
+    public AjaxResult modifyPwd(@RequestBody @Validated PwdModifyDto pwdModifyDto) throws UnsupportedEncodingException, NoSuchAlgorithmException {
+        SysUsers me = getMe();
+        SysUsers user = sysUsersService.findById(me.getSuId());
+
+        SysUsers pwdUser = new SysUsers();
+        pwdUser.setSuPassword(pwdModifyDto.getOldPwd());
+        pwdUser.setSuRegisterTime(user.getSuRegisterTime());
+        String pwd = PasswordUtil.getEncrypUserPwd(pwdUser);
+        if (!pwd.equals(user.getSuPassword())) {
+            return AjaxResult.buildFailInstance("老密码错误");
+        }
+
+        int i = sysUsersService.updateUserPassword(user.getSuId(), pwd);
+        if (i > 0) {
+            return AjaxResult.buildSuccessInstance("修改成功");
+        }
+        return AjaxResult.buildFailInstance("修改失败");
+
+    }
+
+    @ApiOperation(value = "获取当前登陆用户信息", notes = "获取当前登陆用户信息")
+    @ApiResponses({
+            @ApiResponse(code = 200, message = "ok", response = UserInfoDetailVo.class)
+    })
+    @GetMapping(value = "/findUserInfo")
+    public AjaxResult findUserInfo() {
+        SysUsers user = sysUsersService.findById(getMe().getSuId());
+
+        UserInfoDetailVo userInfoDetailVo = SysUsersMapper.INSTANCE.usersToDetailInfoVo(user);
+        AjaxResult ajaxResult = AjaxResult.buildSuccessInstance("获取成功");
+        ajaxResult.putInMap("detail", userInfoDetailVo);
+        return ajaxResult;
+    }
+
+    @ApiOperation(value = "编辑当前用户信息", notes = "编辑当前用户信息")
+    @PostMapping(value = "/modifyUserInfo")
+    public AjaxResult modifyUserInfo(@RequestBody @Validated ModifyUserDto modifyUserDto) {
+        SysUsers user = SysUsersMapper.INSTANCE.modifyUserDtoToUsers(modifyUserDto);
+        user.setSuId(getMe().getSuId());
+        int i = sysUsersService.modifyByModel(user);
+        if (i > 0) {
+            return AjaxResult.buildSuccessInstance("修改成功");
+        }
+        return AjaxResult.buildFailInstance("修改失败");
+    }
+
+}
diff --git a/zq-erp/src/main/java/com/matrix/system/app/action/ApiVipInfoAction.java b/zq-erp/src/main/java/com/matrix/system/app/action/ApiVipInfoAction.java
new file mode 100644
index 0000000..bac7d9e
--- /dev/null
+++ b/zq-erp/src/main/java/com/matrix/system/app/action/ApiVipInfoAction.java
@@ -0,0 +1,227 @@
+package com.matrix.system.app.action;
+
+import com.matrix.core.constance.MatrixConstance;
+import com.matrix.core.pojo.AjaxResult;
+import com.matrix.core.pojo.PaginationVO;
+import com.matrix.core.tools.EncrypUtil;
+import com.matrix.core.tools.StringUtils;
+import com.matrix.core.tools.WebUtil;
+import com.matrix.system.app.dto.AddVipDto;
+import com.matrix.system.app.dto.ModifyVipDto;
+import com.matrix.system.app.dto.QuestionAnswerDto;
+import com.matrix.system.app.dto.VipInfoListDto;
+import com.matrix.system.app.mapper.MoneyCardUseMapper;
+import com.matrix.system.app.mapper.QuestionMapper;
+import com.matrix.system.app.vo.*;
+import com.matrix.system.common.bean.CustomerDataDictionary;
+import com.matrix.system.common.bean.SysUsers;
+import com.matrix.system.common.dao.CustomerDataDictionaryDao;
+import com.matrix.system.common.tools.DataAuthUtil;
+import com.matrix.system.common.tools.PasswordUtil;
+import com.matrix.system.hive.action.BaseController;
+import com.matrix.system.hive.action.util.QueryUtil;
+import com.matrix.system.hive.bean.*;
+import com.matrix.system.hive.dao.MoneyCardUseDao;
+import com.matrix.system.hive.dao.VipAnswerDao;
+import com.matrix.system.hive.plugin.util.CollectionUtils;
+import com.matrix.system.hive.service.MoneyCardUseService;
+import com.matrix.system.hive.service.QuestionSerivce;
+import com.matrix.system.hive.service.SysVipInfoService;
+import com.matrix.system.hive.service.SysVipLevelService;
+import io.swagger.annotations.Api;
+import io.swagger.annotations.ApiOperation;
+import io.swagger.annotations.ApiResponse;
+import io.swagger.annotations.ApiResponses;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.validation.annotation.Validated;
+import org.springframework.web.bind.annotation.*;
+
+import java.io.UnsupportedEncodingException;
+import java.security.NoSuchAlgorithmException;
+import java.util.List;
+
+/**
+ * @author wzy
+ * @date 2020-12-21
+ **/
+@Api(value = "ApiVipInfoAction", tags = "会员接口类")
+@RestController
+@RequestMapping(value = "/api/vip")
+public class ApiVipInfoAction extends BaseController {
+
+    @Autowired
+    private SysVipInfoService sysVipInfoService;
+
+    @Autowired
+    private SysVipLevelService sysVipLevelService;
+
+    @Autowired
+    private CustomerDataDictionaryDao customerDataDictionaryDao;
+
+    @Autowired
+    private MoneyCardUseService moneyCardUseService;
+
+    @Autowired
+    private QuestionSerivce questionSerivce;
+
+    @Autowired
+    private VipAnswerDao vipAnswerDao;
+
+    @ApiOperation(value = "获取会员通讯录列表", notes = "获取会员通讯录列表")
+    @ApiResponses({
+            @ApiResponse(code = 200, message = "ok", response = VipInfoListVo.class)
+    })
+    @PostMapping(value = "/findVipInfoList")
+    public AjaxResult findVipInfoList(@RequestBody VipInfoListDto vipInfoListDto) {
+        if (StringUtils.isBlank(vipInfoListDto.getSort())) {
+            vipInfoListDto.setSort("zjm");
+        }
+
+        if (StringUtils.isBlank(vipInfoListDto.getOrder())) {
+            vipInfoListDto.setOrder("asc");
+        }
+
+        int offset = (vipInfoListDto.getPageNum() - 1) * vipInfoListDto.getPageSize();
+        int limit = vipInfoListDto.getPageSize();
+        vipInfoListDto.setOffset(offset);
+        vipInfoListDto.setLimit(limit);
+        return AjaxResult.buildSuccessInstance(sysVipInfoService.findVipAddressBook(vipInfoListDto));
+    }
+
+    @ApiOperation(value = "根据id查询用户信息(通讯录及个人中心)", notes = "根据id查询用户信息")
+    @ApiResponses({
+            @ApiResponse(code = 200, message = "ok", response = VipInfoVo.class)
+    })
+    @GetMapping(value = "/findVipInfoById/{id}")
+    public AjaxResult findVipInfoById(@PathVariable("id") Long id) {
+        AjaxResult ajaxResult = AjaxResult.buildSuccessInstance("获取成功");
+        VipInfoVo vipInfoVo = sysVipInfoService.findApiVipInfoById(id);
+        ajaxResult.putInMap("vipInfo", vipInfoVo);
+        return ajaxResult;
+    }
+
+    @ApiOperation(value = "根据id查询用户详细信息")
+    @ApiResponses({
+            @ApiResponse(code = 200, message = "ok", response = VipInfoDetailVo.class)
+    })
+    @GetMapping(value = "/findVipInfoDetailById/{id}")
+    public AjaxResult findVipInfoDetailById(@PathVariable("id") Long id) {
+        VipInfoDetailVo vipInfoDetailVo = sysVipInfoService.findVipInfoDetail(id);
+        AjaxResult ajaxResult = AjaxResult.buildSuccessInstance("获取成功");
+        ajaxResult.putInMap("vipInfo", vipInfoDetailVo);
+        return ajaxResult;
+    }
+
+    @ApiOperation(value = "查询会员类型", notes = "查询会员类型")
+    @ApiResponses(
+            @ApiResponse(code = 200, message = "ok", response = SysVipLevel.class)
+    )
+    @GetMapping(value = "/findVipType")
+    public AjaxResult findVipType() {
+        SysUsers sysUsers = WebUtil.getSessionAttribute(MatrixConstance.LOGIN_KEY);
+        SysVipLevel sysVipLevel = new SysVipLevel();
+        if(!DataAuthUtil.hasAllShopAuth()) {
+            sysVipLevel.setShopId(sysUsers.getShopId());
+        }
+
+        return AjaxResult.buildSuccessInstance(sysVipLevelService.findByModel(sysVipLevel));
+    }
+
+
+    @ApiOperation(value = "获取到店途径列表", notes = "获取到店途径列表")
+    @ApiResponses({
+            @ApiResponse(code = 200, message = "ok", response = CustomerDataDictionary.class)
+    })
+    @GetMapping(value = "/findArrivalWayList")
+    public AjaxResult findArrivalWayList() {
+        List<CustomerDataDictionary> ddtj = customerDataDictionaryDao.selectByParentCode("DDTJ", getMe().getCompanyId());
+        return AjaxResult.buildSuccessInstance(ddtj);
+    }
+
+    @ApiOperation(value = "添加会员", notes = "添加会员")
+    @PostMapping(value = "/addVip")
+    public AjaxResult addVip(@RequestBody @Validated AddVipDto addVipDto) {
+        int i = sysVipInfoService.apiAddVip(addVipDto);
+        if (i > 0) {
+            return AjaxResult.buildSuccessInstance("新增成功");
+        }
+        return AjaxResult.buildFailInstance("新增失败");
+    }
+
+    @ApiOperation(value = "编辑会员", notes = "编辑会员")
+    @PostMapping(value = "/modifyVip")
+    public AjaxResult modifyVip(@RequestBody ModifyVipDto modifyVipDto) {
+        int i = sysVipInfoService.apiModifyVip(modifyVipDto);
+        if (i > 0) {
+            return AjaxResult.buildSuccessInstance("修改成功");
+        }
+        return AjaxResult.buildFailInstance("修改失败");
+    }
+
+    @ApiOperation(value = "获取用户信息列表", notes = "获取用户信息列表")
+    @GetMapping(value = "/findAllVipInfo")
+    public AjaxResult findAllVipInfo() {
+        SysUsers user = WebUtil.getSessionAttribute(MatrixConstance.LOGIN_KEY);
+        SysVipInfo sysVipInfo = new SysVipInfo();
+        if(!DataAuthUtil.hasAllShopAuth()) {
+            sysVipInfo.setShopId(user.getShopId());
+        }
+        QueryUtil.setQueryLimitCom(sysVipInfo);
+        return AjaxResult.buildSuccessInstance(sysVipInfoService.findAll(sysVipInfo));
+    }
+
+    @ApiOperation(value = "卡项 - 获取会员卡项列表", notes = "卡项 - 获取会员卡项列表")
+    @ApiResponses({
+            @ApiResponse(code = 200, message = "ok", response = VipCardListVo.class)
+    })
+    @GetMapping(value = "/findVipCardInfo/{vipId}")
+    public AjaxResult findVipCardInfo(@PathVariable("vipId") Long vipId) {
+        MoneyCardUse moneyCardUse = new MoneyCardUse();
+        moneyCardUse.setVipId(vipId);
+        List<MoneyCardUse> list = moneyCardUseService.findVipCardUseInPage(moneyCardUse, null);
+
+        List<VipCardListVo> dataList = MoneyCardUseMapper.INSTANCE.entitiesToCardListVos(list);
+        return AjaxResult.buildSuccessInstance(dataList);
+    }
+
+    @ApiOperation(value = "会员档案 - 获取客户档案问题", notes = "会员档案 - 获取客户档案问题")
+    @ApiResponses({
+            @ApiResponse(code = 200, message = "ok", response = QuestionVo.class)
+    })
+    @GetMapping(value = "/findVipQuestions/{vipId}")
+    public AjaxResult findVipQuestions(@PathVariable("vipId") Long vipId) {
+        // 获取会员所有的答案,分类型
+        List<Question> questions = questionSerivce.findByVipId(vipId);
+        AjaxResult result = AjaxResult.buildSuccessInstance("获取成功");
+        List<QuestionVo> list = QuestionMapper.INSTANCE.entitiesToVos(questions);
+        result.putInMap("questions", list);
+        return result;
+    }
+
+    @ApiOperation(value = "会员档案 - 提交会员档案", notes = "会员档案 - 提交会员档案")
+    @PostMapping(value = "/saveVipQuestionsAnswer")
+    public AjaxResult saveVipQuestionsAnswer(@RequestBody QuestionAnswerDto questionAnswerDto) {
+        VipAnswer delAnswer = new VipAnswer();
+        delAnswer.setVipId(questionAnswerDto.getVipId());
+        vipAnswerDao.deleteByModel(delAnswer);
+        if (CollectionUtils.isNotEmpty(questionAnswerDto.getItems())) {
+            List<VipAnswer> vipAnswers = QuestionMapper.INSTANCE.dtosToVipAnswers(questionAnswerDto.getItems());
+            vipAnswerDao.batchInsert(vipAnswers);
+        }
+        return AjaxResult.buildSuccessInstance("档案更新成功");
+    }
+
+    @ApiOperation(value = "用户是否存在资金密码", notes = "用户是否存在资金密码")
+    @GetMapping(value = "/isExistFundPassword/{vipId}")
+    public AjaxResult isExistFundPassword(@PathVariable(value = "vipId") Long vipId) {
+        SysVipInfo vipInfo = sysVipInfoService.findById(vipId);
+        AjaxResult ajaxResult = AjaxResult.buildSuccessInstance("获取成功");
+        if (StringUtils.isNotBlank(vipInfo.getPassWord())) {
+            ajaxResult.putInMap("isExist", true);
+        } else {
+            ajaxResult.putInMap("isExist", false);
+        }
+
+        return ajaxResult;
+    }
+}
diff --git a/zq-erp/src/main/java/com/matrix/system/app/action/ApiVipLabelAction.java b/zq-erp/src/main/java/com/matrix/system/app/action/ApiVipLabelAction.java
new file mode 100644
index 0000000..3399e91
--- /dev/null
+++ b/zq-erp/src/main/java/com/matrix/system/app/action/ApiVipLabelAction.java
@@ -0,0 +1,82 @@
+package com.matrix.system.app.action;
+
+import com.matrix.core.pojo.AjaxResult;
+import com.matrix.system.app.dto.LabelDto;
+import com.matrix.system.hive.action.BaseController;
+import com.matrix.system.hive.bean.SysVipLabel;
+import com.matrix.system.hive.dao.SysVipLabelDao;
+import io.swagger.annotations.Api;
+import io.swagger.annotations.ApiOperation;
+import io.swagger.annotations.ApiResponse;
+import io.swagger.annotations.ApiResponses;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.web.bind.annotation.*;
+
+import java.util.List;
+
+/**
+ * @author wzy
+ * @date 2020-12-22
+ **/
+@Api(value = "ApiVipLabelAction", tags = "客户标签接口类")
+@RestController
+@RequestMapping(value = "/api/label")
+public class ApiVipLabelAction extends BaseController {
+
+    @Autowired
+    private SysVipLabelDao sysVipLabelDao;
+
+    @ApiOperation(value = "获取标签列表", notes = "获取标签列表")
+    @ApiResponses({
+            @ApiResponse(code = 200, message = "ok", response = SysVipLabel.class)
+    })
+    @PostMapping(value = "/findLabelList")
+    public AjaxResult findLabelByVipId(@RequestBody LabelDto labelDto) {
+        SysVipLabel sysVipLabel = new SysVipLabel();
+        sysVipLabel.setCompanyId(getMe().getCompanyId());
+        sysVipLabel.setIsAll(1);
+        sysVipLabel.setLabel(labelDto.getLabel());
+        List<SysVipLabel> zbLabel = sysVipLabelDao.selectByModel(sysVipLabel);
+
+        sysVipLabel = new SysVipLabel();
+        sysVipLabel.setUserId(getMe().getSuId());
+        sysVipLabel.setLabel(labelDto.getLabel());
+        List<SysVipLabel> userLabel = sysVipLabelDao.selectByModel(sysVipLabel);
+        AjaxResult ajaxResult = AjaxResult.buildSuccessInstance("获取成功");
+        ajaxResult.putInMap("allLabel", zbLabel);
+        ajaxResult.putInMap("myLabel", userLabel);
+        return ajaxResult;
+    }
+
+
+    @ApiOperation(value = "添加标签", notes = "添加标签")
+    @PostMapping(value = "/addLabel")
+    public AjaxResult addLabel(@RequestBody LabelDto labelDto) {
+        SysVipLabel sysVipLabel = new SysVipLabel();
+        sysVipLabel.setCreateBy(getMe().getSuName());
+        sysVipLabel.setLabel(labelDto.getLabel());
+        sysVipLabel.setColor(labelDto.getColor());
+        sysVipLabel.setShopId(getMe().getShopId());
+        sysVipLabel.setCompanyId(getMe().getCompanyId());
+        sysVipLabel.setUserId(getMe().getSuId());
+        sysVipLabel.setIsAll(2);
+        int i = sysVipLabelDao.insert(sysVipLabel);
+        if (i > 0) {
+            return AjaxResult.buildSuccessInstance("添加成功");
+        } else {
+            return AjaxResult.buildFailInstance("添加失败");
+        }
+    }
+
+    @ApiOperation(value = "删除标签", notes = "删除标签")
+    @GetMapping(value = "/delById/{id}")
+    public AjaxResult delById(@PathVariable("id") Long id) {
+        int i = sysVipLabelDao.deleteById(id);
+        if (i > 0) {
+            return AjaxResult.buildSuccessInstance("删除成功");
+        }
+        return AjaxResult.buildFailInstance("删除失败");
+    }
+
+
+}
diff --git a/zq-erp/src/main/java/com/matrix/system/app/action/AppOccupancyController.java b/zq-erp/src/main/java/com/matrix/system/app/action/AppOccupancyController.java
new file mode 100644
index 0000000..c4a5942
--- /dev/null
+++ b/zq-erp/src/main/java/com/matrix/system/app/action/AppOccupancyController.java
@@ -0,0 +1,60 @@
+package com.matrix.system.app.action;
+
+import com.matrix.core.constance.MatrixConstance;
+import com.matrix.core.pojo.AjaxResult;
+import com.matrix.core.tools.DateUtil;
+import com.matrix.core.tools.WebUtil;
+import com.matrix.system.app.vo.StoreListVo;
+import com.matrix.system.common.bean.SysUsers;
+import com.matrix.system.common.service.SysUsersService;
+import com.matrix.system.constance.Dictionary;
+import com.matrix.system.hive.action.BaseController;
+import com.matrix.system.hive.action.OccupancyController;
+import com.matrix.system.hive.bean.SysBeauticianState;
+import com.matrix.system.hive.bean.SysWorkBeatuistaff;
+import com.matrix.system.hive.dao.SysBeauticianStateDao;
+import com.matrix.system.hive.plugin.util.CollectionUtils;
+import com.matrix.system.hive.service.SysWorkBeatuistaffService;
+import com.matrix.system.hive.service.SysWorktimeService;
+import io.swagger.annotations.Api;
+import io.swagger.annotations.ApiOperation;
+import io.swagger.annotations.ApiResponse;
+import io.swagger.annotations.ApiResponses;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Controller;
+import org.springframework.web.bind.annotation.*;
+
+import javax.annotation.Resource;
+import java.util.ArrayList;
+import java.util.Date;
+import java.util.List;
+
+
+/**
+ * @author jiangyouyao
+ * @date 2016-12-24
+ * @description 占用Controller
+ */
+@Api(value = "AppOccupancyController", tags = "员工预约情况")
+@RestController
+@RequestMapping(value = "/api/occupancy")
+public class AppOccupancyController extends BaseController {
+
+    @Resource
+    private OccupancyController occupancyController;
+
+    /**
+     * 获取员工预约情况
+     */
+    @ApiOperation(value = "获取员工预约情况", notes = "获取员工预约情况,示例参数:2021-01-06")
+    @ApiResponses({
+            @ApiResponse(code = 200, message = "ok", response = OccupancyController.OccupancySPan.class)
+    })
+    @GetMapping(value = "/getKanban/{timeStr}")
+    AjaxResult showCwzyList(@PathVariable String timeStr) {
+        //TODO app的用户获不能在session中,方案要改
+        SysUsers sysUsers = WebUtil.getSessionAttribute(MatrixConstance.LOGIN_KEY);
+        return occupancyController.getCwzyList(timeStr,sysUsers.getShopId());
+    }
+
+}
diff --git a/zq-erp/src/main/java/com/matrix/system/app/action/TestAction.java b/zq-erp/src/main/java/com/matrix/system/app/action/TestAction.java
new file mode 100644
index 0000000..51d2742
--- /dev/null
+++ b/zq-erp/src/main/java/com/matrix/system/app/action/TestAction.java
@@ -0,0 +1,24 @@
+package com.matrix.system.app.action;
+
+import com.matrix.core.pojo.AjaxResult;
+import io.swagger.annotations.Api;
+import io.swagger.annotations.ApiOperation;
+import org.springframework.web.bind.annotation.GetMapping;
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.RestController;
+
+/**
+ * @author wzy
+ * @date 2020-12-21
+ **/
+@Api(value = "TestAction", tags = "测试类")
+@RestController
+@RequestMapping(value = "/api/test")
+public class TestAction {
+
+    @ApiOperation(value = "测试请求", notes = "测试请求")
+    @GetMapping(value = "/testQuery")
+    public AjaxResult testQuery() {
+        return null;
+    }
+}
diff --git a/zq-erp/src/main/java/com/matrix/system/app/authority/AppAuthorityManager.java b/zq-erp/src/main/java/com/matrix/system/app/authority/AppAuthorityManager.java
new file mode 100644
index 0000000..b34a8e5
--- /dev/null
+++ b/zq-erp/src/main/java/com/matrix/system/app/authority/AppAuthorityManager.java
@@ -0,0 +1,223 @@
+package com.matrix.system.app.authority;
+
+import com.matrix.core.constance.MatrixConstance;
+import com.matrix.core.pojo.AjaxResult;
+import com.matrix.core.tools.StringUtils;
+import com.matrix.core.tools.WebUtil;
+import com.matrix.system.common.authority.AuthorityManager;
+import com.matrix.system.common.authority.strategy.LoginStrategy;
+import com.matrix.system.common.bean.SysFnBtnRel;
+import com.matrix.system.common.bean.SysFunction;
+import com.matrix.system.common.bean.SysUsers;
+import com.matrix.system.common.constance.AppConstance;
+import com.matrix.system.common.service.SysFunctionService;
+import org.apache.commons.collections.CollectionUtils;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Component;
+
+import java.util.*;
+import java.util.Map.Entry;
+
+/**
+ * DefaultAuthorityManager 实现了权限控制接口
+ *
+ * @author JIANGYOUYAO
+ * @email 935090232@qq.com
+ * @date 2017年12月6日
+ */
+@Component
+public class AppAuthorityManager implements AuthorityManager {
+
+    private static final int DEFAULT_2 = 2;
+
+    @Autowired
+    SysFunctionService sysFunctionService;
+
+    public static final String USERFUNCTION = "userFunction";
+    /** 用户所有路径权限的记录 **/
+    public static final String USER_URL_MAPPING = "userUrlMapping";
+
+    private AppAuthorityManager() {
+    }
+
+    public <T> T login(LoginStrategy loginStrategy) {
+        @SuppressWarnings("unchecked")
+        T user = (T) loginStrategy.login();
+        WebUtil.setSessionAttribute(MatrixConstance.LOGIN_KEY, user);
+        WebUtil.setSessionAttribute(AppConstance.DEFAULT_AUTHORITYMANAGER, this);
+        return user;
+    }
+
+    @Override
+    public void getLoginOut() {
+        WebUtil.getSession().removeAttribute(MatrixConstance.LOGIN_KEY);
+    }
+
+    /**
+     * 判断用户是否具有按钮功能
+     *
+     * @param matchStr
+     * @return
+     * @throws IllegalArgumentException
+     */
+    @Override
+    public boolean isBtnPermitted(String matchStr) {
+       throw new UnsupportedOperationException("未实现");
+    }
+
+    /**
+     * 判断用户是否具有功能权限
+     * @return
+     */
+    @Override
+    public boolean isFnPermitted(String fnCode) {
+        throw new UnsupportedOperationException("未实现");
+    }
+
+    /**
+     * 初始化用户权限
+     *
+     * @author JIANGYOUYAO
+     * @email 935090232@qq.com
+     * @date 2017年12月5日
+     * @param result
+     * @param user
+     */
+    public void initUserPower(AjaxResult result, SysUsers user) {
+
+        // 记录用户所有的功能
+        Map<String, SysFunction> userFunction = new HashMap<>(MatrixConstance.COLLECTION_SIZE);
+        //
+        List<String> userUrlMapping = new ArrayList<>();
+
+
+        // 获取用户所有权限
+        getUserFunction(user,userFunction, userUrlMapping);
+
+
+        // TODO 这里的用户权限应该放到redis缓存中,在拦截器中做权限拦截
+        WebUtil.setSessionAttribute(USERFUNCTION, userFunction);
+        WebUtil.setSessionAttribute(USER_URL_MAPPING, userUrlMapping);
+        result.putInMap(USERFUNCTION, userFunction);
+
+    }
+
+    /**
+     * 获取用的功能,包括菜单功能和非菜单功能
+     *
+     * @author JIANGYOUYAO
+     * @email 935090232@qq.com
+     * @date 2017年12月5日
+     * @param userFunctionMap
+     * @param userUrlMapping
+     */
+    private void getUserFunction(SysUsers sysUser, Map<String, SysFunction> userFunctionMap,
+                                 List<String> userUrlMapping) {
+        // 判断用户类型
+        if (AppConstance.USER_TYPE_ADMIN.equals(sysUser.getSuUserType())) {
+            // 管理员拥有公司全部权限
+            List<SysFunction> tempList = sysFunctionService.findCompanyFunction(sysUser.getCompanyId());
+
+            // 区分菜单和非菜单功能
+            for (SysFunction sysFunction : tempList) {
+
+                userFunctionMap.put(sysFunction.getFnCode(), sysFunction);
+                // 注册访问路径
+                registerUrlMapping(userUrlMapping, sysFunction,true);
+            }
+        } else if (AppConstance.USER_TYPE_EMPLOYEE.equals(sysUser.getSuUserType())) {
+            // 普通员工账号只拥有自己所拥有的权限
+            List<SysFunction> userFunctionList = sysFunctionService.findFunctionByRoleIds(sysUser.getRoleIds());
+            for (SysFunction sysFunction : userFunctionList) {
+                // TODO注册访问路径
+                registerUrlMapping(userUrlMapping, sysFunction,false);
+                if (userFunctionMap.containsKey(sysFunction.getFnCode())) {
+                    // 如果功能已经被添加到集合中则追加权限按钮
+                    SysFunction oneFunctionInMap = userFunctionMap.get(sysFunction.getFnCode());
+                    // 为了方便判断所以用字符串记录一下
+                    if (StringUtils.isBlank(oneFunctionInMap.getRpfBns())) {
+                        oneFunctionInMap.setRpfBns(sysFunction.getRpfBns());
+                    } else {
+                        oneFunctionInMap.setRpfBns(oneFunctionInMap.getRpfBns() + "," + sysFunction.getRpfBns());
+                    }
+                } else {
+                    // 如果是新功能则直接添加
+                    userFunctionMap.put(sysFunction.getFnCode(), sysFunction);
+                }
+            }
+        }
+    }
+
+    /**
+     * 注册功能和按钮的访问路径
+     *
+     * @author JIANGYOUYAO
+     * @email 935090232@qq.com
+     * @date 2017年12月8日
+     * @param userUrlMapping
+     * @param sysFunction
+     */
+    private void registerUrlMapping(List<String> userUrlMapping, SysFunction sysFunction, boolean isAdmin) {
+        String path = sysFunction.getFnPath();
+        if (StringUtils.isNotBlank(path) && !userUrlMapping.contains(path)) {
+            userUrlMapping.add(path);
+        }
+        // 注册按钮路径
+        List<SysFnBtnRel> btnRels = sysFunction.getSysFnBtnRel();
+        if (CollectionUtils.isNotEmpty(btnRels)) {
+            for (SysFnBtnRel sysFnBtnRel : btnRels) {
+                //公司管理员可以添加所有按钮权限否则只能添加员工自己所有拥有的权限
+                if(isAdmin ||StringUtils.isContentSet(sysFnBtnRel.getBtnValue(),sysFunction.getRpfBns())){
+                    String btnPath = sysFnBtnRel.getFbPath();
+                    if (StringUtils.isNotBlank(btnPath) && !userUrlMapping.contains(btnPath)) {
+                        userUrlMapping.add(btnPath);
+                    }
+                }
+            }
+        }
+    }
+
+    /**
+     * 把菜单组装成树形结构
+     *
+     * @author JIANGYOUYAO
+     * @email 935090232@qq.com
+     * @date 2017年12月5日
+     * @param menuFunction
+     * @param menuFunctionMap
+     */
+    private void assembleMenu(List<SysFunction> menuFunction, Map<String, SysFunction> menuFunctionMap) {
+        // 将map.entrySet()转换成list,并按照功能的FnSequence倒序
+        List<Entry<String, SysFunction>> list = new ArrayList<>(menuFunctionMap.entrySet());
+        Collections.sort(list, new Comparator<Entry<String, SysFunction>>() {
+            @Override
+            public int compare(Entry<String, SysFunction> o1, Entry<String, SysFunction> o2) {
+                Integer a = o1.getValue().getFnSequence() == null ? 0 : o1.getValue().getFnSequence();
+                Integer b = o2.getValue().getFnSequence() == null ? 0 : o2.getValue().getFnSequence();
+                return Integer.compare(b, a);
+            }
+        });
+        // 获取菜单权限,思路:如果遍历map如果功能存在父节点,就找到父节点然后把子节点加入进去,这样就只需要遍历一次
+        for (Entry<String, SysFunction> entry : list) {
+            String id = entry.getKey();
+
+            SysFunction function = menuFunctionMap.get(id);
+            // 如果是一级节点则直接存入菜单
+            if (null == function.getFnParentId() || 0L == function.getFnParentId()) {
+                menuFunction.add(function);
+            } else {
+                // 非一级节点找到父节点后存入
+                SysFunction parentFn = menuFunctionMap.get(String.valueOf(function.getFnParentId()));
+                if(parentFn!=null){
+                    List<SysFunction> childs = parentFn.getChilds();
+                    if (childs == null) {
+                        parentFn.setChilds(new ArrayList<SysFunction>());
+                    }
+                    parentFn.getChilds().add(function);
+                }
+
+            }
+        }
+    }
+
+}
diff --git a/zq-erp/src/main/java/com/matrix/system/app/dto/AddVipDto.java b/zq-erp/src/main/java/com/matrix/system/app/dto/AddVipDto.java
new file mode 100644
index 0000000..5c090c5
--- /dev/null
+++ b/zq-erp/src/main/java/com/matrix/system/app/dto/AddVipDto.java
@@ -0,0 +1,167 @@
+package com.matrix.system.app.dto;
+
+import com.fasterxml.jackson.annotation.JsonFormat;
+import com.matrix.core.tools.DateUtil;
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import org.hibernate.validator.constraints.Length;
+
+import javax.validation.constraints.NotBlank;
+import javax.validation.constraints.NotNull;
+import java.util.Date;
+import java.util.List;
+
+/**
+ * @author wzy
+ * @date 2020-12-22
+ **/
+@ApiModel(value = "AddVipDto", description = "添加会员接收参数类")
+public class AddVipDto {
+    @ApiModelProperty(value = "头像")
+    private String photo;
+
+    @ApiModelProperty(value = "会员编号")
+    private String vipNo;
+
+    @NotBlank(message = "姓名不能为空")
+    @ApiModelProperty(value = "会员姓名")
+    private String vipName;
+
+    @NotBlank(message = "手机号不能为空")
+    @ApiModelProperty(value = "手机号")
+    private String phone;
+
+    @NotBlank(message = "性别不能为空")
+    @ApiModelProperty(value = "性别", example = "男/女")
+    private String sex;
+
+    @NotNull(message = "生日不能为空")
+    @ApiModelProperty(value = "生日")
+    @JsonFormat(pattern = DateUtil.DATE_FORMAT_DD, timezone = "GMT+8")
+    private Date birthday;
+
+    @ApiModelProperty(value = "资金密码", example = "123456")
+    private String password;
+
+    @ApiModelProperty(value = "省市区", example = "湖南省,长沙市,岳麓区")
+    private String areas;
+
+    @ApiModelProperty(value = "详细地址")
+    private String address;
+
+    @ApiModelProperty(value = "到店途径", example = "网络团购")
+    private String arrivalWay;
+
+    @ApiModelProperty(value = "推荐人ID")
+    private Long recommendId;
+
+    @ApiModelProperty(value = "备注")
+    private String remark;
+
+    @ApiModelProperty(value = "标签列表")
+    private List<String> labels;
+
+    public String getVipNo() {
+        return vipNo;
+    }
+
+    public void setVipNo(String vipNo) {
+        this.vipNo = vipNo;
+    }
+
+    public String getVipName() {
+        return vipName;
+    }
+
+    public void setVipName(String vipName) {
+        this.vipName = vipName;
+    }
+
+    public String getPhone() {
+        return phone;
+    }
+
+    public void setPhone(String phone) {
+        this.phone = phone;
+    }
+
+    public String getSex() {
+        return sex;
+    }
+
+    public void setSex(String sex) {
+        this.sex = sex;
+    }
+
+    public Date getBirthday() {
+        return birthday;
+    }
+
+    public void setBirthday(Date birthday) {
+        this.birthday = birthday;
+    }
+
+    public String getAreas() {
+        return areas;
+    }
+
+    public void setAreas(String areas) {
+        this.areas = areas;
+    }
+
+    public String getAddress() {
+        return address;
+    }
+
+    public void setAddress(String address) {
+        this.address = address;
+    }
+
+    public String getArrivalWay() {
+        return arrivalWay;
+    }
+
+    public void setArrivalWay(String arrivalWay) {
+        this.arrivalWay = arrivalWay;
+    }
+
+    public Long getRecommendId() {
+        return recommendId;
+    }
+
+    public void setRecommendId(Long recommendId) {
+        this.recommendId = recommendId;
+    }
+
+    public String getRemark() {
+        return remark;
+    }
+
+    public void setRemark(String remark) {
+        this.remark = remark;
+    }
+
+    public List<String> getLabels() {
+        return labels;
+    }
+
+    public void setLabels(List<String> labels) {
+        this.labels = labels;
+    }
+
+    public String getPassword() {
+        return password;
+    }
+
+    public void setPassword(String password) {
+        this.password = password;
+    }
+
+    public String getPhoto() {
+        return photo;
+    }
+
+    public void setPhoto(String photo) {
+        this.photo = photo;
+    }
+}
diff --git a/zq-erp/src/main/java/com/matrix/system/app/dto/ArticleListDto.java b/zq-erp/src/main/java/com/matrix/system/app/dto/ArticleListDto.java
new file mode 100644
index 0000000..fa97fee
--- /dev/null
+++ b/zq-erp/src/main/java/com/matrix/system/app/dto/ArticleListDto.java
@@ -0,0 +1,26 @@
+package com.matrix.system.app.dto;
+
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+
+import javax.validation.constraints.NotNull;
+
+/**
+ * @author wzy
+ * @date 2021-01-05
+ **/
+@ApiModel(value = "ArticleListDto", description = "文章列表接收参数类")
+public class ArticleListDto extends BasePageDto {
+
+    @NotNull
+    @ApiModelProperty(value = "分类ID")
+    private Long typeId;
+
+    public Long getTypeId() {
+        return typeId;
+    }
+
+    public void setTypeId(Long typeId) {
+        this.typeId = typeId;
+    }
+}
diff --git a/zq-erp/src/main/java/com/matrix/system/app/dto/BasePageDto.java b/zq-erp/src/main/java/com/matrix/system/app/dto/BasePageDto.java
new file mode 100644
index 0000000..971f729
--- /dev/null
+++ b/zq-erp/src/main/java/com/matrix/system/app/dto/BasePageDto.java
@@ -0,0 +1,38 @@
+package com.matrix.system.app.dto;
+
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+
+import javax.validation.constraints.NotNull;
+
+/**
+ * @author wzy
+ * @date 2020-12-23
+ **/
+@ApiModel(value = "BasePageDto", description = "基础分页参数接收类")
+public class BasePageDto {
+
+    @NotNull(message = "参数不能为空")
+    @ApiModelProperty(value = "第几页", example = "1")
+    private Integer pageNum;
+
+    @NotNull(message = "参数不能为空")
+    @ApiModelProperty(value ="数量", example = "10")
+    private Integer pageSize;
+
+    public Integer getPageNum() {
+        return pageNum;
+    }
+
+    public void setPageNum(Integer pageNum) {
+        this.pageNum = pageNum;
+    }
+
+    public Integer getPageSize() {
+        return pageSize;
+    }
+
+    public void setPageSize(Integer pageSize) {
+        this.pageSize = pageSize;
+    }
+}
diff --git a/zq-erp/src/main/java/com/matrix/system/app/dto/BeauticianDto.java b/zq-erp/src/main/java/com/matrix/system/app/dto/BeauticianDto.java
new file mode 100644
index 0000000..84cd5f1
--- /dev/null
+++ b/zq-erp/src/main/java/com/matrix/system/app/dto/BeauticianDto.java
@@ -0,0 +1,41 @@
+package com.matrix.system.app.dto;
+
+import com.fasterxml.jackson.annotation.JsonFormat;
+import com.matrix.core.tools.DateUtil;
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+
+import javax.validation.constraints.NotNull;
+import java.util.Date;
+
+/**
+ * @author wzy
+ * @date 2020-12-25
+ **/
+@ApiModel(value = "BeauticianDto", description = "获取美疗师列表接收参数类")
+public class BeauticianDto {
+
+    @JsonFormat(pattern = DateUtil.DATE_FORMAT_MM, timezone = "GMT+8")
+    @ApiModelProperty(value = "开始时间")
+    private Date startTime;
+
+    @JsonFormat(pattern = DateUtil.DATE_FORMAT_MM, timezone = "GMT+8")
+    @ApiModelProperty(value = "结束时间")
+    private Date endTime;
+
+    public Date getStartTime() {
+        return startTime;
+    }
+
+    public void setStartTime(Date startTime) {
+        this.startTime = startTime;
+    }
+
+    public Date getEndTime() {
+        return endTime;
+    }
+
+    public void setEndTime(Date endTime) {
+        this.endTime = endTime;
+    }
+}
diff --git a/zq-erp/src/main/java/com/matrix/system/app/dto/BusinessesDto.java b/zq-erp/src/main/java/com/matrix/system/app/dto/BusinessesDto.java
new file mode 100644
index 0000000..0e5cf41
--- /dev/null
+++ b/zq-erp/src/main/java/com/matrix/system/app/dto/BusinessesDto.java
@@ -0,0 +1,45 @@
+package com.matrix.system.app.dto;
+
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+
+@ApiModel(value = "BusinessesDto", description = "门店/公司报表参数接受类")
+public class BusinessesDto extends BasePageDto{
+
+    public static final String DAY = "1";
+
+    public static final String MONTH = "2";
+
+    @ApiModelProperty(value = "type 1-每日 2-每月", example = "1")
+    private String type;
+
+    @ApiModelProperty(value = "门店ID", example = "34")
+    private Long shopId;
+
+    @ApiModelProperty(value = "会员ID")
+    private Long staffId;
+
+    public String getType() {
+        return type;
+    }
+
+    public void setType(String type) {
+        this.type = type;
+    }
+
+    public Long getShopId() {
+        return shopId;
+    }
+
+    public void setShopId(Long shopId) {
+        this.shopId = shopId;
+    }
+
+    public Long getStaffId() {
+        return staffId;
+    }
+
+    public void setStaffId(Long staffId) {
+        this.staffId = staffId;
+    }
+}
diff --git a/zq-erp/src/main/java/com/matrix/system/app/dto/CreateOderItemDto.java b/zq-erp/src/main/java/com/matrix/system/app/dto/CreateOderItemDto.java
new file mode 100644
index 0000000..7dc234e
--- /dev/null
+++ b/zq-erp/src/main/java/com/matrix/system/app/dto/CreateOderItemDto.java
@@ -0,0 +1,67 @@
+package com.matrix.system.app.dto;
+
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+
+import javax.validation.constraints.NotBlank;
+import javax.validation.constraints.NotNull;
+
+/**
+ * @author wzy
+ * @date 2020-12-23
+ **/
+@ApiModel(value = "CreateOderItemDto", description = "提交订单明细接收类")
+public class CreateOderItemDto {
+
+    @NotNull(message = "商品ID不能为空")
+    @ApiModelProperty(value = "商品ID", example = "1234")
+    private Long goodsId;
+
+    @NotNull(message = "数量不能为空")
+    @ApiModelProperty(value = "购买数量", example = "1")
+    private Integer count;
+
+    @NotNull(message = "参数错误")
+    @ApiModelProperty(value = "是否赠送 是/否", example = "否")
+    private String isFree;
+
+    @NotNull(message = "参数错误")
+    @ApiModelProperty(value = "商品类型", example = "家居产品")
+    private String goodsType;
+
+    public String getGoodsType() {
+        return goodsType;
+    }
+
+    public void setGoodsType(String goodsType) {
+        this.goodsType = goodsType;
+    }
+
+    public Long getGoodsId() {
+        return goodsId;
+    }
+
+    public void setGoodsId(Long goodsId) {
+        this.goodsId = goodsId;
+    }
+
+    public Integer getCount() {
+        return count;
+    }
+
+    public void setCount(Integer count) {
+        this.count = count;
+    }
+
+    public String getIsFree() {
+        if ("1".equals(isFree)) {
+            return "是";
+        } else {
+            return "否";
+        }
+    }
+
+    public void setIsFree(String isFree) {
+        this.isFree = isFree;
+    }
+}
diff --git a/zq-erp/src/main/java/com/matrix/system/app/dto/CreateOrderDto.java b/zq-erp/src/main/java/com/matrix/system/app/dto/CreateOrderDto.java
new file mode 100644
index 0000000..4b125c3
--- /dev/null
+++ b/zq-erp/src/main/java/com/matrix/system/app/dto/CreateOrderDto.java
@@ -0,0 +1,39 @@
+package com.matrix.system.app.dto;
+
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+
+import javax.validation.constraints.NotNull;
+import java.util.List;
+
+/**
+ * @author wzy
+ * @date 2020-12-23
+ **/
+@ApiModel(value = "CreateOrderDto", description = "提交订单接收类")
+public class CreateOrderDto {
+
+    @NotNull(message = "会员不能为空")
+    @ApiModelProperty(value = "会员Id", example = "361")
+    private Long vipId;
+
+
+    @ApiModelProperty(value = "购买商品明细")
+    private List<CreateOderItemDto> items;
+
+    public Long getVipId() {
+        return vipId;
+    }
+
+    public void setVipId(Long vipId) {
+        this.vipId = vipId;
+    }
+
+    public List<CreateOderItemDto> getItems() {
+        return items;
+    }
+
+    public void setItems(List<CreateOderItemDto> items) {
+        this.items = items;
+    }
+}
diff --git a/zq-erp/src/main/java/com/matrix/system/app/dto/CreateServiceOrderDto.java b/zq-erp/src/main/java/com/matrix/system/app/dto/CreateServiceOrderDto.java
new file mode 100644
index 0000000..1edf45f
--- /dev/null
+++ b/zq-erp/src/main/java/com/matrix/system/app/dto/CreateServiceOrderDto.java
@@ -0,0 +1,100 @@
+package com.matrix.system.app.dto;
+
+import com.fasterxml.jackson.annotation.JsonFormat;
+import com.matrix.core.tools.DateUtil;
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+
+import javax.validation.constraints.NotBlank;
+import javax.validation.constraints.NotNull;
+import java.util.Date;
+import java.util.List;
+
+/**
+ * @author wzy
+ * @date 2020-12-25
+ **/
+@ApiModel(value = "CreateServiceOrderDto", description = "创建服务单接口接收参数类")
+public class CreateServiceOrderDto {
+
+    @NotNull(message = "请选择会员")
+    @ApiModelProperty(value = "会员ID")
+    private Long vipId;
+
+    @NotNull(message = "请选择美疗师")
+    @ApiModelProperty(value = "美疗师ID")
+    private Long beautyId;
+
+    @NotNull(message = "请选择预约时间")
+    @JsonFormat(pattern = DateUtil.DATE_FORMAT_MM, timezone = "GMT+8")
+    @ApiModelProperty(value = "预约时间")
+    private Date yyTime;
+
+    @ApiModelProperty(value = "选择的项目")
+    private List<CreateServiceOrderItemDto> projItems;
+
+    @ApiModelProperty(value = "总时长")
+    private Integer totalTime;
+
+    @ApiModelProperty(value = "备注")
+    private String remark;
+
+    @ApiModelProperty(value = "资金密码")
+    private String password;
+
+    public String getPassword() {
+        return password;
+    }
+
+    public void setPassword(String password) {
+        this.password = password;
+    }
+
+    public Long getVipId() {
+        return vipId;
+    }
+
+    public void setVipId(Long vipId) {
+        this.vipId = vipId;
+    }
+
+    public Long getBeautyId() {
+        return beautyId;
+    }
+
+    public void setBeautyId(Long beautyId) {
+        this.beautyId = beautyId;
+    }
+
+    public Date getYyTime() {
+        return yyTime;
+    }
+
+    public void setYyTime(Date yyTime) {
+        this.yyTime = yyTime;
+    }
+
+    public List<CreateServiceOrderItemDto> getProjItems() {
+        return projItems;
+    }
+
+    public void setProjItems(List<CreateServiceOrderItemDto> projItems) {
+        this.projItems = projItems;
+    }
+
+    public String getRemark() {
+        return remark;
+    }
+
+    public void setRemark(String remark) {
+        this.remark = remark;
+    }
+
+    public Integer getTotalTime() {
+        return totalTime;
+    }
+
+    public void setTotalTime(Integer totalTime) {
+        this.totalTime = totalTime;
+    }
+}
diff --git a/zq-erp/src/main/java/com/matrix/system/app/dto/CreateServiceOrderItemDto.java b/zq-erp/src/main/java/com/matrix/system/app/dto/CreateServiceOrderItemDto.java
new file mode 100644
index 0000000..6d886ae
--- /dev/null
+++ b/zq-erp/src/main/java/com/matrix/system/app/dto/CreateServiceOrderItemDto.java
@@ -0,0 +1,41 @@
+package com.matrix.system.app.dto;
+
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+
+import javax.validation.constraints.Min;
+import javax.validation.constraints.NotNull;
+
+/**
+ * @author wzy
+ * @date 2020-12-25
+ **/
+@ApiModel(value = "CreateServiceOrderItemDto", description = "创建服务单参数接收类")
+public class CreateServiceOrderItemDto {
+
+    @NotNull(message = "请选择项目")
+    @ApiModelProperty(value = "项目ID")
+    private Long puseId;
+
+    @NotNull(message = "请输入数量")
+    @Min(1)
+    @ApiModelProperty(value = "数量")
+    private Integer count;
+
+
+    public Long getPuseId() {
+        return puseId;
+    }
+
+    public void setPuseId(Long puseId) {
+        this.puseId = puseId;
+    }
+
+    public Integer getCount() {
+        return count;
+    }
+
+    public void setCount(Integer count) {
+        this.count = count;
+    }
+}
diff --git a/zq-erp/src/main/java/com/matrix/system/app/dto/FollowupListDto.java b/zq-erp/src/main/java/com/matrix/system/app/dto/FollowupListDto.java
new file mode 100644
index 0000000..722859f
--- /dev/null
+++ b/zq-erp/src/main/java/com/matrix/system/app/dto/FollowupListDto.java
@@ -0,0 +1,135 @@
+package com.matrix.system.app.dto;
+
+import com.fasterxml.jackson.annotation.JsonFormat;
+import com.matrix.core.anotations.Extend;
+import com.matrix.core.tools.DateUtil;
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+
+import javax.validation.constraints.NotNull;
+import java.util.Date;
+import java.util.List;
+
+/**
+ * @author jyy
+ * @date 2020-12-23
+ **/
+@ApiModel(value = "FollowupCommonetListDto", description = "跟进记录查询参数")
+public class FollowupListDto {
+
+    @NotNull(message = "参数错误")
+    @ApiModelProperty(value = "查询条数", example = "10")
+    private Integer limit = 10;
+
+    @NotNull(message = "查询起点")
+    @ApiModelProperty(value = "第0条开始", example = "0")
+    private Integer offset = 0;
+
+    @ApiModelProperty(value = "门店ID 后台自动赋值", example = "0")
+    private Long  shopId;
+
+    @ApiModelProperty(value = "公司ID 后台自动赋值", example = "0")
+    private Long  companyId;
+
+    @ApiModelProperty(value = "当前员工ID 后台自动赋值", example = "0")
+    private Long  selfStaff;
+
+    @JsonFormat(pattern = DateUtil.DATE_FORMAT_DD, timezone = "GMT+8")
+    @ApiModelProperty(value = "查询参数开始时间", example = "2021-01-10")
+    private Date startTime;
+
+
+    @JsonFormat(pattern = DateUtil.DATE_FORMAT_DD, timezone = "GMT+8")
+    @ApiModelProperty(value = "查询参数结束时间", example = "2021-01-10")
+    private Date endTime;
+
+
+    @ApiModelProperty(value = "查询参数员工ID数组", example = "[1,2]")
+    private List<Long>  staffIds;
+
+    @ApiModelProperty(value = "查询参数客户ID数组", example = "[1,2]")
+    private List<Long>  vipIds;
+
+    @ApiModelProperty(value = "查询参数,查询跟进类型,1=全部,2=我发出的,3=我的团队", example = "1")
+    private Integer  queryType=1;
+
+    public Integer getQueryType() {
+        return queryType;
+    }
+
+    public void setQueryType(Integer queryType) {
+        this.queryType = queryType;
+    }
+
+    public Date getStartTime() {
+        return startTime;
+    }
+
+    public void setStartTime(Date startTime) {
+        this.startTime = startTime;
+    }
+
+    public Date getEndTime() {
+        return endTime;
+    }
+
+    public void setEndTime(Date endTime) {
+        this.endTime = endTime;
+    }
+
+    public Long getShopId() {
+        return shopId;
+    }
+
+    public void setShopId(Long shopId) {
+        this.shopId = shopId;
+    }
+
+    public Long getSelfStaff() {
+        return selfStaff;
+    }
+
+    public void setSelfStaff(Long selfStaff) {
+        this.selfStaff = selfStaff;
+    }
+
+    public List<Long> getStaffIds() {
+        return staffIds;
+    }
+
+    public void setStaffIds(List<Long> staffIds) {
+        this.staffIds = staffIds;
+    }
+
+    public List<Long> getVipIds() {
+        return vipIds;
+    }
+
+    public void setVipIds(List<Long> vipIds) {
+        this.vipIds = vipIds;
+    }
+
+    public Integer getLimit() {
+        return limit;
+    }
+
+    public void setLimit(Integer limit) {
+        this.limit = limit;
+    }
+
+    public Integer getOffset() {
+        return offset;
+    }
+
+    public void setOffset(Integer offset) {
+        this.offset = offset;
+    }
+
+    public Long getCompanyId() {
+        return companyId;
+    }
+
+    public void setCompanyId(Long companyId) {
+        this.companyId = companyId;
+    }
+}
diff --git a/zq-erp/src/main/java/com/matrix/system/app/dto/IdSubmitDto.java b/zq-erp/src/main/java/com/matrix/system/app/dto/IdSubmitDto.java
new file mode 100644
index 0000000..5696b13
--- /dev/null
+++ b/zq-erp/src/main/java/com/matrix/system/app/dto/IdSubmitDto.java
@@ -0,0 +1,26 @@
+package com.matrix.system.app.dto;
+
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+
+import javax.validation.constraints.NotNull;
+
+/**
+ * @author wzy
+ * @date 2021-01-14
+ **/
+@ApiModel(value = "IdSubmitDto", description = "根据id修改接口参数接收类")
+public class IdSubmitDto {
+
+    @NotNull
+    @ApiModelProperty(value = "id", example = "1")
+    private Long id;
+
+    public Long getId() {
+        return id;
+    }
+
+    public void setId(Long id) {
+        this.id = id;
+    }
+}
diff --git a/zq-erp/src/main/java/com/matrix/system/app/dto/LabelDto.java b/zq-erp/src/main/java/com/matrix/system/app/dto/LabelDto.java
new file mode 100644
index 0000000..36b64f7
--- /dev/null
+++ b/zq-erp/src/main/java/com/matrix/system/app/dto/LabelDto.java
@@ -0,0 +1,36 @@
+package com.matrix.system.app.dto;
+
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import org.hibernate.validator.constraints.Length;
+
+/**
+ * @author wzy
+ * @date 2021-01-22
+ **/
+@ApiModel(value = "LabelDto", description = "添加标签接收参数接收类")
+public class LabelDto {
+
+    @Length(max = 10, message = "不能超过10")
+    @ApiModelProperty(value = "标签内容", example = "123")
+    private String label;
+
+    @ApiModelProperty(value = "颜色", example = "#FFFFFF")
+    private String color;
+
+    public String getLabel() {
+        return label;
+    }
+
+    public void setLabel(String label) {
+        this.label = label;
+    }
+
+    public String getColor() {
+        return color;
+    }
+
+    public void setColor(String color) {
+        this.color = color;
+    }
+}
diff --git a/zq-erp/src/main/java/com/matrix/system/app/dto/LoginDto.java b/zq-erp/src/main/java/com/matrix/system/app/dto/LoginDto.java
new file mode 100644
index 0000000..a06332d
--- /dev/null
+++ b/zq-erp/src/main/java/com/matrix/system/app/dto/LoginDto.java
@@ -0,0 +1,38 @@
+package com.matrix.system.app.dto;
+
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+
+import javax.validation.constraints.NotBlank;
+
+/**
+ * @author wzy
+ * @date 2020-12-21
+ **/
+@ApiModel(value = "LoginDto", description = "手机端登陆接收类")
+public class LoginDto {
+
+    @ApiModelProperty(value = "用户名", example = "1234")
+    @NotBlank(message = "用户名或密码错误")
+    private String username;
+
+    @ApiModelProperty(value = "密码", example = "123456")
+    @NotBlank(message = "用户名或密码错误")
+    private String password;
+
+    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;
+    }
+}
diff --git a/zq-erp/src/main/java/com/matrix/system/app/dto/ModifyUserDto.java b/zq-erp/src/main/java/com/matrix/system/app/dto/ModifyUserDto.java
new file mode 100644
index 0000000..3728b13
--- /dev/null
+++ b/zq-erp/src/main/java/com/matrix/system/app/dto/ModifyUserDto.java
@@ -0,0 +1,116 @@
+package com.matrix.system.app.dto;
+
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+
+import javax.validation.constraints.NotBlank;
+import java.util.Date;
+
+/**
+ * @author wzy
+ * @date 2021-01-06
+ **/
+@ApiModel(value = "ModifyUserDto", description = "编辑用户信息接口参数接收类")
+public class ModifyUserDto {
+
+    @ApiModelProperty(value = "头像")
+    private String photo;
+
+    @NotBlank(message = "参数错误")
+    @ApiModelProperty(value = "姓名")
+    private String name;
+
+    @ApiModelProperty(value = "英文名")
+    private String engName;
+
+    @NotBlank(message = "参数错误")
+    @ApiModelProperty(value = "手机号")
+    private String telphone;
+
+    @ApiModelProperty(value = "性别")
+    private String sex;
+
+    @ApiModelProperty(value = "生日")
+    private Date birthday;
+
+    @ApiModelProperty(value = "邮箱")
+    private String email;
+
+    @ApiModelProperty(value = "服务签名")
+    private String serviceSign;
+
+    @ApiModelProperty(value = "地址")
+    private String address;
+
+    public String getPhoto() {
+        return photo;
+    }
+
+    public void setPhoto(String photo) {
+        this.photo = photo;
+    }
+
+    public String getName() {
+        return name;
+    }
+
+    public void setName(String name) {
+        this.name = name;
+    }
+
+    public String getEngName() {
+        return engName;
+    }
+
+    public void setEngName(String engName) {
+        this.engName = engName;
+    }
+
+    public String getTelphone() {
+        return telphone;
+    }
+
+    public void setTelphone(String telphone) {
+        this.telphone = telphone;
+    }
+
+    public String getSex() {
+        return sex;
+    }
+
+    public void setSex(String sex) {
+        this.sex = sex;
+    }
+
+    public Date getBirthday() {
+        return birthday;
+    }
+
+    public void setBirthday(Date birthday) {
+        this.birthday = birthday;
+    }
+
+    public String getEmail() {
+        return email;
+    }
+
+    public void setEmail(String email) {
+        this.email = email;
+    }
+
+    public String getServiceSign() {
+        return serviceSign;
+    }
+
+    public void setServiceSign(String serviceSign) {
+        this.serviceSign = serviceSign;
+    }
+
+    public String getAddress() {
+        return address;
+    }
+
+    public void setAddress(String address) {
+        this.address = address;
+    }
+}
diff --git a/zq-erp/src/main/java/com/matrix/system/app/dto/ModifyVipDto.java b/zq-erp/src/main/java/com/matrix/system/app/dto/ModifyVipDto.java
new file mode 100644
index 0000000..85a5de1
--- /dev/null
+++ b/zq-erp/src/main/java/com/matrix/system/app/dto/ModifyVipDto.java
@@ -0,0 +1,181 @@
+package com.matrix.system.app.dto;
+
+import com.fasterxml.jackson.annotation.JsonFormat;
+import com.matrix.core.tools.DateUtil;
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import org.hibernate.validator.constraints.Length;
+
+import javax.validation.constraints.NotBlank;
+import javax.validation.constraints.NotNull;
+import java.util.Date;
+import java.util.List;
+
+/**
+ * @author wzy
+ * @date 2020-12-22
+ **/
+@ApiModel(value = "ModifyVipDto", description = "修改会员接收参数类")
+public class ModifyVipDto {
+
+    @ApiModelProperty(value = "头像")
+    private String photo;
+
+    @NotNull(message = "参数错误")
+    @ApiModelProperty(value = "会员ID")
+    private Long vipId;
+
+    @ApiModelProperty(value = "会员编号")
+    private String vipNo;
+
+    @NotBlank(message = "姓名不能为空")
+    @ApiModelProperty(value = "会员姓名")
+    private String vipName;
+
+    @NotBlank(message = "手机号不能为空")
+    @ApiModelProperty(value = "手机号")
+    private String phone;
+
+    @NotBlank(message = "性别不能为空")
+    @ApiModelProperty(value = "性别", example = "男/女")
+    private String sex;
+
+    @NotNull(message = "生日不能为空")
+    @ApiModelProperty(value = "生日")
+    @JsonFormat(pattern = DateUtil.DATE_FORMAT_DD, timezone = "GMT+8")
+    private Date birthday;
+
+    @Length(max = 6)
+    @ApiModelProperty(value = "资金密码", example = "123456")
+    private String password;
+
+    @ApiModelProperty(value = "省市区", example = "湖南省,长沙市,岳麓区")
+    private String areas;
+
+    @ApiModelProperty(value = "详细地址")
+    private String address;
+
+    @ApiModelProperty(value = "到店途径", example = "网络团购")
+    private String arrivalWay;
+
+    @ApiModelProperty(value = "推荐人ID")
+    private Long recommendId;
+
+    @ApiModelProperty(value = "备注")
+    private String remark;
+
+    @ApiModelProperty(value = "标签列表")
+    private List<String> labels;
+
+    public String getVipNo() {
+        return vipNo;
+    }
+
+    public void setVipNo(String vipNo) {
+        this.vipNo = vipNo;
+    }
+
+    public Long getVipId() {
+        return vipId;
+    }
+
+    public void setVipId(Long vipId) {
+        this.vipId = vipId;
+    }
+
+    public String getVipName() {
+        return vipName;
+    }
+
+    public void setVipName(String vipName) {
+        this.vipName = vipName;
+    }
+
+    public String getPhone() {
+        return phone;
+    }
+
+    public void setPhone(String phone) {
+        this.phone = phone;
+    }
+
+    public String getSex() {
+        return sex;
+    }
+
+    public void setSex(String sex) {
+        this.sex = sex;
+    }
+
+    public Date getBirthday() {
+        return birthday;
+    }
+
+    public void setBirthday(Date birthday) {
+        this.birthday = birthday;
+    }
+
+    public String getAreas() {
+        return areas;
+    }
+
+    public void setAreas(String areas) {
+        this.areas = areas;
+    }
+
+    public String getAddress() {
+        return address;
+    }
+
+    public void setAddress(String address) {
+        this.address = address;
+    }
+
+    public String getArrivalWay() {
+        return arrivalWay;
+    }
+
+    public void setArrivalWay(String arrivalWay) {
+        this.arrivalWay = arrivalWay;
+    }
+
+    public Long getRecommendId() {
+        return recommendId;
+    }
+
+    public void setRecommendId(Long recommendId) {
+        this.recommendId = recommendId;
+    }
+
+    public String getRemark() {
+        return remark;
+    }
+
+    public void setRemark(String remark) {
+        this.remark = remark;
+    }
+
+    public List<String> getLabels() {
+        return labels;
+    }
+
+    public void setLabels(List<String> labels) {
+        this.labels = labels;
+    }
+
+    public String getPassword() {
+        return password;
+    }
+
+    public void setPassword(String password) {
+        this.password = password;
+    }
+
+    public String getPhoto() {
+        return photo;
+    }
+
+    public void setPhoto(String photo) {
+        this.photo = photo;
+    }
+}
diff --git a/zq-erp/src/main/java/com/matrix/system/app/dto/OrderListDto.java b/zq-erp/src/main/java/com/matrix/system/app/dto/OrderListDto.java
new file mode 100644
index 0000000..f6ba866
--- /dev/null
+++ b/zq-erp/src/main/java/com/matrix/system/app/dto/OrderListDto.java
@@ -0,0 +1,84 @@
+package com.matrix.system.app.dto;
+
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+
+/**
+ * @author wzy
+ * @date 2020-12-23
+ **/
+@ApiModel(value = "OrderListDto", description = "订单列表接收参数类")
+public class OrderListDto extends BasePageDto {
+
+    @ApiModelProperty(value = "订单状态 0-全部 1-待付款 2-已付款 3-欠款 全部默认传空字符串", example = "1")
+    private Integer orderStatus;
+
+    @ApiModelProperty(hidden = true)
+    private String status;
+
+    @ApiModelProperty(value = "查询字段")
+    private String queryKey;
+
+    @ApiModelProperty(hidden = true)
+    private Long shopId;
+
+    @ApiModelProperty(hidden = true)
+    private Long companyId;
+
+    public Long getCompanyId() {
+        return companyId;
+    }
+
+    public void setCompanyId(Long companyId) {
+        this.companyId = companyId;
+    }
+
+    public Long getShopId() {
+        return shopId;
+    }
+
+    public void setShopId(Long shopId) {
+        this.shopId = shopId;
+    }
+
+    public String getStatus() {
+        return status;
+    }
+
+    public void setStatus(String status) {
+        this.status = status;
+    }
+
+    public String getQueryKey() {
+        return queryKey;
+    }
+
+    public void setQueryKey(String queryKey) {
+        this.queryKey = queryKey;
+    }
+
+    public Integer getOrderStatus() {
+        return orderStatus;
+    }
+
+    public void setOrderStatus(Integer orderStatus) {
+        this.orderStatus = orderStatus;
+        switch (orderStatus) {
+            case 0 :
+                this.status = "";
+                break;
+            case 1:
+                this.status = "待付款";
+                break;
+            case 2:
+                this.status = "已付款";
+                break;
+            case 3:
+                this.status = "欠款";
+                break;
+            default:
+                this.status = "";
+                break;
+        }
+    }
+}
diff --git a/zq-erp/src/main/java/com/matrix/system/app/dto/PwdModifyDto.java b/zq-erp/src/main/java/com/matrix/system/app/dto/PwdModifyDto.java
new file mode 100644
index 0000000..476a22a
--- /dev/null
+++ b/zq-erp/src/main/java/com/matrix/system/app/dto/PwdModifyDto.java
@@ -0,0 +1,38 @@
+package com.matrix.system.app.dto;
+
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+
+import javax.validation.constraints.NotBlank;
+
+/**
+ * @author wzy
+ * @date 2021-01-06
+ **/
+@ApiModel(value = "PwdModifyDto", description = "修改密码接口参数接收类")
+public class PwdModifyDto {
+
+    @NotBlank(message = "参数错误")
+    @ApiModelProperty(value = "老密码", example = "123456")
+    private String oldPwd;
+
+    @NotBlank(message = "参数错误")
+    @ApiModelProperty(value = "新密码", example = "123456")
+    private String newPwd;
+
+    public String getOldPwd() {
+        return oldPwd;
+    }
+
+    public void setOldPwd(String oldPwd) {
+        this.oldPwd = oldPwd;
+    }
+
+    public String getNewPwd() {
+        return newPwd;
+    }
+
+    public void setNewPwd(String newPwd) {
+        this.newPwd = newPwd;
+    }
+}
diff --git a/zq-erp/src/main/java/com/matrix/system/app/dto/PwdResetDto.java b/zq-erp/src/main/java/com/matrix/system/app/dto/PwdResetDto.java
new file mode 100644
index 0000000..a102596
--- /dev/null
+++ b/zq-erp/src/main/java/com/matrix/system/app/dto/PwdResetDto.java
@@ -0,0 +1,51 @@
+package com.matrix.system.app.dto;
+
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+
+import javax.validation.constraints.NotBlank;
+
+/**
+ * @author wzy
+ * @date 2021-01-06
+ **/
+@ApiModel(value = "PwdResetDto", description = "密码重置接收类")
+public class PwdResetDto {
+
+    @NotBlank(message = "参数错误")
+    @ApiModelProperty(value = "手机号", example = "11")
+    private String telphone;
+
+    @NotBlank(message = "参数错误")
+    @ApiModelProperty(value = "验证码", example = "123456")
+    private String code;
+
+    @NotBlank(message = "参数错误")
+    @ApiModelProperty(value = "新密码", example = "123456")
+    private String newPwd;
+
+
+    public String getCode() {
+        return code;
+    }
+
+    public void setCode(String code) {
+        this.code = code;
+    }
+
+    public String getNewPwd() {
+        return newPwd;
+    }
+
+    public void setNewPwd(String newPwd) {
+        this.newPwd = newPwd;
+    }
+
+    public String getTelphone() {
+        return telphone;
+    }
+
+    public void setTelphone(String telphone) {
+        this.telphone = telphone;
+    }
+}
diff --git a/zq-erp/src/main/java/com/matrix/system/app/dto/QuestionAnswerDto.java b/zq-erp/src/main/java/com/matrix/system/app/dto/QuestionAnswerDto.java
new file mode 100644
index 0000000..37df68b
--- /dev/null
+++ b/zq-erp/src/main/java/com/matrix/system/app/dto/QuestionAnswerDto.java
@@ -0,0 +1,38 @@
+package com.matrix.system.app.dto;
+
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+
+import javax.validation.constraints.NotNull;
+import java.util.List;
+
+/**
+ * @author wzy
+ * @date 2020-12-28
+ **/
+@ApiModel(value = "QuestionAnswerDto", description = "提交客户档案接口参数接收类")
+public class QuestionAnswerDto {
+
+    @NotNull(message = "参数错误")
+    @ApiModelProperty(value = "会员ID")
+    private Long vipId;
+
+    @ApiModelProperty(value = "题目答案列表")
+    private List<QuestionAnswerItemDto> items;
+
+    public Long getVipId() {
+        return vipId;
+    }
+
+    public void setVipId(Long vipId) {
+        this.vipId = vipId;
+    }
+
+    public List<QuestionAnswerItemDto> getItems() {
+        return items;
+    }
+
+    public void setItems(List<QuestionAnswerItemDto> items) {
+        this.items = items;
+    }
+}
diff --git a/zq-erp/src/main/java/com/matrix/system/app/dto/QuestionAnswerItemDto.java b/zq-erp/src/main/java/com/matrix/system/app/dto/QuestionAnswerItemDto.java
new file mode 100644
index 0000000..9d3c49a
--- /dev/null
+++ b/zq-erp/src/main/java/com/matrix/system/app/dto/QuestionAnswerItemDto.java
@@ -0,0 +1,56 @@
+package com.matrix.system.app.dto;
+
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+
+/**
+ * @author wzy
+ * @date 2020-12-28
+ **/
+@ApiModel(value = "QuestionAnswerItemDto", description = "问题答案接收类")
+public class QuestionAnswerItemDto {
+
+    @ApiModelProperty(value = "问题ID")
+    private Long questionId;
+
+    @ApiModelProperty(value = "会员ID")
+    private Long vipId;
+
+    @ApiModelProperty(value = "答案Ids,逗号隔开")
+    private String answerId;
+
+    @ApiModelProperty(value = "文本答案")
+    private String answerText;
+
+    public Long getVipId() {
+        return vipId;
+    }
+
+    public void setVipId(Long vipId) {
+        this.vipId = vipId;
+    }
+
+    public Long getQuestionId() {
+        return questionId;
+    }
+
+    public void setQuestionId(Long questionId) {
+        this.questionId = questionId;
+    }
+
+    public String getAnswerId() {
+        return answerId;
+    }
+
+    public void setAnswerId(String answerId) {
+        this.answerId = answerId;
+    }
+
+    public String getAnswerText() {
+        return answerText;
+    }
+
+    public void setAnswerText(String answerText) {
+        this.answerText = answerText;
+    }
+}
diff --git a/zq-erp/src/main/java/com/matrix/system/app/dto/RankingDto.java b/zq-erp/src/main/java/com/matrix/system/app/dto/RankingDto.java
new file mode 100644
index 0000000..3c3d788
--- /dev/null
+++ b/zq-erp/src/main/java/com/matrix/system/app/dto/RankingDto.java
@@ -0,0 +1,43 @@
+package com.matrix.system.app.dto;
+
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+
+import java.util.Date;
+
+/**
+ * @author wzy
+ * @date 2020-12-28
+ **/
+@ApiModel(value = "RankingDto", description = "排行榜参数接收类")
+public class RankingDto {
+
+    public static final String SALE = "1";
+    public static final String CONSUME = "2";
+
+    public static final String DAY = "1";
+    public static final String MONTH = "2";
+    public static final String YEAR = "3";
+
+    @ApiModelProperty(value = "数据类型 1-销售 2-消耗", example = "1")
+    private String dataType;
+
+    @ApiModelProperty(value = "排行榜类型 1-日榜 2-月榜 3-年榜", example = "1")
+    private String type;
+
+    public String getDataType() {
+        return dataType;
+    }
+
+    public void setDataType(String dataType) {
+        this.dataType = dataType;
+    }
+
+    public String getType() {
+        return type;
+    }
+
+    public void setType(String type) {
+        this.type = type;
+    }
+}
diff --git a/zq-erp/src/main/java/com/matrix/system/app/dto/ServiceOrderListDto.java b/zq-erp/src/main/java/com/matrix/system/app/dto/ServiceOrderListDto.java
new file mode 100644
index 0000000..1b4373e
--- /dev/null
+++ b/zq-erp/src/main/java/com/matrix/system/app/dto/ServiceOrderListDto.java
@@ -0,0 +1,104 @@
+package com.matrix.system.app.dto;
+
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+
+/**
+ * @author wzy
+ * @date 2020-12-24
+ **/
+@ApiModel(value = "ServiceOrderListDto", description = "服务单列表参数接收类")
+public class ServiceOrderListDto extends BasePageDto{
+
+    @ApiModelProperty(value = "查询参数")
+    private String queryKey;
+
+    @ApiModelProperty(value = "状态 0/全部 1/待确认 2/待排班 3/待配料 4/待服务 5/服务中 6/已完成 ")
+    private String status;
+
+
+    @ApiModelProperty(hidden = true)
+    private Long shopId;
+
+    @ApiModelProperty(hidden = true)
+    private Long userId;
+
+    @ApiModelProperty(value = "客户ID")
+    private Long vipId;
+
+    @ApiModelProperty(hidden = true)
+    private Long companyId;
+
+    public Long getCompanyId() {
+        return companyId;
+    }
+
+    public void setCompanyId(Long companyId) {
+        this.companyId = companyId;
+    }
+
+    public Long getVipId() {
+        return vipId;
+    }
+
+    public void setVipId(Long vipId) {
+        this.vipId = vipId;
+    }
+
+    public Long getUserId() {
+        return userId;
+    }
+
+    public void setUserId(Long userId) {
+        this.userId = userId;
+    }
+
+    public Long getShopId() {
+        return shopId;
+    }
+
+    public void setShopId(Long shopId) {
+        this.shopId = shopId;
+    }
+
+    public String getQueryKey() {
+        return queryKey;
+    }
+
+    public void setQueryKey(String queryKey) {
+        this.queryKey = queryKey;
+    }
+
+    public String getStatus() {
+        return status;
+    }
+
+    public void setStatus(String status) {
+        switch (status) {
+            case "0" :
+                this.status = "";
+                break;
+            case "1":
+                this.status = "待确认";
+                break;
+            case "2":
+                this.status = "待预约";
+                break;
+            case "3" :
+                this.status = "需配料";
+                break;
+            case "4" :
+                this.status = "配料完成";
+                break;
+            case "5" :
+                this.status = "服务中";
+                break;
+            case "6" :
+                this.status = "服务完成";
+                break;
+            default:
+                this.status = "";
+                break;
+        }
+    }
+}
diff --git a/zq-erp/src/main/java/com/matrix/system/app/dto/ServiceVipProjDto.java b/zq-erp/src/main/java/com/matrix/system/app/dto/ServiceVipProjDto.java
new file mode 100644
index 0000000..7201321
--- /dev/null
+++ b/zq-erp/src/main/java/com/matrix/system/app/dto/ServiceVipProjDto.java
@@ -0,0 +1,48 @@
+package com.matrix.system.app.dto;
+
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+
+import javax.validation.constraints.NotNull;
+
+/**
+ * @author wzy
+ * @date 2020-12-27
+ **/
+@ApiModel(value = "ServiceVipProjDto", description = "获取用户套餐/项目接收参数类")
+public class ServiceVipProjDto {
+
+    @NotNull(message = "参数错误")
+    @ApiModelProperty(value = "会员ID")
+    private Long vipId;
+
+    @ApiModelProperty(value = "查询参数")
+    private String queryKey;
+
+    @ApiModelProperty(value = "类型 0-全部 1-有效 3-无效 2-一个月内过期")
+    private String type;
+
+    public Long getVipId() {
+        return vipId;
+    }
+
+    public void setVipId(Long vipId) {
+        this.vipId = vipId;
+    }
+
+    public String getQueryKey() {
+        return queryKey;
+    }
+
+    public void setQueryKey(String queryKey) {
+        this.queryKey = queryKey;
+    }
+
+    public String getType() {
+        return type;
+    }
+
+    public void setType(String type) {
+        this.type = type;
+    }
+}
diff --git a/zq-erp/src/main/java/com/matrix/system/app/dto/ShoppingGoodsListDto.java b/zq-erp/src/main/java/com/matrix/system/app/dto/ShoppingGoodsListDto.java
new file mode 100644
index 0000000..b83e7a3
--- /dev/null
+++ b/zq-erp/src/main/java/com/matrix/system/app/dto/ShoppingGoodsListDto.java
@@ -0,0 +1,93 @@
+package com.matrix.system.app.dto;
+
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+
+import javax.validation.constraints.NotNull;
+
+/**
+ * @author wzy
+ * @date 2020-12-23
+ **/
+@ApiModel(value = "ShoppingGoodsListDto", description = "商品列表接受类")
+public class ShoppingGoodsListDto {
+
+    @ApiModelProperty(value = "商品名称/编号/拼音")
+    private String queryKey;
+
+    @ApiModelProperty(value = "商品类型")
+    private String goodType;
+
+    @ApiModelProperty(value = "类型ID", example = "13")
+    private Long cateId;
+
+    @NotNull(message = "参数错误")
+    @ApiModelProperty(value = "条数", example = "10")
+    private Integer pageSize = 10;
+
+    @NotNull(message = "参数错误")
+    @ApiModelProperty(value = "第几页", example = "1")
+    private Integer pageNum = 1;
+
+    @ApiModelProperty(hidden = true)
+    private Long shopId;
+
+    @ApiModelProperty(hidden = true)
+    private Long companyId;
+
+    public Long getCompanyId() {
+        return companyId;
+    }
+
+    public void setCompanyId(Long companyId) {
+        this.companyId = companyId;
+    }
+
+    public String getGoodType() {
+        return goodType;
+    }
+
+    public void setGoodType(String goodType) {
+        this.goodType = goodType;
+    }
+
+    public Long getShopId() {
+        return shopId;
+    }
+
+    public void setShopId(Long shopId) {
+        this.shopId = shopId;
+    }
+
+    public String getQueryKey() {
+        return queryKey;
+    }
+
+    public void setQueryKey(String queryKey) {
+        this.queryKey = queryKey;
+    }
+
+    public Long getCateId() {
+        return cateId;
+    }
+
+    public void setCateId(Long cateId) {
+        this.cateId = cateId;
+    }
+
+    public Integer getPageSize() {
+        return pageSize;
+    }
+
+    public void setPageSize(Integer pageSize) {
+        this.pageSize = pageSize;
+    }
+
+    public Integer getPageNum() {
+        return pageNum;
+    }
+
+    public void setPageNum(Integer pageNum) {
+        this.pageNum = pageNum;
+    }
+}
diff --git a/zq-erp/src/main/java/com/matrix/system/app/dto/SkinCheckListDto.java b/zq-erp/src/main/java/com/matrix/system/app/dto/SkinCheckListDto.java
new file mode 100644
index 0000000..5540113
--- /dev/null
+++ b/zq-erp/src/main/java/com/matrix/system/app/dto/SkinCheckListDto.java
@@ -0,0 +1,22 @@
+package com.matrix.system.app.dto;
+
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+
+import javax.validation.constraints.NotNull;
+
+@ApiModel(value = "SkinCheckListDto", description = "皮肤检测列表接收参数类")
+public class SkinCheckListDto  extends BasePageDto{
+
+    @NotNull(message = "参数错误")
+    @ApiModelProperty(value = "会员ID", example = "361")
+    private Long vipId;
+
+    public Long getVipId() {
+        return vipId;
+    }
+
+    public void setVipId(Long vipId) {
+        this.vipId = vipId;
+    }
+}
diff --git a/zq-erp/src/main/java/com/matrix/system/app/dto/SmsCodeDto.java b/zq-erp/src/main/java/com/matrix/system/app/dto/SmsCodeDto.java
new file mode 100644
index 0000000..8c18339
--- /dev/null
+++ b/zq-erp/src/main/java/com/matrix/system/app/dto/SmsCodeDto.java
@@ -0,0 +1,26 @@
+package com.matrix.system.app.dto;
+
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+
+import javax.validation.constraints.NotBlank;
+
+/**
+ * @author wzy
+ * @date 2021-01-06
+ **/
+@ApiModel(value = "SmsCodeDto", description = "短信发送接收参数类")
+public class SmsCodeDto {
+
+    @NotBlank(message = "参数错误")
+    @ApiModelProperty(value = "手机号")
+    private String telphone;
+
+    public String getTelphone() {
+        return telphone;
+    }
+
+    public void setTelphone(String telphone) {
+        this.telphone = telphone;
+    }
+}
diff --git a/zq-erp/src/main/java/com/matrix/system/app/dto/StoreInOutListDto.java b/zq-erp/src/main/java/com/matrix/system/app/dto/StoreInOutListDto.java
new file mode 100644
index 0000000..c6db79d
--- /dev/null
+++ b/zq-erp/src/main/java/com/matrix/system/app/dto/StoreInOutListDto.java
@@ -0,0 +1,54 @@
+package com.matrix.system.app.dto;
+
+import com.fasterxml.jackson.annotation.JsonFormat;
+import com.matrix.core.tools.DateUtil;
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+
+import javax.validation.constraints.NotBlank;
+import javax.validation.constraints.NotNull;
+import java.util.Date;
+
+/**
+ * @author wzy
+ * @date 2020-12-27
+ **/
+@ApiModel(value = "InOutListDto", description = "商品出入库记录参数接收")
+public class StoreInOutListDto extends BasePageDto {
+
+    @JsonFormat(pattern = DateUtil.DATE_FORMAT_DD, timezone = "GMT+8")
+    @ApiModelProperty(value = "开始时间")
+    private Date startTime;
+
+    @JsonFormat(pattern = DateUtil.DATE_FORMAT_DD, timezone = "GMT+8")
+    @ApiModelProperty(value = "结束时间")
+    private Date endTime;
+
+    @NotBlank(message = "参数错误")
+    @ApiModelProperty(value = "商品编号")
+    private String code;
+
+    public String getCode() {
+        return code;
+    }
+
+    public void setCode(String code) {
+        this.code = code;
+    }
+
+    public Date getStartTime() {
+        return startTime;
+    }
+
+    public void setStartTime(Date startTime) {
+        this.startTime = startTime;
+    }
+
+    public Date getEndTime() {
+        return endTime;
+    }
+
+    public void setEndTime(Date endTime) {
+        this.endTime = endTime;
+    }
+}
diff --git a/zq-erp/src/main/java/com/matrix/system/app/dto/StoreListDto.java b/zq-erp/src/main/java/com/matrix/system/app/dto/StoreListDto.java
new file mode 100644
index 0000000..ee535e4
--- /dev/null
+++ b/zq-erp/src/main/java/com/matrix/system/app/dto/StoreListDto.java
@@ -0,0 +1,23 @@
+package com.matrix.system.app.dto;
+
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+
+/**
+ * @author wzy
+ * @date 2020-12-27
+ **/
+@ApiModel(value = "StoreListDto", description = "库存列表参数接收类")
+public class StoreListDto extends BasePageDto {
+
+    @ApiModelProperty(value = "查询参数")
+    private String queryKey;
+
+    public String getQueryKey() {
+        return queryKey;
+    }
+
+    public void setQueryKey(String queryKey) {
+        this.queryKey = queryKey;
+    }
+}
diff --git a/zq-erp/src/main/java/com/matrix/system/app/dto/UploadPhotoDto.java b/zq-erp/src/main/java/com/matrix/system/app/dto/UploadPhotoDto.java
new file mode 100644
index 0000000..13b7e85
--- /dev/null
+++ b/zq-erp/src/main/java/com/matrix/system/app/dto/UploadPhotoDto.java
@@ -0,0 +1,26 @@
+package com.matrix.system.app.dto;
+
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+
+import javax.validation.constraints.NotBlank;
+
+/**
+ * @author wzy
+ * @date 2021-01-06
+ **/
+@ApiModel(value = "UploadPhotoDto", description = "图片上传接口接收参数类")
+public class UploadPhotoDto {
+
+    @NotBlank(message = "参数错误")
+    @ApiModelProperty(value = "图片base64字符串")
+    private String base64;
+
+    public String getBase64() {
+        return base64;
+    }
+
+    public void setBase64(String base64) {
+        this.base64 = base64;
+    }
+}
diff --git a/zq-erp/src/main/java/com/matrix/system/app/dto/UsersQueryDto.java b/zq-erp/src/main/java/com/matrix/system/app/dto/UsersQueryDto.java
new file mode 100644
index 0000000..8374880
--- /dev/null
+++ b/zq-erp/src/main/java/com/matrix/system/app/dto/UsersQueryDto.java
@@ -0,0 +1,23 @@
+package com.matrix.system.app.dto;
+
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+
+/**
+ * @author wzy
+ * @date 2021-01-05
+ **/
+@ApiModel(value = "UsersQueryDto", description = "员工列表接口参数类")
+public class UsersQueryDto {
+
+    @ApiModelProperty(value = "查询参数")
+    private String queryKey;
+
+    public String getQueryKey() {
+        return queryKey;
+    }
+
+    public void setQueryKey(String queryKey) {
+        this.queryKey = queryKey;
+    }
+}
diff --git a/zq-erp/src/main/java/com/matrix/system/app/dto/VipInfoListDto.java b/zq-erp/src/main/java/com/matrix/system/app/dto/VipInfoListDto.java
new file mode 100644
index 0000000..1154bf5
--- /dev/null
+++ b/zq-erp/src/main/java/com/matrix/system/app/dto/VipInfoListDto.java
@@ -0,0 +1,122 @@
+package com.matrix.system.app.dto;
+
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+
+/**
+ * @author wzy
+ * @date 2020-12-21
+ **/
+@ApiModel(value = "VipInfoListDto", description = "获取会员列表参数类")
+public class VipInfoListDto extends BasePageDto {
+
+    @ApiModelProperty(value = "查询参数(客户姓名/手机/会员编号/拼音)", example = "")
+    private String queryKey;
+
+    @ApiModelProperty(value = "排序 desc/asc", example = "asc")
+    private String order = "asc";
+
+    @ApiModelProperty(value = "排序字段 monthArrived(本月到店次数) yearArrived(本年) used(消费) consume(消耗) vipLevel(会员等级) arriveTime(上次到店)", example = "zjm")
+    private String sort = "zjm";
+
+    @ApiModelProperty(value = "生日 1-三天内生日 2-本月生日 3-下月生日")
+    private String birthType;
+
+    @ApiModelProperty(value = "会员类型ID")
+    private Long vipType;
+
+    @ApiModelProperty(value = "其他 2-新客户 1-老客户")
+    private String other;
+
+    @ApiModelProperty(hidden = true)
+    private Long shopId;
+
+    @ApiModelProperty(hidden = true)
+    private Long companyId;
+
+    @ApiModelProperty(hidden = true)
+    private int offset;
+
+    @ApiModelProperty(hidden = true)
+    private int limit;
+
+    public int getOffset() {
+        return offset;
+    }
+
+    public void setOffset(int offset) {
+        this.offset = offset;
+    }
+
+    public int getLimit() {
+        return limit;
+    }
+
+    public void setLimit(int limit) {
+        this.limit = limit;
+    }
+
+    public Long getCompanyId() {
+        return companyId;
+    }
+
+    public void setCompanyId(Long companyId) {
+        this.companyId = companyId;
+    }
+
+    public String getQueryKey() {
+        return queryKey;
+    }
+
+    public void setQueryKey(String queryKey) {
+        this.queryKey = queryKey;
+    }
+
+    public String getOrder() {
+        return order;
+    }
+
+    public void setOrder(String order) {
+        this.order = order;
+    }
+
+    public String getSort() {
+        return sort;
+    }
+
+    public void setSort(String sort) {
+        this.sort = sort;
+    }
+
+    public Long getShopId() {
+        return shopId;
+    }
+
+    public void setShopId(Long shopId) {
+        this.shopId = shopId;
+    }
+
+    public String getBirthType() {
+        return birthType;
+    }
+
+    public void setBirthType(String birthType) {
+        this.birthType = birthType;
+    }
+
+    public Long getVipType() {
+        return vipType;
+    }
+
+    public void setVipType(Long vipType) {
+        this.vipType = vipType;
+    }
+
+    public String getOther() {
+        return other;
+    }
+
+    public void setOther(String other) {
+        this.other = other;
+    }
+}
diff --git a/zq-erp/src/main/java/com/matrix/system/app/dto/VipStatisticsParamDto.java b/zq-erp/src/main/java/com/matrix/system/app/dto/VipStatisticsParamDto.java
new file mode 100644
index 0000000..2f58a71
--- /dev/null
+++ b/zq-erp/src/main/java/com/matrix/system/app/dto/VipStatisticsParamDto.java
@@ -0,0 +1,100 @@
+package com.matrix.system.app.dto;
+
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+
+import javax.validation.constraints.NotBlank;
+
+/**
+ * 统计查询条件
+ * @author jyy
+ */
+@ApiModel(value = "VipStatisticsParamDto", description = "员工专项统计接收参数类")
+public class VipStatisticsParamDto {
+
+    public static final String COMPANY = "1";
+
+    public static final String SHOP = "2";
+
+    /**
+     * 开始时间
+     */
+    @NotBlank(message = "参数错误")
+    @ApiModelProperty(value = "开始时间", example = "2020-12-01")
+    private String beginTime;
+
+    /**
+     *结束时间
+     */
+    @NotBlank(message = "参数错误")
+    @ApiModelProperty(value = "结束时间", example = "2020-12-31")
+    private String endTime;
+    /**
+     *统计单位
+     */
+    @NotBlank(message = "参数错误")
+    @ApiModelProperty(value = "统计单位", example = "日")
+    private String statisticsUnit;
+
+    /**
+     *对比单位
+     */
+    @ApiModelProperty(hidden = true)
+    private String  contrastUnit;
+    /**
+     * 门店id
+     */
+    @ApiModelProperty(value = "员工, 不传默认当前登陆用户")
+    private Long staffId;
+
+    @ApiModelProperty(value = "类型 1-订单业绩 2-现金业绩 3-售卡业绩 4-产品业绩 5-划扣业绩 6-本金消耗 7-赠送消耗 8-服务提成 9-人头数 10-项目数 11-服务时长", example = "1")
+    private String type;
+
+    public String getType() {
+        return type;
+    }
+
+    public void setType(String type) {
+        this.type = type;
+    }
+
+    public String getBeginTime() {
+        return beginTime;
+    }
+
+    public void setBeginTime(String beginTime) {
+        this.beginTime = beginTime;
+    }
+
+    public String getEndTime() {
+        return endTime;
+    }
+
+    public void setEndTime(String endTime) {
+        this.endTime = endTime;
+    }
+
+    public String getStatisticsUnit() {
+        return statisticsUnit;
+    }
+
+    public void setStatisticsUnit(String statisticsUnit) {
+        this.statisticsUnit = statisticsUnit;
+    }
+
+    public String getContrastUnit() {
+        return contrastUnit;
+    }
+
+    public void setContrastUnit(String contrastUnit) {
+        this.contrastUnit = contrastUnit;
+    }
+
+    public Long getStaffId() {
+        return staffId;
+    }
+
+    public void setStaffId(Long staffId) {
+        this.staffId = staffId;
+    }
+}
diff --git a/zq-erp/src/main/java/com/matrix/system/app/mapper/MoneyCardUseMapper.java b/zq-erp/src/main/java/com/matrix/system/app/mapper/MoneyCardUseMapper.java
new file mode 100644
index 0000000..8ad6f7d
--- /dev/null
+++ b/zq-erp/src/main/java/com/matrix/system/app/mapper/MoneyCardUseMapper.java
@@ -0,0 +1,21 @@
+package com.matrix.system.app.mapper;
+
+import com.matrix.system.app.vo.VipCardListVo;
+import com.matrix.system.hive.bean.MoneyCardUse;
+import org.mapstruct.Mapper;
+import org.mapstruct.factory.Mappers;
+
+import java.util.List;
+
+/**
+ * @author wzy
+ * @date 2020-12-28
+ **/
+@Mapper
+public abstract class MoneyCardUseMapper {
+    public static final MoneyCardUseMapper INSTANCE = Mappers.getMapper(MoneyCardUseMapper.class);
+
+    public abstract VipCardListVo entityToCardListVo(MoneyCardUse moneyCardUse);
+
+    public abstract List<VipCardListVo> entitiesToCardListVos(List<MoneyCardUse> list);
+}
diff --git a/zq-erp/src/main/java/com/matrix/system/app/mapper/QuestionMapper.java b/zq-erp/src/main/java/com/matrix/system/app/mapper/QuestionMapper.java
new file mode 100644
index 0000000..c16b5d8
--- /dev/null
+++ b/zq-erp/src/main/java/com/matrix/system/app/mapper/QuestionMapper.java
@@ -0,0 +1,31 @@
+package com.matrix.system.app.mapper;
+
+import com.matrix.system.app.dto.QuestionAnswerDto;
+import com.matrix.system.app.dto.QuestionAnswerItemDto;
+import com.matrix.system.app.vo.QuestionVo;
+import com.matrix.system.hive.bean.Question;
+import com.matrix.system.hive.bean.VipAnswer;
+import org.mapstruct.Mapper;
+import org.mapstruct.Mapping;
+import org.mapstruct.factory.Mappers;
+
+import java.util.List;
+
+/**
+ * @author wzy
+ * @date 2020-12-28
+ **/
+@Mapper
+public abstract class QuestionMapper {
+    public static final QuestionMapper INSTANCE = Mappers.getMapper(QuestionMapper.class);
+
+    public abstract QuestionVo entityToVo(Question question);
+
+    public abstract List<QuestionVo> entitiesToVos(List<Question> list);
+
+    @Mapping(source = "questionId", target = "quesionId")
+    public abstract VipAnswer dtoToVipAnswer(QuestionAnswerItemDto questionAnswerDto);
+
+    public abstract List<VipAnswer> dtosToVipAnswers(List<QuestionAnswerItemDto> list);
+
+}
diff --git a/zq-erp/src/main/java/com/matrix/system/app/mapper/SysBeauticianStateMapper.java b/zq-erp/src/main/java/com/matrix/system/app/mapper/SysBeauticianStateMapper.java
new file mode 100644
index 0000000..fc9f600
--- /dev/null
+++ b/zq-erp/src/main/java/com/matrix/system/app/mapper/SysBeauticianStateMapper.java
@@ -0,0 +1,34 @@
+package com.matrix.system.app.mapper;
+
+import com.matrix.system.app.dto.CreateServiceOrderItemDto;
+import com.matrix.system.app.vo.ServiceOrderDetailItemVo;
+import com.matrix.system.hive.bean.SysBeauticianState;
+import org.mapstruct.Mapper;
+import org.mapstruct.Mapping;
+import org.mapstruct.factory.Mappers;
+
+import java.util.List;
+
+/**
+ * @author wzy
+ * @date 2020-12-25
+ **/
+@Mapper
+public abstract class SysBeauticianStateMapper {
+    public static final SysBeauticianStateMapper INSTANCE = Mappers.getMapper(SysBeauticianStateMapper.class);
+
+
+    public abstract SysBeauticianState serviceOrderItemVoToEntity(CreateServiceOrderItemDto dto);
+
+    public abstract List<SysBeauticianState> orderItmesVoToEntityList(List<CreateServiceOrderItemDto> dtoList);
+
+    @Mapping(source = "projUse.price", target = "price")
+    @Mapping(source = "projInfo.name", target = "name")
+    @Mapping(source = "projInfo.timeLength", target = "timeLength")
+    @Mapping(source = "beautiStaffInfo.suName", target = "beautyName")
+    @Mapping(source = "extract", target = "commission")
+    public abstract ServiceOrderDetailItemVo entityToDetailItemVo(SysBeauticianState sysBeauticianState);
+
+    public abstract List<ServiceOrderDetailItemVo> entitiesToDetailItemsVo(List<SysBeauticianState> list);
+
+}
diff --git a/zq-erp/src/main/java/com/matrix/system/app/mapper/SysProjServiceMapper.java b/zq-erp/src/main/java/com/matrix/system/app/mapper/SysProjServiceMapper.java
new file mode 100644
index 0000000..9e5adc5
--- /dev/null
+++ b/zq-erp/src/main/java/com/matrix/system/app/mapper/SysProjServiceMapper.java
@@ -0,0 +1,22 @@
+package com.matrix.system.app.mapper;
+
+import com.matrix.system.app.vo.ServiceOrderDetailVo;
+import com.matrix.system.hive.bean.SysProjServices;
+import org.mapstruct.Mapper;
+import org.mapstruct.Mapping;
+import org.mapstruct.factory.Mappers;
+
+/**
+ * @author wzy
+ * @date 2020-12-27
+ **/
+@Mapper
+public abstract class SysProjServiceMapper {
+    public static final SysProjServiceMapper INSTANCE = Mappers.getMapper(SysProjServiceMapper.class);
+
+    @Mapping(source = "state", target = "status")
+    @Mapping(source = "vipInfo.vipName", target = "vipName")
+    @Mapping(source = "vipInfo.phone", target = "phone")
+    @Mapping(source = "createStaffName", target = "staffName")
+    public abstract ServiceOrderDetailVo projServiceToDetailVo(SysProjServices projServices);
+}
diff --git a/zq-erp/src/main/java/com/matrix/system/app/mapper/SysProjUseMapper.java b/zq-erp/src/main/java/com/matrix/system/app/mapper/SysProjUseMapper.java
new file mode 100644
index 0000000..0bbf9f3
--- /dev/null
+++ b/zq-erp/src/main/java/com/matrix/system/app/mapper/SysProjUseMapper.java
@@ -0,0 +1,37 @@
+package com.matrix.system.app.mapper;
+
+import com.matrix.system.app.vo.ServiceProjVo;
+import com.matrix.system.app.vo.ServiceTcVo;
+import com.matrix.system.hive.bean.SysProjUse;
+import com.matrix.system.hive.bean.SysProjUseFlow;
+import org.mapstruct.Mapper;
+import org.mapstruct.Mapping;
+import org.mapstruct.factory.Mappers;
+
+import java.util.List;
+
+/**
+ * @author wzy
+ * @date 2020-12-24
+ **/
+@Mapper
+public abstract class SysProjUseMapper {
+    public static final SysProjUseMapper INSTANCE = Mappers.getMapper(SysProjUseMapper.class);
+
+    @Mapping(source = "projName", target = "name")
+    @Mapping(source = "failTime", target = "invalidTime")
+    @Mapping(source = "surplusCount", target = "count")
+    public abstract ServiceTcVo entityToServiceTcVo(SysProjUse sysProjUse);
+
+    public abstract List<ServiceTcVo> entityListToTcVoList(List<SysProjUse> list);
+
+    @Mapping(source = "projName", target = "name")
+    @Mapping(source = "failTime", target = "invalidTime")
+    @Mapping(source = "surplusCount", target = "count")
+    public abstract ServiceProjVo entityToServiceProjVo(SysProjUse sysProjUse);
+
+    public abstract List<ServiceProjVo> entityListToProjVoList(List<SysProjUse> list);
+
+    @Mapping(source = "id", target = "projUseId")
+    public abstract SysProjUseFlow projUseToFlow(SysProjUse sysProjUse);
+}
diff --git a/zq-erp/src/main/java/com/matrix/system/app/mapper/SysSkinCheckRecordMapper.java b/zq-erp/src/main/java/com/matrix/system/app/mapper/SysSkinCheckRecordMapper.java
new file mode 100644
index 0000000..411a311
--- /dev/null
+++ b/zq-erp/src/main/java/com/matrix/system/app/mapper/SysSkinCheckRecordMapper.java
@@ -0,0 +1,38 @@
+package com.matrix.system.app.mapper;
+
+import com.matrix.system.app.vo.SkinCheckAnalysisItems;
+import com.matrix.system.app.vo.SkinCheckDetailVo;
+import com.matrix.system.app.vo.SkinCheckDiagnoseItemVo;
+import com.matrix.system.app.vo.SkinCheckListVo;
+import com.matrix.system.hive.bean.SysSkinCheckRecord;
+import com.matrix.system.hive.bean.SysSkinDetail;
+import org.mapstruct.Mapper;
+import org.mapstruct.Mapping;
+import org.mapstruct.factory.Mappers;
+
+import java.util.List;
+
+@Mapper
+public abstract class SysSkinCheckRecordMapper {
+    public static final SysSkinCheckRecordMapper INSTANCE = Mappers.getMapper(SysSkinCheckRecordMapper.class);
+
+    public abstract SkinCheckListVo entityToSkinCheckListVo(SysSkinCheckRecord sysSkinCheckRecord);
+
+    public abstract List<SkinCheckListVo> entitiesToListVos(List<SysSkinCheckRecord> list);
+
+    @Mapping(target = "sex", source = "ext2")
+    @Mapping(target = "vipName", source = "userName")
+    public abstract SkinCheckDetailVo entityToDetailVo(SysSkinCheckRecord sysSkinCheckRecord);
+
+    @Mapping(target = "title", source = "symptom")
+    public abstract SkinCheckDiagnoseItemVo entityToDiagnoseItem(SysSkinDetail sysSkinDetail);
+
+    public abstract List<SkinCheckDiagnoseItemVo> entitiesToDiagnoseItems(List<SysSkinDetail> list);
+
+    @Mapping(target = "title", source = "symptom")
+    public abstract SkinCheckAnalysisItems entityToAnalysisItem(SysSkinDetail sysSkinDetail);
+
+    public abstract List<SkinCheckAnalysisItems> entitiesToAnalysisItems(List<SysSkinDetail> list);
+
+
+}
diff --git a/zq-erp/src/main/java/com/matrix/system/app/mapper/SysStoreInfoMapper.java b/zq-erp/src/main/java/com/matrix/system/app/mapper/SysStoreInfoMapper.java
new file mode 100644
index 0000000..86e99cf
--- /dev/null
+++ b/zq-erp/src/main/java/com/matrix/system/app/mapper/SysStoreInfoMapper.java
@@ -0,0 +1,33 @@
+package com.matrix.system.app.mapper;
+
+import com.matrix.system.app.vo.StoreInOutListVo;
+import com.matrix.system.app.vo.StoreListVo;
+import com.matrix.system.hive.bean.SysStoreInfo;
+import com.matrix.system.hive.pojo.StoreInOutRecordVO;
+import org.mapstruct.Mapper;
+import org.mapstruct.Mapping;
+import org.mapstruct.factory.Mappers;
+
+import java.util.List;
+
+/**
+ * @author wzy
+ * @date 2020-12-27
+ **/
+@Mapper
+public abstract class SysStoreInfoMapper {
+    public static final SysStoreInfoMapper INSTANCE = Mappers.getMapper(SysStoreInfoMapper.class);
+
+    @Mapping(target = "goodsName", source = "goods.name")
+    @Mapping(target = "goodsCode", source = "goods.code")
+    @Mapping(target = "alarmNum", source = "goods.alarmNum")
+    @Mapping(target = "img", source = "goods.img")
+    public abstract StoreListVo entityToStoreVo(SysStoreInfo sysStoreInfo);
+
+    public abstract List<StoreListVo> entitiesToStoreVos(List<SysStoreInfo> list);
+
+    @Mapping(target = "content", source = "orderType")
+    public abstract StoreInOutListVo recordVoToInOutListVo(StoreInOutRecordVO recordVO);
+
+    public abstract List<StoreInOutListVo> recordVosToInOutListVos(List<StoreInOutRecordVO> list);
+}
diff --git a/zq-erp/src/main/java/com/matrix/system/app/mapper/SysUsersMapper.java b/zq-erp/src/main/java/com/matrix/system/app/mapper/SysUsersMapper.java
new file mode 100644
index 0000000..4c58e8e
--- /dev/null
+++ b/zq-erp/src/main/java/com/matrix/system/app/mapper/SysUsersMapper.java
@@ -0,0 +1,53 @@
+package com.matrix.system.app.mapper;
+
+import com.matrix.system.app.dto.ModifyUserDto;
+import com.matrix.system.app.vo.BeauticianVo;
+import com.matrix.system.app.vo.UserInfoDetailVo;
+import com.matrix.system.common.bean.SysUsers;
+import org.mapstruct.Mapper;
+import org.mapstruct.Mapping;
+import org.mapstruct.factory.Mappers;
+
+import java.util.List;
+
+/**
+ * @author wzy
+ * @date 2020-12-25
+ **/
+@Mapper
+public abstract class SysUsersMapper {
+    public static final SysUsersMapper INSTANCE = Mappers.getMapper(SysUsersMapper.class);
+
+    @Mapping(source = "suId", target = "id")
+    @Mapping(source = "suName", target = "name")
+    @Mapping(source = "suPhoto", target = "photo")
+    @Mapping(source = "suTel", target = "telphone")
+    public abstract BeauticianVo sysUsersToBeauticianVo(SysUsers sysUsers);
+
+    public abstract List<BeauticianVo> usersListToBeautyList(List<SysUsers> list);
+
+    @Mapping(source = "suPhoto", target = "photo")
+    @Mapping(source = "suName", target = "name")
+    @Mapping(source = "suAliases", target = "engName")
+    @Mapping(source = "suTel", target = "telphone")
+    @Mapping(source = "suSex", target = "sex")
+    @Mapping(source = "suBirthday", target = "birthday")
+    @Mapping(source = "suEmail", target = "email")
+    @Mapping(source = "serviceSignature", target = "serviceSign")
+    @Mapping(source = "suAddress", target = "address")
+    public abstract UserInfoDetailVo usersToDetailInfoVo(SysUsers sysUsers);
+
+    public abstract ModifyUserDto usersToModifyUserDto(SysUsers sysUsers);
+
+    @Mapping(target = "suPhoto", source = "photo")
+    @Mapping(target = "suName", source = "name")
+    @Mapping(target = "suAliases", source = "engName")
+    @Mapping(target = "suTel", source = "telphone")
+    @Mapping(target = "suSex", source = "sex")
+    @Mapping(target = "suBirthday", source = "birthday")
+    @Mapping(target = "suEmail", source = "email")
+    @Mapping(target = "serviceSignature", source = "serviceSign")
+    @Mapping(target = "suAddress", source = "address")
+    public abstract SysUsers modifyUserDtoToUsers(ModifyUserDto modifyUserDto);
+
+}
diff --git a/zq-erp/src/main/java/com/matrix/system/app/mapper/SysWorkBeatuistaffMapper.java b/zq-erp/src/main/java/com/matrix/system/app/mapper/SysWorkBeatuistaffMapper.java
new file mode 100644
index 0000000..9759907
--- /dev/null
+++ b/zq-erp/src/main/java/com/matrix/system/app/mapper/SysWorkBeatuistaffMapper.java
@@ -0,0 +1,25 @@
+package com.matrix.system.app.mapper;
+
+import com.matrix.system.app.vo.BeauticianVo;
+import com.matrix.system.hive.bean.SysWorkBeatuistaff;
+import org.mapstruct.Mapper;
+import org.mapstruct.Mapping;
+import org.mapstruct.factory.Mappers;
+
+import java.util.List;
+
+/**
+ * @author wzy
+ * @date 2020-12-25
+ **/
+@Mapper
+public abstract class SysWorkBeatuistaffMapper {
+    public static final SysWorkBeatuistaffMapper INSTANCE = Mappers.getMapper(SysWorkBeatuistaffMapper.class);
+
+    @Mapping(source = "staffId", target = "id")
+    @Mapping(source = "workStaffName", target = "name")
+    public abstract BeauticianVo workBeautyToBeautyVo(SysWorkBeatuistaff sysWorkBeatuistaff);
+
+
+    public abstract List<BeauticianVo> workBeautysToBeautyVos(List<SysWorkBeatuistaff> sysWorkBeatuistaff);
+}
diff --git a/zq-erp/src/main/java/com/matrix/system/app/utils/Sms106Send.java b/zq-erp/src/main/java/com/matrix/system/app/utils/Sms106Send.java
new file mode 100644
index 0000000..4926ebb
--- /dev/null
+++ b/zq-erp/src/main/java/com/matrix/system/app/utils/Sms106Send.java
@@ -0,0 +1,65 @@
+package com.matrix.system.app.utils;
+
+import cn.hutool.core.date.DatePattern;
+import cn.hutool.core.date.DateUtil;
+import cn.hutool.core.util.StrUtil;
+import cn.hutool.core.util.XmlUtil;
+import cn.hutool.http.HttpUtil;
+import com.matrix.core.exception.GlobleException;
+import com.matrix.core.tools.LogUtil;
+
+import java.util.Date;
+import java.util.HashMap;
+
+/**
+ * @author wzy
+ * @date 2020-07-14
+ **/
+public class Sms106Send {
+
+    private static final String URL = "http://www.qf106.com/sms.aspx";
+    private static final String ID = "16655";
+    private static final String ACCOUNT = "taiyan";
+    private static final String PASSWORD = "123456";
+
+
+    /**
+     * @param phone 手机号
+     * @param code  验证码
+     * @param time  失效时间
+     * @return
+     */
+    public static boolean sendVerifyCode(String phone, String code, int time) {
+        String msg = "您的验证码是{},请在{}分钟内输入,请勿泄露给他人,如非本人操作,请及时修改密码。";
+        String content = StrUtil.format(msg, code, time);
+        return request(phone, content, "验证码");
+    }
+
+    private static boolean request(String phone, String content, String tagName) {
+        HashMap<String, Object> param = new HashMap<>();
+        param.put("userid", ID);
+        param.put("account", ACCOUNT);
+        param.put("password", PASSWORD);
+        param.put("mobile", phone);
+        param.put("content", content);
+        param.put("sendTime", DateUtil.format(new Date(), DatePattern.NORM_DATETIME_PATTERN));
+        param.put("action", "send");
+        param.put("checkcontent", 0);
+        param.put("taskName", tagName);
+        param.put("countnumber", 1);
+        param.put("mobilenumber", 1);
+        param.put("telephonenumber", 0);
+
+        String response = HttpUtil.post(URL, param);
+        LogUtil.info("短信发送:{}, {}", tagName, response);
+        if ("Success".equals(XmlUtil.xmlToMap(response).get("returnstatus"))) {
+            return true;
+        } else {
+            throw new GlobleException((String) XmlUtil.xmlToMap(response).get("message"));
+        }
+    }
+
+    public static void main(String[] args) {
+        System.out.println(sendVerifyCode("15773002834", "123456", 2));
+    }
+}
diff --git a/zq-erp/src/main/java/com/matrix/system/app/vo/BeauticianVo.java b/zq-erp/src/main/java/com/matrix/system/app/vo/BeauticianVo.java
new file mode 100644
index 0000000..8e25766
--- /dev/null
+++ b/zq-erp/src/main/java/com/matrix/system/app/vo/BeauticianVo.java
@@ -0,0 +1,61 @@
+package com.matrix.system.app.vo;
+
+import io.swagger.annotations.ApiModel;
+
+/**
+ * @author wzy
+ * @date 2020-12-25
+ **/
+@ApiModel(value = "BeauticianVo", description = "美疗师列表返回参数类")
+public class BeauticianVo {
+
+    private Long id;
+
+    private String name;
+
+    private String roleName;
+
+    private String photo;
+
+    private String telphone;
+
+    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;
+    }
+
+    public String getRoleName() {
+        return roleName;
+    }
+
+    public void setRoleName(String roleName) {
+        this.roleName = roleName;
+    }
+
+    public String getPhoto() {
+        return photo;
+    }
+
+    public void setPhoto(String photo) {
+        this.photo = photo;
+    }
+
+    public String getTelphone() {
+        return telphone;
+    }
+
+    public void setTelphone(String telphone) {
+        this.telphone = telphone;
+    }
+}
diff --git a/zq-erp/src/main/java/com/matrix/system/app/vo/BusinessesDataShowVo.java b/zq-erp/src/main/java/com/matrix/system/app/vo/BusinessesDataShowVo.java
new file mode 100644
index 0000000..714b2bf
--- /dev/null
+++ b/zq-erp/src/main/java/com/matrix/system/app/vo/BusinessesDataShowVo.java
@@ -0,0 +1,300 @@
+package com.matrix.system.app.vo;
+
+import io.swagger.annotations.Api;
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+
+import java.math.BigDecimal;
+
+/**
+ * @author wzy
+ * @date 2020-12-29
+ **/
+@ApiModel(value = "BusinessDataShowVo", description = "经营报表返回参数类")
+public class BusinessesDataShowVo {
+
+    @ApiModelProperty(value = "时间")
+    private String dataTime;
+
+    @ApiModelProperty(value = "营业收入")
+    private BigDecimal totalPay;
+
+    @ApiModelProperty(value = "现金收款")
+    private BigDecimal cashPay;
+
+    @ApiModelProperty(value = "储值卡收款")
+    private BigDecimal cardPay;
+
+    @ApiModelProperty(value = "欠款")
+    private BigDecimal arrearsPay;
+
+    @ApiModelProperty(value = "现金退款")
+    private BigDecimal refundCashPay;
+
+    @ApiModelProperty(value = "卡项退款")
+    private BigDecimal refundCardPay;
+
+    @ApiModelProperty(value = "产品业绩")
+    private BigDecimal productAchieve;
+
+    @ApiModelProperty(value = "卡项业绩")
+    private BigDecimal cardAchieve;
+
+    @ApiModelProperty(value = "退款")
+    private BigDecimal refund;
+
+    @ApiModelProperty(value = "客单数")
+    private BigDecimal perCustomCnt;
+
+    @ApiModelProperty(value = "客品数")
+    private BigDecimal customGoodsCnt;
+
+    @ApiModelProperty(value = "客单价")
+    private BigDecimal perCustomPrice;
+
+    @ApiModelProperty(value = "成本")
+    private BigDecimal cost;
+
+    @ApiModelProperty(value = "毛利")
+    private BigDecimal grossProfit;
+
+    @ApiModelProperty(value = "毛利率")
+    private BigDecimal grossProfitRate;
+
+    @ApiModelProperty(value = "本金消耗")
+    private BigDecimal consumePay;
+
+    @ApiModelProperty(value = "赠送消耗")
+    private BigDecimal freeConsumePay;
+
+    @ApiModelProperty(value = "人头数")
+    private BigDecimal peopleCnt;
+
+    @ApiModelProperty(value = "项目消耗数")
+    private BigDecimal projConsumeCnt;
+
+    @ApiModelProperty(value = "服务时长")
+    private BigDecimal timeLength;
+
+    /**
+     * 当天销售总数量
+     */
+    @ApiModelProperty(hidden = true)
+    private Integer totalSaleCnt;
+
+    /**
+     * 家居产品成本
+     */
+    @ApiModelProperty(hidden = true)
+    private BigDecimal goodsCost;
+
+    /**
+     * 除家具产品以外成本
+     */
+    @ApiModelProperty(hidden = true)
+    private BigDecimal otherCost;
+
+    public Integer getTotalSaleCnt() {
+        return totalSaleCnt;
+    }
+
+    public void setTotalSaleCnt(Integer totalSaleCnt) {
+        this.totalSaleCnt = totalSaleCnt;
+    }
+
+    public BigDecimal getGoodsCost() {
+        return goodsCost;
+    }
+
+    public void setGoodsCost(BigDecimal goodsCost) {
+        this.goodsCost = goodsCost;
+    }
+
+    public BigDecimal getOtherCost() {
+        return otherCost;
+    }
+
+    public void setOtherCost(BigDecimal otherCost) {
+        this.otherCost = otherCost;
+    }
+
+    public String getDataTime() {
+        return dataTime;
+    }
+
+    public void setDataTime(String dataTime) {
+        this.dataTime = dataTime;
+    }
+
+    public BigDecimal getTotalPay() {
+        return totalPay;
+    }
+
+    public void setTotalPay(BigDecimal totalPay) {
+        this.totalPay = totalPay;
+    }
+
+    public BigDecimal getCashPay() {
+        return cashPay;
+    }
+
+    public void setCashPay(BigDecimal cashPay) {
+        this.cashPay = cashPay;
+    }
+
+    public BigDecimal getCardPay() {
+        return cardPay;
+    }
+
+    public void setCardPay(BigDecimal cardPay) {
+        this.cardPay = cardPay;
+    }
+
+    public BigDecimal getArrearsPay() {
+        return arrearsPay;
+    }
+
+    public void setArrearsPay(BigDecimal arrearsPay) {
+        this.arrearsPay = arrearsPay;
+    }
+
+    public BigDecimal getFreeConsumePay() {
+        return freeConsumePay;
+    }
+
+    public void setFreeConsumePay(BigDecimal freeConsumePay) {
+        this.freeConsumePay = freeConsumePay;
+    }
+
+    public BigDecimal getConsumePay() {
+        return consumePay;
+    }
+
+    public void setConsumePay(BigDecimal consumePay) {
+        this.consumePay = consumePay;
+    }
+
+    public BigDecimal getRefundCashPay() {
+        return refundCashPay;
+    }
+
+    public void setRefundCashPay(BigDecimal refundCashPay) {
+        this.refundCashPay = refundCashPay;
+    }
+
+    public BigDecimal getRefundCardPay() {
+        return refundCardPay;
+    }
+
+    public void setRefundCardPay(BigDecimal refundCardPay) {
+        this.refundCardPay = refundCardPay;
+    }
+
+    public BigDecimal getProductAchieve() {
+        return productAchieve;
+    }
+
+    public void setProductAchieve(BigDecimal productAchieve) {
+        this.productAchieve = productAchieve;
+    }
+
+    public BigDecimal getCardAchieve() {
+        return cardAchieve;
+    }
+
+    public void setCardAchieve(BigDecimal cardAchieve) {
+        this.cardAchieve = cardAchieve;
+    }
+
+    public BigDecimal getRefund() {
+        return refund;
+    }
+
+    public void setRefund(BigDecimal refund) {
+        this.refund = refund;
+    }
+
+    public BigDecimal getPerCustomCnt() {
+        return perCustomCnt;
+    }
+
+    public void setPerCustomCnt(BigDecimal perCustomCnt) {
+        this.perCustomCnt = perCustomCnt;
+    }
+
+    public BigDecimal getCustomGoodsCnt() {
+        if (BigDecimal.ZERO.compareTo(perCustomCnt) != 0) {
+            return new BigDecimal(totalSaleCnt).divide(perCustomCnt, 2, BigDecimal.ROUND_DOWN);
+        } else {
+            return BigDecimal.ZERO;
+        }
+    }
+
+    public void setCustomGoodsCnt(BigDecimal customGoodsCnt) {
+        this.customGoodsCnt = customGoodsCnt;
+    }
+
+    public BigDecimal getPerCustomPrice() {
+        if (perCustomCnt.compareTo(BigDecimal.ZERO) != 0) {
+            return totalPay.divide(perCustomCnt, 2, BigDecimal.ROUND_DOWN);
+        } else {
+            return BigDecimal.ZERO;
+        }
+    }
+
+    public void setPerCustomPrice(BigDecimal perCustomPrice) {
+        this.perCustomPrice = perCustomPrice;
+    }
+
+    public BigDecimal getCost() {
+        return goodsCost.add(otherCost);
+    }
+
+    public void setCost(BigDecimal cost) {
+        this.cost = cost;
+    }
+
+    public BigDecimal getGrossProfit() {
+        return totalPay.subtract(getCost());
+    }
+
+    public void setGrossProfit(BigDecimal grossProfit) {
+        this.grossProfit = grossProfit;
+    }
+
+    public BigDecimal getGrossProfitRate() {
+        if (totalPay.compareTo(BigDecimal.ZERO) != 0) {
+            return getGrossProfit().divide(totalPay, 2, BigDecimal.ROUND_DOWN);
+        } else {
+            return BigDecimal.ZERO;
+        }
+    }
+
+    public void setGrossProfitRate(BigDecimal grossProfitRate) {
+        this.grossProfitRate = grossProfitRate;
+    }
+
+    public BigDecimal getPeopleCnt() {
+        return peopleCnt == null ? BigDecimal.ZERO : peopleCnt.setScale(2, BigDecimal.ROUND_DOWN);
+    }
+
+    public void setPeopleCnt(BigDecimal peopleCnt) {
+        this.peopleCnt = peopleCnt;
+    }
+
+    public BigDecimal getProjConsumeCnt() {
+        return projConsumeCnt;
+    }
+
+    public void setProjConsumeCnt(BigDecimal projConsumeCnt) {
+        this.projConsumeCnt = projConsumeCnt;
+    }
+
+    public BigDecimal getTimeLength() {
+        return timeLength;
+    }
+
+    public void setTimeLength(BigDecimal timeLength) {
+        this.timeLength = timeLength;
+    }
+}
diff --git a/zq-erp/src/main/java/com/matrix/system/app/vo/OrderDetailAchieveItemVo.java b/zq-erp/src/main/java/com/matrix/system/app/vo/OrderDetailAchieveItemVo.java
new file mode 100644
index 0000000..25e67d1
--- /dev/null
+++ b/zq-erp/src/main/java/com/matrix/system/app/vo/OrderDetailAchieveItemVo.java
@@ -0,0 +1,36 @@
+package com.matrix.system.app.vo;
+
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+
+import java.math.BigDecimal;
+
+/**
+ * @author wzy
+ * @date 2020-12-23
+ **/
+@ApiModel(value = "OrderDetailAchieveItemVo", description = "订单明细业绩返回参数类")
+public class OrderDetailAchieveItemVo {
+
+    @ApiModelProperty(value = "姓名")
+    private String name;
+
+    @ApiModelProperty(value = "业绩")
+    private BigDecimal achieve;
+
+    public String getName() {
+        return name;
+    }
+
+    public void setName(String name) {
+        this.name = name;
+    }
+
+    public BigDecimal getAchieve() {
+        return achieve;
+    }
+
+    public void setAchieve(BigDecimal achieve) {
+        this.achieve = achieve;
+    }
+}
diff --git a/zq-erp/src/main/java/com/matrix/system/app/vo/OrderDetailItemVo.java b/zq-erp/src/main/java/com/matrix/system/app/vo/OrderDetailItemVo.java
new file mode 100644
index 0000000..6fb4768
--- /dev/null
+++ b/zq-erp/src/main/java/com/matrix/system/app/vo/OrderDetailItemVo.java
@@ -0,0 +1,125 @@
+package com.matrix.system.app.vo;
+
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+
+import java.math.BigDecimal;
+import java.util.List;
+
+/**
+ * @author wzy
+ * @date 2020-12-23
+ **/
+@ApiModel(value = "OrderDetailItemVo", description = "订单详情明细表")
+public class OrderDetailItemVo {
+
+    @ApiModelProperty(value = "id")
+    private Long id;
+
+    @ApiModelProperty(value = "商品名称")
+    private String goodsName;
+
+    @ApiModelProperty(value = "数量")
+    private String count;
+
+    @ApiModelProperty(value = "现金支付")
+    private BigDecimal cashPay;
+
+    @ApiModelProperty(value = "储值卡支付")
+    private BigDecimal cardPay;
+
+    @ApiModelProperty(value = "欠款")
+    private BigDecimal arrears;
+
+    @ApiModelProperty(value = "原价")
+    private BigDecimal price;
+
+    @ApiModelProperty(value = "折扣价格")
+    private BigDecimal zkPrice;
+
+    @ApiModelProperty(value = "支付状态")
+    private String status;
+
+    @ApiModelProperty(value = "订单业绩")
+    private List<OrderDetailAchieveItemVo> achieves;
+
+    public Long getId() {
+        return id;
+    }
+
+    public void setId(Long id) {
+        this.id = id;
+    }
+
+    public List<OrderDetailAchieveItemVo> getAchieves() {
+        return achieves;
+    }
+
+    public void setAchieves(List<OrderDetailAchieveItemVo> achieves) {
+        this.achieves = achieves;
+    }
+
+    public String getGoodsName() {
+        return goodsName;
+    }
+
+    public void setGoodsName(String goodsName) {
+        this.goodsName = goodsName;
+    }
+
+    public String getCount() {
+        return count;
+    }
+
+    public void setCount(String count) {
+        this.count = count;
+    }
+
+    public BigDecimal getCashPay() {
+        return cashPay;
+    }
+
+    public void setCashPay(BigDecimal cashPay) {
+        this.cashPay = cashPay;
+    }
+
+    public BigDecimal getCardPay() {
+        return cardPay;
+    }
+
+    public void setCardPay(BigDecimal cardPay) {
+        this.cardPay = cardPay;
+    }
+
+    public BigDecimal getPrice() {
+        return price;
+    }
+
+    public void setPrice(BigDecimal price) {
+        this.price = price;
+    }
+
+    public BigDecimal getZkPrice() {
+        return zkPrice;
+    }
+
+    public void setZkPrice(BigDecimal zkPrice) {
+        this.zkPrice = zkPrice;
+    }
+
+    public String getStatus() {
+        return status;
+    }
+
+    public void setStatus(String status) {
+        this.status = status;
+    }
+
+    public BigDecimal getArrears() {
+        return arrears;
+    }
+
+    public void setArrears(BigDecimal arrears) {
+        this.arrears = arrears;
+    }
+}
diff --git a/zq-erp/src/main/java/com/matrix/system/app/vo/OrderDetailVo.java b/zq-erp/src/main/java/com/matrix/system/app/vo/OrderDetailVo.java
new file mode 100644
index 0000000..205bcd7
--- /dev/null
+++ b/zq-erp/src/main/java/com/matrix/system/app/vo/OrderDetailVo.java
@@ -0,0 +1,184 @@
+package com.matrix.system.app.vo;
+
+import com.fasterxml.jackson.annotation.JsonFormat;
+import com.matrix.core.tools.DateUtil;
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+
+import java.math.BigDecimal;
+import java.util.Date;
+import java.util.List;
+
+/**
+ * @author wzy
+ * @date 2020-12-23
+ **/
+@ApiModel(value = "OrderDetailVo", description = "订单详情返回参数类")
+public class OrderDetailVo {
+
+    @ApiModelProperty(value = "订单ID")
+    private String orderId;
+
+    @ApiModelProperty(value = "会员ID")
+    private String vipId;
+
+    @ApiModelProperty(value = "会员姓名")
+    private String vipName;
+
+    @ApiModelProperty(value = "会员手机号")
+    private String phone;
+
+    @ApiModelProperty(value = "订单号")
+    private String orderNo;
+
+    @ApiModelProperty(value = "顾问姓名")
+    private String staffName;
+
+    @ApiModelProperty(value = "现金支付金额")
+    private BigDecimal cashPay;
+
+    @ApiModelProperty(value = "储值卡支付金额")
+    private BigDecimal cardPay;
+
+    @ApiModelProperty(value = "应付金额")
+    private BigDecimal needPay;
+
+    @ApiModelProperty(value = "实付金额")
+    private BigDecimal realPay;
+
+    @ApiModelProperty(value = "优惠金额")
+    private BigDecimal discount;
+
+    @ApiModelProperty(value = "订单明细")
+    private List<OrderDetailItemVo> items;
+
+    @ApiModelProperty(value = "订单状态")
+    private String orderStatus;
+
+    @ApiModelProperty(value = "欠款")
+    private BigDecimal arrears;
+
+    @JsonFormat(pattern = DateUtil.DATE_FORMAT_SS, timezone = "GMT+8")
+    @ApiModelProperty(value = "下单时间")
+    private Date orderTime;
+
+    public String getVipId() {
+        return vipId;
+    }
+
+    public void setVipId(String vipId) {
+        this.vipId = vipId;
+    }
+
+    public Date getOrderTime() {
+        return orderTime;
+    }
+
+    public void setOrderTime(Date orderTime) {
+        this.orderTime = orderTime;
+    }
+
+    public String getOrderId() {
+        return orderId;
+    }
+
+    public void setOrderId(String orderId) {
+        this.orderId = orderId;
+    }
+
+    public BigDecimal getArrears() {
+        return arrears;
+    }
+
+    public void setArrears(BigDecimal arrears) {
+        this.arrears = arrears;
+    }
+
+    public String getOrderStatus() {
+        return orderStatus;
+    }
+
+    public void setOrderStatus(String orderStatus) {
+        this.orderStatus = orderStatus;
+    }
+
+    public List<OrderDetailItemVo> getItems() {
+        return items;
+    }
+
+    public void setItems(List<OrderDetailItemVo> items) {
+        this.items = items;
+    }
+
+    public String getVipName() {
+        return vipName;
+    }
+
+    public void setVipName(String vipName) {
+        this.vipName = vipName;
+    }
+
+    public String getPhone() {
+        return phone;
+    }
+
+    public void setPhone(String phone) {
+        this.phone = phone;
+    }
+
+    public String getOrderNo() {
+        return orderNo;
+    }
+
+    public void setOrderNo(String orderNo) {
+        this.orderNo = orderNo;
+    }
+
+    public String getStaffName() {
+        return staffName;
+    }
+
+    public void setStaffName(String staffName) {
+        this.staffName = staffName;
+    }
+
+    public BigDecimal getCashPay() {
+        return cashPay;
+    }
+
+    public void setCashPay(BigDecimal cashPay) {
+        this.cashPay = cashPay;
+    }
+
+    public BigDecimal getCardPay() {
+        return cardPay;
+    }
+
+    public void setCardPay(BigDecimal cardPay) {
+        this.cardPay = cardPay;
+    }
+
+    public BigDecimal getNeedPay() {
+        return needPay;
+    }
+
+    public void setNeedPay(BigDecimal needPay) {
+        this.needPay = needPay;
+    }
+
+    public BigDecimal getRealPay() {
+        return realPay;
+    }
+
+    public void setRealPay(BigDecimal realPay) {
+        this.realPay = realPay;
+    }
+
+    public BigDecimal getDiscount() {
+        return discount;
+    }
+
+    public void setDiscount(BigDecimal discount) {
+        this.discount = discount;
+    }
+}
diff --git a/zq-erp/src/main/java/com/matrix/system/app/vo/QuestionVo.java b/zq-erp/src/main/java/com/matrix/system/app/vo/QuestionVo.java
new file mode 100644
index 0000000..35b08e6
--- /dev/null
+++ b/zq-erp/src/main/java/com/matrix/system/app/vo/QuestionVo.java
@@ -0,0 +1,88 @@
+package com.matrix.system.app.vo;
+
+import com.matrix.core.tools.StringUtils;
+import com.matrix.system.hive.bean.Answer;
+import com.matrix.system.hive.bean.VipAnswer;
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+
+import java.util.List;
+
+/**
+ * @author wzy
+ * @date 2020-12-28
+ **/
+@ApiModel(value = "QuestionVo", description = "会员档案返回参数类")
+public class QuestionVo {
+
+    @ApiModelProperty(value = "问题ID")
+    private Long id;
+
+    @ApiModelProperty(value = "问题")
+    private String question;
+
+    @ApiModelProperty(value = "类型 1-文本 输入框 2-单选 下拉框 3-多选 多选框 4-长文本 文本域 5-标题 只显示即可")
+    private String type;
+
+    @ApiModelProperty(value = "单选、多选的选项")
+    private List<Answer> answers;
+
+    @ApiModelProperty(value = "回显答案")
+    private VipAnswer vipAnswer;
+
+    public Long getId() {
+        return id;
+    }
+
+    public void setId(Long id) {
+        this.id = id;
+    }
+
+    public String getQuestion() {
+        return question;
+    }
+
+    public void setQuestion(String question) {
+        this.question = question;
+    }
+
+    public String getType() {
+        if (StringUtils.isNotBlank(type)) {
+            switch (type) {
+                case "文本" :
+                    return "1";
+                case "单选" :
+                    return "2";
+                case "多选" :
+                    return "3";
+                case "长文本" :
+                    return "4";
+                case "标题" :
+                    return "5";
+                default:
+                    return "6";
+            }
+        }
+        return type;
+    }
+
+    public void setType(String type) {
+        this.type = type;
+    }
+
+    public List<Answer> getAnswers() {
+        return answers;
+    }
+
+    public void setAnswers(List<Answer> answers) {
+        this.answers = answers;
+    }
+
+    public VipAnswer getVipAnswer() {
+        return vipAnswer;
+    }
+
+    public void setVipAnswer(VipAnswer vipAnswer) {
+        this.vipAnswer = vipAnswer;
+    }
+}
diff --git a/zq-erp/src/main/java/com/matrix/system/app/vo/RankingVo.java b/zq-erp/src/main/java/com/matrix/system/app/vo/RankingVo.java
new file mode 100644
index 0000000..38ebab8
--- /dev/null
+++ b/zq-erp/src/main/java/com/matrix/system/app/vo/RankingVo.java
@@ -0,0 +1,69 @@
+package com.matrix.system.app.vo;
+
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+
+import java.math.BigDecimal;
+
+/**
+ * @author wzy
+ * @date 2020-12-28
+ **/
+@ApiModel(value = "RankingVo", description = "排行榜返回参数类")
+public class RankingVo {
+
+    @ApiModelProperty(value = "姓名")
+    private String name;
+
+    @ApiModelProperty(value = "头像")
+    private String photo;
+
+    @ApiModelProperty(value = "金额")
+    private BigDecimal amount;
+
+    @ApiModelProperty(value = "店铺名称")
+    private String shopName;
+
+    @ApiModelProperty(value = "员工ID")
+    private Long id;
+
+    public String getShopName() {
+        return shopName;
+    }
+
+    public void setShopName(String shopName) {
+        this.shopName = shopName;
+    }
+
+    public String getName() {
+        return name;
+    }
+
+    public void setName(String name) {
+        this.name = name;
+    }
+
+    public String getPhoto() {
+        return photo;
+    }
+
+    public void setPhoto(String photo) {
+        this.photo = photo;
+    }
+
+    public BigDecimal getAmount() {
+        return amount == null ? amount : amount.setScale(BigDecimal.ROUND_DOWN, 2);
+    }
+
+    public void setAmount(BigDecimal amount) {
+        this.amount = amount;
+    }
+
+    public Long getId() {
+        return id;
+    }
+
+    public void setId(Long id) {
+        this.id = id;
+    }
+}
diff --git a/zq-erp/src/main/java/com/matrix/system/app/vo/ServiceOrderDetailItemVo.java b/zq-erp/src/main/java/com/matrix/system/app/vo/ServiceOrderDetailItemVo.java
new file mode 100644
index 0000000..18220b4
--- /dev/null
+++ b/zq-erp/src/main/java/com/matrix/system/app/vo/ServiceOrderDetailItemVo.java
@@ -0,0 +1,107 @@
+package com.matrix.system.app.vo;
+
+import com.fasterxml.jackson.annotation.JsonFormat;
+import com.matrix.core.tools.DateUtil;
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+
+import java.math.BigDecimal;
+import java.util.Date;
+
+/**
+ * @author wzy
+ * @date 2020-12-25
+ **/
+@ApiModel(value = "ServiceOrderDetailItemVo", description = "服务单详情接口参数返回类")
+public class ServiceOrderDetailItemVo {
+
+    @ApiModelProperty(value = "名称")
+    private String name;
+
+    @ApiModelProperty(value = "数量")
+    private Integer count;
+
+    @ApiModelProperty(value = "价格")
+    private BigDecimal price;
+
+    @JsonFormat(pattern = DateUtil.DATE_FORMAT_MM, timezone = "GMT+8")
+    @ApiModelProperty(value = "服务开始时间")
+    private Date beginTime;
+
+    @JsonFormat(pattern = DateUtil.DATE_FORMAT_MM, timezone = "GMT+8")
+    @ApiModelProperty(value = "服务结束时间")
+    private Date endTime;
+
+    @ApiModelProperty(value = "时长")
+    private Integer timeLength;
+
+    @ApiModelProperty(value = "美疗师")
+    private String beautyName;
+
+    @ApiModelProperty(value = "提成")
+    private BigDecimal commission;
+
+    public String getName() {
+        return name;
+    }
+
+    public void setName(String name) {
+        this.name = name;
+    }
+
+    public Integer getCount() {
+        return count;
+    }
+
+    public void setCount(Integer count) {
+        this.count = count;
+    }
+
+    public BigDecimal getPrice() {
+        return price;
+    }
+
+    public void setPrice(BigDecimal price) {
+        this.price = price;
+    }
+
+    public Date getBeginTime() {
+        return beginTime;
+    }
+
+    public void setBeginTime(Date beginTime) {
+        this.beginTime = beginTime;
+    }
+
+    public Date getEndTime() {
+        return endTime;
+    }
+
+    public void setEndTime(Date endTime) {
+        this.endTime = endTime;
+    }
+
+    public Integer getTimeLength() {
+        return timeLength;
+    }
+
+    public void setTimeLength(Integer timeLength) {
+        this.timeLength = timeLength;
+    }
+
+    public String getBeautyName() {
+        return beautyName;
+    }
+
+    public void setBeautyName(String beautyName) {
+        this.beautyName = beautyName;
+    }
+
+    public BigDecimal getCommission() {
+        return commission;
+    }
+
+    public void setCommission(BigDecimal commission) {
+        this.commission = commission;
+    }
+}
diff --git a/zq-erp/src/main/java/com/matrix/system/app/vo/ServiceOrderDetailVo.java b/zq-erp/src/main/java/com/matrix/system/app/vo/ServiceOrderDetailVo.java
new file mode 100644
index 0000000..1fc5a89
--- /dev/null
+++ b/zq-erp/src/main/java/com/matrix/system/app/vo/ServiceOrderDetailVo.java
@@ -0,0 +1,140 @@
+package com.matrix.system.app.vo;
+
+import com.fasterxml.jackson.annotation.JsonFormat;
+import com.matrix.core.tools.DateUtil;
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+
+import java.util.Date;
+import java.util.List;
+
+/**
+ * @author wzy
+ * @date 2020-12-25
+ **/
+@ApiModel(value = "ServiceOrderDetailVo", description = "服务单详情返回参数类")
+public class ServiceOrderDetailVo {
+
+    @ApiModelProperty(value = "服务单号")
+    private String serviceNo;
+
+    @ApiModelProperty(value = "会员姓名")
+    private String vipName;
+
+    @ApiModelProperty(value = "手机号")
+    private String phone;
+
+    @JsonFormat(pattern = DateUtil.DATE_FORMAT_MM, timezone = "GMT+8")
+    @ApiModelProperty(value = "预约时间")
+    private Date yyTime;
+
+    @ApiModelProperty(value = "床位")
+    private String bedName;
+
+    @ApiModelProperty(value = "配料师傅")
+    private String plsName;
+
+    @ApiModelProperty(value = "服务总时长")
+    private Integer totalTime;
+
+    @ApiModelProperty(value = "下单顾问")
+    private String staffName;
+
+    @ApiModelProperty(value = "服务单状态")
+    private String status;
+
+    @ApiModelProperty(value = "服务单评论")
+    private String comment;
+
+
+    @ApiModelProperty(value = "服务明细")
+    private List<ServiceOrderDetailItemVo> items;
+
+    public String getComment() {
+        return comment;
+    }
+
+    public void setComment(String comment) {
+        this.comment = comment;
+    }
+
+    public String getServiceNo() {
+        return serviceNo;
+    }
+
+    public void setServiceNo(String serviceNo) {
+        this.serviceNo = serviceNo;
+    }
+
+    public String getVipName() {
+        return vipName;
+    }
+
+    public void setVipName(String vipName) {
+        this.vipName = vipName;
+    }
+
+    public String getPhone() {
+        return phone;
+    }
+
+    public void setPhone(String phone) {
+        this.phone = phone;
+    }
+
+    public Date getYyTime() {
+        return yyTime;
+    }
+
+    public void setYyTime(Date yyTime) {
+        this.yyTime = yyTime;
+    }
+
+    public String getBedName() {
+        return bedName;
+    }
+
+    public void setBedName(String bedName) {
+        this.bedName = bedName;
+    }
+
+    public String getPlsName() {
+        return plsName;
+    }
+
+    public void setPlsName(String plsName) {
+        this.plsName = plsName;
+    }
+
+    public Integer getTotalTime() {
+        return totalTime;
+    }
+
+    public void setTotalTime(Integer totalTime) {
+        this.totalTime = totalTime;
+    }
+
+    public String getStaffName() {
+        return staffName;
+    }
+
+    public void setStaffName(String staffName) {
+        this.staffName = staffName;
+    }
+
+    public String getStatus() {
+        return status;
+    }
+
+    public void setStatus(String status) {
+        this.status = status;
+    }
+
+    public List<ServiceOrderDetailItemVo> getItems() {
+        return items;
+    }
+
+    public void setItems(List<ServiceOrderDetailItemVo> items) {
+        this.items = items;
+    }
+}
diff --git a/zq-erp/src/main/java/com/matrix/system/app/vo/ServiceOrderListProjVo.java b/zq-erp/src/main/java/com/matrix/system/app/vo/ServiceOrderListProjVo.java
new file mode 100644
index 0000000..beb6247
--- /dev/null
+++ b/zq-erp/src/main/java/com/matrix/system/app/vo/ServiceOrderListProjVo.java
@@ -0,0 +1,47 @@
+package com.matrix.system.app.vo;
+
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+
+/**
+ * @author wzy
+ * @date 2020-12-24
+ **/
+@ApiModel(value = "ServiceOrderListProjVo", description = "服务单列表项目返回参数类")
+public class ServiceOrderListProjVo {
+
+    @ApiModelProperty(value = "美疗师ID")
+    private Long id;
+
+    @ApiModelProperty(value = "项目名称")
+    private String projName;
+
+    @ApiModelProperty(value = "美疗师")
+    private String beautyName;
+
+
+
+    public Long getId() {
+        return id;
+    }
+
+    public void setId(Long id) {
+        this.id = id;
+    }
+
+    public String getProjName() {
+        return projName;
+    }
+
+    public void setProjName(String projName) {
+        this.projName = projName;
+    }
+
+    public String getBeautyName() {
+        return beautyName;
+    }
+
+    public void setBeautyName(String beautyName) {
+        this.beautyName = beautyName;
+    }
+}
diff --git a/zq-erp/src/main/java/com/matrix/system/app/vo/ServiceOrderListVo.java b/zq-erp/src/main/java/com/matrix/system/app/vo/ServiceOrderListVo.java
new file mode 100644
index 0000000..59561f0
--- /dev/null
+++ b/zq-erp/src/main/java/com/matrix/system/app/vo/ServiceOrderListVo.java
@@ -0,0 +1,170 @@
+package com.matrix.system.app.vo;
+
+import com.fasterxml.jackson.annotation.JsonFormat;
+import com.matrix.core.tools.DateUtil;
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+
+import java.util.Date;
+import java.util.List;
+
+/**
+ * @author wzy
+ * @date 2020-12-24
+ **/
+@ApiModel(value = "ServiceOrderListVo", description = "服务单列表返回参数类")
+public class ServiceOrderListVo {
+
+    @ApiModelProperty(value = "服务单Id")
+    private Long id;
+
+    @ApiModelProperty(value = "会员ID")
+    private Long vipId;
+
+    @ApiModelProperty(value = "下单顾问ID")
+    private Long createStaffId;
+
+    @ApiModelProperty(value = "服务单编号")
+    private String serviceNo;
+
+    @JsonFormat(pattern = DateUtil.DATE_FORMAT_MM, timezone = "GMT+8")
+    @ApiModelProperty(value = "预约时间")
+    private Date time;
+
+    @ApiModelProperty(value = "会员名称")
+    private String vipName;
+
+    @ApiModelProperty(value = "门店名称")
+    private String shopName;
+
+    @ApiModelProperty(value = "服务时长")
+    private Integer timeLength;
+
+    @ApiModelProperty(value = "床位")
+    private String bed;
+
+    @ApiModelProperty(value = "状态 1-待预约 2-待派单 3-待配料 4-待服务 5-服务中 6-服务完成 7-服务单结束")
+    private String status;
+
+    @ApiModelProperty(value = "服务项目信息")
+    private List<ServiceOrderListProjVo> projs;
+
+    public Long getVipId() {
+        return vipId;
+    }
+
+    public void setVipId(Long vipId) {
+        this.vipId = vipId;
+    }
+
+    public Long getCreateStaffId() {
+        return createStaffId;
+    }
+
+    public void setCreateStaffId(Long createStaffId) {
+        this.createStaffId = createStaffId;
+    }
+
+    public List<ServiceOrderListProjVo> getProjs() {
+        return projs;
+    }
+
+    public void setProjs(List<ServiceOrderListProjVo> projs) {
+        this.projs = projs;
+    }
+
+    public Long getId() {
+        return id;
+    }
+
+    public void setId(Long id) {
+        this.id = id;
+    }
+
+    public String getServiceNo() {
+        return serviceNo;
+    }
+
+    public void setServiceNo(String serviceNo) {
+        this.serviceNo = serviceNo;
+    }
+
+    public Date getTime() {
+        return time;
+    }
+
+    public void setTime(Date time) {
+        this.time = time;
+    }
+
+    public String getVipName() {
+        return vipName;
+    }
+
+    public void setVipName(String vipName) {
+        this.vipName = vipName;
+    }
+
+    public Integer getTimeLength() {
+        return timeLength;
+    }
+
+    public void setTimeLength(Integer timeLength) {
+        this.timeLength = timeLength;
+    }
+
+    public String getBed() {
+        return bed;
+    }
+
+    public void setBed(String bed) {
+        this.bed = bed;
+    }
+
+    public String getStatus() {
+        return status;
+    }
+
+    public String getShopName() {
+        return shopName;
+    }
+
+    public void setShopName(String shopName) {
+        this.shopName = shopName;
+    }
+
+    public void setStatus(String status) {
+        switch (status) {
+            case "待预约" :
+                this.status = "1";
+                break;
+            case "预约成功待处理" :
+                this.status = "2";
+                break;
+            case "需配料" :
+                this.status = "3";
+                break;
+            case "配料完成" :
+                this.status = "4";
+                break;
+            case "服务中" :
+                this.status = "5";
+                break;
+            case "服务完成" :
+                this.status = "6";
+                break;
+            case "服务单结束" :
+                this.status = "7";
+                break;
+            case "预约取消" :
+                this.status = "8";
+                break;
+            case "待确认" :
+                this.status = "9";
+                break;
+            default:
+                this.status = "0";
+                break;
+        }
+    }
+}
diff --git a/zq-erp/src/main/java/com/matrix/system/app/vo/ServiceProductListVo.java b/zq-erp/src/main/java/com/matrix/system/app/vo/ServiceProductListVo.java
new file mode 100644
index 0000000..467fd32
--- /dev/null
+++ b/zq-erp/src/main/java/com/matrix/system/app/vo/ServiceProductListVo.java
@@ -0,0 +1,58 @@
+package com.matrix.system.app.vo;
+
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+
+import java.util.List;
+
+/**
+ * @author wzy
+ * @date 2020-12-24
+ **/
+@ApiModel(value = "ServiceProjListVo", description = "用户产品列表")
+public class ServiceProductListVo {
+
+    @ApiModelProperty(value = "会员ID")
+    private Long vipId;
+
+    @ApiModelProperty(value = "会员名称")
+    private String name;
+
+    @ApiModelProperty(value = "项目列表")
+    private List<ServiceProjVo> proj;
+
+    @ApiModelProperty(value = "套餐列表")
+    private List<ServiceTcVo> composeProj;
+
+    public Long getVipId() {
+        return vipId;
+    }
+
+    public void setVipId(Long vipId) {
+        this.vipId = vipId;
+    }
+
+    public List<ServiceProjVo> getProj() {
+        return proj;
+    }
+
+    public void setProj(List<ServiceProjVo> proj) {
+        this.proj = proj;
+    }
+
+    public List<ServiceTcVo> getComposeProj() {
+        return composeProj;
+    }
+
+    public void setComposeProj(List<ServiceTcVo> composeProj) {
+        this.composeProj = composeProj;
+    }
+
+    public String getName() {
+        return name;
+    }
+
+    public void setName(String name) {
+        this.name = name;
+    }
+}
diff --git a/zq-erp/src/main/java/com/matrix/system/app/vo/ServiceProjVo.java b/zq-erp/src/main/java/com/matrix/system/app/vo/ServiceProjVo.java
new file mode 100644
index 0000000..13decc4
--- /dev/null
+++ b/zq-erp/src/main/java/com/matrix/system/app/vo/ServiceProjVo.java
@@ -0,0 +1,115 @@
+package com.matrix.system.app.vo;
+
+import com.fasterxml.jackson.annotation.JsonFormat;
+import com.matrix.core.tools.DateUtil;
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+
+import java.util.Date;
+
+/**
+ * @author wzy
+ * @date 2020-12-24
+ **/
+@ApiModel(value = "ServiceProjVo", description = "用户项目返回参数类")
+public class ServiceProjVo {
+
+    @ApiModelProperty(value = "id")
+    private Long id;
+
+    @ApiModelProperty(value = "订单ID")
+    private Long projId;
+
+    @ApiModelProperty(value = "商品名称")
+    private String name;
+
+    @ApiModelProperty(value = "时长")
+    private Integer timeLength;
+
+    @JsonFormat(pattern = DateUtil.DATE_FORMAT_DD, timezone = "GMT+8")
+    @ApiModelProperty(value = "有效期")
+    private Date invalidTime;
+
+    @ApiModelProperty(value = "剩余数量")
+    private Integer count;
+
+    @ApiModelProperty(value = "图片")
+    private String img;
+
+    @ApiModelProperty(value = "快过期 1-是 2-否")
+    private String isInvalid;
+
+    public String getIsInvalid() {
+        Date date = DateUtil.getDateAfterMonth(new Date(), 1);
+        if (invalidTime != null) {
+            if (new Date().after(invalidTime)) {
+                return "3";
+            }
+
+            if (date.after(invalidTime)) {
+                return "1";
+            }
+        }
+        return "2";
+    }
+
+    public void setIsInvalid(String isInvalid) {
+        this.isInvalid = isInvalid;
+    }
+
+    public String getName() {
+        return name;
+    }
+
+    public void setName(String name) {
+        this.name = name;
+    }
+
+    public Integer getTimeLength() {
+        return timeLength;
+    }
+
+    public void setTimeLength(Integer timeLength) {
+        this.timeLength = timeLength;
+    }
+
+    public Long getProjId() {
+        return projId;
+    }
+
+    public void setProjId(Long projId) {
+        this.projId = projId;
+    }
+
+    public Date getInvalidTime() {
+        return invalidTime;
+    }
+
+    public void setInvalidTime(Date invalidTime) {
+        this.invalidTime = invalidTime;
+    }
+
+    public Integer getCount() {
+        return count;
+    }
+
+    public void setCount(Integer count) {
+        this.count = count;
+    }
+
+    public String getImg() {
+        return img;
+    }
+
+    public void setImg(String img) {
+        this.img = img;
+    }
+
+    public Long getId() {
+        return id;
+    }
+
+    public void setId(Long id) {
+        this.id = id;
+    }
+}
diff --git a/zq-erp/src/main/java/com/matrix/system/app/vo/ServiceTcVo.java b/zq-erp/src/main/java/com/matrix/system/app/vo/ServiceTcVo.java
new file mode 100644
index 0000000..9c9cb10
--- /dev/null
+++ b/zq-erp/src/main/java/com/matrix/system/app/vo/ServiceTcVo.java
@@ -0,0 +1,126 @@
+package com.matrix.system.app.vo;
+
+import com.fasterxml.jackson.annotation.JsonFormat;
+import com.matrix.core.tools.DateUtil;
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+
+import java.util.Date;
+import java.util.List;
+
+/**
+ * @author wzy
+ * @date 2020-12-24
+ **/
+@ApiModel(value = "ServiceTcVo", description = "用户套餐返回参数类")
+public class ServiceTcVo {
+    @ApiModelProperty(hidden = true)
+    private Long id;
+
+    @ApiModelProperty(value = "商品ID")
+    private Long projId;
+
+    @ApiModelProperty(value = "套餐名称")
+    private String name;
+
+    @JsonFormat(pattern = DateUtil.DATE_FORMAT_DD, timezone = "GMT+8")
+    @ApiModelProperty(value = "有效期")
+    private Date invalidTime;
+
+    @ApiModelProperty(value = "剩余数量")
+    private String count;
+
+    @ApiModelProperty(value = "固定/任选套餐 Y-任选 N-固定")
+    private String isCourse;
+
+    @ApiModelProperty(value = "若套餐为任选套餐 则判断是否无限次 Y是 N否")
+    private String isInfinite;
+
+    @ApiModelProperty(value = "套餐内产品")
+    List<ServiceProjVo> proj;
+
+    @ApiModelProperty(value = "快过期 1-是 2-否")
+    private String isInvalid;
+
+    public String getIsInvalid() {
+        Date date = DateUtil.getDateAfterMonth(new Date(), 1);
+        if (invalidTime != null) {
+            if (new Date().after(invalidTime)) {
+                return "3";
+            }
+
+            if (date.after(invalidTime)) {
+                return "1";
+            }
+        }
+        return "2";
+    }
+
+    public void setIsInvalid(String isInvalid) {
+        this.isInvalid = isInvalid;
+    }
+
+    public Long getId() {
+        return id;
+    }
+
+    public void setId(Long id) {
+        this.id = id;
+    }
+
+    public Long getProjId() {
+        return projId;
+    }
+
+    public void setProjId(Long projId) {
+        this.projId = projId;
+    }
+
+    public String getName() {
+        return name;
+    }
+
+    public void setName(String name) {
+        this.name = name;
+    }
+
+    public Date getInvalidTime() {
+        return invalidTime;
+    }
+
+    public void setInvalidTime(Date invalidTime) {
+        this.invalidTime = invalidTime;
+    }
+
+    public String getCount() {
+        return count;
+    }
+
+    public void setCount(String count) {
+        this.count = count;
+    }
+
+    public String getIsCourse() {
+        return isCourse;
+    }
+
+    public void setIsCourse(String isCourse) {
+        this.isCourse = isCourse;
+    }
+
+    public String getIsInfinite() {
+        return isInfinite;
+    }
+
+    public void setIsInfinite(String isInfinite) {
+        this.isInfinite = isInfinite;
+    }
+
+    public List<ServiceProjVo> getProj() {
+        return proj;
+    }
+
+    public void setProj(List<ServiceProjVo> proj) {
+        this.proj = proj;
+    }
+}
diff --git a/zq-erp/src/main/java/com/matrix/system/app/vo/ShoppingGoodsDetailVo.java b/zq-erp/src/main/java/com/matrix/system/app/vo/ShoppingGoodsDetailVo.java
new file mode 100644
index 0000000..5ef3256
--- /dev/null
+++ b/zq-erp/src/main/java/com/matrix/system/app/vo/ShoppingGoodsDetailVo.java
@@ -0,0 +1,225 @@
+package com.matrix.system.app.vo;
+
+import com.matrix.system.hive.bean.ShoppingGoodsCategory;
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+
+import java.math.BigDecimal;
+import java.util.List;
+
+/**
+ * @author wzy
+ * @date 2020-12-24
+ **/
+@ApiModel(value = "ShoppingGoodsDetailVo", description = "商品详情返回参数类")
+public class ShoppingGoodsDetailVo {
+
+    @ApiModelProperty(value = "商品编号")
+    private String goodsNo;
+
+    @ApiModelProperty(value = "商品名称")
+    private String goodsName;
+
+    @ApiModelProperty(value = "销售价格")
+    private BigDecimal salePrice;
+
+    @ApiModelProperty(value = "销量")
+    private Integer saleCnt;
+
+    @ApiModelProperty(value = "主图")
+    private String img;
+
+    @ApiModelProperty(value = "详情")
+    private String desc;
+
+    @ApiModelProperty(value = "商品类型")
+    private String goodsType;
+
+    @ApiModelProperty(value = "容积")
+    private Integer volume;
+
+    @ApiModelProperty(value = "规格")
+    private String measure;
+
+    @ApiModelProperty(value = "最大销售数量")
+    private Integer maxSaleCnt;
+
+    @ApiModelProperty(value = "每人限购次数")
+    private String limitBuyCnt;
+
+    @ApiModelProperty(value = "充值卡使用范围 是-所有产品 否-部分产品")
+    private String carIsAll;
+
+    @ApiModelProperty(value = "赠送金额")
+    private BigDecimal giftPrice;
+
+    @ApiModelProperty(value = "固定/任选套餐 Y-任选 N-固定")
+    private String isCourse;
+
+    @ApiModelProperty(value = "最大使用次数")
+    private Integer maxUseCnt;
+
+    @ApiModelProperty(value = "项目关联产品--配料表、卡项可消费产品")
+    List<ShoppingGoodsDetailVo> assembleProj;
+
+    @ApiModelProperty(value = "套餐项目权益")
+    List<ShoppingGoodsDetailVo> assembleTaocanProj;
+
+    @ApiModelProperty(value = "套餐产品权益")
+    List<ShoppingGoodsDetailVo> assembleTaocanProduct;
+
+    @ApiModelProperty(value = "卡项产品可消费类型")
+    List<ShoppingGoodsCategory> cardCategory;
+
+    public BigDecimal getGiftPrice() {
+        return giftPrice;
+    }
+
+    public void setGiftPrice(BigDecimal giftPrice) {
+        this.giftPrice = giftPrice;
+    }
+
+    public String getCarIsAll() {
+        return carIsAll;
+    }
+
+    public void setCarIsAll(String carIsAll) {
+        this.carIsAll = carIsAll;
+    }
+
+    public String getGoodsNo() {
+        return goodsNo;
+    }
+
+    public void setGoodsNo(String goodsNo) {
+        this.goodsNo = goodsNo;
+    }
+
+    public String getGoodsName() {
+        return goodsName;
+    }
+
+    public void setGoodsName(String goodsName) {
+        this.goodsName = goodsName;
+    }
+
+    public BigDecimal getSalePrice() {
+        return salePrice;
+    }
+
+    public void setSalePrice(BigDecimal salePrice) {
+        this.salePrice = salePrice;
+    }
+
+    public Integer getSaleCnt() {
+        return saleCnt;
+    }
+
+    public void setSaleCnt(Integer saleCnt) {
+        this.saleCnt = saleCnt;
+    }
+
+    public String getImg() {
+        return img;
+    }
+
+    public void setImg(String img) {
+        this.img = img;
+    }
+
+    public String getDesc() {
+        return desc;
+    }
+
+    public void setDesc(String desc) {
+        this.desc = desc;
+    }
+
+    public String getGoodsType() {
+        return goodsType;
+    }
+
+    public void setGoodsType(String goodsType) {
+        this.goodsType = goodsType;
+    }
+
+    public Integer getVolume() {
+        return volume;
+    }
+
+    public void setVolume(Integer volume) {
+        this.volume = volume;
+    }
+
+    public String getMeasure() {
+        return measure;
+    }
+
+    public void setMeasure(String measure) {
+        this.measure = measure;
+    }
+
+    public Integer getMaxSaleCnt() {
+        return maxSaleCnt;
+    }
+
+    public void setMaxSaleCnt(Integer maxSaleCnt) {
+        this.maxSaleCnt = maxSaleCnt;
+    }
+
+    public String getLimitBuyCnt() {
+        return limitBuyCnt;
+    }
+
+    public void setLimitBuyCnt(String limitBuyCnt) {
+        this.limitBuyCnt = limitBuyCnt;
+    }
+
+    public List<ShoppingGoodsDetailVo> getAssembleProj() {
+        return assembleProj;
+    }
+
+    public void setAssembleProj(List<ShoppingGoodsDetailVo> assembleProj) {
+        this.assembleProj = assembleProj;
+    }
+
+    public List<ShoppingGoodsDetailVo> getAssembleTaocanProj() {
+        return assembleTaocanProj;
+    }
+
+    public void setAssembleTaocanProj(List<ShoppingGoodsDetailVo> assembleTaocanProj) {
+        this.assembleTaocanProj = assembleTaocanProj;
+    }
+
+    public List<ShoppingGoodsDetailVo> getAssembleTaocanProduct() {
+        return assembleTaocanProduct;
+    }
+
+    public void setAssembleTaocanProduct(List<ShoppingGoodsDetailVo> assembleTaocanProduct) {
+        this.assembleTaocanProduct = assembleTaocanProduct;
+    }
+
+    public List<ShoppingGoodsCategory> getCardCategory() {
+        return cardCategory;
+    }
+
+    public void setCardCategory(List<ShoppingGoodsCategory> cardCategory) {
+        this.cardCategory = cardCategory;
+    }
+
+    public String getIsCourse() {
+        return isCourse;
+    }
+
+    public void setIsCourse(String isCourse) {
+        this.isCourse = isCourse;
+    }
+
+    public Integer getMaxUseCnt() {
+        return maxUseCnt;
+    }
+
+    public void setMaxUseCnt(Integer maxUseCnt) {
+        this.maxUseCnt = maxUseCnt;
+    }
+}
diff --git a/zq-erp/src/main/java/com/matrix/system/app/vo/ShoppingGoodsListVo.java b/zq-erp/src/main/java/com/matrix/system/app/vo/ShoppingGoodsListVo.java
new file mode 100644
index 0000000..ae87478
--- /dev/null
+++ b/zq-erp/src/main/java/com/matrix/system/app/vo/ShoppingGoodsListVo.java
@@ -0,0 +1,118 @@
+package com.matrix.system.app.vo;
+
+import com.matrix.system.hive.bean.ShoppingGoods;
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+
+import java.math.BigDecimal;
+
+/**
+ * @author wzy
+ * @date 2020-12-23
+ **/
+@ApiModel(value = "ShoppingGoodsListVo", description = "商品列表返回类")
+public class ShoppingGoodsListVo {
+
+    @ApiModelProperty(value = "商品ID")
+    private Long id;
+
+    @ApiModelProperty(value = "商品编号")
+    private String goodsCode;
+
+    @ApiModelProperty(value = "商品名称")
+    private String name;
+
+    @ApiModelProperty(value = "商品价格")
+    private BigDecimal price;
+
+    @ApiModelProperty(value = "是否赠送")
+    private String isPresent;
+
+    @ApiModelProperty(value = "商品规格")
+    private String unit;
+
+    @ApiModelProperty(value = "计量单位")
+    private String measure;
+
+    @ApiModelProperty(value = "商品图片")
+    private String img;
+
+    @ApiModelProperty(value = "商品类型")
+    private String goodsType;
+
+    public String getGoodsType() {
+        return goodsType;
+    }
+
+    public void setGoodsType(String goodsType) {
+        this.goodsType = goodsType;
+    }
+
+    public Long getId() {
+        return id;
+    }
+
+    public void setId(Long id) {
+        this.id = id;
+    }
+
+    public String getGoodsCode() {
+        return goodsCode;
+    }
+
+    public void setGoodsCode(String goodsCode) {
+        this.goodsCode = goodsCode;
+    }
+
+    public String getName() {
+        return name;
+    }
+
+    public void setName(String name) {
+        this.name = name;
+    }
+
+    public BigDecimal getPrice() {
+        return price;
+    }
+
+    public void setPrice(BigDecimal price) {
+        this.price = price;
+    }
+
+    public String getIsPresent() {
+        return isPresent;
+    }
+
+    public void setIsPresent(String isPresent) {
+        if ("是".equals(isPresent)) {
+            this.isPresent = "1";
+        } else {
+            this.isPresent = "0";
+        }
+    }
+
+    public String getUnit() {
+        return unit;
+    }
+
+    public void setUnit(String unit) {
+        this.unit = unit;
+    }
+
+    public String getMeasure() {
+        return measure;
+    }
+
+    public void setMeasure(String measure) {
+        this.measure = measure;
+    }
+
+    public String getImg() {
+        return img;
+    }
+
+    public void setImg(String img) {
+        this.img = img;
+    }
+}
diff --git a/zq-erp/src/main/java/com/matrix/system/app/vo/SkinCheckAnalysisItems.java b/zq-erp/src/main/java/com/matrix/system/app/vo/SkinCheckAnalysisItems.java
new file mode 100644
index 0000000..2f1806f
--- /dev/null
+++ b/zq-erp/src/main/java/com/matrix/system/app/vo/SkinCheckAnalysisItems.java
@@ -0,0 +1,77 @@
+package com.matrix.system.app.vo;
+
+import com.matrix.system.shopXcx.bean.ShopProduct;
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+
+import java.util.List;
+
+@ApiModel(value = "SkinCheckAnalysisItems", description = "问题分析返回接口类")
+public class SkinCheckAnalysisItems {
+
+    @ApiModelProperty(value = "图片")
+    private String img;
+
+    @ApiModelProperty(value = "标题")
+    private String title;
+
+    @ApiModelProperty(value = "问题分析")
+    private String analysis;
+
+    @ApiModelProperty(value = "解决办法")
+    private String solution;
+
+    @ApiModelProperty(hidden = true)
+    private String productIds;
+
+    @ApiModelProperty(value = "产品列表")
+    private List<String> products;
+
+    public String getProductIds() {
+        return productIds;
+    }
+
+    public void setProductIds(String productIds) {
+        this.productIds = productIds;
+    }
+
+    public String getImg() {
+        return img;
+    }
+
+    public void setImg(String img) {
+        this.img = img;
+    }
+
+    public String getTitle() {
+        return title;
+    }
+
+    public void setTitle(String title) {
+        this.title = title;
+    }
+
+    public String getAnalysis() {
+        return analysis;
+    }
+
+    public void setAnalysis(String analysis) {
+        this.analysis = analysis;
+    }
+
+    public String getSolution() {
+        return solution;
+    }
+
+    public void setSolution(String solution) {
+        this.solution = solution;
+    }
+
+    public List<String> getProducts() {
+        return products;
+    }
+
+    public void setProducts(List<String> products) {
+        this.products = products;
+    }
+}
diff --git a/zq-erp/src/main/java/com/matrix/system/app/vo/SkinCheckDetailVo.java b/zq-erp/src/main/java/com/matrix/system/app/vo/SkinCheckDetailVo.java
new file mode 100644
index 0000000..cec1053
--- /dev/null
+++ b/zq-erp/src/main/java/com/matrix/system/app/vo/SkinCheckDetailVo.java
@@ -0,0 +1,80 @@
+package com.matrix.system.app.vo;
+
+import com.fasterxml.jackson.annotation.JsonFormat;
+import com.matrix.core.tools.DateUtil;
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+
+import java.util.Date;
+import java.util.List;
+
+@ApiModel(value = "SkinCheckDetailVo", description = "皮肤检测详情返回接口类")
+public class SkinCheckDetailVo {
+
+    @ApiModelProperty(value = "会员姓名")
+    private String vipName;
+
+    @ApiModelProperty(value = "头像")
+    private String photo;
+
+    @ApiModelProperty(value = "性别")
+    private String sex;
+
+    @JsonFormat(pattern = DateUtil.DATE_FORMAT_DD, timezone = "GMT+8")
+    @ApiModelProperty(value = "检测时间")
+    private Date checkTime;
+
+    @ApiModelProperty(value = "诊断结果")
+    List<SkinCheckDiagnoseItemVo> diagnoseItems;
+
+    @ApiModelProperty(value = "问题分析")
+    List<SkinCheckAnalysisItems> analysisItems;
+
+    public String getVipName() {
+        return vipName;
+    }
+
+    public void setVipName(String vipName) {
+        this.vipName = vipName;
+    }
+
+    public String getPhoto() {
+        return photo;
+    }
+
+    public void setPhoto(String photo) {
+        this.photo = photo;
+    }
+
+    public String getSex() {
+        return sex;
+    }
+
+    public void setSex(String sex) {
+        this.sex = sex;
+    }
+
+    public Date getCheckTime() {
+        return checkTime;
+    }
+
+    public void setCheckTime(Date checkTime) {
+        this.checkTime = checkTime;
+    }
+
+    public List<SkinCheckDiagnoseItemVo> getDiagnoseItems() {
+        return diagnoseItems;
+    }
+
+    public void setDiagnoseItems(List<SkinCheckDiagnoseItemVo> diagnoseItems) {
+        this.diagnoseItems = diagnoseItems;
+    }
+
+    public List<SkinCheckAnalysisItems> getAnalysisItems() {
+        return analysisItems;
+    }
+
+    public void setAnalysisItems(List<SkinCheckAnalysisItems> analysisItems) {
+        this.analysisItems = analysisItems;
+    }
+}
diff --git a/zq-erp/src/main/java/com/matrix/system/app/vo/SkinCheckDiagnoseItemVo.java b/zq-erp/src/main/java/com/matrix/system/app/vo/SkinCheckDiagnoseItemVo.java
new file mode 100644
index 0000000..1f5cbcc
--- /dev/null
+++ b/zq-erp/src/main/java/com/matrix/system/app/vo/SkinCheckDiagnoseItemVo.java
@@ -0,0 +1,31 @@
+package com.matrix.system.app.vo;
+
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+
+@ApiModel(value = "SkinCheckDiagnoseItemVo", description = "诊断结果返回参数类")
+public class SkinCheckDiagnoseItemVo {
+
+    @ApiModelProperty(value = "标题")
+    private String title;
+
+    @ApiModelProperty(value = "百分比")
+    private Double percentage;
+
+    public String getTitle() {
+        return title;
+    }
+
+    public void setTitle(String title) {
+        this.title = title;
+    }
+
+
+    public Double getPercentage() {
+        return percentage;
+    }
+
+    public void setPercentage(Double percentage) {
+        this.percentage = percentage;
+    }
+}
diff --git a/zq-erp/src/main/java/com/matrix/system/app/vo/SkinCheckListVo.java b/zq-erp/src/main/java/com/matrix/system/app/vo/SkinCheckListVo.java
new file mode 100644
index 0000000..7e3e292
--- /dev/null
+++ b/zq-erp/src/main/java/com/matrix/system/app/vo/SkinCheckListVo.java
@@ -0,0 +1,69 @@
+package com.matrix.system.app.vo;
+
+import com.fasterxml.jackson.annotation.JsonFormat;
+import com.matrix.core.tools.DateUtil;
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+
+import java.util.Date;
+
+@ApiModel(value = "SkinCheckListVo", description = "皮肤检测列表返回参数类")
+public class SkinCheckListVo {
+
+    @ApiModelProperty(value = "id")
+    private Long id;
+
+    @ApiModelProperty(value = "标题")
+    private String title;
+
+    @ApiModelProperty(value = "检测人员")
+    private String checkUserName;
+
+    @ApiModelProperty(value = "检测门店")
+    private String shopName;
+
+    @JsonFormat(pattern = DateUtil.DATE_FORMAT_DD, timezone = "GMT+8")
+    @ApiModelProperty(value = "检测时间")
+    private Date checkTime;
+
+    public Long getId() {
+        return id;
+    }
+
+    public void setId(Long id) {
+        this.id = id;
+    }
+
+
+    public String getCheckUserName() {
+        return checkUserName;
+    }
+
+    public void setCheckUserName(String checkUserName) {
+        this.checkUserName = checkUserName;
+    }
+
+    public String getShopName() {
+        return shopName;
+    }
+
+    public void setShopName(String shopName) {
+        this.shopName = shopName;
+    }
+
+    public Date getCheckTime() {
+        return checkTime;
+    }
+
+    public void setCheckTime(Date checkTime) {
+        this.checkTime = checkTime;
+    }
+
+    public String getTitle() {
+        return title;
+    }
+
+    public void setTitle(String title) {
+        this.title = title;
+    }
+}
diff --git a/zq-erp/src/main/java/com/matrix/system/app/vo/StoreInOutListVo.java b/zq-erp/src/main/java/com/matrix/system/app/vo/StoreInOutListVo.java
new file mode 100644
index 0000000..5790656
--- /dev/null
+++ b/zq-erp/src/main/java/com/matrix/system/app/vo/StoreInOutListVo.java
@@ -0,0 +1,62 @@
+package com.matrix.system.app.vo;
+
+import com.fasterxml.jackson.annotation.JsonFormat;
+import com.matrix.core.tools.DateUtil;
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+
+import java.math.BigDecimal;
+import java.util.Date;
+
+/**
+ * @author wzy
+ * @date 2020-12-27
+ **/
+@ApiModel(value = "StoreInOutListVo", description = "商品出入库返回参数类")
+public class StoreInOutListVo {
+
+    @ApiModelProperty(value = "详情")
+    private String content;
+
+    @ApiModelProperty(value = "单号")
+    private String orderNo;
+
+    @ApiModelProperty(value = "数量")
+    private BigDecimal amount;
+
+    @JsonFormat(pattern = DateUtil.DATE_FORMAT_MM, timezone = "GMT+8")
+    @ApiModelProperty(value = "出入库时间")
+    private Date createTime;
+
+    public String getContent() {
+        return content;
+    }
+
+    public void setContent(String content) {
+        this.content = content;
+    }
+
+    public String getOrderNo() {
+        return orderNo;
+    }
+
+    public void setOrderNo(String orderNo) {
+        this.orderNo = orderNo;
+    }
+
+    public BigDecimal getAmount() {
+        return amount;
+    }
+
+    public void setAmount(BigDecimal amount) {
+        this.amount = amount;
+    }
+
+    public Date getCreateTime() {
+        return createTime;
+    }
+
+    public void setCreateTime(Date createTime) {
+        this.createTime = createTime;
+    }
+}
diff --git a/zq-erp/src/main/java/com/matrix/system/app/vo/StoreListVo.java b/zq-erp/src/main/java/com/matrix/system/app/vo/StoreListVo.java
new file mode 100644
index 0000000..954964b
--- /dev/null
+++ b/zq-erp/src/main/java/com/matrix/system/app/vo/StoreListVo.java
@@ -0,0 +1,67 @@
+package com.matrix.system.app.vo;
+
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+
+/**
+ * @author wzy
+ * @date 2020-12-27
+ **/
+@ApiModel(value = "StoreListVo", description = "库存列表返回参数类")
+public class StoreListVo {
+
+    @ApiModelProperty(value = "商品名称")
+    private String goodsName;
+
+    @ApiModelProperty(value = "商品编号")
+    private String goodsCode;
+
+    @ApiModelProperty(value = "在库数量")
+    private Integer storeTotal;
+
+    @ApiModelProperty(value = "警戒值")
+    private Integer alarmNum;
+
+    @ApiModelProperty(value = "图片")
+    private String img;
+
+    public String getGoodsName() {
+        return goodsName;
+    }
+
+    public void setGoodsName(String goodsName) {
+        this.goodsName = goodsName;
+    }
+
+    public String getGoodsCode() {
+        return goodsCode;
+    }
+
+    public void setGoodsCode(String goodsCode) {
+        this.goodsCode = goodsCode;
+    }
+
+    public Integer getStoreTotal() {
+        return storeTotal;
+    }
+
+    public void setStoreTotal(Integer storeTotal) {
+        this.storeTotal = storeTotal;
+    }
+
+    public Integer getAlarmNum() {
+        return alarmNum;
+    }
+
+    public void setAlarmNum(Integer alarmNum) {
+        this.alarmNum = alarmNum;
+    }
+
+    public String getImg() {
+        return img;
+    }
+
+    public void setImg(String img) {
+        this.img = img;
+    }
+}
diff --git a/zq-erp/src/main/java/com/matrix/system/app/vo/UserAchieveVo.java b/zq-erp/src/main/java/com/matrix/system/app/vo/UserAchieveVo.java
new file mode 100644
index 0000000..216c609
--- /dev/null
+++ b/zq-erp/src/main/java/com/matrix/system/app/vo/UserAchieveVo.java
@@ -0,0 +1,91 @@
+package com.matrix.system.app.vo;
+
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+
+import java.math.BigDecimal;
+
+/**
+ * @author wzy
+ * @date 2020-12-21
+ **/
+@ApiModel(value = "UserAchieveVo", description = "员工业绩返回类")
+public class UserAchieveVo {
+
+    @ApiModelProperty(value = "用户ID")
+    private Long id;
+
+    @ApiModelProperty(value = "现金业绩")
+    private BigDecimal orderCash;
+
+    @ApiModelProperty(value = "划扣业绩")
+    private BigDecimal cash;
+
+    @ApiModelProperty(value = "业绩提成")
+    private BigDecimal cardUse;
+
+    @ApiModelProperty(value = "本金消耗")
+    private BigDecimal hisConsume;
+
+    @ApiModelProperty(value = "赠送消耗")
+    private BigDecimal freeConsume;
+
+    @ApiModelProperty(value = "服务提成")
+    private BigDecimal projCommission;
+
+    public Long getId() {
+        return id;
+    }
+
+    public void setId(Long id) {
+        this.id = id;
+    }
+
+    public BigDecimal getOrderCash() {
+        return orderCash;
+    }
+
+    public void setOrderCash(BigDecimal orderCash) {
+        this.orderCash = orderCash;
+    }
+
+    public BigDecimal getCash() {
+        return cash;
+    }
+
+    public void setCash(BigDecimal cash) {
+        this.cash = cash;
+    }
+
+    public BigDecimal getHisConsume() {
+        return hisConsume;
+    }
+
+    public void setHisConsume(BigDecimal hisConsume) {
+        this.hisConsume = hisConsume;
+    }
+
+    public BigDecimal getFreeConsume() {
+        return freeConsume;
+    }
+
+    public void setFreeConsume(BigDecimal freeConsume) {
+        this.freeConsume = freeConsume;
+    }
+
+    public BigDecimal getCardUse() {
+        return cardUse;
+    }
+
+    public void setCardUse(BigDecimal cardUse) {
+        this.cardUse = cardUse;
+    }
+
+    public BigDecimal getProjCommission() {
+        return projCommission;
+    }
+
+    public void setProjCommission(BigDecimal projCommission) {
+        this.projCommission = projCommission;
+    }
+}
diff --git a/zq-erp/src/main/java/com/matrix/system/app/vo/UserInfoDetailVo.java b/zq-erp/src/main/java/com/matrix/system/app/vo/UserInfoDetailVo.java
new file mode 100644
index 0000000..e7b1b39
--- /dev/null
+++ b/zq-erp/src/main/java/com/matrix/system/app/vo/UserInfoDetailVo.java
@@ -0,0 +1,116 @@
+package com.matrix.system.app.vo;
+
+import com.fasterxml.jackson.annotation.JsonFormat;
+import com.matrix.core.tools.DateUtil;
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+
+import java.util.Date;
+
+/**
+ * @author wzy
+ * @date 2021-01-06
+ **/
+@ApiModel(value = "UserInfoDetailVo", description = "获取当前登陆用户详情接口返回参数类")
+public class UserInfoDetailVo {
+
+    @ApiModelProperty(value = "头像")
+    private String photo;
+
+    @ApiModelProperty(value = "姓名")
+    private String name;
+
+    @ApiModelProperty(value = "英文名")
+    private String engName;
+
+    @ApiModelProperty(value = "手机号")
+    private String telphone;
+
+    @ApiModelProperty(value = "性别")
+    private String sex;
+
+    @JsonFormat(pattern = DateUtil.DATE_FORMAT_DD, timezone = "GMT+8")
+    @ApiModelProperty(value = "生日")
+    private Date birthday;
+
+    @ApiModelProperty(value = "邮箱")
+    private String email;
+
+    @ApiModelProperty(value = "服务签名")
+    private String serviceSign;
+
+    @ApiModelProperty(value = "地址")
+    private String address;
+
+    public String getPhoto() {
+        return photo;
+    }
+
+    public void setPhoto(String photo) {
+        this.photo = photo;
+    }
+
+    public String getName() {
+        return name;
+    }
+
+    public void setName(String name) {
+        this.name = name;
+    }
+
+    public String getEngName() {
+        return engName;
+    }
+
+    public void setEngName(String engName) {
+        this.engName = engName;
+    }
+
+    public String getTelphone() {
+        return telphone;
+    }
+
+    public void setTelphone(String telphone) {
+        this.telphone = telphone;
+    }
+
+    public String getSex() {
+        return sex;
+    }
+
+    public void setSex(String sex) {
+        this.sex = sex;
+    }
+
+    public Date getBirthday() {
+        return birthday;
+    }
+
+    public void setBirthday(Date birthday) {
+        this.birthday = birthday;
+    }
+
+    public String getEmail() {
+        return email;
+    }
+
+    public void setEmail(String email) {
+        this.email = email;
+    }
+
+    public String getServiceSign() {
+        return serviceSign;
+    }
+
+    public void setServiceSign(String serviceSign) {
+        this.serviceSign = serviceSign;
+    }
+
+    public String getAddress() {
+        return address;
+    }
+
+    public void setAddress(String address) {
+        this.address = address;
+    }
+}
diff --git a/zq-erp/src/main/java/com/matrix/system/app/vo/UserInfoVo.java b/zq-erp/src/main/java/com/matrix/system/app/vo/UserInfoVo.java
new file mode 100644
index 0000000..105bd58
--- /dev/null
+++ b/zq-erp/src/main/java/com/matrix/system/app/vo/UserInfoVo.java
@@ -0,0 +1,67 @@
+package com.matrix.system.app.vo;
+
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+
+/**
+ * @author wzy
+ * @date 2020-12-21
+ **/
+@ApiModel(value = "UserInfoVo", description = "用户信息返回类")
+public class UserInfoVo {
+
+    @ApiModelProperty(value = "用户ID", example = "1")
+    private Long id;
+
+    @ApiModelProperty(value = "用户名称", example = "呵呵")
+    private String name;
+
+    @ApiModelProperty(value = "职位", example = "店长")
+    private String roleName;
+
+    @ApiModelProperty(value = "头像", example = "--")
+    private String photo;
+
+    @ApiModelProperty(value = "门店名称")
+    private String shopName;
+
+    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;
+    }
+
+    public String getRoleName() {
+        return roleName;
+    }
+
+    public void setRoleName(String roleName) {
+        this.roleName = roleName;
+    }
+
+    public String getPhoto() {
+        return photo;
+    }
+
+    public void setPhoto(String photo) {
+        this.photo = photo;
+    }
+
+    public String getShopName() {
+        return shopName;
+    }
+
+    public void setShopName(String shopName) {
+        this.shopName = shopName;
+    }
+}
diff --git a/zq-erp/src/main/java/com/matrix/system/app/vo/VipAchieveDataShowVo.java b/zq-erp/src/main/java/com/matrix/system/app/vo/VipAchieveDataShowVo.java
new file mode 100644
index 0000000..a2abe3a
--- /dev/null
+++ b/zq-erp/src/main/java/com/matrix/system/app/vo/VipAchieveDataShowVo.java
@@ -0,0 +1,147 @@
+package com.matrix.system.app.vo;
+
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+
+import java.math.BigDecimal;
+
+/**
+ * @author wzy
+ * @date 2020-12-31
+ **/
+@ApiModel(value = "VipAchieveDataShowVo", description = "员工业绩返回参数类")
+public class VipAchieveDataShowVo {
+
+    @ApiModelProperty(value = "时间")
+    private String time;
+
+    @ApiModelProperty(value = "订单业绩")
+    private BigDecimal orderAmount;
+
+    @ApiModelProperty(value = "现金业绩")
+    private BigDecimal cashAmount;
+
+    @ApiModelProperty(hidden = true)
+    private BigDecimal cardAmount;
+
+    @ApiModelProperty(value = "订单提成")
+    private BigDecimal goodsAmount;
+
+    @ApiModelProperty(value = "划扣业绩")
+    private BigDecimal cardUseAmount;
+
+    @ApiModelProperty(value = "本金消耗")
+    private BigDecimal hisConsume;
+
+    @ApiModelProperty(value = "赠送消耗")
+    private BigDecimal freeConsume;
+
+    @ApiModelProperty(value = "服务提成")
+    private BigDecimal commission;
+
+    @ApiModelProperty(value = "人头数")
+    private BigDecimal peopleNum;
+
+    @ApiModelProperty(value = "项目数")
+    private Integer projNum;
+
+    @ApiModelProperty(value = "服务时长")
+    private Integer serviceTime;
+
+
+    public String getTime() {
+        return time;
+    }
+
+    public void setTime(String time) {
+        this.time = time;
+    }
+
+    public BigDecimal getOrderAmount() {
+        return orderAmount;
+    }
+
+    public void setOrderAmount(BigDecimal orderAmount) {
+        this.orderAmount = orderAmount;
+    }
+
+    public BigDecimal getCashAmount() {
+        return cashAmount;
+    }
+
+    public void setCashAmount(BigDecimal cashAmount) {
+        this.cashAmount = cashAmount;
+    }
+
+    public BigDecimal getCardAmount() {
+        return cardAmount;
+    }
+
+    public void setCardAmount(BigDecimal cardAmount) {
+        this.cardAmount = cardAmount;
+    }
+
+    public BigDecimal getGoodsAmount() {
+        return goodsAmount;
+    }
+
+    public void setGoodsAmount(BigDecimal goodsAmount) {
+        this.goodsAmount = goodsAmount;
+    }
+
+    public BigDecimal getCardUseAmount() {
+        return cardUseAmount;
+    }
+
+    public void setCardUseAmount(BigDecimal cardUseAmount) {
+        this.cardUseAmount = cardUseAmount;
+    }
+
+    public BigDecimal getHisConsume() {
+        return hisConsume;
+    }
+
+    public void setHisConsume(BigDecimal hisConsume) {
+        this.hisConsume = hisConsume;
+    }
+
+    public BigDecimal getFreeConsume() {
+        return freeConsume;
+    }
+
+    public void setFreeConsume(BigDecimal freeConsume) {
+        this.freeConsume = freeConsume;
+    }
+
+    public BigDecimal getCommission() {
+        return commission;
+    }
+
+    public void setCommission(BigDecimal commission) {
+        this.commission = commission;
+    }
+
+    public BigDecimal getPeopleNum() {
+        return peopleNum == null ? peopleNum : peopleNum.setScale(2, BigDecimal.ROUND_DOWN);
+    }
+
+    public void setPeopleNum(BigDecimal peopleNum) {
+        this.peopleNum = peopleNum;
+    }
+
+    public Integer getProjNum() {
+        return projNum;
+    }
+
+    public void setProjNum(Integer projNum) {
+        this.projNum = projNum;
+    }
+
+    public Integer getServiceTime() {
+        return serviceTime;
+    }
+
+    public void setServiceTime(Integer serviceTime) {
+        this.serviceTime = serviceTime;
+    }
+}
diff --git a/zq-erp/src/main/java/com/matrix/system/app/vo/VipCardListVo.java b/zq-erp/src/main/java/com/matrix/system/app/vo/VipCardListVo.java
new file mode 100644
index 0000000..1098de9
--- /dev/null
+++ b/zq-erp/src/main/java/com/matrix/system/app/vo/VipCardListVo.java
@@ -0,0 +1,78 @@
+package com.matrix.system.app.vo;
+
+import com.fasterxml.jackson.annotation.JsonFormat;
+import com.matrix.core.tools.DateUtil;
+import com.matrix.system.constance.Dictionary;
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+
+import java.math.BigDecimal;
+import java.util.Date;
+
+/**
+ * @author wzy
+ * @date 2020-12-28
+ **/
+@ApiModel(value = "VipCardListVo", description = "会员卡项列表")
+public class VipCardListVo {
+
+    @ApiModelProperty(value = "卡项名称")
+    private String cardName;
+
+    @ApiModelProperty(value = "现有金额")
+    private BigDecimal realMoney;
+
+    @ApiModelProperty(value = "赠送金额")
+    private BigDecimal giftMoney;
+
+    @ApiModelProperty(value = "状态 1-有效 2-无效")
+    private String status;
+
+    @JsonFormat(pattern = DateUtil.DATE_FORMAT_DD, timezone = "GMT+8")
+    @ApiModelProperty(value = "有效时间")
+    private Date failTime;
+
+    public String getCardName() {
+        return cardName;
+    }
+
+    public void setCardName(String cardName) {
+        this.cardName = cardName;
+    }
+
+    public BigDecimal getRealMoney() {
+        return realMoney;
+    }
+
+    public void setRealMoney(BigDecimal realMoney) {
+        this.realMoney = realMoney;
+    }
+
+    public BigDecimal getGiftMoney() {
+        return giftMoney;
+    }
+
+    public void setGiftMoney(BigDecimal giftMoney) {
+        this.giftMoney = giftMoney;
+    }
+
+    public String getStatus() {
+        return status;
+    }
+
+    public void setStatus(String status) {
+        if (Dictionary.MONEYCARD_STATUS_YX.equals(status)) {
+            this.status = "1";
+        } else {
+            this.status = "2";
+        }
+    }
+
+    public Date getFailTime() {
+        return failTime;
+    }
+
+    public void setFailTime(Date failTime) {
+        this.failTime = failTime;
+    }
+}
diff --git a/zq-erp/src/main/java/com/matrix/system/app/vo/VipInfoDetailVo.java b/zq-erp/src/main/java/com/matrix/system/app/vo/VipInfoDetailVo.java
new file mode 100644
index 0000000..ea25f93
--- /dev/null
+++ b/zq-erp/src/main/java/com/matrix/system/app/vo/VipInfoDetailVo.java
@@ -0,0 +1,195 @@
+package com.matrix.system.app.vo;
+
+import com.fasterxml.jackson.annotation.JsonFormat;
+import com.matrix.core.tools.DateUtil;
+import com.matrix.system.hive.bean.SysVipLabel;
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+
+import java.util.Date;
+import java.util.List;
+
+/**
+ * @author wzy
+ * @date 2020-12-22
+ **/
+@ApiModel(value = "VipInfoDetailVo", description = "客户详细信息接口返回类")
+public class VipInfoDetailVo {
+
+    @ApiModelProperty(value = "头像")
+    private String photo;
+
+    @ApiModelProperty(value = "资金密码")
+    private String password;
+
+    @ApiModelProperty(value = "会员ID")
+    private Long id;
+
+    @ApiModelProperty(value = "会员编号")
+    private String vipNo;
+
+    @ApiModelProperty(value = "会员姓名")
+    private String vipName;
+
+    @ApiModelProperty(value = "手机号")
+    private String phone;
+
+    @ApiModelProperty(value = "性别")
+    private String sex;
+
+    @ApiModelProperty(value = "生日")
+    @JsonFormat(pattern = DateUtil.DATE_FORMAT_DD, timezone = "GMT+8")
+    private Date birthday;
+
+    @ApiModelProperty(value = "省")
+    private String province;
+
+    @ApiModelProperty(value = "市")
+    private String city;
+
+    @ApiModelProperty(value = "区")
+    private String area;
+
+    @ApiModelProperty(value = "详细地址")
+    private String address;
+
+    @ApiModelProperty(value = "到店途径")
+    private String arrivalWay;
+
+    @ApiModelProperty(value = "推荐人ID")
+    private Long recommendId;
+
+    @ApiModelProperty(value = "备注")
+    private String remark;
+
+    @ApiModelProperty(value = "标签")
+    private List<SysVipLabel> labels;
+
+    public List<SysVipLabel> getLabels() {
+        return labels;
+    }
+
+    public void setLabels(List<SysVipLabel> labels) {
+        this.labels = labels;
+    }
+
+    public String getVipNo() {
+        return vipNo;
+    }
+
+    public void setVipNo(String vipNo) {
+        this.vipNo = vipNo;
+    }
+
+    public Long getId() {
+        return id;
+    }
+
+    public void setId(Long id) {
+        this.id = id;
+    }
+
+    public String getVipName() {
+        return vipName;
+    }
+
+    public void setVipName(String vipName) {
+        this.vipName = vipName;
+    }
+
+    public String getPhone() {
+        return phone;
+    }
+
+    public void setPhone(String phone) {
+        this.phone = phone;
+    }
+
+    public String getSex() {
+        return sex;
+    }
+
+    public void setSex(String sex) {
+        this.sex = sex;
+    }
+
+    public Date getBirthday() {
+        return birthday;
+    }
+
+    public void setBirthday(Date birthday) {
+        this.birthday = birthday;
+    }
+
+    public String getProvince() {
+        return province;
+    }
+
+    public void setProvince(String province) {
+        this.province = province;
+    }
+
+    public String getCity() {
+        return city;
+    }
+
+    public void setCity(String city) {
+        this.city = city;
+    }
+
+    public String getArea() {
+        return area;
+    }
+
+    public void setArea(String area) {
+        this.area = area;
+    }
+
+    public String getAddress() {
+        return address;
+    }
+
+    public void setAddress(String address) {
+        this.address = address;
+    }
+
+    public String getArrivalWay() {
+        return arrivalWay;
+    }
+
+    public void setArrivalWay(String arrivalWay) {
+        this.arrivalWay = arrivalWay;
+    }
+
+    public Long getRecommendId() {
+        return recommendId;
+    }
+
+    public void setRecommendId(Long recommendId) {
+        this.recommendId = recommendId;
+    }
+
+    public String getRemark() {
+        return remark;
+    }
+
+    public void setRemark(String remark) {
+        this.remark = remark;
+    }
+
+    public String getPhoto() {
+        return photo;
+    }
+
+    public void setPhoto(String photo) {
+        this.photo = photo;
+    }
+
+    public String getPassword() {
+        return password;
+    }
+
+    public void setPassword(String password) {
+        this.password = password;
+    }
+}
diff --git a/zq-erp/src/main/java/com/matrix/system/app/vo/VipInfoListVo.java b/zq-erp/src/main/java/com/matrix/system/app/vo/VipInfoListVo.java
new file mode 100644
index 0000000..04cfadd
--- /dev/null
+++ b/zq-erp/src/main/java/com/matrix/system/app/vo/VipInfoListVo.java
@@ -0,0 +1,90 @@
+package com.matrix.system.app.vo;
+
+import com.matrix.system.hive.bean.SysVipLevel;
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+
+/**
+ * @author wzy
+ * @date 2020-12-22
+ **/
+@ApiModel(value = "VipInfoListVo", description = "会员列表返回类")
+public class VipInfoListVo {
+
+    @ApiModelProperty(value = "会员姓名")
+    private String vipName;
+
+    @ApiModelProperty(value = "会员手机号")
+    private String phone;
+
+    @ApiModelProperty(value = "到店次数")
+    private Integer arriveCnt;
+
+    @ApiModelProperty(value = "头像")
+    private String photo;
+
+    @ApiModelProperty(value = "会员ID")
+    private Long id;
+
+    @ApiModelProperty(value = "门店简称")
+    private String shopName;
+
+    @ApiModelProperty(value = "会员等级对象")
+    private String vipLevel;
+
+    public String getVipName() {
+        return vipName;
+    }
+
+    public void setVipName(String vipName) {
+        this.vipName = vipName;
+    }
+
+    public String getPhone() {
+        return phone;
+    }
+
+    public void setPhone(String phone) {
+        this.phone = phone;
+    }
+
+    public Integer getArriveCnt() {
+        return arriveCnt;
+    }
+
+    public void setArriveCnt(Integer arriveCnt) {
+        this.arriveCnt = arriveCnt;
+    }
+
+    public String getPhoto() {
+        return photo;
+    }
+
+    public void setPhoto(String photo) {
+        this.photo = photo;
+    }
+
+    public Long getId() {
+        return id;
+    }
+
+    public void setId(Long id) {
+        this.id = id;
+    }
+
+    public String getShopName() {
+        return shopName;
+    }
+
+    public void setShopName(String shopName) {
+        this.shopName = shopName;
+    }
+
+    public String getVipLevel() {
+        return vipLevel;
+    }
+
+    public void setVipLevel(String vipLevel) {
+        this.vipLevel = vipLevel;
+    }
+}
diff --git a/zq-erp/src/main/java/com/matrix/system/app/vo/VipInfoVo.java b/zq-erp/src/main/java/com/matrix/system/app/vo/VipInfoVo.java
new file mode 100644
index 0000000..325c469
--- /dev/null
+++ b/zq-erp/src/main/java/com/matrix/system/app/vo/VipInfoVo.java
@@ -0,0 +1,125 @@
+package com.matrix.system.app.vo;
+
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+
+import java.math.BigDecimal;
+
+/**
+ * @author wzy
+ * @date 2020-12-22
+ **/
+@ApiModel(value = "VipInfoVo", description = "客户信息返回类")
+public class VipInfoVo {
+
+    @ApiModelProperty(value = "头像")
+    private String photo;
+
+    @ApiModelProperty(value = "会员名称")
+    private String vipName;
+
+    @ApiModelProperty(value = "手机号")
+    private String phone;
+
+    @ApiModelProperty(value = "会员级别")
+    private String vipLevel;
+
+    @ApiModelProperty(value = "会员编号")
+    private String vipNo;
+
+    @ApiModelProperty(value = "总余额")
+    private BigDecimal totalBalance;
+
+    @ApiModelProperty(value = "赠送余额")
+    private BigDecimal giftBalance;
+
+    @ApiModelProperty(value = "积分")
+    private Integer integral;
+
+    @ApiModelProperty(value = "门店名称")
+    private String shopName;
+
+    @ApiModelProperty(value = "累计消费")
+    private BigDecimal totalShopping;
+
+
+    public String getPhoto() {
+        return photo;
+    }
+
+    public void setPhoto(String photo) {
+        this.photo = photo;
+    }
+
+    public String getVipName() {
+        return vipName;
+    }
+
+    public void setVipName(String vipName) {
+        this.vipName = vipName;
+    }
+
+    public String getPhone() {
+        return phone;
+    }
+
+    public void setPhone(String phone) {
+        this.phone = phone;
+    }
+
+    public String getVipLevel() {
+        return vipLevel;
+    }
+
+    public void setVipLevel(String vipLevel) {
+        this.vipLevel = vipLevel;
+    }
+
+    public String getVipNo() {
+        return vipNo;
+    }
+
+    public void setVipNo(String vipNo) {
+        this.vipNo = vipNo;
+    }
+
+    public BigDecimal getTotalBalance() {
+        return totalBalance.setScale(2, BigDecimal.ROUND_DOWN);
+    }
+
+    public void setTotalBalance(BigDecimal totalBalance) {
+        this.totalBalance = totalBalance;
+    }
+
+    public BigDecimal getGiftBalance() {
+        return giftBalance.setScale(2, BigDecimal.ROUND_DOWN);
+    }
+
+    public void setGiftBalance(BigDecimal giftBalance) {
+        this.giftBalance = giftBalance;
+    }
+
+    public Integer getIntegral() {
+        return integral;
+    }
+
+    public void setIntegral(Integer integral) {
+        this.integral = integral;
+    }
+
+    public String getShopName() {
+        return shopName;
+    }
+
+    public void setShopName(String shopName) {
+        this.shopName = shopName;
+    }
+
+    public BigDecimal getTotalShopping() {
+        return totalShopping;
+    }
+
+    public void setTotalShopping(BigDecimal totalShopping) {
+        this.totalShopping = totalShopping;
+    }
+}
diff --git a/zq-erp/src/main/java/com/matrix/system/common/actions/AdminAction.java b/zq-erp/src/main/java/com/matrix/system/common/actions/AdminAction.java
index f1b1260..8a8dbd6 100644
--- a/zq-erp/src/main/java/com/matrix/system/common/actions/AdminAction.java
+++ b/zq-erp/src/main/java/com/matrix/system/common/actions/AdminAction.java
@@ -139,15 +139,34 @@
         SysUsers loginUser = WebUtil.getSessionAttribute(MatrixConstance.LOGIN_KEY);
         loginUser.setCreateBy(loginUser.getSuName());
         sysUsers.setCompanyId(loginUser.getCompanyId());
-        sysUsers.setShopId(loginUser.getShopId());
         int i = sysUsersService.addAdmin(sysUsers);
-
         if (i > 0) {
             return new AjaxResult(AjaxResult.STATUS_SUCCESS, SystemMessageCode.ADD_SUCCES, AppVocabularyCode.ADMIN);
         } else {
             throw new GlobleException(SystemErrorCode.DATA_ADD_FAIL);
         }
     }
+
+    /**
+     * 新增门店管理员
+     */
+    @RemoveRequestToken
+    @PostMapping(value = "/addShopAdmin")
+    public @ResponseBody
+    AjaxResult addShopAdmin(SysUsers sysUsers) {
+
+        SysUsers loginUser = WebUtil.getSessionAttribute(MatrixConstance.LOGIN_KEY);
+        loginUser.setCreateBy(loginUser.getSuName());
+        sysUsers.setCompanyId(loginUser.getCompanyId());
+        sysUsers.setShopId(loginUser.getShopId());
+        int i = sysUsersService.addAdmin(sysUsers);
+        if (i > 0) {
+            return new AjaxResult(AjaxResult.STATUS_SUCCESS, SystemMessageCode.ADD_SUCCES, AppVocabularyCode.ADMIN);
+        } else {
+            throw new GlobleException(SystemErrorCode.DATA_ADD_FAIL);
+        }
+    }
+
 
     /**
      * 修改公司管理员
@@ -177,6 +196,8 @@
             throw new GlobleException(SystemErrorCode.DATA_UPDATE_FAIL);
         }
     }
+
+
 
 
     @RequestMapping(value = "/goStaffEditForm")
@@ -414,6 +435,15 @@
         return result;
     }
 
+    @RequestMapping(value = "/getUserById")
+    public @ResponseBody
+    AjaxResult getUserById(Long id) {
+        AjaxResult result = AjaxResult.buildSuccessInstance("");
+        SysUsers user = sysUsersService.findById(id);
+        result.putInMap("user", user);
+        return result;
+    }
+
 
     /**
      * 条件查询所有员工,不分页
diff --git a/zq-erp/src/main/java/com/matrix/system/common/actions/CustomerDictionaryAction.java b/zq-erp/src/main/java/com/matrix/system/common/actions/CustomerDictionaryAction.java
index f41b1b5..6052076 100644
--- a/zq-erp/src/main/java/com/matrix/system/common/actions/CustomerDictionaryAction.java
+++ b/zq-erp/src/main/java/com/matrix/system/common/actions/CustomerDictionaryAction.java
@@ -111,6 +111,10 @@
     @RequestMapping(value = "/modifyDataDictionary")
     public @ResponseBody
     AjaxResult modifyDataDictionary(CustomerDataDictionary newDataDictionary) {
+        // 自己不能是自己的父节点
+        if (newDataDictionary.getParentId() != null && newDataDictionary.getParentId().equals(newDataDictionary.getId())) {
+            throw new GlobleException("父级不能是自己");
+        }
         dataDictionaryDao.updateByModel(newDataDictionary);
         return new AjaxResult(AjaxResult.STATUS_SUCCESS, SystemMessageCode.UPDATE_SUCCES, "数据字典");
 
diff --git a/zq-erp/src/main/java/com/matrix/system/common/constance/AppConstance.java b/zq-erp/src/main/java/com/matrix/system/common/constance/AppConstance.java
index b971f6b..705a50f 100644
--- a/zq-erp/src/main/java/com/matrix/system/common/constance/AppConstance.java
+++ b/zq-erp/src/main/java/com/matrix/system/common/constance/AppConstance.java
@@ -589,4 +589,48 @@
     public static final String QSFY = "QSFY";
 
 
+    /**
+     * 小程序APPID
+     */
+    public static final String MINIPROGRAM_APPID = "miniprogramAppid";
+    /**
+     * 小程序Secret
+     */
+    public static final String MINIPROGRAM_SECRET = "miniprogramSecret";
+    /**
+     * 公众号APPID
+     */
+    public static final String GZH_APPID = "gzhAppId";
+
+    /**
+     * 微信商户号
+     */
+    public static final String WECHARPAY_MCHID = "wecharPayMchId";
+    /**
+     * 支付秘钥
+     */
+    public static final String WECHARPAY_SECRET = "wecharPaySecret";
+
+    /**
+     * 支付通知地址
+     */
+    public static final String WECHARPAY_NOTIFYURL = "wecharPaynotifyUrl";
+    /**
+     * 支付证书地址
+     */
+    public static final String WECHARPAY_CERTLOCAL_PATH = "certLocalPath";
+
+
+
+
+
+
+
+
+
+
+
+
+
+
 }
diff --git a/zq-erp/src/main/java/com/matrix/system/common/dao/SysUsersDao.java b/zq-erp/src/main/java/com/matrix/system/common/dao/SysUsersDao.java
index d8a8cfd..fcb8f9a 100644
--- a/zq-erp/src/main/java/com/matrix/system/common/dao/SysUsersDao.java
+++ b/zq-erp/src/main/java/com/matrix/system/common/dao/SysUsersDao.java
@@ -3,6 +3,7 @@
 import com.matrix.core.pojo.PaginationVO;
 import com.matrix.system.common.bean.SysUserLoginRecord;
 import com.matrix.system.common.bean.SysUsers;
+import com.matrix.system.hive.bean.AppVersion;
 import com.matrix.system.hive.bean.SysBeauticianState;
 import com.matrix.system.hive.bean.SysProjServices;
 import org.apache.ibatis.annotations.Param;
@@ -122,5 +123,6 @@
      */
     public int emptySignInfoById(Long id);
 
+    public List<AppVersion> selectAppVersion();
 
 }
\ No newline at end of file
diff --git a/zq-erp/src/main/java/com/matrix/system/common/interceptor/ApiUserLoginInterceptor.java b/zq-erp/src/main/java/com/matrix/system/common/interceptor/ApiUserLoginInterceptor.java
new file mode 100644
index 0000000..64dfd5e
--- /dev/null
+++ b/zq-erp/src/main/java/com/matrix/system/common/interceptor/ApiUserLoginInterceptor.java
@@ -0,0 +1,129 @@
+package com.matrix.system.common.interceptor;
+
+import com.alibaba.fastjson.JSONObject;
+import com.fasterxml.jackson.databind.ObjectMapper;
+import com.matrix.component.redis.RedisClient;
+import com.matrix.component.redis.RedisUserLoginUtils;
+import com.matrix.core.constance.MatrixConstance;
+import com.matrix.core.pojo.AjaxResult;
+import com.matrix.core.tools.LogUtil;
+import com.matrix.core.tools.RSAUtils;
+import com.matrix.core.tools.StringUtils;
+import com.matrix.system.common.bean.SysUsers;
+import com.matrix.system.common.dao.SysUsersDao;
+import com.matrix.system.hive.bean.SysVipInfo;
+import com.matrix.system.hive.dao.SysVipInfoDao;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.beans.factory.annotation.Value;
+import org.springframework.stereotype.Component;
+import org.springframework.web.servlet.HandlerInterceptor;
+import org.springframework.web.servlet.ModelAndView;
+
+import javax.servlet.http.HttpServletRequest;
+import javax.servlet.http.HttpServletResponse;
+
+/**
+ * @author wzy
+ * @date 2020-12-21
+ **/
+@Component
+public class ApiUserLoginInterceptor implements HandlerInterceptor {
+
+    @Autowired
+    private RedisClient redisClient;
+
+    @Value("${login_private_key}")
+    private  String privateKey;
+
+    @Value("${evn}")
+    private String evn;
+
+    @Autowired
+    private SysUsersDao sysUsersDao;
+
+    private static final String TOKEN_HEADER = "Authorization";
+    private static final String TOKEN_START_WITH = "Bearer ";
+
+    @Override
+    public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
+       /*if ("dev".equals(evn)) {
+            SysUsers sysUsers = sysUsersDao.selectById(1012L);
+            request.getSession().setAttribute(MatrixConstance.LOGIN_KEY, sysUsers);
+            return true;
+        }*/
+
+        String token = resolveToken(request,privateKey);
+        AjaxResult ajaxResult = new AjaxResult();
+        ajaxResult.setStatus(AjaxResult.STATUS_LOGIN_INVALID);
+
+        response.setCharacterEncoding("UTF-8");
+        response.setContentType("application/json; charset=utf-8");
+        if (StringUtils.isBlank(token)) {
+            ajaxResult.setInfo("login time out");
+            response.getWriter().write(new ObjectMapper().writeValueAsString(ajaxResult));
+            response.setStatus(HttpServletResponse.SC_UNAUTHORIZED);
+            return false;
+        }
+
+        String userStr = redisClient.getCachedValue(token);
+//        redisClient.resetExpire(token);
+        if (StringUtils.isBlank(userStr)) {
+            ajaxResult.setInfo("login time out");
+            response.getWriter().write(new ObjectMapper().writeValueAsString(ajaxResult));
+            response.setStatus(HttpServletResponse.SC_UNAUTHORIZED);
+            return false;
+        }
+
+        SysUsers sysUsers = JSONObject.parseObject(userStr, SysUsers.class);
+        request.getSession().setAttribute(MatrixConstance.LOGIN_KEY, sysUsers);
+        return true;
+    }
+
+    @Override
+    public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView) throws Exception {
+        request.getSession().removeAttribute(MatrixConstance.LOGIN_KEY);
+    }
+
+    @Override
+    public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) throws Exception {
+
+    }
+
+    /**
+     * 解析token  token_timestamp_url
+     *
+     * @param request
+     * @return
+     */
+    public static String resolveToken(HttpServletRequest request,String privateKey) {
+        String headToken = request.getHeader(TOKEN_HEADER);
+        String sb = request.getRequestURI();
+
+        if (StringUtils.isNotBlank(headToken) && headToken.startsWith(TOKEN_START_WITH)) {
+            // 去掉令牌前缀
+            String rsaToken = headToken.replace(TOKEN_START_WITH, "");
+
+            try {
+                String decryptToken = new String(RSAUtils.decryptByPrivateKey(rsaToken, privateKey));
+
+                String[] s = decryptToken.split("_");
+                if (s == null || s.length != 3) {
+                    return "";
+                }
+
+                LogUtil.info("请求路径:{} -- {}", sb, s[2]);
+                if (!sb.equals(s[2])) {
+                    return "";
+                }
+
+                return s[0];
+            } catch (Exception e) {
+                LogUtil.info("#token解析错误:{}#", e);
+                return "";
+            }
+
+        }
+
+        return "";
+    }
+}
diff --git a/zq-erp/src/main/java/com/matrix/system/common/interceptor/HostInterceptor.java b/zq-erp/src/main/java/com/matrix/system/common/interceptor/HostInterceptor.java
index 505c871..7c441ef 100644
--- a/zq-erp/src/main/java/com/matrix/system/common/interceptor/HostInterceptor.java
+++ b/zq-erp/src/main/java/com/matrix/system/common/interceptor/HostInterceptor.java
@@ -1,13 +1,9 @@
 package com.matrix.system.common.interceptor;
 
-import com.matrix.core.constance.MatrixConstance;
 import com.matrix.core.tools.LogUtil;
-import com.matrix.core.tools.StringUtils;
 import com.matrix.core.tools.WebUtil;
-
 import com.matrix.system.common.bean.SysCompany;
 import org.springframework.stereotype.Component;
-import org.springframework.web.servlet.HandlerInterceptor;
 import org.springframework.web.servlet.ModelAndView;
 import org.springframework.web.servlet.handler.HandlerInterceptorAdapter;
 
@@ -45,17 +41,8 @@
 			LogUtil.debug("匹配到公司{}", company.getComName());
 			return true;
 		} else {
-		// 获得请求的域名
-		String host = WebUtil.getRequest().getServerName();
-		//判断是否为debug模式
-		if(MatrixConstance.DEBUG){
-			String debugHost=request.getHeader("debugHost");
-			if(StringUtils.isNotBlank(debugHost)){
-				host=debugHost;
-				WebUtil.getSession().removeAttribute(ATTR_COMPANY);
-				LogUtil.debug("debugHost={}",host);
-			}
-		}
+		// 获得请求的域名--由小程序直接传过来companyCode参数对应公司的网址
+		String host = request.getHeader("companyCode");
 		LogUtil.debug("当前请求域名{}", host);
 			@SuppressWarnings("unchecked")
 			Map<String, SysCompany> companyMap = (Map<String, SysCompany>) WebUtil.getServletContext()
diff --git a/zq-erp/src/main/java/com/matrix/system/common/service/SysUsersService.java b/zq-erp/src/main/java/com/matrix/system/common/service/SysUsersService.java
index 17e6205..b41f466 100644
--- a/zq-erp/src/main/java/com/matrix/system/common/service/SysUsersService.java
+++ b/zq-erp/src/main/java/com/matrix/system/common/service/SysUsersService.java
@@ -3,6 +3,7 @@
 import com.matrix.core.pojo.PaginationVO;
 import com.matrix.system.common.bean.SysUserLoginRecord;
 import com.matrix.system.common.bean.SysUsers;
+import com.matrix.system.hive.bean.AppVersion;
 import com.matrix.system.hive.bean.SysBeauticianState;
 import com.matrix.system.hive.bean.SysProjServices;
 
@@ -170,5 +171,6 @@
     public int findByCodeBeaStateShopCount(Long shopId,
                                            SysProjServices sysProjServices, List<String> panBanCodes);
 
+    public List<AppVersion> findAppVersion();
 
 }
\ No newline at end of file
diff --git a/zq-erp/src/main/java/com/matrix/system/common/service/impl/InitShopProductCateService.java b/zq-erp/src/main/java/com/matrix/system/common/service/impl/InitShopProductCateService.java
index d84991c..f6850fe 100644
--- a/zq-erp/src/main/java/com/matrix/system/common/service/impl/InitShopProductCateService.java
+++ b/zq-erp/src/main/java/com/matrix/system/common/service/impl/InitShopProductCateService.java
@@ -2,9 +2,6 @@
 
 import com.matrix.core.constance.MatrixConstance;
 import com.matrix.system.common.bean.SysCompany;
-import com.matrix.system.common.bean.SysRole;
-import com.matrix.system.common.dao.SysRoleDao;
-import com.matrix.system.constance.Dictionary;
 import com.matrix.system.shopXcx.bean.ShopProductAttribute;
 import com.matrix.system.shopXcx.dao.ShopProductAttributeDao;
 import org.springframework.beans.BeanUtils;
@@ -40,7 +37,8 @@
 
         ShopProductAttribute service=new ShopProductAttribute();
         BeanUtils.copyProperties(cpfl,service);
-        service.setAttrName("服务");
+        service.setAttrName("属性");
+        service.setAttrCode("service");
         shopProductAttributeDao.batchInsert(Arrays.asList(cpfl,service));
 
 
diff --git a/zq-erp/src/main/java/com/matrix/system/common/service/impl/SysUsersServiceImpl.java b/zq-erp/src/main/java/com/matrix/system/common/service/impl/SysUsersServiceImpl.java
index ef4e4a3..8b6ce98 100644
--- a/zq-erp/src/main/java/com/matrix/system/common/service/impl/SysUsersServiceImpl.java
+++ b/zq-erp/src/main/java/com/matrix/system/common/service/impl/SysUsersServiceImpl.java
@@ -15,6 +15,7 @@
 import com.matrix.system.common.service.SysUsersService;
 import com.matrix.system.common.tools.PasswordUtil;
 import com.matrix.system.common.tools.ServiceUtil;
+import com.matrix.system.hive.bean.AppVersion;
 import com.matrix.system.hive.bean.SysBeauticianState;
 import com.matrix.system.hive.bean.SysProjServices;
 import com.matrix.system.hive.bean.SysShopInfo;
@@ -258,4 +259,8 @@
     }
 
 
+    @Override
+    public List<AppVersion> findAppVersion() {
+        return sysUsersDao.selectAppVersion();
+    }
 }
\ No newline at end of file
diff --git a/zq-erp/src/main/java/com/matrix/system/constance/Dictionary.java b/zq-erp/src/main/java/com/matrix/system/constance/Dictionary.java
index 782fd14..cae214e 100644
--- a/zq-erp/src/main/java/com/matrix/system/constance/Dictionary.java
+++ b/zq-erp/src/main/java/com/matrix/system/constance/Dictionary.java
@@ -63,6 +63,12 @@
 	 * 支付方式-卡支付
 	 */
 	String PAY_TYPE_CARD = "划扣";
+
+
+	/**
+	 * 服务单状态-待确认
+	 */
+	String SERVICE_STATU_DQR = "待确认";
 	/**
 	 * 服务单状态-待预约
 	 */
@@ -558,5 +564,12 @@
 
 	String ORDER_TYPE_SEAL="订单";
 	String ORDER_TYPE_SERVICE="服务单";
-	
+
+	String ACHIEVE_TYPE_CASH = "现金业绩";
+	String ACHIEVE_TYPE_CARD = "划扣业绩";
+
+    String SEX_MAN ="男";
+    String SEX_WOMAN ="女";
+
+    String[] COLORS = { "#57c5d2", "#e3565e", "#2f343a", "#4d98db", "#4fbc9d", "#be9d4c"};
 }
diff --git a/zq-erp/src/main/java/com/matrix/system/hive/action/ArticleController.java b/zq-erp/src/main/java/com/matrix/system/hive/action/ArticleController.java
index 04e7f46..a5a6be2 100644
--- a/zq-erp/src/main/java/com/matrix/system/hive/action/ArticleController.java
+++ b/zq-erp/src/main/java/com/matrix/system/hive/action/ArticleController.java
@@ -49,7 +49,7 @@
 	AjaxResult showList(Article article, PaginationVO pageVo) {
 		article.setType(Dictionary.ARTICEL_TYPE_NAME_SCWZ);
 		SysUsers users = WebUtil.getSessionAttribute(MatrixConstance.LOGIN_KEY);
-		article.setShopId(users.getShopId());
+		article.setCompanyId(users.getCompanyId());
 		return showList(currentService, article, pageVo);
 	}
 	
@@ -61,7 +61,7 @@
 		article.setType(Dictionary.ARTICEL_TYPE_NAME_MDXY);
 
 		SysUsers users = WebUtil.getSessionAttribute(MatrixConstance.LOGIN_KEY);
-		article.setShopId(users.getShopId());
+		article.setCompanyId(users.getCompanyId());
 		return showList(currentService, article, pageVo);
 		//return new AjaxResult(AjaxResult.STATUS_SUCCESS, currentService.findInPage(article, pageVo),currentService.findTotal(article));
 	}
@@ -73,7 +73,7 @@
 	public @ResponseBody AjaxResult queryAll(Article article, PaginationVO pageVo) {
 		article.setType(Dictionary.ARTICEL_TYPE_NAME_WXXMWZ);
 		SysUsers users = WebUtil.getSessionAttribute(MatrixConstance.LOGIN_KEY);
-		article.setShopId(users.getShopId());
+		article.setCompanyId(users.getCompanyId());
 		return showList(currentService, article, pageVo);
 		//return new AjaxResult(AjaxResult.STATUS_SUCCESS, currentService.findInPage(article, pageVo),currentService.findTotal(article));
 	}
@@ -99,7 +99,7 @@
    	@RemoveRequestToken
 	public @ResponseBody AjaxResult addOrModify(Article article) {
 		SysUsers users = WebUtil.getSessionAttribute(MatrixConstance.LOGIN_KEY);
-		article.setShopId(users.getShopId());
+		article.setCompanyId(users.getCompanyId());
 		if (article.getId() != null) {
 			return modify(currentService, article, "文章");
 		} else {
diff --git a/zq-erp/src/main/java/com/matrix/system/hive/action/ArticleTypeController.java b/zq-erp/src/main/java/com/matrix/system/hive/action/ArticleTypeController.java
index 30443b0..716ebb0 100644
--- a/zq-erp/src/main/java/com/matrix/system/hive/action/ArticleTypeController.java
+++ b/zq-erp/src/main/java/com/matrix/system/hive/action/ArticleTypeController.java
@@ -1,16 +1,22 @@
 package com.matrix.system.hive.action;
 
+import java.util.ArrayList;
 import java.util.Arrays;
+import java.util.List;
 
 import javax.annotation.Resource;
 
 import com.matrix.core.constance.MatrixConstance;
+import com.matrix.core.exception.GlobleException;
 import com.matrix.core.pojo.AjaxResult;
 import com.matrix.core.pojo.PaginationVO;
+import com.matrix.core.tools.StringUtils;
 import com.matrix.core.tools.WebUtil;
 import com.matrix.system.common.bean.SysUsers;
 import com.matrix.system.constance.Dictionary;
 import com.matrix.system.hive.bean.ArticleType;
+import com.matrix.system.hive.plugin.message.StringUtil;
+import com.matrix.system.hive.plugin.util.CollectionUtils;
 import com.matrix.system.hive.service.ArticleTypeService;
 import org.springframework.stereotype.Controller;
 import org.springframework.web.bind.annotation.RequestMapping;
@@ -72,7 +78,7 @@
 	public @ResponseBody AjaxResult queryAll(ArticleType articleType) {
 		SysUsers users = WebUtil.getSessionAttribute(MatrixConstance.LOGIN_KEY);
 		articleType.setType(Dictionary.ARTICEL_TYPE_NAME_MDXY);
-		articleType.setShopId(users.getShopId());
+		articleType.setCompanyId(users.getCompanyId());
 		return new AjaxResult(AjaxResult.STATUS_SUCCESS,	currentService.findByModel(articleType), 0);
 	}
 	
@@ -110,8 +116,21 @@
    		articleType.setType(Dictionary.ARTICEL_TYPE_NAME_MDXY);
 		SysUsers users = WebUtil.getSessionAttribute(MatrixConstance.LOGIN_KEY);
 		articleType.setShopId(users.getShopId());
-		if (articleType.getId() != null) {
+		articleType.setCompanyId(users.getCompanyId());
+		Long parentId = articleType.getParentId();
+		List<Long> ids = new ArrayList<>();
+		while (parentId != 0) {
+			ArticleType type = currentService.findById(parentId);
+			ids.add(type.getId());
+			parentId = type.getParentId();
+		}
 
+		articleType.setParentIds(CollectionUtils.isNotEmpty(ids) ? StringUtils.collToStr(ids, ",") : null);
+		if (articleType.getId() != null) {
+			// 自己不能是自己的父节点
+			if (articleType.getParentId() != null && articleType.getParentId().equals(articleType.getId())) {
+				throw new GlobleException("父级不能是自己");
+			}
 			return modify(currentService, articleType, "文章类型");
 		} else {
 
diff --git a/zq-erp/src/main/java/com/matrix/system/hive/action/CardLevelController.java b/zq-erp/src/main/java/com/matrix/system/hive/action/CardLevelController.java
index 43aece2..b92149f 100644
--- a/zq-erp/src/main/java/com/matrix/system/hive/action/CardLevelController.java
+++ b/zq-erp/src/main/java/com/matrix/system/hive/action/CardLevelController.java
@@ -43,6 +43,7 @@
 	public @ResponseBody AjaxResult addOrModify(SysVipLevel vipLevel) {
 		SysUsers users = WebUtil.getSessionAttribute(MatrixConstance.LOGIN_KEY);
 		vipLevel.setShopId(users.getShopId());
+		vipLevel.setCompanyId(users.getCompanyId());
 		if (vipLevel.getId() != null) {
 
 			return modify(cardLevelService, vipLevel, "会员卡信息");
diff --git a/zq-erp/src/main/java/com/matrix/system/hive/action/DepartInfoController.java b/zq-erp/src/main/java/com/matrix/system/hive/action/DepartInfoController.java
index 7a5e5d7..eb30467 100644
--- a/zq-erp/src/main/java/com/matrix/system/hive/action/DepartInfoController.java
+++ b/zq-erp/src/main/java/com/matrix/system/hive/action/DepartInfoController.java
@@ -1,5 +1,6 @@
 package com.matrix.system.hive.action;
 
+import com.matrix.core.exception.GlobleException;
 import com.matrix.core.pojo.AjaxResult;
 import com.matrix.core.pojo.PaginationVO;
 import com.matrix.core.tools.WebUtil;
@@ -58,7 +59,9 @@
 	public @ResponseBody AjaxResult addOrModify(SysDepartInfo departInfo) {
 
 		if (departInfo.getId() != null) {
-
+			if (departInfo.getParentId() != null && departInfo.getParentId().equals(departInfo.getId())) {
+				throw new GlobleException("父级不能是自己");
+			}
 			return modify(currentService, departInfo, "部门");
 		} else {
 			QueryUtil.setQueryLimit(departInfo);
diff --git a/zq-erp/src/main/java/com/matrix/system/hive/action/GoodsTypeController.java b/zq-erp/src/main/java/com/matrix/system/hive/action/GoodsTypeController.java
index 4348e50..c5ce387 100644
--- a/zq-erp/src/main/java/com/matrix/system/hive/action/GoodsTypeController.java
+++ b/zq-erp/src/main/java/com/matrix/system/hive/action/GoodsTypeController.java
@@ -1,6 +1,7 @@
 package com.matrix.system.hive.action;
 
 import com.matrix.core.constance.MatrixConstance;
+import com.matrix.core.exception.GlobleException;
 import com.matrix.core.pojo.AjaxResult;
 import com.matrix.core.tools.WebUtil;
 import com.matrix.system.common.bean.SysUsers;
@@ -47,7 +48,9 @@
 	AjaxResult addOrModify(SysGoodsType sysGoodsType) {
    		SysUsers users = WebUtil.getSessionAttribute(MatrixConstance.LOGIN_KEY);
 		if (sysGoodsType.getId() != null) {
-
+			if (sysGoodsType.getParentId() != null && sysGoodsType.getParentId().equals(sysGoodsType.getId())) {
+				throw new GlobleException("父级不能是自己");
+			}
 			return modify(currentService, sysGoodsType, "产品分类");
 		} else {
 
diff --git a/zq-erp/src/main/java/com/matrix/system/hive/action/MoneyCardUseController.java b/zq-erp/src/main/java/com/matrix/system/hive/action/MoneyCardUseController.java
index 2744c37..acb73b6 100644
--- a/zq-erp/src/main/java/com/matrix/system/hive/action/MoneyCardUseController.java
+++ b/zq-erp/src/main/java/com/matrix/system/hive/action/MoneyCardUseController.java
@@ -1,5 +1,6 @@
 package com.matrix.system.hive.action;
 
+import com.matrix.component.rabbitmq.RabiitMqTemplate;
 import com.matrix.core.constance.MatrixConstance;
 import com.matrix.core.exception.GlobleException;
 import com.matrix.core.pojo.AjaxResult;
@@ -15,9 +16,13 @@
 import com.matrix.core.tools.DateUtil;
 import com.matrix.system.hive.pojo.CzXkVo;
 import com.matrix.system.hive.service.*;
+import com.matrix.system.shopXcx.mqTask.MQTaskRouting;
+import com.matrix.system.wechart.templateMsg.UniformMsgParam;
 import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.beans.factory.annotation.Value;
 import org.springframework.stereotype.Controller;
 import org.springframework.transaction.annotation.Transactional;
+import org.springframework.web.bind.annotation.RequestBody;
 import org.springframework.web.bind.annotation.RequestMapping;
 import org.springframework.web.bind.annotation.ResponseBody;
 
@@ -50,34 +55,31 @@
     @Resource
     private SysVipInfoService vipInfoService;
 
-    @Autowired
+    @Resource
     private MoneyCardUseFlowDao moneyCardUseFlowDao;
-    @Autowired
+
+    @Resource
     private   MoneyCardUseDao moneyCardUseDao;
+
+
+    @Value("${evn}")
+    private  String evn;
+
+    @Autowired
+    private RabiitMqTemplate rabiitMqTemplate;
+
+
     /**
      * 跳转 充值页面
      *
      * @author jyy
      */
     @RequestMapping(value = "/editFormCz")
-    public String editFormCz() {
-        SysVipInfo info =
-                (SysVipInfo) WebUtil.getSession().getAttribute(SystemConstance.CURRENT_CUSTOMER);
-        MoneyCardUse cardUseInfo = cardUseService.findByVipId(info.getId());
-
+    public String editFormCz(Long id) {
+        MoneyCardUse cardUseInfo = cardUseService.findByVipId(id);
         if (cardUseInfo == null) {
-            cardUseInfo = new MoneyCardUse();
-            cardUseInfo.setVipId(info.getId());
-            cardUseInfo.setCardName("储值卡");
-            cardUseInfo.setIsVipCar(Dictionary.FLAG_YES_Y);
-            cardUseInfo.setRealMoney(0D);
-            cardUseInfo.setGiftMoney(0D);
-            cardUseInfo.setSource("-");
-            cardUseInfo.setFailTime(DateUtil.stringToDate("2050-01-01 00:00",DateUtil.DATE_FORMAT_MM));
-            cardUseInfo.setStatus(Dictionary.MONEYCARD_STATUS_YX);
-            moneyCardUseDao.insert(cardUseInfo);
+            cardUseInfo=vipInfoService.addVipDefaultCard(id);
         }
-
         WebUtil.getRequest().setAttribute("obj", cardUseInfo);
         return "admin/hive/beautySalon/cz-form";
     }
@@ -89,9 +91,15 @@
      */
     @RequestMapping(value = "/cz")
     public @ResponseBody
-    AjaxResult cz(CzXkVo czVo) {
+    AjaxResult cz(@RequestBody CzXkVo czVo) {
         SysOrder order=  orderService.updateAddCardMoney(czVo);
         AjaxResult result = new AjaxResult(AjaxResult.STATUS_SUCCESS, "充值成功");
+
+        //发送微信公众号提醒
+        UniformMsgParam uniformMsgParam=new UniformMsgParam(order.getCompanyId(),UniformMsgParam.GZH_CZCG);
+        uniformMsgParam.put("orderId",order.getId());
+        rabiitMqTemplate.sendMsg(MQTaskRouting.SEND_UNIFORM_TEMPLATE_MSG+evn,uniformMsgParam.toJSONString());
+
         result.putInMap("orderId",order.getId());
         return result;
     }
@@ -181,23 +189,14 @@
      * @author jyy
      */
     @RequestMapping(value = "/toBj")
-    public String toBj(Long id, HttpServletRequest request) {
+    public String toBj(Long id) {
         // 根据id查到对应的订单信息
         SysOrder order = orderService.findById(id);
-        WebUtil.getRequest().setAttribute("order", order);
-
         SysOrderItem item = new SysOrderItem();
         item.setOrderId(order.getId());
-        item.setStatus(Dictionary.ORDER_STATU_QK);
-        order.setItems(orderItemService.findByModel(item));
-
-
-        MoneyCardUse moneyCardUse = new MoneyCardUse();
-        moneyCardUse.setVipId(order.getVipId());
-        moneyCardUse.setStatus(Dictionary.MONEYCARD_STATUS_YX);
-        List<MoneyCardUse> cards = cardUseService.findByModel(moneyCardUse);
-
-        WebUtil.getRequest().setAttribute("cards", cards);
+        List<SysOrderItem> items = orderItemService.findByModel(item);
+        order.setItems(items);
+        WebUtil.getRequest().setAttribute("order", order);
 
         return "admin/hive/beautySalon/bj-form";
     }
@@ -227,7 +226,7 @@
      */
     @RequestMapping(value = "/bj")
     public @ResponseBody
-    AjaxResult bj(SysOrder order) throws GlobleException {
+    AjaxResult bj(@RequestBody SysOrder order) throws GlobleException {
 
         orderService.updateAfterMoney(order);
         return new AjaxResult(AjaxResult.STATUS_SUCCESS, "补交成功");
@@ -372,57 +371,7 @@
         return new AjaxResult(AjaxResult.STATUS_FAIL, "冻结失败");
     }
 
-    /**
-     * 退款
-     *
-     * @return
-     */
-    @RequestMapping(value = "getEffectCard")
-    public @ResponseBody
-    AjaxResult getEffectCard(MoneyCardUse moneyCardUse) {
-        AjaxResult result = AjaxResult.buildSuccessInstance("");
-        //要退款的充值卡
-        MoneyCardUse srcCardUse = cardUseService.findById(moneyCardUse.getId());
-        if (!srcCardUse.getStatus().equals(Dictionary.TAOCAN_STATUS_YX)) {
-            throw new GlobleException("不是有效充值卡");
-        }
-        //该会员是否有有效会籍卡
-        MoneyCardUse targetCardUse = cardUseService.findByVipId(moneyCardUse.getVipId());
 
-        double money = srcCardUse.getRealMoney();
 
-        if (targetCardUse != null) {
-            targetCardUse.setRealMoney(money);
-            List<MoneyCardUse> list = Arrays.asList(targetCardUse);
 
-            if (targetCardUse.getId().equals(srcCardUse.getId())) {
-                result.setInfo("会籍卡退款只能退现金");
-                result.setRows(list);
-
-            } else {
-                result.setInfo("有有效会籍卡");
-                result.setRows(list);
-            }
-        } else {
-            //无会员卡则new一个,为了把钱传递到前台
-            targetCardUse = new MoneyCardUse();
-            targetCardUse.setRealMoney(money);
-            List<MoneyCardUse> list1 = Arrays.asList(targetCardUse);
-            result.setInfo("无有效会籍卡,退现金");
-            result.setRows(list1);
-        }
-        return result;
-    }
-
-    @RequestMapping(value = "/returnMoney")
-    public @ResponseBody
-    AjaxResult returnMoney(MoneyCardUse moneyCardUse, Long hjkId, String tcRemark, Long
-            shopId, Double money
-            , String tcName) {
-        int i = cardUseService.returnMoney(moneyCardUse, hjkId);
-        if (i > 0) {
-            return new AjaxResult(AjaxResult.STATUS_SUCCESS, "退款成功");
-        }
-        return new AjaxResult(AjaxResult.STATUS_FAIL, "冻结失败");
-    }
 }
\ No newline at end of file
diff --git a/zq-erp/src/main/java/com/matrix/system/hive/action/OccupancyController.java b/zq-erp/src/main/java/com/matrix/system/hive/action/OccupancyController.java
index 1a3d742..b08b15a 100644
--- a/zq-erp/src/main/java/com/matrix/system/hive/action/OccupancyController.java
+++ b/zq-erp/src/main/java/com/matrix/system/hive/action/OccupancyController.java
@@ -12,6 +12,7 @@
 import com.matrix.core.tools.DateUtil;
 import com.matrix.system.hive.service.SysWorkBeatuistaffService;
 import com.matrix.system.hive.service.SysWorktimeService;
+import io.swagger.annotations.ApiModelProperty;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.stereotype.Controller;
 import org.springframework.web.bind.annotation.RequestMapping;
@@ -51,13 +52,19 @@
     @RequestMapping(value = "/getKanban")
     public @ResponseBody
     AjaxResult showCwzyList(String timeStr) {
+        Long shopId = getMe().getShopId();
+        return getCwzyList(timeStr,shopId);
+    }
+
+    public AjaxResult getCwzyList(String timeStr,Long shopId){
+
         if (timeStr == null || timeStr.equals("")) {
             timeStr = DateUtil.dateToString(new Date(), "yyyy-MM-dd");
         }
         // 查询上班下班的最大时间段
         Date currentDate = DateUtil.stringToDate(timeStr, DateUtil.DATE_FORMAT_DD);
         // 把日期调整为当前查询日期
-        Long shopId = 16L; //getMe().getShopId();
+
 
         Date maxTime = worktimeService.findMaxTime(shopId);
         //如果没有获取到门店的排班时间,无法查询占用情况
@@ -146,8 +153,7 @@
 
         //计算表头的时间间隔
         buildTimeSpan(startTime, maxTime, result);
-
-        return result;
+        return  result;
     }
 
     private void buildTimeSpan(Date startTime, Date maxTime, AjaxResult result) {
@@ -233,7 +239,7 @@
         }
     }
 
-    class OccupancySPan {
+  public  class OccupancySPan {
         /**
          * 休息
          */
@@ -247,12 +253,19 @@
          */
         static final int WORKTYPE_OCCUPANCY = 3;
 
+        @ApiModelProperty(value = "色块长度")
         Long spanLength;
+        @ApiModelProperty(value = "占用状态,1休息,2 上班,3 占用")
         int workType;
+        @ApiModelProperty(value = "床位名称")
         String bedName;
+         @ApiModelProperty(value = "项目名称")
         String projName;
+        @ApiModelProperty(value = "会员名称")
         String vipName;
+        @ApiModelProperty(value = "服务单id")
         Long serviceId;
+        @ApiModelProperty(value = "服务单状态")
         String serviceState;
 
 
diff --git a/zq-erp/src/main/java/com/matrix/system/hive/action/OrderController.java b/zq-erp/src/main/java/com/matrix/system/hive/action/OrderController.java
index 550f9ab..2399c96 100644
--- a/zq-erp/src/main/java/com/matrix/system/hive/action/OrderController.java
+++ b/zq-erp/src/main/java/com/matrix/system/hive/action/OrderController.java
@@ -1,5 +1,6 @@
 package com.matrix.system.hive.action;
 
+import com.matrix.component.rabbitmq.RabiitMqTemplate;
 import com.matrix.core.constance.MatrixConstance;
 import com.matrix.core.exception.GlobleException;
 import com.matrix.core.pojo.AjaxResult;
@@ -14,23 +15,14 @@
 import com.matrix.system.common.tools.ResponseHeadUtil;
 import com.matrix.system.constance.Dictionary;
 import com.matrix.system.constance.SystemConstance;
-import com.matrix.system.hive.action.util.QueryUtil;
-import com.matrix.system.hive.bean.AchieveNew;
-import com.matrix.system.hive.bean.MoneyCardUse;
-import com.matrix.system.hive.bean.SysOrder;
-import com.matrix.system.hive.bean.SysOrderItem;
-import com.matrix.system.hive.dao.MoneyCardUseDao;
-import com.matrix.system.hive.dao.SysOrderDao;
-import com.matrix.system.hive.dao.SysOrderItemDao;
-import com.matrix.system.hive.dao.SysShopInfoDao;
-import com.matrix.core.tools.DateUtil;
+import com.matrix.system.hive.bean.*;
+import com.matrix.system.hive.dao.*;
+import com.matrix.system.hive.plugin.util.CollectionUtils;
 import com.matrix.system.hive.pojo.ShoppingCarItem;
 import com.matrix.system.hive.pojo.ShoppingCarItemsVo;
-import com.matrix.system.hive.service.AchieveNewService;
-import com.matrix.system.hive.service.MoneyCardUseService;
-import com.matrix.system.hive.service.SysOrderItemService;
-import com.matrix.system.hive.service.SysOrderService;
+import com.matrix.system.hive.service.*;
 import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.beans.factory.annotation.Value;
 import org.springframework.stereotype.Controller;
 import org.springframework.transaction.annotation.Transactional;
 import org.springframework.ui.ModelMap;
@@ -48,6 +40,7 @@
 import java.net.URLEncoder;
 import java.util.ArrayList;
 import java.util.Arrays;
+import java.util.Date;
 import java.util.List;
 
 /**
@@ -83,6 +76,19 @@
     @Autowired
     SysShopInfoDao shopInfoDao;
 
+    @Autowired
+    private SysVipInfoService sysVipInfoService;
+
+    @Autowired
+    private SysOrderFlowService sysOrderFlowService;
+
+    @Autowired
+    private SysOrderFlowDao sysOrderFlowDao;
+
+    @Autowired
+    RabiitMqTemplate rabiitMqTemplate;
+    @Value("${evn}")
+    private String evn;
 
     /**
      * 计算订单金额
@@ -120,14 +126,52 @@
         //校验订单是否满足结算调价,新订单则保存订单,已有订单则删除后更新
         sysOrder = orderService.checkAndSaveOrder(sysOrder);
         orderService.updateReceiptMoney(sysOrder);
+
+        //发送微信公众号提醒
+//        UniformMsgParam uniformMsgParam=new UniformMsgParam(user.getCompanyId(),UniformMsgParam.GZH_GMCG);
+//        uniformMsgParam.put("orderId",sysOrder.getId());
+//        rabiitMqTemplate.sendMsg(MQTaskRouting.SEND_UNIFORM_TEMPLATE_MSG+evn,uniformMsgParam.toJSONString());
+
+
         //处理用户购买的产品
         return AjaxResult.buildSuccessInstance(Arrays.asList(sysOrder), "订单结算成功");
     }
 
 
+    /**
+     * 退款
+     *
+     * @param sysOrder
+     * @return
+     */
+    @RequestMapping(value = "/refundOrder")
+    @ResponseBody
+    @Transactional(rollbackFor = Exception.class)
+    public AjaxResult refundOrder(@RequestBody SysOrder sysOrder) {
+        //储值卡订单不能通过退款渠道退款
+        if(CollectionUtils.isNotEmpty(sysOrder.getItems())){
+            List<SysOrderItem> orderItem = orderItemService.findByOrderId(sysOrder.getItems().get(0).getOrderId());
+            if(orderItem.size()==1){
+                if(orderItem.get(0).getShoppingGoods().getCode().equals("vipCzk")){
+                    return AjaxResult.buildFailInstance("充值订单请直接冲负数金额退款!");
+                }
+            }
+        }
 
 
 
+        SysUsers user = getMe();
+        sysOrder.setShopId(user.getShopId());
+        sysOrder.setStatu(Dictionary.ORDER_STATU_TK);
+        sysOrder.setOrderTime(new Date());
+
+
+        //校验订单是否满足结算调价,新订单则保存订单,已有订单则删除后更新
+        sysOrder = orderService.checkAndSaveOrder(sysOrder);
+        orderService.refundOrderMoney(sysOrder);
+        //处理用户购买的产品
+        return AjaxResult.buildSuccessInstance(Arrays.asList(sysOrder), "订单退款成功");
+    }
 
 
     /**
@@ -144,7 +188,6 @@
         //处理用户购买的产品
         return AjaxResult.buildSuccessInstance(Arrays.asList(sysOrder), "订单保存成功");
     }
-
 
     /**
      * 新建订单
@@ -175,6 +218,9 @@
         }
         //设置过滤后的购物车条目
         car.setCarItems(carItems);
+
+        SysVipInfo info = (SysVipInfo) WebUtil.getSession().getAttribute(SystemConstance.CURRENT_CUSTOMER);
+        car.setVipId(info.getId());
 
         // 添加新订单
         int i = orderService.createOrder(WebUtil.getSession(), car);
@@ -235,13 +281,17 @@
     public @ResponseBody
     AjaxResult updateOrderTime(SysOrder sysOrder) {
 
-        sysOrderDao.updateOrderTime(sysOrder.getOrderTime(), sysOrder.getId());
+        sysOrderDao.updateOrderTime(sysOrder.getPayTime(), sysOrder.getId());
         // 修改业绩时间
         // 更新业绩时间
         AchieveNew achieveNew = new AchieveNew();
         achieveNew.setOrderId(sysOrder.getId());
-        achieveNew.setDatatime(sysOrder.getOrderTime());
+        achieveNew.setDatatime(sysOrder.getPayTime());
         achieveNewService.modifyAchieveTime(achieveNew);
+        //更新收款流水时间
+        sysOrderFlowDao.updateTimeByOrderId(sysOrder.getId(),sysOrder.getPayTime());
+
+
         return new AjaxResult(AjaxResult.STATUS_SUCCESS, "修改成功");
     }
 
@@ -258,16 +308,7 @@
         MoneyCardUse cardUseInfo = cardUseService.findByVipId(order.getVipId());
 
         if (cardUseInfo == null) {
-            cardUseInfo = new MoneyCardUse();
-            cardUseInfo.setVipId(order.getVipId());
-            cardUseInfo.setCardName("储值卡");
-            cardUseInfo.setIsVipCar(Dictionary.FLAG_YES_Y);
-            cardUseInfo.setRealMoney(0D);
-            cardUseInfo.setGiftMoney(0D);
-            cardUseInfo.setSource("-");
-            cardUseInfo.setStatus(Dictionary.MONEYCARD_STATUS_YX);
-            cardUseInfo.setFailTime(DateUtil.stringToDate("2050-01-01 00:00",DateUtil.DATE_FORMAT_MM));
-            moneyCardUseDao.insert(cardUseInfo);
+            cardUseInfo=sysVipInfoService.addVipDefaultCard(order.getVipId());
         }
 
         //打印需求加入门店信息
@@ -353,6 +394,48 @@
         return "admin/hive/beautySalon/point-order";
     }
 
+    @RequestMapping(value = "/findOrderDetailByIdOrNo")
+    @ResponseBody
+    public AjaxResult findOrderDetailByIdOrNo(SysOrder orderVo) {
+        // 根据id查到对应的订单信息
+        SysOrder order=null;
+        if(orderVo.getId()!=null){
+            order  = orderService.findById(orderVo.getId());
+        }else if(StringUtils.isNotBlank(orderVo.getOrderNo())){
+            List<SysOrder> byModel = orderService.findByModel(orderVo);
+            if(byModel.size()==1){
+                order=orderService.findById(byModel.get(0).getId());
+            }
+        }
+        List<SysOrderItem> sysOrderItems = orderItemDao.selectByOrderId(order.getId());
+        order.setItems(sysOrderItems);
+
+        SysVipInfo vipInfo = sysVipInfoService.findById(order.getVipId());
+        // 根据会员Id查到会员有效的会员卡
+        // 根据订单号查找订单条目
+        List<SysOrderItem> orderItems = orderItemService.findByOrderId(order.getId());
+
+        MoneyCardUse moneyCardUse = new MoneyCardUse();
+        moneyCardUse.setVipId(order.getVipId());
+        List<MoneyCardUse> cards = cardUseService.findByModel(moneyCardUse);
+
+        List<SysOrderFlow> flows = sysOrderFlowService.findByOrderId(order.getId());
+        order.setFlows(flows);
+
+        List<SysOrderFlow> payMethods = sysOrderFlowService.findPayMethodsAmount(order.getId());
+
+        List<AchieveNew> achieveList = achieveNewService.findOrderItemAchieve(order.getId());
+
+        AjaxResult ajaxResult = AjaxResult.buildSuccessInstance("获取成功");
+        ajaxResult.putInMap("orderItems", orderItems);
+        ajaxResult.putInMap("order", order);
+        ajaxResult.putInMap("cards", cards);
+        ajaxResult.putInMap("vipInfo", vipInfo);
+        ajaxResult.putInMap("payMethods", payMethods);
+        ajaxResult.putInMap("achieveList", achieveList);
+        return ajaxResult;
+    }
+
     /**
      * 跳转 消费流水详情页面
      *
@@ -360,32 +443,12 @@
      */
     @RequestMapping(value = "/orderItem")
     public String orderItem(SysOrder orderVo) {
-        // 根据id查到对应的订单信息
-        SysOrder order=null;
-       if(orderVo.getId()!=null){
-           order   = orderService.findById(orderVo.getId());
-       }else if(StringUtils.isNotBlank(orderVo.getOrderNo())){
-           List<SysOrder> byModel = orderService.findByModel(orderVo);
-           if(byModel.size()==1){
-               order=orderService.findById(byModel.get(0).getId());
-           }
-       }
-        List<SysOrderItem> sysOrderItems = orderItemDao.selectByOrderId(order.getId());
-        order.setItems(sysOrderItems);
 
-        WebUtil.getRequest().setAttribute("order", order);
-        // 根据会员Id查到会员有效的会员卡
-        // 根据订单号查找订单条目
-        SysOrderItem orderItem = new SysOrderItem();
-        orderItem.setOrderId(order.getId());
-        List<SysOrderItem> orderItems = orderItemService.findByModel(orderItem);
-        WebUtil.getRequest().setAttribute("orderItems", orderItems);
-
-        MoneyCardUse moneyCardUse = new MoneyCardUse();
-        moneyCardUse.setVipId(order.getVipId());
-        List<MoneyCardUse> cards = cardUseService.findByModel(moneyCardUse);
-
-        WebUtil.getRequest().setAttribute("cards", cards);
+        if(orderVo.getId()!=null){
+            WebUtil.getRequest().setAttribute("orderParam", orderVo.getId());
+        }else if(StringUtils.isNotBlank(orderVo.getOrderNo())){
+            WebUtil.getRequest().setAttribute("orderParam", orderVo.getOrderNo());
+        }
         return "admin/hive/beautySalon/orderXq-form";
     }
 
diff --git a/zq-erp/src/main/java/com/matrix/system/hive/action/ProjServiceController.java b/zq-erp/src/main/java/com/matrix/system/hive/action/ProjServiceController.java
index 73cdcf9..2fb6aa7 100644
--- a/zq-erp/src/main/java/com/matrix/system/hive/action/ProjServiceController.java
+++ b/zq-erp/src/main/java/com/matrix/system/hive/action/ProjServiceController.java
@@ -18,11 +18,8 @@
 import com.matrix.system.constance.Dictionary;
 import com.matrix.system.hive.bean.*;
 import com.matrix.system.hive.dao.*;
-import com.matrix.core.tools.DateUtil;
-import com.matrix.system.hive.pojo.TaoCanVo;
 import com.matrix.system.hive.service.*;
 import org.apache.commons.collections.CollectionUtils;
-import org.jsoup.helper.DataUtil;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.stereotype.Controller;
 import org.springframework.ui.ModelMap;
@@ -197,7 +194,7 @@
         queryUse.setType(Dictionary.SHOPPING_GOODS_TYPE_TC);
         List<SysProjUse> taoCanList = projUseService.findInPage(queryUse, null);
         taoCanList.forEach(item->{
-            item.setTaocanProjUse(projUseService.selectTaocanProjUse(item.getId()));
+            item.setTaocanProjUse(projUseService.selectTaocanProjUse(item.getId(), queryUse.getStatus()));
             item.setProjInfo(shoppingGoodsDao.selectById(item.getProjId()));
         });
         result.putInMap("projList", projList);
@@ -395,11 +392,11 @@
     public @ResponseBody
     AjaxResult updateOrderTime(SysProjServices serviceQuery) {
         SysProjServices services = sysProjServicesDao.selectById(serviceQuery.getId());
-        sysProjServicesDao.updateOrderTime(serviceQuery.getCreateTime(), serviceQuery.getId());
+        sysProjServicesDao.updateOrderTime(serviceQuery.getConsumeTime(), serviceQuery.getId());
         // 更新业绩时间
         AchieveNew achieveNew = new AchieveNew();
         achieveNew.setServiceOrderId(serviceQuery.getId());
-        achieveNew.setDatatime(serviceQuery.getCreateTime());
+        achieveNew.setDatatime(serviceQuery.getConsumeTime());
         achieveNewService.modifyAchieveTime(achieveNew);
         return new AjaxResult(AjaxResult.STATUS_SUCCESS, "修改成功");
     }
@@ -495,6 +492,7 @@
         if (balanceverifyResult.isError()) {
             return new AjaxResult(AjaxResult.STATUS_FAIL, balanceverifyResult.getMsg());
         }
+        sysProjServices.setState(Dictionary.SERVICE_STATU_YYCG);
         SysProjServices newSysProjServices = sysProjServicesService.addSysProjServices(sysProjServices);
         if (newSysProjServices != null) {
             return AjaxResult.buildSuccessInstance(Arrays.asList(newSysProjServices));
diff --git a/zq-erp/src/main/java/com/matrix/system/hive/action/ProjTypeController.java b/zq-erp/src/main/java/com/matrix/system/hive/action/ProjTypeController.java
index 20b81ff..15abb61 100644
--- a/zq-erp/src/main/java/com/matrix/system/hive/action/ProjTypeController.java
+++ b/zq-erp/src/main/java/com/matrix/system/hive/action/ProjTypeController.java
@@ -25,13 +25,8 @@
 @RequestMapping(value = "/admin/projtype")
 public class ProjTypeController extends BaseController {
  
- 
    @Resource
    private SysProjTypeService currentService;
-
-
-
-
 	
 	public static final String fnCode = "projType";
 	public static final String search = fnCode + ":search";
diff --git a/zq-erp/src/main/java/com/matrix/system/hive/action/ProjUseController.java b/zq-erp/src/main/java/com/matrix/system/hive/action/ProjUseController.java
index 375256d..29c757c 100644
--- a/zq-erp/src/main/java/com/matrix/system/hive/action/ProjUseController.java
+++ b/zq-erp/src/main/java/com/matrix/system/hive/action/ProjUseController.java
@@ -12,10 +12,7 @@
 import com.matrix.core.tools.excl.ExcelUtil;
 import com.matrix.system.common.bean.SysUsers;
 import com.matrix.system.constance.Dictionary;
-import com.matrix.system.hive.bean.MoneyCardUse;
-import com.matrix.system.hive.bean.ShoppingGoods;
-import com.matrix.system.hive.bean.SysProjUse;
-import com.matrix.system.hive.bean.SysVipInfo;
+import com.matrix.system.hive.bean.*;
 import com.matrix.system.hive.dao.MoneyCardUseDao;
 import com.matrix.system.hive.dao.ShoppingGoodsDao;
 import com.matrix.system.hive.dao.SysProjUseDao;
@@ -26,6 +23,7 @@
 import com.matrix.system.hive.service.SysProjUseService;
 import com.matrix.system.hive.service.SysProjuseFreezeService;
 import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.beans.factory.annotation.Value;
 import org.springframework.stereotype.Controller;
 import org.springframework.transaction.annotation.Transactional;
 import org.springframework.web.bind.annotation.RequestMapping;
@@ -60,6 +58,25 @@
     @Resource
     private MoneyCardUseService moneyCardUseService;
 
+    @Resource
+    private  SysProjUseDao projUseDao;
+
+    @Autowired
+    SysVipInfoDao vipInfoDao;
+
+    @Autowired
+    ShoppingGoodsDao shoppingGoodsDao;
+
+    @Autowired
+    MoneyCardUseDao moneyCardUseDao;
+
+    @Value("${default.vip.photo.woman}")
+    String defaultWoman;
+
+    @Value("${default.vip.photo.man}")
+    String defaultman;
+
+
 
     public static final String fnCode = "projUse";
     public static final String search = fnCode + ":search";
@@ -85,6 +102,18 @@
                 projUseService.findInPage(sysProjUse, pageVo), projUseService.findTotal(sysProjUse));
     }
 
+    /**
+     * 查看会员项目使用情况
+     *
+     * @author jiangyouyao
+     * @date 2016-09-03
+     */
+    @RequestMapping(value = "/findProjUseFlow")
+    public @ResponseBody
+    AjaxResult findProjUseFlow(PaginationVO pageVo, SysProjUseFlow projUseFlow) {
+        return new AjaxResult(AjaxResult.STATUS_SUCCESS,
+                projUseDao.selectProjUseFlow(projUseFlow, pageVo), projUseDao.selectProjUseFlowTotal(projUseFlow));
+    }
 
     /**
      * 将项目设置为有效
@@ -139,21 +168,7 @@
         return new AjaxResult(AjaxResult.STATUS_FAIL, "项目转让失败");
     }
 
-    @RequestMapping(value = "/returnProj")
-    public @ResponseBody
-    AjaxResult returnTc(SysProjUse sysProjUse, Long moneyCardUseId, String tcRemark, Long shopId, Double money, String tcName) {
 
-        MoneyCardUse card = null;
-        if (moneyCardUseId != null) {
-            card = moneyCardUseService.findById(moneyCardUseId);
-        }
-        int i = projUseService.returnMoneyProj(sysProjUse, card, moneyCardUseId);
-        if (i > 0) {
-
-            return new AjaxResult(AjaxResult.STATUS_SUCCESS, "退款成功");
-        }
-        return new AjaxResult(AjaxResult.STATUS_FAIL, "退款失败");
-    }
 
 
     /**
@@ -174,31 +189,6 @@
     }
 
 
-    /**
-     * 退款
-     *
-     * @return
-     */
-    @RequestMapping(value = "/getEffectCard")
-    public @ResponseBody
-    AjaxResult getEffectCard(SysProjUse sysProjUse) {
-        MoneyCardUse cardUse = moneyCardUseService.findByVipId(sysProjUse.getVipId());
-        double money = projUseService.getTotalMoneyProj(sysProjUse);
-        if (cardUse != null) {
-            cardUse.setRealMoney(money);
-            List<MoneyCardUse> list = new ArrayList<MoneyCardUse>();
-            list.add(cardUse);
-            return new AjaxResult(AjaxResult.STATUS_SUCCESS, null, "有有效会籍卡", list, null);
-        } else {
-            //无会员卡则new一个,为了把钱传递到前台
-            cardUse = new MoneyCardUse();
-            cardUse.setRealMoney(money);
-            List<MoneyCardUse> list = new ArrayList<MoneyCardUse>();
-            list.add(cardUse);
-            return new AjaxResult(AjaxResult.STATUS_SUCCESS, null, "无有效会籍卡", list, null);
-        }
-
-    }
 
     /**
      * 冻结会员项目
@@ -217,10 +207,29 @@
     /**
      * 添加或修改会员項目信息
      */
+    @Transactional
     @RequestMapping(value = "/addOrModify")
     public @ResponseBody
     AjaxResult addOrModify(SysProjUse sysProjUse) {
         if (sysProjUse.getId() != null) {
+            SysUsers user=getMe();
+            //插入修改记录
+            SysProjUse oldProjUse = projUseService.findById(sysProjUse.getId());
+            SysProjUseFlow projUseFlow=new SysProjUseFlow();
+            projUseFlow.setProjUseId(sysProjUse.getId());
+            projUseFlow.setOptionType("人工修改");
+            projUseFlow.setProjName(oldProjUse.getProjName());
+            projUseFlow.setCreateBy(user.getSuName());
+            projUseFlow.setUpdateBy(user.getSuName());
+            projUseFlow.setPrice(sysProjUse.getPrice());
+            projUseFlow.setStatus(sysProjUse.getStatus());
+            projUseFlow.setBalance(sysProjUse.getBalance());
+            projUseFlow.setFailTime(sysProjUse.getFailTime());
+            projUseFlow.setIsOver(sysProjUse.getIsOver());
+            projUseFlow.setRemark(sysProjUse.getUpdateRemark());
+            projUseFlow.setSurplusCount(sysProjUse.getSurplusCount());
+            projUseDao.insertFlow(projUseFlow);
+
             return modify(projUseService, sysProjUse, "项目");
         } else {
             return add(projUseService, sysProjUse, "项目");
@@ -228,17 +237,7 @@
     }
 
 
-    @Autowired
-    SysVipInfoDao vipInfoDao;
 
-    @Autowired
-    ShoppingGoodsDao shoppingGoodsDao;
-
-    @Autowired
-    SysProjUseDao projUseDao;
-
-    @Autowired
-    MoneyCardUseDao moneyCardUseDao;
 
 
     @RequestMapping(value = "/importProjUse")
@@ -329,6 +328,7 @@
                 vipInfo = new SysVipInfo();
                 vipInfo.setShopId(sysUsers.getShopId());
                 vipInfo.setPhone(telStr);
+                vipInfo.setPhoto(defaultWoman);
                 vipInfo.setName(objects.get(0).toString());
                 vipInfoDao.insert(vipInfo);
             }
@@ -385,6 +385,7 @@
                 vipInfo = new SysVipInfo();
                 vipInfo.setShopId(sysUsers.getShopId());
                 vipInfo.setPhone(telStr);
+                vipInfo.setPhoto(defaultWoman);
                 vipInfo.setName(objects.get(0).toString());
                 vipInfoDao.insert(vipInfo);
             }
diff --git a/zq-erp/src/main/java/com/matrix/system/hive/action/ShoppingGoodsCategoryController.java b/zq-erp/src/main/java/com/matrix/system/hive/action/ShoppingGoodsCategoryController.java
index 7f1903a..ddf679b 100644
--- a/zq-erp/src/main/java/com/matrix/system/hive/action/ShoppingGoodsCategoryController.java
+++ b/zq-erp/src/main/java/com/matrix/system/hive/action/ShoppingGoodsCategoryController.java
@@ -1,5 +1,6 @@
 package com.matrix.system.hive.action;
 
+import com.matrix.core.exception.GlobleException;
 import com.matrix.core.pojo.AjaxResult;
 import com.matrix.system.common.bean.SysUsers;
 import com.matrix.system.hive.action.util.QueryUtil;
@@ -44,6 +45,11 @@
     public @ResponseBody
     AjaxResult addOrModify(ShoppingGoodsCategory shoppingGoodsCategory) {
         if (shoppingGoodsCategory.getId() != null) {
+
+            // 自己不能是自己的父节点
+            if (shoppingGoodsCategory.getParentId() != null && shoppingGoodsCategory.getParentId().equals(shoppingGoodsCategory.getId())) {
+                throw new GlobleException("父级不能是自己");
+            }
 
             return modify(goodsCategoryService, shoppingGoodsCategory, "商品类型");
         } else {
@@ -111,11 +117,14 @@
     @RequestMapping(value = "/all")
     public @ResponseBody
     AjaxResult all(ShoppingGoodsCategory shoppingGoodsCategory) {
-        SysUsers user = getMe();
-        if(shoppingGoodsCategory.getShopId()==null){
-            shoppingGoodsCategory.setShopId(user.getShopId());
-        }
-        shoppingGoodsCategory.setCompanyId(user.getCompanyId());
+//        SysUsers user = getMe();
+//        if(shoppingGoodsCategory.getShopId()==null){
+//            shoppingGoodsCategory.setShopId(user.getShopId());
+//        }
+//        shoppingGoodsCategory.setCompanyId(user.getCompanyId());
+        SysShopInfo zbShop = shopInfoDao.selectZbShop(getMe().getCompanyId());
+        shoppingGoodsCategory.setShopId(zbShop.getId());
+        QueryUtil.setQueryLimitCom(shoppingGoodsCategory);
         return new AjaxResult(AjaxResult.STATUS_SUCCESS, goodsCategoryService.findByModel(shoppingGoodsCategory), 0);
     }
 
diff --git a/zq-erp/src/main/java/com/matrix/system/hive/action/ShoppingGoodsController.java b/zq-erp/src/main/java/com/matrix/system/hive/action/ShoppingGoodsController.java
index 26d1c64..f70a262 100644
--- a/zq-erp/src/main/java/com/matrix/system/hive/action/ShoppingGoodsController.java
+++ b/zq-erp/src/main/java/com/matrix/system/hive/action/ShoppingGoodsController.java
@@ -176,8 +176,11 @@
     public @ResponseBody
     AjaxResult showList(ShoppingGoods shoppingGoods, PaginationVO pageVo) {
         QueryUtil.setQueryLimit(shoppingGoods);
-        pageVo.setOrder("desc");
-        pageVo.setSort("createTime");
+       if(StringUtils.isBlank(pageVo.getSort())){
+           pageVo.setOrder("desc");
+           pageVo.setSort("createTime");
+       }
+
         //2表示查询总部产品
         if (shoppingGoods.getHeadquarters()!=null && 2==shoppingGoods.getHeadquarters()) {
             //仅查询本店产品
diff --git a/zq-erp/src/main/java/com/matrix/system/hive/action/SupplierInfoController.java b/zq-erp/src/main/java/com/matrix/system/hive/action/SupplierInfoController.java
index e381a62..b43c080 100644
--- a/zq-erp/src/main/java/com/matrix/system/hive/action/SupplierInfoController.java
+++ b/zq-erp/src/main/java/com/matrix/system/hive/action/SupplierInfoController.java
@@ -8,9 +8,12 @@
 import com.matrix.core.tools.WebUtil;
 import com.matrix.system.common.bean.SysUsers;
 import com.matrix.system.hive.action.util.QueryUtil;
+import com.matrix.system.hive.bean.SysShopInfo;
 import com.matrix.system.hive.bean.SysSupplierInfo;
+import com.matrix.system.hive.dao.SysShopInfoDao;
 import com.matrix.system.hive.service.CodeService;
 import com.matrix.system.hive.service.SysSupplierInfoService;
+import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.stereotype.Controller;
 import org.springframework.web.bind.annotation.RequestMapping;
 import org.springframework.web.bind.annotation.ResponseBody;
@@ -31,6 +34,8 @@
 	@Resource
 	private CodeService codeService;
 
+	@Autowired
+	private SysShopInfoDao shopInfoDao;
 
 
 	
@@ -93,8 +98,9 @@
 	@RequestMapping(value = "/all")
 	public @ResponseBody AjaxResult all(SysSupplierInfo sysSupplierInfo) {
 		SysUsers sysUsers = WebUtil.getSessionAttribute(MatrixConstance.LOGIN_KEY);
-		sysSupplierInfo.setShopId(sysUsers.getShopId());
-		sysSupplierInfo.setCompanyId(sysUsers.getCompanyId());
+		SysShopInfo shopInfo = shopInfoDao.selectZbShop(sysUsers.getCompanyId());
+		sysSupplierInfo.setShopId(shopInfo.getId());
+		sysSupplierInfo.setCompanyId(shopInfo.getCompanyId());
 
 		return new AjaxResult(AjaxResult.STATUS_SUCCESS,	currentService.findByModel(sysSupplierInfo), 0);
 	}
diff --git a/zq-erp/src/main/java/com/matrix/system/hive/action/SysVipLabelController.java b/zq-erp/src/main/java/com/matrix/system/hive/action/SysVipLabelController.java
index a93ef26..8d149de 100644
--- a/zq-erp/src/main/java/com/matrix/system/hive/action/SysVipLabelController.java
+++ b/zq-erp/src/main/java/com/matrix/system/hive/action/SysVipLabelController.java
@@ -1,7 +1,11 @@
 package com.matrix.system.hive.action;
 
 import com.matrix.core.pojo.AjaxResult;
+import com.matrix.core.pojo.PaginationVO;
+import com.matrix.core.tools.StringUtils;
+import com.matrix.core.tools.WebUtil;
 import com.matrix.system.common.bean.SysUsers;
+import com.matrix.system.constance.Dictionary;
 import com.matrix.system.hive.bean.SysVipLabel;
 import com.matrix.system.hive.dao.SysVipLabelDao;
 import com.matrix.system.hive.plugin.util.CollectionUtils;
@@ -12,8 +16,10 @@
 import org.springframework.web.bind.annotation.RequestMapping;
 import org.springframework.web.bind.annotation.ResponseBody;
 
+import java.util.ArrayList;
 import java.util.Date;
 import java.util.List;
+import java.util.Random;
 
 /**
  * @author wzy
@@ -26,11 +32,22 @@
     @Autowired
     private SysVipLabelDao sysVipLabelDao;
 
+
+    @RequestMapping(value = "/showList")
+    @ResponseBody
+    private AjaxResult showList(SysVipLabel sysVipLabel, PaginationVO pageVo) {
+        SysUsers user = getMe();
+        sysVipLabel.setCompanyId(user.getCompanyId());
+        return AjaxResult.buildSuccessInstance(sysVipLabelDao.selectInPage(sysVipLabel, pageVo), sysVipLabelDao.selectTotal(sysVipLabel));
+    }
+
     @RequestMapping(value = "/add")
     @ResponseBody
     public AjaxResult add(SysVipLabel sysVipLabel) {
         SysUsers sysUsers = getMe();
 
+        sysVipLabel.setIsAll(1);
+        sysVipLabel.setCompanyId(sysUsers.getCompanyId());
         List<SysVipLabel> sysVipLabels = sysVipLabelDao.selectByModel(sysVipLabel);
         if (CollectionUtils.isNotEmpty(sysVipLabels)) {
             return AjaxResult.buildFailInstance("已存在该标签");
@@ -38,6 +55,7 @@
 
         sysVipLabel.setCreateBy(sysUsers.getSuName());
         sysVipLabel.setCreateTime(new Date());
+        sysVipLabel.setColor(Dictionary.COLORS[new Random().nextInt(6)]);
 
         int i = sysVipLabelDao.insert(sysVipLabel);
         if (i > 0) {
@@ -48,13 +66,54 @@
         return AjaxResult.buildFailInstance("添加失败");
     }
 
+    @RequestMapping(value = "/modify")
+    @ResponseBody
+    public AjaxResult modify(SysVipLabel sysVipLabel) {
+        SysUsers sysUsers = getMe();
+
+        SysVipLabel hasExist = sysVipLabelDao.selectById(sysVipLabel.getId());
+        if (!sysVipLabel.getLabel().equals(hasExist.getLabel())) {
+            SysVipLabel query = new SysVipLabel();
+            query.setIsAll(1);
+            query.setCompanyId(sysUsers.getCompanyId());
+            query.setLabel(sysVipLabel.getLabel());
+            List<SysVipLabel> sysVipLabels = sysVipLabelDao.selectByModel(sysVipLabel);
+            if (CollectionUtils.isNotEmpty(sysVipLabels)) {
+                return AjaxResult.buildFailInstance("已存在该标签");
+            }
+        }
+
+        sysVipLabel.setColor(Dictionary.COLORS[new Random().nextInt(6)]);
+
+        int i = sysVipLabelDao.update(sysVipLabel);
+        if (i > 0) {
+            AjaxResult ajaxResult = AjaxResult.buildSuccessInstance("编辑成功");
+            ajaxResult.putInMap("label", sysVipLabel);
+            return ajaxResult;
+        }
+        return AjaxResult.buildFailInstance("编辑失败");
+    }
+
     @RequestMapping(value = "/del")
     @ResponseBody
-    public AjaxResult del(Long id) {
-        int i = sysVipLabelDao.deleteById(id);
+    public AjaxResult del(String keys) {
+        List<Long> ids = StringUtils.strToCollToLong(keys, ",");
+        int i = sysVipLabelDao.deleteByIds(ids);
         if (i > 0) {
             return AjaxResult.buildSuccessInstance("删除成功");
+        } else {
+            return AjaxResult.buildFailInstance("删除失败");
         }
-        return AjaxResult.buildFailInstance("删除失败");
+    }
+
+
+
+    @RequestMapping(value = "/edit")
+    public String edit(Long id) {
+        if (id != null) {
+            SysVipLabel sysVipLabel = sysVipLabelDao.selectById(id);
+            WebUtil.getRequest().setAttribute("obj", sysVipLabel);
+        }
+        return "admin/hive/operate/label-form";
     }
 }
diff --git a/zq-erp/src/main/java/com/matrix/system/hive/action/TaocanController.java b/zq-erp/src/main/java/com/matrix/system/hive/action/TaocanController.java
index 607821c..ded5549 100644
--- a/zq-erp/src/main/java/com/matrix/system/hive/action/TaocanController.java
+++ b/zq-erp/src/main/java/com/matrix/system/hive/action/TaocanController.java
@@ -3,9 +3,11 @@
 import com.matrix.core.pojo.AjaxResult;
 import com.matrix.core.pojo.PaginationVO;
 import com.matrix.core.tools.WebUtil;
+import com.matrix.system.common.bean.SysUsers;
 import com.matrix.system.constance.Dictionary;
 import com.matrix.system.hive.bean.MoneyCardUse;
 import com.matrix.system.hive.bean.SysProjUse;
+import com.matrix.system.hive.bean.SysProjUseFlow;
 import com.matrix.system.hive.dao.SysProjUseDao;
 import com.matrix.system.hive.service.MoneyCardUseService;
 import com.matrix.system.hive.service.SysProjUseService;
@@ -63,7 +65,7 @@
         List<SysProjUse> projUseList =sysProjUseService.findInPage(sysProjUse,null);
         //设置套餐中的项目
         projUseList.forEach(taocanProjUse -> {
-            taocanProjUse.setTaocanProjUse(sysProjUseService.selectTaocanProjUse(taocanProjUse.getId()));
+            taocanProjUse.setTaocanProjUse(sysProjUseService.selectTaocanProjUse(taocanProjUse.getId(),sysProjUse.getStatus()));
         });
         return new AjaxResult(AjaxResult.STATUS_SUCCESS, projUseList, sysProjUseService.findTotal(sysProjUse));
     }
@@ -121,21 +123,7 @@
         return new AjaxResult(AjaxResult.STATUS_FAIL, "套餐转让失败");
     }
 
-    @RequestMapping(value = "/returnTc")
-    public @ResponseBody
-    AjaxResult returnTc(SysProjUse sysProjUse, Long moneyCardUseId, String tcRemark, Long shopId, Double money, String tcName) {
 
-        System.out.println("moneyCardUseId = " + moneyCardUseId);
-        MoneyCardUse card = moneyCardUseService.findById(moneyCardUseId);
-        System.out.println("card = " + card);
-        int i = sysProjUseService.returnMoneyTc(sysProjUse, card, moneyCardUseId);
-        if (i > 0) {
-
-
-            return new AjaxResult(AjaxResult.STATUS_SUCCESS, "退款成功");
-        }
-        return new AjaxResult(AjaxResult.STATUS_FAIL, "退款失败");
-    }
 
 
     /**
@@ -156,11 +144,7 @@
     }
 
 
-    /**
-     * 退款
-     *
-     * @return
-     */
+
     @RequestMapping(value = "/getEffectCard")
     public @ResponseBody
     AjaxResult getEffectCard(SysProjUse sysProjUse) {
@@ -192,7 +176,7 @@
     public String editForm(Long id) {
         if (id != null) {
             SysProjUse sysProjUse = sysProjUseService.findById(id);
-            sysProjUse.setTaocanProjUse(sysProjUseService.selectTaocanProjUse(sysProjUse.getId()));
+            sysProjUse.setTaocanProjUse(sysProjUseService.selectTaocanProjUse(sysProjUse.getId(), sysProjUse.getStatus()));
             WebUtil.getRequest().setAttribute("obj", sysProjUse);
         }
         return "admin/hive/vip/tc-form";
@@ -205,6 +189,27 @@
     public @ResponseBody
     AjaxResult addOrModify(SysProjUse sysProjUse) {
         if (sysProjUse.getId() != null) {
+
+            //插入修改记录
+            SysUsers user=getMe();
+            //插入修改记录
+            SysProjUse oldProjUse = sysProjUseService.findById(sysProjUse.getId());
+            SysProjUseFlow projUseFlow=new SysProjUseFlow();
+            projUseFlow.setProjUseId(sysProjUse.getId());
+            projUseFlow.setOptionType("人工修改");
+            projUseFlow.setProjName(oldProjUse.getProjName());
+            projUseFlow.setCreateBy(user.getSuName());
+            projUseFlow.setUpdateBy(user.getSuName());
+            projUseFlow.setPrice(sysProjUse.getPrice());
+            projUseFlow.setStatus(sysProjUse.getStatus());
+            projUseFlow.setBalance(sysProjUse.getBalance());
+            projUseFlow.setFailTime(sysProjUse.getFailTime());
+            projUseFlow.setIsOver(sysProjUse.getIsOver());
+            projUseFlow.setRemark(sysProjUse.getUpdateRemark());
+            projUseFlow.setSurplusCount(sysProjUse.getSurplusCount());
+            projUseDao.insertFlow(projUseFlow);
+
+
             int modifyResult = sysProjUseService.modify(sysProjUse);
 
             List<SysProjUse> modifyUse = sysProjUse.getTaocanProjUse();
@@ -212,6 +217,25 @@
             if (modifyResult > 0) {
                 if (CollectionUtils.isNotEmpty(modifyUse)) {
                     for (SysProjUse use : modifyUse) {
+
+                        //插入修改记录
+                        SysProjUse oldProjUse2 = sysProjUseService.findById(use.getId());
+                        SysProjUseFlow projUseFlow2=new SysProjUseFlow();
+                        //套餐中的项目需要记录套餐id
+                        projUseFlow2.setProjUseId(oldProjUse.getId());
+                        projUseFlow2.setOptionType("人工修改");
+                        projUseFlow2.setProjName(oldProjUse2.getProjName());
+                        projUseFlow2.setCreateBy(user.getSuName());
+                        projUseFlow2.setUpdateBy(user.getSuName());
+                        projUseFlow2.setPrice(use.getPrice());
+                        projUseFlow2.setStatus(use.getStatus());
+                        projUseFlow2.setBalance(use.getBalance());
+                        projUseFlow2.setFailTime(use.getFailTime());
+                        projUseFlow2.setIsOver(use.getIsOver());
+                        projUseFlow2.setRemark(sysProjUse.getUpdateRemark());
+                        projUseFlow2.setSurplusCount(use.getSurplusCount());
+                        projUseDao.insertFlow(projUseFlow2);
+
                         sysProjUseService.modify(use);
                     }
                 }
diff --git a/zq-erp/src/main/java/com/matrix/system/hive/bean/AchieveNew.java b/zq-erp/src/main/java/com/matrix/system/hive/bean/AchieveNew.java
index 957fea2..6a5a4f5 100644
--- a/zq-erp/src/main/java/com/matrix/system/hive/bean/AchieveNew.java
+++ b/zq-erp/src/main/java/com/matrix/system/hive/bean/AchieveNew.java
@@ -164,8 +164,11 @@
 			
 	
 	private String  t2;
-			
-	
+
+
+	/**
+	 * 业绩种类 1-现金业绩 2-划扣业绩
+	 */
 	private String  t3;
 			
 	
@@ -254,6 +257,36 @@
 	@Extend
 	private Double achieveMoney;
 
+	private String goodsNo;
+
+	private String goodsName;
+
+	private String type;
+
+	public String getType() {
+		return type;
+	}
+
+	public void setType(String type) {
+		this.type = type;
+	}
+
+	public String getGoodsNo() {
+		return goodsNo;
+	}
+
+	public void setGoodsNo(String goodsNo) {
+		this.goodsNo = goodsNo;
+	}
+
+	public String getGoodsName() {
+		return goodsName;
+	}
+
+	public void setGoodsName(String goodsName) {
+		this.goodsName = goodsName;
+	}
+
 	public Integer getArriveCnt() {
 		return arriveCnt;
 	}
diff --git a/zq-erp/src/main/java/com/matrix/system/hive/bean/AppVersion.java b/zq-erp/src/main/java/com/matrix/system/hive/bean/AppVersion.java
new file mode 100644
index 0000000..b61bd80
--- /dev/null
+++ b/zq-erp/src/main/java/com/matrix/system/hive/bean/AppVersion.java
@@ -0,0 +1,71 @@
+package com.matrix.system.hive.bean;
+
+import com.fasterxml.jackson.annotation.JsonFormat;
+
+import java.util.Date;
+
+/**
+ * @author wzy
+ * @date 2021-01-15
+ **/
+public class AppVersion {
+    private static final long serialVersionUID = 1L;
+
+    private Long id;
+
+    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8")
+    private Date createtime;
+
+    private String version;
+    private String content;
+    private String address;
+    private Integer type;
+
+    public Long getId() {
+        return id;
+    }
+
+    public void setId(Long id) {
+        this.id = id;
+    }
+
+    public Date getCreatetime() {
+        return createtime;
+    }
+
+    public void setCreatetime(Date createtime) {
+        this.createtime = createtime;
+    }
+
+    public String getVersion() {
+        return version;
+    }
+
+    public void setVersion(String version) {
+        this.version = version;
+    }
+
+    public String getContent() {
+        return content;
+    }
+
+    public void setContent(String content) {
+        this.content = content;
+    }
+
+    public String getAddress() {
+        return address;
+    }
+
+    public void setAddress(String address) {
+        this.address = address;
+    }
+
+    public Integer getType() {
+        return type;
+    }
+
+    public void setType(Integer type) {
+        this.type = type;
+    }
+}
diff --git a/zq-erp/src/main/java/com/matrix/system/hive/bean/Article.java b/zq-erp/src/main/java/com/matrix/system/hive/bean/Article.java
index 8619f5f..c1cdda4 100644
--- a/zq-erp/src/main/java/com/matrix/system/hive/bean/Article.java
+++ b/zq-erp/src/main/java/com/matrix/system/hive/bean/Article.java
@@ -1,5 +1,8 @@
 package com.matrix.system.hive.bean;
 
+import com.fasterxml.jackson.annotation.JsonFormat;
+import com.matrix.core.tools.DateUtil;
+
 import java.util.Date;
 import java.io.Serializable;
 /**
@@ -65,6 +68,7 @@
 	/**
 	 * 创建时间
 	 */
+	@JsonFormat(pattern = DateUtil.DATE_FORMAT_SS, timezone = "GMT+8")
 	private Date  createtiem;
 			
 	
@@ -92,14 +96,14 @@
 	 */
 	private Integer commentNum;
 
-	private Long shopId;
+	private Long companyId;
 
-	public Long getShopId() {
-		return shopId;
+	public Long getCompanyId() {
+		return companyId;
 	}
 
-	public void setShopId(Long shopId) {
-		this.shopId = shopId;
+	public void setCompanyId(Long companyId) {
+		this.companyId = companyId;
 	}
 
 	public Integer getCommentNum() {
diff --git a/zq-erp/src/main/java/com/matrix/system/hive/bean/ArticleType.java b/zq-erp/src/main/java/com/matrix/system/hive/bean/ArticleType.java
index 884b2c7..fc2cee1 100644
--- a/zq-erp/src/main/java/com/matrix/system/hive/bean/ArticleType.java
+++ b/zq-erp/src/main/java/com/matrix/system/hive/bean/ArticleType.java
@@ -56,6 +56,10 @@
 	private String  type;
 
 	private Long shopId;
+
+	private String parentIds;
+
+	private Long companyId;
 			
 	/**
 	 * 扩展属性
@@ -81,6 +85,15 @@
 	public void setArticle(Article article) {
 		this.article = article;
 	}*/
+
+	public Long getCompanyId() {
+		return companyId;
+	}
+
+	public void setCompanyId(Long companyId) {
+		this.companyId = companyId;
+	}
+
 	public Long getId() {
 		return id;
 	}
@@ -159,6 +172,14 @@
 		this.type=type;
 	}
 
+	public String getParentIds() {
+		return parentIds;
+	}
+
+	public void setParentIds(String parentIds) {
+		this.parentIds = parentIds;
+	}
+
 	@Override
 	public String toString() {
 		return "ArticleType [id=" + id + ", articleTypeName=" + articleTypeName
diff --git a/zq-erp/src/main/java/com/matrix/system/hive/bean/MoneyCardUse.java b/zq-erp/src/main/java/com/matrix/system/hive/bean/MoneyCardUse.java
index 99d661c..5c37494 100644
--- a/zq-erp/src/main/java/com/matrix/system/hive/bean/MoneyCardUse.java
+++ b/zq-erp/src/main/java/com/matrix/system/hive/bean/MoneyCardUse.java
@@ -77,6 +77,11 @@
 	 * 充值卡的id
 	 */
 	private Long  goodsId;
+
+	/**
+	 * 订单ID
+	 */
+	private Long  orderId;
 			
 	
 	private Long  vipId;
@@ -88,7 +93,7 @@
 	private String  isOver;
 			
 	/**
-	 * 是会籍卡? Y 是,N否
+	 * 是默认储值卡? Y 是,N否
 	 */
 	private String  isVipCar;
 	/**
@@ -105,6 +110,14 @@
 	 */
 	private String cardName;
 
+	public Long getOrderId() {
+		return orderId;
+	}
+
+	public void setOrderId(Long orderId) {
+		this.orderId = orderId;
+	}
+
 	public String getCardName() {
 		return cardName;
 	}
diff --git a/zq-erp/src/main/java/com/matrix/system/hive/bean/ShoppingGoodsCategory2.java b/zq-erp/src/main/java/com/matrix/system/hive/bean/ShoppingGoodsCategory2.java
new file mode 100644
index 0000000..fae082b
--- /dev/null
+++ b/zq-erp/src/main/java/com/matrix/system/hive/bean/ShoppingGoodsCategory2.java
@@ -0,0 +1,112 @@
+package com.matrix.system.hive.bean;
+
+import java.io.Serializable;
+
+/**
+ *
+ * @date 2016-07-30 09:54
+ */
+public class ShoppingGoodsCategory2 implements Serializable{
+
+	private static final long serialVersionUID = 1L; 
+
+	
+	private String  id;
+			
+	
+	/**
+	 * 类型名称
+	 */
+	private String  name;
+			
+	
+	/**
+	 * 父类型
+	 */
+	private Long  parentId;
+			
+	
+	/**
+	 * 排序
+	 */
+	private Integer  sequence;
+	
+	/**
+	 * 销售平台
+	 */
+	private String salePlatform;
+
+
+	private Long shopId;
+
+	private Long companyId;
+
+	public Long getShopId() {
+		return shopId;
+	}
+
+	public void setShopId(Long shopId) {
+		this.shopId = shopId;
+	}
+
+	public Long getCompanyId() {
+		return companyId;
+	}
+
+	public void setCompanyId(Long companyId) {
+		this.companyId = companyId;
+	}
+
+
+	public String getId() {
+		return id;
+	}
+   	
+   	public void setId(String id) {
+		this.id=id;
+	}
+   	
+
+	public String getName() {
+		return name;
+	}
+   	
+   	public void setName(String name) {
+		this.name=name;
+	}
+   	
+
+	public Long getParentId() {
+		return parentId;
+	}
+   	
+   	public void setParentId(Long parentId) {
+		this.parentId=parentId;
+	}
+   	
+
+	public Integer getSequence() {
+		return sequence;
+	}
+   	
+   	public void setSequence(Integer sequence) {
+		this.sequence=sequence;
+	}
+
+	public String getSalePlatform() {
+		return salePlatform;
+	}
+
+	public void setSalePlatform(String salePlatform) {
+		this.salePlatform = salePlatform;
+	}
+
+	@Override
+	public String toString() {
+		return "ShoppingGoodsCategory [id=" + id + ", name=" + name
+				+ ", parentId=" + parentId + ", sequence=" + sequence
+				+ ", salePlatform=" + salePlatform + "]";
+	}
+   	
+  
+}
\ No newline at end of file
diff --git a/zq-erp/src/main/java/com/matrix/system/hive/bean/SysFollowup.java b/zq-erp/src/main/java/com/matrix/system/hive/bean/SysFollowup.java
new file mode 100644
index 0000000..3085a5c
--- /dev/null
+++ b/zq-erp/src/main/java/com/matrix/system/hive/bean/SysFollowup.java
@@ -0,0 +1,286 @@
+package com.matrix.system.hive.bean;
+
+import com.fasterxml.jackson.annotation.JsonFormat;
+import com.matrix.core.pojo.EntityDTO;
+import com.matrix.core.anotations.Extend;
+import com.matrix.core.tools.DateUtil;
+import com.matrix.system.common.bean.EntityDTOExt;
+import com.matrix.system.common.bean.SysUsers;
+import io.swagger.annotations.ApiModelProperty;
+import org.springframework.format.annotation.DateTimeFormat;
+
+import javax.validation.constraints.NotNull;
+import java.util.Date;
+import java.util.List;
+
+/**
+ * @description 跟进
+ * @author 
+ * @date 2021-01-10 15:15
+ */
+public class SysFollowup  extends EntityDTOExt{
+	@Extend
+	private static final long serialVersionUID = 1L; 
+
+	
+	/**
+	 * 主键
+	 */
+	private Long  id;
+			
+	
+	/**
+	 * 员工ID
+	 */
+	private Long  staffId;
+			
+	
+	/**
+	 * 客户ID
+	 */
+	@NotNull(message = "客户ID不能为空")
+	@ApiModelProperty(value = "客户ID", example = "10")
+	private Long  vipId;
+			
+	
+	/**
+	 * 订单id
+	 */
+	@ApiModelProperty(value = "订单id", example = "10")
+	private Long  orderId;
+			
+	
+	/**
+	 * 服务单id
+	 */
+	@ApiModelProperty(value = "服务单id", example = "10")
+	private Long  serviceId;
+			
+	
+	/**
+	 * 门店id
+	 */
+	private Long  shopId;
+			
+	
+	/**
+	 * 公司id
+	 */
+	private Long  companyId;
+			
+	
+	/**
+	 * 下次跟进时间
+	 */
+	@ApiModelProperty(value = "下次跟进时间", example = "2021-01-02 12:22")
+	@JsonFormat(pattern = DateUtil.DATE_FORMAT_MM, timezone = "GMT+8")
+	private Date nextNotifyTime;
+			
+	
+	/**
+	 * 跟进内容
+	 */
+	@NotNull(message = "跟进内容不能为空")
+	@ApiModelProperty(value = "跟进内容", example = "")
+	private String  content;
+			
+	
+	/**
+	 * 可见范围1公开,2仅自己可见
+	 */
+	@NotNull(message = "可见范围不能为空")
+	@ApiModelProperty(value = "可见范围1公开,2仅自己可见", example = "")
+	private Integer  visible;
+			
+	
+	/**
+	 * 订单摘要信息
+	 */
+	@ApiModelProperty(value = "订单摘要信息", example = "")
+	private String  orderAbstract;
+
+	/**
+	 * 点赞人ids
+	 */
+	@ApiModelProperty(value = "点赞人ids", example = "1,2")
+	private String  zans;
+
+	@Extend
+	@ApiModelProperty(value = "点赞人列表",example ="")
+	private List<SysUsers> zanUsers;
+
+	@Extend
+	@ApiModelProperty(value = "图片集合", example = "")
+	private List<SysVipAlbum> albums;
+
+	@Extend
+	@ApiModelProperty(value = "评论集合",example ="")
+	private List<SysFollowupComment> followupComments;
+
+	@Extend
+	@ApiModelProperty(value = "员工名称",example ="")
+	private String staffName;
+
+	@Extend
+	@ApiModelProperty(value = "员工头像",example ="")
+	private String staffPhoto;
+
+	@Extend
+	@ApiModelProperty(value = "客户名称",example ="")
+	private String vipName;
+
+	public String getStaffName() {
+		return staffName;
+	}
+
+	public void setStaffName(String staffName) {
+		this.staffName = staffName;
+	}
+
+	public String getStaffPhoto() {
+		return staffPhoto;
+	}
+
+	public void setStaffPhoto(String staffPhoto) {
+		this.staffPhoto = staffPhoto;
+	}
+
+	public String getVipName() {
+		return vipName;
+	}
+
+	public void setVipName(String vipName) {
+		this.vipName = vipName;
+	}
+
+	public List<SysFollowupComment> getFollowupComments() {
+		return followupComments;
+	}
+
+	public void setFollowupComments(List<SysFollowupComment> followupComments) {
+		this.followupComments = followupComments;
+	}
+
+	public Integer getVisible() {
+		return visible;
+	}
+
+	public void setVisible(Integer visible) {
+		this.visible = visible;
+	}
+
+	public List<SysUsers> getZanUsers() {
+		return zanUsers;
+	}
+
+	public void setZanUsers(List<SysUsers> zanUsers) {
+		this.zanUsers = zanUsers;
+	}
+
+	public Long getId() {
+		return id;
+	}
+
+	public void setId(Long id) {
+		this.id = id;
+	}
+
+	public Long getStaffId() {
+		return staffId;
+	}
+
+	public void setStaffId(Long staffId) {
+		this.staffId = staffId;
+	}
+
+	public Long getVipId() {
+		return vipId;
+	}
+
+	public void setVipId(Long vipId) {
+		this.vipId = vipId;
+	}
+
+	public Long getOrderId() {
+		return orderId;
+	}
+
+	public void setOrderId(Long orderId) {
+		this.orderId = orderId;
+	}
+
+	public Long getServiceId() {
+		return serviceId;
+	}
+
+	public void setServiceId(Long serviceId) {
+		this.serviceId = serviceId;
+	}
+
+	public Long getShopId() {
+		return shopId;
+	}
+
+	public void setShopId(Long shopId) {
+		this.shopId = shopId;
+	}
+
+	public Long getCompanyId() {
+		return companyId;
+	}
+
+	public void setCompanyId(Long companyId) {
+		this.companyId = companyId;
+	}
+
+	public List<SysVipAlbum> getAlbums() {
+		return albums;
+	}
+
+	public void setAlbums(List<SysVipAlbum> albums) {
+		this.albums = albums;
+	}
+
+	public Date getNextNotifyTime() {
+		return nextNotifyTime;
+	}
+   	
+   	public SysFollowup setNextNotifyTime(Date nextNotifyTime) {
+		this.nextNotifyTime=nextNotifyTime;
+		return this;
+	}
+   	
+
+	public String getContent() {
+		return content;
+	}
+   	
+   	public SysFollowup setContent(String content) {
+		this.content=content;
+		return this;
+	}
+   	
+
+	public String getOrderAbstract() {
+		return orderAbstract;
+	}
+   	
+   	public SysFollowup setOrderAbstract(String orderAbstract) {
+		this.orderAbstract=orderAbstract;
+		return this;
+	}
+   	
+
+	public String getZans() {
+		return zans;
+	}
+   	
+   	public SysFollowup setZans(String zans) {
+		this.zans=zans;
+		return this;
+	}
+   	
+
+
+  
+}
\ No newline at end of file
diff --git a/zq-erp/src/main/java/com/matrix/system/hive/bean/SysFollowupComment.java b/zq-erp/src/main/java/com/matrix/system/hive/bean/SysFollowupComment.java
new file mode 100644
index 0000000..75602b4
--- /dev/null
+++ b/zq-erp/src/main/java/com/matrix/system/hive/bean/SysFollowupComment.java
@@ -0,0 +1,90 @@
+package com.matrix.system.hive.bean;
+
+import com.matrix.core.pojo.EntityDTO;
+import com.matrix.core.anotations.Extend;
+import io.swagger.annotations.ApiModelProperty;
+
+import javax.validation.constraints.NotNull;
+
+/**
+ * @description 跟进评论
+ * @author 
+ * @date 2021-01-10 15:15
+ */
+public class SysFollowupComment  extends EntityDTO{
+	@Extend
+	private static final long serialVersionUID = 1L; 
+
+	
+	/**
+	 * 主键
+	 */
+	private Long  id;
+			
+	
+	/**
+	 * 跟进id
+	 */
+	@NotNull(message = "跟进记录id不能为空")
+	@ApiModelProperty(value = "跟进id", example = "1")
+	private Long  follId;
+			
+	
+	/**
+	 * 员工ID
+	 */
+	private Long  staffId;
+			
+	
+	/**
+	 * 评论内容
+	 */
+	@NotNull(message = "评论内容不能为空")
+	@ApiModelProperty(value = "评论内容不能为空", example = "不错")
+	private String  content;
+			
+	
+
+	public Long getId() {
+		return id;
+	}
+   	
+   	public SysFollowupComment setId(Long id) {
+		this.id=id;
+		return this;
+	}
+   	
+
+	public Long getFollId() {
+		return follId;
+	}
+   	
+   	public SysFollowupComment setFollId(Long follId) {
+		this.follId=follId;
+		return this;
+	}
+   	
+
+	public Long getStaffId() {
+		return staffId;
+	}
+   	
+   	public SysFollowupComment setStaffId(Long staffId) {
+		this.staffId=staffId;
+		return this;
+	}
+   	
+
+	public String getContent() {
+		return content;
+	}
+   	
+   	public SysFollowupComment setContent(String content) {
+		this.content=content;
+		return this;
+	}
+   	
+
+
+  
+}
\ No newline at end of file
diff --git a/zq-erp/src/main/java/com/matrix/system/hive/bean/SysInstoreInfo.java b/zq-erp/src/main/java/com/matrix/system/hive/bean/SysInstoreInfo.java
index 5974dbb..266437e 100644
--- a/zq-erp/src/main/java/com/matrix/system/hive/bean/SysInstoreInfo.java
+++ b/zq-erp/src/main/java/com/matrix/system/hive/bean/SysInstoreInfo.java
@@ -18,6 +18,7 @@
 
 	private static final long serialVersionUID = 1L;
 
+	public static final String INSTORE_TYPE_RETURN = "退货入库";
 
 	/**
 	 * 序号
diff --git a/zq-erp/src/main/java/com/matrix/system/hive/bean/SysOrder.java b/zq-erp/src/main/java/com/matrix/system/hive/bean/SysOrder.java
index 663fa32..7f34c77 100644
--- a/zq-erp/src/main/java/com/matrix/system/hive/bean/SysOrder.java
+++ b/zq-erp/src/main/java/com/matrix/system/hive/bean/SysOrder.java
@@ -115,6 +115,8 @@
 	 * 订单明细
 	 */
 	private List<SysOrderItem> items;
+
+	private List<SysOrderFlow> flows;
 	/**
 	 * 会员姓名
 	 */
@@ -132,6 +134,8 @@
 	private	String staffName;
 	
 	private String shopName;
+
+	private String shopShortName;
 	
 	private Long searchShop;
 	/**
@@ -161,6 +165,45 @@
 	 */
 	private Integer times;
 
+	private String type;
+
+	/**
+	 * 原有订单ID 退款时使用
+	 */
+	private Long oldOrderId;
+
+	public Long getOldOrderId() {
+		return oldOrderId;
+	}
+
+	public void setOldOrderId(Long oldOrderId) {
+		this.oldOrderId = oldOrderId;
+	}
+
+	public List<SysOrderFlow> getFlows() {
+		return flows;
+	}
+
+	public void setFlows(List<SysOrderFlow> flows) {
+		this.flows = flows;
+	}
+
+	public String getShopShortName() {
+		return shopShortName;
+	}
+
+	public void setShopShortName(String shopShortName) {
+		this.shopShortName = shopShortName;
+	}
+
+	public String getType() {
+		return type;
+	}
+
+	public void setType(String type) {
+		this.type = type;
+	}
+
 	public Integer getTimes() {
 		return times;
 	}
diff --git a/zq-erp/src/main/java/com/matrix/system/hive/bean/SysOrderFlow.java b/zq-erp/src/main/java/com/matrix/system/hive/bean/SysOrderFlow.java
new file mode 100644
index 0000000..8c8cc65
--- /dev/null
+++ b/zq-erp/src/main/java/com/matrix/system/hive/bean/SysOrderFlow.java
@@ -0,0 +1,200 @@
+package com.matrix.system.hive.bean;
+
+import com.fasterxml.jackson.annotation.JsonFormat;
+import com.matrix.core.tools.DateUtil;
+
+import java.io.Serializable;
+import java.math.BigDecimal;
+import java.util.Date;
+
+/**
+ * @author wzy
+ * @date 2021-01-07
+ **/
+public class SysOrderFlow implements Serializable {
+    private static final long serialVersionUID = 7519131902836023680L;
+
+    public static final String PAY_METHOD_CARD = "储值卡";
+
+    public static final String PAY_METHOD_ARREARS = "欠款";
+
+    public static final String FLOW_TYPE_BUY = "购买";
+
+    public static final String FLOW_TYPE_REPAY = "还款";
+
+    public static final String FLOW_TYPE_REFUND = "退款";
+
+    public static final String IS_GIFT_Y = "Y";
+    public static final String IS_GIFT_N = "N";
+
+    private String createBy;
+
+    @JsonFormat(pattern = DateUtil.DATE_FORMAT_MM, timezone = "GMT-8")
+    private Date createTime;
+
+    private String updateBy;
+
+    private Date updateTime;
+
+    private Long id;
+
+    private String flowNo;
+
+    private Long orderId;
+
+    private String flowContent;
+
+    private String flowType;
+
+    private BigDecimal amount;
+
+    private String payMethod;
+
+    private Long vipId;
+
+    private Long cardId;
+
+    private String isGift;
+
+    private String orderNo;
+
+    private Long shopId;
+
+    private Long companyId;
+
+    public String getOrderNo() {
+        return orderNo;
+    }
+
+    public void setOrderNo(String orderNo) {
+        this.orderNo = orderNo;
+    }
+
+    public Long getCardId() {
+        return cardId;
+    }
+
+    public void setCardId(Long cardId) {
+        this.cardId = cardId;
+    }
+
+    public String getIsGift() {
+        return isGift;
+    }
+
+    public void setIsGift(String isGift) {
+        this.isGift = isGift;
+    }
+
+    public String getCreateBy() {
+        return createBy;
+    }
+
+    public void setCreateBy(String createBy) {
+        this.createBy = createBy;
+    }
+
+    public Date getCreateTime() {
+        return createTime;
+    }
+
+    public void setCreateTime(Date createTime) {
+        this.createTime = createTime;
+    }
+
+    public String getUpdateBy() {
+        return updateBy;
+    }
+
+    public void setUpdateBy(String updateBy) {
+        this.updateBy = updateBy;
+    }
+
+    public Date getUpdateTime() {
+        return updateTime;
+    }
+
+    public void setUpdateTime(Date updateTime) {
+        this.updateTime = updateTime;
+    }
+
+    public Long getId() {
+        return id;
+    }
+
+    public void setId(Long id) {
+        this.id = id;
+    }
+
+    public String getFlowNo() {
+        return flowNo;
+    }
+
+    public void setFlowNo(String flowNo) {
+        this.flowNo = flowNo;
+    }
+
+    public Long getOrderId() {
+        return orderId;
+    }
+
+    public void setOrderId(Long orderId) {
+        this.orderId = orderId;
+    }
+
+    public String getFlowContent() {
+        return flowContent;
+    }
+
+    public void setFlowContent(String flowContent) {
+        this.flowContent = flowContent;
+    }
+
+    public String getFlowType() {
+        return flowType;
+    }
+
+    public void setFlowType(String flowType) {
+        this.flowType = flowType;
+    }
+
+    public BigDecimal getAmount() {
+        return amount;
+    }
+
+    public void setAmount(BigDecimal amount) {
+        this.amount = amount;
+    }
+
+    public String getPayMethod() {
+        return payMethod;
+    }
+
+    public void setPayMethod(String payMethod) {
+        this.payMethod = payMethod;
+    }
+
+    public Long getVipId() {
+        return vipId;
+    }
+
+    public void setVipId(Long vipId) {
+        this.vipId = vipId;
+    }
+
+    public Long getShopId() {
+        return shopId;
+    }
+
+    public void setShopId(Long shopId) {
+        this.shopId = shopId;
+    }
+
+    public Long getCompanyId() {
+        return companyId;
+    }
+
+    public void setCompanyId(Long companyId) {
+        this.companyId = companyId;
+    }
+}
diff --git a/zq-erp/src/main/java/com/matrix/system/hive/bean/SysOrderItem.java b/zq-erp/src/main/java/com/matrix/system/hive/bean/SysOrderItem.java
index 42eab39..c572e30 100644
--- a/zq-erp/src/main/java/com/matrix/system/hive/bean/SysOrderItem.java
+++ b/zq-erp/src/main/java/com/matrix/system/hive/bean/SysOrderItem.java
@@ -124,6 +124,45 @@
 
 	private ShoppingGoods shoppingGoods;
 
+	/**
+	 * 原有数量
+	 */
+	private int preCount;
+
+	/**
+	 * 是否退库存
+	 */
+	private String isReturnStore;
+
+	/**
+	 * 退款时,原itemid
+	 */
+	private Long oldItemId;
+
+	public Long getOldItemId() {
+		return oldItemId;
+	}
+
+	public void setOldItemId(Long oldItemId) {
+		this.oldItemId = oldItemId;
+	}
+
+	public String getIsReturnStore() {
+		return isReturnStore;
+	}
+
+	public void setIsReturnStore(String isReturnStore) {
+		this.isReturnStore = isReturnStore;
+	}
+
+	public int getPreCount() {
+		return preCount;
+	}
+
+	public void setPreCount(int preCount) {
+		this.preCount = preCount;
+	}
+
 	public ShoppingGoods getShoppingGoods() {
 		return shoppingGoods;
 	}
diff --git a/zq-erp/src/main/java/com/matrix/system/hive/bean/SysProjServices.java b/zq-erp/src/main/java/com/matrix/system/hive/bean/SysProjServices.java
index 70cd5a4..1350bdb 100644
--- a/zq-erp/src/main/java/com/matrix/system/hive/bean/SysProjServices.java
+++ b/zq-erp/src/main/java/com/matrix/system/hive/bean/SysProjServices.java
@@ -43,6 +43,8 @@
     /**
      * 订单划扣时间
      */
+    @JsonFormat(pattern = DateUtil.DATE_FORMAT_MM, timezone = "GMT+8")
+    @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm")
     private Date consumeTime;
 
     /**
@@ -232,6 +234,14 @@
      * 床位名称
      */
     private String bedName;
+     /**
+     * 评价
+     */
+    private String comment;
+     /**
+     * 评价回复
+     */
+    private String reply;
     /**
      * 商机
      */
@@ -241,6 +251,12 @@
      * 服务预计时长
      */
     private Integer totalTime;
+
+
+    /**
+     * 到时提醒次数
+     */
+    private Integer overtimeNotice;
 
 
 
@@ -255,6 +271,22 @@
      * 门店
      */
     private SysShopInfo shopInfo;
+
+    public String getComment() {
+        return comment;
+    }
+
+    public void setComment(String comment) {
+        this.comment = comment;
+    }
+
+    public String getReply() {
+        return reply;
+    }
+
+    public void setReply(String reply) {
+        this.reply = reply;
+    }
 
     @Extend
     private String shopName;
@@ -306,6 +338,15 @@
     @Extend
     private String pageFlae;
 
+
+    public Integer getOvertimeNotice() {
+        return overtimeNotice;
+    }
+
+    public void setOvertimeNotice(Integer overtimeNotice) {
+        this.overtimeNotice = overtimeNotice;
+    }
+
     public String getPageFlae() {
         return pageFlae;
     }
diff --git a/zq-erp/src/main/java/com/matrix/system/hive/bean/SysProjUse.java b/zq-erp/src/main/java/com/matrix/system/hive/bean/SysProjUse.java
index d331b5b..94b8b15 100644
--- a/zq-erp/src/main/java/com/matrix/system/hive/bean/SysProjUse.java
+++ b/zq-erp/src/main/java/com/matrix/system/hive/bean/SysProjUse.java
@@ -2,7 +2,9 @@
 
 import com.fasterxml.jackson.annotation.JsonFormat;
 import com.matrix.core.anotations.Extend;
+import com.matrix.core.pojo.EntityDTO;
 import com.matrix.core.tools.DateUtil;
+import com.matrix.system.common.bean.EntityDTOExt;
 import org.springframework.format.annotation.DateTimeFormat;
 
 import java.io.Serializable;
@@ -13,7 +15,7 @@
 /**
  * @date 2016-07-03 20:53
  */
-public class SysProjUse implements Serializable {
+public class SysProjUse extends EntityDTO {
 
     private static final long serialVersionUID = 1L;
 
@@ -47,6 +49,9 @@
     @JsonFormat(pattern = DateUtil.DATE_FORMAT_DD, timezone = "GMT+8")
     @DateTimeFormat(pattern = DateUtil.DATE_FORMAT_DD)
     private Date failTime;
+
+
+    private Date targetFailTime;
     /**
      * 套餐id
      */
@@ -56,6 +61,12 @@
      * 订单明细id 不明确
      */
     private Long orderItemId;
+
+    /**
+     * 订单id
+     */
+    @Extend
+    private Long orderId;
 
     /**
      * 单次扣减金额(理解为单次手工业绩)
@@ -123,6 +134,64 @@
      */
     private Integer deductionNum;
 
+    private Integer timeLength;
+
+    private String img;
+
+    private String queryKey;
+
+    @Extend
+    private String updateRemark;
+
+
+    public Long getOrderId() {
+        return orderId;
+    }
+
+    public void setOrderId(Long orderId) {
+        this.orderId = orderId;
+    }
+
+    public String getUpdateRemark() {
+        return updateRemark;
+    }
+
+    public void setUpdateRemark(String updateRemark) {
+        this.updateRemark = updateRemark;
+    }
+
+    public Date getTargetFailTime() {
+        return targetFailTime;
+    }
+
+    public void setTargetFailTime(Date targetFailTime) {
+        this.targetFailTime = targetFailTime;
+    }
+
+    public String getQueryKey() {
+        return queryKey;
+    }
+
+    public void setQueryKey(String queryKey) {
+        this.queryKey = queryKey;
+    }
+
+    public Integer getTimeLength() {
+        return timeLength;
+    }
+
+    public void setTimeLength(Integer timeLength) {
+        this.timeLength = timeLength;
+    }
+
+    public String getImg() {
+        return img;
+    }
+
+    public void setImg(String img) {
+        this.img = img;
+    }
+
     public String getIsInfinite() {
         return isInfinite;
     }
diff --git a/zq-erp/src/main/java/com/matrix/system/hive/bean/SysProjUseFlow.java b/zq-erp/src/main/java/com/matrix/system/hive/bean/SysProjUseFlow.java
new file mode 100644
index 0000000..932fffb
--- /dev/null
+++ b/zq-erp/src/main/java/com/matrix/system/hive/bean/SysProjUseFlow.java
@@ -0,0 +1,200 @@
+package com.matrix.system.hive.bean;
+
+import com.fasterxml.jackson.annotation.JsonFormat;
+import com.matrix.core.anotations.Extend;
+import com.matrix.core.pojo.EntityDTO;
+import com.matrix.core.tools.DateUtil;
+import com.matrix.system.common.bean.EntityDTOExt;
+import io.swagger.annotations.ApiModelProperty;
+import org.springframework.format.annotation.DateTimeFormat;
+
+import javax.validation.constraints.NotBlank;
+import java.io.Serializable;
+import java.util.Date;
+import java.util.List;
+
+
+/**项目余次操作记录
+ * @date 2016-07-03 20:53
+ */
+public class SysProjUseFlow extends EntityDTO {
+
+    private static final long serialVersionUID = 1L;
+
+    /**
+     */
+    private Long id;
+
+
+    /**
+     * 项目id
+     */
+    private Long projUseId;
+
+    /**
+     * 剩余次数
+     */
+    private Integer surplusCount;
+
+    /**
+     * 是否使用完成Y完成,N未完成
+     */
+    private String isOver;
+
+    /**
+     * 有效期
+     */
+    @JsonFormat(pattern = DateUtil.DATE_FORMAT_DD, timezone = "GMT+8")
+    @DateTimeFormat(pattern = DateUtil.DATE_FORMAT_DD)
+    private Date failTime;
+
+    /**
+     * 单次扣减金额
+     */
+    private Double price;
+
+    /**
+     * 套餐状态,有效,无效,冻结,转让,退款
+     */
+    private String status;
+
+
+
+    /**
+     * 使用情况余额
+     */
+    private Double balance;
+
+    /**
+     * 备注
+     */
+    private String remark;
+
+
+
+    /**
+     * 项目名称
+     */
+    private String projName;
+
+    /**
+     * 操作类型
+     */
+    private String optionType;
+
+    /**
+     * 开始时间
+     */
+    @Extend
+    private String beginTime;
+
+    /**
+     *结束时间
+     */
+    @Extend
+    private String endTime;
+
+    public String getBeginTime() {
+        return beginTime;
+    }
+
+    public void setBeginTime(String beginTime) {
+        this.beginTime = beginTime;
+    }
+
+    public String getEndTime() {
+        return endTime;
+    }
+
+    public void setEndTime(String endTime) {
+        this.endTime = endTime;
+    }
+
+    public Long getId() {
+        return id;
+    }
+
+    public void setId(Long id) {
+        this.id = id;
+    }
+
+    public Long getProjUseId() {
+        return projUseId;
+    }
+
+    public void setProjUseId(Long projUseId) {
+        this.projUseId = projUseId;
+    }
+
+    public Integer getSurplusCount() {
+        return surplusCount;
+    }
+
+    public void setSurplusCount(Integer surplusCount) {
+        this.surplusCount = surplusCount;
+    }
+
+    public String getIsOver() {
+        return isOver;
+    }
+
+    public void setIsOver(String isOver) {
+        this.isOver = isOver;
+    }
+
+    public Date getFailTime() {
+        return failTime;
+    }
+
+    public void setFailTime(Date failTime) {
+        this.failTime = failTime;
+    }
+
+    public Double getPrice() {
+        return price;
+    }
+
+    public void setPrice(Double price) {
+        this.price = price;
+    }
+
+    public String getStatus() {
+        return status;
+    }
+
+    public void setStatus(String status) {
+        this.status = status;
+    }
+
+    public Double getBalance() {
+        return balance;
+    }
+
+    public void setBalance(Double balance) {
+        this.balance = balance;
+    }
+
+    public String getRemark() {
+        return remark;
+    }
+
+    public void setRemark(String remark) {
+        this.remark = remark;
+    }
+
+    public String getProjName() {
+        return projName;
+    }
+
+    public void setProjName(String projName) {
+        this.projName = projName;
+    }
+
+    public String getOptionType() {
+        return optionType;
+    }
+
+    public void setOptionType(String optionType) {
+        this.optionType = optionType;
+    }
+}
diff --git a/zq-erp/src/main/java/com/matrix/system/hive/bean/SysSkinCheckRecord.java b/zq-erp/src/main/java/com/matrix/system/hive/bean/SysSkinCheckRecord.java
index 6fac369..62d9262 100644
--- a/zq-erp/src/main/java/com/matrix/system/hive/bean/SysSkinCheckRecord.java
+++ b/zq-erp/src/main/java/com/matrix/system/hive/bean/SysSkinCheckRecord.java
@@ -98,11 +98,22 @@
 	private String userName;
 
 	@Extend
+	private String sex;
+
+	@Extend
 	private String shopName;
 
 	@Extend
 	private String checkUserName;
 
+	public String getSex() {
+		return sex;
+	}
+
+	public void setSex(String sex) {
+		this.sex = sex;
+	}
+
 	public Date getBeginTime() {
 		return beginTime;
 	}
diff --git a/zq-erp/src/main/java/com/matrix/system/hive/bean/SysStoreInfo.java b/zq-erp/src/main/java/com/matrix/system/hive/bean/SysStoreInfo.java
index 4be4827..658e142 100644
--- a/zq-erp/src/main/java/com/matrix/system/hive/bean/SysStoreInfo.java
+++ b/zq-erp/src/main/java/com/matrix/system/hive/bean/SysStoreInfo.java
@@ -87,6 +87,17 @@
 
 	private String name;
 
+	@Extend
+	private String queryKey;
+
+	public String getQueryKey() {
+		return queryKey;
+	}
+
+	public void setQueryKey(String queryKey) {
+		this.queryKey = queryKey;
+	}
+
 	public String getName() {
 		return name;
 	}
diff --git a/zq-erp/src/main/java/com/matrix/system/hive/bean/SysVipAlbum.java b/zq-erp/src/main/java/com/matrix/system/hive/bean/SysVipAlbum.java
new file mode 100644
index 0000000..b6e2a82
--- /dev/null
+++ b/zq-erp/src/main/java/com/matrix/system/hive/bean/SysVipAlbum.java
@@ -0,0 +1,96 @@
+package com.matrix.system.hive.bean;
+
+import com.matrix.core.pojo.EntityDTO;
+import com.matrix.core.anotations.Extend;
+
+/**
+ * @description 客户相册
+ * @author 
+ * @date 2021-01-10 15:15
+ */
+public class SysVipAlbum  extends EntityDTO{
+	@Extend
+	private static final long serialVersionUID = 1L; 
+	public static final int SOURCE_FOLLOW = 1;
+	public static final int SOURCE_SKILL = 2;
+
+	
+	/**
+	 * 主键
+	 */
+	private Long  id;
+			
+	
+	/**
+	 * 客户ID
+	 */
+	private Long  vipId;
+			
+	
+	/**
+	 * 图片路径
+	 */
+	private String  img;
+			
+	
+	/**
+	 * 来源1,跟进,2批发检测
+	 */
+	private Integer  source;
+			
+	
+	/**
+	 * 来源主键
+	 */
+	private Long  sourceId;
+
+
+	public Long getId() {
+		return id;
+	}
+
+	public void setId(Long id) {
+		this.id = id;
+	}
+
+	public Long getVipId() {
+		return vipId;
+	}
+
+	public void setVipId(Long vipId) {
+		this.vipId = vipId;
+	}
+
+	public String getImg() {
+		return img;
+	}
+   	
+   	public SysVipAlbum setImg(String img) {
+		this.img=img;
+		return this;
+	}
+   	
+
+	public Integer getSource() {
+		return source;
+	}
+   	
+   	public SysVipAlbum setSource(Integer source) {
+		this.source=source;
+		return this;
+	}
+   	
+
+	public Long getSourceId() {
+		return sourceId;
+	}
+   	
+   	public SysVipAlbum setSourceId(Long sourceId) {
+		this.sourceId=sourceId;
+		return this;
+	}
+   	
+
+
+  
+}
\ No newline at end of file
diff --git a/zq-erp/src/main/java/com/matrix/system/hive/bean/SysVipInfo.java b/zq-erp/src/main/java/com/matrix/system/hive/bean/SysVipInfo.java
index 350d487..308720b 100644
--- a/zq-erp/src/main/java/com/matrix/system/hive/bean/SysVipInfo.java
+++ b/zq-erp/src/main/java/com/matrix/system/hive/bean/SysVipInfo.java
@@ -190,6 +190,26 @@
 	private Long companyId;
 
 
+	/**
+	 * 省
+	 */
+	private String province;
+
+	/**
+	 * 市
+	 */
+	private String city;
+
+	/**
+	 * 区
+	 */
+	private String area;
+
+	/**
+	 * 推荐人
+	 */
+	private Long recommendId;
+
 
 	//血型
 	private String blood;
@@ -210,6 +230,38 @@
 
 	private SysOrder sysOrder;
 
+	public String getProvince() {
+		return province;
+	}
+
+	public void setProvince(String province) {
+		this.province = province;
+	}
+
+	public String getCity() {
+		return city;
+	}
+
+	public void setCity(String city) {
+		this.city = city;
+	}
+
+	public String getArea() {
+		return area;
+	}
+
+	public void setArea(String area) {
+		this.area = area;
+	}
+
+	public Long getRecommendId() {
+		return recommendId;
+	}
+
+	public void setRecommendId(Long recommendId) {
+		this.recommendId = recommendId;
+	}
+
 	public SysOrder getSysOrder() {
 		return sysOrder;
 	}
diff --git a/zq-erp/src/main/java/com/matrix/system/hive/bean/SysVipLabel.java b/zq-erp/src/main/java/com/matrix/system/hive/bean/SysVipLabel.java
index fe57323..edfde3a 100644
--- a/zq-erp/src/main/java/com/matrix/system/hive/bean/SysVipLabel.java
+++ b/zq-erp/src/main/java/com/matrix/system/hive/bean/SysVipLabel.java
@@ -24,15 +24,69 @@
     private Long id;
 
     /**
-     * 会员ID
-     */
-    private Long vipId;
-
-    /**
      * 标签内容
      */
     private String label;
 
+    private Long shopId;
+
+    private Long companyId;
+
+    private Long userId;
+
+    private Integer isAll;
+
+    private String color;
+
+    private String shopName;
+
+    public String getShopName() {
+        return shopName;
+    }
+
+    public void setShopName(String shopName) {
+        this.shopName = shopName;
+    }
+
+    public Long getUserId() {
+        return userId;
+    }
+
+    public void setUserId(Long userId) {
+        this.userId = userId;
+    }
+
+    public Integer getIsAll() {
+        return isAll;
+    }
+
+    public void setIsAll(Integer isAll) {
+        this.isAll = isAll;
+    }
+
+    public String getColor() {
+        return color;
+    }
+
+    public void setColor(String color) {
+        this.color = color;
+    }
+
+    public Long getShopId() {
+        return shopId;
+    }
+
+    public void setShopId(Long shopId) {
+        this.shopId = shopId;
+    }
+
+    public Long getCompanyId() {
+        return companyId;
+    }
+
+    public void setCompanyId(Long companyId) {
+        this.companyId = companyId;
+    }
 
     public Date getCreateTime() {
         return createTime;
@@ -56,14 +110,6 @@
 
     public void setId(Long id) {
         this.id = id;
-    }
-
-    public Long getVipId() {
-        return vipId;
-    }
-
-    public void setVipId(Long vipId) {
-        this.vipId = vipId;
     }
 
     public String getLabel() {
diff --git a/zq-erp/src/main/java/com/matrix/system/hive/bean/SysVipLabelRelate.java b/zq-erp/src/main/java/com/matrix/system/hive/bean/SysVipLabelRelate.java
new file mode 100644
index 0000000..d3fdd37
--- /dev/null
+++ b/zq-erp/src/main/java/com/matrix/system/hive/bean/SysVipLabelRelate.java
@@ -0,0 +1,41 @@
+package com.matrix.system.hive.bean;
+
+import java.io.Serializable;
+
+/**
+ * @author wzy
+ * @date 2021-01-22
+ **/
+public class SysVipLabelRelate implements Serializable {
+    private static final long serialVersionUID = 1860770077746416680L;
+
+    private Long id;
+
+    private Long labelId;
+
+    private Long vipId;
+
+    public Long getId() {
+        return id;
+    }
+
+    public void setId(Long id) {
+        this.id = id;
+    }
+
+    public Long getLabelId() {
+        return labelId;
+    }
+
+    public void setLabelId(Long labelId) {
+        this.labelId = labelId;
+    }
+
+    public Long getVipId() {
+        return vipId;
+    }
+
+    public void setVipId(Long vipId) {
+        this.vipId = vipId;
+    }
+}
diff --git a/zq-erp/src/main/java/com/matrix/system/hive/bean/SysVipLevel.java b/zq-erp/src/main/java/com/matrix/system/hive/bean/SysVipLevel.java
index 5b3f178..e235061 100644
--- a/zq-erp/src/main/java/com/matrix/system/hive/bean/SysVipLevel.java
+++ b/zq-erp/src/main/java/com/matrix/system/hive/bean/SysVipLevel.java
@@ -54,7 +54,15 @@
 
 	private Long shopId;
 
+	private Long companyId;
 
+	public Long getCompanyId() {
+		return companyId;
+	}
+
+	public void setCompanyId(Long companyId) {
+		this.companyId = companyId;
+	}
 
 	public Long getShopId() {
 		return shopId;
diff --git a/zq-erp/src/main/java/com/matrix/system/hive/dao/AchieveNewDao.java b/zq-erp/src/main/java/com/matrix/system/hive/dao/AchieveNewDao.java
index f39cd28..46ee09f 100644
--- a/zq-erp/src/main/java/com/matrix/system/hive/dao/AchieveNewDao.java
+++ b/zq-erp/src/main/java/com/matrix/system/hive/dao/AchieveNewDao.java
@@ -1,9 +1,13 @@
 package com.matrix.system.hive.dao;
 
+import java.util.Date;
 import java.util.List;
 import java.util.Map;
 
 import com.matrix.core.pojo.PaginationVO;
+import com.matrix.system.app.vo.OrderDetailAchieveItemVo;
+import com.matrix.system.app.vo.RankingVo;
+import com.matrix.system.app.vo.UserAchieveVo;
 import com.matrix.system.hive.bean.AchieveNew;
 import org.apache.ibatis.annotations.Param;
 
@@ -55,5 +59,18 @@
 	List<AchieveNew> selectVipConsumeStatisticsList(@Param("record") AchieveNew achieveNew, @Param("pageVo") PaginationVO pageVo);
 
 	int selectVipConsumeStatisticsTotal(@Param("record") AchieveNew achieveNew);
-	
+
+	UserAchieveVo selectUserAchieveByTime(@Param("startTime") Date startTime, @Param("endTime") Date endTime, @Param("userId") Long userId);
+
+	List<OrderDetailAchieveItemVo> selectApiOrderItemAchieve(@Param("itemId") Long itemId);
+
+	List<RankingVo> selectShopConsumeAchieveRanking(@Param("record") AchieveNew achieveNew);
+
+	List<RankingVo> selectShopSaleAchieveRanking(@Param("record") AchieveNew achieveNew);
+
+	List<RankingVo> selectBeauticianConsumeAchieveRanking(@Param("record") AchieveNew achieveNew);
+
+	List<AchieveNew> selectOrderItemAchieveByOrderId(Long orderId);
+
+	List<RankingVo> selectStaffSaleAchieveRanking(@Param("record") AchieveNew achieveNew);
 }
\ No newline at end of file
diff --git a/zq-erp/src/main/java/com/matrix/system/hive/dao/ArticleDao.java b/zq-erp/src/main/java/com/matrix/system/hive/dao/ArticleDao.java
index 681ed4e..644d380 100644
--- a/zq-erp/src/main/java/com/matrix/system/hive/dao/ArticleDao.java
+++ b/zq-erp/src/main/java/com/matrix/system/hive/dao/ArticleDao.java
@@ -2,6 +2,7 @@
 
 import com.matrix.core.pojo.PaginationVO;
 import com.matrix.system.hive.bean.Article;
+import com.matrix.system.hive.bean.ArticleType;
 import org.apache.ibatis.annotations.Param;
 import java.util.List;
 
@@ -31,5 +32,7 @@
 	public int  selectTotalRecord(@Param("record") Article article);
 	
 	public Article  selectById(Long id);
-	
+
+	public List<Article> selectApiArticleListInPage(@Param("record") Article article, @Param("pageVo") PaginationVO pageVo);
+
 }
\ No newline at end of file
diff --git a/zq-erp/src/main/java/com/matrix/system/hive/dao/MoneyCardAssembleDao.java b/zq-erp/src/main/java/com/matrix/system/hive/dao/MoneyCardAssembleDao.java
index 516c0ca..1e9ccb6 100644
--- a/zq-erp/src/main/java/com/matrix/system/hive/dao/MoneyCardAssembleDao.java
+++ b/zq-erp/src/main/java/com/matrix/system/hive/dao/MoneyCardAssembleDao.java
@@ -3,7 +3,9 @@
 import java.util.List;
 
 import com.matrix.core.pojo.PaginationVO;
+import com.matrix.system.app.vo.ShoppingGoodsDetailVo;
 import com.matrix.system.hive.bean.MoneyCardAssemble;
+import com.matrix.system.hive.bean.ShoppingGoodsCategory;
 import org.apache.ibatis.annotations.Param;
 
 
@@ -37,4 +39,8 @@
 	public void batchInsert(@Param("list") List<MoneyCardAssemble> newAssemble);
 
     public    List<MoneyCardAssemble> selectByCardId(Long cardId);
+
+    List<ShoppingGoodsDetailVo> selectCardRelationGoods(@Param("cardId") Long cardId);
+
+    List<ShoppingGoodsCategory> selectCardRelationCategory(@Param("cardId") Long cardId);
 }
\ No newline at end of file
diff --git a/zq-erp/src/main/java/com/matrix/system/hive/dao/ShoppingGoodsAssembleDao.java b/zq-erp/src/main/java/com/matrix/system/hive/dao/ShoppingGoodsAssembleDao.java
index ac6776e..3abe996 100644
--- a/zq-erp/src/main/java/com/matrix/system/hive/dao/ShoppingGoodsAssembleDao.java
+++ b/zq-erp/src/main/java/com/matrix/system/hive/dao/ShoppingGoodsAssembleDao.java
@@ -3,6 +3,7 @@
 import java.util.List;
 
 import com.matrix.core.pojo.PaginationVO;
+import com.matrix.system.app.vo.ShoppingGoodsDetailVo;
 import com.matrix.system.hive.bean.ShoppingGoodsAssemble;
 import org.apache.ibatis.annotations.Param;
 
@@ -63,4 +64,6 @@
 	public int deleteByGoodsId(@Param("shoppingGoodsId") Long shoppingGoodsId);
 
 	public void batchInsert(@Param("list") List<ShoppingGoodsAssemble> list);
+
+	List<ShoppingGoodsDetailVo> selectGoodsRelationGoodsList(@Param("goodsId") Long id, @Param("goodsType") String goodsType);
 }
\ No newline at end of file
diff --git a/zq-erp/src/main/java/com/matrix/system/hive/dao/ShoppingGoodsCategoryDao.java b/zq-erp/src/main/java/com/matrix/system/hive/dao/ShoppingGoodsCategoryDao.java
index b954c8b..beb0efd 100644
--- a/zq-erp/src/main/java/com/matrix/system/hive/dao/ShoppingGoodsCategoryDao.java
+++ b/zq-erp/src/main/java/com/matrix/system/hive/dao/ShoppingGoodsCategoryDao.java
@@ -35,4 +35,6 @@
 
 	public int batchInsert(@Param("list")List<ShoppingGoodsCategory> shoppingGoodsCategoryList);
 
+	List<ShoppingGoodsCategory> selectChildNodesByName(@Param("record") ShoppingGoodsCategory shoppingGoodsCategory);
+
 }
\ No newline at end of file
diff --git a/zq-erp/src/main/java/com/matrix/system/hive/dao/ShoppingGoodsDao.java b/zq-erp/src/main/java/com/matrix/system/hive/dao/ShoppingGoodsDao.java
index d7acfcc..895c181 100644
--- a/zq-erp/src/main/java/com/matrix/system/hive/dao/ShoppingGoodsDao.java
+++ b/zq-erp/src/main/java/com/matrix/system/hive/dao/ShoppingGoodsDao.java
@@ -1,6 +1,8 @@
 package com.matrix.system.hive.dao;
 
 import com.matrix.core.pojo.PaginationVO;
+import com.matrix.system.app.dto.ShoppingGoodsListDto;
+import com.matrix.system.app.vo.ShoppingGoodsListVo;
 import com.matrix.system.hive.bean.ShoppingGoods;
 import org.apache.ibatis.annotations.Param;
 
@@ -83,4 +85,8 @@
 	 * @return
 	 */
 	public ShoppingGoods selectVipCzGoods();
+
+	List<ShoppingGoodsListVo> selectShoppingGoodsApiInPage(@Param("record") ShoppingGoodsListDto shoppingGoodsListDto, @Param("pageVo") PaginationVO pageVo);
+
+	int selectShopppingGoodsAipTotal(@Param("record") ShoppingGoodsListDto shoppingGoodsListDto);
 }
\ No newline at end of file
diff --git a/zq-erp/src/main/java/com/matrix/system/hive/dao/SysBusinessDataDao.java b/zq-erp/src/main/java/com/matrix/system/hive/dao/SysBusinessDataDao.java
index d4ba3fe..5b94366 100644
--- a/zq-erp/src/main/java/com/matrix/system/hive/dao/SysBusinessDataDao.java
+++ b/zq-erp/src/main/java/com/matrix/system/hive/dao/SysBusinessDataDao.java
@@ -1,8 +1,11 @@
 package com.matrix.system.hive.dao;
 
 import com.matrix.core.pojo.PaginationVO;
+import com.matrix.system.app.vo.BusinessesDataShowVo;
 import com.matrix.system.hive.bean.SysBusinessData;
 import com.matrix.system.hive.statistics.BusinessDataShowVo;
+import com.matrix.system.hive.statistics.DailySaleVo;
+import com.matrix.system.hiveErp.analysUtil.StatisticsTimeDaoParam;
 import org.apache.ibatis.annotations.Param;
 
 import java.util.List;
@@ -44,5 +47,12 @@
 	public SysBusinessData  selectById(Integer id);
 	
 	public SysBusinessData  selectForUpdate(Integer id);
-	
+
+	List<BusinessesDataShowVo> selectApiBusinessDataInPage(@Param("record") SysBusinessData data,@Param("pageVo") PaginationVO pageVo);
+
+	int selectApiBusinessDataTotal(@Param("record") SysBusinessData data);
+
+	List<BusinessesDataShowVo> selectApiBusinessData(@Param("list") List<StatisticsTimeDaoParam> timeSpaceParam, @Param("shopId") Long shopId, @Param("companyId") Long companyId);
+
+	List<DailySaleVo> selectDailySaleData(@Param("list") List<StatisticsTimeDaoParam> timeSpaceParam, @Param("shopId") Long shopId);
 }
\ No newline at end of file
diff --git a/zq-erp/src/main/java/com/matrix/system/hive/dao/SysFollowupCommentDao.java b/zq-erp/src/main/java/com/matrix/system/hive/dao/SysFollowupCommentDao.java
new file mode 100644
index 0000000..224e6c1
--- /dev/null
+++ b/zq-erp/src/main/java/com/matrix/system/hive/dao/SysFollowupCommentDao.java
@@ -0,0 +1,42 @@
+package com.matrix.system.hive.dao;
+
+import org.apache.ibatis.annotations.Param;
+import java.util.List;
+import java.util.Map;
+import com.matrix.core.pojo.PaginationVO;
+import com.matrix.system.hive.bean.SysFollowupComment;
+
+/**
+ * @description 跟进评论
+ * @author 
+ * @date 2021-01-10 15:15
+ */
+public interface SysFollowupCommentDao{
+
+	public int insert(@Param("item") SysFollowupComment sysFollowupComment);
+   	
+   	public int batchInsert(@Param("list") List<SysFollowupComment> sysFollowupCommentList);
+   	
+	public int updateByMap(Map<String, Object> modifyMap);
+	
+	public int updateByModel(@Param("record")SysFollowupComment sysFollowupComment);
+	
+	public int deleteByIds(@Param("list") List<String> list);
+	
+	public int deleteById(Integer id);
+
+	public int deleteByModel(@Param("record") SysFollowupComment sysFollowupComment);
+	
+	public List<SysFollowupComment> selectInPage(@Param("record") SysFollowupComment sysFollowupComment, @Param("pageVo") PaginationVO pageVo);
+
+	public List<SysFollowupComment> selectByfollId(Long follId);
+
+	public List<SysFollowupComment> selectByModel(@Param("record") SysFollowupComment sysFollowupComment);
+	
+	public int selectTotalRecord(@Param("record") SysFollowupComment sysFollowupComment);
+	
+	public SysFollowupComment  selectById(Long id);
+	
+	public SysFollowupComment  selectForUpdate(Long id);
+	
+}
\ No newline at end of file
diff --git a/zq-erp/src/main/java/com/matrix/system/hive/dao/SysFollowupDao.java b/zq-erp/src/main/java/com/matrix/system/hive/dao/SysFollowupDao.java
new file mode 100644
index 0000000..28fafcb
--- /dev/null
+++ b/zq-erp/src/main/java/com/matrix/system/hive/dao/SysFollowupDao.java
@@ -0,0 +1,44 @@
+package com.matrix.system.hive.dao;
+
+import com.matrix.system.app.dto.FollowupListDto;
+import org.apache.ibatis.annotations.Param;
+import java.util.List;
+import java.util.Map;
+import com.matrix.core.pojo.PaginationVO;
+import com.matrix.system.hive.bean.SysFollowup;
+
+/**
+ * @description 跟进
+ * @author 
+ * @date 2021-01-10 15:15
+ */
+public interface SysFollowupDao{
+
+	public int insert(@Param("item") SysFollowup sysFollowup);
+   	
+   	public int batchInsert(@Param("list") List<SysFollowup> sysFollowupList);
+   	
+	public int updateByMap(Map<String, Object> modifyMap);
+	
+	public int updateByModel(@Param("record")SysFollowup sysFollowup);
+	
+	public int deleteByIds(@Param("list") List<String> list);
+	
+	public int deleteById(Long id);
+
+	public int deleteByModel(@Param("record") SysFollowup sysFollowup);
+	
+	public List<SysFollowup> selectInPage(@Param("record") SysFollowup sysFollowup, @Param("pageVo") PaginationVO pageVo);
+
+	public List<SysFollowup> selectByModel(@Param("record") SysFollowup sysFollowup);
+	
+	public int selectTotalRecord(@Param("record") SysFollowup sysFollowup);
+	
+	public SysFollowup  selectById(Long id);
+	
+	public SysFollowup  selectForUpdate(Long id);
+
+    void updateZan(@Param("id")Long id, @Param("zans")String zans);
+
+	List<SysFollowup> selectByAppDto(FollowupListDto followupListDto);
+}
\ No newline at end of file
diff --git a/zq-erp/src/main/java/com/matrix/system/hive/dao/SysOrderDao.java b/zq-erp/src/main/java/com/matrix/system/hive/dao/SysOrderDao.java
index 42475ae..c052f28 100644
--- a/zq-erp/src/main/java/com/matrix/system/hive/dao/SysOrderDao.java
+++ b/zq-erp/src/main/java/com/matrix/system/hive/dao/SysOrderDao.java
@@ -1,7 +1,12 @@
 package com.matrix.system.hive.dao;
 
 import com.matrix.core.pojo.PaginationVO;
+import com.matrix.system.app.dto.OrderListDto;
+import com.matrix.system.app.vo.OrderDetailVo;
+import com.matrix.system.app.vo.RankingVo;
 import com.matrix.system.hive.bean.SysOrder;
+import com.matrix.system.shopXcx.api.dto.ErpOrderListDto;
+import com.matrix.system.shopXcx.api.vo.ErpOrderDetailVo;
 import org.apache.ibatis.annotations.Param;
 
 import java.util.Date;
@@ -32,7 +37,21 @@
 
 	public int selectInPageCount(@Param("record") SysOrder sysOrder);
 
-	public void updateOrderTime(@Param("orderTime") Date orderTime, @Param("id") Long id);
+	public void updateOrderTime(@Param("payTime") Date orderTime, @Param("id") Long id);
 
 	SysOrder selectVipOrderInfoTotal(@Param("vipId") Long vipId);
+
+	List<OrderDetailVo> selectApiOrderListInPage(@Param("record") OrderListDto orderListDto, @Param("pageVo") PaginationVO pageVo);
+
+	int selectApiOrderListTotal(@Param("record") OrderListDto orderListDto);
+
+	OrderDetailVo selectApiOrderDetailById(@Param("orderId") Long orderId);
+
+	List<RankingVo> selectShopAchieveRanking(@Param("record") SysOrder sysOrder);
+
+	List<RankingVo> selectStaffSaleAchieveRanking(@Param("record") SysOrder sysOrder);
+
+	List<ErpOrderDetailVo> selectErpOrderList(ErpOrderListDto erpOrderListDto);
+
+	ErpOrderDetailVo findUserOrderById(Long orderId);
 }
\ No newline at end of file
diff --git a/zq-erp/src/main/java/com/matrix/system/hive/dao/SysOrderFlowDao.java b/zq-erp/src/main/java/com/matrix/system/hive/dao/SysOrderFlowDao.java
new file mode 100644
index 0000000..7c816e3
--- /dev/null
+++ b/zq-erp/src/main/java/com/matrix/system/hive/dao/SysOrderFlowDao.java
@@ -0,0 +1,26 @@
+package com.matrix.system.hive.dao;
+
+import com.matrix.system.hive.bean.SysOrderFlow;
+import com.matrix.system.hive.dto.OrderFlowListDto;
+import com.matrix.system.hive.vo.OrderFlowVo;
+import org.apache.ibatis.annotations.Param;
+
+import java.util.Date;
+import java.util.List;
+
+public interface SysOrderFlowDao {
+
+    public int insert(SysOrderFlow sysOrderFlow);
+
+    public List<SysOrderFlow> selectByOrderId(@Param("orderId") Long orderId);
+
+    public List<SysOrderFlow> selectPayMethodsAmountByOrderId(@Param("orderId") Long orderId);
+
+    List<OrderFlowVo> selectInPage(@Param("record") OrderFlowListDto orderFlowListDto);
+
+    Integer selectTotal(@Param("record")OrderFlowListDto orderFlowListDto);
+
+    Integer updateTimeByOrderId(@Param("orderId") Long orderId, @Param("payTime") Date payTime);
+
+    Integer deleteByOrderId(@Param("orderId") Long orderId);
+}
diff --git a/zq-erp/src/main/java/com/matrix/system/hive/dao/SysOrderItemDao.java b/zq-erp/src/main/java/com/matrix/system/hive/dao/SysOrderItemDao.java
index 32dd90e..5446b22 100644
--- a/zq-erp/src/main/java/com/matrix/system/hive/dao/SysOrderItemDao.java
+++ b/zq-erp/src/main/java/com/matrix/system/hive/dao/SysOrderItemDao.java
@@ -1,7 +1,9 @@
 package com.matrix.system.hive.dao;
 
 import com.matrix.core.pojo.PaginationVO;
+import com.matrix.system.app.vo.OrderDetailItemVo;
 import com.matrix.system.hive.bean.SysOrderItem;
+import com.matrix.system.shopXcx.api.vo.ErpOrderDetailItemVo;
 import org.apache.ibatis.annotations.Param;
 
 import java.util.Date;
@@ -58,4 +60,8 @@
 
 
 	public int   deleteByOrderId(Long id);
+
+	List<OrderDetailItemVo> selectApiOrderDetailItemsByOrderId(@Param("orderId") Long orderId);
+
+    List<ErpOrderDetailItemVo> selectErpOrderItemByOrderId(String orderId);
 }
\ No newline at end of file
diff --git a/zq-erp/src/main/java/com/matrix/system/hive/dao/SysProjServicesDao.java b/zq-erp/src/main/java/com/matrix/system/hive/dao/SysProjServicesDao.java
index 8614295..90c2647 100644
--- a/zq-erp/src/main/java/com/matrix/system/hive/dao/SysProjServicesDao.java
+++ b/zq-erp/src/main/java/com/matrix/system/hive/dao/SysProjServicesDao.java
@@ -1,10 +1,12 @@
 package com.matrix.system.hive.dao;
 
-import com.matrix.system.hive.bean.SysProjServices;
-import org.apache.ibatis.annotations.Param;
-
 import com.matrix.core.pojo.PaginationVO;
-
+import com.matrix.system.app.dto.ServiceOrderListDto;
+import com.matrix.system.app.vo.ServiceOrderListVo;
+import com.matrix.system.hive.bean.SysProjServices;
+import com.matrix.system.shopXcx.api.dto.ErpServiceOrderListDto;
+import com.matrix.system.shopXcx.api.vo.ErpServiceOrderListVo;
+import org.apache.ibatis.annotations.Param;
 
 import java.util.Date;
 import java.util.List;
@@ -34,7 +36,36 @@
 
 	public SysProjServices  selectById(Long id);
 
-	public void updateOrderTime(@Param("createTime") Date createTime, @Param("id") Long id);
-	 
+	public void updateOrderTime(@Param("consumeTime") Date createTime, @Param("id") Long id);
 
+	List<ServiceOrderListVo> selectApiServiceOrderListInPage(@Param("record") ServiceOrderListDto serviceOrderListDto, @Param("pageVo") PaginationVO pageVo);
+
+	int selectApiServiceOrderListTotal(@Param("record") ServiceOrderListDto serviceOrderListDto);
+
+	/**
+	 * 小程序端查询客户预约单
+	 * @param orderListDto
+	 * @return
+	 */
+    List<ErpServiceOrderListVo> findWxServiceOrderList(ErpServiceOrderListDto orderListDto);
+
+	/**
+	 * 小程序端查询客户预约单详情
+	 * @param id
+	 * @return
+	 */
+	ErpServiceOrderListVo findWxServiceOrderById(Long id);
+
+	/**
+	 * 查询预约时间在1小时之内且没有通知过的服务单
+	 * @return
+	 */
+	List<SysProjServices> selectNeedNoticeService();
+
+	/**
+	 * 设置服务单为已通知
+	 * @param noticedIds
+	 * @return
+	 */
+	int updateNoticeTimes(@Param("list")List<Long> noticedIds);
 }
\ No newline at end of file
diff --git a/zq-erp/src/main/java/com/matrix/system/hive/dao/SysProjUseDao.java b/zq-erp/src/main/java/com/matrix/system/hive/dao/SysProjUseDao.java
index faf7254..c064f18 100644
--- a/zq-erp/src/main/java/com/matrix/system/hive/dao/SysProjUseDao.java
+++ b/zq-erp/src/main/java/com/matrix/system/hive/dao/SysProjUseDao.java
@@ -1,6 +1,7 @@
 package com.matrix.system.hive.dao;
 
 import com.matrix.system.hive.bean.SysProjUse;
+import com.matrix.system.hive.bean.SysProjUseFlow;
 import org.apache.ibatis.annotations.Param;
 
 import com.matrix.core.pojo.PaginationVO;
@@ -18,7 +19,9 @@
 public interface SysProjUseDao{
 
 	public int insert(SysProjUse sysProjUse);
-   	
+
+	public int insertFlow(SysProjUseFlow sysProjUseFlow);
+
 	public int update(SysProjUse sysProjUse);
 	/**
 	 * 批量修改余次信息
@@ -37,6 +40,7 @@
 
 	public List<SysProjUse> selectByModel(@Param("record") SysProjUse sysProjUse);
 
+	public List<SysProjUse> selectFlowByProjUseId(Long projUseId);
 
 	public int  selectTotalRecord(@Param("record") SysProjUse sysProjUse);
 	
@@ -124,4 +128,8 @@
 	public int updateTcStatus(@Param("id") Long id, @Param("status") String status);
 
 	List<SysProjUse> selectHasValidProjUse();
+
+	List<SysProjUseFlow> selectProjUseFlow(@Param("record") SysProjUseFlow projUseFlow, @Param("pageVo")PaginationVO pageVo);
+
+	Integer selectProjUseFlowTotal(@Param("record") SysProjUseFlow projUseFlow);
 }
\ No newline at end of file
diff --git a/zq-erp/src/main/java/com/matrix/system/hive/dao/SysVipAlbumDao.java b/zq-erp/src/main/java/com/matrix/system/hive/dao/SysVipAlbumDao.java
new file mode 100644
index 0000000..70f2950
--- /dev/null
+++ b/zq-erp/src/main/java/com/matrix/system/hive/dao/SysVipAlbumDao.java
@@ -0,0 +1,42 @@
+package com.matrix.system.hive.dao;
+
+import org.apache.ibatis.annotations.Param;
+import java.util.List;
+import java.util.Map;
+import com.matrix.core.pojo.PaginationVO;
+import com.matrix.system.hive.bean.SysVipAlbum;
+
+/**
+ * @description 客户相册
+ * @author 
+ * @date 2021-01-10 15:15
+ */
+public interface SysVipAlbumDao{
+
+	public int insert(@Param("item") SysVipAlbum sysVipAlbum);
+   	
+   	public int batchInsert(@Param("list") List<SysVipAlbum> sysVipAlbumList);
+   	
+	public int updateByMap(Map<String, Object> modifyMap);
+	
+	public int updateByModel(@Param("record")SysVipAlbum sysVipAlbum);
+	
+	public int deleteByIds(@Param("list") List<String> list);
+	
+	public int deleteById(Integer id);
+
+	public int deleteByModel(@Param("record") SysVipAlbum sysVipAlbum);
+	
+	public List<SysVipAlbum> selectInPage(@Param("record") SysVipAlbum sysVipAlbum, @Param("pageVo") PaginationVO pageVo);
+
+	public List<SysVipAlbum> selectBySourceId(Long sourceId);
+
+	public List<SysVipAlbum> selectByModel(@Param("record") SysVipAlbum sysVipAlbum);
+	
+	public int selectTotalRecord(@Param("record") SysVipAlbum sysVipAlbum);
+	
+	public SysVipAlbum  selectById(Long id);
+	
+	public SysVipAlbum  selectForUpdate(Long id);
+	
+}
\ No newline at end of file
diff --git a/zq-erp/src/main/java/com/matrix/system/hive/dao/SysVipInfoDao.java b/zq-erp/src/main/java/com/matrix/system/hive/dao/SysVipInfoDao.java
index 6e7f1ec..853b5c5 100644
--- a/zq-erp/src/main/java/com/matrix/system/hive/dao/SysVipInfoDao.java
+++ b/zq-erp/src/main/java/com/matrix/system/hive/dao/SysVipInfoDao.java
@@ -1,6 +1,8 @@
 package com.matrix.system.hive.dao;
 
 import com.matrix.core.pojo.PaginationVO;
+import com.matrix.system.app.dto.VipInfoListDto;
+import com.matrix.system.app.vo.VipInfoListVo;
 import com.matrix.system.hive.bean.SysVipInfo;
 import com.matrix.system.hive.pojo.VipInfoVo;
 import org.apache.ibatis.annotations.Param;
@@ -36,7 +38,7 @@
 
 	public SysVipInfo selectById(Long id);
 
-	public List<SysVipInfo> selectByVipNoOrTel(@Param("key") String key, @Param("shopId") Long shopId);
+	public List<SysVipInfo> selectByVipNoOrTel(@Param("key") String key);
 
 	/**
 	 * 查询是否唯一 @Title: selectTotalByField
@@ -132,7 +134,7 @@
 	 * @param keyWord
 	 * @return
 	 */
-	public List<SysVipInfo> selectUserByKey(@Param("keyWord") String keyWord, @Param("shopId") Long shopId);
+	public List<SysVipInfo> selectUserByKey(@Param("keyWord") String keyWord,@Param("companyId") Long companyId);
 	
 	/**
 	 * 会员活跃状态自动修改
@@ -202,4 +204,8 @@
 	public int batchInsert(@Param("list") List<SysVipInfo> list);
 
 	public List<SysVipInfo> selectVipInfoByVipNo(@Param("companyId") Long companyId, @Param("vipNo") String vipNo);
+
+	List<VipInfoListVo> selectVipAddressBookByList(@Param("record") VipInfoListDto vipInfoListDto);
+
+	com.matrix.system.app.vo.VipInfoVo selectVipInfoById(@Param("id") Long id);
 }
\ No newline at end of file
diff --git a/zq-erp/src/main/java/com/matrix/system/hive/dao/SysVipLabelDao.java b/zq-erp/src/main/java/com/matrix/system/hive/dao/SysVipLabelDao.java
index cc99bcc..25774ab 100644
--- a/zq-erp/src/main/java/com/matrix/system/hive/dao/SysVipLabelDao.java
+++ b/zq-erp/src/main/java/com/matrix/system/hive/dao/SysVipLabelDao.java
@@ -1,6 +1,8 @@
 package com.matrix.system.hive.dao;
 
+import com.matrix.core.pojo.PaginationVO;
 import com.matrix.system.hive.bean.SysVipLabel;
+import com.matrix.system.hive.bean.SysVipLabelRelate;
 import org.apache.ibatis.annotations.Param;
 
 import java.util.List;
@@ -9,9 +11,23 @@
 
     int insert(SysVipLabel sysVipLabel);
 
+    int insertRelate(SysVipLabelRelate sysVipLabelRelate);
+
+    int update(SysVipLabel sysVipLabel);
+
+    List<SysVipLabel> selectInPage(@Param("record") SysVipLabel sysVipLabel, @Param("pageVo") PaginationVO pageVo);
+
+    int selectTotal(@Param("record") SysVipLabel sysVipLabel);
+
     int deleteById(@Param("id") Long id);
+
+    int deleteByIds(@Param("list") List<Long> list);
 
     List<SysVipLabel> selectByVipId(@Param("vipId") Long vipId);
 
     List<SysVipLabel> selectByModel(@Param("record") SysVipLabel sysVipLabel);
+
+    int deleteRelateByVipId(@Param("vipId") Long vipId);
+
+    SysVipLabel selectById(@Param("id") Long id);
 }
diff --git a/zq-erp/src/main/java/com/matrix/system/hive/dto/OrderFlowListDto.java b/zq-erp/src/main/java/com/matrix/system/hive/dto/OrderFlowListDto.java
new file mode 100644
index 0000000..b5d05a3
--- /dev/null
+++ b/zq-erp/src/main/java/com/matrix/system/hive/dto/OrderFlowListDto.java
@@ -0,0 +1,126 @@
+package com.matrix.system.hive.dto;
+
+import com.fasterxml.jackson.annotation.JsonFormat;
+import com.matrix.core.pojo.PaginationDto;
+import com.matrix.core.pojo.PaginationVO;
+import com.matrix.core.tools.DateUtil;
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+
+import javax.validation.constraints.NotNull;
+import java.util.Date;
+
+/**
+ * @author jyy
+ * @date 2021-01-27
+ **/
+@ApiModel(value = "OrderFlowListDto", description = "交易流水查询参数")
+public class OrderFlowListDto extends PaginationDto {
+
+
+    @ApiModelProperty(value = "客户姓名/拼音/手机")
+    private String queryKey;
+
+    @ApiModelProperty(value ="操作人")
+    private String oprationMan;
+
+    @ApiModelProperty(value ="订单号")
+    private String orderNo;
+
+    @ApiModelProperty(value ="交易类型")
+    private String flowType;
+
+
+    @ApiModelProperty(value ="支付方式")
+    private String payMethod;
+
+
+    @JsonFormat(pattern = DateUtil.DATE_FORMAT_DD, timezone = "GMT+8")
+    @ApiModelProperty(value = "查询参数开始时间", example = "2021-01-10")
+    private Date startTime;
+
+
+    @JsonFormat(pattern = DateUtil.DATE_FORMAT_DD, timezone = "GMT+8")
+    @ApiModelProperty(value = "查询参数结束时间", example = "2021-01-10")
+    private Date endTime;
+
+    @ApiModelProperty(hidden = true)
+    private Long shopId;
+
+
+    @ApiModelProperty(hidden = true)
+    private Long companyId;
+
+
+    public String getQueryKey() {
+        return queryKey;
+    }
+
+    public void setQueryKey(String queryKey) {
+        this.queryKey = queryKey;
+    }
+
+    public String getOprationMan() {
+        return oprationMan;
+    }
+
+    public void setOprationMan(String oprationMan) {
+        this.oprationMan = oprationMan;
+    }
+
+    public String getOrderNo() {
+        return orderNo;
+    }
+
+    public void setOrderNo(String orderNo) {
+        this.orderNo = orderNo;
+    }
+
+    public String getFlowType() {
+        return flowType;
+    }
+
+    public void setFlowType(String flowType) {
+        this.flowType = flowType;
+    }
+
+    public String getPayMethod() {
+        return payMethod;
+    }
+
+    public void setPayMethod(String payMethod) {
+        this.payMethod = payMethod;
+    }
+
+    public Date getStartTime() {
+        return startTime;
+    }
+
+    public void setStartTime(Date startTime) {
+        this.startTime = startTime;
+    }
+
+    public Date getEndTime() {
+        return endTime;
+    }
+
+    public void setEndTime(Date endTime) {
+        this.endTime = endTime;
+    }
+
+    public Long getShopId() {
+        return shopId;
+    }
+
+    public void setShopId(Long shopId) {
+        this.shopId = shopId;
+    }
+
+    public Long getCompanyId() {
+        return companyId;
+    }
+
+    public void setCompanyId(Long companyId) {
+        this.companyId = companyId;
+    }
+}
diff --git a/zq-erp/src/main/java/com/matrix/system/hive/plugin/util/ImageUtil.java b/zq-erp/src/main/java/com/matrix/system/hive/plugin/util/ImageUtil.java
index 2cd53bb..4b3ef37 100644
--- a/zq-erp/src/main/java/com/matrix/system/hive/plugin/util/ImageUtil.java
+++ b/zq-erp/src/main/java/com/matrix/system/hive/plugin/util/ImageUtil.java
@@ -1,10 +1,14 @@
 package com.matrix.system.hive.plugin.util;
 
+import com.matrix.core.tools.DateUtil;
+import sun.misc.BASE64Decoder;
+import sun.misc.BASE64Encoder;
+
 import java.awt.Image;
 import java.awt.image.BufferedImage;
-import java.io.File;
-import java.io.FileOutputStream;
-import java.io.IOException;
+import java.io.*;
+import java.util.Calendar;
+import java.util.Date;
 
 import javax.imageio.ImageIO;
 
@@ -56,12 +60,80 @@
 		}
 	}
 
-	
 
-	
+	public static String base64ToFile(String base64Str, String savePath, String fileName) {
 
-	
-	
+
+		File dir = new File(savePath);
+		if (!dir.isDirectory()) {
+			dir.mkdir();
+		}
+
+		BufferedOutputStream bos = null;
+		FileOutputStream fos = null;
+		File file = null;
+		String filePathAndName = dir + File.separator + fileName;
+		BASE64Decoder decoder = new BASE64Decoder();
+		byte[] bfile = new byte[0];
+		try {
+			bfile = decoder.decodeBuffer(base64Str);
+			file = new File(filePathAndName);
+			fos = new FileOutputStream(file);
+			bos = new BufferedOutputStream(fos);
+			bos.write(bfile);
+		} catch (IOException e) {
+			e.printStackTrace();
+		}
+
+		return filePathAndName;
+	}
+
+
+	public static void main(String[] args) {
+		GenerateImage("iVBORw0KGgoAAAANSUhEUgAABAEAAAQBCAIAAADU4QRPAAAACXBIWXMAAAsSAAALEgHS3X78AAAgAElEQVR4nOzdQWyc530/+CekmWGG4gwZdIRdeJC/DDbdlkM0pYJKFHqQKKDWtqHcQ7alsHAu8sE9WD2kB+8l3aCXNVB4u1inrYvCav+osbXgeg82162LQpLRdmWqrZRNSRVIpJXaMkCqSSOJEseaakUtHo4gO9RIoqghOe/7fD7QLQggPS8tvd+Z7+/3fObfr905MR8AAIBEPHV5MRz7yNMGAIBU9HjSAACQFBkAAADSIgMAAEBaZAAAAEiLDAAAAGmRAQAAIC0yAAAApEUGAACAtMgAAACQFhkAAADSIgMAAEBaZAAAAEiLDAAAAGmRAQAAIC0yAAAApEUGAACAtMgAAACQFhkAAADSIgMAAEBaZAAAAEiLDAAAAGmRAQAAIC0yAAAApEUGAACAtMgAAACQFhkAAADSIgMAAEBaZAAAAEiLDAAAAGmRAQAAIC0yAAAApEUGAACAtMgAAACQFhkAAADSIgMAAEBaZAAAAEiLDAAAAGmRAQAAIC0yAAAApEUGAACAtMgAAACQFhkAAADSIgMAAEBaZAAAAEiLDAAAAGmRAQAAIC0yAAAApEUGAACAtMgAAACQFhkAAADSIgMAAEBaZAAAAEiLDAAAAGmRAQAAIC0yAAAApEUGAACAtMgAAACQFhkAAADSIgMAAEBaZAAAAEiLDAAAAGmRAQAAIC0yAAAApEUGAACAtMgAAACQFhkAAADSIgMAAEBaZAAAAEiLDAAAAGmRAQAAIC0yAAAApEUGAACAtMgAAACQFhkAAADSIgMAAEBaZAAAAEiLDAAAAGmRAQAAIC0yAAAApEUGAACAtMgAAACQFhkAAADSIgMAAEBaZAAAAEiLDAAAAGmRAQAAIC0yAAAApEUGAACAtMgAAACQFhkAAADSIgMAAEBaZAAAAEiLDAAAAGmRAQAAIC0yAAAApEUGAACAtMgAAACQFhkAAADSIgMAAEBaZAAAAEiLDAAAAGmRAQAAIC0yAAAApEUGAACAtMgAAACQFhkAAADSIgMAAEBaZAAAAEiLDAAAAGmRAQAAIC0yAAAApEUGAACAtMgAAACQFhkAAADSIgMAAEBaZAAAAEiLDAAAAGmRAQAAIC0yAAAApEUGAACAtMgAAACQFhkAAADSIgMAAEBaZAAAAEiLDAAAAGmRAQAAIC0yAAAApEUGAACAtMgAAACQFhkAAADSIgMAAEBaZAAAAEiLDAAAAGmRAQAAIC0yAAAApEUGAACAtMgAAACQFhkAAADSIgMAAEBaZAAAAEiLDAAAAGmRAQAAIC0yAAAApEUGAACAtMgAAACQFhkAAADSIgMAAEBaZAAAAEiLDAAAAGmRAQAAIC0yAAAApEUGAACAtMgAAACQFhkAAADSIgMAAEBaZAAAAEiLDAAAAGmRAQAAIC0yAAAApEUGAACAtMgAAACQFhkAAADSIgMAAEBaZAAAAEiLDAAAAGmRAQAAIC0yAAAApEUGAACAtMgAAACQFhkAAADSIgMAAEBaZAAAAEiLDAAAAGmRAQAAIC0yAAAApEUGAACAtMgAAACQFhkAAADSIgMAAEBaZAAAAEiLDAAAAGmRAQAAIC0yAAAApEUGAACAtMgAAACQFhkAAADSIgMAAEBaZAAAAEiLDAAAAGmRAQBStL0U9tc8eYBEPeXBAyRloBCmdobpifhnnhwNR0+Gi3U/AQBpkQEAErK/Ft/+K6W7f+JaNbz6fDhxLiaBpaYfBIBUyAAASRirhuk98aX/fpOjYfdIeO9sOHbKzwJAEmQAgJzbXopv/5OjD/tTFgvx+4H9o+G1D8Lcgp8IgJyTAQDybHpPODgeX/HXolIKv/2rYX4hJoHLi34uAHJLBgDIp90j4fC+T6r/a1erhtdfCDMr1SBDAgC5JAMA5M0zlfj237b6v3ZT47Ea9NZHYeaMHxCAvJEBAPJjoBDf/h9e/V+7YiEc3huTwNGThgQAckUGAMiJqZ3h0MRaq/9rt6MShwROX4hJwJAAQD7IAACZN1YNRw6sp/q/drtG4q9jK9UgQwIAWScDAGTY9lJ8+3/C6v/aTU/ELUNHPwzH5/3UAGSYDACQSQOFWP6Zntjs33uxEF56No4cHDtlSAAgq2QAgOzZX4vTuh2v/q9drRqHBE6ci0nAkABA5sgAAFkyVo2bf3ZUuuK3PDkabyF476whAYCMkQEAsmF7Kb797xrprt9ssRD7SK39obMXuuA3BMAayAAA3a5V/T84vpXln4erlMLLz4X5hZgELtYzcKQAiZMBALra/lr8oH1D9352Sq0aXn0+DgkcPakaBNDVZACALjVWDdN7Nm/vZ6e0hgTeWrlJAIDuJAMAdJ2BQqz+T45m9ckUC3Ft0cHx8NoH9ocCdCMZAKC7TO/p6ur/2lVKcX/o/EJMAvaHAnQVGQCgW+weiR//Z6L6v3a1anj9hTBzNt4kYEgAoEvIAABb75lKfPvPXPV/7abGV/aHfhiOz2fltwyQZzIAwFYaKMTyz9R4/h9CsRBeejb+SY+eNCQAsMVkAIAtM7UzHJrIQ/V/7XZU4pDA6QsxCRgSANgqMgDAFhirhiMH8lb9X7tdI/HXsZX9oYYEADafDACwqbaXYvV/14hTj3ef7R+NScCQAMAmkwEANslAIZZ/piec9ycqpTgkMDkatwYZEgDYNDIAwGbYX4vXZiVV/V+7WjUOCZw4F5OAIQGATSADAGyssWos/+yoOOZHmByNNyS8t3KTAAAbSgYA2CjbS3Hv5+SoA16rYuHukMDRk2H2QjZ+zwBZJAMAdF6r+n9wXPlnPSql8PJzYX4hJoGL9ez9/gG6nwwA0GH7a/HD7GT3fnZKrRpefT7MrFSD7A8F6CwZAKBjnqnE6n+t6kQ7Zmo8VoPeWrlJAIBOkQEAOmCgEN/+Vf83QrEQVyodHA+vfWB/KEBnyAAAT2p6j+r/hquU4v7Q+YWYBOwPBXhCMgDA+o1Vw5EDqv+bp1YNr78QrxaeOWNIAGD9ZACA9dheim//qv9bYnoifvFy9MNwfD7BPz1AB8gAAI9noBDLP1Pjjm0rFQvhpWfjUzh60pAAwGOTAQAew9TOcGhC9b9b7KjEIYHTF2ISMCQAsHYyAMCajFXj5p8dFafVdXaNxKfz3llDAgBrJQMAPML2Unz73zXinLpXsRCHBPaPxnFhQwIAjyQDADzQQCGWf6YnnFA2VEpxSGByNF4tbEgA4CFkAID29tfi1VSq/5lTq8YhgRPn4pCAahBAWzIAwGpj1bj5x97PTJscDbtH4pDAsVOpHwXA/WQAgE9sL8W3/8lRR5IH94YEjp4MsxdSPw2AT5MBAMK96v/BceWfvKmUwsvPhfmF8NoH9ocC3CUDAMTSyOF98WWRvKpVw+svhJmVapAhAQAZAEjaM5X49q/6n4ip8VgNeuujeJMAQMpkACBRA4X49q/6n5piIa57Ojgeq0H2hwLJkgGAFE3tDIcmVP/TVSnF/aGnL8RxYUMCQIJkACAtY9Vw5IDqP9Gukfjr2Eo1yJAAkBQZAEjF9lJ8+1f9Z5XpifCVn719fK75J39XdDZAImQAIP8GCnHr/9S4R81qy8vLN27cWFpa+vLTyzunb8zMlf9qXkUMyD8ZAMi5/bU4A6r6z/1u3rx59erV27dvt/6Xz9y5dbD2w71fLP7XU6Xv/nuvAwNyTAYAcmusGjf/7Kh4wqx269ata9euNZtthgBKn238xr6b/3Jt4I//dtsPb/Q4OiCXZAAgh7aX4tv/rhHPltWWl5evXbvWaDQecjJ37ix/oXT9m1ON//v/Lf0fpw0JADkkAwC5MlCIez+nJzxV2rhx48b169eXl5fXcjh3lm/v2XHl53c0/uzvy6cv9jlPIE9kACA/9tfi27+9n9yv2WxeuXLlXvV/7Z4Kza/9/OVf+VLxd/+6rBoE5IYMAOTBWDVu/rH3k/vdvn376tWrN2/efJKzKX228c2vxCGB3/lLERPIAxkAyLbtpfj2PznqMbJaa+/n9evXO3IyrSGBbx1qvPtPw/aHAlknAwAZNr0nHBy395M2Go3G4uLiOso/D3dn+fbB2g9/qVb4gw+H7Q8FsksGADJp90jc/KP6z/0esvezU54KzSN7f1BvbPv9k4OGBIAskgGAjHmmEt/+Vf+531r2fnZQpXjjm19p/HN98PeOb/M0gGyRAYDMGCjE8s/UuCdGG4+197NT7txZ/umfuPa/Tzdm5sqGBIAMkQGAbJjaGQ5NqP7Txrr3fnbKZ+7cOlj74S/+TP8f/c2QIQEgE2QAoNuNVcORA6r/tNGRvZ+d0t9z88jeH/zr4uAf/+02QwJAl5MBgO61vRTf/lX/uV9n93520BdK17/5laV/WCj/yd8VPTega8kAQDcaKMTyz/SEh0MbG7T3s1Pu3Fn+8tNXvvRrjb+YHzQkAHQnGQDoOvtr4fBe1X/a2IS9n53yVGgerDX3frH4X0+VDAkA3UYGALrIWDXu/dxR8UxYbZP3fnZK6bON39h381+uDfzOX5poAbqIDAB0he2l+Pa/a8TToI0t2fvZKXfuLH+hdP1bhxonvzf05//Y7/kC3UAGALZYq/p/cFz5hza2fO9np9xZvr135D9+YaTwZ39fPn2xz7MGtpYMAGyl/bU4+GvvJ/frqr2fnfJUaH7t5y//ypeKv/vXZftDgS0kAwBbY6waL/2195P7de3ez04pfbbxza/c/Of64O8d35aPPxGQOTIAsNkGCrH6Pznq4Gmjy/d+dsqdO8s//RPXvnXoxrv/NGx/KLD5ZABgU03vUf2nvQzt/eyUO8u3D9Z++Eu1wh98OGx/KLCZZABgk+weiR//q/5zv4zu/eyUp0LzyN4f1Bvbfv/koCEBYHPIAMCG214KRw6o/tNepvd+dlCleOObX2n8w0L5T/6umJs/FNC1ZABgAw0UYvlnatwZ00Zu9n52yp07y19++srO6Rszc2VDAsCGkgGAjTK1MxyaUP2njVzu/eyUz9y5dbD2w1/8mf4/+pshQwLABpEBgM4bq8byj+o/98v93s9O6e+5eWTvD/51cfCP/3abIQGg42QAoJO2l+Lg764Rh0objUbj2rVrqv9r94XS9W9ONf7h30qGBIDOkgGAzhgoxPLP9ITjpI1ms3n9+vWk9n52yp3l219++sqXfq3xF/ODhgSATpEBgA7YXwuH96r+00biez875anQPFhr7v1i8Xf/uqwaBDw5GQB4ImPVWP7ZUXGKtLG4uLi0tKT80ymlzza++ZWb/3Jt4Hf+0rQN8ERkAGCdtpfi3s/JUedHG/Z+bpA7d5a/ULr+rUONk98b+vN/7M/lnxHYBDIA8Nha1f+D48o/tHH79u0rV66o/m+oO8u39478xy+MFP7s78unL/bl+E8KbBAZAHg8u0di+cfeT+5n7+cmeyo0v/bzl//72rbfPzloSAB4LDIAsFbPVOLbf63qwGjD3s+tUine+OZXGv9cH/y949vSPAFgHWQA4NEGCvHtX/Wftuz93HJ37iz/9E9c+9ahG+/+07D9ocBayADAI0zvUf2nPXs/u8qd5dsHaz/8pVrhDz4c/u6/96Z+HMBDyQDAA41Vw5EDqv+0Z+9nd3oqNI/s/cG/Lg7+8d9uMyQAPIgMALSxvRTf/lX/acvez+73hdL1b35l6R8Wyn/yd8XUzwJoRwYAfsxAIZZ/psadCm3Y+5khd+4sf/npKzunb8zMlQ0JAKvIAMAnpnaGQxOq/7Rh72dGfebOrYO1H/7iz/T/0d8MGRIA7pEBgNCq/h/eF3ZUHAZt2PuZdf09N39j3+V/uTZgSABokQEgddtL8e1/10jq50Bb9n7mxp07y3FIYKrxD/9WMiQAyACQroFCLP9MT/gRoA17P3PpzvLtLz995Uu/1vizvy+fvtiX+nFAwmQASNT+Wji8V/Wf9uz9zLenQvNrP3/5V75U/N2/LqsGQZpkAEjOWDVu/rH3k7bs/UxH6bONb37l5r9cG/idv3QJCCRHBoCEbC/Ft//JUc+cNuz9TFBrSOBbhxonvzf05//Yn/pxQEpkAEjF9J5wcFz5hzbs/UzcneXbe0f+4xdGCn/w4bD9oZAIGQDyb/dI3PxT8W0/7dj7SctToXlk7w9+sDT4v/11acm3QZB3MgDk2TOV+Pav+k9b9n6ySrFYHP9vt/3hfwlvfRRmzjgdyDMZAPJpoBDf/lX/eZD5hTD0mR86HloKhUK5XO7ri9tCi4W4NOzgeHjtgzC34IAgn2QAyKGpneHQhOo/7dUXw9GTYfZCeO3XnBCht7d3aGiov3/1QHClFH77V8PpC/Gn5fKic4K8kQEgV8aq4cgB1X/aazTDe2djx0PbmxBCT0/PwMDAtm3benoeeEXArpH469hHfmwgb2QAyIntpfj2r/rPg5w4F46d8oEudxWLxVKp1Nu7pi1A0xOxGnT0w3B83vlBTsgAkHkDhbj3c2rck6S9+YX49q/YTUtfX1+5XC4UHq8sWCyEl56NI0Z+liAfZADItv21OL2n+k9bjabPbvlET09PuVwuFovrPpNaNQ4J+E4JckAGgKwaq8bNPzsqHiDt6XDzaYODgw+v/q/d5Gi8dcRsCWSaDADZs70U3/53jXh0tGeXC5/W398/NDS0xur/GhULcUhg/+jdHVNA5sgAkCUDhbj3c3rCQ6O9S/X4TqauTUtvb+/w8PDjVv/XrlIKLz8XB06OngwX6w4dskQGgMzYX4tv//Z+0laj6W5XPtHT09Mq/2zCmdSq4dXn45DA0ZOqQZAZMgBkwFg1bv6x95MHmTkbZzS9ftGybdu2wcHBjlT/1+7ekMCxUx4DZIAMAF1toBCr/5OjnhLtzS+E1z5Q/eeuQqEwPDzc2er/2t0bEnjtA4U06HYyAHSv6T3xXh57P2mrvmgck0/09vYODQ319/dv+ZlUSnF/qHQKXU4GgG60eyR+/K/6T1uNpsYFn+jp6RkYGCiVuuvvi1o1vP6Clhp0LxkAusszlfj2r/rPg5i85NOKxWK5XN7k6v/aTY3HapBpdehCMgB0i4FCLP9MjXsgtGcDI59WKBTK5XJfX1+Xn0qxEO8yb90kYEgAuocMAF1hamc4NKH6T3v1xXjp7/F5x0NoVf9LpVKxWMzQaeyoxCEBt9dB95ABYIuNVcORA6r/tNeq/s+cUf4h3Kv+b9u2rWvLPw+3ayT+OvaRH2nYejIAbJntpfj2r/rPg5w4F+cpfWhKS39//9DQ0Fbt/eyg1v5QX23B1pIBYAsMFGL5Z3rC2dPepbryNJ/o6+srl8uFQn7KgpVSeOnZePPJsVN+zmFryACw2fbX4oSc6j9tNZrh6Ic+H+Wunp6ecrmcrer/2tWqcUjA912wJWQA2Dxj1bj3c0fFkdOenjSfNjg4mN3q/9pNjsYbUVx5AZtMBoDNsL0U3/53jThs2rMvhU8rFArDw8M5qP6vUbFwd0jA1dewaWQA2Fit6v/BceUf2qsvhtc+UInmrt7e3uHh4TxV/9euUgovP+ceDNgkMgBsoP21+OGWvZ+01Wi6P5VP9PT0tMo/iZ9JrRpefd592LDhZADYEM9UYvnH3k8eZGal/ewVh5Zt27YNDg7mvvq/dq0hASEZNo4MAB02UIhv/5OjzpX2VB34tEKhUC6X+/r6nMoqxUJcoXZwXFkONoQMAJ00vUf1nweqLxp55BO9vb1DQ0P9/f3O5CEqpbg/dH4hJgFD89BBMgB0xu6R+PG/6j9tNZpWH/KJnp6egYGBUsnfF2tVq4bXX9Cgg06SAeBJbS+FIwdU/3kg0418WrFYLJfLqv/rMDW+sj/UJXrQCTIArN9AIZZ/psYdIe3NL8SPLVWZaSkUCoODg2nu/eyUYiG89Gz8W/foSf9lwRORAWCdpnaGQxOq/7RXX4yX/vq0kpbe3t5SqVQsFp1HR+yoxCEBN+vBk5AB4LGNVWP5R/WftlrV/5kzyj/c1dr6r/zTcbtG4t/G/nOD9ZEB4DFsL8XB310jzoz2fDDJp/X39w8NDfX29jqVDVIsxHsY94/62g0emwwAazJQiOWf6QmnRXuX6grKfKKvr69cLqv+b45KKQ4JTI4av4HHIAPAo+2vxatqVP9pq9G0qIRP9PT0lMtl1f/NV6vGIQFruGCNZAB4mLFq3Pxj7ycPYmE5n7Zt27bBwUHV/y00ORpva3EdBzySDADtbS/Ft//JUcdDey4u5dMKhcLw8LDqfze4NyTgWm54CBkAVmtV/w+OK//QXn0xvv2rHdPS29s7PDys+t9tKqXw8nMxqx89GS7WUz8NuJ8MAD9m90jc/GPvJ201muGtj+IiQmhV/1t7Px1G16pVw6vP6+xBGzIA3PVMJb79q/7zIGYN+bRisVgul1X/M2FqPFaDBHj4NBkAYvnn8D7Vfx5InYBPKxQK5XK5r6/PqWRIsRDXux0cV+SDu2QAUje9R/WfB6ovGivkE729vUNDQ/39/c4koyqluD/UQD/JCzIASRurhiMHVP9pr9G0XpBP9PT0DAwMlEr+vsiDWjW8/kK8WnjmjHYf6ZIBSNH2Unz7V/3nQU6ci2//PiakpVgslkolez9zZnoifgnsgj+SJQOQloFCLP9MjXvstDe/EN/+1YVpKRQKg4OD9n7mVbEQXno2/otw9KT/6kmODEBCpnaGQxOq/7RXX4zdAJ8I0tLT01Mul4vFovPIvR2VOCTg2z9SIwOQhLFq3Pyzo+Jp055mMJ/W2vpv72dSJkfj/TDvnfVXAamQAci57aX49r9rxHOmvdMXYg0gzQ//ztcLP1nxsvNj+vv7h4aGVP/TVCzEIYH9o74SJAkyALk1UIjln+kJT5j2LtWVgPlEb2/v8PCw6j+VUhwSmBx1Kwg5JwOQT/tr8e3f3k/aajTdGMpqTz31lADAPbVqePV5t4OTZzIAeTNWjZt/7P3kQWZWtv77Rx14pHtDAq4KIX9kAPJjeym+/U+OeqS053JQHuLyYigO2hvGaveGBFwZTs7IAOTE9J5424t/v2mrvhjf/lX/eYj6Yvhf/jKuEPA5AverlMLLz/kcgVyRAci83SPxn23Vf9pqNH2Pz1otNeMb3ol5fULaq1XD6y/oE5ITMgAZ9kwlvv37p5oHMc/HOswthLm37RXggabGYzXIXgGyTgYgw1593tOjvfkFe/14Isfnw+x5+4Vpr79v+X8Yv/GfzcJfzWugklUyAJAr9UWje3TGUjNWPk7Mu2eQH9NoNBYXF2/fvh2CAECGyQBATrSq/+75p7MuL4ZX3o1Lhw/vCzsqDjdpt27dunbtWrPprxjyQAYA8uDEufiRrX0dbJC5hfD1N+OQwOG99o+laHl5+fr16zdu3Ej9IMgRGQDItvmF+PZv7yeboDUkML0nToWSjkajce3ateXlZc+cPJEBgKxqNMPRD+NrGWyapWYcOJk5E44csJQs/5R/yDEZAMikYx+p/rNlLi+Gb7wdhwSOHLA/NJ+Uf8g9GQDImNMX4gexqv9submF8OIbcX/ooQlDArmi/EMKZAAgM+qL8RpX1X+6ysyZu/tDJ0c9mMxT/iEdMgCQAY2mWznpXkvNmE5nzri5PMOUf0iNDAB0u5mzcfOP6j9d7mI9DgnsHolJwJBAtty4ceP69evKPyRFBgC61/xC/HhV9Z8Mmb0Qf03vCQfHDQlkQLPZvHbt2q1bt1I/CNIjAwDdqL4YB39nL3g4ZNKxU3FIYHqPIYHutby8fO3atUajkfpBkCoZAOgujWZ4b6X8A5l2eWWEvZUEDAl0G+UfkAGALnLiXPz4X/Wf3JhbCHNvh/21cHivalBXUP6BFhkA6ArzC/Ht/2Ld0yCHjs+H2fPxJoHpCY93yyj/wKfJAMAWqy/GS3+Pz3sO5NlS8+6QwOF9YdeIR73ZlH9gFRkA2DKt6v/MGeUfUnF5MbzybhirxiSwo+KxbwblH2hLBgC2xolz8WNRez9J0NxC+PqbsRp0aMKQwAa6ffv24uKi8g+0JQMAm+1SPVb/5xYcPEmbOXN3a9DUeOpHsREWFxeXlpaUf+BBZABg8zSa4eiHqv9w11Iz5uGZM+HIAftDO6bZbF65cuX27ds5+fPAxpABgE1y7CPVf2jj8mL4xttxSODIgVApOaH1u3379tWrV2/evJnVPwBsIhkA2HDzC/GyJNV/eIi5hfDiG7EadHDckMB6KP/AY5EBgA1UX7kqVfUf1ujYqfh12eF9YXLUka2V8g+sgwwAbIhGM7y1Uv4BHstSMybnVhIwJPBwyj+wbjIA0HkzZ+PHmar/sG4X63FIYPdITAKGBNpS/oEnIQMAnTS/EPecXKw7VOiA2QuxSje105DAj1H+gScnAwCdUV+Mb/+zFxwndNJSM36r1rpJwJDA7du3r1y50mz6khGelAwAPKlGM7y3Uv4BNsjllfH6E/OxGrSjkuIpLy8v37hx4/r1613we4E8kAGAJ3LiXPz4X/UfNsHcQvj6m2F/LRzem1Y16ObNm1evXlX+gQ6SAYB1ml+In/3b+wmb7Ph8mD0fhwSmJ/J/9Mo/sEFkAOCx1Rfjpb/H550cbI17QwKH94VdI/l8CMo/sKFkAODxHFvZ+q/8A1vu8mJ45d0wVg1HDuRtf6jyD2w0GQBYq9MXYvX/8qIDgy4ytxBefCNWgw5N5GFIQPkHNocMADzapXp8+1f9h641c+bu/tCp8aw+JOUf2EwyAPAwjWY4+qHqP2TAUjNm9ZkzsRpUq2bsiTUajWvXrrn0FzaNDAA80MzK1n/Vf8iQy4vhG2+H3SNxXDgTQwK3bt26du2a8g9sMhkAaGN+IV5IpPoPGTV7If6a3hMOjnfvkMDy8vL169dv3LjRBb8XSI4MAPyY+sp1pKr/kAPHTsVq0OF9YXK06/4wyj+wtWQA4K5GM7y1svcTyI2lZkz1rSTQJUMCyj/QDWQAIDpxLk4Tqv5DLl2sxyGB/bV4tfAWDgko/0D3kBxt+2gAACAASURBVAEgdfML8e3/Yj31c4DcOz4fZs/HmwS2ZEhA+Qe6igwA6aovxrf/2Qt+BCAVS804JHBiPlaDdo1s0h9a+Qe6kAwAKWo0w3srez+BBF1eDK+8G8aqMQnsqGzgn395efnatWuNRsNPGXQbGQCSc+JcfPu39xMSN7cQvv5mHBI4vHdDqkGtS3+Vf6A7yQCQkPmF+PZv7ydwz70hgemJjh1Ks9m8du3arVu3HDN0LRkAktBohqMfxn/sAVa5NyRw5MCT7g9V/oGskAEg/46tbP239xN4iMuLcX/oWDUmgfXtD1X+gQyRASDPTl+Im39U/4E1mlsIL74Rq0GHJh5jSED5BzJHBoB8ulSPb/+q/8A6zJyJ1aDpPWFq/BH/Z+UfyCgZAPKm0QxvrZR/ANZtqRk/R2jdJPCgIQHlH8guGQByZWZl67/qP9ARF+txSGD3SEwCnx4SUP6BrJMBICfqK/N8qv9Ax81eiL8O74vVoNu3b1+9evXmzZuOGTKtx+ODfLi8KAAAG+j0+bC4uHj58mUBAHLA9wAAwCN8cXvzf/zylevXbzsoyAcZAAB4oM8P3P7qz1392ad99g+5IgMAAO39cm1x308tfa7P5h/IGxkAAFjti9ubz++68vmi8g/kkwwAAHxC+QdSIAMAAHcp/0AiZAAAIPzs0ze/On5V+QcSIQMAQNI+P3D7a7uu/GTFBeOQEBkAABL1ub7lyZ+68Uu1634AIDUyAACkSPkHUiYDAEBalH8AGQAAUqH8A7TIAACQBOUf4B4ZAAByTvkHWEUGAIDcUv4B2pIBACCfdu9ofHX8mkt/gfvJAACQN9WhW18dv6b8AzyIDAAA+fG5vuVfHru+74s3PFPgIWQAAMgJ5R9gjWQAAMg85R/gscgAAJBhyj/AOsgAAJBVyj/A+sgAAJA9yj/Ak5ABACBLPte3/NXxa7t3NDw1YN1kAADIjNalv8o/wBOSAQAgA764vfnVn7v29NAtDwt4cjIAAHQ15R+g42QAAOheyj/ARpABAKAbKf8AG0cGAIDuovwDbDQZAAC6iPIPsAlkAADoCso/wKaRAQBgi31+4PZXf+7qzz5904MANocMAABb6Zdri/t+akn5B9hMMgAAbI0vbm8+v+vK54u3nT+wyWQAANhsyj/A1pIBAGBTKf8AW04GAIBNovwDdAkZAAA2nPIP0FVkAADYWMo/QLeRAQBgo/zs0ze/On5V+QfoNjIAAHTe5wduf23XlZ+sNJ0t0IVkAADopM/1LU/+1I1fql13qkDXkgEAoGOUf4BMkAEAoAOUf4AMkQEA4Iko/wCZIwMAwPop/wBZJAMAwHoo/wDZJQMAwONR/gGyTgYAgMewe0fjq+PXXPqbuGKx+MOlvtRPgSyTAQBgTapDt746fk35J3GFQmFwcLBQKPzn/5f6UZBpMgAAPMLn+pZ/eez6vi/ecFAp6+npKZfLxWIx9YMgF2QAAHgY5R9CCIODg9u2bevp6XEY5IMMAADtKf8QQujv7x8aGurt7XUY5IkMAACrKf8QQujt7R0eHi4UCg6D/JEBAODHKP/Q09PTKv8kfxLklgwAAHcp/xBC2LZt2+DgoOo/+SYDAEAs/zy/68ruHQ1HkbJCoVAul/v6LP4n/2QAAAhPD916euiWc0hWb2/v0NBQf39/6gdBMmQAACBdPT09AwMD9n6SGhkAAEhUsVgslUr2fpIgGQAASE5fX1+5XLb3k2TJAABAQnp6esrlcrFY9NBJmQwAAKSitfVf9R9kAAAg/wqFwvDwsOo/tMgAAECe9fb2Dg8Pq/7Dp8kAAEA+tfZ+lkolzxdWkQEAgBwqFovlcln1H9qSAQCAXCkUCuVyua+vz2OFB5EBAICc6O3tLZVK9n7CI8kAAEDmtar/9n7CGskAAEC29ff3Dw0N2fsJaycDAABZ1dfXVy6X7f2ExyUDAADZ09PT07r017ODdZABAICM2bZt2+DgoOo/rJsMAABkRqFQGB4eVv2HJyQDAAAZ0NvbOzQ01N/f72HBk5MBAICu1tr7WSqVPCboFBkAAOhexWKxXC6r/kNnyQAAQDcqFAqDg4P2fsJGkAEAgO7S09NTLpeLxaLnAhtEBgAAukhr67/yD2woGQAA6Ar9/f1DQ0P2fsImkAEAgC3W29s7PDys+g+bRgYAALZMT09Pq/zjEcBmkgEAgK2xbdu2wcFB1X/YfDIAALDZCoVCuVzu6+tz8rAlZAAAYPP09vYODQ319/c7c9hCMgAAsBl6enoGBgbs/YRuIAMAABuuWCyWSiV7P6FLyAAAwAbq6+srl8v2fkJXkQEAgA3R09NTLpeLxaLjhW4jAwAAndfa+q/6D91JBgAAOqlQKAwPD6v+QzeTAQCAzujt7R0eHlb9h+4nAwAAT6q197NUKjlJyAQZAAB4IsVisVwuq/5DhsgAAMA6FQqFcrnc19fnACFbZAAA4LH19vaWSiV7PyGjZAAA4DG0qv/2fkKmyQAAwFr19/cPDQ3Z+wlZJwMAAI/2H0t9/91/Kdv7CfngWzwA4GE+vtXzf367/Of/z3YBAHLD9wAAwAOd/N629+cGP77VM1Z1SJAfMgAA0Mb5euFPTw//aEn1H3JIBgAAfsyPGr3vnB36zvf7HQvklQwAANz18a2ek98deH++5EAg32QAACCavVR852z541v2hUD+yQAAkLrz9cL784Pfu2ztD6RCBgCAdH18q+eds+XZS0U/A5AUGQAAEvUX84MnvrtN+QcSJAMAQHK+8/3+d749ZO8nJEsGAICE/KjR++bpYdV/SJwMAABJ+PhWT6v843EDMgAA5N/J7217f25Q9R9okQEAIM/O1wvvnC0vXO3zlIF7ZAAAyKcfNXrfOTv0ne/3e77AKjIAAOTNx7d6Tn53wN5P4EFkAADIldlLxffnS/Z+Ag8hAwBATnz/at873y7b+wk8kgwAAJn38a2ed86WZy8VPUpgLWQAAMi21tZ/1X9g7WQAAMiq8/XCn54eVv0HHpcMAADZ86NG75unh1X/gfWRAQAgS1p7P9+fL3lqwLrJAACQGbOXiu+cLav+A09IBgCADDhfL7xztrxwtc/DAp6cDAAAXe1Hjd7350r2fgIdJAMAQJdqVf/t/QQ6TgYAgG70ne/3v/PtIXs/gY0gAwBAd/n+1b53vl229xPYODIAAHSLj2/1tC799USADSUDAEBXOPm9be/PDar+A5tABgCALXa+XvjT08Oq/8CmkQEAYMv8qNH7ztmh73y/3yMANpMMAABboLX38/35ksMHNp8MAACbbfZS8Z2zZdV/YKvIAACwec7XC+/PD9r7CWwtGQAANsPHt3reOVuevVR02sCWkwEAYMO1tv4r/wBdQgYAgA30ne/3v/PtIXs/ga4iAwDAhvhRo/fN08Oq/0AXkgEAoMM+vtXTKv84WKA7yQAA0En2fgLdTwYAgM44Xy+8c7a8cLXPeQJdTgYAgCf1o0bvO2eHvvP9ficJZIIMAADr9/GtnpPfHbD3E8gWGQAA1mn2UvH9+ZK9n0DmyAAA8Ni+f7XvnW+X7f0EMkoGAIDH8PGtnnfOlmcvFR0akF0yAACs1cnvbXt/blD1H8g6GQAAHu18vfCnp4dV/4F8kAEA4GF+1Oh98/Sw6j+QJzIAALTX2vv5/nzJ+QA5IwMAQBuzl4rvnC2r/gO5JAMAwI85Xy+8c7a8cLXPsQB5JQMAwF0/avS+P1ey9xPIPRkAAKK/mB888d1tyj9ACmQAAAj/8//139j7CaTDpx0AEAQAICkyAAAApEUGAACAtMgAAACQFhkAAADSIgMAAEBaZAAAAEiLDAAAAGmRAQAAIC0yAAAApEUGAACAtMgAAACQFhkAAADSIgMAAEBaZAAAAEiLDAAAAGmRAQAAIC0yAAAApEUGAACAtMgAAACQFhkAAADSIgMAAEBaZAAAAEiLDAAAAGmRAQAAIC0yAAAApEUGAACAtMgAAACQFhkAAADSIgMAAEBaZAAAAEiLDAAAAGmRAQAAIC0yAAAApEUGAACAtMgAAACQFhkAAADSIgMAAEBaZAAAAEiLDAAAAGmRAQAAIC0yAAAApEUGAACAtMgAAACQFhkAAADSIgMAAEBaZAAAAEiLDAAAAGmRAQAAIC0yAAAApEUGAACAtMgAAACQFhkAAADSIgMAAEBaZAAAAEiLDAAAAGmRASAnatXwPz0Xtpc8T6DzpnbGv2GA3HjKo4Tc2DUSfx37KMycCUtNzxXogLFqOHIgVHy+APkiA0DeTE+Eg+Ph6Ifh+LxnC6zf9lJ8+69VHSHkkAwAOVQshJeeDZOj4dipMLfgCQOPZ6AQyz/TE44NcksGgNyqVcNv/2o4cS4mgcuLnjOwJvtr4fDe+FECkGMyAOTc5GjYPRLeOxuTAMBDjFXD4X1hR8UZQf7JAJB/xUL8Tn//aDh6Msxe8MCB1baX4tv/rhEHA6mQASAVlVJ4+bkwvxCTwMW6xw6Ee9X/g+PKP5AWGQDSUquGV5+PQwJHT9ofCqnbX4tfEtr7CQmSASBFrSGBt1ZuEgAS9Ewlln/s/YRkyQCQqGIhrv44OB5e+8D+UEjIQCG+/U+OeuaQNBkAklYpxf2h8wsxCdgfCrk3vUf1HwgyABBaQwKvvxBmVvaHGhKAXNo9Ej/+V/0HWmQA4K6p8ZX9oR+G4/OOBPJjeykcOaD6D/wYGQD4RLEQXno2hoGjJw0JQOYNFGL5Z2rckwRWkwGA1XZU4pDA6QsxCRgSgIya2hkOTaj+A+3JAEB7u0bir2Mr+0MNCUCGjFVj+Uf1H3gIGQB4mOmJOCRw7CNDApAB20tx8HfXiGcFPIIMADxCpRSHBCZH49YgQwLQnQYKsfwzPeHxAGsiAwBrUqvGIYET5+KQgGoQdJX9tXjln+o/sHYyAPAYJkfjlvH3Vm4SALbcWDWWf3ZUPAng8cgAwOMpFu4OCRw9GWYvODzYGttLce/n5KjjB9ZDBgDWo1IKLz8X5hdiErhYd4SweVrV/4Pjyj/A+skAwPrVquHV58PMSjXIkABsgt0jsfxj7yfwhGQA4ElNjcdq0FsrNwkAG+SZSnz7r1WdL9ABMgDQAcVCXEtycDy89oH9odBhA4X49q/6D3SQDAB0TKUU94fOL8QkcHnRuUIHTO9R/Qc6TwYAOqxWDa+/EK8WnjljSADWb6wajhxQ/Qc2hAwAbIjpifjh5dEPw/F5BwyPZ3spvv2r/gMbRwYANkqxEF56Nk4MHz1pSADWZKAQyz9T404L2FgyALCxdlTikMCJc3F/qCEBeIipneHQhOo/sBlkAGAzTI7GvebvnTUkAG2MVePmnx0VZwNsEhkA2CTFQhwS2D8ax4UNCUDL9lJ8+9814jiATSUDAJuqUopDApOjcUjgYt3Zk66BQiz/TE/4EQC2gAwAbIFaNbz6fBwSOHpSNYgU7a/Fa/VU/4GtIgMAW+bekMCxUx4CqRirxs0/9n4CW0sGALbSvSGBoyfD7AWPgjzbXopv/5OjHjKw9WQAYOtVSuHl58L8QnjtA/tDyafpPfHWPOUfoEvIAEC3qFXD6y+EmZVqkCEBcmP3SNz8Uyl5okAXkQGA7jI1HqtBb30UbxKATHumEt/+Vf+BLiQDAF2nWIgrUw6Ox2rQ3ILnQ/YMFOLbv+o/0LVkAKBLVUrht381nL4Qx4UNCZAhUzvDoQnVf6CryQBAV9s1En8dW6kGGRKgy41Vw5EDqv9ABsgAQAZMT8Rq0NEPw/F5j4tutL0U3/5V/4GskAGAbCgWwkvPxoL1sVOGBDpj4WrfT1Z8t/KkBgpx7+fUeLb/FEBqZAAgS2rVOCRw4lxMAoYEntDH//mZTP/+u8H+WpxfV/0HMkcGALJncjTuXH/vrCEBtsxYNW7+2VHxBIBMkgGATCoW4pDA/tG4NWj2gmfI5tleim//u0YcOZBhMgCQYZVSePm5ML8Qk8DFuifJxhooxL2fB8eVf4DMkwGAzKtVw6vPxyGBoydVg9go+2vxqyd7P4F8kAGAnLg3JHDslEdKJ41V4+Yfez+BPJEBgPy4NyTw2gf2h9IBA4VY/Z8cdZZA3sgAZNiJc/5tpo1KKe4PnV+IScD+UNZteo/qPw9UX/TXC9kmA5Bhr30QTsz7jp72atXw+gthZqUaZEiAx7J7JH78r/pPW42mziF5IAOQbXMLYe5ts3o80NR4rAa99VG8SQAe6ZlKfPv3sQIPYvcAuSEDkAfH58Ps+bizb3rC82S1YiHe5Nq6ScCQAA8yUIhfKk6NOyDas4OYnPnMP/3bnd9621MlJ9zdw8OdvhD/Fdfibfnl2uIv1a53w++kGwz/xNOq/7RVXwzHPoofNkGe+B6AXLm8GF551x3+PNCukfjr2Eo1yLf5fJoAwP1a1X9/XZBLMgA5NLcQvv5mrAYdmvDvOm209of6YA94iBPn4uCvrw3JKxmA3Jo5c3drkIIv96uUwkvPxt2yx04ZEgB+zKW68SHyTwYgz5aa8e/xmTPhyAGLPmijVo03Cfi0D2hpNMPRD31DSBJkAPLv8mL4xttxSODIAftDaWNyNO6Dt/AbEmdSiKT0eNwkYm4hvPhG/Cu+4e937lMsxCGBP3whhgEgNfML4dffcJ8gafE9AGk5dip+zHN4X/zoF1aplMLLz9kCDgmpL8Yr51X/SZDvAUjOUjP+jf+bb8ZXPbhfrRpefT42xwYslYL8alX/X3xDACBRvgcgURfrcUhg90j8TsCQAPdrDQm8tdIPBnJm5qzmD6mTAUja7IX4CdDUznBw3E0CrFYshMN748+GqgDkhrIftMgApG6pGT8Nat0kYEiA+1VKcX/o/EJMAvaHQnbVF+Pb/+wFjxCCDAB3XV4ZC2slATcJcL9aNbz+gv4AZFKjafkvrCYDwCfmFsLc22F/LTZAVIO439R42D/qCiHIkhPn4sf/ojusIgPAasfnw+z5OCQwPeFsWK1YCC89G8PA0ZOGBKCrzS/Ez/79dwptyQDQxr0hgcP7wi6XRnGfHZU4JHD6QkwChgSg29QX442Qvq+Dh5AB4IEuL4ZX3g1j1bgq3v5Q7rdrJP54vHc27g/VNIBu0Kr++08SHkkGgEeYW4iXyEztDIcmDAmwWrEQO2P7R33oCFvPV3OwdjIArMnMmbtbg6bGHRirVUpxSGByVPkYtsaluhEdeDw9zgvWaKkZ/4359TfinBncr1aNQwJHDoQB3xfBZmk0w7f+Knz9TQEAHo/vAeDxXF4M33g77B6J48KGBLjf5Gj88bCMHDaBKztg3WQAWI/ZC/HX9J5wcNyQAKvdGxJwKSlsEFd3wxOSAWD9jp2KcwKH98WPfmGVSim8/Fx8Uzl6MlysOx3ojPrKte6aP/CEzAPAE1lqxn+NfvNNQwK0V6uGV5+PQdGQADyhRjPe0v3iGwIAdIDvAaADLtbjkMD+WmyAGBLgflPjsRr01kfxiyNgHU6ci1+pqf5Dp8gA0DHH58Ps+XiTgCEB7lcshMN748+GGgM8FoU62AgyAHTSUjMOCZyYj92PXSOOltUqpbg/1E1GsBb1RYP1sFFkAOi8y4vhlXfDWDUmgR0VB8xqu0bir2Mr1SDdBrhfo2nBLmwsM8GwUeYW4rU13/qr+I8Z3G96IvzhC3GMBPi0E+fiX54CAGwo3wPAxro3JDA94aRZrVgILz0bJ4aPnjQkALH6f+yU/xZgM8gAsOHuDQkcORA3RcIqOypxSODEufhzYkiANNUXYzvu+LzHD5tEBoBNcnkx7g8dq8YkYH8o95scDbtHYgfakACpMRsDm08GgE01txAvuJnaGQ5N2B/KasVC7IztH/WBKKmwIwu2igwAW2DmTKwGTe+JRXBYpVKKQwKTo3aik2eX6sZgYCvJALA1lprx37/WTQKGBLhfrRpefd7dqORQo+nObNh6MgBspYv1OCSweyQmAUMC3O/ekIA9ieTDzMoPs1gLW04GgK03eyH+mt4TDo4bEmC1e0MCLkwl0+YXwmsfqP5Dt5ABoFscOxW/HD+8L370C6tUSuHl57xFkUn1xfhzq/oPXcU9wdBFlprxX8rfeju+6sH9atXw+gsxKA74vogsaDTjkqsX3xAAoOv4HgC6ztxCmHs77K/FBoghAe43NR6rQaYq6XIm2qGbyQDQpY7Ph9nz8SaB6QmPiNWKhXB4790hAZ+w0m3mF2y2hW4nA0D3WmrGIYHW/tBdIx4Uq+2ohN/+Vbcs0UXqi4bXIRtkAOh2lxfDK++GsWpMAjsqHher7RqJv46tVIP0LtgqjWZcYuuHELJCBoBsmFsIX38zDgkc3mt/KG1MT8Tdskc/jC0y2GQnzsUvLX0ZBRkiA0CWtIYEpvfEqVBYpVgILz0bd8seO2VIgE0yv+DnDTJJBoCMWWrGuu3MmXDkQNwUCavUqnFIwOeybLRG0/dOkGEyAGTS5cXwjbfjkMCRA/aH0sbkaNg9op/NRjF/AlnnjjDIsLmFePnO0Q/jB3KwSrEQhwT+1+djGIBOOX0h/Pob8VsmAQAyzfcAkHkzZ+7uD50c9TBZrVIKLz9nXzsdUF+MF5mr/kM++B4A8mCpGf9t/s0346se3K9WDa8+H5tjA5ZK8fha1f8X3xAAID98DwD5cbEehwR2j8TvBAwJcL97QwLHTjkd1mrmrOYP5JAMAHkzeyH+mt4Tt8W7SYBVWkMC+0fjF0d9/gXgoeYX4s+J7VKQS5/5p3+781tve7aQQ9tLMQkYEuBBFhcXr1+/7nhann766W74bXSJ+mIcIJm9kPo5QI75FAhy6/LKAN+J+ZgE3CQArEWjqS0GSZABIOfmFsLc22F/LRzeqxoEPMyJc/Hjf9V/SIEMAEk4Ph9mz4epnbELDrCK7bGQGhkAUrHUjN/vt24S2OXSKGBFfTFe+nt83mlAWmQASMvlxfDKu2GsGpPAjoqHD+lqVf9nzij/QIpkAEjR3EL4+puxGnRowpAApOj0hVj+sfcTkiUDQLpmztzdGjQ17qcAUnGpHt/+3fgLiZMBIGlLzfg2MHMmHDlgfyjkXKMZjn6o+g8EGQAIrSGBb7wdhwSOHAiVkiOBHDr2keo/8AkZALhrbiG8+EasBh0cNyQA+TG/EK8LVP0HPk0GAH7MsVPxw8LD+8LkqIOBbKuvXBau+g/cTwYAVltqxveGVhIwJABZ1GiGt1bKPwBtyQBAexfrcUhg90hMAoYEIENmzsYv9FT/gYeQAYCHmb0QiwRTOw0JQAbML8RNXxfrnhXwCDIA8AhLzfiZYusmAUMC0J3qi/Htf/aCxwOsiQwArMnlleHCE/OxGrSj4sygWzSa4b2V8g/A2skAwGOYWwhffzPsr4XDe1WDYOudOBc//lf9Bx6XDAA8tuPzYfZ8HBKYnnB4sDXmF+Jn//Z+AusjAwDrcW9I4PC+sGvEEcLmqS/GS3+PzztyYP1kAGD9Li+GV94NY9Vw5ID9obAZjq1s/Vf+AZ6QDAA8qbmF8OIbsRp0aMKQAGyU0xdi9f/yogMGOkAGADpj5szd/aFT404UOulSPb79q/4DHSQDAB2z1IxvKjNnYjWoVnWu8KQazXD0Q9V/oPNkAKDDLi+Gb7wddo/EcWFDArBuMytb/1X/gY0gAwAbYvZC/DW9JxwcNyQAj2d+IV7Jp/oPbBwZANhAx07FatDhfWFy1DHDo9VXLuRW/Qc2mgwAbKylZnynaY0LGxKAB2k0w1srez8BNoEMAGyGuYUw93bYX4tXCxsSgFVOnIvz9Kr/wKaRAYDNc3w+zJ6PNwkYEoCW+YX49n+x7jiATSUDAJtqqRmHBE7MxyGBXSPOnnTVF+Pb/+wFPwLAFpABgC1weTG88m4Yq8YksKPiCZCWRjO8t7L3E2CryADAlplbCF9/Mw4JHN6rGkQqTpyLb//2fgJbSwYAtti9IYHpCY+CPJtfiG//9n4C3UAGALbevSGBIwfsDyWHGs1w9MMYdwG6hAwAdIvLi+Ebb8chgSMH7A8lP46tbP239xPoKjIA0F3mFsKLb8Rq0KEJQwJk2+kLcfOP6j/QhWQAoBvNnLl7tfDUuOdD9lyqx7d/1X+ga8kAQJdaasa3qNZNAoYEyIpGM7y1Uv4B6GYyANDVLtbjkMDukZgEDAnQ5WZWtv6r/gPdTwYAMmD2Qvw1vSccHDckQDeaXwivfaD6D2SGDABkRmt/6PSeMDnqodEt6ovx7V/1H8gWGQDIkssr71utJGBIgK3VaIb3Vso/AJkjAwDZM7cQ5t4O+2vxamFDAmyJE+fizLrqP5BRMgCQVcfnw+z5eJPA9IRnyOaZX4hv/xfrjhzIMBkAyLCl5t0hgcP7wq4RT5KNVV+Mb/+zFxwzkHkyAJB5lxfDK++GsWpMAjsqnied16r+z5xR/gFyQgYAcmJuIXz9zTgkcHiv/aF00olz8esmez+BPJEBgFxpDQlM7wlT4x4sT+pSPZZ/7P0E8kcGAPJm6f9v715+ozrPAA5/M65ly/Yw9oJFJRZI3gGqRBdgVlw2bMLarL1hxYau2SN1EzVKQ9JiEslVhVxaCVlVaSLADjeH4LZkrKBgSpNMqTJOSnCYoClgqhNbJFFpuPkyc97nkf+A42+88M/+3vc0st/bxqbS/t32h/Kcvm6k4fEsKQFySQMA+VSbSwdHsyGB/bvtD+XZHLvo6j+QcxoAyLNKNe07ku0P3TtgSIAne+969k8kV/+B3NMAQP6NTS3uD925wafN481+8wpqV/+BIIo+aCCCeiP7De9nI9kLnuC7CoXi1c/L+44IACAQ/wcAArkxmw0JbO3P/idgSIDsz/9f9/zyTOnzO/4iBsSiAYBwJq9nf/F96adpz2ZDAnHdTx1Hz5evVNujHwQQkgYAIqo3src+nZ7O3iRgSCCaQrHtzLXe313ujH4QQGAaAIir9s0Y6EIJeJNABIVC8ePb3T//k3tgQHQaAIiuUk2VnYT1oAAACXJJREFU0bRrYxra7mpQns39p+u18TXVW23RDwJAAwAsODWdJmeyIYHBASeSNw9S+x+ny3+eVngAizQAwKJHQwJDO9KWfqeSC4Xi5Wr5zXNd0c8B4Ps0AMD31ObSoRNp07qsBNavdTYt7JO50tGzPfZ+AvwvDQDwGJVqOjCSXQ3aO2BIoPU05jveeLfvo89c/Qd4PA0A8H+NTS1uDXpps0NqDQ8LbWOVPlf/AX6YBgD4IfVGGj6TxcD+3faHNrVCoXjlX6U3JnqiHwTAU9AAAE9Wm0sHR9PW/mxIYK3l8s2nVu96bbzs6j/AU9IAAE9r8nr2Nbgt7dlsSKBZ3E8dR8+Xr1Tbox8EwLPQAADP5tiF7GrQ0I60c4OTW02FYtvpj9Ycn7L3E+CZaQCAZ1ZvpFdOLpaAIYGVVygUZ77ofn285+49l38AnocGAHhON2azIYFdG7NXCxsSWDG3G52HJ3qrt+z9BHh+GgDghZyaTpMz2ZsEDAkstwep/fd/KU9cc8oAL0oDALyoeiMbElh4k4AhgWVRKL7/SemtC/Z+AiwNDQCwNGpz2ZDA6elsSGD9Woe6ZG5+1fPyOyVX/wGWkAYAWEqVajowkg0JDG13NehF3b3f8etzfR995uo/wBLTAABL79GQwOCA030e86nt7au9Y1c6W+/RAVqBBgBYFo+GBIZ2pC39zvipFYpXa92vnrZoCWAZaQCAZVSbS4dOpE3r0v7d9oc+Wa3e9dp4+fM7rv4DLC8NALDsKtW070h2NWjvgCGBx2vMdxx7v3TpH04HYCVoAIAVMja1uD/0pc2O/LuKZ2bKx6e6mueBAHJPAwCsnHojDZ9ZHBLYuM7Bp6uzpeGzPfZ+AqwwDQCw0m7MpoOjaWt/VgJhhwRuNzoPT/RWb9n7CbAKNADA6pi8nn0Nbkt7NscaEphPbSPv9bn6D7CKNADAajp2IZsTGNqRdm4I8DkUiuf/XvrtpZ4meBSA0DQAwCqrN9IrJxfHhXM8JPDxlz2vni65+g/QDDQAQFOoVFNlNO3amL1aOGdDAnfvd/zqbPlarb0JngWApAEAmsup6TQ5k71JIB9DAvOpbeyD3rc/7GyCZwHgWxoAoLnUG9mQwML+0C39LfvhFIpXbnaPXLT3E6AZaQCAZlSbS4dOpE3rshJYv7bFPqJavevo+TX2fgI0LQ0A0Lwq1XRgJBsSGNreGleDGg/aj10u2/sJ0OQ0AECzezQkMDjQvE/6MBXHZ8rHp7qa4FkAeAINANACHg0J7N/djPtDr86Whs+6+g/QMjQAQMuozaWDo9mQwP7dzbI/9Haj4/BEn6v/AK1FAwC0mEo17TuSXQ3aO7CaQwIPHrb95lKfq/8ArUgDALSksanF/aE7N6z84xcvf9r95oV8vckMIBINANCq6o30ysksBoZ2rNyQwM2vul5+p+zqP0BL0wAAre3GbDYksLU/K4FlHRK4c69j+Fz5Wq3dDwxAq9MAAHkweT37GtyW9mxe+iGB+dQ29sGatz+09xMgJzQAQH4s7A8d3LZ0QwKF4pWb3SMX7f0EyBUNAJArtblsSGChBF5wSOCLu52/ONX777q9nwB5owEAcqhSTZXRtGtj9mrh5xgSaDxof+ti+YN/2vsJkE8aACC3Tk2nyZnsTQKDA0/7LT5MxfGZ0vGpHj8VADmmAQDyrN5YHBIY2pG29D/hG73+Rc/rEyVX/wFyTwMA5F9tLh06kTaty0pg/drHfLu3Gx2HJ/qqt1z9BwhBAwBEUammAyPZkMDQ9m/3h96bb/vD33rfvdbpxwAgDg0AEMvCkMDgtvSTHxf/+mnpzQvL+V4xAJqSBgAIp95Iw2dSSgZ/AYIy+AUAALFoAAAAiEUDAABALBoAAABi0QAAABCLBgAAgFg0AAAAxKIBAAAgFg0AAACxaAAAAIhFAwAAQCwaAAAAYtEAAAAQiwYAAIBYNAAAAMSiAQAAIBYNAAAAsWgAAACIRQMAAEAsGgAAAGLRAAAAEIsGAACAWDQAAADEogEAACAWDQAAALFoAAAAiEUDAABALBoAAABi0QAAABCLBgAAgFg0AAAAxKIBAAAgFg0AAACxaAAAAIhFAwAAQCwaAAAAYtEAAAAQiwYAAIBYNAAAAMSiAQAAIBYNAAAAsWgAAACIRQMAAEAsGgAAAGLRAAAAEIsGAACAWDQAAADEogEAACAWDQAAALFoAAAAiEUDAABALBoAAABi0QAAABCLBgAAgFg0AAAAxKIBAAAgFg0AAACxaAAAAIhFAwAAQCwaAAAAYtEAAAAQiwYAAIBYNAAAAMSiAQAAIBYNAAAAsWgAAACIRQMAAEAsGgAAAGLRAAAAEIsGAACAWDQAAADEogEAACAWDQAAALFoAAAAiEUDAABALBoAAABi0QAAABCLBgAAgFg0AAAAxKIBAAAgFg0AAACxaAAAAIhFAwAAQCwaAAAAYtEAAAAQiwYAAIBYNAAAAMSiAQAAIBYNAAAAsWgAAACIRQMAAEAsGgAAAGLRAAAAEIsGAACAWDQAAADEogEAACAWDQAAALFoAAAAiEUDAABALBoAAABi0QAAABCLBgAAgFg0AAAAxKIBAAAgFg0AAACxaAAAAIhFAwAAQCwaAAAAYtEAAAAQiwYAAIBYNAAAAMSiAQAAIBYNAAAAsWgAAACIRQMAAEAsGgAAAGLRAAAAEIsGAACAWDQAAADEogEAACAWDQAAALFoAAAAiEUDAABALBoAAABi0QAAABCLBgAAgFg0AAAAxKIBAAAgFg0AAACxaAAAAIhFAwAAQCwaAAAAYtEAAAAQiwYAAIBYNAAAAMSiAQAAIBYNAAAAsWgAAACIRQMAAEAsGgAAAGLRAAAAEIsGAACAWDQAAADEogEAACAWDQAAALFoAAAAiEUDAABALBoAAABi0QAAABCLBgAAgFg0AAAAxKIBAAAgFg0AAACxaAAAAIhFAwAAQCwaAAAAYtEAAAAQiwYAAIBYNAAAAMSiAQAAIBYNAAAAsWgAAACIRQMAAEAsGgAAAGLRAAAAEIsGAACAWDQAAADEogEAACAWDQAAALFoAAAAiEUDAABALBoAAABi0QAAABCLBgAAgFg0AAAAxKIBAAAgFg0AAACxaAAAAIhFAwAAQCwaAAAAYtEAAAAQiwYAAIBYNAAAAMSiAQAAIBYNAAAAsWgAAACIRQMAAEAsGgAAAGLRAAAAEMuPujvSxnU+dAAACCGl9F8D7Zh3C+ILkwAAAABJRU5ErkJggg=="
+				,"E:\\2021011620210116\\1.jpg");
+	}
+
+
+	public static boolean GenerateImage(String imgStr, String imgFilePath) {// 对字节数组字符串进行Base64解码并生成图片
+		if (imgStr == null) // 图像数据为空
+			return false;
+		BASE64Decoder decoder = new BASE64Decoder();
+		try {
+			// Base64解码
+			byte[] bytes = decoder.decodeBuffer(imgStr);
+			for (int i = 0; i < bytes.length; ++i) {
+				if (bytes[i] < 0) {// 调整异常数据
+					bytes[i] += 256;
+				}
+			}
+			// 生成jpeg图片
+			OutputStream out = new FileOutputStream(imgFilePath);
+			out.write(bytes);
+			out.flush();
+			out.close();
+			return true;
+		} catch (Exception e) {
+			return false;
+		}
+	}
+
+	public static String imgTobase64(String imgPath){
+		InputStream inputStream = null;
+		byte[] data = null;
+		try {
+			inputStream = new FileInputStream(imgPath);
+			data = new byte[inputStream.available()];
+			inputStream.read(data);
+			inputStream.close();
+		} catch (IOException e) {
+			e.printStackTrace();
+		}
+		// 加密
+		BASE64Encoder encoder = new BASE64Encoder();
+		return encoder.encode(data);
+	}
+
 
   
 
diff --git a/zq-erp/src/main/java/com/matrix/system/hive/pojo/CzXkVo.java b/zq-erp/src/main/java/com/matrix/system/hive/pojo/CzXkVo.java
index b071654..66abb3a 100644
--- a/zq-erp/src/main/java/com/matrix/system/hive/pojo/CzXkVo.java
+++ b/zq-erp/src/main/java/com/matrix/system/hive/pojo/CzXkVo.java
@@ -1,6 +1,7 @@
 package com.matrix.system.hive.pojo;
 
 import com.matrix.system.hive.bean.AchieveNew;
+import com.matrix.system.hive.bean.SysOrderFlow;
 
 import java.util.List;
 
@@ -17,8 +18,17 @@
 	private Long staffId;
 	private Long vipId;
 	private List<AchieveNew> achaeveList;
-	
-	 
+
+	private List<SysOrderFlow> flows;
+
+	public List<SysOrderFlow> getFlows() {
+		return flows;
+	}
+
+	public void setFlows(List<SysOrderFlow> flows) {
+		this.flows = flows;
+	}
+
 	public Long getCardId() {
 		return cardId;
 	}
diff --git a/zq-erp/src/main/java/com/matrix/system/hive/pojo/ShoppingCarItemsVo.java b/zq-erp/src/main/java/com/matrix/system/hive/pojo/ShoppingCarItemsVo.java
index e27b98d..ca3e448 100644
--- a/zq-erp/src/main/java/com/matrix/system/hive/pojo/ShoppingCarItemsVo.java
+++ b/zq-erp/src/main/java/com/matrix/system/hive/pojo/ShoppingCarItemsVo.java
@@ -21,8 +21,16 @@
 	private Long beatuyId;
 	
 	private String beatuyName;
-	
-	
+
+	private Long vipId;
+
+	public Long getVipId() {
+		return vipId;
+	}
+
+	public void setVipId(Long vipId) {
+		this.vipId = vipId;
+	}
 
 	public Long getBeatuyId() {
 		return beatuyId;
diff --git a/zq-erp/src/main/java/com/matrix/system/hive/service/AchieveNewService.java b/zq-erp/src/main/java/com/matrix/system/hive/service/AchieveNewService.java
index 0b2ec73..e502b07 100644
--- a/zq-erp/src/main/java/com/matrix/system/hive/service/AchieveNewService.java
+++ b/zq-erp/src/main/java/com/matrix/system/hive/service/AchieveNewService.java
@@ -2,13 +2,13 @@
 
 import java.util.List;
 
+import com.matrix.system.app.vo.UserAchieveVo;
 import com.matrix.system.hive.bean.AchieveNew;
 import com.matrix.system.hive.bean.SysOrder;
 import com.matrix.system.hive.bean.SysProjServices;
 
 import com.matrix.core.pojo.PaginationVO;
 import com.matrix.system.hive.plugin.util.BaseServices;
-import org.apache.ibatis.annotations.Param;
 
 /**
  *
@@ -113,4 +113,8 @@
 
 	int findVipConsumeStatisticsTotal(AchieveNew achieveNew);
 
+	public UserAchieveVo findUserAchieveByTime(int type);
+
+	public List<AchieveNew> findOrderItemAchieve(Long orderid);
+
 }
\ No newline at end of file
diff --git a/zq-erp/src/main/java/com/matrix/system/hive/service/ArticleService.java b/zq-erp/src/main/java/com/matrix/system/hive/service/ArticleService.java
index dceb4ad..af74da5 100644
--- a/zq-erp/src/main/java/com/matrix/system/hive/service/ArticleService.java
+++ b/zq-erp/src/main/java/com/matrix/system/hive/service/ArticleService.java
@@ -72,6 +72,7 @@
 	 */
 	public Article  findById(Long id);
 
+	public List<Article> findApiArticleListInPage(Article article, PaginationVO pageVo);
    	
 
   
diff --git a/zq-erp/src/main/java/com/matrix/system/hive/service/CodeService.java b/zq-erp/src/main/java/com/matrix/system/hive/service/CodeService.java
index fefb430..896518f 100644
--- a/zq-erp/src/main/java/com/matrix/system/hive/service/CodeService.java
+++ b/zq-erp/src/main/java/com/matrix/system/hive/service/CodeService.java
@@ -24,6 +24,8 @@
 	* @throws
 	 */
 	public String getOrderCode();
+
+	public String getFlowCode();
 	
 	/**
 	*  根据一定的规则返回一个随机编号。
diff --git a/zq-erp/src/main/java/com/matrix/system/hive/service/MoneyCardUseService.java b/zq-erp/src/main/java/com/matrix/system/hive/service/MoneyCardUseService.java
index cc80452..c677c7b 100644
--- a/zq-erp/src/main/java/com/matrix/system/hive/service/MoneyCardUseService.java
+++ b/zq-erp/src/main/java/com/matrix/system/hive/service/MoneyCardUseService.java
@@ -93,11 +93,7 @@
      */
     public void transfer(MoneyCardUse moneyCardUse, Long vipId2, Double money);
 
-    /**
-     * 退款
-     * jyy
-     */
-    public int returnMoney(MoneyCardUse moneyCardUse, Long hjkId);
+
 
     /**
      * 设置为有效
diff --git a/zq-erp/src/main/java/com/matrix/system/hive/service/ShoppingGoodsCategoryService.java b/zq-erp/src/main/java/com/matrix/system/hive/service/ShoppingGoodsCategoryService.java
index fec260e..c45df9c 100644
--- a/zq-erp/src/main/java/com/matrix/system/hive/service/ShoppingGoodsCategoryService.java
+++ b/zq-erp/src/main/java/com/matrix/system/hive/service/ShoppingGoodsCategoryService.java
@@ -60,6 +60,6 @@
 	public ShoppingGoodsCategory  findById(Long id);
 
    	
-
+	List<ShoppingGoodsCategory> findChildNodesByName(ShoppingGoodsCategory shoppingGoodsCategory);
   
 }
\ No newline at end of file
diff --git a/zq-erp/src/main/java/com/matrix/system/hive/service/ShoppingGoodsService.java b/zq-erp/src/main/java/com/matrix/system/hive/service/ShoppingGoodsService.java
index 16c6ad5..366dbf4 100644
--- a/zq-erp/src/main/java/com/matrix/system/hive/service/ShoppingGoodsService.java
+++ b/zq-erp/src/main/java/com/matrix/system/hive/service/ShoppingGoodsService.java
@@ -1,6 +1,9 @@
 package com.matrix.system.hive.service;
 
 import com.matrix.core.pojo.PaginationVO;
+import com.matrix.system.app.dto.ShoppingGoodsListDto;
+import com.matrix.system.app.vo.ShoppingGoodsDetailVo;
+import com.matrix.system.app.vo.ShoppingGoodsListVo;
 import com.matrix.system.hive.bean.ShoppingGoods;
 import com.matrix.system.hive.plugin.util.BaseServices;
 
@@ -101,4 +104,10 @@
 	public  ShoppingGoods findByCode(String goodsCode);
 
 	Date calInvalidTime(ShoppingGoods shoppingGoods, Integer type, Date buyDate);
+
+	List<ShoppingGoodsListVo> findShoppingGoodsListForApi(ShoppingGoodsListDto shoppingGoodsListDto);
+
+	int findShoppingGoodsListTotalForApi(ShoppingGoodsListDto shoppingGoodsListDto);
+
+	ShoppingGoodsDetailVo findApiShoppingGoodsDetailById(Long id);
 }
\ No newline at end of file
diff --git a/zq-erp/src/main/java/com/matrix/system/hive/service/SysBeauticianStateService.java b/zq-erp/src/main/java/com/matrix/system/hive/service/SysBeauticianStateService.java
index 17cf5ab..5904b62 100644
--- a/zq-erp/src/main/java/com/matrix/system/hive/service/SysBeauticianStateService.java
+++ b/zq-erp/src/main/java/com/matrix/system/hive/service/SysBeauticianStateService.java
@@ -75,7 +75,7 @@
 	public List<SysBeauticianState> findByTimeAndStaff(Long id, Date beginTime, Date endTime);
 
 
-   	
+   	public List<SysBeauticianState> findBySerId(Long serviceId);
 
   
 }
\ No newline at end of file
diff --git a/zq-erp/src/main/java/com/matrix/system/hive/service/SysOrderFlowService.java b/zq-erp/src/main/java/com/matrix/system/hive/service/SysOrderFlowService.java
new file mode 100644
index 0000000..609de95
--- /dev/null
+++ b/zq-erp/src/main/java/com/matrix/system/hive/service/SysOrderFlowService.java
@@ -0,0 +1,17 @@
+package com.matrix.system.hive.service;
+
+import com.matrix.system.hive.bean.SysOrderFlow;
+import com.matrix.system.hive.plugin.util.BaseServices;
+
+import java.util.List;
+
+/**
+ * @author wzy
+ * @date 2021-01-11
+ **/
+public interface SysOrderFlowService extends BaseServices<SysOrderFlow> {
+
+    public List<SysOrderFlow> findByOrderId(Long orderId);
+
+    public List<SysOrderFlow> findPayMethodsAmount(Long orderId);
+}
diff --git a/zq-erp/src/main/java/com/matrix/system/hive/service/SysOrderItemService.java b/zq-erp/src/main/java/com/matrix/system/hive/service/SysOrderItemService.java
index ddd6344..2fb658c 100644
--- a/zq-erp/src/main/java/com/matrix/system/hive/service/SysOrderItemService.java
+++ b/zq-erp/src/main/java/com/matrix/system/hive/service/SysOrderItemService.java
@@ -72,7 +72,8 @@
 	 */
 	public Integer findDclItemTotal(Long vipId);
 
-   	
+	public List<SysOrderItem> findByOrderId(Long orderId);
 
-  
+
+
 }
\ No newline at end of file
diff --git a/zq-erp/src/main/java/com/matrix/system/hive/service/SysOrderService.java b/zq-erp/src/main/java/com/matrix/system/hive/service/SysOrderService.java
index a283ccf..6e0e060 100644
--- a/zq-erp/src/main/java/com/matrix/system/hive/service/SysOrderService.java
+++ b/zq-erp/src/main/java/com/matrix/system/hive/service/SysOrderService.java
@@ -2,6 +2,9 @@
 
 import com.matrix.core.exception.GlobleException;
 import com.matrix.core.pojo.PaginationVO;
+import com.matrix.system.app.dto.OrderListDto;
+import com.matrix.system.app.vo.OrderDetailVo;
+import com.matrix.system.app.vo.RankingVo;
 import com.matrix.system.hive.bean.SysOrder;
 import com.matrix.system.hive.plugin.util.BaseServices;
 import com.matrix.system.hive.pojo.CzXkVo;
@@ -81,6 +84,8 @@
 	 */
 	public void updateReceiptMoney(SysOrder sysOrder) throws GlobleException;
 
+	public void refundOrderMoney(SysOrder sysOrder);
+
 	/**
 	 * 创建订单
 	 * @param session
@@ -128,4 +133,13 @@
 	SysOrder checkAndSaveOrder(SysOrder sysOrder);
 
 	SysOrder findSysOrderTjByVipId(Long vipId);
+
+	List<OrderDetailVo> findApiOrderListInPage(OrderListDto orderListDto, PaginationVO pageVo);
+
+	int findApiOrderListTotal(OrderListDto orderListDto);
+
+	OrderDetailVo findApiOrderDetailByOrderId(Long orderId);
+
+	List<RankingVo> findApiShopAchieveRanking(SysOrder sysOrder);
+
 }
\ No newline at end of file
diff --git a/zq-erp/src/main/java/com/matrix/system/hive/service/SysProjServicesService.java b/zq-erp/src/main/java/com/matrix/system/hive/service/SysProjServicesService.java
index 95ec6b1..5c48a1a 100644
--- a/zq-erp/src/main/java/com/matrix/system/hive/service/SysProjServicesService.java
+++ b/zq-erp/src/main/java/com/matrix/system/hive/service/SysProjServicesService.java
@@ -2,6 +2,8 @@
 
 import com.matrix.core.pojo.PaginationVO;
 import com.matrix.core.pojo.VerifyResult;
+import com.matrix.system.app.dto.ServiceOrderListDto;
+import com.matrix.system.app.vo.ServiceOrderListVo;
 import com.matrix.system.hive.bean.SysProjServices;
 import com.matrix.system.hive.plugin.util.BaseServices;
 
@@ -97,4 +99,9 @@
     public VerifyResult checkArrears(SysProjServices sysProjServices);
 
     public VerifyResult checkBalance(SysProjServices sysProjServices);
+
+
+    List<ServiceOrderListVo> findApiServiceOrderListInPage(ServiceOrderListDto serviceOrderListDto, PaginationVO pageVo);
+
+    int findApiServiceOrderListTotal(ServiceOrderListDto serviceOrderListDto);
 }
\ No newline at end of file
diff --git a/zq-erp/src/main/java/com/matrix/system/hive/service/SysProjUseService.java b/zq-erp/src/main/java/com/matrix/system/hive/service/SysProjUseService.java
index 82f5810..df034a0 100644
--- a/zq-erp/src/main/java/com/matrix/system/hive/service/SysProjUseService.java
+++ b/zq-erp/src/main/java/com/matrix/system/hive/service/SysProjUseService.java
@@ -94,12 +94,7 @@
 	public int invalidTc(SysProjUse sysProjUse);
 	
 
-	/**
-	 * 退款
-	 * @param sysProjUse
-	 * @return
-	 */
-	public int returnMoneyTc(SysProjUse sysProjUse, MoneyCardUse cardUse, Long moneyCardUseId);
+
 	/**
 	 * 设置为有效套餐
 	 * @param proj
@@ -134,28 +129,16 @@
 	
 
 	/**
-	 * 退款
-	 * @param sysProjUse
-	 * @return
-	 */
-	public int returnMoneyProj(SysProjUse sysProjUse, MoneyCardUse cardUse, Long moneyCardUseId);
-	/**
 	 * 设置为有效套餐
 	 * @param proj
 	 * @return
 	 */
 	public AjaxResult activeProj(SysProjUse proj);
-	/**
-	 * 退款项目
-	 * @param sysProjUse
-	 * @return
-	 */
-	public double getTotalMoneyProj(SysProjUse sysProjUse);
 
 
 
 	public int updateProjUseTck(SysProjUse projUse);
 
 
-	public List<SysProjUse> selectTaocanProjUse(Long id);
+	public List<SysProjUse> selectTaocanProjUse(Long id, String status);
 }
\ No newline at end of file
diff --git a/zq-erp/src/main/java/com/matrix/system/hive/service/SysVipInfoService.java b/zq-erp/src/main/java/com/matrix/system/hive/service/SysVipInfoService.java
index e6d1211..0d5f436 100644
--- a/zq-erp/src/main/java/com/matrix/system/hive/service/SysVipInfoService.java
+++ b/zq-erp/src/main/java/com/matrix/system/hive/service/SysVipInfoService.java
@@ -1,6 +1,12 @@
 package com.matrix.system.hive.service;
 
 import com.matrix.core.pojo.PaginationVO;
+import com.matrix.system.app.dto.AddVipDto;
+import com.matrix.system.app.dto.ModifyVipDto;
+import com.matrix.system.app.dto.VipInfoListDto;
+import com.matrix.system.app.vo.VipInfoDetailVo;
+import com.matrix.system.app.vo.VipInfoListVo;
+import com.matrix.system.hive.bean.MoneyCardUse;
 import com.matrix.system.hive.bean.SysVipInfo;
 import com.matrix.system.hive.plugin.util.BaseServices;
 import com.matrix.system.hive.pojo.VipInfoVo;
@@ -15,7 +21,7 @@
  */
 public interface SysVipInfoService  extends BaseServices<SysVipInfo>{
 
-	public  int addVipDefaultCard(Long vipId);
+	public MoneyCardUse addVipDefaultCard(Long vipId);
 	/**
 	 * 新增SysVipInfo
 	 * 
@@ -180,4 +186,14 @@
 		public List<SysVipInfo> findAll(SysVipInfo sysVipInfo);
 
 		public int importVipInfo(File file) throws IOException;
+
+		List<VipInfoListVo> findVipAddressBook(VipInfoListDto vipInfoListDto);
+
+		com.matrix.system.app.vo.VipInfoVo findApiVipInfoById(Long id);
+
+		int apiAddVip(AddVipDto addVipDto);
+
+		int apiModifyVip(ModifyVipDto modifyVipDto);
+
+		VipInfoDetailVo findVipInfoDetail(Long id);
 }
\ No newline at end of file
diff --git a/zq-erp/src/main/java/com/matrix/system/hive/service/imp/AchieveNewServiceImpl.java b/zq-erp/src/main/java/com/matrix/system/hive/service/imp/AchieveNewServiceImpl.java
index df7c66e..c91af9b 100644
--- a/zq-erp/src/main/java/com/matrix/system/hive/service/imp/AchieveNewServiceImpl.java
+++ b/zq-erp/src/main/java/com/matrix/system/hive/service/imp/AchieveNewServiceImpl.java
@@ -1,9 +1,14 @@
 package com.matrix.system.hive.service.imp;
 
+import com.matrix.core.constance.MatrixConstance;
 import com.matrix.core.exception.GlobleException;
 import com.matrix.core.pojo.PaginationVO;
+import com.matrix.core.tools.DateUtil;
 import com.matrix.core.tools.ModelUtils;
 import com.matrix.core.tools.StringUtils;
+import com.matrix.core.tools.WebUtil;
+import com.matrix.system.app.vo.UserAchieveVo;
+import com.matrix.system.common.bean.SysUsers;
 import com.matrix.system.common.dao.SysUsersDao;
 import com.matrix.system.constance.Dictionary;
 import com.matrix.system.hive.bean.*;
@@ -16,10 +21,7 @@
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.stereotype.Service;
 
-import java.util.ArrayList;
-import java.util.Date;
-import java.util.List;
-import java.util.Map;
+import java.util.*;
 
 /**
  * This field was generated by Zking.software.Codegen.
@@ -152,7 +154,7 @@
 
 
     @Override
-    public void addAchieveByServiceOrder(SysProjServices projServices) {
+    public void     addAchieveByServiceOrder(SysProjServices projServices) {
         List<AchieveNew> achieveNewList = new ArrayList<>();
         List<SysBeauticianState> beauticianStateList = sysBeauticianStateDao.selectBySerIds(projServices.getId());
         int size = beauticianStateList.size();
@@ -170,20 +172,17 @@
             achieveNew.setVipId(projServices.getVipId());
             // 是否为赠送业绩
             if (Dictionary.TAOCAN_SOURCE_ZS.equals(projUse.getSource())) {
-                achieveNew.setFreeConsume(projUse.getPrice());
+                achieveNew.setFreeConsume(projUse.getPrice()*beauticianState.getCount());
             } else {
-                achieveNew.setHisConsume(projUse.getPrice());
+                achieveNew.setHisConsume(projUse.getPrice()*beauticianState.getCount());
             }
             achieveNew.setT2(projUse.getSource());
-            if (projServices.getCreateTime() != null) {
-                achieveNew.setDatatime(projServices.getCreateTime());
-            } else {
-                achieveNew.setDatatime(new Date());
-            }
+            achieveNew.setDatatime(new Date());
             achieveNew.setOrderType(Dictionary.ORDER_TYPE_SERVICE);
             achieveNew.setServiceOrderId(projServices.getId());
             achieveNew.setOrderItemId(beauticianState.getId());
             achieveNew.setShopId(projServices.getShopId());
+            achieveNew.setCompanyId(projServices.getCompanyId());
             achieveNew.setShoppingGoodsId(projUse.getProjId());
             achieveNew.setNumberOfPeople(1D / size);
             achieveNew.setProjNum(1);
@@ -223,14 +222,6 @@
                             achieveNewList.add(achieveNew);
                         }
                     }
-                } else {
-                    // 如果该订单明细没有设置美疗师则单独设置顾问业绩
-                    AchieveNew achieveNew = new AchieveNew();
-                    // 顾问业绩等于收款金额
-                    achieveNew.setT1(orderItem.getPayMoney() + "");
-                    buildAchieve(pageOrder, orderItem, achieveNew);
-                    // 新增顾问业绩
-                    achieveNewList.add(achieveNew);
                 }
             }
         }
@@ -243,13 +234,17 @@
     ShoppingGoodsDao shoppingGoodsDao;
 
     private void buildAchieve(SysOrder pageOrder, SysOrderItem orderItem, AchieveNew achieveNew) {
+        if (Dictionary.ORDER_STATU_TK.equals(pageOrder.getStatu())) {
+            achieveNew.setId(null);
+            achieveNew.setProjPercentage(0 - achieveNew.getProjPercentage());
+            achieveNew.setT1((0 - Double.parseDouble(achieveNew.getT1())) + "");
+        }
+
         achieveNew.setVipId(pageOrder.getVipId());
         achieveNew.setSaleId(pageOrder.getStaffId());
 
-        if (pageOrder.getOrderTime() != null) {
-            achieveNew.setDatatime(pageOrder.getOrderTime());
-        } else if (pageOrder.getOrderTime() != null) {
-            achieveNew.setDatatime(pageOrder.getOrderTime());
+        if (pageOrder.getPayTime() != null) {
+            achieveNew.setDatatime(pageOrder.getPayTime());
         } else {
             achieveNew.setDatatime(new Date());
         }
@@ -257,29 +252,15 @@
         achieveNew.setOrderId(pageOrder.getId());
         achieveNew.setOrderItemId(orderItem.getId());
         achieveNew.setShopId(pageOrder.getShopId());
+        achieveNew.setCompanyId(pageOrder.getCompanyId());
         achieveNew.setShoppingGoodsId(orderItem.getGoodsId());
         // 是否赠送
         achieveNew.setT2(orderItem.getIsFree());
         // 根据商品类型设置业绩类型
 
-        String goodType = shoppingGoodsDao.selectById(orderItem.getGoodsId()).getGoodType();
-        if (orderItem.getPayMethod().equals(Dictionary.PAY_TYPE_MOENY)
-                && Dictionary.SHOPPING_GOODS_TYPE_XM.equals(goodType)) {
-            // 现金支付设置现金单次
-            achieveNew.setProjCash(Double.parseDouble(achieveNew.getT1()));
-
-        } else if (orderItem.getPayMethod().equals(Dictionary.PAY_TYPE_MOENY)
-                && Dictionary.SHOPPING_GOODS_TYPE_JJCP.equals(goodType)) {
-            // 设置现金产品
-            achieveNew.setGoodsCash(Double.parseDouble(achieveNew.getT1()));
-        } else if (orderItem.getPayMethod().equals(Dictionary.PAY_TYPE_MOENY)
-                && (Dictionary.SHOPPING_GOODS_TYPE_TC.equals(goodType)
-                || Dictionary.SHOPPING_GOODS_TYPE_CZK.equals(goodType)
-                || Dictionary.SHOPPING_GOODS_TYPE_ZHK.equals(goodType)
-                || Dictionary.SHOPPING_GOODS_TYPE_TCK.equals(goodType))) {
-            // 设置卡项
+        if (Dictionary.ACHIEVE_TYPE_CASH.equals(achieveNew.getT3())){
             achieveNew.setCardCash(Double.parseDouble(achieveNew.getT1()));
-        } else if (!orderItem.getPayMethod().equals(Dictionary.PAY_TYPE_CARD)) {
+        } else {
             // 设置划扣金额
             achieveNew.setConsume(Double.parseDouble(achieveNew.getT1()));
         }
@@ -317,4 +298,45 @@
     public int findVipConsumeStatisticsTotal(AchieveNew achieveNew) {
         return achieveNewDao.selectVipConsumeStatisticsTotal(achieveNew);
     }
+
+    @Override
+    public UserAchieveVo findUserAchieveByTime(int type) {
+        SysUsers users = WebUtil.getSessionAttribute(MatrixConstance.LOGIN_KEY);
+        Calendar calendar = Calendar.getInstance();
+        Date startTime = calendar.getTime();
+        Date endTime = calendar.getTime();
+        switch (type) {
+            // 本日
+            case 1 :
+                break;
+                // 昨日
+            case 2:
+                startTime = DateUtil.previousNDate(startTime, 1);
+                endTime = startTime;
+                break;
+                // 本月
+            case 3:
+                calendar.set(Calendar.DAY_OF_MONTH, 1);
+                startTime = calendar.getTime();
+                break;
+                // 上月
+            case 4:
+                calendar.add(Calendar.MONTH, -1);
+                calendar.set(Calendar.DAY_OF_MONTH, 1);
+                startTime = calendar.getTime();
+                calendar.set(Calendar.DAY_OF_MONTH, calendar.getActualMaximum(Calendar.DAY_OF_MONTH));
+                endTime = calendar.getTime();
+                break;
+            default:
+                break;
+
+        }
+
+        return achieveNewDao.selectUserAchieveByTime(startTime, endTime, users.getSuId());
+    }
+
+    @Override
+    public List<AchieveNew> findOrderItemAchieve(Long orderId) {
+        return achieveNewDao.selectOrderItemAchieveByOrderId(orderId);
+    }
 }
\ No newline at end of file
diff --git a/zq-erp/src/main/java/com/matrix/system/hive/service/imp/ArticleServiceImpl.java b/zq-erp/src/main/java/com/matrix/system/hive/service/imp/ArticleServiceImpl.java
index 2749a58..f42702b 100644
--- a/zq-erp/src/main/java/com/matrix/system/hive/service/imp/ArticleServiceImpl.java
+++ b/zq-erp/src/main/java/com/matrix/system/hive/service/imp/ArticleServiceImpl.java
@@ -117,7 +117,8 @@
 	
 	}
 
-   	
-	
-	
+	@Override
+	public List<Article> findApiArticleListInPage(Article article, PaginationVO pageVo) {
+		return articleDao.selectApiArticleListInPage(article, pageVo);
+	}
 }
\ No newline at end of file
diff --git a/zq-erp/src/main/java/com/matrix/system/hive/service/imp/CodeServiceImpl.java b/zq-erp/src/main/java/com/matrix/system/hive/service/imp/CodeServiceImpl.java
index fa3cb22..8d7277f 100644
--- a/zq-erp/src/main/java/com/matrix/system/hive/service/imp/CodeServiceImpl.java
+++ b/zq-erp/src/main/java/com/matrix/system/hive/service/imp/CodeServiceImpl.java
@@ -94,5 +94,9 @@
 		Date date=new Date();
 		return fmt.format(date);
 	}
-	
+
+	@Override
+	public String getFlowCode() {
+		return "F" + getNowTimeString();
+	}
 }
\ No newline at end of file
diff --git a/zq-erp/src/main/java/com/matrix/system/hive/service/imp/DataAnalysisCustomerServiceImpl.java b/zq-erp/src/main/java/com/matrix/system/hive/service/imp/DataAnalysisCustomerServiceImpl.java
new file mode 100644
index 0000000..1b11435
--- /dev/null
+++ b/zq-erp/src/main/java/com/matrix/system/hive/service/imp/DataAnalysisCustomerServiceImpl.java
@@ -0,0 +1,192 @@
+package com.matrix.system.hive.service.imp;
+
+import com.matrix.core.constance.MatrixConstance;
+import com.matrix.core.pojo.AjaxResult;
+import com.matrix.core.tools.WebUtil;
+import com.matrix.system.app.dto.VipStatisticsParamDto;
+import com.matrix.system.common.bean.SysCompany;
+import com.matrix.system.common.bean.SysUsers;
+import com.matrix.system.common.dao.SysCompanyDao;
+import com.matrix.system.common.dao.SysUsersDao;
+import com.matrix.system.common.tools.DataAuthUtil;
+import com.matrix.system.hive.bean.SysShopInfo;
+import com.matrix.system.hive.dao.SysShopInfoDao;
+import com.matrix.system.hiveErp.analysUtil.*;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Service;
+
+import java.util.*;
+
+/**
+ * @author wzy
+ * @date 2020-12-30
+ **/
+@Service
+public class DataAnalysisCustomerServiceImpl {
+
+    @Autowired
+    private SysShopInfoDao shopInfoDao;
+
+    @Autowired
+    private SysCompanyDao sysCompanyDao;
+
+    @Autowired
+    private SysUsersDao sysUsersDao;
+
+    /**
+     * 按店铺查询数据通用格式执行方法,支持时、日、月、年维度
+     * 如:              A店铺    B店铺
+     * 2020-01-01     12     13
+     * 2020-02-02     10     11
+     *
+     * @param statisticsParam 时间条件
+     * @param caculate        循环调用caculate计算该店的数据
+     *                        查询的数据需满足  只有一个门店只有一行 列名称为 t0,t1,t2
+     * @return
+     */
+    public AjaxResult getAnalysisResult(StatisticsParamVo statisticsParam, Caculate caculate) {
+        AjaxResult result = new AjaxResult();
+
+        //根据计算横坐标
+        List<Date> xAxis = StatisticsTimeUtil.getTimeSpace(statisticsParam.getBeginTime(), statisticsParam.getEndTime(), statisticsParam.getStatisticsUnit());
+
+        //获取所有门店
+        SysUsers user = WebUtil.getSessionAttribute(MatrixConstance.LOGIN_KEY);
+        List<SysShopInfo> shops = null;
+        if (statisticsParam.getShopId() != null) {
+            shops = Arrays.asList(shopInfoDao.selectById(user.getShopId()));
+        } else {
+            if (DataAuthUtil.hasAllShopAuth()) {
+                shops = shopInfoDao.selectShopInfo(user.getCompanyId());
+            } else {
+                shops = Arrays.asList(shopInfoDao.selectById(user.getShopId()));
+            }
+        }
+        //定义数据项内容
+        List<SeriesVo> series = new ArrayList<>();
+
+        //定义数据主体
+        String[] legendData = new String[shops.size()];
+
+        int i = 0;
+
+        //按门店统计数据
+        List<StatisticsTimeDaoParam> timeSpaceParam = StatisticsTimeUtil.buidParam(xAxis);
+        for (SysShopInfo shop : shops) {
+
+            legendData[i++] = shop.getShopName();
+            //数据项内容
+            SeriesVo storeInfoSeries = new SeriesVo();
+            storeInfoSeries.setName(shop.getShopName());
+            //调用计算器获取数据库统计的结果
+            Map<String, Integer> yAxisMap = caculate.exec(timeSpaceParam, shop.getId(), null);
+            //把统计结果转成数组格式
+            storeInfoSeries.setData(StatisticsTimeUtil.getSeries(yAxisMap));
+            series.add(storeInfoSeries);
+
+        }
+        //构造返回对象
+        Map<Object, Object> data = new HashMap<>();
+        data.put("legendData", legendData);
+        data.put("series", series);
+        String[] xData = StatisticsTimeUtil.getFormartDateList(xAxis, statisticsParam);
+        data.put("xAxis", Arrays.copyOf(xData, xData.length - 1));
+        result.setMapInfo(data);
+        result.setStatus(AjaxResult.STATUS_SUCCESS);
+        return result;
+    }
+
+    public AjaxResult getCompanyAnalysisResult(StatisticsParamVo statisticsParam, Caculate caculate) {
+        AjaxResult result = new AjaxResult();
+
+        //根据计算横坐标
+        List<Date> xAxis = StatisticsTimeUtil.getTimeSpace(statisticsParam.getBeginTime(), statisticsParam.getEndTime(), statisticsParam.getStatisticsUnit());
+
+        //获取所有门店
+        SysUsers user = WebUtil.getSessionAttribute(MatrixConstance.LOGIN_KEY);
+
+        SysCompany company = sysCompanyDao.selectById(user.getCompanyId());
+
+        //定义数据项内容
+        List<SeriesVo> series = new ArrayList<>();
+
+        //定义数据主体
+        String[] legendData = new String[1];
+
+        int i = 0;
+
+        //按门店统计数据
+        List<StatisticsTimeDaoParam> timeSpaceParam = StatisticsTimeUtil.buidParam(xAxis);
+
+        legendData[0] = company.getComName();
+        //数据项内容
+        SeriesVo storeInfoSeries = new SeriesVo();
+        storeInfoSeries.setName(company.getComName());
+        //调用计算器获取数据库统计的结果
+        Map<String, Integer> yAxisMap = caculate.exec(timeSpaceParam, null, company.getComId());
+        //把统计结果转成数组格式
+        storeInfoSeries.setData(StatisticsTimeUtil.getSeries(yAxisMap));
+        series.add(storeInfoSeries);
+
+        //构造返回对象
+        Map<Object, Object> data = new HashMap<>();
+        data.put("legendData", legendData);
+        data.put("series", series);
+        String[] xData = StatisticsTimeUtil.getFormartDateList(xAxis, statisticsParam);
+        data.put("xAxis", Arrays.copyOf(xData, xData.length - 1));
+        result.setMapInfo(data);
+        result.setStatus(AjaxResult.STATUS_SUCCESS);
+        return result;
+    }
+
+    public AjaxResult getStaffAnalysisResult(VipStatisticsParamDto statisticsParam, Caculate caculate) {
+        AjaxResult result = new AjaxResult();
+
+        //根据计算横坐标
+        List<Date> xAxis = StatisticsTimeUtil.getTimeSpace(statisticsParam.getBeginTime(), statisticsParam.getEndTime(), statisticsParam.getStatisticsUnit());
+
+        //获取所有门店
+        SysUsers user = WebUtil.getSessionAttribute(MatrixConstance.LOGIN_KEY);
+
+        Long staffId = null;
+        if (statisticsParam.getStaffId() == null) {
+            staffId = user.getSuId();
+        } else {
+            staffId = statisticsParam.getStaffId();
+        }
+        SysUsers sysUsers = sysUsersDao.selectById(staffId);
+
+        //定义数据项内容
+        List<SeriesVo> series = new ArrayList<>();
+
+        //定义数据主体
+        String[] legendData = new String[1];
+
+        int i = 0;
+
+        //按门店统计数据
+        List<StatisticsTimeDaoParam> timeSpaceParam = StatisticsTimeUtil.buidParam(xAxis);
+
+        legendData[0] = sysUsers.getSuName();
+        //数据项内容
+        SeriesVo storeInfoSeries = new SeriesVo();
+        storeInfoSeries.setName(sysUsers.getSuName());
+        //调用计算器获取数据库统计的结果
+        Map<String, Integer> yAxisMap = caculate.exec(timeSpaceParam, null, sysUsers.getSuId());
+        //把统计结果转成数组格式
+        storeInfoSeries.setData(StatisticsTimeUtil.getSeries(yAxisMap));
+        series.add(storeInfoSeries);
+
+        //构造返回对象
+        Map<Object, Object> data = new HashMap<>();
+        data.put("legendData", legendData);
+        data.put("series", series);
+        StatisticsParamVo statisticsParam1 = new StatisticsParamVo();
+        statisticsParam1.setStatisticsUnit(statisticsParam.getStatisticsUnit());
+        String[] xData = StatisticsTimeUtil.getFormartDateList(xAxis, statisticsParam1);
+        data.put("xAxis", Arrays.copyOf(xData, xData.length - 1));
+        result.setMapInfo(data);
+        result.setStatus(AjaxResult.STATUS_SUCCESS);
+        return result;
+    }
+}
diff --git a/zq-erp/src/main/java/com/matrix/system/hive/service/imp/MoneyCardUseServiceImpl.java b/zq-erp/src/main/java/com/matrix/system/hive/service/imp/MoneyCardUseServiceImpl.java
index 4b91861..414e544 100644
--- a/zq-erp/src/main/java/com/matrix/system/hive/service/imp/MoneyCardUseServiceImpl.java
+++ b/zq-erp/src/main/java/com/matrix/system/hive/service/imp/MoneyCardUseServiceImpl.java
@@ -42,6 +42,10 @@
     @Autowired
     private SysVipLevelDao viplevelDao;
 
+
+
+
+
     @Override
     public int add(MoneyCardUse moneyCardUse) {
 
@@ -213,64 +217,7 @@
         }
     }
 
-    //退款
-    @Override
-    public int returnMoney(MoneyCardUse moneyCardUse, Long hjkId) {
 
-
-        MoneyCardUse realObj = moneyCardUseDao.selectById(moneyCardUse.getId());
-
-        //检测商品是否已付款完成
-        if (realObj.getOrderItemId() != 1) {//不是数据迁移过来的判断付款状态
-            checkOrderStatu(realObj.getOrderItemId());
-        }
-
-        if (!realObj.getStatus().equals(Dictionary.TAOCAN_STATUS_YX)) {
-            throw new GlobleException("不是有效充值卡");
-        }
-
-        if (realObj.getSource().contains(Dictionary.TAOCAN_SOURCE_ZR)) {
-            throw new GlobleException("转让的充值卡不能退款");
-        }
-        if (realObj.getSource().contains(Dictionary.TAOCAN_SOURCE_ZS)) {
-            throw new GlobleException("赠送的充值卡不能退款");
-        }
-
-        if (Dictionary.FLAG_YES_Y.equals(realObj.getIsVipCar())) {
-            //更新会员等级
-            realObj.getVipInfo().setLevelId(0L);
-            infoDao.update(realObj.getVipInfo());
-        }
-        StringBuilder content = new StringBuilder();
-
-        //有会籍卡退到会籍卡中,无则退了现金
-        if (hjkId != null && !hjkId.equals("")) {
-            MoneyCardUse vipCard = moneyCardUseDao.selectById(hjkId);
-            vipCard.setRealMoney(vipCard.getRealMoney() + realObj.getRealMoney());
-            moneyCardUseDao.update(vipCard);
-            content.append(realObj.getCardName() + "退款¥" + realObj.getRealMoney() + "到会籍卡")
-                    .append(vipCard.getCardName())
-                    .append(",余次:" + vipCard.getLastCountName())
-                    .append(",本金余额:" + vipCard.getRealMoney())
-                    .append(",有效期:" + DateUtil.dateToString(vipCard.getFailTime(), DateUtil.DATE_FORMAT_MM))
-                    .append(",是否赠送:" + vipCard.getSourceName());
-        } else {
-            content.append(realObj.getCardName() + "退款现金¥" + moneyCardUse.getReturnMonery() + "");
-        }
-        DecimalFormat df = new DecimalFormat("#.00");
-        double d = Double.valueOf(df.format(realObj.getRealMoney() - Double.valueOf(moneyCardUse.getReturnMonery())));
-        //退款的本金为零,状态为已退款
-        realObj.setRealMoney(d);
-        //赠送金额也清零
-        realObj.setGiftMoney(0.0);
-        if (d <= 0) {
-            realObj.setStatus(Dictionary.TAOCAN_STATUS_TK);
-        }
-        int i = moneyCardUseDao.update(realObj);
-        SysUsers user = (SysUsers) WebUtil.getSession().getAttribute(MatrixConstance.LOGIN_KEY);
-        //新增退款流水
-        return i;
-    }
 
     //设置为有效
     @Override
diff --git a/zq-erp/src/main/java/com/matrix/system/hive/service/imp/ShoppingGoodsCategoryServiceImpl.java b/zq-erp/src/main/java/com/matrix/system/hive/service/imp/ShoppingGoodsCategoryServiceImpl.java
index f9157ea..330eb1c 100644
--- a/zq-erp/src/main/java/com/matrix/system/hive/service/imp/ShoppingGoodsCategoryServiceImpl.java
+++ b/zq-erp/src/main/java/com/matrix/system/hive/service/imp/ShoppingGoodsCategoryServiceImpl.java
@@ -90,6 +90,9 @@
 			}
 	    }
 	}
-	
-	
+
+	@Override
+	public List<ShoppingGoodsCategory> findChildNodesByName(ShoppingGoodsCategory shoppingGoodsCategory) {
+		return shoppingGoodsCategoryDao.selectChildNodesByName(shoppingGoodsCategory);
+	}
 }
\ No newline at end of file
diff --git a/zq-erp/src/main/java/com/matrix/system/hive/service/imp/ShoppingGoodsServiceImpl.java b/zq-erp/src/main/java/com/matrix/system/hive/service/imp/ShoppingGoodsServiceImpl.java
index b10377b..299361c 100644
--- a/zq-erp/src/main/java/com/matrix/system/hive/service/imp/ShoppingGoodsServiceImpl.java
+++ b/zq-erp/src/main/java/com/matrix/system/hive/service/imp/ShoppingGoodsServiceImpl.java
@@ -6,15 +6,15 @@
 import com.matrix.core.tools.DateUtil;
 import com.matrix.core.tools.StringUtils;
 import com.matrix.core.tools.WebUtil;
+import com.matrix.system.app.dto.ShoppingGoodsListDto;
+import com.matrix.system.app.vo.ShoppingGoodsDetailVo;
+import com.matrix.system.app.vo.ShoppingGoodsListVo;
 import com.matrix.system.common.bean.SysUsers;
 import com.matrix.system.common.dao.UtilDao;
 import com.matrix.system.common.tools.ServiceUtil;
 import com.matrix.system.constance.Dictionary;
 import com.matrix.system.constance.TableMapping;
-import com.matrix.system.hive.bean.MoneyCardAssemble;
-import com.matrix.system.hive.bean.ShoppingGoods;
-import com.matrix.system.hive.bean.ShoppingGoodsAssemble;
-import com.matrix.system.hive.bean.SysShopInfo;
+import com.matrix.system.hive.bean.*;
 import com.matrix.system.hive.dao.MoneyCardAssembleDao;
 import com.matrix.system.hive.dao.ShoppingGoodsAssembleDao;
 import com.matrix.system.hive.dao.ShoppingGoodsDao;
@@ -28,6 +28,7 @@
 
 import javax.validation.constraints.NotNull;
 import java.awt.event.WindowStateListener;
+import java.math.BigDecimal;
 import java.time.LocalDate;
 import java.util.ArrayList;
 import java.util.Date;
@@ -471,4 +472,67 @@
         }
         return target;
     }
+
+
+    @Override
+    public List<ShoppingGoodsListVo> findShoppingGoodsListForApi(ShoppingGoodsListDto shoppingGoodsListDto) {
+        SysUsers user = WebUtil.getSessionAttribute(MatrixConstance.LOGIN_KEY);
+        shoppingGoodsListDto.setShopId(user.getShopId());
+        PaginationVO pageVo = new PaginationVO();
+        int offset = (shoppingGoodsListDto.getPageNum() - 1) * shoppingGoodsListDto.getPageSize();
+        int limit = shoppingGoodsListDto.getPageSize();
+        pageVo.setOffset(offset);
+        pageVo.setLimit(limit);
+        return shoppingGoodsDao.selectShoppingGoodsApiInPage(shoppingGoodsListDto, pageVo);
+    }
+
+    @Override
+    public int findShoppingGoodsListTotalForApi(ShoppingGoodsListDto shoppingGoodsListDto) {
+        SysUsers user = WebUtil.getSessionAttribute(MatrixConstance.LOGIN_KEY);
+        shoppingGoodsListDto.setShopId(user.getShopId());
+
+        return shoppingGoodsDao.selectShopppingGoodsAipTotal(shoppingGoodsListDto);
+    }
+
+    @Override
+    public ShoppingGoodsDetailVo findApiShoppingGoodsDetailById(Long id) {
+        ShoppingGoods shoppingGoods = shoppingGoodsDao.selectById(id);
+        ShoppingGoodsDetailVo goodsDetailVo = goodsToGoodsDetailVo(shoppingGoods);
+
+        if (ShoppingGoods.SHOPPING_GOODS_TYPE_TC.equals(shoppingGoods.getGoodType())) {
+            List<ShoppingGoodsDetailVo> products = shoppingGoodsAssembleDao.selectGoodsRelationGoodsList(shoppingGoods.getId(), ShoppingGoods.SHOPPING_GOODS_TYPE_JJCP);
+            List<ShoppingGoodsDetailVo> proj = shoppingGoodsAssembleDao.selectGoodsRelationGoodsList(shoppingGoods.getId(), ShoppingGoods.SHOPPING_GOODS_TYPE_XM);
+
+            goodsDetailVo.setAssembleTaocanProduct(products);
+            goodsDetailVo.setAssembleTaocanProj(proj);
+        } else if (ShoppingGoods.SHOPPING_GOODS_TYPE_XM.equals(shoppingGoods.getGoodType())) {
+            List<ShoppingGoodsDetailVo> products = shoppingGoodsAssembleDao.selectGoodsRelationGoodsList(shoppingGoods.getId(), null);
+            goodsDetailVo.setAssembleProj(products);
+        } else if (ShoppingGoods.SHOPPING_GOODS_TYPE_CZK.equals(shoppingGoods.getGoodType())) {
+            List<ShoppingGoodsDetailVo> cardGoods = moneyCardAssembleDao.selectCardRelationGoods(shoppingGoods.getId());
+            List<ShoppingGoodsCategory> cardCategory = moneyCardAssembleDao.selectCardRelationCategory(shoppingGoods.getId());
+
+            goodsDetailVo.setAssembleProj(cardGoods);
+            goodsDetailVo.setCardCategory(cardCategory);
+        }
+        return goodsDetailVo;
+    }
+
+    private ShoppingGoodsDetailVo goodsToGoodsDetailVo(ShoppingGoods shoppingGoods) {
+        ShoppingGoodsDetailVo goodsDetailVo = new ShoppingGoodsDetailVo();
+        goodsDetailVo.setImg(shoppingGoods.getImg());
+        goodsDetailVo.setGoodsName(shoppingGoods.getName());
+        goodsDetailVo.setGoodsNo(shoppingGoods.getCode());
+        goodsDetailVo.setGoodsType(shoppingGoods.getGoodType());
+        goodsDetailVo.setDesc(shoppingGoods.getDescription());
+        goodsDetailVo.setMaxSaleCnt(shoppingGoods.getCarMaxSaleCount());
+        goodsDetailVo.setLimitBuyCnt("否".equals(shoppingGoods.getIsOnce()) ? null : shoppingGoods.getIsOnce());
+        goodsDetailVo.setMaxUseCnt(shoppingGoods.getCarUseCount());
+        goodsDetailVo.setMeasure(shoppingGoods.getMeasure());
+        goodsDetailVo.setVolume(shoppingGoods.getVolume());
+        goodsDetailVo.setSalePrice(BigDecimal.valueOf(shoppingGoods.getSealPice()));
+        goodsDetailVo.setSaleCnt(shoppingGoods.getRealSealCount());
+        goodsDetailVo.setGiftPrice(BigDecimal.valueOf(shoppingGoods.getReferencePice() == null ? 0 : shoppingGoods.getReferencePice()));
+        return goodsDetailVo;
+    }
 }
diff --git a/zq-erp/src/main/java/com/matrix/system/hive/service/imp/SysBeauticianStateServiceImpl.java b/zq-erp/src/main/java/com/matrix/system/hive/service/imp/SysBeauticianStateServiceImpl.java
index 668802f..843dd94 100644
--- a/zq-erp/src/main/java/com/matrix/system/hive/service/imp/SysBeauticianStateServiceImpl.java
+++ b/zq-erp/src/main/java/com/matrix/system/hive/service/imp/SysBeauticianStateServiceImpl.java
@@ -93,7 +93,9 @@
 	
 		return sysBeauticianStateDao.selectByTimeAndStaff(id,beginTime,endTime);
 	}
-	
-   	
-	
+
+	@Override
+	public List<SysBeauticianState> findBySerId(Long serviceId) {
+		return sysBeauticianStateDao.selectBySerIds(serviceId);
+	}
 }
\ No newline at end of file
diff --git a/zq-erp/src/main/java/com/matrix/system/hive/service/imp/SysOrderFlowServiceImpl.java b/zq-erp/src/main/java/com/matrix/system/hive/service/imp/SysOrderFlowServiceImpl.java
new file mode 100644
index 0000000..c4553ce
--- /dev/null
+++ b/zq-erp/src/main/java/com/matrix/system/hive/service/imp/SysOrderFlowServiceImpl.java
@@ -0,0 +1,71 @@
+package com.matrix.system.hive.service.imp;
+
+import com.matrix.core.pojo.PaginationVO;
+import com.matrix.system.hive.bean.SysOrderFlow;
+import com.matrix.system.hive.dao.SysOrderFlowDao;
+import com.matrix.system.hive.service.SysOrderFlowService;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Service;
+
+import java.util.List;
+
+/**
+ * @author wzy
+ * @date 2021-01-11
+ **/
+@Service
+public class SysOrderFlowServiceImpl implements SysOrderFlowService {
+
+    @Autowired
+    private SysOrderFlowDao sysOrderFlowDao;
+
+    @Override
+    public int add(SysOrderFlow obje) {
+        return 0;
+    }
+
+    @Override
+    public int modify(SysOrderFlow obje) {
+        return 0;
+    }
+
+    @Override
+    public int remove(List<Long> list) {
+        return 0;
+    }
+
+    @Override
+    public int removeById(Long id) {
+        return 0;
+    }
+
+    @Override
+    public List<SysOrderFlow> findInPage(SysOrderFlow obje, PaginationVO pageVo) {
+        return null;
+    }
+
+    @Override
+    public List<SysOrderFlow> findByModel(SysOrderFlow obje) {
+        return null;
+    }
+
+    @Override
+    public int findTotal(SysOrderFlow obje) {
+        return 0;
+    }
+
+    @Override
+    public SysOrderFlow findById(Long id) {
+        return null;
+    }
+
+    @Override
+    public List<SysOrderFlow> findByOrderId(Long orderId) {
+        return sysOrderFlowDao.selectByOrderId(orderId);
+    }
+
+    @Override
+    public List<SysOrderFlow> findPayMethodsAmount(Long orderId) {
+        return sysOrderFlowDao.selectPayMethodsAmountByOrderId(orderId);
+    }
+}
diff --git a/zq-erp/src/main/java/com/matrix/system/hive/service/imp/SysOrderItemServiceImpl.java b/zq-erp/src/main/java/com/matrix/system/hive/service/imp/SysOrderItemServiceImpl.java
index c48c3ea..a61e323 100644
--- a/zq-erp/src/main/java/com/matrix/system/hive/service/imp/SysOrderItemServiceImpl.java
+++ b/zq-erp/src/main/java/com/matrix/system/hive/service/imp/SysOrderItemServiceImpl.java
@@ -88,4 +88,8 @@
 		return sysOrderItemDao.selectDclItemTotal(vipId);
 	}
 
+	@Override
+	public List<SysOrderItem> findByOrderId(Long orderId) {
+		return sysOrderItemDao.selectByOrderId(orderId);
+	}
 }
\ No newline at end of file
diff --git a/zq-erp/src/main/java/com/matrix/system/hive/service/imp/SysOrderServiceImpl.java b/zq-erp/src/main/java/com/matrix/system/hive/service/imp/SysOrderServiceImpl.java
index a1cab35..20c6415 100644
--- a/zq-erp/src/main/java/com/matrix/system/hive/service/imp/SysOrderServiceImpl.java
+++ b/zq-erp/src/main/java/com/matrix/system/hive/service/imp/SysOrderServiceImpl.java
@@ -1,36 +1,43 @@
 package com.matrix.system.hive.service.imp;
 
+import com.matrix.component.rabbitmq.RabiitMqTemplate;
 import com.matrix.core.constance.MatrixConstance;
 import com.matrix.core.exception.GlobleException;
 import com.matrix.core.pojo.PaginationVO;
-import com.matrix.core.tools.LogUtil;
+import com.matrix.core.tools.DateUtil;
 import com.matrix.core.tools.StringUtils;
 import com.matrix.core.tools.WebUtil;
+import com.matrix.system.app.dto.OrderListDto;
+import com.matrix.system.app.mapper.SysProjUseMapper;
+import com.matrix.system.app.vo.OrderDetailAchieveItemVo;
+import com.matrix.system.app.vo.OrderDetailItemVo;
+import com.matrix.system.app.vo.OrderDetailVo;
+import com.matrix.system.app.vo.RankingVo;
 import com.matrix.system.common.bean.SysUsers;
 import com.matrix.system.common.dao.BusParameterSettingsDao;
 import com.matrix.system.common.dao.SysUsersDao;
 import com.matrix.system.constance.Dictionary;
-import com.matrix.system.constance.SystemConstance;
 import com.matrix.system.hive.bean.*;
 import com.matrix.system.hive.dao.*;
-import com.matrix.system.hive.hievEnum.PayMethodEnum;
 import com.matrix.system.hive.plugin.util.CollectionUtils;
-import com.matrix.core.tools.DateUtil;
 import com.matrix.system.hive.plugin.util.MoneyUtil;
 import com.matrix.system.hive.pojo.CzXkVo;
 import com.matrix.system.hive.pojo.ShoppingCarItem;
 import com.matrix.system.hive.pojo.ShoppingCarItemsVo;
-import com.matrix.system.hive.service.AchieveNewService;
-import com.matrix.system.hive.service.CodeService;
-import com.matrix.system.hive.service.ShoppingGoodsService;
-import com.matrix.system.hive.service.SysOrderService;
+import com.matrix.system.hive.service.*;
+import com.matrix.system.shopXcx.mqTask.MQTaskRouting;
+import com.matrix.system.wechart.templateMsg.UniformMsgParam;
 import org.springframework.beans.BeanUtils;
 import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.beans.factory.annotation.Value;
 import org.springframework.stereotype.Service;
 import org.springframework.transaction.annotation.Transactional;
 
 import javax.servlet.http.HttpSession;
-import java.util.*;
+import javax.validation.constraints.NotEmpty;
+import java.util.ArrayList;
+import java.util.Date;
+import java.util.List;
 
 /**
  * @date 2016-07-03 20:53
@@ -80,10 +87,36 @@
     private AchieveNewService achieveNewService;
 
     @Autowired
+    private AchieveNewDao achieveNewDao;
+
+    @Autowired
     private WarehouseDao warehouseDao;
 
     @Autowired
     private ShoppingGoodsService shoppingGoodsService;
+
+    @Autowired
+    private SysOrderFlowDao sysOrderFlowDao;
+
+    @Autowired
+    private SysSupplierInfoDao sysSupplierInfoDao;
+
+    @Autowired
+    private SysInstoreInfoDao sysInstoreInfoDao;
+
+    @Autowired
+    private SysInstoreDetailDao sysInstoreDetailDao;
+
+    @Autowired
+    private SysInstoreInfoService sysInstoreInfoService;
+
+
+    @Value("${evn}")
+    private String evn;
+
+    @Autowired
+    private RabiitMqTemplate rabiitMqTemplate;
+
 
     @Override
     public int add(SysOrder sysOrder) {
@@ -113,7 +146,7 @@
 
     @Override
     public List<SysOrder> findInPage(SysOrder sysOrder, PaginationVO pageVo) {
-        if(pageVo!=null){
+        if (pageVo != null) {
             pageVo.setSort("desc");
             pageVo.setSort("orderTime");
         }
@@ -143,24 +176,31 @@
 
     @Override
     public SysOrder checkAndSaveOrder(SysOrder sysOrder) {
-
         // 收款改变订单状态
-        /**
-         * 判断订单条目的一个付款情况
-         */
-        // 计算现金支付金额
-        double xjMoney = 0.0;
-        // 计算卡支付总额
-        double cardMoney = 0.0;
+        SysOrder source = null;
+        if (sysOrder.getId() != null) {
+            source = sysOrderDao.selectById(sysOrder.getId());
+        }
+
         // 计算订单折扣金额,收款情况下 计算订单总额
         double zkTotal = 0.0;
-        /**
-         * 记录本次消费的卡,防止扣除多次消费记录
-         */
-        ArrayList<Long> userCard = new ArrayList<Long>();
+
+        // 判断是否为退款
+        String orderStatus = Dictionary.ORDER_STATU_DFK;
+        if (Dictionary.ORDER_STATU_TK.equals(sysOrder.getStatu())) {
+            orderStatus = Dictionary.ORDER_STATU_TK;
+        }
 
         // 页面的pageOrder 参数只包含支付金额信息,不带有购买商品
         for (SysOrderItem item : sysOrder.getItems()) {
+            // 若为退款,则先更新原有数量
+            if (orderStatus.equals(Dictionary.ORDER_STATU_TK)) {
+                SysOrderItem sysOrderItem = new SysOrderItem();
+                sysOrderItem.setId(item.getId());
+                sysOrderItem.setCount(item.getPreCount() - item.getCount());
+                orderItemDao.update(sysOrderItem);
+            }
+            item.setId(null);
 
             ShoppingGoods shoppingGoods = shoppingGoodsDao.selectById(item.getGoodsId());
             item.setType(shoppingGoods.getGoodType());
@@ -168,53 +208,25 @@
                 item.setIsFree(Dictionary.FLAG_YES);
             }
 
-
-            // 如果支付方式是非现金则记录现金支付金额
-            if (!item.getPayMethod().equals(PayMethodEnum.VIP_CARD.getCode())) {
-                xjMoney = MoneyUtil.add(xjMoney, item.getPayMoney());
-                item.setCashPay(item.getPayMoney());
-            } else {
-                cardMoney = MoneyUtil.add(cardMoney, item.getPayMoney());
-                item.setCardPay(item.getPayMoney());
-
-            }
-
-
             // 订单欠款减去支付金额 设置实际欠款
             Double itemZkTotal = MoneyUtil.mul(item.getZkPrice(), Double.valueOf(item.getCount()));
-            zkTotal=MoneyUtil.add(zkTotal, itemZkTotal);
-            item.setArrears(MoneyUtil.sub(itemZkTotal, item.getPayMoney()));
-
-
-            // 如果存在欠款,将条目状态设置为欠款
-            if (item.getArrears() > 0) {
-                item.setStatus(Dictionary.ORDER_STATU_QK);
-            } else if (item.getArrears() < 0) {
-                item.setPayMoney(item.getZkPrice());
-                item.setStatus(Dictionary.ORDER_STATU_DFK);
-            } else {
-                item.setStatus(Dictionary.ORDER_STATU_DFK);
-            }
+            zkTotal = MoneyUtil.add(zkTotal, itemZkTotal);
+            item.setStatus(orderStatus);
         }
-        double arrears;
-        SysUsers user = (SysUsers) WebUtil.getSession().getAttribute(MatrixConstance.LOGIN_KEY);
-        // 如果是收款,收款可以改变订单价格,所以需要求和出 订单折后价来计算本次欠款
-        arrears = MoneyUtil.sub(zkTotal, MoneyUtil.add(cardMoney, xjMoney));
-        sysOrder.setZkTotal(zkTotal);
-        sysOrder.setArrears(arrears);
-        sysOrder.setCardPay(cardMoney);
-        sysOrder.setCashPay(xjMoney);
-        sysOrder.setStatu(Dictionary.ORDER_STATU_DFK);
-        sysOrder.setStaffId(user.getSuId());
-        sysOrder.setCompanyId(user.getCompanyId());
 
-        sysOrder.setPayTime(new Date());
-        if(sysOrder.getId()==null){
+        SysUsers user = (SysUsers) WebUtil.getSession().getAttribute(MatrixConstance.LOGIN_KEY);
+        sysOrder.setZkTotal(zkTotal);
+        sysOrder.setStatu(orderStatus);
+        sysOrder.setStaffId(source != null ? source.getStaffId() : user.getSuId());
+        sysOrder.setCompanyId(source != null ? source.getCompanyId() : user.getCompanyId());
+
+
+        if (sysOrder.getId() == null) {
             //新增订单
             sysOrder.setOrderNo(codeService.getOrderCode());
             sysOrderDao.insert(sysOrder);
 
-        }else{
+        } else {
             //更新订单
             sysOrderDao.update(sysOrder);
             //删除原有订单明细
@@ -223,7 +235,16 @@
 
         sysOrder.getItems().forEach(sysOrderItem -> {
             sysOrderItem.setOrderId(sysOrder.getId());
-            orderItemDao.insert(sysOrderItem);
+            if (sysOrder.getStatu().equals(Dictionary.ORDER_STATU_TK)) {
+                // 取负数
+                sysOrderItem.setCount(-sysOrderItem.getCount());
+                orderItemDao.insert(sysOrderItem);
+                // 调整回来
+                sysOrderItem.setCount(-sysOrderItem.getCount());
+            } else {
+                orderItemDao.insert(sysOrderItem);
+            }
+
         });
 
         return sysOrder;
@@ -245,6 +266,12 @@
 
             order.setStatu(Dictionary.ORDER_STATU_YQX);
             order.setArrears(0D);
+
+            //发送微信公众号提醒
+            UniformMsgParam uniformMsgParam = new UniformMsgParam(order.getCompanyId(), UniformMsgParam.GZH_DDQX);
+            uniformMsgParam.put("orderId", order.getId());
+            rabiitMqTemplate.sendMsg(MQTaskRouting.SEND_UNIFORM_TEMPLATE_MSG + evn, uniformMsgParam.toJSONString());
+
             return sysOrderDao.update(order);
 
         } else {
@@ -268,12 +295,12 @@
 
                         // 根据订单明细判断是赠送金额购买还是本金购买
 
-                            moneyCardUseFlow.setTotal(orderItem.getCardPay());
-                            moneyCardUse.setRealMoney(MoneyUtil.add(moneyCardUse.getRealMoney(), orderItem.getCardPay()));
+                        moneyCardUseFlow.setTotal(orderItem.getCardPay());
+                        moneyCardUse.setRealMoney(MoneyUtil.add(moneyCardUse.getRealMoney(), orderItem.getCardPay()));
                         //TODO 目前无法退回到具体的赠送金额还是本金
 
                         if (!moneyCardUse.getIsVipCar().equals(Dictionary.FLAG_YES_Y)) {
-                            if(moneyCardUse.getLastCount()!=null) {
+                            if (moneyCardUse.getLastCount() != null) {
                                 moneyCardUse.setLastCount(moneyCardUse.getLastCount() + 1);
                                 moneyCardUseFlow.setTimes(1);
                             }
@@ -288,7 +315,7 @@
                         moneyCardUseFlow.setCreateTime(new Date());
                         moneyCardUseFlow.setOperationId(user.getSuId());
                         moneyCardUseFlow.setContent(moneyCardUse.getChangeRemark());
-                        moneyCardUseFlow.setBalance(moneyCardUse.getGiftMoney()+moneyCardUse.getRealMoney());
+                        moneyCardUseFlow.setBalance(moneyCardUse.getGiftMoney() + moneyCardUse.getRealMoney());
                         moneyCardUseFlowDao.insert(moneyCardUseFlow);
                     }
                 }
@@ -338,10 +365,17 @@
             AchieveNew achieveNew = new AchieveNew();
             achieveNew.setOrderId(id);
             achieveNewService.removeByModel(achieveNew);
+
+            // 删除收款记录
+            sysOrderFlowDao.deleteByOrderId(id);
+
             // 取消订单
             order.setStatu(Dictionary.ORDER_STATU_YQX);
+
+
             return sysOrderDao.update(order);
         }
+
     }
 
 
@@ -356,7 +390,7 @@
             throw new GlobleException("没用选择购买产品");
         }
         // 获取会员信息,判断等级 获取相应家居折扣
-        SysVipInfo info = (SysVipInfo) WebUtil.getSession().getAttribute(SystemConstance.CURRENT_CUSTOMER);
+        SysVipInfo info = sysVipInfoDao.selectById(car.getVipId());
 
         //获取折扣-----
         Double zk = zk = 1.0;
@@ -376,6 +410,7 @@
         order.setStatu(Dictionary.ORDER_STATU_DFK);
         order.setCardPay(0.00);
         order.setCashPay(0.00);
+        order.setCompanyId(user.getCompanyId());
         order.setBeatuyId(car.getBeatuyId() + "");
         // 根据美疗师id查询美疗师姓名
         if (car.getBeatuyId() != null) {
@@ -425,7 +460,6 @@
         // 设置订单总价与折后价
         order.setTotal(total);
         order.setZkTotal(zkTotal);
-        order.setArrears(zkTotal);
         sysOrderDao.update(order);
         return i;
     }
@@ -453,7 +487,6 @@
     @Transactional(rollbackFor = Exception.class)
     public void updateReceiptMoney(SysOrder pageOrder) throws GlobleException {
 
-
         if (!Dictionary.ORDER_STATU_DFK.equals(pageOrder.getStatu())) {
             throw new GlobleException("该订单已经收过款,请刷新页面再试!");
         }
@@ -466,67 +499,98 @@
             sysVipInfoDao.update(vipInfo);
         }
 
+        //设置订单的成交状态
         changeOrderStatu(pageOrder);
+
         // 设置会员充值卡使用情况
         addMoneyCardUse(pageOrder);
 
-        // 新增出库单
-        addOutStore(pageOrder);
-
         // 改变客户项目套餐使用情况
         addTaocanProj(pageOrder);
+
+        // 新增出库单
+        addOutStore(pageOrder);
 
         // 设置业绩
         achieveNewService.addAchaeveByOrder(pageOrder);
 
         setShopSelCount(pageOrder);
 
-
     }
 
     /**
      * 收款改变订单状态,划扣金额
+     *
      * @author:姜友瑶
      */
     private void changeOrderStatu(SysOrder sourceOrder) {
 
-      boolean haQk=false;
+        String orderStatus = Dictionary.ORDER_STATU_YFK;
+        String flowType = SysOrderFlow.FLOW_TYPE_BUY;
+        double cashPayTotal = 0D;
+        double cardPayTotal = 0D;
 
-        for(SysOrderItem sysOrderItem:sourceOrder.getItems()){
+        //处理支付流水
+        int flowCount = 1;
+        for (SysOrderFlow flow : sourceOrder.getFlows()) {
 
-            if(!sysOrderItem.getStatus().equals(Dictionary.ORDER_STATU_QK)){
-                SysOrderItem updateItem=new SysOrderItem();
-                updateItem.setId(sysOrderItem.getId());
-                updateItem.setStatus(Dictionary.ORDER_STATU_YFK);
+            //支付内容摘要设置
+            Long goodsId = sourceOrder.getItems().get(0).getGoodsId();
+            ShoppingGoods goods = shoppingGoodsDao.selectById(goodsId);
+            flow.setFlowContent(goods.getName() + "等" + sourceOrder.getItems().size() + "件产品");
 
-                if (sysOrderItem.getPayMethod().equals(Dictionary.PAY_TYPE_MOENY_CARD )  ) {
-
-                    if(sysOrderItem.getPayMethodDetail()!=null){
-                        // 查询要支付的充值卡
-                        MoneyCardUse moneyCardUse = moneyCardUseDao.selectById(Long.parseLong(sysOrderItem.getPayMethodDetail()));
-                        // 扣除付款卡金额并添加流水
-                        cardPaySk(moneyCardUse, sourceOrder,  sysOrderItem);
-                    }else{
-                        throw  new GlobleException("请选择支付的会员卡");
-                    }
-
-
-                }
-                orderItemDao.update(updateItem);
-            }else {
-                haQk=true;
+            // 若是退款,则取负数
+            if (Dictionary.ORDER_STATU_TK.equals(sourceOrder.getStatu())) {
+                flowType = SysOrderFlow.FLOW_TYPE_REFUND;
+                flow.setAmount(flow.getAmount().negate());
+                flow.setOrderId(sourceOrder.getOldOrderId());
+            } else {
+                flow.setOrderId(sourceOrder.getId());
             }
-        }
-        //更新收款状态
-        if(haQk){
-            sourceOrder.setStatu(Dictionary.ORDER_STATU_QK);
-        }else{
-            sourceOrder.setStatu(Dictionary.ORDER_STATU_YFK);
+
+            //欠款处理
+            if (SysOrderFlow.PAY_METHOD_ARREARS.equals(flow.getPayMethod())) {
+                orderStatus = Dictionary.ORDER_STATU_QK;
+                sourceOrder.setArrears(flow.getAmount().doubleValue());
+            }
+
+            //统计储值卡支付
+            if (SysOrderFlow.PAY_METHOD_CARD.equals(flow.getPayMethod())) {
+                if (flow.getCardId() != null) {
+                    MoneyCardUse moneyCardUse = moneyCardUseDao.selectById(flow.getCardId());
+                    cardPayTotal += flow.getAmount().doubleValue();
+
+                    //修改储值卡余额
+                    cardPaySk(moneyCardUse, sourceOrder, flow);
+                }else{
+                    throw new GlobleException("无效的储值卡支付方式");
+                }
+            }
+            //统计现金支付
+            if (!SysOrderFlow.PAY_METHOD_ARREARS.equals(flow.getPayMethod())
+                    && !SysOrderFlow.PAY_METHOD_CARD.equals(flow.getPayMethod())) {
+                cashPayTotal += flow.getAmount().doubleValue();
+            }
+
+            flow.setFlowNo(codeService.getFlowCode() + "-" + flowCount);
+            flow.setVipId(sourceOrder.getVipId());
+            flow.setFlowType(flowType);
+            flow.setShopId(sourceOrder.getShopId());
+            flow.setCompanyId(sourceOrder.getCompanyId());
+            sysOrderFlowDao.insert(flow);
+            flowCount++;
         }
 
+        //修改订单信息
+        if (Dictionary.ORDER_STATU_TK.equals(sourceOrder.getStatu())) {
+            orderStatus = Dictionary.ORDER_STATU_TK;
+        }
+        // 更新收款状态
+        sourceOrder.setPayTime(new Date());
+        sourceOrder.setStatu(orderStatus);
+        sourceOrder.setCardPay(cardPayTotal);
+        sourceOrder.setCashPay(cashPayTotal);
         sysOrderDao.update(sourceOrder);
-
-
 
     }
 
@@ -546,8 +610,7 @@
             Integer buyNum = orderItemDao.selectByGoodsId(shopGoods.getId());
             buyNum = (buyNum == null ? 0 : buyNum);
             if ((buyNum + carItem.getCount()) > maxNum) {
-
-                throw new GlobleException(shopGoods.getName() + "已超过最大销售数量,还剩【" + (maxNum - buyNum) + "】件");
+                throw new GlobleException(shopGoods.getName() + "已超过最大销售数量");
             }
             if ((buyNum + carItem.getCount()) == maxNum) {
                 if (!shopGoods.getStaus().equals(Dictionary.BUSINESS_STATE_DOWN)) {
@@ -560,82 +623,67 @@
     }
 
 
-
     /**
      * 使用充值卡付款操作
      *
      * @param sourceOrder
-     * @param userCard
-     * @param orderItem
-     * @param temp        设置是否扣除使用次数 true 扣除
+     * @param moneyCardUse
+     * @param flow
      */
-    private void cardPaySk(MoneyCardUse moneyCardUse, SysOrder sourceOrder,
-                           SysOrderItem orderItem) {
+    private void cardPaySk(MoneyCardUse moneyCardUse, SysOrder sourceOrder, SysOrderFlow flow) {
         // 判断商品是否在充值卡的限制购买,判断分类
-        if (!isInBangding(moneyCardUse, orderItem.getGoodsId())) {
-            throw new GlobleException(shoppingGoodsDao.selectById(orderItem.getGoodsId()).getName() + "不在"
-                    + moneyCardUse.getCardName() + "优惠中");
-        }
-        SysUsers user = (SysUsers) WebUtil.getSession().getAttribute(MatrixConstance.LOGIN_KEY);
-        Double balance = moneyCardUse.getRealMoney();
-        if (moneyCardUse.getGiftMoney() != null) {
-            balance = MoneyUtil.add(balance, moneyCardUse.getGiftMoney());
-        }
-        // 判断金额是否足够支付
-        if (balance >= orderItem.getPayMoney()) {
-
-            MoneyCardUseFlow moneyCardUseFlow=new MoneyCardUseFlow();
-
-            // 余额充足先从本金中扣除
-            if (moneyCardUse.getRealMoney() >= orderItem.getPayMoney()) {
-                double surplus = MoneyUtil.sub(moneyCardUse.getRealMoney(), orderItem.getPayMoney());
-                moneyCardUse.setRealMoney(surplus);
-                moneyCardUseFlow.setTotal(0-orderItem.getPayMoney());
-
-            } else {
-                // 本金不够
-                double surplus = MoneyUtil.sub(orderItem.getPayMoney(), moneyCardUse.getRealMoney());
-                moneyCardUseFlow.setTotal(0- moneyCardUse.getRealMoney());
-                // 扣除所有本金
-                moneyCardUse.setRealMoney(0D);
-                moneyCardUse.setGiftMoney(MoneyUtil.sub(moneyCardUse.getGiftMoney(), surplus));
-                // 只要是用了赠送金额购买的就视为赠送套餐 18-12-01 jyy
-                orderItem.setIsFree(Dictionary.FLAG_YES);
-                moneyCardUseFlow.setGiftMoney(0-surplus);
+        sourceOrder.getItems().forEach(item -> {
+            if (!isInBangding(moneyCardUse, item.getGoodsId())) {
+                throw new GlobleException(shoppingGoodsDao.selectById(item.getGoodsId()).getName() + "不在" + moneyCardUse.getCardName() + "优惠中");
             }
+        });
 
-            //设置卡项使用流水
-            moneyCardUseFlow.setCarUseId(moneyCardUse.getId());
-            moneyCardUseFlow.setOrderNo(sourceOrder.getOrderNo());
-            moneyCardUseFlow.setVipId(sourceOrder.getVipId());
-            moneyCardUseFlow.setTimes(-1);
-            moneyCardUseFlow.setType(MoneyCardUseFlow.USE_TYPE_CONSUMER);
-            moneyCardUseFlow.setCreateTime(new Date());
-            moneyCardUseFlow.setOperationId(user.getSuId());
-            moneyCardUseFlow.setBalance(moneyCardUse.getGiftMoney()+moneyCardUse.getRealMoney());
-            moneyCardUseFlowDao.insert(moneyCardUseFlow);
+        SysUsers user = (SysUsers) WebUtil.getSession().getAttribute(MatrixConstance.LOGIN_KEY);
 
+        MoneyCardUseFlow moneyCardUseFlow = new MoneyCardUseFlow();
+        if (SysOrderFlow.IS_GIFT_Y.equals(flow.getIsGift())) {
+            if (moneyCardUse.getGiftMoney() >= flow.getAmount().doubleValue()) {
+                double surplus = MoneyUtil.sub(moneyCardUse.getGiftMoney(), flow.getAmount().doubleValue());
+                moneyCardUse.setGiftMoney(surplus);
+                moneyCardUseFlow.setGiftMoney(0D - flow.getAmount().doubleValue());
+            } else {
+                throw new GlobleException(moneyCardUse.getCardName() + "余额不足");
+            }
         } else {
-            throw new GlobleException(moneyCardUse.getCardName() + "余额不足");
+            if (moneyCardUse.getRealMoney() >= flow.getAmount().doubleValue()) {
+                double surplus = MoneyUtil.sub(moneyCardUse.getRealMoney(), flow.getAmount().doubleValue());
+                moneyCardUse.setRealMoney(surplus);
+                moneyCardUseFlow.setTotal(0 - flow.getAmount().doubleValue());
+            } else {
+                throw new GlobleException(moneyCardUse.getCardName() + "余额不足");
+            }
         }
 
-        // 达到使用次数后自动清空余额
-        if (!moneyCardUse.getIsVipCar().equals(Dictionary.FLAG_YES_Y)
-                && moneyCardUse.getLastCount() <= 0) {
-            moneyCardUse.setIsOver(Dictionary.FLAG_YES_Y);
-            moneyCardUse.setLastCount(0);
-            moneyCardUse.setStatus(Dictionary.MONEYCARD_STATUS_WX);
-        }
-        if (moneyCardUse.getRealMoney().equals(0D) && moneyCardUse.getGiftMoney().equals(0D)) {
-            moneyCardUse.setIsOver(Dictionary.FLAG_YES_Y);
-            moneyCardUse.setStatus(Dictionary.MONEYCARD_STATUS_WX);
+        if (moneyCardUse.getIsVipCar().equals(Dictionary.FLAG_NO_N)) {
+            //余额为0时充值卡变为无效
+            if (moneyCardUse.getRealMoney().equals(0D) && moneyCardUse.getGiftMoney().equals(0D)) {
+                moneyCardUse.setIsOver(Dictionary.FLAG_YES_Y);
+                moneyCardUse.setStatus(Dictionary.MONEYCARD_STATUS_WX);
+            }
         }
 
         ShoppingGoods shoppingGoods = shoppingGoodsService.findById(moneyCardUse.getGoodsId());
-        Date invalidTime = shoppingGoodsService.calInvalidTime(shoppingGoods, 2, moneyCardUse.getFailTime());
-        moneyCardUse.setFailTime(invalidTime);
+        if (shoppingGoods != null) {
+            Date invalidTime = shoppingGoodsService.calInvalidTime(shoppingGoods, 2, moneyCardUse.getFailTime());
+            moneyCardUse.setFailTime(invalidTime);
+        }
         // 更新充值卡信息
         moneyCardUseDao.update(moneyCardUse);
+        //设置卡项使用流水
+        moneyCardUseFlow.setCarUseId(moneyCardUse.getId());
+        moneyCardUseFlow.setOrderNo(sourceOrder.getOrderNo());
+        moneyCardUseFlow.setVipId(sourceOrder.getVipId());
+        moneyCardUseFlow.setTimes(-1);
+        moneyCardUseFlow.setType(MoneyCardUseFlow.USE_TYPE_CONSUMER);
+        moneyCardUseFlow.setCreateTime(new Date());
+        moneyCardUseFlow.setOperationId(user.getSuId());
+        moneyCardUseFlow.setBalance(moneyCardUse.getGiftMoney() + moneyCardUse.getRealMoney());
+        moneyCardUseFlowDao.insert(moneyCardUseFlow);
     }
 
     /**
@@ -708,51 +756,41 @@
             // 如果购买的是充值卡
             if (sysOrderItem.getType().equals(Dictionary.SHOPPING_GOODS_TYPE_CZK)) {
 
-                ShoppingGoods moneyCar = shoppingGoodsDao.selectById(sysOrderItem.getGoodsId());
-                MoneyCardUse moneyCardUse = new MoneyCardUse();
-                moneyCardUse.setVipId(sourceOrder.getVipId());
-                moneyCardUse.setGiftMoney(moneyCar.getReferencePice());
-                moneyCardUse.setRealMoney(moneyCar.getSealPice());
-                moneyCardUse.setGoodsId(moneyCar.getId());
-                moneyCardUse.setIsOver(Dictionary.FLAG_NO_N);
-                moneyCardUse.setOrderItemId(sysOrderItem.getId());
-                moneyCardUse.setSource(Dictionary.TAOCAN_SOURCE_GM);
-                moneyCardUse.setStatus(Dictionary.MONEYCARD_STATUS_YX);
-                moneyCardUse.setCardName(moneyCar.getName());
-
-                if (Dictionary.FLAG_YES.equals(moneyCar.getCarIsAll())) {
-                    moneyCardUse.setIsVipCar(Dictionary.FLAG_YES_Y);
-                } else {
-                    // 非会籍卡
-                    moneyCardUse.setIsVipCar(Dictionary.FLAG_NO_N);
-                }
-
-                // 是否为赠送
-                if (sysOrderItem.getIsFree().equals(Dictionary.FLAG_YES)) {
-                    moneyCardUse.setSource(Dictionary.TAOCAN_SOURCE_ZS);
-                } else {
+                for (int i = 0; i < sysOrderItem.getCount(); i++) {
+                    ShoppingGoods moneyCar = shoppingGoodsDao.selectById(sysOrderItem.getGoodsId());
+                    MoneyCardUse moneyCardUse = new MoneyCardUse();
+                    moneyCardUse.setVipId(sourceOrder.getVipId());
+                    moneyCardUse.setGiftMoney(moneyCar.getReferencePice());
+                    moneyCardUse.setRealMoney(moneyCar.getSealPice());
+                    moneyCardUse.setGoodsId(moneyCar.getId());
+                    moneyCardUse.setIsOver(Dictionary.FLAG_NO_N);
+                    moneyCardUse.setOrderItemId(sysOrderItem.getId());
                     moneyCardUse.setSource(Dictionary.TAOCAN_SOURCE_GM);
-                }
-                if (moneyCar.getCarUseCount() == null || moneyCar.getCarUseCount() == 0) {
-                    moneyCardUse.setUseTotal(999999999);
-                    moneyCardUse.setLastCount(999999999);
-                } else {
-                    moneyCardUse.setUseTotal(moneyCar.getCarUseCount());
-                    moneyCardUse.setLastCount(moneyCar.getCarUseCount());
-                }
-                moneyCardUse.setVipId(sourceOrder.getVipId());
-//                if (moneyCar.getValidity() == null || moneyCar.getValidity() == 0) {
-//                    // 设置失效时间
-//                    Calendar cal = Calendar.getInstance();
-//                    cal.set(2200, 1, 1);
-//                    moneyCardUse.setFailTime(cal.getTime());
-//                } else {
-//                    moneyCardUse.setFailTime(DateUtil.nextNDate(new Date(), 30 * moneyCar.getValidity()));
-//                }
-                Date invalidTime = shoppingGoodsService.calInvalidTime(sysOrderItem.getShoppingGoods(), 1, null);
-                moneyCardUse.setFailTime(invalidTime);
+                    moneyCardUse.setStatus(Dictionary.MONEYCARD_STATUS_YX);
+                    moneyCardUse.setCardName(moneyCar.getName());
+                    moneyCardUse.setIsVipCar(Dictionary.FLAG_NO_N);
+                    moneyCardUse.setVipId(sourceOrder.getVipId());
 
-                moneyCardUseDao.insert(moneyCardUse);
+                    // 是否为赠送
+                    if (sysOrderItem.getIsFree().equals(Dictionary.FLAG_YES)) {
+                        moneyCardUse.setSource(Dictionary.TAOCAN_SOURCE_ZS);
+                    } else {
+                        moneyCardUse.setSource(Dictionary.TAOCAN_SOURCE_GM);
+                    }
+                    //余次处理
+                    if (moneyCar.getCarUseCount() == null || moneyCar.getCarUseCount() == 0) {
+                        moneyCardUse.setUseTotal(999999999);
+                        moneyCardUse.setLastCount(999999999);
+                    } else {
+                        moneyCardUse.setUseTotal(moneyCar.getCarUseCount());
+                        moneyCardUse.setLastCount(moneyCar.getCarUseCount());
+                    }
+                    //失效时间处理
+                    Date invalidTime = shoppingGoodsService.calInvalidTime(sysOrderItem.getShoppingGoods(), 1, null);
+                    moneyCardUse.setFailTime(invalidTime);
+
+                    moneyCardUseDao.insert(moneyCardUse);
+                }
             }
         }
     }
@@ -764,66 +802,56 @@
     @Transactional(rollbackFor = Exception.class)
     @Override
     public void updateAfterMoney(SysOrder pageOrder) {
-
         SysOrder sourceOrder = sysOrderDao.selectById(pageOrder.getId());
 
-        boolean haQk=false;
+        int i = 1;
+        double refundTotal = 0D;
+        double cardPayTotal = 0D;
+        double cashPayTotal = 0D;
+        for (SysOrderFlow flow : pageOrder.getFlows()) {
+            flow.setFlowNo(codeService.getFlowCode() + "-" + i);
+            Long goodsId = pageOrder.getItems().get(0).getGoodsId();
+            ShoppingGoods goods = shoppingGoodsDao.selectById(goodsId);
+            flow.setFlowContent(goods.getName() + "等" + pageOrder.getItems().size() + "件产品");
 
-        double cardPayTotal=0D;
-        double carshPayTotal=0D;
+            flow.setOrderId(pageOrder.getId());
+            flow.setVipId(pageOrder.getVipId());
+            flow.setFlowType(SysOrderFlow.FLOW_TYPE_REPAY);
+            // 若使用储值卡付款
+            if (SysOrderFlow.PAY_METHOD_CARD.equals(flow.getPayMethod())) {
+                if (flow.getCardId() != null) {
+                    cardPayTotal += flow.getAmount().doubleValue();
+                    MoneyCardUse moneyCardUse = moneyCardUseDao.selectById(flow.getCardId());
+                    cardPaySk(moneyCardUse, pageOrder, flow);
+                }
+            } else {
+                cashPayTotal += flow.getAmount().doubleValue();
+            }
 
-
-        for(SysOrderItem pageItem:pageOrder.getItems()){
-           SysOrderItem sourceItem=orderItemDao.selectById(pageItem.getId());
-
-           //结清
-           if(sourceItem.getArrears() == pageItem.getPayMoney()){
-
-               sourceItem.setStatus(Dictionary.ORDER_STATU_YFK);
-            }else if(sourceItem.getArrears() > pageItem.getPayMoney()) {
-               //未结清
-               sourceItem.setStatus(Dictionary.ORDER_STATU_QK);
-               haQk=true;
-           }else  if(sourceItem.getArrears() < pageItem.getPayMoney()) {
-
-               throw new GlobleException("支付金额不能大于欠款金额");
-
-           }
-
-           //更新卡支付
-           if (!pageItem.getPayMethod().equals(Dictionary.PAY_TYPE_MOENY)) {
-                // 查询要支付的充值卡
-                MoneyCardUse moneyCardUse = moneyCardUseDao.selectById(Long.parseLong(pageItem.getPayMethod()));
-                // 扣除付款卡金额并添加流水
-                cardPaySk(moneyCardUse, sourceOrder,  pageItem);
-               sourceItem.setCardPay((sourceItem.getCardPay()==null?0:sourceItem.getCardPay())+pageItem.getPayMoney());
-               cardPayTotal+=pageItem.getPayMoney();
-            }else{
-               carshPayTotal+=pageItem.getPayMoney();
-               sourceItem.setCashPay((sourceItem.getCashPay()==null?0:sourceItem.getCashPay())+pageItem.getPayMoney());
-           }
-
-            //更新订单明细状态
-            sourceItem.setArrears(sourceItem.getArrears()-pageItem.getPayMoney());
-
-            orderItemDao.update(sourceItem);
-
+            refundTotal += flow.getAmount().doubleValue();
+            flow.setShopId(sourceOrder.getShopId());
+            flow.setCompanyId(sourceOrder.getCompanyId());
+            sysOrderFlowDao.insert(flow);
+            i++;
         }
+
+        boolean haQk = false;
+
+        if (refundTotal == pageOrder.getArrears()) {
+            haQk = true;
+        }
+
         //更新收款状态
-        if(haQk){
-            sourceOrder.setStatu(Dictionary.ORDER_STATU_QK);
-        }else{
+        if (haQk) {
             sourceOrder.setStatu(Dictionary.ORDER_STATU_YFK);
+        } else {
+            sourceOrder.setStatu(Dictionary.ORDER_STATU_QK);
         }
 
-        sourceOrder.setArrears(sourceOrder.getArrears()-carshPayTotal-cardPayTotal);
-        sourceOrder.setCardPay(sourceOrder.getCardPay()+cardPayTotal);
-        sourceOrder.setCashPay(sourceOrder.getCashPay()+carshPayTotal);
+        sourceOrder.setArrears(sourceOrder.getArrears() - refundTotal);
+        sourceOrder.setCardPay(sourceOrder.getCardPay() + cardPayTotal);
+        sourceOrder.setCashPay(sourceOrder.getCashPay() + cashPayTotal);
         sysOrderDao.update(sourceOrder);
-
-        // 设置业绩
-        achieveNewService.addAchaeveByOrder(pageOrder);
-
     }
 
 
@@ -904,6 +932,7 @@
                     ShoppingGoods sysGoods = shoppingGoodsDao.selectById(outStoreItem.getSkuId());
                     if (sysGoods != null) {
                         throw new GlobleException("出库失败:【" + sysGoods.getName() + "库存不足】");
+
                     } else {
                         throw new GlobleException("出库失败没有找到出库产品");
                     }
@@ -976,7 +1005,8 @@
             //综合卡中包含的项目
             List<ShoppingGoodsAssemble> assembleList = shoppingGoodsAssembleDao.selectGoodsByShoppingGoodsIdAndType(sysOrderItem.getGoodsId(), ShoppingGoods.SHOPPING_GOODS_TYPE_XM);
             assembleList.forEach(item -> {
-                createProjuseByAssemble(order, sysOrderItem, item, null);
+                //TODO 补综合卡逻辑
+                createProjuseByAssemble(order, sysOrderItem, item, null, null);
             });
 
             //处理综合卡中包含的套餐
@@ -997,9 +1027,9 @@
      * 通过组合关系创建用户项目余次
      */
     private SysProjUse createProjuseByAssemble(SysOrder order, SysOrderItem sysOrderItem,
-                                               ShoppingGoodsAssemble goodsAssemble, Long taocanId) {
+                                               ShoppingGoodsAssemble goodsAssemble, Long taocanId, Date failTime) {
         //计算折扣
-        Double zk=sysOrderItem.getZkPrice()/sysOrderItem.getPrice();
+        Double zk = sysOrderItem.getZkPrice() / sysOrderItem.getPrice();
 
         SysProjUse puse = new SysProjUse();
         puse.setIsOver(Dictionary.DELETED_N);
@@ -1013,9 +1043,9 @@
         puse.setTaocanId(taocanId);
         puse.setType(Dictionary.SHOPPING_GOODS_TYPE_XM);
         if (taocanId == null) {
-            puse.setPrice(goodsAssemble.getShoppingGoods().getPrice() * zk );
+            puse.setPrice(goodsAssemble.getShoppingGoods().getPrice() * zk);
         } else {
-            puse.setPrice(goodsAssemble.getPrice() * zk  );
+            puse.setPrice(goodsAssemble.getPrice() * zk);
         }
         puse.setBalance(MoneyUtil.mul(puse.getPrice(), Double.valueOf(puse.getSurplusCount())));
         // 赠送和打折后金额为0的都视为赠送项目
@@ -1024,10 +1054,7 @@
         } else {
             puse.setSource(Dictionary.TAOCAN_SOURCE_ZS);
         }
-        // 设置失效时间
-        Calendar cal = Calendar.getInstance();
-        cal.set(2200, 1, 1);
-        puse.setFailTime(cal.getTime());
+        puse.setFailTime(failTime);
         sysProjUseDao.insert(puse);
         return puse;
     }
@@ -1069,20 +1096,20 @@
         taocanProjUse.setFailTime(invalidTime);
         sysProjUseDao.insert(taocanProjUse);
         //计划次数
-        int surplusCount=0;
+        int surplusCount = 0;
         //总余额
         Double sumBanance = 0D;
         //创建套餐绑定的项目
         List<ShoppingGoodsAssemble> assembleList = shoppingGoodsAssembleDao.selectGoodsByShoppingGoodsIdAndType(projId, ShoppingGoods.SHOPPING_GOODS_TYPE_XM);
         for (ShoppingGoodsAssemble assemble : assembleList) {
-            SysProjUse tempUse = createProjuseByAssemble(order, sysOrderItem, assemble, taocanProjUse.getId());
+            SysProjUse tempUse = createProjuseByAssemble(order, sysOrderItem, assemble, taocanProjUse.getId(),taocanProjUse.getFailTime());
             sumBanance += tempUse.getBalance();
-            surplusCount+=tempUse.getSurplusCount();
+            surplusCount += tempUse.getSurplusCount();
         }
-        if(Dictionary.FLAG_NO_N.equals(taocanShoppingGoods.getIsCourse())){
+        if (Dictionary.FLAG_NO_N.equals(taocanShoppingGoods.getIsCourse())) {
             //固定套餐,剩余次数等于绑定项目的次数
             taocanProjUse.setSurplusCount(surplusCount);
-        }else{
+        } else {
             //任选套餐剩余次数等于最大使用次数
             taocanProjUse.setSurplusCount(taocanShoppingGoods.getCarUseCount());
         }
@@ -1106,7 +1133,7 @@
         puse.setVipId(order.getVipId());
         puse.setStatus(Dictionary.TAOCAN_STATUS_YX);
         puse.setType(Dictionary.SHOPPING_GOODS_TYPE_XM);
-        puse.setBalance(MoneyUtil.add(sysOrderItem.getCardPay(), sysOrderItem.getCashPay()));
+        puse.setBalance(sysOrderItem.getZkPrice());
         puse.setPrice(sysOrderItem.getZkPrice());
         puse.setProjName(sysOrderItem.getShoppingGoods().getName());
         // 赠送和打折后金额为0的都视为赠送项目
@@ -1124,6 +1151,7 @@
 
     /**
      * 会员卡充值
+     *
      * @param czVo
      */
     @Override
@@ -1131,11 +1159,11 @@
     public SysOrder updateAddCardMoney(CzXkVo czVo) {
         SysUsers user = (SysUsers) WebUtil.getSession().getAttribute(MatrixConstance.LOGIN_KEY);
 
-        SysVipInfo vip = (SysVipInfo) WebUtil.getSession().getAttribute(SystemConstance.CURRENT_CUSTOMER);
-        czVo.setVipId(vip.getId());
+//        SysVipInfo vip = (SysVipInfo) WebUtil.getSession().getAttribute(SystemConstance.CURRENT_CUSTOMER);
+//        czVo.setVipId(vip.getId());
 
         //更新会员会员卡金额
-        MoneyCardUse cardUser = moneyCardUseDao.selectVipCard(vip.getId());
+        MoneyCardUse cardUser = moneyCardUseDao.selectVipCard(czVo.getVipId());
         cardUser.setRealMoney(MoneyUtil.add(cardUser.getRealMoney(), czVo.getBjmoney()));
         cardUser.setGiftMoney(MoneyUtil.add(cardUser.getGiftMoney(), czVo.getGiftMoney()));
         moneyCardUseDao.update(cardUser);
@@ -1166,13 +1194,14 @@
         order.setStaffId(user.getSuId());
         order.setIsCross(2 + "");
         order.setStatu(Dictionary.ORDER_STATU_YFK);
+        order.setCompanyId(user.getCompanyId());
         sysOrderDao.insert(order);
 
         SysOrderItem orderItem = new SysOrderItem();
         orderItem.setOrderId(order.getId());
         orderItem.setOrderNo(order.getOrderNo());
         orderItem.setArrears(0D);
-        ShoppingGoods shoppingGoods= shoppingGoodsDao.selectVipCzGoods();
+        ShoppingGoods shoppingGoods = shoppingGoodsDao.selectVipCzGoods();
         orderItem.setGoodsId(shoppingGoods.getId());
         orderItem.setPayMethod(Dictionary.PAY_TYPE_MOENY);
         orderItem.setCashPay(czVo.getBjmoney());
@@ -1185,10 +1214,13 @@
         orderItem.setStatus(Dictionary.ORDER_STATU_YFK);
         orderItem.setAchaeveList(czVo.getAchaeveList());
         orderItemDao.insert(orderItem);
+        List<SysOrderItem> items = new ArrayList<>();
+        items.add(orderItem);
+        order.setItems(items);
 
 
         //设置卡项使用流水
-        MoneyCardUseFlow moneyCardUseFlow=new MoneyCardUseFlow();
+        MoneyCardUseFlow moneyCardUseFlow = new MoneyCardUseFlow();
         moneyCardUseFlow.setTotal(czVo.getBjmoney());
         moneyCardUseFlow.setGiftMoney(czVo.getGiftMoney());
         moneyCardUseFlow.setCarUseId(czVo.getCardId());
@@ -1197,10 +1229,11 @@
         moneyCardUseFlow.setOrderNo(order.getOrderNo());
         moneyCardUseFlow.setCreateTime(new Date());
         moneyCardUseFlow.setOperationId(user.getSuId());
-        moneyCardUseFlow.setBalance(cardUser.getGiftMoney()+cardUser.getRealMoney());
+        moneyCardUseFlow.setBalance(cardUser.getGiftMoney() + cardUser.getRealMoney());
         moneyCardUseFlowDao.insert(moneyCardUseFlow);
 
-
+        order.setFlows(czVo.getFlows());
+        changeOrderStatu(order);
         // 添加员工业绩
         achieveNewService.addAchaeveByOrder(order);
         return order;
@@ -1212,4 +1245,184 @@
     public SysOrder findSysOrderTjByVipId(Long vipId) {
         return sysOrderDao.selectVipOrderInfoTotal(vipId);
     }
+
+    @Override
+    public List<OrderDetailVo> findApiOrderListInPage(OrderListDto orderListDto, PaginationVO pageVo) {
+        return sysOrderDao.selectApiOrderListInPage(orderListDto, pageVo);
+    }
+
+    @Override
+    public int findApiOrderListTotal(OrderListDto orderListDto) {
+        return sysOrderDao.selectApiOrderListTotal(orderListDto);
+    }
+
+    @Override
+    public OrderDetailVo findApiOrderDetailByOrderId(Long orderId) {
+        OrderDetailVo orderDetail = sysOrderDao.selectApiOrderDetailById(orderId);
+
+        if (orderDetail == null) {
+            throw new GlobleException("该订单不存在");
+        }
+
+        List<OrderDetailItemVo> items = orderItemDao.selectApiOrderDetailItemsByOrderId(orderId);
+        if (CollectionUtils.isNotEmpty(items)) {
+            for (OrderDetailItemVo item : items) {
+                List<OrderDetailAchieveItemVo> achieveItems = achieveNewDao.selectApiOrderItemAchieve(item.getId());
+                item.setAchieves(achieveItems);
+            }
+        }
+
+        orderDetail.setItems(items);
+        return orderDetail;
+    }
+
+    @Override
+    public List<RankingVo> findApiShopAchieveRanking(SysOrder sysOrder) {
+        return sysOrderDao.selectShopAchieveRanking(sysOrder);
+    }
+
+    @Transactional(rollbackFor = Exception.class)
+    @Override
+    public void refundOrderMoney(SysOrder pageOrder) {
+        SysUsers user = WebUtil.getSessionAttribute(MatrixConstance.LOGIN_KEY);
+
+        // 修改订单状态
+        changeOrderStatu(pageOrder);
+
+        List<SysOrderItem> returnItems = new ArrayList<>();
+        for (SysOrderItem item : pageOrder.getItems()) {
+
+            SysProjUse queryProjUse = new SysProjUse();
+            queryProjUse.setIsOver(Dictionary.FLAG_NO_N);
+            queryProjUse.setStatus(Dictionary.TAOCAN_STATUS_YX);
+            queryProjUse.setOrderItemId(item.getOldItemId());
+            // 修改项目信息
+            if (Dictionary.SHOPPING_GOODS_TYPE_XM.equals(item.getType()) || Dictionary.SHOPPING_GOODS_TYPE_JJCP.equals(item.getType())) {
+
+                if (Dictionary.SHOPPING_GOODS_TYPE_JJCP.equals(item.getType())) {
+                    if (Dictionary.FLAG_YES_Y.equals(item.getIsReturnStore())) {
+                        returnItems.add(item);
+                    }
+                } else {
+                    SysProjUse sysProjUse = sysProjUseDao.selectByModel(queryProjUse).get(0);
+
+                    int sub = sysProjUse.getSurplusCount() - item.getCount();
+                    sysProjUse.setSurplusCount(sub);
+                    if (sub <= 0) {
+                        sysProjUse.setIsOver(Dictionary.FLAG_YES_Y);
+                        sysProjUse.setStatus(Dictionary.TAOCAN_STATUS_WX);
+                    }
+                    sysProjUseDao.update(sysProjUse);
+
+                    SysProjUseFlow sysProjUseFlow = SysProjUseMapper.INSTANCE.projUseToFlow(sysProjUse);
+                    sysProjUseFlow.setOptionType("退款修改");
+                    sysProjUseFlow.setId(null);
+                    sysProjUseFlow.setUpdateBy(user.getSuName());
+                    sysProjUseFlow.setCreateBy(user.getSuName());
+                    sysProjUseDao.insertFlow(sysProjUseFlow);
+                }
+            }
+
+            if (Dictionary.SHOPPING_GOODS_TYPE_TC.equals(item.getType())) {
+                queryProjUse.setTaocanId(-1L);
+                List<SysProjUse> sysProjUses = sysProjUseDao.selectByModel(queryProjUse);
+                if (item.getCount() > sysProjUses.size()) {
+                    throw new GlobleException("数据异常");
+                }
+
+                for (int i = 0; i < item.getCount(); i++) {
+                    SysProjUse sysProjUse = sysProjUses.get(i);
+                    sysProjUse.setIsOver(Dictionary.FLAG_YES_Y);
+                    sysProjUse.setStatus(Dictionary.TAOCAN_STATUS_WX);
+
+                    sysProjUseDao.update(sysProjUse);
+                    SysProjUseFlow sysProjUseFlow = SysProjUseMapper.INSTANCE.projUseToFlow(sysProjUse);
+                    sysProjUseFlow.setOptionType("退款修改");
+                    sysProjUseFlow.setId(null);
+                    sysProjUseFlow.setUpdateBy(user.getSuName());
+                    sysProjUseFlow.setCreateBy(user.getSuName());
+                    sysProjUseDao.insertFlow(sysProjUseFlow);
+                }
+            }
+
+            if (Dictionary.SHOPPING_GOODS_TYPE_CZK.equals(item.getType())) {
+                MoneyCardUse queryCardUse = new MoneyCardUse();
+                queryCardUse.setIsOver(Dictionary.FLAG_NO_N);
+                queryCardUse.setStatus(Dictionary.TAOCAN_STATUS_YX);
+                queryCardUse.setOrderItemId(item.getOldItemId());
+
+                List<MoneyCardUse> moneyCardUses = moneyCardUseDao.selectByModel(queryCardUse);
+                for (int i = 0; i < item.getCount(); i++) {
+                    MoneyCardUse moneyCardUse = moneyCardUses.get(i);
+                    moneyCardUse.setIsOver(Dictionary.FLAG_YES_Y);
+                    moneyCardUse.setStatus(Dictionary.MONEYCARD_STATUS_WX);
+                    moneyCardUseDao.update(moneyCardUse);
+                }
+            }
+
+            // TODO 综合卡退款
+            if (Dictionary.SHOPPING_GOODS_TYPE_ZHK.equals(item.getType())) {
+
+            }
+
+
+            ShoppingGoods goods = shoppingGoodsDao.selectById(item.getGoodsId());
+            goods.setRealSealCount(goods.getRealSealCount() - item.getCount());
+            shoppingGoodsDao.update(goods);
+        }
+
+        // 家居产品退库存
+        if (CollectionUtils.isNotEmpty(returnItems)) {
+            refundInstore(returnItems);
+        }
+
+        // 设置业绩
+        achieveNewService.addAchaeveByOrder(pageOrder);
+
+    }
+
+    /**
+     * 退款入库
+     */
+    private void refundInstore(@NotEmpty List<SysOrderItem> items) {
+        SysUsers user = WebUtil.getSessionAttribute(MatrixConstance.LOGIN_KEY);
+        SysSupplierInfo supplierInfo = new SysSupplierInfo();
+        supplierInfo.setShopId(user.getShopId());
+        supplierInfo = sysSupplierInfoDao.selectByModel(supplierInfo).get(0);
+
+        Warehouse warehouse = warehouseDao.findShopWarehouse(user.getShopId()).get(0);
+        SysInstoreInfo instoreInfo = new SysInstoreInfo();
+        instoreInfo.setInstoreType(SysInstoreInfo.INSTORE_TYPE_RETURN);
+        instoreInfo.setInstoreDate(new Date());
+        instoreInfo.setSupplierId(supplierInfo.getId().toString());
+        instoreInfo.setStoreId(warehouse.getId());
+        instoreInfo.setCheckStatus(Dictionary.CHECK_STATUS_DSH);
+        // 设置入库单编号
+        instoreInfo.setInstoreId(DateUtil.getTimeMark());
+        instoreInfo.setShopId(user.getShopId());
+        instoreInfo.setCompanyId(user.getCompanyId());
+        sysInstoreInfoDao.insert(instoreInfo);
+
+        Double total = 0.0;
+        List<SysInstoreDetail> instoreDetails = new ArrayList<>();
+        for (SysOrderItem item : items) {
+            ShoppingGoods goods = shoppingGoodsDao.selectById(item.getGoodsId());
+            SysInstoreDetail sysInstoreDetail = new SysInstoreDetail();
+            sysInstoreDetail.setAmount(item.getCount().doubleValue());
+            sysInstoreDetail.setPrice(item.getZkPrice());
+            sysInstoreDetail.setSkuId(goods.getId());
+
+            total = MoneyUtil.add(MoneyUtil.mul(Double.parseDouble(sysInstoreDetail.getAmount() + ""), sysInstoreDetail.getPrice()), total);
+            sysInstoreDetail.setInstoreId(instoreInfo.getId());
+            // 设置小计
+            sysInstoreDetail.setPriceTotal(MoneyUtil.mul(Double.parseDouble(sysInstoreDetail.getAmount() + ""), sysInstoreDetail.getPrice()));
+            instoreDetails.add(sysInstoreDetail);
+
+        }
+        instoreInfo.setSumall(total);
+        sysInstoreInfoDao.update(instoreInfo);
+        sysInstoreDetailDao.batchInsert(instoreDetails);
+
+        sysInstoreInfoService.check(instoreInfo);
+    }
 }
diff --git a/zq-erp/src/main/java/com/matrix/system/hive/service/imp/SysProjServicesServiceImpl.java b/zq-erp/src/main/java/com/matrix/system/hive/service/imp/SysProjServicesServiceImpl.java
index ef69075..a3c5a75 100644
--- a/zq-erp/src/main/java/com/matrix/system/hive/service/imp/SysProjServicesServiceImpl.java
+++ b/zq-erp/src/main/java/com/matrix/system/hive/service/imp/SysProjServicesServiceImpl.java
@@ -1,22 +1,29 @@
 package com.matrix.system.hive.service.imp;
 
+import com.matrix.component.rabbitmq.RabiitMqTemplate;
 import com.matrix.core.constance.MatrixConstance;
 import com.matrix.core.exception.GlobleException;
 import com.matrix.core.pojo.PaginationVO;
 import com.matrix.core.pojo.VerifyResult;
-import com.matrix.core.tools.*;
+import com.matrix.core.tools.DateUtil;
+import com.matrix.core.tools.LogUtil;
+import com.matrix.core.tools.StringUtils;
+import com.matrix.core.tools.WebUtil;
+import com.matrix.system.app.dto.ServiceOrderListDto;
+import com.matrix.system.app.vo.ServiceOrderListVo;
 import com.matrix.system.common.bean.SysUsers;
 import com.matrix.system.common.dao.SysUsersDao;
 import com.matrix.system.constance.Dictionary;
 import com.matrix.system.hive.bean.*;
 import com.matrix.system.hive.dao.*;
-import com.matrix.core.tools.DateUtil;
 import com.matrix.system.hive.plugin.util.MoneyUtil;
-import com.matrix.system.hive.pojo.MyBeauticianCount;
 import com.matrix.system.hive.service.*;
+import com.matrix.system.shopXcx.mqTask.MQTaskRouting;
+import com.matrix.system.wechart.templateMsg.UniformMsgParam;
 import org.apache.commons.collections.CollectionUtils;
 import org.springframework.beans.BeanUtils;
 import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.beans.factory.annotation.Value;
 import org.springframework.stereotype.Service;
 import org.springframework.transaction.annotation.Transactional;
 
@@ -96,6 +103,13 @@
     @Resource
     private ShoppingGoodsService shoppingGoodsService;
 
+    @Autowired
+    private RabiitMqTemplate rabiitMqTemplate;
+
+    @Value("${evn}")
+    private String evn;
+
+
     /**
      * 新增服务单 jyy
      *
@@ -106,13 +120,15 @@
     public SysProjServices addSysProjServices(SysProjServices sysProjServices) throws GlobleException {
 
         //创建服务单
-        SysUsers user = (SysUsers) WebUtil.getSession().getAttribute(MatrixConstance.LOGIN_KEY);
-        sysProjServices.setCreateStaffId(user.getSuId());
-        sysProjServices.setShopId(user.getShopId());
-        sysProjServices.setCompanyId(user.getCompanyId());
+        if(WebUtil.getSession().getAttribute(MatrixConstance.LOGIN_KEY)!=null){
+            SysUsers user = (SysUsers) WebUtil.getSession().getAttribute(MatrixConstance.LOGIN_KEY);
+            sysProjServices.setCreateStaffId(user.getSuId());
+            sysProjServices.setShopId(user.getShopId());
+            sysProjServices.setCompanyId(user.getCompanyId());
+        }
+
+
         sysProjServices.setCreateTime(new Date());
-        // 设置状态为待预约
-        sysProjServices.setState(Dictionary.SERVICE_STATU_DYY);
         sysProjServices.setServiceNo(codeService.getServiceOrderCode());
         Double hkPrice = 0.0;
         int i = sysProjServicesDao.insert(sysProjServices);
@@ -196,7 +212,7 @@
             //插入订单明细
             sysBeauticianState.setProjId(sysProjInfo.getId());
             sysBeauticianState.setServicesId(sysProjServices.getId());
-            sysBeauticianState.setShopId(user.getShopId());
+            sysBeauticianState.setShopId(sysProjServices.getShopId());
             sysBeauticianState.setState(Dictionary.BEATUI_STATE_DYY);
             beauticianStateDao.insert(sysBeauticianState);
         }
@@ -384,7 +400,7 @@
 
 
         // 设置成功状态
-        projServices.setState(Dictionary.SERVICE_STATU_YYCG);
+        projServices.setState(Dictionary.SERVICE_STATU_XPL);
         // 判断当前门店是否有历史美疗师
         LastestWorkBeatuistaff lastWorkStaff = new LastestWorkBeatuistaff();
         lastWorkStaff.setShopId(checkProjServices.getShopId());
@@ -559,10 +575,17 @@
         if (!projServices.getState().equals(Dictionary.SERVICE_STATU_FWWC)) {
             throw new GlobleException("该服务单状态为" + projServices.getState() + ",不可以进行当前操作!");
         } else {
-
             projServices.setState(Dictionary.SERVICE_STATU_FFJS);
             projServices.setConsumeTime(new Date());
-            return sysProjServicesDao.update(projServices);
+            int result=sysProjServicesDao.update(projServices);
+            achieveNewService.addAchieveByServiceOrder(projServices);
+
+            //发送微信公众号提醒
+            UniformMsgParam uniformMsgParam=new UniformMsgParam(projServices.getCompanyId(),UniformMsgParam.GZH_FWWC);
+            uniformMsgParam.put("serviceId",projServices.getId());
+            rabiitMqTemplate.sendMsg(MQTaskRouting.SEND_UNIFORM_TEMPLATE_MSG+evn,uniformMsgParam.toJSONString());
+
+            return result;
         }
     }
 
@@ -598,7 +621,7 @@
     @Override
     public int modifyPLProjServices(SysProjServices projServicesVo) throws GlobleException {
         SysProjServices projServices = sysProjServicesDao.selectById(projServicesVo.getId());
-
+        SysUsers sysUsers = WebUtil.getSessionAttribute(MatrixConstance.LOGIN_KEY);
         if (!projServices.getState().equals(Dictionary.SERVICE_STATU_XPL)) {
             throw new GlobleException("该服务单状态为" + projServices.getState() + ",不可以进行当前操作!");
         }
@@ -613,7 +636,7 @@
             if(projServices.getDevisionId()!=null){
                 outStore.setStaffId(projServices.getDevisionId());
             }else{
-                SysUsers sysUsers = WebUtil.getSessionAttribute(MatrixConstance.LOGIN_KEY);
+
                 outStore.setStaffId(sysUsers.getSuId());
             }
             outStore.setServiceId(projServices.getId());
@@ -637,7 +660,7 @@
                     double sum = stores.stream().mapToDouble(item2 -> item2.getStoreTotal()).sum();
                     Double needAmount = MoneyUtil.div(item.getAmount(), Double.valueOf(shoppingGoods.getVolume()));
                     if (sum < needAmount) {
-                        throw new GlobleException("出库失败:【" + shoppingGoods.getName() + "库存不足】");
+                        throw new GlobleException("出库失败:【" + shoppingGoods.getName()+"-"+shoppingGoods.getCode()+  "库存不足】");
                     }
                     //循环获取所有批次产品,并扣减库存
                     for (SysStoreInfo storeInfo : stores) {
@@ -653,8 +676,6 @@
                         sysOutStoreItem.setStoreId(storeInfo.getId());
                         sysOutStoreItem.setAmount(oldStoreTotal - storeInfo.getStoreTotal());
                         realOutStoreItemList.add(sysOutStoreItem);
-
-
                         storeInfoDao.update(storeInfo);
                         //扣除后剩余库存大于0则跳出扣除,否则剩余数量的负数的绝对值就是再次扣减的数量
                         if (surplus > 0) {
@@ -668,30 +689,15 @@
                     LogUtil.debug("未选择配料跳过sku={},amount={}", item.getSkuId(), item.getAmount());
                 }
             }
-
             sysOutStoreItemDao.batchInsert(realOutStoreItemList);
-
         }
-
         // 设置服务单状态
         projServices.setState(Dictionary.SERVICE_STATU_PLWC);
-        // 设置服务单操作流水
-        // TODO 本功能待完善记录最新的排班员工
-	/*	List<LastestWorkBeatuistaff> lastList = LastestWorkBeatuistaffDao.selectByModel(null);
-		LastestWorkBeatuistaff lastWork = new LastestWorkBeatuistaff();
-		if (lastList.size() > 0) {
-			lastWork.setChangeDate(new Date());
-			lastWork.setStaffId(projServices.getBeauticianId());
-			LastestWorkBeatuistaffDao.insert(lastWork);
-		} else {
+        if(projServices.getDevisionId()==null){
+            //如果没有设置配料师则默认为操作配料的人为配料师
+            projServices.setDevisionId(sysUsers.getSuId());
 
-			//TODO 有bug集合为零了
-			LastestWorkBeatuistaff modifyObj = lastList.get(0);
-			modifyObj.setChangeDate(new Date());
-			modifyObj.setStaffId(projServices.getBeauticianId());
-			LastestWorkBeatuistaffDao.update(modifyObj);
-		}*/
-
+        }
         return sysProjServicesDao.update(projServices);
     }
 
@@ -803,4 +809,13 @@
 
     }
 
+    @Override
+    public List<ServiceOrderListVo> findApiServiceOrderListInPage(ServiceOrderListDto serviceOrderListDto, PaginationVO pageVo) {
+        return sysProjServicesDao.selectApiServiceOrderListInPage(serviceOrderListDto, pageVo);
+    }
+
+    @Override
+    public int findApiServiceOrderListTotal(ServiceOrderListDto serviceOrderListDto) {
+        return sysProjServicesDao.selectApiServiceOrderListTotal(serviceOrderListDto);
+    }
 }
diff --git a/zq-erp/src/main/java/com/matrix/system/hive/service/imp/SysProjUseServiceImpl.java b/zq-erp/src/main/java/com/matrix/system/hive/service/imp/SysProjUseServiceImpl.java
index 45f9083..30bd8c9 100644
--- a/zq-erp/src/main/java/com/matrix/system/hive/service/imp/SysProjUseServiceImpl.java
+++ b/zq-erp/src/main/java/com/matrix/system/hive/service/imp/SysProjUseServiceImpl.java
@@ -11,15 +11,12 @@
 import com.matrix.system.hive.bean.*;
 import com.matrix.system.hive.dao.*;
 import com.matrix.system.hive.plugin.util.CollectionUtils;
-import com.matrix.core.tools.DateUtil;
 import com.matrix.system.hive.plugin.util.MoneyUtil;
 import com.matrix.system.hive.service.SysProjUseService;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.stereotype.Service;
 import org.springframework.transaction.annotation.Transactional;
 
-import javax.xml.crypto.Data;
-import java.sql.Timestamp;
 import java.util.ArrayList;
 import java.util.Date;
 import java.util.List;
@@ -63,6 +60,9 @@
 
     @Override
     public int modify(SysProjUse sysProjUse) {
+        //插入套餐项目操作记录
+
+
 
         return sysProjUseDao.update(sysProjUse);
 
@@ -404,23 +404,7 @@
         return i;
     }
 
-    /**
-     * cardUser暂时没有用到
-     */
-    @Override
-    @Transactional(rollbackFor = Exception.class)
-    public int returnMoneyTc(SysProjUse sysProjUse, MoneyCardUse cardUse, Long moneyCardUseId) {
-        //充值记录
-        //SysRechargeFlow flow=new SysRechargeFlow();
 
-        // 计算出套餐所有项目的剩余次数的钱
-        getTotalMoney(sysProjUse, cardUse, moneyCardUseId);
-        //3、套餐下的项目状态改为退款
-        sysProjUse.setStatus(Dictionary.TAOCAN_STATUS_TK);
-        int j = sysProjUseDao.updateProjStatus(sysProjUse);
-
-        return j;
-    }
 
 
     /*********************以下为项目使用情况操作***********************/
@@ -550,49 +534,7 @@
     }
 
 
-    /**
-     * 退款
-     *
-     * @param sysProjUse
-     * @return
-     */
-    public int returnMoneyProj(SysProjUse sysProjUse, MoneyCardUse cardUse, Long moneyCardUseId) {
-        int i = 0;
-        sysProjUse = sysProjUseDao.selectById(sysProjUse.getId());
-        //判断套餐是否存在欠款
-        checkOrderStatu(sysProjUse);
-        if (!(sysProjUse.getStatus().equals(Dictionary.TAOCAN_STATUS_YX))) {
-            throw new GlobleException("不是有效项目");
-        }
-        if (sysProjUse.getSource().equals(Dictionary.TAOCAN_SOURCE_ZR)) {
-            throw new GlobleException("转让的项目不能退款");
-        }
-        if (sysProjUse.getSource().equals(Dictionary.TAOCAN_SOURCE_ZS)) {
-            throw new GlobleException("赠送的项目不能退款");
-        }
-        StringBuilder content = new StringBuilder();
-        ShoppingGoodsAssemble shoppingGoodsAssemble = shoppingGoodsAssembleDao.selectById(sysProjUse.getAssembleId());
-        ShoppingGoods shoppingGoods = shoppingGoodsDao.selectById(shoppingGoodsAssemble.getShoppingGoodsId());
-        content.append(shoppingGoods + "退款");
-        if (cardUse != null) {
-            // 1、金额退到该用户的有效会籍卡中
-            MoneyCardUse upCard = moneyCardUseDao.selectById(cardUse.getId());
-            upCard.setRealMoney(upCard.getRealMoney() + sysProjUse.getBalance());
-            ;
-            moneyCardUseDao.update(upCard);
 
-            content.append("到会籍卡(" + upCard.getCardName() + ")" + sysProjUse.getBalance() + "元")
-                    .append(",余次:" + upCard.getLastCountName())
-                    .append(",本金余额:" + upCard.getRealMoney())
-                    .append(",有效期:" + DateUtil.dateToString(upCard.getFailTime(), DateUtil.DATE_FORMAT_MM))
-                    .append(",是否赠送:" + upCard.getSourceName());
-        } else {
-            content.append("现金" + sysProjUse.getBalance() + "元");
-        }
-
-        sysProjUse.setStatus(Dictionary.TAOCAN_STATUS_TK);
-        return sysProjUseDao.update(sysProjUse);
-    }
 
     /**
      * 设置为有效套餐
@@ -643,25 +585,6 @@
         return new AjaxResult(AjaxResult.STATUS_SUCCESS, "操作成功");
     }
 
-    /**
-     * 退款项目
-     */
-    @Override
-    public double getTotalMoneyProj(SysProjUse sysProjUse) {
-        sysProjUse = sysProjUseDao.selectById(sysProjUse.getId());
-        //判断套餐是否存在欠款
-        checkOrderStatu(sysProjUse);
-        if (!(sysProjUse.getStatus().equals(Dictionary.TAOCAN_STATUS_YX))) {
-            throw new GlobleException("不是有效项目");
-        }
-        if (sysProjUse.getSource().equals(Dictionary.TAOCAN_SOURCE_ZR)) {
-            throw new GlobleException("转让的项目不能退款");
-        }
-        if (sysProjUse.getSource().contains(Dictionary.TAOCAN_SOURCE_ZS)) {
-            throw new GlobleException("赠送的项目不能退款");
-        }
-        return sysProjUse.getBalance();
-    }
 
 
     @Override
@@ -670,9 +593,10 @@
     }
 
     @Override
-    public List<SysProjUse> selectTaocanProjUse(Long taocanId) {
+    public List<SysProjUse> selectTaocanProjUse(Long taocanId, String status) {
         SysProjUse projUse = new SysProjUse();
         projUse.setTaocanId(taocanId);
+        projUse.setStatus(status);
         return sysProjUseDao.selectByModel(projUse);
     }
 }
\ No newline at end of file
diff --git a/zq-erp/src/main/java/com/matrix/system/hive/service/imp/SysVipInfoServiceImpl.java b/zq-erp/src/main/java/com/matrix/system/hive/service/imp/SysVipInfoServiceImpl.java
index d057117..922b7d9 100644
--- a/zq-erp/src/main/java/com/matrix/system/hive/service/imp/SysVipInfoServiceImpl.java
+++ b/zq-erp/src/main/java/com/matrix/system/hive/service/imp/SysVipInfoServiceImpl.java
@@ -6,22 +6,24 @@
 import com.matrix.core.tools.*;
 import com.matrix.core.tools.excl.ExcelSheetPO;
 import com.matrix.core.tools.excl.ExcelUtil;
+import com.matrix.system.app.dto.AddVipDto;
+import com.matrix.system.app.dto.ModifyVipDto;
+import com.matrix.system.app.dto.VipInfoListDto;
+import com.matrix.system.app.vo.VipInfoDetailVo;
+import com.matrix.system.app.vo.VipInfoListVo;
 import com.matrix.system.common.bean.SysUsers;
+import com.matrix.system.common.tools.DataAuthUtil;
 import com.matrix.system.common.tools.ServiceUtil;
 import com.matrix.system.constance.Dictionary;
 import com.matrix.system.constance.TableMapping;
-import com.matrix.system.hive.bean.MoneyCardUse;
-import com.matrix.system.hive.bean.MyBeatician;
-import com.matrix.system.hive.bean.SysVipInfo;
-import com.matrix.system.hive.bean.VipAnswer;
-import com.matrix.system.hive.dao.MoneyCardUseDao;
-import com.matrix.system.hive.dao.MyBeaticianDao;
-import com.matrix.system.hive.dao.SysVipInfoDao;
-import com.matrix.system.hive.dao.VipAnswerDao;
+import com.matrix.system.hive.action.util.QueryUtil;
+import com.matrix.system.hive.bean.*;
+import com.matrix.system.hive.dao.*;
 import com.matrix.system.hive.plugin.util.CollectionUtils;
 import com.matrix.system.hive.pojo.VipInfoVo;
 import com.matrix.system.hive.service.SysVipInfoService;
 import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.beans.factory.annotation.Value;
 import org.springframework.stereotype.Service;
 import org.springframework.transaction.annotation.Transactional;
 
@@ -29,9 +31,7 @@
 import java.io.IOException;
 import java.io.UnsupportedEncodingException;
 import java.security.NoSuchAlgorithmException;
-import java.util.ArrayList;
-import java.util.Date;
-import java.util.List;
+import java.util.*;
 
 
 /**
@@ -57,13 +57,24 @@
 	@Autowired
 	private MoneyCardUseDao moneyCardUseDao;
 
+	@Autowired
+	private SysVipLabelDao sysVipLabelDao;
+
+	@Value("${default.vip.photo.woman}")
+	String defaultWoman;
+
+	@Value("${default.vip.photo.man}")
+	String defaultMan;
+
+
+
 	/**
 	 * 新增会员储值卡
 	 * @param vipId
 	 * @return
 	 */
 	@Override
-	public  int addVipDefaultCard(Long vipId){
+	public MoneyCardUse addVipDefaultCard(Long vipId){
 		MoneyCardUse defaultCardUse=new MoneyCardUse();
 		defaultCardUse.setVipId(vipId);
 		defaultCardUse.setCardName("储值卡");
@@ -72,7 +83,8 @@
 		defaultCardUse.setGiftMoney(0D);
 		defaultCardUse.setSource("-");
 		defaultCardUse.setStatus(Dictionary.MONEYCARD_STATUS_YX);
-		return  moneyCardUseDao.insert(defaultCardUse);
+		moneyCardUseDao.insert(defaultCardUse);
+		return  defaultCardUse;
 
 	}
 
@@ -103,6 +115,11 @@
 		sysVipInfo.setPointAll(0);
 		sysVipInfo.setIsDeal(SysVipInfo.UNDEAL_VIP);
 		sysVipInfo.setZjm(StringUtils.toHanyuPinyin(sysVipInfo.getVipName())+","+StringUtils.toHeadWordHanyuPinyin(sysVipInfo.getVipName()));
+		if(sysVipInfo.getSex().equals(Dictionary.SEX_MAN)){
+			sysVipInfo.setPhoto(defaultMan);
+		}else{
+			sysVipInfo.setPhoto(defaultWoman);
+		}
 		int i=sysVipInfoDao.insert(sysVipInfo);
 		modifyVipWithOtherInfo(sysVipInfo);
 		//创建用户默认储值卡
@@ -196,8 +213,7 @@
 
 	@Override
 	public List<SysVipInfo> findByVipNoOrTel(String key) {
-		SysUsers users = WebUtil.getSessionAttribute(MatrixConstance.LOGIN_KEY);
-		return sysVipInfoDao.selectByVipNoOrTel(key, users.getShopId());
+		return sysVipInfoDao.selectByVipNoOrTel(key);
 
 	}
 
@@ -278,8 +294,8 @@
 
 	@Override
 	public List<SysVipInfo> findUserByKey(String keyWord) {
-		SysUsers users = WebUtil.getSessionAttribute(MatrixConstance.LOGIN_KEY);
-		return sysVipInfoDao.selectUserByKey(keyWord, users.getShopId());
+		SysUsers user = WebUtil.getSessionAttribute(MatrixConstance.LOGIN_KEY);
+		return sysVipInfoDao.selectUserByKey(keyWord,user.getCompanyId());
 	}
 	
 
@@ -335,6 +351,11 @@
 		SysUsers users = (SysUsers) WebUtil.getSession().getAttribute(MatrixConstance.LOGIN_KEY);
 		sysVipInfo.setCompanyId(users.getCompanyId());
 		sysVipInfo.setShopId(users.getShopId());
+		if(sysVipInfo.getSex().equals(Dictionary.SEX_MAN)){
+			sysVipInfo.setPhoto(defaultMan);
+		}else{
+			sysVipInfo.setPhoto(defaultWoman);
+		}
 		int i=sysVipInfoDao.insert(sysVipInfo);
 		modifyVipWithOtherInfo(sysVipInfo);
 		return i;
@@ -417,5 +438,174 @@
 		return result;
 	}
 
+	@Override
+	public List<VipInfoListVo> findVipAddressBook(VipInfoListDto vipInfoListDto) {
+		SysUsers sysUsers = WebUtil.getSessionAttribute(MatrixConstance.LOGIN_KEY);
+		if (!DataAuthUtil.hasAllShopAuth()) {
+			vipInfoListDto.setShopId(sysUsers.getShopId());
+		}
+		QueryUtil.setQueryLimitCom(vipInfoListDto);
+		return sysVipInfoDao.selectVipAddressBookByList(vipInfoListDto);
+	}
 
+	@Override
+	public com.matrix.system.app.vo.VipInfoVo findApiVipInfoById(Long id) {
+		return sysVipInfoDao.selectVipInfoById(id);
+	}
+
+	@Override
+	public int apiAddVip(AddVipDto addVipDto) {
+		SysUsers user = WebUtil.getSessionAttribute(MatrixConstance.LOGIN_KEY);
+
+		if (StringUtils.isNotBlank(addVipDto.getVipNo())) {
+			if (serviceUtil.addCheckRepeatTowColumn(TableMapping.SYS_VIP_INFO, "VIP_NO", addVipDto.getVipNo(),
+					"company_id", user.getCompanyId())) {
+				throw new GlobleException("编号已存在!");
+			}
+		}
+
+		if (serviceUtil.addCheckRepeatTowColumn(TableMapping.SYS_VIP_INFO, "PHONE", addVipDto.getPhone(),
+				"company_id",user.getCompanyId() )) {
+			throw new GlobleException("手机已被注册!");
+		}
+
+		SysVipInfo vipInfo = new SysVipInfo();
+
+		vipInfo.setPhoto(addVipDto.getPhoto());
+		vipInfo.setVipName(addVipDto.getVipName());
+		vipInfo.setVipNo(addVipDto.getVipNo());
+		vipInfo.setSex(addVipDto.getSex());
+		vipInfo.setArrivalWay(addVipDto.getArrivalWay());
+		vipInfo.setPhone(addVipDto.getPhone());
+		vipInfo.setAddr(addVipDto.getAddress());
+		vipInfo.setRemark(addVipDto.getRemark());
+		vipInfo.setBirthday1(addVipDto.getBirthday());
+		vipInfo.setPassWord(addVipDto.getPassword());
+		vipInfo.setRecommendId(addVipDto.getRecommendId());
+
+		if (StringUtils.isNotBlank(addVipDto.getAreas())) {
+			String[] areas = addVipDto.getAreas().split("-");
+			vipInfo.setProvince(areas[0]);
+			vipInfo.setCity(areas[1]);
+			vipInfo.setArea(areas[2]);
+		}
+
+		vipInfo.setInDate(new Date());
+		vipInfo.setPointAll(0);
+		vipInfo.setVipState(Dictionary.VIP_STATE_HY);
+		vipInfo.setStaffId(user.getSuId());
+		vipInfo.setShopId(user.getShopId());
+		vipInfo.setVipType(Dictionary.VIP_TYPE_NOCARD);
+		vipInfo.setShopId(user.getShopId());
+		vipInfo.setCompanyId(user.getCompanyId());
+		vipInfo.setCreateTime(new Date());
+		vipInfo.setPointAll(0);
+		vipInfo.setIsDeal(SysVipInfo.UNDEAL_VIP);
+		vipInfo.setZjm(StringUtils.toHanyuPinyin(vipInfo.getVipName())+","+StringUtils.toHeadWordHanyuPinyin(vipInfo.getVipName()));
+		if(vipInfo.getSex().equals(Dictionary.SEX_MAN)){
+			vipInfo.setPhoto(defaultMan);
+		}else{
+			vipInfo.setPhoto(defaultWoman);
+		}
+		int i=sysVipInfoDao.insert(vipInfo);
+
+		if (CollectionUtils.isNotEmpty(addVipDto.getLabels())) {
+			batchInsertLabel(addVipDto.getLabels(), vipInfo.getId());
+		}
+
+		//创建用户默认储值卡
+		addVipDefaultCard(vipInfo.getId());
+		return i;
+	}
+
+	@Override
+	public int apiModifyVip(ModifyVipDto modifyVipDto) {
+		SysUsers user = WebUtil.getSessionAttribute(MatrixConstance.LOGIN_KEY);
+
+		SysVipInfo vipInfo = sysVipInfoDao.selectById(modifyVipDto.getVipId());
+		if (vipInfo == null) {
+			throw new GlobleException("用户不存在");
+		}
+
+		if (StringUtils.isNotBlank(modifyVipDto.getVipNo())) {
+			if (!modifyVipDto.getVipNo().equals(vipInfo.getVipNo())) {
+				if (serviceUtil.addCheckRepeatTowColumn(TableMapping.SYS_VIP_INFO, "VIP_NO", modifyVipDto.getVipNo(),
+						"company_id", user.getCompanyId())) {
+					throw new GlobleException("编号已存在!");
+				}
+			}
+		}
+
+		if (!vipInfo.getPhone().equals(modifyVipDto.getPhone())) {
+			if (serviceUtil.addCheckRepeatTowColumn(TableMapping.SYS_VIP_INFO, "PHONE", modifyVipDto.getPhone(),
+					"company_id", user.getCompanyId())) {
+				throw new GlobleException("手机已被注册!");
+			}
+		}
+
+		if (StringUtils.isNotBlank(modifyVipDto.getAreas())) {
+			String[] areas = modifyVipDto.getAreas().split("-");
+			vipInfo.setProvince(areas[0]);
+			vipInfo.setCity(areas[1]);
+			vipInfo.setArea(areas[2]);
+		}
+
+		vipInfo.setVipName(modifyVipDto.getVipName());
+		vipInfo.setSex(modifyVipDto.getSex());
+		vipInfo.setArrivalWay(modifyVipDto.getArrivalWay());
+		vipInfo.setPhone(modifyVipDto.getPhone());
+		vipInfo.setAddr(modifyVipDto.getAddress());
+		vipInfo.setRemark(modifyVipDto.getRemark());
+		vipInfo.setPassWord(modifyVipDto.getPassword());
+		vipInfo.setBirthday1(modifyVipDto.getBirthday());
+		vipInfo.setRecommendId(modifyVipDto.getRecommendId());
+		vipInfo.setPhoto(modifyVipDto.getPhoto());
+		int i = sysVipInfoDao.update(vipInfo);
+
+		if (CollectionUtils.isNotEmpty(modifyVipDto.getLabels())) {
+			sysVipLabelDao.deleteRelateByVipId(modifyVipDto.getVipId());
+			batchInsertLabel(modifyVipDto.getLabels(), vipInfo.getId());
+		}
+		return i;
+	}
+
+	private void batchInsertLabel(List<String> labelList, Long id) {
+		Set<String> labels = new HashSet<>(labelList);
+		Iterator<String> iterator = labels.iterator();
+		while (iterator.hasNext()) {
+			SysVipLabelRelate relate = new SysVipLabelRelate();
+			relate.setLabelId(Long.parseLong(iterator.next()));
+			relate.setVipId(id);
+			sysVipLabelDao.insertRelate(relate);
+		}
+	}
+
+	@Override
+	public VipInfoDetailVo findVipInfoDetail(Long id) {
+		SysVipInfo sysVipInfo = sysVipInfoDao.selectById(id);
+		if (sysVipInfo == null) {
+			throw new GlobleException("用户不存在");
+		}
+
+		VipInfoDetailVo vipInfoDetailVo = new VipInfoDetailVo();
+		vipInfoDetailVo.setVipName(sysVipInfo.getVipName());
+		vipInfoDetailVo.setAddress(sysVipInfo.getAddr());
+		vipInfoDetailVo.setPhone(sysVipInfo.getPhone());
+		vipInfoDetailVo.setSex(sysVipInfo.getSex());
+		vipInfoDetailVo.setArrivalWay(sysVipInfo.getArrivalWay());
+		vipInfoDetailVo.setRecommendId(sysVipInfo.getRecommendId());
+		vipInfoDetailVo.setId(sysVipInfo.getId());
+		vipInfoDetailVo.setProvince(sysVipInfo.getProvince());
+		vipInfoDetailVo.setCity(sysVipInfo.getCity());
+		vipInfoDetailVo.setArea(sysVipInfo.getArea());
+		vipInfoDetailVo.setRemark(sysVipInfo.getRemark());
+		vipInfoDetailVo.setBirthday(sysVipInfo.getBirthday1());
+		vipInfoDetailVo.setPassword(sysVipInfo.getPassWord());
+		vipInfoDetailVo.setPhoto(sysVipInfo.getPhoto());
+		vipInfoDetailVo.setVipNo(sysVipInfo.getVipNo());
+
+		List<SysVipLabel> labels = sysVipLabelDao.selectByVipId(sysVipInfo.getId());
+		vipInfoDetailVo.setLabels(labels);
+		return vipInfoDetailVo;
+	}
 }
\ No newline at end of file
diff --git a/zq-erp/src/main/java/com/matrix/system/hive/statistics/AchieveAction.java b/zq-erp/src/main/java/com/matrix/system/hive/statistics/AchieveAction.java
index 2d8435e..7f452ad 100644
--- a/zq-erp/src/main/java/com/matrix/system/hive/statistics/AchieveAction.java
+++ b/zq-erp/src/main/java/com/matrix/system/hive/statistics/AchieveAction.java
@@ -12,9 +12,15 @@
 import com.matrix.system.common.tools.ResponseHeadUtil;
 import com.matrix.system.hive.action.util.QueryUtil;
 import com.matrix.system.hive.bean.AchieveNew;
+import com.matrix.system.hive.bean.SysOrder;
+import com.matrix.system.hive.bean.SysOrderItem;
 import com.matrix.system.hive.service.AchieveNewService;
+import com.matrix.system.hive.service.SysOrderItemService;
+import com.matrix.system.hive.service.SysOrderService;
+import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.stereotype.Controller;
 import org.springframework.ui.ModelMap;
+import org.springframework.web.bind.annotation.RequestBody;
 import org.springframework.web.bind.annotation.RequestMapping;
 import org.springframework.web.bind.annotation.ResponseBody;
 
@@ -37,6 +43,11 @@
     @Resource
     private AchieveNewService achieveNewService;
 
+    @Autowired
+    private SysOrderService sysOrderService;
+
+    @Autowired
+    private SysOrderItemService sysOrderItemService;
 
     /**
      * 门店每日单据明细表
@@ -126,6 +137,40 @@
         com.matrix.core.tools.excl.ExcelUtil.createWorkbookAtOutStream(ExcelVersion.V2007, res, os, true);
     }
 
+    @RequestMapping(value = "/del")
+    @ResponseBody
+    public AjaxResult del(Long id) {
+        int i = achieveNewService.removeById(id);
+        if (i > 0) {
+            return AjaxResult.buildSuccessInstance("删除成功");
+        }
+        return AjaxResult.buildFailInstance("删除失败");
+    }
+
+    @RequestMapping(value = "/add")
+    @ResponseBody
+    public AjaxResult add(@RequestBody List<AchieveNew> list) {
+        SysOrder order = sysOrderService.findById(list.get(0).getOrderId());
+        List<SysOrderItem> orderItems = sysOrderItemService.findByOrderId(order.getId());
+        orderItems.forEach(item -> {
+            List<AchieveNew> achieveNewList = new ArrayList<>();
+            for(AchieveNew achieveNew : list) {
+                achieveNewService.removeById(achieveNew.getId());
+                achieveNew.setId(null);
+                achieveNew.setConsume(null);
+                achieveNew.setCardCash(null);
+
+                if (achieveNew.getOrderItemId().equals(item.getId())) {
+                    achieveNewList.add(achieveNew);
+                }
+
+            }
+            item.setAchaeveList(achieveNewList);
+        });
+        order.setItems(orderItems);
+        achieveNewService.addAchaeveByOrder(order);
+        return AjaxResult.buildSuccessInstance("保存成功");
+    }
 
 }
 
diff --git a/zq-erp/src/main/java/com/matrix/system/hive/statistics/DailySaleVo.java b/zq-erp/src/main/java/com/matrix/system/hive/statistics/DailySaleVo.java
new file mode 100644
index 0000000..dabb87f
--- /dev/null
+++ b/zq-erp/src/main/java/com/matrix/system/hive/statistics/DailySaleVo.java
@@ -0,0 +1,412 @@
+package com.matrix.system.hive.statistics;
+
+import com.matrix.core.anotations.Extend;
+import com.matrix.core.tools.DateUtil;
+import io.swagger.annotations.ApiModelProperty;
+import org.springframework.format.annotation.DateTimeFormat;
+
+import java.math.BigDecimal;
+import java.util.Date;
+
+/**
+ * @author wzy
+ * @date 2021-01-15
+ **/
+public class DailySaleVo {
+
+    private String dataTime;
+
+    private String shopName;
+
+    private BigDecimal shouldPay;
+
+    private BigDecimal totalPay;
+
+    private BigDecimal cashPay;
+
+    private BigDecimal cardPay;
+
+    private BigDecimal arrearsPay;
+
+    private BigDecimal refundCashPay;
+
+    private BigDecimal refundCardPay;
+
+    private BigDecimal productAchieve;
+
+    private BigDecimal cardAchieve;
+
+    private BigDecimal refund;
+
+    private BigDecimal perCustomCnt;
+
+    private BigDecimal customGoodsCnt;
+
+    private BigDecimal perCustomPrice;
+
+    private BigDecimal cost;
+
+    private BigDecimal grossProfit;
+
+    private BigDecimal grossProfitRate;
+
+    private BigDecimal consumePay;
+
+    private BigDecimal freeConsumePay;
+
+    private BigDecimal peopleCnt;
+
+    private BigDecimal projConsumeCnt;
+
+    private BigDecimal timeLength;
+
+    /**
+     * 当天销售总数量
+     */
+    private Integer totalSaleCnt;
+
+    /**
+     * 家居产品成本
+     */
+    private BigDecimal goodsCost;
+
+    /**
+     * 除家具产品以外成本
+     */
+    private BigDecimal otherCost;
+
+    private BigDecimal wechat;
+
+    private BigDecimal alipay;
+
+    private BigDecimal cash;
+
+    private BigDecimal bankCard;
+
+    private BigDecimal tuan;
+
+    private BigDecimal cardBj;
+
+    private BigDecimal cardFree;
+
+    private BigDecimal arrears;
+
+    @Extend
+    @DateTimeFormat(pattern = DateUtil.DATE_FORMAT_DD)
+
+    private Date beginTime;
+
+    @Extend
+    @DateTimeFormat(pattern = DateUtil.DATE_FORMAT_DD)
+    private Date endTime;
+
+    private Long shopId;
+
+    public BigDecimal getShouldPay() {
+        return shouldPay;
+    }
+
+    public void setShouldPay(BigDecimal shouldPay) {
+        this.shouldPay = shouldPay;
+    }
+
+    public BigDecimal getWechat() {
+        return wechat;
+    }
+
+    public void setWechat(BigDecimal wechat) {
+        this.wechat = wechat;
+    }
+
+    public BigDecimal getAlipay() {
+        return alipay;
+    }
+
+    public void setAlipay(BigDecimal alipay) {
+        this.alipay = alipay;
+    }
+
+    public BigDecimal getCash() {
+        return cash;
+    }
+
+    public void setCash(BigDecimal cash) {
+        this.cash = cash;
+    }
+
+    public BigDecimal getBankCard() {
+        return bankCard;
+    }
+
+    public void setBankCard(BigDecimal bankCard) {
+        this.bankCard = bankCard;
+    }
+
+    public BigDecimal getTuan() {
+        return tuan;
+    }
+
+    public void setTuan(BigDecimal tuan) {
+        this.tuan = tuan;
+    }
+
+    public BigDecimal getCardBj() {
+        return cardBj;
+    }
+
+    public void setCardBj(BigDecimal cardBj) {
+        this.cardBj = cardBj;
+    }
+
+    public BigDecimal getCardFree() {
+        return cardFree;
+    }
+
+    public void setCardFree(BigDecimal cardFree) {
+        this.cardFree = cardFree;
+    }
+
+    public BigDecimal getArrears() {
+        return arrears;
+    }
+
+    public void setArrears(BigDecimal arrears) {
+        this.arrears = arrears;
+    }
+
+    public String getShopName() {
+        return shopName;
+    }
+
+    public void setShopName(String shopName) {
+        this.shopName = shopName;
+    }
+
+    public Date getBeginTime() {
+        return beginTime;
+    }
+
+    public void setBeginTime(Date beginTime) {
+        this.beginTime = beginTime;
+    }
+
+    public Date getEndTime() {
+        return endTime;
+    }
+
+    public void setEndTime(Date endTime) {
+        this.endTime = endTime;
+    }
+
+    public Long getShopId() {
+        return shopId;
+    }
+
+    public void setShopId(Long shopId) {
+        this.shopId = shopId;
+    }
+
+    public Integer getTotalSaleCnt() {
+        return totalSaleCnt;
+    }
+
+    public void setTotalSaleCnt(Integer totalSaleCnt) {
+        this.totalSaleCnt = totalSaleCnt;
+    }
+
+    public BigDecimal getGoodsCost() {
+        return goodsCost;
+    }
+
+    public void setGoodsCost(BigDecimal goodsCost) {
+        this.goodsCost = goodsCost;
+    }
+
+    public BigDecimal getOtherCost() {
+        return otherCost;
+    }
+
+    public void setOtherCost(BigDecimal otherCost) {
+        this.otherCost = otherCost;
+    }
+
+    public String getDataTime() {
+        return DateUtil.dateToString(DateUtil.stringToDate(dataTime, DateUtil.DATE_FORMAT_DD),DateUtil.DATE_FORMAT_DD);
+    }
+
+    public void setDataTime(String dataTime) {
+        this.dataTime = dataTime;
+    }
+
+    public BigDecimal getTotalPay() {
+        return totalPay;
+    }
+
+    public void setTotalPay(BigDecimal totalPay) {
+        this.totalPay = totalPay;
+    }
+
+    public BigDecimal getCashPay() {
+        return cashPay;
+    }
+
+    public void setCashPay(BigDecimal cashPay) {
+        this.cashPay = cashPay;
+    }
+
+    public BigDecimal getCardPay() {
+        return cardPay;
+    }
+
+    public void setCardPay(BigDecimal cardPay) {
+        this.cardPay = cardPay;
+    }
+
+    public BigDecimal getArrearsPay() {
+        return arrearsPay;
+    }
+
+    public void setArrearsPay(BigDecimal arrearsPay) {
+        this.arrearsPay = arrearsPay;
+    }
+
+    public BigDecimal getFreeConsumePay() {
+        return freeConsumePay;
+    }
+
+    public void setFreeConsumePay(BigDecimal freeConsumePay) {
+        this.freeConsumePay = freeConsumePay;
+    }
+
+    public BigDecimal getConsumePay() {
+        return consumePay;
+    }
+
+    public void setConsumePay(BigDecimal consumePay) {
+        this.consumePay = consumePay;
+    }
+
+    public BigDecimal getRefundCashPay() {
+        return refundCashPay;
+    }
+
+    public void setRefundCashPay(BigDecimal refundCashPay) {
+        this.refundCashPay = refundCashPay;
+    }
+
+    public BigDecimal getRefundCardPay() {
+        return refundCardPay;
+    }
+
+    public void setRefundCardPay(BigDecimal refundCardPay) {
+        this.refundCardPay = refundCardPay;
+    }
+
+    public BigDecimal getProductAchieve() {
+        return productAchieve;
+    }
+
+    public void setProductAchieve(BigDecimal productAchieve) {
+        this.productAchieve = productAchieve;
+    }
+
+    public BigDecimal getCardAchieve() {
+        return cardAchieve;
+    }
+
+    public void setCardAchieve(BigDecimal cardAchieve) {
+        this.cardAchieve = cardAchieve;
+    }
+
+    public BigDecimal getRefund() {
+        return refund;
+    }
+
+    public void setRefund(BigDecimal refund) {
+        this.refund = refund;
+    }
+
+    public BigDecimal getPerCustomCnt() {
+        return perCustomCnt;
+    }
+
+    public void setPerCustomCnt(BigDecimal perCustomCnt) {
+        this.perCustomCnt = perCustomCnt;
+    }
+
+    public BigDecimal getCustomGoodsCnt() {
+        if (BigDecimal.ZERO.compareTo(perCustomCnt) != 0) {
+            return new BigDecimal(totalSaleCnt).divide(perCustomCnt, 2, BigDecimal.ROUND_DOWN);
+        } else {
+            return BigDecimal.ZERO;
+        }
+    }
+
+    public void setCustomGoodsCnt(BigDecimal customGoodsCnt) {
+        this.customGoodsCnt = customGoodsCnt;
+    }
+
+    public BigDecimal getPerCustomPrice() {
+        if (perCustomCnt.compareTo(BigDecimal.ZERO) != 0) {
+            return totalPay.divide(perCustomCnt, 2, BigDecimal.ROUND_DOWN);
+        } else {
+            return BigDecimal.ZERO;
+        }
+    }
+
+    public void setPerCustomPrice(BigDecimal perCustomPrice) {
+        this.perCustomPrice = perCustomPrice;
+    }
+
+    public BigDecimal getCost() {
+        return goodsCost.add(otherCost);
+    }
+
+    public void setCost(BigDecimal cost) {
+        this.cost = cost;
+    }
+
+    public BigDecimal getGrossProfit() {
+        return totalPay.subtract(getCost());
+    }
+
+    public void setGrossProfit(BigDecimal grossProfit) {
+        this.grossProfit = grossProfit;
+    }
+
+    public BigDecimal getGrossProfitRate() {
+        if (totalPay.compareTo(BigDecimal.ZERO) != 0) {
+            return getGrossProfit().divide(totalPay, 2, BigDecimal.ROUND_DOWN);
+        } else {
+            return BigDecimal.ZERO;
+        }
+    }
+
+    public void setGrossProfitRate(BigDecimal grossProfitRate) {
+        this.grossProfitRate = grossProfitRate;
+    }
+
+    public BigDecimal getPeopleCnt() {
+        return peopleCnt;
+    }
+
+    public void setPeopleCnt(BigDecimal peopleCnt) {
+        this.peopleCnt = peopleCnt;
+    }
+
+    public BigDecimal getProjConsumeCnt() {
+        return projConsumeCnt;
+    }
+
+    public void setProjConsumeCnt(BigDecimal projConsumeCnt) {
+        this.projConsumeCnt = projConsumeCnt;
+    }
+
+    public BigDecimal getTimeLength() {
+        return timeLength;
+    }
+
+    public void setTimeLength(BigDecimal timeLength) {
+        this.timeLength = timeLength;
+    }
+}
diff --git a/zq-erp/src/main/java/com/matrix/system/hive/statistics/OrderFlowAction.java b/zq-erp/src/main/java/com/matrix/system/hive/statistics/OrderFlowAction.java
new file mode 100644
index 0000000..a3ad197
--- /dev/null
+++ b/zq-erp/src/main/java/com/matrix/system/hive/statistics/OrderFlowAction.java
@@ -0,0 +1,137 @@
+package com.matrix.system.hive.statistics;
+
+import com.matrix.core.pojo.AjaxResult;
+import com.matrix.core.tools.DateUtil;
+import com.matrix.core.tools.LogUtil;
+import com.matrix.core.tools.StringUtils;
+import com.matrix.core.tools.excl.ExcelSheetPO;
+import com.matrix.core.tools.excl.ExcelUtil;
+import com.matrix.core.tools.excl.ExcelVersion;
+import com.matrix.system.common.tools.DataAuthUtil;
+import com.matrix.system.hive.action.util.QueryUtil;
+import com.matrix.system.hive.dao.SysOrderFlowDao;
+import com.matrix.system.hive.dto.OrderFlowListDto;
+import com.matrix.system.hive.vo.OrderFlowVo;
+import io.swagger.annotations.Api;
+import io.swagger.annotations.ApiOperation;
+import io.swagger.annotations.ApiResponse;
+import io.swagger.annotations.ApiResponses;
+import org.springframework.web.bind.annotation.*;
+
+import javax.annotation.Resource;
+import javax.servlet.http.HttpServletResponse;
+import java.io.IOException;
+import java.io.OutputStream;
+import java.text.SimpleDateFormat;
+import java.util.ArrayList;
+import java.util.Date;
+import java.util.List;
+
+/**
+ * 交易流水统计
+ */
+@CrossOrigin(origins = "*")
+@Api(value = "OrderFlowAction", tags = "交易流水")
+@RestController
+@RequestMapping(value = "/admin/orderFlow")
+public class OrderFlowAction {
+
+    @Resource
+    private SysOrderFlowDao orderFlowDao;
+    /**
+     * 交易流水查询
+     */
+
+    @ApiOperation(value = "查询交易流水")
+    @ApiResponses({
+            @ApiResponse(code = 200, message = "OK",  response = OrderFlowListDto.class)
+    })
+    @PostMapping(value = "/findOrderFlow")
+    public @ResponseBody
+    AjaxResult findOrderFlow(@RequestBody OrderFlowListDto orderFlowListDto) {
+        if(StringUtils.isBlank(orderFlowListDto.getSort())){
+            orderFlowListDto.setSort("createTime");
+            orderFlowListDto.setOrder("desc");
+        }
+        if (!DataAuthUtil.hasAllShopAuth()) {
+            QueryUtil.setQueryLimit(orderFlowListDto);
+        } else {
+            QueryUtil.setQueryLimitCom(orderFlowListDto);
+        }
+        List<OrderFlowVo> rows = orderFlowDao.selectInPage(orderFlowListDto);
+        Integer total = orderFlowDao.selectTotal(orderFlowListDto);
+        AjaxResult result = AjaxResult.buildSuccessInstance(rows, total);
+        return result;
+    }
+
+    /**
+     * 导出Excel
+     */
+    @GetMapping(value = "/exportOrderFlowExcel")
+    public void exportOrderFlowExcel(OrderFlowListDto orderFlowListDto, HttpServletResponse res) {
+        OutputStream os = null;
+        try {
+            if (!DataAuthUtil.hasAllShopAuth()) {
+                QueryUtil.setQueryLimit(orderFlowListDto);
+            } else {
+                QueryUtil.setQueryLimitCom(orderFlowListDto);
+            }
+            orderFlowListDto.setLimit(null);
+            List<OrderFlowVo> rows = orderFlowDao.selectInPage(orderFlowListDto);
+            res.setCharacterEncoding("UTF-8");
+            res.setHeader("content-type", "application/octet-stream;charset=UTF-8");
+            res.setContentType("application/octet-stream;charset=UTF-8");
+
+            Date date = new Date();
+            SimpleDateFormat dateFormat = new SimpleDateFormat("yyyy年MM月dd日HH时mm分ss");
+            res.setHeader("Content-Disposition", "attachment;filename=" +
+                    java.net.URLEncoder.encode("交易流水" + dateFormat.format(date) + ".xlsx".trim(), "UTF-8"));
+            os = res.getOutputStream();
+            ExcelUtil.createWorkbookAtOutStream(ExcelVersion.V2007, disPoseExcelData(rows), os, true);
+        } catch (Exception e) {
+            LogUtil.error("交易流水导出异常", e);
+        } finally {
+            if (os != null) {
+                try {
+                    os.close();
+                } catch (IOException e) {
+                    LogUtil.error("关闭资源异常", e);
+                }
+            }
+        }
+    }
+
+    private List<ExcelSheetPO> disPoseExcelData(List<OrderFlowVo> orderFlowVos) {
+        List<ExcelSheetPO> res = new ArrayList<>();
+        ExcelSheetPO orderSheet = new ExcelSheetPO();
+        orderSheet.setSheetName("交易流水");
+        orderSheet.setTitle("交易流水");
+        String[] header = new String[]{"订单编号", "交易内容", "交易时间", "交易类型", "交易金额", "会员姓名",
+                "支付方式", "支付流水号", "操作人",  "门店名称"};
+        orderSheet.setHeaders(header);
+        List<List<Object>> body = new ArrayList<>();
+        SimpleDateFormat dateFormat = new SimpleDateFormat("yyyy年MM月dd日 HH:mm:ss");
+        for (OrderFlowVo flowVo : orderFlowVos) {
+                List<Object> bodyItem = new ArrayList<>();
+                bodyItem.add(flowVo.getOrderNo());
+                bodyItem.add(flowVo.getFlowContent());
+                bodyItem.add(DateUtil.dateFormatStr(flowVo.getCreateTime(),DateUtil.DATE_FORMAT_MM));
+                bodyItem.add(flowVo.getFlowType());
+                bodyItem.add(flowVo.getAmount());
+                bodyItem.add(flowVo.getVipName());
+                bodyItem.add(flowVo.getPayMethod());
+                bodyItem.add(flowVo.getFlowNo());
+                bodyItem.add(flowVo.getStaffName());
+                bodyItem.add(flowVo.getShopName());
+                body.add(bodyItem);
+        }
+        orderSheet.setDataList(body);
+        res.add(orderSheet);
+        return res;
+    }
+
+
+
+
+}
+
diff --git a/zq-erp/src/main/java/com/matrix/system/hive/statistics/ServiceStatisticsAction.java b/zq-erp/src/main/java/com/matrix/system/hive/statistics/ServiceStatisticsAction.java
index 532662d..81a5f11 100644
--- a/zq-erp/src/main/java/com/matrix/system/hive/statistics/ServiceStatisticsAction.java
+++ b/zq-erp/src/main/java/com/matrix/system/hive/statistics/ServiceStatisticsAction.java
@@ -36,6 +36,7 @@
         if(!AppConstance.ZONGDIAN.equals(sysUsers.getShopName())){
             param.put("shopId",sysUsers.getShopId());
         }
+
         return AjaxResult.buildSuccessInstance(beauticianStateDao.selectItemDetail(param),
                 beauticianStateDao.selectItemDetailTotal(param));
     }
diff --git a/zq-erp/src/main/java/com/matrix/system/hive/statistics/StatisticsBusinessDataJob.java b/zq-erp/src/main/java/com/matrix/system/hive/statistics/StatisticsBusinessDataJob.java
index ed112b3..4e80ff7 100644
--- a/zq-erp/src/main/java/com/matrix/system/hive/statistics/StatisticsBusinessDataJob.java
+++ b/zq-erp/src/main/java/com/matrix/system/hive/statistics/StatisticsBusinessDataJob.java
@@ -48,7 +48,7 @@
      */
     public boolean executeExt2() {
 
-        Date today = DateUtil.stringToDate("2020-11-01",DateUtil.DATE_FORMAT_DD);
+        Date today = DateUtil.stringToDate("2020-11-27",DateUtil.DATE_FORMAT_DD);
         Date now=new Date();
         while (DateUtil.isBeforeDate(now,today)){
             LogUtil.info("日期:"+DateUtil.dateFormatStr(today,DateUtil.DATE_FORMAT_DD));
diff --git a/zq-erp/src/main/java/com/matrix/system/hive/statistics/SysBusinessDataAction.java b/zq-erp/src/main/java/com/matrix/system/hive/statistics/SysBusinessDataAction.java
index 1cd802f..14b05f9 100644
--- a/zq-erp/src/main/java/com/matrix/system/hive/statistics/SysBusinessDataAction.java
+++ b/zq-erp/src/main/java/com/matrix/system/hive/statistics/SysBusinessDataAction.java
@@ -3,15 +3,21 @@
 import com.matrix.core.constance.MatrixConstance;
 import com.matrix.core.pojo.AjaxResult;
 import com.matrix.core.pojo.PaginationVO;
+import com.matrix.core.tools.DateUtil;
 import com.matrix.core.tools.WebUtil;
 import com.matrix.system.common.bean.SysUsers;
 import com.matrix.system.common.constance.AppConstance;
 import com.matrix.system.hive.dao.SysBusinessDataDao;
+import com.matrix.system.hiveErp.analysUtil.StatisticsTimeDaoParam;
+import com.matrix.system.hiveErp.analysUtil.StatisticsTimeUtil;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.stereotype.Controller;
 import org.springframework.web.bind.annotation.RequestMapping;
 import org.springframework.web.bind.annotation.ResponseBody;
 
+import java.util.ArrayList;
+import java.util.Calendar;
+import java.util.Date;
 import java.util.List;
 
 /**
@@ -44,5 +50,56 @@
         return result;
     }
 
+    /**
+     * 日销售汇总
+     *
+     * @param dailySaleVo
+     * @param pageVo
+     * @return
+     */
+    @RequestMapping(value = "/findDailySaleData")
+    @ResponseBody
+    public AjaxResult findDailySaleData(DailySaleVo dailySaleVo, PaginationVO pageVo) {
+        SysUsers user = WebUtil.getSessionAttribute(MatrixConstance.LOGIN_KEY);
+        Calendar calendar = Calendar.getInstance();
+        int total = 999;
+
+        Date endDate = new Date();
+        if (dailySaleVo.getEndTime() != null) {
+            if (!dailySaleVo.getEndTime().after(new Date())) {
+                calendar.setTime(dailySaleVo.getEndTime());
+                endDate = DateUtil.nextNDate(dailySaleVo.getEndTime(), 1);
+            }
+        }
+
+        calendar.add(Calendar.DATE, 1);
+        calendar.add(Calendar.DATE, -pageVo.getOffset());
+        String endTime = DateUtil.dateToString(calendar.getTime(), DateUtil.DATE_FORMAT_DD);
+        calendar.add(Calendar.DATE, -pageVo.getLimit());
+        String startTime = DateUtil.dateToString(calendar.getTime(), DateUtil.DATE_FORMAT_DD);
+
+        if (dailySaleVo.getBeginTime() != null) {
+            Date startDate = DateUtil.stringToDate(startTime, DateUtil.DATE_FORMAT_DD);
+            if(dailySaleVo.getBeginTime().after(startDate)) {
+                startTime = DateUtil.dateFormatStr(dailySaleVo.getBeginTime(), DateUtil.DATE_FORMAT_DD);
+            }
+            long sub = DateUtil.getTimeSpan(dailySaleVo.getBeginTime(), endDate, null);
+            Long l = sub / (1000 * 3600 * 24);
+            total = l.intValue();
+        }
+        List<Date> xAxis = StatisticsTimeUtil.getTimeSpace(startTime, endTime, "日");
+        List<StatisticsTimeDaoParam> timeSpaceParam = StatisticsTimeUtil.buidParam(xAxis);
+        List<StatisticsTimeDaoParam> statisticsTimeDaoParams = timeSpaceParam.subList(0, timeSpaceParam.size() - 2);
+
+        if (dailySaleVo.getShopId() == null) {
+            dailySaleVo.setShopId(user.getShopId());
+        }
+        List<DailySaleVo> dailySaleVos = sysBusinessDataDao.selectDailySaleData(statisticsTimeDaoParams, dailySaleVo.getShopId());
+        List<DailySaleVo> result = new ArrayList<>();
+        for (int i = dailySaleVos.size() - 1; i >= 0; i--) {
+            result.add(dailySaleVos.get(i));
+        }
+        return AjaxResult.buildSuccessInstance(result, total);
+    }
 
 }
\ No newline at end of file
diff --git a/zq-erp/src/main/java/com/matrix/system/hive/vo/OrderFlowVo.java b/zq-erp/src/main/java/com/matrix/system/hive/vo/OrderFlowVo.java
new file mode 100644
index 0000000..78ce807
--- /dev/null
+++ b/zq-erp/src/main/java/com/matrix/system/hive/vo/OrderFlowVo.java
@@ -0,0 +1,152 @@
+package com.matrix.system.hive.vo;
+
+import com.fasterxml.jackson.annotation.JsonFormat;
+import com.matrix.core.tools.DateUtil;
+import com.matrix.system.app.vo.OrderDetailItemVo;
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+
+import java.math.BigDecimal;
+import java.util.Date;
+import java.util.List;
+
+/**
+ * @author jyy
+ * @date 2021-01-27
+ **/
+@ApiModel(value = "OrderFlowVo", description = "订单流水返回参数类")
+public class OrderFlowVo {
+
+    @ApiModelProperty(value = "流水id")
+    private Long id;
+
+    @ApiModelProperty(value = "订单ID")
+    private String orderId;
+
+    @ApiModelProperty(value = "订单号")
+    private String orderNo;
+
+    @ApiModelProperty(value ="交易类型")
+    private String flowType;
+
+    @ApiModelProperty(value ="支付方式")
+    private String payMethod;
+
+    @ApiModelProperty(value = "会员姓名")
+    private String vipName;
+
+    @ApiModelProperty(value = "交易内容")
+    private String flowContent;
+
+    @ApiModelProperty(value = "交易金额")
+    private BigDecimal amount;
+
+    @ApiModelProperty(value = "操作人姓名")
+    private String staffName;
+
+    @ApiModelProperty(value = "支付流水号")
+    private String flowNo;
+
+    @ApiModelProperty(value = "门店名称")
+    private String shopName;
+
+    @JsonFormat(pattern = DateUtil.DATE_FORMAT_SS, timezone = "GMT+8")
+    @ApiModelProperty(value = "创建时间")
+    private Date createTime;
+
+    public Long getId() {
+        return id;
+    }
+
+    public void setId(Long id) {
+        this.id = id;
+    }
+
+    public String getOrderId() {
+        return orderId;
+    }
+
+    public void setOrderId(String orderId) {
+        this.orderId = orderId;
+    }
+
+    public String getOrderNo() {
+        return orderNo;
+    }
+
+    public void setOrderNo(String orderNo) {
+        this.orderNo = orderNo;
+    }
+
+    public String getFlowType() {
+        return flowType;
+    }
+
+    public void setFlowType(String flowType) {
+        this.flowType = flowType;
+    }
+
+    public String getPayMethod() {
+        return payMethod;
+    }
+
+    public void setPayMethod(String payMethod) {
+        this.payMethod = payMethod;
+    }
+
+    public String getVipName() {
+        return vipName;
+    }
+
+    public void setVipName(String vipName) {
+        this.vipName = vipName;
+    }
+
+    public String getFlowContent() {
+        return flowContent;
+    }
+
+    public void setFlowContent(String flowContent) {
+        this.flowContent = flowContent;
+    }
+
+    public BigDecimal getAmount() {
+        return amount;
+    }
+
+    public void setAmount(BigDecimal amount) {
+        this.amount = amount;
+    }
+
+    public String getStaffName() {
+        return staffName;
+    }
+
+    public void setStaffName(String staffName) {
+        this.staffName = staffName;
+    }
+
+    public String getFlowNo() {
+        return flowNo;
+    }
+
+    public void setFlowNo(String flowNo) {
+        this.flowNo = flowNo;
+    }
+
+    public String getShopName() {
+        return shopName;
+    }
+
+    public void setShopName(String shopName) {
+        this.shopName = shopName;
+    }
+
+    public Date getCreateTime() {
+        return createTime;
+    }
+
+    public void setCreateTime(Date createTime) {
+        this.createTime = createTime;
+    }
+}
diff --git a/zq-erp/src/main/java/com/matrix/system/hiveErp/action/DataAnalysisCustomer.java b/zq-erp/src/main/java/com/matrix/system/hiveErp/action/DataAnalysisCustomer.java
index 69a4dc0..8b00027 100644
--- a/zq-erp/src/main/java/com/matrix/system/hiveErp/action/DataAnalysisCustomer.java
+++ b/zq-erp/src/main/java/com/matrix/system/hiveErp/action/DataAnalysisCustomer.java
@@ -1,5 +1,6 @@
 package com.matrix.system.hiveErp.action;
 
+import com.matrix.component.redis.RedisClient;
 import com.matrix.core.constance.MatrixConstance;
 import com.matrix.core.pojo.AjaxResult;
 import com.matrix.core.tools.WebUtil;
@@ -7,6 +8,7 @@
 import com.matrix.system.common.tools.DataAuthUtil;
 import com.matrix.system.hive.bean.SysShopInfo;
 import com.matrix.system.hive.dao.SysShopInfoDao;
+import com.matrix.system.hive.service.imp.DataAnalysisCustomerServiceImpl;
 import com.matrix.system.hiveErp.analysUtil.*;
 import com.matrix.system.hiveErp.dao.TjVipSumDao;
 import org.jetbrains.annotations.NotNull;
@@ -31,7 +33,8 @@
     @Autowired
     SysShopInfoDao shopInfoDao;
 
-
+    @Autowired
+    DataAnalysisCustomerServiceImpl dataAnalysisCustomerService;
 
     /**
      * 会员人头数统计
@@ -43,9 +46,9 @@
      */
     @RequestMapping(value = "/customerHeadCompare")
     public @ResponseBody  AjaxResult customerHeadCompare(StatisticsParamVo statisticsParam) {
-        return getAnalysisResult(statisticsParam, new Caculate() {
+        return dataAnalysisCustomerService.getAnalysisResult(statisticsParam, new Caculate<Integer>() {
             @Override
-            public Map<String, Integer> exec(List<StatisticsTimeDaoParam> timeSpaceParam, Long shopId) {
+            public Map<String, Integer> exec(List<StatisticsTimeDaoParam> timeSpaceParam, Long shopId, Long companyId) {
                 //从员工业绩统计表中,按时间段,门店的维度统计人头数
                 return tjVipSumDao.customerHeadCompare(timeSpaceParam,shopId);
             }
@@ -61,9 +64,9 @@
      */
     @RequestMapping(value = "/customerEnterCountCompare")
     public @ResponseBody  AjaxResult customerEnterCountCompare(StatisticsParamVo statisticsParam) {
-        return getAnalysisResult(statisticsParam, new Caculate() {
+        return dataAnalysisCustomerService.getAnalysisResult(statisticsParam, new Caculate<Integer>() {
             @Override
-            public Map<String, Integer> exec(List<StatisticsTimeDaoParam> timeSpaceParam, Long shopId) {
+            public Map<String, Integer> exec(List<StatisticsTimeDaoParam> timeSpaceParam, Long shopId, Long companyId) {
                 //从员工业绩统计表中,按时间段,门店的维度统计人次
                 return tjVipSumDao.customerEnterCountCompare(timeSpaceParam,shopId);
             }
@@ -80,9 +83,9 @@
      */
     @RequestMapping(value = "/customerEnterRateCompare")
     public @ResponseBody  AjaxResult customerEnterRateCompare(StatisticsParamVo statisticsParam) {
-        return getAnalysisResult(statisticsParam, new Caculate() {
+        return dataAnalysisCustomerService.getAnalysisResult(statisticsParam, new Caculate<Integer>() {
             @Override
-            public Map<String, Integer> exec(List<StatisticsTimeDaoParam> timeSpaceParam, Long shopId) {
+            public Map<String, Integer> exec(List<StatisticsTimeDaoParam> timeSpaceParam, Long shopId, Long companyId) {
                 //从员工业绩统计表中,按时间段,门店的维度统计人次
                 return tjVipSumDao.customerEnterRateCompare(timeSpaceParam,shopId);
             }
@@ -93,64 +96,6 @@
 
 
 
-
-
-    /**
-     *  按店铺查询数据通用格式执行方法,支持时、日、月、年维度
-     *  如:              A店铺    B店铺
-     *     2020-01-01     12     13
-     *     2020-02-02     10     11
-     * @param statisticsParam 时间条件
-     * @param caculate  循环调用caculate计算该店的数据
-     *                  查询的数据需满足  只有一个门店只有一行 列名称为 t0,t1,t2
-     * @return
-     */
-    private AjaxResult getAnalysisResult(StatisticsParamVo statisticsParam, Caculate caculate) {
-        AjaxResult result = new AjaxResult();
-
-        //根据计算横坐标
-        List<Date> xAxis = StatisticsTimeUtil.getTimeSpace(statisticsParam.getBeginTime(), statisticsParam.getEndTime(), statisticsParam.getStatisticsUnit());
-
-        //获取所有门店
-        SysUsers user = WebUtil.getSessionAttribute(MatrixConstance.LOGIN_KEY);
-        List<SysShopInfo> shops=null;
-        if(DataAuthUtil.hasAllShopAuth()){
-            shops= shopInfoDao.selectShopInfo(user.getCompanyId());
-        }else{
-            shops=Arrays.asList(shopInfoDao.selectById(user.getShopId()));
-        }
-        //定义数据项内容
-        List<SeriesVo> series=new ArrayList<>();
-
-        //定义数据主体
-        String[]  legendData=new String[shops.size()];
-
-        int i=0;
-
-        //按门店统计数据
-        List<StatisticsTimeDaoParam> timeSpaceParam = StatisticsTimeUtil.buidParam(xAxis);
-        for(SysShopInfo shop: shops){
-
-            legendData[i++]=shop.getShopName();
-            //数据项内容
-            SeriesVo storeInfoSeries=new SeriesVo();
-            storeInfoSeries.setName(shop.getShopName());
-            //调用计算器获取数据库统计的结果
-            Map<String, Integer> yAxisMap = caculate.exec(timeSpaceParam,shop.getId());
-            //把统计结果转成数组格式
-            storeInfoSeries.setData(StatisticsTimeUtil.getSeries(yAxisMap));
-            series.add(storeInfoSeries);
-
-        }
-        //构造返回对象
-        Map<Object,Object> data=new HashMap<>();
-        data.put("legendData",legendData);
-        data.put("series",series);
-        data.put("xAxis", StatisticsTimeUtil.getFormartDateList(xAxis,statisticsParam));
-        result.setMapInfo(data);
-        result.setStatus(AjaxResult.STATUS_SUCCESS);
-        return result;
-    }
 
 
 
diff --git a/zq-erp/src/main/java/com/matrix/system/hiveErp/action/ErpOrderController.java b/zq-erp/src/main/java/com/matrix/system/hiveErp/action/ErpOrderController.java
index 9badbd1..ed53c67 100644
--- a/zq-erp/src/main/java/com/matrix/system/hiveErp/action/ErpOrderController.java
+++ b/zq-erp/src/main/java/com/matrix/system/hiveErp/action/ErpOrderController.java
@@ -109,6 +109,8 @@
         moneyCardUse.setVipId(order.getVipId());
         List<MoneyCardUse> cards = cardUseService.findByModel(moneyCardUse);
 
+        WebUtil.getRequest().setAttribute("orderParam", id);
+
         WebUtil.getRequest().setAttribute("cards", cards);
         return "admin/hive-erp/order/orderXq-form";
     }
diff --git a/zq-erp/src/main/java/com/matrix/system/hiveErp/action/ErpShoppingGoodsController.java b/zq-erp/src/main/java/com/matrix/system/hiveErp/action/ErpShoppingGoodsController.java
index e0e3f79..6e78a24 100644
--- a/zq-erp/src/main/java/com/matrix/system/hiveErp/action/ErpShoppingGoodsController.java
+++ b/zq-erp/src/main/java/com/matrix/system/hiveErp/action/ErpShoppingGoodsController.java
@@ -4,6 +4,7 @@
 import com.matrix.core.pojo.AjaxResult;
 import com.matrix.core.pojo.PaginationVO;
 import com.matrix.core.tools.DateUtil;
+import com.matrix.core.tools.StringUtils;
 import com.matrix.core.tools.WebUtil;
 import com.matrix.core.tools.excl.ExcelSheetPO;
 import com.matrix.core.tools.excl.ExcelVersion;
@@ -66,8 +67,10 @@
     @RequestMapping(value = "/showList")
     public @ResponseBody
     AjaxResult showList(ShoppingGoods shoppingGoods, PaginationVO pageVo) {
-        pageVo.setOrder("desc");
-        pageVo.setSort("createTime");
+        if(StringUtils.isBlank(pageVo.getSort())){
+            pageVo.setOrder("desc");
+            pageVo.setSort("createTime");
+        }
         QueryUtil.setQueryLimitCom(shoppingGoods);
         shoppingGoods.setIsDel(ShoppingGoods.NORMAL);
         List<ShoppingGoods> dataList = shoppingGoodsService.findInPage(shoppingGoods, pageVo);
diff --git a/zq-erp/src/main/java/com/matrix/system/hiveErp/action/ErpVipInfoController.java b/zq-erp/src/main/java/com/matrix/system/hiveErp/action/ErpVipInfoController.java
index 2b18447..f2ed540 100644
--- a/zq-erp/src/main/java/com/matrix/system/hiveErp/action/ErpVipInfoController.java
+++ b/zq-erp/src/main/java/com/matrix/system/hiveErp/action/ErpVipInfoController.java
@@ -117,16 +117,7 @@
             // 在session存放当前查询的客户
             MoneyCardUse cardUseInfo = cardUseService.findByVipId(vips.get(0).getId());
             if (cardUseInfo == null) {
-                cardUseInfo = new MoneyCardUse();
-                cardUseInfo.setVipId(vips.get(0).getId());
-                cardUseInfo.setCardName("储值卡");
-                cardUseInfo.setIsVipCar(Dictionary.FLAG_YES_Y);
-                cardUseInfo.setRealMoney(0D);
-                cardUseInfo.setGiftMoney(0D);
-                cardUseInfo.setSource("-");
-                cardUseInfo.setStatus(Dictionary.MONEYCARD_STATUS_YX);
-                cardUseInfo.setFailTime(DateUtil.stringToDate("2050-01-01 00:00",DateUtil.DATE_FORMAT_MM));
-                moneyCardUseDao.insert(cardUseInfo);
+                cardUseInfo=vipInfoService.addVipDefaultCard(vips.get(0).getId());
             }
             vips.get(0).setLevelCard(cardUseInfo);
             WebUtil.getSession().setAttribute(SystemConstance.CURRENT_CUSTOMER, vips.get(0));
diff --git a/zq-erp/src/main/java/com/matrix/system/hiveErp/analysUtil/Caculate.java b/zq-erp/src/main/java/com/matrix/system/hiveErp/analysUtil/Caculate.java
index 27e6cdf..193b9d0 100644
--- a/zq-erp/src/main/java/com/matrix/system/hiveErp/analysUtil/Caculate.java
+++ b/zq-erp/src/main/java/com/matrix/system/hiveErp/analysUtil/Caculate.java
@@ -5,6 +5,6 @@
 /**
  * 明细数值计算器
  */
-public interface Caculate {
-    public Map<String, Integer> exec(List<StatisticsTimeDaoParam> timeSpaceParam , Long shopId);
+public interface Caculate<T> {
+    public Map<String, T> exec(List<StatisticsTimeDaoParam> timeSpaceParam , Long shopId, Long companyId);
 }
diff --git a/zq-erp/src/main/java/com/matrix/system/hiveErp/analysUtil/StatisticsParamVo.java b/zq-erp/src/main/java/com/matrix/system/hiveErp/analysUtil/StatisticsParamVo.java
index dba0746..8bd9e7a 100644
--- a/zq-erp/src/main/java/com/matrix/system/hiveErp/analysUtil/StatisticsParamVo.java
+++ b/zq-erp/src/main/java/com/matrix/system/hiveErp/analysUtil/StatisticsParamVo.java
@@ -1,33 +1,62 @@
 package com.matrix.system.hiveErp.analysUtil;
 
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+
+import javax.validation.constraints.NotBlank;
+
 /**
  * 统计查询条件
  * @author jyy
  */
+@ApiModel(value = "StatisticsParamVo", description = "专项统计接收参数类")
 public class StatisticsParamVo {
+
+    public static final String COMPANY = "1";
+
+    public static final String SHOP = "2";
 
     /**
      * 开始时间
      */
+    @NotBlank(message = "参数错误")
+    @ApiModelProperty(value = "开始时间", example = "2020-12-01")
     private String beginTime;
 
     /**
      *结束时间
      */
+    @NotBlank(message = "参数错误")
+    @ApiModelProperty(value = "结束时间", example = "2020-12-31")
     private String endTime;
     /**
      *统计单位
      */
+    @NotBlank(message = "参数错误")
+    @ApiModelProperty(value = "统计单位", example = "日")
     private String statisticsUnit;
 
     /**
      *对比单位
      */
+    @ApiModelProperty(hidden = true)
     private String  contrastUnit;
     /**
      * 门店id
      */
-    private String shopId;
+    @ApiModelProperty(value = "门店ID, 不传默认统计整个公司")
+    private Long shopId;
+
+    @ApiModelProperty(value = "类型 1-营业收入 2-现金收入 3-余额划扣 4-本金消耗 5-赠送消耗 6-现金退款 7-卡项退款 8-欠款", example = "1")
+    private String type;
+
+    public String getType() {
+        return type;
+    }
+
+    public void setType(String type) {
+        this.type = type;
+    }
 
     public String getBeginTime() {
         return beginTime;
@@ -61,11 +90,11 @@
         this.contrastUnit = contrastUnit;
     }
 
-    public String getShopId() {
+    public Long getShopId() {
         return shopId;
     }
 
-    public void setShopId(String shopId) {
+    public void setShopId(Long shopId) {
         this.shopId = shopId;
     }
 }
diff --git a/zq-erp/src/main/java/com/matrix/system/hiveErp/dao/TjVipSumDao.java b/zq-erp/src/main/java/com/matrix/system/hiveErp/dao/TjVipSumDao.java
index 3e27576..3677903 100644
--- a/zq-erp/src/main/java/com/matrix/system/hiveErp/dao/TjVipSumDao.java
+++ b/zq-erp/src/main/java/com/matrix/system/hiveErp/dao/TjVipSumDao.java
@@ -1,9 +1,13 @@
 package com.matrix.system.hiveErp.dao;
 
 
+import com.matrix.core.pojo.PaginationVO;
+import com.matrix.system.app.vo.VipAchieveDataShowVo;
+import com.matrix.system.hive.bean.AchieveNew;
 import com.matrix.system.hiveErp.analysUtil.StatisticsTimeDaoParam;
 import org.apache.ibatis.annotations.Param;
 
+import java.math.BigDecimal;
 import java.util.List;
 import java.util.Map;
 
@@ -16,4 +20,90 @@
 	 Map<String, Integer> customerEnterCountCompare(@Param("list") List<StatisticsTimeDaoParam> timeSpaceParam, @Param("shopId") Long shopId);
 
 	Map<String, Integer> customerEnterRateCompare(@Param("list") List<StatisticsTimeDaoParam> timeSpaceParam, @Param("shopId") Long shopId);
+
+	// 营业收入
+	Map<String, BigDecimal> selectBusinessInCome(@Param("list") List<StatisticsTimeDaoParam> timeSpaceParam, @Param("shopId") Long shopId, @Param("companyId") Long companyId);
+
+	// 现金收款
+	Map<String, BigDecimal> selectCashIncome(@Param("list") List<StatisticsTimeDaoParam> timeSpaceParam, @Param("shopId") Long shopId, @Param("companyId") Long companyId);
+
+	// 储值卡收款
+	Map<String, BigDecimal> selectCardUse(@Param("list") List<StatisticsTimeDaoParam> timeSpaceParam, @Param("shopId") Long shopId, @Param("companyId") Long companyId);
+
+	// 欠款
+	Map<String, BigDecimal> selectArrears(@Param("list") List<StatisticsTimeDaoParam> timeSpaceParam, @Param("shopId") Long shopId, @Param("companyId") Long companyId);
+
+	// 卡项退款
+	Map<String, BigDecimal> selectCardRefund(@Param("list") List<StatisticsTimeDaoParam> timeSpaceParam, @Param("shopId") Long shopId, @Param("companyId") Long companyId);
+
+	// 现金退款
+	Map<String, BigDecimal> selectCashRefund(@Param("list") List<StatisticsTimeDaoParam> timeSpaceParam, @Param("shopId") Long shopId, @Param("companyId") Long companyId);
+
+	// 产品业绩
+	Map<String, BigDecimal> selectProductAchieve(@Param("list") List<StatisticsTimeDaoParam> timeSpaceParam, @Param("shopId") Long shopId, @Param("companyId") Long companyId);
+
+	// 卡项业绩
+	Map<String, BigDecimal> selectCardAchieve(@Param("list") List<StatisticsTimeDaoParam> timeSpaceParam, @Param("shopId") Long shopId, @Param("companyId") Long companyId);
+
+	// 还款
+	Map<String, BigDecimal> selectRepayment(@Param("list") List<StatisticsTimeDaoParam> timeSpaceParam, @Param("shopId") Long shopId, @Param("companyId") Long companyId);
+
+	// 客单数
+	Map<String, BigDecimal> selectPerCustomCnt(@Param("list") List<StatisticsTimeDaoParam> timeSpaceParam, @Param("shopId") Long shopId, @Param("companyId") Long companyId);
+
+	// 客品数
+	Map<String, BigDecimal> selectCustomGoodsCnt(@Param("list") List<StatisticsTimeDaoParam> timeSpaceParam, @Param("shopId") Long shopId, @Param("companyId") Long companyId);
+
+	// 客单价
+	Map<String, BigDecimal> selectPerCustomPrice(@Param("list") List<StatisticsTimeDaoParam> timeSpaceParam, @Param("shopId") Long shopId, @Param("companyId") Long companyId);
+
+	// 成本
+	Map<String, BigDecimal> selectCost(@Param("list") List<StatisticsTimeDaoParam> timeSpaceParam, @Param("shopId") Long shopId, @Param("companyId") Long companyId);
+
+	// 毛利
+	Map<String, BigDecimal> selectGrossProfit(@Param("list") List<StatisticsTimeDaoParam> timeSpaceParam, @Param("shopId") Long shopId, @Param("companyId") Long companyId);
+
+	// 毛利率
+	Map<String, BigDecimal> selectGrossProfitRate(@Param("list") List<StatisticsTimeDaoParam> timeSpaceParam, @Param("shopId") Long shopId, @Param("companyId") Long companyId);
+
+	// 本金消耗
+	Map<String, BigDecimal> selectHisConsume(@Param("list") List<StatisticsTimeDaoParam> timeSpaceParam, @Param("shopId") Long shopId, @Param("companyId") Long companyId);
+
+	// 赠送消耗
+	Map<String, BigDecimal> selectFreeConsume(@Param("list") List<StatisticsTimeDaoParam> timeSpaceParam, @Param("shopId") Long shopId, @Param("companyId") Long companyId);
+
+	// 人头数
+	Map<String, BigDecimal> selectPeopleCnt(@Param("list") List<StatisticsTimeDaoParam> timeSpaceParam, @Param("shopId") Long shopId, @Param("companyId") Long companyId);
+
+	// 项目消耗数
+	Map<String, BigDecimal> selectProjConsumeCnt(@Param("list") List<StatisticsTimeDaoParam> timeSpaceParam, @Param("shopId") Long shopId, @Param("companyId") Long companyId);
+
+	// 服务时长
+	Map<String, BigDecimal> selectTimeLength(@Param("list") List<StatisticsTimeDaoParam> timeSpaceParam, @Param("shopId") Long shopId, @Param("companyId") Long companyId);
+
+	List<VipAchieveDataShowVo> selectVipAchieveInPage(@Param("list") List<StatisticsTimeDaoParam> timeSpaceParam, @Param("userId") Long userId);
+
+	// 订单业绩
+	Map<String, BigDecimal> selectStaffOrderAchieve(@Param("list") List<StatisticsTimeDaoParam> timeSpaceParam, @Param("staffId") Long staffId);
+	// 现金业绩
+	Map<String, BigDecimal> selectStaffCashAchieve(@Param("list") List<StatisticsTimeDaoParam> timeSpaceParam, @Param("staffId") Long staffId);
+	// 划扣业绩
+	Map<String, BigDecimal> selectStaffCardAchieve(@Param("list") List<StatisticsTimeDaoParam> timeSpaceParam, @Param("staffId") Long staffId);
+	// 订单提成
+	Map<String, BigDecimal> selectStaffGoodsAchieve(@Param("list") List<StatisticsTimeDaoParam> timeSpaceParam, @Param("staffId") Long staffId);
+	// 本金消耗
+	Map<String, BigDecimal> selectStaffHisConsumeAchieve(@Param("list") List<StatisticsTimeDaoParam> timeSpaceParam, @Param("staffId") Long staffId);
+	// 赠送消耗
+	Map<String, BigDecimal> selectStaffFreeConsumeAchieve(@Param("list") List<StatisticsTimeDaoParam> timeSpaceParam, @Param("staffId") Long staffId);
+	// 服务提成
+	Map<String, BigDecimal> selectStaffCommissionAchieve(@Param("list") List<StatisticsTimeDaoParam> timeSpaceParam, @Param("staffId") Long staffId);
+	// 人头数目
+	Map<String, BigDecimal> selectStaffPeopleNum(@Param("list") List<StatisticsTimeDaoParam> timeSpaceParam, @Param("staffId") Long staffId);
+	// 项目数
+	Map<String, BigDecimal> selectStaffProjNum(@Param("list") List<StatisticsTimeDaoParam> timeSpaceParam, @Param("staffId") Long staffId);
+	// 服务时长
+	Map<String, BigDecimal> selectStaffProjTime(@Param("list") List<StatisticsTimeDaoParam> timeSpaceParam, @Param("staffId") Long staffId);
+
+	Map<String, BigDecimal> selectStaffCardUseAchieve(@Param("list") List<StatisticsTimeDaoParam> timeSpaceParam, @Param("staffId") Long staffId);
+
 }
\ No newline at end of file
diff --git a/zq-erp/src/main/java/com/matrix/system/job/ServiceOvertimeNoticeJob.java b/zq-erp/src/main/java/com/matrix/system/job/ServiceOvertimeNoticeJob.java
new file mode 100644
index 0000000..87889ad
--- /dev/null
+++ b/zq-erp/src/main/java/com/matrix/system/job/ServiceOvertimeNoticeJob.java
@@ -0,0 +1,65 @@
+package com.matrix.system.job;
+
+import com.matrix.component.rabbitmq.RabiitMqTemplate;
+import com.matrix.core.tools.LogUtil;
+import com.matrix.system.common.bean.SysUsers;
+import com.matrix.system.constance.Dictionary;
+import com.matrix.system.hive.bean.MoneyCardUse;
+import com.matrix.system.hive.bean.SysProjServices;
+import com.matrix.system.hive.bean.SysProjUse;
+import com.matrix.system.hive.dao.MoneyCardUseDao;
+import com.matrix.system.hive.dao.SysProjServicesDao;
+import com.matrix.system.hive.dao.SysProjUseDao;
+import com.matrix.system.hive.plugin.util.CollectionUtils;
+import com.matrix.system.shopXcx.mqTask.MQTaskRouting;
+import com.matrix.system.wechart.templateMsg.UniformMsgParam;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.beans.factory.annotation.Value;
+import org.springframework.scheduling.annotation.Scheduled;
+import org.springframework.stereotype.Component;
+
+import java.util.ArrayList;
+import java.util.List;
+import java.util.stream.Collectors;
+
+/**
+ * 预约服务到时提醒
+ * @author 姜友瑶
+ */
+@Component
+public class ServiceOvertimeNoticeJob {
+
+    @Autowired
+    private SysProjServicesDao projServicesDao;
+
+    @Value("${evn}")
+    private  String evn;
+
+    @Autowired
+    private RabiitMqTemplate rabiitMqTemplate;
+
+    /**
+     * 每分钟执行一次
+     */
+    @Scheduled(cron = "0 0/1 * * * ?")
+    public void serviceOvertimeNotice() {
+
+        List<SysProjServices> needNoticeService=projServicesDao.selectNeedNoticeService();
+        if(CollectionUtils.isNotEmpty(needNoticeService)){
+            LogUtil.debug("执行服务单预约到时提醒任务,本次通知对象"+ needNoticeService.stream().map(SysProjServices::getVipName).collect(Collectors.joining(",")));
+            for(SysProjServices projServices : needNoticeService){
+                //发送微信公众号提醒
+                UniformMsgParam uniformMsgParam=new UniformMsgParam(projServices.getCompanyId(),UniformMsgParam.GZH_YYDS);
+                uniformMsgParam.put("serviceId",projServices.getId());
+                rabiitMqTemplate.sendMsg(MQTaskRouting.SEND_UNIFORM_TEMPLATE_MSG+evn,uniformMsgParam.toJSONString());
+            }
+            List<Long> noticedIds = needNoticeService.stream().map(SysProjServices::getId).collect(Collectors.toList());
+            projServicesDao.updateNoticeTimes(noticedIds);
+        }else{
+            LogUtil.debug("暂无需要提醒的服务单");
+        }
+
+    }
+
+
+}
diff --git a/zq-erp/src/main/java/com/matrix/system/shopXcx/action/ShopRefundRecordAction.java b/zq-erp/src/main/java/com/matrix/system/shopXcx/action/ShopRefundRecordAction.java
index 4b25528..c790239 100644
--- a/zq-erp/src/main/java/com/matrix/system/shopXcx/action/ShopRefundRecordAction.java
+++ b/zq-erp/src/main/java/com/matrix/system/shopXcx/action/ShopRefundRecordAction.java
@@ -464,16 +464,14 @@
 		int reMoney = b1.multiply(bb).intValue();
 		LogUtil.info("退款退款金额{}", reMoney);
 
-		//Double refundMoney = 0.1 * 100;
-		//用户ID
-		String userId = WechatConfigure.mchID;
+
 
 		if (isDebug) {
-			boolean b = weixinServiceUtil.comRefund(orderNo, refundNo, 1, 1, userId);
+			boolean b = weixinServiceUtil.comRefund(orderNo, refundNo, 1, 1, null);
 			flag = b;
 		} else {
 			LogUtil.info("开始调用退款接口。。。退款编号为{}", refundNo);
-			boolean b = weixinServiceUtil.comRefund(orderNo, refundNo, orMoney, reMoney, userId);
+			boolean b = weixinServiceUtil.comRefund(orderNo, refundNo, orMoney, reMoney, null);
 			flag = b;
 		}
 
diff --git a/zq-erp/src/main/java/com/matrix/system/shopXcx/action/ShopWxtemplateMsgAction.java b/zq-erp/src/main/java/com/matrix/system/shopXcx/action/ShopWxtemplateMsgAction.java
index ec600ff..4252a42 100644
--- a/zq-erp/src/main/java/com/matrix/system/shopXcx/action/ShopWxtemplateMsgAction.java
+++ b/zq-erp/src/main/java/com/matrix/system/shopXcx/action/ShopWxtemplateMsgAction.java
@@ -81,22 +81,8 @@
     @RequestMapping(value = "/modifyShopWxtemplateMsg")
     public @ResponseBody
     AjaxResult modifyShopWxtemplateMsg(ShopWxtemplateMsg newShopWxtemplateMsg) {
-        ShopWxtemplateMsg oldShopWxtemplateMsg = WebUtil.getSessionAttribute(BEV);
-        int i = 0;
-        Map<String, Object> modifyMap = null;
-        try {
-            if (!ModelUtils.isModified(oldShopWxtemplateMsg, newShopWxtemplateMsg)) {
-                i = MatrixConstance.DML_SUCCESSS;
-            }
-            modifyMap = ModelUtils.comparePojo2Map(oldShopWxtemplateMsg, newShopWxtemplateMsg);
-        } catch (Exception e) {
-            throw new GlobleException(SystemErrorCode.DATA_UPDATE_FAIL, e, newShopWxtemplateMsg);
-        }
-        if (modifyMap.size() > 0) {
-            modifyMap.put("id", oldShopWxtemplateMsg.getId());
-            shopWxtemplateMsgDao.updateByMap(modifyMap);
-        }
-        i = MatrixConstance.DML_SUCCESSS;
+
+        int   i = shopWxtemplateMsgDao.updateByModel(newShopWxtemplateMsg);
         WebUtil.removeSessionAttribute(BEV);
         if (i > 0) {
             return new AjaxResult(AjaxResult.STATUS_SUCCESS, SystemMessageCode.UPDATE_SUCCES, "微信模板消息");
diff --git a/zq-erp/src/main/java/com/matrix/system/shopXcx/api/WeChatApiTools.java b/zq-erp/src/main/java/com/matrix/system/shopXcx/api/WeChatApiTools.java
index 7f5344c..2b1bfb8 100644
--- a/zq-erp/src/main/java/com/matrix/system/shopXcx/api/WeChatApiTools.java
+++ b/zq-erp/src/main/java/com/matrix/system/shopXcx/api/WeChatApiTools.java
@@ -1,23 +1,25 @@
 package com.matrix.system.shopXcx.api;
 
-import com.matrix.core.tools.LogUtil;
-import com.matrix.core.tools.PropertiesUtil;
-import com.matrix.core.tools.StringUtils;
 import com.matrix.component.tools.HttpRequest;
 import com.matrix.component.tools.HttpResponse;
+import com.matrix.core.tools.LogUtil;
+import com.matrix.core.tools.PropertiesUtil;
+import com.matrix.system.common.bean.BusParameterSettings;
+import com.matrix.system.common.constance.AppConstance;
+import com.matrix.system.common.dao.BusParameterSettingsDao;
 import net.sf.json.JSONObject;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Service;
 
 import java.io.IOException;
 
+@Service
 public class WeChatApiTools {
-	/**
-	 * 小程序秘钥
-	 */
-	private static final String XCX_SECRET = "xcx_secret";
-	/**
-	 * 小程序appid
-	 */
-	private static final String XCX_APPID = "xcx_appid";
+
+
+	@Autowired
+	private BusParameterSettingsDao busParameterSettingsDao;
+
 	/**
 	 * 微信登录url
 	 */
@@ -33,8 +35,6 @@
 	 */
 	private static String accessToken = "";
 
-	private static String appid = "";
-	private static String secret = "";
 
 
 	/**
@@ -46,31 +46,27 @@
 	 * @param code
 	 * @return
 	 */
-	public static String getXcxLoginUrl(String code) {
+	public  String getXcxLoginUrl(String code,Long companyId) {
 		String wechatLoginUrl = PropertiesUtil.getString(WECHAT_LOGIN_URL);
-		return String.format(wechatLoginUrl, getAppid(), getSecret(), code);
+		return String.format(wechatLoginUrl, getAppid(companyId), getSecret(companyId), code);
 	}
 
 	/**
 	 * 获取小程序APPId
 	 * @return
 	 */
-	public static String  getAppid(){
-		if(StringUtils.isBlank(appid)){
-			appid = PropertiesUtil.getString(XCX_APPID);
-		}
-		return  appid;
+	public  String  getAppid(Long companyId){
+		BusParameterSettings appId = busParameterSettingsDao.selectCompanyParamByCode(AppConstance.MINIPROGRAM_APPID, companyId);
+		return  appId.getParamValue();
 	}
 
 	/**
 	 * 获取小程序秘钥
 	 * @return
 	 */
-	public static String  getSecret(){
-		if(StringUtils.isBlank(secret)){
-			secret = PropertiesUtil.getString(XCX_SECRET);
-		}
-		return  secret;
+	public  String  getSecret(Long companyId){
+		BusParameterSettings secret = busParameterSettingsDao.selectCompanyParamByCode(AppConstance.MINIPROGRAM_SECRET, companyId);
+		return  secret.getParamValue();
 	}
 
 
@@ -83,7 +79,7 @@
 		accessToken = "";
 	}
 
-	public static String getAccessToken() throws IOException {
+	public  String getAccessToken(Long companyId) throws IOException {
 
 		if (isTokenInvalid()) {
 			synchronized (accessToken) {
@@ -93,7 +89,7 @@
 					HttpResponse result = null;
 					result = reqObj
 							.sendHttpGet("https://api.weixin.qq.com/cgi-bin/token?grant_type=client_credential&appid="
-									+ getAppid() + "&secret=" + getSecret(), null);
+									+ getAppid(companyId) + "&secret=" + getSecret(companyId), null);
 					JSONObject json = JSONObject.fromObject(result.getDataString());
 					String access_token = json.getString("access_token");
 					accessToken = access_token;
diff --git a/zq-erp/src/main/java/com/matrix/system/shopXcx/api/WeChatGzhApiTools.java b/zq-erp/src/main/java/com/matrix/system/shopXcx/api/WeChatGzhApiTools.java
new file mode 100644
index 0000000..7c74df6
--- /dev/null
+++ b/zq-erp/src/main/java/com/matrix/system/shopXcx/api/WeChatGzhApiTools.java
@@ -0,0 +1,134 @@
+package com.matrix.system.shopXcx.api;
+
+import com.matrix.component.tools.HttpRequest;
+import com.matrix.component.tools.HttpResponse;
+import com.matrix.core.exception.GlobleException;
+import com.matrix.core.tools.LogUtil;
+import com.matrix.core.tools.PropertiesUtil;
+import com.matrix.core.tools.StringUtils;
+import net.sf.json.JSONObject;
+
+import java.io.IOException;
+
+/***
+ * 公众号api工具
+ */
+public class WeChatGzhApiTools {
+	/**
+	 * 公众号秘钥
+	 */
+	private static final String GZH_SECRET = "gzh_secret";
+	/**
+	 * 公众号appid
+	 */
+	private static final String GZH_APPID = "gzh_appid";
+	/**
+	 * 微信登录url
+	 */
+	private static final String WECHAT_LOGIN_URL = "wechar_login_url";
+
+	/**
+	 * 上一次获取时间
+	 */
+	private static Long preTime;
+
+	/**
+	 * 当前有效的微信token
+	 */
+	private static String accessToken = "";
+
+	private static String appid = "";
+	private static String secret = "";
+
+
+
+
+	/**
+	 * 获取公众号APPId
+	 * @return
+	 */
+	public static String  getAppid(){
+		if(StringUtils.isBlank(appid)){
+			appid = PropertiesUtil.getString(GZH_APPID);
+		}
+		return  appid;
+	}
+
+	/**
+	 * 获取公众号秘钥
+	 * @return
+	 */
+	public static String  getSecret(){
+		if(StringUtils.isBlank(secret)){
+			secret = PropertiesUtil.getString(GZH_SECRET);
+		}
+		return  secret;
+	}
+
+
+
+	/**
+	 * 清空token
+	 */
+	public static void cleanAccessToken() {
+		preTime = null;
+		accessToken = "";
+	}
+
+	public static String getAccessToken(String gzhAppId, String gzhSecret) {
+
+		if (isTokenInvalid()) {
+			synchronized (accessToken) {
+				if (isTokenInvalid()) {
+					LogUtil.info("刷新微信accessToken");
+					HttpRequest reqObj = new HttpRequest();
+					HttpResponse result = null;
+					try {
+						result = reqObj
+								.sendHttpGet("https://api.weixin.qq.com/cgi-bin/token?grant_type=client_credential&appid="
+										+ gzhAppId+ "&secret=" + gzhSecret, null);
+					} catch (IOException e) {
+						LogUtil.error("获取公众号accessToken失败"+e.getMessage(),e);
+						throw new GlobleException(e.getMessage());
+					}
+					JSONObject json = JSONObject.fromObject(result.getDataString());
+
+					if(json.has("errmsg")){
+						throw new GlobleException("获取返回刷新的accessToken失败"+json.toString());
+					}else{
+						String access_token = json.getString("access_token");
+						accessToken = access_token;
+						preTime = System.currentTimeMillis();
+						LogUtil.info("返回刷新的accessToken={}", accessToken);
+						return access_token;
+					}
+
+				} else {
+					return accessToken;
+				}
+			}
+		} else {
+			LogUtil.info("返回现有accessToken={}", accessToken);
+			return accessToken;
+		}
+	}
+
+	/**
+	 * token是否无效
+	 *  TODO 由于现在有多个环境,为了防止冲突每次都获取新的token
+	 * @return
+	 */
+	private static boolean isTokenInvalid() {
+		/**		if (StringUtils.isNotBlank(accessToken) && preTime != null) {
+		 Long now = System.currentTimeMillis() / 1000;
+		 Long pre = preTime / 1000;
+		 boolean invalid = (now - pre) > 6200;
+		 return invalid;
+		 } else {
+		 return true;
+		 }*/
+		return true;
+	}
+
+
+}
diff --git a/zq-erp/src/main/java/com/matrix/system/shopXcx/api/WxUserAction.java b/zq-erp/src/main/java/com/matrix/system/shopXcx/api/WxUserAction.java
index 81ddb1d..90ab0c2 100644
--- a/zq-erp/src/main/java/com/matrix/system/shopXcx/api/WxUserAction.java
+++ b/zq-erp/src/main/java/com/matrix/system/shopXcx/api/WxUserAction.java
@@ -1,6 +1,5 @@
 package com.matrix.system.shopXcx.api;
 
-import com.alibaba.fastjson.JSON;
 import com.matrix.biz.bean.BizUser;
 import com.matrix.biz.dao.BizUserDao;
 import com.matrix.biz.service.BizUserService;
@@ -12,6 +11,7 @@
 import com.matrix.core.tools.StringUtils;
 import com.matrix.core.web.BaseAction;
 import com.matrix.system.common.constance.AppConstance;
+import com.matrix.system.common.interceptor.HostInterceptor;
 import net.sf.json.JSONObject;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.beans.factory.annotation.Value;
@@ -42,7 +42,8 @@
 	@Autowired
 	private BizUserDao bizUserDao;
 
-
+	@Autowired
+	WeChatApiTools weChatApiTools;
 
 
 
@@ -68,7 +69,7 @@
 		AjaxResult res = new AjaxResult();
 		LogUtil.info("code:{}" + code);
 		if (StringUtils.isNotBlank(code)) {
-			String requrl = WeChatApiTools.getXcxLoginUrl(code);
+			String requrl = weChatApiTools.getXcxLoginUrl(code, HostInterceptor.getCompanyId());
 			String reslutData = HttpCurlUtil.sendGetHttp(requrl, null);
 			JSONObject json = JSONObject.fromObject(reslutData);
 			LogUtil.debug("微信登录获取到登录信息={}", json);
diff --git a/zq-erp/src/main/java/com/matrix/system/shopXcx/api/action/WXShopOrderAction.java b/zq-erp/src/main/java/com/matrix/system/shopXcx/api/action/WXShopOrderAction.java
index d940ea1..54ca9f5 100644
--- a/zq-erp/src/main/java/com/matrix/system/shopXcx/api/action/WXShopOrderAction.java
+++ b/zq-erp/src/main/java/com/matrix/system/shopXcx/api/action/WXShopOrderAction.java
@@ -10,6 +10,7 @@
 import com.matrix.core.pojo.AjaxResult;
 import com.matrix.core.tools.StringUtils;
 import com.matrix.system.common.constance.AppConstance;
+import com.matrix.system.common.interceptor.HostInterceptor;
 import com.matrix.system.constance.Dictionary;
 import com.matrix.system.hive.bean.ShoppingGoods;
 import com.matrix.system.hive.dao.ShoppingGoodsDao;
diff --git a/zq-erp/src/main/java/com/matrix/system/shopXcx/api/action/WxCommonAction.java b/zq-erp/src/main/java/com/matrix/system/shopXcx/api/action/WxCommonAction.java
index 568c875..cb91885 100644
--- a/zq-erp/src/main/java/com/matrix/system/shopXcx/api/action/WxCommonAction.java
+++ b/zq-erp/src/main/java/com/matrix/system/shopXcx/api/action/WxCommonAction.java
@@ -7,7 +7,10 @@
 import com.matrix.component.wechat.externalInterface.common.Signature;
 import com.matrix.component.wechat.externalInterface.common.Util;
 import com.matrix.component.wechat.externalInterface.protocol.queryProtocol.NotifyData;
+import com.matrix.system.common.bean.BusParameterSettings;
 import com.matrix.system.common.constance.AppConstance;
+import com.matrix.system.common.dao.BusParameterSettingsDao;
+import com.matrix.system.common.interceptor.HostInterceptor;
 import com.matrix.system.hive.bean.SysVipInfo;
 import com.matrix.system.hive.dao.SysVipInfoDao;
 import com.matrix.system.shopXcx.bean.ShopActivitiesGroupJoin;
@@ -75,6 +78,11 @@
     @Autowired
     private SysVipInfoDao sysVipInfoDao;
 
+    @Autowired
+    BusParameterSettingsDao busParameterSettingsDao;
+
+
+
     @Value("${evn}")
     private String evn;
     /**
@@ -86,7 +94,7 @@
      * @throws Exception
      */
     @Transactional(rollbackFor = Exception.class)
-    @RequestMapping(value = "/wxpayCallback")
+    @RequestMapping(value = "/wxapi/wxpayCallback")
     public void payCallBack(HttpServletResponse response, HttpServletRequest request) throws IOException {
         LogUtil.info("微信支付回调start....");
 
@@ -111,7 +119,8 @@
             // 返回状态码 SUCCESS/FAIL
             if (AppConstance.CODE_SUCCESS.equals(data.getReturn_code())) {
                 // 校验签名
-                if (Signature.checkIsSignValidFromResponseString(notityXml.toString())) {
+                BusParameterSettings paySecret = busParameterSettingsDao.selectCompanyParamByCode(AppConstance.WECHARPAY_SECRET, HostInterceptor.getCompanyId());
+                if (Signature.checkIsSignValidFromResponseString(notityXml.toString(),paySecret.getParamValue())) {
                     // 校验业务结果
                     if (AppConstance.CODE_SUCCESS.equals(data.getResult_code())) {
                         // 返回SUCCESS报文
diff --git a/zq-erp/src/main/java/com/matrix/system/shopXcx/api/action/WxErpOrderAction.java b/zq-erp/src/main/java/com/matrix/system/shopXcx/api/action/WxErpOrderAction.java
new file mode 100644
index 0000000..9a3f9f4
--- /dev/null
+++ b/zq-erp/src/main/java/com/matrix/system/shopXcx/api/action/WxErpOrderAction.java
@@ -0,0 +1,139 @@
+package com.matrix.system.shopXcx.api.action;
+
+import com.alibaba.fastjson.JSONObject;
+import com.matrix.biz.bean.BizUser;
+import com.matrix.component.redis.RedisClient;
+import com.matrix.component.redis.RedisUserLoginUtils;
+import com.matrix.core.pojo.AjaxResult;
+import com.matrix.core.tools.LogUtil;
+import com.matrix.core.tools.StringUtils;
+import com.matrix.core.tools.UUIDUtil;
+import com.matrix.system.app.authority.AppAuthorityManager;
+import com.matrix.system.app.dto.LoginDto;
+import com.matrix.system.app.dto.PwdResetDto;
+import com.matrix.system.app.dto.SmsCodeDto;
+import com.matrix.system.app.dto.UploadPhotoDto;
+import com.matrix.system.app.vo.UserInfoVo;
+import com.matrix.system.common.authority.strategy.AccountPasswordLogin;
+import com.matrix.system.common.authority.strategy.LoginStrategy;
+import com.matrix.system.common.bean.SysUsers;
+import com.matrix.system.common.service.SysUsersService;
+import com.matrix.system.common.tools.PasswordUtil;
+import com.matrix.system.hive.bean.AppVersion;
+import com.matrix.system.hive.bean.SysOrderFlow;
+import com.matrix.system.hive.bean.SysShopInfo;
+import com.matrix.system.hive.bean.SysVipInfo;
+import com.matrix.system.hive.dao.SysOrderDao;
+import com.matrix.system.hive.dao.SysOrderFlowDao;
+import com.matrix.system.hive.dao.SysOrderItemDao;
+import com.matrix.system.hive.dao.SysVipInfoDao;
+import com.matrix.system.hive.plugin.util.CollectionUtils;
+import com.matrix.system.hive.plugin.util.ImageUtil;
+import com.matrix.system.hive.service.SysShopInfoService;
+import com.matrix.system.shopXcx.api.dto.ErpOrderListDto;
+import com.matrix.system.shopXcx.api.vo.ErpOrderDetailFlowVo;
+import com.matrix.system.shopXcx.api.vo.ErpOrderDetailItemVo;
+import com.matrix.system.shopXcx.api.vo.ErpOrderDetailVo;
+import io.swagger.annotations.Api;
+import io.swagger.annotations.ApiOperation;
+import io.swagger.annotations.ApiResponse;
+import io.swagger.annotations.ApiResponses;
+import org.springframework.beans.BeanUtils;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.beans.factory.annotation.Value;
+import org.springframework.validation.annotation.Validated;
+import org.springframework.web.bind.annotation.*;
+
+import java.io.File;
+import java.io.UnsupportedEncodingException;
+import java.security.NoSuchAlgorithmException;
+import java.util.ArrayList;
+import java.util.List;
+
+/**
+ * @author wzy
+ * @date 2020-12-21
+ **/
+@Api(value = "WxErpOrderAction", tags = "小程序端Erp订单查询接口")
+@RestController
+@RequestMapping(value = "/wxapi/erpOrder")
+public class WxErpOrderAction {
+
+    @Autowired
+    private SysUsersService sysUsersService;
+
+    @Autowired
+    private SysShopInfoService sysShopInfoService;
+
+    @Autowired
+    private AppAuthorityManager authorityManager;
+
+    @Autowired
+    private RedisClient redisClient;
+
+    @Autowired
+    private SysVipInfoDao vipInfoDao;
+
+    @Autowired
+    RedisUserLoginUtils redisUserLoginUtils;
+
+    @Autowired
+    private SysOrderDao sysOrderDao;
+
+    @Autowired
+    private SysOrderItemDao orderItemDao;
+
+    @Autowired
+    private SysOrderFlowDao orderFlowDao;
+
+    @Value("${file_storage_path}")
+    private String fileStoragePath;
+    @Value("${static_resource_url}")
+    private String nginxUrl;
+
+    @ApiOperation(value = "查询用户所有在ERP中产生的订单" )
+    @ApiResponses({
+            @ApiResponse(code = 200, message = "OK",  response = ErpOrderListDto.class)
+    })
+    @PostMapping(value = "/findUserOrderList")
+    public AjaxResult findUserOrderList(@RequestBody @Validated ErpOrderListDto erpOrderListDto) {
+        BizUser bizUser = redisUserLoginUtils.getLoginUser(BizUser.class);
+        SysVipInfo vipInfo = vipInfoDao.selectByPhone(bizUser.getPhoneNumber());
+        if(vipInfo!=null){
+            erpOrderListDto.setVipId(vipInfo.getId());
+            List<ErpOrderDetailVo> rows=sysOrderDao.selectErpOrderList(erpOrderListDto);
+            rows.forEach(item->{
+                item.setItems(orderItemDao.selectErpOrderItemByOrderId(item.getOrderId()));
+            });
+            return  AjaxResult.buildSuccessInstance(rows,"查询成功");
+        }else{
+            return  AjaxResult.buildFailInstance("未查询到相关订单001");
+        }
+
+    }
+
+    @ApiOperation(value = "查询用户在ERP中的订单详情" )
+    @ApiResponses({
+            @ApiResponse(code = 200, message = "OK",  response = ErpOrderListDto.class)
+    })
+    @GetMapping(value = "/findUserOrderById/{orderId}")
+    public AjaxResult findUserOrderList(@PathVariable Long orderId) {
+        ErpOrderDetailVo order=sysOrderDao.findUserOrderById(orderId);
+        order.setItems(orderItemDao.selectErpOrderItemByOrderId(order.getOrderId()));
+        List<SysOrderFlow> sysOrderFlows = orderFlowDao.selectPayMethodsAmountByOrderId(orderId);
+        List<ErpOrderDetailFlowVo> flowVos=new ArrayList<>();
+        sysOrderFlows.forEach(item->{
+            ErpOrderDetailFlowVo erpOrderDetailFlowVo = new ErpOrderDetailFlowVo();
+            BeanUtils.copyProperties(item,erpOrderDetailFlowVo);
+            flowVos.add(erpOrderDetailFlowVo);
+        });
+        order.setFlow(flowVos);
+        AjaxResult result = AjaxResult.buildSuccessInstance("查询成功");
+        result.putInMap("order",order);
+        return  result;
+    }
+
+
+
+
+}
diff --git a/zq-erp/src/main/java/com/matrix/system/shopXcx/api/action/WxShopProduct.java b/zq-erp/src/main/java/com/matrix/system/shopXcx/api/action/WxShopProduct.java
index 2b06093..6023fa5 100644
--- a/zq-erp/src/main/java/com/matrix/system/shopXcx/api/action/WxShopProduct.java
+++ b/zq-erp/src/main/java/com/matrix/system/shopXcx/api/action/WxShopProduct.java
@@ -161,9 +161,6 @@
         if (CollectionUtils.isEmpty(shopProducts)) {
             shopProduct.setDelFlag(AppConstance.DATA_USEABLE);
             shopProduct.setStatus(AppConstance.IS_PUTAWAY);
-            if(shopProduct.getIsService()==null){
-                shopProduct.setIsService(2);
-            }
             shopProduct.setCompanyId(HostInterceptor.getCompanyId());
             shopProducts = shopProductDao.selectByModelWx(shopProduct);
         }
diff --git a/zq-erp/src/main/java/com/matrix/system/shopXcx/api/action/YuyueAction.java b/zq-erp/src/main/java/com/matrix/system/shopXcx/api/action/YuyueAction.java
index efcd693..abc7fbd 100644
--- a/zq-erp/src/main/java/com/matrix/system/shopXcx/api/action/YuyueAction.java
+++ b/zq-erp/src/main/java/com/matrix/system/shopXcx/api/action/YuyueAction.java
@@ -1,13 +1,16 @@
 package com.matrix.system.shopXcx.api.action;
 
-import com.alibaba.fastjson.JSONObject;
 import com.matrix.biz.bean.BizUser;
 import com.matrix.biz.dao.BizUserDao;
 import com.matrix.component.rabbitmq.RabiitMqTemplate;
 import com.matrix.component.redis.RedisUserLoginUtils;
+import com.matrix.core.exception.GlobleException;
 import com.matrix.core.pojo.AjaxResult;
+import com.matrix.core.pojo.VerifyResult;
 import com.matrix.core.tools.DateUtil;
 import com.matrix.core.tools.StringUtils;
+import com.matrix.system.app.mapper.SysProjUseMapper;
+import com.matrix.system.app.vo.*;
 import com.matrix.system.common.bean.SysUsers;
 import com.matrix.system.common.dao.SysUsersDao;
 import com.matrix.system.common.interceptor.HostInterceptor;
@@ -15,23 +18,20 @@
 import com.matrix.system.constance.Dictionary;
 import com.matrix.system.hive.bean.*;
 import com.matrix.system.hive.dao.*;
-import com.matrix.system.hive.plugin.message.StringUtil;
 import com.matrix.system.hive.plugin.util.CollectionUtils;
-import com.matrix.core.tools.DateUtil;
-import com.matrix.system.hive.service.CodeService;
-import com.matrix.system.hive.service.SysProjUseService;
-import com.matrix.system.hive.service.SysWorkBeatuistaffService;
-import com.matrix.system.hive.service.SysWorktimeService;
-import com.matrix.system.shopXcx.bean.ShopProduct;
+import com.matrix.system.hive.service.*;
+import com.matrix.system.shopXcx.api.dto.ErpServiceCommentDto;
+import com.matrix.system.shopXcx.api.dto.ErpServiceOrderListDto;
+import com.matrix.system.shopXcx.api.vo.ErpServiceOrderListVo;
 import com.matrix.system.shopXcx.dao.ShopProductDao;
+import com.matrix.system.shopXcx.dao.ShopSkuDao;
 import com.matrix.system.shopXcx.dto.YYDayOfWeek;
 import com.matrix.system.shopXcx.dto.YYmonth;
-import com.matrix.system.shopXcx.mqTask.DTO.UserProjInfo;
-import com.matrix.system.shopXcx.mqTask.MQTaskRouting;
-import com.matrix.system.shopXcx.shopEnum.TemplateMsgType;
+import io.swagger.annotations.*;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.beans.factory.annotation.Value;
 import org.springframework.stereotype.Controller;
+import org.springframework.validation.annotation.Validated;
 import org.springframework.web.bind.annotation.*;
 
 import javax.annotation.Resource;
@@ -52,10 +52,18 @@
     SysShopInfoDao shopInfoDao;
 
     @Autowired
-    private SysVipInfoDao vipDap;
+    private SysVipInfoDao vipInfoDao;
 
     @Autowired
     private OnlinebookingDao onlinebookingDao;
+    @Autowired
+    private SysProjServicesService projServicesService;
+
+    @Autowired
+    private  SysProjServicesDao projServicesDao;
+
+    @Autowired
+    private  SysBeauticianStateService sysBeauticianStateService;
 
     @Autowired
     RedisUserLoginUtils redisUserLoginUtils;
@@ -72,7 +80,11 @@
     @Autowired
     RabiitMqTemplate rabiitMqTemplate;
 
+    @Autowired
+    SysProjUseDao projUseDao;
 
+    @Autowired
+    ShopSkuDao skuDao;
 
     @Autowired
     ShoppingGoodsAssembleDao shoppingGoodsAssembleDao;
@@ -194,48 +206,45 @@
      * @return
      */
     @RequestMapping(value = "/getUserPro/{phone}")
-    public @ResponseBody
+    @ResponseBody
+    public
     AjaxResult getUserPro(@PathVariable String phone) {
-        SysVipInfo vipInfo = vipDap.selectByPhone(phone);
-        // 根据时间获取一段排班码
-        Map<Object, Object> taocanProjMap = new HashMap<>();
-        List<UserProjInfo> userProjInfoList = new ArrayList();
-        SysProjUse sysProjUse = new SysProjUse();
-        sysProjUse.setVipId(vipInfo.getId());
-        sysProjUse.setIsOver(Dictionary.DELETED_N);
-        sysProjUse.setIsOver(Dictionary.DELETED_N);
-        sysProjUse.setStatus(Dictionary.TAOCAN_STATUS_YX);
-        // 查询出该会员的所有可消耗的选择
-        List<SysProjUse> sysProjUseList = projUseService.findByModel(sysProjUse);
-        for (int i = 0; i < sysProjUseList.size(); i++) {
-            if (sysProjUseList.get(i).getTaocanId() != null) {
-                String flag = sysProjUseList.get(i).getPlatformFlag();
-                if (taocanProjMap.keySet().contains(flag)) {
-                    ((UserProjInfo) taocanProjMap.get(flag)).getChildPro().add(coversion(sysProjUseList.get(i)));
-                } else {
-                    SysProjUse pru = sysProjUseList.get(i);
-                    UserProjInfo taocan = new UserProjInfo();
-                    taocan.setId(pru.getId());
-                    taocan.setName(pru.getProjName());
-                    taocan.setType(pru.getType());
-                    if (pru.getSurplusCount() > 10000) {
-                        taocan.setSurplusCount("不限");
-                    } else {
-                        taocan.setSurplusCount(pru.getSurplusCount() + "");
-                    }
-                    taocan.setChildPro(new ArrayList<UserProjInfo>());
-                    taocan.getChildPro().add(coversion(pru));
-                    taocanProjMap.put(flag, taocan);
-                }
-            } else {
-                userProjInfoList.add(coversion(sysProjUseList.get(i)));
-            }
+        SysVipInfo vipInfo = vipInfoDao.selectByPhone(phone);
+
+        if (vipInfo == null) {
+            throw new GlobleException("会员不存在");
         }
-        AjaxResult result = new AjaxResult();
-        result.setStatus("200");
-        result.setMapInfo(taocanProjMap);
-        result.setRows(userProjInfoList);
-        return result;
+        ServiceProductListVo productListVo = new ServiceProductListVo();
+        productListVo.setName(vipInfo.getVipName());
+        productListVo.setVipId(vipInfo.getId());
+
+        SysProjUse queryUse = new SysProjUse();
+        queryUse.setVipId(vipInfo.getId());
+        queryUse.setType(Dictionary.SHOPPING_GOODS_TYPE_XM);
+        queryUse.setTaocanId(-1L);
+        queryUse.setStatus(Dictionary.TAOCAN_STATUS_YX);
+        queryUse.setIsOver(Dictionary.FLAG_NO_N);
+        List<SysProjUse> projList = projUseService.findInPage(queryUse, null);
+        List<ServiceProjVo> serviceProjVos = SysProjUseMapper.INSTANCE.entityListToProjVoList(projList);
+
+        queryUse.setTaocanId(null);
+        queryUse.setType(Dictionary.SHOPPING_GOODS_TYPE_TC);
+        List<SysProjUse> taoCanList = projUseService.findInPage(queryUse, null);
+        List<ServiceTcVo> serviceTcVos = SysProjUseMapper.INSTANCE.entityListToTcVoList(taoCanList);
+
+        if (CollectionUtils.isNotEmpty(serviceTcVos)) {
+            serviceTcVos.forEach(item -> {
+                List<SysProjUse> sysProjUses = projUseService.selectTaocanProjUse(item.getId(), queryUse.getStatus());
+                List<ServiceProjVo> taocanProj = SysProjUseMapper.INSTANCE.entityListToProjVoList(sysProjUses);
+                item.setProj(taocanProj);
+            });
+        }
+
+        productListVo.setProj(serviceProjVos);
+        productListVo.setComposeProj(serviceTcVos);
+        AjaxResult ajaxResult = AjaxResult.buildSuccessInstance("获取成功");
+        ajaxResult.putInMap("proj", productListVo);
+        return ajaxResult;
     }
 
 
@@ -252,22 +261,52 @@
     public @ResponseBody
     AjaxResult createServiceOrder(@RequestBody Onlinebooking onlinebooking) {
         BizUser bizUser = redisUserLoginUtils.getLoginUser(BizUser.class);
-        bizUser = bizUserDao.findByOpenId(bizUser.getOpenId());
-        SysVipInfo vipInfo = vipDap.selectByPhone(bizUser.getPhoneNumber());
-        onlinebooking.setOrderNo(codeService.getServiceOrderCode());
-        onlinebooking.setVipName(vipInfo.getVipName());
-        onlinebooking.setVipId(vipInfo.getId());
-        onlinebooking.setBizUserId(bizUser.getOpenId());
-        onlinebooking.setStatus(Dictionary.ONLINEBOOKING_DFW);
-        onlinebooking.setCreateTime(new Date());
-        onlinebooking.setTime(DateUtil.stringToDate(onlinebooking.getTimeStr(), DateUtil.DATE_FORMAT_MM));
-        onlinebookingDao.insert(onlinebooking);
-        //发送消息通知
-        JSONObject msg = new JSONObject();
-        msg.put("templateMsgType", TemplateMsgType.APPOINTMENT_SUCCESS.getCode());
-        msg.put("content", onlinebooking.getId());
-        rabiitMqTemplate.sendMsg(MQTaskRouting.SEND_TEMPLATE_MSG+evn, msg.toJSONString());
-        return new AjaxResult(AjaxResult.STATUS_SUCCESS, Collections.singletonList(onlinebooking));
+        SysVipInfo vipInfo = vipInfoDao.selectByPhone(bizUser.getPhoneNumber());
+        SysProjUse sysProjUse = projUseDao.selectById(Long.parseLong(onlinebooking.getProductId() + ""));
+        Date yyTime = DateUtil.stringToDate(onlinebooking.getTimeStr(), DateUtil.DATE_FORMAT_MM);
+        SysProjServices sysProjServices = new SysProjServices();
+        sysProjServices.setCompanyId(vipInfo.getCompanyId());
+        sysProjServices.setShopId(onlinebooking.getShopId());
+        sysProjServices.setVipId(vipInfo.getId());
+        sysProjServices.setYyTime(yyTime);
+        sysProjServices.setRemark(onlinebooking.getRemark());
+
+        List<SysBeauticianState> sysBeauticianStates = new ArrayList<>();
+
+        SysBeauticianState sysBeauticianState = new SysBeauticianState();
+        sysBeauticianState.setPuseId(sysProjUse.getId());
+        sysBeauticianState.setProjUse(sysProjUse);
+        sysBeauticianState.setCount(1);
+        sysBeauticianState.setBeginTime(yyTime);
+        int timeLength=30;
+        if(sysProjUse.getTimeLength()!=null){
+            timeLength=sysProjUse.getTimeLength();
+        }
+        sysBeauticianState.setEndTime(DateUtil.getDateAfterMinute(yyTime, timeLength));
+        if(onlinebooking.getStaffId()!=null){
+            sysBeauticianState.setStaffId(Long.parseLong(onlinebooking.getStaffId()+""));
+        }
+
+        sysBeauticianStates.add(sysBeauticianState);
+        sysProjServices.setServiceItems(sysBeauticianStates);
+
+        //检测欠款
+        VerifyResult arrearsVerifyResult = projServicesService.checkArrears(sysProjServices);
+        if (arrearsVerifyResult.isError()) {
+            return new AjaxResult(AjaxResult.STATUS_FAIL, arrearsVerifyResult.getMsg());
+        }
+        //检测余次
+        VerifyResult balanceverifyResult = projServicesService.checkBalance(sysProjServices);
+        if (balanceverifyResult.isError()) {
+            return new AjaxResult(AjaxResult.STATUS_FAIL, balanceverifyResult.getMsg());
+        }
+        sysProjServices.setState(Dictionary.SERVICE_STATU_DQR);
+        SysProjServices newSysProjServices = projServicesService.addSysProjServices(sysProjServices);
+        if (newSysProjServices != null) {
+            return AjaxResult.buildSuccessInstance("下单成功");
+        } else {
+            return new AjaxResult(AjaxResult.STATUS_FAIL, "下单失败!");
+        }
     }
 
 
@@ -277,52 +316,43 @@
      * @param id
      * @return
      */
+    @ApiOperation(value = " 根据id查询预约订单的详情", notes = " 根据id查询预约订单的详情")
+    @ApiResponses({
+            @ApiResponse(code = 200, message = "ok", response = ErpServiceOrderListVo.class)
+    })
     @RequestMapping(value = "/getServiceOrderById/{id}")
     public @ResponseBody
-    AjaxResult getServiceOrderById(@PathVariable Long id) {
-
-        Onlinebooking onlinebooking = onlinebookingDao.selectById(id);
-        ShopProduct shopProduct = productDao.selectById(onlinebooking.getProductId());
-        onlinebooking.setShopProduct(shopProduct);
-        if (onlinebooking.getStaffId() != null) {
-            SysUsers shopstaffInfo = staffInfoDao.selectById(Long.parseLong(onlinebooking.getStaffId() + ""));
-            onlinebooking.setStaffInfo(shopstaffInfo);
+    AjaxResult getServiceOrderById(@PathVariable("id") Long id) {
+        SysProjServices projServices = projServicesService.findById(id);
+        if (projServices == null) {
+            return AjaxResult.buildFailInstance("服务单不存在");
         }
-        SysShopInfo shopInfo = shopInfoDao.selectById(onlinebooking.getShopId());
-        onlinebooking.setShopInfo(shopInfo);
-        AjaxResult result = new AjaxResult(AjaxResult.STATUS_SUCCESS, "查询成功");
-        result.putInMap("serviceOrder", onlinebooking);
-        return result;
-
+        ErpServiceOrderListVo serviceOrder = projServicesDao.findWxServiceOrderById(id);
+        AjaxResult ajaxResult = AjaxResult.buildSuccessInstance("获取成功");
+        ajaxResult.putInMap("detail", serviceOrder);
+        return ajaxResult;
     }
+
+
 
     /**
-     * 订单列表查询
-     *
+     * 查询服务单
+     * @param orderListDto
      * @return
      */
-    @RequestMapping(value = "/getServiceOrderList")
-    public @ResponseBody
-    AjaxResult getServiceOrderList(@RequestBody Onlinebooking onlinebooking) {
+    @ApiOperation(value = "查询服务单列表", notes = "查询服务单列表")
+    @ApiResponses({
+            @ApiResponse(code = 200, message = "ok", response = ErpServiceOrderListVo.class)
+    })
+    @PostMapping(value = "/getServiceOrderList")
+    @ResponseBody
+    public AjaxResult findServiceOrderList(@RequestBody @Validated ErpServiceOrderListDto orderListDto) {
         BizUser bizUser = redisUserLoginUtils.getLoginUser(BizUser.class);
-        onlinebooking.setBizUserId(bizUser.getOpenId());
-        List<Onlinebooking> list = onlinebookingDao.selectInPageForWx(onlinebooking);
-        //相关数据赋值
-        list.stream().forEach(order -> {
-            ShopProduct shopProduct = productDao.selectById(order.getProductId());
-            order.setShopProduct(shopProduct);
-            if (order.getStaffId() != null) {
-                SysUsers shopstaffInfo = staffInfoDao.selectById(Long.parseLong(order.getStaffId() + ""));
-                order.setStaffInfo(shopstaffInfo);
-            }
-            SysShopInfo shopInfo = shopInfoDao.selectById(order.getShopId());
-            order.setShopInfo(shopInfo);
-        });
-        AjaxResult result = new AjaxResult(AjaxResult.STATUS_SUCCESS, "查询成功");
-        result.setRows(list);
-        return result;
+        SysVipInfo vipInfo= vipInfoDao.selectByPhone(bizUser.getPhoneNumber());
+        orderListDto.setVipId(vipInfo.getId());
+        List<ErpServiceOrderListVo> apiServiceOrderListInPage = projServicesDao.findWxServiceOrderList(orderListDto);
+        return AjaxResult.buildSuccessInstance(apiServiceOrderListInPage,"查询成功");
     }
-
 
     /**
      * 取消预约订单
@@ -330,53 +360,38 @@
      * @param
      * @return
      */
-    @RequestMapping(value = "/cancelOrderById")
+    @ApiOperation(value = "取消预约", notes = "取消预约")
+    @GetMapping(value = "/cancelOrderById/{id}")
     public @ResponseBody
-    AjaxResult cancelOrderById(@RequestBody Onlinebooking onlinebooking) {
-
-        AjaxResult result = new AjaxResult();
-        if (onlinebooking.getId() == null) {
-            result.setStatus(AjaxResult.STATUS_FAIL);
-            result.setInfo("请求参数错误");
+    AjaxResult cancelOrderById(@PathVariable Long id) {
+        SysProjServices services = new SysProjServices();
+        services.setId(id);
+        int i = projServicesService.modifyCancelProjServices(services);
+        if (i > 0) {
+            return new AjaxResult(AjaxResult.STATUS_SUCCESS, "取消预约成功");
         } else {
-            onlinebooking.setStatus(Dictionary.ONLINEBOOKING_YQX);
-            onlinebookingDao.update(onlinebooking);
-            result.setStatus(AjaxResult.STATUS_SUCCESS);
-            result.setInfo("订单取消成功");
+            return new AjaxResult(AjaxResult.STATUS_FAIL, "取消预约失败");
         }
-        return result;
     }
 
-    /**
-     * 删除订单
-     *
-     * @param
-     * @return
-     */
-    @RequestMapping(value = "/removeOrderById/{id}")
+
+    @ApiOperation(value = "服务单评论", notes = "服务单评论")
+    @PostMapping(value = "/commentService")
     public @ResponseBody
-    AjaxResult removeOrderById(@PathVariable Long id) {
-        onlinebookingDao.deleteById(id);
-        AjaxResult result = new AjaxResult();
-        result.setStatus(AjaxResult.STATUS_SUCCESS);
-        result.setInfo("删除成功");
-        return result;
+    AjaxResult commentService(@RequestBody @Validated ErpServiceCommentDto commentDto) {
+        SysProjServices services = new SysProjServices();
+        services.setId(commentDto.getId());
+        services.setComment(commentDto.getComment());
+        int i = projServicesDao.update(services);
+        if (i > 0) {
+            return new AjaxResult(AjaxResult.STATUS_SUCCESS, "评论成功");
+        } else {
+            return new AjaxResult(AjaxResult.STATUS_FAIL, "评论失败");
+        }
     }
 
 
-    private UserProjInfo coversion(SysProjUse pUse) {
-        UserProjInfo projInfo = new UserProjInfo();
-        projInfo.setId(pUse.getId());
-        projInfo.setName(shoppingGoodsDao.selectById(pUse.getProjId()).getName());
-        projInfo.setSurplusCount(pUse.getSurplusCount() + "");
-        projInfo.setType(pUse.getType());
-        return projInfo;
-    }
 
-
-    private int dateToCodeInt(Date date) {
-        return Integer.parseInt(DateUtil.dateToString(date, DateUtil.HHmm));
-    }
 
 
 }
diff --git a/zq-erp/src/main/java/com/matrix/system/shopXcx/api/dto/ErpOrderListDto.java b/zq-erp/src/main/java/com/matrix/system/shopXcx/api/dto/ErpOrderListDto.java
new file mode 100644
index 0000000..a3dea39
--- /dev/null
+++ b/zq-erp/src/main/java/com/matrix/system/shopXcx/api/dto/ErpOrderListDto.java
@@ -0,0 +1,78 @@
+package com.matrix.system.shopXcx.api.dto;
+
+import com.matrix.core.pojo.PaginationDto;
+import com.matrix.system.app.dto.BasePageDto;
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+
+/**
+ * @author jyy
+ * @date 2020-12-23
+ **/
+@ApiModel(value = "ErpOrderListDto", description = "订单列表接收参数类")
+public class ErpOrderListDto extends PaginationDto {
+
+    @ApiModelProperty(value = "订单状态 0-全部 1-待付款 2-已付款 3-欠款  4-已取消 全部默认传空字符串", example = "1")
+    private Integer orderStatus;
+
+    @ApiModelProperty(hidden = true)
+    private String status;
+
+    @ApiModelProperty(value = "查询字段")
+    private String queryKey;
+
+    @ApiModelProperty(hidden = true)
+    private Long vipId;
+
+    public Long getVipId() {
+        return vipId;
+    }
+
+    public void setVipId(Long vipId) {
+        this.vipId = vipId;
+    }
+
+    public String getStatus() {
+        return status;
+    }
+
+    public void setStatus(String status) {
+        this.status = status;
+    }
+
+    public String getQueryKey() {
+        return queryKey;
+    }
+
+    public void setQueryKey(String queryKey) {
+        this.queryKey = queryKey;
+    }
+
+    public Integer getOrderStatus() {
+        return orderStatus;
+    }
+
+    public void setOrderStatus(Integer orderStatus) {
+        this.orderStatus = orderStatus;
+        switch (orderStatus) {
+            case 0 :
+                this.status = "";
+                break;
+            case 1:
+                this.status = "待付款";
+                break;
+            case 2:
+                this.status = "已付款";
+                break;
+            case 3:
+                this.status = "欠款";
+                break;
+            case 4:
+                this.status = "已取消";
+                break;
+            default:
+                this.status = "";
+                break;
+        }
+    }
+}
diff --git a/zq-erp/src/main/java/com/matrix/system/shopXcx/api/dto/ErpServiceCommentDto.java b/zq-erp/src/main/java/com/matrix/system/shopXcx/api/dto/ErpServiceCommentDto.java
new file mode 100644
index 0000000..25dbf57
--- /dev/null
+++ b/zq-erp/src/main/java/com/matrix/system/shopXcx/api/dto/ErpServiceCommentDto.java
@@ -0,0 +1,41 @@
+package com.matrix.system.shopXcx.api.dto;
+
+import com.matrix.core.pojo.PaginationDto;
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+
+import javax.validation.constraints.NotNull;
+
+/**
+ * @author jyy
+ * @date 2020-12-23
+ **/
+@ApiModel(value = "ErpServiceCommentDto", description = "服务评价")
+public class ErpServiceCommentDto   {
+
+
+    @NotNull(message = "评论内容不能为空")
+    @ApiModelProperty(value = "评论内容")
+    private String comment;
+
+    @NotNull(message = "服务单id不能为空")
+    @ApiModelProperty(value = "服务单id")
+    private Long id;
+
+
+    public String getComment() {
+        return comment;
+    }
+
+    public void setComment(String comment) {
+        this.comment = comment;
+    }
+
+    public Long getId() {
+        return id;
+    }
+
+    public void setId(Long id) {
+        this.id = id;
+    }
+}
diff --git a/zq-erp/src/main/java/com/matrix/system/shopXcx/api/dto/ErpServiceOrderListDto.java b/zq-erp/src/main/java/com/matrix/system/shopXcx/api/dto/ErpServiceOrderListDto.java
new file mode 100644
index 0000000..ceba6b0
--- /dev/null
+++ b/zq-erp/src/main/java/com/matrix/system/shopXcx/api/dto/ErpServiceOrderListDto.java
@@ -0,0 +1,50 @@
+package com.matrix.system.shopXcx.api.dto;
+
+import com.matrix.core.pojo.PaginationDto;
+import com.matrix.system.app.dto.BasePageDto;
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+
+/**
+ * @author jyy
+ * @date 2020-12-24
+ **/
+@ApiModel(value = "ErpServiceOrderListDto", description = "服务单列表参数接收类")
+public class ErpServiceOrderListDto extends PaginationDto {
+
+    @ApiModelProperty(value = "查询参数")
+    private String queryKey;
+
+    @ApiModelProperty(value = "客户视角状态 0/全部 1/待确认 2进行中(待排班/待配料/待服务/服务中) 3/待评价(已完成/服务结束) 4/已评价 5/已取消 ")
+    private String vipStatus;
+
+    @ApiModelProperty(value = "客户ID")
+    private Long vipId;
+
+    public String getVipStatus() {
+        return vipStatus;
+    }
+
+    public void setVipStatus(String vipStatus) {
+        this.vipStatus = vipStatus;
+    }
+
+    public Long getVipId() {
+        return vipId;
+    }
+
+    public void setVipId(Long vipId) {
+        this.vipId = vipId;
+    }
+
+    public String getQueryKey() {
+        return queryKey;
+    }
+
+    public void setQueryKey(String queryKey) {
+        this.queryKey = queryKey;
+    }
+
+
+
+}
diff --git a/zq-erp/src/main/java/com/matrix/system/shopXcx/api/service/impl/WxShopRefundRecordServiceImpl.java b/zq-erp/src/main/java/com/matrix/system/shopXcx/api/service/impl/WxShopRefundRecordServiceImpl.java
index 807ab9d..6030d3e 100644
--- a/zq-erp/src/main/java/com/matrix/system/shopXcx/api/service/impl/WxShopRefundRecordServiceImpl.java
+++ b/zq-erp/src/main/java/com/matrix/system/shopXcx/api/service/impl/WxShopRefundRecordServiceImpl.java
@@ -78,14 +78,13 @@
 
         //Double refundMoney = 0.1 * 100;
         //用户ID
-        String userId = WechatConfigure.mchID;
 
         if (isDebug) {
-            boolean b = weixinServiceUtil.comRefund(orderNo, refundNo, 1, 1, userId);
+            boolean b = weixinServiceUtil.comRefund(orderNo, refundNo, 1, 1, null);
             flag = b;
         } else {
             LogUtil.info("开始调用退款接口。。。退款编号为", refundNo);
-            boolean b = weixinServiceUtil.comRefund(orderNo, refundNo, orMoney, reMoney, userId);
+            boolean b = weixinServiceUtil.comRefund(orderNo, refundNo, orMoney, reMoney, null);
             flag = b;
         }
 
diff --git a/zq-erp/src/main/java/com/matrix/system/shopXcx/api/vo/ErpOrderDetailFlowVo.java b/zq-erp/src/main/java/com/matrix/system/shopXcx/api/vo/ErpOrderDetailFlowVo.java
new file mode 100644
index 0000000..c2787f7
--- /dev/null
+++ b/zq-erp/src/main/java/com/matrix/system/shopXcx/api/vo/ErpOrderDetailFlowVo.java
@@ -0,0 +1,37 @@
+package com.matrix.system.shopXcx.api.vo;
+
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+
+import java.math.BigDecimal;
+
+/**
+ * @author jyy
+ * @date 2020-12-23
+ **/
+@ApiModel(value = "ErpOrderDetailFlowVo", description = "订单支付方式")
+public class ErpOrderDetailFlowVo {
+
+
+    @ApiModelProperty(value = "支付方式")
+    private String payMethod;
+
+    @ApiModelProperty(value = "支付金额")
+    private BigDecimal amount;
+
+    public String getPayMethod() {
+        return payMethod;
+    }
+
+    public void setPayMethod(String payMethod) {
+        this.payMethod = payMethod;
+    }
+
+    public BigDecimal getAmount() {
+        return amount;
+    }
+
+    public void setAmount(BigDecimal amount) {
+        this.amount = amount;
+    }
+}
diff --git a/zq-erp/src/main/java/com/matrix/system/shopXcx/api/vo/ErpOrderDetailItemVo.java b/zq-erp/src/main/java/com/matrix/system/shopXcx/api/vo/ErpOrderDetailItemVo.java
new file mode 100644
index 0000000..a9980f3
--- /dev/null
+++ b/zq-erp/src/main/java/com/matrix/system/shopXcx/api/vo/ErpOrderDetailItemVo.java
@@ -0,0 +1,63 @@
+package com.matrix.system.shopXcx.api.vo;
+
+import com.matrix.system.app.vo.OrderDetailAchieveItemVo;
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+
+import java.math.BigDecimal;
+import java.util.List;
+
+/**
+ * @author jyy
+ * @date 2020-12-23
+ **/
+@ApiModel(value = "ErpOrderDetailItemVo", description = "订单详情明细表")
+public class ErpOrderDetailItemVo {
+
+
+    @ApiModelProperty(value = "商品名称")
+    private String goodsName;
+
+    @ApiModelProperty(value = "数量")
+    private String count;
+
+
+    @ApiModelProperty(value = "原价")
+    private BigDecimal price;
+
+    @ApiModelProperty(value = "折扣价格")
+    private BigDecimal zkPrice;
+
+
+    public String getGoodsName() {
+        return goodsName;
+    }
+
+    public void setGoodsName(String goodsName) {
+        this.goodsName = goodsName;
+    }
+
+    public String getCount() {
+        return count;
+    }
+
+    public void setCount(String count) {
+        this.count = count;
+    }
+
+    public BigDecimal getPrice() {
+        return price;
+    }
+
+    public void setPrice(BigDecimal price) {
+        this.price = price;
+    }
+
+    public BigDecimal getZkPrice() {
+        return zkPrice;
+    }
+
+    public void setZkPrice(BigDecimal zkPrice) {
+        this.zkPrice = zkPrice;
+    }
+}
diff --git a/zq-erp/src/main/java/com/matrix/system/shopXcx/api/vo/ErpOrderDetailVo.java b/zq-erp/src/main/java/com/matrix/system/shopXcx/api/vo/ErpOrderDetailVo.java
new file mode 100644
index 0000000..05189d6
--- /dev/null
+++ b/zq-erp/src/main/java/com/matrix/system/shopXcx/api/vo/ErpOrderDetailVo.java
@@ -0,0 +1,158 @@
+package com.matrix.system.shopXcx.api.vo;
+
+import com.fasterxml.jackson.annotation.JsonFormat;
+import com.matrix.core.tools.DateUtil;
+import com.matrix.system.app.vo.OrderDetailItemVo;
+import com.matrix.system.hive.bean.SysOrderFlow;
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+
+import java.math.BigDecimal;
+import java.util.Date;
+import java.util.List;
+
+/**
+ * @author jyy
+ * @date 2020-12-23
+ **/
+@ApiModel(value = "ErpOrderDetailVo", description = "订单详情返回参数类")
+public class ErpOrderDetailVo {
+
+    @ApiModelProperty(value = "订单ID")
+    private String orderId;
+
+    @ApiModelProperty(value = "门店名称")
+    private String shopName;
+
+    @ApiModelProperty(value = "订单号")
+    private String orderNo;
+
+    @ApiModelProperty(value = "顾问姓名")
+    private String staffName;
+
+
+    @ApiModelProperty(value = "应付金额")
+    private BigDecimal needPay;
+
+    @ApiModelProperty(value = "实付金额")
+    private BigDecimal realPay;
+
+    @ApiModelProperty(value = "优惠金额")
+    private BigDecimal discount;
+
+    @ApiModelProperty(value = "订单明细")
+    private List<ErpOrderDetailItemVo> items;
+
+    @ApiModelProperty(value = "支付流水")
+    private List<ErpOrderDetailFlowVo> flow;
+
+    @ApiModelProperty(value = "订单状态")
+    private String orderStatus;
+
+    @ApiModelProperty(value = "欠款")
+    private BigDecimal arrears;
+
+
+    @JsonFormat(pattern = DateUtil.DATE_FORMAT_SS, timezone = "GMT+8")
+    @ApiModelProperty(value = "下单时间")
+    private Date orderTime;
+
+
+    public List<ErpOrderDetailFlowVo> getFlow() {
+        return flow;
+    }
+
+    public void setFlow(List<ErpOrderDetailFlowVo> flow) {
+        this.flow = flow;
+    }
+
+    public String getShopName() {
+        return shopName;
+    }
+
+    public void setShopName(String shopName) {
+        this.shopName = shopName;
+    }
+
+    public String getOrderId() {
+        return orderId;
+    }
+
+    public void setOrderId(String orderId) {
+        this.orderId = orderId;
+    }
+
+    public String getOrderNo() {
+        return orderNo;
+    }
+
+    public void setOrderNo(String orderNo) {
+        this.orderNo = orderNo;
+    }
+
+    public String getStaffName() {
+        return staffName;
+    }
+
+    public void setStaffName(String staffName) {
+        this.staffName = staffName;
+    }
+
+    public BigDecimal getNeedPay() {
+        return needPay;
+    }
+
+    public void setNeedPay(BigDecimal needPay) {
+        this.needPay = needPay;
+    }
+
+    public BigDecimal getRealPay() {
+        return realPay;
+    }
+
+    public void setRealPay(BigDecimal realPay) {
+        this.realPay = realPay;
+    }
+
+    public BigDecimal getDiscount() {
+        return discount;
+    }
+
+    public void setDiscount(BigDecimal discount) {
+        this.discount = discount;
+    }
+
+    public List<ErpOrderDetailItemVo> getItems() {
+        return items;
+    }
+
+    public void setItems(List<ErpOrderDetailItemVo> items) {
+        this.items = items;
+    }
+
+    public String getOrderStatus() {
+        return orderStatus;
+    }
+
+    public void setOrderStatus(String orderStatus) {
+        this.orderStatus = orderStatus;
+    }
+
+    public BigDecimal getArrears() {
+        return arrears;
+    }
+
+    public void setArrears(BigDecimal arrears) {
+        this.arrears = arrears;
+    }
+
+    public Date getOrderTime() {
+        return orderTime;
+    }
+
+    public void setOrderTime(Date orderTime) {
+        this.orderTime = orderTime;
+    }
+
+
+}
diff --git a/zq-erp/src/main/java/com/matrix/system/shopXcx/api/vo/ErpServiceOrderListProjVo.java b/zq-erp/src/main/java/com/matrix/system/shopXcx/api/vo/ErpServiceOrderListProjVo.java
new file mode 100644
index 0000000..dc2ddd9
--- /dev/null
+++ b/zq-erp/src/main/java/com/matrix/system/shopXcx/api/vo/ErpServiceOrderListProjVo.java
@@ -0,0 +1,45 @@
+package com.matrix.system.shopXcx.api.vo;
+
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+
+@ApiModel(value = "ErpServiceOrderListProjVo", description = "服务单列表项目返回参数类")
+public class  ErpServiceOrderListProjVo {
+
+
+        @ApiModelProperty(value = "项目名称")
+        private String projName;
+
+        @ApiModelProperty(value = "项目图片")
+        private String imgMobile;
+
+        @ApiModelProperty(value = "美疗师")
+        private String beautyName="";
+
+        public String getImgMobile() {
+            return imgMobile;
+        }
+
+        public void setImgMobile(String imgMobile) {
+            this.imgMobile = imgMobile;
+        }
+
+        public String getProjName() {
+            return projName;
+        }
+
+        public void setProjName(String projName) {
+            this.projName = projName;
+        }
+
+        public String getBeautyName() {
+            return beautyName;
+        }
+
+        public void setBeautyName(String beautyName) {
+            this.beautyName = beautyName;
+        }
+    }
+
+
+
diff --git a/zq-erp/src/main/java/com/matrix/system/shopXcx/api/vo/ErpServiceOrderListVo.java b/zq-erp/src/main/java/com/matrix/system/shopXcx/api/vo/ErpServiceOrderListVo.java
new file mode 100644
index 0000000..b33ca23
--- /dev/null
+++ b/zq-erp/src/main/java/com/matrix/system/shopXcx/api/vo/ErpServiceOrderListVo.java
@@ -0,0 +1,147 @@
+package com.matrix.system.shopXcx.api.vo;
+
+import com.fasterxml.jackson.annotation.JsonFormat;
+import com.matrix.core.tools.DateUtil;
+import com.matrix.system.app.vo.ServiceOrderListProjVo;
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+
+import java.util.Date;
+import java.util.List;
+
+/**
+ * @author wzy
+ * @date 2020-12-24
+ **/
+@ApiModel(value = "ServiceOrderListVo", description = "服务单列表返回参数类")
+public class ErpServiceOrderListVo {
+
+    @ApiModelProperty(value = "服务单Id")
+    private Long id;
+
+    @ApiModelProperty(value = "服务单编号")
+    private String serviceNo;
+
+    @JsonFormat(pattern = DateUtil.DATE_FORMAT_MM, timezone = "GMT+8")
+    @ApiModelProperty(value = "预约时间")
+    private Date time;
+
+    @ApiModelProperty(value = "服务时长")
+    private Integer timeLength;
+
+    @ApiModelProperty(value = "状态 待预约  待派单  待配料  待服务  服务中  服务完成  服务单结束")
+    private String status;
+
+    @ApiModelProperty(value = "门店名称")
+    private String shopName;
+
+    @ApiModelProperty(value = "门店地址")
+    private String shopAddr;
+
+
+
+    @ApiModelProperty(value = "床位")
+    private String bed;
+
+    @ApiModelProperty(value = "客户评论")
+    private String comment="";
+
+    @ApiModelProperty(value = "员工回复")
+    private String reply;
+
+
+
+    @ApiModelProperty(value = "服务项目信息")
+    private List<ErpServiceOrderListProjVo> projs;
+
+
+    public String getComment() {
+        return comment;
+    }
+
+    public void setComment(String comment) {
+        this.comment = comment;
+    }
+
+    public String getReply() {
+        return reply;
+    }
+
+    public void setReply(String reply) {
+        this.reply = reply;
+    }
+
+    public Long getId() {
+        return id;
+    }
+
+    public void setId(Long id) {
+        this.id = id;
+    }
+
+    public String getServiceNo() {
+        return serviceNo;
+    }
+
+    public void setServiceNo(String serviceNo) {
+        this.serviceNo = serviceNo;
+    }
+
+    public Date getTime() {
+        return time;
+    }
+
+    public void setTime(Date time) {
+        this.time = time;
+    }
+
+    public String getShopName() {
+        return shopName;
+    }
+
+    public void setShopName(String shopName) {
+        this.shopName = shopName;
+    }
+
+    public String getShopAddr() {
+        return shopAddr;
+    }
+
+    public void setShopAddr(String shopAddr) {
+        this.shopAddr = shopAddr;
+    }
+
+    public Integer getTimeLength() {
+        return timeLength;
+    }
+
+    public void setTimeLength(Integer timeLength) {
+        this.timeLength = timeLength;
+    }
+
+    public String getBed() {
+        return bed;
+    }
+
+    public void setBed(String bed) {
+        this.bed = bed;
+    }
+
+    public String getStatus() {
+        return status;
+    }
+
+    public void setStatus(String status) {
+        this.status = status;
+    }
+
+    public List<ErpServiceOrderListProjVo> getProjs() {
+        return projs;
+    }
+
+    public void setProjs(List<ErpServiceOrderListProjVo> projs) {
+        this.projs = projs;
+    }
+
+
+}
diff --git a/zq-erp/src/main/java/com/matrix/system/shopXcx/bean/ShopWxtemplateMsg.java b/zq-erp/src/main/java/com/matrix/system/shopXcx/bean/ShopWxtemplateMsg.java
index 4c5e2d4..390f897 100644
--- a/zq-erp/src/main/java/com/matrix/system/shopXcx/bean/ShopWxtemplateMsg.java
+++ b/zq-erp/src/main/java/com/matrix/system/shopXcx/bean/ShopWxtemplateMsg.java
@@ -40,8 +40,15 @@
      */
     private Integer status;
 
+    /**
+     * 模板类型 1,公众号,2,小程序
+     */
+    private Integer tempType;
 
-
+    /**
+     * 取数模板类
+     */
+    private String templateClass;
 
     /**
      * 模板备注
@@ -86,24 +93,76 @@
         }
     }
 
-	public void buildDicMap(Object value) {
-		if (value != null) {
-			STATUS[] statusArray = STATUS.values();
-			for (STATUS s : statusArray) {
-				if (s.getCode().equals(value)) {
-					getDicMap().put("status", s.getName());
-				}
-			}
-		}
-	}
+    public enum TempType {
+
+        MP("公众号", 1),
+
+        APP("小程序", 2);
+
+        private TempType(String name, int code) {
+            this.name = name;
+            this.code = code;
+        }
+
+        private String name;
+        private Integer code;
+
+        public String getName() {
+            return name;
+        }
+
+        public void setName(String name) {
+            this.name = name;
+        }
+
+        public Integer getCode() {
+            return code;
+        }
+
+        public void setCode(Integer code) {
+            this.code = code;
+        }
+    }
+
+
+
     public void setStatus(Integer status) {
-        buildDicMap(status);
-
-        buildDicMap("status");
-
+        if (status != null) {
+            STATUS[] statusArray = STATUS.values();
+            for (STATUS s : statusArray) {
+                if (s.getCode().equals(status)) {
+                    getDicMap().put("status", s.getName());
+                }
+            }
+        }
         this.status = status;
     }
 
+    public String getTemplateClass() {
+        return templateClass;
+    }
+
+    public void setTemplateClass(String templateClass) {
+
+        this.templateClass = templateClass;
+    }
+
+    public Integer getTempType() {
+
+        return tempType;
+    }
+
+    public void setTempType(Integer tempType) {
+        if (tempType != null) {
+            TempType[] statusArray = TempType.values();
+            for (TempType s : statusArray) {
+                if (s.getCode().equals(tempType)) {
+                    getDicMap().put("tempType", s.getName());
+                }
+            }
+        }
+        this.tempType = tempType;
+    }
 
     public Integer getId() {
         return id;
diff --git a/zq-erp/src/main/java/com/matrix/system/shopXcx/dao/ShopProductDao.java b/zq-erp/src/main/java/com/matrix/system/shopXcx/dao/ShopProductDao.java
index 176f9c0..653bfde 100644
--- a/zq-erp/src/main/java/com/matrix/system/shopXcx/dao/ShopProductDao.java
+++ b/zq-erp/src/main/java/com/matrix/system/shopXcx/dao/ShopProductDao.java
@@ -53,6 +53,8 @@
 	 */
 	List<ShopProduct> selectByIds(@Param("ids") List<Integer> ids);
 
+	List<String> selectProductNameByIds(@Param("ids") List<Integer> ids);
+
 	List<ShopProduct> selectProductByAttrid(@Param("attrId") String attrId,@Param("shopId") Long shopId);
 
 
diff --git a/zq-erp/src/main/java/com/matrix/system/shopXcx/dao/ShopWxtemplateMsgDao.java b/zq-erp/src/main/java/com/matrix/system/shopXcx/dao/ShopWxtemplateMsgDao.java
index 96f20f4..92b583b 100644
--- a/zq-erp/src/main/java/com/matrix/system/shopXcx/dao/ShopWxtemplateMsgDao.java
+++ b/zq-erp/src/main/java/com/matrix/system/shopXcx/dao/ShopWxtemplateMsgDao.java
@@ -26,7 +26,7 @@
 	
 	public int deleteById(Integer id);
 
-	public ShopWxtemplateMsg selectByCode(Integer code);
+	public ShopWxtemplateMsg selectByCode(@Param("code") Integer code, @Param("companyId") Long companyId);
 
 	public int deleteByModel(@Param("record") ShopWxtemplateMsg shopWxtemplateMsg);
 	
diff --git a/zq-erp/src/main/java/com/matrix/system/shopXcx/mqTask/MQTaskRouting.java b/zq-erp/src/main/java/com/matrix/system/shopXcx/mqTask/MQTaskRouting.java
index 68c94d1..861de97 100644
--- a/zq-erp/src/main/java/com/matrix/system/shopXcx/mqTask/MQTaskRouting.java
+++ b/zq-erp/src/main/java/com/matrix/system/shopXcx/mqTask/MQTaskRouting.java
@@ -12,6 +12,12 @@
      * 发送微信消息
      */
     String SEND_TEMPLATE_MSG = "SEND_TEMPLATE_MSG";
+
+    /**
+     * 发送小程序统一模板消息
+     */
+    String SEND_UNIFORM_TEMPLATE_MSG = "SEND_UNIFORM_TEMPLATE_MSG";
+
     /**
      * 订单出库
      */
diff --git a/zq-erp/src/main/java/com/matrix/system/shopXcx/mqTask/OrderTask.java b/zq-erp/src/main/java/com/matrix/system/shopXcx/mqTask/OrderTask.java
index 944bb09..88aab2e 100644
--- a/zq-erp/src/main/java/com/matrix/system/shopXcx/mqTask/OrderTask.java
+++ b/zq-erp/src/main/java/com/matrix/system/shopXcx/mqTask/OrderTask.java
@@ -8,13 +8,8 @@
 import com.matrix.system.common.constance.AppConstance;
 import com.matrix.system.common.dao.BusParameterSettingsDao;
 import com.matrix.system.constance.Dictionary;
-import com.matrix.system.hive.bean.ShoppingGoods;
-import com.matrix.system.hive.bean.SysOrder;
-import com.matrix.system.hive.bean.SysOrderItem;
-import com.matrix.system.hive.bean.SysVipInfo;
-import com.matrix.system.hive.dao.SysOrderDao;
-import com.matrix.system.hive.dao.SysOrderItemDao;
-import com.matrix.system.hive.dao.SysVipInfoDao;
+import com.matrix.system.hive.bean.*;
+import com.matrix.system.hive.dao.*;
 import com.matrix.system.hive.service.CodeService;
 import com.matrix.system.hive.service.ShoppingGoodsService;
 import com.matrix.system.hive.service.SysOrderService;
@@ -27,15 +22,18 @@
 import com.rabbitmq.client.DeliverCallback;
 import com.rabbitmq.client.Delivery;
 import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Component;
 import org.springframework.transaction.annotation.Transactional;
 
 import java.io.IOException;
+import java.util.ArrayList;
 import java.util.Date;
 import java.util.List;
 
 /**
  * 微商城订单同步到erp系统
  */
+@Component
 public class OrderTask implements DeliverCallback {
 
 
@@ -75,6 +73,12 @@
     @Autowired
     BusParameterSettingsDao parameterSettingsDao;
 
+    @Autowired
+    private SysOrderFlowDao sysOrderFlowDao;
+
+    @Autowired
+    private ShoppingGoodsDao shoppingGoodsDao;
+
     @Transactional(rollbackFor = Exception.class)
     public void createOrder(ShopOrder orderDto) {
 
@@ -88,6 +92,7 @@
         }
 
         //获取订单归属门店
+        order.setCompanyId(vipInfo.getCompanyId());
         order.setShopId(Long.parseLong(orderDto.getStoreId()+""));
         //同步的订单订单编号保持一致
         order.setOrderNo(orderDto.getOrderNo());
@@ -101,6 +106,7 @@
         order.setCashPay(orderDto.getOrderMoney().doubleValue());
         order.setTotal(orderDto.getOrderMoney().doubleValue());
         order.setZkTotal(orderDto.getOrderMoney().doubleValue());
+        order.setPayTime(new Date());
         order.setArrears(0);
         int i = sysOrderDao.insert(order);
         // 创建订单明细,并计算总价与折扣总价
@@ -133,11 +139,6 @@
             orderItem.setPrice(orderItemDto.getPrice().doubleValue());
             orderItem.setZkPrice(orderItemDto.getPrice().doubleValue());
             orderItem.setGoodsId(shoppingGoods.getId());
-            if (shoppingGoods.getGoodType().equals(Dictionary.SHOPPING_GOODS_TYPE_JJCP)) {
-                orderItem.setAssembleId(shoppingGoods.getAssembleGoods().get(0).getId());
-            } else if (shoppingGoods.getGoodType().equals(Dictionary.SHOPPING_GOODS_TYPE_XM)) {
-                orderItem.setAssembleId(shoppingGoods.getAssembleProj().get(0).getId());
-            }
 
             // 设置对应产品的id
             switch (shoppingGoods.getGoodType()) {
@@ -193,6 +194,23 @@
         // 设置销量
         orderService.setShopSelCount(sourceOrder);
 
+        SysOrderFlow flow = new SysOrderFlow();
+        flow.setFlowNo(codeService.getFlowCode() + "-" + i);
+        Long goodsId = sourceOrder.getItems().get(0).getGoodsId();
+        ShoppingGoods goods = shoppingGoodsDao.selectById(goodsId);
+        flow.setFlowContent(goods.getName() + "等" + sourceOrder.getItems().size() + "件产品");
+
+        flow.setOrderId(sourceOrder.getId());
+        flow.setVipId(sourceOrder.getVipId());
+        flow.setFlowType(SysOrderFlow.FLOW_TYPE_BUY);
+
+        flow.setAmount(orderDto.getOrderMoney());
+        flow.setPayMethod("微信");
+
+        flow.setShopId(sourceOrder.getShopId());
+        flow.setCompanyId(sourceOrder.getCompanyId());
+        sysOrderFlowDao.insert(flow);
+
     }
 
 
diff --git a/zq-erp/src/main/java/com/matrix/system/shopXcx/mqTask/VipCreateTask.java b/zq-erp/src/main/java/com/matrix/system/shopXcx/mqTask/VipCreateTask.java
index 5d59638..67b5bbb 100644
--- a/zq-erp/src/main/java/com/matrix/system/shopXcx/mqTask/VipCreateTask.java
+++ b/zq-erp/src/main/java/com/matrix/system/shopXcx/mqTask/VipCreateTask.java
@@ -5,6 +5,7 @@
 import com.matrix.biz.service.BizUserService;
 import com.matrix.component.rabbitmq.MqTask;
 import com.matrix.core.tools.LogUtil;
+import com.matrix.core.tools.StringUtils;
 import com.matrix.system.constance.Dictionary;
 import com.matrix.system.hive.bean.SysShopInfo;
 import com.matrix.system.hive.bean.SysVipInfo;
@@ -45,16 +46,26 @@
             SysVipInfo vip = vipDap.selectByPhone(userInfo.getPhoneNumber());
             if (vip != null) {
                 LogUtil.warn("会员{}已经存在", userInfo.getPhoneNumber());
+                //更新信息
+                vip.setOpenId(userInfo.getOpenId());
+                if(StringUtils.isBlank(vip.getPhoto())){
+                    vip.setPhoto(userInfo.getAvatarUrl());
+                }
+                vipDap.update(vip);
             } else {
                 SysVipInfo vipInfo = new SysVipInfo();
                 //在备注记下微商城的用户id
-                vipInfo.setRemark(userInfo.getOpenId());
+                vipInfo.setOpenId(userInfo.getOpenId());
                 vipInfo.setAddr(userInfo.getProvince() + " " + userInfo.getCity());
                 vipInfo.setPhone(userInfo.getPhoneNumber());
+                if(StringUtils.isBlank(vipInfo.getPhoto())){
+                    vipInfo.setPhoto(userInfo.getAvatarUrl());
+                }
                 if (userInfo.getGender() != null) {
                     vipInfo.setSex(userInfo.getGender().equals("1") ? "男" : "女");
                 }
                 vipInfo.setVipName(userInfo.getNickName());
+                vipInfo.setCompanyId(userInfo.getCompanyId());
                 vipInfo.setShopId(shopId);
                 vipInfo.setArrivalWay("微商城");
                 vipInfo.setVipState(Dictionary.VIP_STATE_HY);
diff --git a/zq-erp/src/main/java/com/matrix/system/shopXcx/mqTask/templateMsg/AppointmentSuccess.java b/zq-erp/src/main/java/com/matrix/system/shopXcx/mqTask/templateMsg/AppointmentSuccess.java
index 69ae1e6..3dbd6f4 100644
--- a/zq-erp/src/main/java/com/matrix/system/shopXcx/mqTask/templateMsg/AppointmentSuccess.java
+++ b/zq-erp/src/main/java/com/matrix/system/shopXcx/mqTask/templateMsg/AppointmentSuccess.java
@@ -48,7 +48,7 @@
         SysShopInfo shopInfo = shopInfoDao.selectById(onlinebooking.getShopId());
 
         //获取模板id
-        ShopWxtemplateMsg wxtemplateMsg = wxtemplateMsgDao.selectByCode(TemplateMsgType.APPOINTMENT_SUCCESS.getCode());
+        ShopWxtemplateMsg wxtemplateMsg = wxtemplateMsgDao.selectByCode(TemplateMsgType.APPOINTMENT_SUCCESS.getCode(), 17L);
 
 
         String page = "pages/yuyue/yyInfo?id=" + orderId + "&model=1";
diff --git a/zq-erp/src/main/java/com/matrix/system/wechart/templateMsg/GzhTemplateMessagePojo.java b/zq-erp/src/main/java/com/matrix/system/wechart/templateMsg/GzhTemplateMessagePojo.java
new file mode 100644
index 0000000..d6c6517
--- /dev/null
+++ b/zq-erp/src/main/java/com/matrix/system/wechart/templateMsg/GzhTemplateMessagePojo.java
@@ -0,0 +1,134 @@
+package com.matrix.system.wechart.templateMsg;
+
+import com.alibaba.fastjson.JSONObject;
+import com.aliyuncs.utils.HttpsUtils;
+import org.apache.commons.collections.map.HashedMap;
+
+import java.util.Map;
+
+/**
+ * 公众号模板消息对象
+ */
+public class GzhTemplateMessagePojo {
+
+    private  String appid;
+    private  String touser;
+    private  String template_id;
+    private  String url;
+    private  Miniprogram miniprogram;
+    public static class Miniprogram{
+        private  String appid;
+        private  String pagepath;
+
+        public Miniprogram(String appid, String pagepath) {
+            this.appid = appid;
+            this.pagepath = pagepath;
+        }
+
+        public String getAppid() {
+            return appid;
+        }
+
+        public void setAppid(String appid) {
+            this.appid = appid;
+        }
+
+        public String getPagepath() {
+            return pagepath;
+        }
+
+        public void setPagepath(String pagepath) {
+            this.pagepath = pagepath;
+        }
+    }
+    public Map<String ,Item> data=new HashedMap();
+    public static class Item{
+        private String value;
+        private String color;
+
+        public Item(String value, String color) {
+            this.value = value;
+            this.color = color;
+        }
+
+        public String getValue() {
+            return value;
+        }
+
+        public void setValue(String value) {
+            this.value = value;
+        }
+
+        public String getColor() {
+            return color;
+        }
+
+        public void setColor(String color) {
+            this.color = color;
+        }
+    }
+
+
+    public String getAppid() {
+        return appid;
+    }
+
+    public void setAppid(String appid) {
+        this.appid = appid;
+    }
+
+    public void setMiniprogram(String appid, String url){
+        this.setMiniprogram(new Miniprogram(appid,url));
+    }
+    public void setFirst(String value, String color){
+        this.data.put("first",new Item(value,color));
+    }
+
+    public void setKeyWord(String value, String color){
+        this.data.put("keyword"+(this.data.size()),new Item(value,color));
+    }
+    public void setRemark(String value, String color){
+        this.data.put("remark",new Item(value,color));
+    }
+
+    public Miniprogram getMiniprogram() {
+        return miniprogram;
+    }
+
+    public void setMiniprogram(Miniprogram miniprogram) {
+        this.miniprogram = miniprogram;
+    }
+
+    public Map<String, Item> getData() {
+        return data;
+    }
+
+    public void setData(Map<String, Item> data) {
+        this.data = data;
+    }
+
+    public String getTouser() {
+        return touser;
+    }
+
+    public void setTouser(String touser) {
+        this.touser = touser;
+    }
+
+    public String getTemplate_id() {
+        return template_id;
+    }
+
+    public void setTemplate_id(String template_id) {
+        this.template_id = template_id;
+    }
+
+    public String getUrl() {
+        return url;
+    }
+
+    public void setUrl(String url) {
+        this.url = url;
+    }
+
+}
diff --git a/zq-erp/src/main/java/com/matrix/system/wechart/templateMsg/Task/TemplateMessageBulder.java b/zq-erp/src/main/java/com/matrix/system/wechart/templateMsg/Task/TemplateMessageBulder.java
new file mode 100644
index 0000000..4c0bafa
--- /dev/null
+++ b/zq-erp/src/main/java/com/matrix/system/wechart/templateMsg/Task/TemplateMessageBulder.java
@@ -0,0 +1,19 @@
+package com.matrix.system.wechart.templateMsg.Task;
+
+import com.matrix.system.wechart.templateMsg.UniformMsgPojo;
+
+import java.util.Map;
+
+/**
+ * 动态构建消息主体内容
+ * @author jyy
+ *
+ */
+public interface TemplateMessageBulder {
+    /**
+     *  * 返回的map中 如果包含错误消息用error属性来表示
+     * @param param
+     * @return
+     */
+    Map buildMsg(Map param);
+}
diff --git a/zq-erp/src/main/java/com/matrix/system/wechart/templateMsg/Task/UniformMsgSentTask.java b/zq-erp/src/main/java/com/matrix/system/wechart/templateMsg/Task/UniformMsgSentTask.java
new file mode 100644
index 0000000..7196340
--- /dev/null
+++ b/zq-erp/src/main/java/com/matrix/system/wechart/templateMsg/Task/UniformMsgSentTask.java
@@ -0,0 +1,115 @@
+package com.matrix.system.wechart.templateMsg.Task;
+
+
+import com.alibaba.fastjson.JSONObject;
+import com.matrix.biz.bean.BizUser;
+import com.matrix.biz.service.BizUserService;
+import com.matrix.component.tools.HttpClientUtil;
+import com.matrix.core.pojo.AjaxResult;
+import com.matrix.core.tools.LogUtil;
+import com.matrix.core.tools.rr.GlueFactory;
+import com.matrix.system.common.bean.BusParameterSettings;
+import com.matrix.system.common.constance.AppConstance;
+import com.matrix.system.common.dao.BusParameterSettingsDao;
+import com.matrix.system.constance.Dictionary;
+import com.matrix.system.hive.bean.SysProjServices;
+import com.matrix.system.hive.bean.SysVipInfo;
+import com.matrix.system.hive.dao.SysProjServicesDao;
+import com.matrix.system.hive.dao.SysShopInfoDao;
+import com.matrix.system.hive.dao.SysVipInfoDao;
+import com.matrix.system.shopXcx.api.WeChatGzhApiTools;
+import com.matrix.system.shopXcx.bean.ShopWxtemplateMsg;
+import com.matrix.system.shopXcx.dao.ShopWxtemplateMsgDao;
+import com.matrix.system.wechart.templateMsg.GzhTemplateMessagePojo;
+import com.matrix.system.wechart.templateMsg.UniformMsgPojo;
+import com.rabbitmq.client.DeliverCallback;
+import com.rabbitmq.client.Delivery;
+import io.swagger.models.auth.In;
+import org.apache.commons.collections.map.HashedMap;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Component;
+
+import java.io.IOException;
+import java.util.List;
+import java.util.Map;
+
+/**
+ * 小程序统一消息模板消息发送提醒
+ * @author jyy
+ */
+@Component
+public class UniformMsgSentTask implements DeliverCallback {
+
+    @Autowired
+    private ShopWxtemplateMsgDao shopWxtemplateMsgDao;
+
+    @Autowired
+    private BusParameterSettingsDao busParameterSettingsDao;
+
+    /**
+     * 发送模板消息需要传JSONO字符串作为格式
+     * 例如:{"companyId":17}
+     * companyId 是必须属性
+     * @param consumerTag
+     * @param message
+     * @throws IOException
+     */
+    @Override
+    public void handle(String consumerTag, Delivery message) throws IOException {
+        try {
+            String messages = new String(message.getBody(), "UTF-8");
+            JSONObject messageJsonParam=JSONObject.parseObject(messages);
+
+            if(!messageJsonParam.containsKey("companyId")||(!messageJsonParam.containsKey("templateCode"))){
+                LogUtil.error("小程序消息推送参数格式异常发送模板消息需要传JSONO字符串作为格式 例如:{\"companyId\":17,\"templateCode\":10000} companyId 、templateCode 是必须属性");
+                return;
+            }
+            Long companyId = Long.parseLong( messageJsonParam.get("companyId").toString());
+            Integer templateCode = Integer.parseInt( messageJsonParam.get("templateCode").toString());
+
+            //获取公司微信配置参数
+            BusParameterSettings xcxAppId = busParameterSettingsDao.selectCompanyParamByCode(AppConstance.MINIPROGRAM_APPID, companyId);
+            BusParameterSettings xcxSecret = busParameterSettingsDao.selectCompanyParamByCode(AppConstance.MINIPROGRAM_SECRET, companyId);
+            BusParameterSettings gzhAppid = busParameterSettingsDao.selectCompanyParamByCode(AppConstance.GZH_APPID, companyId);
+            //获取消息模板
+            ShopWxtemplateMsg template = shopWxtemplateMsgDao.selectByCode(templateCode,companyId);
+            //校验参数
+            if(xcxAppId==null||xcxSecret==null||gzhAppid==null||template==null){
+                LogUtil.error("小程序消息推送配置缺失xcxAppId="+xcxAppId+";xcxSecret="+xcxSecret+";gzhAppid="+gzhAppid+";template="+template);
+                return;
+            }
+            //获取模板动态构建类
+            TemplateMessageBulder templateMessageBulder = (TemplateMessageBulder) GlueFactory.getInstance().loadInstance(template.getTemplateClass());
+            //为模板动态类装备必要的参数
+            Map<String, Object> bulderParam = new HashedMap();
+            bulderParam.put("xcxAppId", xcxAppId.getParamValue());
+            bulderParam.put("gzhAppid", gzhAppid.getParamValue());
+            bulderParam.put("template_id", template.getUuid());
+            bulderParam.put("messageJsonParam", messageJsonParam);
+            //调用模板计算出消息体
+            Map msgResult = templateMessageBulder.buildMsg(bulderParam);
+
+            if(msgResult.containsKey("error")){
+                //错误消息处理
+                LogUtil.error("模板消息发送内容:"+msgResult.get("error"));
+                return;
+            }else{
+                //正常返回消息
+                List msgList = (List) msgResult.get("msgList");
+                //获取acceToken
+                String ACCESS_TOKEN = WeChatGzhApiTools.getAccessToken(xcxAppId.getParamValue(), xcxSecret.getParamValue());
+                String url = "https://api.weixin.qq.com/cgi-bin/message/wxopen/template/uniform_send?access_token=ACCESS_TOKEN".replaceAll("ACCESS_TOKEN", ACCESS_TOKEN);
+                for (Object msg : msgList) {
+                    UniformMsgPojo uniformMsgPojo = (UniformMsgPojo) msg;
+                    LogUtil.debug("微信小程序模板消息推送:" + JSONObject.toJSON(uniformMsgPojo).toString());
+                    //推送消息到微信
+                    JSONObject result = HttpClientUtil.sendPostWithJson(url, JSONObject.toJSON(uniformMsgPojo).toString());
+                    //微信返回值
+                    LogUtil.debug("微信小程序模板消息推送结果:" + result.toString());
+                }
+            }
+        } catch (Exception e) {
+            LogUtil.error("消费者执行异常", e);
+        }
+    }
+}
diff --git a/zq-erp/src/main/java/com/matrix/system/wechart/templateMsg/Task/messageBulderDemo/CzcgTemplateMessageBulder.java b/zq-erp/src/main/java/com/matrix/system/wechart/templateMsg/Task/messageBulderDemo/CzcgTemplateMessageBulder.java
new file mode 100644
index 0000000..44428c8
--- /dev/null
+++ b/zq-erp/src/main/java/com/matrix/system/wechart/templateMsg/Task/messageBulderDemo/CzcgTemplateMessageBulder.java
@@ -0,0 +1,110 @@
+package com.matrix.system.wechart.templateMsg.Task.messageBulderDemo;
+
+import com.alibaba.fastjson.JSONObject;
+import com.matrix.core.tools.DateUtil;
+import com.matrix.core.tools.StringUtils;
+import com.matrix.system.hive.bean.SysOrder;
+import com.matrix.system.hive.bean.SysOrderItem;
+import com.matrix.system.hive.bean.SysShopInfo;
+import com.matrix.system.hive.bean.SysVipInfo;
+import com.matrix.system.hive.dao.*;
+import com.matrix.system.wechart.templateMsg.GzhTemplateMessagePojo;
+import com.matrix.system.wechart.templateMsg.Task.TemplateMessageBulder;
+import com.matrix.system.wechart.templateMsg.UniformMsgPojo;
+import org.apache.commons.collections.map.HashedMap;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Component;
+
+import java.util.ArrayList;
+import java.util.List;
+import java.util.Map;
+
+/**
+ * 充值成功提醒
+ */
+@Component
+public class CzcgTemplateMessageBulder implements TemplateMessageBulder {
+
+    @Autowired
+    SysOrderDao orderDao;
+
+    @Autowired
+    SysVipInfoDao vipInfoDao;
+
+    @Autowired
+    private SysBeauticianStateDao beauticianStateDao;
+
+    @Autowired
+    private SysShopInfoDao shopInfoDao;
+
+    @Autowired
+    private  SysOrderItemDao orderItemDao;
+
+
+
+    @Override
+    public Map buildMsg(Map param) {
+
+        //返回参数
+        Map builParam=new HashedMap();
+        //获取基础公共参数
+        String gzhAppid= (String) param.get("gzhAppid");
+        String template_id= (String) param.get("template_id");
+        String xcxAppId= (String) param.get("xcxAppId");
+        //模板消息列表
+        List msgList=new ArrayList();
+
+        //触发点传送的json参数
+        JSONObject messageJsonParam= (JSONObject) param.get("messageJsonParam");
+        //构建消息主体
+        Long orderId= (Long) messageJsonParam.get("orderId");
+        SysOrder sysOrder = orderDao.selectById(orderId);
+        List<SysOrderItem> sysOrderItems = orderItemDao.selectByOrderId(orderId);
+
+        //校验客户openId (必须)
+        SysVipInfo vipInfo=vipInfoDao.selectById(sysOrder.getVipId());
+        String touser= vipInfo.getOpenId();
+        if(StringUtils.isBlank(touser)){
+            builParam.put("error","未获取到"+vipInfo.getVipName()+"用户小程序openid");
+            return builParam;
+        }
+
+
+        //自定义信息区START=========================================================================================================
+        SysShopInfo sysShopInfo = shopInfoDao.selectById(sysOrder.getShopId());
+        String time= DateUtil.dateFormatStr(sysOrder.getPayTime(),DateUtil.DATE_FORMAT_MM);
+
+        //如果一个项目存在多个护理项目则发送多次消息
+        String first="您好!充值余额成功";
+        for (SysOrderItem orderItem:sysOrderItems){
+            first+=orderItem.getShoppingGoods().getName()+"x"+orderItem.getCount()+",";
+        }
+        first=first.substring(0,first.length());
+        UniformMsgPojo uniformMsgPojo=new UniformMsgPojo();
+        GzhTemplateMessagePojo messagePojo=new GzhTemplateMessagePojo();
+        uniformMsgPojo.setTouser(touser);
+        messagePojo.setTemplate_id(template_id);
+        messagePojo.setAppid(gzhAppid);
+        //个性参数设置
+        messagePojo.setFirst(first,"#453454");
+        messagePojo.setKeyWord(sysShopInfo.getShopName(),"#453454");
+        messagePojo.setKeyWord(vipInfo.getVipNo(),"#453454");
+        messagePojo.setKeyWord(time,"#453454");
+        messagePojo.setKeyWord(sysOrder.getZkTotal()+"","#453454");
+        messagePojo.setRemark("点击【详情】可查询订单明细,若非本人或授权操作,请及时与门店联系","#453454");
+
+        //小程序配置
+        GzhTemplateMessagePojo.Miniprogram miniprogram=new GzhTemplateMessagePojo.Miniprogram(xcxAppId,
+                "pages/purchaseRecords/detail?id="+orderId);
+        messagePojo.setMiniprogram(miniprogram);
+
+
+        uniformMsgPojo.setMp_template_msg(messagePojo);
+        //自定义信息区END=========================================================================================================
+
+        //返回调用者使用的参数(必须)
+        msgList.add(uniformMsgPojo);
+        builParam.put("msgList",msgList);
+        return builParam;
+    }
+}
diff --git a/zq-erp/src/main/java/com/matrix/system/wechart/templateMsg/Task/messageBulderDemo/DdqxTemplateMessageBulder.java b/zq-erp/src/main/java/com/matrix/system/wechart/templateMsg/Task/messageBulderDemo/DdqxTemplateMessageBulder.java
new file mode 100644
index 0000000..03efc5b
--- /dev/null
+++ b/zq-erp/src/main/java/com/matrix/system/wechart/templateMsg/Task/messageBulderDemo/DdqxTemplateMessageBulder.java
@@ -0,0 +1,110 @@
+package com.matrix.system.wechart.templateMsg.Task.messageBulderDemo;
+
+import com.alibaba.fastjson.JSONObject;
+import com.matrix.core.tools.DateUtil;
+import com.matrix.core.tools.StringUtils;
+import com.matrix.system.hive.bean.SysOrder;
+import com.matrix.system.hive.bean.SysOrderItem;
+import com.matrix.system.hive.bean.SysShopInfo;
+import com.matrix.system.hive.bean.SysVipInfo;
+import com.matrix.system.hive.dao.*;
+import com.matrix.system.wechart.templateMsg.GzhTemplateMessagePojo;
+import com.matrix.system.wechart.templateMsg.Task.TemplateMessageBulder;
+import com.matrix.system.wechart.templateMsg.UniformMsgPojo;
+import org.apache.commons.collections.map.HashedMap;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Component;
+
+import java.util.ArrayList;
+import java.util.List;
+import java.util.Map;
+
+/**
+ * 订单取消提醒
+ */
+@Component
+public class DdqxTemplateMessageBulder implements TemplateMessageBulder {
+
+    @Autowired
+    SysOrderDao orderDao;
+
+    @Autowired
+    SysVipInfoDao vipInfoDao;
+
+    @Autowired
+    private SysBeauticianStateDao beauticianStateDao;
+
+    @Autowired
+    private SysShopInfoDao shopInfoDao;
+
+    @Autowired
+    private  SysOrderItemDao orderItemDao;
+
+
+
+    @Override
+    public Map buildMsg(Map param) {
+
+        //返回参数
+        Map builParam=new HashedMap();
+        //获取基础公共参数
+        String gzhAppid= (String) param.get("gzhAppid");
+        String template_id= (String) param.get("template_id");
+        String xcxAppId= (String) param.get("xcxAppId");
+        //模板消息列表
+        List msgList=new ArrayList();
+
+        //触发点传送的json参数
+        JSONObject messageJsonParam= (JSONObject) param.get("messageJsonParam");
+        //构建消息主体
+        Long orderId= (Long) messageJsonParam.get("orderId");
+        SysOrder sysOrder = orderDao.selectById(orderId);
+        List<SysOrderItem> sysOrderItems = orderItemDao.selectByOrderId(orderId);
+
+        //校验客户openId (必须)
+        SysVipInfo vipInfo=vipInfoDao.selectById(sysOrder.getVipId());
+        String touser= vipInfo.getOpenId();
+        if(StringUtils.isBlank(touser)){
+            builParam.put("error","未获取到"+vipInfo.getVipName()+"用户小程序openid");
+            return builParam;
+        }
+
+
+        //自定义信息区START=========================================================================================================
+        SysShopInfo sysShopInfo = shopInfoDao.selectById(sysOrder.getShopId());
+        String time= DateUtil.dateFormatStr(sysOrder.getPayTime(),DateUtil.DATE_FORMAT_MM);
+
+        //如果一个项目存在多个护理项目则发送多次消息
+        String first="您好!您的订单已取消!";
+        String goodsName="";
+        for (SysOrderItem orderItem:sysOrderItems){
+            goodsName+=orderItem.getShoppingGoods().getName()+"x"+orderItem.getCount()+",";
+        }
+        goodsName=goodsName.substring(0,first.length());
+        UniformMsgPojo uniformMsgPojo=new UniformMsgPojo();
+        GzhTemplateMessagePojo messagePojo=new GzhTemplateMessagePojo();
+        uniformMsgPojo.setTouser(touser);
+        messagePojo.setTemplate_id(template_id);
+        messagePojo.setAppid(gzhAppid);
+        //个性参数设置
+        messagePojo.setFirst(first,"#453454");
+        messagePojo.setKeyWord(sysOrder.getOrderNo(),"#453454");
+        messagePojo.setKeyWord(goodsName,"#453454");
+        messagePojo.setKeyWord(time,"#453454");
+        messagePojo.setRemark("如有需要,请重新下单 ,点击【详情】可查询订单明细,若非本人或授权操作,请及时与门店联系","#453454");
+
+        //小程序配置
+        GzhTemplateMessagePojo.Miniprogram miniprogram=new GzhTemplateMessagePojo.Miniprogram(xcxAppId,
+                "pages/purchaseRecords/detail?id="+orderId);
+        messagePojo.setMiniprogram(miniprogram);
+
+
+        uniformMsgPojo.setMp_template_msg(messagePojo);
+        //自定义信息区END=========================================================================================================
+
+        //返回调用者使用的参数(必须)
+        msgList.add(uniformMsgPojo);
+        builParam.put("msgList",msgList);
+        return builParam;
+    }
+}
diff --git a/zq-erp/src/main/java/com/matrix/system/wechart/templateMsg/Task/messageBulderDemo/DefaultTemplateMessageBulder.java b/zq-erp/src/main/java/com/matrix/system/wechart/templateMsg/Task/messageBulderDemo/DefaultTemplateMessageBulder.java
new file mode 100644
index 0000000..d917a1e
--- /dev/null
+++ b/zq-erp/src/main/java/com/matrix/system/wechart/templateMsg/Task/messageBulderDemo/DefaultTemplateMessageBulder.java
@@ -0,0 +1,99 @@
+package com.matrix.system.wechart.templateMsg.Task.messageBulderDemo;
+
+import com.alibaba.fastjson.JSONObject;
+import com.matrix.biz.bean.BizUser;
+import com.matrix.biz.dao.BizUserDao;
+import com.matrix.core.tools.DateUtil;
+import com.matrix.core.tools.StringUtils;
+import com.matrix.system.hive.bean.SysBeauticianState;
+import com.matrix.system.hive.bean.SysProjServices;
+import com.matrix.system.hive.bean.SysVipInfo;
+import com.matrix.system.hive.dao.SysBeauticianStateDao;
+import com.matrix.system.hive.dao.SysProjServicesDao;
+import com.matrix.system.hive.dao.SysVipInfoDao;
+import com.matrix.system.wechart.templateMsg.GzhTemplateMessagePojo;
+import com.matrix.system.wechart.templateMsg.Task.TemplateMessageBulder;
+import com.matrix.system.wechart.templateMsg.UniformMsgPojo;
+import io.swagger.models.auth.In;
+import org.apache.commons.collections.map.HashedMap;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Component;
+
+import java.util.ArrayList;
+import java.util.List;
+import java.util.Map;
+
+/**
+ * 某个公司客户的定制消息模板
+ */
+@Component
+public class DefaultTemplateMessageBulder implements TemplateMessageBulder {
+
+    @Autowired
+    SysProjServicesDao projServicesDao;
+
+    @Autowired
+    SysVipInfoDao vipInfoDao;
+
+    @Autowired
+    private SysBeauticianStateDao beauticianStateDao;
+
+
+
+    @Override
+    public Map buildMsg(Map param) {
+
+        //返回参数
+        Map builParam=new HashedMap();
+
+
+        //获取基础公共参数
+        String gzhAppid= (String) param.get("gzhAppid");
+        String template_id= (String) param.get("template_id");
+        //触发点传送的json参数
+        JSONObject messageJsonParam= (JSONObject) param.get("messageJsonParam");
+
+        Long serviceId= (Long) messageJsonParam.get("serviceId");
+
+
+        //构建消息主体
+        SysProjServices sysProjServices = projServicesDao.selectById(serviceId);
+
+
+        //补充服务单扩展信息===============
+        List<SysBeauticianState> beauticianStateList = beauticianStateDao.selectBySerIds(sysProjServices.getId());
+
+        SysVipInfo vipInfo=vipInfoDao.selectById(sysProjServices.getVipId());
+        String touser= vipInfo.getOpenId();
+        if(StringUtils.isBlank(touser)){
+            builParam.put("error","未获取到"+vipInfo.getVipName()+"用户小程序openid");
+            return builParam;
+        }
+
+        String time= DateUtil.dateFormatStr(sysProjServices.getConsumeTime(),DateUtil.DATE_FORMAT_MM);
+        List msgList=new ArrayList();
+        //如果一个项目存在多个护理项目则发送多次消息
+        for (SysBeauticianState beauticianState:beauticianStateList){
+            UniformMsgPojo uniformMsgPojo=new UniformMsgPojo();
+            GzhTemplateMessagePojo messagePojo=new GzhTemplateMessagePojo();
+            uniformMsgPojo.setTouser(touser);
+            messagePojo.setTemplate_id(template_id);
+            messagePojo.setAppid(gzhAppid);
+
+
+            //个性参数设置
+            Integer suplerTimes= beauticianState.getProjUse().getSurplusCount();
+            messagePojo.setFirst("尊敬的:"+vipInfo.getVipName(),"#453454");
+            messagePojo.setKeyWord(beauticianState.getProjInfo().getName(),"#453454");
+            messagePojo.setKeyWord(time,"#453454");
+            messagePojo.setRemark("您的护理项目剩余"+suplerTimes+"次。","#453454");
+            uniformMsgPojo.setMp_template_msg(messagePojo);
+
+
+            msgList.add(uniformMsgPojo);
+        }
+
+        builParam.put("msgList",msgList);
+        return builParam;
+    }
+}
diff --git a/zq-erp/src/main/java/com/matrix/system/wechart/templateMsg/Task/messageBulderDemo/FwwcTemplateMessageBulder.java b/zq-erp/src/main/java/com/matrix/system/wechart/templateMsg/Task/messageBulderDemo/FwwcTemplateMessageBulder.java
new file mode 100644
index 0000000..86b2ddc
--- /dev/null
+++ b/zq-erp/src/main/java/com/matrix/system/wechart/templateMsg/Task/messageBulderDemo/FwwcTemplateMessageBulder.java
@@ -0,0 +1,109 @@
+package com.matrix.system.wechart.templateMsg.Task.messageBulderDemo;
+
+import com.alibaba.fastjson.JSONObject;
+import com.matrix.core.tools.DateUtil;
+import com.matrix.core.tools.StringUtils;
+import com.matrix.system.hive.bean.SysBeauticianState;
+import com.matrix.system.hive.bean.SysProjServices;
+import com.matrix.system.hive.bean.SysShopInfo;
+import com.matrix.system.hive.bean.SysVipInfo;
+import com.matrix.system.hive.dao.SysBeauticianStateDao;
+import com.matrix.system.hive.dao.SysProjServicesDao;
+import com.matrix.system.hive.dao.SysShopInfoDao;
+import com.matrix.system.hive.dao.SysVipInfoDao;
+import com.matrix.system.wechart.templateMsg.GzhTemplateMessagePojo;
+import com.matrix.system.wechart.templateMsg.Task.TemplateMessageBulder;
+import com.matrix.system.wechart.templateMsg.UniformMsgPojo;
+import org.apache.commons.collections.map.HashedMap;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Component;
+
+import java.util.ArrayList;
+import java.util.List;
+import java.util.Map;
+
+/**
+ * 服务完成提醒
+ */
+@Component
+public class FwwcTemplateMessageBulder implements TemplateMessageBulder {
+
+    @Autowired
+    SysProjServicesDao projServicesDao;
+
+    @Autowired
+    SysVipInfoDao vipInfoDao;
+
+    @Autowired
+    private SysBeauticianStateDao beauticianStateDao;
+
+    @Autowired
+    private SysShopInfoDao shopInfoDao;
+
+
+
+    @Override
+    public Map buildMsg(Map param) {
+
+        //返回参数
+        Map builParam=new HashedMap();
+        //获取基础公共参数
+        String gzhAppid= (String) param.get("gzhAppid");
+        String template_id= (String) param.get("template_id");
+        String xcxAppId= (String) param.get("xcxAppId");
+        //模板消息列表
+        List msgList=new ArrayList();
+
+        //触发点传送的json参数
+        JSONObject messageJsonParam= (JSONObject) param.get("messageJsonParam");
+        //构建消息主体
+        Long serviceId= (Long) messageJsonParam.get("serviceId");
+        SysProjServices sysProjServices = projServicesDao.selectById(serviceId);
+
+
+        //校验客户openId (必须)
+        SysVipInfo vipInfo=vipInfoDao.selectById(sysProjServices.getVipId());
+        String touser= vipInfo.getOpenId();
+        if(StringUtils.isBlank(touser)){
+            builParam.put("error","未获取到"+vipInfo.getVipName()+"用户小程序openid");
+            return builParam;
+        }
+
+
+        //自定义信息区START=========================================================================================================
+        SysShopInfo sysShopInfo = shopInfoDao.selectById(sysProjServices.getShopId());
+        List<SysBeauticianState> beauticianStateList = beauticianStateDao.selectBySerIds(sysProjServices.getId());
+        String time= DateUtil.dateFormatStr(sysProjServices.getConsumeTime(),DateUtil.DATE_FORMAT_MM);
+
+        //如果一个项目存在多个护理项目则发送多次消息
+        String first="您好!您预约的";
+        for (SysBeauticianState beauticianState:beauticianStateList){
+            first+=beauticianState.getProjInfo().getName()+beauticianState.getCount()+"次,";
+        }
+        first=first.substring(0,first.length())+"服务已完成";
+        UniformMsgPojo uniformMsgPojo=new UniformMsgPojo();
+        GzhTemplateMessagePojo messagePojo=new GzhTemplateMessagePojo();
+        uniformMsgPojo.setTouser(touser);
+        messagePojo.setTemplate_id(template_id);
+        messagePojo.setAppid(gzhAppid);
+        //个性参数设置
+        messagePojo.setFirst(first,"#453454");
+        messagePojo.setKeyWord(sysShopInfo.getShopName(),"#453454");
+        messagePojo.setKeyWord(time,"#453454");
+        messagePojo.setRemark("点击【详情】可查询订单明细,若非本人或授权操作,请及时与门店联系","#453454");
+
+        //小程序配置
+        GzhTemplateMessagePojo.Miniprogram miniprogram=new GzhTemplateMessagePojo.Miniprogram(xcxAppId,
+                "pages/yuyue/showYyInfo?id="+serviceId);
+        messagePojo.setMiniprogram(miniprogram);
+
+
+        uniformMsgPojo.setMp_template_msg(messagePojo);
+        //自定义信息区END=========================================================================================================
+
+        //返回调用者使用的参数(必须)
+        msgList.add(uniformMsgPojo);
+        builParam.put("msgList",msgList);
+        return builParam;
+    }
+}
diff --git a/zq-erp/src/main/java/com/matrix/system/wechart/templateMsg/Task/messageBulderDemo/GmcgTemplateMessageBulder.java b/zq-erp/src/main/java/com/matrix/system/wechart/templateMsg/Task/messageBulderDemo/GmcgTemplateMessageBulder.java
new file mode 100644
index 0000000..ee42c62
--- /dev/null
+++ b/zq-erp/src/main/java/com/matrix/system/wechart/templateMsg/Task/messageBulderDemo/GmcgTemplateMessageBulder.java
@@ -0,0 +1,106 @@
+package com.matrix.system.wechart.templateMsg.Task.messageBulderDemo;
+
+import com.alibaba.fastjson.JSONObject;
+import com.matrix.core.tools.DateUtil;
+import com.matrix.core.tools.StringUtils;
+import com.matrix.system.hive.bean.*;
+import com.matrix.system.hive.dao.*;
+import com.matrix.system.wechart.templateMsg.GzhTemplateMessagePojo;
+import com.matrix.system.wechart.templateMsg.Task.TemplateMessageBulder;
+import com.matrix.system.wechart.templateMsg.UniformMsgPojo;
+import org.apache.commons.collections.map.HashedMap;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Component;
+
+import java.util.ArrayList;
+import java.util.List;
+import java.util.Map;
+
+/**
+ * 购买成功提醒
+ */
+@Component
+public class GmcgTemplateMessageBulder implements TemplateMessageBulder {
+
+    @Autowired
+    SysOrderDao orderDao;
+
+    @Autowired
+    SysVipInfoDao vipInfoDao;
+
+    @Autowired
+    private SysBeauticianStateDao beauticianStateDao;
+
+    @Autowired
+    private SysShopInfoDao shopInfoDao;
+
+    @Autowired
+    private  SysOrderItemDao orderItemDao;
+
+
+
+    @Override
+    public Map buildMsg(Map param) {
+
+        //返回参数
+        Map builParam=new HashedMap();
+        //获取基础公共参数
+        String gzhAppid= (String) param.get("gzhAppid");
+        String template_id= (String) param.get("template_id");
+        String xcxAppId= (String) param.get("xcxAppId");
+        //模板消息列表
+        List msgList=new ArrayList();
+
+        //触发点传送的json参数
+        JSONObject messageJsonParam= (JSONObject) param.get("messageJsonParam");
+        //构建消息主体
+        Long orderId= (Long) messageJsonParam.get("orderId");
+        SysOrder sysOrder = orderDao.selectById(orderId);
+        List<SysOrderItem> sysOrderItems = orderItemDao.selectByOrderId(orderId);
+
+        //校验客户openId (必须)
+        SysVipInfo vipInfo=vipInfoDao.selectById(sysOrder.getVipId());
+        String touser= vipInfo.getOpenId();
+        if(StringUtils.isBlank(touser)){
+            builParam.put("error","未获取到"+vipInfo.getVipName()+"用户小程序openid");
+            return builParam;
+        }
+
+
+        //自定义信息区START=========================================================================================================
+        SysShopInfo sysShopInfo = shopInfoDao.selectById(sysOrder.getShopId());
+        String time= DateUtil.dateFormatStr(sysOrder.getPayTime(),DateUtil.DATE_FORMAT_MM);
+
+        //如果一个项目存在多个护理项目则发送多次消息
+        String first="您好!您购买了";
+        for (SysOrderItem orderItem:sysOrderItems){
+            first+=orderItem.getShoppingGoods().getName()+"x"+orderItem.getCount()+",";
+        }
+        first=first.substring(0,first.length());
+        UniformMsgPojo uniformMsgPojo=new UniformMsgPojo();
+        GzhTemplateMessagePojo messagePojo=new GzhTemplateMessagePojo();
+        uniformMsgPojo.setTouser(touser);
+        messagePojo.setTemplate_id(template_id);
+        messagePojo.setAppid(gzhAppid);
+        //个性参数设置
+        messagePojo.setFirst(first,"#453454");
+        messagePojo.setKeyWord(sysShopInfo.getShopName(),"#453454");
+        messagePojo.setKeyWord(vipInfo.getVipNo(),"#453454");
+        messagePojo.setKeyWord(time,"#453454");
+        messagePojo.setRemark("点击【详情】可查询订单明细,若非本人或授权操作,请及时与门店联系","#453454");
+
+        //小程序配置
+        GzhTemplateMessagePojo.Miniprogram miniprogram=new GzhTemplateMessagePojo.Miniprogram(xcxAppId,
+                "pages/purchaseRecords/detail?id="+orderId);
+        messagePojo.setMiniprogram(miniprogram);
+
+
+        uniformMsgPojo.setMp_template_msg(messagePojo);
+        //自定义信息区END=========================================================================================================
+
+        //返回调用者使用的参数(必须)
+        msgList.add(uniformMsgPojo);
+        builParam.put("msgList",msgList);
+        return builParam;
+    }
+}
diff --git a/zq-erp/src/main/java/com/matrix/system/wechart/templateMsg/Task/messageBulderDemo/YycgTemplateMessageBulder.java b/zq-erp/src/main/java/com/matrix/system/wechart/templateMsg/Task/messageBulderDemo/YycgTemplateMessageBulder.java
new file mode 100644
index 0000000..82a4a06
--- /dev/null
+++ b/zq-erp/src/main/java/com/matrix/system/wechart/templateMsg/Task/messageBulderDemo/YycgTemplateMessageBulder.java
@@ -0,0 +1,113 @@
+package com.matrix.system.wechart.templateMsg.Task.messageBulderDemo;
+
+import com.alibaba.fastjson.JSONObject;
+import com.matrix.core.tools.DateUtil;
+import com.matrix.core.tools.StringUtils;
+import com.matrix.system.hive.bean.SysBeauticianState;
+import com.matrix.system.hive.bean.SysProjServices;
+import com.matrix.system.hive.bean.SysShopInfo;
+import com.matrix.system.hive.bean.SysVipInfo;
+import com.matrix.system.hive.dao.SysBeauticianStateDao;
+import com.matrix.system.hive.dao.SysProjServicesDao;
+import com.matrix.system.hive.dao.SysShopInfoDao;
+import com.matrix.system.hive.dao.SysVipInfoDao;
+import com.matrix.system.wechart.templateMsg.GzhTemplateMessagePojo;
+import com.matrix.system.wechart.templateMsg.Task.TemplateMessageBulder;
+import com.matrix.system.wechart.templateMsg.UniformMsgPojo;
+import org.apache.commons.collections.map.HashedMap;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Component;
+
+import java.util.*;
+
+/**
+ * 预约成功提醒
+ */
+@Component
+public class YycgTemplateMessageBulder implements TemplateMessageBulder {
+
+    @Autowired
+    SysProjServicesDao projServicesDao;
+
+    @Autowired
+    SysVipInfoDao vipInfoDao;
+
+    @Autowired
+    private SysBeauticianStateDao beauticianStateDao;
+
+    @Autowired
+    private SysShopInfoDao shopInfoDao;
+
+
+
+    @Override
+    public Map buildMsg(Map param) {
+
+        //返回参数
+        Map builParam=new HashedMap();
+        //获取基础公共参数
+        String gzhAppid= (String) param.get("gzhAppid");
+        String template_id= (String) param.get("template_id");
+        String xcxAppId= (String) param.get("xcxAppId");
+        //模板消息列表
+        List msgList=new ArrayList();
+
+        //触发点传送的json参数
+        JSONObject messageJsonParam= (JSONObject) param.get("messageJsonParam");
+        //构建消息主体
+        Long serviceId= (Long) messageJsonParam.get("serviceId");
+        SysProjServices sysProjServices = projServicesDao.selectById(serviceId);
+
+
+        //校验客户openId (必须)
+        SysVipInfo vipInfo=vipInfoDao.selectById(sysProjServices.getVipId());
+        String touser= vipInfo.getOpenId();
+        if(StringUtils.isBlank(touser)){
+            builParam.put("error","未获取到"+vipInfo.getVipName()+"用户小程序openid");
+            return builParam;
+        }
+
+
+        //自定义信息区START=========================================================================================================
+        SysShopInfo sysShopInfo = shopInfoDao.selectById(sysProjServices.getShopId());
+        List<SysBeauticianState> beauticianStateList = beauticianStateDao.selectBySerIds(sysProjServices.getId());
+        String time= DateUtil.dateFormatStr(sysProjServices.getConsumeTime(),DateUtil.DATE_FORMAT_MM);
+
+        //如果一个项目存在多个护理项目则发送多次消息
+        String projectInfo="";
+        Set<String> staffNames=new HashSet<>();
+        for (SysBeauticianState beauticianState:beauticianStateList){
+            projectInfo+=beauticianState.getProjInfo().getName()+beauticianState.getCount()+"次,";
+            staffNames.add(beauticianState.getBeautiStaffInfo().getSuName());
+        }
+        projectInfo=projectInfo.substring(0,projectInfo.length()-1);
+        String staffName=StringUtils.collToStr(staffNames,",");
+        UniformMsgPojo uniformMsgPojo=new UniformMsgPojo();
+        GzhTemplateMessagePojo messagePojo=new GzhTemplateMessagePojo();
+        uniformMsgPojo.setTouser(touser);
+        messagePojo.setTemplate_id(template_id);
+        messagePojo.setAppid(gzhAppid);
+        //个性参数设置
+        messagePojo.setFirst("您好!您在"+sysShopInfo.getShopName()+"店的预约已经成功,期待您的光临","#453454");
+        messagePojo.setKeyWord(time,"#453454");
+        messagePojo.setKeyWord(staffName,"#453454");
+        messagePojo.setKeyWord(projectInfo,"#453454");
+
+
+        messagePojo.setRemark("点击【详情】可查询订单明细,若非本人或授权操作,请及时与门店联系","#453454");
+
+        //小程序配置
+        GzhTemplateMessagePojo.Miniprogram miniprogram=new GzhTemplateMessagePojo.Miniprogram(xcxAppId,
+                "pages/yuyue/showYyInfo?id="+serviceId);
+        messagePojo.setMiniprogram(miniprogram);
+
+
+        uniformMsgPojo.setMp_template_msg(messagePojo);
+        //自定义信息区END=========================================================================================================
+
+        //返回调用者使用的参数(必须)
+        msgList.add(uniformMsgPojo);
+        builParam.put("msgList",msgList);
+        return builParam;
+    }
+}
diff --git a/zq-erp/src/main/java/com/matrix/system/wechart/templateMsg/Task/messageBulderDemo/YydsTemplateMessageBulder.java b/zq-erp/src/main/java/com/matrix/system/wechart/templateMsg/Task/messageBulderDemo/YydsTemplateMessageBulder.java
new file mode 100644
index 0000000..0eac830
--- /dev/null
+++ b/zq-erp/src/main/java/com/matrix/system/wechart/templateMsg/Task/messageBulderDemo/YydsTemplateMessageBulder.java
@@ -0,0 +1,116 @@
+package com.matrix.system.wechart.templateMsg.Task.messageBulderDemo;
+
+import com.alibaba.fastjson.JSONObject;
+import com.matrix.core.tools.DateUtil;
+import com.matrix.core.tools.StringUtils;
+import com.matrix.system.hive.bean.SysBeauticianState;
+import com.matrix.system.hive.bean.SysProjServices;
+import com.matrix.system.hive.bean.SysShopInfo;
+import com.matrix.system.hive.bean.SysVipInfo;
+import com.matrix.system.hive.dao.SysBeauticianStateDao;
+import com.matrix.system.hive.dao.SysProjServicesDao;
+import com.matrix.system.hive.dao.SysShopInfoDao;
+import com.matrix.system.hive.dao.SysVipInfoDao;
+import com.matrix.system.wechart.templateMsg.GzhTemplateMessagePojo;
+import com.matrix.system.wechart.templateMsg.Task.TemplateMessageBulder;
+import com.matrix.system.wechart.templateMsg.UniformMsgPojo;
+import org.apache.commons.collections.CollectionUtils;
+import org.apache.commons.collections.map.HashedMap;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Component;
+
+import java.util.*;
+
+/**
+ * 预约到时提醒
+ */
+@Component
+public class YydsTemplateMessageBulder implements TemplateMessageBulder {
+
+    @Autowired
+    SysProjServicesDao projServicesDao;
+
+    @Autowired
+    SysVipInfoDao vipInfoDao;
+
+    @Autowired
+    private SysBeauticianStateDao beauticianStateDao;
+
+    @Autowired
+    private SysShopInfoDao shopInfoDao;
+
+
+
+    @Override
+    public Map buildMsg(Map param) {
+
+        //返回参数
+        Map builParam=new HashedMap();
+        //获取基础公共参数
+        String gzhAppid= (String) param.get("gzhAppid");
+        String template_id= (String) param.get("template_id");
+        String xcxAppId= (String) param.get("xcxAppId");
+        //模板消息列表
+        List msgList=new ArrayList();
+
+        //触发点传送的json参数
+        JSONObject messageJsonParam= (JSONObject) param.get("messageJsonParam");
+        //构建消息主体
+        Long serviceId= (Long) messageJsonParam.get("serviceId");
+        SysProjServices sysProjServices = projServicesDao.selectById(serviceId);
+
+
+        //校验客户openId (必须)
+        SysVipInfo vipInfo=vipInfoDao.selectById(sysProjServices.getVipId());
+        String touser= vipInfo.getOpenId();
+        if(StringUtils.isBlank(touser)){
+            builParam.put("error","未获取到"+vipInfo.getVipName()+"用户小程序openid");
+            return builParam;
+        }
+
+
+        //自定义信息区START=========================================================================================================
+        SysShopInfo sysShopInfo = shopInfoDao.selectById(sysProjServices.getShopId());
+        List<SysBeauticianState> beauticianStateList = beauticianStateDao.selectBySerIds(sysProjServices.getId());
+        String time= DateUtil.dateFormatStr(sysProjServices.getConsumeTime(),DateUtil.DATE_FORMAT_MM);
+
+        //如果一个项目存在多个护理项目则发送多次消息
+        String projectInfo="";
+        Set<String> staffNames=new HashSet<>();
+        for (SysBeauticianState beauticianState:beauticianStateList){
+            projectInfo+=beauticianState.getProjInfo().getName()+beauticianState.getCount()+"次,";
+            staffNames.add(beauticianState.getBeautiStaffInfo().getSuName());
+        }
+        projectInfo=projectInfo.substring(0,projectInfo.length()-1);
+        String staffName=StringUtils.collToStr(staffNames,",");
+        UniformMsgPojo uniformMsgPojo=new UniformMsgPojo();
+        GzhTemplateMessagePojo messagePojo=new GzhTemplateMessagePojo();
+        uniformMsgPojo.setTouser(touser);
+        messagePojo.setTemplate_id(template_id);
+        messagePojo.setAppid(gzhAppid);
+        //个性参数设置
+        messagePojo.setFirst("您好!您在"+sysShopInfo.getShopName()+"店的预约将在1小时后开始,请准时到店。","#453454");
+        messagePojo.setKeyWord(time,"#453454");
+
+        messagePojo.setKeyWord(sysShopInfo.getShopName(),"#453454");
+        messagePojo.setKeyWord(sysShopInfo.getShopAddr(),"#453454");
+        messagePojo.setKeyWord(projectInfo,"#453454");
+        messagePojo.setKeyWord(staffName,"#453454");
+
+        messagePojo.setRemark("请记得准时前往,点击【详情】可查询服务详情。","#453454");
+
+        //小程序配置
+        GzhTemplateMessagePojo.Miniprogram miniprogram=new GzhTemplateMessagePojo.Miniprogram(xcxAppId,
+                "pages/yuyue/showYyInfo?id="+serviceId);
+        messagePojo.setMiniprogram(miniprogram);
+
+
+        uniformMsgPojo.setMp_template_msg(messagePojo);
+        //自定义信息区END=========================================================================================================
+
+        //返回调用者使用的参数(必须)
+        msgList.add(uniformMsgPojo);
+        builParam.put("msgList",msgList);
+        return builParam;
+    }
+}
diff --git a/zq-erp/src/main/java/com/matrix/system/wechart/templateMsg/UniformMsgParam.java b/zq-erp/src/main/java/com/matrix/system/wechart/templateMsg/UniformMsgParam.java
new file mode 100644
index 0000000..1db4733
--- /dev/null
+++ b/zq-erp/src/main/java/com/matrix/system/wechart/templateMsg/UniformMsgParam.java
@@ -0,0 +1,49 @@
+package com.matrix.system.wechart.templateMsg;
+
+import com.alibaba.fastjson.JSONObject;
+
+/**
+ * 统一消息参数体
+ */
+public class UniformMsgParam extends JSONObject{
+
+    /**
+     * 公众号预约提醒
+     */
+    public static final Integer GZH_YYTX = 10000;
+    /**
+     * 购买成功通知
+     */
+    public static final Integer GZH_GMCG = 10001;
+    /**
+     * 预约变更通知
+     */
+    public static final Integer GZH_YYBG = 10002;
+    /**
+     * 预约到时提醒
+     */
+    public static final Integer GZH_YYDS = 10003;
+    /**
+     * 预约成功提醒
+     */
+    public static final Integer GZH_YYCG = 10004;
+    /**
+     * 充值成功通知
+     */
+    public static final Integer GZH_CZCG = 10005;
+    /**
+     * 服务完成通知
+     */
+    public static final Integer GZH_FWWC = 10006;
+    /**
+     * 订单取消通知
+     */
+    public static final  Integer GZH_DDQX = 10007;
+
+
+    public  UniformMsgParam(Long companyId, Integer templateCode){
+        super.put("companyId",companyId);
+        super.put("templateCode",templateCode);
+    }
+
+}
diff --git a/zq-erp/src/main/java/com/matrix/system/wechart/templateMsg/UniformMsgPojo.java b/zq-erp/src/main/java/com/matrix/system/wechart/templateMsg/UniformMsgPojo.java
new file mode 100644
index 0000000..63678fc
--- /dev/null
+++ b/zq-erp/src/main/java/com/matrix/system/wechart/templateMsg/UniformMsgPojo.java
@@ -0,0 +1,32 @@
+package com.matrix.system.wechart.templateMsg;
+
+public class UniformMsgPojo {
+
+    private  String touser;
+    private GzhTemplateMessagePojo mp_template_msg;
+    private String weapp_template_msg;
+
+    public String getTouser() {
+        return touser;
+    }
+
+    public void setTouser(String touser) {
+        this.touser = touser;
+    }
+
+    public GzhTemplateMessagePojo getMp_template_msg() {
+        return mp_template_msg;
+    }
+
+    public void setMp_template_msg(GzhTemplateMessagePojo mp_template_msg) {
+        this.mp_template_msg = mp_template_msg;
+    }
+
+    public String getWeapp_template_msg() {
+        return weapp_template_msg;
+    }
+
+    public void setWeapp_template_msg(String weapp_template_msg) {
+        this.weapp_template_msg = weapp_template_msg;
+    }
+}
diff --git a/zq-erp/src/main/java/com/matrix/system/wechart/templateMsg/demo/MsgDemo2.java b/zq-erp/src/main/java/com/matrix/system/wechart/templateMsg/demo/MsgDemo2.java
new file mode 100644
index 0000000..edbb168
--- /dev/null
+++ b/zq-erp/src/main/java/com/matrix/system/wechart/templateMsg/demo/MsgDemo2.java
@@ -0,0 +1,71 @@
+package com.matrix.system.wechart.templateMsg.demo;
+
+import com.alibaba.fastjson.JSONObject;
+import com.matrix.component.tools.HttpClientUtil;
+import com.matrix.core.pojo.AjaxResult;
+import com.matrix.system.hive.plugin.util.HttpUtils;
+import com.matrix.system.shopXcx.api.WeChatGzhApiTools;
+import com.matrix.system.wechart.templateMsg.GzhTemplateMessagePojo;
+import com.matrix.system.wechart.templateMsg.UniformMsgPojo;
+import org.springframework.beans.factory.annotation.Value;
+import org.springframework.stereotype.Controller;
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.ResponseBody;
+
+@Controller
+@RequestMapping(value = "test2")
+public class MsgDemo2 {
+
+
+    String xcxAppId="wx5cc58f796224af61";
+
+
+    String xcxSecret="facea088aae414e5c2ee86b459887721";
+
+
+    @RequestMapping("/template")
+    @ResponseBody
+    public AjaxResult template() {
+        UniformMsgPojo uniformMsgPojo=new UniformMsgPojo();
+        GzhTemplateMessagePojo messagePojo=new GzhTemplateMessagePojo();
+        uniformMsgPojo.setTouser("oJkRK4yelehsY4S7I6Ee1ydWtQMI");
+        messagePojo.setTemplate_id("Mqu9xPYj_JFhXNj7nLJS7LESQUy6Z7FoCOmVO66Oxe8");
+        //messagePojo.setUrl("www.baidu.com");
+       // messagePojo.setMiniprogram(gzhAppId,"/123/234123412");
+        messagePojo.setAppid("wx57e6335559bdbda6");
+        messagePojo.setFirst("尊敬的谭娅:","#453454");
+        messagePojo.setKeyWord("活细胞肩部护理","#453454");
+        messagePojo.setKeyWord("2014年7月21日 18:36","#453454");
+        messagePojo.setRemark("您的护理课程剩余3次。","#453454");
+
+        String ACCESS_TOKEN=WeChatGzhApiTools.getAccessToken(xcxAppId,xcxSecret);
+        String url="https://api.weixin.qq.com/cgi-bin/message/wxopen/template/uniform_send?access_token=ACCESS_TOKEN".replaceAll("ACCESS_TOKEN",ACCESS_TOKEN);
+
+        uniformMsgPojo.setMp_template_msg(messagePojo);
+
+        System.out.println(JSONObject.toJSON(uniformMsgPojo).toString());
+        JSONObject result= HttpClientUtil.sendPostWithJson(url,JSONObject.toJSON(uniformMsgPojo).toString());
+        System.out.println(result.toString());
+        return AjaxResult.buildSuccessInstance("1");
+
+
+    }
+
+
+    @RequestMapping("/getUserList")
+    @ResponseBody
+    public AjaxResult getUserList() {
+
+        String ACCESS_TOKEN=WeChatGzhApiTools.getAccessToken(xcxAppId,xcxSecret);
+
+        String url="https://api.weixin.qq.com/cgi-bin/user/get?access_token=ACCESS_TOKEN&next_openid=NEXT_OPENID".replaceAll("ACCESS_TOKEN",ACCESS_TOKEN);
+
+
+        String result= HttpUtils.sendGet(url,"");
+        System.out.println(result.toString());
+        return AjaxResult.buildSuccessInstance("1");
+
+
+    }
+
+}
diff --git a/zq-erp/src/main/java/com/matrix/system/wechart/templateMsg/demo/MsgDemo3.java b/zq-erp/src/main/java/com/matrix/system/wechart/templateMsg/demo/MsgDemo3.java
new file mode 100644
index 0000000..db1e7cd
--- /dev/null
+++ b/zq-erp/src/main/java/com/matrix/system/wechart/templateMsg/demo/MsgDemo3.java
@@ -0,0 +1,35 @@
+package com.matrix.system.wechart.templateMsg.demo;
+
+import com.alibaba.fastjson.JSONObject;
+import com.matrix.component.tools.HttpClientUtil;
+import com.matrix.core.pojo.AjaxResult;
+import com.matrix.system.hive.plugin.util.HttpUtils;
+import com.matrix.system.shopXcx.api.WeChatGzhApiTools;
+import com.matrix.system.wechart.templateMsg.Task.UniformMsgSentTask;
+import com.rabbitmq.client.Delivery;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Controller;
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.ResponseBody;
+
+import java.io.IOException;
+
+@Controller
+@RequestMapping(value = "test3")
+public class MsgDemo3 {
+
+
+    @Autowired
+    UniformMsgSentTask uniformMsgSentTask;
+
+    @RequestMapping("/template")
+    @ResponseBody
+    public AjaxResult template() throws IOException {
+
+        uniformMsgSentTask.handle(null,null);
+        return AjaxResult.buildSuccessInstance("1");
+
+    }
+
+
+}
diff --git a/zq-erp/src/main/resources/config/application.properties b/zq-erp/src/main/resources/config/application.properties
index 5df391f..258e194 100644
--- a/zq-erp/src/main/resources/config/application.properties
+++ b/zq-erp/src/main/resources/config/application.properties
@@ -4,10 +4,13 @@
 
 #线上测试环境
 
+#spring.datasource.username=ct_test
+#spring.datasource.password=123456
+#spring.datasource.url=jdbc:mysql://120.27.238.55:3306/hive_test?useUnicode=true&characterEncoding=utf8&zeroDateTimeBehavior=CONVERT_TO_NULL&allowMultiQueries=true&transformedBitIsBoolean=true&serverTimezone=GMT%2B8
+
 spring.datasource.username=chuhuan
 spring.datasource.password=chuhuan
-spring.datasource.url=jdbc:mysql://119.3.52.84:3306/hive_plus_test?useUnicode=true&characterEncoding=utf8&zeroDateTimeBehavior=CONVERT_TO_NULL&allowMultiQueries=true&transformedBitIsBoolean=true&serverTimezone=GMT%2B8
-
+spring.datasource.url=jdbc:mysql://121.37.162.173:3306/hive_prd?useUnicode=true&characterEncoding=utf8&zeroDateTimeBehavior=CONVERT_TO_NULL&allowMultiQueries=true&transformedBitIsBoolean=true&serverTimezone=GMT%2B8
 
 
 spring.datasource.type=com.alibaba.druid.pool.DruidDataSource
@@ -59,8 +62,11 @@
 #定时任务
 scheduling.enabled=false
 
-swagger.enable=false
+swagger.enable=true
 swagger.security.username=admin
 swagger.security.password=admin
 
+#默认头像
+default.vip.photo.woman=https://filehive2.jyymatrix.cc/uploadeFile/20210125/db53552e688040afb286686f081e1e68f3fe946f75624598828f01898635152e.png
+default.vip.photo.man=https://filehive2.jyymatrix.cc/uploadeFile/20210125/3642f1d827c44c76832fea106c85e0f89e089c16cbcc4dd0a82bb52b9ac700f4.png
 
diff --git a/zq-erp/src/main/resources/config/db/increment/20210109.sql b/zq-erp/src/main/resources/config/db/increment/20210109.sql
new file mode 100644
index 0000000..2f140ba
--- /dev/null
+++ b/zq-erp/src/main/resources/config/db/increment/20210109.sql
@@ -0,0 +1,5 @@
+ALTER TABLE `shop_wxtemplate_msg`
+ADD COLUMN `temp_type`  int(2) NULL COMMENT ' 模板类型 1,公众号,2,小程序' AFTER `code`,
+ADD COLUMN `template_class`  longtext NULL COMMENT '取数模板类' AFTER `temp_type`;
+
+
diff --git a/zq-erp/src/main/resources/config/dev/system.properties b/zq-erp/src/main/resources/config/dev/system.properties
index 78a6818..015c690 100644
--- a/zq-erp/src/main/resources/config/dev/system.properties
+++ b/zq-erp/src/main/resources/config/dev/system.properties
@@ -58,6 +58,12 @@
 xcx_appid =wx3836ab3c1490ff29
 xcx_secret =39a3687ec5b2666ed68e7c8b83b26b47
 
+#公众号
+gzh_appid=wx57e6335559bdbda6
+gzh_secret=ecb408af170e3890e6544290cad33760
+
+
+
 #微信支付调试开关
 wx_pay_debug_onoff = false
 
diff --git a/zq-erp/src/main/resources/config/lhx/application.properties b/zq-erp/src/main/resources/config/lhx/application.properties
index 3aead90..44b584e 100644
--- a/zq-erp/src/main/resources/config/lhx/application.properties
+++ b/zq-erp/src/main/resources/config/lhx/application.properties
@@ -41,7 +41,6 @@
 rabbitmq.port=5672
 rabbitmq.username=ct_rabbit
 rabbitmq.password=123456
-useRabbit=false
 
 server.session.timeout=120
 
@@ -57,4 +56,4 @@
 #定时任务
 scheduling.enabled=true
 
-swagger.enable=false
\ No newline at end of file
+swagger.enable=true
\ No newline at end of file
diff --git a/zq-erp/src/main/resources/config/lhx/system.properties b/zq-erp/src/main/resources/config/lhx/system.properties
index ffeb78d..d51c554 100644
--- a/zq-erp/src/main/resources/config/lhx/system.properties
+++ b/zq-erp/src/main/resources/config/lhx/system.properties
@@ -102,3 +102,6 @@
 
 #hive仓库地址
 hive.service=http://erp.hive.jyymatrix.cc/meidu-crm/
+
+gzh_appid=wx57e6335559bdbda6
+gzh_secret=ecb408af170e3890e6544290cad33760
diff --git a/zq-erp/src/main/resources/config/prd/application.properties b/zq-erp/src/main/resources/config/prd/application.properties
index a2a36d1..98c2bfe 100644
--- a/zq-erp/src/main/resources/config/prd/application.properties
+++ b/zq-erp/src/main/resources/config/prd/application.properties
@@ -1,9 +1,14 @@
 evn=prd
 server.port=8080
 
-spring.datasource.username=hive_data
-spring.datasource.password=hive_4321#&@
-spring.datasource.url=jdbc:mysql://119.3.52.84:3306/hive_prd?useUnicode=true&characterEncoding=utf8mb4&zeroDateTimeBehavior=CONVERT_TO_NULL&allowMultiQueries=true&transformedBitIsBoolean=true&serverTimezone=GMT%2B8
+
+#spring.datasource.username=hive_data
+#spring.datasource.password=hive_4321#&@
+#spring.datasource.url=jdbc:mysql://119.3.52.84:3306/hive_prd?useUnicode=true&zeroDateTimeBehavior=CONVERT_TO_NULL&allowMultiQueries=true&transformedBitIsBoolean=true&serverTimezone=GMT%2B8
+spring.datasource.username=chuhuan
+spring.datasource.password=chuhuan
+spring.datasource.url=jdbc:mysql://121.37.162.173:3306/hive_prd?useUnicode=true&characterEncoding=utf8&zeroDateTimeBehavior=CONVERT_TO_NULL&allowMultiQueries=true&transformedBitIsBoolean=true&serverTimezone=GMT%2B8
+
 
 
 
@@ -60,4 +65,8 @@
 
 #定时任务
 scheduling.enabled=true
-swagger.enable=false
\ No newline at end of file
+swagger.enable=false
+
+#默认头像
+default.vip.photo.woman=https://filehive2.jyymatrix.cc/uploadeFile/20210125/db53552e688040afb286686f081e1e68f3fe946f75624598828f01898635152e.png
+default.vip.photo.man=https://filehive2.jyymatrix.cc/uploadeFile/20210125/3642f1d827c44c76832fea106c85e0f89e089c16cbcc4dd0a82bb52b9ac700f4.png
diff --git a/zq-erp/src/main/resources/config/system.properties b/zq-erp/src/main/resources/config/system.properties
index e008d06..4b4664a 100644
--- a/zq-erp/src/main/resources/config/system.properties
+++ b/zq-erp/src/main/resources/config/system.properties
@@ -17,7 +17,7 @@
 
 #文件保存地址
 #file_storage_path=/mnt/hive/static/uploadeFile/
-file_storage_path=/Users/jiangyouyao/java/webresources/
+file_storage_path=E:\\20210116
 #文件上传大小字节为单位  10MB
 maxUploadSize=10485760
 
@@ -48,8 +48,14 @@
 
 
 wechar_login_url =https://api.weixin.qq.com/sns/jscode2session?appid=%s&secret=%s&js_code=%s&grant_type=authorization_code
-xcx_appid =wx3836ab3c1490ff29
-xcx_secret =39a3687ec5b2666ed68e7c8b83b26b47
+xcx_appid =wx5cc58f796224af61
+xcx_secret =facea088aae414e5c2ee86b459887721
+
+#公众号
+gzh_appid=wx57e6335559bdbda6
+gzh_secret=ecb408af170e3890e6544290cad33760
+
+
 
 #微信支付调试开关
 wx_pay_debug_onoff = false
@@ -92,7 +98,7 @@
 
 
 #是否启用异常上报
-is_open_exception_report=true
+is_open_exception_report=false
 showExcptionUrl=http://erp.hive.jyymatrix.cc/showException
 
 
diff --git a/zq-erp/src/main/resources/config/test/application.properties b/zq-erp/src/main/resources/config/test/application.properties
index 09b80d4..87fc89f 100644
--- a/zq-erp/src/main/resources/config/test/application.properties
+++ b/zq-erp/src/main/resources/config/test/application.properties
@@ -1,12 +1,16 @@
-evn=dev
+evn=test
 server.port=8080
 
 
 #线上测试环境
 
-spring.datasource.username=chuhuan
-spring.datasource.password=chuhuan
-spring.datasource.url=jdbc:mysql://119.3.52.84:3306/hive_plus_test?useUnicode=true&characterEncoding=utf8&zeroDateTimeBehavior=CONVERT_TO_NULL&allowMultiQueries=true&transformedBitIsBoolean=true&serverTimezone=GMT%2B8
+spring.datasource.username=ct_test
+spring.datasource.password=123456
+spring.datasource.url=jdbc:mysql://120.27.238.55:3306/hive_test?useUnicode=true&characterEncoding=utf8&zeroDateTimeBehavior=CONVERT_TO_NULL&allowMultiQueries=true&transformedBitIsBoolean=true&serverTimezone=GMT%2B8
+
+#spring.datasource.username=chuhuan
+#spring.datasource.password=chuhuan
+#spring.datasource.url=jdbc:mysql://175.6.132.141:3306/hive_v2_test?useUnicode=true&characterEncoding=utf8&zeroDateTimeBehavior=CONVERT_TO_NULL&allowMultiQueries=true&transformedBitIsBoolean=true&serverTimezone=GMT%2B8
 
 
 
@@ -65,3 +69,6 @@
 swagger.security.password=admin
 
 
+#默认头像
+default.vip.photo.woman=https://filehive2.jyymatrix.cc/uploadeFile/20210125/db53552e688040afb286686f081e1e68f3fe946f75624598828f01898635152e.png
+default.vip.photo.man=https://filehive2.jyymatrix.cc/uploadeFile/20210125/3642f1d827c44c76832fea106c85e0f89e089c16cbcc4dd0a82bb52b9ac700f4.png
diff --git a/zq-erp/src/main/resources/config/test/system.properties b/zq-erp/src/main/resources/config/test/system.properties
index 0bf1388..568731d 100644
--- a/zq-erp/src/main/resources/config/test/system.properties
+++ b/zq-erp/src/main/resources/config/test/system.properties
@@ -1,5 +1,5 @@
 #是否启用debug模式
-debug=true
+debug=false
 # 日志文件保存地址
 log_path=/mnt/hive/log-test
 
@@ -12,9 +12,9 @@
 default_password=123
 
 #nginx静态资源访问地址
-static_resource_url=https://filehive2.jyymatrix.cc/uploadeFile/
+static_resource_url=http://testfile.hive.jyymatrix.cc/
 #文件保存地址
-file_storage_path=/mnt/hive/static/uploadeFile/
+file_storage_path=/mnt/upload/
 #文件上传大小字节为单位  10MB
 maxUploadSize=10485760
 
@@ -46,8 +46,10 @@
 
 
 wechar_login_url =https://api.weixin.qq.com/sns/jscode2session?appid=%s&secret=%s&js_code=%s&grant_type=authorization_code
-xcx_appid =wx3836ab3c1490ff29
-xcx_secret =39a3687ec5b2666ed68e7c8b83b26b47
+xcx_appid =wx5cc58f796224af61
+xcx_secret =facea088aae414e5c2ee86b459887721
+gzh_appid=wx57e6335559bdbda6
+gzh_secret=ecb408af170e3890e6544290cad33760
 
 #微信支付调试开关
 wx_pay_debug_onoff = false
diff --git a/zq-erp/src/main/resources/config/xcx/application.properties b/zq-erp/src/main/resources/config/xcx/application.properties
index 20b3119..db72327 100644
--- a/zq-erp/src/main/resources/config/xcx/application.properties
+++ b/zq-erp/src/main/resources/config/xcx/application.properties
@@ -1,8 +1,17 @@
-evn=xcx
+evn=xcxtest
 server.port=8080
-spring.datasource.username=chuhuan
-spring.datasource.password=chuhuan
-spring.datasource.url=jdbc:mysql://119.3.52.84:3306/hive_plus?useUnicode=true&characterEncoding=utf8&zeroDateTimeBehavior=CONVERT_TO_NULL&allowMultiQueries=true&transformedBitIsBoolean=true&serverTimezone=GMT%2B8
+
+
+#线上测试环境
+
+spring.datasource.username=ct_test
+spring.datasource.password=123456
+spring.datasource.url=jdbc:mysql://120.27.238.55:3306/hive_test?useUnicode=true&characterEncoding=utf8&zeroDateTimeBehavior=CONVERT_TO_NULL&allowMultiQueries=true&transformedBitIsBoolean=true&serverTimezone=GMT%2B8
+
+
+
+
+
 spring.datasource.type=com.alibaba.druid.pool.DruidDataSource
 spring.datasource.initialSize=3
 spring.datasource.minIdle=3
@@ -25,21 +34,18 @@
 #spring.jackson.time-zone=GMT+8
 #spring.jackson.serialization.write-dates-as-timestamps=true
 #文件上传时的大小限制 单位M
-spring.servlet.multipart.max-file-size=300MB
-spring.servlet.multipart.max-request-size=300MB
+spring.servlet.multipart.max-file-size=100MB
+spring.servlet.multipart.max-request-size=100MB
 #--------------------------------------
 
 
-
 #rabbitMQ配置
-rabbitmq.host=127.0.0.1
+rabbitmq.host=47.111.134.136
 rabbitmq.port=5672
 rabbitmq.username=hivequeue
 rabbitmq.password=hivequeueadmin
-useRabbit=true
+useRabbit=false
 
-#指定消费者确认方式  当为manual时手动确认 不配置表示自动确认
-#spring.rabbitmq.listener.simple.acknowledge-mode=manual
 server.session.timeout=120
 
 ali.sms.accessKeyId=LTAI4FrjY9R9iDfC6YQTHfne
@@ -47,12 +53,16 @@
 ali.sms.regionId=cn-hangzhou
 ali.sms.signName=\u80bd\u598d
 
-
 #hour
 activities.groupBuy.limit=24
 #minute
 groupBuy.pay.timeLimit=30
-#定时任务
-scheduling.enabled=true
 
-swagger.enable=false
\ No newline at end of file
+#定时任务
+scheduling.enabled=false
+
+swagger.enable=false
+swagger.security.username=admin
+swagger.security.password=admin
+
+
diff --git a/zq-erp/src/main/resources/config/xcx/system.properties b/zq-erp/src/main/resources/config/xcx/system.properties
index ebc6e32..12737b4 100644
--- a/zq-erp/src/main/resources/config/xcx/system.properties
+++ b/zq-erp/src/main/resources/config/xcx/system.properties
@@ -1,7 +1,7 @@
 #是否启用debug模式
 debug=false
 # 日志文件保存地址
-log_path=/mnt/hive/log
+log_path=/mnt/hive/log-test
 
 # 系统语言环境 zh中文,us英文
 system_language=zh
@@ -12,11 +12,12 @@
 default_password=123
 
 #nginx静态资源访问地址
-static_resource_url=https://filehive2.jyymatrix.cc/uploadeFile/
+static_resource_url=http://hwfile.jyymatrix.cc/
 #文件保存地址
-file_storage_path=/mnt/hive/static/uploadeFile/
+file_storage_path=/mnt/sdc/webresource/
 #文件上传大小字节为单位  10MB
 maxUploadSize=10485760
+
 
 #Matser\u7684ip\u5730\u5740
 redis.hostname=118.31.227.147
@@ -28,8 +29,6 @@
 redis.timeout=10000  
 redis.database=1
 redis_time_out=1800000
-
-
 cookie_time_out=36000
 
 #APP登录公钥
@@ -37,16 +36,6 @@
 #APP登录秘钥
 login_private_key=MIICdgIBADANBgkqhkiG9w0BAQEFAASCAmAwggJcAgEAAoGBAJa8rpRYK1Kn/yqdOrJR87TBuDgK7E57sh6INICYBN8edaoE+dtnvepDgD3S8ajAHuanleeYG+BPB9e0OHTzJ3hu2UfBIPdKFtHIZ8Z9XyVzjtlMuIkfTG643aId+d+PzNDmRyqKN6i2CCjasXxS7spJHcfFXI32Y7bYLqnWvnBVAgMBAAECgYBNzQFGq+NgfDllo1WCaG4jI8GTm3+wWoPq4l5G6S/KgYw1vu+/YOJTIZf1UQVOFitc3a6vpIDu25uup+Rj6IS8B4V8NDfc8P+iMNwdIKqqBj8wHu0/SaxYdW1uqlU5+XkJMxsNMgNRRGPSIQhla5OPHtBzIa7t4lmypETMZtXEmQJBAMsa1OIQzAKU05GweCnNNSoqo/nAQLqp8zfbJypxRx24uaCyS7C+KxN+O4FyaYmM9n0X+cgkr+RYHAIa7mg3gccCQQC9/nJvRBum8+4TINnz6QrvTmTlhi8QKW/CiRYpGgmo5PtQYw4BkRQbYO8ktFDM2yeO75XBv09qnGQaivDCeL0DAkEAisFg8LSy+4x7YcvivAQirxUEg2qRjjTvIZjKEBflkuuRfbRxO2Uf/qg9tPjaGwu/lcScc9yEggaj09hcSbyqHwJAN8QLiqUPCL3oTy0BTBpG316/Nq9f+Ppwl0TtgDroQu6S5VFttwACStb02m0imj5pKgcgibHBeaVVrITDjhEqSQJAaCHD/ytTzgtgLoVVyZZxOB272W7PI3mnzL8qQSldx1/QOBs1NmmEZuo7ELFMrfTmlxa1qR4gsq/ImfIdUdXewQ==
 
-#是否启用异常上报
-is_open_exception_report=true
-showExcptionUrl=http://erp.hive.jyymatrix.cc/showException
-
-#异常上报地址
-exception_center_url =http://geek.xc.jyymatrix.cc/addException
-#项目编号
-projNo=78
-#项目负责人
-owner=姜友瑶
 
 #日志文件清理阈值  单位:MB
 log_max=20
@@ -57,8 +46,10 @@
 
 
 wechar_login_url =https://api.weixin.qq.com/sns/jscode2session?appid=%s&secret=%s&js_code=%s&grant_type=authorization_code
-xcx_appid =wx3836ab3c1490ff29
-xcx_secret =39a3687ec5b2666ed68e7c8b83b26b47
+xcx_appid =wx5cc58f796224af61
+xcx_secret =facea088aae414e5c2ee86b459887721
+gzh_appid=wx57e6335559bdbda6
+gzh_secret=ecb408af170e3890e6544290cad33760
 
 #微信支付调试开关
 wx_pay_debug_onoff = false
@@ -72,12 +63,8 @@
 #快递鸟接口指令
 logistics.requestType=1002
 
-#丰桥顾客编码
-sf.logistics.clientCode=XCZHYF
-#丰桥校验码
-sf.logistics.checkword=zqcjA2A5m6MIGa6mImMcnpKQ9ipYlbUW
-#丰桥接口地址
-sf.logistics.url=https://bsp-oisp.sf-express.com/bsp-oisp/sfexpressService
+
+
 
 #发送短信配置
 crm.request_url = http://192.168.1.248
@@ -96,9 +83,19 @@
 #微信支付回调地址
 pay_notify_url = https://xcxhive2.jyymatrix.cc/wxCommon/wxpayCallback
 
-
 qrcodeBackgroundImgPath=/mnt/xcshop/webresource/static/xcxresource/bj1.png
 qrcodeFrontImgPath=/mnt/xcshop/webresource/static/xcxresource/qj2.png
 
 #hive仓库地址
-hive.service=http://erp.hive.jyymatrix.cc/meidu-crm/
\ No newline at end of file
+hive.service=http://localhost:8082/meidu-crm/
+
+
+
+#是否启用异常上报
+is_open_exception_report=true
+showExcptionUrl=http://erp.hive.jyymatrix.cc/showException
+
+
+#异常信息查询接口
+showExcptionUrl=http://erp.hive.jyymatrix.cc/showException
+
diff --git a/zq-erp/src/main/resources/generated-sources/annotations/com/matrix/system/app/mapper/MoneyCardUseMapperImpl.java b/zq-erp/src/main/resources/generated-sources/annotations/com/matrix/system/app/mapper/MoneyCardUseMapperImpl.java
new file mode 100644
index 0000000..460e41c
--- /dev/null
+++ b/zq-erp/src/main/resources/generated-sources/annotations/com/matrix/system/app/mapper/MoneyCardUseMapperImpl.java
@@ -0,0 +1,52 @@
+package com.matrix.system.app.mapper;
+
+import com.matrix.system.app.vo.VipCardListVo;
+import com.matrix.system.hive.bean.MoneyCardUse;
+
+import javax.annotation.Generated;
+import java.math.BigDecimal;
+import java.util.ArrayList;
+import java.util.List;
+
+@Generated(
+    value = "org.mapstruct.ap.MappingProcessor",
+    date = "2021-01-26T20:08:11+0800",
+    comments = "version: 1.3.0.Final, compiler: javac, environment: Java 1.8.0_181 (Oracle Corporation)"
+)
+public class MoneyCardUseMapperImpl extends MoneyCardUseMapper {
+
+    @Override
+    public VipCardListVo entityToCardListVo(MoneyCardUse moneyCardUse) {
+        if ( moneyCardUse == null ) {
+            return null;
+        }
+
+        VipCardListVo vipCardListVo = new VipCardListVo();
+
+        vipCardListVo.setCardName( moneyCardUse.getCardName() );
+        if ( moneyCardUse.getRealMoney() != null ) {
+            vipCardListVo.setRealMoney( BigDecimal.valueOf( moneyCardUse.getRealMoney() ) );
+        }
+        if ( moneyCardUse.getGiftMoney() != null ) {
+            vipCardListVo.setGiftMoney( BigDecimal.valueOf( moneyCardUse.getGiftMoney() ) );
+        }
+        vipCardListVo.setStatus( moneyCardUse.getStatus() );
+        vipCardListVo.setFailTime( moneyCardUse.getFailTime() );
+
+        return vipCardListVo;
+    }
+
+    @Override
+    public List<VipCardListVo> entitiesToCardListVos(List<MoneyCardUse> list) {
+        if ( list == null ) {
+            return null;
+        }
+
+        List<VipCardListVo> list1 = new ArrayList<VipCardListVo>( list.size() );
+        for ( MoneyCardUse moneyCardUse : list ) {
+            list1.add( entityToCardListVo( moneyCardUse ) );
+        }
+
+        return list1;
+    }
+}
diff --git a/zq-erp/src/main/resources/mybatis/mapper/common/SysUsersDao.xml b/zq-erp/src/main/resources/mybatis/mapper/common/SysUsersDao.xml
index 321834c..ee69a10 100644
--- a/zq-erp/src/main/resources/mybatis/mapper/common/SysUsersDao.xml
+++ b/zq-erp/src/main/resources/mybatis/mapper/common/SysUsersDao.xml
@@ -960,7 +960,7 @@
                 </if>
                 <if
                         test="(record.suName!=null and record.suName!='') or (record.suName!='' and record.suName==0)">
-                    and su_name like concat('%',#{record.suName},'%')
+                    and (su_name like concat('%',concat(#{record.suName},'%')) or su_tel = #{record.suName})
                 </if>
                 <if
                         test="(record.suTel!=null and record.suTel!='') or (record.suTel!='' and record.suTel==0)">
@@ -1318,5 +1318,7 @@
    where id=#{id}
    </update>
 
-
+    <select id="selectAppVersion" resultType="com.matrix.system.hive.bean.AppVersion">
+        select * from app_version
+    </select>
 </mapper>
\ No newline at end of file
diff --git a/zq-erp/src/main/resources/mybatis/mapper/hive/AchieveNewDao.xml b/zq-erp/src/main/resources/mybatis/mapper/hive/AchieveNewDao.xml
index d1cf576..f28efbf 100644
--- a/zq-erp/src/main/resources/mybatis/mapper/hive/AchieveNewDao.xml
+++ b/zq-erp/src/main/resources/mybatis/mapper/hive/AchieveNewDao.xml
@@ -50,7 +50,9 @@
 
 		<result property="arriveCnt" column="arrive_cnt" />
 
-
+		<result property="goodsNo" column="goodsNo" />
+		<result property="goodsName" column="goodsName" />
+		<result property="zkPrice" column="zkPrice" />
 
 	</resultMap>
 
@@ -933,4 +935,154 @@
 			and a.BEATUY_ID is not null
 		</if>
 	</select>
+
+
+	<select id="selectUserAchieveByTime" resultType="com.matrix.system.app.vo.UserAchieveVo">
+		select
+			sale_id id,
+			sum(case t3 when '现金业绩' then card_cash else 0 end) orderCash,
+			sum(case t3 when '划扣业绩' then consume else 0 end) cash,
+			sum(case order_type when '订单' then proj_percentage else 0 end) cardUse,
+			sum(IFNULL(his_consume, 0)) hisConsume,
+			sum(IFNULL(free_consume, 0)) freeConsume,
+			sum(case order_type when '服务单' then proj_percentage else 0 end) projCommission
+		from achieve_new a
+		where a.beault_id=#{userId}
+		and (date_format(datatime, '%Y-%m-%d') >= date_format(#{startTime}, '%Y-%m-%d') and date_format(#{endTime}, '%Y-%m-%d') >= date_format(datatime, '%Y-%m-%d'))
+	</select>
+
+	<select id="selectApiOrderItemAchieve" resultType="com.matrix.system.app.vo.OrderDetailAchieveItemVo">
+		select
+			b.su_name name,
+			IFNULL(a.card_cash, 0) + IFNULL(a.proj_cash, 0) + IFNULL(a.goods_cash, 0) achieve
+		from achieve_new a
+		inner join sys_users b on (a.beault_id=b.su_id or a.sale_id = b.su_id)
+		where a.order_item_id=#{itemId} and order_type = '订单'
+	</select>
+
+	<select id="selectShopConsumeAchieveRanking" resultType="com.matrix.system.app.vo.RankingVo">
+		select
+			b.shop_short_name name,
+			b.SHOP_IMAG photo,
+			sum(IFNULL(a.free_consume,0) + IFNULL(a.his_consume,0)) amount
+		from achieve_new a
+		left join sys_shop_info b on a.shop_id=b.ID and b.shop_type!=1
+		<where>
+			<if test="record.companyId != null">
+				and a.company_id=#{record.companyId}
+			</if>
+			<if test='record.t1 == "1" and record.datatime != null'>
+				and date_format(datatime, '%Y-%m-%d') = date_format(#{record.datatime}, '%Y-%m-%d')
+			</if>
+			<if test='record.t1 == "2" and record.datatime != null'>
+				and date_format(datatime, '%Y-%m') = date_format(#{record.datatime}, '%Y-%m')
+			</if>
+			<if test='record.t1 == "3" and record.datatime != null'>
+				and date_format(datatime, '%Y') = date_format(#{record.datatime}, '%Y')
+			</if>
+		</where>
+		group by a.shop_id
+		order by amount desc, a.shop_id
+	</select>
+
+	<select id="selectBeauticianConsumeAchieveRanking" resultType="com.matrix.system.app.vo.RankingVo">
+		select
+			b.su_name name,
+			b.su_id id,
+			sum(IFNULL(a.free_consume,0) + IFNULL(a.his_consume, 0) + IFNULL(a.consume, 0)) amount,
+			c.shop_short_name shopName
+		from achieve_new a
+		inner join sys_users b on a.beault_id=b.su_id
+		left join sys_shop_info c on a.shop_id=c.ID
+		<where>
+			a.order_type='服务单'
+			<if test="record.companyId != null">
+				and a.company_id=#{record.companyId}
+			</if>
+			<if test="record.shopId != null">
+				and a.shop_id=#{record.shopId}
+			</if>
+			<if test='record.t1 == "1" and record.datatime != null'>
+				and date_format(datatime, '%Y-%m-%d') = date_format(#{record.datatime}, '%Y-%m-%d')
+			</if>
+			<if test='record.t1 == "2" and record.datatime != null'>
+				and date_format(datatime, '%Y-%m') = date_format(#{record.datatime}, '%Y-%m')
+			</if>
+			<if test='record.t1 == "3" and record.datatime != null'>
+				and date_format(datatime, '%Y') = date_format(#{record.datatime}, '%Y')
+			</if>
+		</where>
+		group by a.beault_id
+		order by amount desc
+	</select>
+
+	<select id="selectOrderItemAchieveByOrderId" resultMap="AchieveNewMap">
+		select
+			a.*,
+			b.code goodsNo,
+			b.name goodsName,
+			c.su_name meiliao,
+			d.count*d.zk_price zk_total
+		from achieve_new a
+		left join shopping_goods b on a.shopping_goods_id=b.id
+		left join sys_users c on a.beault_id=c.su_id
+		left join sys_order_item d on a.order_item_id=d.id
+		where a.order_id=#{orderId}
+	</select>
+
+	<select id="selectStaffSaleAchieveRanking" resultType="com.matrix.system.app.vo.RankingVo">
+		select
+		b.su_name name,
+		b.su_id id,
+		b.su_photo photo,
+		sum(ifnull(card_cash,0)) amount,
+		c.shop_short_name shopName
+		from achieve_new a
+		inner join sys_users b on a.beault_id=b.su_id
+		inner join sys_shop_info c on a.SHOP_ID=c.ID
+		<where>
+			<if test="record.companyId != null">
+				and b.company_id=#{record.companyId}
+			</if>
+			<if test="record.shopId != null">
+				and b.shop_id=#{record.shopId}
+			</if>
+			<if test='record.type == "1" and record.datatime != null'>
+				and date_format(datatime, '%Y-%m-%d') = date_format(#{record.datatime}, '%Y-%m-%d')
+			</if>
+			<if test='record.type == "2" and record.datatime != null'>
+				and date_format(datatime, '%Y-%m') = date_format(#{record.datatime}, '%Y-%m')
+			</if>
+			<if test='record.type == "3" and record.datatime != null'>
+				and date_format(datatime, '%Y') = date_format(#{record.datatime}, '%Y')
+			</if>
+		</where>
+		group by b.su_id
+		order by amount desc, b.su_id
+	</select>
+
+	<select id="selectShopSaleAchieveRanking" resultType="com.matrix.system.app.vo.RankingVo">
+		select
+			b.shop_short_name name,
+			b.SHOP_IMAG photo,
+			sum(IFNULL(a.consume,0) + IFNULL(a.card_cash,0)) amount
+		from achieve_new a
+		left join sys_shop_info b on a.shop_id=b.ID and shop_type!=1
+		<where>
+			<if test="record.companyId != null">
+				and a.company_id=#{record.companyId}
+			</if>
+			<if test='record.t1 == "1" and record.datatime != null'>
+				and date_format(datatime, '%Y-%m-%d') = date_format(#{record.datatime}, '%Y-%m-%d')
+			</if>
+			<if test='record.t1 == "2" and record.datatime != null'>
+				and date_format(datatime, '%Y-%m') = date_format(#{record.datatime}, '%Y-%m')
+			</if>
+			<if test='record.t1 == "3" and record.datatime != null'>
+				and date_format(datatime, '%Y') = date_format(#{record.datatime}, '%Y')
+			</if>
+		</where>
+		group by a.shop_id
+		order by amount desc, a.shop_id
+	</select>
 </mapper>
\ No newline at end of file
diff --git a/zq-erp/src/main/resources/mybatis/mapper/hive/ArticleDao.xml b/zq-erp/src/main/resources/mybatis/mapper/hive/ArticleDao.xml
index 40be119..2e0c943 100644
--- a/zq-erp/src/main/resources/mybatis/mapper/hive/ArticleDao.xml
+++ b/zq-erp/src/main/resources/mybatis/mapper/hive/ArticleDao.xml
@@ -16,7 +16,7 @@
 			<result property="sort" column="sort" />
 			<result property="createtiem" column="createtiem" />
 			<result property="url" column="url" />
-		<result property="shopId" column="shop_id"/>
+		<result property="companyId" column="company_id"/>
 			
 			
 			<result property="articleTypeName" column="article_type_name" />
@@ -43,7 +43,7 @@
 			url,
 			like_number,
 			classify,
-			shop_id
+			company_id
 		)
 	VALUES (
 			#{id},
@@ -59,7 +59,7 @@
 			#{url},
 			#{likeNumber},
 			#{classify},
-			#{shopId}
+			#{companyId}
 	)
 	</insert>
 	
@@ -143,7 +143,7 @@
 			url,
 			classify,
 			like_number,
-			shop_id,
+			company_id,
 			(select article_type_name from article_type c where type_id = c.id) articleTypeName,
 			(select type from article_type c where type_id = c.id) type
 		from article
@@ -188,8 +188,8 @@
 			<if test="record.likeNumber != null and record.likeNumber !='' ">
 				and like_number = #{record.likeNumber}
 			</if>
-			<if test="record.shopId != null and record.shopId !='' ">
-				and shop_id = #{record.shopId}
+			<if test="record.companyId != null and record.companyId !='' ">
+				and company_id = #{record.companyId}
 			</if>
 			<if test="record.type != null and record.type !='' ">
 				and (select type from article_type c where type_id = c.id) = #{record.type}
@@ -228,7 +228,7 @@
 			url,
 			classify,
 			like_number,
-			shop_id,
+			company_id,
 			(select article_type_name from article_type c where type_id = c.id) articleTypeName,
 			(select type from article_type c where type_id = c.id) type
 		from article
@@ -279,8 +279,8 @@
 			<if test="record.articleTypeName != null and record.url !='' ">
 				and (select article_type_name from article_type c where type_id = c.id) = #{record.articleTypeName}
 			</if>
-			<if test="record.shopId != null and record.shopId !='' ">
-				and shop_id = #{record.shopId}
+			<if test="record.companyId != null and record.companyId !='' ">
+				and company_id = #{record.companyId}
 			</if>
 		</if>
 		order by type_id,sort,createtiem desc
@@ -338,8 +338,8 @@
 			<if test="record.articleTypeName != null and record.url !='' ">
 				and (select article_type_name from article_type c where type_id = c.id) = #{record.articleTypeName}
 			</if>
-			<if test="record.shopId != null and record.shopId !='' ">
-				and shop_id = #{record.shopId}
+			<if test="record.companyId != null and record.companyId !='' ">
+				and company_id = #{record.companyId}
 			</if>
 		</if>
 	</select>
@@ -360,12 +360,14 @@
 			url,
 			like_number,
 			classify,
-			shop_id,
+			company_id,
 		   (select article_type_name from article_type c where type_id = c.id) articleTypeName<!-- 所属门店名称 -->
 		from article
 		where  id=#{id} 
-	</select>	
-	
+	</select>
+
+
+
 	
 	<!-- 根据对象查询-->
 	<select id="selectByModel" resultMap="ArticleMap">
@@ -383,7 +385,7 @@
 			a.url,
 			a.classify,
 			a.like_number,
-			a.shop_id,
+			a.company_id,
 		   (select article_type_name from article_type c where a.type_id = c.id) articleTypeName,<!-- 所属门店名称 -->
 		   (select count(*) from article_comment ac where ac.article_id=a.id) commentNum
 		from article a
@@ -431,10 +433,25 @@
 			<if test="record.articleTypeName != null and record.url !='' ">
 				and (select article_type_name from article_type c where a.type_id = c.id) = #{record.articleTypeName}
 			</if>
-			<if test="record.shopId != null and record.shopId !='' ">
-				and a.shop_id = #{record.shopId}
+			<if test="record.companyId != null and record.companyId !='' ">
+				and a.company_id = #{record.companyId}
 			</if>
 		</if>
 		order by type_id,sort,createtiem desc
 	</select>
+
+	<select id="selectApiArticleListInPage" resultMap="ArticleMap">
+		select * from article a
+		inner join article_type b on a.type_id=b.id
+		where a.company_id=#{record.companyId} and  (a.type_id=#{record.typeId} or find_in_set(#{record.typeId}, b.parent_ids))
+		order by a.createtiem desc
+		<if test="pageVo !=null"><!-- 判断pageVo对象是否为空 -->
+			<if test="pageVo.offset >=0  and pageVo.limit >0">
+				limit
+				#{pageVo.offset},#{pageVo.limit}
+			</if>
+		</if>
+	</select>
+
+
 </mapper>
\ No newline at end of file
diff --git a/zq-erp/src/main/resources/mybatis/mapper/hive/ArticleTypeDao.xml b/zq-erp/src/main/resources/mybatis/mapper/hive/ArticleTypeDao.xml
index c45c853..bb312b7 100644
--- a/zq-erp/src/main/resources/mybatis/mapper/hive/ArticleTypeDao.xml
+++ b/zq-erp/src/main/resources/mybatis/mapper/hive/ArticleTypeDao.xml
@@ -12,8 +12,10 @@
 			<result property="description" column="description" />
 			<result property="url" column="url" />
 			<result property="icon" column="icon" />
-			<result property="type" column="type" />
+		<result property="type" column="type" />
+		<result property="parentIds" column="parent_ids" />
 		<result property="shopId" column="shop_id"/>
+		<result property="companyId" column="company_id" />
 			<!--扩展属性  -->
 			<!-- <association property="article" javaType="Article"
 			column="{type_id=id}" select="com.matrix.system.hive.dao.ArticleDao.selectById" /> -->
@@ -30,7 +32,9 @@
 			url,
 			icon,
 			type,
-			shop_id
+			shop_id,
+			company_id,
+			parent_ids
 		)
 	VALUES (
 			#{id},
@@ -41,7 +45,9 @@
 			#{url},
 			#{icon},
 			#{type},
-			#{shopId}
+			#{shopId},
+			#{companyId},
+			#{parentIds}
 	)
 	</insert>
 	
@@ -70,7 +76,10 @@
 				</if>		
 				<if test="type != null and type !='' ">
 					type = #{type},
-				</if>		
+				</if>
+				<if test="parentIds != null and parentIds !='' ">
+					parent_ids = #{parentIds},
+				</if>
 		</set>
 		WHERE id=#{id} 
 	</update>
@@ -223,7 +232,7 @@
 			<if test="record.articleTypeName != null and record.articleTypeName !='' ">
 				and article_type_name = #{record.articleTypeName}
 			</if>
-			<if test="record.parentId != null and record.parentId !='' ">
+			<if test="record.parentId != null or record.parentId ==0 ">
 				and parent_id = #{record.parentId}
 			</if>
 			<if test="record.sort != null and record.sort !='' ">
@@ -244,6 +253,9 @@
 			<if test="record.shopId != null and record.shopId !='' ">
 				and shop_id = #{record.shopId}
 			</if>
+			<if test="record.companyId != null and record.companyId !='' ">
+				and company_id = #{record.companyId}
+			</if>
 		</if>
 	</select>
 </mapper>
\ No newline at end of file
diff --git a/zq-erp/src/main/resources/mybatis/mapper/hive/MoneyCardAssembleDao.xml b/zq-erp/src/main/resources/mybatis/mapper/hive/MoneyCardAssembleDao.xml
index 213bd3a..62d7d53 100644
--- a/zq-erp/src/main/resources/mybatis/mapper/hive/MoneyCardAssembleDao.xml
+++ b/zq-erp/src/main/resources/mybatis/mapper/hive/MoneyCardAssembleDao.xml
@@ -224,4 +224,24 @@
 			card_id
 		from money_card_assemble where card_id=#{cardId}
 	</select>
+
+	<select id="selectCardRelationGoods" resultType="com.matrix.system.app.vo.ShoppingGoodsDetailVo">
+		select
+		    b.name goodsName,
+            b.measure measure,
+            b.volume volume
+		from money_card_assemble a
+		inner join shopping_goods b on a.goods_id=b.id
+		where a.card_id=#{cardId}
+	</select>
+
+	<select id="selectCardRelationCategory" resultType="com.matrix.system.hive.bean.ShoppingGoodsCategory">
+		select
+			a.id id,
+			a.name name,
+			a.parent_id parentId
+		from shopping_goods_category a
+		inner join money_card_assemble b on a.id=b.cate_id
+		where b.card_id=#{cardId};
+	</select>
 </mapper>
\ No newline at end of file
diff --git a/zq-erp/src/main/resources/mybatis/mapper/hive/MoneyCardUseDao.xml b/zq-erp/src/main/resources/mybatis/mapper/hive/MoneyCardUseDao.xml
index 94d6c2d..c74aeca 100644
--- a/zq-erp/src/main/resources/mybatis/mapper/hive/MoneyCardUseDao.xml
+++ b/zq-erp/src/main/resources/mybatis/mapper/hive/MoneyCardUseDao.xml
@@ -20,6 +20,7 @@
         <result property="isVipCar" column="is_vip_car"/>
         <result property="remark" column="remark"/>
         <result property="cardName" column="card_name"/>
+        <result property="orderId" column="orderId"/>
 
         <!-- 对应会员信息 -->
         <association property="vipInfo" javaType="SysVipInfo"
@@ -366,6 +367,7 @@
         select
         a.id,
         a.order_item_id,
+        d.id AS orderId,
         a.use_total,
         a.last_count,
         a.real_money,
@@ -380,7 +382,10 @@
         a.remark,
         a.card_name
         from money_card_use a
-        where vip_id = #{record.vipId}
+        left join shopping_goods b on a.goods_id=b.id
+        left join sys_order_item c on a.ORDER_ITEM_ID=c.id
+        left join sys_order d on c.ORDER_ID=d.id
+        where a.vip_id = #{record.vipId}
         <if test="record!=null">
             <if test="record.orderItemId != null and record.orderItemId !='' ">
                 and a.order_item_id = #{record.orderItemId}
@@ -420,7 +425,9 @@
         select count(*)
         from money_card_use a
         left join shopping_goods b on a.goods_id=b.id
-        where vip_id = #{record.vipId}
+        left join sys_order_item c on a.ORDER_ITEM_ID=c.id
+        left join sys_order d on c.ORDER_ID=d.id
+        where a.vip_id = #{record.vipId}
         <if test="record!=null">
             <if test="record.orderItemId != null and record.orderItemId !='' ">
                 and a.order_item_id = #{record.orderItemId}
diff --git a/zq-erp/src/main/resources/mybatis/mapper/hive/MoneyCardUseFlowDao.xml b/zq-erp/src/main/resources/mybatis/mapper/hive/MoneyCardUseFlowDao.xml
index a767566..a40157c 100644
--- a/zq-erp/src/main/resources/mybatis/mapper/hive/MoneyCardUseFlowDao.xml
+++ b/zq-erp/src/main/resources/mybatis/mapper/hive/MoneyCardUseFlowDao.xml
@@ -160,7 +160,7 @@
 		times,
 		gift_money,
 		balance,
-		(SELECT STAFF_NAME from sys_shopstaff_info a WHERE operation_id=a.id) staffName,
+		(SELECT su_name from sys_users a WHERE operation_id=a.su_id) staffName,
 		(SELECT VIP_NAME FROM sys_vip_info b WHERE vip_id=b.ID) vipName,
 		(SELECT card_NAME FROM money_card_use c WHERE car_use_id=c.ID) cardName
 		from money_card_use_flow
diff --git a/zq-erp/src/main/resources/mybatis/mapper/hive/ShoppingGoodsAssembleDao.xml b/zq-erp/src/main/resources/mybatis/mapper/hive/ShoppingGoodsAssembleDao.xml
index 9597a28..7a1c514 100644
--- a/zq-erp/src/main/resources/mybatis/mapper/hive/ShoppingGoodsAssembleDao.xml
+++ b/zq-erp/src/main/resources/mybatis/mapper/hive/ShoppingGoodsAssembleDao.xml
@@ -432,5 +432,18 @@
         WHERE shopping_goods_id = #{shoppingGoodsId}
     </update>
 
+    <select id="selectGoodsRelationGoodsList" resultType="com.matrix.system.app.vo.ShoppingGoodsDetailVo">
+        select
+            b.name goodsName,
+            b.measure measure,
+            b.volume volume
+        from shopping_goods_assemble a
+        inner join shopping_goods b on a.assembleGoodId=b.id
+        where a.shopping_goods_id=#{goodsId}
+        <if test="goodsType!= null and goodsType != ''">
+            and b.good_type=#{goodsType}
+        </if>
+    </select>
+
 
 </mapper>
\ No newline at end of file
diff --git a/zq-erp/src/main/resources/mybatis/mapper/hive/ShoppingGoodsCategoryDao.xml b/zq-erp/src/main/resources/mybatis/mapper/hive/ShoppingGoodsCategoryDao.xml
index 981a76b..1806262 100644
--- a/zq-erp/src/main/resources/mybatis/mapper/hive/ShoppingGoodsCategoryDao.xml
+++ b/zq-erp/src/main/resources/mybatis/mapper/hive/ShoppingGoodsCategoryDao.xml
@@ -208,4 +208,20 @@
 		</if>
 		ORDER BY sequence
 	</select>
+
+	<select id="selectChildNodesByName" resultMap="ShoppingGoodsCategoryMap">
+		select * from shopping_goods_category a
+		inner join shopping_goods_category b on a.parent_id=b.id and b.parent_id=0
+		<if test="record.name != null and record.name != ''">
+			and b.name=#{record.name}
+		</if>
+		<where>
+			<if test="record.shopId != null">
+				and a.shop_id=#{record.shopId}
+			</if>
+			<if test="record.companyId != null">
+				and a.company_id=#{record.companyId}
+			</if>
+		</where>
+	</select>
 </mapper>
\ No newline at end of file
diff --git a/zq-erp/src/main/resources/mybatis/mapper/hive/ShoppingGoodsDao.xml b/zq-erp/src/main/resources/mybatis/mapper/hive/ShoppingGoodsDao.xml
index 31bf0dc..5e75ca7 100644
--- a/zq-erp/src/main/resources/mybatis/mapper/hive/ShoppingGoodsDao.xml
+++ b/zq-erp/src/main/resources/mybatis/mapper/hive/ShoppingGoodsDao.xml
@@ -685,28 +685,25 @@
 			<if test="record.queryNoGoodsype != null and record.queryNoGoodsype !='' ">
 				and good_type !=#{record.queryNoGoodsype}
 			</if>
+
 			<if test="record.name != null and record.name !='' ">
 				and (instr(name,#{record.name}) or instr(zjm,#{record.name}))
 			</if>
+			<if test="record.zjm != null and record.zjm !='' ">
+				and instr(zjm,#{record.zjm})
+			</if>
+
+
 			<if test="record.staus != null and record.staus !='' ">
 				and staus =#{record.staus}
 			</if>
-			<if test="record.code != null and record.code !=''">
-				and code = #{record.code}
-			</if>
+
 			<if test="record.isAssemble != null and record.isAssemble !='' ">
 				and is_assemble =#{record.isAssemble}
 			</if>
 			<if test="record.deleted != null and record.deleted !='' ">
 				and deleted =#{record.deleted}
 			</if>
-			<if test="record.isDel != null and record.isDel !='' ">
-				and is_del = #{record.isDel}
-			</if>
-			<if test="record.zjm != null and record.zjm !='' ">
-				and instr(zjm,#{record.zjm})
-			</if>
-
 			<if test="record.cateId != null and record.cateId !='' ">
 				and cate_id =#{record.cateId}
 			</if>
@@ -722,32 +719,44 @@
 				and is_vip_car = #{record.isVipCar}
 			</if>
 
+
 			<if test="record.isCourse != null and record.isCourse !=''">
 				and is_course = #{record.isCourse}
 			</if>
+
+			<if test="record.code != null and record.code !=''">
+				and code = #{record.code}
+			</if>
+
 
 			<if test="record.startTime != null ">
 				and create_time <![CDATA[ >= ]]> #{record.startTime}
 			</if>
 			<if test="record.endTime != null ">
 				and create_time <![CDATA[ <= ]]> #{record.endTime}
+
 			</if>
 			<if test="record.shopId != null and record.shopId !='' ">
-				<![CDATA[	and ( shop_id = #{record.shopId}
-				or  ISNULL(use_shop) || LENGTH(trim(use_shop))<1
-				or FIND_IN_SET(#{record.shopId},use_shop) ) ]]>
+				<![CDATA[	and ( shop_id = #{record.shopId} or
+				      (  headquarters=1 and  ( ISNULL(use_shop) or LENGTH(trim(use_shop))<1 or FIND_IN_SET(#{record.shopId},use_shop))))]]>
 			</if>
 			<if test="record.companyId != null and record.companyId !='' ">
 				and company_id = #{record.companyId}
 			</if>
+
+			<if test="record.isDel != null and record.isDel !='' ">
+				and is_del = #{record.isDel}
+			</if>
+
 
 
 			<if test="record.headquarters != null and record.headquarters !='' ">
 				and headquarters = #{record.headquarters}
 			</if>
 
-
 		</if>
+
+
 	</select>
 
 
@@ -1228,4 +1237,63 @@
 	</select>
 
 
+	<select id="selectShoppingGoodsApiInPage" resultType="com.matrix.system.app.vo.ShoppingGoodsListVo">
+		select
+			id id,
+			code goodsCode,
+			name name,
+			seal_pice price,
+			is_present isPresent,
+			unit unit,
+			measure measure,
+			a.good_type goodsType
+		from shopping_goods a
+		where 1=1 and staus = '上架' and a.is_del=1
+		<if test="record.queryKey != null and record.queryKey != ''">
+			and (instr(name,#{record.queryKey}) or instr(code ,#{record.queryKey}) or instr(zjm ,#{record.queryKey}))
+		</if>
+		<if test="record.cateId!=null">
+			and a.cate_id in ( select b.id from shopping_goods_category b where (b.id=#{record.cateId} or b.parent_id=#{record.cateId}))
+		</if>
+		<if test="record.shopId != null and record.shopId !='' ">
+			<![CDATA[	and ( a.shop_id = #{record.shopId} or
+				      (  a.headquarters=1 and  ( ISNULL(a.use_shop) or LENGTH(trim(a.use_shop))<1 or FIND_IN_SET(#{record.shopId},a.use_shop))))]]>
+		</if>
+		<if test="record.companyId != null and record.companyId !='' ">
+			and a.company_id=#{record.companyId}
+		</if>
+		<if test="record.goodType!=null">
+			and a.good_type=#{record.goodType}
+		</if>
+		<if test="pageVo !=null"><!-- 判断pageVo对象是否为空 -->
+			<if test="pageVo.sort !=null  and pageVo.order !=null">
+				order by ${pageVo.sort} ${pageVo.order}
+			</if>
+			<if test="pageVo.offset >=0  and pageVo.limit >0">
+				limit #{pageVo.offset},#{pageVo.limit}
+			</if>
+		</if>
+	</select>
+
+	<select id="selectShopppingGoodsAipTotal" resultType="java.lang.Integer">
+		select count(1)
+		from shopping_goods a
+		where 1=1 and staus = '上架'
+		<if test="record.queryKey != null and record.queryKey != ''">
+			and (instr(name,#{record.queryKey}) or instr(code ,#{record.queryKey}) or instr(zjm ,#{record.queryKey}))
+		</if>
+		<if test="record.cateId!=null">
+			and a.cate_id in ( select b.id from shopping_goods_category b where (b.id=#{record.cateId} or b.parent_id=#{record.cateId}))
+		</if>
+		<if test="record.shopId != null and record.shopId !='' ">
+			<![CDATA[	and ( a.shop_id = #{record.shopId} or
+				      (  a.headquarters=1 and  ( ISNULL(a.use_shop) or LENGTH(trim(a.use_shop))<1 or FIND_IN_SET(#{record.shopId},a.use_shop))))]]>
+		</if>
+		<if test="record.companyId != null and record.companyId !='' ">
+			and a.company_id=#{record.companyId}
+		</if>
+		<if test="record.goodType!=null">
+			and a.good_type=#{record.goodType}
+		</if>
+	</select>
 </mapper>
diff --git a/zq-erp/src/main/resources/mybatis/mapper/hive/SysBeauticianStateDao.xml b/zq-erp/src/main/resources/mybatis/mapper/hive/SysBeauticianStateDao.xml
index baafcdc..6262844 100644
--- a/zq-erp/src/main/resources/mybatis/mapper/hive/SysBeauticianStateDao.xml
+++ b/zq-erp/src/main/resources/mybatis/mapper/hive/SysBeauticianStateDao.xml
@@ -327,6 +327,9 @@
        <![CDATA[ a.BEGIN_TIME > #{beginTime}
         and a.END_TIME < #{endTime}
         and a.STAFF_ID = #{suId} ]]>
+        and  a.STATE !='预约取消'
+        and  a.STATE !='待确认'
+        and  a.STATE !='待预约'
         order by a.BEGIN_TIME asc
 
     </select>
@@ -407,6 +410,7 @@
     <select id="selectItemDetail" resultType="java.util.HashMap" parameterType="java.util.HashMap">
         select
         f.SHOP_NAME,
+        b.yy_time,
         b.consume_time,
         b.SERVICE_NO,
         d.su_name,
@@ -417,7 +421,8 @@
         a.COUNT,
         h.PRICE,
         h.SOURCE,
-        a.STATE
+        a.STATE,
+        a.extract
         from sys_beautician_state a
         left join sys_proj_services b on a.SERVICES_ID=b.ID
         left join shopping_goods c on a.proj_id=c.id
@@ -455,7 +460,7 @@
             </if>
 
             <if test="cateId != null and cateId != ''  ">
-                and  c.PROJ_TYPE_ID=#{cateId}
+                and  c.cate_id=#{cateId}
             </if>
 
 
diff --git a/zq-erp/src/main/resources/mybatis/mapper/hive/SysBusinessDataDao.xml b/zq-erp/src/main/resources/mybatis/mapper/hive/SysBusinessDataDao.xml
index d048579..6844dff 100644
--- a/zq-erp/src/main/resources/mybatis/mapper/hive/SysBusinessDataDao.xml
+++ b/zq-erp/src/main/resources/mybatis/mapper/hive/SysBusinessDataDao.xml
@@ -533,6 +533,414 @@
         ) t
     </select>
 
+    <select id="selectApiBusinessDataInPage" resultType="com.matrix.system.app.vo.BusinessesDataShowVo">
+        select
+            date_format(a.time, #{record.t1}) dataTime,
+            sum(cashPay + cardPay + arrearsPay) totalPay,
+            sum(cashPay) cashPay,
+            sum(cardPay) cardPay,
+            sum(arrearsPay) arrearsPay,
+            sum(freeConsumePay) freeConsumePay,
+            sum(consumePay) consumePay,
+            sum(refundCardPay) refundCardPay,
+            sum(refundCashPay) refundCashPay
+        from (
+                 select
+                        company_id,
+                        shop_id,
+                        a.time,
+                        MAX(CASE code WHEN 'cashPay' THEN value ELSE 0 END)            cashPay,
+                        MAX(CASE code WHEN 'cardPay' THEN value ELSE 0 END)            cardPay,
+                        MAX(CASE code WHEN 'arrearsPay' THEN value ELSE 0 END)         arrearsPay,
+                        MAX(CASE code WHEN 'freeConsumePay' THEN value ELSE 0 END)     freeConsumePay,
+                        MAX(CASE code WHEN 'consumePay' THEN value ELSE 0 END)         consumePay,
+                        MAX(CASE code WHEN 'refundCashPay' THEN ABS(value) ELSE 0 END) refundCashPay,
+                        MAX(CASE code WHEN 'refundCardPay' THEN ABS(value) ELSE 0 END) refundCardPay
+                 from sys_business_data a
+                 group by a.time, company_id, shop_id
+             ) a
+        <where>
+            <if test="record.companyId != null">
+                and a.company_id=#{record.companyId}
+            </if>
+            <if test="record.shopId != null">
+                and a.shop_id=#{record.shopId}
+            </if>
+        </where>
+        group by date_format(a.time, #{record.t1})
+        order by a.time desc
+        <if test="pageVo !=null"><!-- 判断pageVo对象是否为空 -->
+            <if test="pageVo.offset >=0  and pageVo.limit >0">
+                limit
+                #{pageVo.offset},#{pageVo.limit}
+            </if>
+        </if>
+    </select>
 
+    <select id="selectApiBusinessDataTotal" resultType="java.lang.Integer">
+        select
+            count(1)
+        from (
+            select
+                date_format(a.time, #{record.t1}) dataTime,
+                sum(cashPay + cardPay + arrearsPay) totalPay,
+                sum(cashPay) cashPay,
+                sum(cardPay) cardPay,
+                sum(arrearsPay) arrearsPay,
+                sum(freeConsumePay) freeConsumePay,
+                sum(consumePay) consumePay,
+                sum(refundCardPay) refundCardPay,
+                sum(refundCashPay) refundCashPay
+            from (
+                select
+                company_id,
+                shop_id,
+                a.time,
+                MAX(CASE code WHEN 'cashPay' THEN value ELSE 0 END)            cashPay,
+                MAX(CASE code WHEN 'cardPay' THEN value ELSE 0 END)            cardPay,
+                MAX(CASE code WHEN 'arrearsPay' THEN value ELSE 0 END)         arrearsPay,
+                MAX(CASE code WHEN 'freeConsumePay' THEN value ELSE 0 END)     freeConsumePay,
+                MAX(CASE code WHEN 'consumePay' THEN value ELSE 0 END)         consumePay,
+                MAX(CASE code WHEN 'refundCashPay' THEN ABS(value) ELSE 0 END) refundCashPay,
+                MAX(CASE code WHEN 'refundCardPay' THEN ABS(value) ELSE 0 END) refundCardPay
+                from sys_business_data a
+                group by a.time, company_id, shop_id
+            ) a
+            <where>
+                <if test="record.companyId != null">
+                    and a.company_id=#{record.companyId}
+                </if>
+                <if test="record.shopId != null">
+                    and a.shop_id=#{record.shopId}
+                </if>
+            </where>
+            group by date_format(a.time, #{record.t1})
+            order by a.time desc
+        ) a
+    </select>
 
+    <select id="selectApiBusinessData" resultType="com.matrix.system.app.vo.BusinessesDataShowVo">
+        <foreach collection="list" index="index" item="item"   separator="union all"  >
+            select
+                #{item.beginTime} dataTime,
+                (select shop_short_name from sys_shop_info where id=#{shopId}) shopName,
+                (select IFNULL(sum(amount),0) from sys_order_flow
+                    where <![CDATA[ create_time > #{item.beginTime} and create_time < #{item.endTime}]]> and pay_method!='欠款'
+                    <if test="shopId != null">
+                        and shop_id=#{shopId}
+                    </if>
+                    <if test="companyId != null">
+                        and company_id=#{companyId}
+                    </if>
+                    )totalPay,
+                (select IFNULL(sum(amount),0) from sys_order_flow
+                    where pay_method not in ('储值卡', '欠款') and flow_type != '退款' and <![CDATA[ create_time > #{item.beginTime} and create_time < #{item.endTime}]]>
+                    <if test="shopId != null">
+                        and shop_id=#{shopId}
+                    </if>
+                    <if test="companyId != null">
+                        and company_id=#{companyId}
+                    </if>
+                    ) cashPay,
+                (select IFNULL(sum(amount),0) from sys_order_flow
+                    where pay_method = '储值卡' and flow_type != '退款' and <![CDATA[ create_time > #{item.beginTime} and create_time < #{item.endTime}]]>
+                    <if test="shopId != null">
+                        and shop_id=#{shopId}
+                    </if>
+                    <if test="companyId != null">
+                        and company_id=#{companyId}
+                    </if>
+                    ) cardPay,
+                (select IFNULL(sum(amount),0) from sys_order_flow
+                    where pay_method = '欠款' and <![CDATA[ create_time > #{item.beginTime} and create_time < #{item.endTime}]]>
+                    <if test="shopId != null">
+                        and shop_id=#{shopId}
+                    </if>
+                    <if test="companyId != null">
+                        and company_id=#{companyId}
+                    </if>
+                    ) arrearsPay,
+                (select IFNULL(sum(amount),0) from sys_order_flow
+                    where pay_method not in ('储值卡', '欠款') and flow_type = '退款' and <![CDATA[ create_time > #{item.beginTime} and create_time < #{item.endTime}]]>
+                    <if test="shopId != null">
+                        and shop_id=#{shopId}
+                    </if>
+                    <if test="companyId != null">
+                        and company_id=#{companyId}
+                    </if>
+                    ) refundCashPay,
+                (select IFNULL(sum(amount),0) from sys_order_flow
+                    where pay_method in ('储值卡') and flow_type = '退款' and <![CDATA[ create_time > #{item.beginTime} and create_time < #{item.endTime}]]>
+                    <if test="shopId != null">
+                        and shop_id=#{shopId}
+                    </if>
+                    <if test="companyId != null">
+                        and company_id=#{companyId}
+                    </if>
+                    ) refundCardPay,
+                (select IFNULL(sum(zk_price*count),0) from sys_order_item a
+                    inner join shopping_goods b on a.goods_id=b.id
+                    inner join sys_order c on a.ORDER_ID=c.id
+                    where b.good_type='家居产品' and <![CDATA[ a.create_time > #{item.beginTime} and a.create_time < #{item.endTime}]]>
+                    <if test="shopId != null">
+                        and c.shop_id=#{shopId}
+                    </if>
+                    <if test="companyId != null">
+                        and c.company_id=#{companyId}
+                    </if>
+                    ) productAchieve,
+                (select IFNULL(sum(zk_price*count),0) from sys_order_item a
+                    inner join shopping_goods b on a.goods_id=b.id
+                    inner join sys_order c on a.ORDER_ID=c.id
+                    where b.good_type!='家居产品' and <![CDATA[ a.create_time > #{item.beginTime} and a.create_time < #{item.endTime}]]>
+                    <if test="shopId != null">
+                        and c.shop_id=#{shopId}
+                    </if>
+                    <if test="companyId != null">
+                        and c.company_id=#{companyId}
+                    </if>
+                    ) cardAchieve,
+                (select IFNULL(sum(amount),0) from sys_order_flow where flow_type = '还款' and <![CDATA[ create_time > #{item.beginTime} and create_time < #{item.endTime}]]>
+                    <if test="shopId != null">
+                        and shop_id=#{shopId}
+                    </if>
+                    <if test="companyId != null">
+                        and company_id=#{companyId}
+                    </if>
+                ) refund,
+                (select IFNULL(count(1),0) from sys_order
+                    where STATU in ('已付款', '欠款') and <![CDATA[ ORDER_TIME > #{item.beginTime} and ORDER_TIME < #{item.endTime} ]]>
+                    <if test="shopId != null">
+                        and shop_id=#{shopId}
+                    </if>
+                    <if test="companyId != null">
+                        and company_id=#{companyId}
+                    </if>
+                    ) perCustomCnt,
+                (select IFNULL(sum(b.COUNT),0) from sys_order a inner join sys_order_item b on a.ID=b.ORDER_ID
+                    where a.STATU in ('已付款', '欠款') and <![CDATA[ ORDER_TIME > #{item.beginTime} and ORDER_TIME < #{item.endTime} ]]>
+                    <if test="shopId != null">
+                        and shop_id=#{shopId}
+                    </if>
+                    <if test="companyId != null">
+                        and company_id=#{companyId}
+                    </if>
+                    ) totalSaleCnt,
+                (select IFNULL(sum(e.count * d.GOODS_PRICE),0) from sys_order a
+                    inner join sys_out_store b on a.id=b.ORDER_ID
+                    inner join sys_out_store_item c on b.id=c.OUT_STORE_ID
+                    inner join sys_store_info d on c.store_id = d.ID
+                    inner join sys_order_item e on a.ID=e.ORDER_ID
+                    inner join shopping_goods f on e.goods_id=f.id and f.good_type='家居产品'
+                    where a.STATU in ('已付款', '欠款') and <![CDATA[ ORDER_TIME > #{item.beginTime} and ORDER_TIME < #{item.endTime} ]]>
+                    <if test="shopId != null">
+                        and a.shop_id=#{shopId}
+                    </if>
+                    <if test="companyId != null">
+                        and a.company_id=#{companyId}
+                    </if>
+                ) goodsCost,
+                (select IFNULL(sum(b.COUNT * IFNULL(c.price, 0)),0) from sys_order a
+                    inner join sys_order_item b on a.ID=b.ORDER_ID
+                    inner join shopping_goods c on c.good_type != '家居产品' and b.goods_id=c.id
+                    where a.STATU in ('已付款', '欠款') and <![CDATA[ ORDER_TIME > #{item.beginTime} and ORDER_TIME < #{item.endTime} ]]>
+                    <if test="shopId != null">
+                        and a.shop_id=#{shopId}
+                    </if>
+                    <if test="companyId != null">
+                        and a.company_id=#{companyId}
+                    </if>
+                ) otherCost,
+                (select IFNULL(sum(IFNULL(his_consume, 0)),0) from achieve_new
+                    where <![CDATA[datatime > #{item.beginTime} and datatime < #{item.endTime}]]>
+                    <if test="shopId != null">
+                        and shop_id=#{shopId}
+                    </if>
+                    <if test="companyId != null">
+                        and company_id=#{companyId}
+                    </if>
+                    ) consumePay,
+                (select IFNULL(sum(IFNULL(free_consume, 0)),0) from achieve_new
+                    where <![CDATA[datatime > #{item.beginTime} and datatime < #{item.endTime}]]>
+                    <if test="shopId != null">
+                        and shop_id=#{shopId}
+                    </if>
+                    <if test="companyId != null">
+                        and company_id=#{companyId}
+                    </if>
+                    ) freeConsumePay,
+                (select IFNULL(sum(IFNULL(number_of_people, 0)),0) from achieve_new
+                    where <![CDATA[datatime > #{item.beginTime} and datatime < #{item.endTime}]]>
+                    <if test="shopId != null">
+                        and shop_id=#{shopId}
+                    </if>
+                    <if test="companyId != null">
+                        and company_id=#{companyId}
+                    </if>
+                    ) peopleCnt,
+                (select IFNULL(sum(IFNULL(proj_num, 0)),0) from achieve_new
+                    where <![CDATA[datatime > #{item.beginTime} and datatime < #{item.endTime}]]>
+                    <if test="shopId != null">
+                        and shop_id=#{shopId}
+                    </if>
+                    <if test="companyId != null">
+                        and company_id=#{companyId}
+                    </if>
+                    ) projConsumeCnt,
+                (select IFNULL(sum(IFNULL(proj_time, 0)),0) from achieve_new
+                    where <![CDATA[datatime > #{item.beginTime} and datatime < #{item.endTime}]]>
+                    <if test="shopId != null">
+                        and shop_id=#{shopId}
+                    </if>
+                    <if test="companyId != null">
+                        and company_id=#{companyId}
+                    </if>
+                    ) timeLength
+            from dual
+        </foreach>
+    </select>
+
+    <select id="selectDailySaleData" resultType="com.matrix.system.hive.statistics.DailySaleVo">
+        <foreach collection="list" index="index" item="item"   separator="union all"  >
+            select
+            #{item.beginTime} dataTime,
+            (select shop_short_name from sys_shop_info where id=#{shopId}) shopName,
+            (select sum(total) shouldPay from sys_order
+                where STATU in ('已付款', '欠款') and <![CDATA[ create_time > #{item.beginTime} and create_time < #{item.endTime}]]>
+                <if test="shopId != null">
+                    and shop_id=#{shopId}
+                </if>
+                ) shouldPay,
+            (select IFNULL(sum(amount),0) from sys_order_flow
+                where <![CDATA[ create_time > #{item.beginTime} and create_time < #{item.endTime}]]> and pay_method!='欠款'
+                <if test="shopId != null">
+                    and shop_id=#{shopId}
+                </if>
+            )totalPay,
+            (select IFNULL(sum(amount),0) from sys_order_flow
+            where pay_method not in ('储值卡', '欠款') and flow_type != '退款' and <![CDATA[ create_time > #{item.beginTime} and create_time < #{item.endTime}]]>
+            <if test="shopId != null">
+                and shop_id=#{shopId}
+            </if>
+            ) cashPay,
+            (select IFNULL(sum(amount),0) from sys_order_flow
+            where pay_method = '储值卡' and flow_type != '退款' and <![CDATA[ create_time > #{item.beginTime} and create_time < #{item.endTime}]]>
+            <if test="shopId != null">
+                and shop_id=#{shopId}
+            </if>
+            ) cardPay,
+            (select IFNULL(sum(amount),0) from sys_order_flow
+            where pay_method = '欠款' and <![CDATA[ create_time > #{item.beginTime} and create_time < #{item.endTime}]]>
+            <if test="shopId != null">
+                and shop_id=#{shopId}
+            </if>
+            ) arrearsPay,
+            (select IFNULL(sum(amount),0) from sys_order_flow
+            where pay_method not in ('储值卡', '欠款') and flow_type = '退款' and <![CDATA[ create_time > #{item.beginTime} and create_time < #{item.endTime}]]>
+            <if test="shopId != null">
+                and shop_id=#{shopId}
+            </if>
+            ) refundCashPay,
+            (select IFNULL(sum(amount),0) from sys_order_flow
+            where pay_method in ('储值卡') and flow_type = '退款' and <![CDATA[ create_time > #{item.beginTime} and create_time < #{item.endTime}]]>
+            <if test="shopId != null">
+                and shop_id=#{shopId}
+            </if>
+            ) refundCardPay,
+            (select IFNULL(sum(zk_price*count),0) from sys_order_item a
+            inner join shopping_goods b on a.goods_id=b.id
+            inner join sys_order c on a.ORDER_ID=c.id
+            where b.good_type='家居产品' and <![CDATA[ a.create_time > #{item.beginTime} and a.create_time < #{item.endTime}]]>
+            <if test="shopId != null">
+                and c.shop_id=#{shopId}
+            </if>
+            ) productAchieve,
+            (select IFNULL(sum(zk_price*count),0) from sys_order_item a
+            inner join shopping_goods b on a.goods_id=b.id
+            inner join sys_order c on a.ORDER_ID=c.id
+            where b.good_type!='家居产品' and <![CDATA[ a.create_time > #{item.beginTime} and a.create_time < #{item.endTime}]]>
+            <if test="shopId != null">
+                and c.shop_id=#{shopId}
+            </if>
+            ) cardAchieve,
+            (select IFNULL(sum(amount),0) from sys_order_flow where flow_type = '退款' and <![CDATA[ create_time > #{item.beginTime} and create_time < #{item.endTime}]]>
+            <if test="shopId != null">
+                and shop_id=#{shopId}
+            </if>
+            ) refund,
+            (select IFNULL(count(1),0) from sys_order
+            where STATU in ('已付款', '欠款') and <![CDATA[ ORDER_TIME > #{item.beginTime} and ORDER_TIME < #{item.endTime} ]]>
+            <if test="shopId != null">
+                and shop_id=#{shopId}
+            </if>
+            ) perCustomCnt,
+            (select IFNULL(sum(b.COUNT),0) from sys_order a inner join sys_order_item b on a.ID=b.ORDER_ID
+            where a.STATU in ('已付款', '欠款') and <![CDATA[ ORDER_TIME > #{item.beginTime} and ORDER_TIME < #{item.endTime} ]]>
+            <if test="shopId != null">
+                and shop_id=#{shopId}
+            </if>
+            ) totalSaleCnt,
+            (select IFNULL(sum(e.count * d.GOODS_PRICE),0) from sys_order a
+            inner join sys_out_store b on a.id=b.ORDER_ID
+            inner join sys_out_store_item c on b.id=c.OUT_STORE_ID
+            inner join sys_store_info d on c.store_id = d.ID
+            inner join sys_order_item e on a.ID=e.ORDER_ID
+            inner join shopping_goods f on e.goods_id=f.id and f.good_type='家居产品'
+            where a.STATU in ('已付款', '欠款') and <![CDATA[ ORDER_TIME > #{item.beginTime} and ORDER_TIME < #{item.endTime} ]]>
+            <if test="shopId != null">
+                and a.shop_id=#{shopId}
+            </if>
+            ) goodsCost,
+            (select IFNULL(sum(b.COUNT * IFNULL(c.price, 0)),0) from sys_order a
+            inner join sys_order_item b on a.ID=b.ORDER_ID
+            inner join shopping_goods c on c.good_type != '家居产品' and b.goods_id=c.id
+            where a.STATU in ('已付款', '欠款') and <![CDATA[ ORDER_TIME > #{item.beginTime} and ORDER_TIME < #{item.endTime} ]]>
+            <if test="shopId != null">
+                and a.shop_id=#{shopId}
+            </if>
+            ) otherCost,
+            (select  sum(case a.paymethod when '微信' then amount else 0 end) wechat
+                from (<include refid="dailySaleFlow"></include>) a
+            ) wechat,
+            (select
+                sum(case a.paymethod when '支付宝' then amount else 0 end) alipay
+                from (<include refid="dailySaleFlow"></include>) a
+            ) alipay,
+            (select
+                sum(case a.paymethod when '现金支付' then amount else 0 end) cash
+                from (<include refid="dailySaleFlow"></include>) a
+            ) cash,
+            (select
+                sum(case a.paymethod when '银行卡' then amount else 0 end) bankCard
+                from (<include refid="dailySaleFlow"></include>) a
+            ) bankCard,
+            (select
+                sum(case a.paymethod when '团购' then amount else 0 end) tuan
+                from (<include refid="dailySaleFlow"></include>) a
+            ) tuan,
+            (select
+                sum(case a.paymethod when '本金收款' then amount else 0 end) cardBj
+                from (<include refid="dailySaleFlow"></include>) a
+            ) cardBj,
+            (select
+                sum(case a.paymethod when '赠金收款' then amount else 0 end) cardFree
+            from (<include refid="dailySaleFlow"></include>) a
+            ) cardFree,
+            (select
+                sum(case a.paymethod when '欠款' then amount else 0 end) arrears
+            from (<include refid="dailySaleFlow"></include>) a
+            ) arrears
+            from dual
+        </foreach>
+    </select>
+
+    <sql id="dailySaleFlow">
+        select sum(amount) amount, case when is_gift = 'Y' then '赠金收款' when is_gift='N' then '本金收款' else pay_method end paymethod
+        from sys_order_flow
+        where <![CDATA[ create_time > #{item.beginTime} and create_time < #{item.endTime} ]]>
+        <if test="shopId != null">
+            and shop_id=#{shopId}
+        </if>
+        group by paymethod
+    </sql>
 </mapper>
\ No newline at end of file
diff --git a/zq-erp/src/main/resources/mybatis/mapper/hive/SysFollowupCommentDao.xml b/zq-erp/src/main/resources/mybatis/mapper/hive/SysFollowupCommentDao.xml
new file mode 100644
index 0000000..82af5be
--- /dev/null
+++ b/zq-erp/src/main/resources/mybatis/mapper/hive/SysFollowupCommentDao.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.matrix.system.hive.dao.SysFollowupCommentDao">
+	<!-- 定义SysFollowupComment 的复杂关联map -->
+	<resultMap type="com.matrix.system.hive.bean.SysFollowupComment" id="SysFollowupCommentMap">
+		<id property="id" column="id" />
+		<result property="createBy" column="create_by" />
+		<result property="createTime" column="create_time" />
+		<result property="updateBy" column="update_by" />
+		<result property="updateTime" column="update_time" />
+			<result property="follId" column="foll_id" />
+			<result property="staffId" column="staff_id" />
+			<result property="content" column="content" />
+	</resultMap>
+	
+	
+	<!-- 定义SysFollowupComment 的简单map  ,本map不添加其他的关联属性 -->
+	<resultMap type="com.matrix.system.hive.bean.SysFollowupComment" id="SysFollowupCommentSimpleMap">
+		<id property="id" column="id" />
+		<result property="createBy" column="create_by" />
+		<result property="createTime" column="create_time" />
+		<result property="updateBy" column="update_by" />
+		<result property="updateTime" column="update_time" />
+			<result property="follId" column="foll_id" />
+			<result property="staffId" column="staff_id" />
+			<result property="content" column="content" />
+	</resultMap>
+	
+	<!-- 字段sql -->
+	<sql id="columns">
+		create_by,
+		create_time,
+		update_by,
+		update_time,
+			id,
+			foll_id,
+			staff_id,
+			content
+	</sql>
+	
+	<!-- 属性sql -->
+	<sql id="propertys">
+		#{item.createBy},
+		now(),
+		#{item.updateBy},
+		now(),
+			#{item.id},
+			#{item.follId},
+			#{item.staffId},
+			#{item.content}
+	</sql>
+	
+	<!-- where sql -->
+	<sql id="where_sql">
+		 
+		 <if test="record!=null">
+			<if test="(record.id!=null and record.id!='') or  (record.id!='' and record.id==0)  ">
+				and id  = #{record.id} 
+			</if>
+			<if test="(record.follId!=null and record.follId!='') or  (record.follId!='' and record.follId==0)  ">
+				and foll_id  = #{record.follId} 
+			</if>
+			<if test="(record.staffId!=null and record.staffId!='') or  (record.staffId!='' and record.staffId==0)  ">
+				and staff_id  = #{record.staffId} 
+			</if>
+			<if test="(record.content!=null and record.content!='') or  (record.content!='' and record.content==0)  ">
+				and content  = #{record.content} 
+			</if>
+		</if>
+		 
+	</sql>
+	
+	<!--  插入方法   -->
+	<insert id="insert" parameterType="com.matrix.system.hive.bean.SysFollowupComment"
+		useGeneratedKeys="true" keyProperty="item.id">
+		INSERT INTO sys_followup_comment (
+			 <include refid="columns"></include>
+		)
+	VALUES (
+		 <include refid="propertys"></include>
+	)
+	</insert>
+	
+	
+	
+	<!--  批量插入   -->
+	<insert id="batchInsert" parameterType="java.util.List">
+		INSERT INTO sys_followup_comment (
+		<include refid="columns"></include>	
+		)
+	VALUES 
+	<foreach collection="list" item="item" index="index" separator=",">(
+		<include refid="propertys"></include>	
+	)</foreach>
+	</insert>
+	
+	
+	
+	
+	
+	<!--  根据Map更新 部分更新   -->
+	<update id="updateByMap" parameterType="java.util.HashMap" >
+		UPDATE sys_followup_comment
+		<set>
+			<if test="_parameter.containsKey('follId')">
+					foll_id = #{follId},
+				</if>		
+			<if test="_parameter.containsKey('staffId')">
+					staff_id = #{staffId},
+				</if>		
+			<if test="_parameter.containsKey('content')">
+					content = #{content},
+				</if>		
+		</set>
+		WHERE id=#{id} 
+	</update> 
+	
+	
+	<!--  根据对象更新 部分更新   -->
+	<update id="updateByModel" parameterType="Integer">
+		UPDATE sys_followup_comment
+		<set>
+			<if test="record.follId != null ">
+				foll_id  = #{record.follId}, 
+			</if>
+			<if test="record.staffId != null ">
+				staff_id  = #{record.staffId}, 
+			</if>
+			<if test="record.content != null and record.content != '' ">
+				content  = #{record.content}, 
+			</if>
+		</set>
+		WHERE id=#{record.id} 
+	</update>
+	
+	<!-- 批量删除 -->
+	<delete id="deleteByIds" parameterType="java.util.List">
+		delete from sys_followup_comment where  id in
+		<foreach collection="list" index="index" item="item" open="("
+			separator="," close=")">
+			#{item}
+		</foreach>
+	</delete>
+		
+	<!-- 根据id删除-->
+	<delete id="deleteById" parameterType="Integer">
+		DELETE FROM sys_followup_comment
+		where  id=#{id} 
+	</delete>
+	
+	<!-- 根据对象删除-->
+	<delete id="deleteByModel" parameterType="com.matrix.system.hive.bean.SysFollowupComment">
+		DELETE FROM sys_followup_comment
+		<where>
+		<include refid="where_sql" ></include>
+		</where>
+	</delete>
+	
+	
+	
+	<!-- 分页查询 -->
+	<select id="selectInPage" resultMap="SysFollowupCommentMap">
+		select 
+		<include refid="columns" ></include>
+		from sys_followup_comment
+		<where>
+		  <include refid="where_sql"></include>
+		 </where>
+		<if test="pageVo !=null"><!-- 判断pageVo对象是否为空 -->
+			<if test="pageVo.sort !=null  and pageVo.order !=null">
+				order by
+				${pageVo.sort} ${pageVo.order}
+			</if>
+			<if test="pageVo.offset >=0  and pageVo.limit >0">
+				limit
+				#{pageVo.offset},#{pageVo.limit}
+			</if>
+		</if>
+	</select>
+	
+	<!-- 查询总条数 -->
+	<select id="selectTotalRecord" parameterType="long"   resultType="java.lang.Integer">
+	select count(*)
+	from sys_followup_comment
+		<where>
+		   <include refid="where_sql"></include>
+		</where>
+	</select>
+
+	<!-- 根据id查询-->
+	<select id="selectById" resultMap="SysFollowupCommentMap">
+		select 
+		<include refid="columns" ></include>
+		from sys_followup_comment
+		where  id=#{id} 
+	</select>	
+	
+	
+	<!-- 根据id 锁表查询-->
+	<select id="selectForUpdate" resultMap="SysFollowupCommentMap">
+		select 
+		<include refid="columns" ></include>
+		from sys_followup_comment
+		where  id=#{id} 
+		for update
+	</select>	
+	
+	
+	
+	<!-- 根据对象查询-->
+	<select id="selectByModel" resultMap="SysFollowupCommentMap">
+		select 
+		<include refid="columns" ></include>
+		from sys_followup_comment
+		<where>
+		  <include refid="where_sql"></include>
+		 </where>
+	</select>
+
+    <select id="selectByfollId" resultMap="SysFollowupCommentMap">
+		select
+		<include refid="columns" ></include>
+		from sys_followup_comment
+		where foll_id=#{follId}
+	</select>
+</mapper>
\ No newline at end of file
diff --git a/zq-erp/src/main/resources/mybatis/mapper/hive/SysFollowupDao.xml b/zq-erp/src/main/resources/mybatis/mapper/hive/SysFollowupDao.xml
new file mode 100644
index 0000000..408922a
--- /dev/null
+++ b/zq-erp/src/main/resources/mybatis/mapper/hive/SysFollowupDao.xml
@@ -0,0 +1,405 @@
+<?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.matrix.system.hive.dao.SysFollowupDao" >
+	<!-- 定义SysFollowup 的复杂关联map -->
+	<resultMap type="com.matrix.system.hive.bean.SysFollowup" id="SysFollowupMap">
+		<id property="id" column="id" />
+		<result property="createBy" column="create_by" />
+		<result property="createTime" column="create_time" />
+		<result property="updateBy" column="update_by" />
+		<result property="updateTime" column="update_time" />
+			<result property="staffId" column="staff_id" />
+			<result property="vipId" column="vip_id" />
+			<result property="orderId" column="order_id" />
+			<result property="serviceId" column="service_id" />
+			<result property="shopId" column="shop_id" />
+			<result property="companyId" column="company_id" />
+			<result property="nextNotifyTime" column="next_notify_time" />
+			<result property="content" column="content" />
+			<result property="visible" column="visible" />
+			<result property="orderAbstract" column="order_abstract" />
+			<result property="zans" column="zans" />
+
+			<result property="staffPhoto" column="staffPhoto" />
+			<result property="staffName" column="staffName" />
+			<result property="vipName" column="vipName" />
+
+			<collection property="albums" column="{sourceId=id}" select="com.matrix.system.hive.dao.SysVipAlbumDao.selectBySourceId"  />
+
+			<collection property="followupComments" column="{follId=id}"  select="com.matrix.system.hive.dao.SysFollowupCommentDao.selectByfollId" ></collection>
+
+			<collection property="zanUsers"         column="{zans=zans}"   select="selectUserByZaqns" ></collection>
+
+
+	</resultMap>
+
+	<select id="selectUserByZaqns" resultMap="com.matrix.system.common.dao.SysUsersDao.SysUsersMap" >
+		 select su_id,su_name from sys_users where  FIND_IN_SET(su_id,#{zans})
+	</select>
+	
+	<!-- 定义SysFollowup 的简单map  ,本map不添加其他的关联属性 -->
+	<resultMap type="com.matrix.system.hive.bean.SysFollowup" id="SysFollowupSimpleMap">
+		<id property="id" column="id" />
+		<result property="createBy" column="create_by" />
+		<result property="createTime" column="create_time" />
+		<result property="updateBy" column="update_by" />
+		<result property="updateTime" column="update_time" />
+			<result property="staffId" column="staff_id" />
+			<result property="vipId" column="vip_id" />
+			<result property="orderId" column="order_id" />
+			<result property="serviceId" column="service_id" />
+			<result property="shopId" column="shop_id" />
+			<result property="companyId" column="company_id" />
+			<result property="nextNotifyTime" column="next_notify_time" />
+			<result property="content" column="content" />
+			<result property="visible" column="visible" />
+			<result property="orderAbstract" column="order_abstract" />
+			<result property="zans" column="zans" />
+	</resultMap>
+	
+	<!-- 字段sql -->
+	<sql id="columns">
+		create_by,
+		create_time,
+		update_by,
+		update_time,
+			id,
+			staff_id,
+			vip_id,
+			order_id,
+			service_id,
+			shop_id,
+			company_id,
+			next_notify_time,
+			content,
+			visible,
+			order_abstract,
+			zans
+	</sql>
+	
+	<!-- 属性sql -->
+	<sql id="propertys">
+		#{item.createBy},
+		now(),
+		#{item.updateBy},
+		now(),
+			#{item.id},
+			#{item.staffId},
+			#{item.vipId},
+			#{item.orderId},
+			#{item.serviceId},
+			#{item.shopId},
+			#{item.companyId},
+			#{item.nextNotifyTime},
+			#{item.content},
+			#{item.visible},
+			#{item.orderAbstract},
+			#{item.zans}
+	</sql>
+	
+	<!-- where sql -->
+	<sql id="where_sql">
+		 
+		 <if test="record!=null">
+			<if test="(record.id!=null and record.id!='') or  (record.id!='' and record.id==0)  ">
+				and id  = #{record.id} 
+			</if>
+			<if test="(record.staffId!=null and record.staffId!='') or  (record.staffId!='' and record.staffId==0)  ">
+				and staff_id  = #{record.staffId} 
+			</if>
+			<if test="(record.vipId!=null and record.vipId!='') or  (record.vipId!='' and record.vipId==0)  ">
+				and vip_id  = #{record.vipId} 
+			</if>
+			<if test="(record.orderId!=null and record.orderId!='') or  (record.orderId!='' and record.orderId==0)  ">
+				and order_id  = #{record.orderId} 
+			</if>
+			<if test="(record.serviceId!=null and record.serviceId!='') or  (record.serviceId!='' and record.serviceId==0)  ">
+				and service_id  = #{record.serviceId} 
+			</if>
+			<if test="(record.shopId!=null and record.shopId!='') or  (record.shopId!='' and record.shopId==0)  ">
+				and shop_id  = #{record.shopId} 
+			</if>
+			<if test="(record.companyId!=null and record.companyId!='') or  (record.companyId!='' and record.companyId==0)  ">
+				and company_id  = #{record.companyId} 
+			</if>
+			<if test="(record.nextNotifyTime!=null and record.nextNotifyTime!='') or  (record.nextNotifyTime!='' and record.nextNotifyTime==0)  ">
+				and next_notify_time  = #{record.nextNotifyTime} 
+			</if>
+			<if test="(record.content!=null and record.content!='') or  (record.content!='' and record.content==0)  ">
+				and content  = #{record.content} 
+			</if>
+			<if test="(record.visible!=null and record.visible!='') or  (record.visible!='' and record.visible==0)  ">
+				and visible  = #{record.visible}
+			</if>
+			<if test="(record.orderAbstract!=null and record.orderAbstract!='') or  (record.orderAbstract!='' and record.orderAbstract==0)  ">
+				and order_abstract  = #{record.orderAbstract} 
+			</if>
+			<if test="(record.zans!=null and record.zans!='') or  (record.zans!='' and record.zans==0)  ">
+				and zans  = #{record.zans} 
+			</if>
+		</if>
+		 
+	</sql>
+	
+	<!--  插入方法   -->
+	<insert id="insert" parameterType="com.matrix.system.hive.bean.SysFollowup"
+		useGeneratedKeys="true" keyProperty="item.id">
+		INSERT INTO sys_followup (
+			 <include refid="columns"></include>
+		)
+	VALUES (
+		 <include refid="propertys"></include>
+	)
+	</insert>
+	
+	
+	
+	<!--  批量插入   -->
+	<insert id="batchInsert" parameterType="java.util.List">
+		INSERT INTO sys_followup (
+		<include refid="columns"></include>	
+		)
+	VALUES 
+	<foreach collection="list" item="item" index="index" separator=",">(
+		<include refid="propertys"></include>	
+	)</foreach>
+	</insert>
+	
+	
+	
+	
+	
+	<!--  根据Map更新 部分更新   -->
+	<update id="updateByMap" parameterType="java.util.HashMap" >
+		UPDATE sys_followup
+		<set>
+			<if test="_parameter.containsKey('staffId')">
+					staff_id = #{staffId},
+				</if>		
+			<if test="_parameter.containsKey('vipId')">
+					vip_id = #{vipId},
+				</if>		
+			<if test="_parameter.containsKey('orderId')">
+					order_id = #{orderId},
+				</if>		
+			<if test="_parameter.containsKey('serviceId')">
+					service_id = #{serviceId},
+				</if>		
+			<if test="_parameter.containsKey('shopId')">
+					shop_id = #{shopId},
+				</if>		
+			<if test="_parameter.containsKey('companyId')">
+					company_id = #{companyId},
+				</if>		
+			<if test="_parameter.containsKey('nextNotifyTime')">
+					next_notify_time = #{nextNotifyTime},
+				</if>		
+			<if test="_parameter.containsKey('content')">
+					content = #{content},
+				</if>		
+			<if test="_parameter.containsKey('visible')">
+					visible = #{visible},
+				</if>		
+			<if test="_parameter.containsKey('orderAbstract')">
+					order_abstract = #{orderAbstract},
+				</if>		
+			<if test="_parameter.containsKey('zans')">
+					zans = #{zans},
+				</if>		
+		</set>
+		WHERE id=#{id} 
+	</update> 
+	
+	
+	<!--  根据对象更新 部分更新   -->
+	<update id="updateByModel" parameterType="Integer">
+		UPDATE sys_followup
+		<set>
+			<if test="record.staffId != null ">
+				staff_id  = #{record.staffId}, 
+			</if>
+			<if test="record.vipId != null ">
+				vip_id  = #{record.vipId}, 
+			</if>
+			<if test="record.orderId != null ">
+				order_id  = #{record.orderId}, 
+			</if>
+			<if test="record.serviceId != null ">
+				service_id  = #{record.serviceId}, 
+			</if>
+			<if test="record.shopId != null ">
+				shop_id  = #{record.shopId}, 
+			</if>
+			<if test="record.companyId != null ">
+				company_id  = #{record.companyId}, 
+			</if>
+			<if test="record.nextNotifyTime != null ">
+				next_notify_time  = #{record.nextNotifyTime}, 
+			</if>
+			<if test="record.content != null and record.content != '' ">
+				content  = #{record.content}, 
+			</if>
+			<if test="record.visible != null ">
+				visible  = #{record.visible},
+			</if>
+			<if test="record.orderAbstract != null and record.orderAbstract != '' ">
+				order_abstract  = #{record.orderAbstract}, 
+			</if>
+			<if test="record.zans != null and record.zans != '' ">
+				zans  = #{record.zans}, 
+			</if>
+		</set>
+		WHERE id=#{record.id} 
+	</update>
+
+	<!-- 更新点赞人数 -->
+	<update id="updateZan">
+		update sys_followup set zans=#{zans} where id=#{id}
+	</update>
+
+	<!-- 批量删除 -->
+	<delete id="deleteByIds" parameterType="java.util.List">
+		delete from sys_followup where  id in
+		<foreach collection="list" index="index" item="item" open="("
+			separator="," close=")">
+			#{item}
+		</foreach>
+	</delete>
+		
+	<!-- 根据id删除-->
+	<delete id="deleteById" parameterType="Integer">
+		DELETE FROM sys_followup
+		where  id=#{id} 
+	</delete>
+	
+	<!-- 根据对象删除-->
+	<delete id="deleteByModel" parameterType="com.matrix.system.hive.bean.SysFollowup">
+		DELETE FROM sys_followup
+		<where>
+		<include refid="where_sql" ></include>
+		</where>
+	</delete>
+	
+	
+	
+	<!-- 分页查询 -->
+	<select id="selectInPage" resultMap="SysFollowupMap">
+		select 
+		<include refid="columns" ></include>
+		from sys_followup
+		<where>
+		  <include refid="where_sql"></include>
+		 </where>
+		<if test="pageVo !=null"><!-- 判断pageVo对象是否为空 -->
+			<if test="pageVo.sort !=null  and pageVo.order !=null">
+				order by
+				${pageVo.sort} ${pageVo.order}
+			</if>
+			<if test="pageVo.offset >=0  and pageVo.limit >0">
+				limit
+				#{pageVo.offset},#{pageVo.limit}
+			</if>
+		</if>
+	</select>
+	
+	<!-- 查询总条数 -->
+	<select id="selectTotalRecord" parameterType="long"   resultType="java.lang.Integer">
+	select count(*)
+	from sys_followup
+		<where>
+		   <include refid="where_sql"></include>
+		</where>
+	</select>
+
+	<!-- 根据id查询-->
+	<select id="selectById" resultMap="SysFollowupMap">
+		select 
+		<include refid="columns" ></include>
+		from sys_followup
+		where  id=#{id} 
+	</select>	
+	
+	
+	<!-- 根据id 锁表查询-->
+	<select id="selectForUpdate" resultMap="SysFollowupMap">
+		select 
+		<include refid="columns" ></include>
+		from sys_followup
+		where  id=#{id} 
+		for update
+	</select>	
+	
+	
+	
+	<!-- 根据对象查询-->
+	<select id="selectByModel" resultMap="SysFollowupMap">
+		select 
+		<include refid="columns" ></include>
+		from sys_followup
+		<where>
+		  <include refid="where_sql"></include>
+		 </where>
+	</select>
+
+
+	<select id="selectByAppDto" resultMap="SysFollowupMap">
+		select a.*,
+		 b.su_photo as staffPhoto,
+		 b.su_name as staffName,
+		 c.vip_name as vipName
+		 from sys_followup  a
+		 left join  sys_users b on a.staff_id= b.su_id
+		 left join  sys_vip_info c on a.vip_id=c.id
+		<where>
+			and a.company_id=#{companyId}
+
+			<if test="shopId != null ">
+				and a.shop_id=#{shopId}
+			</if>
+			<if test="queryType == 1 ">
+				and (visible=1 or ( visible!=1 and a.staff_id=#{selfStaff}))
+			</if>
+			<if test="queryType == 2 ">
+				and a.staff_id=#{selfStaff}
+			</if>
+			<if test="queryType == 3 ">
+				and( visible=1 and a.staff_id!=#{selfStaff})
+			</if>
+
+			<if test="startTime != null ">
+				and a.create_time <![CDATA[ >= ]]> #{startTime}
+			</if>
+			<if test="endTime != null ">
+				and a.create_time <![CDATA[ <= ]]> #{endTime}
+			</if>
+
+			<if test="vipIds!=null and vipIds.size()!=0">
+				and	a.vip_id in
+				<foreach collection="vipIds" index="index" item="item" open="("
+						 separator="," close=")">
+					#{item}
+				</foreach>
+			</if>
+
+			<if test="staffIds!=null and staffIds.size()!=0">
+				and	a.staff_id in
+				<foreach collection="staffIds" index="index" item="item" open="("
+						 separator="," close=")">
+					#{item}
+				</foreach>
+			</if>
+
+
+		</where>
+
+
+		order by a.create_time desc
+
+
+	  	limit ${offset},${limit}
+	</select>
+
+
+</mapper>
\ No newline at end of file
diff --git a/zq-erp/src/main/resources/mybatis/mapper/hive/SysOrderDao.xml b/zq-erp/src/main/resources/mybatis/mapper/hive/SysOrderDao.xml
index 237c65c..1e64c24 100644
--- a/zq-erp/src/main/resources/mybatis/mapper/hive/SysOrderDao.xml
+++ b/zq-erp/src/main/resources/mybatis/mapper/hive/SysOrderDao.xml
@@ -18,6 +18,7 @@
         <result property="statu" column="STATU"/>
         <result property="zkTotal" column="ZK_TOTAL"/>
         <result property="shopId" column="SHOP_ID"/>
+        <result property="companyId" column="company_id"/>
         <result property="vipName" column="VIP_NAME"/>
         <result property="vipNo" column="VIP_NO"/>
         <result property="staffName" column="STAFF_NAME"/>
@@ -30,6 +31,7 @@
 
         <!-- 扩展字段 -->
         <result property="shopName" column="SHOP_NAME"/>
+        <result property="shopShortName" column="SHOP_SHORT_NAME"/>
         <result property="vipPhone" column="PHONE"/>
 
 
@@ -88,7 +90,7 @@
     <!-- 更新订单时间 -->
     <update id="updateOrderTime">
 		UPDATE sys_order
-		set  ORDER_TIME = #{orderTime}
+		set  pay_time = #{payTime}
 		WHERE id=#{id}
 	 </update>
 
@@ -321,6 +323,7 @@
             a.*,
             c.su_name as STAFF_NAME,
             d.SHOP_NAME,
+            d.shop_short_name,
             b.PHONE,
                b.VIP_NAME
         from sys_order a
@@ -467,12 +470,205 @@
 
     <select id="selectVipOrderInfoTotal" resultType="com.matrix.system.hive.bean.SysOrder">
         select
-            sum(ZK_TOTAL) zkTotal,
+            sum(amount) zkTotal,
             count(1) times,
             MAX(pay_time) payTime,
             GROUP_CONCAT(DISTINCT t2.shop_short_name) shopName
         from sys_order t1
+        left join sys_order_flow b on t1.id=b.ORDER_ID and pay_method!='储值卡'
         left join sys_shop_info t2 on t1.SHOP_ID=t2.ID
-        where VIP_ID=#{vipId} and STATU='已付款';
+        where t1.VIP_ID=#{vipId} and STATU='已付款';
     </select>
+
+    <select id="selectApiOrderListInPage" resultType="com.matrix.system.app.vo.OrderDetailVo">
+        select
+           a.id orderId,
+           a.VIP_ID vipId,
+           a.ORDER_NO orderNo,
+           a.ORDER_TIME orderTime,
+           a.STATU orderStatus,
+           a.ZK_TOTAL needPay,
+           (a.card_Pay + a.cash_Pay) realPay,
+           a.arrears arrears,
+           b.su_name staffName,
+           c.VIP_NAME vipName,
+           c.PHONE phone
+        from sys_order a
+        left join sys_users b on a.STAFF_ID = b.su_id
+        left join sys_vip_info c on c.id = a.VIP_ID
+        <where>
+            <if test="record.queryKey != null and record.queryKey != ''">
+                and (instr(c.vip_name, #{record.queryKey}) or instr(c.phone, #{record.queryKey}) or instr(a.order_no, #{record.queryKey}))
+            </if>
+            <if test="record.status != null and record.status != ''">
+                and a.statu = #{record.status}
+            </if>
+            <if test="record.shopId != null">
+                and a.shop_id=#{record.shopId}
+            </if>
+            <if test="record.companyId != null">
+                and a.company_id=#{record.companyId}
+            </if>
+        </where>
+        <if test="pageVo !=null"><!-- 判断pageVo对象是否为空 -->
+            order by a.order_time desc
+            <if test="pageVo.offset >=0  and pageVo.limit >0">
+                limit
+                #{pageVo.offset},#{pageVo.limit}
+            </if>
+        </if>
+    </select>
+
+    <select id="selectApiOrderListTotal" resultType="java.lang.Integer">
+        select
+            count(1)
+        from sys_order a
+        left join sys_users b on a.STAFF_ID = b.su_id
+        left join sys_vip_info c on c.id = a.VIP_ID
+        <where>
+            <if test="record.queryKey != null and record.queryKey != ''">
+                and (instr(c.vip_name, #{record.queryKey}) or instr(c.phone, #{record.queryKey}) or instr(a.order_no, #{record.queryKey}))
+            </if>
+            <if test="record.status != null and record.status != ''">
+                and a.statu = #{record.status}
+            </if>
+            <if test="record.shopId != null">
+                and a.shop_id=#{record.shopId}
+            </if>
+            <if test="record.companyId != null">
+                and a.company_id=#{record.companyId}
+            </if>
+        </where>
+    </select>
+
+    <select id="selectApiOrderDetailById" resultType="com.matrix.system.app.vo.OrderDetailVo">
+        select
+               a.id orderId,
+               b.VIP_NAME vipName,
+               b.PHONE phone,
+               a.ORDER_NO orderNo,
+               c.su_name staffName,
+               a.cash_Pay cashPay,
+               a.card_Pay cardPay,
+               a.ZK_TOTAL needPay,
+               a.cash_Pay + a.card_Pay realPay,
+               a.arrears arrears,
+               a.TOTAL - a.ZK_TOTAL discount,
+               a.STATU orderStatus,
+               a.order_time orderTime
+        from sys_order a
+        inner join sys_vip_info b on a.VIP_ID=b.ID
+        left join sys_users c on a.STAFF_ID=c.su_id
+        where a.id=#{orderId}
+    </select>
+
+    <select id="selectShopAchieveRanking" resultType="com.matrix.system.app.vo.RankingVo">
+        select
+               b.shop_short_name name,
+               b.SHOP_IMAG photo,
+               sum(IFNULL(a.ZK_TOTAL,0)) amount
+        from sys_order a
+        left join sys_shop_info b on a.SHOP_ID=b.ID
+        <where>
+            a.statu in ('已付款', '欠款')
+            <if test="record.companyId != null">
+                and a.company_id=#{record.companyId}
+            </if>
+            <if test='record.type == "1" and record.orderTime != null'>
+                and date_format(order_time, '%Y-%m-%d') = date_format(#{record.orderTime}, '%Y-%m-%d')
+            </if>
+            <if test='record.type == "2" and record.orderTime != null'>
+                and date_format(order_time, '%Y-%m') = date_format(#{record.orderTime}, '%Y-%m')
+            </if>
+            <if test='record.type == "3" and record.orderTime != null'>
+                and date_format(order_time, '%Y') = date_format(#{record.orderTime}, '%Y')
+            </if>
+        </where>
+        group by a.SHOP_ID
+        order by amount desc, a.shop_id
+    </select>
+
+    <select id="selectStaffSaleAchieveRanking" resultType="com.matrix.system.app.vo.RankingVo">
+        select
+               b.su_name name,
+               b.su_id id,
+               b.su_photo photo,
+               sum(ZK_TOTAL) amount,
+               c.shop_short_name shopName
+        from sys_order a
+        left join sys_users b on a.STAFF_ID=b.su_id
+        left join sys_shop_info c on a.SHOP_ID=c.ID
+        <where>
+            a.statu in ('已付款', '欠款') and b.su_id is not null
+            <if test="record.companyId != null">
+                and a.company_id=#{record.companyId}
+            </if>
+            <if test="record.shopId != null">
+                and a.shop_id=#{record.shopId}
+            </if>
+            <if test='record.type == "1" and record.orderTime != null'>
+                and date_format(order_time, '%Y-%m-%d') = date_format(#{record.orderTime}, '%Y-%m-%d')
+            </if>
+            <if test='record.type == "2" and record.orderTime != null'>
+                and date_format(order_time, '%Y-%m') = date_format(#{record.orderTime}, '%Y-%m')
+            </if>
+            <if test='record.type == "3" and record.orderTime != null'>
+                and date_format(order_time, '%Y') = date_format(#{record.orderTime}, '%Y')
+            </if>
+        </where>
+        group by b.su_id
+        order by amount desc, b.su_id
+    </select>
+
+
+    <select id="selectErpOrderList" resultType="com.matrix.system.shopXcx.api.vo.ErpOrderDetailVo">
+            select
+            a.id orderId,
+            a.ORDER_NO orderNo,
+            a.ORDER_TIME orderTime,
+            a.STATU orderStatus,
+            a.ZK_TOTAL needPay,
+            a.TOTAL - a.ZK_TOTAL discount,
+            (a.card_Pay + a.cash_Pay) realPay,
+            a.arrears arrears,
+            b.su_name staffName,
+            d.shop_name as shopName
+            from sys_order a
+            left join sys_users b on a.STAFF_ID = b.su_id
+            left join sys_vip_info c on c.id = a.VIP_ID
+            left join sys_shop_info d on d.id=a.shop_id
+            <where>
+                <if test="queryKey != null and queryKey != ''">
+                    and instr(a.order_no, #{queryKey})
+                </if>
+                <if test="status != null and status != ''">
+                    and a.statu = #{status}
+                </if>
+                <if test="vipId != null">
+                    and a.vip_id=#{vipId}
+                </if>
+            </where>
+            order by a.order_time desc
+            limit #{offset},#{limit}
+    </select>
+    <select id="findUserOrderById" resultType="com.matrix.system.shopXcx.api.vo.ErpOrderDetailVo">
+         select
+            a.id orderId,
+            a.ORDER_NO orderNo,
+            a.ORDER_TIME orderTime,
+            a.STATU orderStatus,
+            a.ZK_TOTAL needPay,
+            a.TOTAL - a.ZK_TOTAL discount,
+            (a.card_Pay + a.cash_Pay) realPay,
+            a.arrears arrears,
+            b.su_name staffName,
+            d.shop_name as shopName
+            from sys_order a
+            left join sys_users b on a.STAFF_ID = b.su_id
+            left join sys_vip_info c on c.id = a.VIP_ID
+            left join sys_shop_info d on d.id=a.shop_id
+            where a.id=#{orderId}
+    </select>
+
+
 </mapper>
\ No newline at end of file
diff --git a/zq-erp/src/main/resources/mybatis/mapper/hive/SysOrderFlowDao.xml b/zq-erp/src/main/resources/mybatis/mapper/hive/SysOrderFlowDao.xml
new file mode 100644
index 0000000..5c56a95
--- /dev/null
+++ b/zq-erp/src/main/resources/mybatis/mapper/hive/SysOrderFlowDao.xml
@@ -0,0 +1,190 @@
+<?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.matrix.system.hive.dao.SysOrderFlowDao">
+
+    <resultMap id="SysOrderFlowMap" type="SysOrderFlow">
+        <id property="id" column="id" />
+        <result property="createBy" column="create_by" />
+        <result property="createTime" column="create_time" />
+        <result property="updateBy" column="update_by" />
+        <result property="updateTime" column="update_time" />
+        <result property="flowNo" column="flow_no" />
+        <result property="orderId" column="order_id" />
+        <result property="flowContent" column="flow_content" />
+        <result property="flowType" column="flow_type" />
+        <result property="amount" column="amount" />
+        <result property="vipId" column="vip_id" />
+        <result property="payMethod" column="pay_method" />
+        <result property="cardId" column="card_id" />
+        <result property="isGift" column="is_gift" />
+
+		<result property="orderNo" column="order_no" />
+    </resultMap>
+
+    <insert id="insert" parameterType="SysOrderFlow" useGeneratedKeys="true"
+            keyProperty="id">
+		INSERT INTO sys_order_flow (
+		ID,
+		create_by,
+		create_time,
+		update_by,
+		update_time,
+		flow_no,
+		order_id,
+		flow_content,
+		flow_type,
+		amount,
+		vip_id,
+		pay_method,
+		card_id,
+		is_gift,
+		shop_id,
+		company_id
+		)
+		VALUES (
+		#{id},
+		#{createBy},
+		now(),
+		#{updateBy},
+		now(),
+		#{flowNo},
+		#{orderId},
+		#{flowContent},
+		#{flowType},
+		#{amount},
+		#{vipId},
+		#{payMethod},
+		#{cardId},
+		#{isGift},
+		#{shopId},
+		#{companyId}
+		)
+	</insert>
+	<update id="updateTimeByOrderId">
+		UPDATE sys_order_flow set
+		create_time=#{payTime}
+		where order_id=#{orderId}
+	</update>
+    <delete id="deleteByOrderId">
+		delete from sys_order_flow where order_id=#{orderId}
+	</delete>
+
+    <select id="selectByOrderId" resultMap="SysOrderFlowMap">
+		select a.*, b.order_no from sys_order_flow a
+		left join sys_order b on a.order_id=b.id
+		where order_id=#{orderId}
+	</select>
+
+	<select id="selectPayMethodsAmountByOrderId" resultMap="SysOrderFlowMap">
+		select
+			pay_method,
+			sum(amount) amount
+		from sys_order_flow
+		where order_id=#{orderId}
+		group by pay_method
+	</select>
+
+	<select id="selectInPage" resultType="com.matrix.system.hive.vo.OrderFlowVo">
+		SELECT
+		a.id,
+		b.id as orderId,
+		a.create_time as createTime,
+		b.ORDER_NO as orderNo,
+		a.flow_content as flowContent,
+		a.flow_type as flowType,
+		a.amount as amount,
+		c.VIP_NAME as vipName,
+		a.pay_method as payMethod,
+		a.flow_no as flowNo,
+		d.shop_short_name as shopName,
+		e.su_name as staffName
+		from sys_order_flow a
+		LEFT JOIN sys_order b on a.order_id=b.ID
+		LEFT JOIN sys_vip_info c on a.vip_id=c.ID
+		LEFT JOIN sys_shop_info d on a.shop_id=d.ID
+		LEFT JOIN sys_users e on e.su_id=b.STAFF_ID
+		<where>
+
+				and a.company_id=#{record.companyId}
+
+			<if test="record.queryKey != null and record.queryKey != ''">
+				and (instr(c.vip_name, #{record.queryKey}) or instr(c.phone, #{record.queryKey}) )
+			</if>
+			<if test="record.oprationMan != null and record.oprationMan != ''">
+				and instr(e.su_name, #{record.oprationMan})
+			</if>
+			<if test="record.orderNo != null and record.orderNo != ''">
+				and instr(b.ORDER_NO, #{record.orderNo})
+			</if>
+			<if test="record.payMethod != null and record.payMethod != ''">
+				and a.pay_method=#{record.payMethod}
+			</if>
+
+			<if test="record.flowType != null and record.flowType != ''">
+				and a.flow_type=#{record.flowType}
+			</if>
+
+			<if test="record.startTime != null ">
+				and a.create_time >= #{record.startTime}
+			</if>
+			<if test="record.endTime != null   ">
+				<![CDATA[and a.create_time <= #{record.endTime}]]>
+			</if>
+			<if test="record.shopId != null and record.shopId != ''">
+				and a.shop_id=#{record.shopId}
+			</if>
+		</where>
+		<if test="record.sort !=null">
+			order by
+			a.${record.sort} ${record.order}
+		</if>
+		<if test="record.offset >=0  and record.limit >0">
+			limit
+			#{record.offset},#{record.limit}
+		</if>
+
+
+	</select>
+
+	<select id="selectTotal" resultType="java.lang.Integer">
+		SELECT count(*)
+		from sys_order_flow a
+		LEFT JOIN sys_order b on a.order_id=b.ID
+		LEFT JOIN sys_vip_info c on a.vip_id=c.ID
+		LEFT JOIN sys_shop_info d on a.shop_id=d.ID
+		LEFT JOIN sys_users e on e.su_id=b.STAFF_ID
+		<where>
+
+			and a.company_id=#{record.companyId}
+
+			<if test="record.queryKey != null and record.queryKey != ''">
+				and (instr(c.vip_name, #{record.queryKey}) or instr(c.phone, #{record.queryKey}) )
+			</if>
+			<if test="record.oprationMan != null and record.oprationMan != ''">
+				and instr(e.su_name, #{record.oprationMan})
+			</if>
+			<if test="record.orderNo != null and record.orderNo != ''">
+				and instr(b.ORDER_NO, #{record.orderNo})
+			</if>
+			<if test="record.payMethod != null and record.payMethod != ''">
+				and a.pay_method=#{record.payMethod}
+			</if>
+
+			<if test="record.flowType != null and record.flowType != ''">
+				and a.flow_type=#{record.flowType}
+			</if>
+
+			<if test="record.startTime != null ">
+				and a.create_time >= #{record.startTime}
+			</if>
+			<if test="record.endTime != null   ">
+				<![CDATA[and a.create_time <= #{record.endTime}]]>
+			</if>
+			<if test="record.shopId != null and record.shopId != ''">
+				and a.shop_id=#{record.shopId}
+			</if>
+
+		</where>
+	</select>
+
+</mapper>
\ No newline at end of file
diff --git a/zq-erp/src/main/resources/mybatis/mapper/hive/SysOrderItemDao.xml b/zq-erp/src/main/resources/mybatis/mapper/hive/SysOrderItemDao.xml
index 208e3ec..6be411c 100644
--- a/zq-erp/src/main/resources/mybatis/mapper/hive/SysOrderItemDao.xml
+++ b/zq-erp/src/main/resources/mybatis/mapper/hive/SysOrderItemDao.xml
@@ -33,6 +33,7 @@
                      resultMap="com.matrix.system.hive.dao.ShoppingGoodsDao.ShoppingGoodsSimpleMap"></association>
 
 
+
     </resultMap>
 
     <!-- 查询会员待处理的订单商品 -->
@@ -128,7 +129,7 @@
             <if test="orderId != null and orderId !='' ">
                 ORDER_ID = #{orderId},
             </if>
-            <if test="count != null and count !='' ">
+            <if test="count != null and count !='' or count == 0 ">
                 COUNT = #{count},
             </if>
             <if test="isFree != null and isFree !='' ">
@@ -250,11 +251,11 @@
 		g.is_course,
 		g.car_use_count,
 		g.good_type,
-		g.code
-
-
+		g.code,
+		g.goods_no,
+		g.name
 		from sys_order_item i
-		left  join shopping_goods g on i.goods_id=g.id
+		left join shopping_goods g on i.goods_id=g.id
 		where ORDER_ID =#{orderId}
 	</select>
 
@@ -519,5 +520,31 @@
         group by c.id ,f.id) t
     </select>
 
+    <select id="selectApiOrderDetailItemsByOrderId" resultType="com.matrix.system.app.vo.OrderDetailItemVo">
+        select
+               a.id id,
+               b.name goodsName,
+               a.COUNT count,
+               a.cash_Pay cashPay,
+               a.card_Pay cardPay,
+               a.PRICE price,
+               a.ZK_PRICE zkPrice,
+               a.status status
+        from sys_order_item a
+        inner join shopping_goods b on a.goods_id=b.id
+        where a.ORDER_ID=#{orderId};
+    </select>
+
+    <select id="selectErpOrderItemByOrderId"
+            resultType="com.matrix.system.shopXcx.api.vo.ErpOrderDetailItemVo">
+            select
+               b.name goodsName,
+               a.COUNT count,
+               a.PRICE price,
+               a.ZK_PRICE zkPrice
+        from sys_order_item a
+        inner join shopping_goods b on a.goods_id=b.id
+        where a.ORDER_ID=#{orderId}
+    </select>
 
 </mapper>
\ No newline at end of file
diff --git a/zq-erp/src/main/resources/mybatis/mapper/hive/SysProjServicesDao.xml b/zq-erp/src/main/resources/mybatis/mapper/hive/SysProjServicesDao.xml
index e608194..cdb7e50 100644
--- a/zq-erp/src/main/resources/mybatis/mapper/hive/SysProjServicesDao.xml
+++ b/zq-erp/src/main/resources/mybatis/mapper/hive/SysProjServicesDao.xml
@@ -38,6 +38,10 @@
 			<result property="oldShopId" column="OLD_SHOP_ID"/>
 			<result property="consumeTime" column="consume_time"/>
 			<result property="companyId" column="company_id"/>
+			<result property="comment" column="comment"/>
+			<result property="reply" column="reply"/>
+			<result property="overtimeNotice" column="overtime_notice"/>
+
 
 			
 			<result property="beautiName" column="beautiName"/>
@@ -45,6 +49,7 @@
 			<result property="shopName" column="shopName"/>
 			<result property="createStaffName" column="createStaffName"/>
 			<result property="bedName" column="bedName"/>
+			<result property="vipName" column="VIP_Name"/>
 
 			<association property="vipInfo"  resultMap="com.matrix.system.hive.dao.SysVipInfoDao.SysVipInfoMapSimple" ></association>
 
@@ -87,7 +92,10 @@
 			CHANGE_ID,
 			OLD_SHOP_ID,
 			consume_time,
-			company_id
+			company_id,
+			comment,
+			reply,
+			overtime_notice
 		)
 	VALUES (
 			#{id},
@@ -122,15 +130,30 @@
 			#{changeId},
 			#{oldShopId},
 			#{consumeTime},
-			#{companyId}
+			#{companyId},
+			#{comment},
+			#{reply},
+			#{overtimeNotice}
 	)
 		
 	</insert>
 
 	<!--  根据id更新 部分更新   -->
 	<update id="updateOrderTime">
-		UPDATE sys_proj_services set CREATE_TIME=#{createTime} WHERE id=#{id} 
+		UPDATE sys_proj_services set consume_time=#{consumeTime} WHERE id=#{id}
 	</update>
+
+	<!-- 设置服务单为已通知 -->
+	<update id="updateNoticeTimes" >
+		UPDATE sys_proj_services set overtime_notice=1
+		where  ID in
+		<foreach collection="list" index="index" item="item" open="("
+				 separator="," close=")">
+			#{item}
+		</foreach>
+	</update>
+
+
 	
 	<update id="update">
 		UPDATE sys_proj_services
@@ -223,14 +246,25 @@
 					CHANGE_ID = #{changeId},
 				</if>
 				<if test="oldShopId != null and oldShopId !='' ">
-					OLD_SHOP_ID = #{oldShopId}
+					OLD_SHOP_ID = #{oldShopId},
 				</if>
 				<if test="consumeTime != null  ">
-					consume_time = #{consumeTime}
+					consume_time = #{consumeTime},
+				</if>
+
+				<if test="reply != null  ">
+					reply = #{reply},
+				</if>
+				<if test="comment != null  ">
+					comment = #{comment},
+				</if>
+				<if test="overtimeNotice != null  ">
+					overtime_notice = #{overtimeNotice},
 				</if>
 		</set>
 		WHERE id=#{id} 
 	</update>
+
 
 	<!-- 批量删除 -->
 	<delete id="deleteByIds" parameterType="java.util.List">
@@ -394,7 +428,21 @@
 		left join sys_beautician_state c on a.id=c.SERVICES_ID
 		where  a.ID=#{id}
 	</select>
-	
+
+	<select id="selectNeedNoticeService" resultMap="SysProjServicesMap">
+	select
+		a.id,
+		a.company_id,
+		b.VIP_Name
+		FROM sys_proj_services a
+		LEFT JOIN sys_vip_info b on b.ID=a.VIP_ID
+		where   a.YY_TIME > now()
+		and DATE_ADD(now(),INTERVAL 1 HOUR) > a.YY_TIME
+		and overtime_notice is null
+	</select>
+
+
+
 	<!-- 根据对象查询-->
 	<select id="selectByModel" resultMap="SysProjServicesMap">
 		select	distinct
@@ -458,4 +506,198 @@
 		</if>
 	</select>
 
+	<resultMap id="ServiceOrderListVoMap" type="com.matrix.system.app.vo.ServiceOrderListVo">
+		<id column="id" property="id" />
+		<result column="serviceNo" property="serviceNo"/>
+		<result property="time" column="time"/>
+		<result property="bed" column="bed" />
+		<result property="vipName" column="vipName" />
+		<result property="vipId" column="vipId" />
+		<result property="timeLength" column="timeLength" />
+		<result property="status" column="status" />
+		<result property="createStaffId" column="createStaffId" />
+		<result property="shopName" column="shop_short_name" />
+		<collection property="projs" ofType="com.matrix.system.app.vo.ServiceOrderListProjVo">
+			<result property="projName" column="projName" />
+			<result property="beautyName" column="beautyName" />
+			<result property="id" column="staffId" />
+		</collection>
+	</resultMap>
+
+
+	<select id="selectApiServiceOrderListInPage" resultMap="ServiceOrderListVoMap">
+		select
+		   a.id id,
+		   a.SERVICE_NO serviceNo,
+		   a.YY_TIME time,
+		   a.TOTAL_TIME timeLength,
+		   a.state status,
+		   a.create_staff_id createStaffId,
+		   d.BED_NAME bed,
+		   e.VIP_NAME vipName,
+		   e.id vipId,
+		   b.staff_id staffId,
+		   f.su_name beautyName,
+		   g.proj_name projName,
+		   h.shop_short_name
+		from sys_proj_services a
+		left join sys_beautician_state b on a.ID=b.SERVICES_ID
+		left join sys_bed_state c on a.ID = c.SERVICE_ID
+		left join sys_bed_info d on c.BED_ID=d.ID
+		left join sys_vip_info e on a.VIP_ID=e.ID
+		left join sys_users f on f.su_id=b.STAFF_ID
+		left join sys_proj_use g on b.puse_id=g.ID
+		left join sys_shop_info h on a.SHOP_ID=h.ID
+		<where>
+			and a.company_id=#{record.companyId}
+			<if test="record.queryKey != null and record.queryKey != ''">
+				and (instr(a.SERVICE_NO, #{record.queryKey}) or instr(e.phone, #{record.queryKey}) or instr(e.vip_name, #{record.queryKey}) )
+			</if>
+			<if test="record.vipId != null and record.vipId != ''">
+				and a.vip_id = #{record.vipId}
+			</if>
+			<if test="record.status != null and record.status != ''">
+				and a.state = #{record.status}
+			 </if>
+			<if test="record.shopId != null">
+				and a.shop_id=#{record.shopId}
+			</if>
+			<if test="record.userId!=null">
+				and (a.create_staff_id=#{record.userId} or b.staff_id=#{record.userId})
+			</if>
+
+		</where>
+		<if test="pageVo !=null"><!-- 判断pageVo对象是否为空 -->
+			order by a.yy_time desc
+			<if test="pageVo.offset >=0  and pageVo.limit >0">
+				limit
+				#{pageVo.offset},#{pageVo.limit}
+			</if>
+		</if>
+	</select>
+
+	<select id="selectApiServiceOrderListTotal" resultType="java.lang.Integer">
+		select count(1)
+		from sys_proj_services a
+		left join sys_beautician_state b on a.ID=b.SERVICES_ID
+		left join sys_bed_state c on a.ID = c.SERVICE_ID
+		left join sys_bed_info d on c.BED_ID=d.ID
+		left join sys_vip_info e on a.VIP_ID=e.ID
+		left join sys_users f on f.su_id=b.STAFF_ID
+		left join sys_proj_use g on b.puse_id=g.ID
+		<where>
+			and a.company_id=#{record.companyId}
+			<if test="record.queryKey != null and record.queryKey != ''">
+				and (instr(a.SERVICE_NO, #{record.queryKey}) or instr(e.phone, #{record.queryKey}) or instr(e.vip_name, #{record.queryKey}) )
+			</if>
+			<if test="record.status != null and record.status != ''">
+				and a.state = #{record.status}
+			</if>
+			<if test="record.shopId != null">
+				and a.shop_id=#{record.shopId}
+			</if>
+			<if test="record.userId!=null">
+				and (a.create_staff_id=#{record.userId} or b.staff_id=#{record.userId})
+			</if>
+		</where>
+	</select>
+
+
+
+
+	<resultMap id="ErpServiceOrderListVoMap" type="com.matrix.system.shopXcx.api.vo.ErpServiceOrderListVo">
+		<id column="id" property="id" />
+		<result column="serviceNo" property="serviceNo"/>
+		<result property="time" column="time"/>
+		<result property="bed" column="bed" />
+		<result property="timeLength" column="timeLength" />
+		<result property="status" column="status" />
+		<result property="shopName" column="shopName" />
+		<result property="shopAddr" column="shopAddr" />
+		<result property="comment" column="comment" />
+		<result property="reply" column="reply" />
+		<collection property="projs" ofType="com.matrix.system.shopXcx.api.vo.ErpServiceOrderListProjVo">
+			<result property="projName" column="projName" />
+			<result property="beautyName" column="beautyName" />
+			<result property="imgMobile" column="imgMobile" />
+		</collection>
+	</resultMap>
+    <select id="findWxServiceOrderList" resultMap="ErpServiceOrderListVoMap">
+		select
+		a.id id,
+		a.SERVICE_NO serviceNo,
+		a.YY_TIME time,
+		a.TOTAL_TIME timeLength,
+		a.state status,
+		d.BED_NAME bed,
+		f.su_name beautyName,
+		g.proj_name projName,
+		h.shop_short_name as shopName,
+		h.shop_addr as shopAddr,
+		m.img as imgMobile
+		from sys_proj_services a
+		left join sys_beautician_state b on a.ID=b.SERVICES_ID
+		left join sys_bed_state c on a.ID = c.SERVICE_ID
+		left join sys_bed_info d on c.BED_ID=d.ID
+		left join sys_vip_info e on a.VIP_ID=e.ID
+		left join sys_users f on f.su_id=b.STAFF_ID
+		left join sys_proj_use g on b.puse_id=g.ID
+		left join sys_shop_info h on a.SHOP_ID=h.ID
+		left join shopping_goods m on g.proj_id=m.id
+		<where>
+			<if test="queryKey != null and queryKey != ''">
+				and instr(a.SERVICE_NO, #{queryKey})
+			</if>
+			<if test="vipId != null and vipId != ''">
+				and a.vip_id = #{vipId}
+			</if>
+			<if test="vipStatus != null and vipStatus != '' and vipStatus!=0 ">
+				<if test="vipStatus == 1">
+					and a.state = '待确认'
+				</if>
+				<if test="vipStatus == 2">
+					and a.state in ( '预约成功待处理' ,'需配料','配料完成','服务中')
+				</if>
+				<if test="vipStatus == 3">
+					and ( a.state in ( '服务完成' ,'服务单结束') and a.comment is  null)
+				</if>
+				<if test="vipStatus == 4">
+					and a.comment is not null
+				</if>
+				<if test="vipStatus == 5">
+					and a.state = '预约取消'
+				</if>
+			</if>
+		</where>
+			order by a.yy_time desc
+			limit #{offset}, #{limit}
+	</select>
+	<select id="findWxServiceOrderById" resultMap="ErpServiceOrderListVoMap">
+		select
+		a.id id,
+		a.SERVICE_NO serviceNo,
+		a.YY_TIME time,
+		a.TOTAL_TIME timeLength,
+		a.state status,
+		a.comment,
+		a.reply,
+		d.BED_NAME bed,
+		f.su_name beautyName,
+		g.proj_name projName,
+		h.shop_short_name as shopName,
+		h.shop_addr as shopAddr,
+		m.img as imgMobile
+		from sys_proj_services a
+		left join sys_beautician_state b on a.ID=b.SERVICES_ID
+		left join sys_bed_state c on a.ID = c.SERVICE_ID
+		left join sys_bed_info d on c.BED_ID=d.ID
+		left join sys_vip_info e on a.VIP_ID=e.ID
+		left join sys_users f on f.su_id=b.STAFF_ID
+		left join sys_proj_use g on b.puse_id=g.ID
+		left join sys_shop_info h on a.SHOP_ID=h.ID
+		left join shopping_goods m on g.proj_id=m.id
+		where a.id=#{id}
+	</select>
+
+
 </mapper>
diff --git a/zq-erp/src/main/resources/mybatis/mapper/hive/SysProjUseDao.xml b/zq-erp/src/main/resources/mybatis/mapper/hive/SysProjUseDao.xml
index 0eb7a4e..3ba6f8c 100644
--- a/zq-erp/src/main/resources/mybatis/mapper/hive/SysProjUseDao.xml
+++ b/zq-erp/src/main/resources/mybatis/mapper/hive/SysProjUseDao.xml
@@ -5,7 +5,12 @@
 <mapper namespace="com.matrix.system.hive.dao.SysProjUseDao">
 
     <resultMap type="SysProjUse" id="SysProjUseMap">
+
         <id property="id" column="ID"/>
+        <result property="createBy" column="create_by" />
+        <result property="createTime" column="create_time" />
+        <result property="updateBy" column="update_by" />
+        <result property="updateTime" column="update_time" />
         <result property="orderItemId" column="ORDER_ITEM_ID"/>
         <result property="projId" column="PROJ_ID"/>
         <result property="surplusCount" column="SURPLUS_COUNT"/>
@@ -25,17 +30,117 @@
         <result property="projName" column="proj_name"/>
         <result property="deductionNum" column="deductionNum"/>
         <result property="isCourse" column="is_course"/>
-
-
-
-
+        <result property="timeLength" column="time_length"/>
+        <result property="orderId" column="orderId"/>
         <!-- 对应项目信息-->
         <association property="projInfo" javaType="ShoppingGoods"
                      resultMap="com.matrix.system.hive.dao.ShoppingGoodsDao.ShoppingGoodsMap"/>
 
     </resultMap>
 
+    <!-- 余次使用记录map -->
+    <resultMap type="com.matrix.system.hive.bean.SysProjUseFlow" id="SysProjUseFlowMap">
+        <id property="id" column="id"/>
+        <result property="createBy" column="create_by" />
+        <result property="createTime" column="create_time" />
+        <result property="updateBy" column="update_by" />
+        <result property="updateTime" column="update_time" />
+        <result property="projUseId" column="proj_use_id"/>
+        <result property="surplusCount" column="surplus_count"/>
+        <result property="isOver" column="is_over"/>
+        <result property="failTime" column="fail_time"/>
+        <result property="price" column="price"/>
+        <result property="status" column="status"/>
+        <result property="balance" column="balance"/>
+        <result property="remark" column="remark"/>
+        <result property="projName" column="proj_name"/>
+        <result property="optionType" column="option_type"/>
+    </resultMap>
 
+    <!-- 插入流水 -->
+    <insert id="insertFlow" parameterType="SysProjUse" useGeneratedKeys="true"
+            keyProperty="id">
+        INSERT INTO sys_proj_use_flow (
+        create_by,
+		create_time,
+		update_by,
+		update_time,
+		id,
+		proj_use_id,
+		surplus_count,
+		is_over,
+		fail_time,
+		price,
+		status,
+		balance,
+		remark,
+		proj_name,
+		option_type
+		)
+		VALUES (
+		#{createBy},
+		now(),
+		#{updateBy},
+		now(),
+		#{id},
+		#{projUseId},
+		#{surplusCount},
+		#{isOver},
+		#{failTime},
+		#{price},
+		#{status},
+		#{balance},
+		#{remark},
+		#{projName},
+		#{optionType}
+		)
+    </insert>
+
+    <!-- 查询流水 -->
+    <select id="selectProjUseFlow" resultMap="SysProjUseFlowMap">
+        select * from sys_proj_use_flow
+        <where>
+                and proj_use_id=#{record.projUseId}
+            <if test="record.createBy !=null and record.createBy!='' ">
+                and instr(createBy,#{record.createBy})
+            </if>
+            <if test="record.beginTime !=null and record.beginTime!=''">
+                and create_time >= #{record.beginTime}
+            </if>
+            <if test="record.endTime !=null and record.endTime!=''">
+                <![CDATA[ and create_time <=  #{record.endTime} ]]>
+            </if>
+
+        </where>
+        <if test="pageVo !=null"><!-- 判断pageVo对象是否为空 -->
+            <if test="pageVo.sort !=null  and pageVo.order !=null">
+                order by
+                ${pageVo.sort} ${pageVo.order}
+            </if>
+            <if test="pageVo.offset >=0  and pageVo.limit >0">
+                limit
+                #{pageVo.offset},#{pageVo.limit}
+            </if>
+        </if>
+
+    </select>
+
+    <select id="selectProjUseFlowTotal" resultType="java.lang.Integer">
+        select count(*) from sys_proj_use_flow
+        <where>
+            and proj_use_id=#{record.projUseId}
+            <if test="record.createBy !=null and record.createBy!='' ">
+                and instr(createBy,#{record.createBy})
+            </if>
+            <if test="record.beginTime !=null and record.beginTime!=''">
+                and create_time >= #{record.beginTime}
+            </if>
+            <if test="record.endTime !=null and record.endTime!=''">
+                <![CDATA[ and create_time <=  #{record.endTime} ]]>
+            </if>
+
+        </where>
+    </select>
 
     <!-- 插入方法 -->
     <insert id="insert" parameterType="SysProjUse" useGeneratedKeys="true"
@@ -227,13 +332,21 @@
     <select id="selectInPage" resultMap="SysProjUseMap">
         select
         a.*,
-        b.TIME_LENGTH
+        d.id as orderId,
+        b.TIME_LENGTH,
+        b.img,
+        b.code
         from sys_proj_use a
         left join shopping_goods b on a.proj_id=b.id
+        left join sys_order_item c on a.ORDER_ITEM_ID=c.id
+        left join sys_order d on c.ORDER_ID=d.id
         where 1=1
         <if test="record!=null">
             <if test="record.id != null and record.id !='' ">
                 and a.ID = #{record.id}
+            </if>
+            <if test="record.queryKey != null and record.queryKey !='' ">
+                and (instr(b.name, #{record.queryKey}) or instr(b.zjm, #{record.queryKey}) or instr(goods_no, #{record.queryKey}))
             </if>
             <if test="record.orderItemId != null and record.orderItemId !='' ">
                 and a.ORDER_ITEM_ID = #{record.orderItemId}
@@ -266,7 +379,9 @@
             <if test="record.failTime != null  ">
                 and a.FAIL_TIME = #{record.failTime}
             </if>
-
+            <if test="record.targetFailTime != null  ">
+                and date_format(#{record.targetFailTime}, '%Y-%m-%d') > date_format(a.FAIL_TIME, '%Y-%m-%d')
+            </if>
             <if test="record.price != null and record.price !='' ">
                 and a.PRICE = #{record.price}
             </if>
@@ -330,80 +445,94 @@
     <!-- 查询总条数 -->
     <select id="selectTotalRecord" resultType="java.lang.Integer">
         select count(*)
-        from sys_proj_use
+        from sys_proj_use a
+        left join shopping_goods b on a.proj_id=b.id
+        left join sys_order_item c on a.ORDER_ITEM_ID=c.id
+        left join sys_order d on c.ORDER_ID=d.id
         where 1=1
         <if test="record!=null">
             <if test="record.id != null and record.id !='' ">
-                and ID = #{record.id}
+                and a.ID = #{record.id}
+            </if>
+            <if test="record.queryKey != null and record.queryKey !='' ">
+                and (instr(b.name, #{record.queryKey}) or instr(b.zjm, #{record.queryKey}) or instr(goods_no, #{record.queryKey}))
             </if>
             <if test="record.orderItemId != null and record.orderItemId !='' ">
-                and ORDER_ITEM_ID = #{record.orderItemId}
+                and a.ORDER_ITEM_ID = #{record.orderItemId}
             </if>
             <if test="record.projId != null and record.projId !='' ">
-                and PROJ_ID = #{record.projId}
+                and a.PROJ_ID = #{record.projId}
             </if>
             <if test="record.surplusCount != null and record.surplusCount !='' ">
-                and SURPLUS_COUNT = #{record.surplusCount}
+                and a.SURPLUS_COUNT = #{record.surplusCount}
             </if>
             <if test="record.isOver != null and record.isOver !='' ">
-                and IS_OVER = #{record.isOver}
+                and a.IS_OVER = #{record.isOver}
             </if>
             <!-- 查询具体某一个套餐的使用情况 -->
             <if
                     test="record.taocanId != null and record.taocanId !=-1 and record.taocanId !=-2">
-                and TAOCAN_ID = #{record.taocanId}
+                and a.TAOCAN_ID = #{record.taocanId}
             </if>
             <!-- 查询所有的项目使用情况 -->
             <if test="record.taocanId != null and record.taocanId ==-1 ">
-                and TAOCAN_ID IS NULL
+                and a.TAOCAN_ID IS NULL
             </if>
             <!-- 查询所有的套餐使用情况 -->
             <if test="record.taocanId != null and record.taocanId ==-2 ">
-                and TAOCAN_ID IS NOT NULL
+                and a.TAOCAN_ID IS NOT NULL
             </if>
             <if test="record.vipId != null and record.vipId !='' ">
-                and VIP_ID = #{record.vipId}
+                and a.VIP_ID = #{record.vipId}
+            </if>
+            <if test="record.failTime != null  ">
+                and a.FAIL_TIME = #{record.failTime}
+            </if>
+            <if test="record.targetFailTime != null  ">
+                and date_format(#{record.targetFailTime}, '%Y-%m-%d') > date_format(a.FAIL_TIME, '%Y-%m-%d')
             </if>
             <if test="record.price != null and record.price !='' ">
-                and PRICE = #{record.price}
+                and a.PRICE = #{record.price}
             </if>
             <if test="record.assembleId != null and record.assembleId !='' ">
-                and ASSEMBLE_ID = #{record.assembleId}
+                and a.ASSEMBLE_ID = #{record.assembleId}
             </if>
             <if test="record.source != null and record.source !='' ">
-                and SOURCE like concat('%',#{record.source},'%')
+                and a.SOURCE like concat('%',#{record.source},'%')
             </if>
             <if test="record.status != null and record.status !='' ">
-                and STATUS = #{record.status}
+                and a.STATUS = #{record.status}
             </if>
             <if test="record.platformFlag != null and record.platformFlag !='' ">
-                and PLATFORM_FLAG = #{record.platformFlag}
-            </if>
-            <if test="record.projName != null and record.projName !='' ">
-                and PROJ_NAME like concat('%',#{record.projName},'%')
+                and a.PLATFORM_FLAG = #{record.platformFlag}
             </if>
             <if test="record.type != null and record.type !='' ">
-                and type = #{record.type}
+                and a.type = #{record.type}
+            </if>
+            <if test="record.projName != null and record.projName !='' ">
+                and a.PROJ_NAME like concat('%',#{record.projName},'%')
             </if>
             <if test="record.balance != null and record.balance !='' ">
-                and balance = #{record.balance}
+                and a.balance = #{record.balance}
             </if>
             <if test="record.remark != null and record.remark !='' ">
-                and remark = #{record.remark}
+                and a.remark = #{record.remark}
             </if>
-
             <if test="record.isCourse != null and record.isCourse !='' ">
-                and   is_course = #{record.isCourse},
+                and  a.is_course = #{record.isCourse},
             </if>
         </if>
     </select>
 
     <!-- 根据id查询 -->
     <select id="selectById" resultMap="SysProjUseMap">
-		select  *
-		from sys_proj_use
+		select a.*,
+        b.TIME_LENGTH,
+        b.img
+        from sys_proj_use a
+        left join shopping_goods b on a.proj_id=b.id
 		where
-		id=#{id}
+		a.id=#{id}
 	</select>
 
     <!-- 根据id查询 -->
@@ -422,8 +551,11 @@
     <!-- 根据对象查询 -->
     <select id="selectByModel" resultMap="SysProjUseMap">
         select
-        a.*
+        a.*,
+        b.time_length,
+        b.img
         from sys_proj_use a
+        left join shopping_goods b on a.proj_id=b.id
         where 1=1
         <if test="record!=null">
             <if test="record.id != null and record.id !='' ">
@@ -626,7 +758,7 @@
               and  a.proj_name like concat('%',#{projName},'%')
             </if>
             <if test="cateId != null and cateId != ''  ">
-                and  b.PROJ_TYPE_ID=#{cateId}
+                and  b.cate_id=#{cateId}
             </if>
         </where>
 
@@ -727,4 +859,5 @@
         where date_format(now(), '%Y-%m-%d') > date_format(FAIL_TIME, '%Y-%m-%d') and STATUS='有效'
     </select>
 
+
 </mapper>
\ No newline at end of file
diff --git a/zq-erp/src/main/resources/mybatis/mapper/hive/SysSkinCheckRecordDao.xml b/zq-erp/src/main/resources/mybatis/mapper/hive/SysSkinCheckRecordDao.xml
index 73519e7..cf75379 100644
--- a/zq-erp/src/main/resources/mybatis/mapper/hive/SysSkinCheckRecordDao.xml
+++ b/zq-erp/src/main/resources/mybatis/mapper/hive/SysSkinCheckRecordDao.xml
@@ -18,11 +18,13 @@
 		<result property="shopName" column="shopName" />
 		<result property="telphone" column="telphone" />
 		<result property="checkUserName" column="checkUserName" />
+		<result property="userName" column="userName" />
 			<result property="ext1" column="ext1" />
 			<result property="ext2" column="ext2" />
 			<result property="ext3" column="ext3" />
 			<result property="ext4" column="ext4" />
-			<result property="ext5" column="ext5" />
+		<result property="ext5" column="ext5" />
+		<result property="sex" column="sex" />
 		<collection property="skinDetails" ofType="com.matrix.system.hive.bean.SysSkinDetail" column="id">
 			<id property="id" column="detailId" />
 			<result property="checkId" column="check_id" />
@@ -356,10 +358,13 @@
 			t3.symptom analysisSymptom,
 			t3.percentage analysisPercentage,
 			t3.analysis analysisAnalysis,
-			t3.img analysisImg
+			t3.img analysisImg,
+		    t4.vip_name userName,
+		    t4.sex sex
 		from sys_skin_check_record t1
 		left join sys_skin_detail t2 on t1.id=t2.check_id and t2.t1=1
 		left join sys_skin_detail t3 on t1.id=t3.check_id and t3.t1=2
+		left join sys_vip_info t4 on t1.user_id=t4.id
 		where  t1.id=#{id}
 	</select>	
 	
diff --git a/zq-erp/src/main/resources/mybatis/mapper/hive/SysStoreInfoDao.xml b/zq-erp/src/main/resources/mybatis/mapper/hive/SysStoreInfoDao.xml
index 8a8975c..7c421b5 100644
--- a/zq-erp/src/main/resources/mybatis/mapper/hive/SysStoreInfoDao.xml
+++ b/zq-erp/src/main/resources/mybatis/mapper/hive/SysStoreInfoDao.xml
@@ -388,6 +388,7 @@
 		c.volume as gs_volume,
 		c.price as gs_price,
 		c.wholesale as gs_wholesale,
+		c.img as gs_img,
 		a.shop_id,
 		a.company_id
 		from
@@ -404,6 +405,10 @@
 			</if>
 			<if test="record.batch != null and record.batch !='' ">
 				and batch = #{record.batch}
+			</if>
+
+			<if test="record.queryKey != null and record.queryKey !='' ">
+				and (instr(c.name,#{record.queryKey}) or instr(c.goods_no, #{record.queryKey}) or instr(c.zjm, #{record.queryKey}))
 			</if>
 			<if test="record.storeId != null and record.storeId !='' ">
 				and STORE_ID = #{record.storeId}
@@ -478,6 +483,9 @@
 			<if test="record.batch != null and record.batch !='' ">
 				and batch = #{record.batch}
 			</if>
+			<if test="record.queryKey != null and record.queryKey !='' ">
+				and (instr(c.name,#{record.queryKey}) or instr(c.goods_no, #{record.queryKey}) or instr(c.zjm, #{record.queryKey}))
+			</if>
 			<if test="record.storeId != null and record.storeId !='' ">
 				and STORE_ID = #{record.storeId}
 			</if>
diff --git a/zq-erp/src/main/resources/mybatis/mapper/hive/SysVipAlbumDao.xml b/zq-erp/src/main/resources/mybatis/mapper/hive/SysVipAlbumDao.xml
new file mode 100644
index 0000000..c82a8c6
--- /dev/null
+++ b/zq-erp/src/main/resources/mybatis/mapper/hive/SysVipAlbumDao.xml
@@ -0,0 +1,241 @@
+<?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.matrix.system.hive.dao.SysVipAlbumDao">
+	<!-- 定义SysVipAlbum 的复杂关联map -->
+	<resultMap type="com.matrix.system.hive.bean.SysVipAlbum" id="SysVipAlbumMap">
+		<id property="id" column="id" />
+		<result property="createBy" column="create_by" />
+		<result property="createTime" column="create_time" />
+		<result property="updateBy" column="update_by" />
+		<result property="updateTime" column="update_time" />
+			<result property="vipId" column="vip_id" />
+			<result property="img" column="img" />
+			<result property="source" column="source" />
+			<result property="sourceId" column="source_id" />
+	</resultMap>
+	
+	
+	<!-- 定义SysVipAlbum 的简单map  ,本map不添加其他的关联属性 -->
+	<resultMap type="com.matrix.system.hive.bean.SysVipAlbum" id="SysVipAlbumSimpleMap">
+		<id property="id" column="id" />
+		<result property="createBy" column="create_by" />
+		<result property="createTime" column="create_time" />
+		<result property="updateBy" column="update_by" />
+		<result property="updateTime" column="update_time" />
+			<result property="vipId" column="vip_id" />
+			<result property="img" column="img" />
+			<result property="source" column="source" />
+			<result property="sourceId" column="source_id" />
+	</resultMap>
+	
+	<!-- 字段sql -->
+	<sql id="columns">
+		create_by,
+		create_time,
+		update_by,
+		update_time,
+			id,
+			vip_id,
+			img,
+			source,
+			source_id
+	</sql>
+	
+	<!-- 属性sql -->
+	<sql id="propertys">
+		#{item.createBy},
+		now(),
+		#{item.updateBy},
+		now(),
+			#{item.id},
+			#{item.vipId},
+			#{item.img},
+			#{item.source},
+			#{item.sourceId}
+	</sql>
+	
+	<!-- where sql -->
+	<sql id="where_sql">
+		 
+		 <if test="record!=null">
+			<if test="(record.id!=null and record.id!='') or  (record.id!='' and record.id==0)  ">
+				and id  = #{record.id} 
+			</if>
+			<if test="(record.vipId!=null and record.vipId!='') or  (record.vipId!='' and record.vipId==0)  ">
+				and vip_id  = #{record.vipId} 
+			</if>
+			<if test="(record.img!=null and record.img!='') or  (record.img!='' and record.img==0)  ">
+				and img  = #{record.img} 
+			</if>
+			<if test="(record.source!=null and record.source!='') or  (record.source!='' and record.source==0)  ">
+				and source  = #{record.source} 
+			</if>
+			<if test="(record.sourceId!=null and record.sourceId!='') or  (record.sourceId!='' and record.sourceId==0)  ">
+				and source_id  = #{record.sourceId} 
+			</if>
+		</if>
+		 
+	</sql>
+	
+	<!--  插入方法   -->
+	<insert id="insert" parameterType="com.matrix.system.hive.bean.SysVipAlbum"
+		useGeneratedKeys="true" keyProperty="item.id">
+		INSERT INTO sys_vip_album (
+			 <include refid="columns"></include>
+		)
+	VALUES (
+		 <include refid="propertys"></include>
+	)
+	</insert>
+	
+	
+	
+	<!--  批量插入   -->
+	<insert id="batchInsert" parameterType="java.util.List">
+		INSERT INTO sys_vip_album (
+		<include refid="columns"></include>	
+		)
+	VALUES 
+	<foreach collection="list" item="item" index="index" separator=",">(
+		<include refid="propertys"></include>	
+	)</foreach>
+	</insert>
+	
+	
+	
+	
+	
+	<!--  根据Map更新 部分更新   -->
+	<update id="updateByMap" parameterType="java.util.HashMap" >
+		UPDATE sys_vip_album
+		<set>
+			<if test="_parameter.containsKey('vipId')">
+					vip_id = #{vipId},
+				</if>		
+			<if test="_parameter.containsKey('img')">
+					img = #{img},
+				</if>		
+			<if test="_parameter.containsKey('source')">
+					source = #{source},
+				</if>		
+			<if test="_parameter.containsKey('sourceId')">
+					source_id = #{sourceId},
+				</if>		
+		</set>
+		WHERE id=#{id} 
+	</update> 
+	
+	
+	<!--  根据对象更新 部分更新   -->
+	<update id="updateByModel" parameterType="Integer">
+		UPDATE sys_vip_album
+		<set>
+			<if test="record.vipId != null ">
+				vip_id  = #{record.vipId}, 
+			</if>
+			<if test="record.img != null and record.img != '' ">
+				img  = #{record.img}, 
+			</if>
+			<if test="record.source != null ">
+				source  = #{record.source}, 
+			</if>
+			<if test="record.sourceId != null ">
+				source_id  = #{record.sourceId}, 
+			</if>
+		</set>
+		WHERE id=#{record.id} 
+	</update>
+	
+	<!-- 批量删除 -->
+	<delete id="deleteByIds" parameterType="java.util.List">
+		delete from sys_vip_album where  id in
+		<foreach collection="list" index="index" item="item" open="("
+			separator="," close=")">
+			#{item}
+		</foreach>
+	</delete>
+		
+	<!-- 根据id删除-->
+	<delete id="deleteById" parameterType="Integer">
+		DELETE FROM sys_vip_album
+		where  id=#{id} 
+	</delete>
+	
+	<!-- 根据对象删除-->
+	<delete id="deleteByModel" parameterType="com.matrix.system.hive.bean.SysVipAlbum">
+		DELETE FROM sys_vip_album
+		<where>
+		<include refid="where_sql" ></include>
+		</where>
+	</delete>
+
+
+	<select id="selectBySourceId" resultMap="SysVipAlbumMap">
+		select
+		<include refid="columns" ></include>
+		from sys_vip_album
+		where source_id=#{sourceId}
+	</select>
+	
+	<!-- 分页查询 -->
+	<select id="selectInPage" resultMap="SysVipAlbumMap">
+
+		select
+		<include refid="columns" ></include>
+		from sys_vip_album
+		<where>
+		  <include refid="where_sql"></include>
+		 </where>
+		<if test="pageVo !=null"><!-- 判断pageVo对象是否为空 -->
+			<if test="pageVo.sort !=null  and pageVo.order !=null">
+				order by
+				${pageVo.sort} ${pageVo.order}
+			</if>
+			<if test="pageVo.offset >=0  and pageVo.limit >0">
+				limit
+				#{pageVo.offset},#{pageVo.limit}
+			</if>
+		</if>
+	</select>
+	
+	<!-- 查询总条数 -->
+	<select id="selectTotalRecord" parameterType="long"   resultType="java.lang.Integer">
+	select count(*)
+	from sys_vip_album
+		<where>
+		   <include refid="where_sql"></include>
+		</where>
+	</select>
+
+	<!-- 根据id查询-->
+	<select id="selectById" resultMap="SysVipAlbumMap">
+		select 
+		<include refid="columns" ></include>
+		from sys_vip_album
+		where  id=#{id} 
+	</select>	
+	
+	
+	<!-- 根据id 锁表查询-->
+	<select id="selectForUpdate" resultMap="SysVipAlbumMap">
+		select 
+		<include refid="columns" ></include>
+		from sys_vip_album
+		where  id=#{id} 
+		for update
+	</select>	
+	
+	
+	
+	<!-- 根据对象查询-->
+	<select id="selectByModel" resultMap="SysVipAlbumMap">
+		select 
+		<include refid="columns" ></include>
+		from sys_vip_album
+		<where>
+		  <include refid="where_sql"></include>
+		 </where>
+	</select>
+</mapper>
\ No newline at end of file
diff --git a/zq-erp/src/main/resources/mybatis/mapper/hive/SysVipInfoDao.xml b/zq-erp/src/main/resources/mybatis/mapper/hive/SysVipInfoDao.xml
index da5030c..5203a47 100644
--- a/zq-erp/src/main/resources/mybatis/mapper/hive/SysVipInfoDao.xml
+++ b/zq-erp/src/main/resources/mybatis/mapper/hive/SysVipInfoDao.xml
@@ -35,6 +35,10 @@
         <result property="disease" column="disease"/>
         <result property="zjm" column="zjm"/>
         <result property="companyId" column="company_id"/>
+        <result property="province" column="province"/>
+        <result property="city" column="city"/>
+        <result property="area" column="area"/>
+        <result property="recommendId" column="recommend_id"/>
 
         <result property="statu" column="statu"/>
         <result property="birthdayType" column="birthdayType"/>
@@ -104,6 +108,10 @@
         <!-- 扩展属性 -->
         <result property="staffName" column="STAFF_NAME"/>
         <result property="shopName" column="SHOP_NAME"/>
+        <association property="vipLevel" javaType="com.matrix.system.hive.bean.SysVipLevel" >
+            <result property="levelName" column="levelName"/>
+            <result property="vipLevel" column="vipLevel"/>
+        </association>
     </resultMap>
 
     <!-- 查询几天内过生日的会员 -->
@@ -274,7 +282,11 @@
         disease,
         is_deal,
         zjm,
-        company_id
+        company_id,
+        province,
+        city,
+        area,
+        recommend_id
         )
 
 
@@ -318,7 +330,11 @@
         #{disease},
         #{isDeal},
         #{zjm},
-        #{companyId}
+        #{companyId},
+        #{province},
+        #{city},
+        #{area},
+        #{recommendId}
         )
 
     </insert>
@@ -445,6 +461,18 @@
             <if test="isDeal != null  ">
                 is_deal = #{isDeal},
             </if>
+            <if test="recommendId != null  ">
+                recommend_id = #{recommendId},
+            </if>
+            <if test="province != null and province !=''  ">
+                province = #{province},
+            </if>
+            <if test="city != null and city !=''  ">
+                city = #{city},
+            </if>
+            <if test="area != null and area !=''  ">
+                area = #{area},
+            </if>
 
 
         </set>
@@ -509,6 +537,8 @@
         <include refid="from"></include>
         where a.ID=#{id}
     </select>
+
+
 
     <!-- 根据手机和密码查询 -->
     <select id="selectVipByPhonePassWord" resultMap="SysVipInfoMap">
@@ -612,14 +642,11 @@
 		COMMISSION_ALL,IN_DATE,STAFF_ID,SHOP_ID,IS_DELETE,REMARK,PASSWORD,
 		EMAIL,CREATE_TIME,UUID,BALANCE,blood,sfCard,link,marry,vocation 
 	     from sys_vip_info 
-	     where
-	     SHOP_ID=#{shopId}
-	    and  (
-	    instr(PHONE,#{keyWord})
+	     where company_id=#{companyId}
+	   and (instr(PHONE,#{keyWord})
 	      or instr(VIP_NAME ,#{keyWord})
 	      or instr(zjm ,#{keyWord})
-	        or instr(VIP_NO ,#{keyWord})
-	    )
+	        or instr(VIP_NO ,#{keyWord}))
 	      limit 0,15
 	</select>
 
@@ -644,7 +671,7 @@
         and
         (a.VIP_NO =#{key} or
         a.VIP_NAME =#{key} or
-        a.PHONE =#{key}) and a.shop_id=#{shopId}
+        a.PHONE =#{key})
     </select>
 
     <select id="getLevelIdByMoney" resultMap="SysVipInfoMap">
@@ -937,12 +964,19 @@
 		a.create_distribution_time,
 		a.birthdayType,
 		a.disease,
-		a.is_deal
+		a.is_deal,
+		a.province,
+		a.city,
+		a.area,
+		a.recommend_id,
+		e.level_name levelName,
+		e.vip_level vipLevel
 	</sql>
     <sql id="from">
 		from sys_vip_info a
 		left join sys_users c on c.su_id =a.STAFF_ID
 		left join sys_shop_info d ON d.ID=a.SHOP_ID
+		left join sys_vip_level e on a.level_id=e.id
 	   
 	</sql>
 
@@ -1219,5 +1253,118 @@
     <select id="selectVipInfoByVipNo" resultMap="SysVipInfoMapSimple">
         select * from sys_vip_info where company_id=#{companyId} and vip_no=#{vipNo}
     </select>
+
+    <select id="selectVipAddressBookByList" resultType="com.matrix.system.app.vo.VipInfoListVo">
+        select
+               a.ID id,
+               a.VIP_NAME vipName,
+               a.PHONE phone,
+               a.photo photo,
+               b.arriveCnt arriveCnt,
+               g.shop_short_name shopName,
+               z.level_name vipLevel
+        from sys_vip_info a
+        left join (
+            select x.vip_id, count(1) arriveCnt from (
+                                                 select vip_id, date_format(datatime, '%Y-%m-%d')
+                                                 from achieve_new
+                                                 where 1=1
+                                                 <!-- 本月到店次数 -->
+                                                 <if test="record.sort == 'monthArrived'">
+                                                     and date_format(curdate(), '%Y-%m') = date_format(datatime, '%Y-%m')
+                                                 </if>
+                                                 <!-- 本年到店次数 -->
+                                                 <if test="record.sort == 'yearArrived'">
+                                                     and date_format(curdate(), '%Y') = date_format(datatime, '%Y')
+                                                 </if>
+                                                 group by date_format(datatime, '%Y-%m-%d'), vip_id
+                                             ) x group by x.vip_id
+            ) b on a.ID=b.vip_id
+        left join sys_vip_level z on a.level_id=z.id
+        <!-- 本月消费 -->
+        <if test="record.sort == 'used'">
+            left join (
+            select y.vip_id, sum(IFNULL(card_cash, 0) + IFNULL(proj_cash,0) + IFNULL(goods_cash, 0)) used from achieve_new y where date_format(datatime,'%Y-%m') = date_format(curdate(), '%Y-%m') group by y.vip_id
+            ) c on a.id=c.vip_id
+        </if>
+        <!-- 本月消耗 -->
+        <if test="record.sort == 'consume'">
+        left join (
+            select z.vip_id, SUM(IFNULL(free_consume, 0) + IFNULL(his_consume, 0) + IFNULL(consume, 0)) consume from achieve_new z where date_format(datatime,'%Y-%m') = date_format(curdate(), '%Y-%m') group by z.vip_id
+            ) d on a.ID = d.vip_id
+        </if>
+        <!-- 上次到店时间 -->
+        <if test="record.sort == 'arriveTime'">
+        left join (
+            select m.vip_id, MAX(datatime) arriveTime from achieve_new m group by m.vip_id
+            ) e on a.ID=e.vip_id
+        </if>
+        <!-- 会员级别排序 -->
+        <if test="record.sort == 'vipLevel'">
+        left join (
+            select n.VIP_LEVEL vipLevel, n.ID from sys_vip_level n
+            ) f on a.LEVEL_ID = f.ID
+        </if>
+        left join sys_shop_info g on a.shop_id = g.id
+        left join sys_vip_level h on a.level_id=h.id
+        where 1=1
+        <if test="record.queryKey != null and record.queryKey != ''">
+            and (instr(PHONE,#{record.queryKey})
+                or instr(VIP_NAME ,#{record.queryKey})
+                or instr(zjm ,#{record.queryKey})
+                or instr(VIP_NO ,#{record.queryKey}))
+        </if>
+        <if test="record.shopId != null">
+            and a.shop_id=#{record.shopId}
+        </if>
+        <if test="record.companyId != null">
+            and a.company_id=#{record.companyId}
+        </if>
+        <if test='record.birthType=="1"'>
+            and a.BIRTHDAY1 between curdate() and DATE_ADD(CURDATE(), INTERVAL 3 DAY)
+        </if>
+        <if test='record.birthType=="2"'>
+            and date_format(a.BIRTHDAY1, '%Y-%m') = date_format(CURDATE(), '%Y-%m')
+        </if>
+        <if test='record.birthType=="3"'>
+            and PERIOD_DIFF(date_format(now() ,'%Y-%m') , date_format(a.BIRTHDAY1, '%Y-%m')) =1
+        </if>
+        <if test="record.vipType != null">
+            and a.level_id=#{record.vipType}
+        </if>
+        <if test="record.other != null and record.other!=''">
+            and a.is_deal=#{record.other}
+        </if>
+
+        <if test="record.sort == 'monthArrived' or record.sort == 'yearArrived'">
+            order by arriveCnt ${record.order}
+        </if>
+        <if test="record.sort != 'monthArrived' and record.sort != 'yearArrived'">
+            order by ${record.sort} ${record.order}
+        </if>
+        <if test="record.offset >=0  and record.limit >0">
+            limit #{record.offset},#{record.limit}
+        </if>
+    </select>
+
+    <select id="selectVipInfoById" resultType="com.matrix.system.app.vo.VipInfoVo">
+        select
+               a.ID id,
+               a.photo photo,
+               a.PHONE phone,
+               a.VIP_NAME vipName,
+               a.VIP_NO vipNo,
+               c.LEVEL_NAME vipLevel,
+               a.POINT_ALL integral,
+               e.shop_short_name shopName,
+               sum(IFNULL(b.gift_money, 0) + IFNULL(b.real_money, 0)) totalBalance,
+               sum(IFNULL(b.gift_money, 0)) giftBalance,
+               (select sum(IFNULL(d.goods_cash, 0) + IFNULL(d.proj_cash, 0) + IFNULL(d.card_cash, 0)) from achieve_new d where d.vip_id=a.id) totalShopping
+        from sys_vip_info a
+        left join money_card_use b on a.ID = b.vip_id and b.status='有效'
+        left join sys_vip_level c on  a.LEVEL_ID = c.ID
+        left join sys_shop_info e on a.SHOP_ID=e.ID
+        where a.ID=#{id}
+    </select>
 </mapper>
 	
diff --git a/zq-erp/src/main/resources/mybatis/mapper/hive/SysVipLabelDao.xml b/zq-erp/src/main/resources/mybatis/mapper/hive/SysVipLabelDao.xml
index aa566df..cae0a7a 100644
--- a/zq-erp/src/main/resources/mybatis/mapper/hive/SysVipLabelDao.xml
+++ b/zq-erp/src/main/resources/mybatis/mapper/hive/SysVipLabelDao.xml
@@ -9,39 +9,180 @@
             create_time,
             create_by,
             id,
-            vip_id,
-            label
+            label,
+            shop_id,
+            company_id,
+            is_all,
+            user_id,
+            color
         ) values (
-            #{createTime},
+            now(),
             #{createBy},
             #{id},
-            #{vipId},
-            #{label}
+            #{label},
+            #{shopId},
+            #{companyId},
+            #{isAll},
+            #{userId},
+            #{color}
         )
     </insert>
+
+    <insert id="insertRelate" parameterType="com.matrix.system.hive.bean.SysVipLabel" useGeneratedKeys="true"
+            keyProperty="id">
+        insert sys_vip_label_relate (
+            id,
+            label_id,
+            vip_id
+        ) values (
+            #{id},
+            #{labelId},
+            #{vipId}
+        )
+    </insert>
+
+    <select id="selectInPage" resultType="com.matrix.system.hive.bean.SysVipLabel">
+        select
+            a.create_time createTime,
+            a.create_by createBy,
+            a.id,
+            a.label,
+            a.shop_id shopId,
+            a.company_id companyId,
+            a.is_all isAll,
+            a.user_id userId,
+            a.color,
+            b.shop_short_name shopName
+        from sys_vip_label a
+        left join sys_shop_info b on a.shop_id=b.id
+        where 1=1
+        <if test="record!=null">
+            <if test="record.label!=null  and record.label!=''">
+                and a.label like CONCAT('%', CONCAT(#{record.label},'%'))
+            </if>
+            <if test="record.isAll!=null  and record.isAll!=0">
+                and a.is_all=#{record.isAll}
+            </if>
+            <if test="record.userId!=null  and record.userId!=''">
+                and a.user_id=#{record.userId}
+            </if>
+            <if test="record.companyId!=null  and record.companyId!=''">
+                and a.company_id=#{record.companyId}
+            </if>
+        </if>
+        <if test="pageVo !=null"><!-- 判断pageVo对象是否为空 -->
+            <if test="pageVo.sort !=null  and pageVo.order !=null">
+                order by
+                ${pageVo.sort} ${pageVo.order}
+            </if>
+            <if test="pageVo.offset >=0  and pageVo.limit >0">
+                limit
+                #{pageVo.offset},#{pageVo.limit}
+            </if>
+        </if>
+    </select>
+
+    <select id="selectTotal" resultType="java.lang.Integer">
+        select
+            count(1)
+        from sys_vip_label
+        where 1=1
+        <if test="record!=null">
+            <if test="record.label!=null  and record.label!=''">
+                and label like CONCAT('%', CONCAT(#{record.label},'%'))
+            </if>
+            <if test="record.isAll!=null  and record.isAll!=0">
+                and is_all=#{record.isAll}
+            </if>
+            <if test="record.userId!=null  and record.userId!=''">
+                and user_id=#{record.userId}
+            </if>
+            <if test="record.companyId!=null  and record.companyId!=''">
+                and company_id=#{record.companyId}
+            </if>
+        </if>
+    </select>
+
+    <update id="update">
+        update sys_vip_label
+        <set>
+            <if test="label != null and label !='' ">
+                label = #{label},
+            </if>
+            <if test="color != null and color !='' ">
+                color = #{color},
+            </if>
+        </set>
+        WHERE ID=#{id}
+    </update>
 
     <delete id="deleteById">
         delete from sys_vip_label
         where id=#{id}
     </delete>
 
+    <delete id="deleteByIds" parameterType="java.util.List">
+        delete from sys_vip_label where  id in
+        <foreach collection="list" index="index" item="item" open="("
+                 separator="," close=")">
+            #{item}
+        </foreach>
+    </delete>
+
 
     <select id="selectByVipId" resultType="com.matrix.system.hive.bean.SysVipLabel">
-        select *
-        from sys_vip_label
-        where vip_id=#{vipId}
+        select b.*
+        from sys_vip_label_relate a
+        inner join sys_vip_label b on a.label_id=b.id
+        where a.vip_id=#{vipId}
     </select>
 
     <select id="selectByModel" resultType="com.matrix.system.hive.bean.SysVipLabel">
-        select * from sys_vip_label
+        select
+            create_time createTime,
+            create_by createBy,
+            id,
+            label,
+            shop_id shopId,
+            company_id companyId,
+            is_all isAll,
+            user_id userId,
+            color
+        from sys_vip_label
         where 1=1
         <if test="record!=null">
             <if test="record.label!=null  and record.label!=''">
-                and label=#{record.label}
+                and label like CONCAT('%', CONCAT(#{record.label},'%'))
             </if>
-            <if test="record.vipId!=null">
-                and vip_id=#{record.vipId}
+            <if test="record.isAll!=null  and record.isAll!=0">
+                and is_all=#{record.isAll}
+            </if>
+            <if test="record.userId!=null  and record.userId!=''">
+                and user_id=#{record.userId}
+            </if>
+            <if test="record.companyId!=null  and record.companyId!=''">
+                and company_id=#{record.companyId}
             </if>
         </if>
     </select>
+
+    <delete id="deleteRelateByVipId">
+        delete from sys_vip_label_relate
+        where vip_id=#{vipId}
+    </delete>
+
+    <select id="selectById" resultType="com.matrix.system.hive.bean.SysVipLabel">
+        select
+            create_time createTime,
+            create_by createBy,
+            id,
+            label,
+            shop_id shopId,
+            company_id companyId,
+            is_all isAll,
+            user_id userId,
+            color
+        from sys_vip_label
+        where id=#{id}
+    </select>
 </mapper>
\ No newline at end of file
diff --git a/zq-erp/src/main/resources/mybatis/mapper/hive/SysVipLevelDao.xml b/zq-erp/src/main/resources/mybatis/mapper/hive/SysVipLevelDao.xml
index 5adb97d..efcb7f3 100644
--- a/zq-erp/src/main/resources/mybatis/mapper/hive/SysVipLevelDao.xml
+++ b/zq-erp/src/main/resources/mybatis/mapper/hive/SysVipLevelDao.xml
@@ -13,6 +13,7 @@
 			<result property="effectDate" column="EFFECT_DATE" />
 			<result property="bigclass" column="BIGCLASS" />
 			<result property="shopId" column="shop_id" />
+			<result property="companyId" column="company_id" />
 	</resultMap>
 	<!--  插入方法   -->
 	<insert id="insert" parameterType="SysVipLevel"
@@ -25,7 +26,8 @@
 			REMARK,
 			EFFECT_DATE,
 			BIGCLASS,
-			shop_id
+			shop_id,
+			company_id
 		)
 	VALUES (
 			#{id},
@@ -35,7 +37,8 @@
 			#{remark},
 			#{effectDate},
 			#{bigclass},
-			#{shopId}
+			#{shopId},
+			#{companyId}
 	)
 	</insert>
 	
@@ -123,6 +126,9 @@
 			<if test="record.shopId != null and record.shopId !='' ">
 				and shop_id = #{record.shopId}
 			</if>
+			<if test="record.companyId != null and record.companyId !='' ">
+				and company_id = #{record.companyId}
+			</if>
 		</if>
 		<if test="pageVo !=null"><!-- 判断pageVo对象是否为空 -->
 			<if test="pageVo.sort !=null  and pageVo.order !=null">
@@ -165,6 +171,9 @@
 			</if>
 			<if test="record.shopId != null and record.shopId !='' ">
 				and shop_id = #{record.shopId}
+			</if>
+			<if test="record.companyId != null and record.companyId !='' ">
+				and company_id = #{record.companyId}
 			</if>
 		</if>
 	</select>
@@ -223,6 +232,9 @@
 			<if test="record.shopId != null and record.shopId !='' ">
 				and shop_id = #{record.shopId}
 			</if>
+			<if test="record.companyId != null and record.companyId !='' ">
+				and company_id = #{record.companyId}
+			</if>
 		</if>
 	</select>
 </mapper>
\ No newline at end of file
diff --git a/zq-erp/src/main/resources/mybatis/mapper/hive/SysWorkBeatuistaffDao.xml b/zq-erp/src/main/resources/mybatis/mapper/hive/SysWorkBeatuistaffDao.xml
index ea19ca7..2434c5f 100644
--- a/zq-erp/src/main/resources/mybatis/mapper/hive/SysWorkBeatuistaffDao.xml
+++ b/zq-erp/src/main/resources/mybatis/mapper/hive/SysWorkBeatuistaffDao.xml
@@ -16,6 +16,16 @@
 			<association property="sysWorktime" column="id=WORK_ID" select="com.matrix.system.hive.dao.SysWorktimeDao.selectById" ></association>
 			
 	</resultMap>
+
+	<resultMap type="SysWorkBeatuistaff" id="SysWorkBeatuistaffSimpleMap">
+		<id property="id" column="ID" />
+		<result property="staffId" column="STAFF_ID" />
+		<result property="paibanCode" column="PAIBAN_CODE" />
+		<result property="workId" column="WORK_ID" />
+		<result property="signOrder" column="signOrder" />
+		<result property="workStaffName" column="WORK_STAFF_NAME" />
+
+	</resultMap>
 	<!--  插入方法   -->
 	<insert id="insert" parameterType="SysWorkBeatuistaff"
 		useGeneratedKeys="true" keyProperty="id">
@@ -82,17 +92,13 @@
 	
 	
 	<!-- 根据时间查询当天上班的人 -->
-	<select id="selectByDateStr" resultMap="SysWorkBeatuistaffMap">
-		select 
-		ID,
-			STAFF_ID,
-			PAIBAN_CODE,
-			SHOP_ID,
-			WORK_ID,
-			(select su_name FROM sys_users t where t.su_id=STAFF_ID) AS WORK_STAFF_NAME
-		from sys_work_beatuistaff 
-		where PAIBAN_CODE = #{timeStr}
-		and SHOP_ID=#{shopId}
+	<select id="selectByDateStr" resultMap="SysWorkBeatuistaffSimpleMap">
+		select
+			  distinct a.STAFF_ID, PAIBAN_CODE, a.SHOP_ID, b.su_name as WORK_STAFF_NAME
+		from sys_work_beatuistaff a
+		left join sys_users b on b.su_id=a.STAFF_ID
+		where a.PAIBAN_CODE = #{timeStr}
+		and a.SHOP_ID=#{shopId}
 	</select>
 	
 	<!-- 根据排班编号查询 -->
diff --git a/zq-erp/src/main/resources/mybatis/mapper/hive/TjVipSumDao.xml b/zq-erp/src/main/resources/mybatis/mapper/hive/TjVipSumDao.xml
index 55ed022..aa09081 100644
--- a/zq-erp/src/main/resources/mybatis/mapper/hive/TjVipSumDao.xml
+++ b/zq-erp/src/main/resources/mybatis/mapper/hive/TjVipSumDao.xml
@@ -68,5 +68,646 @@
 
 	</select>
 
+	<select id="selectBusinessInCome" resultType="java.util.TreeMap">
+		select
+		<foreach collection="list" index="index" item="item"   separator=","  >
+			(
+			select IFNULL(sum(amount),0) from sys_order_flow
+			where <![CDATA[ create_time > #{item.beginTime} and create_time < #{item.endTime}]]> and pay_method!='欠款'
+			<if test="shopId != null">
+				and shop_id=#{shopId}
+			</if>
+			<if test="companyId != null">
+				and company_id=#{companyId}
+			</if>
+			) as t${index}
+
+		</foreach>
+		from area where id=1
+	</select>
+
+	<select id="selectCashIncome" resultType="java.util.TreeMap">
+		select
+		<foreach collection="list" index="index" item="item"   separator=","  >
+			(
+			select IFNULL(sum(amount),0) from sys_order_flow
+			where pay_method not in ('储值卡', '欠款') and flow_type != '退款' and <![CDATA[ create_time > #{item.beginTime} and create_time < #{item.endTime}]]>
+			<if test="shopId != null">
+				and shop_id=#{shopId}
+			</if>
+			<if test="companyId != null">
+				and company_id=#{companyId}
+			</if>
+			) as t${index}
+
+		</foreach>
+		from area where id=1
+	</select>
+
+	<select id="selectCardUse" resultType="java.util.TreeMap">
+		select
+		<foreach collection="list" index="index" item="item"   separator=","  >
+			(
+			select IFNULL(sum(amount),0) from sys_order_flow
+			where pay_method = '储值卡' and flow_type != '退款' and <![CDATA[ create_time > #{item.beginTime} and create_time < #{item.endTime}]]>
+			<if test="shopId != null">
+				and shop_id=#{shopId}
+			</if>
+			<if test="companyId != null">
+				and company_id=#{companyId}
+			</if>
+			) as t${index}
+
+		</foreach>
+		from area where id=1
+	</select>
+
+	<select id="selectArrears" resultType="java.util.TreeMap">
+		select
+		<foreach collection="list" index="index" item="item"   separator=","  >
+			(
+			select IFNULL(sum(amount),0) from sys_order_flow
+			where pay_method = '欠款' and <![CDATA[ create_time > #{item.beginTime} and create_time < #{item.endTime}]]>
+			<if test="shopId != null">
+				and shop_id=#{shopId}
+			</if>
+			<if test="companyId != null">
+				and company_id=#{companyId}
+			</if>
+			) as t${index}
+
+		</foreach>
+		from area where id=1
+	</select>
+
+	<select id="selectHisConsume" resultType="java.util.TreeMap">
+		select
+		<foreach collection="list" index="index" item="item"   separator=","  >
+			(
+			select IFNULL(sum(IFNULL(his_consume, 0)),0) from achieve_new
+			where <![CDATA[datatime > #{item.beginTime} and datatime < #{item.endTime}]]>
+			<if test="shopId != null">
+				and shop_id=#{shopId}
+			</if>
+			<if test="companyId != null">
+				and company_id=#{companyId}
+			</if>
+			) as t${index}
+
+		</foreach>
+		from area where id=1
+	</select>
+
+	<select id="selectFreeConsume" resultType="java.util.TreeMap">
+		select
+		<foreach collection="list" index="index" item="item"   separator=","  >
+			(
+			select IFNULL(sum(IFNULL(free_consume, 0)),0) from achieve_new
+			where <![CDATA[datatime > #{item.beginTime} and datatime < #{item.endTime}]]>
+			<if test="shopId != null">
+				and shop_id=#{shopId}
+			</if>
+			<if test="companyId != null">
+				and company_id=#{companyId}
+			</if>
+			) as t${index}
+		</foreach>
+		from area where id=1
+	</select>
+
+	<select id="selectPeopleCnt" resultType="java.util.TreeMap">
+		select
+		<foreach collection="list" index="index" item="item"   separator=","  >
+			(
+			select IFNULL(sum(IFNULL(number_of_people, 0)),0) from achieve_new
+			where <![CDATA[datatime > #{item.beginTime} and datatime < #{item.endTime}]]>
+			<if test="shopId != null">
+				and shop_id=#{shopId}
+			</if>
+			<if test="companyId != null">
+				and company_id=#{companyId}
+			</if>
+			) as t${index}
+		</foreach>
+		from area where id=1
+	</select>
+
+	<select id="selectProjConsumeCnt" resultType="java.util.TreeMap">
+		select
+		<foreach collection="list" index="index" item="item"   separator=","  >
+			(
+			select IFNULL(sum(IFNULL(proj_num, 0)),0) from achieve_new
+			where <![CDATA[datatime > #{item.beginTime} and datatime < #{item.endTime}]]>
+			<if test="shopId != null">
+				and shop_id=#{shopId}
+			</if>
+			<if test="companyId != null">
+				and company_id=#{companyId}
+			</if>
+			) as t${index}
+		</foreach>
+		from area where id=1
+	</select>
+
+	<select id="selectTimeLength" resultType="java.util.TreeMap">
+		select
+		<foreach collection="list" index="index" item="item"   separator=","  >
+			(
+			select IFNULL(sum(IFNULL(proj_time, 0)),0) from achieve_new
+			where <![CDATA[datatime > #{item.beginTime} and datatime < #{item.endTime}]]>
+			<if test="shopId != null">
+				and shop_id=#{shopId}
+			</if>
+			<if test="companyId != null">
+				and company_id=#{companyId}
+			</if>
+			) as t${index}
+		</foreach>
+		from area where id=1
+	</select>
+
+	<select id="selectProductAchieve" resultType="java.util.TreeMap">
+		select
+		<foreach collection="list" index="index" item="item"   separator=","  >
+			(
+			select IFNULL(sum(zk_price),0) from sys_order_item a
+			inner join shopping_goods b on a.goods_id=b.id
+			inner join sys_order c on a.ORDER_ID=c.id
+			where b.good_type='家居产品' and <![CDATA[ a.create_time > #{item.beginTime} and a.create_time < #{item.endTime}]]>
+			<if test="shopId != null">
+				and c.shop_id=#{shopId}
+			</if>
+			<if test="companyId != null">
+				and c.company_id=#{companyId}
+			</if>
+			) as t${index}
+		</foreach>
+		from area where id=1
+	</select>
+
+	<select id="selectCardAchieve" resultType="java.util.TreeMap">
+		select
+		<foreach collection="list" index="index" item="item"   separator=","  >
+			(
+			select IFNULL(sum(zk_price),0) from sys_order_item a
+			inner join shopping_goods b on a.goods_id=b.id
+			inner join sys_order c on a.ORDER_ID=c.id
+			where b.good_type!='家居产品' and <![CDATA[ a.create_time > #{item.beginTime} and a.create_time < #{item.endTime}]]>
+			<if test="shopId != null">
+				and c.shop_id=#{shopId}
+			</if>
+			<if test="companyId != null">
+				and c.company_id=#{companyId}
+			</if>
+			) as t${index}
+		</foreach>
+		from area where id=1
+	</select>
+
+	<select id="selectRepayment" resultType="java.util.TreeMap">
+		select
+		<foreach collection="list" index="index" item="item"   separator=","  >
+			(
+			select IFNULL(sum(amount),0) from sys_order_flow where flow_type = '还款' and <![CDATA[ create_time > #{item.beginTime} and create_time < #{item.endTime}]]>
+			<if test="shopId != null">
+				and shop_id=#{shopId}
+			</if>
+			<if test="companyId != null">
+				and company_id=#{companyId}
+			</if>
+			) as t${index}
+		</foreach>
+		from area where id=1
+	</select>
+
+	<select id="selectPerCustomCnt" resultType="java.util.TreeMap">
+		select
+		<foreach collection="list" index="index" item="item"   separator=","  >
+			(
+			select IFNULL(count(1),0) from sys_order
+			where STATU in ('已付款', '欠款') and <![CDATA[ ORDER_TIME > #{item.beginTime} and ORDER_TIME < #{item.endTime} ]]>
+			<if test="shopId != null">
+				and shop_id=#{shopId}
+			</if>
+			<if test="companyId != null">
+				and company_id=#{companyId}
+			</if>
+			) as t${index}
+		</foreach>
+		from area where id=1
+	</select>
+
+	<select id="selectCustomGoodsCnt" resultType="java.util.TreeMap">
+		select
+		<foreach collection="list" index="index" item="item"   separator=","  >
+			(
+			select case a.perCustomCnt when 0 then 0 else a.totalSaleCnt/a.perCustomCnt end from (
+				select
+				(select IFNULL(count(1),0) from sys_order
+					where STATU in ('已付款', '欠款') and <![CDATA[ ORDER_TIME > #{item.beginTime} and ORDER_TIME < #{item.endTime} ]]>
+					<if test="shopId != null">
+						and shop_id=#{shopId}
+					</if>
+					<if test="companyId != null">
+						and company_id=#{companyId}
+					</if>
+				) perCustomCnt,
+				(select IFNULL(sum(b.COUNT),0) from sys_order a inner join sys_order_item b on a.ID=b.ORDER_ID
+					where a.STATU in ('已付款', '欠款') and <![CDATA[ ORDER_TIME > #{item.beginTime} and ORDER_TIME < #{item.endTime} ]]>
+					<if test="shopId != null">
+						and shop_id=#{shopId}
+					</if>
+					<if test="companyId != null">
+						and company_id=#{companyId}
+					</if>
+					) totalSaleCnt from dual
+				) a
+			) as t${index}
+		</foreach>
+		from area where id=1
+	</select>
+
+	<select id="selectPerCustomPrice" resultType="java.util.TreeMap">
+		select
+		<foreach collection="list" index="index" item="item"   separator=","  >
+			(
+			select case a.perCustomCnt when 0 then 0 else a.totalPay/a.perCustomCnt end from (
+			select
+			(select IFNULL(count(1),0) from sys_order
+			where STATU in ('已付款', '欠款') and <![CDATA[ ORDER_TIME > #{item.beginTime} and ORDER_TIME < #{item.endTime} ]]>
+			<if test="shopId != null">
+				and shop_id=#{shopId}
+			</if>
+			<if test="companyId != null">
+				and company_id=#{companyId}
+			</if>
+			) perCustomCnt,
+			(select IFNULL(sum(amount),0) from sys_order_flow
+			where <![CDATA[ create_time > #{item.beginTime} and create_time < #{item.endTime}]]> and pay_method!='欠款'
+			<if test="shopId != null">
+				and shop_id=#{shopId}
+			</if>
+			<if test="companyId != null">
+				and company_id=#{companyId}
+			</if>
+			) totalPay from dual
+			) a
+			) as t${index}
+		</foreach>
+		from area where id=1
+	</select>
+
+	<select id="selectCost" resultType="java.util.TreeMap">
+		select
+		<foreach collection="list" index="index" item="item"   separator=","  >
+			(
+			select a.goodsCost+a.otherCost end from (
+				select
+					(select IFNULL(sum(e.count * d.GOODS_PRICE),0) from sys_order a
+						inner join sys_out_store b on a.id=b.ORDER_ID
+						inner join sys_out_store_item c on b.id=c.OUT_STORE_ID
+						inner join sys_store_info d on c.store_id = d.ID
+						inner join sys_order_item e on a.ID=e.ORDER_ID
+						inner join shopping_goods f on e.goods_id=f.id and f.good_type='家居产品'
+						where a.STATU in ('已付款', '欠款') and <![CDATA[ ORDER_TIME > #{item.beginTime} and ORDER_TIME < #{item.endTime} ]]>
+						<if test="shopId != null">
+							and a.shop_id=#{shopId}
+						</if>
+						<if test="companyId != null">
+							and a.company_id=#{companyId}
+						</if>
+					) goodsCost,
+					(select IFNULL(sum(b.COUNT * IFNULL(c.price, 0)),0) from sys_order a
+						inner join sys_order_item b on a.ID=b.ORDER_ID
+						inner join shopping_goods c on c.good_type != '家居产品' and b.goods_id=c.id
+						where a.STATU in ('已付款', '欠款') and <![CDATA[ ORDER_TIME > #{item.beginTime} and ORDER_TIME < #{item.endTime} ]]>
+						<if test="shopId != null">
+							and a.shop_id=#{shopId}
+						</if>
+						<if test="companyId != null">
+							and a.company_id=#{companyId}
+						</if>
+					) otherCost from dual
+				) a
+			) as t${index}
+		</foreach>
+		from area where id=1
+	</select>
+
+	<select id="selectGrossProfit" resultType="java.util.TreeMap">
+		select
+		<foreach collection="list" index="index" item="item"   separator=","  >
+			(
+				select a.totalPay - a.goodsCost - a.otherCost end from (
+					select
+					(select IFNULL(sum(e.count * d.GOODS_PRICE),0) from sys_order a
+						inner join sys_out_store b on a.id=b.ORDER_ID
+						inner join sys_out_store_item c on b.id=c.OUT_STORE_ID
+						inner join sys_store_info d on c.store_id = d.ID
+						inner join sys_order_item e on a.ID=e.ORDER_ID
+						inner join shopping_goods f on e.goods_id=f.id and f.good_type='家居产品'
+						where a.STATU in ('已付款', '欠款') and <![CDATA[ ORDER_TIME > #{item.beginTime} and ORDER_TIME < #{item.endTime} ]]>
+						<if test="shopId != null">
+							and a.shop_id=#{shopId}
+						</if>
+						<if test="companyId != null">
+							and a.company_id=#{companyId}
+						</if>
+					) goodsCost,
+					(select IFNULL(sum(b.COUNT * IFNULL(c.price, 0)),0) from sys_order a
+						inner join sys_order_item b on a.ID=b.ORDER_ID
+						inner join shopping_goods c on c.good_type != '家居产品' and b.goods_id=c.id
+						where a.STATU in ('已付款', '欠款') and <![CDATA[ ORDER_TIME > #{item.beginTime} and ORDER_TIME < #{item.endTime} ]]>
+						<if test="shopId != null">
+							and a.shop_id=#{shopId}
+						</if>
+						<if test="companyId != null">
+							and a.company_id=#{companyId}
+						</if>
+					) otherCost,
+					(select IFNULL(sum(amount),0) from sys_order_flow
+						where <![CDATA[ create_time > #{item.beginTime} and create_time < #{item.endTime}]]> and pay_method!='欠款'
+						<if test="shopId != null">
+							and shop_id=#{shopId}
+						</if>
+						<if test="companyId != null">
+							and company_id=#{companyId}
+						</if>
+					) totalPay from dual
+				) a
+			) as t${index}
+		</foreach>
+		from area where id=1
+	</select>
+
+	<select id="selectGrossProfitRate" resultType="java.util.TreeMap">
+		select
+		<foreach collection="list" index="index" item="item"   separator=","  >
+			(
+				select case a.totalPay when 0 then 0 else  (a.totalPay - a.goodsCost - a.otherCost)/a.totalPay end from (
+					select
+					(select IFNULL(sum(e.count * d.GOODS_PRICE),0) from sys_order a
+						inner join sys_out_store b on a.id=b.ORDER_ID
+						inner join sys_out_store_item c on b.id=c.OUT_STORE_ID
+						inner join sys_store_info d on c.store_id = d.ID
+						inner join sys_order_item e on a.ID=e.ORDER_ID
+						inner join shopping_goods f on e.goods_id=f.id and f.good_type='家居产品'
+						where a.STATU in ('已付款', '欠款') and <![CDATA[ ORDER_TIME > #{item.beginTime} and ORDER_TIME < #{item.endTime} ]]>
+						<if test="shopId != null">
+							and a.shop_id=#{shopId}
+						</if>
+						<if test="companyId != null">
+							and a.company_id=#{companyId}
+						</if>
+					) goodsCost,
+					(select IFNULL(sum(b.COUNT * IFNULL(c.price, 0)),0) from sys_order a
+						inner join sys_order_item b on a.ID=b.ORDER_ID
+						inner join shopping_goods c on c.good_type != '家居产品' and b.goods_id=c.id
+						where a.STATU in ('已付款', '欠款') and <![CDATA[ ORDER_TIME > #{item.beginTime} and ORDER_TIME < #{item.endTime} ]]>
+						<if test="shopId != null">
+							and a.shop_id=#{shopId}
+						</if>
+						<if test="companyId != null">
+							and a.company_id=#{companyId}
+						</if>
+					) otherCost,
+					(select IFNULL(sum(amount),0) from sys_order_flow
+						where <![CDATA[ create_time > #{item.beginTime} and create_time < #{item.endTime}]]> and pay_method!='欠款'
+						<if test="shopId != null">
+							and shop_id=#{shopId}
+						</if>
+						<if test="companyId != null">
+							and company_id=#{companyId}
+						</if>
+					) totalPay from dual
+				) a
+			) as t${index}
+		</foreach>
+		from area where id=1
+	</select>
+
+	<select id="selectCashRefund" resultType="java.util.TreeMap">
+		select
+		<foreach collection="list" index="index" item="item"   separator=","  >
+			(
+			select IFNULL(sum(amount),0) from sys_order_flow
+			where pay_method not in ('储值卡', '欠款') and flow_type = '退款' and <![CDATA[ create_time > #{item.beginTime} and create_time < #{item.endTime}]]>
+			<if test="shopId != null">
+				and shop_id=#{shopId}
+			</if>
+			<if test="companyId != null">
+				and company_id=#{companyId}
+			</if>
+			) as t${index}
+
+		</foreach>
+		from area where id=1
+	</select>
+
+
+	<select id="selectCardRefund" resultType="java.util.TreeMap">
+		select
+		<foreach collection="list" index="index" item="item"   separator=","  >
+			(
+			select IFNULL(sum(amount),0) from sys_order_flow
+			where pay_method in ('储值卡') and flow_type = '退款' and <![CDATA[ create_time > #{item.beginTime} and create_time < #{item.endTime}]]>
+			<if test="shopId != null">
+				and shop_id=#{shopId}
+			</if>
+			<if test="companyId != null">
+				and company_id=#{companyId}
+			</if>
+			) as t${index}
+
+		</foreach>
+		from area where id=1
+	</select>
+
+	<select id="selectVipAchieveInPage" resultType="com.matrix.system.app.vo.VipAchieveDataShowVo">
+		<foreach collection="list" index="index" item="item"   separator="union all"  >
+			select
+				#{item.beginTime} time,
+				(select ifnull(sum(ifnull(card_cash,0) + ifnull(consume,0)),0) from achieve_new a where a.beault_id=#{userId} and <![CDATA[datatime > #{item.beginTime} and datatime < #{item.endTime} ]]>) orderAmount,
+				(select ifnull(sum(case t3 when '现金业绩' then card_cash else 0 end),0) from achieve_new a where a.beault_id=#{userId} and <![CDATA[datatime > #{item.beginTime} and datatime < #{item.endTime} ]]>) cashAmount,
+				(select ifnull(sum(case t3 when '划扣业绩' then consume else 0 end),0) from achieve_new a where a.beault_id=#{userId} and <![CDATA[datatime > #{item.beginTime} and datatime < #{item.endTime} ]]>) cardAmount,
+				(select ifnull(sum(case t3 when '划扣业绩' then consume else 0 end),0) from achieve_new a where a.beault_id=#{userId} and <![CDATA[datatime > #{item.beginTime} and datatime < #{item.endTime} ]]>) cardUseAmount,
+				(select ifnull(sum(ifnull(proj_percentage, 0)),0) from achieve_new a where a.beault_id=#{userId} and <![CDATA[datatime > #{item.beginTime} and datatime < #{item.endTime} ]]> and order_type='订单') goodsAmount,
+				(select ifnull(sum(ifnull(his_consume, 0)),0) from achieve_new a where a.beault_id=#{userId} and <![CDATA[datatime > #{item.beginTime} and datatime < #{item.endTime} ]]>) hisConsume,
+				(select ifnull(sum(ifnull(free_consume, 0)),0) from achieve_new a where a.beault_id=#{userId} and <![CDATA[datatime > #{item.beginTime} and datatime < #{item.endTime} ]]>) freeConsume,
+				(select ifnull(sum(ifnull(proj_percentage, 0)),0) from achieve_new a where a.beault_id=#{userId} and <![CDATA[datatime > #{item.beginTime} and datatime < #{item.endTime} ]]> and order_type='服务单') commission,
+				(select ifnull(sum(ifnull(number_of_people, 0)),0) from achieve_new a where a.beault_id=#{userId} and <![CDATA[datatime > #{item.beginTime} and datatime < #{item.endTime} ]]>) peopleNum,
+				(select ifnull(sum(ifnull(proj_num, 0)),0) from achieve_new a where a.beault_id=#{userId} and <![CDATA[datatime > #{item.beginTime} and datatime < #{item.endTime} ]]>) projNum,
+				(select ifnull(sum(ifnull(proj_time, 0)),0) from achieve_new a where a.beault_id=#{userId} and <![CDATA[datatime > #{item.beginTime} and datatime < #{item.endTime} ]]>) serviceTime
+			from dual
+		</foreach>
+	</select>
+
+	<select id="selectStaffOrderAchieve" resultType="java.util.TreeMap">
+		select
+		<foreach collection="list" index="index" item="item"   separator=","  >
+			(select ifnull(sum(ifnull(card_cash,0) + ifnull(consume,0)),0)
+				from achieve_new a
+				where <![CDATA[datatime > #{item.beginTime} and datatime < #{item.endTime} ]]>
+				<if test="staffId != null and staffId != 0">
+					and a.beault_id=#{staffId}
+				</if>
+			) as t${index}
+
+		</foreach>
+		from area where id=1
+	</select>
+
+	<select id="selectStaffCashAchieve" resultType="java.util.TreeMap">
+		select
+		<foreach collection="list" index="index" item="item"   separator=","  >
+			(select ifnull(sum(case t3 when '现金业绩' then card_cash else 0 end),0)
+				from achieve_new a
+				where <![CDATA[datatime > #{item.beginTime} and datatime < #{item.endTime} ]]>
+				<if test="staffId != null and staffId != 0">
+					and a.beault_id=#{staffId}
+				</if>
+			) as t${index}
+
+		</foreach>
+		from area where id=1
+	</select>
+
+	<select id="selectStaffCardAchieve" resultType="java.util.TreeMap">
+		select
+		<foreach collection="list" index="index" item="item"   separator=","  >
+			(select ifnull(sum(case t3 when '划扣业绩' then consume else 0 end),0)
+			from achieve_new a
+			where <![CDATA[datatime > #{item.beginTime} and datatime < #{item.endTime} ]]>
+			<if test="staffId != null and staffId != 0">
+				and a.beault_id=#{staffId}
+			</if>
+			) as t${index}
+
+		</foreach>
+		from area where id=1
+	</select>
+
+	<select id="selectStaffGoodsAchieve" resultType="java.util.TreeMap">
+		select
+		<foreach collection="list" index="index" item="item"   separator=","  >
+			(select ifnull(sum(ifnull(proj_percentage, 0)),0)
+				from achieve_new a
+				where <![CDATA[datatime > #{item.beginTime} and datatime < #{item.endTime} ]]> and order_type='订单'
+			<if test="staffId != null and staffId != 0">
+				and a.beault_id=#{staffId}
+			</if>
+			) as t${index}
+		</foreach>
+		from area where id=1
+	</select>
+
+	<select id="selectStaffCardUseAchieve" resultType="java.util.TreeMap">
+		select
+		<foreach collection="list" index="index" item="item"   separator=","  >
+			(
+			select
+			IFNULL(SUM((IFNULL(a.consume,0))),0)
+			from  achieve_new a
+			where   <![CDATA[datatime > #{item.beginTime}   and  datatime < #{item.endTime} ]]>
+			<if test="staffId != null and staffId != 0">
+				and sale_id=#{staffId}
+			</if>
+			) as t${index}
+		</foreach>
+		from area where id=1
+	</select>
+
+	<select id="selectStaffHisConsumeAchieve" resultType="java.util.TreeMap">
+		select
+		<foreach collection="list" index="index" item="item"   separator=","  >
+			(
+			select
+			IFNULL(SUM((IFNULL(a.his_consume,0))),0)
+			from  achieve_new a
+			where   <![CDATA[datatime > #{item.beginTime}   and  datatime < #{item.endTime} ]]>
+			<if test="staffId != null and staffId != 0">
+				and beault_id=#{staffId}
+			</if>
+			) as t${index}
+		</foreach>
+		from area where id=1
+	</select>
+
+	<select id="selectStaffFreeConsumeAchieve" resultType="java.util.TreeMap">
+		select
+		<foreach collection="list" index="index" item="item"   separator=","  >
+			(
+			select
+			IFNULL(SUM((IFNULL(a.free_consume,0))),0)
+			from  achieve_new a
+			where   <![CDATA[datatime > #{item.beginTime}   and  datatime < #{item.endTime} ]]>
+			<if test="staffId != null and staffId != 0">
+				and beault_id=#{staffId}
+			</if>
+			) as t${index}
+		</foreach>
+		from area where id=1
+	</select>
+
+	<select id="selectStaffCommissionAchieve" resultType="java.util.TreeMap">
+		select
+		<foreach collection="list" index="index" item="item"   separator=","  >
+			(select ifnull(sum(ifnull(proj_percentage, 0)),0) from achieve_new a
+				where  <![CDATA[datatime > #{item.beginTime} and datatime < #{item.endTime} ]]> and order_type='服务单'
+				<if test="staffId != null and staffId != 0">
+					and a.beault_id=#{staffId}
+				</if>
+			) as t${index}
+		</foreach>
+		from area where id=1
+	</select>
+
+	<select id="selectStaffPeopleNum" resultType="java.util.TreeMap">
+		select
+		<foreach collection="list" index="index" item="item"   separator=","  >
+			(
+			select
+			IFNULL(SUM((IFNULL(a.number_of_people,0))),0)
+			from  achieve_new a
+			where   <![CDATA[datatime > #{item.beginTime}   and  datatime < #{item.endTime} ]]>
+			<if test="staffId != null and staffId != 0">
+				and beault_id=#{staffId}
+			</if>
+			) as t${index}
+		</foreach>
+		from area where id=1
+	</select>
+
+	<select id="selectStaffProjNum" resultType="java.util.TreeMap">
+		select
+		<foreach collection="list" index="index" item="item"   separator=","  >
+			(
+			select
+			IFNULL(SUM((IFNULL(a.proj_num,0))),0)
+			from  achieve_new a
+			where   <![CDATA[datatime > #{item.beginTime}   and  datatime < #{item.endTime} ]]>
+			<if test="staffId != null and staffId != 0">
+				and beault_id=#{staffId}
+			</if>
+			) as t${index}
+		</foreach>
+		from area where id=1
+	</select>
+
+	<select id="selectStaffProjTime" resultType="java.util.TreeMap">
+		select
+		<foreach collection="list" index="index" item="item"   separator=","  >
+			(
+			select
+			IFNULL(SUM((IFNULL(a.proj_time,0))),0)
+			from  achieve_new a
+			where   <![CDATA[datatime > #{item.beginTime}   and  datatime < #{item.endTime} ]]>
+			<if test="staffId != null and staffId != 0">
+				and beault_id=#{staffId}
+			</if>
+			) as t${index}
+		</foreach>
+		from area where id=1
+	</select>
 </mapper>
 	
diff --git a/zq-erp/src/main/resources/mybatis/mapper/xcxShop/ShopProductAttributeDao.xml b/zq-erp/src/main/resources/mybatis/mapper/xcxShop/ShopProductAttributeDao.xml
index 1efb9b7..f025c09 100644
--- a/zq-erp/src/main/resources/mybatis/mapper/xcxShop/ShopProductAttributeDao.xml
+++ b/zq-erp/src/main/resources/mybatis/mapper/xcxShop/ShopProductAttributeDao.xml
@@ -39,7 +39,7 @@
 		<result property="attrMark" column="attr_mark" />
 		<result property="sort"    column="sort"/>
 		<result property="companyId" column="company_id" />
-		<collection property="child" column="{attrId=attr_id, shopId=shop_id}" select="selectByParentIds"/>
+		<collection property="child" column="{attrId=attr_id, companyId=company_id}" select="selectByParentIds"/>
 	</resultMap>
 
     <!-- 根据id查询-->
@@ -47,7 +47,7 @@
         select
         <include refid="columns" ></include>
         from shop_product_attribute
-        where  parent_id=#{attrId} and shop_id=#{shopId}
+        where  parent_id=#{attrId} and company_id=#{companyId}
     </select>
 
     <!-- 根据编码查询-->
diff --git a/zq-erp/src/main/resources/mybatis/mapper/xcxShop/ShopProductDao.xml b/zq-erp/src/main/resources/mybatis/mapper/xcxShop/ShopProductDao.xml
index f12db2c..2c2cf8c 100644
--- a/zq-erp/src/main/resources/mybatis/mapper/xcxShop/ShopProductDao.xml
+++ b/zq-erp/src/main/resources/mybatis/mapper/xcxShop/ShopProductDao.xml
@@ -846,6 +846,16 @@
         </foreach>
     </select>
 
+    <select id="selectProductNameByIds" resultType="java.lang.String">
+        select
+         title
+        from shop_product
+        where id in
+        <foreach collection="ids" item="item" separator="," open="(" close=")">
+            #{item}
+        </foreach>
+    </select>
+
 
     <!-- 根据id 锁表查询-->
     <select id="selectForUpdate" resultMap="ShopProductMap">
diff --git a/zq-erp/src/main/resources/mybatis/mapper/xcxShop/ShopWxtemplateMsgDao.xml b/zq-erp/src/main/resources/mybatis/mapper/xcxShop/ShopWxtemplateMsgDao.xml
index cb13505..d426cec 100644
--- a/zq-erp/src/main/resources/mybatis/mapper/xcxShop/ShopWxtemplateMsgDao.xml
+++ b/zq-erp/src/main/resources/mybatis/mapper/xcxShop/ShopWxtemplateMsgDao.xml
@@ -16,6 +16,8 @@
 			<result property="remark" column="remark" />
 			<result property="companyId" column="company_id" />
 			<result property="code" column="code" />
+			<result property="tempType" column="temp_type" />
+			<result property="templateClass" column="template_class" />
 	</resultMap>
 
 	
@@ -32,6 +34,8 @@
 			<result property="remark" column="remark" />
 			<result property="companyId" column="company_id" />
 		<result property="code" column="code" />
+		<result property="tempType" column="temp_type" />
+		<result property="templateClass" column="template_class" />
 	</resultMap>
 	
 	<!-- 字段sql -->
@@ -46,7 +50,9 @@
 			status,
 			remark,
 			company_id,
-			code
+			code,
+			temp_type,
+			template_class
 	</sql>
 	
 	<!-- 属性sql -->
@@ -61,9 +67,10 @@
 			#{item.status},
 			#{item.remark},
 			#{item.companyId},
-			#{item.code}
+			#{item.code},
+			#{item.tempType},
+			#{item.templateClass}
 	</sql>
-	
 	<!-- where sql -->
 	<sql id="where_sql">
 		 
@@ -86,6 +93,12 @@
 			<if test="(record.companyId!=null and record.companyId!='') or  (record.companyId!='' and record.companyId==0)  ">
 				and company_id  = #{record.companyId} 
 			</if>
+
+				<if test="(record.tempType!=null and record.tempType!='') or  (record.tempType!='' and record.tempType==0)  ">
+				and tempType  = #{record.tempType}
+			</if>
+
+
 		</if>
 		 
 	</sql>
@@ -140,6 +153,10 @@
 			<if test="_parameter.containsKey('code')">
 				code = #{code},
 			</if>
+			<if test="_parameter.containsKey('temp_type')">
+				temp_type = #{tempType},
+			</if>
+
 		</set>
 		WHERE id=#{id} 
 	</update> 
@@ -167,6 +184,11 @@
 			<if test="record.code != null and record.code != '' ">
 				code  = #{record.code},
 			</if>
+
+			<if test="record.tempType != null and record.tempType != '' ">
+				temp_type  = #{record.tempType},
+			</if>
+
 		</set>
 		WHERE id=#{record.id} 
 	</update>
@@ -198,8 +220,19 @@
 	
 	<!-- 分页查询 -->
 	<select id="selectInPage" resultMap="ShopWxtemplateMsgMap">
-		select 
-		<include refid="columns" ></include>
+		select
+		create_by,
+		create_time,
+		update_by,
+		update_time,
+		id,
+		name,
+		uuid,
+		status,
+		remark,
+		company_id,
+		code,
+		temp_type
 		from shop_wxtemplate_msg
 		<where>
 		  <include refid="where_sql"></include>
@@ -248,7 +281,7 @@
 		select
 		<include refid="columns" ></include>
 		from shop_wxtemplate_msg
-		where  code=#{code}
+		where  code=#{code} and company_id=#{companyId}
 	</select>
 
 
diff --git a/zq-erp/src/main/resources/mybatis/mybatis-config.xml b/zq-erp/src/main/resources/mybatis/mybatis-config.xml
index ac77a00..66fe1b7 100644
--- a/zq-erp/src/main/resources/mybatis/mybatis-config.xml
+++ b/zq-erp/src/main/resources/mybatis/mybatis-config.xml
@@ -63,5 +63,6 @@
 		<typeAlias alias="ServicesFlow"  type="com.matrix.system.hive.bean.ServicesFlow" />
 		<typeAlias alias="VipAnswer"  type="com.matrix.system.hive.bean.VipAnswer" />
 		<typeAlias alias="SysWorktime"  type="com.matrix.system.hive.bean.SysWorktime" />
+		<typeAlias alias="SysOrderFlow"  type="com.matrix.system.hive.bean.SysOrderFlow" />
 	</typeAliases>
 </configuration>
diff --git a/zq-erp/src/main/resources/static/css/styleOne/style.min.css b/zq-erp/src/main/resources/static/css/styleOne/style.min.css
index 5e1b542..31088b3 100644
--- a/zq-erp/src/main/resources/static/css/styleOne/style.min.css
+++ b/zq-erp/src/main/resources/static/css/styleOne/style.min.css
@@ -9157,4 +9157,10 @@
 	line-height: 50px;
 }
 
-/*===========鑷畾涔夋牱寮廵nd==============================*/
\ No newline at end of file
+/*===========鑷畾涔夋牱寮廵nd==============================*/
+/**
+* 覆盖elementui一些无用样式
+*/
+.el-form-item{
+	margin-bottom:10px !important;
+}
\ No newline at end of file
diff --git a/zq-erp/src/main/resources/static/images/pay/card.png b/zq-erp/src/main/resources/static/images/pay/card.png
new file mode 100644
index 0000000..5265578
--- /dev/null
+++ b/zq-erp/src/main/resources/static/images/pay/card.png
Binary files differ
diff --git a/zq-erp/src/main/resources/static/images/pay/cash.png b/zq-erp/src/main/resources/static/images/pay/cash.png
new file mode 100644
index 0000000..26b92e5
--- /dev/null
+++ b/zq-erp/src/main/resources/static/images/pay/cash.png
Binary files differ
diff --git a/zq-erp/src/main/resources/static/images/pay/qian.png b/zq-erp/src/main/resources/static/images/pay/qian.png
new file mode 100644
index 0000000..ab49f33
--- /dev/null
+++ b/zq-erp/src/main/resources/static/images/pay/qian.png
Binary files differ
diff --git a/zq-erp/src/main/resources/static/images/pay/tuan.png b/zq-erp/src/main/resources/static/images/pay/tuan.png
new file mode 100644
index 0000000..d4eb1c5
--- /dev/null
+++ b/zq-erp/src/main/resources/static/images/pay/tuan.png
Binary files differ
diff --git a/zq-erp/src/main/resources/static/images/pay/wechat.png b/zq-erp/src/main/resources/static/images/pay/wechat.png
new file mode 100644
index 0000000..e7930a7
--- /dev/null
+++ b/zq-erp/src/main/resources/static/images/pay/wechat.png
Binary files differ
diff --git a/zq-erp/src/main/resources/static/images/pay/yinlian.png b/zq-erp/src/main/resources/static/images/pay/yinlian.png
new file mode 100644
index 0000000..9a16785
--- /dev/null
+++ b/zq-erp/src/main/resources/static/images/pay/yinlian.png
Binary files differ
diff --git a/zq-erp/src/main/resources/static/images/pay/zhifubao.png b/zq-erp/src/main/resources/static/images/pay/zhifubao.png
new file mode 100644
index 0000000..02ce6dd
--- /dev/null
+++ b/zq-erp/src/main/resources/static/images/pay/zhifubao.png
Binary files differ
diff --git a/zq-erp/src/main/resources/static/js/systools/AjaxProxyVue.js b/zq-erp/src/main/resources/static/js/systools/AjaxProxyVue.js
index b11d542..ef97725 100644
--- a/zq-erp/src/main/resources/static/js/systools/AjaxProxyVue.js
+++ b/zq-erp/src/main/resources/static/js/systools/AjaxProxyVue.js
@@ -240,7 +240,16 @@
       return root.children;
     },
 
-
+    /** json对象转Url参数**/
+    jsonToUrlParam:function(obj){
+        let str="";
+        for(item in obj){
+            if(obj[item]){
+                str+=item+"="+obj[item]+"&"
+            }
+        }
+        return str;
+    }
 
 
 
diff --git a/zq-erp/src/main/resources/templates/views/admin/hive-erp/order/orderXq-form.html b/zq-erp/src/main/resources/templates/views/admin/hive-erp/order/orderXq-form.html
index 1797130..6029100 100644
--- a/zq-erp/src/main/resources/templates/views/admin/hive-erp/order/orderXq-form.html
+++ b/zq-erp/src/main/resources/templates/views/admin/hive-erp/order/orderXq-form.html
@@ -11,142 +11,889 @@
     <LINK rel="Bookmark" href="../images/favicon.ico">
     <!-- 本框架基本脚本和样式 -->
     <script type="text/javascript" th:src="@{/js/systools/MBaseVue.js}"></script>
-    <script type="text/javascript" th:src="@{/js/plugin/jquery-2.1.4.min.js}"></script>
     <script type="text/javascript" th:src="@{/plugin/moment.min.js}"></script>
     <script type="text/javascript" th:src="@{/js/systools/MBase.js}"></script>
     <script type="text/javascript" th:src="@{/js/function/vip.js}"></script>
     <link rel="stylesheet" th:href="@{/plugin/element-ui/index.css}">
 
-    <script type="text/javascript" th:src="@{/js/function/vip.js}"></script>
     <script type="text/javascript" th:src="@{/js/function/meiduCommon.js}"></script>
     <title></title>
     <style>
         .ibox-content {
             background-color: rgba(240, 242, 245, 1);
         }
+        .aside label {
+            width: 100%;
+            margin: 5px 0 !important;
+        }
+        .arrears {
+            color: #E6A23C;
+        }
+
+        .paymethod ul {
+            padding: 0;
+            margin: 0;
+            height: 50px;
+        }
+        .paymethod ul li {
+            padding: 10px;
+            margin: 5px;
+            list-style:none;
+            float: left;
+            display: block;
+            cursor: pointer;
+            position: relative;
+            border: white 1px solid;
+        }
+        .paymethod ul li:hover {
+            border: #409EFF 1px solid;
+        }
+        .paymethod .active {
+            border: #409EFF 1px solid;
+        }
+        .paymethod .active::after {
+            content: '';
+            display: block;
+            height: 0px;
+            width: 0px;
+            position: absolute;
+            bottom: 0;
+            right: 0;
+            color:#fff;
+            /**对号大小*/
+            font-size: 10px;
+            line-height: 8px;
+            border: 3px solid;
+            border-color: transparent #4884ff #4884ff transparent;
+        }
+
+        .el-dialog__body {
+            padding-top: 10px !important;
+        }
     </style>
 </head>
 <div class="ibox-content" id="app">
     <el-container>
-        <el-header style="height: 210px; background-color: white; margin: 15px;">
-            <el-row style="line-height: 60px; padding-top: 20px;">
-                <el-col :span="1" style="font-size: 40px; color:#409EFF;">
-                    <i class="el-icon-s-order" type="primary"></i>
-                </el-col>
-                <el-col :span="10">
-                    <h1 style="line-height: 60px; margin: 0 0;">订单号:{{order.orderNo}}</h1>
-                </el-col>
-                <el-col :span="5" style="float: right; margin-right: 10px;">
-                    <el-button type="info" @click="printf">打印</el-button>
-                    <el-button type="danger" @click="toBack">返回</el-button>
+        <el-aside class="aside" style="width: 300px; background-color: white; padding: 10px;">
+            <el-row style="border-bottom: #E4E7ED 1px solid;">
+                <el-col :span="20" style="padding: 10px;">
+                    <el-row type="flex" align="middle">
+                        <el-col :span="7">
+                            <el-avatar :size="60" :src="circleUrl"></el-avatar>
+                        </el-col>
+                        <el-col :span="15" style="margin-left: 10px;">
+                            <label>{{vipInfo.vipName}}({{vipInfo.vipLevel == null ? '' : vipInfo.vipLevel.levelName}})</label>
+                            <label>{{vipInfo.vipNo}}</label>
+                        </el-col>
+                    </el-row>
+                    <el-row style="line-height: 20px;">
+                        <label>订单号: <span>{{order.orderNo}}</span></label>
+                        <label>下单顾问: <span>{{order.staffName}}</span></label>
+                        <label>消费门店: <span>{{order.shopShortName}}</span></label>
+                        <label>订单时间: <span>{{order.orderTime}}</span></label>
+                        <label>备  注: <span>{{order.remark}}</span></label>
+                    </el-row>
                 </el-col>
             </el-row>
-            <el-row class="order-info" type="flex" justify="space-around"  style="height: 150px; padding: 30px 30px;">
-                <el-col :span="5">
-                    <p>顾问姓名:{{order.staffName}}</p>
-                    <p>会员姓名:{{order.vipName}}</p>
-                    <p>会员编号:{{order.vipNo}}</p>
-                </el-col>
-                <el-col :span="5">
-                    <p>卡支付:{{order.cardPay}}</p>
-                    <p>现金支付:{{order.cashPay}}</p>
-                    <p>备注:{{order.remark}}</p>
-                </el-col>
-                <el-col :span="10">
-                    <el-col :span="6">
-                        <p>欠款总额</p>
-                        <h2>¥ {{order.arrears}}</h2>
-                    </el-col>
-                    <el-col :span="6">
-                        <p>折后总额</p>
-                        <h2>¥ {{order.zkTotal}}</h2>
-                    </el-col>
-                    <el-col :span="6">
-                        <p>订单总额</p>
-                        <h2>¥ {{order.total}}</h2>
-                    </el-col>
+            <el-row style="padding: 10px; border-bottom: #E4E7ED 1px solid;">
+                <el-col :span="24">
+                    <el-row>
+                        <el-col :span="6" style="text-align: right;">
+                            <label>总金额</label>
+                            <label>整单折扣</label>
+                            <label style="font-size: 14px;">应收金额</label>
+                            <label>欠款</label>
+                            <label>已还</label>
+                            <label v-if="order.refund != 0">退款</label>
+                        </el-col>
+                        <el-col :span="14" style="text-align: right;">
+                            <label>¥ {{order.total}}</label>
+                            <label>¥ {{(order.zkTotal - order.total).toFixed(2)}}</label>
+                            <label>¥ {{order.zkTotal}}</label>
+                            <label>¥ {{order.arrears}}</label>
+                            <label>¥ {{order.repay}}</label>
+                            <label v-if="order.refund != 0">¥ {{order.refund}}</label>
+                        </el-col>
+                    </el-row>
                 </el-col>
             </el-row>
-        </el-header>
-        <el-main style="background-color: white; margin: 15px; padding: 20px 30px;">
+            <el-row style="padding: 10px; border-bottom: #E4E7ED 1px solid;">
+                <el-col :span="24">
+                    <el-row>
+                        <h3>收款明细</h3>
+                    </el-row>
+                    <el-row>
+                        <el-col :span="6" style="text-align: right;">
+                            <label v-for="(item, index) in payMethodItems">{{item.payMethod}}</label>
+                        </el-col>
+                        <el-col :span="14" style="text-align: right;">
+                            <label v-for="(item, index) in payMethodItems">¥ {{item.amount}}</label>
+                        </el-col>
+                    </el-row>
+                </el-col>
+            </el-row>
+            <el-row type="flex" justify="center" style="margin: 20px;">
+                <el-button size="medium" type="primary">打印</el-button>
+            </el-row>
+        </el-aside>
+        <el-main style="background-color: white; margin-right: 15px; margin-left: 15px; padding: 20px 30px;">
             <el-tabs v-model="activeName" @tab-click="handleClick">
-                <el-tab-pane label="商品" name="goods">
-                    <el-table :data="orderData"
+                <el-tab-pane label="订单明细" name="first">
+                    <el-row>
+                        <el-button size="mini" type="primary" @click="openPayMoneyDialog" v-if="isRefund">提交退款</el-button>
+                        <el-button size="mini" type="danger" @click="isRefund = false" v-if="isRefund">取消</el-button>
+                        <el-button size="mini" type="primary" @click="isRefund = true" v-if="order.statu == '已付款' && !isRefund">退款</el-button>
+                    </el-row>
+                    <el-row v-show="!isRefund">
+                        <el-table
+                                :data="orderItems"
+                                style="width: 100%">
+                            <el-table-column
+                                    type="index"
+                                    width="50">
+                            </el-table-column>
+                            <el-table-column
+                                    prop="shoppingGoods.code"
+                                    label="产品编号"
+                                    width="100">
+                            </el-table-column>
+                            <el-table-column
+                                    prop="shoppingGoods.name"
+                                    label="产品名称"
+                                    width="280">
+                            </el-table-column>
+                            <el-table-column
+                                    prop="shoppingGoods.goodType"
+                                    label="产品类型">
+                            </el-table-column>
+                            <el-table-column
+                                    prop="price"
+                                    label="单价">
+                            </el-table-column>
+                            <el-table-column
+                                    prop="count"
+                                    label="数量">
+                            </el-table-column>
+                            <el-table-column
+                                    prop="zkPrice"
+                                    label="折扣单价">
+                            </el-table-column>
+                            <el-table-column  label="小计" :formatter="calOrderTotalFormatter">
+                            </el-table-column>
+                        </el-table>
+                    </el-row>
+                    <el-row v-show="isRefund">
+                        <el-table
+                                :data="orderItems"
+                                style="width: 100%">
+                            <el-table-column
+                                    type="index"
+                                    width="50">
+                            </el-table-column>
+                            <el-table-column
+                                    prop="shoppingGoods.code"
+                                    label="产品编号"
+                                    width="100">
+                            </el-table-column>
+                            <el-table-column
+                                    prop="shoppingGoods.name"
+                                    label="产品名称"
+                                    width="280">
+                            </el-table-column>
+                            <el-table-column
+                                    prop="shoppingGoods.goodType"
+                                    label="产品类型">
+                            </el-table-column>
+                            <el-table-column
+                                    prop="zkPrice"
+                                    label="单价">
+                            </el-table-column>
+                            <el-table-column
+                                    prop="count"
+                                    label="可退数量">
+                            </el-table-column>
+                            <el-table-column label="退款单价">
+                                <template slot-scope="scope">
+                                    <el-input v-model="scope.row.refundPrice" v-if="scope.row.count > 0"></el-input>
+                                </template>
+                            </el-table-column>
+                            <el-table-column label="退款数量">
+                                <template slot-scope="scope">
+                                    <el-input v-model.number="scope.row.refundCount" v-if="scope.row.count > 0"></el-input>
+                                </template>
+                            </el-table-column>
+                            <el-table-column label="是否退库存" align="center">
+                                <template slot-scope="scope">
+                                    <el-checkbox v-model="scope.row.returnStore" v-if="scope.row.type == '家居产品' && scope.row.count > 0"></el-checkbox>
+                                </template>
+                            </el-table-column>
+                        </el-table>
+
+                        <el-checkbox v-model="isReturnAchieve">退业绩</el-checkbox>
+
+                        <el-row v-if="isReturnAchieve">
+                            <el-table
+                                    :data="achieveItems"
+                                    style="width: 100%">
+                                <el-table-column
+                                        type="index"
+                                        width="50">
+                                </el-table-column>
+                                <el-table-column
+                                        prop="goodsNo"
+                                        label="产品编号"
+                                        width="100">
+                                </el-table-column>
+                                <el-table-column
+                                        prop="goodsName"
+                                        label="产品名称"
+                                        width="200">
+                                </el-table-column>
+                                <el-table-column
+                                        prop="zkTotal"
+                                        label="收款">
+                                </el-table-column>
+                                <el-table-column
+                                        prop="t3"
+                                        label="业绩类型">
+                                </el-table-column>
+                                <el-table-column
+                                        prop="t1"
+                                        label="原业绩">
+                                </el-table-column>
+                                <el-table-column
+                                        prop="projPercentage"
+                                        label="原提成">
+                                </el-table-column>
+                                <el-table-column label="业绩">
+                                    <template slot-scope="scope">
+                                        <el-input v-model="scope.row.returnAchieve" v-if="scope.row.zkTotal != 0"></el-input>
+                                    </template>
+                                </el-table-column>
+                                <el-table-column label="提成">
+                                    <template slot-scope="scope">
+                                        <el-input v-model="scope.row.returnCommission" v-if="scope.row.zkTotal != 0"></el-input>
+                                    </template>
+                                </el-table-column>
+                                <el-table-column
+                                        label="员工" prop="meiliao">
+                                </el-table-column>
+                            </el-table>
+                        </el-row>
+                    </el-row>
+                </el-tab-pane>
+                <el-tab-pane label="业绩设置" name="second">
+                    <el-row>
+                        <el-button size="mini" type="primary" @click="saveAchieve" v-if="order.statu == '已付款'">保存</el-button>
+                    </el-row>
+                    <el-table
+                            :data="achieveItems"
                             style="width: 100%">
                         <el-table-column
-                                prop="shoppingGoods.name"
-                                label="商品名称"
-                                width="300">
+                                type="index"
+                                width="50">
                         </el-table-column>
                         <el-table-column
-                                prop="price"
-                                label="单价"
-                                width="80">
+                                prop="goodsNo"
+                                label="产品编号"
+                                width="180">
                         </el-table-column>
                         <el-table-column
-                                prop="count"
-                                label="购买数量">
+                                prop="goodsName"
+                                label="产品名称"
+                                width="180">
                         </el-table-column>
                         <el-table-column
-                                prop="zkPrice"
-                                label="折后金额">
+                                prop="zkTotal"
+                                label="收款">
                         </el-table-column>
                         <el-table-column
-                                prop="cardPay"
-                                label="卡付款">
+                                prop="t3"
+                                label="业绩类型">
+                            <template slot-scope="scope">
+                                <el-select v-model="scope.row.t3" placeholder="请选择业绩类型">
+                                    <el-option
+                                            v-for="item in achieveTypeList"
+                                            :key="item.key"
+                                            :label="item.value"
+                                            :value="item.key">
+                                    </el-option>
+                                </el-select>
+                            </template>
                         </el-table-column>
                         <el-table-column
-                                prop="cashPay"
-                                label="现金付款">
+                                prop="achieve"
+                                label="业绩">
+                            <template slot-scope="scope">
+                                <el-input v-model="scope.row.t1"></el-input>
+                            </template>
                         </el-table-column>
                         <el-table-column
-                                prop="arrears"
-                                label="欠款">
+                                prop="projPercentage"
+                                label="提成">
+                            <template slot-scope="scope">
+                                <el-input v-model="scope.row.projPercentage"></el-input>
+                            </template>
+                        </el-table-column>
+                        <el-table-column
+                                label="员工">
+                            <template slot-scope="scope">
+                                <el-select v-model="scope.row.beaultId" placeholder="请选择员工">
+                                    <el-option
+                                            v-for="item in userList"
+                                            :key="item.suId"
+                                            :label="item.suName"
+                                            :value="item.suId">
+                                    </el-option>
+                                </el-select>
+                            </template>
+                        </el-table-column>
+                        <el-table-column label="操作">
+                            <template slot-scope="scope">
+                                <el-button type="primary" v-if="scope.row.isShare"
+                                           size="mini"
+                                           @click="delAchieve(scope.$index, scope.row)">删除
+                                </el-button>
+                                <el-tooltip content="分享业绩" placement="top">
+                                    <el-button @click="shareAchieve(scope.$index, scope.row)" icon="el-icon-share"
+                                               size="mini" type="primary"></el-button>
+                                </el-tooltip>
+                            </template>
                         </el-table-column>
                     </el-table>
                 </el-tab-pane>
-                <el-tab-pane label="业绩" name="yj">业绩</el-tab-pane>
+                <el-tab-pane label="交易流水" name="third">
+                    <el-table
+                            :data="flowItems"
+                            style="width: 100%">
+                        <el-table-column
+                                type="index"
+                                width="50">
+                        </el-table-column>
+                        <el-table-column
+                                prop="orderNo"
+                                label="订单号"
+                                width="180">
+                        </el-table-column>
+                        <el-table-column
+                                prop="flowContent"
+                                label="交易内容"
+                                width="300">
+                        </el-table-column>
+                        <el-table-column
+                                prop="flowType"
+                                label="交易类型">
+                        </el-table-column>
+                        <el-table-column
+                                prop="amount"
+                                label="交易金额">
+                        </el-table-column>
+                        <el-table-column
+                                prop="payMethod"
+                                label="支付方式">
+                        </el-table-column>
+                        <el-table-column
+                                prop="flowNo"
+                                label="流水号">
+                        </el-table-column>
+                    </el-table>
+                </el-tab-pane>
             </el-tabs>
         </el-main>
     </el-container>
+
+    <el-dialog title="退款" :visible.sync="dialogSettleVisible">
+        <el-row type="flex" align="middle" style="padding: 0 0 10px 0;">
+            <el-col :span="5" style="text-align: center;">退款金额</el-col>
+            <el-col :span="10" style="text-align: center; line-height: 50px;"><span style="color: red; font-size: 20px;">¥ {{refundMoney}}</span></el-col>
+        </el-row>
+
+        <el-row type="flex" align="middle" style="padding: 10px 0;">
+            <el-col :span="5" style="text-align: center;">退款方式</el-col>
+            <el-col class="paymethod" :span="18">
+                <el-row>
+                    <ul>
+                        <span v-for="(item, index) in payMethods">
+                            <el-popover
+                                    :disabled="item.type != '储值卡'"
+                                    placement="bottom"
+                                    trigger="hover"
+                                    @hide="popoverHide(item)">
+                                <el-row style="text-align: center;"><span style="padding: 0 0 10px 0; display: block; font-size: 12px;">选择储值卡支付方式</span></el-row>
+                                <el-tree :data="moneyCards"
+                                         show-checkbox
+                                         default-expand-all
+                                         node-key="id"
+                                         ref="tree"
+                                         check-strictly
+                                         highlight-current
+                                         @check="(click, checked,$item)=>{handleCheckChange(click, checked,$item)}"
+                                         :props="defaultProps">
+                                </el-tree>
+                                <li :class="{active : item.isActive}" slot="reference" @click="payMethodSelect(item, index)"><div style=" height:30px; line-height: 30px; display: flex; align-items: center"><img style="width: 25px; height: 25px; align-items: center;" :src="item.img"><span style="margin-left: 5px;">{{item.value}}</span></div></li>
+                            </el-popover>
+                        </span>
+                    </ul>
+                </el-row>
+            </el-col>
+        </el-row>
+
+        <el-row type="flex" align="middle" style="padding: 10px 0 50px 0;">
+            <el-col :span="5" style="text-align: center;">退款方式</el-col>
+            <el-col :span="15">
+                <el-row style="line-height: 50px;" v-for="(item, index) in payMoneys">
+                    <el-col :span="6" style="text-align: right; padding-right: 10px; font-size: 12px;">{{item.value}}</el-col>
+                    <el-col :span="8"><el-input v-model="item.money"></el-input></el-col>
+                    <el-col :span="6" style="margin-left: 10px;" v-if="item.type == '储值卡'">{{item.isGift == 1 ? '赠送余额' : '余额' }}:<span class="arrears">¥ {{item.balance}}</span></el-col>
+                </el-row>
+            </el-col>
+        </el-row>
+
+<!--        <el-row style="text-align: center; margin: 20px 0 10px 0">-->
+<!--            <el-checkbox v-model="printPaper">打印小票</el-checkbox>-->
+<!--        </el-row>-->
+
+        <el-row style="text-align: center; margin: 10px 0 0 0">
+            <el-button type="primary" @click="confirmSubmit">确认收款</el-button>
+        </el-row>
+    </el-dialog>
 </div>
 </body>
 
+<script type="text/javascript" th:src="@{/js/plugin/jquery-2.1.4.min.js}"></script>
+<script type="text/javascript" th:src="@{/js/plugin/jquery.query.js}"></script>
+<script type="text/javascript" th:src="@{/js/systools/MJsBase.js}"></script>
 <script type="text/javascript" th:src="@{/js/plugin/LodopFuncs.js}"></script>
 <script type="text/javascript" th:src="@{/js/systools/AjaxProxyVue.js}"></script>
 <script type="text/javascript" th:src="@{/js/plugin/vue.js}"></script>
 <script type="text/javascript" th:src="@{/plugin/element-ui/index.js}"></script>
-<script type="text/javascript" th:src="@{/js/systools/MJsBase.js}"></script>
 <script type="text/javascript"  th:inline="javascript">
     //<![CDATA[
     var app = new Vue({
         el : "#app",
         data : {
-            activeName : "goods",
+            orderParam : "",
+            vipInfo : "",
             order : "",
-            orderItems : "",
-            cards : "",
-            orderData : []
+            activeName : "first",
+            circleUrl : "https://cube.elemecdn.com/0/88/03b0d39583f48206768a7534e55bcpng.png",
+            userList : [],
+            achieveTypeList : [
+                {
+                    "key" : "现金业绩",
+                    "value" : "现金业绩"
+                },{
+                    "key" : "划扣业绩",
+                    "value" : "划扣业绩"
+                },
+            ],
+            orderItems : [],
+            achieveItems : [],
+            flowItems : [],
+            payMethodItems : [],
+            isRefund : false,
+            isReturnAchieve : false,
+            payMethods: [{
+                value: '现金支付',
+                img: '/images/pay/cash.png',
+                isActive: false,
+                type: '现金支付'
+            }, {
+                value: '微信',
+                img: '/images/pay/wechat.png',
+                isActive: false,
+                type: '微信'
+            }, {
+                value: '支付宝',
+                img: '/images/pay/zhifubao.png',
+                isActive: false,
+                type: '支付宝'
+            }, {
+                value: '银行卡',
+                img: '/images/pay/yinlian.png',
+                isActive: false,
+                type: '银行卡'
+            }, {
+                value: '团购',
+                img: '/images/pay/tuan.png',
+                isActive: false,
+                type: '团购'
+            }, {
+                value: '储值卡',
+                img: '/images/pay/card.png',
+                isActive: false,
+                type: '储值卡'
+            }, ],
+
+            dialogSettleVisible : false,
+            moneyCards: [],
+            defaultProps: {
+                children: 'children',
+                label: 'showLable'
+            },
+            treeSelect : [],
+            payMoneys : [],
+            printPaper : true,
+            refundMoney : 0,
+            data : {},
+
         },
         created : function() {
-            this.order = /*[[${order}]]*/
-            this.orderItems = /*[[${orderItems}]]*/
-            this.cards = /*[[${cards}]]*/
+            let _this = this;
+            this.orderParam = /*[[${orderParam}]]*/
+            this.queryOrderDetailData(this.orderParam);
 
-            this.orderData = this.order.items;
         },
         methods : {
-            handleClick(tab, event) {
+            queryOrderDetailData(param) {
+                let _this = this;
+                AjaxProxy.requst({
+                    app: _this,
+                    data: {id: param, orderNo:param},
+                    contentType: 'application/x-www-form-urlencoded',
+                    url: basePath + '/admin/order/findOrderDetailByIdOrNo',
+                    callback: function (data) {
+                        console.log(data);
+                        var mapInfo = data.mapInfo;
+                        _this.vipInfo = mapInfo.vipInfo;
+                        _this.order = mapInfo.order;
+                        _this.orderItems = mapInfo.orderItems;
+                        _this.payMethodItems = mapInfo.payMethods;
+                        _this.achieveItems = mapInfo.achieveList;
+
+                        _this.flowItems = _this.order.flows;
+
+                        _this.checkAchieveIsDel(_this.achieveItems);
+                        _this.order.orderTime = moment(_this.order.orderTime).format("YYYY-MM-DD HH:mm");
+
+                        var arrears = 0;
+                        var refund = 0;
+                        var repay = 0;
+                        for(var i = 0; i < _this.flowItems.length; i++) {
+                            var item = _this.flowItems[i];
+                            if (item.payMethod === '欠款') {
+                                arrears += item.amount;
+                            }
+
+                            if (item.flowType === '还款') {
+                                repay += item.amount;
+                            }
+
+                            if (item.flowType === '退款') {
+                                refund += item.amount;
+                            }
+                        }
+                        _this.order.arrears = arrears;
+                        _this.order.refund = refund;
+                        _this.order.repay = repay;
+
+                        //获取用户列表
+                        AjaxProxy.requst({
+                            app: _this,
+                            url: basePath + '/admin/shopAll',
+                            callback: function (data) {
+                                _this.userList = data.rows;
+                            }
+                        });
+                        _this.getVipMoneyCards();
+                    }
+                });
+            },
+            confirmSubmit() {
+                let _this = this;
+                _this.data.oldOrderId = _this.order.id;
+                _this.data.vipId = _this.vipInfo.id;
+
+                if(!_this.payMethodFlow()) {
+                    return;
+                }
+
+                let orderItems = _this.orderItems;
+                let dataItems = [];
+                for(var i = 0; i < orderItems.length; i++) {
+                    let item = orderItems[i];
+                    if (item.refundPrice && item.refundCount) {
+                        let achieveList = []
+                        if (_this.isReturnAchieve) {
+                            for(var j = 0; j < _this.achieveItems.length; j++) {
+                                let achieveItem = _this.achieveItems[j];
+                                if (achieveItem.returnAchieve || achieveItem.returnCommission) {
+                                    achieveItem.t1 = achieveItem.returnAchieve ?  achieveItem.returnAchieve : 0;
+                                    achieveItem.projPercentage = achieveItem.returnCommission ? achieveItem.returnCommission : 0;
+                                    achieveList.push(achieveItem);
+                                }
+                            }
+
+                            item.achaeveList = achieveList;
+                        }
+                        if (item.returnStore) {
+                            item.isReturnStore = 'Y';
+                        } else {
+                            item.isReturnStore = 'N';
+                        }
+
+                        item.preCount = item.count;
+                        item.count = item.refundCount;
+                        item.zkPrice = item.refundPrice;
+                        item.cashPay = 0;
+                        item.cardPay = 0;
+                        item.oldItemId = item.id;
+                        dataItems.push(item);
+                    }
+                }
+
+                _this.data.items = dataItems;
+                AjaxProxy.requst({
+                    app: _this,
+                    data: _this.data,
+                    contentType: 'application/json',
+                    url: basePath + '/admin/order/refundOrder',
+                    callback: function (data) {
+                        _this.isRefund = false;
+                        _this.dialogSettleVisible = false;
+                        _this.queryOrderDetailData(_this.data.oldOrderId);
+                    }
+                });
+
+            },
+            payMethodFlow() {
+                let _this = this;
+                if (_this.payMoneys.length > 0) {
+                    let flows = []
+                    var total = 0;
+                    _this.payMoneys.forEach(item => {
+                        let flow = {};
+                        flow.payMethod = item.type;
+                        if (!item.money) {
+                            this.$message.warning("请输入" + item.type + "的付款金额");
+                            return false;
+                        }
+                        flow.amount = parseFloat(item.money);
+                        if (item.type == '储值卡'){
+                            flow.isGift = item.isGift;
+                            flow.cardId = item.id;
+                        }
+                        total += parseFloat(item.money);
+                        flows.push(flow)
+                    })
+                    if (total != _this.refundMoney) {
+                        this.$message.warning("输入付款总金额与应付金额不符");
+                        return false;
+                    }
+
+                    if(_this.order.zkTotal - _this.order.refund - _this.order.arrears < total) {
+                        this.$message.warning("退款金额不能超过收取金额");
+                        return false;
+                    }
+                    _this.data.flows = flows;
+                    return true;
+                } else {
+                    this.$message.warning("请选择支付方式");
+                    return false;
+                }
+            },
+            openPayMoneyDialog() {
+                let _this = this;
+                let items = this.orderItems;
+                _this.refundMoney = 0;
+
+                for(var i = 0; i < items.length; i++) {
+                    let item = items[i]
+                    if (item.refundPrice && item.refundCount) {
+                        if (!item.refundPrice > 0 && !item.refundCount > 0) {
+                            _this.$message.error("退款金额或退款数量须大于0");
+                            return;
+                        }
+
+                        if (item.refundCount > item.count) {
+                            _this.$message.error("输入正确的退款数量");
+                            return;
+                        }
+
+                        _this.refundMoney += parseFloat(item.refundPrice * item.refundCount);
+                    }
+                }
+
+                if (_this.refundMoney == 0) {
+                    _this.$message.error("请输入退款金额或退款数量");
+                    return;
+                }
+                _this.dialogSettleVisible = true;
+            },
+            calOrderTotalFormatter(row, column) {
+                return row.count * row.price;
+            },
+            getVipMoneyCards() {
+                let _this = this;
+                if (_this.order.vipId) {
+                    AjaxProxy.requst({
+                        app: _this,
+                        data: {vipId: _this.order.vipId},
+                        contentType: 'application/x-www-form-urlencoded',
+                        url: basePath + '/admin/moneyCardUse/getUseMoneyCard',
+                        callback: function (data) {
+                            if (data.rows.length > 0) {
+                                data.rows.forEach(function (item, index, input) {
+                                    item.showLable = item.cardName + "-余额:" + (item.realMoney)
+                                    item.uuid = MTools.uuid();
+                                    if (item.giftMoney != 0) {
+                                        var children = [];
+                                        var gift = {};
+                                        gift.id = item.id;
+                                        gift.giftMoney = item.giftMoney;
+                                        gift.showLable = item.cardName + '-赠送金额' + item.giftMoney;
+                                        gift.cardName = item.cardName;
+                                        gift.isGift = 1;
+                                        gift.uuid = MTools.uuid();
+                                        children.push(gift);
+                                        item.children = children;
+                                    }
+                                });
+                                _this.moneyCards = data.rows;
+                            }
+                        }
+                    });
+                }
+            },
+            payMethodSelect(item, index) {
+                let _this = this;
+                let payMoneys = _this.payMoneys;
+                if (item.type != '储值卡') {
+                    this.$nextTick(function () {
+                        if (item.isActive) {
+                            Vue.set(item,'isActive',false);
+                            var index = -1;
+                            for (var i = 0; i < payMoneys.length; i++) {
+                                let payMoney = payMoneys[i];
+                                if (payMoney.value == item.value) {
+                                    index = i;
+                                    break;
+                                }
+                            }
+
+                            if (index > -1) {
+                                _this.payMoneys.splice(index, 1)
+                            }
+                        } else {
+                            Vue.set(item,'isActive',true);
+                            var hasAmount = 0;
+                            for(var i = 0; i < payMoneys.length; i++) {
+                                hasAmount += parseFloat(payMoneys[i].money);
+                            }
+                            if (_this.refundMoney - hasAmount > 0) {
+                                Vue.set(item, 'money', _this.refundMoney - hasAmount);
+                            }
+                            _this.payMoneys.push(item);
+                        }
+                    });
+                }
+            },
+            popoverHide(item) {
+                if(this.treeSelect.length <= 0) {
+                    Vue.set(item, 'isActive', false)
+                } else {
+                    Vue.set(item, 'isActive', true)
+                }
+            },
+            handleCheckChange(clickNode, checked) {
+                let _this = this;
+
+                let nodes = checked.checkedNodes;
+                _this.treeSelect = nodes;
+                var index = -1;
+                // 判断点击节点是否在已展示支付方式中
+                for(var i = 0; i < _this.payMoneys.length; i++) {
+                    let node = _this.payMoneys[i];
+                    if (node.uuid === clickNode.uuid) {
+                        index = i;
+                        break;
+                    }
+                }
+
+                // 若点击节点在选中节点中,且已展示支付方式不存在,则添加
+                if (nodes.indexOf(clickNode) > -1 && index === -1) {
+                    var node = clickNode;
+                    var item = {};
+                    if (node.isGift) {
+                        item.value = node.cardName;
+                        item.balance = node.giftMoney;
+                        item.isGift = 'Y';
+                    } else {
+                        item.value = node.cardName;
+                        item.balance = node.realMoney;
+                        item.isGift = 'N';
+                    }
+                    item.type = '储值卡';
+                    item.id = node.id;
+                    item.uuid = clickNode.uuid;
+                    _this.payMoneys.push(item);
+                }
+
+                // 若点击节点不存在选中节点中,且已展示支付方式中存在,则移除
+                if (nodes.indexOf(clickNode) === -1 && index > -1) {
+                    _this.payMoneys.splice(index, 1);
+                }
+            },
+            closeFrame() {
+                parent.layer.close(parent.layer.getFrameIndex(window.name));
+            },
+            saveAchieve() {
+                let _this = this;
+                AjaxProxy.requst({
+                    app: _this,
+                    data: _this.achieveItems,
+                    contentType: 'application/json',
+                    url: basePath + '/admin/achieve/add',
+                    callback: function (data) {
+                        _this.$message.success(data.info);
+                    }
+                });
+            },
+            shareAchieve(index, row) {
+                var row2 = JSON.parse(JSON.stringify(row));
+                row2.id = null;
+                row2.isShare = true;
+                this.achieveItems.push(row2);
+            },
+            delAchieve(index, row) {
+                let _this = this;
+                if (row.id) {
+                    AjaxProxy.requst({
+                        app: _this,
+                        url: basePath + '/admin/achieve/del?id=' + row.id,
+                        callback: function (data) {
+                        }
+                    });
+                }
+
+                _this.achieveItems.splice(index, 1);
+            },
+            checkAchieveIsDel(items) {
+                var achieveIds = [];
+                for(var i = 0; i < items.length; i++) {
+                    var item = items[i];
+                    if(achieveIds.indexOf(item.orderItemId) === -1) {
+                        achieveIds.push(item.orderItemId);
+                        item.isShare = false;
+                    } else {
+                        item.isShare = true;
+                    }
+
+                    item.t1 = item.consume + item.cardCash;
+                }
             },
             printf() {
-                var id = 1;
+                var id = this.order.id;
                 layer.open({
                     type: 2,
                     title: "打印服务单",
                     area: ['250px', '550px'],
                     maxmin: true,
-                    content: [basePath + '/admin/redirect/hive/beautySalon/print-service?id=' + id]
+                    content: [basePath + '/admin/redirect/hive/beautySalon/print-order?id=' + id]
                 });
+            },
+            handleClick() {
+
             },
             toBack() {
                 MTools.closeForm();
@@ -154,17 +901,5 @@
         }
     });
     //]]>
-    function print() {
-        var id=$("#orderId").val();
-        layer.open({
-            type: 2,
-            title: "打印订单",
-            area: ['250px', '550px'],
-            maxmin: true,
-            content: [basePath + '/admin/redirect/hive/beautySalon/print-order?id=' + id]
-        });
-    };
-
-
 </script>
 </html>
\ No newline at end of file
diff --git a/zq-erp/src/main/resources/templates/views/admin/hive-erp/order/projService-list.html b/zq-erp/src/main/resources/templates/views/admin/hive-erp/order/projService-list.html
index 72e8f44..8aa79f5 100644
--- a/zq-erp/src/main/resources/templates/views/admin/hive-erp/order/projService-list.html
+++ b/zq-erp/src/main/resources/templates/views/admin/hive-erp/order/projService-list.html
@@ -54,7 +54,7 @@
                 <select class="form-control" name="state" id="state">
                     <option value="">-- 请选择服务状态 --</option>
                     <option value="待预约">待预约</option>
-                    <option value="预约成功待处理">预约成功待处理</option>
+<!--                    <option value="预约成功待处理">预约成功待处理</option>-->
                     <option value="预约失败">预约失败</option>
                     <option value="预约取消">预约取消</option>
                     <option value="需配料">需配料</option>
diff --git a/zq-erp/src/main/resources/templates/views/admin/hive-erp/products/shoppinggoods-list.html b/zq-erp/src/main/resources/templates/views/admin/hive-erp/products/shoppinggoods-list.html
index d5ee48e..15facb0 100644
--- a/zq-erp/src/main/resources/templates/views/admin/hive-erp/products/shoppinggoods-list.html
+++ b/zq-erp/src/main/resources/templates/views/admin/hive-erp/products/shoppinggoods-list.html
@@ -107,18 +107,18 @@
             <tr>
                 <th data-checkbox="true"></th>
                 <th data-formatter="MGrid.indexfn" data-align="center" data-width="30px">序号</th>
-                <th data-field="code">商品编号</th>
-                <th data-field="name">商品名称</th>
-                <th data-field="sealPice">售价/(本金)</th>
+                <th data-field="code"  data-sortable="true">商品编号</th>
+                <th data-field="name"  data-sortable="true">商品名称</th>
+                <th data-field="sealPice" data-sortable="true">售价/(本金)</th>
                 <th data-field="referencePice">参考价/(赠送金额)</th>
-                <th data-field="realSealCount">真实销量</th>
-                <th data-field="staus">状态</th>
-                <th data-field="isPresent">是否赠送</th>
-                <th data-field="goodType">类型</th>
+                <th data-field="realSealCount" data-sortable="true">真实销量</th>
+                <th data-field="staus" data-sortable="true">状态</th>
+                <th data-field="isPresent" data-sortable="true">是否赠送</th>
+                <th data-field="goodType" data-sortable="true" >类型</th>
                 <th data-field="cateName">分类</th>
                 <th data-field="isCourse" data-formatter="getCourse">套餐卡</th>
-                <th  data-field="shopName">所属门店</th>
-                <th data-field="createTime" data-formatter="MGrid.getTime">创建时间</th>
+                <th  data-field="shopName" >所属门店</th>
+                <th data-field="createTime" data-sortable="true" data-formatter="MGrid.getTime">创建时间</th>
             </tr>
             </thead>
         </table>
diff --git a/zq-erp/src/main/resources/templates/views/admin/hive-erp/statistics/daily-sale-list.html b/zq-erp/src/main/resources/templates/views/admin/hive-erp/statistics/daily-sale-list.html
new file mode 100644
index 0000000..e738a10
--- /dev/null
+++ b/zq-erp/src/main/resources/templates/views/admin/hive-erp/statistics/daily-sale-list.html
@@ -0,0 +1,157 @@
+
+<!DOCTYPE HTML>
+<html xmlns:th="http://www.thymeleaf.org" xmlns:matrix="http://www.w3.org/1999/xhtml">
+<head>
+<meta charset="utf-8">
+<META HTTP-EQUIV="Pragma" CONTENT="no-cache">
+<meta name="renderer" content="webkit|ie-comp|ie-stand">
+<meta http-equiv="X-UA-Compatible" content="IE=edge,chrome=1">
+<meta name="viewport"
+	content="width=device-width,initial-scale=1,minimum-scale=1.0,maximum-scale=1.0,user-scalable=no" />
+<meta http-equiv="Cache-Control" content="no-siteapp" />
+<LINK rel="Bookmark" href="../images/favicon.ico">
+<!-- 本框架基本脚本和样式 -->
+<script type="text/javascript"
+        th:src="@{/js/plugin/jquery-2.1.4.min.js}"></script>
+<script type="text/javascript" th:src="@{/js/systools/MBase.js}"></script>
+ 
+</head>
+<body class="gray-bg">
+	 
+
+	<div class="ibox-content">
+		<!-- 搜索框部分start -->
+		<form class="form-inline" id="serchform">
+			<div class="form-group mr-20">
+				<label>日期范围</label>
+				<input name="beginTime" type="text" class="form-control datetimepicker" id="beginTime">-
+				<input name="endTime"  type="text" class="form-control datetimepicker" id="endTime">
+			</div>
+
+			<div class="form-group mr-20">
+				<label>门店</label>
+				<select class="form-control autoFull" data-filed="shopName" name="shopId" id="shopId"
+						th:data-url="@{/admin/shopInfo/findShops}">
+					<option value=''>--请选择部所属门店--</option>
+				</select>
+			</div>
+
+			<div class="row mb-10">
+				<div class="col-sm-8">
+					<button  onclick="myGrid.serchData()" type="button" class="btn btn-info btn-sm"><i class="fa fa-search" ></i> 搜索</button>
+					<button  type="reset"   class="btn btn-default btn-sm"><i class="fa fa-refresh " ></i> 重置</button>
+<!--					<button  matrix:btn="ygyjbb-exportExcel"  onclick="exportExcel()" type="button" class="btn btn-default btn-sm"><i class="fa fa-download" ></i> 导出</button>-->
+				</div>
+			</div>
+		</form>
+
+
+		<table id="mgrid">
+			<thead>
+				<tr>
+					<th data-formatter="MGrid.indexfn" data-align="center"
+						data-width="30px">序号</th>
+					<th data-field="dataTime">日期</th>
+					<th data-field="shopName">门店名称</th>
+					<th data-field="shouldPay" data-formatter="shouldPayFormat">应收金额</th>
+					<th data-field="totalPay">实收金额</th>
+					<th data-field="shouldPay" data-formatter="zkAmountFormat">折扣金额</th>
+					<th data-field="perCustomCnt">客单数</th>
+					<th data-field="customGoodsCnt">客品数</th>
+					<th data-field="cost">成本</th>
+					<th data-field="grossProfit">毛利</th>
+					<th data-field="grossProfitRate">毛利率</th>
+					<th data-field="wechat">微信</th>
+					<th data-field="alipay">支付宝</th>
+					<th data-field="cash">现金</th>
+					<th data-field="bankCard">银行卡</th>
+					<th data-field="tuan">团购</th>
+					<th data-field="cardBj">本金收款</th>
+					<th data-field="cardFree">赠金收款</th>
+					<th data-field="arrears">欠款</th>
+				</tr>
+			</thead>
+		</table>
+	</div>
+
+	<script type="text/javascript" th:src="@{/js/systools/MJsBase.js}"></script>
+	<script type="text/javascript" th:src="@{/js/function/public.js}"></script>
+	<script type="text/javascript">
+		var myGrid;
+		var initParam = {
+				format : "yyyy-mm-dd", //默认显示年与日,如果想显示十分秒:"yyyy-mm-dd hh:ii:ss"
+				minView: "month", 	//"month",只显示年月日的选择,不会再跳转去选择时分秒;如果想要选择时分秒的:"hour"
+			}
+		 MTools.ininDatetimepicker(initParam);
+		//限制结束时间不小于开始时间
+		 MTools.limitStartEndTime({});
+
+		$(function() {
+			MTools.autoFullSelect();
+			$(".select2").select2();
+			myGrid = MGrid.initGrid({
+				url : basePath+"/admin/sysBusinessData/findDailySaleData",
+				showExport : true,
+				showFooter : false,
+				height:'auto',
+				width:'auto',
+				exportDataType : "basic", //basic', 'all', 'selected'.
+				exportTypes : [ 'excel', 'xlsx' ], //导出类型
+				exportOptions : {
+					ignoreColumn : [ 0 ],
+					fileName : "客户消费统计" + MTools.getTime(), //文件名称设置
+					worksheetName : 'Sheet1', //表格工作区名称  
+					tableName : '客户消费统计',
+					excelstyles : [ 'background-color', 'color', 'font-size',
+							'font-weight' ],
+				}
+			});
+
+			$('[data-toggle="tooltip"]').tooltip()
+
+		});
+
+		function shouldPayFormat(value, row, index) {
+			return row.shouldPay + row.refund;
+		}
+
+		function zkAmountFormat(value, row, index) {
+			return row.shouldPay + row.refund - row.arrears - row.totalPay;
+		}
+
+		function footCountTitle(data) {
+			return "<b>合计</b>";
+		};
+		function countColumn(data) {
+			if (data) {
+				var resultsumQuantity = parseFloat(data).toFixed(2);//保留有效数字
+				return resultsumQuantity;
+			} else {
+				return "-";
+			}
+		};
+
+		function buildVipNameJump(value, row, index) {
+			return '<a  onClick="vipDetail(\'' + row.t9 +'\')"   class="text-primary " >'+value+'</a>';
+		}
+
+		function vipDetail(value) {
+			layer.full(layer.open({
+				type : 2,
+				title : "订单详情",
+				maxmin : true,
+				area : MUI.SIZE_M,
+				content : [basePath+'/admin/redirect/hive/beautySalon/vip?vipPhone=' + value ]
+			}));
+		}
+
+		function exportExcel(){
+
+			var param=MForm.toUrlParam("#serchform");
+
+			window.location.href=basePath+"/admin/achieve/exportDailyInfoNew?"+param;
+		}
+		
+	</script>
+</body>
+</html>
diff --git a/zq-erp/src/main/resources/templates/views/admin/hive-erp/statistics/jyls.html b/zq-erp/src/main/resources/templates/views/admin/hive-erp/statistics/jyls.html
new file mode 100644
index 0000000..c3b2a39
--- /dev/null
+++ b/zq-erp/src/main/resources/templates/views/admin/hive-erp/statistics/jyls.html
@@ -0,0 +1,332 @@
+<!DOCTYPE HTML>
+<html xmlns:th="http://www.thymeleaf.org" xmlns:matrix="http://www.w3.org/1999/xhtml">
+<head>
+    <meta charset="utf-8">
+    <META HTTP-EQUIV="Pragma" CONTENT="no-cache">
+    <meta name="renderer" content="webkit|ie-comp|ie-stand">
+    <meta http-equiv="X-UA-Compatible" content="IE=edge,chrome=1">
+    <meta name="viewport"
+          content="width=device-width,initial-scale=1,minimum-scale=1.0,maximum-scale=1.0,user-scalable=no"/>
+    <meta http-equiv="Cache-Control" content="no-siteapp"/>
+    <LINK rel="Bookmark" href="../images/favicon.ico">
+    <!-- 本框架基本脚本和样式 -->
+    <script type="text/javascript" th:src="@{/js/systools/MBaseVue.js}"></script>
+    <link rel="stylesheet" th:href="@{/plugin/element-ui/index.css}">
+    <link th:href="@{/css/styleOne/style.min.css}" rel="stylesheet" type="text/css"/>
+    <title></title>
+    <style>
+        .panel-body{
+            overflow: hidden;
+        }
+        .buttonPanel{
+            background: #ffffff;
+            padding: 10px 10px ;
+            margin: 0px 0px 10px 0px;
+        }
+        .rowPanel{
+            background: #ffffff;
+            padding: 0px 10px ;
+            padding-top: 10px;
+            margin: 0px 0px 10px 0px;
+        }
+        .paginationStyle{
+            background: #ffffff;
+            padding: 10px 10px;
+            margin: 0px 0px 10px 0px;
+            text-align: right;
+        }
+    </style>
+</head>
+<body>
+<div class="panel-body" id="app">
+
+    <el-row class="buttonPanel">
+        <el-button @click="exportExcel" type="primary" >导出</el-button>
+    </el-row>
+
+    <el-row class="rowPanel"  >
+        <el-form ref="form" :model="form" inline >
+            <el-form-item label="会员" prop="queryKey">
+                <el-input v-model="form.queryKey" placeholder="请输入会员姓名/手机"></el-input>
+            </el-form-item>
+
+            <el-form-item label="操作人" prop="oprationMan" >
+                <el-input v-model="form.oprationMan"></el-input>
+            </el-form-item>
+
+            <el-form-item label="订单号" prop="orderNo">
+                <el-input v-model="form.orderNo"></el-input>
+            </el-form-item>
+
+            <el-form-item label="交易类型" prop="flowType">
+                <el-select v-model="form.flowType" placeholder="请选择">
+                    <el-option
+                            v-for="item in flowTypeList"
+                            :key="item.value"
+                            :label="item.label"
+                            :value="item.value"
+                            >
+                    </el-option>
+                </el-select>
+            </el-form-item>
+
+            <el-form-item label="支付方式" prop="payMethod">
+                <el-select v-model="form.payMethod" placeholder="请选择">
+                    <el-option
+                            v-for="item in payMethodList"
+                            :key="item.value"
+                            :label="item.label"
+                            :value="item.value">
+                    </el-option>
+                </el-select>
+            </el-form-item>
+
+            <el-form-item label="时间" prop="datetimeArr">
+                <el-date-picker
+                        v-model="form.datetimeArr"
+                        type="daterange"
+                        range-separator="至" format="yyyy-MM-dd HH:mm"
+                        start-placeholder="开始日期"
+                        end-placeholder="结束日期">
+                </el-date-picker>
+            </el-form-item>
+
+            <el-form-item label="交易门店" prop="shopId">
+                <el-select v-model="form.shopId" placeholder="请选择">
+                    <el-option
+                            v-for="item in shopList"
+                            :key="item.shopShortName"
+                            :label="item.shopShortName"
+                            :value="item.id">
+                    </el-option>
+                </el-select>
+            </el-form-item>
+
+
+
+            <el-button type="primary" @click="search" >搜索</el-button>
+            <el-button @click="resetForm('form')">重置</el-button>
+        </el-form>
+    </el-row>
+
+    <el-row class="table-style"  >
+
+        <el-table id="proj" :data="table.rows"  :height="height" stripe @sort-change="sortChange">
+            <el-table-column
+                    prop="orderNo"
+                    label="订单号"
+                    width="180">
+            </el-table-column>
+            <el-table-column
+                    prop="flowContent"
+                    label="交易内容"
+                    show-overflow-tooltip
+                    width="240">
+            </el-table-column>
+            <el-table-column
+                    prop="createTime"
+                    sortable="custom"
+                    label="交易时间"
+                    show-overflow-tooltip
+                    width="180">
+            </el-table-column>
+            <el-table-column
+                    prop="flowType"
+                    sortable="custom"
+                    label="交易类型">
+            </el-table-column>
+            <el-table-column
+                    prop="amount"
+                    sortable="custom"
+                    label="交易金额">
+            </el-table-column>
+            <el-table-column
+                    prop="vipName"
+                    label="会员姓名">
+            </el-table-column>
+            <el-table-column
+                    prop="payMethod"
+                    sortable="custom"
+                    label="支付方式">
+            </el-table-column>
+            <el-table-column
+                    prop="flowNo"
+                    label="支付流水号">
+            </el-table-column>
+            <el-table-column
+                    prop="staffName"
+                    label="操作人">
+            </el-table-column>
+            <el-table-column
+                    prop="shopName"
+                    label="门店名称">
+            </el-table-column>
+            <el-table-column label="操作">
+                <template slot-scope="scope">
+                    <el-button type="text" @click="openOrder(scope.$index, scope.row)" size="small">订单详情</el-button>
+                </template>
+            </el-table-column>
+        </el-table>
+    </el-row>
+    <el-row class="paginationStyle"  >
+        <el-pagination background
+                       @size-change="changePageSize"
+                       @current-change="changeCurrentPage"
+                       :current-page="table.currentPage"
+                       :page-sizes="[10, 20, 30, 50]"
+                       :page-size="table.pageSize"
+                       layout="total, sizes, prev, pager, next, jumper"
+                       :total="table.total">
+        </el-pagination>
+    </el-row>
+
+</div>
+</body>
+<script type="text/javascript" th:src="@{/js/plugin/jquery-2.1.4.min.js}"></script>
+<script type="text/javascript" th:src="@{/js/plugin/jquery.query.js}"></script>
+<script type="text/javascript" th:src="@{/plugin/layer/layer.js}"></script>
+<script type="text/javascript" th:src="@{/js/systools/AjaxProxyVue.js}"></script>
+<script type="text/javascript" th:src="@{/js/plugin/vue.js}"></script>
+<script type="text/javascript" th:src="@{/plugin/element-ui/index.js}"></script>
+<script type="text/javascript" th:src="@{/plugin/moment.min.js}"></script>
+<script type="text/javascript" th:inline="javascript">
+
+    var vue = new Vue({
+        el: '#app',
+        data: {
+            table:{
+                rows:[],
+                total:0,
+                pageSize:10,
+                currentPage:1,
+            },
+            form:{
+                name:null,
+                datetimeArr:'',
+                payMethod:'',
+                flowType:'',
+                orderNo:'',
+                oprationMan:'',
+                queryKey:'',
+                shopId:'',
+            },
+            height:'calc(100vh - 240px)',
+            shopList:[{id:0,shopShortName:'全部'}],
+            flowTypeList:[
+                {value:'',label:'全部'},
+                {value:'购买',label:'购买'},
+                {value:'退款',label:'退款'},
+                {value:'还款',label:'还款'}
+            ],
+            payMethodList:[
+                {value:'',label:'全部'},
+                {value:'现金',label:'现金'},
+                {value:'微信',label:'微信'},
+                {value:'支付宝',label:'支付宝'},
+                {value:'银行卡',label:'银行卡'},
+                {value:'团购',label:'团购'},
+                {value:'储值卡',label:'储值卡'},
+                {value:'欠款',label:'欠款'}
+            ],
+        },
+        created: function () {
+            let _this=this;
+           this.loadData();
+            window.addEventListener("keydown", this.keydown);
+            AjaxProxy.requst({
+                app:_this,
+                url:basePath+"/admin/shopInfo/findAll",
+                callback:function (data) {
+                    data.rows.forEach(shop=>{
+                        _this.shopList.push(shop);
+                    });
+                }
+
+            })
+
+        },
+        methods: {
+            changePageSize(val) {
+                this.table.pageSize = val;
+                this.loadData();
+            },
+            changeCurrentPage(val) {
+                this.table.currentPage = val;
+                this.loadData();
+            },
+            resetForm(formName) {
+                this.$refs[formName].resetFields();
+            },
+            sortChange:function (column){
+                if(column.order){
+                    if(column.order.indexOf("desc")){
+                        this.form.order="desc";
+                    }else{
+                        this.form.order="asc";
+                    }
+                    this.form.sort=column.prop;
+                    this.loadData();
+                }
+            },
+            loadData:function(){
+                let _this = this;
+                let data=_this.getRequestParam();
+                data.limit=_this.table.pageSize;
+                data.offset=_this.table.pageSize*(_this.table.currentPage-1);
+                AjaxProxy.requst({
+                    app: _this,
+                    data:data,
+                    url: basePath + '/admin/orderFlow/findOrderFlow',
+                    callback: function (data) {
+                        _this.table.rows = data.rows;
+                        _this.table.total=data.total;
+                    }
+                });
+            },
+            getRequestParam(){
+                let _this = this;
+                return   {
+                    name:_this.form.name,
+                    payMethod:_this.form.payMethod,
+                    flowType:_this.form.flowType,
+                    orderNo:_this.form.orderNo,
+                    oprationMan:_this.form.oprationMan,
+                    queryKey:_this.form.queryKey,
+                    startTime:_this.form.datetimeArr?moment(_this.form.datetimeArr[0]).format("YYYY-MM-DD HH:mm"):'',
+                    endTime:_this.form.datetimeArr?moment(_this.form.datetimeArr[1]).format("YYYY-MM-DD HH:mm"):'',
+                    shopId:_this.form.shopId,
+                    order:_this.form.order,
+                    sort:_this.form.sort,
+
+                }
+            },
+            search:function(){
+                this.table.currentPage=1;
+                this.loadData();
+            },
+            keydown(evt){
+                if(evt.keyCode==13) {
+                    this.search();
+                }
+            },
+
+            openOrder(index,row){
+                layer.full(layer.open({
+                    type : 2,
+                    title : "订单详情",
+                    maxmin : true,
+                    content : [ basePath + '/admin/order/orderItem?id=' + row.orderId ]
+                }));
+            },
+            //导出
+            exportExcel(){
+                window.location.href=basePath+"/admin/orderFlow/exportOrderFlowExcel?"+MTools.jsonToUrlParam(this.getRequestParam());
+            }
+
+        }
+    });
+
+
+</script>
+</body>
+</html>
\ No newline at end of file
diff --git a/zq-erp/src/main/resources/templates/views/admin/hive-erp/statistics/statistics-moneyCar-item.html b/zq-erp/src/main/resources/templates/views/admin/hive-erp/statistics/statistics-moneyCar-item.html
index 00ee7bc..70e9301 100644
--- a/zq-erp/src/main/resources/templates/views/admin/hive-erp/statistics/statistics-moneyCar-item.html
+++ b/zq-erp/src/main/resources/templates/views/admin/hive-erp/statistics/statistics-moneyCar-item.html
@@ -27,7 +27,7 @@
 			</div>
 
 			<div class="form-group mr-20">
-				<label  >产品名称</label>
+				<label>储值卡名称</label>
 				<input autocomplete="off"   name="projName" type="text" class="form-control" >
 			</div>
 
diff --git a/zq-erp/src/main/resources/templates/views/admin/hive-erp/statistics/statistics-moneyCar-summary.html b/zq-erp/src/main/resources/templates/views/admin/hive-erp/statistics/statistics-moneyCar-summary.html
index 56073ea..2dfa73f 100644
--- a/zq-erp/src/main/resources/templates/views/admin/hive-erp/statistics/statistics-moneyCar-summary.html
+++ b/zq-erp/src/main/resources/templates/views/admin/hive-erp/statistics/statistics-moneyCar-summary.html
@@ -25,30 +25,27 @@
 					<button  onclick="myGrid.resetForm()" type="button"   class="btn btn-default btn-sm"><i class="fa fa-refresh " ></i> 重置</button>
 				</div>
 			</div>
-
 			<div class="form-group mr-20">
-				<label  >产品名称</label>
+				<label>储值卡名称</label>
 				<input autocomplete="off"   name="projName" type="text" class="form-control" >
 			</div>
+<!--			<div class="form-group mr-20">-->
+<!--				<label for="parentId">商品分类</label>-->
+<!--				<select class="form-control select2" size="1" name="cateId" id="parentId">-->
+<!--					<option value="" selected="selected">&#45;&#45;选择分类&#45;&#45;</option>-->
+<!--				</select>-->
+<!--			</div>-->
 
-			<div class="form-group mr-20">
-				<label for="parentId">商品分类</label>
-				<select class="form-control select2" size="1" name="cateId" id="parentId">
-					<option value="" selected="selected">--选择分类--</option>
-				</select>
-			</div>
+<!--			<div class="form-group mr-20">-->
+<!--				<label>会员</label>-->
+<!--				<input autocomplete="off" placeholder="姓名/编号/电话"  name="vipQueryKey" type="text" class="form-control"  >-->
+<!--			</div>-->
 
-			<div class="form-group mr-20">
-				<label>会员</label>
-				<input autocomplete="off" placeholder="姓名/编号/电话"  name="vipQueryKey" type="text" class="form-control"  >
-			</div>
-
-
-			<div class="form-group mr-20">
-				<label>到期时间</label><!--    入库时间的查询增加一个查询的其实时间两个字段 -->
-				<input autocomplete="off"   id="select_begin" name="beginTime" type="text" class="form-control datetimepicker">-
-				<input autocomplete="off"   name="endTime"  type="text" class="form-control datetimepicker" id="select_end">
-			</div>
+<!--			<div class="form-group mr-20">-->
+<!--				<label>到期时间</label>&lt;!&ndash;    入库时间的查询增加一个查询的其实时间两个字段 &ndash;&gt;-->
+<!--				<input autocomplete="off"   id="select_begin" name="beginTime" type="text" class="form-control datetimepicker">- -->
+<!--				<input autocomplete="off"   name="endTime"  type="text" class="form-control datetimepicker" id="select_end">-->
+<!--			</div>-->
 		</form>
 		<div id="option-bar" >
 			<button  matrix:btn="bedListZb-exportExcel"  onclick="exportExcel()" type="button" class="btn btn-default btn-sm"><i class="fa fa-download" ></i> 导出</button>
diff --git a/zq-erp/src/main/resources/templates/views/admin/hive-erp/statistics/statistics-projSercice-item.html b/zq-erp/src/main/resources/templates/views/admin/hive-erp/statistics/statistics-projSercice-item.html
index e34d45c..2238a29 100644
--- a/zq-erp/src/main/resources/templates/views/admin/hive-erp/statistics/statistics-projSercice-item.html
+++ b/zq-erp/src/main/resources/templates/views/admin/hive-erp/statistics/statistics-projSercice-item.html
@@ -36,14 +36,14 @@
 				</select>
 			</div>
 			<div class="form-group mr-20">
-				<label  >产品名称</label>
+				<label>服务名称</label>
 				<input autocomplete="off"   name="projName" type="text" class="form-control" >
 			</div>
 
 			<div class="form-group mr-20">
-				<label for="projTypeId">项目分类</label>
+				<label for="projTypeId">商品分类</label>
 				<select class="form-control select2" size="1" name ="cateId"  id="projTypeId">
-					<option value=''>--选择项目分类--</option>
+					<option value=''>--选择分类--</option>
 				</select>
 			</div>
 
@@ -85,13 +85,15 @@
 				<tr>
 					<th data-formatter="MGrid.indexfn" data-align="center"  data-width="30px" >序号</th>
 					<th data-field="SHOP_NAME" >门店</th>
-					<th data-field="consume_time"  data-formatter="MGrid.getTime"  data-sortable="true"   >服务日期</th>
+					<th data-field="yy_time"  data-formatter="MGrid.getTime"  data-sortable="true"   >预约时间</th>
+					<th data-field="consume_time"  data-formatter="MGrid.getTime"  data-sortable="true"   >划扣时间</th>
 					<th data-field="SERVICE_NO" >服务单号</th>
 					<th data-field="PROJ_NAME" >服务名称</th>
 					<th data-field="TYPE_NAME" >分类</th>
 					<th data-field="VIP_NAME" >客户名</th>
-      			    <th data-field="COUNT"  data-sortable="true"     >次数</th>
-      			    <th data-field="PRICE"  data-sortable="true"       >单价</th>
+      			    <th data-field="COUNT"  data-sortable="true">次数</th>
+      			    <th data-field="PRICE"  data-sortable="true">划扣单价</th>
+      			    <th data-field="extract"  data-sortable="true"  >提成</th>
       			    <th data-field="su_name" >美疗师</th>
       			    <th data-field="SOURCE" >来源</th>
 				</tr>
@@ -115,7 +117,9 @@
 			//有删除权限
 			var delUrl="";
 			myGrid=MGrid.initGrid({
-				 url:basePath+"/admin/serviceStatistics/showList"
+				 url:basePath+"/admin/serviceStatistics/showList",
+				sortName:"yy_time",
+				sortOrder:"desc"
 			 });
 		});
 		
@@ -131,12 +135,13 @@
 
 	function initFunctionList() {
 		$.AjaxProxy({
-			a : false,
-			c : false
-		}).invoke(basePath+"/admin/projtype/all", function(loj) {
+			a: false,
+			c: false,
+			p: {salePlatform: '线下'}
+		}).invoke(basePath + "/admin/shoppinggoodscategory/all", function (loj) {
 			$("#projTypeId").createSelectTree(loj.attr("result").rows, {
-				append : true,
-				value:"typeName"
+				append: true,
+				value: "name",
 			});
 		});
 	}
diff --git a/zq-erp/src/main/resources/templates/views/admin/hive-erp/statistics/statistics-projSercice-sumary.html b/zq-erp/src/main/resources/templates/views/admin/hive-erp/statistics/statistics-projSercice-sumary.html
index 3262674..ca2c7ac 100644
--- a/zq-erp/src/main/resources/templates/views/admin/hive-erp/statistics/statistics-projSercice-sumary.html
+++ b/zq-erp/src/main/resources/templates/views/admin/hive-erp/statistics/statistics-projSercice-sumary.html
@@ -26,7 +26,7 @@
 				</div>
 			</div>
 			<div class="form-group mr-20">
-				<label  >订单状态</label>
+				<label>订单状态</label>
 				<select class="form-control " name="state"  >
 					<option value=''>--请选择订单状态--</option>
 					<option value='待预约'>待预约</option>
@@ -36,14 +36,14 @@
 				</select>
 			</div>
 			<div class="form-group mr-20">
-				<label  >产品名称</label>
+				<label>商品名称</label>
 				<input autocomplete="off"   name="projName" type="text" class="form-control" >
 			</div>
 
 			<div class="form-group mr-20">
-				<label for="projTypeId">项目分类</label>
+				<label for="projTypeId">商品分类</label>
 				<select class="form-control select2" size="1" name ="cateId"  id="projTypeId">
-					<option value=''>--选择项目分类--</option>
+					<option value=''>--选择分类--</option>
 				</select>
 			</div>
 
@@ -112,12 +112,13 @@
 
 	function initFunctionList() {
 		$.AjaxProxy({
-			a : false,
-			c : false
-		}).invoke(basePath+"/admin/projtype/all", function(loj) {
+			a: false,
+			c: false,
+			p: {salePlatform: '线下'}
+		}).invoke(basePath + "/admin/shoppinggoodscategory/all", function (loj) {
 			$("#projTypeId").createSelectTree(loj.attr("result").rows, {
-				append : true,
-				value:"typeName"
+				append: true,
+				value: "name",
 			});
 		});
 	}
diff --git a/zq-erp/src/main/resources/templates/views/admin/hive-erp/statistics/statistics-projuse-item.html b/zq-erp/src/main/resources/templates/views/admin/hive-erp/statistics/statistics-projuse-item.html
index e54f7ea..23a55cd 100644
--- a/zq-erp/src/main/resources/templates/views/admin/hive-erp/statistics/statistics-projuse-item.html
+++ b/zq-erp/src/main/resources/templates/views/admin/hive-erp/statistics/statistics-projuse-item.html
@@ -27,14 +27,14 @@
 			</div>
 
 			<div class="form-group mr-20">
-				<label  >产品名称</label>
+				<label>服务名称</label>
 				<input autocomplete="off"   name="projName" type="text" class="form-control" >
 			</div>
 
 			<div class="form-group mr-20">
-				<label for="projTypeId">项目分类</label>
+				<label for="projTypeId">商品分类</label>
 				<select class="form-control select2" size="1" name ="cateId"  id="projTypeId">
-					<option value=''>--选择项目分类--</option>
+					<option value=''>--选择分类--</option>
 				</select>
 			</div>
 
@@ -117,12 +117,13 @@
 
 	function initFunctionList() {
 		$.AjaxProxy({
-			a : false,
-			c : false
-		}).invoke(basePath+"/admin/projtype/all", function(loj) {
+			a: false,
+			c: false,
+			p: {salePlatform: '线下'}
+		}).invoke(basePath + "/admin/shoppinggoodscategory/all", function (loj) {
 			$("#projTypeId").createSelectTree(loj.attr("result").rows, {
-				append : true,
-				value:"typeName"
+				append: true,
+				value: "name",
 			});
 		});
 	}
diff --git a/zq-erp/src/main/resources/templates/views/admin/hive-erp/statistics/statistics-projuse-sumary.html b/zq-erp/src/main/resources/templates/views/admin/hive-erp/statistics/statistics-projuse-sumary.html
index afd83fd..018f767 100644
--- a/zq-erp/src/main/resources/templates/views/admin/hive-erp/statistics/statistics-projuse-sumary.html
+++ b/zq-erp/src/main/resources/templates/views/admin/hive-erp/statistics/statistics-projuse-sumary.html
@@ -25,13 +25,13 @@
 				</div>
 			</div>
 			<div class="form-group mr-20">
-				<label>产品名称</label>
+				<label>服务名称</label>
 				<input autocomplete="off"   name="projName" type="text" class="form-control" >
 			</div>
 			<div class="form-group mr-20">
-				<label for="projTypeId">项目分类</label>
+				<label for="projTypeId">商品分类</label>
 				<select class="form-control select2" size="1" name ="cateId"  id="projTypeId">
-					<option value=''>--选择项目分类--</option>
+					<option value=''>--选择分类--</option>
 				</select>
 			</div>
 		</form>
@@ -86,12 +86,13 @@
 
 	function initFunctionList() {
 		$.AjaxProxy({
-			a : false,
-			c : false
-		}).invoke(basePath+"/admin/projtype/all", function(loj) {
+			a: false,
+			c: false,
+			p: {salePlatform: '线下'}
+		}).invoke(basePath + "/admin/shoppinggoodscategory/all", function (loj) {
 			$("#projTypeId").createSelectTree(loj.attr("result").rows, {
-				append : true,
-				value:"typeName"
+				append: true,
+				value: "name",
 			});
 		});
 	}
diff --git a/zq-erp/src/main/resources/templates/views/admin/hive-erp/store/store-list.html b/zq-erp/src/main/resources/templates/views/admin/hive-erp/store/store-list.html
index b906aa3..4b0e032 100644
--- a/zq-erp/src/main/resources/templates/views/admin/hive-erp/store/store-list.html
+++ b/zq-erp/src/main/resources/templates/views/admin/hive-erp/store/store-list.html
@@ -186,7 +186,7 @@
             alarmNum = row.alarmNum;
         }
         var storeNum = parseInt(value);
-        if (alarmNum >= storeNum) {
+        if (alarmNum > storeNum) {
             html = '<span class="label-danger" >&nbsp;&nbsp;' + value
                 + '&nbsp;&nbsp;</span>';
         } else {
diff --git a/zq-erp/src/main/resources/templates/views/admin/hive-erp/vip/vipInfo-list.html b/zq-erp/src/main/resources/templates/views/admin/hive-erp/vip/vipInfo-list.html
index 0354078..53fea6a 100644
--- a/zq-erp/src/main/resources/templates/views/admin/hive-erp/vip/vipInfo-list.html
+++ b/zq-erp/src/main/resources/templates/views/admin/hive-erp/vip/vipInfo-list.html
@@ -96,7 +96,7 @@
                 </select>
             </div>
             <div class="form-group">
-                <button matrix:btn="mdhyzl-add"  onclick="myGrid.serchData(1)" type="button"
+                <button  onclick="myGrid.serchData(1)" type="button"
                         class="btn btn-sm btn-info">
                     <i class="fa fa-search "></i> 搜索
                 </button>
@@ -115,11 +115,6 @@
                 </button>
                     <button matrix:fn="mdhyzl-gjjl"  onclick="openFollow()" type="button" class="btn btn-info btn-sm"><i class="fa fa-edit" ></i> 跟进记录</button>
                     <button matrix:fn="mdhyzl-khda"  onclick="openArchieves()" type="button" class="btn btn-info btn-sm"><i class="fa fa-edit" ></i> 客户档案</button>
-                    <button matrix:btn="mdhyzl-projTaocan"  onclick="openProj()" type="button" class="btn btn-info btn-sm"><i class="fa fa-cube"></i> 项目管理</button>
-                    <button matrix:btn="mdhyzl-projTaocan"  onclick="openTc()" type="button" class="btn btn-info btn-sm"><i class="fa fa-cubes"></i> 套餐管理</button>
-                    <button matrix:btn="mdhyzl-projTaocan"  onclick="openMoneyCard()" type="button" class="btn btn-info btn-sm"><i class="fa fa-credit-card"></i> 充值卡管理</button>
-                    <button matrix:fn="mdhyzl-xfdd"   onclick="openOrder()" type="button" class="btn btn-info btn-sm"><i class="fa fa-history"></i> 消费订单</button>
-                    <button matrix:fn="mdhyzl-fwd"   onclick="openServiceOrder()" type="button" class="btn btn-info btn-sm"><i class="fa fa-history"></i> 服务单</button>
                     <button matrix:btn="mdhyzl-excelOut"  onclick="exportExcel()" type="button" class="btn btn-info btn-sm"><i class="fa fa-download" ></i> 导出</button>
             </div>
 
@@ -138,6 +133,7 @@
                 <th data-field="arrivalWay">到店途径</th>
                 <th data-field="staffName">健康顾问</th>
                 <th data-field="shopName">所属门店</th>
+                <th data-field="phone" data-formatter="buildOperation">操作</th>
             </tr>
             </thead>
         </table>
@@ -156,7 +152,6 @@
         var delUrl="";
         delUrl=basePath+"/hiveErp/vipInfo/del";
 
-
         myGrid=
             MGrid.initGrid({
                 url : basePath+"/hiveErp/vipInfo/showVipInfoList",
@@ -165,16 +160,7 @@
             });
     });
 
-        function openOrder(){
-            var vipName=myGrid.getSelectItemId("vipName");
-            layer.full(layer.open({
-                type : 2,
-                title : "消费记录",
-                area : [ MUI.SIZE_L, '450px' ],
-                maxmin : true,
-                content : [ basePath+'/admin/redirect/hive/operate/sysOrder-list?vipName=' + vipName ]
-            }));
-        }
+
     /**
      * 构建会员名称
      */
@@ -185,16 +171,7 @@
             return value;
         }
     }
-    function openServiceOrder(){
-        var vipName=myGrid.getSelectItemId("vipName");
-        layer.full(layer.open({
-            type : 2,
-            title : "服务单",
-            area : [ MUI.SIZE_L, '450px' ],
-            maxmin : true,
-            content : [ basePath+'/admin/redirect/hive/store/projService-list?vipName=' + vipName ]
-        }));
-    }
+
 
         function openArchieves(){
             var id=myGrid.getSelectItemId();
@@ -219,66 +196,8 @@
             content : [ basePath+'/admin/serviceRecord/toServicefollowListForZd?id=' + id ]
         });
     }
-    function createDateDictionary() {
-        $(".dds").each(
-            function() {
-                var type = $(this).attr("cc");
-                var _this = $(this);
-                //取服务器请求数据
-                $.AjaxProxy({
-                    p : {
-                        type : type
-                    }
-                })
-                    .invoke(
-                        basePath+"/admin/dds/showDataDictionary",
-                        function(loj) {
-                            var html = '';
-                            console.log(loj.getRowCount());
-                            for (var i = 0; i < loj
-                                .getRowCount(); i++) {
-                                html += '<option value="'
-                                    + loj
-                                        .getString(i,
-                                            "id")
-                                    + '">'
-                                    + loj.getString(i,
-                                        "name")
-                                    + "</option>";
-                            }
-                            _this.html(html);
-                        });
 
-            });
-    }
-        function openTc() {
-            var id=myGrid.getSelectItemId();
-            layer.open({
-                type: 2,
-                title: "会员套餐管理",
-                area: MUI.SIZE_M,
-                content : [ basePath+'/admin/redirect/hive-erp/vip/viptc-list?vipId=' + id]
-            });
-        }
 
-        function openProj() {
-            var id=myGrid.getSelectItemId();
-            layer.open({
-                type: 2,
-                title: "会员项目管理",
-                area: MUI.SIZE_M,
-                content : [ basePath+'/admin/redirect/hive-erp/vip/projUse-list?vipId=' + id]
-            });
-        }
-        function openMoneyCard() {
-            var id=myGrid.getSelectItemId();
-            layer.open({
-                type: 2,
-                title: "会员充值卡管理",
-                area: MUI.SIZE_M,
-                content : [ basePath+'/admin/redirect/hive-erp/vip/moneyCardUse-list?vipId=' + id]
-            });
-        }
 
 
 
@@ -310,6 +229,21 @@
         });
     }
 
+    function buildOperation(value, row, index) {
+        var html = "";
+        html += '<a class="text-info" href="javascript:void(0)" onClick="openVipDetail(\''+row.phone+'\')">查看详情</a>&nbsp;&nbsp;'
+        return html;
+    }
+    function openVipDetail(value) {
+        debugger
+        layer.full(layer.open({
+            type : 2,
+            title : "会员详情",
+            area : [ MUI.SIZE_L, '450px' ],
+            maxmin : true,
+            content : [ basePath+'/admin/redirect/hive/beautySalon/vip?vipPhone=' + value ]
+        }));
+    }
 
 </script>
 
diff --git a/zq-erp/src/main/resources/templates/views/admin/hive/beautySalon/bj-form-bak.html b/zq-erp/src/main/resources/templates/views/admin/hive/beautySalon/bj-form-bak.html
new file mode 100644
index 0000000..8e4fb55
--- /dev/null
+++ b/zq-erp/src/main/resources/templates/views/admin/hive/beautySalon/bj-form-bak.html
@@ -0,0 +1,348 @@
+
+
+
+
+<!DOCTYPE HTML>
+<html xmlns:th="http://www.thymeleaf.org" xmlns:matrix="http://www.w3.org/1999/xhtml">
+<head>
+<meta charset="utf-8">
+<META HTTP-EQUIV="Pragma" CONTENT="no-cache">
+<meta name="renderer" content="webkit|ie-comp|ie-stand">
+<meta http-equiv="X-UA-Compatible" content="IE=edge,chrome=1">
+<meta name="viewport"
+	content="width=device-width,initial-scale=1,minimum-scale=1.0,maximum-scale=1.0,user-scalable=no" />
+<meta http-equiv="Cache-Control" content="no-siteapp" />
+<LINK rel="Bookmark" href="../images/favicon.ico">
+<!-- 本框架基本脚本和样式 -->
+<script type="text/javascript"
+	th:src="@{/js/plugin/jquery-2.1.4.min.js}"></script>
+<script type="text/javascript"
+	th:src="@{/js/systools/MBase.js}"></script>
+
+<title></title>
+
+
+</head>
+
+<div class="panel-body">
+	<div class="form-group">
+		<label class="col-sm-2 control-label">订单号</label>
+		<div class="col-sm-4">
+			<span class="form-control-static" th:text="${order.orderNo}"></span>
+		</div>
+		<label class="col-sm-2 control-label">订单总价</label>
+		<div class="col-sm-4">
+			<span class="form-control-static" id="total" th:text="${order.total}"></span>
+		</div>
+	</div>
+	<br>
+	<div class="form-group">
+		<label class="col-sm-2 control-label">客户编号</label>
+		<div class="col-sm-4">
+			<span class="form-control-static" th:text="${order.vipNo}"></span>
+		</div>
+		<label class="col-sm-2 control-label">客户姓名</label>
+		<div class="col-sm-4">
+			<span class="form-control-static" th:text="${order.vipName}"></span>
+		</div>
+	</div>
+	<br>
+	<div class="form-group">
+		<label class="col-sm-2 control-label">折后价</label>
+		<div class="col-sm-4">
+			<span class="form-control-static" id="zkTotal" th:text="${order.zkTotal}"></span>
+		</div>
+		<label class="col-sm-2 control-label">欠款</label>
+		<div class="col-sm-4">
+			<span class="form-control-static" id="zkTotal" th:text="${order.arrears}"></span>
+		</div>
+	</div>
+	<br>
+	<div class="form-group">
+		<label class="col-sm-2 control-label">卡付金额</label>
+		<div class="col-sm-4">
+			<span class="form-control-static" id="zkTotal" th:text="${order.cardPay}"></span>
+		</div>
+		<label class="col-sm-2 control-label">现金付款</label>
+		<div class="col-sm-4">
+			<span class="form-control-static" id="zkTotal" th:text="${order.cashPay}"></span>
+		</div>
+	</div>
+	<br>
+	<div class="form-group">
+		<label class="col-sm-2 control-label">顾问姓名</label>
+		<div class="col-sm-4">
+			<span class="form-control-static" th:text="${order.staffName}"></span>
+		</div>
+	</div>
+</div>
+
+
+
+
+<div class="row ">
+	<div class="col-sm-10 pd-20 col-sm-offset-1">
+		<form class="form-horizontal" id="dataform"
+			onsubmit="javascripr:return false;">
+			<div class="tabs-container ">
+				<ul class="nav nav-tabs">
+					<li class="active"><a data-toggle="tab" href="#tab-1"
+						aria-expanded="true">收款</a></li>
+					<li class=""><a data-toggle="tab" href="#tab-2"
+						aria-expanded="false">业绩</a></li>
+				</ul>
+				<div class="tab-content">
+					<div id="tab-1" class="tab-pane active">
+						<div class="panel-body">
+							<div class="col-sm-12 form-group">
+								<!-- 改变折扣后的总价 -->
+								<input autocomplete="off"   type="hidden" name="zkTotal" th:value="${order.zkTotal}"
+									id="zkTotalInput">
+								<div class="panel-body">
+									<table class="table table-striped table-condensed  table-hover">
+										<thead>
+											<tr>
+												<th>序号</th>
+												<th>商品名称</th>
+												<th>单价</th>
+												<th>购买数量</th>
+												<th>折扣单价</th>
+												<th>支付方式</th>
+												<th>支付金额</th>
+											</tr>
+										</thead>
+										<tbody id="tbody">
+										<tr th:each="item,count:${order.items }">
+											<td th:text="${count.index}+1"></td>
+											<td>
+												<span th:text=" ${item.shoppingGoods.name }"></span>
+
+												<span th:if="${item.isFree eq '是' }" th:text="赠"></span>
+											</td>
+													<td th:text="${item.price }"></td>
+													<td th:text="${item.count}"></td>
+													<td th:text="${item.zkPrice}"></td>
+
+													<td><input autocomplete="off"   type="hidden"
+														th:name="'items['+${count.index}+'].id'"
+															   th:value="${item.id }">
+
+
+														<input autocomplete="off"   type="hidden" th:name="'items['+${count.index}+'].goodsId'"
+															   th:value="${item.goodsId }">
+														<input autocomplete="off"   type="hidden"  th:name="'items['+${count.index}+'].count'"  th:value="${item.count}">
+
+														<select class="form-control"
+														th:name="'items['+${count.index}+'].payMethod'">
+																	<option th:if="${item.type eq '充值卡'}" value="现金">现金</option>
+																	<option value="现金">现金</option>
+															<th:block th:if="${item.type ne '充值卡'}">
+																	<th:block th:each="cardItem:${cards }" >
+																		<option th:value="${cardItem.id }" th:text="${cardItem.cardName }+'-余:'+${cardItem.realMoney+cardItem.giftMoney}"></option>
+																	</th:block>
+															</th:block>
+
+													</select></td>
+													<td><input autocomplete="off"   type="text" class="form-control"
+															   th:onchange="'changePayMoney(\'p'+${item.id}+'\',this)'"
+
+														onchange="reckonTotal()" dataType="price" nullmsg="请填写金额"
+														errormsg="金额可为两位小数的正数" th:value="${item.arrears}"
+															   th:name="'items['+${count.index}+'].payMoney'" >
+														<div class="Validform_checktip"></div></td>
+												</tr>
+											</th>
+										</tbody>
+									</table>
+								</div>
+							</div>
+
+
+
+							<div class="col-sm-12 form-group">
+								<div class="form-group">
+									<div class="form-group">
+										<label class="col-sm-2 control-label">实收金额</label>
+										<div class="col-sm-4">
+											<input autocomplete="off"   type="text" class="form-control" name="actualPay"
+												id="money" readonly="readonly" th:value="${order.arrears}"
+												datatype="/^(([0-9]\d{0,9})|0)(\.\d{1,2})?$/"
+												ignore="ignore">
+											<div class="Validform_checktip"></div>
+										</div>
+
+										<label class="col-sm-2 control-label">备注</label>
+										<div class="col-sm-4">
+											<input autocomplete="off"   type="text" class="form-control" name="remark"
+												th:value="${order.remark}" datatype="*0-200" ignore="ignore">
+											<div class="Validform_checktip"></div>
+										</div>
+									</div>
+								</div>
+								<input autocomplete="off"   type="hidden" id="id" name="id" th:value="${order.id}" />
+							</div>
+						</div>
+					</div>
+					<div id="tab-2" class="tab-pane">
+							<div class="panel-body">
+								<table class="table   table-condensed   ">
+									<thead>
+										<tr>
+											<th>序号</th>
+											<th>商品名称</th>
+											<th>分配金额</th>
+											<th>美疗师业绩</th>
+											<th>操作</th>
+										</tr>
+									</thead>
+									<tbody id="tbody2">
+										<th:block th:each="item,count:${order.items }"  >
+											<tr th:id="'p'+${item.id}">
+												<td th:text="${count.index}+1"></td>
+												<td th:text="${item.shoppingGoods.name }">
+													<span th:if="${item.isFree eq '是' }" th:text="赠"></span>
+												</td>
+												<td th:text="${item.arrears }"></td>
+												<td>
+													<table class="table   table-condensed   ">
+															<tr th:each="achaeve,count2:${item.achaeveList }">
+																<td><select class="autoFull select2 input-sm"
+
+																	data-value="suId"
+																			data-filed="suName"
+																	th:data-def="${achaeve.staffId }"
+																	th:name="'items['+${count.index}+'].achaeveList['+${count2.index}'].beaultId'"
+																	th:data-url="@{/admin/getShopStaffByRoleName?roleName=美疗师}"
+																>
+																</select></td>
+																<td><input autocomplete="off"   type="text"
+																	class="form-control input-sm" style="width: 80px"
+																		   th:name="'items['+${count.index}+'].achaeveList['+${count2.index}'].t1"></td>
+																<td><button class="btn btn-danger btn-sm"
+																		onclick="deleteBeaute(this)">删除</button></td>
+															</tr>
+													</table>
+												</td>
+												<td><a class="btn btn-default btn-sm"
+													th:onclick="'addBeaute(\'p'+${item.id}+'\','+${count.index}+')'">添加</a></td>
+											</tr>
+
+									</tbody>
+								</table>
+							</div>
+						</div>
+					</div>
+					<div class="form-group mt-20 ">
+						<div class="col-sm-12 text-center">
+							&nbsp;&nbsp;&nbsp;&nbsp; <a href="javascript:;"
+								onclick="myForm.submit()" class="btn btn-success radius">确认</a>
+							&nbsp;&nbsp;&nbsp;&nbsp;
+							<button onclick="MTools.closeForm()"
+								class="btn btn-danger radius" type="button">取消</button>
+						</div>
+					</div>
+			</div>
+		</form>
+	</div>
+</div>
+
+
+<script type="text/javascript" th:src="@{/js/systools/MJsBase.js}"></script><script type="text/javascript">
+	var myForm = MForm.initForm({
+		invokeUrl : basePath+"/admin/moneyCardUse/bj",
+		beforeSubmit : function() {
+
+			//校验业绩
+			var ifAchieveOk=true;
+			$("#tbody2").children("tr").each(function(){
+				var tr=$(this);
+				var pay=parseFloat(tr.find("td").eq(2).html());
+				var achieveSum=0;
+				tr.find("td").eq(3).find("table").find("tr").each(function(){
+					var achieve= parseFloat($(this).find("td").eq(1).find("input").val());
+					achieveSum+=achieve;
+				});
+				if(achieveSum>pay){
+					ifAchieveOk=false;
+				}
+			});
+			if(!ifAchieveOk){
+				layer.msg("业绩金额不能大于支付金额",{icon:2})
+				return false;
+			}
+
+
+			var money = parseFloat($("#money").val());
+			var total = parseFloat($("#zkTotal").html());
+		},
+		afterSubmit : function() {
+			if(parent.myGrid) {
+				parent.myGrid.serchData();
+			}
+
+			if (parent.app) {
+				parent.app.orderQuery();
+			}
+		},
+	});
+
+	//添加一个美疗师
+	function addBeaute(trId,itemIndex){
+		if(!itemIndex){
+			itemIndex=0;
+		}
+	 	var id=MTools.randomStr();
+
+	 	var table=$("#"+trId).find("td").eq(3).find("table")
+
+	 	var achieveIndex=$("#"+trId).find("td").eq(3).find("table").find("tr").length;
+		var html= '<tr> <td><select class="autoFull select2 input-sm" id="'+id+'"  name="items['+itemIndex+'].achaeveList['+achieveIndex+'].beaultId" '
+				+'data-url="'+basePath+'/admin/getShopStaffByRoleName?roleName=美疗师" data-value="suId" data-filed="suName" data-def=""'
+			+'name="beatuyId"> </select></td> <td><input autocomplete="off"   type="text" class="form-control input-sm"  style="width: 80px"  name="items['+itemIndex+'].achaeveList['+achieveIndex+'].t1" '
+			+'name="items['+itemIndex+'].zkPrice" ></td> <td><button class="btn btn-danger btn-sm"  onclick="deleteBeaute(this)" >删除</button></td> </tr>';
+		$("#"+trId).find("td").eq(3).find("table").append(html);
+		$('#'+id).select2({'width':'80px'});
+		MTools.autoFullSelect({selecteder:'#'+id});    
+	};
+	//删除一个美疗师
+	function deleteBeaute(node){
+		$(node).closest("tr").remove();
+	}
+	
+	//修改收款金额
+	function changePayMoney(trId,node){
+		console.log(trId,node);
+		$("#"+trId).find("td").eq(2).html($(node).val());
+	};
+
+	
+	//改变折扣单价
+	function changeZkprice() {
+		var sum = 0;
+		$("#tbody").find("tr").each(function() {
+			var $tds = $(this).find("td");
+			var count = $tds.eq(3).html();
+			var zkprice = $tds.eq(4).find("input").eq(0).val();
+			totalMoney = parseFloat(count) * parseFloat(zkprice);
+			$tds.eq(6).find("input").eq(0).val(totalMoney);
+			sum += totalMoney;
+		});
+		$("#money").val(sum);
+		$("#zkTotal").html(sum);
+		$("#zkTotalInput").val(sum);
+	}
+
+	//计算实收
+	function reckonTotal() {
+		var sum = 0;
+		$("#tbody").find("tr").each(function() {
+			var $tds = $(this).find("td");
+			var count = $tds.eq(6).find("input").eq(0).val();
+			sum += parseFloat(count)
+		});
+		$("#money").val(sum);
+
+	}
+</script>
+</body>
+</html>
\ No newline at end of file
diff --git a/zq-erp/src/main/resources/templates/views/admin/hive/beautySalon/bj-form.html b/zq-erp/src/main/resources/templates/views/admin/hive/beautySalon/bj-form.html
index 8e4fb55..b39313f 100644
--- a/zq-erp/src/main/resources/templates/views/admin/hive/beautySalon/bj-form.html
+++ b/zq-erp/src/main/resources/templates/views/admin/hive/beautySalon/bj-form.html
@@ -1,8 +1,4 @@
-
-
-
-
-<!DOCTYPE HTML>
+<!DOCTYPE HTML>
 <html xmlns:th="http://www.thymeleaf.org" xmlns:matrix="http://www.w3.org/1999/xhtml">
 <head>
 <meta charset="utf-8">
@@ -13,336 +9,364 @@
 	content="width=device-width,initial-scale=1,minimum-scale=1.0,maximum-scale=1.0,user-scalable=no" />
 <meta http-equiv="Cache-Control" content="no-siteapp" />
 <LINK rel="Bookmark" href="../images/favicon.ico">
-<!-- 本框架基本脚本和样式 -->
-<script type="text/javascript"
-	th:src="@{/js/plugin/jquery-2.1.4.min.js}"></script>
-<script type="text/javascript"
-	th:src="@{/js/systools/MBase.js}"></script>
-
+	<!-- 本框架基本脚本和样式 -->
+	<script type="text/javascript" th:src="@{/js/systools/MBaseVue.js}"></script>
+	<link rel="stylesheet" th:href="@{/plugin/element-ui/index.css}">
+	<link th:href="@{/css/styleOne/style.min.css}" rel="stylesheet" type="text/css"/>
 <title></title>
-
-
-</head>
-
-<div class="panel-body">
-	<div class="form-group">
-		<label class="col-sm-2 control-label">订单号</label>
-		<div class="col-sm-4">
-			<span class="form-control-static" th:text="${order.orderNo}"></span>
-		</div>
-		<label class="col-sm-2 control-label">订单总价</label>
-		<div class="col-sm-4">
-			<span class="form-control-static" id="total" th:text="${order.total}"></span>
-		</div>
-	</div>
-	<br>
-	<div class="form-group">
-		<label class="col-sm-2 control-label">客户编号</label>
-		<div class="col-sm-4">
-			<span class="form-control-static" th:text="${order.vipNo}"></span>
-		</div>
-		<label class="col-sm-2 control-label">客户姓名</label>
-		<div class="col-sm-4">
-			<span class="form-control-static" th:text="${order.vipName}"></span>
-		</div>
-	</div>
-	<br>
-	<div class="form-group">
-		<label class="col-sm-2 control-label">折后价</label>
-		<div class="col-sm-4">
-			<span class="form-control-static" id="zkTotal" th:text="${order.zkTotal}"></span>
-		</div>
-		<label class="col-sm-2 control-label">欠款</label>
-		<div class="col-sm-4">
-			<span class="form-control-static" id="zkTotal" th:text="${order.arrears}"></span>
-		</div>
-	</div>
-	<br>
-	<div class="form-group">
-		<label class="col-sm-2 control-label">卡付金额</label>
-		<div class="col-sm-4">
-			<span class="form-control-static" id="zkTotal" th:text="${order.cardPay}"></span>
-		</div>
-		<label class="col-sm-2 control-label">现金付款</label>
-		<div class="col-sm-4">
-			<span class="form-control-static" id="zkTotal" th:text="${order.cashPay}"></span>
-		</div>
-	</div>
-	<br>
-	<div class="form-group">
-		<label class="col-sm-2 control-label">顾问姓名</label>
-		<div class="col-sm-4">
-			<span class="form-control-static" th:text="${order.staffName}"></span>
-		</div>
-	</div>
-</div>
-
-
-
-
-<div class="row ">
-	<div class="col-sm-10 pd-20 col-sm-offset-1">
-		<form class="form-horizontal" id="dataform"
-			onsubmit="javascripr:return false;">
-			<div class="tabs-container ">
-				<ul class="nav nav-tabs">
-					<li class="active"><a data-toggle="tab" href="#tab-1"
-						aria-expanded="true">收款</a></li>
-					<li class=""><a data-toggle="tab" href="#tab-2"
-						aria-expanded="false">业绩</a></li>
-				</ul>
-				<div class="tab-content">
-					<div id="tab-1" class="tab-pane active">
-						<div class="panel-body">
-							<div class="col-sm-12 form-group">
-								<!-- 改变折扣后的总价 -->
-								<input autocomplete="off"   type="hidden" name="zkTotal" th:value="${order.zkTotal}"
-									id="zkTotalInput">
-								<div class="panel-body">
-									<table class="table table-striped table-condensed  table-hover">
-										<thead>
-											<tr>
-												<th>序号</th>
-												<th>商品名称</th>
-												<th>单价</th>
-												<th>购买数量</th>
-												<th>折扣单价</th>
-												<th>支付方式</th>
-												<th>支付金额</th>
-											</tr>
-										</thead>
-										<tbody id="tbody">
-										<tr th:each="item,count:${order.items }">
-											<td th:text="${count.index}+1"></td>
-											<td>
-												<span th:text=" ${item.shoppingGoods.name }"></span>
-
-												<span th:if="${item.isFree eq '是' }" th:text="赠"></span>
-											</td>
-													<td th:text="${item.price }"></td>
-													<td th:text="${item.count}"></td>
-													<td th:text="${item.zkPrice}"></td>
-
-													<td><input autocomplete="off"   type="hidden"
-														th:name="'items['+${count.index}+'].id'"
-															   th:value="${item.id }">
-
-
-														<input autocomplete="off"   type="hidden" th:name="'items['+${count.index}+'].goodsId'"
-															   th:value="${item.goodsId }">
-														<input autocomplete="off"   type="hidden"  th:name="'items['+${count.index}+'].count'"  th:value="${item.count}">
-
-														<select class="form-control"
-														th:name="'items['+${count.index}+'].payMethod'">
-																	<option th:if="${item.type eq '充值卡'}" value="现金">现金</option>
-																	<option value="现金">现金</option>
-															<th:block th:if="${item.type ne '充值卡'}">
-																	<th:block th:each="cardItem:${cards }" >
-																		<option th:value="${cardItem.id }" th:text="${cardItem.cardName }+'-余:'+${cardItem.realMoney+cardItem.giftMoney}"></option>
-																	</th:block>
-															</th:block>
-
-													</select></td>
-													<td><input autocomplete="off"   type="text" class="form-control"
-															   th:onchange="'changePayMoney(\'p'+${item.id}+'\',this)'"
-
-														onchange="reckonTotal()" dataType="price" nullmsg="请填写金额"
-														errormsg="金额可为两位小数的正数" th:value="${item.arrears}"
-															   th:name="'items['+${count.index}+'].payMoney'" >
-														<div class="Validform_checktip"></div></td>
-												</tr>
-											</th>
-										</tbody>
-									</table>
-								</div>
-							</div>
-
-
-
-							<div class="col-sm-12 form-group">
-								<div class="form-group">
-									<div class="form-group">
-										<label class="col-sm-2 control-label">实收金额</label>
-										<div class="col-sm-4">
-											<input autocomplete="off"   type="text" class="form-control" name="actualPay"
-												id="money" readonly="readonly" th:value="${order.arrears}"
-												datatype="/^(([0-9]\d{0,9})|0)(\.\d{1,2})?$/"
-												ignore="ignore">
-											<div class="Validform_checktip"></div>
-										</div>
-
-										<label class="col-sm-2 control-label">备注</label>
-										<div class="col-sm-4">
-											<input autocomplete="off"   type="text" class="form-control" name="remark"
-												th:value="${order.remark}" datatype="*0-200" ignore="ignore">
-											<div class="Validform_checktip"></div>
-										</div>
-									</div>
-								</div>
-								<input autocomplete="off"   type="hidden" id="id" name="id" th:value="${order.id}" />
-							</div>
-						</div>
-					</div>
-					<div id="tab-2" class="tab-pane">
-							<div class="panel-body">
-								<table class="table   table-condensed   ">
-									<thead>
-										<tr>
-											<th>序号</th>
-											<th>商品名称</th>
-											<th>分配金额</th>
-											<th>美疗师业绩</th>
-											<th>操作</th>
-										</tr>
-									</thead>
-									<tbody id="tbody2">
-										<th:block th:each="item,count:${order.items }"  >
-											<tr th:id="'p'+${item.id}">
-												<td th:text="${count.index}+1"></td>
-												<td th:text="${item.shoppingGoods.name }">
-													<span th:if="${item.isFree eq '是' }" th:text="赠"></span>
-												</td>
-												<td th:text="${item.arrears }"></td>
-												<td>
-													<table class="table   table-condensed   ">
-															<tr th:each="achaeve,count2:${item.achaeveList }">
-																<td><select class="autoFull select2 input-sm"
-
-																	data-value="suId"
-																			data-filed="suName"
-																	th:data-def="${achaeve.staffId }"
-																	th:name="'items['+${count.index}+'].achaeveList['+${count2.index}'].beaultId'"
-																	th:data-url="@{/admin/getShopStaffByRoleName?roleName=美疗师}"
-																>
-																</select></td>
-																<td><input autocomplete="off"   type="text"
-																	class="form-control input-sm" style="width: 80px"
-																		   th:name="'items['+${count.index}+'].achaeveList['+${count2.index}'].t1"></td>
-																<td><button class="btn btn-danger btn-sm"
-																		onclick="deleteBeaute(this)">删除</button></td>
-															</tr>
-													</table>
-												</td>
-												<td><a class="btn btn-default btn-sm"
-													th:onclick="'addBeaute(\'p'+${item.id}+'\','+${count.index}+')'">添加</a></td>
-											</tr>
-
-									</tbody>
-								</table>
-							</div>
-						</div>
-					</div>
-					<div class="form-group mt-20 ">
-						<div class="col-sm-12 text-center">
-							&nbsp;&nbsp;&nbsp;&nbsp; <a href="javascript:;"
-								onclick="myForm.submit()" class="btn btn-success radius">确认</a>
-							&nbsp;&nbsp;&nbsp;&nbsp;
-							<button onclick="MTools.closeForm()"
-								class="btn btn-danger radius" type="button">取消</button>
-						</div>
-					</div>
-			</div>
-		</form>
-	</div>
-</div>
-
-
-<script type="text/javascript" th:src="@{/js/systools/MJsBase.js}"></script><script type="text/javascript">
-	var myForm = MForm.initForm({
-		invokeUrl : basePath+"/admin/moneyCardUse/bj",
-		beforeSubmit : function() {
-
-			//校验业绩
-			var ifAchieveOk=true;
-			$("#tbody2").children("tr").each(function(){
-				var tr=$(this);
-				var pay=parseFloat(tr.find("td").eq(2).html());
-				var achieveSum=0;
-				tr.find("td").eq(3).find("table").find("tr").each(function(){
-					var achieve= parseFloat($(this).find("td").eq(1).find("input").val());
-					achieveSum+=achieve;
-				});
-				if(achieveSum>pay){
-					ifAchieveOk=false;
-				}
-			});
-			if(!ifAchieveOk){
-				layer.msg("业绩金额不能大于支付金额",{icon:2})
-				return false;
-			}
-
-
-			var money = parseFloat($("#money").val());
-			var total = parseFloat($("#zkTotal").html());
-		},
-		afterSubmit : function() {
-			if(parent.myGrid) {
-				parent.myGrid.serchData();
-			}
-
-			if (parent.app) {
-				parent.app.orderQuery();
-			}
-		},
-	});
-
-	//添加一个美疗师
-	function addBeaute(trId,itemIndex){
-		if(!itemIndex){
-			itemIndex=0;
+	<style>
+		.paymethod ul {
+			padding: 0;
+			margin: 0;
+			height: 50px;
 		}
-	 	var id=MTools.randomStr();
+		.paymethod ul li {
+			padding: 10px;
+			margin: 5px;
+			list-style:none;
+			float: left;
+			display: block;
+			cursor: pointer;
+			position: relative;
+			border: white 1px solid;
+		}
+		.paymethod ul li:hover {
+			border: #409EFF 1px solid;
+		}
+		.paymethod .active {
+			border: #409EFF 1px solid;
+		}
+		.paymethod .active::after {
+			content: '';
+			display: block;
+			height: 0px;
+			width: 0px;
+			position: absolute;
+			bottom: 0;
+			right: 0;
+			color:#fff;
+			/**对号大小*/
+			font-size: 10px;
+			line-height: 8px;
+			border: 3px solid;
+			border-color: transparent #4884ff #4884ff transparent;
+		}
 
-	 	var table=$("#"+trId).find("td").eq(3).find("table")
+		.el-dialog__body {
+			padding-top: 10px !important;
+		}
+	</style>
+</head>
+<div class="panel-body" id="app">
+	<el-dialog title="还款" :visible.sync="dialogSettleVisible" :show-close="false" :close-on-click-modal="false" :close-on-press-escape="false">
+		<el-row type="flex" align="middle" style="padding: 0 0 10px 0;">
+			<el-col :span="5" style="text-align: center;">还款金额</el-col>
+			<el-col :span="10" style="text-align: center; line-height: 50px;"><span style="color: red; font-size: 20px;">¥ {{order.arrears}}</span></el-col>
+		</el-row>
 
-	 	var achieveIndex=$("#"+trId).find("td").eq(3).find("table").find("tr").length;
-		var html= '<tr> <td><select class="autoFull select2 input-sm" id="'+id+'"  name="items['+itemIndex+'].achaeveList['+achieveIndex+'].beaultId" '
-				+'data-url="'+basePath+'/admin/getShopStaffByRoleName?roleName=美疗师" data-value="suId" data-filed="suName" data-def=""'
-			+'name="beatuyId"> </select></td> <td><input autocomplete="off"   type="text" class="form-control input-sm"  style="width: 80px"  name="items['+itemIndex+'].achaeveList['+achieveIndex+'].t1" '
-			+'name="items['+itemIndex+'].zkPrice" ></td> <td><button class="btn btn-danger btn-sm"  onclick="deleteBeaute(this)" >删除</button></td> </tr>';
-		$("#"+trId).find("td").eq(3).find("table").append(html);
-		$('#'+id).select2({'width':'80px'});
-		MTools.autoFullSelect({selecteder:'#'+id});    
-	};
-	//删除一个美疗师
-	function deleteBeaute(node){
-		$(node).closest("tr").remove();
-	}
-	
-	//修改收款金额
-	function changePayMoney(trId,node){
-		console.log(trId,node);
-		$("#"+trId).find("td").eq(2).html($(node).val());
-	};
+		<el-row type="flex" align="middle" style="padding: 10px 0;">
+			<el-col :span="5" style="text-align: center;">收款方式</el-col>
+			<el-col class="paymethod" :span="15">
+				<el-row>
+					<ul>
+                        <span v-for="(item, index) in payMethods">
+                            <el-popover
+									:disabled="item.type != '储值卡'"
+									placement="bottom"
+									trigger="hover"
+									@hide="popoverHide(item)">
+                                <el-row style="text-align: center;"><span style="padding: 0 0 10px 0; display: block; font-size: 12px;">选择储值卡支付方式</span></el-row>
+                                <el-tree :data="moneyCards"
+										 show-checkbox
+										 default-expand-all
+										 node-key="id"
+										 ref="tree"
+										 check-strictly
+										 highlight-current
+										 @check="(click, checked,$item)=>{handleCheckChange(click, checked,$item)}"
+										 :props="defaultProps">
+                                </el-tree>
+                                <li :class="{active : item.isActive}" slot="reference" @click="payMethodSelect(item, index)"><div style=" height:30px; line-height: 30px; display: flex; align-items: center"><img style="width: 25px; height: 25px; align-items: center;" :src="item.img"><span style="margin-left: 5px;">{{item.value}}</span></div></li>
+                            </el-popover>
+                        </span>
+					</ul>
+				</el-row>
+			</el-col>
+		</el-row>
 
-	
-	//改变折扣单价
-	function changeZkprice() {
-		var sum = 0;
-		$("#tbody").find("tr").each(function() {
-			var $tds = $(this).find("td");
-			var count = $tds.eq(3).html();
-			var zkprice = $tds.eq(4).find("input").eq(0).val();
-			totalMoney = parseFloat(count) * parseFloat(zkprice);
-			$tds.eq(6).find("input").eq(0).val(totalMoney);
-			sum += totalMoney;
-		});
-		$("#money").val(sum);
-		$("#zkTotal").html(sum);
-		$("#zkTotalInput").val(sum);
-	}
+		<el-row type="flex" align="middle" style="padding: 10px 0 50px 0;">
+			<el-col :span="5" style="text-align: center;">支付金额</el-col>
+			<el-col :span="15">
+				<el-row style="line-height: 50px;" v-for="(item, index) in payMoneys">
+					<el-col :span="6" style="text-align: right; padding-right: 10px; font-size: 12px;">{{item.value}}</el-col>
+					<el-col :span="8"><el-input v-model="item.money"></el-input></el-col>
+					<el-col :span="6" style="margin-left: 10px;" v-if="item.type == '储值卡'">{{item.isGift == 1 ? '赠送余额' : '余额' }}:<span class="arrears">¥ {{item.balance}}</span></el-col>
+				</el-row>
+			</el-col>
+		</el-row>
 
-	//计算实收
-	function reckonTotal() {
-		var sum = 0;
-		$("#tbody").find("tr").each(function() {
-			var $tds = $(this).find("td");
-			var count = $tds.eq(6).find("input").eq(0).val();
-			sum += parseFloat(count)
-		});
-		$("#money").val(sum);
+		<el-row style="text-align: center; margin: 20px 0 10px 0">
+			<el-checkbox v-model="printPaper">打印小票</el-checkbox>
+		</el-row>
 
-	}
+		<el-row style="text-align: center; margin: 10px 0 0 0">
+			<el-button type="primary" @click="submitBj">确认收款</el-button>
+			<el-button type="danger" @click="cancelSubmit">取消</el-button>
+		</el-row>
+	</el-dialog>
+</div>
+
+<script type="text/javascript" th:src="@{/js/plugin/jquery-2.1.4.min.js}"></script>
+<script type="text/javascript" th:src="@{/js/plugin/jquery.query.js}"></script>
+<script type="text/javascript" th:src="@{/plugin/layer/layer.js}"></script>
+<script type="text/javascript" th:src="@{/js/systools/AjaxProxyVue.js}"></script>
+<script type="text/javascript" th:src="@{/js/plugin/vue.js}"></script>
+<script type="text/javascript" th:src="@{/plugin/element-ui/index.js}"></script>
+<script type="text/javascript"  th:inline="javascript">
+	//<![CDATA[
+	var vue = new Vue({
+		el: '#app',
+		data : {
+			order : "",
+			payMethods: [{
+				value: '现金支付',
+				img: '/images/pay/cash.png',
+				isActive: false,
+				type: '现金支付'
+			}, {
+				value: '微信',
+				img: '/images/pay/wechat.png',
+				isActive: false,
+				type: '微信'
+			}, {
+				value: '支付宝',
+				img: '/images/pay/zhifubao.png',
+				isActive: false,
+				type: '支付宝'
+			}, {
+				value: '银行卡',
+				img: '/images/pay/yinlian.png',
+				isActive: false,
+				type: '银行卡'
+			}, {
+				value: '团购',
+				img: '/images/pay/tuan.png',
+				isActive: false,
+				type: '团购'
+			}, {
+				value: '储值卡',
+				img: '/images/pay/card.png',
+				isActive: false,
+				type: '储值卡'
+			},],
+			moneyCards : [],
+			dialogSettleVisible : true,
+			defaultProps: {
+				children: 'children',
+				label: 'showLable'
+			},
+			treeSelect : [],
+			payMoneys : [],
+			printPaper : false,
+		},
+		created : function() {
+			this.order = /*[[${order}]]*/
+			this.getVipMoneyCards();
+		},
+		methods : {
+			submitBj() {
+				let _this = this;
+				if (_this.payMoneys.length > 0) {
+					let flows = []
+					var total = 0;
+					_this.payMoneys.forEach(item => {
+						let flow = {};
+						flow.payMethod = item.type;
+						if (!item.money) {
+							this.$message.warning("请输入" + item.type + "的付款金额");
+							return false;
+						}
+						flow.amount = item.money;
+						if (item.type == '储值卡'){
+							flow.isGift = item.isGift;
+							flow.cardId = item.id;
+						}
+						total += item.money;
+						flows.push(flow)
+					})
+					if (total > _this.order.arrears) {
+						this.$message.warning("输入付款总金额大于应还金额");
+						return false;
+					}
+					_this.order.flows = flows;
+				} else {
+					this.$message.warning("请选择支付方式");
+					return false;
+				}
+
+				let url = basePath + "/admin/moneyCardUse/bj";
+
+				AjaxProxy.requst({
+					app: _this,
+					data: _this.order,
+					url: url,
+					callback: function (data) {
+						if (_this.printPaper) {
+							_this.print();
+						}
+
+						if(parent.myGrid) {
+							parent.myGrid.serchData();
+						}
+
+						if (parent.app) {
+							parent.app.orderQuery();
+						}
+
+						_this.closeFrame();
+					}
+				});
+			},
+			cancelSubmit() {
+				this.closeFrame();
+			},
+			print() {
+				let _this = this;
+				if (_this.order.id) {
+					layer.open({
+						type: 2,
+						title: "打印订单",
+						area: ['250px', '550px'],
+						maxmin: true,
+						content: [basePath + '/admin/redirect/hive/beautySalon/print-order?id=' + this.order.id],
+						cancel: function (index, layero) {
+							_this.closeFram();
+						}
+					});
+				} else {
+					this.$message.warning("请先挂单在打印");
+				}
+
+
+			},
+			getVipMoneyCards() {
+				let _this = this;
+				if (_this.order.vipId) {
+					AjaxProxy.requst({
+						app: _this,
+						data: {vipId: _this.order.vipId},
+						contentType: 'application/x-www-form-urlencoded',
+						url: basePath + '/admin/moneyCardUse/getUseMoneyCard',
+						callback: function (data) {
+							if (data.rows.length > 0) {
+								data.rows.forEach(function (item, index, input) {
+									item.showLable = item.cardName + "-余额:" + (item.realMoney)
+									item.uuid = MTools.uuid();
+									if (item.giftMoney != 0) {
+										var children = [];
+										var gift = {};
+										gift.id = item.id;
+										gift.giftMoney = item.giftMoney;
+										gift.showLable = item.cardName + '-赠送金额' + item.giftMoney;
+										gift.cardName = item.cardName;
+										gift.isGift = 1;
+										gift.uuid = MTools.uuid();
+										children.push(gift);
+										item.children = children;
+									}
+								});
+								_this.moneyCards = data.rows;
+							}
+
+						}
+					});
+				}
+			},
+			payMethodSelect(item, index) {
+				let _this = this;
+				let payMoneys = _this.payMoneys;
+				if (item.type != '储值卡') {
+					this.$nextTick(function () {
+						if (item.isActive) {
+							Vue.set(item,'isActive',false);
+							var index = -1;
+							for (var i = 0; i < payMoneys.length; i++) {
+								let payMoney = payMoneys[i];
+								if (payMoney.value == item.value) {
+									index = i;
+									break;
+								}
+							}
+
+							if (index > -1) {
+								_this.payMoneys.splice(index, 1)
+							}
+						} else {
+							Vue.set(item,'isActive',true);
+							var hasAmount = 0;
+							for(var i = 0; i < payMoneys.length; i++) {
+								hasAmount += parseFloat(payMoneys[i].money);
+							}
+							if (_this.order.arrears - hasAmount > 0) {
+								Vue.set(item, 'money', _this.order.arrears - hasAmount);
+							}
+							_this.payMoneys.push(item);
+						}
+					});
+				}
+			},
+			popoverHide(item) {
+				if(this.treeSelect.length <= 0) {
+					Vue.set(item, 'isActive', false)
+				} else {
+					Vue.set(item, 'isActive', true)
+				}
+			},
+			handleCheckChange(clickNode, checked) {
+				let _this = this;
+
+				let nodes = checked.checkedNodes;
+				_this.treeSelect = nodes;
+				var index = -1;
+				// 判断点击节点是否在已展示支付方式中
+				for(var i = 0; i < _this.payMoneys.length; i++) {
+					let node = _this.payMoneys[i];
+					if (node.uuid === clickNode.uuid) {
+						index = i;
+						break;
+					}
+				}
+
+				// 若点击节点在选中节点中,且已展示支付方式不存在,则添加
+				if (nodes.indexOf(clickNode) > -1 && index === -1) {
+					var node = clickNode;
+					var item = {};
+					if (node.isGift) {
+						item.value = node.cardName;
+						item.balance = node.giftMoney;
+						item.isGift = 'Y';
+					} else {
+						item.value = node.cardName;
+						item.balance = node.realMoney;
+						item.isGift = 'N';
+					}
+					item.type = '储值卡';
+					item.id = node.id;
+					item.uuid = clickNode.uuid;
+					_this.payMoneys.push(item);
+				}
+
+				// 若点击节点不存在选中节点中,且已展示支付方式中存在,则移除
+				if (nodes.indexOf(clickNode) === -1 && index > -1) {
+					_this.payMoneys.splice(index, 1);
+				}
+			},
+			closeFrame() {
+				parent.layer.close(parent.layer.getFrameIndex(window.name));
+			},
+		}
+	});
+	//]]>
 </script>
 </body>
 </html>
\ No newline at end of file
diff --git a/zq-erp/src/main/resources/templates/views/admin/hive/beautySalon/cz-form-bak.html b/zq-erp/src/main/resources/templates/views/admin/hive/beautySalon/cz-form-bak.html
new file mode 100644
index 0000000..5c0925d
--- /dev/null
+++ b/zq-erp/src/main/resources/templates/views/admin/hive/beautySalon/cz-form-bak.html
@@ -0,0 +1,239 @@
+<!DOCTYPE HTML>
+<html xmlns:th="http://www.thymeleaf.org" xmlns:matrix="http://www.w3.org/1999/xhtml">
+<head>
+<meta charset="utf-8">
+<META HTTP-EQUIV="Pragma" CONTENT="no-cache">
+<meta name="renderer" content="webkit|ie-comp|ie-stand">
+<meta http-equiv="X-UA-Compatible" content="IE=edge,chrome=1">
+<meta name="viewport"
+	content="width=device-width,initial-scale=1,minimum-scale=1.0,maximum-scale=1.0,user-scalable=no" />
+<meta http-equiv="Cache-Control" content="no-siteapp" />
+<LINK rel="Bookmark" href="../images/favicon.ico">
+<!-- 本框架基本脚本和样式 -->
+<script type="text/javascript"
+	th:src="@{/js/plugin/jquery-2.1.4.min.js}"></script>
+<script type="text/javascript"
+	th:src="@{/js/systools/MBase.js}"></script>
+
+
+<title></title>
+</head>
+<div class="ibox-content">
+
+		<form th:if="${obj ne null }" class="form-horizontal" id="dataform"
+			onsubmit="javascripr:return false;">
+			<input autocomplete="off"   type="hidden" name="cardId" th:value="${obj.id }">
+			<div class="form-group">
+				<label class="col-sm-2 control-label">余额</label>
+				<div class="col-sm-4">
+					<input autocomplete="off"   type="text" class="form-control" th:value="${obj.realMoney}"
+						readonly="readonly">
+					<div class="Validform_checktip"></div>
+				</div>
+				<label class="col-sm-2 control-label">充值时间</label>
+				<div class="col-sm-4">
+
+					<input autocomplete="off"   name="dateTime" type="text" datatype="*"
+						   class="form-control  datetimepicker" nullmsg="充值时间不能为空"
+						   style="display: inline;"
+						   th:value="${#dates.format(new java.util.Date().getTime(), 'yyyy-MM-dd')}">
+					<div class="Validform_checktip"></div>
+				</div>
+
+
+			</div>
+			<div class="form-group">
+
+				<label class="col-sm-2 control-label">充值金额</label>
+				<div class="col-sm-4">
+					<input autocomplete="off"   type="text" class="form-control" name="bjmoney" value="0"
+						   onchange="changePayMoney('p0',this)"
+						   datatype="*" nullmsg="充值金额不能为空">
+					<div class="Validform_checktip"></div>
+				</div>
+
+				<label class="col-sm-2 control-label">赠送金额</label>
+				<div class="col-sm-4">
+					<input autocomplete="off"   type="text" class="form-control" value="0" dataType="n1-8"
+						name="giftMoney" />
+					<div class="Validform_checktip"></div>
+				</div>
+			</div>
+			<div class="form-group">
+
+				<label class="col-sm-2 control-label">赠送积分</label>
+				<div class="col-sm-4">
+					<input autocomplete="off"   type="text" class="form-control" value="0" dataType="n1-8"
+						   name="jf" />
+					<div class="Validform_checktip"></div>
+				</div>
+
+				<label class="col-sm-2 control-label">下单顾问</label>
+				<div class="col-sm-4">
+					<select class="autoFull select2 " style="width: 100%"
+						th:data-url="@{/admin/getShopStaffByRoleName?roleName=健康顾问}"
+						data-value="suId" data-filed="suName"
+						th:data-def="${session.userInfo.suId }" name="staffId">
+					</select>
+				</div>
+
+			</div>
+			<div class="row ">
+				<div class="col-sm-10 pd-20 col-sm-offset-1">
+					<div class="panel-body">
+						<table class="table   table-condensed   ">
+							<thead>
+								<tr>
+									<th>序号</th>
+									<th>商品名称</th>
+									<th>分配金额</th>
+									<th>美疗师业绩</th>
+									<th>操作</th>
+								</tr>
+							</thead>
+							<tbody id="tbody2">
+								<tr id="p0">
+									<td>1</td>
+									<td>会籍卡充值</td>
+									<td>0</td>
+									<td>
+										<table class="table   table-condensed   ">
+											<tr>
+												<td><select class="autoFull select2 input-sm" style="width: 80px;"
+													th:data-url="@{/admin/getShopStaffByRoleName?roleName=美疗师}"
+													data-value="suId" data-filed="suName"
+													th:data-def="${session.userInfo.suId }"
+													name="achaeveList[0].beaultId">
+												</select></td>
+												<td><input autocomplete="off"   type="text" class="form-control input-sm" value="0"
+													style="width: 80px" name="achaeveList[0].t1"></td>
+												<td><button class="btn btn-danger btn-sm"
+														onclick="deleteBeaute(this)">删除</button></td>
+											</tr>
+										</table>
+									</td>
+									<td><a class="btn btn-default btn-sm"
+										onclick="addBeaute('p0','0')">添加</a></td>
+								</tr>
+							</tbody>
+						</table>
+					</div>
+				</div>
+			</div>
+
+
+			<div class="form-group ">
+				<div class="col-sm-12 text-center">
+					<a href="javascript:;" onclick="myForm.submit()"
+						class="btn btn-success radius">保存</a> &nbsp;&nbsp;&nbsp;&nbsp;
+					<button onclick="MTools.closeForm()" class="btn btn-danger radius"
+						type="button">取消</button>
+				</div>
+			</div>
+		</form>
+	</c:if>
+		<div th:if="${obj eq null }" class="text-center text-info">
+			<h2>该会员没有可用的会员卡!</h2>
+		</div>
+
+</div>
+<script type="text/javascript" th:src="@{/js/systools/MJsBase.js}"></script><script type="text/javascript">
+	$('.select2 ').select2();
+	MTools.autoFullSelect();
+	MTools.ininDatetimepicker({});
+	var myForm = MForm.initForm({
+		invokeUrl : basePath+"/admin/moneyCardUse/cz",
+		isAutoClose : false,
+		beforeSubmit : function() {
+
+			//校验业绩
+			var ifAchieveOk = true;
+			var achieveSum = 0;
+			$("#tbody2").children("tr").each(
+					function() {
+						var tr = $(this);
+						var pay = parseFloat(tr.find("td").eq(2).html());
+
+						tr.find("td").eq(3).find("table").find("tr").each(
+								function() {
+									var achieve = parseFloat($(this).find("td")
+											.eq(1).find("input").val());
+									achieveSum += achieve;
+								});
+						if (achieveSum > pay) {
+							ifAchieveOk = false;
+						}
+					});
+			if(isNaN(achieveSum)){
+				layer.msg("业绩金额格式错误", {
+					icon : 2
+				})
+				return false;
+			}
+			if (!ifAchieveOk) {
+				layer.msg("业绩金额不能大于支付金额", {
+					icon : 2
+				})
+				return false;
+			}
+
+		},
+		afterSubmit : function(loj) {
+
+			layer.open({
+				type: 2,
+				title: "打印订单",
+				area: ['250px', '550px'],
+				maxmin: true,
+				content: [basePath + '/admin/redirect/hive/beautySalon/print-order?id=' + loj.getResult().mapInfo.orderId],
+				cancel: function (index, layer) {
+					if (parent.app) {
+						parent.app.vipInfoFn();
+					} else {
+						parent.selectByKey();
+					}
+					MTools.closeForm();
+				}
+			});
+
+		},
+	});
+
+
+
+	//添加一个美疗师
+	function addBeaute(trId, itemIndex) {
+		if (!itemIndex) {
+			itemIndex = 0;
+		}
+		var id = MTools.randomStr();
+		console.log(1);
+		var table = $("#" + trId).find("td").eq(3).find("table")
+
+		var achieveIndex = $("#" + trId).find("td").eq(3).find("table").find(
+				"tr").length;
+		var html = '<tr> <td><select class="autoFull select2 input-sm" id="'+id+'"  name="achaeveList['+achieveIndex+'].beaultId" '
+				+'data-url="'+basePath+'/admin/getShopStaffByRoleName?roleName=美疗师" data-value="suId" data-filed="suName" data-def=""'
+			+'name="beatuyId"> </select></td> <td><input autocomplete="off"   type="text" class="form-control input-sm"  value="0" style="width: 80px"  name="achaeveList['+achieveIndex+'].t1" '
+			+'name="items['+achieveIndex+'].zkPrice" ></td> <td><button class="btn btn-danger btn-sm"  onclick="deleteBeaute(this)" >删除</button></td> </tr>';
+		$("#" + trId).find("td").eq(3).find("table").append(html);
+		$('#' + id).select2({
+			'width' : '80px'
+		});
+		MTools.autoFullSelect({
+			selecteder : '#' + id
+		});
+	};
+	//删除一个美疗师
+	function deleteBeaute(node) {
+		$(node).closest("tr").remove();
+	}
+
+	//修改收款金额
+	function changePayMoney(trId, node) {
+		console.log(trId, node);
+		$("#" + trId).find("td").eq(2).html($(node).val());
+	};
+</script>
+</body>
+</html>
\ No newline at end of file
diff --git a/zq-erp/src/main/resources/templates/views/admin/hive/beautySalon/cz-form.html b/zq-erp/src/main/resources/templates/views/admin/hive/beautySalon/cz-form.html
index 5c0925d..12f1b8c 100644
--- a/zq-erp/src/main/resources/templates/views/admin/hive/beautySalon/cz-form.html
+++ b/zq-erp/src/main/resources/templates/views/admin/hive/beautySalon/cz-form.html
@@ -10,230 +10,383 @@
 <meta http-equiv="Cache-Control" content="no-siteapp" />
 <LINK rel="Bookmark" href="../images/favicon.ico">
 <!-- 本框架基本脚本和样式 -->
-<script type="text/javascript"
-	th:src="@{/js/plugin/jquery-2.1.4.min.js}"></script>
-<script type="text/javascript"
-	th:src="@{/js/systools/MBase.js}"></script>
-
-
+<script type="text/javascript" th:src="@{/js/systools/MBaseVue.js}"></script>
+<link rel="stylesheet" th:href="@{/plugin/element-ui/index.css}">
+<link th:href="@{/css/styleOne/style.min.css}" rel="stylesheet" type="text/css"/>
 <title></title>
+	<style>
+		.paymethod ul {
+			padding: 0;
+			margin: 0;
+			height: 50px;
+		}
+		.paymethod ul li {
+			padding: 10px;
+			margin: 5px;
+			list-style:none;
+			float: left;
+			display: block;
+			cursor: pointer;
+			position: relative;
+			border: white 1px solid;
+		}
+		.paymethod ul li:hover {
+			border: #409EFF 1px solid;
+		}
+		.paymethod .active {
+			border: #409EFF 1px solid;
+		}
+		.paymethod .active::after {
+			content: '';
+			display: block;
+			height: 0px;
+			width: 0px;
+			position: absolute;
+			bottom: 0;
+			right: 0;
+			color:#fff;
+			/**对号大小*/
+			font-size: 10px;
+			line-height: 8px;
+			border: 3px solid;
+			border-color: transparent #4884ff #4884ff transparent;
+		}
+
+		.el-dialog__body {
+			padding-top: 10px !important;
+		}
+	</style>
 </head>
-<div class="ibox-content">
+<div class="panel-body" id="app">
+	<el-dialog title="充值" :visible.sync="dialogSettleVisible" :show-close="false" :close-on-click-modal="false" :close-on-press-escape="false">
+		<el-row type="flex" align="middle" style="padding: 0 0 10px 0;">
+			<el-col :span="5" style="text-align: center;">充值金额</el-col>
+			<el-col :span="10" style="text-align: center; line-height: 50px;">
+				<el-input type="number" v-model="rechargeMoney" @change="changeRechargeMoney"  placeholder="可充负数退款"></el-input>
+			</el-col>
+		</el-row>
 
-		<form th:if="${obj ne null }" class="form-horizontal" id="dataform"
-			onsubmit="javascripr:return false;">
-			<input autocomplete="off"   type="hidden" name="cardId" th:value="${obj.id }">
-			<div class="form-group">
-				<label class="col-sm-2 control-label">余额</label>
-				<div class="col-sm-4">
-					<input autocomplete="off"   type="text" class="form-control" th:value="${obj.realMoney}"
-						readonly="readonly">
-					<div class="Validform_checktip"></div>
-				</div>
-				<label class="col-sm-2 control-label">充值时间</label>
-				<div class="col-sm-4">
+		<el-row type="flex" align="middle" style="padding: 10px 0;">
+			<el-col :span="5" style="text-align: center;">收款方式</el-col>
+			<el-col class="paymethod" :span="15">
+				<el-row>
+					<ul>
+                        <span v-for="(item, index) in payMethods">
+							<li :class="{active : item.isActive}" @click="payMethodSelect(item, index)"><div style=" height:30px; line-height: 30px; display: flex; align-items: center"><img style="width: 25px; height: 25px; align-items: center;" :src="item.img"><span style="margin-left: 5px;">{{item.value}}</span></div></li>
+                        </span>
+					</ul>
+				</el-row>
+			</el-col>
+		</el-row>
 
-					<input autocomplete="off"   name="dateTime" type="text" datatype="*"
-						   class="form-control  datetimepicker" nullmsg="充值时间不能为空"
-						   style="display: inline;"
-						   th:value="${#dates.format(new java.util.Date().getTime(), 'yyyy-MM-dd')}">
-					<div class="Validform_checktip"></div>
-				</div>
+		<el-row type="flex" align="middle" style="padding: 10px 0 50px 0;">
+			<el-col :span="5" style="text-align: center;">支付金额</el-col>
+			<el-col :span="15">
+				<el-row style="line-height: 50px;" v-for="(item, index) in payMoneys">
+					<el-col :span="6" style="text-align: right; padding-right: 10px; font-size: 12px;">{{item.value}}</el-col>
+					<el-col :span="8"><el-input v-model="item.money"></el-input></el-col>
+				</el-row>
+			</el-col>
+		</el-row>
 
+		<el-row type="flex" align="middle" style="padding: 10px 0 50px 0;">
+			<el-col :span="5" style="text-align: center;">业绩</el-col>
+			<el-col :span="16">
+				<el-table class="mt-20"
+						  :border="true"
+						  :data="achieveList"
+						  style="width: 100%">
+					<el-table-column
+							type="index"
+							width="50">
+					</el-table-column>
+					<el-table-column
+							label="业绩" width="100">
+						<template slot-scope="scope">
+							<el-input v-model="scope.row.achieveMoney"></el-input>
+						</template>
+					</el-table-column>
+					<el-table-column
+							label="提成">
+						<template slot-scope="scope">
+							<el-input v-model="scope.row.commission"></el-input>
+						</template>
+					</el-table-column>
+					<el-table-column
+							label="员工" width="130">
+						<template slot-scope="scope">
+							<el-select v-model="scope.row.saleId" placeholder="请选择员工">
+								<el-option
+										v-for="item in userList"
+										:key="item.suId"
+										:label="item.suName"
+										:value="item.suId">
+								</el-option>
+							</el-select>
+						</template>
+					</el-table-column>
+					<el-table-column
+							width="150"
+							label="操作">
+						<template slot-scope="scope">
+							<el-button type="primary" v-if="scope.row.isShare"
+									   size="mini"
+									   @click="delAchieve(scope.$index, scope.row)">删除
+							</el-button>
+							<el-tooltip content="分享业绩" placement="top">
+								<el-button @click="shareAchieve(scope.$index, scope.row)" icon="el-icon-share"
+										   size="mini" type="primary"></el-button>
+							</el-tooltip>
+						</template>
+					</el-table-column>
+				</el-table>
+			</el-col>
+		</el-row>
 
-			</div>
-			<div class="form-group">
+		<el-row style="text-align: center; margin: 20px 0 10px 0">
+			<el-checkbox v-model="printPaper">打印小票</el-checkbox>
+		</el-row>
 
-				<label class="col-sm-2 control-label">充值金额</label>
-				<div class="col-sm-4">
-					<input autocomplete="off"   type="text" class="form-control" name="bjmoney" value="0"
-						   onchange="changePayMoney('p0',this)"
-						   datatype="*" nullmsg="充值金额不能为空">
-					<div class="Validform_checktip"></div>
-				</div>
-
-				<label class="col-sm-2 control-label">赠送金额</label>
-				<div class="col-sm-4">
-					<input autocomplete="off"   type="text" class="form-control" value="0" dataType="n1-8"
-						name="giftMoney" />
-					<div class="Validform_checktip"></div>
-				</div>
-			</div>
-			<div class="form-group">
-
-				<label class="col-sm-2 control-label">赠送积分</label>
-				<div class="col-sm-4">
-					<input autocomplete="off"   type="text" class="form-control" value="0" dataType="n1-8"
-						   name="jf" />
-					<div class="Validform_checktip"></div>
-				</div>
-
-				<label class="col-sm-2 control-label">下单顾问</label>
-				<div class="col-sm-4">
-					<select class="autoFull select2 " style="width: 100%"
-						th:data-url="@{/admin/getShopStaffByRoleName?roleName=健康顾问}"
-						data-value="suId" data-filed="suName"
-						th:data-def="${session.userInfo.suId }" name="staffId">
-					</select>
-				</div>
-
-			</div>
-			<div class="row ">
-				<div class="col-sm-10 pd-20 col-sm-offset-1">
-					<div class="panel-body">
-						<table class="table   table-condensed   ">
-							<thead>
-								<tr>
-									<th>序号</th>
-									<th>商品名称</th>
-									<th>分配金额</th>
-									<th>美疗师业绩</th>
-									<th>操作</th>
-								</tr>
-							</thead>
-							<tbody id="tbody2">
-								<tr id="p0">
-									<td>1</td>
-									<td>会籍卡充值</td>
-									<td>0</td>
-									<td>
-										<table class="table   table-condensed   ">
-											<tr>
-												<td><select class="autoFull select2 input-sm" style="width: 80px;"
-													th:data-url="@{/admin/getShopStaffByRoleName?roleName=美疗师}"
-													data-value="suId" data-filed="suName"
-													th:data-def="${session.userInfo.suId }"
-													name="achaeveList[0].beaultId">
-												</select></td>
-												<td><input autocomplete="off"   type="text" class="form-control input-sm" value="0"
-													style="width: 80px" name="achaeveList[0].t1"></td>
-												<td><button class="btn btn-danger btn-sm"
-														onclick="deleteBeaute(this)">删除</button></td>
-											</tr>
-										</table>
-									</td>
-									<td><a class="btn btn-default btn-sm"
-										onclick="addBeaute('p0','0')">添加</a></td>
-								</tr>
-							</tbody>
-						</table>
-					</div>
-				</div>
-			</div>
-
-
-			<div class="form-group ">
-				<div class="col-sm-12 text-center">
-					<a href="javascript:;" onclick="myForm.submit()"
-						class="btn btn-success radius">保存</a> &nbsp;&nbsp;&nbsp;&nbsp;
-					<button onclick="MTools.closeForm()" class="btn btn-danger radius"
-						type="button">取消</button>
-				</div>
-			</div>
-		</form>
-	</c:if>
-		<div th:if="${obj eq null }" class="text-center text-info">
-			<h2>该会员没有可用的会员卡!</h2>
-		</div>
-
+		<el-row style="text-align: center; margin: 10px 0 0 0">
+			<el-button type="primary" @click="submitRecharge">确认收款</el-button>
+			<el-button type="danger" @click="cancelSubmit">取消</el-button>
+		</el-row>
+	</el-dialog>
 </div>
-<script type="text/javascript" th:src="@{/js/systools/MJsBase.js}"></script><script type="text/javascript">
-	$('.select2 ').select2();
-	MTools.autoFullSelect();
-	MTools.ininDatetimepicker({});
-	var myForm = MForm.initForm({
-		invokeUrl : basePath+"/admin/moneyCardUse/cz",
-		isAutoClose : false,
-		beforeSubmit : function() {
+<script type="text/javascript" th:src="@{/js/plugin/jquery-2.1.4.min.js}"></script>
+<script type="text/javascript" th:src="@{/js/plugin/jquery.query.js}"></script>
+<script type="text/javascript" th:src="@{/plugin/layer/layer.js}"></script>
+<script type="text/javascript" th:src="@{/js/systools/AjaxProxyVue.js}"></script>
+<script type="text/javascript" th:src="@{/js/plugin/vue.js}"></script>
+<script type="text/javascript" th:src="@{/plugin/element-ui/index.js}"></script>
+<script type="text/javascript"  th:inline="javascript">
+	var vipId = $.query.get("vipId");
 
-			//校验业绩
-			var ifAchieveOk = true;
-			var achieveSum = 0;
-			$("#tbody2").children("tr").each(
-					function() {
-						var tr = $(this);
-						var pay = parseFloat(tr.find("td").eq(2).html());
-
-						tr.find("td").eq(3).find("table").find("tr").each(
-								function() {
-									var achieve = parseFloat($(this).find("td")
-											.eq(1).find("input").val());
-									achieveSum += achieve;
-								});
-						if (achieveSum > pay) {
-							ifAchieveOk = false;
-						}
-					});
-			if(isNaN(achieveSum)){
-				layer.msg("业绩金额格式错误", {
-					icon : 2
-				})
-				return false;
-			}
-			if (!ifAchieveOk) {
-				layer.msg("业绩金额不能大于支付金额", {
-					icon : 2
-				})
-				return false;
-			}
-
+	//<![CDATA[
+	var vue = new Vue({
+		el: '#app',
+		data : {
+			cardInfo : "",
+			loginUser : "",
+			rechargeMoney : 0,
+			payMethods: [{
+				value: '现金支付',
+				img: '/images/pay/cash.png',
+				isActive: false,
+				type: '现金支付'
+			}, {
+				value: '微信',
+				img: '/images/pay/wechat.png',
+				isActive: false,
+				type: '微信'
+			}, {
+				value: '支付宝',
+				img: '/images/pay/zhifubao.png',
+				isActive: false,
+				type: '支付宝'
+			}, {
+				value: '银行卡',
+				img: '/images/pay/yinlian.png',
+				isActive: false,
+				type: '银行卡'
+			}, {
+				value: '团购',
+				img: '/images/pay/tuan.png',
+				isActive: false,
+				type: '团购'
+			}, ],
+			dialogSettleVisible : true,
+			defaultProps: {
+				children: 'children',
+				label: 'showLable'
+			},
+			achieveList : [],
+			userList: [],
+			treeSelect : [],
+			payMoneys : [],
+			printPaper : false,
 		},
-		afterSubmit : function(loj) {
+		created : function() {
+			let _this = this;
+			this.cardInfo = /*[[${obj}]]*/
 
-			layer.open({
-				type: 2,
-				title: "打印订单",
-				area: ['250px', '550px'],
-				maxmin: true,
-				content: [basePath + '/admin/redirect/hive/beautySalon/print-order?id=' + loj.getResult().mapInfo.orderId],
-				cancel: function (index, layer) {
-					if (parent.app) {
-						parent.app.vipInfoFn();
-					} else {
-						parent.selectByKey();
-					}
-					MTools.closeForm();
+			//获取用户列表
+			AjaxProxy.requst({
+				app: _this,
+				url: basePath + '/admin/shopAll',
+				callback: function (data) {
+					_this.userList = data.rows;
 				}
 			});
 
+			//获取登录用户信息
+			AjaxProxy.requst({
+				app: _this,
+				url: basePath + '/admin/getLoginUser',
+				callback: function (data) {
+					_this.loginUser = data.mapInfo.user;
+
+					_this.achieveList.push({
+						saleId: _this.loginUser.suId,
+						achieveMoney: 0,
+						commission : 0,
+						isShare: false,
+					});
+				}
+			});
 		},
-	});
+		methods : {
+			//修改充值金额同步修改业绩
+			changeRechargeMoney(){
+				let aMoeny=(this.rechargeMoney/this.achieveList.length).toFixed(2);
+				this.achieveList.forEach(item=>{
+					item.achieveMoney=aMoeny;
+				});
+			},
+			submitRecharge() {
+				let _this = this;
+
+				if (!_this.rechargeMoney) {
+					this.$message.warning("请输入充值金额");
+					return;
+				}
+
+				if (_this.payMoneys.length > 0) {
+					let flows = []
+					var total = 0;
+					_this.payMoneys.forEach(item => {
+						let flow = {};
+						flow.payMethod = item.type;
+						if (!item.money) {
+							this.$message.warning("请输入" + item.type + "的付款金额");
+							return false;
+						}
+						flow.amount = parseFloat(item.money);
+						total +=   parseFloat(item.money);
+						flows.push(flow);
+					})
+					debugger
+					if (total != _this.rechargeMoney) {
+						this.$message.warning("付款金额应等于充值金额");
+						return false;
+					}
+					_this.cardInfo.flows = flows;
+				} else {
+					this.$message.warning("请选择支付方式");
+					return false;
+				}
+
+				let achaeveList = [];
+				_this.achieveList.forEach(achieve => {
+					let achieveNew = {
+						beaultId: achieve.saleId,
+						t1: achieve.achieveMoney,
+						t3: '现金业绩',
+						projPercentage: achieve.commission,
+					};
+					achaeveList.push(achieveNew);
+				})
+				_this.cardInfo.bjmoney = _this.rechargeMoney;
+				_this.cardInfo.achaeveList = achaeveList;
+				let url = basePath + "/admin/moneyCardUse/cz";
+
+				console.log(_this.cardInfo);
+				AjaxProxy.requst({
+					app: _this,
+					data: _this.cardInfo,
+					url: url,
+					callback: function (data) {
+						if (_this.printPaper) {
+							_this.print();
+						}
+
+						if(parent.myGrid) {
+							parent.myGrid.serchData();
+						}
+
+						if (parent.app) {
+							parent.app.vipInfoFn();
+						}
+
+						_this.closeFrame();
+					}
+				});
+			},
+			cancelSubmit() {
+				this.closeFrame();
+			},
+			print() {
+				let _this = this;
+				if (_this.order.id) {
+					layer.open({
+						type: 2,
+						title: "打印订单",
+						area: ['250px', '550px'],
+						maxmin: true,
+						content: [basePath + '/admin/redirect/hive/beautySalon/print-order?id=' + this.order.id],
+						cancel: function (index, layero) {
+							_this.closeFram();
+						}
+					});
+				} else {
+					this.$message.warning("请先挂单在打印");
+				}
 
 
+			},
+			payMethodSelect(item, index) {
+				let _this = this;
+				let payMoneys = _this.payMoneys;
+				let rechargeMoney = _this.rechargeMoney;
+				if (!rechargeMoney) {
+					this.$message.warning("请输入充值金额");
+					return;
+				}
 
-	//添加一个美疗师
-	function addBeaute(trId, itemIndex) {
-		if (!itemIndex) {
-			itemIndex = 0;
+
+				if (item.type != '储值卡') {
+					this.$nextTick(function () {
+						if (item.isActive) {
+							Vue.set(item,'isActive',false);
+							var index = -1;
+							for (var i = 0; i < payMoneys.length; i++) {
+								let payMoney = payMoneys[i];
+								if (payMoney.value == item.value) {
+									index = i;
+									break;
+								}
+							}
+
+							if (index > -1) {
+								_this.payMoneys.splice(index, 1)
+							}
+						} else {
+							Vue.set(item,'isActive',true);
+							var hasAmount = 0;
+							for(var i = 0; i < payMoneys.length; i++) {
+								hasAmount += parseFloat(payMoneys[i].money);
+							}
+							Vue.set(item, 'money', _this.rechargeMoney - hasAmount);
+							_this.payMoneys.push(item);
+						}
+					});
+				}
+			},
+			closeFrame() {
+				parent.layer.close(parent.layer.getFrameIndex(window.name));
+			},
+			shareAchieve(index, row) {
+				row2 = JSON.parse(JSON.stringify(row));
+				row2.isShare = true;
+				this.achieveList.push(row2);
+			},
+			//删除业绩
+			delAchieve(index, row) {
+				this.achieveList.splice(index, 1);
+			},
 		}
-		var id = MTools.randomStr();
-		console.log(1);
-		var table = $("#" + trId).find("td").eq(3).find("table")
-
-		var achieveIndex = $("#" + trId).find("td").eq(3).find("table").find(
-				"tr").length;
-		var html = '<tr> <td><select class="autoFull select2 input-sm" id="'+id+'"  name="achaeveList['+achieveIndex+'].beaultId" '
-				+'data-url="'+basePath+'/admin/getShopStaffByRoleName?roleName=美疗师" data-value="suId" data-filed="suName" data-def=""'
-			+'name="beatuyId"> </select></td> <td><input autocomplete="off"   type="text" class="form-control input-sm"  value="0" style="width: 80px"  name="achaeveList['+achieveIndex+'].t1" '
-			+'name="items['+achieveIndex+'].zkPrice" ></td> <td><button class="btn btn-danger btn-sm"  onclick="deleteBeaute(this)" >删除</button></td> </tr>';
-		$("#" + trId).find("td").eq(3).find("table").append(html);
-		$('#' + id).select2({
-			'width' : '80px'
-		});
-		MTools.autoFullSelect({
-			selecteder : '#' + id
-		});
-	};
-	//删除一个美疗师
-	function deleteBeaute(node) {
-		$(node).closest("tr").remove();
-	}
-
-	//修改收款金额
-	function changePayMoney(trId, node) {
-		console.log(trId, node);
-		$("#" + trId).find("td").eq(2).html($(node).val());
-	};
+	});
+	//]]>
 </script>
 </body>
 </html>
\ No newline at end of file
diff --git a/zq-erp/src/main/resources/templates/views/admin/hive/beautySalon/order-form.html b/zq-erp/src/main/resources/templates/views/admin/hive/beautySalon/order-form.html
index b1e8763..5d91b37 100644
--- a/zq-erp/src/main/resources/templates/views/admin/hive/beautySalon/order-form.html
+++ b/zq-erp/src/main/resources/templates/views/admin/hive/beautySalon/order-form.html
@@ -75,6 +75,47 @@
         .arrears {
             color: #E6A23C;
         }
+
+        .paymethod ul {
+            padding: 0;
+            margin: 0;
+            height: 50px;
+        }
+        .paymethod ul li {
+            padding: 10px;
+            margin: 5px;
+            list-style:none;
+            float: left;
+            display: block;
+            cursor: pointer;
+            position: relative;
+            border: white 1px solid;
+        }
+        .paymethod ul li:hover {
+            border: #409EFF 1px solid;
+        }
+        .paymethod .active {
+            border: #409EFF 1px solid;
+        }
+        .paymethod .active::after {
+             content: '';
+             display: block;
+             height: 0px;
+             width: 0px;
+             position: absolute;
+             bottom: 0;
+             right: 0;
+             color:#fff;
+             /**对号大小*/
+             font-size: 10px;
+             line-height: 8px;
+             border: 3px solid;
+             border-color: transparent #4884ff #4884ff transparent;
+         }
+
+        .el-dialog__body {
+            padding-top: 10px !important;
+        }
     </style>
 </head>
 <body>
@@ -247,51 +288,51 @@
                         </template>
                     </el-table-column>
                     <el-table-column
-                            label="应付">
+                            label="小计">
                         <template slot-scope="scope">
                             {{scope.row.zkPrice * scope.row.count }}
                         </template>
                     </el-table-column>
 
-                    <el-table-column
-                            label="实付">
-                        <template slot-scope="scope">
-                            <el-input @change="calculationTotal(1)" v-model="scope.row.payMoney"></el-input>
-                        </template>
-                    </el-table-column>
+<!--                    <el-table-column-->
+<!--                            label="实付">-->
+<!--                        <template slot-scope="scope">-->
+<!--                            <el-input @change="calculationTotal(1)" v-model="scope.row.payMoney"></el-input>-->
+<!--                        </template>-->
+<!--                    </el-table-column>-->
 
-                    <el-table-column
-                            label="支付方式"
-                            width="130">
-                        <template slot-scope="scope">
-                            <el-select @change="changePayMethod(scope.row)" v-model="scope.row.payMethod"
-                                       placeholder="请选择支付方式">
-                                <el-option
-                                        v-for="item in payMethods"
-                                        :key="item.value"
-                                        :label="item.label"
-                                        :value="item.value"
-                                        :disabled="item.disabled">
-                                </el-option>
-                            </el-select>
-                        </template>
-                    </el-table-column>
+<!--                    <el-table-column-->
+<!--                            label="支付方式"-->
+<!--                            width="130">-->
+<!--                        <template slot-scope="scope">-->
+<!--                            <el-select @change="changePayMethod(scope.row)" v-model="scope.row.payMethod"-->
+<!--                                       placeholder="请选择支付方式">-->
+<!--                                <el-option-->
+<!--                                        v-for="item in payMethods"-->
+<!--                                        :key="item.value"-->
+<!--                                        :label="item.label"-->
+<!--                                        :value="item.value"-->
+<!--                                        :disabled="item.disabled">-->
+<!--                                </el-option>-->
+<!--                            </el-select>-->
+<!--                        </template>-->
+<!--                    </el-table-column>-->
 
 
-                    <el-table-column
-                            label="会员卡">
-                        <template slot-scope="scope">
-                            <el-select :disabled="scope.row.payMethod!='会员卡'" v-model="scope.row.payMethodDetail"
-                                       placeholder="请选择支付卡">
-                                <el-option
-                                        v-for="item in moneyCards"
-                                        :key="item.id"
-                                        :label="item.showLable"
-                                        :value="item.id">
-                                </el-option>
-                            </el-select>
-                        </template>
-                    </el-table-column>
+<!--                    <el-table-column-->
+<!--                            label="储值卡">-->
+<!--                        <template slot-scope="scope">-->
+<!--                            <el-select :disabled="scope.row.payMethod!='储值卡'" v-model="scope.row.payMethodDetail"-->
+<!--                                       placeholder="请选择支付卡">-->
+<!--                                <el-option-->
+<!--                                        v-for="item in moneyCards"-->
+<!--                                        :key="item.id"-->
+<!--                                        :label="item.showLable"-->
+<!--                                        :value="item.id">-->
+<!--                                </el-option>-->
+<!--                            </el-select>-->
+<!--                        </template>-->
+<!--                    </el-table-column>-->
                     <el-table-column
                             prop="address"
                             label="操作">
@@ -313,8 +354,9 @@
 
                             <li>订单总金额:{{order.total}}</li>
 
-                            <li v-if="order.arrears>0">订单欠款:<span class="arrears">{{order.arrears}}</span></li>
-                            <li v-if="order.arrears<0">找零:<span class="arrears">{{order.arrears}}</span></li>
+                            <li>整单折扣:<span class="arrears" v-if="order.zkTotal != null">{{order.total - order.zkTotal}}</span></li>
+<!--                            <li v-if="order.arrears>0">订单欠款:<span class="arrears">{{order.arrears}}</span></li>-->
+<!--                            <li v-if="order.arrears<0">找零:<span class="arrears">{{order.arrears}}</span></li>-->
                         </ul>
                     </div>
                     <div class="money">
@@ -327,7 +369,8 @@
                     <el-button type="primary" @click="submitOrder(2)">挂单</el-button>
                     <el-button type="primary" @click="print()">打印</el-button>
                     <el-button type="primary" @click="drawer = true">业绩设置</el-button>
-                    <el-button type="success" @click="confirmSubmit()" class="bigbtn"> 结算</el-button>
+                    <!--                    <el-button type="success" @click="confirmSubmit()" class="bigbtn"> 结算</el-button>-->
+                    <el-button type="success" @click="openPayMoney" class="bigbtn">收款 ¥{{order.payMoney}}</el-button>
                 </el-col>
             </el-row>
 
@@ -339,7 +382,7 @@
             title="业绩设置"
             :visible.sync="drawer"
             :direction="direction"
-            size="50%"
+            size="90%"
     >
         <el-row>
             <el-col :span="24">
@@ -371,14 +414,34 @@
                                 prop="orderItem.payMoney"
                                 label="收款">
                         </el-table-column>
+
                         <el-table-column
-                                label="业绩">
+                                label="业绩类型" width="150">
+                            <template slot-scope="scope">
+                                <el-select v-model="scope.row.t3" placeholder="请选择业绩类型">
+                                    <el-option
+                                            v-for="item in achieveTypeList"
+                                            :key="item.key"
+                                            :label="item.value"
+                                            :value="item.key">
+                                    </el-option>
+                                </el-select>
+                            </template>
+                        </el-table-column>
+                        <el-table-column
+                                label="业绩" width="100">
                             <template slot-scope="scope">
                                 <el-input v-model="scope.row.achieveMoney"></el-input>
                             </template>
                         </el-table-column>
                         <el-table-column
-                                label="员工">
+                                label="提成">
+                            <template slot-scope="scope">
+                                <el-input v-model="scope.row.commission"></el-input>
+                            </template>
+                        </el-table-column>
+                        <el-table-column
+                                label="员工" width="130">
                             <template slot-scope="scope">
                                 <el-select v-model="scope.row.saleId" placeholder="请选择员工">
                                     <el-option
@@ -391,7 +454,7 @@
                             </template>
                         </el-table-column>
                         <el-table-column
-                                width="200"
+                                width="150"
                                 label="操作">
                             <template slot-scope="scope">
                                 <el-button type="primary" v-if="scope.row.isShare"
@@ -411,6 +474,61 @@
         </el-row>
     </el-drawer>
 
+    <el-dialog title="收款" :visible.sync="dialogSettleVisible">
+        <el-row type="flex" align="middle" style="padding: 0 0 10px 0;">
+            <el-col :span="5" style="text-align: center;">应收</el-col>
+            <el-col :span="10" style="text-align: center; line-height: 50px;"><span style="color: red; font-size: 20px;">¥ {{order.payMoney}}</span></el-col>
+        </el-row>
+
+        <el-row type="flex" align="middle" style="padding: 10px 0;">
+            <el-col :span="5" style="text-align: center;">收款方式</el-col>
+            <el-col class="paymethod" :span="18">
+                <el-row>
+                    <ul>
+                        <span v-for="(item, index) in payMethods">
+                            <el-popover
+                                    :disabled="item.type != '储值卡'"
+                                    placement="bottom"
+                                    trigger="hover"
+                                    @hide="popoverHide(item)">
+                                <el-row style="text-align: center;"><span style="padding: 0 0 10px 0; display: block; font-size: 12px;">选择储值卡支付方式</span></el-row>
+                                <el-tree :data="moneyCards"
+                                        show-checkbox
+                                        default-expand-all
+                                        node-key="id"
+                                        ref="tree"
+                                         check-strictly
+                                         highlight-current
+                                         @check="(click, checked,$item)=>{handleCheckChange(click, checked,$item)}"
+                                         :props="defaultProps">
+                                </el-tree>
+                                <li :class="{active : item.isActive}" slot="reference" @click="payMethodSelect(item, index)"><div style=" height:30px; line-height: 30px; display: flex; align-items: center"><img style="width: 25px; height: 25px; align-items: center;" :src="item.img"><span style="margin-left: 5px;">{{item.value}}</span></div></li>
+                            </el-popover>
+                        </span>
+                    </ul>
+                </el-row>
+            </el-col>
+        </el-row>
+
+        <el-row type="flex" align="middle" style="padding: 10px 0 50px 0;">
+            <el-col :span="5" style="text-align: center;">支付金额</el-col>
+            <el-col :span="15">
+                <el-row style="line-height: 50px;" v-for="(item, index) in payMoneys">
+                    <el-col :span="6" style="text-align: right; padding-right: 10px; font-size: 12px;">{{item.value}}</el-col>
+                    <el-col :span="8"><el-input v-model="item.money"></el-input></el-col>
+                    <el-col :span="8" style="margin-left: 10px;" v-if="item.type == '储值卡'">{{item.isGift == 1 ? '赠送余额' : '余额' }}:<span class="arrears">¥ {{item.balance}}</span></el-col>
+                </el-row>
+            </el-col>
+        </el-row>
+
+        <el-row style="text-align: center; margin: 20px 0 10px 0">
+            <el-checkbox v-model="printPaper">打印小票</el-checkbox>
+        </el-row>
+
+        <el-row style="text-align: center; margin: 10px 0 0 0">
+            <el-button type="primary" @click="confirmSubmit">确认收款</el-button>
+        </el-row>
+    </el-dialog>
 
 </div>
 </body>
@@ -440,6 +558,7 @@
             direction: 'rtl',
             //当前登录用户
             loginUser: {},
+            staffUser:{},
             //业绩用户列表
             userList: [],
             order: {
@@ -456,26 +575,51 @@
             currentVipInfo: {},
             vipLoading: false,
             payMethods: [{
-                value: '现金',
-                label: '现金'
+                value: '现金支付',
+                img: '/images/pay/cash.png',
+                isActive: false,
+                type: '现金支付'
             }, {
                 value: '微信',
-                label: '微信'
+                img: '/images/pay/wechat.png',
+                isActive: false,
+                type: '微信'
             }, {
                 value: '支付宝',
-                label: '支付宝'
+                img: '/images/pay/zhifubao.png',
+                isActive: false,
+                type: '支付宝'
             }, {
                 value: '银行卡',
-                label: '银行卡'
+                img: '/images/pay/yinlian.png',
+                isActive: false,
+                type: '银行卡'
             }, {
-                value: '美团',
-                label: '美团'
+                value: '团购',
+                img: '/images/pay/tuan.png',
+                isActive: false,
+                type: '团购'
             }, {
-                value: '会员卡',
-                label: '会员卡',
-                disabled: true,
+                value: '储值卡',
+                img: '/images/pay/card.png',
+                isActive: false,
+                type: '储值卡'
+            },{
+                value: '欠款',
+                img: '/images/pay/qian.png',
+                isActive: false,
+                type: '欠款'
             },],
             achieveList: [],
+            achieveTypeList : [
+                {
+                    "key" : "现金业绩",
+                    "value" : "现金业绩"
+                },{
+                    "key" : "划扣业绩",
+                    "value" : "划扣业绩"
+                },
+            ],
             //会员可用的充值卡
             moneyCards: [],
             //门店信息
@@ -495,6 +639,14 @@
             loading: false,
             /******搜索表格数据END********/
 
+            dialogSettleVisible : false,
+            defaultProps: {
+                children: 'children',
+                label: 'showLable'
+            },
+            treeSelect : [],
+            payMoneys : [],
+            printPaper : true,
 
         },
 
@@ -504,62 +656,7 @@
         created: function () {
             let _this = this;
 
-            //获取登录用户信息
-            AjaxProxy.requst({
-                app: _this,
-                url: basePath + '/admin/getLoginUser',
-                callback: function (data) {
-                    _this.loginUser = data.mapInfo.user;
-
-                    if (id) {
-                        //加载订单信息
-                        AjaxProxy.requst({
-                            app: _this,
-                            url: basePath + '/admin/order/findOrderById/' + id,
-                            callback: function (data) {
-                                _this.order = data.rows[0];
-                                //修改支付金额
-                                _this.changeVip(_this.order.vipId);
-                                let items = _this.order.items;
-                                let orderPayMoney = 0;
-                                //设置欠款订单设置欠款金额等于支付金额,非欠款订单设置折扣金额等于支付金额
-                                items.forEach(item => {
-                                    if (item.arrears > 0) {
-                                        item.payMoney = item.arrears;
-                                    } else {
-                                        item.payMoney = item.zkPrice;
-                                    }
-                                    orderPayMoney += item.payMoney;
-
-                                    //业绩设置
-                                    _this.achieveList.push({
-                                        orderItem: item,
-                                        staff: _this.loginUser,
-                                        saleId: _this.loginUser.suId,
-                                        achieveMoney: item.payMoney,
-                                        isShare: false,
-                                    });
-                                });
-                                _this.order.payMoney = orderPayMoney;
-                            }
-                        });
-
-                    } else {
-                        //获取门店信息
-                        AjaxProxy.requst({
-                            app: _this,
-                            url: basePath + '/admin/shopInfo/findUserShop',
-                            callback: function (data) {
-                                _this.order.shopName = data.rows[0].shopName;
-
-                            }
-                        });
-                    }
-
-
-                }
-            });
-
+            _this.initMethod()
             if (vipId) {
                 _this.changeVip(vipId);
             }
@@ -572,10 +669,79 @@
                 }
             });
 
-
         },
 
         methods: {
+            initMethod() {
+                let _this = this;
+
+                //获取登录用户信息
+                AjaxProxy.requst({
+                    app: _this,
+                    url: basePath +  '/admin/getLoginUser',
+                    callback: function (data) {
+                        _this.loginUser = data.mapInfo.user;
+
+                        if (id) {
+                            //加载订单信息
+                            AjaxProxy.requst({
+                                app: _this,
+                                url: basePath + '/admin/order/findOrderById/' + id,
+                                callback: function (data) {
+                                    _this.order = data.rows[0];
+                                    //修改支付金额
+                                    _this.changeVip(_this.order.vipId);
+
+                                    AjaxProxy.requst({
+                                        app: _this,
+                                        url: basePath + '/admin/getUserById?id='+_this.order.staffId,
+                                        callback: function (data) {
+                                            _this.staffUser = data.mapInfo.user;
+
+                                            let items = _this.order.items;
+                                            let orderPayMoney = 0;
+                                            //设置欠款订单设置欠款金额等于支付金额,非欠款订单设置折扣金额等于支付金额
+                                            items.forEach(item => {
+                                                if (item.arrears > 0) {
+                                                    item.payMoney = item.arrears;
+                                                } else {
+                                                    item.payMoney = item.zkPrice;
+                                                }
+                                                orderPayMoney += item.payMoney;
+                                                item.uuid = MTools.uuid();
+                                                //业绩设置
+                                                _this.achieveList.push({
+                                                    orderItem: item,
+                                                    staff: _this.staffUser,
+                                                    saleId: _this.staffUser.suId,
+                                                    achieveMoney: item.payMoney,
+                                                    commission : 0,
+                                                    t3 : '现金业绩',
+                                                    isShare: false,
+                                                });
+                                            });
+                                            _this.order.payMoney = orderPayMoney;
+                                        }
+                                    });
+                                }
+                            });
+
+                        } else {
+                            //获取门店信息
+                            AjaxProxy.requst({
+                                app: _this,
+                                url: basePath + '/admin/shopInfo/findUserShop',
+                                callback: function (data) {
+                                    _this.order.shopName = data.rows[0].shopName;
+
+                                }
+                            });
+                        }
+
+
+                    }
+                });
+            },
 
             //取消订单
             closeFram() {
@@ -584,7 +750,7 @@
 
             changePayMethod(item) {
                 console.log("changePayMethod", item);
-                if (item.payMethod != '会员卡') {
+                if (item.payMethod != '储值卡') {
                     item.payMethodDetail = '';
                 }
             },
@@ -598,17 +764,25 @@
                         contentType: 'application/x-www-form-urlencoded',
                         url: basePath + '/admin/moneyCardUse/getUseMoneyCard',
                         callback: function (data) {
-                            console.log(_this.moneyCards)
                             if (data.rows.length > 0) {
                                 data.rows.forEach(function (item, index, input) {
-                                    item.showLable = item.cardName + "-余额:" + (item.realMoney + item.giftMoney)
+                                    item.showLable = item.cardName + "-余额:" + (item.realMoney)
+                                    item.uuid = MTools.uuid();
+                                    if (item.giftMoney != 0) {
+                                        var children = [];
+                                        var gift = {};
+                                        gift.id = item.id;
+                                        gift.giftMoney = item.giftMoney;
+                                        gift.showLable = item.cardName + '-赠送金额' + item.giftMoney;
+                                        gift.cardName = item.cardName;
+                                        gift.isGift = 1;
+                                        gift.uuid = MTools.uuid();
+                                        children.push(gift);
+                                        item.children = children;
+                                    }
                                 });
+                                console.log(data.rows)
                                 _this.moneyCards = data.rows;
-                                //启用会员卡支付方式
-                                _this.payMethods[5].disabled = false;
-                            } else {
-                                //禁用会员卡支付方式
-                                _this.payMethods[5].disabled = true;
                             }
 
                         }
@@ -661,15 +835,29 @@
                     }
                     item.count = 1;
 
-
-                    //加入业绩
-                    this.achieveList.push({
-                        orderItem: item,
-                        staff: this.loginUser,
-                        saleId: this.loginUser.suId,
-                        achieveMoney: item.payMoney,
-                        isShare: false,
-                    });
+                    if (this.staffUser.suId) {
+                        //加入业绩
+                        this.achieveList.push({
+                            orderItem: item,
+                            staff: this.staffUser,
+                            saleId: this.staffUser.suId,
+                            achieveMoney: item.payMoney,
+                            t3: '现金业绩',
+                            commission: 0,
+                            isShare: false,
+                        });
+                    } else {
+                        //加入业绩
+                        this.achieveList.push({
+                            orderItem: item,
+                            staff: this.loginUser,
+                            saleId: this.loginUser.suId,
+                            achieveMoney: item.payMoney,
+                            t3: '现金业绩',
+                            commission: 0,
+                            isShare: false,
+                        });
+                    }
                     this.order.items.push(item);
                 }
 
@@ -711,12 +899,19 @@
                                     item.payMoney = zkPrice * count;
                                 }
                                 _this.order.payMoney += parseFloat(item.payMoney);
+
+                                _this.achieveList.forEach(achieve=>{
+                                    if(achieve.orderItem==item){
+                                        achieve.achieveMoney=item.payMoney;
+                                    }
+                                })
                             });
+                            _this.order.payMoney = _this.order.payMoney.toFixed(2);
                             //计算欠款
-                            _this.order.arrears = _this.order.zkTotal - _this.order.payMoney;
-                            if (_this.order.arrears < 0) {
-                                _this.$message.error("支付金额不能大于应收金额");
-                            }
+                            // _this.order.arrears = _this.order.zkTotal - _this.order.payMoney;
+                            // if (_this.order.arrears < 0) {
+                            //     _this.$message.error("支付金额不能大于应收金额");
+                            // }
                         }
                     })
                 }
@@ -747,30 +942,38 @@
              */
             submitOrder(submitType) {
 
-
-
-
                 if (this.checkSubmitOrder()) {
                     let _this = this;
 
-
-                    //检查支付方式
-                    let hasPayMethod=true;
-                    _this.order.items.forEach(item=>{
-                        if(!item.payMethod){
-                            hasPayMethod=false;
-                            return;
+                    if(submitType == 1) {
+                        if (_this.payMoneys.length > 0) {
+                            let flows = []
+                            var total = 0;
+                            _this.payMoneys.forEach(item => {
+                                let flow = {};
+                                flow.payMethod = item.type;
+                                if (!item.money) {
+                                    this.$message.warning("请输入" + item.type + "的付款金额");
+                                    return false;
+                                }
+                                flow.amount = parseFloat(item.money);
+                                if (item.type == '储值卡'){
+                                    flow.isGift = item.isGift;
+                                    flow.cardId = item.id;
+                                }
+                                total += parseFloat(item.money);
+                                flows.push(flow)
+                            })
+                            if (total != _this.order.payMoney) {
+                                this.$message.warning("输入付款总金额与应付金额不符");
+                                return false;
+                            }
+                            _this.order.flows = flows;
+                        } else {
+                            this.$message.warning("请选择支付方式");
+                            return false;
                         }
-                    });
-                    if(!hasPayMethod){
-                        this.$message.warning("请选择支付方式");
-                        return false;
                     }
-
-
-
-
-
 
                     //匹配业绩
                     _this.achieveList.forEach(achieve => {
@@ -781,15 +984,30 @@
                             }
                             if (item.uuid == achieve.orderItem.uuid) {
                                 let achieveNew = {
+                                    uuid:item.uuid,
                                     beaultId: achieve.saleId,
-                                    t1: achieve.achieveMoney
+                                    t1: achieve.achieveMoney,
+                                    t3: achieve.t3,
+                                    projPercentage: achieve.commission,
                                 };
-                                item.achaeveList.push(achieveNew);
+
+                                var flag = true;
+                                for(var j = 0; j < item.achaeveList.length; j++) {
+                                    if(item.achaeveList[j].uuid == achieveNew.uuid && item.achaeveList[j].beaultId == achieveNew.beaultId) {
+                                        flag = false;
+                                        break;
+                                    }
+                                }
+
+                                if (flag) {
+                                    item.achaeveList.push(achieveNew);
+                                }
                                 break;
                             }
                         }
                     })
 
+                    console.log(_this.order);
                     //校验业绩金额
                     if (_this.checkAchieve()) {
                         let url = basePath + "/admin/order/payOrder";
@@ -807,19 +1025,32 @@
                                 _this.order.orderNo = order.orderNo;
                                 //结算打印提示
                                 if (submitType == 1) {
-                                    _this.$confirm('结算成功,是否立刻打印小票?', '提示', {
-                                        confirmButtonText: '打印',
-                                        cancelButtonText: '取消',
-                                        type: 'warning'
-                                    }).then(() => {
+                                    if (_this.printPaper) {
                                         _this.print();
+                                    } else {
+                                        _this.$message.success({
+                                            message : data.info,
+                                            duration : 1000,
+                                            onClose() {
+                                                _this.closeFram();
+                                            }
+                                        });
+                                    }
 
-                                    }).catch(() => {
-                                        _this.closeFram();
-                                    });
+                                    // _this.$confirm('结算成功,是否立刻打印小票?', '提示', {
+                                    //     confirmButtonText: '打印',
+                                    //     cancelButtonText: '取消',
+                                    //     type: 'warning'
+                                    // }).then(() => {
+                                    //     _this.print();
+                                    //
+                                    // }).catch(() => {
+                                    //     _this.closeFram();
+                                    // });
                                 } else {
                                     _this.$message.success(data.info);
                                 }
+
                                 if(parent.myGrid) {
                                     parent.myGrid.serchData();
                                 }
@@ -839,7 +1070,7 @@
              */
             checkAchieve() {
                /*
-               //TODO 前端展示不检测,因为考虑到会员卡支付问题
+               //TODO 前端展示不检测,因为考虑到储值卡支付问题
                let _this = this;
                 for (let i = 0; i < _this.order.items.length; i++) {
                     if (_this.achieveList.length > 0) {
@@ -878,10 +1109,10 @@
                             this.$message.warning("折扣单价填写不正确");
                             return false;
                         }
-                        if (!(MTools.isRealNum(item.payMoney) && item.payMoney >= 0)) {
-                            this.$message.warning("实付金额填写不正确");
-                            return false;
-                        }
+                        // if (!(MTools.isRealNum(item.payMoney) && item.payMoney >= 0)) {
+                        //     this.$message.warning("实付金额填写不正确");
+                        //     return false;
+                        // }
                     })
                 } else {
                     this.$message.warning("请选择要购买的产品");
@@ -921,6 +1152,9 @@
                     }
                 });
                 this.achieveList = achieveListNew;
+                this.order.zkTotal = 0;
+                this.order.total = 0;
+                this.order.payMoney = 0;
                 this.calculationTotal();
             },
 
@@ -1022,6 +1256,94 @@
 
 
             },
+            payMethodSelect(item, index) {
+                let _this = this;
+                let payMoneys = _this.payMoneys;
+                if (item.type != '储值卡') {
+                    this.$nextTick(function () {
+                        if (item.isActive) {
+                            Vue.set(item,'isActive',false);
+                            var index = -1;
+                            for (var i = 0; i < payMoneys.length; i++) {
+                                let payMoney = payMoneys[i];
+                                if (payMoney.value == item.value) {
+                                    index = i;
+                                    break;
+                                }
+                            }
+
+                            if (index > -1) {
+                                _this.payMoneys.splice(index, 1)
+                            }
+                        } else {
+                            Vue.set(item,'isActive',true);
+                            var hasAmount = 0;
+                            for(var i = 0; i < payMoneys.length; i++) {
+                                hasAmount += parseFloat(payMoneys[i].money);
+                            }
+                            if (_this.order.payMoney - hasAmount > 0) {
+                                Vue.set(item, 'money', _this.order.payMoney - hasAmount);
+                            }
+                            _this.payMoneys.push(item);
+                        }
+                    });
+                }
+            },
+            popoverHide(item) {
+                if(this.treeSelect.length <= 0) {
+                    Vue.set(item, 'isActive', false)
+                } else {
+                    Vue.set(item, 'isActive', true)
+                }
+            },
+            handleCheckChange(clickNode, checked) {
+                let _this = this;
+
+                let nodes = checked.checkedNodes;
+                _this.treeSelect = nodes;
+                var index = -1;
+                // 判断点击节点是否在已展示支付方式中
+                for(var i = 0; i < _this.payMoneys.length; i++) {
+                    let node = _this.payMoneys[i];
+                    if (node.uuid === clickNode.uuid) {
+                        index = i;
+                        break;
+                    }
+                }
+
+                // 若点击节点在选中节点中,且已展示支付方式不存在,则添加
+                if (nodes.indexOf(clickNode) > -1 && index === -1) {
+                    var node = clickNode;
+                    var item = {};
+                    if (node.isGift) {
+                        item.value = node.cardName;
+                        item.balance = node.giftMoney;
+                        item.isGift = 'Y';
+                    } else {
+                        item.value = node.cardName;
+                        item.balance = node.realMoney;
+                        item.isGift = 'N';
+                    }
+                    item.type = '储值卡';
+                    item.id = node.id;
+                    item.uuid = clickNode.uuid;
+                    _this.payMoneys.push(item);
+                }
+
+                // 若点击节点不存在选中节点中,且已展示支付方式中存在,则移除
+                if (nodes.indexOf(clickNode) === -1 && index > -1) {
+                    _this.payMoneys.splice(index, 1);
+                }
+            },
+            openPayMoney() {
+                let _this = this;
+                if (!_this.order.items.length > 0) {
+                    this.$message.warning("请选择要购买的产品");
+                    return false;
+                }
+
+                _this.dialogSettleVisible = true;
+            }
         }
 
     })
diff --git a/zq-erp/src/main/resources/templates/views/admin/hive/beautySalon/orderXq-form-bak2.html b/zq-erp/src/main/resources/templates/views/admin/hive/beautySalon/orderXq-form-bak2.html
new file mode 100644
index 0000000..1797130
--- /dev/null
+++ b/zq-erp/src/main/resources/templates/views/admin/hive/beautySalon/orderXq-form-bak2.html
@@ -0,0 +1,170 @@
+<!DOCTYPE HTML>
+<html xmlns:th="http://www.thymeleaf.org" xmlns:matrix="http://www.w3.org/1999/xhtml">
+<head>
+    <meta charset="utf-8">
+    <META HTTP-EQUIV="Pragma" CONTENT="no-cache">
+    <meta name="renderer" content="webkit|ie-comp|ie-stand">
+    <meta http-equiv="X-UA-Compatible" content="IE=edge,chrome=1">
+    <meta name="viewport"
+          content="width=device-width,initial-scale=1,minimum-scale=1.0,maximum-scale=1.0,user-scalable=no"/>
+    <meta http-equiv="Cache-Control" content="no-siteapp"/>
+    <LINK rel="Bookmark" href="../images/favicon.ico">
+    <!-- 本框架基本脚本和样式 -->
+    <script type="text/javascript" th:src="@{/js/systools/MBaseVue.js}"></script>
+    <script type="text/javascript" th:src="@{/js/plugin/jquery-2.1.4.min.js}"></script>
+    <script type="text/javascript" th:src="@{/plugin/moment.min.js}"></script>
+    <script type="text/javascript" th:src="@{/js/systools/MBase.js}"></script>
+    <script type="text/javascript" th:src="@{/js/function/vip.js}"></script>
+    <link rel="stylesheet" th:href="@{/plugin/element-ui/index.css}">
+
+    <script type="text/javascript" th:src="@{/js/function/vip.js}"></script>
+    <script type="text/javascript" th:src="@{/js/function/meiduCommon.js}"></script>
+    <title></title>
+    <style>
+        .ibox-content {
+            background-color: rgba(240, 242, 245, 1);
+        }
+    </style>
+</head>
+<div class="ibox-content" id="app">
+    <el-container>
+        <el-header style="height: 210px; background-color: white; margin: 15px;">
+            <el-row style="line-height: 60px; padding-top: 20px;">
+                <el-col :span="1" style="font-size: 40px; color:#409EFF;">
+                    <i class="el-icon-s-order" type="primary"></i>
+                </el-col>
+                <el-col :span="10">
+                    <h1 style="line-height: 60px; margin: 0 0;">订单号:{{order.orderNo}}</h1>
+                </el-col>
+                <el-col :span="5" style="float: right; margin-right: 10px;">
+                    <el-button type="info" @click="printf">打印</el-button>
+                    <el-button type="danger" @click="toBack">返回</el-button>
+                </el-col>
+            </el-row>
+            <el-row class="order-info" type="flex" justify="space-around"  style="height: 150px; padding: 30px 30px;">
+                <el-col :span="5">
+                    <p>顾问姓名:{{order.staffName}}</p>
+                    <p>会员姓名:{{order.vipName}}</p>
+                    <p>会员编号:{{order.vipNo}}</p>
+                </el-col>
+                <el-col :span="5">
+                    <p>卡支付:{{order.cardPay}}</p>
+                    <p>现金支付:{{order.cashPay}}</p>
+                    <p>备注:{{order.remark}}</p>
+                </el-col>
+                <el-col :span="10">
+                    <el-col :span="6">
+                        <p>欠款总额</p>
+                        <h2>¥ {{order.arrears}}</h2>
+                    </el-col>
+                    <el-col :span="6">
+                        <p>折后总额</p>
+                        <h2>¥ {{order.zkTotal}}</h2>
+                    </el-col>
+                    <el-col :span="6">
+                        <p>订单总额</p>
+                        <h2>¥ {{order.total}}</h2>
+                    </el-col>
+                </el-col>
+            </el-row>
+        </el-header>
+        <el-main style="background-color: white; margin: 15px; padding: 20px 30px;">
+            <el-tabs v-model="activeName" @tab-click="handleClick">
+                <el-tab-pane label="商品" name="goods">
+                    <el-table :data="orderData"
+                            style="width: 100%">
+                        <el-table-column
+                                prop="shoppingGoods.name"
+                                label="商品名称"
+                                width="300">
+                        </el-table-column>
+                        <el-table-column
+                                prop="price"
+                                label="单价"
+                                width="80">
+                        </el-table-column>
+                        <el-table-column
+                                prop="count"
+                                label="购买数量">
+                        </el-table-column>
+                        <el-table-column
+                                prop="zkPrice"
+                                label="折后金额">
+                        </el-table-column>
+                        <el-table-column
+                                prop="cardPay"
+                                label="卡付款">
+                        </el-table-column>
+                        <el-table-column
+                                prop="cashPay"
+                                label="现金付款">
+                        </el-table-column>
+                        <el-table-column
+                                prop="arrears"
+                                label="欠款">
+                        </el-table-column>
+                    </el-table>
+                </el-tab-pane>
+                <el-tab-pane label="业绩" name="yj">业绩</el-tab-pane>
+            </el-tabs>
+        </el-main>
+    </el-container>
+</div>
+</body>
+
+<script type="text/javascript" th:src="@{/js/plugin/LodopFuncs.js}"></script>
+<script type="text/javascript" th:src="@{/js/systools/AjaxProxyVue.js}"></script>
+<script type="text/javascript" th:src="@{/js/plugin/vue.js}"></script>
+<script type="text/javascript" th:src="@{/plugin/element-ui/index.js}"></script>
+<script type="text/javascript" th:src="@{/js/systools/MJsBase.js}"></script>
+<script type="text/javascript"  th:inline="javascript">
+    //<![CDATA[
+    var app = new Vue({
+        el : "#app",
+        data : {
+            activeName : "goods",
+            order : "",
+            orderItems : "",
+            cards : "",
+            orderData : []
+        },
+        created : function() {
+            this.order = /*[[${order}]]*/
+            this.orderItems = /*[[${orderItems}]]*/
+            this.cards = /*[[${cards}]]*/
+
+            this.orderData = this.order.items;
+        },
+        methods : {
+            handleClick(tab, event) {
+            },
+            printf() {
+                var id = 1;
+                layer.open({
+                    type: 2,
+                    title: "打印服务单",
+                    area: ['250px', '550px'],
+                    maxmin: true,
+                    content: [basePath + '/admin/redirect/hive/beautySalon/print-service?id=' + id]
+                });
+            },
+            toBack() {
+                MTools.closeForm();
+            },
+        }
+    });
+    //]]>
+    function print() {
+        var id=$("#orderId").val();
+        layer.open({
+            type: 2,
+            title: "打印订单",
+            area: ['250px', '550px'],
+            maxmin: true,
+            content: [basePath + '/admin/redirect/hive/beautySalon/print-order?id=' + id]
+        });
+    };
+
+
+</script>
+</html>
\ No newline at end of file
diff --git a/zq-erp/src/main/resources/templates/views/admin/hive/beautySalon/orderXq-form.html b/zq-erp/src/main/resources/templates/views/admin/hive/beautySalon/orderXq-form.html
index 1797130..bd63766 100644
--- a/zq-erp/src/main/resources/templates/views/admin/hive/beautySalon/orderXq-form.html
+++ b/zq-erp/src/main/resources/templates/views/admin/hive/beautySalon/orderXq-form.html
@@ -11,142 +11,905 @@
     <LINK rel="Bookmark" href="../images/favicon.ico">
     <!-- 本框架基本脚本和样式 -->
     <script type="text/javascript" th:src="@{/js/systools/MBaseVue.js}"></script>
-    <script type="text/javascript" th:src="@{/js/plugin/jquery-2.1.4.min.js}"></script>
     <script type="text/javascript" th:src="@{/plugin/moment.min.js}"></script>
     <script type="text/javascript" th:src="@{/js/systools/MBase.js}"></script>
     <script type="text/javascript" th:src="@{/js/function/vip.js}"></script>
     <link rel="stylesheet" th:href="@{/plugin/element-ui/index.css}">
 
-    <script type="text/javascript" th:src="@{/js/function/vip.js}"></script>
     <script type="text/javascript" th:src="@{/js/function/meiduCommon.js}"></script>
     <title></title>
     <style>
         .ibox-content {
             background-color: rgba(240, 242, 245, 1);
         }
+        .aside label {
+            width: 100%;
+            margin: 5px 0 !important;
+        }
+        .arrears {
+            color: #E6A23C;
+        }
+
+        .paymethod ul {
+            padding: 0;
+            margin: 0;
+            height: 50px;
+        }
+        .paymethod ul li {
+            padding: 10px;
+            margin: 5px;
+            list-style:none;
+            float: left;
+            display: block;
+            cursor: pointer;
+            position: relative;
+            border: white 1px solid;
+        }
+        .paymethod ul li:hover {
+            border: #409EFF 1px solid;
+        }
+        .paymethod .active {
+            border: #409EFF 1px solid;
+        }
+        .paymethod .active::after {
+            content: '';
+            display: block;
+            height: 0px;
+            width: 0px;
+            position: absolute;
+            bottom: 0;
+            right: 0;
+            color:#fff;
+            /**对号大小*/
+            font-size: 10px;
+            line-height: 8px;
+            border: 3px solid;
+            border-color: transparent #4884ff #4884ff transparent;
+        }
+
+        .el-dialog__body {
+            padding-top: 10px !important;
+        }
     </style>
 </head>
 <div class="ibox-content" id="app">
     <el-container>
-        <el-header style="height: 210px; background-color: white; margin: 15px;">
-            <el-row style="line-height: 60px; padding-top: 20px;">
-                <el-col :span="1" style="font-size: 40px; color:#409EFF;">
-                    <i class="el-icon-s-order" type="primary"></i>
-                </el-col>
-                <el-col :span="10">
-                    <h1 style="line-height: 60px; margin: 0 0;">订单号:{{order.orderNo}}</h1>
-                </el-col>
-                <el-col :span="5" style="float: right; margin-right: 10px;">
-                    <el-button type="info" @click="printf">打印</el-button>
-                    <el-button type="danger" @click="toBack">返回</el-button>
+        <el-aside class="aside" style="width: 300px; background-color: white; padding: 10px;">
+            <el-row style="border-bottom: #E4E7ED 1px solid;">
+                <el-col :span="20" style="padding: 10px;">
+                    <el-row type="flex" align="middle">
+                        <el-col :span="7">
+                            <el-avatar :size="60" :src="circleUrl"></el-avatar>
+                        </el-col>
+                        <el-col :span="15" style="margin-left: 10px;">
+                            <label>{{vipInfo.vipName}}({{vipInfo.vipLevel == null ? '' : vipInfo.vipLevel.levelName}})</label>
+                            <label>{{vipInfo.vipNo}}</label>
+                        </el-col>
+                    </el-row>
+                    <el-row style="line-height: 20px;">
+                        <label>订单号: <span>{{order.orderNo}}</span></label>
+                        <label>下单顾问: <span>{{order.staffName}}</span></label>
+                        <label>消费门店: <span>{{order.shopShortName}}</span></label>
+                        <label>订单时间: <span>{{order.orderTime}}</span></label>
+                        <label>备  注: <span>{{order.remark}}</span></label>
+                    </el-row>
                 </el-col>
             </el-row>
-            <el-row class="order-info" type="flex" justify="space-around"  style="height: 150px; padding: 30px 30px;">
-                <el-col :span="5">
-                    <p>顾问姓名:{{order.staffName}}</p>
-                    <p>会员姓名:{{order.vipName}}</p>
-                    <p>会员编号:{{order.vipNo}}</p>
-                </el-col>
-                <el-col :span="5">
-                    <p>卡支付:{{order.cardPay}}</p>
-                    <p>现金支付:{{order.cashPay}}</p>
-                    <p>备注:{{order.remark}}</p>
-                </el-col>
-                <el-col :span="10">
-                    <el-col :span="6">
-                        <p>欠款总额</p>
-                        <h2>¥ {{order.arrears}}</h2>
-                    </el-col>
-                    <el-col :span="6">
-                        <p>折后总额</p>
-                        <h2>¥ {{order.zkTotal}}</h2>
-                    </el-col>
-                    <el-col :span="6">
-                        <p>订单总额</p>
-                        <h2>¥ {{order.total}}</h2>
-                    </el-col>
+            <el-row style="padding: 10px; border-bottom: #E4E7ED 1px solid;">
+                <el-col :span="24">
+                    <el-row>
+                        <el-col :span="6" style="text-align: right;">
+                            <label>总金额</label>
+                            <label>整单折扣</label>
+                            <label style="font-size: 14px;">应收金额</label>
+                            <label>欠款</label>
+                            <label>已还</label>
+                            <label v-if="order.refund != 0">退款</label>
+                        </el-col>
+                        <el-col :span="14" style="text-align: right;">
+                            <label>¥ {{order.total}}</label>
+                            <label>¥ {{(order.zkTotal - order.total).toFixed(2)}}</label>
+                            <label>¥ {{order.zkTotal}}</label>
+                            <label>¥ {{order.arrears}}</label>
+                            <label>¥ {{order.repay}}</label>
+                            <label v-if="order.refund != 0">¥ {{order.refund}}</label>
+                        </el-col>
+                    </el-row>
                 </el-col>
             </el-row>
-        </el-header>
-        <el-main style="background-color: white; margin: 15px; padding: 20px 30px;">
+            <el-row style="padding: 10px; border-bottom: #E4E7ED 1px solid;">
+                <el-col :span="24">
+                    <el-row>
+                        <h3>收款明细</h3>
+                    </el-row>
+                    <el-row>
+                        <el-col :span="6" style="text-align: right;">
+                            <label v-for="(item, index) in payMethodItems">{{item.payMethod}}</label>
+                        </el-col>
+                        <el-col :span="14" style="text-align: right;">
+                            <label v-for="(item, index) in payMethodItems">¥ {{item.amount}}</label>
+                        </el-col>
+                    </el-row>
+                </el-col>
+            </el-row>
+            <el-row type="flex" justify="center" style="margin: 20px;">
+                <el-button size="medium" type="primary" @click="printf">打印</el-button>
+            </el-row>
+        </el-aside>
+        <el-main style="background-color: white; margin-right: 15px; margin-left: 15px; padding: 20px 30px;">
             <el-tabs v-model="activeName" @tab-click="handleClick">
-                <el-tab-pane label="商品" name="goods">
-                    <el-table :data="orderData"
+                <el-tab-pane label="订单明细" name="first">
+                    <el-row>
+                        <el-button size="mini" type="primary" @click="openPayMoneyDialog" v-if="isRefund">提交退款<span v-if="totalRefund"> ¥ {{totalRefund}}</span></el-button>
+                        <el-button size="mini" type="danger" @click="isRefund = false" v-if="isRefund">取消</el-button>
+                        <el-button size="mini" type="primary" @click="isRefund = true" v-if="order.statu == '已付款' && !isRefund">退款</el-button>
+                    </el-row>
+                    <el-row v-show="!isRefund">
+                        <el-table
+                                :data="orderItems"
+                                style="width: 100%">
+                            <el-table-column
+                                    type="index"
+                                    width="50">
+                            </el-table-column>
+                            <el-table-column
+                                    prop="shoppingGoods.code"
+                                    label="产品编号"
+                                    width="100">
+                            </el-table-column>
+                            <el-table-column
+                                    prop="shoppingGoods.name"
+                                    label="产品名称"
+                                    width="280">
+                            </el-table-column>
+                            <el-table-column
+                                    prop="shoppingGoods.goodType"
+                                    label="产品类型">
+                            </el-table-column>
+                            <el-table-column
+                                    prop="price"
+                                    label="单价">
+                            </el-table-column>
+                            <el-table-column
+                                    prop="count"
+                                    label="数量">
+                            </el-table-column>
+                            <el-table-column
+                                    prop="zkPrice"
+                                    label="折扣单价">
+                            </el-table-column>
+                            <el-table-column  label="小计" :formatter="calOrderTotalFormatter">
+                            </el-table-column>
+                        </el-table>
+                    </el-row>
+                    <el-row v-show="isRefund">
+                        <el-table
+                                :data="orderItems"
+                                style="width: 100%">
+                            <el-table-column
+                                    type="index"
+                                    width="50">
+                            </el-table-column>
+                            <el-table-column
+                                    prop="shoppingGoods.code"
+                                    label="产品编号"
+                                    width="100">
+                            </el-table-column>
+                            <el-table-column
+                                    prop="shoppingGoods.name"
+                                    label="产品名称"
+                                    width="280">
+                            </el-table-column>
+                            <el-table-column
+                                    prop="shoppingGoods.goodType"
+                                    label="产品类型">
+                            </el-table-column>
+                            <el-table-column
+                                    prop="zkPrice"
+                                    label="单价">
+                            </el-table-column>
+                            <el-table-column
+                                    prop="count"
+                                    label="可退数量">
+                            </el-table-column>
+                            <el-table-column label="退款单价">
+                                <template slot-scope="scope">
+                                    <el-input @change="calRefund" v-model="scope.row.refundPrice" v-if="scope.row.count > 0"></el-input>
+                                </template>
+                            </el-table-column>
+                            <el-table-column label="退款数量">
+                                <template slot-scope="scope">
+                                    <el-input @change="calRefund" v-model.number="scope.row.refundCount" v-if="scope.row.count > 0"></el-input>
+                                </template>
+                            </el-table-column>
+                            <el-table-column label="是否退库存" align="center">
+                                <template slot-scope="scope">
+                                    <el-checkbox v-model="scope.row.returnStore" v-if="scope.row.type == '家居产品' && scope.row.count > 0"></el-checkbox>
+                                </template>
+                            </el-table-column>
+                        </el-table>
+
+                        <el-checkbox v-model="isReturnAchieve">退业绩</el-checkbox>
+
+                        <el-row v-if="isReturnAchieve">
+                            <el-table
+                                    :data="achieveItems"
+                                    style="width: 100%">
+                                <el-table-column
+                                        type="index"
+                                        width="50">
+                                </el-table-column>
+                                <el-table-column
+                                        prop="goodsNo"
+                                        label="产品编号"
+                                        width="100">
+                                </el-table-column>
+                                <el-table-column
+                                        prop="goodsName"
+                                        label="产品名称"
+                                        width="200">
+                                </el-table-column>
+                                <el-table-column
+                                        prop="zkTotal"
+                                        label="收款">
+                                </el-table-column>
+                                <el-table-column
+                                        prop="t3"
+                                        label="业绩类型">
+                                </el-table-column>
+                                <el-table-column
+                                        prop="t1"
+                                        label="原业绩">
+                                </el-table-column>
+                                <el-table-column
+                                        prop="projPercentage"
+                                        label="原提成">
+                                </el-table-column>
+                                <el-table-column label="业绩">
+                                    <template slot-scope="scope">
+                                        <el-input v-model="scope.row.returnAchieve" v-if="scope.row.zkTotal != 0"></el-input>
+                                    </template>
+                                </el-table-column>
+                                <el-table-column label="提成">
+                                    <template slot-scope="scope">
+                                        <el-input v-model="scope.row.returnCommission" v-if="scope.row.zkTotal != 0"></el-input>
+                                    </template>
+                                </el-table-column>
+                                <el-table-column
+                                        label="员工" prop="meiliao">
+                                </el-table-column>
+                            </el-table>
+                        </el-row>
+                    </el-row>
+                </el-tab-pane>
+                <el-tab-pane label="业绩设置" name="second">
+                    <el-row>
+                        <el-button size="mini" type="primary" @click="saveAchieve" v-if="order.statu == '已付款'">保存</el-button>
+                    </el-row>
+                    <el-table
+                            :data="achieveItems"
                             style="width: 100%">
                         <el-table-column
-                                prop="shoppingGoods.name"
-                                label="商品名称"
-                                width="300">
+                                type="index"
+                                width="50">
                         </el-table-column>
                         <el-table-column
-                                prop="price"
-                                label="单价"
-                                width="80">
+                                prop="goodsNo"
+                                label="产品编号"
+                                width="180">
                         </el-table-column>
                         <el-table-column
-                                prop="count"
-                                label="购买数量">
+                                prop="goodsName"
+                                label="产品名称"
+                                width="180">
                         </el-table-column>
                         <el-table-column
-                                prop="zkPrice"
-                                label="折后金额">
+                                prop="zkTotal"
+                                label="收款">
                         </el-table-column>
                         <el-table-column
-                                prop="cardPay"
-                                label="卡付款">
+                                prop="t3"
+                                label="业绩类型">
+                            <template slot-scope="scope">
+                                <el-select v-model="scope.row.t3" placeholder="请选择业绩类型">
+                                    <el-option
+                                            v-for="item in achieveTypeList"
+                                            :key="item.key"
+                                            :label="item.value"
+                                            :value="item.key">
+                                    </el-option>
+                                </el-select>
+                            </template>
                         </el-table-column>
                         <el-table-column
-                                prop="cashPay"
-                                label="现金付款">
+                                prop="achieve"
+                                label="业绩">
+                            <template slot-scope="scope">
+                                <el-input v-model="scope.row.t1"></el-input>
+                            </template>
                         </el-table-column>
                         <el-table-column
-                                prop="arrears"
-                                label="欠款">
+                                prop="projPercentage"
+                                label="提成">
+                            <template slot-scope="scope">
+                                <el-input v-model="scope.row.projPercentage"></el-input>
+                            </template>
+                        </el-table-column>
+                        <el-table-column
+                                label="员工">
+                            <template slot-scope="scope">
+                                <el-select v-model="scope.row.beaultId" placeholder="请选择员工">
+                                    <el-option
+                                            v-for="item in userList"
+                                            :key="item.suId"
+                                            :label="item.suName"
+                                            :value="item.suId">
+                                    </el-option>
+                                </el-select>
+                            </template>
+                        </el-table-column>
+                        <el-table-column label="操作">
+                            <template slot-scope="scope">
+                                <el-button type="primary" v-if="scope.row.isShare"
+                                           size="mini"
+                                           @click="delAchieve(scope.$index, scope.row)">删除
+                                </el-button>
+                                <el-tooltip content="分享业绩" placement="top">
+                                    <el-button @click="shareAchieve(scope.$index, scope.row)" icon="el-icon-share"
+                                               size="mini" type="primary"></el-button>
+                                </el-tooltip>
+                            </template>
                         </el-table-column>
                     </el-table>
                 </el-tab-pane>
-                <el-tab-pane label="业绩" name="yj">业绩</el-tab-pane>
+                <el-tab-pane label="交易流水" name="third">
+                    <el-table
+                            :data="flowItems"
+                            style="width: 100%">
+                        <el-table-column
+                                type="index"
+                                width="50">
+                        </el-table-column>
+                        <el-table-column
+                                prop="orderNo"
+                                label="订单号"
+                                width="180">
+                        </el-table-column>
+                        <el-table-column
+                                prop="flowContent"
+                                label="交易内容"
+                                width="300">
+                        </el-table-column>
+                        <el-table-column
+                                prop="createTime"
+                                label="交易时间">
+                        </el-table-column>
+                        <el-table-column
+                                prop="flowType"
+                                label="交易类型">
+                        </el-table-column>
+                        <el-table-column
+                                prop="amount"
+                                label="交易金额">
+                        </el-table-column>
+                        <el-table-column
+                                prop="payMethod"
+                                label="支付方式">
+                        </el-table-column>
+                        <el-table-column
+                                prop="flowNo"
+                                label="流水号">
+                        </el-table-column>
+                    </el-table>
+                </el-tab-pane>
             </el-tabs>
         </el-main>
     </el-container>
+
+    <el-dialog title="退款" :visible.sync="dialogSettleVisible">
+        <el-row type="flex" align="middle" style="padding: 0 0 10px 0;">
+            <el-col :span="5" style="text-align: center;">退款金额</el-col>
+            <el-col :span="10" style="text-align: center; line-height: 50px;"><span style="color: red; font-size: 20px;">¥ {{refundMoney}}</span></el-col>
+        </el-row>
+
+        <el-row type="flex" align="middle" style="padding: 10px 0;">
+            <el-col :span="5" style="text-align: center;">退款方式</el-col>
+            <el-col class="paymethod" :span="18">
+                <el-row>
+                    <ul>
+                        <span v-for="(item, index) in payMethods">
+                            <el-popover
+                                    :disabled="item.type != '储值卡'"
+                                    placement="bottom"
+                                    trigger="hover"
+                                    @hide="popoverHide(item)">
+                                <el-row style="text-align: center;"><span style="padding: 0 0 10px 0; display: block; font-size: 12px;">选择储值卡支付方式</span></el-row>
+                                <el-tree :data="moneyCards"
+                                         show-checkbox
+                                         default-expand-all
+                                         node-key="id"
+                                         ref="tree"
+                                         check-strictly
+                                         highlight-current
+                                         @check="(click, checked,$item)=>{handleCheckChange(click, checked,$item)}"
+                                         :props="defaultProps">
+                                </el-tree>
+                                <li :class="{active : item.isActive}" slot="reference" @click="payMethodSelect(item, index)"><div style=" height:30px; line-height: 30px; display: flex; align-items: center"><img style="width: 25px; height: 25px; align-items: center;" :src="item.img"><span style="margin-left: 5px;">{{item.value}}</span></div></li>
+                            </el-popover>
+                        </span>
+                    </ul>
+                </el-row>
+            </el-col>
+        </el-row>
+
+        <el-row type="flex" align="middle" style="padding: 10px 0 50px 0;">
+            <el-col :span="5" style="text-align: center;">退款方式</el-col>
+            <el-col :span="15">
+                <el-row style="line-height: 50px;" v-for="(item, index) in payMoneys">
+                    <el-col :span="6" style="text-align: right; padding-right: 10px; font-size: 12px;">{{item.value}}</el-col>
+                    <el-col :span="8"><el-input v-model="item.money"></el-input></el-col>
+                    <el-col :span="6" style="margin-left: 10px;" v-if="item.type == '储值卡'">{{item.isGift == 1 ? '赠送余额' : '余额' }}:<span class="arrears">¥ {{item.balance}}</span></el-col>
+                </el-row>
+            </el-col>
+        </el-row>
+
+<!--        <el-row style="text-align: center; margin: 20px 0 10px 0">-->
+<!--            <el-checkbox v-model="printPaper">打印小票</el-checkbox>-->
+<!--        </el-row>-->
+
+        <el-row style="text-align: center; margin: 10px 0 0 0">
+            <el-button type="primary" @click="confirmSubmit">确认收款</el-button>
+        </el-row>
+    </el-dialog>
 </div>
 </body>
 
+<script type="text/javascript" th:src="@{/js/plugin/jquery-2.1.4.min.js}"></script>
+<script type="text/javascript" th:src="@{/js/plugin/jquery.query.js}"></script>
+<script type="text/javascript" th:src="@{/js/systools/MJsBase.js}"></script>
 <script type="text/javascript" th:src="@{/js/plugin/LodopFuncs.js}"></script>
 <script type="text/javascript" th:src="@{/js/systools/AjaxProxyVue.js}"></script>
 <script type="text/javascript" th:src="@{/js/plugin/vue.js}"></script>
 <script type="text/javascript" th:src="@{/plugin/element-ui/index.js}"></script>
-<script type="text/javascript" th:src="@{/js/systools/MJsBase.js}"></script>
 <script type="text/javascript"  th:inline="javascript">
     //<![CDATA[
     var app = new Vue({
         el : "#app",
         data : {
-            activeName : "goods",
+            orderParam : "",
+            vipInfo : "",
             order : "",
-            orderItems : "",
-            cards : "",
-            orderData : []
+            activeName : "first",
+            circleUrl : "https://cube.elemecdn.com/0/88/03b0d39583f48206768a7534e55bcpng.png",
+            userList : [],
+            achieveTypeList : [
+                {
+                    "key" : "现金业绩",
+                    "value" : "现金业绩"
+                },{
+                    "key" : "划扣业绩",
+                    "value" : "划扣业绩"
+                },
+            ],
+            orderItems : [],
+            achieveItems : [],
+            flowItems : [],
+            payMethodItems : [],
+            isRefund : false,
+            isReturnAchieve : false,
+            totalRefund : "",
+            payMethods: [{
+                value: '现金支付',
+                img: '/images/pay/cash.png',
+                isActive: false,
+                type: '现金支付'
+            }, {
+                value: '微信',
+                img: '/images/pay/wechat.png',
+                isActive: false,
+                type: '微信'
+            }, {
+                value: '支付宝',
+                img: '/images/pay/zhifubao.png',
+                isActive: false,
+                type: '支付宝'
+            }, {
+                value: '银行卡',
+                img: '/images/pay/yinlian.png',
+                isActive: false,
+                type: '银行卡'
+            }, {
+                value: '团购',
+                img: '/images/pay/tuan.png',
+                isActive: false,
+                type: '团购'
+            }, {
+                value: '储值卡',
+                img: '/images/pay/card.png',
+                isActive: false,
+                type: '储值卡'
+            }, ],
+
+            dialogSettleVisible : false,
+            moneyCards: [],
+            defaultProps: {
+                children: 'children',
+                label: 'showLable'
+            },
+            treeSelect : [],
+            payMoneys : [],
+            printPaper : true,
+            refundMoney : 0,
+            data : {},
+
         },
         created : function() {
-            this.order = /*[[${order}]]*/
-            this.orderItems = /*[[${orderItems}]]*/
-            this.cards = /*[[${cards}]]*/
+            let _this = this;
+            this.orderParam = /*[[${orderParam}]]*/
+            this.queryOrderDetailData(this.orderParam);
 
-            this.orderData = this.order.items;
         },
         methods : {
-            handleClick(tab, event) {
+            calRefund() {
+                let _this = this;
+                var total = 0;
+                _this.orderItems.forEach(item => {
+                    if (item.refundPrice && item.refundCount) {
+                        total += parseFloat(item.refundPrice * item.refundCount);
+                    }
+                })
+
+                _this.totalRefund = total;
+            },
+            queryOrderDetailData(param) {
+                let _this = this;
+                AjaxProxy.requst({
+                    app: _this,
+                    data: {id: param, orderNo:param},
+                    contentType: 'application/x-www-form-urlencoded',
+                    url: basePath + '/admin/order/findOrderDetailByIdOrNo',
+                    callback: function (data) {
+                        console.log(data);
+                        var mapInfo = data.mapInfo;
+                        _this.vipInfo = mapInfo.vipInfo;
+                        _this.order = mapInfo.order;
+                        _this.orderItems = mapInfo.orderItems;
+                        _this.payMethodItems = mapInfo.payMethods;
+                        _this.achieveItems = mapInfo.achieveList;
+
+                        _this.flowItems = _this.order.flows;
+
+                        _this.checkAchieveIsDel(_this.achieveItems);
+                        _this.order.orderTime = moment(_this.order.orderTime).format("YYYY-MM-DD HH:mm");
+
+                        var arrears = 0;
+                        var refund = 0;
+                        var repay = 0;
+                        for(var i = 0; i < _this.flowItems.length; i++) {
+                            var item = _this.flowItems[i];
+                            if (item.payMethod === '欠款') {
+                                arrears += item.amount;
+                            }
+
+                            if (item.flowType === '还款') {
+                                repay += item.amount;
+                            }
+
+                            if (item.flowType === '退款') {
+                                refund += item.amount;
+                            }
+                        }
+                        _this.order.arrears = arrears;
+                        _this.order.refund = refund;
+                        _this.order.repay = repay;
+
+                        //获取用户列表
+                        AjaxProxy.requst({
+                            app: _this,
+                            url: basePath + '/admin/shopAll',
+                            callback: function (data) {
+                                _this.userList = data.rows;
+                            }
+                        });
+                        _this.getVipMoneyCards();
+                    }
+                });
+            },
+            confirmSubmit() {
+                let _this = this;
+                _this.data.oldOrderId = _this.order.id;
+                _this.data.vipId = _this.vipInfo.id;
+
+                if(!_this.payMethodFlow()) {
+                    return;
+                }
+
+                let orderItems = _this.orderItems;
+                let dataItems = [];
+                for(var i = 0; i < orderItems.length; i++) {
+                    let item = orderItems[i];
+                    if (item.refundPrice && item.refundCount) {
+                        let achieveList = []
+                        if (_this.isReturnAchieve) {
+                            for(var j = 0; j < _this.achieveItems.length; j++) {
+                                let achieveItem = _this.achieveItems[j];
+                                if (achieveItem.returnAchieve || achieveItem.returnCommission) {
+                                    achieveItem.t1 = achieveItem.returnAchieve ?  achieveItem.returnAchieve : 0;
+                                    achieveItem.projPercentage = achieveItem.returnCommission ? achieveItem.returnCommission : 0;
+                                    achieveList.push(achieveItem);
+                                }
+                            }
+
+                            item.achaeveList = achieveList;
+                        }
+                        if (item.returnStore) {
+                            item.isReturnStore = 'Y';
+                        } else {
+                            item.isReturnStore = 'N';
+                        }
+
+                        item.preCount = item.count;
+                        item.count = item.refundCount;
+                        item.zkPrice = item.refundPrice;
+                        item.cashPay = 0;
+                        item.cardPay = 0;
+                        item.oldItemId = item.id;
+                        dataItems.push(item);
+                    }
+                }
+
+                _this.data.items = dataItems;
+                AjaxProxy.requst({
+                    app: _this,
+                    data: _this.data,
+                    contentType: 'application/json',
+                    url: basePath + '/admin/order/refundOrder',
+                    callback: function (data) {
+                        _this.isRefund = false;
+                        _this.dialogSettleVisible = false;
+                        _this.queryOrderDetailData(_this.data.oldOrderId);
+                    }
+                });
+
+            },
+            payMethodFlow() {
+                let _this = this;
+                if (_this.payMoneys.length > 0) {
+                    let flows = []
+                    var total = 0;
+                    _this.payMoneys.forEach(item => {
+                        let flow = {};
+                        flow.payMethod = item.type;
+                        if (!item.money) {
+                            this.$message.warning("请输入" + item.type + "的付款金额");
+                            return false;
+                        }
+                        flow.amount = parseFloat(item.money);
+                        if (item.type == '储值卡'){
+                            flow.isGift = item.isGift;
+                            flow.cardId = item.id;
+                        }
+                        total += parseFloat(item.money);
+                        flows.push(flow)
+                    })
+                    if (total != _this.refundMoney) {
+                        this.$message.warning("输入付款总金额与应付金额不符");
+                        return false;
+                    }
+
+                    if(_this.order.zkTotal - _this.order.refund - _this.order.arrears < total) {
+                        this.$message.warning("退款金额不能超过收款金额");
+                        return false;
+                    }
+                    _this.data.flows = flows;
+                    return true;
+                } else {
+                    this.$message.warning("请选择支付方式");
+                    return false;
+                }
+            },
+            openPayMoneyDialog() {
+                let _this = this;
+                let items = this.orderItems;
+                _this.refundMoney = 0;
+
+                for(var i = 0; i < items.length; i++) {
+                    let item = items[i]
+                    if (item.refundPrice && item.refundCount) {
+                        if (!item.refundPrice > 0 && !item.refundCount > 0) {
+                            _this.$message.error("退款金额或退款数量须大于0");
+                            return;
+                        }
+
+                        if (item.refundCount > item.count) {
+                            _this.$message.error("输入正确的退款数量");
+                            return;
+                        }
+
+                        _this.refundMoney += parseFloat(item.refundPrice * item.refundCount);
+                    }
+                }
+
+                if (_this.refundMoney == 0) {
+                    _this.$message.error("请输入退款金额或退款数量");
+                    return;
+                }
+                _this.dialogSettleVisible = true;
+            },
+            calOrderTotalFormatter(row, column) {
+                return row.count * row.price;
+            },
+            getVipMoneyCards() {
+                let _this = this;
+                if (_this.order.vipId) {
+                    AjaxProxy.requst({
+                        app: _this,
+                        data: {vipId: _this.order.vipId},
+                        contentType: 'application/x-www-form-urlencoded',
+                        url: basePath + '/admin/moneyCardUse/getUseMoneyCard',
+                        callback: function (data) {
+                            if (data.rows.length > 0) {
+                                data.rows.forEach(function (item, index, input) {
+                                    item.showLable = item.cardName + "-余额:" + (item.realMoney)
+                                    item.uuid = MTools.uuid();
+                                    if (item.giftMoney != 0) {
+                                        var children = [];
+                                        var gift = {};
+                                        gift.id = item.id;
+                                        gift.giftMoney = item.giftMoney;
+                                        gift.showLable = item.cardName + '-赠送金额' + item.giftMoney;
+                                        gift.cardName = item.cardName;
+                                        gift.isGift = 1;
+                                        gift.uuid = MTools.uuid();
+                                        children.push(gift);
+                                        item.children = children;
+                                    }
+                                });
+                                _this.moneyCards = data.rows;
+                            }
+                        }
+                    });
+                }
+            },
+            payMethodSelect(item, index) {
+                let _this = this;
+                let payMoneys = _this.payMoneys;
+                if (item.type != '储值卡') {
+                    this.$nextTick(function () {
+                        if (item.isActive) {
+                            Vue.set(item,'isActive',false);
+                            var index = -1;
+                            for (var i = 0; i < payMoneys.length; i++) {
+                                let payMoney = payMoneys[i];
+                                if (payMoney.value == item.value) {
+                                    index = i;
+                                    break;
+                                }
+                            }
+
+                            if (index > -1) {
+                                _this.payMoneys.splice(index, 1)
+                            }
+                        } else {
+                            Vue.set(item,'isActive',true);
+                            var hasAmount = 0;
+                            for(var i = 0; i < payMoneys.length; i++) {
+                                hasAmount += parseFloat(payMoneys[i].money);
+                            }
+                            if (_this.refundMoney - hasAmount > 0) {
+                                Vue.set(item, 'money', _this.refundMoney - hasAmount);
+                            }
+                            _this.payMoneys.push(item);
+                        }
+                    });
+                }
+            },
+            popoverHide(item) {
+                if(this.treeSelect.length <= 0) {
+                    Vue.set(item, 'isActive', false)
+                } else {
+                    Vue.set(item, 'isActive', true)
+                }
+            },
+            handleCheckChange(clickNode, checked) {
+                let _this = this;
+
+                let nodes = checked.checkedNodes;
+                _this.treeSelect = nodes;
+                var index = -1;
+                // 判断点击节点是否在已展示支付方式中
+                for(var i = 0; i < _this.payMoneys.length; i++) {
+                    let node = _this.payMoneys[i];
+                    if (node.uuid === clickNode.uuid) {
+                        index = i;
+                        break;
+                    }
+                }
+
+                // 若点击节点在选中节点中,且已展示支付方式不存在,则添加
+                if (nodes.indexOf(clickNode) > -1 && index === -1) {
+                    var node = clickNode;
+                    var item = {};
+                    if (node.isGift) {
+                        item.value = node.cardName;
+                        item.balance = node.giftMoney;
+                        item.isGift = 'Y';
+                    } else {
+                        item.value = node.cardName;
+                        item.balance = node.realMoney;
+                        item.isGift = 'N';
+                    }
+                    item.type = '储值卡';
+                    item.id = node.id;
+                    item.uuid = clickNode.uuid;
+                    _this.payMoneys.push(item);
+                }
+
+                // 若点击节点不存在选中节点中,且已展示支付方式中存在,则移除
+                if (nodes.indexOf(clickNode) === -1 && index > -1) {
+                    _this.payMoneys.splice(index, 1);
+                }
+            },
+            closeFrame() {
+                parent.layer.close(parent.layer.getFrameIndex(window.name));
+            },
+            saveAchieve() {
+                let _this = this;
+                AjaxProxy.requst({
+                    app: _this,
+                    data: _this.achieveItems,
+                    contentType: 'application/json',
+                    url: basePath + '/admin/achieve/add',
+                    callback: function (data) {
+                        _this.$message.success(data.info);
+                    }
+                });
+            },
+            shareAchieve(index, row) {
+                var row2 = JSON.parse(JSON.stringify(row));
+                row2.id = null;
+                row2.isShare = true;
+                this.achieveItems.push(row2);
+            },
+            delAchieve(index, row) {
+                let _this = this;
+                if (row.id) {
+                    AjaxProxy.requst({
+                        app: _this,
+                        url: basePath + '/admin/achieve/del?id=' + row.id,
+                        callback: function (data) {
+                        }
+                    });
+                }
+
+                _this.achieveItems.splice(index, 1);
+            },
+            checkAchieveIsDel(items) {
+                var achieveIds = [];
+                for(var i = 0; i < items.length; i++) {
+                    var item = items[i];
+                    if(achieveIds.indexOf(item.orderItemId) === -1) {
+                        achieveIds.push(item.orderItemId);
+                        item.isShare = false;
+                    } else {
+                        item.isShare = true;
+                    }
+
+                    item.t1 = item.consume + item.cardCash;
+                }
             },
             printf() {
-                var id = 1;
+                var id = this.order.id;
                 layer.open({
                     type: 2,
-                    title: "打印服务单",
+                    title: "打印订单",
                     area: ['250px', '550px'],
                     maxmin: true,
-                    content: [basePath + '/admin/redirect/hive/beautySalon/print-service?id=' + id]
+                    content: [basePath + '/admin/redirect/hive/beautySalon/print-order?id=' + id]
                 });
+            },
+            handleClick() {
+
             },
             toBack() {
                 MTools.closeForm();
@@ -154,17 +917,5 @@
         }
     });
     //]]>
-    function print() {
-        var id=$("#orderId").val();
-        layer.open({
-            type: 2,
-            title: "打印订单",
-            area: ['250px', '550px'],
-            maxmin: true,
-            content: [basePath + '/admin/redirect/hive/beautySalon/print-order?id=' + id]
-        });
-    };
-
-
 </script>
 </html>
\ No newline at end of file
diff --git a/zq-erp/src/main/resources/templates/views/admin/hive/beautySalon/pbxq-form.html b/zq-erp/src/main/resources/templates/views/admin/hive/beautySalon/pbxq-form.html
index d7a795e..59504c6 100644
--- a/zq-erp/src/main/resources/templates/views/admin/hive/beautySalon/pbxq-form.html
+++ b/zq-erp/src/main/resources/templates/views/admin/hive/beautySalon/pbxq-form.html
@@ -38,7 +38,10 @@
                     <i class="el-icon-s-order" type="primary"></i>
                 </el-col>
                 <el-col :span="10">
-                    <h1 style="line-height: 60px; margin: 0 0;">服务单号:{{serviceOrderInfo.serviceNo}}</h1>
+                    <h1 style="line-height: 60px; margin: 0 0;display: inline-block">服务单号:{{serviceOrderInfo.serviceNo}}</h1>
+                </el-col>
+                <el-col :span="5">
+                    <h1 style="line-height: 60px; margin: 0 0;display: inline-block"><span style="color: #cf2d27;float: right ">¥{{serviceOrderInfo.money}}</span></h1>
                 </el-col>
                 <el-col :span="5" style="float: right; margin-right: 10px;">
                     <el-button type="info" @click="printf">打印</el-button>
@@ -48,7 +51,7 @@
             </el-row>
             <el-row class="order-info" type="flex" justify="space-around"  style="height: 150px; padding: 30px 30px;">
                 <el-col :span="5">
-                    <p>会员姓名:{{serviceOrderInfo.vipInfo.staffName}}</p>
+                    <p>会员姓名:{{serviceOrderInfo.vipInfo.vipName}}</p>
                     <p>会员电话:{{serviceOrderInfo.vipInfo.phone}}</p>
                 </el-col>
                 <el-col :span="5">
@@ -60,7 +63,7 @@
                     <p>预约时间:{{dateFormat(serviceOrderInfo.yyTime)}}</p>
                 </el-col>
                 <el-col :span="3">
-                    <p>配料师:{{pylFormat()}}</p>
+                    <p>配料师:{{serviceOrderInfo.plsName}}</p>
                     <p>备注:{{serviceOrderInfo.remark}}</p>
                 </el-col>
             </el-row>
@@ -76,12 +79,21 @@
                                 width="280">
                         </el-table-column>
                         <el-table-column
+                                :formatter="hkPrice"
+                                label="划扣金额"
+                                width="200">
+                        </el-table-column>
+                        <el-table-column
+                                prop="count"
+                                label="次数"
+                                width="200">
+                        </el-table-column>
+                        <el-table-column
                                 prop="projInfo.timeLength"
                                 label="服务时长"
                                 width="200">
                         </el-table-column>
                         <el-table-column
-                                prop="address"
                                 label="服务时间" :formatter="serviceTime">
                         </el-table-column>
                         <el-table-column
@@ -145,20 +157,7 @@
                     }
                 }
             },
-            pylFormat() {
-                if (!this.plsList) {
-                    return;
-                }
 
-                var plsList = this.plsList;
-                var doctorId = this.serviceOrderInfo.doctorId;
-
-                for(var i = 0; i < plsList.length; i++) {
-                    if (plsList[i].id = doctorId) {
-                        return plsList[i].staffName;
-                    }
-                }
-            },
             printf() {
                 var id = this.serviceOrderInfo.id;
                 layer.open({
@@ -173,12 +172,18 @@
                 MTools.closeForm();
             },
             serviceTime(row, column) {
-                if (!column.bedState) {
-                    return "-";
-                }
-                var startTime = moment(column.bedState.startTime).format("YYYY-MM-DD HH:mm");
-                var endTime = moment(column.bedState.endTime).format("YYYY-MM-DD HH:mm");
-                return startTime + "-" + endTime;
+                console.log(column);
+                console.log(row);
+                // if (!column.bedState) {
+                //     return "-";
+                // }
+                var startTime = this.dateFormat(row.beginTime);
+                var endTime = this.dateFormat(row.endTime);
+                return startTime + " - " + endTime;
+            },
+            hkPrice(row, column) {
+                console.log(row);
+                return row.projUse.price *  row.count ;
             }
         },
     });
diff --git a/zq-erp/src/main/resources/templates/views/admin/hive/beautySalon/projUseFlow-list.html b/zq-erp/src/main/resources/templates/views/admin/hive/beautySalon/projUseFlow-list.html
new file mode 100644
index 0000000..3993e96
--- /dev/null
+++ b/zq-erp/src/main/resources/templates/views/admin/hive/beautySalon/projUseFlow-list.html
@@ -0,0 +1,128 @@
+<!DOCTYPE HTML>
+<html xmlns:th="http://www.thymeleaf.org" xmlns:matrix="http://www.w3.org/1999/xhtml">
+<head>
+    <meta charset="utf-8">
+    <META HTTP-EQUIV="Pragma" CONTENT="no-cache">
+    <meta name="renderer" content="webkit|ie-comp|ie-stand">
+    <meta http-equiv="X-UA-Compatible" content="IE=edge,chrome=1">
+    <meta name="viewport"
+          content="width=device-width,initial-scale=1,minimum-scale=1.0,maximum-scale=1.0,user-scalable=no"/>
+    <meta http-equiv="Cache-Control" content="no-siteapp"/>
+    <!-- 本框架基本脚本和样式 -->
+    <script type="text/javascript"
+            th:src="@{/js/plugin/jquery-2.1.4.min.js}"></script>
+    <script type="text/javascript" th:src="@{/js/systools/MBase.js}"></script>
+
+</head>
+<body class=" container-fluid">
+<div class="pd-10">
+    <!-- 搜索框部分start -->
+    <div class="row form-head">
+        <form class="form-inline" id="serchform">
+
+            <div class="form-group mr-20">
+                <label>创建时间</label>
+                <input autocomplete="off"   name="beginTime" type="text" class="form-control datetimepicker" id="beginTime">-
+                <input autocomplete="off"   name="endTime" type="text" class="form-control datetimepicker" id="endTime">
+            </div>
+
+            <div class="form-group mr-20">
+                <label >操作人</label>
+                <input autocomplete="off"   name="createBy" class="form-control">
+            </div>
+            <input type="hidden" name="projUseId" th:value="${param.projUseId}" >
+            <div class="form-group">
+                <button onclick="myGrid.serchData(1)" type="button"
+                        class="btn btn-sm btn-info">
+                    <i class="fa fa-search "></i> 搜索
+                </button>
+                <button type="reset" class="btn btn-sm btn-info ">
+                    <i class="fa fa-refresh "></i> 重置
+                </button>
+            </div>
+        </form>
+    </div>
+    <div class="row mt-10">
+        <div id="option-bar">
+            <!-- 功能按钮部分 -->
+        </div>
+        <!-- 数据表格部分 -->
+        <table id="mgrid">
+            <thead>
+            <tr>
+                <th data-formatter="MGrid.indexfn" data-align="center" data-width="30px">序号</th>
+                <th data-field="projName"  >项目名称</th>
+                <th data-field="optionType">操作类型</th>
+                <th data-field="createBy">操作人</th>
+                <th data-field="createTime" data-formatter="MGrid.getTime" data-sortable="true">操作时间</th>
+                <th data-field="surplusCount">剩余次数</th>
+                <th data-field="balance">余额</th>
+                <th data-field="status">状态</th>
+                <th data-field="isOver" data-formatter="getYesOrNo">是否使用完成</th>
+                <th data-field="failTime" data-formatter="MGrid.getTime">有效期</th>
+                <th data-field="price">单次扣减金额</th>
+                <th data-field="remark">备注</th>
+              </tr>
+            </thead>
+        </table>
+        <!-- 数据表格部分end -->
+    </div>
+    <div class="form-group ">
+        <div class="col-sm-12 text-center fixed-button">
+            <a class="btn btn-danger radius" href="javascript:;"
+               onclick="MTools.closeForm()"><i class="fa fa-close"></i> 关闭</a>
+        </div>
+    </div>
+</div>
+
+<script type="text/javascript" th:src="@{/js/systools/MJsBase.js}"></script>
+<script type="text/javascript" th:inline="javascript" >
+
+    //定义表格对象
+    var myGrid;
+
+    $(function () {
+
+        //时间
+        var _initParam = {
+            format: 'yyyy-mm-dd hh:ii',
+            todayBtn: true,
+            autoclose: true,
+            startView: 2,
+            maxView: 3,
+            minView: 0
+        };
+        MTools.ininDatetimepicker(_initParam);
+        //限制结束时间不小于开始时间
+        var initParam = {
+            format: 'yyyy-mm-dd hh:ii',
+            todayBtn: true,
+            autoclose: true,
+            startView: 2,
+            maxView: 3,
+            minView: 0
+        };
+        MTools.limitStartEndTime(initParam);
+
+        myGrid = MGrid.initGrid({
+            url: basePath + "/admin/projUser/findProjUseFlow",
+            sortName:"createTime",
+            sortOrder:"desc",
+        });
+    });
+
+    function getYesOrNo(value, row, index){
+        switch(value){
+            case 'Y':
+                return "是";
+            case 'N':
+                return "否";
+            default:
+                return value;
+        }
+    }
+
+</script>
+
+</body>
+</html>
diff --git a/zq-erp/src/main/resources/templates/views/admin/hive/beautySalon/service_all_list.html b/zq-erp/src/main/resources/templates/views/admin/hive/beautySalon/service_all_list.html
index 2c4ebd7..7eeaf03 100644
--- a/zq-erp/src/main/resources/templates/views/admin/hive/beautySalon/service_all_list.html
+++ b/zq-erp/src/main/resources/templates/views/admin/hive/beautySalon/service_all_list.html
@@ -76,7 +76,7 @@
             <div class="form-group mr-20">
                 <button type="button" class="btn btn-my btn-sm" id="btn4" value="">全部</button>
                 <button type="button" class="btn btn-my btn-sm active" id="btn1" value="待预约">待预约</button>
-                <button type="button" class="btn btn-my btn-sm" id="btn2" value="预约成功待处理">待派单</button>
+<!--                <button type="button" class="btn btn-my btn-sm" id="btn2" value="预约成功待处理">待派单</button>-->
                 <button type="button" class="btn btn-my btn-sm" id="btn3" value="需配料">待配料</button>
                 <button type="button" class="btn btn-my btn-sm" id="btn3" value="配料完成">待服务</button>
                 <button type="button" class="btn btn-my btn-sm" id="btn6" value="服务中">服务中</button>
@@ -111,6 +111,7 @@
             <th data-field="money">消耗金额</th>
             <th data-field="createTime" data-sortable="true" data-formatter="MGrid.getTime">下单时间</th>
             <th data-field="yyTime" data-sortable="true" data-formatter="MGrid.getTime">预约时间</th>
+            <th data-field="consumeTime" data-sortable="true" data-formatter="MGrid.getTime">划扣时间</th>
             <th data-field="totalTime" data-sortable="true">服务时长</th>
             <th data-field="isOverTime" data-formatter="overTime">超时时间</th>
             <th data-field="createStaffName">下单顾问</th>
@@ -305,9 +306,9 @@
     btns[0]='<a  class="text-primary mr-5" onClick="openPb(\'VALUE\')"  title="排班"><i class="fa fa-calendar">排班</i></a>&nbsp;'
 </script>
 
-<script matrix:btn="serviceClub-paidan"  >
-    btns[1]='<a  class="text-primary mr-5" onClick="openPd(\'VALUE\')"  title="派单"><i class="fa fa-sign-in">派单</i></a>'
-</script>
+<!--<script matrix:btn="serviceClub-paidan"  >-->
+<!--    btns[1]='<a  class="text-primary mr-5" onClick="openPd(\'VALUE\')"  title="派单"><i class="fa fa-sign-in">派单</i></a>'-->
+<!--</script>-->
 
 <script matrix:btn="serviceClub-edit"  >
     btns[2]='<a  class="text-primary mr-5" onClick="updatePd(\'VALUE\')"  title="修改"><i class="fa fa-edit">修改</i></a>'
diff --git a/zq-erp/src/main/resources/templates/views/admin/hive/beautySalon/underlineOrder.html b/zq-erp/src/main/resources/templates/views/admin/hive/beautySalon/underlineOrder.html
index 81177eb..71fde37 100644
--- a/zq-erp/src/main/resources/templates/views/admin/hive/beautySalon/underlineOrder.html
+++ b/zq-erp/src/main/resources/templates/views/admin/hive/beautySalon/underlineOrder.html
@@ -78,11 +78,15 @@
                 <th data-field="orderTime" data-formatter="MGrid.getTime"
                     data-sortable="true">下单时间</th>
                 <th data-field="total">订单总价</th>
+
                 <th data-field="zkTotal">折后价</th>
+                <th data-field="payTime" data-formatter="MGrid.getTime"
+                    data-sortable="true">支付时间</th>
                 <th data-field="staffName">下单顾问</th>
                 <th data-field="cashPay">现金支付金额</th>
                 <th data-field="cardPay">卡支付金额</th>
                 <th data-field="arrears">欠款金额</th>
+
                 <th data-field="statu">订单状态</th>
                 <th data-field="remark">备注</th>
 
diff --git a/zq-erp/src/main/resources/templates/views/admin/hive/beautySalon/updateOrderTime.html b/zq-erp/src/main/resources/templates/views/admin/hive/beautySalon/updateOrderTime.html
index 9d7bdf9..976e611 100644
--- a/zq-erp/src/main/resources/templates/views/admin/hive/beautySalon/updateOrderTime.html
+++ b/zq-erp/src/main/resources/templates/views/admin/hive/beautySalon/updateOrderTime.html
@@ -55,11 +55,11 @@
 	
 	<div class="form-group">
 		 
-			<label class="col-sm-2 control-label">订单时间</label>
+			<label class="col-sm-2 control-label">收款时间</label>
 			<div class="col-sm-4">
-				<input autocomplete="off"   name="orderTime" type="text"
+				<input autocomplete="off"   name="payTime" type="text"
 					class="form-control  datetimepicker"
-					   th:value="${#dates.format(order.orderTime, 'yyyy-MM-dd hh:mm')}" />
+					   th:value="${#dates.format(order.payTime, 'yyyy-MM-dd hh:mm')}" />
 			</div>
 	</div>
 <br>
diff --git a/zq-erp/src/main/resources/templates/views/admin/hive/beautySalon/updateServiceOrderTime.html b/zq-erp/src/main/resources/templates/views/admin/hive/beautySalon/updateServiceOrderTime.html
index 95a9f36..867bbc2 100644
--- a/zq-erp/src/main/resources/templates/views/admin/hive/beautySalon/updateServiceOrderTime.html
+++ b/zq-erp/src/main/resources/templates/views/admin/hive/beautySalon/updateServiceOrderTime.html
@@ -55,11 +55,11 @@
 	
 	<div class="form-group">
 		 
-			<label class="col-sm-2 control-label">订单时间</label>
+			<label class="col-sm-2 control-label">划扣时间</label>
 			<div class="col-sm-4">
-				<input autocomplete="off"   name="createTime" type="text"
+				<input autocomplete="off"   name="consumeTime" type="text"
 					class="form-control  datetimepicker"
-					   th:value="${#dates.format(serviceOrder.createTime, 'yyyy-MM-dd hh:mm')}"
+					   th:value="${#dates.format(serviceOrder.consumeTime, 'yyyy-MM-dd hh:mm')}"
 
 			</div>
 	</div>
diff --git a/zq-erp/src/main/resources/templates/views/admin/hive/beautySalon/vip.html b/zq-erp/src/main/resources/templates/views/admin/hive/beautySalon/vip.html
index dfaf184..5311542 100644
--- a/zq-erp/src/main/resources/templates/views/admin/hive/beautySalon/vip.html
+++ b/zq-erp/src/main/resources/templates/views/admin/hive/beautySalon/vip.html
@@ -127,7 +127,6 @@
                 <el-button type="primary" plain @click="recharge">充值</el-button>
                 <el-button type="warning" plain @click="addOrder">开单</el-button>
                 <el-button type="success" plain @click="addServiceOrder">开服务单</el-button>
-                <el-button type="danger" plain @click="returnMoney">退款</el-button>
             </el-col>
         </el-header>
         <el-container>
@@ -150,7 +149,7 @@
                     <el-row style="padding: 10px 20px;">
                         <p>余额:<span v-if="vipInfo.balance != null">{{vipInfo.balance}}元</span></p>
                         <p>积分:<span v-if="vipInfo.pointAll != null">{{vipInfo.pointAll}}</span></p>
-                        <p>累计消费金额:<span v-if="vipInfo.totalMoney != null">{{vipInfo.totalMoney}} 元</span></p>
+                        <p>累计消费金额:<span v-if="vipInfo.totalMoney != null">{{vipInfo.totalMoney.toFixed(2)}} 元</span></p>
                         <p>累计消费次数:<span v-if="vipInfo.totalTimes != null">{{vipInfo.totalTimes}} 次</span></p>
                         <p>上次消费时间:<span v-if="vipInfo.payTime">{{vipInfo.payTime}}</span></p>
                     </el-row>
@@ -160,7 +159,6 @@
                                 size="small"
                                 :key="tag.label"
                                 v-for="tag in tags.tags"
-                                closable
                                 :disable-transitions="false"
                                 @close="handleClose(tag)">
                             {{tag.label}}
@@ -174,15 +172,12 @@
                                 @keyup.enter.native="handleInputConfirm"
                                 @blur="handleInputConfirm"
                         ></el-input>
-                        <el-button v-else class="button-new-tag" size="mini" @click="showInput">+</el-button>
+<!--                        <el-button v-else class="button-new-tag" size="mini" @click="showInput">+</el-button>-->
                     </el-row>
                     <el-row style="padding: 10px 0;">
                         <h4>消费门店</h4>
                         <el-row style="text-align: center">
-                            <el-col :span="10" v-for="item in vipInfo.shopNames">
-                                <el-avatar size="small" :src="circleUrl"></el-avatar>
-                                <span class="col-style">{{item}}</span>
-                            </el-col>
+                                <el-tag v-for="item in vipInfo.shopNames" >{{item}}</el-tag>
                         </el-row>
                     </el-row>
                 </el-row>
@@ -231,9 +226,11 @@
                             <el-table id="proj" v-show="projTab.projType=='proj'" :data="projTab.projTableData"
                                     style="width: 100%">
                                 <el-table-column
-                                        prop="projName"
                                         label="项目名称"
                                         width="180">
+                                    <template slot-scope="scope">
+                                        <span >{{scope.row.projName}}({{scope.row.projInfo.code}})</span>
+                                    </template>
                                 </el-table-column>
                                 <el-table-column
                                         prop="source"
@@ -262,6 +259,8 @@
                                         <el-button matrix:btn="vipInfo-wuxiao" v-if="scope.row.status!='无效'" type="text" size="small" @click="tabProjInvalid(scope.$index, scope.row)">无效</el-button>
                                         <el-button matrix:btn="vipInfo-dongjie" v-if="scope.row.status!='冻结'" type="text" size="small" @click="tabProjCold(scope.$index, scope.row)">冻结</el-button>
                                         <el-button matrix:btn="vipInfo-cardEdit" type="text" size="small" @click="tabProjEdit(scope.$index, scope.row)">编辑</el-button>
+                                        <el-button type="text"  @click="openOrder(scope.$index, scope.row)" size="small">订单</el-button>
+                                        <el-button  type="text" size="small" @click="openProjUseFlow(scope.$index, scope.row)">操作记录</el-button>
                                     </template>
                                 </el-table-column>
                             </el-table>
@@ -270,9 +269,11 @@
                                     style="width: 100%;"
                                     row-key="id" :tree-props="{children: 'taocanProjUse', hasChildren: 'hasChildren'}">
                                 <el-table-column
-                                        prop="projName"
                                         label="名称"
-                                        width="240">
+                                        width="280">
+                                    <template slot-scope="scope">
+                                        <span >{{scope.row.projName}}({{scope.row.projInfo.code}})</span>
+                                    </template>
                                 </el-table-column>
                                 <el-table-column
                                         prop="status"
@@ -297,6 +298,8 @@
                                         <el-button matrix:btn="vipInfo-wuxiao" v-if="scope.row.status!='无效' && scope.row.taocanId == null" type="text" size="small" @click="tabProjInvalid(scope.$index, scope.row)">无效</el-button>
                                         <el-button matrix:btn="vipInfo-dongjie" v-if="scope.row.status!='冻结' && scope.row.taocanId == null" type="text" size="small" @click="tabProjCold(scope.$index, scope.row)">冻结</el-button>
                                         <el-button matrix:btn="vipInfo-cardEdit" v-if="scope.row.taocanId == null" type="text" size="small" @click="tabProjEdit(scope.$index, scope.row)">编辑</el-button>
+                                        <el-button type="text" v-if="scope.row.orderId != null"  @click="openOrder(scope.$index, scope.row)" size="small">订单</el-button>
+                                        <el-button  type="text" size="small" @click="openProjUseFlow(scope.$index, scope.row)">操作记录</el-button>
                                     </template>
                                 </el-table-column>
                             </el-table>
@@ -336,10 +339,6 @@
                                         label="状态">
                                 </el-table-column>
                                 <el-table-column
-                                        prop="isVipCar"
-                                        label="是否是会籍卡"  :formatter="cardIsVipFormatter">
-                                </el-table-column>
-                                <el-table-column
                                         prop="isOver"
                                         label="是否使用完成" :formatter="cardIsOrderFormatter">
                                 </el-table-column>
@@ -353,10 +352,12 @@
                                 </el-table-column>
                                 <el-table-column label="操作" fixed="right" width="160">
                                     <template slot-scope="scope">
-                                        <el-button matrix:btn="vipInfo-youxiao" v-if="scope.row.status!='有效'" type="text" size="small" @click="tabProjValid(scope.$index, scope.row)">有效</el-button>
-                                        <el-button matrix:btn="vipInfo-wuxiao" v-if="scope.row.status!='无效'" type="text" size="small" @click="tabProjInvalid(scope.$index, scope.row)">无效</el-button>
-                                        <el-button matrix:btn="vipInfo-dongjie" v-if="scope.row.status!='冻结'" type="text" size="small" @click="tabProjCold(scope.$index, scope.row)">冻结</el-button>
+                                        <el-button matrix:btn="vipInfo-youxiao" v-if="scope.row.status!='有效' && scope.row.isVipCar =='N' " type="text" size="small" @click="tabProjValid(scope.$index, scope.row)">有效</el-button>
+                                        <el-button matrix:btn="vipInfo-wuxiao" v-if="scope.row.status!='无效' && scope.row.isVipCar =='N'  " type="text" size="small" @click="tabProjInvalid(scope.$index, scope.row)">无效</el-button>
+                                        <el-button matrix:btn="vipInfo-dongjie" v-if="scope.row.status!='冻结' && scope.row.isVipCar =='N' " type="text" size="small" @click="tabProjCold(scope.$index, scope.row)">冻结</el-button>
                                         <el-button matrix:btn="vipInfo-cardEdit" type="text" size="small" @click="tabProjEdit(scope.$index, scope.row)">编辑</el-button>
+                                        <el-button type="text"  v-if="scope.row.isVipCar =='N'"  @click="openOrder(scope.$index, scope.row)" size="small">订单</el-button>
+                                        <el-button  type="text" size="small" @click="openMoneyCardUseFlow(scope.$index, scope.row)">操作记录</el-button>
                                     </template>
                                 </el-table-column>
                             </el-table>
@@ -460,7 +461,7 @@
                                         <el-button matrix:btn="serviceClub-paidan" type="text" size="small" v-if="scope.row.state=='预约成功待处理'" @click="giveServiceOrder(scope.$index, scope.row)">派单</el-button>
                                         <el-button matrix:btn="serviceClub-edit" type="text" size="small" v-if="scope.row.state=='预约成功待处理'" @click="modifyServiceOrder(scope.$index, scope.row)">修改</el-button>
                                         <el-button matrix:btn="serviceClub-peiliao" type="text" size="small" v-if="scope.row.state=='需配料'" @click="peiliao(scope.$index, scope.row)">配料</el-button>
-                                        <el-button matrix:btn="serviceClub-huakou" type="text" size="small" v-if="scope.row.state=='服务完成'" @click="openHKService(scope.$index, scope.row)">划扣</el-button>
+                                        <el-button matrix:btn="serviceClub-huakou" type="text" size="small" v-if="scope.row.state=='服务完成'" @click="hkService(scope.$index, scope.row)">划扣</el-button>
                                         <el-button matrix:btn="serviceClub-edit" type="text" size="small" @click="modifyTime(scope.$index, scope.row)">修改时间</el-button>
                                         <el-button matrix:btn="serviceClub-del" type="text" size="small" v-if="scope.row.state!='预约取消'" @click="cancelServiceOrder(scope.$index, scope.row)">取消</el-button>
                                     </template>
@@ -645,7 +646,7 @@
     var app = new Vue({
         el: '#app',
         data : {
-            circleUrl : "https://cube.elemecdn.com/0/88/03b0d39583f48206768a7534e55bcpng.png",
+            circleUrl : "",
             activeName : 'vipInfo',
             tags : {
                 tags : [],
@@ -719,6 +720,15 @@
             }
         },
         methods : {
+            //打开订单详情页面
+            openOrder(index,row){
+                layer.full(layer.open({
+                    type : 2,
+                    title : "订单详情",
+                    maxmin : true,
+                    content : [ basePath + '/admin/order/orderItem?id=' + row.orderId ]
+                }));
+            },
             querySearch(queryString, cb) {
                 $.AjaxProxy({
                     p: {
@@ -760,7 +770,7 @@
                     let data = loj[0].result.rows[0];
                     _this.vipInfo = {};
                     _this.vipInfo = data;
-
+                    _this.circleUrl= _this.vipInfo.photo;
                     if (data.sysOrder != null) {
                         _this.vipInfo.totalMoney = data.sysOrder.zkTotal;
                         _this.vipInfo.totalTimes = data.sysOrder.times;
@@ -771,7 +781,7 @@
                             _this.vipInfo.shopNames = shopNames;
                         }
                     }
-
+                    _this.vipInfo.payTime = moment(_this.vipInfo.payTime).format("YYYY-MM-DD HH:mm:ss")
                     _this.tags.tags = data.labels;
                     _this.projTableQueryFn();
                     _this.serviceOrderTableQueryFn();
@@ -978,6 +988,28 @@
                     content : [ basePath + url + row.id ]
                 });
             },
+
+
+            openProjUseFlow(index, row) {
+                layer.open({
+                    type : 2,
+                    title : "操作记录",
+                    area : MUI.SIZE_M,
+                    maxmin : true,
+                    content : [ basePath + "/admin/redirect/hive/beautySalon/projUseFlow-list?projUseId=" + row.id ]
+                });
+            },
+
+            openMoneyCardUseFlow(index, row) {
+                layer.open({
+                    type : 2,
+                    title : "充值卡变更记录",
+                    area : MUI.SIZE_M,
+                    maxmin : true,
+                    content : [ basePath + "/admin/redirect/hive/vip/moneyCardUseFlow-list?vipId=" + row.vipId ]
+                });
+            },
+
             tabProjInvalid(index, row) {
                 let _this = this;
                 let projType = _this.projTab.projType;
@@ -1051,8 +1083,8 @@
                 params.state = serviceOrderTab.state;
                 params.vipId = _this.vipInfo.id;
                 if (serviceOrderTab.selectTime) {
-                    params.beginTime = moment(serviceOrderTab.selectTime[0]).format("YYYY-MM-DD HH:mm");
-                    params.closureTime = moment(serviceOrderTab.selectTime[1]).format("YYYY-MM-DD HH:mm");
+                    params.beginTime = serviceOrderTab.selectTime?moment(serviceOrderTab.selectTime[0]).format("YYYY-MM-DD HH:mm"):'';
+                    params.closureTime = serviceOrderTab.selectTime?moment(serviceOrderTab.selectTime[1]).format("YYYY-MM-DD HH:mm"):'';
                 }
                 $.AjaxProxy({
                     p:params
@@ -1096,7 +1128,7 @@
                 }));
             },
             // 划扣
-            openHkService(index, row) {
+            hkService(index, row) {
                 openHkServcie(row.id);
             },
             // 取消
@@ -1134,8 +1166,8 @@
                 params.statu = orderTab.state;
                 params.vipId = _this.vipInfo.id;
                 if (orderTab.selectTime) {
-                    params.beginTimeVo = moment(orderTab.selectTime[0]).format("YYYY-MM-DD HH:mm");
-                    params.endTimeVo = moment(orderTab.selectTime[1]).format("YYYY-MM-DD HH:mm");
+                    params.beginTimeVo = orderTab.selectTime?moment(orderTab.selectTime[0]).format("YYYY-MM-DD HH:mm"):'';
+                    params.endTimeVo = orderTab.selectTime?moment(orderTab.selectTime[1]).format("YYYY-MM-DD HH:mm"):'';
                 }
                 $.AjaxProxy({
                     p:params
@@ -1209,8 +1241,8 @@
                 params.offset = (page.currentPage - 1) * page.pageSize;
                 params.userId = _this.vipInfo.id;
                 if (skinTab.selectTime) {
-                    params.beginTime = moment(skinTab.selectTime[0]).format("YYYY-MM-DD");
-                    params.endTime = moment(skinTab.selectTime[1]).format("YYYY-MM-DD");
+                    params.beginTime = skinTab.selectTime?moment(skinTab.selectTime[0]).format("YYYY-MM-DD"):'';
+                    params.endTime = skinTab.selectTime?moment(skinTab.selectTime[1]).format("YYYY-MM-DD"):'';
                 }
                 $.AjaxProxy({
                     p:params
@@ -1348,10 +1380,10 @@
             /********** 顶部按钮 start **********/
 
             dateFormat(row, column) {
-                return moment(column.yyTime).format("YYYY-MM-DD HH:mm");
+                return moment(row.yyTime).format("YYYY-MM-DD HH:mm");
             },
             oderTimeFormat(row, column) {
-                return moment(column.orderTime).format("YYYY-MM-DD HH:mm:ss");
+                return moment(row.orderTime).format("YYYY-MM-DD HH:mm:ss");
             },
         }
     });
diff --git a/zq-erp/src/main/resources/templates/views/admin/hive/instore/store-list.html b/zq-erp/src/main/resources/templates/views/admin/hive/instore/store-list.html
index fd4c63e..a3c1d02 100644
--- a/zq-erp/src/main/resources/templates/views/admin/hive/instore/store-list.html
+++ b/zq-erp/src/main/resources/templates/views/admin/hive/instore/store-list.html
@@ -181,7 +181,8 @@
             alarmNum = row.alarmNum;
         }
         var storeNum = parseInt(value);
-        if (alarmNum >= storeNum) {
+        console.log(alarmNum,storeNum);
+        if (alarmNum > storeNum) {
             html = '<span class="label-danger" >&nbsp;&nbsp;' + value
                 + '&nbsp;&nbsp;</span>';
         } else {
diff --git a/zq-erp/src/main/resources/templates/views/admin/hive/operate/label-form.html b/zq-erp/src/main/resources/templates/views/admin/hive/operate/label-form.html
new file mode 100644
index 0000000..6614330
--- /dev/null
+++ b/zq-erp/src/main/resources/templates/views/admin/hive/operate/label-form.html
@@ -0,0 +1,59 @@
+<!DOCTYPE HTML>
+<html xmlns:th="http://www.thymeleaf.org">
+<head>
+<meta charset="utf-8">
+<META HTTP-EQUIV="Pragma" CONTENT="no-cache">
+<meta name="renderer" content="webkit|ie-comp|ie-stand">
+<meta http-equiv="X-UA-Compatible" content="IE=edge,chrome=1">
+<meta name="viewport"
+	content="width=device-width,initial-scale=1,minimum-scale=1.0,maximum-scale=1.0,user-scalable=no" />
+<meta http-equiv="Cache-Control" content="no-siteapp" />
+<!-- 本框架基本脚本和样式 -->
+<script type="text/javascript"
+	th:src="@{/js/plugin/jquery-2.1.4.min.js}"></script>
+<script type="text/javascript"
+	th:src="@{/js/systools/MBase.js}"></script>
+</head>
+<body>
+<div class="ibox-content">
+		<form class="form-horizontal" id="dataform" onsubmit="javascript:return false;">
+			<input autocomplete="off"   type="hidden" name="id" th:value="${obj?.id}">
+			<div class="form-group">
+				<label class="col-sm-2 control-label">标签<span class="text-danger">*</span></label>
+				<div class="col-sm-4">
+					<input autocomplete="off" dataType="*" class="form-control" th:value="${obj?.label}" name="label" ></input>
+					<div class="Validform_checktip"></div>
+				</div>
+			</div>
+			<div class="form-group ">
+				<div class="col-sm-12 text-center">
+					<a href="javascript:;" onclick="myForm.submit()"
+						class="btn btn-success radius"><i class="fa fa-check"></i>  保存</a>&nbsp;&nbsp;&nbsp;&nbsp; <a
+						 class="btn btn-danger radius" href="javascript:;" onclick="MTools.closeForm()" ><i class="fa fa-close"></i> 关闭</a>
+				</div>
+			</div>
+	</form>
+	</div>
+</body>
+<script type="text/javascript" th:src="@{/js/systools/MJsBase.js}"></script>
+<script th:inline="javascript">
+	MTools.autoFullSelect();
+	$(".select2").select2();
+	
+	/*<![CDATA[*/
+	var obj=/*[[${obj}]]*/     
+	/*]]>*/
+	
+	var invokeUrl=basePath+"/admin/label/add";
+	if(obj!=null&& obj.id!=null){
+	   invokeUrl = basePath+"/admin/label/modify";
+	}
+	var myForm=MForm.initForm({
+		invokeUrl:invokeUrl,
+		afterSubmit:function(){
+			parent.myGrid.serchData();
+		},
+	});
+</script>
+</body>
+</html>
\ No newline at end of file
diff --git a/zq-erp/src/main/resources/templates/views/admin/hive/operate/label-list.html b/zq-erp/src/main/resources/templates/views/admin/hive/operate/label-list.html
new file mode 100644
index 0000000..9d6bce4
--- /dev/null
+++ b/zq-erp/src/main/resources/templates/views/admin/hive/operate/label-list.html
@@ -0,0 +1,146 @@
+<!DOCTYPE HTML>
+<html xmlns:th="http://www.thymeleaf.org" xmlns:matrix="http://www.w3.org/1999/xhtml">
+<head>
+<meta charset="utf-8">
+<META HTTP-EQUIV="Pragma" CONTENT="no-cache">
+<meta name="renderer" content="webkit|ie-comp|ie-stand">
+<meta http-equiv="X-UA-Compatible" content="IE=edge,chrome=1">
+<meta name="viewport"
+	content="width=device-width,initial-scale=1,minimum-scale=1.0,maximum-scale=1.0,user-scalable=no" />
+<meta http-equiv="Cache-Control" content="no-siteapp" />
+<!-- 本框架基本脚本和样式 -->
+<script type="text/javascript"
+	th:src="@{/js/plugin/jquery-2.1.4.min.js}"></script>
+<script type="text/javascript"
+	th:src="@{/js/systools/MBase.js}"></script>
+</head>
+<body class="container-fluid">
+<div class="pd-10">
+	<!-- 搜索框部分start -->
+			<div class="row form-head">
+				<form class="form-inline" id="serchform">
+<!--					<div class="input-group">-->
+<!--						<div class="btn-group search-list " data-for="search-text">-->
+<!--							<button type="button"-->
+<!--								class="btn btn-default dropdown-toggle searchlist"-->
+<!--								data-toggle="dropdown">-->
+<!--								用户姓名 <span class="caret "></span>-->
+<!--							</button>-->
+<!--							<ul class="dropdown-menu" role="menu">-->
+<!--								<li data-field="suName"><a>用户姓名</a></li>-->
+<!--								<li data-field="suAccount"><a>账号 </a></li>-->
+<!--							</ul>-->
+<!--						</div>-->
+<!--						<div class="form-group mr-20 ml-20">-->
+<!--							<input id="search-text" name="suName" placeholder="输入查询关键词"-->
+<!--								type="text" class="form-control">-->
+<!--						</div>-->
+<!--						<div class="form-group">-->
+<!--							<button onclick="myGrid.serchData(1)" type="button"-->
+<!--								class="btn btn-info">-->
+<!--								<i class="fa fa-search "></i> 搜索-->
+<!--							</button>-->
+<!--							<button type="reset" class="btn btn-info ">-->
+<!--								<i class="fa fa-refresh "></i> 重置-->
+<!--							</button>-->
+<!--						</div>-->
+<!--					</div>-->
+				</form>
+			</div>
+				
+	<div class="row mt-10" >
+		<div id="option-bar">
+			<!-- 功能按钮部分 -->
+			<button onclick="openAdd()" type="button" class="btn btn-info btn-sm"><i class="fa fa-add" ></i> 新增</button>
+		</div>
+		<table id="mgrid">
+			<thead>
+				<tr>
+					<th data-checkbox="true"></th>
+					<th data-formatter="MGrid.indexfn" data-align="center"  data-width="30px" >序号</th>
+					<th data-align="center" data-formatter="buidOperate" data-field="id">操作</th>
+					<th data-field="label" data-align="center">标签内容</th>
+					<th data-field="createBy" data-align="center">创建人</th>
+					<th data-field="shopName" data-align="center">门店名称</th>
+					<th data-field="isAll" data-align="center" data-formatter="isAllFormat">是否所有门店</th>
+				</tr>
+			</thead>
+		</table>
+	</div>
+</div>
+<script type="text/javascript"
+	th:src="@{/js/systools/MJsBase.js}"></script>
+	<script type="text/javascript">
+		 var myGrid;
+		$(function(){
+			var delUrl="";
+			delUrl=basePath+"/admin/label/del" ;
+			myGrid=MGrid.initGrid({
+				 url:basePath+"/admin/label/showList",
+				 delUrl:delUrl,
+			 });
+			
+		});
+
+
+		function del() {
+			var i = $("#mgrid").bootstrapTable('getSelections').length;
+			if (i > 1) {
+				layer.msg("仅可选择一条记录", {
+					icon: 5
+				});
+				return false;
+			}
+			myGrid.delItems();
+		}
+
+		function isAllFormat(value) {
+			if (value == 1) {
+				return "是"
+			} else {
+				return "否";
+			}
+		}
+
+	 	function buidOperate(value, row, index){
+			var html = "";
+			html += '<div class="btn-group">'
+					+ '<button type="button" class="btn btn-info dropdown-toggle" data-toggle="dropdown">'
+					+ '操作 <span class="caret"></span>' + '</button>'
+					+ '<ul class="dropdown-menu" role="menu">'
+					+ '<li><a href="javascript:void(0)" style="display:'
+					+ value
+					+ '"  onClick="openEdit(\''
+					+ value
+					+ '\')" title="编辑">编辑</a></li>'
+					+ '<li><a href="javascript:void(0)" style="display:'
+					+ value
+					+ '" onClick="myGrid.delItem(\''
+					+ value
+					+ '\')" title="删除">删除</a></li>' + '</ul>' + '</div>';
+			html += '';
+			return html; 
+		} 
+		//打开添加界面
+		function openAdd() {
+			layer.open({
+				type : 2,
+				title : "添加标签",
+				area : [ MUI.SIZE_L, '400px' ],
+				maxmin : true,
+				content : [ basePath+'/admin/label/edit']
+			}); 
+		}
+
+		 function openEdit(id) {
+			 layer.open({
+				 type : 2,
+				 title : "添加标签",
+				 area : [ MUI.SIZE_L, '400px' ],
+				 maxmin : true,
+				 content : [ basePath+'/admin/label/edit?id=' + id]
+			 });
+		 }
+	</script>
+</body>
+</html>
diff --git a/zq-erp/src/main/resources/templates/views/admin/hive/operate/trainingMaterialsManage-form.html b/zq-erp/src/main/resources/templates/views/admin/hive/operate/trainingMaterialsManage-form.html
index 346b695..2896219 100644
--- a/zq-erp/src/main/resources/templates/views/admin/hive/operate/trainingMaterialsManage-form.html
+++ b/zq-erp/src/main/resources/templates/views/admin/hive/operate/trainingMaterialsManage-form.html
@@ -13,14 +13,14 @@
             th:src="@{/js/plugin/jquery-2.1.4.min.js}"></script>
     <script type="text/javascript" th:src="@{/js/systools/MBase.js}"></script>
     <!-- 富文本编辑器 -->
-    <link rel="stylesheet"
-          th:href="@{/plugin/kindeditor/themes/default/default.css}"/>
-    <link rel="stylesheet"
-          th:href="@{/plugin/kindeditor/plugins/code/prettify.css}"/>
-    <script th:src="@{/plugin/kindeditor/kindeditor.js}"></script>
-    <script th:src="@{/plugin/kindeditor/lang/zh_CN.js}"></script>
-    <script
-            th:src="@{/plugin/kindeditor/plugins/code/prettify.js}"></script>
+    <script type="text/javascript" charset="utf-8"
+            th:src="@{/plugin/beditor/ueditor.config.js}"></script>
+    <script type="text/javascript" charset="utf-8"
+            th:src="@{/plugin/beditor/ueditor.all.js}">
+    </script>
+    <script type="text/javascript" charset="utf-8"
+            th:src="@{/plugin/beditor/lang/zh-cn/zh-cn.js}"></script>
+
     <style type="text/css">
         #projBox {
             max-height: 400px;
@@ -58,10 +58,10 @@
                        th:value="${obj?.title }" datatype="*" nullmsg="标题不能为空">
             </div>
             <div class="Validform_checktip"></div>
-            <label class="col-sm-2 control-label">排序<span class="text-danger">*</span></label>
+            <label class="col-sm-2 control-label">排序</label>
             <div class="col-sm-3">
                 <input autocomplete="off"   type="text" class="form-control" name="sort"
-                       th:value="${obj?.sort }" datatype="n" nullmsg="序号不能为空"
+                       th:value="${obj?.sort }" datatype="n"  	ignore="ignore"
                        errormsg="序号只能为数字">
             </div>
             <div class="Validform_checktip"></div>
@@ -86,10 +86,16 @@
             <div class="col-sm-3">
 
                     <div th:if="${obj ne null }" class="checkbox checkbox-inline">
-                        <input autocomplete="off"    name="isPublish" type="radio" id="inlineCheckbox1" value="是"   >
+
+                        <input autocomplete="off"   th:if="${obj.isPublish eq '是' }"  checked   name="isPublish" type="radio" id="inlineCheckbox1" value="是"    >
+                        <input autocomplete="off"   th:if="${obj.isPublish eq '否' }"     name="isPublish" type="radio" id="inlineCheckbox1" value="是"    >
                         <label for="inlineCheckbox1">是 </label> &nbsp;&nbsp;
-                        <input autocomplete="off"    name="isPublish" type="radio" id="inlineCheckbox2" value="否">
+
+                        <input autocomplete="off"    th:if="${obj.isPublish eq '是' }"  name="isPublish" type="radio" id="inlineCheckbox2" value="否">
+                        <input autocomplete="off"    th:if="${obj.isPublish eq '否' }" checked name="isPublish" type="radio" id="inlineCheckbox2" value="否">
                         <label for="inlineCheckbox2">否 </label>
+
+
                     </div>
 
                     <div  th:if="${obj eq null }" class="checkbox checkbox-inline">
@@ -105,30 +111,11 @@
         <div class="form-group">
             <label class="col-sm-2 control-label">文章内容</label>
             <div class="col-sm-8">
-				<textarea name="content" id="artcontent" th:text="${obj?.content}">
-
-				</textarea>
+                <script style="width: 100%; height: 500px" id="artcontent" name="content"
+                        type="text/plain" th:utext="${obj?.content}" ></script>
             </div>
             <div class="Validform_checktip"></div>
         </div>
-        <!--
-                <div class="form-group">
-                    <label class="col-sm-2 control-label">上传图片</label>
-                    <div class="col-sm-9">
-                        <input autocomplete="off"   onclick="MTools.chooesFile('#fileText')"
-                            class="input-text upload-url radius form-control" type="text" id="showFileName"
-                            readonly style="width: 30%;display: inline;">
-                            <a onclick="MTools.chooesFile('#fileText')" class="btn btn-success radius">
-                            <i class="fa fa-cloud-upload"></i> 浏览文件 </a>
-                            <input autocomplete="off"   type="button" class='btn btn-success radius'
-                            onclick="MTools.upFile('#submitBtn')" value="上传">
-                             <a id="selectInServices" class="btn btn-success radius">
-                             <i class="fa fa-cloud"></i> 远程图库
-                        </a>
-                    </div>
-                </div> -->
-
-
 
         <div class="form-group ">
             <div class="col-sm-12 text-center">
@@ -143,11 +130,14 @@
 <script type="text/javascript" th:src="@{/js/systools/MJsBase.js}"></script>
 <script th:inline="javascript">
     var obj=[[${obj}]];
-    var editor = null;
+
+    //百度编辑器
+    var ue = {};
+
     var myForm=MForm.initForm({
         invokeUrl:basePath+"/admin/article/addOrModify",
         beforeSubmit:function(){
-            editor.sync();
+
         },
         afterSubmit:function(){
             parent.myGrid.serchData();
@@ -156,11 +146,10 @@
 
     $(function() {
         $(".select2").select2({'width':'100%'});
-        MUI.createEdit("content", '100%', '400px', 'editor');
-        MUI.openServiceImgSpace(function(url) {
-            $("#img_1").attr("src", url).show();
-            $("#hiddenImg").val(url);
-        }, "#selectInServices");
+
+        //初始化编辑器
+        ue = UE.getEditor('artcontent');
+
         initFunctionList();
     });
 
@@ -185,7 +174,7 @@
 
 
     function autoZy() {
-        var text = editor.text();
+        var text = ue.getContentTxt();
         $("#zy-input").val(text.substring(0, 100));
     }
     function cleanZy() {
diff --git a/zq-erp/src/main/resources/templates/views/admin/hive/products/shoppinggoods-md-list.html b/zq-erp/src/main/resources/templates/views/admin/hive/products/shoppinggoods-md-list.html
index e3e4b38..8608af7 100644
--- a/zq-erp/src/main/resources/templates/views/admin/hive/products/shoppinggoods-md-list.html
+++ b/zq-erp/src/main/resources/templates/views/admin/hive/products/shoppinggoods-md-list.html
@@ -105,16 +105,16 @@
             <tr>
                 <th data-checkbox="true"></th>
                 <th data-formatter="MGrid.indexfn" data-align="center" data-width="30px">序号</th>
-                <th data-field="code">商品编号</th>
-                <th data-field="name">商品名称</th>
-                <th data-field="sealPice">售价/(本金)</th>
+                <th data-field="code"  data-sortable="true">商品编号</th>
+                <th data-field="name" data-sortable="true">商品名称</th>
+                <th data-field="sealPice" data-sortable="true">售价/(本金)</th>
                 <th data-field="giftMoney">赠送金额</th>
-                <th data-field="realSealCount">真实销量</th>
-                <th data-field="staus">状态</th>
+                <th data-field="realSealCount" data-sortable="true">真实销量</th>
+                <th data-field="staus" data-sortable="true">状态</th>
                 <th data-field="isPresent">是否赠送</th>
-                <th data-field="goodType">类型</th>
+                <th data-field="goodType" data-sortable="true">类型</th>
                 <th data-field="cateName">分类</th>
-                <th data-field="createTime" data-formatter="MGrid.getTime">创建时间</th>
+                <th data-field="createTime"  data-sortable="true" data-formatter="MGrid.getTime">创建时间</th>
             </tr>
             </thead>
         </table>
diff --git a/zq-erp/src/main/resources/templates/views/admin/hive/products/shoppinggoods-zb-list.html b/zq-erp/src/main/resources/templates/views/admin/hive/products/shoppinggoods-zb-list.html
index 0e1ef0e..b2d8c30 100644
--- a/zq-erp/src/main/resources/templates/views/admin/hive/products/shoppinggoods-zb-list.html
+++ b/zq-erp/src/main/resources/templates/views/admin/hive/products/shoppinggoods-zb-list.html
@@ -101,16 +101,16 @@
             <tr>
                 <th data-checkbox="true"></th>
                 <th data-formatter="MGrid.indexfn" data-align="center" data-width="30px">序号</th>
-                <th data-field="code">商品编号</th>
-                <th data-field="name">商品名称</th>
-                <th data-field="sealPice">售价/(本金)</th>
+                <th data-field="code"  data-sortable="true">商品编号</th>
+                <th data-field="name" data-sortable="true">商品名称</th>
+                <th data-field="sealPice" data-sortable="true">售价/(本金)</th>
                 <th data-field="giftMoney">赠送金额</th>
-                <th data-field="realSealCount">真实销量</th>
-                <th data-field="staus">状态</th>
+                <th data-field="realSealCount" data-sortable="true">真实销量</th>
+                <th data-field="staus" data-sortable="true">状态</th>
                 <th data-field="isPresent">是否赠送</th>
-                <th data-field="goodType">类型</th>
-                <th data-field="cateName">分类</th>
-                <th data-field="createTime" data-formatter="MGrid.getTime">创建时间</th>
+                <th data-field="goodType" data-sortable="true">类型</th>
+                <th data-field="cateName" >分类</th>
+                <th data-field="createTime"  data-sortable="true" data-formatter="MGrid.getTime">创建时间</th>
             </tr>
             </thead>
         </table>
diff --git a/zq-erp/src/main/resources/templates/views/admin/hive/statistics/daily-sale-list.html b/zq-erp/src/main/resources/templates/views/admin/hive/statistics/daily-sale-list.html
new file mode 100644
index 0000000..a9c2d1b
--- /dev/null
+++ b/zq-erp/src/main/resources/templates/views/admin/hive/statistics/daily-sale-list.html
@@ -0,0 +1,157 @@
+
+<!DOCTYPE HTML>
+<html xmlns:th="http://www.thymeleaf.org" xmlns:matrix="http://www.w3.org/1999/xhtml">
+<head>
+<meta charset="utf-8">
+<META HTTP-EQUIV="Pragma" CONTENT="no-cache">
+<meta name="renderer" content="webkit|ie-comp|ie-stand">
+<meta http-equiv="X-UA-Compatible" content="IE=edge,chrome=1">
+<meta name="viewport"
+	content="width=device-width,initial-scale=1,minimum-scale=1.0,maximum-scale=1.0,user-scalable=no" />
+<meta http-equiv="Cache-Control" content="no-siteapp" />
+<LINK rel="Bookmark" href="../images/favicon.ico">
+<!-- 本框架基本脚本和样式 -->
+<script type="text/javascript"
+        th:src="@{/js/plugin/jquery-2.1.4.min.js}"></script>
+<script type="text/javascript" th:src="@{/js/systools/MBase.js}"></script>
+ 
+</head>
+<body class="gray-bg">
+	 
+
+	<div class="ibox-content">
+		<!-- 搜索框部分start -->
+		<form class="form-inline" id="serchform">
+			<div class="form-group mr-20">
+				<label>日期范围</label>
+				<input name="beginTime" type="text" class="form-control datetimepicker" id="beginTime">-
+				<input name="endTime"  type="text" class="form-control datetimepicker" id="endTime">
+			</div>
+
+			<div class="form-group mr-20">
+				<label>门店</label>
+				<select class="form-control autoFull" data-filed="shopName" name="shopId" id="shopId"
+						th:data-url="@{/admin/shopInfo/findAllWithPermi}">
+					<option value=''>--请选择部所属门店--</option>
+				</select>
+			</div>
+
+			<div class="row mb-10">
+				<div class="col-sm-8">
+					<button  onclick="myGrid.serchData()" type="button" class="btn btn-info btn-sm"><i class="fa fa-search" ></i> 搜索</button>
+					<button  type="reset"   class="btn btn-default btn-sm"><i class="fa fa-refresh " ></i> 重置</button>
+<!--					<button  matrix:btn="ygyjbb-exportExcel"  onclick="exportExcel()" type="button" class="btn btn-default btn-sm"><i class="fa fa-download" ></i> 导出</button>-->
+				</div>
+			</div>
+		</form>
+
+
+		<table id="mgrid">
+			<thead>
+				<tr>
+					<th data-formatter="MGrid.indexfn" data-align="center"
+						data-width="30px">序号</th>
+					<th data-field="dataTime">日期</th>
+					<th data-field="shopName">门店名称</th>
+					<th data-field="shouldPay" data-formatter="shouldPayFormat">应收金额</th>
+					<th data-field="totalPay">实收金额</th>
+					<th data-field="shouldPay" data-formatter="zkAmountFormat">折扣金额</th>
+					<th data-field="perCustomCnt">客单数</th>
+					<th data-field="customGoodsCnt">客品数</th>
+					<th data-field="cost">成本</th>
+					<th data-field="grossProfit">毛利</th>
+					<th data-field="grossProfitRate">毛利率</th>
+					<th data-field="wechat">微信</th>
+					<th data-field="alipay">支付宝</th>
+					<th data-field="cash">现金</th>
+					<th data-field="bankCard">银行卡</th>
+					<th data-field="tuan">团购</th>
+					<th data-field="cardBj">本金收款</th>
+					<th data-field="cardFree">赠金收款</th>
+					<th data-field="arrears">欠款</th>
+				</tr>
+			</thead>
+		</table>
+	</div>
+
+	<script type="text/javascript" th:src="@{/js/systools/MJsBase.js}"></script>
+	<script type="text/javascript" th:src="@{/js/function/public.js}"></script>
+	<script type="text/javascript">
+		var myGrid;
+		var initParam = {
+				format : "yyyy-mm-dd", //默认显示年与日,如果想显示十分秒:"yyyy-mm-dd hh:ii:ss"
+				minView: "month", 	//"month",只显示年月日的选择,不会再跳转去选择时分秒;如果想要选择时分秒的:"hour"
+			}
+		 MTools.ininDatetimepicker(initParam);
+		//限制结束时间不小于开始时间
+		 MTools.limitStartEndTime({});
+
+		$(function() {
+			MTools.autoFullSelect();
+			$(".select2").select2();
+			myGrid = MGrid.initGrid({
+				url : basePath+"/admin/sysBusinessData/findDailySaleData",
+				showExport : true,
+				showFooter : false,
+				height:'auto',
+				width:'auto',
+				exportDataType : "basic", //basic', 'all', 'selected'.
+				exportTypes : [ 'excel', 'xlsx' ], //导出类型
+				exportOptions : {
+					ignoreColumn : [ 0 ],
+					fileName : "客户消费统计" + MTools.getTime(), //文件名称设置
+					worksheetName : 'Sheet1', //表格工作区名称  
+					tableName : '客户消费统计',
+					excelstyles : [ 'background-color', 'color', 'font-size',
+							'font-weight' ],
+				}
+			});
+
+			$('[data-toggle="tooltip"]').tooltip()
+
+		});
+
+		function shouldPayFormat(value, row, index) {
+			return row.shouldPay + row.refund;
+		}
+
+		function zkAmountFormat(value, row, index) {
+			return row.shouldPay + row.refund - row.arrears - row.totalPay;
+		}
+
+		function footCountTitle(data) {
+			return "<b>合计</b>";
+		};
+		function countColumn(data) {
+			if (data) {
+				var resultsumQuantity = parseFloat(data).toFixed(2);//保留有效数字
+				return resultsumQuantity;
+			} else {
+				return "-";
+			}
+		};
+
+		function buildVipNameJump(value, row, index) {
+			return '<a  onClick="vipDetail(\'' + row.t9 +'\')"   class="text-primary " >'+value+'</a>';
+		}
+
+		function vipDetail(value) {
+			layer.full(layer.open({
+				type : 2,
+				title : "订单详情",
+				maxmin : true,
+				area : MUI.SIZE_M,
+				content : [basePath+'/admin/redirect/hive/beautySalon/vip?vipPhone=' + value ]
+			}));
+		}
+
+		function exportExcel(){
+
+			var param=MForm.toUrlParam("#serchform");
+
+			window.location.href=basePath+"/admin/achieve/exportDailyInfoNew?"+param;
+		}
+		
+	</script>
+</body>
+</html>
diff --git a/zq-erp/src/main/resources/templates/views/admin/hive/statistics/jyls.html b/zq-erp/src/main/resources/templates/views/admin/hive/statistics/jyls.html
new file mode 100644
index 0000000..130f97d
--- /dev/null
+++ b/zq-erp/src/main/resources/templates/views/admin/hive/statistics/jyls.html
@@ -0,0 +1,306 @@
+<!DOCTYPE HTML>
+<html xmlns:th="http://www.thymeleaf.org" xmlns:matrix="http://www.w3.org/1999/xhtml">
+<head>
+    <meta charset="utf-8">
+    <META HTTP-EQUIV="Pragma" CONTENT="no-cache">
+    <meta name="renderer" content="webkit|ie-comp|ie-stand">
+    <meta http-equiv="X-UA-Compatible" content="IE=edge,chrome=1">
+    <meta name="viewport"
+          content="width=device-width,initial-scale=1,minimum-scale=1.0,maximum-scale=1.0,user-scalable=no"/>
+    <meta http-equiv="Cache-Control" content="no-siteapp"/>
+    <LINK rel="Bookmark" href="../images/favicon.ico">
+    <!-- 本框架基本脚本和样式 -->
+    <script type="text/javascript" th:src="@{/js/systools/MBaseVue.js}"></script>
+    <link rel="stylesheet" th:href="@{/plugin/element-ui/index.css}">
+    <link th:href="@{/css/styleOne/style.min.css}" rel="stylesheet" type="text/css"/>
+    <title></title>
+    <style>
+        .panel-body{
+            overflow: hidden;
+        }
+        .buttonPanel{
+            background: #ffffff;
+            padding: 10px 10px ;
+            margin: 0px 0px 10px 0px;
+        }
+        .rowPanel{
+            background: #ffffff;
+            padding: 0px 10px ;
+            padding-top: 10px;
+            margin: 0px 0px 10px 0px;
+        }
+        .paginationStyle{
+            background: #ffffff;
+            padding: 10px 10px;
+            margin: 0px 0px 10px 0px;
+            text-align: right;
+        }
+    </style>
+</head>
+<body>
+<div class="panel-body" id="app">
+
+    <el-row class="buttonPanel">
+            <el-button @click="exportExcel" type="primary" >导出</el-button>
+    </el-row>
+
+    <el-row class="rowPanel"  >
+        <el-form ref="form" :model="form" inline >
+            <el-form-item label="会员" prop="queryKey">
+                <el-input v-model="form.queryKey" placeholder="请输入会员姓名/手机"></el-input>
+            </el-form-item>
+
+            <el-form-item label="操作人" prop="oprationMan" >
+                <el-input v-model="form.oprationMan"></el-input>
+            </el-form-item>
+
+            <el-form-item label="订单号" prop="orderNo">
+                <el-input v-model="form.orderNo"></el-input>
+            </el-form-item>
+
+            <el-form-item label="交易类型" prop="flowType">
+                <el-select v-model="form.flowType" placeholder="请选择">
+                    <el-option
+                            v-for="item in flowTypeList"
+                            :key="item.value"
+                            :label="item.label"
+                            :value="item.value"
+                            >
+                    </el-option>
+                </el-select>
+            </el-form-item>
+
+            <el-form-item label="支付方式" prop="payMethod">
+                <el-select v-model="form.payMethod" placeholder="请选择">
+                    <el-option
+                            v-for="item in payMethodList"
+                            :key="item.value"
+                            :label="item.label"
+                            :value="item.value">
+                    </el-option>
+                </el-select>
+            </el-form-item>
+
+            <el-form-item label="时间" prop="datetimeArr">
+                <el-date-picker
+                        v-model="form.datetimeArr"
+                        type="daterange"
+                        range-separator="至" format="yyyy-MM-dd HH:mm"
+                        start-placeholder="开始日期"
+                        end-placeholder="结束日期">
+                </el-date-picker>
+            </el-form-item>
+
+            <el-button type="primary" @click="search" >搜索</el-button>
+            <el-button @click="resetForm('form')">重置</el-button>
+        </el-form>
+    </el-row>
+
+    <el-row class="table-style"  >
+
+        <el-table id="proj" :data="table.rows"  :height="height" stripe @sort-change="sortChange">
+            <el-table-column
+                    prop="orderNo"
+                    label="订单号"
+                    width="180">
+            </el-table-column>
+            <el-table-column
+                    prop="flowContent"
+                    label="交易内容"
+                    show-overflow-tooltip
+                    width="240">
+            </el-table-column>
+            <el-table-column
+                    prop="createTime"
+                    sortable="custom"
+                    label="交易时间"
+                    show-overflow-tooltip
+                    width="180">
+            </el-table-column>
+            <el-table-column
+                    prop="flowType"
+                    sortable="custom"
+                    label="交易类型">
+            </el-table-column>
+            <el-table-column
+                    prop="amount"
+                    sortable="custom"
+                    label="交易金额">
+            </el-table-column>
+            <el-table-column
+                    prop="vipName"
+                    label="会员姓名">
+            </el-table-column>
+            <el-table-column
+                    prop="payMethod"
+                    sortable="custom"
+                    label="支付方式">
+            </el-table-column>
+            <el-table-column
+                    prop="flowNo"
+                    label="支付流水号">
+            </el-table-column>
+            <el-table-column
+                    prop="staffName"
+                    label="操作人">
+            </el-table-column>
+            <el-table-column
+                    prop="shopName"
+                    label="门店名称">
+            </el-table-column>
+            <el-table-column label="操作">
+                <template slot-scope="scope">
+                    <el-button type="text" @click="openOrder(scope.$index, scope.row)" size="small">订单详情</el-button>
+                </template>
+            </el-table-column>
+        </el-table>
+    </el-row>
+    <el-row class="paginationStyle"  >
+        <el-pagination background
+                       @size-change="changePageSize"
+                       @current-change="changeCurrentPage"
+                       :current-page="table.currentPage"
+                       :page-sizes="[10, 20, 30, 50]"
+                       :page-size="table.pageSize"
+                       layout="total, sizes, prev, pager, next, jumper"
+                       :total="table.total">
+        </el-pagination>
+    </el-row>
+
+</div>
+</body>
+<script type="text/javascript" th:src="@{/js/plugin/jquery-2.1.4.min.js}"></script>
+<script type="text/javascript" th:src="@{/js/plugin/jquery.query.js}"></script>
+<script type="text/javascript" th:src="@{/plugin/layer/layer.js}"></script>
+<script type="text/javascript" th:src="@{/js/systools/AjaxProxyVue.js}"></script>
+<script type="text/javascript" th:src="@{/js/plugin/vue.js}"></script>
+<script type="text/javascript" th:src="@{/plugin/element-ui/index.js}"></script>
+<script type="text/javascript" th:src="@{/plugin/moment.min.js}"></script>
+<script type="text/javascript" th:inline="javascript">
+
+    var vue = new Vue({
+        el: '#app',
+        data: {
+            table:{
+                rows:[],
+                total:0,
+                pageSize:10,
+                currentPage:1,
+            },
+            form:{
+                name:null,
+                datetimeArr:'',
+                payMethod:'',
+                flowType:'',
+                orderNo:'',
+                oprationMan:'',
+                queryKey:'',
+                order:'',
+                sort:''
+            },
+            height:'calc(100vh - 240px)',
+            flowTypeList:[
+                {value:'',label:'全部'},
+                {value:'购买',label:'购买'},
+                {value:'退款',label:'退款'},
+                {value:'还款',label:'还款'}
+            ],
+            payMethodList:[
+                {value:'',label:'全部'},
+                {value:'现金',label:'现金'},
+                {value:'微信',label:'微信'},
+                {value:'支付宝',label:'支付宝'},
+                {value:'银行卡',label:'银行卡'},
+                {value:'团购',label:'团购'},
+                {value:'储值卡',label:'储值卡'},
+                {value:'欠款',label:'欠款'}
+            ],
+        },
+        created: function () {
+           this.loadData();
+            window.addEventListener("keydown", this.keydown);
+        },
+        methods: {
+            changePageSize(val) {
+                this.table.pageSize = val;
+                this.loadData();
+            },
+            changeCurrentPage(val) {
+                this.table.currentPage = val;
+                this.loadData();
+            },
+            resetForm(formName) {
+                this.$refs[formName].resetFields();
+            },
+            sortChange:function (column){
+                if(column.order){
+                    if(column.order.indexOf("desc")){
+                        this.form.order="desc";
+                    }else{
+                        this.form.order="asc";
+                    }
+                    this.form.sort=column.prop;
+                    this.loadData();
+                }
+            },
+            loadData:function(){
+                let _this = this;
+                let data=_this.getRequestParam();
+                data.limit=_this.table.pageSize;
+                data.offset=_this.table.pageSize*(_this.table.currentPage-1);
+                AjaxProxy.requst({
+                    app: _this,
+                    data:data,
+                    url: basePath + '/admin/orderFlow/findOrderFlow',
+                    callback: function (data) {
+                        _this.table.rows = data.rows;
+                        _this.table.total=data.total;
+                    }
+                });
+            },
+            getRequestParam(){
+                let _this = this;
+                return   {
+                    name:_this.form.name,
+                    payMethod:_this.form.payMethod,
+                    flowType:_this.form.flowType,
+                    orderNo:_this.form.orderNo,
+                    oprationMan:_this.form.oprationMan,
+                    queryKey:_this.form.queryKey,
+                    startTime:_this.form.datetimeArr?moment(_this.form.datetimeArr[0]).format("YYYY-MM-DD HH:mm"):'',
+                    endTime:_this.form.datetimeArr?moment(_this.form.datetimeArr[1]).format("YYYY-MM-DD HH:mm"):'',
+                    shopId:_this.form.shopId,
+                    order:_this.form.order,
+                    sort:_this.form.sort,
+                }
+            },
+            search:function(){
+                this.table.currentPage=1;
+                this.loadData();
+            },
+            keydown(evt){
+                if(evt.keyCode==13) {
+                    this.search();
+                }
+            },
+
+            openOrder(index,row){
+                layer.full(layer.open({
+                    type : 2,
+                    title : "订单详情",
+                    maxmin : true,
+                    content : [ basePath + '/admin/order/orderItem?id=' + row.orderId ]
+                }));
+            },
+            //导出
+          exportExcel(){
+            window.location.href=basePath+"/admin/orderFlow/exportOrderFlowExcel?"+MTools.jsonToUrlParam(this.getRequestParam());
+        }
+
+        }
+    });
+
+
+</script>
+</body>
+</html>
\ No newline at end of file
diff --git a/zq-erp/src/main/resources/templates/views/admin/hive/statistics/statistics-moneyCar-item.html b/zq-erp/src/main/resources/templates/views/admin/hive/statistics/statistics-moneyCar-item.html
index 73307ce..852a46c 100644
--- a/zq-erp/src/main/resources/templates/views/admin/hive/statistics/statistics-moneyCar-item.html
+++ b/zq-erp/src/main/resources/templates/views/admin/hive/statistics/statistics-moneyCar-item.html
@@ -27,7 +27,7 @@
 			</div>
 
 			<div class="form-group mr-20">
-				<label  >产品名称</label>
+				<label>储值卡名称</label>
 				<input autocomplete="off"   name="projName" type="text" class="form-control" >
 			</div>
 
diff --git a/zq-erp/src/main/resources/templates/views/admin/hive/statistics/statistics-moneyCar-summary.html b/zq-erp/src/main/resources/templates/views/admin/hive/statistics/statistics-moneyCar-summary.html
index a5952d6..ca5daba 100644
--- a/zq-erp/src/main/resources/templates/views/admin/hive/statistics/statistics-moneyCar-summary.html
+++ b/zq-erp/src/main/resources/templates/views/admin/hive/statistics/statistics-moneyCar-summary.html
@@ -25,30 +25,28 @@
 					<button  onclick="myGrid.resetForm()" type="button"   class="btn btn-default btn-sm"><i class="fa fa-refresh " ></i> 重置</button>
 				</div>
 			</div>
-
 			<div class="form-group mr-20">
-				<label  >产品名称</label>
+				<label>储值卡名称</label>
 				<input autocomplete="off"   name="projName" type="text" class="form-control" >
 			</div>
+<!--			<div class="form-group mr-20">-->
+<!--				<label for="parentId">商品分类</label>-->
+<!--				<select class="form-control select2" size="1" name="cateId" id="parentId">-->
+<!--					<option value="" selected="selected">&#45;&#45;选择分类&#45;&#45;</option>-->
+<!--				</select>-->
+<!--			</div>-->
 
-			<div class="form-group mr-20">
-				<label for="parentId">商品分类</label>
-				<select class="form-control select2" size="1" name="cateId" id="parentId">
-					<option value="" selected="selected">--选择分类--</option>
-				</select>
-			</div>
-
-			<div class="form-group mr-20">
-				<label>会员</label>
-				<input autocomplete="off" placeholder="姓名/编号/电话"  name="vipQueryKey" type="text" class="form-control"  >
-			</div>
+<!--			<div class="form-group mr-20">-->
+<!--				<label>会员</label>-->
+<!--				<input autocomplete="off" placeholder="姓名/编号/电话"  name="vipQueryKey" type="text" class="form-control"  >-->
+<!--			</div>-->
 
 
-			<div class="form-group mr-20">
-				<label>到期时间</label><!--    入库时间的查询增加一个查询的其实时间两个字段 -->
-				<input autocomplete="off"   id="select_begin" name="beginTime" type="text" class="form-control datetimepicker">-
-				<input autocomplete="off"   name="endTime"  type="text" class="form-control datetimepicker" id="select_end">
-			</div>
+<!--			<div class="form-group mr-20">-->
+<!--				<label>到期时间</label>&lt;!&ndash;    入库时间的查询增加一个查询的其实时间两个字段 &ndash;&gt;-->
+<!--				<input autocomplete="off"   id="select_begin" name="beginTime" type="text" class="form-control datetimepicker">- -->
+<!--				<input autocomplete="off"   name="endTime"  type="text" class="form-control datetimepicker" id="select_end">-->
+<!--			</div>-->
 		</form>
 		<div id="option-bar" >
 			<button matrix:btn="bedList-exportExcel" onclick="exportExcel()" type="button" class="btn btn-default btn-sm"><i class="fa fa-download" ></i> 导出</button>
diff --git a/zq-erp/src/main/resources/templates/views/admin/hive/statistics/statistics-projSercice-item.html b/zq-erp/src/main/resources/templates/views/admin/hive/statistics/statistics-projSercice-item.html
index 68abe4f..80f18c5 100644
--- a/zq-erp/src/main/resources/templates/views/admin/hive/statistics/statistics-projSercice-item.html
+++ b/zq-erp/src/main/resources/templates/views/admin/hive/statistics/statistics-projSercice-item.html
@@ -36,14 +36,14 @@
 				</select>
 			</div>
 			<div class="form-group mr-20">
-				<label  >产品名称</label>
+				<label  >服务名称</label>
 				<input autocomplete="off"   name="projName" type="text" class="form-control" >
 			</div>
 
 			<div class="form-group mr-20">
-				<label for="projTypeId">项目分类</label>
+				<label for="projTypeId">商品分类</label>
 				<select class="form-control select2" size="1" name ="cateId"  id="projTypeId">
-					<option value=''>--选择项目分类--</option>
+					<option value=''>--选择分类--</option>
 				</select>
 			</div>
 
@@ -77,15 +77,18 @@
 			<thead>
 				<tr>
 					<th data-formatter="MGrid.indexfn" data-align="center"  data-width="30px" >序号</th>
-					<th data-field="consume_time"  data-formatter="MGrid.getTime"  data-sortable="true"   >服务日期</th>
+					<th data-field="SHOP_NAME" >门店</th>
+					<th data-field="yy_time"  data-formatter="MGrid.getTime"  data-sortable="true"   >预约时间</th>
+					<th data-field="consume_time"  data-formatter="MGrid.getTime"  data-sortable="true"   >划扣时间</th>
 					<th data-field="SERVICE_NO" >服务单号</th>
 					<th data-field="PROJ_NAME" >服务名称</th>
 					<th data-field="TYPE_NAME" >分类</th>
 					<th data-field="VIP_NAME" >客户名</th>
-      			    <th data-field="COUNT"  data-sortable="true"     >次数</th>
-      			    <th data-field="PRICE"  data-sortable="true"       >单价</th>
-      			    <th data-field="su_name" >美疗师</th>
-      			    <th data-field="SOURCE" >来源</th>
+					<th data-field="COUNT"  data-sortable="true"     >次数</th>
+					<th data-field="PRICE"  data-sortable="true"       >划扣单价</th>
+					<th data-field="extract"  data-sortable="true"  >提成</th>
+					<th data-field="su_name" >美疗师</th>
+					<th data-field="SOURCE" >来源</th>
 				</tr>
 			</thead>
 		</table>
@@ -107,7 +110,9 @@
 			//有删除权限
 			var delUrl="";
 			myGrid=MGrid.initGrid({
-				 url:basePath+"/admin/serviceStatistics/showList"
+				url:basePath+"/admin/serviceStatistics/showList",
+				sortName:"yy_time",
+				sortOrder:"desc"
 			 });
 		});
 		
@@ -123,12 +128,13 @@
 
 	function initFunctionList() {
 		$.AjaxProxy({
-			a : false,
-			c : false
-		}).invoke(basePath+"/admin/projtype/all", function(loj) {
+			a: false,
+			c: false,
+			p: {salePlatform: '线下'}
+		}).invoke(basePath + "/admin/shoppinggoodscategory/all", function (loj) {
 			$("#projTypeId").createSelectTree(loj.attr("result").rows, {
-				append : true,
-				value:"typeName"
+				append: true,
+				value: "name",
 			});
 		});
 	}
diff --git a/zq-erp/src/main/resources/templates/views/admin/hive/statistics/statistics-projSercice-sumary.html b/zq-erp/src/main/resources/templates/views/admin/hive/statistics/statistics-projSercice-sumary.html
index 685c269..9913565 100644
--- a/zq-erp/src/main/resources/templates/views/admin/hive/statistics/statistics-projSercice-sumary.html
+++ b/zq-erp/src/main/resources/templates/views/admin/hive/statistics/statistics-projSercice-sumary.html
@@ -26,7 +26,7 @@
 				</div>
 			</div>
 			<div class="form-group mr-20">
-				<label  >订单状态</label>
+				<label>订单状态</label>
 				<select class="form-control " name="state"  >
 					<option value=''>--请选择订单状态--</option>
 					<option value='待预约'>待预约</option>
@@ -36,14 +36,14 @@
 				</select>
 			</div>
 			<div class="form-group mr-20">
-				<label  >产品名称</label>
+				<label>服务名称</label>
 				<input autocomplete="off"   name="projName" type="text" class="form-control" >
 			</div>
 
 			<div class="form-group mr-20">
-				<label for="projTypeId">项目分类</label>
+				<label for="projTypeId">商品分类</label>
 				<select class="form-control select2" size="1" name ="cateId"  id="projTypeId">
-					<option value=''>--选择项目分类--</option>
+					<option value=''>--选择分类--</option>
 				</select>
 			</div>
 
@@ -104,12 +104,13 @@
 
 	function initFunctionList() {
 		$.AjaxProxy({
-			a : false,
-			c : false
-		}).invoke(basePath+"/admin/projtype/all", function(loj) {
+			a: false,
+			c: false,
+			p: {salePlatform: '线下'}
+		}).invoke(basePath + "/admin/shoppinggoodscategory/all", function (loj) {
 			$("#projTypeId").createSelectTree(loj.attr("result").rows, {
-				append : true,
-				value:"typeName"
+				append: true,
+				value: "name",
 			});
 		});
 	}
diff --git a/zq-erp/src/main/resources/templates/views/admin/hive/statistics/statistics-projuse-item.html b/zq-erp/src/main/resources/templates/views/admin/hive/statistics/statistics-projuse-item.html
index afb532f..0ba9414 100644
--- a/zq-erp/src/main/resources/templates/views/admin/hive/statistics/statistics-projuse-item.html
+++ b/zq-erp/src/main/resources/templates/views/admin/hive/statistics/statistics-projuse-item.html
@@ -27,14 +27,14 @@
 			</div>
 
 			<div class="form-group mr-20">
-				<label  >产品名称</label>
+				<label>服务名称</label>
 				<input autocomplete="off"   name="projName" type="text" class="form-control" >
 			</div>
 
 			<div class="form-group mr-20">
-				<label for="projTypeId">项目分类</label>
+				<label for="projTypeId">商品分类</label>
 				<select class="form-control select2" size="1" name ="cateId"  id="projTypeId">
-					<option value=''>--选择项目分类--</option>
+					<option value=''>--选择分类--</option>
 				</select>
 			</div>
 
@@ -117,12 +117,13 @@
 
 	function initFunctionList() {
 		$.AjaxProxy({
-			a : false,
-			c : false
-		}).invoke(basePath+"/admin/projtype/all", function(loj) {
+			a: false,
+			c: false,
+			p: {salePlatform: '线下'}
+		}).invoke(basePath + "/admin/shoppinggoodscategory/all", function (loj) {
 			$("#projTypeId").createSelectTree(loj.attr("result").rows, {
-				append : true,
-				value:"typeName"
+				append: true,
+				value: "name",
 			});
 		});
 	}
diff --git a/zq-erp/src/main/resources/templates/views/admin/hive/statistics/statistics-projuse-sumary.html b/zq-erp/src/main/resources/templates/views/admin/hive/statistics/statistics-projuse-sumary.html
index 2ab1687..8e3fe77 100644
--- a/zq-erp/src/main/resources/templates/views/admin/hive/statistics/statistics-projuse-sumary.html
+++ b/zq-erp/src/main/resources/templates/views/admin/hive/statistics/statistics-projuse-sumary.html
@@ -25,13 +25,13 @@
 				</div>
 			</div>
 			<div class="form-group mr-20">
-				<label>产品名称</label>
+				<label>服务名称</label>
 				<input autocomplete="off"   name="projName" type="text" class="form-control" >
 			</div>
 			<div class="form-group mr-20">
-				<label for="projTypeId">项目分类</label>
+				<label for="projTypeId">商品分类</label>
 				<select class="form-control select2" size="1" name ="cateId"  id="projTypeId">
-					<option value=''>--选择项目分类--</option>
+					<option value=''>--选择分类--</option>
 				</select>
 			</div>
 		</form>
@@ -86,12 +86,13 @@
 
 	function initFunctionList() {
 		$.AjaxProxy({
-			a : false,
-			c : false
-		}).invoke(basePath+"/admin/projtype/all", function(loj) {
+			a: false,
+			c: false,
+			p: {salePlatform: '线下'}
+		}).invoke(basePath + "/admin/shoppinggoodscategory/all", function (loj) {
 			$("#projTypeId").createSelectTree(loj.attr("result").rows, {
-				append : true,
-				value:"typeName"
+				append: true,
+				value: "name",
 			});
 		});
 	}
diff --git a/zq-erp/src/main/resources/templates/views/admin/hive/store/outStore-form.html b/zq-erp/src/main/resources/templates/views/admin/hive/store/outStore-form.html
index 2eee6c7..0a1d22f 100644
--- a/zq-erp/src/main/resources/templates/views/admin/hive/store/outStore-form.html
+++ b/zq-erp/src/main/resources/templates/views/admin/hive/store/outStore-form.html
@@ -233,7 +233,7 @@
 								<el-table-column
 										label="数量">
 									<template slot-scope="scope">
-										<el-form-item :prop="'assembleGoods.'+ scope.$index +'.amount'" :rules="rules.count">
+										<el-form-item :prop="'assembleGoods.'+ scope.$index +'.amount'" >
 											<el-input v-model.number="scope.row.amount"></el-input>
 										</el-form-item>
 									</template>
@@ -279,10 +279,6 @@
 				],
 				warehouseData : [
 					{ required: true, message: '请选择仓库', trigger: 'change' }
-				],
-				count : [
-					{ required: true, message: '请输入信息', trigger: 'blur' },
-					{ type : 'number', message: '请输入数字', trigger: 'blur' }
 				],
 			},
 			outStoreTypeData : [],
diff --git a/zq-erp/src/main/resources/templates/views/admin/hive/vip/moneyCardUse-form.html b/zq-erp/src/main/resources/templates/views/admin/hive/vip/moneyCardUse-form.html
index 56eeb3b..8dc1d12 100644
--- a/zq-erp/src/main/resources/templates/views/admin/hive/vip/moneyCardUse-form.html
+++ b/zq-erp/src/main/resources/templates/views/admin/hive/vip/moneyCardUse-form.html
@@ -71,7 +71,7 @@
 
         <div class="form-group">
             <label class="col-sm-2 control-label">充值卡备注</label>
-            <div class="col-sm-10">
+            <div class="col-sm-4">
                 <textarea class="form-control" name="remark" rows="4" th:text="${obj?.remark}"></textarea>
                 <div class="Validform_checktip"></div>
             </div>
@@ -80,7 +80,7 @@
 
         <div class="form-group">
             <label class="col-sm-2 control-label">本次修改说明<span class="text-danger">*</span></label>
-            <div class="col-sm-10">
+            <div class="col-sm-4">
                 <input dataType="*1-200" errormsg="修改充值卡必须填写修改说明" class="form-control" name="changeRemark"/>
                 <div class="Validform_checktip"></div>
             </div>
diff --git a/zq-erp/src/main/resources/templates/views/admin/hive/vip/moneyCardUseFlow-list.html b/zq-erp/src/main/resources/templates/views/admin/hive/vip/moneyCardUseFlow-list.html
index aa2d486..f3a0475 100644
--- a/zq-erp/src/main/resources/templates/views/admin/hive/vip/moneyCardUseFlow-list.html
+++ b/zq-erp/src/main/resources/templates/views/admin/hive/vip/moneyCardUseFlow-list.html
@@ -16,25 +16,11 @@
 </head>
 <body class=" container-fluid">
 <div class="pd-10">
-    <!-- 搜索框部分start -->
-    <div class="row form-head">
-        <form class="form-inline" id="serchform">
-            <!-- 用于套餐的查询 -->
-            <input autocomplete="off"   type="hidden" name="vipId" value="" id="vipId">
 
-            <div class="form-group mr-20">
-                <label>操作内容</label>
-                <input autocomplete="off"   name="content" type="text" class="form-control">
-            </div>
-            <div class="form-group">
-                <button onclick="myGrid.serchData(1)" type="button"
-                        class="btn btn-sm btn-info">
-                    <i class="fa fa-search "></i> 搜索
-                </button>
-                <button type="reset" class="btn btn-sm btn-info ">
-                    <i class="fa fa-refresh "></i> 重置
-                </button>
-            </div>
+    <div class="row form-head">
+        <form class="form-inline" id="serchform2">
+            <!-- 用于套餐的查询 -->
+            <input autocomplete="off"   type="hidden" name="vipId" th:value="${param.vipId}" class="vipId">
         </form>
     </div>
     <div class="row mt-10">
@@ -42,48 +28,46 @@
 
         </div>
         <!-- 数据表格部分 -->
-        <table id="mgrid">
+        <table id="mgrid2">
             <thead>
             <tr>
                 <th data-formatter="MGrid.indexfn" data-align="center"
                     data-width="30px">序号</th>
-                <th data-field="vipName">客户姓名</th>
-                <!--
-                <th data-field="orderNo">订单编号/服务单编号</th>
-                 -->
-                <th data-field="content" data-sortable="true">操作内容</th>
-                <th data-field="staffName">操作人</th>
                 <th data-field="createTime" data-formatter="MGrid.getTime">操作时间</th>
+                <th data-field="cardName">充值卡名称</th>
+                <th data-field="vipName">客户姓名</th>
+                <th data-field="type">变更类型</th>
+                <th data-field="orderNo">单据编号</th>
+                <th data-field="total" data-formatter="MGrid.getYk" >本金</th>
+                <th data-field="giftMoney" data-formatter="MGrid.getYk" >赠送金额</th>
+                <th data-field="balance">余额</th>
+                <th data-field="times">次数</th>
+                <th data-field="staffName">操作人</th>
+                <th data-field="content" data-sortable="true">备注</th>
             </tr>
             </thead>
         </table>
         <!-- 数据表格部分end -->
+        <div class="form-group ">
+            <div class="col-sm-12 text-center fixed-button">
+                <a class="btn btn-danger radius" href="javascript:;"
+                   onclick="MTools.closeForm()"><i class="fa fa-close"></i> 关闭</a>
+            </div>
+        </div>
     </div>
 </div>
 
 <script type="text/javascript" th:src="@{/js/systools/MJsBase.js}"></script>
 <script type="text/javascript">
     //初始化表格
-    var myGrid;
-    myGrid=MGrid.initGrid({
-        url:basePath+"/admin/moneyCardUseFlow/showList?vipId="+$.query.get("vipId"),
+    //初始化表格
+    var myGrid2;
+    myGrid2=MGrid.initGrid({
+        tableSelecter: "#mgrid2",// 表格选择器 请保持唯一
+        serchFormSelecter: "#serchform2",// 搜索表单选择器
+        url:basePath+"/admin/moneyCardUse/showCardFlowList",
     });
 
-    function buidOperate(value, row, index){
-        return html;
-    }
-
-
-    function getYesOrNo(value, row, index){
-        switch(value){
-            case 'Y':
-                return "是";
-            case 'N':
-                return "否";
-            default:
-                return value;
-        }
-    }
 </script>
 
 </body>
diff --git a/zq-erp/src/main/resources/templates/views/admin/hive/vip/projUse-form.html b/zq-erp/src/main/resources/templates/views/admin/hive/vip/projUse-form.html
index 9d530cd..936a6ae 100644
--- a/zq-erp/src/main/resources/templates/views/admin/hive/vip/projUse-form.html
+++ b/zq-erp/src/main/resources/templates/views/admin/hive/vip/projUse-form.html
@@ -38,6 +38,14 @@
             </div>
         </div>
         <div class="form-group">
+            <label class="col-sm-2 control-label">单次划扣<span class="text-danger">*</span></label>
+            <div class="col-sm-4">
+                <input autocomplete="off"   type="text"  class="form-control" name="price"
+                       th:value="${obj?.price}" datatype="*1-20" nullmsg="单次划扣余额不能为空">
+                <div class="Validform_checktip"></div>
+            </div>
+        </div>
+        <div class="form-group">
             <label class="col-sm-2 control-label">到期时间</label>
             <div class="col-sm-4">
                 <input autocomplete="off"   name="failTime" type="text" datatype="*"
@@ -58,9 +66,16 @@
             </div>
         </div>
         <div class="form-group">
-            <label class="col-sm-2 control-label">备注</label>
-            <div class="col-sm-10">
-                <textarea   class="form-control" name="remark" rows="4" th:text="${obj?.remark}" ></textarea>
+            <label class="col-sm-2 control-label">项目备注</label>
+            <div class="col-sm-4">
+                <textarea    class="form-control" name="remark" rows="4" th:text="${obj?.remark}" ></textarea>
+                <div class="Validform_checktip"></div>
+            </div>
+        </div>
+        <div class="form-group">
+            <label class="col-sm-2 control-label">修改备注<span class="text-danger">*</span></label>
+            <div class="col-sm-4">
+                <textarea   datatype="*1-200" class="form-control" name="updateRemark" rows="4"  ></textarea>
                 <div class="Validform_checktip"></div>
             </div>
         </div>
diff --git a/zq-erp/src/main/resources/templates/views/admin/hive/vip/tc-form.html b/zq-erp/src/main/resources/templates/views/admin/hive/vip/tc-form.html
index 182a537..e1c84b4 100644
--- a/zq-erp/src/main/resources/templates/views/admin/hive/vip/tc-form.html
+++ b/zq-erp/src/main/resources/templates/views/admin/hive/vip/tc-form.html
@@ -50,7 +50,7 @@
         </div>
 
         <div class="form-group">
-            <div class="col-sm-8 col-md-offset-2" id="projBox">
+            <div class="col-sm-4 col-md-offset-2" id="projBox">
                 <table class="table table-striped table-hover table-bordered"
                        id="mgrid">
                     <thead>
@@ -90,9 +90,16 @@
         </div>
 
         <div class="form-group">
-            <label class="col-sm-2 control-label">备注</label>
-            <div class="col-sm-10">
-                <textarea   class="form-control" name="remark" rows="4" >[[${obj.remark}]]</textarea>
+            <label class="col-sm-2 control-label">套餐备注</label>
+            <div class="col-sm-4">
+                <textarea    class="form-control" name="remark" rows="4" th:text="${obj?.remark}" ></textarea>
+                <div class="Validform_checktip"></div>
+            </div>
+        </div>
+        <div class="form-group">
+            <label class="col-sm-2 control-label">修改备注<span class="text-danger">*</span></label>
+            <div class="col-sm-4">
+                <textarea   datatype="*1-200" class="form-control" name="updateRemark" rows="4"  ></textarea>
                 <div class="Validform_checktip"></div>
             </div>
         </div>
diff --git a/zq-erp/src/main/resources/templates/views/admin/shop/shopProduct-form.html b/zq-erp/src/main/resources/templates/views/admin/shop/shopProduct-form.html
index d9e813a..47957c3 100644
--- a/zq-erp/src/main/resources/templates/views/admin/shop/shopProduct-form.html
+++ b/zq-erp/src/main/resources/templates/views/admin/shop/shopProduct-form.html
@@ -797,15 +797,7 @@
                     flag = true;
                     return false;
                 }
-                var path = tds.eq(length - 6).find("img").attr("src");
-                if(path == null){
-                    layer.msg("请填写规格图片",{
-                        icon : 2,
-                        time : 2000
-                    });
-                    flag = true;
-                    return false;
-                }
+
                 var stock = tds.eq(length - 5).find("input").val();
                 if(stock == ""){
                     layer.msg("请填写库存",{
@@ -832,15 +824,7 @@
                     flag = true;
                     return false;
                 }
-                var erpNo = tds.eq(length - 2).find("input").val();
-                if(erpNo == ""){
-                    layer.msg("请填写erp产品编号,否则订单无法和erp同步",{
-                        icon : 2,
-                        time : 2000
-                    });
-                    flag = true;
-                    return false;
-                }
+
 
 
             }
diff --git a/zq-erp/src/main/resources/templates/views/admin/shop/templateMsg-form.html b/zq-erp/src/main/resources/templates/views/admin/shop/templateMsg-form.html
index a48b207..27a2914 100644
--- a/zq-erp/src/main/resources/templates/views/admin/shop/templateMsg-form.html
+++ b/zq-erp/src/main/resources/templates/views/admin/shop/templateMsg-form.html
@@ -36,6 +36,19 @@
 					   th:value="${obj.uuid}"nullmsg="模板id不能为空">
 			</div>
 		</div>
+			<div class="form-group">
+				<label class="col-sm-2 control-label">类型
+					<span class="text-danger">*</span>
+				</label>
+				<div class="col-sm-4">
+					<select class="form-control" dataType="*" nullmsg="请选择状态" name="tempType">
+						<option value='1' th:if="${obj.tempType == 1}" selected>公众号</option>
+						<option value='1' th:unless="${obj.tempType == 1}">公众号</option>
+						<option value='2' th:if="${obj.tempType == 2}" selected>小程序</option>
+						<option value='2' th:unless="${obj.tempType == 2}">小程序</option>
+					</select>
+				</div>
+			</div>
 
 		<div class="form-group">
 
diff --git a/zq-erp/src/main/resources/templates/views/admin/shop/templateMsg-list.html b/zq-erp/src/main/resources/templates/views/admin/shop/templateMsg-list.html
index f3c70ac..6bfb688 100644
--- a/zq-erp/src/main/resources/templates/views/admin/shop/templateMsg-list.html
+++ b/zq-erp/src/main/resources/templates/views/admin/shop/templateMsg-list.html
@@ -86,6 +86,7 @@
                     <th data-field="name">名称</th>
                     <th data-field="uuid">模板ID</th>
                     <th data-field="dicMap.status">是否启用</th>
+                    <th data-field="dicMap.tempType">模板类型</th>
                     <th data-field="remark">备注</th>
                 </tr>
                 </thead>
diff --git a/zq-erp/src/main/resources/templates/views/admin/sys/admin-form.html b/zq-erp/src/main/resources/templates/views/admin/sys/admin-form.html
index a56d2cb..a797e09 100644
--- a/zq-erp/src/main/resources/templates/views/admin/sys/admin-form.html
+++ b/zq-erp/src/main/resources/templates/views/admin/sys/admin-form.html
@@ -234,7 +234,7 @@
 <script type="text/javascript" th:src="@{/js/systools/MJsBase.js}"></script>
 <script  th:inline="javascript">
 	
-	var invokeUrl=basePath +"/admin/addAdmin";
+	var invokeUrl=basePath +"/admin/addShopAdmin";
 	/*<![CDATA[*/
 	var obj=/*[[${obj}]]*/
 	/*]]>*/
diff --git a/zq-erp/src/main/resources/templates/views/super/sysCompany-form.html b/zq-erp/src/main/resources/templates/views/super/sysCompany-form.html
index 73347ad..0c82ad2 100644
--- a/zq-erp/src/main/resources/templates/views/super/sysCompany-form.html
+++ b/zq-erp/src/main/resources/templates/views/super/sysCompany-form.html
@@ -56,7 +56,7 @@
 			<div class="form-group">
 				<label class="col-sm-2 control-label">联系电话</label>
 				<div class="col-sm-4">
-					<input   type="text" dataType="m" class="form-control"
+					<input   type="text" dataType="*11-11" class="form-control"
 						name="comBossTel" ignore="ignore" th:value="${obj.comBossTel }"
 						 nullmsg="联系电话不能为空">
 					<div class="Validform_checktip"></div>
diff --git a/zq-erp/src/test/java/com/matrix/SourceFlowTests.java b/zq-erp/src/test/java/com/matrix/SourceFlowTests.java
index df6c349..6cc43c8 100644
--- a/zq-erp/src/test/java/com/matrix/SourceFlowTests.java
+++ b/zq-erp/src/test/java/com/matrix/SourceFlowTests.java
@@ -2,14 +2,10 @@
 
 import com.matrix.core.tools.StringUtils;
 import com.matrix.system.constance.Dictionary;
-import com.matrix.system.hive.bean.MoneyCardUse;
-import com.matrix.system.hive.bean.ShoppingGoods;
-import com.matrix.system.hive.bean.SysSourceFlow;
-import com.matrix.system.hive.bean.SysVipInfo;
-import com.matrix.system.hive.dao.MoneyCardUseDao;
-import com.matrix.system.hive.dao.ShoppingGoodsDao;
-import com.matrix.system.hive.dao.SysSourceFlowDao;
-import com.matrix.system.hive.dao.SysVipInfoDao;
+import com.matrix.system.hive.bean.*;
+import com.matrix.system.hive.dao.*;
+import com.matrix.system.hive.service.CodeService;
+import com.matrix.system.hive.service.SysOrderService;
 import org.junit.Test;
 import org.junit.runner.RunWith;
 import org.springframework.beans.factory.annotation.Autowired;
@@ -19,6 +15,7 @@
 import org.springframework.transaction.annotation.Transactional;
 
 import javax.sql.DataSource;
+import java.math.BigDecimal;
 import java.util.List;
 
 /**
@@ -29,7 +26,7 @@
  * @date 2019年2月25日
  */
 @RunWith(SpringRunner.class)
-@SpringBootTest
+@SpringBootTest(classes = {ZqErpApplication.class},webEnvironment =SpringBootTest.WebEnvironment.RANDOM_PORT)
 public class SourceFlowTests {
 
 	@Autowired
@@ -102,5 +99,76 @@
 
 	}
 
+	@Autowired
+	private SysOrderDao sysOrderDao;
+
+	@Autowired
+	private CodeService codeService;
+
+	@Autowired
+	private SysOrderItemDao sysOrderItemDao;
+
+	@Autowired
+	private SysOrderFlowDao sysOrderFlowDao;
+
+	/**
+	 * sysOrderFlowDao.xml insert语句需将createTime和updateTime修改
+	 * SysOrderDao.xml insert语句需将update语句中cashPay加上 or cashPay == 0
+	 *
+	 */
+	@Test
+	public void orderTransfer() {
+		SysOrder query = new SysOrder();
+		query.setStatu("已付款");
+		List<SysOrder> sysOrders = sysOrderDao.selectByModel(query);
+
+		for (SysOrder sysOrder : sysOrders) {
+			sysOrder.setCashPay(sysOrder.getZkTotal());
+			sysOrder.setCardPay(0);
+			sysOrderDao.update(sysOrder);
+
+			List<SysOrderItem> items = sysOrderItemDao.selectByOrderId(sysOrder.getId());
+
+			SysOrderFlow flow = new SysOrderFlow();
+			flow.setFlowNo("F" + sysOrder.getOrderNo().substring(1) + "-" + 1);
+			if (items.size() <= 0) {
+				continue;
+			}
+			Long goodsId = items.get(0).getGoodsId();
+			ShoppingGoods goods = shoppingGoodsDao.selectById(goodsId);
+
+			int j = 1;
+			boolean flag = false;
+			while (goods == null) {
+				if (items.size() <= 1) {
+					flag = true;
+					break;
+				}
+				goodsId = items.get(j).getGoodsId();
+				goods = shoppingGoodsDao.selectById(goodsId);
+				j++;
+				if (j + 1 >= items.size()) {
+					flag = true;
+					break;
+				}
+			}
+
+			if (flag) {
+				continue;
+			}
+
+			flow.setFlowContent(goods.getName().trim() + "等" + items.size() + "件产品");
+			flow.setOrderId(sysOrder.getId());
+			flow.setAmount(BigDecimal.valueOf(sysOrder.getZkTotal()));
+			flow.setVipId(sysOrder.getVipId());
+			flow.setFlowType(SysOrderFlow.FLOW_TYPE_BUY);
+			flow.setPayMethod("现金");
+			flow.setShopId(sysOrder.getShopId());
+			flow.setCreateTime(sysOrder.getOrderTime());
+			flow.setUpdateTime(sysOrder.getOrderTime());
+			flow.setCompanyId(sysOrder.getCompanyId());
+			sysOrderFlowDao.insert(flow);
+		}
+	}
 
 }
diff --git a/zq-xcx/project.config.json b/zq-xcx/project.config.json
index 3188dd3..8b486aa 100644
--- a/zq-xcx/project.config.json
+++ b/zq-xcx/project.config.json
@@ -21,7 +21,7 @@
     "checkSiteMap": true,
     "uploadWithSourceMap": true,
     "compileHotReLoad": false,
-    "useMultiFrameRuntime": false,
+    "useMultiFrameRuntime": true,
     "useApiHook": true,
     "babelSetting": {
       "ignore": [],
@@ -31,6 +31,7 @@
     "useIsolateContext": true,
     "useCompilerModule": true,
     "userConfirmedUseCompilerModuleSwitch": false,
+    "userConfirmedBundleSwitch": false,
     "packNpmManually": false,
     "packNpmRelationList": [],
     "enableEngineNative": false,
@@ -44,17 +45,10 @@
   "simulatorType": "wechat",
   "simulatorPluginLibVersion": {},
   "condition": {
-    "search": {
-      "list": []
-    },
-    "conversation": {
-      "list": []
-    },
     "plugin": {
       "list": []
     },
     "game": {
-      "currentL": -1,
       "list": []
     },
     "gamePlugin": {
@@ -215,6 +209,12 @@
           "pathName": "pages/shalong/shalongDetail",
           "query": "id=6",
           "scene": null
+        },
+        {
+          "name": "pages/yuyue/showYyInfo",
+          "pathName": "pages/yuyue/showYyInfo",
+          "query": "id=3004",
+          "scene": null
         }
       ]
     }

--
Gitblit v1.9.1