wzy
2021-01-24 f7ea5773570beb5ad8c6efb5c1cf743294ee079b
modify
188 files modified
3 files deleted
160 files added
29378 ■■■■ changed files
zq-erp/pom.xml 45 ●●●●● patch | view | raw | blame | history
zq-erp/src/main/java/com/matrix/component/rabbitmq/RabiitMqTemplate.java 1 ●●●● patch | view | raw | blame | history
zq-erp/src/main/java/com/matrix/component/tools/HttpClientUtil.java 55 ●●●●● patch | view | raw | blame | history
zq-erp/src/main/java/com/matrix/component/wechat/externalInterface/common/HttpsRequest2.java 59 ●●●● patch | view | raw | blame | history
zq-erp/src/main/java/com/matrix/component/wechat/externalInterface/common/Signature.java 20 ●●●●● patch | view | raw | blame | history
zq-erp/src/main/java/com/matrix/component/wechat/externalInterface/common/WechatConfigure.java 19 ●●●● patch | view | raw | blame | history
zq-erp/src/main/java/com/matrix/component/wechat/externalInterface/protocol/paramProtocol/BrandWCPayRequestData.java 6 ●●●● patch | view | raw | blame | history
zq-erp/src/main/java/com/matrix/component/wechat/externalInterface/protocol/payComProtocol/JsApiPayComReqData.java 6 ●●●● patch | view | raw | blame | history
zq-erp/src/main/java/com/matrix/component/wechat/externalInterface/protocol/payProtocol/JsApiPayReqData.java 23 ●●●●● patch | view | raw | blame | history
zq-erp/src/main/java/com/matrix/component/wechat/externalInterface/protocol/queryProtocol/JsApiPayReqData.java 295 ●●●●● patch | view | raw | blame | history
zq-erp/src/main/java/com/matrix/component/wechat/externalInterface/protocol/queryProtocol/ScanPayQueryReqData.java 6 ●●●● patch | view | raw | blame | history
zq-erp/src/main/java/com/matrix/component/wechat/externalInterface/protocol/refundProtocol/RefundReqData.java 8 ●●●● patch | view | raw | blame | history
zq-erp/src/main/java/com/matrix/component/wechat/externalInterface/protocol/rsaProtocal/JsApiRSAReqData.java 50 ●●●●● patch | view | raw | blame | history
zq-erp/src/main/java/com/matrix/component/wechat/externalInterface/service/BaseService.java 4 ●●●● patch | view | raw | blame | history
zq-erp/src/main/java/com/matrix/component/wechat/externalInterface/service/JsApiGetPublicKeyService.java 19 ●●●●● patch | view | raw | blame | history
zq-erp/src/main/java/com/matrix/component/wechat/externalInterface/weixinUtil/WeixinServiceUtil.java 62 ●●●● patch | view | raw | blame | history
zq-erp/src/main/java/com/matrix/config/MvcCoreConfig.java 22 ●●●●● patch | view | raw | blame | history
zq-erp/src/main/java/com/matrix/config/RabbitMqConfig.java 8 ●●●● patch | view | raw | blame | history
zq-erp/src/main/java/com/matrix/config/SwaggerConfig.java 57 ●●●●● patch | view | raw | blame | history
zq-erp/src/main/java/com/matrix/core/exception/GlobalExceptionHandler.java 34 ●●●●● patch | view | raw | blame | history
zq-erp/src/main/java/com/matrix/core/pojo/PaginationDto.java 75 ●●●●● patch | view | raw | blame | history
zq-erp/src/main/java/com/matrix/core/pojo/PaginationVO.java 2 ●●● patch | view | raw | blame | history
zq-erp/src/main/java/com/matrix/core/tools/DateUtil.java 135 ●●●● patch | view | raw | blame | history
zq-erp/src/main/java/com/matrix/core/tools/rr/GlueFactory.java 23 ●●●●● patch | view | raw | blame | history
zq-erp/src/main/java/com/matrix/system/app/action/ApiCommonAction.java 220 ●●●●● patch | view | raw | blame | history
zq-erp/src/main/java/com/matrix/system/app/action/ApiFollowupAction.java 180 ●●●●● patch | view | raw | blame | history
zq-erp/src/main/java/com/matrix/system/app/action/ApiKnowledgeAction.java 63 ●●●●● patch | view | raw | blame | history
zq-erp/src/main/java/com/matrix/system/app/action/ApiOrderAction.java 176 ●●●●● patch | view | raw | blame | history
zq-erp/src/main/java/com/matrix/system/app/action/ApiRankingAction.java 89 ●●●●● patch | view | raw | blame | history
zq-erp/src/main/java/com/matrix/system/app/action/ApiServiceOrderAction.java 299 ●●●●● patch | view | raw | blame | history
zq-erp/src/main/java/com/matrix/system/app/action/ApiShopInfoAction.java 43 ●●●●● patch | view | raw | blame | history
zq-erp/src/main/java/com/matrix/system/app/action/ApiSkinCheckAction.java 92 ●●●●● patch | view | raw | blame | history
zq-erp/src/main/java/com/matrix/system/app/action/ApiStatisticsAction.java 313 ●●●●● patch | view | raw | blame | history
zq-erp/src/main/java/com/matrix/system/app/action/ApiStoreAction.java 82 ●●●●● patch | view | raw | blame | history
zq-erp/src/main/java/com/matrix/system/app/action/ApiUsersAction.java 182 ●●●●● patch | view | raw | blame | history
zq-erp/src/main/java/com/matrix/system/app/action/ApiVipInfoAction.java 226 ●●●●● patch | view | raw | blame | history
zq-erp/src/main/java/com/matrix/system/app/action/ApiVipLabelAction.java 82 ●●●●● patch | view | raw | blame | history
zq-erp/src/main/java/com/matrix/system/app/action/AppOccupancyController.java 63 ●●●●● patch | view | raw | blame | history
zq-erp/src/main/java/com/matrix/system/app/action/TestAction.java 24 ●●●●● patch | view | raw | blame | history
zq-erp/src/main/java/com/matrix/system/app/authority/AppAuthorityManager.java 223 ●●●●● patch | view | raw | blame | history
zq-erp/src/main/java/com/matrix/system/app/dto/AddVipDto.java 171 ●●●●● patch | view | raw | blame | history
zq-erp/src/main/java/com/matrix/system/app/dto/ArticleListDto.java 26 ●●●●● patch | view | raw | blame | history
zq-erp/src/main/java/com/matrix/system/app/dto/BasePageDto.java 38 ●●●●● patch | view | raw | blame | history
zq-erp/src/main/java/com/matrix/system/app/dto/BeauticianDto.java 41 ●●●●● patch | view | raw | blame | history
zq-erp/src/main/java/com/matrix/system/app/dto/BusinessesDto.java 45 ●●●●● patch | view | raw | blame | history
zq-erp/src/main/java/com/matrix/system/app/dto/CreateOderItemDto.java 67 ●●●●● patch | view | raw | blame | history
zq-erp/src/main/java/com/matrix/system/app/dto/CreateOrderDto.java 39 ●●●●● patch | view | raw | blame | history
zq-erp/src/main/java/com/matrix/system/app/dto/CreateServiceOrderDto.java 100 ●●●●● patch | view | raw | blame | history
zq-erp/src/main/java/com/matrix/system/app/dto/CreateServiceOrderItemDto.java 41 ●●●●● patch | view | raw | blame | history
zq-erp/src/main/java/com/matrix/system/app/dto/FollowupListDto.java 135 ●●●●● patch | view | raw | blame | history
zq-erp/src/main/java/com/matrix/system/app/dto/IdSubmitDto.java 26 ●●●●● patch | view | raw | blame | history
zq-erp/src/main/java/com/matrix/system/app/dto/LabelDto.java 36 ●●●●● patch | view | raw | blame | history
zq-erp/src/main/java/com/matrix/system/app/dto/LoginDto.java 38 ●●●●● patch | view | raw | blame | history
zq-erp/src/main/java/com/matrix/system/app/dto/ModifyUserDto.java 116 ●●●●● patch | view | raw | blame | history
zq-erp/src/main/java/com/matrix/system/app/dto/ModifyVipDto.java 183 ●●●●● patch | view | raw | blame | history
zq-erp/src/main/java/com/matrix/system/app/dto/OrderListDto.java 84 ●●●●● patch | view | raw | blame | history
zq-erp/src/main/java/com/matrix/system/app/dto/PwdModifyDto.java 38 ●●●●● patch | view | raw | blame | history
zq-erp/src/main/java/com/matrix/system/app/dto/PwdResetDto.java 51 ●●●●● patch | view | raw | blame | history
zq-erp/src/main/java/com/matrix/system/app/dto/QuestionAnswerDto.java 38 ●●●●● patch | view | raw | blame | history
zq-erp/src/main/java/com/matrix/system/app/dto/QuestionAnswerItemDto.java 56 ●●●●● patch | view | raw | blame | history
zq-erp/src/main/java/com/matrix/system/app/dto/RankingDto.java 43 ●●●●● patch | view | raw | blame | history
zq-erp/src/main/java/com/matrix/system/app/dto/ServiceOrderListDto.java 94 ●●●●● patch | view | raw | blame | history
zq-erp/src/main/java/com/matrix/system/app/dto/ServiceVipProjDto.java 48 ●●●●● patch | view | raw | blame | history
zq-erp/src/main/java/com/matrix/system/app/dto/ShoppingGoodsListDto.java 82 ●●●●● patch | view | raw | blame | history
zq-erp/src/main/java/com/matrix/system/app/dto/SkinCheckListDto.java 22 ●●●●● patch | view | raw | blame | history
zq-erp/src/main/java/com/matrix/system/app/dto/SmsCodeDto.java 26 ●●●●● patch | view | raw | blame | history
zq-erp/src/main/java/com/matrix/system/app/dto/StoreInOutListDto.java 54 ●●●●● patch | view | raw | blame | history
zq-erp/src/main/java/com/matrix/system/app/dto/StoreListDto.java 23 ●●●●● patch | view | raw | blame | history
zq-erp/src/main/java/com/matrix/system/app/dto/UploadPhotoDto.java 26 ●●●●● patch | view | raw | blame | history
zq-erp/src/main/java/com/matrix/system/app/dto/UsersQueryDto.java 23 ●●●●● patch | view | raw | blame | history
zq-erp/src/main/java/com/matrix/system/app/dto/VipInfoListDto.java 122 ●●●●● patch | view | raw | blame | history
zq-erp/src/main/java/com/matrix/system/app/dto/VipStatisticsParamDto.java 100 ●●●●● patch | view | raw | blame | history
zq-erp/src/main/java/com/matrix/system/app/mapper/MoneyCardUseMapper.java 21 ●●●●● patch | view | raw | blame | history
zq-erp/src/main/java/com/matrix/system/app/mapper/QuestionMapper.java 31 ●●●●● patch | view | raw | blame | history
zq-erp/src/main/java/com/matrix/system/app/mapper/SysBeauticianStateMapper.java 34 ●●●●● patch | view | raw | blame | history
zq-erp/src/main/java/com/matrix/system/app/mapper/SysProjServiceMapper.java 22 ●●●●● patch | view | raw | blame | history
zq-erp/src/main/java/com/matrix/system/app/mapper/SysProjUseMapper.java 37 ●●●●● patch | view | raw | blame | history
zq-erp/src/main/java/com/matrix/system/app/mapper/SysSkinCheckRecordMapper.java 38 ●●●●● patch | view | raw | blame | history
zq-erp/src/main/java/com/matrix/system/app/mapper/SysStoreInfoMapper.java 33 ●●●●● patch | view | raw | blame | history
zq-erp/src/main/java/com/matrix/system/app/mapper/SysUsersMapper.java 53 ●●●●● patch | view | raw | blame | history
zq-erp/src/main/java/com/matrix/system/app/mapper/SysWorkBeatuistaffMapper.java 25 ●●●●● patch | view | raw | blame | history
zq-erp/src/main/java/com/matrix/system/app/vo/BeauticianVo.java 61 ●●●●● patch | view | raw | blame | history
zq-erp/src/main/java/com/matrix/system/app/vo/BusinessesDataShowVo.java 300 ●●●●● patch | view | raw | blame | history
zq-erp/src/main/java/com/matrix/system/app/vo/OrderDetailAchieveItemVo.java 36 ●●●●● patch | view | raw | blame | history
zq-erp/src/main/java/com/matrix/system/app/vo/OrderDetailItemVo.java 125 ●●●●● patch | view | raw | blame | history
zq-erp/src/main/java/com/matrix/system/app/vo/OrderDetailVo.java 184 ●●●●● patch | view | raw | blame | history
zq-erp/src/main/java/com/matrix/system/app/vo/QuestionVo.java 88 ●●●●● patch | view | raw | blame | history
zq-erp/src/main/java/com/matrix/system/app/vo/RankingVo.java 69 ●●●●● patch | view | raw | blame | history
zq-erp/src/main/java/com/matrix/system/app/vo/ServiceOrderDetailItemVo.java 107 ●●●●● patch | view | raw | blame | history
zq-erp/src/main/java/com/matrix/system/app/vo/ServiceOrderDetailVo.java 140 ●●●●● patch | view | raw | blame | history
zq-erp/src/main/java/com/matrix/system/app/vo/ServiceOrderListProjVo.java 47 ●●●●● patch | view | raw | blame | history
zq-erp/src/main/java/com/matrix/system/app/vo/ServiceOrderListVo.java 170 ●●●●● patch | view | raw | blame | history
zq-erp/src/main/java/com/matrix/system/app/vo/ServiceProductListVo.java 58 ●●●●● patch | view | raw | blame | history
zq-erp/src/main/java/com/matrix/system/app/vo/ServiceProjVo.java 115 ●●●●● patch | view | raw | blame | history
zq-erp/src/main/java/com/matrix/system/app/vo/ServiceTcVo.java 126 ●●●●● patch | view | raw | blame | history
zq-erp/src/main/java/com/matrix/system/app/vo/ShoppingGoodsDetailVo.java 225 ●●●●● patch | view | raw | blame | history
zq-erp/src/main/java/com/matrix/system/app/vo/ShoppingGoodsListVo.java 118 ●●●●● patch | view | raw | blame | history
zq-erp/src/main/java/com/matrix/system/app/vo/SkinCheckAnalysisItems.java 77 ●●●●● patch | view | raw | blame | history
zq-erp/src/main/java/com/matrix/system/app/vo/SkinCheckDetailVo.java 80 ●●●●● patch | view | raw | blame | history
zq-erp/src/main/java/com/matrix/system/app/vo/SkinCheckDiagnoseItemVo.java 31 ●●●●● patch | view | raw | blame | history
zq-erp/src/main/java/com/matrix/system/app/vo/SkinCheckListVo.java 69 ●●●●● patch | view | raw | blame | history
zq-erp/src/main/java/com/matrix/system/app/vo/StoreInOutListVo.java 62 ●●●●● patch | view | raw | blame | history
zq-erp/src/main/java/com/matrix/system/app/vo/StoreListVo.java 67 ●●●●● patch | view | raw | blame | history
zq-erp/src/main/java/com/matrix/system/app/vo/UserAchieveVo.java 91 ●●●●● patch | view | raw | blame | history
zq-erp/src/main/java/com/matrix/system/app/vo/UserInfoDetailVo.java 116 ●●●●● patch | view | raw | blame | history
zq-erp/src/main/java/com/matrix/system/app/vo/UserInfoVo.java 67 ●●●●● patch | view | raw | blame | history
zq-erp/src/main/java/com/matrix/system/app/vo/VipAchieveDataShowVo.java 147 ●●●●● patch | view | raw | blame | history
zq-erp/src/main/java/com/matrix/system/app/vo/VipCardListVo.java 78 ●●●●● patch | view | raw | blame | history
zq-erp/src/main/java/com/matrix/system/app/vo/VipInfoDetailVo.java 195 ●●●●● patch | view | raw | blame | history
zq-erp/src/main/java/com/matrix/system/app/vo/VipInfoListVo.java 90 ●●●●● patch | view | raw | blame | history
zq-erp/src/main/java/com/matrix/system/app/vo/VipInfoVo.java 125 ●●●●● patch | view | raw | blame | history
zq-erp/src/main/java/com/matrix/system/common/actions/AdminAction.java 25 ●●●●● patch | view | raw | blame | history
zq-erp/src/main/java/com/matrix/system/common/constance/AppConstance.java 44 ●●●●● patch | view | raw | blame | history
zq-erp/src/main/java/com/matrix/system/common/dao/SysUsersDao.java 2 ●●●●● patch | view | raw | blame | history
zq-erp/src/main/java/com/matrix/system/common/interceptor/ApiUserLoginInterceptor.java 129 ●●●●● patch | view | raw | blame | history
zq-erp/src/main/java/com/matrix/system/common/service/SysUsersService.java 2 ●●●●● patch | view | raw | blame | history
zq-erp/src/main/java/com/matrix/system/common/service/impl/SysUsersServiceImpl.java 5 ●●●●● patch | view | raw | blame | history
zq-erp/src/main/java/com/matrix/system/constance/Dictionary.java 9 ●●●●● patch | view | raw | blame | history
zq-erp/src/main/java/com/matrix/system/hive/action/ArticleTypeController.java 17 ●●●●● patch | view | raw | blame | history
zq-erp/src/main/java/com/matrix/system/hive/action/CardLevelController.java 1 ●●●● patch | view | raw | blame | history
zq-erp/src/main/java/com/matrix/system/hive/action/MoneyCardUseController.java 32 ●●●●● patch | view | raw | blame | history
zq-erp/src/main/java/com/matrix/system/hive/action/OccupancyController.java 21 ●●●● patch | view | raw | blame | history
zq-erp/src/main/java/com/matrix/system/hive/action/OrderController.java 131 ●●●● patch | view | raw | blame | history
zq-erp/src/main/java/com/matrix/system/hive/action/ProjServiceController.java 1 ●●●● patch | view | raw | blame | history
zq-erp/src/main/java/com/matrix/system/hive/action/ProjUseController.java 58 ●●●● patch | view | raw | blame | history
zq-erp/src/main/java/com/matrix/system/hive/action/ShopInfoController.java 11 ●●●●● patch | view | raw | blame | history
zq-erp/src/main/java/com/matrix/system/hive/action/ShoppingGoodsCategoryController.java 13 ●●●●● patch | view | raw | blame | history
zq-erp/src/main/java/com/matrix/system/hive/action/SupplierInfoController.java 10 ●●●● patch | view | raw | blame | history
zq-erp/src/main/java/com/matrix/system/hive/action/SysVipLabelController.java 60 ●●●●● patch | view | raw | blame | history
zq-erp/src/main/java/com/matrix/system/hive/action/TaocanController.java 42 ●●●●● patch | view | raw | blame | history
zq-erp/src/main/java/com/matrix/system/hive/action/VipInfoController.java 9 ●●●●● patch | view | raw | blame | history
zq-erp/src/main/java/com/matrix/system/hive/bean/AchieveNew.java 56 ●●●●● patch | view | raw | blame | history
zq-erp/src/main/java/com/matrix/system/hive/bean/AppVersion.java 71 ●●●●● patch | view | raw | blame | history
zq-erp/src/main/java/com/matrix/system/hive/bean/Article.java 4 ●●●● patch | view | raw | blame | history
zq-erp/src/main/java/com/matrix/system/hive/bean/ArticleType.java 21 ●●●●● patch | view | raw | blame | history
zq-erp/src/main/java/com/matrix/system/hive/bean/MoneyCardUse.java 2 ●●●●● patch | view | raw | blame | history
zq-erp/src/main/java/com/matrix/system/hive/bean/ShoppingGoods.java 128 ●●●●● patch | view | raw | blame | history
zq-erp/src/main/java/com/matrix/system/hive/bean/ShoppingGoodsCategory2.java 112 ●●●●● patch | view | raw | blame | history
zq-erp/src/main/java/com/matrix/system/hive/bean/SysFollowup.java 286 ●●●●● patch | view | raw | blame | history
zq-erp/src/main/java/com/matrix/system/hive/bean/SysFollowupComment.java 90 ●●●●● patch | view | raw | blame | history
zq-erp/src/main/java/com/matrix/system/hive/bean/SysInstoreInfo.java 1 ●●●● patch | view | raw | blame | history
zq-erp/src/main/java/com/matrix/system/hive/bean/SysOrder.java 56 ●●●●● patch | view | raw | blame | history
zq-erp/src/main/java/com/matrix/system/hive/bean/SysOrderFlow.java 200 ●●●●● patch | view | raw | blame | history
zq-erp/src/main/java/com/matrix/system/hive/bean/SysOrderItem.java 40 ●●●●● patch | view | raw | blame | history
zq-erp/src/main/java/com/matrix/system/hive/bean/SysProjServices.java 30 ●●●●● patch | view | raw | blame | history
zq-erp/src/main/java/com/matrix/system/hive/bean/SysProjUse.java 73 ●●●●● patch | view | raw | blame | history
zq-erp/src/main/java/com/matrix/system/hive/bean/SysProjUseFlow.java 200 ●●●●● patch | view | raw | blame | history
zq-erp/src/main/java/com/matrix/system/hive/bean/SysSkinCheckRecord.java 38 ●●●●● patch | view | raw | blame | history
zq-erp/src/main/java/com/matrix/system/hive/bean/SysStoreInfo.java 11 ●●●●● patch | view | raw | blame | history
zq-erp/src/main/java/com/matrix/system/hive/bean/SysVipAlbum.java 96 ●●●●● patch | view | raw | blame | history
zq-erp/src/main/java/com/matrix/system/hive/bean/SysVipInfo.java 87 ●●●●● patch | view | raw | blame | history
zq-erp/src/main/java/com/matrix/system/hive/bean/SysVipLabel.java 112 ●●●●● patch | view | raw | blame | history
zq-erp/src/main/java/com/matrix/system/hive/bean/SysVipLabelRelate.java 41 ●●●●● patch | view | raw | blame | history
zq-erp/src/main/java/com/matrix/system/hive/bean/SysVipLevel.java 8 ●●●●● patch | view | raw | blame | history
zq-erp/src/main/java/com/matrix/system/hive/dao/AchieveNewDao.java 23 ●●●●● patch | view | raw | blame | history
zq-erp/src/main/java/com/matrix/system/hive/dao/ArticleDao.java 4 ●●● patch | view | raw | blame | history
zq-erp/src/main/java/com/matrix/system/hive/dao/MoneyCardAssembleDao.java 6 ●●●●● patch | view | raw | blame | history
zq-erp/src/main/java/com/matrix/system/hive/dao/MoneyCardUseDao.java 1 ●●●● patch | view | raw | blame | history
zq-erp/src/main/java/com/matrix/system/hive/dao/ShoppingGoodsAssembleDao.java 3 ●●●●● patch | view | raw | blame | history
zq-erp/src/main/java/com/matrix/system/hive/dao/ShoppingGoodsCategoryDao.java 2 ●●●●● patch | view | raw | blame | history
zq-erp/src/main/java/com/matrix/system/hive/dao/ShoppingGoodsDao.java 6 ●●●●● patch | view | raw | blame | history
zq-erp/src/main/java/com/matrix/system/hive/dao/SysBeauticianStateDao.java 4 ●●●● patch | view | raw | blame | history
zq-erp/src/main/java/com/matrix/system/hive/dao/SysBusinessDataDao.java 12 ●●●●● patch | view | raw | blame | history
zq-erp/src/main/java/com/matrix/system/hive/dao/SysFollowupCommentDao.java 42 ●●●●● patch | view | raw | blame | history
zq-erp/src/main/java/com/matrix/system/hive/dao/SysFollowupDao.java 44 ●●●●● patch | view | raw | blame | history
zq-erp/src/main/java/com/matrix/system/hive/dao/SysOrderDao.java 22 ●●●●● patch | view | raw | blame | history
zq-erp/src/main/java/com/matrix/system/hive/dao/SysOrderFlowDao.java 15 ●●●●● patch | view | raw | blame | history
zq-erp/src/main/java/com/matrix/system/hive/dao/SysOrderItemDao.java 6 ●●●●● patch | view | raw | blame | history
zq-erp/src/main/java/com/matrix/system/hive/dao/SysProjServicesDao.java 25 ●●●●● patch | view | raw | blame | history
zq-erp/src/main/java/com/matrix/system/hive/dao/SysProjUseDao.java 12 ●●●●● patch | view | raw | blame | history
zq-erp/src/main/java/com/matrix/system/hive/dao/SysVipAlbumDao.java 42 ●●●●● patch | view | raw | blame | history
zq-erp/src/main/java/com/matrix/system/hive/dao/SysVipInfoDao.java 6 ●●●●● patch | view | raw | blame | history
zq-erp/src/main/java/com/matrix/system/hive/dao/SysVipLabelDao.java 24 ●●●●● patch | view | raw | blame | history
zq-erp/src/main/java/com/matrix/system/hive/plugin/util/ImageUtil.java 86 ●●●●● patch | view | raw | blame | history
zq-erp/src/main/java/com/matrix/system/hive/pojo/CzXkVo.java 14 ●●●● patch | view | raw | blame | history
zq-erp/src/main/java/com/matrix/system/hive/pojo/ShoppingCarItemsVo.java 12 ●●●● patch | view | raw | blame | history
zq-erp/src/main/java/com/matrix/system/hive/pojo/StoreInOutRecordVO.java 9 ●●●●● patch | view | raw | blame | history
zq-erp/src/main/java/com/matrix/system/hive/service/AchieveNewService.java 8 ●●●●● patch | view | raw | blame | history
zq-erp/src/main/java/com/matrix/system/hive/service/ArticleService.java 1 ●●●● patch | view | raw | blame | history
zq-erp/src/main/java/com/matrix/system/hive/service/CodeService.java 2 ●●●●● patch | view | raw | blame | history
zq-erp/src/main/java/com/matrix/system/hive/service/ShoppingGoodsCategoryService.java 2 ●●● patch | view | raw | blame | history
zq-erp/src/main/java/com/matrix/system/hive/service/ShoppingGoodsService.java 12 ●●●●● patch | view | raw | blame | history
zq-erp/src/main/java/com/matrix/system/hive/service/SysBeauticianStateService.java 2 ●●● patch | view | raw | blame | history
zq-erp/src/main/java/com/matrix/system/hive/service/SysOrderFlowService.java 17 ●●●●● patch | view | raw | blame | history
zq-erp/src/main/java/com/matrix/system/hive/service/SysOrderItemService.java 5 ●●●●● patch | view | raw | blame | history
zq-erp/src/main/java/com/matrix/system/hive/service/SysOrderService.java 16 ●●●●● patch | view | raw | blame | history
zq-erp/src/main/java/com/matrix/system/hive/service/SysProjServicesService.java 7 ●●●●● patch | view | raw | blame | history
zq-erp/src/main/java/com/matrix/system/hive/service/SysVipInfoService.java 17 ●●●●● patch | view | raw | blame | history
zq-erp/src/main/java/com/matrix/system/hive/service/imp/AchieveNewServiceImpl.java 94 ●●●●● patch | view | raw | blame | history
zq-erp/src/main/java/com/matrix/system/hive/service/imp/ArticleServiceImpl.java 7 ●●●●● patch | view | raw | blame | history
zq-erp/src/main/java/com/matrix/system/hive/service/imp/CodeServiceImpl.java 6 ●●●● patch | view | raw | blame | history
zq-erp/src/main/java/com/matrix/system/hive/service/imp/DataAnalysisCustomerServiceImpl.java 192 ●●●●● patch | view | raw | blame | history
zq-erp/src/main/java/com/matrix/system/hive/service/imp/ShoppingGoodsCategoryServiceImpl.java 7 ●●●● patch | view | raw | blame | history
zq-erp/src/main/java/com/matrix/system/hive/service/imp/ShoppingGoodsServiceImpl.java 161 ●●●●● patch | view | raw | blame | history
zq-erp/src/main/java/com/matrix/system/hive/service/imp/SysBeauticianStateServiceImpl.java 8 ●●●●● patch | view | raw | blame | history
zq-erp/src/main/java/com/matrix/system/hive/service/imp/SysInstoreInfoServiceImpl.java 3 ●●●● patch | view | raw | blame | history
zq-erp/src/main/java/com/matrix/system/hive/service/imp/SysOrderFlowServiceImpl.java 71 ●●●●● patch | view | raw | blame | history
zq-erp/src/main/java/com/matrix/system/hive/service/imp/SysOrderItemServiceImpl.java 4 ●●●● patch | view | raw | blame | history
zq-erp/src/main/java/com/matrix/system/hive/service/imp/SysOrderServiceImpl.java 664 ●●●●● patch | view | raw | blame | history
zq-erp/src/main/java/com/matrix/system/hive/service/imp/SysProjServicesServiceImpl.java 148 ●●●● patch | view | raw | blame | history
zq-erp/src/main/java/com/matrix/system/hive/service/imp/SysProjUseServiceImpl.java 36 ●●●● patch | view | raw | blame | history
zq-erp/src/main/java/com/matrix/system/hive/service/imp/SysVipInfoServiceImpl.java 187 ●●●●● patch | view | raw | blame | history
zq-erp/src/main/java/com/matrix/system/hive/statistics/AchieveAction.java 44 ●●●●● patch | view | raw | blame | history
zq-erp/src/main/java/com/matrix/system/hive/statistics/DailySaleVo.java 412 ●●●●● patch | view | raw | blame | history
zq-erp/src/main/java/com/matrix/system/hive/statistics/SysBusinessDataAction.java 57 ●●●●● patch | view | raw | blame | history
zq-erp/src/main/java/com/matrix/system/hive/statistics/VipStatisticsAction.java 43 ●●●●● patch | view | raw | blame | history
zq-erp/src/main/java/com/matrix/system/hiveErp/action/DataAnalysisCustomer.java 73 ●●●● patch | view | raw | blame | history
zq-erp/src/main/java/com/matrix/system/hiveErp/analysUtil/Caculate.java 4 ●●●● patch | view | raw | blame | history
zq-erp/src/main/java/com/matrix/system/hiveErp/analysUtil/StatisticsParamVo.java 35 ●●●●● patch | view | raw | blame | history
zq-erp/src/main/java/com/matrix/system/hiveErp/dao/TjVipSumDao.java 90 ●●●●● patch | view | raw | blame | history
zq-erp/src/main/java/com/matrix/system/job/InvalidTimeJob.java 48 ●●●●● patch | view | raw | blame | history
zq-erp/src/main/java/com/matrix/system/shopXcx/action/ShopRefundRecordAction.java 8 ●●●●● patch | view | raw | blame | history
zq-erp/src/main/java/com/matrix/system/shopXcx/action/ShopWxtemplateMsgAction.java 18 ●●●● patch | view | raw | blame | history
zq-erp/src/main/java/com/matrix/system/shopXcx/api/WeChatGzhApiTools.java 134 ●●●●● patch | view | raw | blame | history
zq-erp/src/main/java/com/matrix/system/shopXcx/api/action/WXShopOrderAction.java 1 ●●●● patch | view | raw | blame | history
zq-erp/src/main/java/com/matrix/system/shopXcx/api/action/WxCommonAction.java 13 ●●●● patch | view | raw | blame | history
zq-erp/src/main/java/com/matrix/system/shopXcx/api/action/WxErpOrderAction.java 139 ●●●●● patch | view | raw | blame | history
zq-erp/src/main/java/com/matrix/system/shopXcx/api/action/WxShopProduct.java 3 ●●●●● patch | view | raw | blame | history
zq-erp/src/main/java/com/matrix/system/shopXcx/api/action/YuyueAction.java 304 ●●●● patch | view | raw | blame | history
zq-erp/src/main/java/com/matrix/system/shopXcx/api/dto/ErpOrderListDto.java 78 ●●●●● patch | view | raw | blame | history
zq-erp/src/main/java/com/matrix/system/shopXcx/api/dto/ErpServiceCommentDto.java 41 ●●●●● patch | view | raw | blame | history
zq-erp/src/main/java/com/matrix/system/shopXcx/api/dto/ErpServiceOrderListDto.java 50 ●●●●● patch | view | raw | blame | history
zq-erp/src/main/java/com/matrix/system/shopXcx/api/service/impl/WxShopRefundRecordServiceImpl.java 5 ●●●●● patch | view | raw | blame | history
zq-erp/src/main/java/com/matrix/system/shopXcx/api/vo/ErpOrderDetailFlowVo.java 37 ●●●●● patch | view | raw | blame | history
zq-erp/src/main/java/com/matrix/system/shopXcx/api/vo/ErpOrderDetailItemVo.java 63 ●●●●● patch | view | raw | blame | history
zq-erp/src/main/java/com/matrix/system/shopXcx/api/vo/ErpOrderDetailVo.java 158 ●●●●● patch | view | raw | blame | history
zq-erp/src/main/java/com/matrix/system/shopXcx/api/vo/ErpServiceOrderListProjVo.java 45 ●●●●● patch | view | raw | blame | history
zq-erp/src/main/java/com/matrix/system/shopXcx/api/vo/ErpServiceOrderListVo.java 147 ●●●●● patch | view | raw | blame | history
zq-erp/src/main/java/com/matrix/system/shopXcx/bean/ShopWxtemplateMsg.java 89 ●●●● patch | view | raw | blame | history
zq-erp/src/main/java/com/matrix/system/shopXcx/dao/ShopProductDao.java 2 ●●●●● patch | view | raw | blame | history
zq-erp/src/main/java/com/matrix/system/shopXcx/dao/ShopWxtemplateMsgDao.java 2 ●●● patch | view | raw | blame | history
zq-erp/src/main/java/com/matrix/system/shopXcx/mqTask/MQTaskRouting.java 6 ●●●●● patch | view | raw | blame | history
zq-erp/src/main/java/com/matrix/system/shopXcx/mqTask/OrderTask.java 42 ●●●● patch | view | raw | blame | history
zq-erp/src/main/java/com/matrix/system/shopXcx/mqTask/VipCreateTask.java 13 ●●●●● patch | view | raw | blame | history
zq-erp/src/main/java/com/matrix/system/shopXcx/mqTask/templateMsg/AppointmentSuccess.java 2 ●●● patch | view | raw | blame | history
zq-erp/src/main/java/com/matrix/system/wechart/templateMsg/GzhTemplateMessagePojo.java 134 ●●●●● patch | view | raw | blame | history
zq-erp/src/main/java/com/matrix/system/wechart/templateMsg/Task/TemplateMessageBulder.java 19 ●●●●● patch | view | raw | blame | history
zq-erp/src/main/java/com/matrix/system/wechart/templateMsg/Task/UniformMsgSentTask.java 120 ●●●●● patch | view | raw | blame | history
zq-erp/src/main/java/com/matrix/system/wechart/templateMsg/Task/messageBulderDemo/DefaultTemplateMessageBulder.java 99 ●●●●● patch | view | raw | blame | history
zq-erp/src/main/java/com/matrix/system/wechart/templateMsg/Task/messageBulderDemo/FwwcTemplateMessageBulder.java 109 ●●●●● patch | view | raw | blame | history
zq-erp/src/main/java/com/matrix/system/wechart/templateMsg/Task/messageBulderDemo/GmcgTemplateMessageBulder.java 106 ●●●●● patch | view | raw | blame | history
zq-erp/src/main/java/com/matrix/system/wechart/templateMsg/Task/messageBulderDemo/YycgTemplateMessageBulder.java 115 ●●●●● patch | view | raw | blame | history
zq-erp/src/main/java/com/matrix/system/wechart/templateMsg/UniformMsgParam.java 49 ●●●●● patch | view | raw | blame | history
zq-erp/src/main/java/com/matrix/system/wechart/templateMsg/UniformMsgPojo.java 32 ●●●●● patch | view | raw | blame | history
zq-erp/src/main/java/com/matrix/system/wechart/templateMsg/demo/MsgDemo.java 78 ●●●●● patch | view | raw | blame | history
zq-erp/src/main/java/com/matrix/system/wechart/templateMsg/demo/MsgDemo2.java 71 ●●●●● patch | view | raw | blame | history
zq-erp/src/main/java/com/matrix/system/wechart/templateMsg/demo/MsgDemo3.java 35 ●●●●● patch | view | raw | blame | history
zq-erp/src/main/resources/config/application.properties 8 ●●●● patch | view | raw | blame | history
zq-erp/src/main/resources/config/db/increment/20210109.sql 5 ●●●●● patch | view | raw | blame | history
zq-erp/src/main/resources/config/dev/system.properties 6 ●●●●● patch | view | raw | blame | history
zq-erp/src/main/resources/config/lhx/application.properties 2 ●●● patch | view | raw | blame | history
zq-erp/src/main/resources/config/lhx/system.properties 3 ●●●●● patch | view | raw | blame | history
zq-erp/src/main/resources/config/system.properties 14 ●●●● patch | view | raw | blame | history
zq-erp/src/main/resources/config/test/application.properties 21 ●●●● patch | view | raw | blame | history
zq-erp/src/main/resources/config/test/system.properties 134 ●●●●● patch | view | raw | blame | history
zq-erp/src/main/resources/config/xcx/application.properties 40 ●●●●● patch | view | raw | blame | history
zq-erp/src/main/resources/config/xcx/system.properties 47 ●●●● patch | view | raw | blame | history
zq-erp/src/main/resources/mybatis/mapper/common/SysUsersDao.xml 6 ●●●●● patch | view | raw | blame | history
zq-erp/src/main/resources/mybatis/mapper/hive/AchieveNewDao.xml 266 ●●●●● patch | view | raw | blame | history
zq-erp/src/main/resources/mybatis/mapper/hive/ArticleDao.xml 13 ●●●●● patch | view | raw | blame | history
zq-erp/src/main/resources/mybatis/mapper/hive/ArticleTypeDao.xml 20 ●●●● patch | view | raw | blame | history
zq-erp/src/main/resources/mybatis/mapper/hive/MoneyCardAssembleDao.xml 20 ●●●●● patch | view | raw | blame | history
zq-erp/src/main/resources/mybatis/mapper/hive/MoneyCardUseDao.xml 10 ●●●● patch | view | raw | blame | history
zq-erp/src/main/resources/mybatis/mapper/hive/MoneyCardUseFlowDao.xml 2 ●●● patch | view | raw | blame | history
zq-erp/src/main/resources/mybatis/mapper/hive/ShoppingGoodsAssembleDao.xml 13 ●●●●● patch | view | raw | blame | history
zq-erp/src/main/resources/mybatis/mapper/hive/ShoppingGoodsCategoryDao.xml 16 ●●●●● patch | view | raw | blame | history
zq-erp/src/main/resources/mybatis/mapper/hive/ShoppingGoodsDao.xml 119 ●●●● patch | view | raw | blame | history
zq-erp/src/main/resources/mybatis/mapper/hive/SysBeauticianStateDao.xml 24 ●●●● patch | view | raw | blame | history
zq-erp/src/main/resources/mybatis/mapper/hive/SysBusinessDataDao.xml 408 ●●●●● patch | view | raw | blame | history
zq-erp/src/main/resources/mybatis/mapper/hive/SysFollowupCommentDao.xml 228 ●●●●● patch | view | raw | blame | history
zq-erp/src/main/resources/mybatis/mapper/hive/SysFollowupDao.xml 405 ●●●●● patch | view | raw | blame | history
zq-erp/src/main/resources/mybatis/mapper/hive/SysOrderDao.xml 205 ●●●●● patch | view | raw | blame | history
zq-erp/src/main/resources/mybatis/mapper/hive/SysOrderFlowDao.xml 78 ●●●●● patch | view | raw | blame | history
zq-erp/src/main/resources/mybatis/mapper/hive/SysOrderItemDao.xml 37 ●●●● patch | view | raw | blame | history
zq-erp/src/main/resources/mybatis/mapper/hive/SysProjServicesDao.xml 213 ●●●●● patch | view | raw | blame | history
zq-erp/src/main/resources/mybatis/mapper/hive/SysProjUseDao.xml 147 ●●●●● patch | view | raw | blame | history
zq-erp/src/main/resources/mybatis/mapper/hive/SysSkinCheckRecordDao.xml 15 ●●●● patch | view | raw | blame | history
zq-erp/src/main/resources/mybatis/mapper/hive/SysStoreInfoDao.xml 16 ●●●●● patch | view | raw | blame | history
zq-erp/src/main/resources/mybatis/mapper/hive/SysVipAlbumDao.xml 241 ●●●●● patch | view | raw | blame | history
zq-erp/src/main/resources/mybatis/mapper/hive/SysVipInfoDao.xml 157 ●●●●● patch | view | raw | blame | history
zq-erp/src/main/resources/mybatis/mapper/hive/SysVipLabelDao.xml 103 ●●●●● patch | view | raw | blame | history
zq-erp/src/main/resources/mybatis/mapper/hive/SysVipLevelDao.xml 16 ●●●● patch | view | raw | blame | history
zq-erp/src/main/resources/mybatis/mapper/hive/SysWorkBeatuistaffDao.xml 28 ●●●●● patch | view | raw | blame | history
zq-erp/src/main/resources/mybatis/mapper/hive/TjVipSumDao.xml 641 ●●●●● patch | view | raw | blame | history
zq-erp/src/main/resources/mybatis/mapper/xcxShop/ShopProductDao.xml 10 ●●●●● patch | view | raw | blame | history
zq-erp/src/main/resources/mybatis/mapper/xcxShop/ShopWxtemplateMsgDao.xml 45 ●●●● patch | view | raw | blame | history
zq-erp/src/main/resources/mybatis/mybatis-config.xml 1 ●●●● patch | view | raw | blame | history
zq-erp/src/main/resources/static/images/pay/card.png patch | view | raw | blame | history
zq-erp/src/main/resources/static/images/pay/cash.png patch | view | raw | blame | history
zq-erp/src/main/resources/static/images/pay/qian.png patch | view | raw | blame | history
zq-erp/src/main/resources/static/images/pay/tuan.png patch | view | raw | blame | history
zq-erp/src/main/resources/static/images/pay/wechat.png patch | view | raw | blame | history
zq-erp/src/main/resources/static/images/pay/yinlian.png patch | view | raw | blame | history
zq-erp/src/main/resources/static/images/pay/zhifubao.png patch | view | raw | blame | history
zq-erp/src/main/resources/static/js/plugin/moment.mini.js 2 ●●●●● patch | view | raw | blame | history
zq-erp/src/main/resources/templates/views/admin/hive-erp/order/orderXq-form.html 1081 ●●●● patch | view | raw | blame | history
zq-erp/src/main/resources/templates/views/admin/hive-erp/order/projService-list.html 2 ●●● patch | view | raw | blame | history
zq-erp/src/main/resources/templates/views/admin/hive-erp/order/serviceOrderDetail.html 479 ●●●●● patch | view | raw | blame | history
zq-erp/src/main/resources/templates/views/admin/hive-erp/statistics/custom-consume-list.html 155 ●●●●● patch | view | raw | blame | history
zq-erp/src/main/resources/templates/views/admin/hive-erp/statistics/daily-sale-list.html 157 ●●●●● patch | view | raw | blame | history
zq-erp/src/main/resources/templates/views/admin/hive-erp/statistics/statistics-moneyCar-item.html 2 ●●● patch | view | raw | blame | history
zq-erp/src/main/resources/templates/views/admin/hive-erp/statistics/statistics-moneyCar-summary.html 35 ●●●● patch | view | raw | blame | history
zq-erp/src/main/resources/templates/views/admin/hive-erp/statistics/statistics-projSercice-item.html 17 ●●●● patch | view | raw | blame | history
zq-erp/src/main/resources/templates/views/admin/hive-erp/statistics/statistics-projSercice-sumary.html 19 ●●●● patch | view | raw | blame | history
zq-erp/src/main/resources/templates/views/admin/hive-erp/statistics/statistics-projuse-item.html 17 ●●●● patch | view | raw | blame | history
zq-erp/src/main/resources/templates/views/admin/hive-erp/statistics/statistics-projuse-sumary.html 17 ●●●● patch | view | raw | blame | history
zq-erp/src/main/resources/templates/views/admin/hive-erp/store/store-list.html 2 ●●● patch | view | raw | blame | history
zq-erp/src/main/resources/templates/views/admin/hive-erp/vip/vipInfo-list.html 2 ●●● patch | view | raw | blame | history
zq-erp/src/main/resources/templates/views/admin/hive/beautySalon/bj-form-bak.html 348 ●●●●● patch | view | raw | blame | history
zq-erp/src/main/resources/templates/views/admin/hive/beautySalon/bj-form.html 678 ●●●● patch | view | raw | blame | history
zq-erp/src/main/resources/templates/views/admin/hive/beautySalon/cz-form-bak.html 239 ●●●●● patch | view | raw | blame | history
zq-erp/src/main/resources/templates/views/admin/hive/beautySalon/cz-form.html 561 ●●●●● patch | view | raw | blame | history
zq-erp/src/main/resources/templates/views/admin/hive/beautySalon/order-form.html 502 ●●●● patch | view | raw | blame | history
zq-erp/src/main/resources/templates/views/admin/hive/beautySalon/orderXq-form-bak.html 140 ●●●●● patch | view | raw | blame | history
zq-erp/src/main/resources/templates/views/admin/hive/beautySalon/orderXq-form-bak2.html 170 ●●●●● patch | view | raw | blame | history
zq-erp/src/main/resources/templates/views/admin/hive/beautySalon/orderXq-form.html 1009 ●●●● patch | view | raw | blame | history
zq-erp/src/main/resources/templates/views/admin/hive/beautySalon/pbxq-form-bak.html 159 ●●●●● patch | view | raw | blame | history
zq-erp/src/main/resources/templates/views/admin/hive/beautySalon/pbxq-form.html 297 ●●●●● patch | view | raw | blame | history
zq-erp/src/main/resources/templates/views/admin/hive/beautySalon/projUseFlow-list.html 128 ●●●●● patch | view | raw | blame | history
zq-erp/src/main/resources/templates/views/admin/hive/beautySalon/servicceAddForm.html 13 ●●●●● patch | view | raw | blame | history
zq-erp/src/main/resources/templates/views/admin/hive/beautySalon/service-hk.html 8 ●●●● patch | view | raw | blame | history
zq-erp/src/main/resources/templates/views/admin/hive/beautySalon/service_all_list.html 8 ●●●● patch | view | raw | blame | history
zq-erp/src/main/resources/templates/views/admin/hive/beautySalon/updateOrderTime.html 8 ●●●● patch | view | raw | blame | history
zq-erp/src/main/resources/templates/views/admin/hive/beautySalon/vip.html 1533 ●●●● patch | view | raw | blame | history
zq-erp/src/main/resources/templates/views/admin/hive/beautySalon/vip_bak.html 285 ●●●●● patch | view | raw | blame | history
zq-erp/src/main/resources/templates/views/admin/hive/beautySalon/yypb-form.html 8 ●●●● patch | view | raw | blame | history
zq-erp/src/main/resources/templates/views/admin/hive/instore/instoreinfo-list.html 2 ●●●●● patch | view | raw | blame | history
zq-erp/src/main/resources/templates/views/admin/hive/instore/store-list.html 3 ●●●● patch | view | raw | blame | history
zq-erp/src/main/resources/templates/views/admin/hive/products/goods-form.html 101 ●●●●● patch | view | raw | blame | history
zq-erp/src/main/resources/templates/views/admin/hive/statistics/custom-consume-list.html 161 ●●●●● patch | view | raw | blame | history
zq-erp/src/main/resources/templates/views/admin/hive/statistics/daily-list-new.html 27 ●●●●● patch | view | raw | blame | history
zq-erp/src/main/resources/templates/views/admin/hive/statistics/daily-sale-list.html 157 ●●●●● patch | view | raw | blame | history
zq-erp/src/main/resources/templates/views/admin/hive/statistics/statistics-moneyCar-item.html 2 ●●● patch | view | raw | blame | history
zq-erp/src/main/resources/templates/views/admin/hive/statistics/statistics-moneyCar-summary.html 34 ●●●● patch | view | raw | blame | history
zq-erp/src/main/resources/templates/views/admin/hive/statistics/statistics-projSercice-item.html 17 ●●●● patch | view | raw | blame | history
zq-erp/src/main/resources/templates/views/admin/hive/statistics/statistics-projSercice-sumary.html 19 ●●●● patch | view | raw | blame | history
zq-erp/src/main/resources/templates/views/admin/hive/statistics/statistics-projuse-item.html 17 ●●●● patch | view | raw | blame | history
zq-erp/src/main/resources/templates/views/admin/hive/statistics/statistics-projuse-sumary.html 17 ●●●● patch | view | raw | blame | history
zq-erp/src/main/resources/templates/views/admin/hive/statistics/store-inout-list.html 33 ●●●●● patch | view | raw | blame | history
zq-erp/src/main/resources/templates/views/admin/hive/store/projServiceStartpl-list.html 8 ●●●● patch | view | raw | blame | history
zq-erp/src/main/resources/templates/views/admin/hive/vip/moneyCardUse-form.html 14 ●●●● patch | view | raw | blame | history
zq-erp/src/main/resources/templates/views/admin/hive/vip/moneyCardUseFlow-list.html 70 ●●●●● patch | view | raw | blame | history
zq-erp/src/main/resources/templates/views/admin/hive/vip/projUse-form.html 21 ●●●● patch | view | raw | blame | history
zq-erp/src/main/resources/templates/views/admin/hive/vip/sysSkinCheckRecord-form.html 8 ●●●● patch | view | raw | blame | history
zq-erp/src/main/resources/templates/views/admin/hive/vip/tc-form.html 23 ●●●● patch | view | raw | blame | history
zq-erp/src/main/resources/templates/views/admin/hive/vip/vipInfo-list.html 33 ●●●●● patch | view | raw | blame | history
zq-erp/src/main/resources/templates/views/admin/shop/templateMsg-form.html 13 ●●●●● patch | view | raw | blame | history
zq-erp/src/main/resources/templates/views/admin/shop/templateMsg-list.html 1 ●●●● patch | view | raw | blame | history
zq-erp/src/main/resources/templates/views/admin/sys/admin-form.html 2 ●●● patch | view | raw | blame | history
zq-erp/src/test/java/com/matrix/SourceFlowTests.java 86 ●●●● patch | view | raw | blame | history
zq-xcx/project.config.json 9 ●●●●● patch | view | raw | blame | history
zq-erp/pom.xml
@@ -341,7 +341,37 @@
            <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>
    </dependencies>
    <build>
        <resources>
            <resource>
@@ -354,6 +384,7 @@
                    <exclude>config/test/*</exclude>
                    <exclude>config/xcx/*</exclude>
                    <!-- -->
                       <exclude>config/config.json</exclude>
                         <exclude>config/application.properties</exclude>
@@ -393,6 +424,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>
            <!-- 热部署插件 -->
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("本次发送空消息");
zq-erp/src/main/java/com/matrix/component/tools/HttpClientUtil.java
New file
@@ -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;
    }
}
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;
    }
}
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>"));
    }
    /**
     * 
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;
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这个属性中
    }
    
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();
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这个属性中
    }
    
zq-erp/src/main/java/com/matrix/component/wechat/externalInterface/protocol/queryProtocol/JsApiPayReqData.java
File was deleted
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这个属性中
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这个属性中
    }
zq-erp/src/main/java/com/matrix/component/wechat/externalInterface/protocol/rsaProtocal/JsApiRSAReqData.java
File was deleted
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;
    }
}
zq-erp/src/main/java/com/matrix/component/wechat/externalInterface/service/JsApiGetPublicKeyService.java
File was deleted
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(); 
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/**");
        //小程序公司与域名对应关系拦截
zq-erp/src/main/java/com/matrix/config/RabbitMqConfig.java
@@ -6,6 +6,7 @@
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;
@@ -49,6 +50,11 @@
        return new TemplateMsgTask();
    }
  @Bean
  UniformMsgSentTask UniformMsgSentTask(){
        return new UniformMsgSentTask();
    }
    @Bean
    OrderOutSotoreTask OrderOutSotoreTask(){
        return new OrderOutSotoreTask();
@@ -68,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);
zq-erp/src/main/java/com/matrix/config/SwaggerConfig.java
New file
@@ -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();
    }
}
zq-erp/src/main/java/com/matrix/core/exception/GlobalExceptionHandler.java
New file
@@ -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("参数校验失败");
        }
    }
}
zq-erp/src/main/java/com/matrix/core/pojo/PaginationDto.java
New file
@@ -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();
    }
}
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 {
    /**
     * 起点
zq-erp/src/main/java/com/matrix/core/tools/DateUtil.java
@@ -5,6 +5,7 @@
import java.text.DateFormat;
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.time.LocalDateTime;
import java.util.ArrayList;
import java.util.Calendar;
import java.util.Date;
@@ -12,7 +13,7 @@
/**
 * 日期格式化,转换工具类
 *
 *
 * @author Ron
 * @createTime 2014.08.30
 */
@@ -90,7 +91,7 @@
    /**
     * 返回年份
     *
     *
     * @param date
     *            日期
     * @return 返回年份
@@ -137,7 +138,7 @@
    }
    /**
     * 返回月份
     *
     *
     * @param date
     *            日期
     * @return 返回月份
@@ -149,14 +150,14 @@
            c.setTime(date);
            return c.get(Calendar.MONTH) + 1;
        } catch (Exception e) {
        }
        return 0;
    }
    /**
     * 日期转字符串
     *
     *
     * @param date
     * @param format
     * @return
@@ -172,7 +173,7 @@
    /**
     * 字符串转日期
     *
     *
     * @param dateStr
     * @param format
     * @return
@@ -183,7 +184,7 @@
        try {
            return fmt.parse(dateStr);
        } catch (ParseException e) {
        }
        return null;
    }
@@ -199,7 +200,7 @@
    /**
     * 判断给定的日期是一周中的第几天,注意:按照中国的习惯,周日是第七天
     *
     *
     * @param date
     * @return
     */
@@ -225,7 +226,7 @@
    /**
     * 指定时间的下一天
     *
     *
     * @param date
     * @return
     */
@@ -241,7 +242,7 @@
            cal.add(Calendar.DATE, 1);
            return cal.getTime();
        } catch (Exception e) {
        }
        return null;
@@ -249,7 +250,7 @@
    /**
     * 指定时间的前一天
     *
     *
     * @param date
     * @return
     */
@@ -265,7 +266,7 @@
            cal.add(Calendar.DATE, -1);
            return cal.getTime();
        } catch (Exception e) {
        }
        return null;
@@ -273,7 +274,7 @@
    /**
     * 指定时间的下N天
     *
     *
     * @param date
     * @return
     */
@@ -289,7 +290,7 @@
            cal.add(Calendar.DATE, nDay);
            return cal.getTime();
        } catch (Exception e) {
        }
        return null;
@@ -297,7 +298,7 @@
    /**
     * 指定时间的前N天
     *
     *
     * @param date
     * @return
     */
@@ -313,7 +314,7 @@
            cal.add(Calendar.DATE, -nDay);
            return cal.getTime();
        } catch (Exception e) {
        }
        return null;
@@ -321,7 +322,7 @@
    /**
     * 获取一天的起始时间
     *
     *
     * @param date
     * @return
     */
@@ -338,7 +339,7 @@
        try {
            return fmt.parse(dateStr);
        } catch (ParseException e) {
        }
        return date;
@@ -346,7 +347,7 @@
    /**
     * 获取一天的结束时间
     *
     *
     * @param date
     * @return
     */
@@ -363,7 +364,7 @@
        try {
            return fmt.parse(dateStr);
        } catch (ParseException e) {
        }
        return date;
@@ -371,7 +372,7 @@
    /**
     * currentDat是否在referenceDate日期之前
     *
     *
     * @param referenceDate
     * @param currentDat
     * @return
@@ -389,7 +390,7 @@
    /**
     * currentDat是否在referenceDate日期之后
     *
     *
     * @param referenceDate
     * @param currentDat
     * @return
@@ -436,7 +437,7 @@
    }
    /**
     * 判断currentDate是否在startDate和endDate之间,不包括startDate和endDate
     *
     *
     * @param startDate
     * @param endDate
     * @param currentDate
@@ -454,11 +455,11 @@
        return false;
    }
    /**
     * 获取startDate到endDate之间的星期day(中文星期)不包括startDate和endDate
     *
     *
     * @param startDate
     * @param endDate
     * @param day
@@ -483,11 +484,11 @@
        return listDate;
    }
    /**
     * date转换成Timestamp
     *
     *
     * @param date
     * @param format
     * @return
@@ -507,7 +508,7 @@
    /**
     * 获取早中晚
     *
     *
     * @param time
     * @return
     */
@@ -530,7 +531,7 @@
    /**
     * 获取早中晚的开始时间
     *
     *
     * @param date
     * @param time
     * @return
@@ -554,7 +555,7 @@
    /**
     * 获取早中晚的结束时间
     *
     *
     * @param date
     * @param time
     * @return
@@ -578,7 +579,7 @@
    /**
     * 得到几天前的时间
     *
     *
     * @param d
     * @param day
     * @return
@@ -592,7 +593,7 @@
    /**
     * 得到几天后的时间
     *
     *
     * @param d
     * @param day
     * @return
@@ -606,7 +607,7 @@
    /**
     * 将日期类型格式化成字符串
     *
     *
     * @param date
     * @return 格式化后日期字符串
     * @throws ParseException
@@ -622,7 +623,7 @@
    /**
     * 获取时间戳
     *
     *
     * @return
     */
    public static String getTimeMark() {
@@ -694,4 +695,70 @@
        }
        return um;
    }
    /**
     * 根据单位计算目标日期
     *
     * @param num 距离
     * @param unit 日期单位 Y/M/D
     * @return
     */
    public static Date calDate(Integer num, String unit) {
        Calendar calendar = Calendar.getInstance();
        Date targetDate = null;
        switch (unit) {
            case "Y":
                calendar.add(Calendar.YEAR, num);
                targetDate = calendar.getTime();
                break;
            case "M":
                calendar.add(Calendar.MONTH, num);
                targetDate = calendar.getTime();
                break;
            case "D":
                calendar.add(Calendar.DAY_OF_MONTH, num);
                targetDate = calendar.getTime();
                break;
            default:
                targetDate = stringToDate("9999-12-31", DATE_FORMAT_DD);
        }
        return targetDate;
    }
    public static String getAgeForBirthDay(Date birthDay) {
        Calendar cal = Calendar.getInstance();
        if (birthDay == null) {
            return "-";
        }
        // 出生日期晚于当前时间,无法计算
        if (cal.before(birthDay)) {
            return "-";
        }
        // 当前年份
        int yearNow = cal.get(Calendar.YEAR);
        // 当前月份
        int monthNow = cal.get(Calendar.MONTH);
        // 当前日期
        int dayOfMonthNow = cal.get(Calendar.DAY_OF_MONTH);
        cal.setTime(birthDay);
        int yearBirth = cal.get(Calendar.YEAR);
        int monthBirth = cal.get(Calendar.MONTH);
        int dayOfMonthBirth = cal.get(Calendar.DAY_OF_MONTH);
        // 计算整岁数
        Integer age = yearNow - yearBirth;
        if (monthNow <= monthBirth) {
            if (monthNow == monthBirth) {
                if (dayOfMonthNow < dayOfMonthBirth) {
                    // 当前日期在生日之前,年龄减一
                    age--;
                }
            } else {
                age--;
            }
        }
        return age.toString();
    }
}
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");
    }
}
zq-erp/src/main/java/com/matrix/system/app/action/ApiCommonAction.java
New file
@@ -0,0 +1,220 @@
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.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));
        redisClient.saveValueForever(user.getSuId().toString(), token);
        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("请勿重复发送验证码");
        }
        redisClient.saveValue(smsCodeDto.getTelphone(), "123456", 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());
    }
}
zq-erp/src/main/java/com/matrix/system/app/action/ApiFollowupAction.java
New file
@@ -0,0 +1,180 @@
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.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.isBlank(zans)){
            List<Long> zanIds = StringUtils.strToCollToLong(zans, ",");
            List<Long> zaned = zanIds.stream().filter(zanid -> zanid.equals(user.getSuId())).collect(Collectors.toList());
            if(CollectionUtils.isEmpty(zaned)){
                //取消赞
                List<Long> newZaned = zanIds.stream().filter(zanid -> !zanid.equals(user.getSuId())).collect(Collectors.toList());
                zans=StringUtils.collToStr(newZaned,",");
            }else{
                //点赞
                zaned.add(user.getSuId());
                zans=StringUtils.collToStr(zaned,",");
            }
        }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);
        followupListDto.setShopId(user.getShopId());
        followupListDto.setCompanyId(user.getCompanyId());
        followupListDto.setSelfStaff(user.getSuId());
        //TODO 需要设置跨店数据权限
        List<SysFollowup> rows= followupDao.selectByAppDto(followupListDto);
        return AjaxResult.buildSuccessInstance(rows,"查询成功");
    }
}
zq-erp/src/main/java/com/matrix/system/app/action/ApiKnowledgeAction.java
New file
@@ -0,0 +1,63 @@
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.bean.Article;
import com.matrix.system.hive.bean.ArticleType;
import com.matrix.system.hive.bean.SysShopInfo;
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());
        type.setParentId(0L);
        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();
        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;
    }
}
zq-erp/src/main/java/com/matrix/system/app/action/ApiOrderAction.java
New file
@@ -0,0 +1,176 @@
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());
        return AjaxResult.buildSuccessInstance(shoppingGoodsCategoryService.findByModel(category));
    }
    @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);
        shoppingGoodsListDto.setShopId(user.getShopId());
        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("取消失败");
    }
}
zq-erp/src/main/java/com/matrix/system/app/action/ApiRankingAction.java
New file
@@ -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));
    }
}
zq-erp/src/main/java/com/matrix/system/app/action/ApiServiceOrderAction.java
New file
@@ -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.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.Arrays;
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());
                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());
            orderListDto.setUserId(user.getSuId());
        }
        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("确认失败");
    }
}
zq-erp/src/main/java/com/matrix/system/app/action/ApiShopInfoAction.java
New file
@@ -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));
    }
}
zq-erp/src/main/java/com/matrix/system/app/action/ApiSkinCheckAction.java
New file
@@ -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;
    }
}
zq-erp/src/main/java/com/matrix/system/app/action/ApiStatisticsAction.java
New file
@@ -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);
    }
}
zq-erp/src/main/java/com/matrix/system/app/action/ApiStoreAction.java
New file
@@ -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));
    }
}
zq-erp/src/main/java/com/matrix/system/app/action/ApiUsersAction.java
New file
@@ -0,0 +1,182 @@
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.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.validation.annotation.Validated;
import org.springframework.web.bind.annotation.*;
import javax.annotation.Resource;
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;
    @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() {
        SysUsers sysUsers = WebUtil.getSessionAttribute(MatrixConstance.LOGIN_KEY);
        String token = redisClient.getCachedValue(sysUsers.getSuId().toString());
        redisClient.removeObject(token);
        redisClient.removeObject(sysUsers.getSuId().toString());
        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.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("修改失败");
    }
}
zq-erp/src/main/java/com/matrix/system/app/action/ApiVipInfoAction.java
New file
@@ -0,0 +1,226 @@
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.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());
        }
        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;
    }
}
zq-erp/src/main/java/com/matrix/system/app/action/ApiVipLabelAction.java
New file
@@ -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("删除失败");
    }
}
zq-erp/src/main/java/com/matrix/system/app/action/AppOccupancyController.java
New file
@@ -0,0 +1,63 @@
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.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.ResponseBody;
import org.springframework.web.bind.annotation.RestController;
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(String timeStr) {
        //TODO app的用户获不能在session中,方案要改
        SysUsers sysUsers = WebUtil.getSessionAttribute(MatrixConstance.LOGIN_KEY);
        return occupancyController.getCwzyList(timeStr,sysUsers.getShopId());
    }
}
zq-erp/src/main/java/com/matrix/system/app/action/TestAction.java
New file
@@ -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;
    }
}
zq-erp/src/main/java/com/matrix/system/app/authority/AppAuthorityManager.java
New file
@@ -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);
                }
            }
        }
    }
}
zq-erp/src/main/java/com/matrix/system/app/dto/AddVipDto.java
New file
@@ -0,0 +1,171 @@
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;
    @Length(max = 10, min = 1)
    @NotBlank(message = "会员编号不能为空")
    @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(min = 6, max = 6)
    @NotBlank(message = "参数错误")
    @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;
    }
}
zq-erp/src/main/java/com/matrix/system/app/dto/ArticleListDto.java
New file
@@ -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;
    }
}
zq-erp/src/main/java/com/matrix/system/app/dto/BasePageDto.java
New file
@@ -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;
    }
}
zq-erp/src/main/java/com/matrix/system/app/dto/BeauticianDto.java
New file
@@ -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;
    }
}
zq-erp/src/main/java/com/matrix/system/app/dto/BusinessesDto.java
New file
@@ -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;
    }
}
zq-erp/src/main/java/com/matrix/system/app/dto/CreateOderItemDto.java
New file
@@ -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;
    }
}
zq-erp/src/main/java/com/matrix/system/app/dto/CreateOrderDto.java
New file
@@ -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;
    }
}
zq-erp/src/main/java/com/matrix/system/app/dto/CreateServiceOrderDto.java
New file
@@ -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;
    }
}
zq-erp/src/main/java/com/matrix/system/app/dto/CreateServiceOrderItemDto.java
New file
@@ -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;
    }
}
zq-erp/src/main/java/com/matrix/system/app/dto/FollowupListDto.java
New file
@@ -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;
    }
}
zq-erp/src/main/java/com/matrix/system/app/dto/IdSubmitDto.java
New file
@@ -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;
    }
}
zq-erp/src/main/java/com/matrix/system/app/dto/LabelDto.java
New file
@@ -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;
    }
}
zq-erp/src/main/java/com/matrix/system/app/dto/LoginDto.java
New file
@@ -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;
    }
}
zq-erp/src/main/java/com/matrix/system/app/dto/ModifyUserDto.java
New file
@@ -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;
    }
}
zq-erp/src/main/java/com/matrix/system/app/dto/ModifyVipDto.java
New file
@@ -0,0 +1,183 @@
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;
    @NotBlank(message = "会员编号不能为空")
    @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(min = 6, max = 6)
    @NotBlank(message = "参数错误")
    @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;
    }
}
zq-erp/src/main/java/com/matrix/system/app/dto/OrderListDto.java
New file
@@ -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;
        }
    }
}
zq-erp/src/main/java/com/matrix/system/app/dto/PwdModifyDto.java
New file
@@ -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;
    }
}
zq-erp/src/main/java/com/matrix/system/app/dto/PwdResetDto.java
New file
@@ -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;
    }
}
zq-erp/src/main/java/com/matrix/system/app/dto/QuestionAnswerDto.java
New file
@@ -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;
    }
}
zq-erp/src/main/java/com/matrix/system/app/dto/QuestionAnswerItemDto.java
New file
@@ -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;
    }
}
zq-erp/src/main/java/com/matrix/system/app/dto/RankingDto.java
New file
@@ -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;
    }
}
zq-erp/src/main/java/com/matrix/system/app/dto/ServiceOrderListDto.java
New file
@@ -0,0 +1,94 @@
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;
    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;
        }
    }
}
zq-erp/src/main/java/com/matrix/system/app/dto/ServiceVipProjDto.java
New file
@@ -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;
    }
}
zq-erp/src/main/java/com/matrix/system/app/dto/ShoppingGoodsListDto.java
New file
@@ -0,0 +1,82 @@
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;
    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;
    }
}
zq-erp/src/main/java/com/matrix/system/app/dto/SkinCheckListDto.java
New file
@@ -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;
    }
}
zq-erp/src/main/java/com/matrix/system/app/dto/SmsCodeDto.java
New file
@@ -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;
    }
}
zq-erp/src/main/java/com/matrix/system/app/dto/StoreInOutListDto.java
New file
@@ -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;
    }
}
zq-erp/src/main/java/com/matrix/system/app/dto/StoreListDto.java
New file
@@ -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;
    }
}
zq-erp/src/main/java/com/matrix/system/app/dto/UploadPhotoDto.java
New file
@@ -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;
    }
}
zq-erp/src/main/java/com/matrix/system/app/dto/UsersQueryDto.java
New file
@@ -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;
    }
}
zq-erp/src/main/java/com/matrix/system/app/dto/VipInfoListDto.java
New file
@@ -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;
    }
}
zq-erp/src/main/java/com/matrix/system/app/dto/VipStatisticsParamDto.java
New file
@@ -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;
    }
}
zq-erp/src/main/java/com/matrix/system/app/mapper/MoneyCardUseMapper.java
New file
@@ -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);
}
zq-erp/src/main/java/com/matrix/system/app/mapper/QuestionMapper.java
New file
@@ -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);
}
zq-erp/src/main/java/com/matrix/system/app/mapper/SysBeauticianStateMapper.java
New file
@@ -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);
}
zq-erp/src/main/java/com/matrix/system/app/mapper/SysProjServiceMapper.java
New file
@@ -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);
}
zq-erp/src/main/java/com/matrix/system/app/mapper/SysProjUseMapper.java
New file
@@ -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);
}
zq-erp/src/main/java/com/matrix/system/app/mapper/SysSkinCheckRecordMapper.java
New file
@@ -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);
}
zq-erp/src/main/java/com/matrix/system/app/mapper/SysStoreInfoMapper.java
New file
@@ -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);
}
zq-erp/src/main/java/com/matrix/system/app/mapper/SysUsersMapper.java
New file
@@ -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);
}
zq-erp/src/main/java/com/matrix/system/app/mapper/SysWorkBeatuistaffMapper.java
New file
@@ -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);
}
zq-erp/src/main/java/com/matrix/system/app/vo/BeauticianVo.java
New file
@@ -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;
    }
}
zq-erp/src/main/java/com/matrix/system/app/vo/BusinessesDataShowVo.java
New file
@@ -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;
    }
}
zq-erp/src/main/java/com/matrix/system/app/vo/OrderDetailAchieveItemVo.java
New file
@@ -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;
    }
}
zq-erp/src/main/java/com/matrix/system/app/vo/OrderDetailItemVo.java
New file
@@ -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;
    }
}
zq-erp/src/main/java/com/matrix/system/app/vo/OrderDetailVo.java
New file
@@ -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;
    }
}
zq-erp/src/main/java/com/matrix/system/app/vo/QuestionVo.java
New file
@@ -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;
    }
}
zq-erp/src/main/java/com/matrix/system/app/vo/RankingVo.java
New file
@@ -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;
    }
}
zq-erp/src/main/java/com/matrix/system/app/vo/ServiceOrderDetailItemVo.java
New file
@@ -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;
    }
}
zq-erp/src/main/java/com/matrix/system/app/vo/ServiceOrderDetailVo.java
New file
@@ -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;
    }
}
zq-erp/src/main/java/com/matrix/system/app/vo/ServiceOrderListProjVo.java
New file
@@ -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;
    }
}
zq-erp/src/main/java/com/matrix/system/app/vo/ServiceOrderListVo.java
New file
@@ -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;
        }
    }
}
zq-erp/src/main/java/com/matrix/system/app/vo/ServiceProductListVo.java
New file
@@ -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;
    }
}
zq-erp/src/main/java/com/matrix/system/app/vo/ServiceProjVo.java
New file
@@ -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;
    }
}
zq-erp/src/main/java/com/matrix/system/app/vo/ServiceTcVo.java
New file
@@ -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;
    }
}
zq-erp/src/main/java/com/matrix/system/app/vo/ShoppingGoodsDetailVo.java
New file
@@ -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;
    }
}
zq-erp/src/main/java/com/matrix/system/app/vo/ShoppingGoodsListVo.java
New file
@@ -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;
    }
}
zq-erp/src/main/java/com/matrix/system/app/vo/SkinCheckAnalysisItems.java
New file
@@ -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;
    }
}
zq-erp/src/main/java/com/matrix/system/app/vo/SkinCheckDetailVo.java
New file
@@ -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;
    }
}
zq-erp/src/main/java/com/matrix/system/app/vo/SkinCheckDiagnoseItemVo.java
New file
@@ -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;
    }
}
zq-erp/src/main/java/com/matrix/system/app/vo/SkinCheckListVo.java
New file
@@ -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;
    }
}
zq-erp/src/main/java/com/matrix/system/app/vo/StoreInOutListVo.java
New file
@@ -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;
    }
}
zq-erp/src/main/java/com/matrix/system/app/vo/StoreListVo.java
New file
@@ -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;
    }
}
zq-erp/src/main/java/com/matrix/system/app/vo/UserAchieveVo.java
New file
@@ -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;
    }
}
zq-erp/src/main/java/com/matrix/system/app/vo/UserInfoDetailVo.java
New file
@@ -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;
    }
}
zq-erp/src/main/java/com/matrix/system/app/vo/UserInfoVo.java
New file
@@ -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;
    }
}
zq-erp/src/main/java/com/matrix/system/app/vo/VipAchieveDataShowVo.java
New file
@@ -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;
    }
    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;
    }
}
zq-erp/src/main/java/com/matrix/system/app/vo/VipCardListVo.java
New file
@@ -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;
    }
}
zq-erp/src/main/java/com/matrix/system/app/vo/VipInfoDetailVo.java
New file
@@ -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;
    }
}
zq-erp/src/main/java/com/matrix/system/app/vo/VipInfoListVo.java
New file
@@ -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;
    }
}
zq-erp/src/main/java/com/matrix/system/app/vo/VipInfoVo.java
New file
@@ -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;
    }
}
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);
        }
    }
    /**
     * 修改公司管理员
@@ -179,6 +198,8 @@
    }
    @RequestMapping(value = "/goStaffEditForm")
    public String goStaffEditForm() {
        SysUsers loginUser = WebUtil.getSessionAttribute(MatrixConstance.LOGIN_KEY);
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";
}
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();
}
zq-erp/src/main/java/com/matrix/system/common/interceptor/ApiUserLoginInterceptor.java
New file
@@ -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 final String TOKEN_HEADER = "Authorization";
    private 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);
        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
     */
    private String resolveToken(HttpServletRequest request) {
        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 "";
    }
}
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();
}
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();
    }
}
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,8 @@
    String ORDER_TYPE_SEAL="订单";
    String ORDER_TYPE_SERVICE="服务单";
    String ACHIEVE_TYPE_CASH = "现金业绩";
    String ACHIEVE_TYPE_CARD = "划扣业绩";
    
}
zq-erp/src/main/java/com/matrix/system/hive/action/ArticleTypeController.java
@@ -1,16 +1,21 @@
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.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 +77,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,6 +115,16 @@
           articleType.setType(Dictionary.ARTICEL_TYPE_NAME_MDXY);
        SysUsers users = WebUtil.getSessionAttribute(MatrixConstance.LOGIN_KEY);
        articleType.setShopId(users.getShopId());
        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) {
            return modify(currentService, articleType, "文章类型");
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, "会员卡信息");
zq-erp/src/main/java/com/matrix/system/hive/action/MoneyCardUseController.java
@@ -18,6 +18,7 @@
import org.springframework.beans.factory.annotation.Autowired;
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;
@@ -60,14 +61,12 @@
     * @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.setVipId(id);
            cardUseInfo.setCardName("储值卡");
            cardUseInfo.setIsVipCar(Dictionary.FLAG_YES_Y);
            cardUseInfo.setRealMoney(0D);
@@ -89,7 +88,7 @@
     */
    @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, "充值成功");
        result.putInMap("orderId",order.getId());
@@ -181,23 +180,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 +217,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, "补交成功");
@@ -296,7 +286,7 @@
                if (newDate != null && newDate.before(today)) {
                    return new AjaxResult(AjaxResult.STATUS_FAIL, "有效期要大于当前日期");
                }
                if (newDate == null && failTime.before(today)) {
                if (newDate == null && (failTime == null || failTime.before(today))) {
                    //如果是已过期界面会提醒重新设置有效期
                    return new AjaxResult(AjaxResult.STATUS_SUCCESS, "已过期");
                }
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;
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;
@@ -15,10 +16,7 @@
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.bean.*;
import com.matrix.system.hive.dao.MoneyCardUseDao;
import com.matrix.system.hive.dao.SysOrderDao;
import com.matrix.system.hive.dao.SysOrderItemDao;
@@ -26,11 +24,11 @@
import com.matrix.core.tools.DateUtil;
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 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.ui.ModelMap;
@@ -48,6 +46,7 @@
import java.net.URLEncoder;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.Date;
import java.util.List;
/**
@@ -83,6 +82,16 @@
    @Autowired
    SysShopInfoDao shopInfoDao;
    @Autowired
    private SysVipInfoService sysVipInfoService;
    @Autowired
    private SysOrderFlowService sysOrderFlowService;
    @Autowired
    RabiitMqTemplate rabiitMqTemplate;
    @Value("${evn}")
    private String evn;
    /**
     * 计算订单金额
@@ -120,14 +129,38 @@
        //校验订单是否满足结算调价,新订单则保存订单,已有订单则删除后更新
        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) {
        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 +177,6 @@
        //处理用户购买的产品
        return AjaxResult.buildSuccessInstance(Arrays.asList(sysOrder), "订单保存成功");
    }
    /**
     * 新建订单
@@ -175,6 +207,9 @@
        }
        //设置过滤后的购物车条目
        car.setCarItems(carItems);
        SysVipInfo info = (SysVipInfo) WebUtil.getSession().getAttribute(SystemConstance.CURRENT_CUSTOMER);
        car.setVipId(info.getId());
        // 添加新订单
        int i = orderService.createOrder(WebUtil.getSession(), car);
@@ -353,6 +388,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 +437,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";
    }
zq-erp/src/main/java/com/matrix/system/hive/action/ProjServiceController.java
@@ -495,6 +495,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));
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;
@@ -60,6 +57,18 @@
    @Resource
    private MoneyCardUseService moneyCardUseService;
    @Resource
    private  SysProjUseDao projUseDao;
    @Autowired
    SysVipInfoDao vipInfoDao;
    @Autowired
    ShoppingGoodsDao shoppingGoodsDao;
    @Autowired
    MoneyCardUseDao moneyCardUseDao;
    public static final String fnCode = "projUse";
    public static final String search = fnCode + ":search";
@@ -85,6 +94,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));
    }
    /**
     * 将项目设置为有效
@@ -217,10 +238,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 +268,7 @@
    }
    @Autowired
    SysVipInfoDao vipInfoDao;
    @Autowired
    ShoppingGoodsDao shoppingGoodsDao;
    @Autowired
    SysProjUseDao projUseDao;
    @Autowired
    MoneyCardUseDao moneyCardUseDao;
    @RequestMapping(value = "/importProjUse")
zq-erp/src/main/java/com/matrix/system/hive/action/ShopInfoController.java
@@ -7,6 +7,7 @@
import com.matrix.core.pojo.PaginationVO;
import com.matrix.core.tools.WebUtil;
import com.matrix.system.common.bean.SysUsers;
import com.matrix.system.common.constance.AppConstance;
import com.matrix.system.constance.Dictionary;
import com.matrix.system.hive.action.util.QueryUtil;
import com.matrix.system.hive.bean.SysShopInfo;
@@ -108,6 +109,16 @@
        QueryUtil.setQueryLimitCom(shopInfo);
        return new AjaxResult(AjaxResult.STATUS_SUCCESS, currentService.findByModel(shopInfo), null);
    }
    @RequestMapping(value = "/findAllWithPermi" )
    public @ResponseBody AjaxResult findAllWithPermi(SysShopInfo shopInfo) {
        QueryUtil.setQueryLimitCom(shopInfo);
        SysUsers sysUsers = (SysUsers) WebUtil.getSession().getAttribute(MatrixConstance.LOGIN_KEY);
        if(!AppConstance.ZONGDIAN.equals(sysUsers.getShopName())){
            shopInfo.setId(sysUsers.getShopId());
        }
        return new AjaxResult(AjaxResult.STATUS_SUCCESS, currentService.findByModel(shopInfo), null);
    }
    /**
     * 查询非总店 商城店铺的门店
     * TODO 微商城不应该调用这里的接口
zq-erp/src/main/java/com/matrix/system/hive/action/ShoppingGoodsCategoryController.java
@@ -111,11 +111,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);
    }
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);
    }
zq-erp/src/main/java/com/matrix/system/hive/action/SysVipLabelController.java
New file
@@ -0,0 +1,60 @@
package com.matrix.system.hive.action;
import com.matrix.core.pojo.AjaxResult;
import com.matrix.system.common.bean.SysUsers;
import com.matrix.system.hive.bean.SysVipLabel;
import com.matrix.system.hive.dao.SysVipLabelDao;
import com.matrix.system.hive.plugin.util.CollectionUtils;
import jodd.util.CollectionUtil;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.ResponseBody;
import java.util.Date;
import java.util.List;
/**
 * @author wzy
 * @date 2020-12-17
 **/
@Controller
@RequestMapping(value = "/admin/label")
public class SysVipLabelController extends BaseController{
    @Autowired
    private SysVipLabelDao sysVipLabelDao;
    @RequestMapping(value = "/add")
    @ResponseBody
    public AjaxResult add(SysVipLabel sysVipLabel) {
        SysUsers sysUsers = getMe();
        List<SysVipLabel> sysVipLabels = sysVipLabelDao.selectByModel(sysVipLabel);
        if (CollectionUtils.isNotEmpty(sysVipLabels)) {
            return AjaxResult.buildFailInstance("已存在该标签");
        }
        sysVipLabel.setCreateBy(sysUsers.getSuName());
        sysVipLabel.setCreateTime(new Date());
        int i = sysVipLabelDao.insert(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);
        if (i > 0) {
            return AjaxResult.buildSuccessInstance("删除成功");
        }
        return AjaxResult.buildFailInstance("删除失败");
    }
}
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;
@@ -205,6 +207,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 +235,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);
                    }
                }
zq-erp/src/main/java/com/matrix/system/hive/action/VipInfoController.java
@@ -22,6 +22,7 @@
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.SysVipLabelDao;
import com.matrix.system.hive.dao.VipAnswerDao;
import com.matrix.core.tools.DateUtil;
import com.matrix.system.hive.pojo.RegisterInfo;
@@ -76,10 +77,15 @@
    private MoneyCardUseDao moneyCardUseDao;
    @Autowired
    private SysVipLabelDao sysVipLabelDao;
    @Autowired
    private SystemDictionaryService dataDictionaryService;
    @Autowired
    private CustomerDataDictionaryDao customerDataDictionaryDao;
    @Resource
    private SysOrderService sysOrderService;
    @RequestMapping(value = "/showVipLevel")
@@ -124,6 +130,7 @@
        List<SysVipInfo> vips = vipInfoService.findByVipNoOrTel(keyWord);
        if (vips.size() > 0) {
            // 在session存放当前查询的客户
            vips.get(0).setSysOrder(sysOrderService.findSysOrderTjByVipId(vips.get(0).getId()));
            vips.get(0).setLevelCard(cardUseService.findByVipId(vips.get(0).getId()));
            WebUtil.getSession().setAttribute(SystemConstance.CURRENT_CUSTOMER, vips.get(0));
            // 满20后删除一个
@@ -140,6 +147,8 @@
            if (isNoRepeat) {
                userList.add(vips.get(0));
            }
            vips.get(0).setLabels(sysVipLabelDao.selectByVipId(vips.get(0).getId()));
            vips.get(0).setAge(DateUtil.getAgeForBirthDay(vips.get(0).getBirthday1()));
            vips.get(0).setBalance(moneyCardUseDao.selectVipCardTotalMoney(vips.get(0).getId()));
            AjaxResult result=  new AjaxResult(AjaxResult.STATUS_SUCCESS, vips, 0);
            return result;
zq-erp/src/main/java/com/matrix/system/hive/bean/AchieveNew.java
@@ -164,8 +164,11 @@
            
    
    private String  t2;
    /**
     * 业绩种类 1-现金业绩 2-划扣业绩
     */
    private String  t3;
            
    
@@ -200,6 +203,8 @@
    
    private String day;
    private String vipQueryKey;
    /**
     * 订单编号
@@ -227,6 +232,8 @@
     */
    private String meiliao;
    private Integer arriveCnt;
    
@@ -250,6 +257,51 @@
    @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;
    }
    public void setArriveCnt(Integer arriveCnt) {
        this.arriveCnt = arriveCnt;
    }
    public String getVipQueryKey() {
        return vipQueryKey;
    }
    public void setVipQueryKey(String vipQueryKey) {
        this.vipQueryKey = vipQueryKey;
    }
    public Long getCompanyId() {
        return companyId;
zq-erp/src/main/java/com/matrix/system/hive/bean/AppVersion.java
New file
@@ -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;
    }
}
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;
            
    
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
zq-erp/src/main/java/com/matrix/system/hive/bean/MoneyCardUse.java
@@ -1,5 +1,6 @@
package com.matrix.system.hive.bean;
import com.fasterxml.jackson.annotation.JsonFormat;
import com.matrix.core.anotations.Extend;
import com.matrix.core.tools.DateUtil;
import com.matrix.system.hive.plugin.util.MoneyUtil;
@@ -67,6 +68,7 @@
    /**
     * 失效时间
     */
    @JsonFormat(pattern = DateUtil.DATE_FORMAT_DD, timezone = "GMT+8")
    @DateTimeFormat(pattern= DateUtil.DATE_FORMAT_DD)
    private Date  failTime;
            
zq-erp/src/main/java/com/matrix/system/hive/bean/ShoppingGoods.java
@@ -2,6 +2,7 @@
import com.matrix.core.anotations.Extend;
import com.matrix.core.tools.DateUtil;
import com.matrix.core.tools.StringUtils;
import org.springframework.format.annotation.DateTimeFormat;
import java.io.Serializable;
@@ -393,7 +394,134 @@
     */
    private Integer isDel;
    /**
     * 购买有效期
     */
    private String buyValid;
    /**
     * 购买有效期单位 - 扩展字段用于参数接收  y/m/d
     */
    private String buyDateUnit;
    /**
     * 购买有效期时长
     */
    private Integer buyDateNum;
    /**
     * 消耗有效期
     */
    private String useValid;
    /**
     * 消耗有效期单位 - 扩展字段用于参数接收  y/m/d
     */
    private String useDateUnit;
    /**
     * 消耗有效期时长
     */
    private Integer useDateNum;
    /**
     * 统一失效时间
     */
    private Date invalidTime;
    /**
     * 任选套餐是否无限次 N-否 Y-是
     */
    private String isInfinite;
    /**
     * 支付方式 1-充值本金 2-赠送金额 3-积分
     */
    private String payMethods;
    public String getPayMethods() {
        return payMethods;
    }
    public void setPayMethods(String payMethods) {
        this.payMethods = payMethods;
    }
    public String getIsInfinite() {
        return isInfinite;
    }
    public void setIsInfinite(String isInfinite) {
        this.isInfinite = isInfinite;
    }
    public Integer getBuyDateNum() {
        return buyDateNum;
    }
    public void setBuyDateNum(Integer buyDateNum) {
        this.buyDateNum = buyDateNum;
    }
    public Integer getUseDateNum() {
        return useDateNum;
    }
    public void setUseDateNum(Integer useDateNum) {
        this.useDateNum = useDateNum;
    }
    public String getBuyValid() {
        return buyValid;
    }
    public void setBuyValid(String buyValid) {
        if (StringUtils.isNotBlank(buyValid)) {
            if (buyValid.contains("Y") || buyValid.contains("M") || buyValid.contains("D")) {
                this.buyDateUnit = buyValid.substring(buyValid.length() - 1);
                this.buyDateNum = Integer.parseInt(buyValid.substring(0, buyValid.length() - 1));
            }
        }
        this.buyValid = buyValid;
    }
    public String getBuyDateUnit() {
        return buyDateUnit;
    }
    public void setBuyDateUnit(String buyDateUnit) {
        this.buyDateUnit = buyDateUnit;
    }
    public String getUseValid() {
        return useValid;
    }
    public void setUseValid(String useValid) {
        if (StringUtils.isNotBlank(useValid)) {
            if (useValid.contains("Y") || useValid.contains("M") || useValid.contains("D")) {
                this.useDateUnit = useValid.substring(useValid.length() - 1);
                this.useDateNum = Integer.parseInt(useValid.substring(0, useValid.length() - 1));
            }
        }
        this.useValid = useValid;
    }
    public String getUseDateUnit() {
        return useDateUnit;
    }
    public void setUseDateUnit(String useDateUnit) {
        this.useDateUnit = useDateUnit;
    }
    public Date getInvalidTime() {
        return invalidTime;
    }
    public void setInvalidTime(Date invalidTime) {
        this.invalidTime = invalidTime;
    }
    public Integer getIsDel() {
        return isDel;
zq-erp/src/main/java/com/matrix/system/hive/bean/ShoppingGoodsCategory2.java
New file
@@ -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 + "]";
    }
}
zq-erp/src/main/java/com/matrix/system/hive/bean/SysFollowup.java
New file
@@ -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;
    }
}
zq-erp/src/main/java/com/matrix/system/hive/bean/SysFollowupComment.java
New file
@@ -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;
    }
}
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 = "退货入库";
    /**
     * 序号
zq-erp/src/main/java/com/matrix/system/hive/bean/SysOrder.java
@@ -1,5 +1,6 @@
package com.matrix.system.hive.bean;
import com.fasterxml.jackson.annotation.JsonFormat;
import com.matrix.core.tools.DateUtil;
import org.springframework.format.annotation.DateTimeFormat;
@@ -114,6 +115,8 @@
     * 订单明细
     */
    private List<SysOrderItem> items;
    private List<SysOrderFlow> flows;
    /**
     * 会员姓名
     */
@@ -131,6 +134,8 @@
    private    String staffName;
    
    private String shopName;
    private String shopShortName;
    
    private Long searchShop;
    /**
@@ -155,6 +160,57 @@
    @DateTimeFormat(pattern = DateUtil.DATE_FORMAT_MM)
    private Date endTimeVo;
    /**
     * 消费次数
     */
    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;
    }
    public void setTimes(Integer times) {
        this.times = times;
    }
    public String getBeatuyId() {
        return beatuyId;
zq-erp/src/main/java/com/matrix/system/hive/bean/SysOrderFlow.java
New file
@@ -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;
    }
}
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;
    }
@@ -144,7 +183,6 @@
     * 业绩计算
     */
    private List<AchieveNew> achaeveList;
    public List<AchieveNew> getAchaeveList() {
        return achaeveList;
zq-erp/src/main/java/com/matrix/system/hive/bean/SysProjServices.java
@@ -1,5 +1,6 @@
package com.matrix.system.hive.bean;
import com.fasterxml.jackson.annotation.JsonFormat;
import com.matrix.core.anotations.Extend;
import com.matrix.core.tools.DateUtil;
import org.springframework.format.annotation.DateTimeFormat;
@@ -36,6 +37,7 @@
    /**
     * 订单创建时间
     */
    @JsonFormat(pattern = DateUtil.DATE_FORMAT_MM, timezone = "GMT+8")
    @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm")
    private Date createTime;
    /**
@@ -230,6 +232,14 @@
     * 床位名称
     */
    private String bedName;
     /**
     * 评价
     */
    private String comment;
     /**
     * 评价回复
     */
    private String reply;
    /**
     * 商机
     */
@@ -239,6 +249,8 @@
     * 服务预计时长
     */
    private Integer totalTime;
@@ -253,6 +265,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;
@@ -287,12 +315,14 @@
    /**
     * 扩展属性-预约查询开始时间
     */
    @JsonFormat(pattern = DateUtil.DATE_FORMAT_MM, timezone = "GMT+8")
    @DateTimeFormat(pattern = DateUtil.DATE_FORMAT_MM)
    private Date beginTime;
    /**
     * 扩展属性-预约查询结束时间
     */
    @JsonFormat(pattern = DateUtil.DATE_FORMAT_MM, timezone = "GMT+8")
    @DateTimeFormat(pattern = DateUtil.DATE_FORMAT_MM)
    private Date closureTime;
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;
@@ -44,14 +46,16 @@
    /**
     * 有效期
     */
    @JsonFormat(pattern = DateUtil.DATE_FORMAT_DD, timezone = "GMT+8")
    @DateTimeFormat(pattern = DateUtil.DATE_FORMAT_DD)
    private Date failTime;
    private Date targetFailTime;
    /**
     * 套餐id
     */
    private Long taocanId;
    /**
     * 订单明细id 不明确
@@ -115,10 +119,73 @@
    private String isCourse;
    /**
     * 任选套餐 是否无限次 Y-是 N-否
     */
    private String isInfinite;
    /**
     * 单次划扣次数
     */
    private Integer deductionNum;
    private Integer timeLength;
    private String img;
    private String queryKey;
    @Extend
    private String updateRemark;
    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;
    }
    public void setIsInfinite(String isInfinite) {
        this.isInfinite = isInfinite;
    }
    public String getIsCourse() {
        return isCourse;
    }
zq-erp/src/main/java/com/matrix/system/hive/bean/SysProjUseFlow.java
New file
@@ -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;
    }
}
zq-erp/src/main/java/com/matrix/system/hive/bean/SysSkinCheckRecord.java
@@ -3,6 +3,8 @@
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 org.springframework.format.annotation.DateTimeFormat;
import java.util.Date;
import java.util.List;
@@ -55,7 +57,14 @@
    private Date checkTime;
    private String checkTimeStr;
    @DateTimeFormat(pattern = DateUtil.DATE_FORMAT_DD)
    @JsonFormat(pattern = "yyyy-MM-dd", timezone="GMT+8")
    private Date beginTime;
    @DateTimeFormat(pattern = DateUtil.DATE_FORMAT_DD)
    @JsonFormat(pattern = "yyyy-MM-dd", timezone="GMT+8")
    private Date endTime;
    /**
     * 扩展字段
     */
@@ -89,11 +98,38 @@
    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;
    }
    public void setBeginTime(Date beginTime) {
        this.beginTime = beginTime;
    }
    public Date getEndTime() {
        return endTime;
    }
    public void setEndTime(Date endTime) {
        this.endTime = endTime;
    }
    public List<SysSkinDetail> getAnalysisDetail() {
        return analysisDetail;
    }
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;
    }
zq-erp/src/main/java/com/matrix/system/hive/bean/SysVipAlbum.java
New file
@@ -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;
    }
}
zq-erp/src/main/java/com/matrix/system/hive/bean/SysVipInfo.java
@@ -1,5 +1,6 @@
package com.matrix.system.hive.bean;
import com.fasterxml.jackson.annotation.JsonFormat;
import com.matrix.core.tools.DateUtil;
import com.matrix.system.hive.plugin.util.ExcelAnnotation;
import org.springframework.format.annotation.DateTimeFormat;
@@ -91,8 +92,11 @@
    /**
     * 生日
     */
    @JsonFormat(pattern = DateUtil.DATE_FORMAT_MM, timezone = "GMT+8")
    @DateTimeFormat(pattern = DateUtil.DATE_FORMAT_DD)
    private Date birthday1;
    private String age;
 
    /**
     * 地址
@@ -139,6 +143,7 @@
    /**
     * 注册时间
     */
    @JsonFormat(pattern = DateUtil.DATE_FORMAT_MM, timezone = "GMT+8")
    private Date createTime;
    /**
     * 备注
@@ -185,6 +190,26 @@
    private Long companyId;
    /**
     * 省
     */
    private String province;
    /**
     * 市
     */
    private String city;
    /**
     * 区
     */
    private String area;
    /**
     * 推荐人
     */
    private Long recommendId;
    //血型
    private String blood;
@@ -203,6 +228,47 @@
    
    private Date createDistributionTime;
    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;
    }
    public void setSysOrder(SysOrder sysOrder) {
        this.sysOrder = sysOrder;
    }
    public Integer getIsDeal() {
        return isDeal;
@@ -349,6 +415,27 @@
     */
    List<VipAnswer> vipAnswers;
    /**
     * 会员标签
     */
    List<SysVipLabel> labels;
    public List<SysVipLabel> getLabels() {
        return labels;
    }
    public void setLabels(List<SysVipLabel> labels) {
        this.labels = labels;
    }
    public String getAge() {
        return age;
    }
    public void setAge(String age) {
        this.age = age;
    }
    public Long getCompanyId() {
        return companyId;
    }
zq-erp/src/main/java/com/matrix/system/hive/bean/SysVipLabel.java
New file
@@ -0,0 +1,112 @@
package com.matrix.system.hive.bean;
import java.io.Serializable;
import java.util.Date;
/**
 * @author wzy
 * @date 2020-12-17
 **/
public class SysVipLabel implements Serializable {
    /**
     * 创建时间
     */
    private Date createTime;
    /**
     * 创建人
     */
    private String createBy;
    /**
     * 主键ID
     */
    private Long id;
    /**
     * 标签内容
     */
    private String label;
    private Long shopId;
    private Long companyId;
    private Long userId;
    private Integer isAll;
    private String color;
    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;
    }
    public void setCreateTime(Date createTime) {
        this.createTime = createTime;
    }
    public String getCreateBy() {
        return createBy;
    }
    public void setCreateBy(String createBy) {
        this.createBy = createBy;
    }
    public Long getId() {
        return id;
    }
    public void setId(Long id) {
        this.id = id;
    }
    public String getLabel() {
        return label;
    }
    public void setLabel(String label) {
        this.label = label;
    }
}
zq-erp/src/main/java/com/matrix/system/hive/bean/SysVipLabelRelate.java
New file
@@ -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;
    }
}
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;
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;
@@ -52,6 +56,21 @@
    public List<AchieveNew> findSumDailyInfoNew(@Param("record") AchieveNew achieveNew, @Param("pageVo") PaginationVO pageVo);
    
    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);
}
zq-erp/src/main/java/com/matrix/system/hive/dao/ArticleDao.java
@@ -31,5 +31,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);
}
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);
}
zq-erp/src/main/java/com/matrix/system/hive/dao/MoneyCardUseDao.java
@@ -84,5 +84,6 @@
    public Double  selectVipCardTotalMoney(@Param("vipId") Long vipId);
    List<MoneyCardUse> selectHasValidMoneyCardUse();
    
}
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);
}
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);
}
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);
}
zq-erp/src/main/java/com/matrix/system/hive/dao/SysBeauticianStateDao.java
@@ -2,6 +2,7 @@
import com.matrix.core.pojo.PaginationVO;
import com.matrix.system.hive.bean.SysBeauticianState;
import com.matrix.system.hive.bean.SysProjUse;
import org.apache.ibatis.annotations.Param;
import java.util.Date;
@@ -73,5 +74,8 @@
    public int  summaryItemDetailTotal(Map<String,Object> obj);
    List<SysBeauticianState> selectByProjUse(@Param("list") List<SysProjUse> list, @Param("state") String state);
    List<SysBeauticianState> selectBeauticianStateByPuseIdAndNoStatus(@Param("puseId") Long puseId, @Param("state") String state);
}
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);
}
zq-erp/src/main/java/com/matrix/system/hive/dao/SysFollowupCommentDao.java
New file
@@ -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);
}
zq-erp/src/main/java/com/matrix/system/hive/dao/SysFollowupDao.java
New file
@@ -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);
}
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;
@@ -33,5 +38,20 @@
    public int selectInPageCount(@Param("record") SysOrder sysOrder);
    public void updateOrderTime(@Param("orderTime") 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);
}
zq-erp/src/main/java/com/matrix/system/hive/dao/SysOrderFlowDao.java
New file
@@ -0,0 +1,15 @@
package com.matrix.system.hive.dao;
import com.matrix.system.hive.bean.SysOrderFlow;
import org.apache.ibatis.annotations.Param;
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);
}
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);
}
zq-erp/src/main/java/com/matrix/system/hive/dao/SysProjServicesDao.java
@@ -1,6 +1,11 @@
package com.matrix.system.hive.dao;
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.ErpOrderDetailItemVo;
import com.matrix.system.shopXcx.api.vo.ErpServiceOrderListVo;
import org.apache.ibatis.annotations.Param;
import com.matrix.core.pojo.PaginationVO;
@@ -35,6 +40,24 @@
    public SysProjServices  selectById(Long id);
    public void updateOrderTime(@Param("createTime") 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);
}
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);
    
@@ -122,4 +126,10 @@
    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);
}
zq-erp/src/main/java/com/matrix/system/hive/dao/SysVipAlbumDao.java
New file
@@ -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);
}
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;
@@ -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);
}
zq-erp/src/main/java/com/matrix/system/hive/dao/SysVipLabelDao.java
New file
@@ -0,0 +1,24 @@
package com.matrix.system.hive.dao;
import com.matrix.system.hive.bean.SysVipLabel;
import com.matrix.system.hive.bean.SysVipLabelRelate;
import org.apache.ibatis.annotations.Param;
import java.util.List;
public interface SysVipLabelDao {
    int insert(SysVipLabel sysVipLabel);
    int insertRelate(SysVipLabelRelate sysVipLabelRelate);
    int update(SysVipLabel sysVipLabel);
    int deleteById(@Param("id") Long id);
    List<SysVipLabel> selectByVipId(@Param("vipId") Long vipId);
    List<SysVipLabel> selectByModel(@Param("record") SysVipLabel sysVipLabel);
    int deleteRelateByVipId(@Param("vipId") Long vipId);
}
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);
    }
  
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;
    }
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;
zq-erp/src/main/java/com/matrix/system/hive/pojo/StoreInOutRecordVO.java
@@ -84,6 +84,15 @@
    private Long goodsSortId;
    private Long id;
    public Long getId() {
        return id;
    }
    public void setId(Long id) {
        this.id = id;
    }
    public Date getCreateTime() {
        return createTime;
zq-erp/src/main/java/com/matrix/system/hive/service/AchieveNewService.java
@@ -2,6 +2,7 @@
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;
@@ -108,5 +109,12 @@
    public void modifyAchieveTime(AchieveNew achieveNew);
    List<AchieveNew> findVipConsumeStatisticsList(AchieveNew achieveNew, PaginationVO pageVo);
    int findVipConsumeStatisticsTotal(AchieveNew achieveNew);
    public UserAchieveVo findUserAchieveByTime(int type);
    public List<AchieveNew> findOrderItemAchieve(Long orderid);
}
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);
       
  
zq-erp/src/main/java/com/matrix/system/hive/service/CodeService.java
@@ -24,6 +24,8 @@
    * @throws
     */
    public String getOrderCode();
    public String getFlowCode();
    
    /**
    *  根据一定的规则返回一个随机编号。
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);
  
}
zq-erp/src/main/java/com/matrix/system/hive/service/ShoppingGoodsService.java
@@ -1,9 +1,13 @@
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;
import java.util.Date;
import java.util.List;
/**
 *
@@ -98,4 +102,12 @@
    public List<ShoppingGoods> findAll(ShoppingGoods shoppingGoods);
    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);
}
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);
  
}
zq-erp/src/main/java/com/matrix/system/hive/service/SysOrderFlowService.java
New file
@@ -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);
}
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);
}
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
@@ -126,4 +131,15 @@
     * @return
     */
    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);
}
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);
}
zq-erp/src/main/java/com/matrix/system/hive/service/SysVipInfoService.java
@@ -1,12 +1,19 @@
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.SysVipInfo;
import com.matrix.system.hive.plugin.util.BaseServices;
import com.matrix.system.hive.pojo.VipInfoVo;
import java.io.File;
import java.io.IOException;
import java.io.UnsupportedEncodingException;
import java.security.NoSuchAlgorithmException;
import java.util.List;
/**
@@ -180,4 +187,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);
}
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.
@@ -184,6 +186,7 @@
            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 +226,6 @@
                            achieveNewList.add(achieveNew);
                        }
                    }
                } else {
                    // 如果该订单明细没有设置美疗师则单独设置顾问业绩
                    AchieveNew achieveNew = new AchieveNew();
                    // 顾问业绩等于收款金额
                    achieveNew.setT1(orderItem.getPayMoney() + "");
                    buildAchieve(pageOrder, orderItem, achieveNew);
                    // 新增顾问业绩
                    achieveNewList.add(achieveNew);
                }
            }
        }
@@ -243,6 +238,12 @@
    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());
@@ -257,29 +258,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()));
        }
@@ -308,5 +295,54 @@
        achieveNewDao.updateAchieveTime(achieveNew);
    }
    @Override
    public List<AchieveNew> findVipConsumeStatisticsList(AchieveNew achieveNew, PaginationVO pageVo) {
        return achieveNewDao.selectVipConsumeStatisticsList(achieveNew, pageVo);
    }
    @Override
    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);
    }
}
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);
    }
}
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();
    }
}
zq-erp/src/main/java/com/matrix/system/hive/service/imp/DataAnalysisCustomerServiceImpl.java
New file
@@ -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;
    }
}
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);
    }
}
zq-erp/src/main/java/com/matrix/system/hive/service/imp/ShoppingGoodsServiceImpl.java
@@ -3,17 +3,18 @@
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.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;
@@ -25,7 +26,10 @@
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
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;
import java.util.List;
@@ -88,12 +92,15 @@
        shoppingGoods.setCreateTime(new Date());
        setPublicAttr(shoppingGoods);
        setShoppingGoodsInvalidTime(shoppingGoods);
        if (shoppingGoods.getReferencePice() == null) {
            //赠送金额
            shoppingGoods.setReferencePice(0D);
        }
        // 验证套餐卡卡必须填写最大使用次数
        if (Dictionary.FLAG_YES_Y.equals(shoppingGoods.getIsCourse())) {
        if (Dictionary.FLAG_YES_Y.equals(shoppingGoods.getIsCourse()) && Dictionary.FLAG_NO_N.equals(shoppingGoods.getIsInfinite())) {
            if (shoppingGoods.getCarUseCount() == null) {
                shoppingGoods.setCarUseCount(0);
            }
@@ -116,6 +123,36 @@
        return i;
    }
    private void setShoppingGoodsInvalidTime(ShoppingGoods shoppingGoods) {
        // 若未设置购买有效期和消耗有效期,则默认永久有效
//        if (shoppingGoods.getBuyDateNum() == null && shoppingGoods.getUseDateNum() == null) {
//            shoppingGoods.setInvalidTime(DateUtil.stringToDate("9999-12-31", DateUtil.DATE_FORMAT_DD));
//        } else {
//            // 计算失效日期,判断购买有效期和消耗有效期哪个先失效,则为失效日期
//            Date buyValidDate = DateUtil.calDate(shoppingGoods.getBuyDateNum(), shoppingGoods.getBuyDateUnit());
//            Date useValidDate = DateUtil.calDate(shoppingGoods.getUseDateNum(), shoppingGoods.getUseDateUnit());
//            if (buyValidDate.after(useValidDate)) {
//                shoppingGoods.setInvalidTime(useValidDate);
//            } else {
//                shoppingGoods.setInvalidTime(buyValidDate);
//            }
//            shoppingGoods.setBuyValid(shoppingGoods.getBuyDateNum() + shoppingGoods.getBuyDateUnit());
//            shoppingGoods.setUseValid(shoppingGoods.getUseDateNum() + shoppingGoods.getUseDateUnit());
//        }
        if (shoppingGoods.getBuyDateNum() != null && StringUtils.isNotBlank(shoppingGoods.getBuyDateUnit())) {
            shoppingGoods.setBuyValid(shoppingGoods.getBuyDateNum() + shoppingGoods.getBuyDateUnit());
        } else {
            shoppingGoods.setBuyValid(null);
        }
        if (shoppingGoods.getUseDateNum() != null && StringUtils.isNotBlank(shoppingGoods.getUseDateUnit())) {
            shoppingGoods.setUseValid(shoppingGoods.getUseDateNum() + shoppingGoods.getUseDateUnit());
        } else {
            shoppingGoods.setUseValid(null);
        }
    }
    private void setGoodsAssembles(ShoppingGoods shoppingGoods) {
@@ -190,7 +227,7 @@
            }
        }
        setShoppingGoodsInvalidTime(shoppingGoods);
        return shoppingGoodsDao.update(shoppingGoods);
@@ -386,4 +423,116 @@
        return shoppingGoodsDao.selectByModelData(shoppingGoods);
    }
    /**
     * 计算失效时间
     *
     * @param shoppingGoods
     * @param type 1 - 购买时  2 - 消耗时
     * @param buyDate 购买日期, 当计算消耗日期时,不能为空
     * @return
     */
    @Override
    public Date calInvalidTime(ShoppingGoods shoppingGoods, @NotNull Integer type, Date buyDate) {
        if (StringUtils.isBlank(shoppingGoods.getBuyValid()) && StringUtils.isBlank(shoppingGoods.getUseValid()) && shoppingGoods.getInvalidTime() == null) {
            return DateUtil.stringToDate("9999-12-31", DateUtil.DATE_FORMAT_DD);
        }
        if (type == 2 && shoppingGoods.getUseDateNum() == null && StringUtils.isNotBlank(shoppingGoods.getBuyDateUnit())) {
            return DateUtil.stringToDate("9999-12-31", DateUtil.DATE_FORMAT_DD);
        }
        if (type == 2 && buyDate == null) {
            throw new GlobleException("购买日期不能为空");
        }
        Date target = null;
        Date buyValidDate = null;
        if (type == 1) {
            buyValidDate = DateUtil.calDate(shoppingGoods.getBuyDateNum(), shoppingGoods.getBuyDateUnit());
        } else {
            buyValidDate = buyDate;
        }
        Date useValidDate = DateUtil.stringToDate("9999-12-31", DateUtil.DATE_FORMAT_DD);
        if (type == 2) {
            useValidDate = DateUtil.calDate(shoppingGoods.getUseDateNum(), shoppingGoods.getUseDateUnit());
        }
        if (buyValidDate.after(useValidDate)) {
            target = useValidDate;
        } else {
            target = buyValidDate;
        }
        if (shoppingGoods.getInvalidTime() != null) {
            if (target.after(shoppingGoods.getInvalidTime())) {
                target = shoppingGoods.getInvalidTime();
            }
        }
        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.getGoodsNo());
        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;
    }
}
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);
    }
}
zq-erp/src/main/java/com/matrix/system/hive/service/imp/SysInstoreInfoServiceImpl.java
@@ -69,9 +69,10 @@
        Long id = sysInstoreInfo.getId();
        SysInstoreInfo getInstoreInfo = sysInstoreInfoDao.selectById(id);
        // 已经审核过的单据不能在修改
        if (!getInstoreInfo.getCheckStatus().equals(Dictionary.CHECK_STATUS_DSH)) {
        if (!getInstoreInfo.getCheckStatus().equals(Dictionary.CHECK_STATUS_DSH) && !getInstoreInfo.getCheckStatus().equals(Dictionary.CHECK_STATUS_SHWTG)) {
            throw new GlobleException("已审核,不能再修改");
        }
        sysInstoreInfo.setCheckStatus(Dictionary.CHECK_STATUS_DSH);
        // 设置总金额
        sysInstoreInfo.setSumall(savevDetatil(sysInstoreInfo));
        return sysInstoreInfoDao.update(sysInstoreInfo);
zq-erp/src/main/java/com/matrix/system/hive/service/imp/SysOrderFlowServiceImpl.java
New file
@@ -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);
    }
}
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);
    }
}
zq-erp/src/main/java/com/matrix/system/hive/service/imp/SysOrderServiceImpl.java
@@ -6,6 +6,12 @@
import com.matrix.core.tools.LogUtil;
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;
@@ -20,15 +26,14 @@
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.SysOrderService;
import com.matrix.system.hive.service.*;
import org.springframework.beans.BeanUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
import javax.servlet.http.HttpSession;
import javax.validation.constraints.NotEmpty;
import java.util.*;
/**
@@ -79,7 +84,29 @@
    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;
    @Override
    public int add(SysOrder sysOrder) {
@@ -139,24 +166,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());
@@ -164,44 +198,17 @@
                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);
            }
            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.setCompanyId(user.getCompanyId());
        sysOrder.setStatu(orderStatus);
        sysOrder.setStaffId(source != null ? source.getStaffId() : user.getSuId());
        sysOrder.setCompanyId(source != null ? source.getCompanyId() : user.getCompanyId());
        sysOrder.setPayTime(new Date());
        if(sysOrder.getId()==null){
@@ -218,7 +225,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;
@@ -351,7 +367,7 @@
            throw new GlobleException("没用选择购买产品");
        }
        // 获取会员信息,判断等级 获取相应家居折扣
        SysVipInfo info = (SysVipInfo) WebUtil.getSession().getAttribute(SystemConstance.CURRENT_CUSTOMER);
        SysVipInfo info = sysVipInfoDao.selectById(car.getVipId());
        //获取折扣-----
        Double zk = zk = 1.0;
@@ -371,6 +387,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) {
@@ -420,7 +437,6 @@
        // 设置订单总价与折后价
        order.setTotal(total);
        order.setZkTotal(zkTotal);
        order.setArrears(zkTotal);
        sysOrderDao.update(order);
        return i;
    }
@@ -484,44 +500,60 @@
     * @author:姜友瑶
     */
    private void changeOrderStatu(SysOrder sourceOrder) {
        int i = 1;
        String orderStatus = Dictionary.ORDER_STATU_YFK;
        String flowType = SysOrderFlow.FLOW_TYPE_BUY;
        double cashPayTotal = 0D;
        double cardPayTotal = 0D;
        for (SysOrderFlow flow : sourceOrder.getFlows()) {
            flow.setFlowNo(codeService.getFlowCode() + "-" + i);
            Long goodsId = sourceOrder.getItems().get(0).getGoodsId();
            ShoppingGoods goods = shoppingGoodsDao.selectById(goodsId);
            flow.setFlowContent(goods.getName() + "等" + sourceOrder.getItems().size() + "件产品");
      boolean haQk=false;
        for(SysOrderItem sysOrderItem:sourceOrder.getItems()){
            if(!sysOrderItem.getStatus().equals(Dictionary.ORDER_STATU_QK)){
                SysOrderItem updateItem=new SysOrderItem();
                updateItem.setId(sysOrderItem.getId());
                updateItem.setStatus(Dictionary.ORDER_STATU_YFK);
                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);
            flow.setVipId(sourceOrder.getVipId());
            flow.setFlowType(flowType);
            // 若使用储值卡付款
            if (SysOrderFlow.PAY_METHOD_CARD.equals(flow.getPayMethod())) {
                if (flow.getCardId() != null) {
                    MoneyCardUse moneyCardUse = moneyCardUseDao.selectById(flow.getCardId());
                    cardPaySk(moneyCardUse, sourceOrder, flow);
                    cardPayTotal += flow.getAmount().doubleValue();
                }
            }
            if (SysOrderFlow.PAY_METHOD_ARREARS.equals(flow.getPayMethod())) {
                orderStatus = Dictionary.ORDER_STATU_QK;
                sourceOrder.setArrears(flow.getAmount().doubleValue());
            }
            if (!SysOrderFlow.PAY_METHOD_ARREARS.equals(flow.getPayMethod()) && !SysOrderFlow.PAY_METHOD_CARD.equals(flow.getPayMethod())) {
                cashPayTotal += flow.getAmount().doubleValue();
            }
            flow.setShopId(sourceOrder.getShopId());
            flow.setCompanyId(sourceOrder.getCompanyId());
            sysOrderFlowDao.insert(flow);
            i++;
        }
        if (Dictionary.ORDER_STATU_TK.equals(sourceOrder.getStatu())) {
            orderStatus = Dictionary.ORDER_STATU_TK;
        }
        // 更新收款状态
        sourceOrder.setStatu(orderStatus);
        sourceOrder.setCardPay(cardPayTotal);
        sourceOrder.setCashPay(cashPayTotal);
        sysOrderDao.update(sourceOrder);
    }
@@ -541,8 +573,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,59 +591,50 @@
     * 使用充值卡付款操作
     *
     * @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() + "余额不足");
            }
        }
        //设置卡项使用流水
        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);
        // 达到使用次数后自动清空余额
        if (!moneyCardUse.getIsVipCar().equals(Dictionary.FLAG_YES_Y)
@@ -624,6 +646,12 @@
        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());
        if (shoppingGoods != null) {
            Date invalidTime = shoppingGoodsService.calInvalidTime(shoppingGoods, 2, moneyCardUse.getFailTime());
            moneyCardUse.setFailTime(invalidTime);
        }
        // 更新充值卡信息
        moneyCardUseDao.update(moneyCardUse);
@@ -699,48 +727,46 @@
            // 如果购买的是充值卡
            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);
                    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 {
                        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());
                    Date invalidTime = shoppingGoodsService.calInvalidTime(sysOrderItem.getShoppingGoods(), 1, null);
                    moneyCardUse.setFailTime(invalidTime);
                    moneyCardUseDao.insert(moneyCardUse);
                }
                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()));
                }
                moneyCardUseDao.insert(moneyCardUse);
            }
        }
    }
@@ -752,66 +778,56 @@
    @Transactional(rollbackFor = Exception.class)
    @Override
    public void updateAfterMoney(SysOrder pageOrder) {
        SysOrder sourceOrder = sysOrderDao.selectById(pageOrder.getId());
        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() + "件产品");
            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();
            }
            refundTotal += flow.getAmount().doubleValue();
            flow.setShopId(sourceOrder.getShopId());
            flow.setCompanyId(sourceOrder.getCompanyId());
            sysOrderFlowDao.insert(flow);
            i++;
        }
        boolean haQk=false;
        double cardPayTotal=0D;
        double carshPayTotal=0D;
        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);
        if (refundTotal == pageOrder.getArrears()) {
            haQk = true;
        }
        //更新收款状态
        if(haQk){
            sourceOrder.setStatu(Dictionary.ORDER_STATU_QK);
        }else{
            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);
    }
@@ -954,7 +970,6 @@
    }
    public void addZongheCarUse(SysOrder order, SysOrderItem sysOrderItem) {
@@ -1046,16 +1061,16 @@
        taocanProjUse.setStatus(Dictionary.TAOCAN_STATUS_YX);
        taocanProjUse.setType(Dictionary.SHOPPING_GOODS_TYPE_TC);
        taocanProjUse.setIsCourse(taocanShoppingGoods.getIsCourse());
        taocanProjUse.setIsInfinite(taocanShoppingGoods.getIsInfinite());
        // 赠送和打折后金额为0的都视为赠送项目
        if (sysOrderItem.getIsFree().equals(Dictionary.FLAG_NO) && sysOrderItem.getZkPrice() > 0) {
            taocanProjUse.setSource(Dictionary.TAOCAN_SOURCE_GM);
        } else {
            taocanProjUse.setSource(Dictionary.TAOCAN_SOURCE_ZS);
        }
        // TODO 设置失效时间
        Calendar cal = Calendar.getInstance();
        cal.set(2200, 1, 1);
        taocanProjUse.setFailTime(cal.getTime());
        // 失效时间
        Date invalidTime = shoppingGoodsService.calInvalidTime(taocanShoppingGoods, 1, null);
        taocanProjUse.setFailTime(invalidTime);
        sysProjUseDao.insert(taocanProjUse);
        //计划次数
        int surplusCount=0;
@@ -1105,9 +1120,8 @@
            puse.setSource(Dictionary.TAOCAN_SOURCE_ZS);
        }
        // 设置失效时间
        Calendar cal = Calendar.getInstance();
        cal.set(2300, 1, 1);
        puse.setFailTime(cal.getTime());
        Date invalidTime = shoppingGoodsService.calInvalidTime(sysOrderItem.getShoppingGoods(), 1, null);
        puse.setFailTime(invalidTime);
        sysProjUseDao.insert(puse);
    }
@@ -1121,11 +1135,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);
@@ -1156,6 +1170,7 @@
        order.setStaffId(user.getSuId());
        order.setIsCross(2 + "");
        order.setStatu(Dictionary.ORDER_STATU_YFK);
        order.setCompanyId(user.getCompanyId());
        sysOrderDao.insert(order);
        SysOrderItem orderItem = new SysOrderItem();
@@ -1175,6 +1190,9 @@
        orderItem.setStatus(Dictionary.ORDER_STATU_YFK);
        orderItem.setAchaeveList(czVo.getAchaeveList());
        orderItemDao.insert(orderItem);
        List<SysOrderItem> items = new ArrayList<>();
        items.add(orderItem);
        order.setItems(items);
        //设置卡项使用流水
@@ -1190,7 +1208,8 @@
        moneyCardUseFlow.setBalance(cardUser.getGiftMoney()+cardUser.getRealMoney());
        moneyCardUseFlowDao.insert(moneyCardUseFlow);
        order.setFlows(czVo.getFlows());
        changeOrderStatu(order);
        // 添加员工业绩
        achieveNewService.addAchaeveByOrder(order);
        return order;
@@ -1198,6 +1217,187 @@
    }
    @Override
    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);
    }
}
zq-erp/src/main/java/com/matrix/system/hive/service/imp/SysProjServicesServiceImpl.java
@@ -1,12 +1,14 @@
package com.matrix.system.hive.service.imp;
import com.alibaba.fastjson.JSONObject;
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.DateUtil;
import com.matrix.core.tools.LogUtil;
import com.matrix.core.tools.WebUtil;
import com.matrix.core.tools.*;
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;
@@ -16,16 +18,17 @@
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;
import javax.annotation.Resource;
import java.util.ArrayList;
import java.util.Date;
import java.util.List;
import java.util.*;
import java.util.stream.Collectors;
/**
@@ -97,6 +100,15 @@
    private SysOrderService sysOrderService;
    @Autowired
    WarehouseDao warehouseDao;
    @Resource
    private ShoppingGoodsService shoppingGoodsService;
    @Autowired
    private RabiitMqTemplate rabiitMqTemplate;
    @Value("${evn}")
    private String evn;
    /**
     * 新增服务单 jyy
@@ -108,17 +120,18 @@
    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);
        // 计算项目总时长
        int totalTime = 0;
        //处理订单明细
@@ -144,6 +157,14 @@
            //本次消费金额
            Double bcxfje = MoneyUtil.mul(sysProjUse.getPrice(), Double.valueOf(sysBeauticianState.getCount()));
            upProjUse.setBalance(MoneyUtil.sub(sysProjUse.getBalance(), bcxfje));
            // 判断是否第一次使用该项目, 若是则根据商品消耗有效期更新到期时间
            List<SysBeauticianState> sysBeauticianStates = beauticianStateDao.selectBeauticianStateByPuseIdAndNoStatus(sysBeauticianState.getPuseId(), Dictionary.SERVICE_STATU_YYQX);
            if (CollectionUtils.isEmpty(sysBeauticianStates)) {
                Date useInvalidTime = shoppingGoodsService.calInvalidTime(sysProjInfo, 2, sysProjUse.getFailTime());
                upProjUse.setFailTime(useInvalidTime);
            }
            //更新余次信息
            sysProjUseDao.updateSurplusCount(upProjUse);
            //如果项目是套餐 中项目则判断套餐是否失效
@@ -159,13 +180,28 @@
                    taocan.setSurplusCount(0);
                    taocan.setStatus(Dictionary.TAOCAN_STATUS_WX);
                } else if (Dictionary.FLAG_YES_Y.equals(taocan.getIsCourse())) {
                    //任选套餐检查套餐整体剩余次数
                    int tcSurplusCount = taocan.getSurplusCount() - sysProjUse.getDeductionNum();
                    if (tcSurplusCount < 0) {
                        throw new GlobleException(taocan.getProjName() + "已经达到最大使用次数");
                    } else {
                        taocan.setSurplusCount(tcSurplusCount);
                    if (StringUtils.isBlank(taocan.getIsInfinite()) || Dictionary.FLAG_NO_N.equals(taocan.getIsInfinite())) {
                        //任选套餐检查套餐整体剩余次数
                        int tcSurplusCount = taocan.getSurplusCount() - sysBeauticianState.getCount();
                        if (tcSurplusCount < 0) {
                            throw new GlobleException(taocan.getProjName() + "已经达到最大使用次数");
                        } else {
                            taocan.setSurplusCount(tcSurplusCount);
                        }
                        if (tcSurplusCount == 0) {
                            taocan.setIsOver(Dictionary.FLAG_YES_Y);
                            taocan.setStatus(Dictionary.TAOCAN_STATUS_WX);
                        }
                    }
                }
                // 根据套餐内所有项目查询该套餐是否第一次使用,若第一次使用则更新该套餐有效期
                List<SysBeauticianState> taocanHas = beauticianStateDao.selectByProjUse(taocanProjUses, Dictionary.SERVICE_STATU_YYQX);
                if (CollectionUtils.isEmpty(taocanHas)) {
                    ShoppingGoods taocanInfo = shoppingGoodsDao.selectById(taocan.getProjId());
                    Date useInvalidTime = shoppingGoodsService.calInvalidTime(taocanInfo, 2, sysProjUse.getFailTime());
                    taocan.setFailTime(useInvalidTime);
                }
                sysProjUseDao.updateSurplusCount(taocan);
            }
@@ -176,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);
        }
@@ -364,7 +400,7 @@
        // 设置成功状态
        projServices.setState(Dictionary.SERVICE_STATU_YYCG);
        projServices.setState(Dictionary.SERVICE_STATU_XPL);
        // 判断当前门店是否有历史美疗师
        LastestWorkBeatuistaff lastWorkStaff = new LastestWorkBeatuistaff();
        lastWorkStaff.setShopId(checkProjServices.getShopId());
@@ -457,8 +493,14 @@
     */
    private void backProjCount(SysProjServices projServices) {
        List<SysBeauticianState> beauticianStateList = beauticianStateDao.selectBySerIds(projServices.getId());
        Map<Long ,List<SysProjUse>> taocanMap = new HashMap<>();
        // 回退项目余额
        for (SysBeauticianState beauticianState : beauticianStateList) {
            // 该修改为 有效日期判断更新所有
            beauticianState.setState(Dictionary.BEATUI_STATE_YYQX);
            beauticianStateDao.update(beauticianState);
            SysProjUse sysProjUse = sysProjUseDao.selectById(beauticianState.getPuseId());
            if (sysProjUse != null && sysProjUse.getId() != null) {
                sysProjUse = sysProjUseDao.selectById(sysProjUse.getId());
@@ -471,12 +513,56 @@
                    upProjUse.setStatus(Dictionary.MONEYCARD_STATUS_YX);
                    if (sysProjUse.getTaocanId() != null) {
                        //TODO 更新套餐状态为有效
                        SysProjUse taocanProjUse = sysProjUseDao.selectById(sysProjUse.getTaocanId());
                        taocanProjUse.setIsOver(Dictionary.DELETED_N);
                        taocanProjUse.setStatus(Dictionary.MONEYCARD_STATUS_YX);
                        if (Dictionary.FLAG_YES_Y.equals(taocanProjUse.getIsCourse())) {
                            if (StringUtils.isBlank(taocanProjUse.getIsInfinite()) || Dictionary.FLAG_NO_N.equals(taocanProjUse.getIsInfinite())) {
                                taocanProjUse.setSurplusCount(taocanProjUse.getSurplusCount() + beauticianState.getCount());
                            }
                        }
                        sysProjUseDao.update(taocanProjUse);
                    }
                }
                int surplus = sysProjUse.getSurplusCount() + beauticianState.getCount();
                upProjUse.setSurplusCount(surplus);
                upProjUse.setBalance(MoneyUtil.add(sysProjUse.getBalance(), sysProjUse.getPrice()));
                // 取消时,判断该项目之前是否有使用过,若使用过则非第一次使用,则不更新有效日期,若未使用表明此次为第一次使用,则更新有效日期为购买日期或统一失效日期
                List<SysBeauticianState> hasBeautician = beauticianStateDao.selectBeauticianStateByPuseIdAndNoStatus(beauticianState.getPuseId(), Dictionary.BEATUI_STATE_YYQX);
                if (hasBeautician.isEmpty()) {
                    ShoppingGoods shoppingGoods = shoppingGoodsDao.selectById(beauticianState.getProjId());
                    Date useInvalidTime = shoppingGoodsService.calInvalidTime(shoppingGoods, 1, null);
                    upProjUse.setFailTime(useInvalidTime);
                }
                if (sysProjUse.getTaocanId() != null) {
                    List<SysProjUse> sysProjUses = taocanMap.get(sysProjUse.getTaocanId());
                    if (CollectionUtils.isEmpty(sysProjUses)) {
                        List<SysProjUse> taocanItems = new ArrayList<>();
                        taocanItems.add(sysProjUse);
                        taocanMap.put(sysProjUse.getTaocanId(), taocanItems);
                    } else {
                        sysProjUses.add(sysProjUse);
                        taocanMap.put(sysProjUse.getTaocanId(), sysProjUses);
                    }
                }
                sysProjUseDao.updateSurplusCount(upProjUse);
            }
        }
        if (taocanMap.size() != 0) {
            for (Map.Entry<Long, List<SysProjUse>> entry : taocanMap.entrySet()) {
                List<SysBeauticianState> taocanUse = beauticianStateDao.selectByProjUse(entry.getValue(), Dictionary.BEATUI_STATE_YYQX);
                if (CollectionUtils.isEmpty(taocanUse)) {
                    SysProjUse taocan = sysProjUseDao.selectById(entry.getKey());
                    ShoppingGoods shoppingGoods = shoppingGoodsDao.selectById(taocan.getProjId());
                    Date buyInvalidDate = shoppingGoodsService.calInvalidTime(shoppingGoods, 1, null);
                    taocan.setFailTime(buyInvalidDate);
                    sysProjUseDao.update(taocan);
                }
            }
        }
    }
@@ -489,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;
        }
    }
@@ -733,4 +826,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);
    }
}
zq-erp/src/main/java/com/matrix/system/hive/service/imp/SysProjUseServiceImpl.java
@@ -19,6 +19,7 @@
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;
@@ -62,6 +63,9 @@
    @Override
    public int modify(SysProjUse sysProjUse) {
        //插入套餐项目操作记录
        return sysProjUseDao.update(sysProjUse);
@@ -198,24 +202,37 @@
    @Override
    public AjaxResult activeTc(SysProjUse proj) {
        Date newDate = proj.getFailTime();
        Date today = new Date();
        SysProjUse taocan = sysProjUseDao.selectById(proj.getId());
        switch (taocan.getStatus()) {
            case Dictionary.TAOCAN_STATUS_WX:
                // 如果到期,需要重新设置有效期
                if (taocan.getFailTime().before(new Date())) {
                    taocan.setFailTime(DateUtil.getDateAfterMonth(new Date(),12));
                if (newDate != null && !newDate.equals("")) {
                    taocan.setFailTime(newDate);
                    if (newDate.before(today)) {
                        return new AjaxResult(AjaxResult.STATUS_FAIL, "有效期要大于当前日期");
                    }
                }
                if (newDate == null && (taocan.getFailTime() == null || taocan.getFailTime().before(today))) {
                    return new AjaxResult(AjaxResult.STATUS_SUCCESS, "已过期");
                }
                break;
            //TODO 如果是冻结状态则要算出冻结的天数,延长有效期
            case Dictionary.TAOCAN_STATUS_DJ:
                SysProjuseFreeze freeze = new SysProjuseFreeze();
                freeze.setOrderItemId(taocan.getId().toString());
                freeze.setVipId(taocan.getVipId());
                SysProjuseFreeze freezeProj = sysProjuseFreezeDao.selectByOrderItemId(freeze);
                Date dateAfter = DateUtil.nextNDate(taocan.getFailTime(), freezeProj.getGapDays());
                taocan.setFailTime(dateAfter);
                break;
            default:
                return new AjaxResult(AjaxResult.STATUS_FAIL, "请选择无效或者冻结的套餐");
        }
        taocan.setStatus(Dictionary.TAOCAN_STATUS_YX);
        sysProjUseDao.updateTcStatus(taocan.getId(),"有效");
        sysProjUseDao.updateProjStatus(taocan);
        return new AjaxResult(AjaxResult.STATUS_SUCCESS, "操作成功");
    }
@@ -590,6 +607,7 @@
    public AjaxResult activeProj(SysProjUse proj) {
        Date today = new Date();
        Date newDate = proj.getFailTime();
        proj = sysProjUseDao.selectById(proj.getId());
        switch (proj.getStatus()) {
            case Dictionary.TAOCAN_STATUS_WX:
@@ -600,13 +618,19 @@
                        return new AjaxResult(AjaxResult.STATUS_FAIL, "有效期要大于当前日期");
                    }
                }
                if (newDate == null && proj.getFailTime().before(today)) {
                if (newDate == null && (proj.getFailTime() == null || proj.getFailTime().before(today))) {
                    return new AjaxResult(AjaxResult.STATUS_SUCCESS, "已过期");
                }
                break;
            //如果是冻结状态则要算出冻结的天数,延长有效期
            case Dictionary.TAOCAN_STATUS_DJ:
                SysProjuseFreeze freeze = new SysProjuseFreeze();
                freeze.setOrderItemId(proj.getId().toString());
                freeze.setVipId(proj.getVipId());
                SysProjuseFreeze freezeProj = sysProjuseFreezeDao.selectByOrderItemId(freeze);
                Date dateAfter = DateUtil.nextNDate(proj.getFailTime(), freezeProj.getGapDays());
                proj.setFailTime(dateAfter);
                break;
            default:
                return new AjaxResult(AjaxResult.STATUS_FAIL, "请选择无效或者冻结的套餐");
zq-erp/src/main/java/com/matrix/system/hive/service/imp/SysVipInfoServiceImpl.java
@@ -6,18 +6,20 @@
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.PasswordUtil;
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;
@@ -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.*;
/**
@@ -56,6 +56,9 @@
    @Autowired
    private MoneyCardUseDao moneyCardUseDao;
    @Autowired
    private SysVipLabelDao sysVipLabelDao;
    /**
     * 新增会员储值卡
@@ -101,7 +104,7 @@
        sysVipInfo.setCompanyId(user.getCompanyId());
        sysVipInfo.setCreateTime(new Date());
        sysVipInfo.setPointAll(0);
        sysVipInfo.setIsDeal(SysVipInfo.DEAL_VIP);
        sysVipInfo.setIsDeal(SysVipInfo.UNDEAL_VIP);
        sysVipInfo.setZjm(StringUtils.toHanyuPinyin(sysVipInfo.getVipName())+","+StringUtils.toHeadWordHanyuPinyin(sysVipInfo.getVipName()));
        int i=sysVipInfoDao.insert(sysVipInfo);
        modifyVipWithOtherInfo(sysVipInfo);
@@ -417,5 +420,165 @@
        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 (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()));
        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 (!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;
    }
}
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,39 @@
        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("保存成功");
    }
}
zq-erp/src/main/java/com/matrix/system/hive/statistics/DailySaleVo.java
New file
@@ -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;
    }
}
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);
    }
}
zq-erp/src/main/java/com/matrix/system/hive/statistics/VipStatisticsAction.java
New file
@@ -0,0 +1,43 @@
package com.matrix.system.hive.statistics;
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.common.bean.SysUsers;
import com.matrix.system.common.constance.AppConstance;
import com.matrix.system.hive.bean.AchieveNew;
import com.matrix.system.hive.service.AchieveNewService;
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.HashMap;
import java.util.List;
/**
 * 客户数据统计
 *
 * @author wzy
 * @date 2020-12-18
 **/
@Controller
@RequestMapping(value = "/admin/vipStatistics")
public class VipStatisticsAction {
    @Autowired
    private AchieveNewService achieveNewService;
    @RequestMapping(value = "/vipConsumeStatistics")
    @ResponseBody
    public AjaxResult vipConsumeStatistics(AchieveNew achieveNew, PaginationVO pageVo) {
        SysUsers sysUsers = (SysUsers) WebUtil.getSession().getAttribute(MatrixConstance.LOGIN_KEY);
        if(!AppConstance.ZONGDIAN.equals(sysUsers.getShopName())){
            achieveNew.setShopId(sysUsers.getShopId());
        }
        List<AchieveNew> list = achieveNewService.findVipConsumeStatisticsList(achieveNew, pageVo);
        int total = achieveNewService.findVipConsumeStatisticsTotal(achieveNew);
        return AjaxResult.buildSuccessInstance(list, total);
    }
}
zq-erp/src/main/java/com/matrix/system/hiveErp/action/DataAnalysisCustomer.java
@@ -7,6 +7,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,6 +32,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;
    }
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);
}
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;
    }
}
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);
}
zq-erp/src/main/java/com/matrix/system/job/InvalidTimeJob.java
New file
@@ -0,0 +1,48 @@
package com.matrix.system.job;
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.dao.MoneyCardUseDao;
import com.matrix.system.hive.dao.SysProjUseDao;
import com.matrix.system.hive.plugin.util.CollectionUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.scheduling.annotation.Scheduled;
import org.springframework.stereotype.Component;
import java.util.List;
/**
 * @author wzy19
 */
@Component
public class InvalidTimeJob {
    @Autowired
    private SysProjUseDao sysProjUseDao;
    @Autowired
    private MoneyCardUseDao moneyCardUseDao;
    @Scheduled(cron = "0 0 0 * * ?")
    public void setProjUseToInvalid() {
        List<SysProjUse> sysProjUses = sysProjUseDao.selectHasValidProjUse();
        List<MoneyCardUse> moneyCardUses = moneyCardUseDao.selectHasValidMoneyCardUse();
        if (CollectionUtils.isNotEmpty(sysProjUses)) {
            sysProjUses.forEach(item -> {
                item.setStatus(Dictionary.MONEYCARD_STATUS_WX);
                sysProjUseDao.update(item);
            });
        }
        if (CollectionUtils.isNotEmpty(moneyCardUses)) {
            moneyCardUses.forEach(item -> {
                item.setStatus(Dictionary.MONEYCARD_STATUS_WX);
                moneyCardUseDao.update(item);
            });
        }
    }
}
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;
        }
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, "微信模板消息");
zq-erp/src/main/java/com/matrix/system/shopXcx/api/WeChatGzhApiTools.java
New file
@@ -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;
    }
}
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;
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报文
zq-erp/src/main/java/com/matrix/system/shopXcx/api/action/WxErpOrderAction.java
New file
@@ -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;
    }
}
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);
        }
zq-erp/src/main/java/com/matrix/system/shopXcx/api/action/YuyueAction.java
@@ -1,37 +1,48 @@
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.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.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.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.dao.SysUsersDao;
import com.matrix.system.common.interceptor.HostInterceptor;
import com.matrix.system.common.tools.DataAuthUtil;
import com.matrix.system.common.tools.LocationUtil;
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.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.ErpOrderDetailItemVo;
import com.matrix.system.shopXcx.api.vo.ErpServiceOrderListVo;
import com.matrix.system.shopXcx.bean.ShopProduct;
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 +63,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 +91,11 @@
    @Autowired
    RabiitMqTemplate rabiitMqTemplate;
    @Autowired
    SysProjUseDao projUseDao;
    @Autowired
    ShopSkuDao skuDao;
    @Autowired
    ShoppingGoodsAssembleDao shoppingGoodsAssembleDao;
@@ -194,48 +217,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());
                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 +272,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 +327,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 +371,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));
    }
}
zq-erp/src/main/java/com/matrix/system/shopXcx/api/dto/ErpOrderListDto.java
New file
@@ -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;
        }
    }
}
zq-erp/src/main/java/com/matrix/system/shopXcx/api/dto/ErpServiceCommentDto.java
New file
@@ -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;
    }
}
zq-erp/src/main/java/com/matrix/system/shopXcx/api/dto/ErpServiceOrderListDto.java
New file
@@ -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;
    }
}
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;
        }
zq-erp/src/main/java/com/matrix/system/shopXcx/api/vo/ErpOrderDetailFlowVo.java
New file
@@ -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;
    }
}
zq-erp/src/main/java/com/matrix/system/shopXcx/api/vo/ErpOrderDetailItemVo.java
New file
@@ -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;
    }
}
zq-erp/src/main/java/com/matrix/system/shopXcx/api/vo/ErpOrderDetailVo.java
New file
@@ -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;
    }
}
zq-erp/src/main/java/com/matrix/system/shopXcx/api/vo/ErpServiceOrderListProjVo.java
New file
@@ -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;
        }
    }
zq-erp/src/main/java/com/matrix/system/shopXcx/api/vo/ErpServiceOrderListVo.java
New file
@@ -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;
    }
}
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;
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);
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);
    
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";
    /**
     * 订单出库
     */
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);
    }
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);
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";
zq-erp/src/main/java/com/matrix/system/wechart/templateMsg/GzhTemplateMessagePojo.java
New file
@@ -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;
    }
}
zq-erp/src/main/java/com/matrix/system/wechart/templateMsg/Task/TemplateMessageBulder.java
New file
@@ -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);
}
zq-erp/src/main/java/com/matrix/system/wechart/templateMsg/Task/UniformMsgSentTask.java
New file
@@ -0,0 +1,120 @@
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;
                    //推送消息到微信
                    JSONObject result = HttpClientUtil.sendPostWithJson(url, JSONObject.toJSON(uniformMsgPojo).toString());
                    //微信返回值
                    LogUtil.debug("微信小程序模板消息推送结果:" + result.toString());
                }
            }
        } catch (Exception e) {
            LogUtil.error("消费者执行异常", e);
        }
    }
}
zq-erp/src/main/java/com/matrix/system/wechart/templateMsg/Task/messageBulderDemo/DefaultTemplateMessageBulder.java
New file
@@ -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;
    }
}
zq-erp/src/main/java/com/matrix/system/wechart/templateMsg/Task/messageBulderDemo/FwwcTemplateMessageBulder.java
New file
@@ -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;
    }
}
zq-erp/src/main/java/com/matrix/system/wechart/templateMsg/Task/messageBulderDemo/GmcgTemplateMessageBulder.java
New file
@@ -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;
    }
}
zq-erp/src/main/java/com/matrix/system/wechart/templateMsg/Task/messageBulderDemo/YycgTemplateMessageBulder.java
New file
@@ -0,0 +1,115 @@
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 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="";
        String staffName="";
        for (SysBeauticianState beauticianState:beauticianStateList){
            projectInfo+=beauticianState.getProjInfo().getName()+beauticianState.getCount()+"次,";
            staffName+=beauticianState.getBeautiStaffInfo().getSuName()+",";
        }
        projectInfo=projectInfo.substring(0,projectInfo.length()-1);
        staffName=staffName.substring(0,staffName.length()-1);
        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;
    }
}
zq-erp/src/main/java/com/matrix/system/wechart/templateMsg/UniformMsgParam.java
New file
@@ -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);
    }
}
zq-erp/src/main/java/com/matrix/system/wechart/templateMsg/UniformMsgPojo.java
New file
@@ -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;
    }
}
zq-erp/src/main/java/com/matrix/system/wechart/templateMsg/demo/MsgDemo.java
New file
@@ -0,0 +1,78 @@
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.shopXcx.bean.ShopAdvertisType;
import com.matrix.system.wechart.templateMsg.GzhTemplateMessagePojo;
import org.apache.commons.httpclient.HttpClient;
import org.apache.commons.httpclient.HttpException;
import org.apache.commons.httpclient.NameValuePair;
import org.apache.commons.httpclient.methods.PostMethod;
import org.dom4j.Document;
import org.dom4j.DocumentException;
import org.dom4j.DocumentHelper;
import org.dom4j.Element;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.ResponseBody;
import javax.swing.text.html.HTML;
import java.io.IOException;
@Controller
@RequestMapping(value = "test")
public class MsgDemo {
    @Value("${gzh_appid}")
    String gzhAppId;
    @Value("${gzh_secret}")
    String gzhSecret;
    @RequestMapping("/template")
    @ResponseBody
    public AjaxResult template() {
        GzhTemplateMessagePojo messagePojo=new GzhTemplateMessagePojo();
        messagePojo.setTouser("o8EB656NQYwhUuKPMhVVwP_wtLJI");
        messagePojo.setTemplate_id("Mqu9xPYj_JFhXNj7nLJS7LESQUy6Z7FoCOmVO66Oxe8");
        //messagePojo.setUrl("www.baidu.com");
       // messagePojo.setMiniprogram(gzhAppId,"/123/234123412");
        messagePojo.setFirst("尊敬的谭娅:","#453454");
        messagePojo.setKeyWord("活细胞肩部护理","#453454");
        messagePojo.setKeyWord("2014年7月21日 18:36","#453454");
        messagePojo.setRemark("您的护理课程剩余3次。","#453454");
        String ACCESS_TOKEN=WeChatGzhApiTools.getAccessToken(gzhAppId,gzhSecret);
        String url="https://api.weixin.qq.com/cgi-bin/message/template/send?access_token="+ACCESS_TOKEN;
        System.out.println(JSONObject.toJSON(messagePojo).toString());
        JSONObject result= HttpClientUtil.sendPostWithJson(url,JSONObject.toJSON(messagePojo).toString());
        System.out.println(result.toString());
        return AjaxResult.buildSuccessInstance("1");
    }
    @RequestMapping("/getUserList")
    @ResponseBody
    public AjaxResult getUserList() {
        String ACCESS_TOKEN=WeChatGzhApiTools.getAccessToken(gzhAppId,gzhSecret);
        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");
    }
}
zq-erp/src/main/java/com/matrix/system/wechart/templateMsg/demo/MsgDemo2.java
New file
@@ -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");
    }
}
zq-erp/src/main/java/com/matrix/system/wechart/templateMsg/demo/MsgDemo3.java
New file
@@ -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");
    }
}
zq-erp/src/main/resources/config/application.properties
@@ -4,9 +4,9 @@
#线上测试环境
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
@@ -59,7 +59,7 @@
#定时任务
scheduling.enabled=false
swagger.enable=false
swagger.enable=true
swagger.security.username=admin
swagger.security.password=admin
zq-erp/src/main/resources/config/db/increment/20210109.sql
New file
@@ -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`;
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
zq-erp/src/main/resources/config/lhx/application.properties
@@ -56,4 +56,4 @@
#定时任务
scheduling.enabled=true
swagger.enable=false
swagger.enable=true
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
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
zq-erp/src/main/resources/config/test/application.properties
@@ -1,11 +1,17 @@
evn=dev
evn=test
server.port=8080
#线上测试环境
#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://175.6.132.141:3306/hive_v2_test?useUnicode=true&characterEncoding=utf8&zeroDateTimeBehavior=CONVERT_TO_NULL&allowMultiQueries=true&transformedBitIsBoolean=true&serverTimezone=GMT%2B8
@@ -54,7 +60,12 @@
activities.groupBuy.limit=24
#minute
groupBuy.pay.timeLimit=30
#定时任务
scheduling.enabled=true
swagger.enable=false
#定时任务
scheduling.enabled=false
swagger.enable=false
swagger.security.username=admin
swagger.security.password=admin
zq-erp/src/main/resources/config/test/system.properties
@@ -1,51 +1,101 @@
evn=dev
server.port=8080
#是否启用debug模式
debug=false
# 日志文件保存地址
log_path=/mnt/hive/log-test
# 系统语言环境 zh中文,us英文
system_language=zh
# 错误密码允许输入的次数,大于五次后账号锁定,0表示不锁账号
error_password_times=5
# 默认密码
default_password=123
#nginx静态资源访问地址
static_resource_url=resource.hive.jyymatrix.cc
#文件保存地址
file_storage_path=/mnt/upload/
#文件上传大小字节为单位  10MB
maxUploadSize=10485760
#Matser\u7684ip\u5730\u5740
redis.hostname=118.31.227.147
#\u7AEF\u53E3\u53F7
redis.port=6379
#\u5982\u679C\u6709\u5BC6\u7801
redis.password=123456
#\u5BA2\u6237\u7AEF\u8D85\u65F6\u65F6\u95F4\u5355\u4F4D\u662F\u6BEB\u79D2 \u9ED8\u8BA4\u662F2000
redis.timeout=10000
redis.database=1
redis_time_out=1800000
cookie_time_out=36000
#APP登录公钥
login_public_key=MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQCWvK6UWCtSp/8qnTqyUfO0wbg4CuxOe7IeiDSAmATfHnWqBPnbZ73qQ4A90vGowB7mp5XnmBvgTwfXtDh08yd4btlHwSD3ShbRyGfGfV8lc47ZTLiJH0xuuN2iHfnfj8zQ5kcqijeotggo2rF8Uu7KSR3HxVyN9mO22C6p1r5wVQIDAQAB
#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==
#日志文件清理阈值  单位:MB
log_max=20
#日志清理天数
log_clear_day=5
spring.datasource.type=com.alibaba.druid.pool.DruidDataSource
spring.datasource.initialSize=3
spring.datasource.minIdle=3
spring.datasource.maxActive=20
spring.datasource.maxWait=60000
spring.datasource.timeBetweenEvictionRunsMillis=60000
spring.datasource.minEvictableIdleTimeMillis=300000
spring.datasource.validationQuery=SELECT 1 FROM DUAL
spring.datasource.testWhileIdle=true
spring.datasource.testOnBorrow=true
spring.datasource.testOnReturn=true
spring.datasource.filters=stat,wall,log4j
spring.datasource.connectionProperties=druid.stat.mergeSql=true;druid.stat.slowSqlMillis=5000
spring.thymeleaf.prefix: classpath:/templates/views/
spring.thymeleaf.cache=false
mybatis.config-location=classpath:mybatis/mybatis-config.xml
mybatis.mapper-locations=classpath*:mybatis/mapper/*/*.xml
#设置全局时间返回格式 第三行设置为true表示返回时间戳
#spring.jackson.date-format=yyyy-MM-dd
#spring.jackson.time-zone=GMT+8
#spring.jackson.serialization.write-dates-as-timestamps=true
#文件上传时的大小限制 单位M
spring.servlet.multipart.max-file-size=100MB
spring.servlet.multipart.max-request-size=100MB
#--------------------------------------
wechar_login_url =https://api.weixin.qq.com/sns/jscode2session?appid=%s&secret=%s&js_code=%s&grant_type=authorization_code
xcx_appid =wx5cc58f796224af61
xcx_secret =facea088aae414e5c2ee86b459887721
gzh_appid=wx57e6335559bdbda6
gzh_secret=ecb408af170e3890e6544290cad33760
#微信支付调试开关
wx_pay_debug_onoff = false
#快递鸟用户id
logistics.eBusinessID=1530881
#快递鸟密钥
logistics.appKey=f1cf9777-26fb-4e3f-a14d-896075e6384e
#快递鸟接口地址
logistics.url=http://api.kdniao.com/Ebusiness/EbusinessOrderHandle.aspx
#快递鸟接口指令
logistics.requestType=1002
#rabbitMQ配置
rabbitmq.host=47.111.134.136
rabbitmq.port=5672
rabbitmq.username=hivequeue
rabbitmq.password=hivequeueadmin
useRabbit=false
server.session.timeout=120
ali.sms.accessKeyId=LTAI4FrjY9R9iDfC6YQTHfne
ali.sms.accessKeySecret=eSvQslpHpDSGlI9Hxm4y5MynNgLbCp
ali.sms.regionId=cn-hangzhou
ali.sms.signName=\u80bd\u598d
#发送短信配置
crm.request_url = http://192.168.1.248
sms.request_url = http://smssh1.253.com
sms.login_account = M7315130
sms.login_password = J7FAoehPkv63e3
sms.login_accountNe = N4617160
sms.login_passwordNe = rb1cxLitRB83e0
#hour
activities.groupBuy.limit=24
#minute
groupBuy.pay.timeLimit=30
#接入统一登录平台配置
platform_app_code = wx_shop
platform_secret_key = b21e309f07964e4fae5b156d74b5d66z
#platform_verity_url = http://localhost:8080/platform/getUserInfo
platform_verity_url = http://stg1-xcerp-ca.xc.jyymatrix.cc/platform/getUserInfo
#微信支付回调地址
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://localhost:8082/meidu-crm/
#是否启用异常上报
is_open_exception_report=true
showExcptionUrl=http://erp.hive.jyymatrix.cc/showException
#异常信息查询接口
showExcptionUrl=http://erp.hive.jyymatrix.cc/showException
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
#定时任务
scheduling.enabled=false
swagger.enable=false
swagger.security.username=admin
swagger.security.password=admin
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/
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
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>
zq-erp/src/main/resources/mybatis/mapper/hive/AchieveNewDao.xml
@@ -48,7 +48,11 @@
        <result property="meiliao" column="meiliao" />
        <result property="zkTotal" column="zk_total" />
        <result property="arriveCnt" column="arrive_cnt" />
        <result property="goodsNo" column="goodsNo" />
        <result property="goodsName" column="goodsName" />
        <result property="zkPrice" column="zkPrice" />
    </resultMap>
@@ -113,8 +117,20 @@
                <if test="(record.endTime!=null  )">
                    and a.datatime <![CDATA[ < ]]> #{record.endTime}
                </if>
                <if test="record.beaultId != null and record.beaultId !='' ">
                    and    a.beault_id = #{record.beaultId}
                </if>
                <if test="record.companyId != null and record.companyId !='' ">
                    and    a.company_id = #{record.companyId}
                </if>
                <if test="record.beaultId != null and record.beaultId !='' ">
                    and    a.beault_id = #{record.beaultId}
                </if>
                <if test="record.vipQueryKey != null and record.vipQueryKey != ''  ">
                    and c.VIP_NAME like concat('%',#{record.vipQueryKey},'%')
                    or (c.VIP_NO like concat('%',#{record.vipQueryKey},'%')
                    or c.PHONE like concat('%',#{record.vipQueryKey},'%')
                    )
                </if>
            </if>
        </where>
@@ -168,6 +184,15 @@
                </if>
                <if test="record.companyId != null and record.companyId !='' ">
                    and    a.company_id = #{record.companyId}
                </if>
                <if test="record.beaultId != null and record.beaultId !='' ">
                    and    a.beault_id = #{record.beaultId}
                </if>
                <if test="record.vipQueryKey != null and record.vipQueryKey != ''  ">
                    and c.VIP_NAME like concat('%',#{record.vipQueryKey},'%')
                    or (c.VIP_NO like concat('%',#{record.vipQueryKey},'%')
                    or c.PHONE like concat('%',#{record.vipQueryKey},'%')
                    )
                </if>
            </if>
        </where>
@@ -819,4 +844,245 @@
        where 1=1
        <include refid="where_sql"></include>
    </select>
    <select id="selectVipConsumeStatisticsList" resultMap="AchieveNewMap">
        select
            a.VIP_NAME,
            a.PHONE t9,
            GROUP_CONCAT(DISTINCT e.su_name) meiliao,
            d.cnt arrive_cnt,
            sum(b.buyConsume) goods_cash,
            sum(b.freeConsume) free_consume,
            sum(b.hisConsume) his_consume
        from sys_vip_info a
        inner join (
            select vip_id,datatime, sum(a.free_consume) freeConsume, sum(a.his_consume) hisConsume, sum(IFNULL(goods_cash, 0) + IFNULL(card_cash, 0)) buyConsume from achieve_new a group by vip_id
        ) b on a.ID = b.vip_id
        inner join (
            select vip_id, count(1) cnt from (
                                         select vip_id, date_format(datatime, '%Y-%m-%d')
                                         from achieve_new
                                         group by date_format(datatime, '%Y-%m-%d'), vip_id
                                     ) c group by vip_id
            ) d on a.ID=d.vip_id
        left join sys_users e on find_in_set(e.su_id, a.BEATUY_ID)
        where 1=1
        <if test="record.vipName != null and record.vipName !=''">
            and (a.vip_name like CONCAT(CONCAT('%', #{record.vipName}), '%') or a.vip_no=#{record.vipName} or a.phone = #{record.vipName})
        </if>
        <if test="record.shopId != null">
            and a.shop_id=#{record.shopId}
        </if>
        <if test="record.beginTime != null">
            and date_format(b.datatime, '%Y-%m-%d') >= date_format(#{record.beginTime}, '%Y-%m-%d')
        </if>
        <if test="record.endTime!=null">
            and date_format(b.datatime, '%Y-%m-%d') >= date_format(#{record.endTime}, '%Y-%m-%d')
        </if>
        <if test="record.beaultId != null and record.beaultId!=''">
            and FIND_IN_SET(#{record.beaultId}, a.BEATUY_ID)
        </if>
        <if test='record.t1 == "on"'>
            and a.BEATUY_ID is not null
        </if>
        group by a.PHONE
        <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="selectVipConsumeStatisticsTotal" resultType="java.lang.Integer">
        select count(1)
        from sys_vip_info a
        inner join (
        select vip_id,datatime, sum(a.free_consume) freeConsume, sum(a.his_consume) hisConsume, sum(IFNULL(goods_cash, 0) + IFNULL(card_cash, 0)) buyConsume from achieve_new a group by vip_id
        ) b on a.ID = b.vip_id
        inner join (
        select vip_id, count(1) cnt from (
        select vip_id, date_format(datatime, '%Y-%m-%d')
        from achieve_new
        group by date_format(datatime, '%Y-%m-%d'), vip_id
        ) c group by vip_id
        ) d on a.ID=d.vip_id
        left join sys_users e on find_in_set(e.su_id, a.BEATUY_ID)
        where 1=1
        <if test="record.vipName != null and record.vipName !=''">
            and (a.vip_name like CONCAT(CONCAT('%', #{record.vipName}), '%') or a.vip_no=#{record.vipName} or a.phone = #{record.vipName})
        </if>
        <if test="record.shopId != null">
            and a.shop_id=#{record.shopId}
        </if>
        <if test="record.beginTime != null">
            and date_format(b.datatime, '%Y-%m-%d') >= date_format(#{record.beginTime}, '%Y-%m-%d')
        </if>
        <if test="record.endTime!=null">
            and date_format(b.datatime, '%Y-%m-%d') >= date_format(#{record.endTime}, '%Y-%m-%d')
        </if>
        <if test="record.beaultId != null and record.beaultId!=''">
            and FIND_IN_SET(#{record.beaultId}, a.BEATUY_ID)
        </if>
        <if test='record.t1 == "on"'>
            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
        <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
        <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>
zq-erp/src/main/resources/mybatis/mapper/hive/ArticleDao.xml
@@ -437,4 +437,17 @@
        </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 and 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>
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>
@@ -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>
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>
Diff truncated after the above file
zq-erp/src/main/resources/mybatis/mapper/hive/MoneyCardUseDao.xml zq-erp/src/main/resources/mybatis/mapper/hive/MoneyCardUseFlowDao.xml zq-erp/src/main/resources/mybatis/mapper/hive/ShoppingGoodsAssembleDao.xml zq-erp/src/main/resources/mybatis/mapper/hive/ShoppingGoodsCategoryDao.xml zq-erp/src/main/resources/mybatis/mapper/hive/ShoppingGoodsDao.xml zq-erp/src/main/resources/mybatis/mapper/hive/SysBeauticianStateDao.xml zq-erp/src/main/resources/mybatis/mapper/hive/SysBusinessDataDao.xml zq-erp/src/main/resources/mybatis/mapper/hive/SysFollowupCommentDao.xml zq-erp/src/main/resources/mybatis/mapper/hive/SysFollowupDao.xml zq-erp/src/main/resources/mybatis/mapper/hive/SysOrderDao.xml zq-erp/src/main/resources/mybatis/mapper/hive/SysOrderFlowDao.xml zq-erp/src/main/resources/mybatis/mapper/hive/SysOrderItemDao.xml zq-erp/src/main/resources/mybatis/mapper/hive/SysProjServicesDao.xml zq-erp/src/main/resources/mybatis/mapper/hive/SysProjUseDao.xml zq-erp/src/main/resources/mybatis/mapper/hive/SysSkinCheckRecordDao.xml zq-erp/src/main/resources/mybatis/mapper/hive/SysStoreInfoDao.xml zq-erp/src/main/resources/mybatis/mapper/hive/SysVipAlbumDao.xml zq-erp/src/main/resources/mybatis/mapper/hive/SysVipInfoDao.xml zq-erp/src/main/resources/mybatis/mapper/hive/SysVipLabelDao.xml zq-erp/src/main/resources/mybatis/mapper/hive/SysVipLevelDao.xml zq-erp/src/main/resources/mybatis/mapper/hive/SysWorkBeatuistaffDao.xml zq-erp/src/main/resources/mybatis/mapper/hive/TjVipSumDao.xml zq-erp/src/main/resources/mybatis/mapper/xcxShop/ShopProductDao.xml zq-erp/src/main/resources/mybatis/mapper/xcxShop/ShopWxtemplateMsgDao.xml zq-erp/src/main/resources/mybatis/mybatis-config.xml zq-erp/src/main/resources/static/images/pay/card.png zq-erp/src/main/resources/static/images/pay/cash.png zq-erp/src/main/resources/static/images/pay/qian.png zq-erp/src/main/resources/static/images/pay/tuan.png zq-erp/src/main/resources/static/images/pay/wechat.png zq-erp/src/main/resources/static/images/pay/yinlian.png zq-erp/src/main/resources/static/images/pay/zhifubao.png zq-erp/src/main/resources/static/js/plugin/moment.mini.js zq-erp/src/main/resources/templates/views/admin/hive-erp/order/orderXq-form.html zq-erp/src/main/resources/templates/views/admin/hive-erp/order/projService-list.html zq-erp/src/main/resources/templates/views/admin/hive-erp/order/serviceOrderDetail.html zq-erp/src/main/resources/templates/views/admin/hive-erp/statistics/custom-consume-list.html zq-erp/src/main/resources/templates/views/admin/hive-erp/statistics/daily-sale-list.html zq-erp/src/main/resources/templates/views/admin/hive-erp/statistics/statistics-moneyCar-item.html zq-erp/src/main/resources/templates/views/admin/hive-erp/statistics/statistics-moneyCar-summary.html zq-erp/src/main/resources/templates/views/admin/hive-erp/statistics/statistics-projSercice-item.html zq-erp/src/main/resources/templates/views/admin/hive-erp/statistics/statistics-projSercice-sumary.html zq-erp/src/main/resources/templates/views/admin/hive-erp/statistics/statistics-projuse-item.html zq-erp/src/main/resources/templates/views/admin/hive-erp/statistics/statistics-projuse-sumary.html zq-erp/src/main/resources/templates/views/admin/hive-erp/store/store-list.html zq-erp/src/main/resources/templates/views/admin/hive-erp/vip/vipInfo-list.html zq-erp/src/main/resources/templates/views/admin/hive/beautySalon/bj-form-bak.html zq-erp/src/main/resources/templates/views/admin/hive/beautySalon/bj-form.html zq-erp/src/main/resources/templates/views/admin/hive/beautySalon/cz-form-bak.html zq-erp/src/main/resources/templates/views/admin/hive/beautySalon/cz-form.html zq-erp/src/main/resources/templates/views/admin/hive/beautySalon/order-form.html zq-erp/src/main/resources/templates/views/admin/hive/beautySalon/orderXq-form-bak.html zq-erp/src/main/resources/templates/views/admin/hive/beautySalon/orderXq-form-bak2.html zq-erp/src/main/resources/templates/views/admin/hive/beautySalon/orderXq-form.html zq-erp/src/main/resources/templates/views/admin/hive/beautySalon/pbxq-form-bak.html zq-erp/src/main/resources/templates/views/admin/hive/beautySalon/pbxq-form.html zq-erp/src/main/resources/templates/views/admin/hive/beautySalon/projUseFlow-list.html zq-erp/src/main/resources/templates/views/admin/hive/beautySalon/servicceAddForm.html zq-erp/src/main/resources/templates/views/admin/hive/beautySalon/service-hk.html zq-erp/src/main/resources/templates/views/admin/hive/beautySalon/service_all_list.html zq-erp/src/main/resources/templates/views/admin/hive/beautySalon/updateOrderTime.html zq-erp/src/main/resources/templates/views/admin/hive/beautySalon/vip.html zq-erp/src/main/resources/templates/views/admin/hive/beautySalon/vip_bak.html zq-erp/src/main/resources/templates/views/admin/hive/beautySalon/yypb-form.html zq-erp/src/main/resources/templates/views/admin/hive/instore/instoreinfo-list.html zq-erp/src/main/resources/templates/views/admin/hive/instore/store-list.html zq-erp/src/main/resources/templates/views/admin/hive/products/goods-form.html zq-erp/src/main/resources/templates/views/admin/hive/statistics/custom-consume-list.html zq-erp/src/main/resources/templates/views/admin/hive/statistics/daily-list-new.html zq-erp/src/main/resources/templates/views/admin/hive/statistics/daily-sale-list.html zq-erp/src/main/resources/templates/views/admin/hive/statistics/statistics-moneyCar-item.html zq-erp/src/main/resources/templates/views/admin/hive/statistics/statistics-moneyCar-summary.html zq-erp/src/main/resources/templates/views/admin/hive/statistics/statistics-projSercice-item.html zq-erp/src/main/resources/templates/views/admin/hive/statistics/statistics-projSercice-sumary.html zq-erp/src/main/resources/templates/views/admin/hive/statistics/statistics-projuse-item.html zq-erp/src/main/resources/templates/views/admin/hive/statistics/statistics-projuse-sumary.html zq-erp/src/main/resources/templates/views/admin/hive/statistics/store-inout-list.html zq-erp/src/main/resources/templates/views/admin/hive/store/projServiceStartpl-list.html zq-erp/src/main/resources/templates/views/admin/hive/vip/moneyCardUse-form.html zq-erp/src/main/resources/templates/views/admin/hive/vip/moneyCardUseFlow-list.html zq-erp/src/main/resources/templates/views/admin/hive/vip/projUse-form.html zq-erp/src/main/resources/templates/views/admin/hive/vip/sysSkinCheckRecord-form.html zq-erp/src/main/resources/templates/views/admin/hive/vip/tc-form.html zq-erp/src/main/resources/templates/views/admin/hive/vip/vipInfo-list.html zq-erp/src/main/resources/templates/views/admin/shop/templateMsg-form.html zq-erp/src/main/resources/templates/views/admin/shop/templateMsg-list.html zq-erp/src/main/resources/templates/views/admin/sys/admin-form.html zq-erp/src/test/java/com/matrix/SourceFlowTests.java zq-xcx/project.config.json