From 10d83d7cff6fcbf24fcbd6d4af7e23ea628d399a Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=D6=B8=C2=B7=C3=ACde=C3=91=C3=B4=C2=B9=C3=A2?= Date: Sat, 6 Feb 2021 17:45:04 +0800 Subject: [PATCH] 1.3.2 --- .../src/main/java/com/common/CommonPage.java | 13 + .../java/com/constants/BargainConstants.java | 24 + .../constants/BrokerageRecordConstants.java | 58 ++ .../java/com/constants/CategoryConstants.java | 37 + .../main/java/com/constants/Constants.java | 48 +- .../java/com/constants/ProductConstants.java | 40 + .../main/java/com/constants/SmsConstants.java | 169 ++-- .../com/constants/SysConfigConstants.java | 25 + .../com/constants/SysGroupDataConstants.java | 56 ++ .../java/com/constants/UserConstants.java | 35 + .../main/java/com/filter/ResponseRouter.java | 3 +- crmeb/src/main/java/com/utils/CrmebUtil.java | 5 +- .../src/main/java/com/utils/RequestUtil.java | 3 +- .../main/java/com/utils/RestTemplateUtil.java | 17 + crmeb/src/main/java/com/utils/UploadUtil.java | 9 +- .../article/controller/ArticleController.java | 1 - .../service/impl/ArticleServiceImpl.java | 17 +- .../controller/AdminUserController.java | 102 +++ .../authorization/controller/adminUser.java | 146 ---- .../manager/TokenManagerImpl.java | 3 - .../crmeb/authorization/model/TokenModel.java | 9 +- .../service/impl/StoreBargainServiceImpl.java | 96 ++- .../impl/StoreBargainUserHelpServiceImpl.java | 84 +- .../impl/StoreBargainUserServiceImpl.java | 5 +- .../controller/CategoryController.java | 14 +- .../category/service/CategoryService.java | 7 +- .../service/impl/CategoryServiceImpl.java | 71 +- .../request/StoreCombinationRequest.java | 7 +- .../combination/service/StorePinkService.java | 7 + .../impl/StoreCombinationServiceImpl.java | 13 +- .../service/impl/StorePinkServiceImpl.java | 111 ++- .../crmeb/express/request/ExpressRequest.java | 50 ++ .../impl/ShippingTemplatesServiceImpl.java | 3 +- .../controller/FundsMonitorController.java | 25 +- .../controller/UserExtractController.java | 18 +- .../controller/UserRechargeController.java | 1 + .../finance/request/FundsMonitorRequest.java | 40 + .../finance/request/UserExtractRequest.java | 2 +- .../finance/service/UserExtractService.java | 13 +- .../service/UserFundsMonitorService.java | 12 +- .../service/impl/UserExtractServiceImpl.java | 205 +++-- .../impl/UserFundsMonitorServiceImpl.java | 49 +- .../service/impl/UserRechargeServiceImpl.java | 15 +- .../front/controller/CartController.java | 3 +- .../front/controller/LoginController.java | 16 +- .../controller/StoreOrderController.java | 2 +- .../front/controller/UserController.java | 55 +- .../controller/UserCouponController.java | 22 +- .../controller/UserRechargeController.java | 25 +- .../front/controller/WeChatController.java | 12 +- .../crmeb/front/request/LoginRequest.java | 4 +- .../request/UserCouponReceiveRequest.java | 9 +- .../SpreadCommissionDetailResponse.java | 47 ++ .../UserRechargeBillRecordResponse.java | 38 + .../UserSpreadPeopleItemResponse.java | 2 +- .../crmeb/front/service/LoginService.java | 31 + .../crmeb/front/service/OrderService.java | 12 +- .../front/service/UserCenterService.java | 17 +- .../front/service/impl/LoginServiceImpl.java | 180 +++++ .../front/service/impl/OrderServiceImpl.java | 203 ++--- .../service/impl/ProductServiceImpl.java | 12 +- .../service/impl/UserCenterServiceImpl.java | 743 +++++++++++++----- .../impl/StoreProductLogServiceImpl.java | 4 +- .../marketing/model/StoreCouponUser.java | 2 +- .../marketing/service/StoreCouponService.java | 15 +- .../service/StoreCouponUserService.java | 14 + .../service/impl/StoreCouponServiceImpl.java | 58 ++ .../impl/StoreCouponUserServiceImpl.java | 157 +++- .../pass/controller/OnePassController.java | 11 + .../crmeb/pass/service/OnePassService.java | 6 + .../pass/service/impl/OnePassServiceImpl.java | 17 + .../payment/service/RechargePayService.java | 3 +- .../service/impl/CallbackServiceImpl.java | 85 +- .../service/impl/OrderPayServiceImpl.java | 395 ++++++++-- .../service/impl/RechargePayServiceImpl.java | 40 +- .../payment/wechat/WeChatPayService.java | 9 + .../wechat/impl/WeChatPayServiceImpl.java | 307 +++++++- .../controller/WeChatMessageController.java | 39 +- .../StoreSeckillMangerController.java | 59 +- .../service/StoreSeckillMangerService.java | 16 +- .../impl/StoreSeckillMangerServiceImpl.java | 87 ++ .../sms/controller/SmsRecordController.java | 30 +- .../zbkj/crmeb/sms/service/SmsService.java | 82 +- .../sms/service/impl/SmsServiceImpl.java | 174 +++- .../controller/RetailShopController.java | 63 +- .../controller/StoreOrderController.java | 12 +- .../controller/StoreProductController.java | 22 +- .../store/request/RetailShopRequest.java | 14 +- .../request/RetailShopStairUserRequest.java | 4 - .../request/StoreCopyProductRequest.java | 34 + .../request/StoreOrderEditPriceRequest.java | 43 + .../request/StoreProductRelationRequest.java | 11 + .../crmeb/store/service/OrderTaskService.java | 15 + .../store/service/RetailShopService.java | 12 +- .../crmeb/store/service/StoreCartService.java | 12 +- .../store/service/StoreOrderInfoService.java | 2 +- .../store/service/StoreOrderService.java | 33 +- .../service/StoreOrderStatusService.java | 7 + .../store/service/StoreOrderTaskService.java | 20 +- .../service/StoreProductReplyService.java | 8 + .../store/service/StoreProductService.java | 13 + .../service/impl/OrderTaskServiceImpl.java | 176 ++++- .../service/impl/RetailShopServiceImpl.java | 120 +-- .../service/impl/StoreCartServiceImpl.java | 27 +- .../impl/StoreOrderInfoServiceImpl.java | 12 +- .../impl/StoreOrderRefundServiceImpl.java | 9 +- .../service/impl/StoreOrderServiceImpl.java | 366 +++++++-- .../impl/StoreOrderStatusServiceImpl.java | 17 +- .../impl/StoreOrderTaskServiceImpl.java | 544 +++++++------ .../impl/StoreProductReplyServiceImpl.java | 20 +- .../service/impl/StoreProductServiceImpl.java | 69 +- .../crmeb/store/utilService/OrderUtils.java | 15 +- .../controller/SystemAdminController.java | 25 +- .../controller/SystemGroupController.java | 9 +- .../zbkj/crmeb/system/model/SystemAdmin.java | 5 + .../system/request/SystemAdminAddRequest.java | 22 +- .../request/SystemAdminLoginRequest.java | 2 +- .../system/request/SystemAdminRequest.java | 4 + .../system/response/SystemAdminResponse.java | 6 + .../system/service/SystemAdminService.java | 39 +- .../service/impl/SystemAdminServiceImpl.java | 108 ++- .../impl/SystemAttachmentServiceImpl.java | 2 +- .../impl/SystemUserLevelServiceImpl.java | 1 + .../task/brokerage/BrokerageFrozenTask.java | 51 ++ .../com/zbkj/crmeb/task/cloud/AsyncCloud.java | 6 +- .../crmeb/task/order/OrderAutoCancelTask.java | 47 ++ .../task/order/OrderAutoCompleteTask.java | 48 ++ .../crmeb/task/order/OrderCancelByUser.java | 14 +- .../crmeb/task/order/OrderCompleteByUser.java | 14 +- .../crmeb/task/order/OrderDeleteByUser.java | 14 +- .../crmeb/task/order/OrderReceiptTask.java | 2 +- .../crmeb/task/order/OrderRefundByUser.java | 16 +- .../crmeb/task/order/OrderTakeByUser.java | 13 +- .../crmeb/task/pink/PinkStatusChange.java | 4 +- .../wechat/AsyncWeChatProgramTempList.java | 6 +- .../crmeb/user/controller/UserController.java | 10 +- .../user/controller/UserTagController.java | 27 +- .../com/zbkj/crmeb/user/dao/UserBillDao.java | 2 + .../user/dao/UserBrokerageRecordDao.java | 20 + .../crmeb/user/model/UserBrokerageRecord.java | 81 ++ .../zbkj/crmeb/user/request/UserRequest.java | 3 + .../user/response/SpreadUserResponse.java | 74 ++ .../crmeb/user/response/UserResponse.java | 8 +- .../crmeb/user/service/UserBillService.java | 17 + .../service/UserBrokerageRecordService.java | 128 +++ .../zbkj/crmeb/user/service/UserService.java | 103 ++- .../service/impl/UserBillServiceImpl.java | 66 +- .../impl/UserBrokerageRecordServiceImpl.java | 373 +++++++++ .../service/impl/UserLevelServiceImpl.java | 5 +- .../user/service/impl/UserServiceImpl.java | 510 ++++++++++-- .../controller/TemplateMessageController.java | 133 ++-- .../wechat/controller/WeChatController.java | 20 +- .../request/TemplateMessageSearchRequest.java | 3 + .../service/TemplateMessageService.java | 23 + .../wechat/service/WechatPublicService.java | 36 + .../impl/TemplateMessageServiceImpl.java | 111 ++- .../service/impl/WechatPublicServiceImpl.java | 81 ++ crmeb/src/main/resources/application-beta.yml | 14 +- crmeb/src/main/resources/application-dev.yml | 16 +- crmeb/src/main/resources/application-prod.yml | 16 +- crmeb/src/main/resources/application.yml | 14 +- crmeb/src/main/resources/logback-spring.xml | 2 +- .../mapper/finance/UserFundsMonitorMapper.xml | 4 +- .../resources/mapper/user/UserBillMapper.xml | 14 + .../mapper/user/UserBrokerageRecordMapper.xml | 5 + 165 files changed, 6754 insertions(+), 2034 deletions(-) create mode 100644 crmeb/src/main/java/com/constants/BargainConstants.java create mode 100644 crmeb/src/main/java/com/constants/BrokerageRecordConstants.java create mode 100644 crmeb/src/main/java/com/constants/CategoryConstants.java create mode 100644 crmeb/src/main/java/com/constants/ProductConstants.java create mode 100644 crmeb/src/main/java/com/constants/SysConfigConstants.java create mode 100644 crmeb/src/main/java/com/constants/SysGroupDataConstants.java create mode 100644 crmeb/src/main/java/com/constants/UserConstants.java create mode 100644 crmeb/src/main/java/com/zbkj/crmeb/authorization/controller/AdminUserController.java delete mode 100644 crmeb/src/main/java/com/zbkj/crmeb/authorization/controller/adminUser.java create mode 100644 crmeb/src/main/java/com/zbkj/crmeb/express/request/ExpressRequest.java create mode 100644 crmeb/src/main/java/com/zbkj/crmeb/finance/request/FundsMonitorRequest.java create mode 100644 crmeb/src/main/java/com/zbkj/crmeb/front/response/SpreadCommissionDetailResponse.java create mode 100644 crmeb/src/main/java/com/zbkj/crmeb/front/response/UserRechargeBillRecordResponse.java create mode 100644 crmeb/src/main/java/com/zbkj/crmeb/front/service/LoginService.java create mode 100644 crmeb/src/main/java/com/zbkj/crmeb/front/service/impl/LoginServiceImpl.java create mode 100644 crmeb/src/main/java/com/zbkj/crmeb/store/request/StoreCopyProductRequest.java create mode 100644 crmeb/src/main/java/com/zbkj/crmeb/store/request/StoreOrderEditPriceRequest.java create mode 100644 crmeb/src/main/java/com/zbkj/crmeb/store/request/StoreProductRelationRequest.java create mode 100644 crmeb/src/main/java/com/zbkj/crmeb/task/brokerage/BrokerageFrozenTask.java create mode 100644 crmeb/src/main/java/com/zbkj/crmeb/task/order/OrderAutoCancelTask.java create mode 100644 crmeb/src/main/java/com/zbkj/crmeb/task/order/OrderAutoCompleteTask.java create mode 100644 crmeb/src/main/java/com/zbkj/crmeb/user/dao/UserBrokerageRecordDao.java create mode 100644 crmeb/src/main/java/com/zbkj/crmeb/user/model/UserBrokerageRecord.java create mode 100644 crmeb/src/main/java/com/zbkj/crmeb/user/response/SpreadUserResponse.java create mode 100644 crmeb/src/main/java/com/zbkj/crmeb/user/service/UserBrokerageRecordService.java create mode 100644 crmeb/src/main/java/com/zbkj/crmeb/user/service/impl/UserBrokerageRecordServiceImpl.java create mode 100644 crmeb/src/main/java/com/zbkj/crmeb/wechat/service/WechatPublicService.java create mode 100644 crmeb/src/main/java/com/zbkj/crmeb/wechat/service/impl/WechatPublicServiceImpl.java create mode 100644 crmeb/src/main/resources/mapper/user/UserBrokerageRecordMapper.xml diff --git a/crmeb/src/main/java/com/common/CommonPage.java b/crmeb/src/main/java/com/common/CommonPage.java index 8a2f77e4..1d55e49b 100644 --- a/crmeb/src/main/java/com/common/CommonPage.java +++ b/crmeb/src/main/java/com/common/CommonPage.java @@ -78,4 +78,17 @@ public class CommonPage { BeanUtils.copyProperties(originPageInfo, pageInfo, "list"); return pageInfo; } + + /** + * 对象A复制对象B的分页信息 //TODO 多次数据查询导致分页数据异常解决办法 + */ + public static PageInfo copyPageInfo(PageInfo originPageInfo, List list) { + PageInfo pageInfo = new PageInfo<>(list); + pageInfo.setPages(originPageInfo.getPages()); + pageInfo.setPageNum(originPageInfo.getPageNum()); + pageInfo.setPageSize(originPageInfo.getPageSize()); + pageInfo.setTotal(originPageInfo.getTotal()); + pageInfo.setList(list); + return pageInfo; + } } diff --git a/crmeb/src/main/java/com/constants/BargainConstants.java b/crmeb/src/main/java/com/constants/BargainConstants.java new file mode 100644 index 00000000..c1d443c0 --- /dev/null +++ b/crmeb/src/main/java/com/constants/BargainConstants.java @@ -0,0 +1,24 @@ +package com.constants; + +/** + * 砍价常量类 + * +---------------------------------------------------------------------- + * | CRMEB [ CRMEB赋能开发者,助力企业发展 ] + * +---------------------------------------------------------------------- + * | Copyright (c) 2016~2020 https://www.crmeb.com All rights reserved. + * +---------------------------------------------------------------------- + * | Licensed CRMEB并不是自由软件,未经许可不能去掉CRMEB相关版权 + * +---------------------------------------------------------------------- + * | Author: CRMEB Team + * +---------------------------------------------------------------------- + */ +public class BargainConstants { + + /** 用户砍价状态-参与中 */ + public static final Integer BARGAIN_USER_STATUS_PARTICIPATE = 1; + /** 用户砍价状态-活动结束参与失败 */ + public static final Integer BARGAIN_USER_STATUS_FAIL = 2; + /** 用户砍价状态-活动结束参与成功 */ + public static final Integer BARGAIN_USER_STATUS_SUCCESS = 3; + +} diff --git a/crmeb/src/main/java/com/constants/BrokerageRecordConstants.java b/crmeb/src/main/java/com/constants/BrokerageRecordConstants.java new file mode 100644 index 00000000..ef6b60a4 --- /dev/null +++ b/crmeb/src/main/java/com/constants/BrokerageRecordConstants.java @@ -0,0 +1,58 @@ +package com.constants; + +/** + * 佣金记录常量类 + * +---------------------------------------------------------------------- + * | CRMEB [ CRMEB赋能开发者,助力企业发展 ] + * +---------------------------------------------------------------------- + * | Copyright (c) 2016~2020 https://www.crmeb.com All rights reserved. + * +---------------------------------------------------------------------- + * | Licensed CRMEB并不是自由软件,未经许可不能去掉CRMEB相关版权 + * +---------------------------------------------------------------------- + * | Author: CRMEB Team + * +---------------------------------------------------------------------- + */ +public class BrokerageRecordConstants { + + /** 佣金记录类型—增加 */ + public static final Integer BROKERAGE_RECORD_TYPE_ADD = 1; + + /** 佣金记录类型—扣减 */ + public static final Integer BROKERAGE_RECORD_TYPE_SUB = 2; + + /** 佣金记录状态—创建 */ + public static final Integer BROKERAGE_RECORD_STATUS_CREATE = 1; + + /** 佣金记录状态—冻结期 */ + public static final Integer BROKERAGE_RECORD_STATUS_FROZEN = 2; + + /** 佣金记录状态—完成 */ + public static final Integer BROKERAGE_RECORD_STATUS_COMPLETE = 3; + + /** 佣金记录状态—失效(订单退款) */ + public static final Integer BROKERAGE_RECORD_STATUS_INVALIDATION = 4; + + /** 佣金记录状态—提现申请 */ + public static final Integer BROKERAGE_RECORD_STATUS_WITHDRAW = 5; + + /** 佣金记录关联类型—订单 */ + public static final String BROKERAGE_RECORD_LINK_TYPE_ORDER = "order"; + + /** 佣金记录关联类型—提现 */ + public static final String BROKERAGE_RECORD_LINK_TYPE_WITHDRAW = "withdraw"; + + /** 佣金记录关联类型—转余额 */ + public static final String BROKERAGE_RECORD_LINK_TYPE_YUE = "yue"; + + /** 佣金记录标题—订单获得佣金 */ + public static final String BROKERAGE_RECORD_TITLE_ORDER = "获得推广佣金"; + + /** 佣金记录标题—提现申请 */ + public static final String BROKERAGE_RECORD_TITLE_WITHDRAW_APPLY = "提现申请"; + + /** 佣金记录标题—提现拒绝 */ + public static final String BROKERAGE_RECORD_TITLE_WITHDRAW_FAIL = "提现申请拒绝"; + + /** 佣金记录标题—提现拒绝 */ + public static final String BROKERAGE_RECORD_TITLE_BROKERAGE_YUE = "佣金转余额"; +} diff --git a/crmeb/src/main/java/com/constants/CategoryConstants.java b/crmeb/src/main/java/com/constants/CategoryConstants.java new file mode 100644 index 00000000..d92fb32f --- /dev/null +++ b/crmeb/src/main/java/com/constants/CategoryConstants.java @@ -0,0 +1,37 @@ +package com.constants; + +/** + * 分类常量类 + * +---------------------------------------------------------------------- + * | CRMEB [ CRMEB赋能开发者,助力企业发展 ] + * +---------------------------------------------------------------------- + * | Copyright (c) 2016~2020 https://www.crmeb.com All rights reserved. + * +---------------------------------------------------------------------- + * | Licensed CRMEB并不是自由软件,未经许可不能去掉CRMEB相关版权 + * +---------------------------------------------------------------------- + * | Author: CRMEB Team + * +---------------------------------------------------------------------- + */ +public class CategoryConstants { + + /** 分类状态-正常 */ + public static final Integer CATEGORY_STATUS_NORMAL = 1; + /** 分类状态-失效 */ + public static final Integer CATEGORY_STATUS_INVALID = 0; + + /** 分类类型-产品分类 */ + public static final Integer CATEGORY_TYPE_PRODUCT = 1; + /** 分类类型-附件分类 */ + public static final Integer CATEGORY_TYPE_ATTACHMENT = 2; + /** 分类类型-文章分类 */ + public static final Integer CATEGORY_TYPE_ARTICLE = 3; + /** 分类类型-设置分类 */ + public static final Integer CATEGORY_TYPE_SETTING = 4; + /** 分类类型-菜单分类 */ + public static final Integer CATEGORY_TYPE_MENU = 5; + /** 分类类型-配置分类 */ + public static final Integer CATEGORY_TYPE_CONFIG = 6; + /** 分类类型-秒杀配置 */ + public static final Integer CATEGORY_TYPE_SECKILL = 7; + +} diff --git a/crmeb/src/main/java/com/constants/Constants.java b/crmeb/src/main/java/com/constants/Constants.java index 49393c1a..ef09d022 100644 --- a/crmeb/src/main/java/com/constants/Constants.java +++ b/crmeb/src/main/java/com/constants/Constants.java @@ -62,7 +62,7 @@ public class Constants { public static final String USER_LOGIN_PASSWORD_MD5_KEYWORDS = "crmeb"; //用户登token redis存储前缀 - public static final String USER_TOKEN_REDIS_KEY_PREFIX = "TOKEN_USER_"; + public static final String USER_TOKEN_REDIS_KEY_PREFIX = "TOKEN_USER:"; //用户登录方式 h5 @@ -101,7 +101,8 @@ public class Constants { public static final Integer PRODUCT_SELECT_CATEGORY_NUM_MAX = 10; //上传类型 - public static final String UPLOAD_TYPE_IMAGE = "image"; +// public static final String UPLOAD_TYPE_IMAGE = "image"; + public static final String UPLOAD_TYPE_IMAGE = "crmebimage"; //上传类型 public static final String UPLOAD_TYPE_FILE = "file"; @@ -119,6 +120,9 @@ public class Constants { public static final int UPLOAD_TYPE_USER = 7; //用户上传 + // 移动端文章顶部的banner图最大数量 配置数据最小3最大10 + public static final String ARTICLE_BANNER_LIMIT = "news_slides_limit"; + //城市数据 redis key public static final String CITY_LIST = "city_list"; //城市数据 tree redis key @@ -158,7 +162,8 @@ public class Constants { //config配置的key public static final String CONFIG_KEY_SITE_URL = "site_url"; //域名 public static final String CONFIG_KEY_API_URL = "api_url"; //接口地址 - public static final String CONFIG_KEY_SITE_LOGO = "login_logo"; //logo地址 + public static final String CONFIG_KEY_SITE_LOGO = "mobile_top_logo"; //logo地址 + public static final String CONFIG_KEY_MOBILE_LOGIN_LOGO = "mobile_login_logo"; // 移动端登录 logo public static final String CONFIG_KEY_SITE_NAME = "site_name"; //网站名称 public static final String CONFIG_SITE_TENG_XUN_MAP_KEY = "tengxun_map_key"; //腾讯地图key public static final String CONFIG_BANK_LIST = "user_extract_bank"; //可提现银行 @@ -191,20 +196,17 @@ public class Constants { public static final String CONFIG_KEY_STORE_BROKERAGE_RATE_ONE = "store_brokerage_ratio"; //一级返佣比例前缀 public static final String CONFIG_KEY_STORE_BROKERAGE_RATE_TWO = "store_brokerage_two"; //二级返佣比例前缀 public static final String CONFIG_KEY_STORE_BROKERAGE_USER_EXTRACT_MIN_PRICE = "user_extract_min_price"; //提现最低金额 - public static final String CONFIG_KEY_STORE_BROKERAGE_MODEL = "brokerage_func_status"; //分销模式 + public static final String CONFIG_KEY_STORE_BROKERAGE_MODEL = "store_brokerage_status"; //分销模式1-指定分销2-人人分销 public static final String CONFIG_KEY_STORE_BROKERAGE_USER_EXTRACT_BANK = "user_extract_bank"; //提现银行卡 public static final String CONFIG_KEY_STORE_BROKERAGE_EXTRACT_TIME = "extract_time"; //冻结时间 public static final String CONFIG_KEY_STORE_BROKERAGE_PERSON_PRICE = "store_brokerage_price"; //人人分销满足金额 public static final String CONFIG_KEY_STORE_BROKERAGE_IS_OPEN = "brokerage_func_status"; //分销启用 + public static final String CONFIG_KEY_STORE_BROKERAGE_BIND_TYPE = "brokerageBindind"; //分销关系绑定0-所有游湖,2-新用户 //积分 public static final String CONFIG_KEY_INTEGRAL_RATE = "integral_ratio"; //积分抵用比例(1积分抵多少金额 public static final String CONFIG_KEY_INTEGRAL_RATE_ORDER_GIVE = "order_give_integral"; //下单支付金额按比例赠送积分(实际支付1元赠送多少积分 - //后台首页登录图片 - public static final String CONFIG_KEY_ADMIN_LOGIN_LOGO = "site_logo"; //登录页LOGO - public static final String CONFIG_KEY_ADMIN_LOGIN_BACKGROUND_IMAGE = "admin_login_bg_pic"; //登录页背景图 - //分销 public static final String CONFIG_KEY_DISTRIBUTION_TYPE = "brokerage_bindind"; @@ -213,7 +215,7 @@ public class Constants { //config配置的formId - public static final int CONFIG_FORM_ID_INDEX = 69; //首页配置 + public static final int CONFIG_FORM_ID_INDEX = 133; //首页配置 public static final int CONFIG_FORM_ID_PUBLIC = 65; //公众号配置 @@ -428,7 +430,7 @@ public class Constants { // 订单缓存 public static final long ORDER_CASH_CONFIRM = (60); - public static final String ORDER_CACHE_PER = "ORDER_CACHE"; // redis缓存订单前缀 + public static final String ORDER_CACHE_PER = "ORDER_CACHE:"; // redis缓存订单前缀 //订单操作类型 -> 消息 public static final String ORDER_LOG_MESSAGE_REFUND_PRICE = "退款给用户{amount}元"; //退款 @@ -446,16 +448,27 @@ public class Constants { public static final int ORDER_PAY_CHANNEL_PROGRAM = 1; //小程序 //微信消息模板 tempKey - public static final String WE_CHAT_TEMP_KEY_EXPRESS = "OPENTM200565259"; - public static final String WE_CHAT_TEMP_KEY_DELIVERY = "OPENTM207707249"; public static final String WE_CHAT_TEMP_KEY_FIRST = "first"; public static final String WE_CHAT_TEMP_KEY_END = "remark"; - public static final String WE_CHAT_PUBLIC_TEMP_KEY_RECHARGE = "OPENTM200565260"; - public static final String WE_CHAT_PROGRAM_TEMP_KEY_RECHARGE = "OPENTM200565260"; - public static final String WE_CHAT_PUBLIC_TEMP_KEY_ORDER_PAY_SUCCESS = "OPENTM200565260"; //需要添加模板消息之后修改 - public static final String WE_CHAT_PROGRAM_TEMP_KEY_ORDER_PAY_SUCCESS = "OPENTM200565260"; + // 公众号模板消息 public static final String WE_CHAT_TEMP_KEY_COMBINATION_SUCCESS = "OPENTM407456411";// 拼团成功 public static final String WE_CHAT_TEMP_KEY_BARGAIN_SUCCESS = "OPENTM410292733";// 砍价成功 + public static final String WE_CHAT_TEMP_KEY_EXPRESS = "OPENTM200565259";// 订单发货提醒 + public static final String WE_CHAT_TEMP_KEY_DELIVERY = "OPENTM207707249";// 订单配送通知 + public static final String WE_CHAT_TEMP_KEY_ORDER_PAY = "OPENTM207791277";// 订单支付成功通知 + public static final String WE_CHAT_TEMP_KEY_ORDER_RECEIVING = "OPENTM413386489";// 订单收货通知 + public static final String WE_CHAT_TEMP_KEY_ORDER_REFUND = "OPENTM207791277";// 退款进度通知 + public static final String WE_CHAT_PUBLIC_TEMP_KEY_RECHARGE = "OPENTM200565260";// 充值成功 + + // 小程序服务通知 + public static final String WE_CHAT_PROGRAM_TEMP_KEY_COMBINATION_SUCCESS = "5164"; + public static final String WE_CHAT_PROGRAM_TEMP_KEY_BARGAIN_SUCCESS = "2920"; + public static final String WE_CHAT_PROGRAM_TEMP_KEY_EXPRESS = "467"; + public static final String WE_CHAT_PROGRAM_TEMP_KEY_DELIVERY = "14198"; + public static final String WE_CHAT_PROGRAM_TEMP_KEY_ORDER_PAY = "516"; + public static final String WE_CHAT_PROGRAM_TEMP_KEY_ORDER_RECEIVING = "9283"; + public static final String WE_CHAT_PROGRAM_TEMP_KEY_RECHARGE = "OPENTM200565260"; + //CND URL测试用 @@ -510,4 +523,7 @@ public class Constants { public static final String FAIL = "FAIL"; public static final String SUCCESS = "SUCCESS"; + + // 订单取消Key + public static final String ORDER_AUTO_CANCEL_KEY = "order_auto_cancel_key"; } diff --git a/crmeb/src/main/java/com/constants/ProductConstants.java b/crmeb/src/main/java/com/constants/ProductConstants.java new file mode 100644 index 00000000..738f3800 --- /dev/null +++ b/crmeb/src/main/java/com/constants/ProductConstants.java @@ -0,0 +1,40 @@ +package com.constants; + +/** + * 商品常量类 + * +---------------------------------------------------------------------- + * | CRMEB [ CRMEB赋能开发者,助力企业发展 ] + * +---------------------------------------------------------------------- + * | Copyright (c) 2016~2020 https://www.crmeb.com All rights reserved. + * +---------------------------------------------------------------------- + * | Licensed CRMEB并不是自由软件,未经许可不能去掉CRMEB相关版权 + * +---------------------------------------------------------------------- + * | Author: CRMEB Team + * +---------------------------------------------------------------------- + */ +public class ProductConstants { + + /** 单规格属性 */ + public static final String SINGLE_ATTR_NAME = "规格"; + /** 单规格属性值 */ + public static final String SINGLE_ATTR_VALUE = "默认"; + + // 商品类型 活动类型 0=商品,1=秒杀,2=砍价,3=拼团 attrResult表用到 + /** 商品活动类型——普通商品 */ + public static final Integer PRODUCT_TYPE_NORMAL = 0; + /** 商品活动类型——普通商品文字 */ + public static final String PRODUCT_TYPE_NORMAL_STR = "默认"; + /** 商品活动类型——秒杀商品 */ + public static final Integer PRODUCT_TYPE_SECKILL = 1; + /** 商品活动类型——秒杀商品文字 */ + public static final String PRODUCT_TYPE_SECKILL_STR = "秒杀"; + /** 商品活动类型——砍价商品 */ + public static final Integer PRODUCT_TYPE_BARGAIN = 2; + /** 商品活动类型——砍价商品文字 */ + public static final String PRODUCT_TYPE_BARGAIN_STR = "砍价"; + /** 商品活动类型——拼团商品 */ + public static final Integer PRODUCT_TYPE_PINGTUAN= 3; + /** 商品活动类型——拼团商品文字 */ + public static final String PRODUCT_TYPE_PINGTUAN_STR= "拼团"; + +} diff --git a/crmeb/src/main/java/com/constants/SmsConstants.java b/crmeb/src/main/java/com/constants/SmsConstants.java index 29271f4b..f3380edf 100644 --- a/crmeb/src/main/java/com/constants/SmsConstants.java +++ b/crmeb/src/main/java/com/constants/SmsConstants.java @@ -1,7 +1,7 @@ package com.constants; /** - * 短信配置常量类 + * 短信常量类 * +---------------------------------------------------------------------- * | CRMEB [ CRMEB赋能开发者,助力企业发展 ] * +---------------------------------------------------------------------- @@ -13,112 +13,103 @@ package com.constants; * +---------------------------------------------------------------------- */ public class SmsConstants { - //------------------------------------------------短信配置------------------------------------------------ - //短信请求地址 - public static final String SMS_API_URL = "https://sms.crmeb.net/api/"; -// public static final String SMS_API_URL = "http://plat.crmeb.net/api/"; - //短信支付回调地址 - public static final String SMS_API_PAY_NOTIFY_URI = "/api/sms/pay/notify"; - //验证码接口 -// public static final String SMS_API_CAPTCHA_URI = "sms/captcha"; - public static final String SMS_API_CAPTCHA_URI = "user/code"; - //账号注册地址 -// public static final String SMS_API_REGISTER_URI = "sms/register"; - public static final String SMS_API_REGISTER_URI = "user/register"; - //公共短信模板列表 - public static final String SMS_API_PUBLIC_TEMP_URI = "sms/publictemp"; - //公共短信模板添加 - public static final String SMS_API_PUBLIC_TEMP_USE_URI = "sms/use"; - //获取账号信息 -// public static final String SMS_API_USER_INFO_URI = "sms/userinfo"; - public static final String SMS_API_USER_INFO_URI = "sms_v2/info"; - //支付套餐 -// public static final String SMS_API_PAY_TEMP_LIST_URI = "sms/meal"; - public static final String SMS_API_PAY_TEMP_LIST_URI = "meal/list"; - //支付二维码 -// public static final String SMS_API_PAY_QR_CODE_URI = "sms/mealpay"; - public static final String SMS_API_PAY_QR_CODE_URI = "meal/code"; - //支付二维码 -// public static final String SMS_API_APPLY_TEMP_MESSAGE_URI = "sms/apply"; - public static final String SMS_API_APPLY_TEMP_MESSAGE_URI = "sms_v2/apply"; - //短信模板列表 -// public static final String SMS_API_TEMP_LIST_URI = "sms/template"; - public static final String SMS_API_TEMP_LIST_URI = "sms_v2/temps"; - // 发送短信 -// public static final String SMS_API_SEND_URI = "sms/send"; - public static final String SMS_API_SEND_URI = "sms_v2/send"; - // 获取发送状态 - public static final String SMS_API_SEND_STATUS = "sms/status"; - // 用户登录地址 - public static final String SMS_API_USER_LOGIN = "user/login"; - // 短信用户开通服务 - public static final String SMS_API_USER_OPEN = "sms_v2/open"; - //接口异常错误码 + /** 接口异常错误码 */ public static final Integer SMS_ERROR_CODE = 400; - //短信发送队列key + /** 短信发送队列key */ public static final String SMS_SEND_KEY = "sms_send_list"; - // 发送短信后状态同步key - public static final String SMS_SEND_RESULT_KEY = "sms_send_result_list"; - // 短信模版配置开关常量 - public static final String SMS_CONFIG_VERIFICATION_CODE = "verificationCode";// 验证码 - public static final Integer SMS_CONFIG_VERIFICATION_CODE_TEMP_ID = 518076;// + /** 手机验证码redis key */ + public static final String SMS_VALIDATE_PHONE = "sms_validate_code:"; - public static final String SMS_CONFIG_LOWER_ORDER_SWITCH = "lowerOrderSwitch";// 支付成功短信提醒 - public static final Integer SMS_CONFIG_LOWER_ORDER_SWITCH_TEMP_ID = 520268;// 对应的模版id + /** + * --------------------- + * 短信模版配置开关常量 + * --------------------- + */ + /** 验证码 */ + public static final String SMS_CONFIG_VERIFICATION_CODE = "verificationCode"; +// public static final Integer SMS_CONFIG_VERIFICATION_CODE_TEMP_ID = 518076; + /** 验证码模板ID */ + public static final Integer SMS_CONFIG_VERIFICATION_CODE_TEMP_ID = 435250; - public static final String SMS_CONFIG_DELIVER_GOODS_SWITCH = "deliverGoodsSwitch";// 发货短信提醒 -// public static final Integer SMS_CONFIG_DELIVER_GOODS_SWITCH_TEMP_ID = 520269; + /** 支付成功短信提醒 */ + public static final String SMS_CONFIG_LOWER_ORDER_SWITCH = "lowerOrderSwitch"; + /** 支付成功短信提醒模版ID */ + public static final Integer SMS_CONFIG_LOWER_ORDER_SWITCH_TEMP_ID = 440396; + + /** 发货短信提醒 */ + public static final String SMS_CONFIG_DELIVER_GOODS_SWITCH = "deliverGoodsSwitch"; + /** 发货短信提醒模版ID */ public static final Integer SMS_CONFIG_DELIVER_GOODS_SWITCH_TEMP_ID = 441596; - public static final String SMS_CONFIG_CONFIRM_TAKE_OVER_SWITCH = "confirmTakeOverSwitch";// 确认收货短信提醒 + /** 确认收货短信提醒 */ + public static final String SMS_CONFIG_CONFIRM_TAKE_OVER_SWITCH = "confirmTakeOverSwitch"; + /** 确认收货短信提醒模版ID */ public static final Integer SMS_CONFIG_CONFIRM_TAKE_OVER_SWITCH_TEMP_ID = 520271; - public static final String SMS_CONFIG_ADMIN_LOWER_ORDER_SWITCH = "adminLowerOrderSwitch";// 用户下单管理员短信提醒 - public static final Integer SMS_CONFIG_ADMIN_LOWER_ORDER_SWITCH_TEMP_ID = 520272; + /** 用户下单管理员短信提醒 */ + public static final String SMS_CONFIG_ADMIN_LOWER_ORDER_SWITCH = "adminLowerOrderSwitch"; + /** 用户下单管理员短信提醒模版ID */ + public static final Integer SMS_CONFIG_ADMIN_LOWER_ORDER_SWITCH_TEMP_ID = 440405; - public static final String SMS_CONFIG_ADMIN_PAY_SUCCESS_SWITCH = "adminPaySuccessSwitch";// 支付成功管理员短信提醒 - public static final Integer SMS_CONFIG_ADMIN_PAY_SUCCESS_SWITCH_TEMP_ID = 520273; + /** 支付成功管理员短信提醒 */ + public static final String SMS_CONFIG_ADMIN_PAY_SUCCESS_SWITCH = "adminPaySuccessSwitch"; + /** 支付成功管理员短信提醒模版ID */ + public static final Integer SMS_CONFIG_ADMIN_PAY_SUCCESS_SWITCH_TEMP_ID = 440406; - public static final String SMS_CONFIG_ADMIN_REFUND_SWITCH = "adminRefundSwitch";// 用户确认收货管理员短信提醒 - public static final Integer SMS_CONFIG_ADMIN_REFUND_SWITCH_TEMP_ID = 520422; + /** 用户确认收货管理员短信提醒 */ + public static final String SMS_CONFIG_ADMIN_REFUND_SWITCH = "adminRefundSwitch"; + /** 用户确认收货管理员短信提醒模版ID */ + public static final Integer SMS_CONFIG_ADMIN_REFUND_SWITCH_TEMP_ID = 440408; - public static final String SMS_CONFIG_ADMIN_CONFIRM_TAKE_OVER_SWITCH = "adminConfirmTakeOverSwitch";// 用户发起退款管理员短信提醒 - public static final Integer SMS_CONFIG_ADMIN_CONFIRM_TAKE_OVER_SWITCH_TEMP_ID = 520274; + /** 用户发起退款管理员短信提醒 */ + public static final String SMS_CONFIG_ADMIN_CONFIRM_TAKE_OVER_SWITCH = "adminConfirmTakeOverSwitch"; + /** 用户发起退款管理员短信提醒模版ID */ + public static final Integer SMS_CONFIG_ADMIN_CONFIRM_TAKE_OVER_SWITCH_TEMP_ID = 440407; - public static final String SMS_CONFIG_PRICE_REVISION_SWITCH = "priceRevisionSwitch";// 改价短信提醒 -// public static final Integer SMS_CONFIG_PRICE_REVISION_SWITCH_TEMP_ID = 528288; + /** 改价短信提醒 */ + public static final String SMS_CONFIG_PRICE_REVISION_SWITCH = "priceRevisionSwitch"; + /** 改价短信提醒模版ID */ public static final Integer SMS_CONFIG_PRICE_REVISION_SWITCH_TEMP_ID = 440410; - public static final String SMS_CONFIG_ORDER_PAY_FALSE = "orderPayFalse";// 订单未支付 + /** 订单未支付 */ + public static final String SMS_CONFIG_ORDER_PAY_FALSE = "orderPayFalse"; + /** 订单未支付模版ID */ public static final Integer SMS_CONFIG_ORDER_PAY_FALSE_TEMP_ID = 528116; + /** + * 短信类型 + * 短信模版配置开关常量 + */ + /** 验证码 */ + public static final int SMS_CONFIG_TYPE_VERIFICATION_CODE = 1; + /** 支付成功短信提醒 */ + public static final int SMS_CONFIG_TYPE_LOWER_ORDER_SWITCH = 2; + /** 发货短信提醒 */ + public static final int SMS_CONFIG_TYPE_DELIVER_GOODS_SWITCH = 3; + /** 确认收货短信提醒 */ + public static final int SMS_CONFIG_TYPE_CONFIRM_TAKE_OVER_SWITCH = 4; + /** 用户下单管理员短信提醒 */ + public static final int SMS_CONFIG_TYPE_ADMIN_LOWER_ORDER_SWITCH = 5; + /** 支付成功管理员短信提醒 */ + public static final int SMS_CONFIG_TYPE_ADMIN_PAY_SUCCESS_SWITCH = 6; + /** 用户确认收货管理员短信提醒 */ + public static final int SMS_CONFIG_TYPE_ADMIN_REFUND_SWITCH = 7; + /** 用户发起退款管理员短信提醒 */ + public static final int SMS_CONFIG_TYPE_ADMIN_CONFIRM_TAKE_OVER_SWITCH = 8; + /** 改价短信提醒 */ + public static final int SMS_CONFIG_TYPE_PRICE_REVISION_SWITCH = 9; + /** 订单未支付 */ + public static final int SMS_CONFIG_TYPE_ORDER_PAY_FALSE = 10; - //支付 - public static final String PAY_DEFAULT_PAY_TYPE = "weixin"; - - //手机验证码redis key - public static final String SMS_VALIDATE_PHONE = "sms_validate_code_"; - - //短信类型 - // 短信模版配置开关常量 - public static final int SMS_CONFIG_TYPE_VERIFICATION_CODE = 1;// 验证码 - public static final int SMS_CONFIG_TYPE_LOWER_ORDER_SWITCH = 2;// 支付成功短信提醒 - public static final int SMS_CONFIG_TYPE_DELIVER_GOODS_SWITCH = 3;// 发货短信提醒 - public static final int SMS_CONFIG_TYPE_CONFIRM_TAKE_OVER_SWITCH = 4;// 确认收货短信提醒 - public static final int SMS_CONFIG_TYPE_ADMIN_LOWER_ORDER_SWITCH = 5;// 用户下单管理员短信提醒 - public static final int SMS_CONFIG_TYPE_ADMIN_PAY_SUCCESS_SWITCH = 6;// 支付成功管理员短信提醒 - public static final int SMS_CONFIG_TYPE_ADMIN_REFUND_SWITCH = 7;// 用户确认收货管理员短信提醒 - public static final int SMS_CONFIG_TYPE_ADMIN_CONFIRM_TAKE_OVER_SWITCH = 8;// 用户发起退款管理员短信提醒 - public static final int SMS_CONFIG_TYPE_PRICE_REVISION_SWITCH = 9;// 改价短信提醒 - public static final int SMS_CONFIG_TYPE_ORDER_PAY_FALSE = 10;// 订单未支付 - - // 用户token的redis前缀 拼接secret - public static final String SMS_USER_TOKEN_REDIS_PREFIX = "sms_user_token_{}"; - // 发送短信参数模板 + /** 发送短信参数模板 */ public static final String SMS_COMMON_PARAM_FORMAT = "param[{}]"; - // 用户token前缀 - public static final String SMS_USER_TOKEN_PREFIX = "Bearer-"; - } +// /** 用户token前缀 */ +// public static final String SMS_USER_TOKEN_PREFIX = "Bearer-"; +// /** 支付 */ +// public static final String PAY_DEFAULT_PAY_TYPE = "weixin"; +// /** 用户token的redis前缀 拼接secret */ +// public static final String SMS_USER_TOKEN_REDIS_PREFIX = "sms_user_token_{}"; +} diff --git a/crmeb/src/main/java/com/constants/SysConfigConstants.java b/crmeb/src/main/java/com/constants/SysConfigConstants.java new file mode 100644 index 00000000..581fc5ed --- /dev/null +++ b/crmeb/src/main/java/com/constants/SysConfigConstants.java @@ -0,0 +1,25 @@ +package com.constants; + +/** + * 系统设置常量类 + * +---------------------------------------------------------------------- + * | CRMEB [ CRMEB赋能开发者,助力企业发展 ] + * +---------------------------------------------------------------------- + * | Copyright (c) 2016~2020 https://www.crmeb.com All rights reserved. + * +---------------------------------------------------------------------- + * | Licensed CRMEB并不是自由软件,未经许可不能去掉CRMEB相关版权 + * +---------------------------------------------------------------------- + * | Author: CRMEB Team + * +---------------------------------------------------------------------- + */ +public class SysConfigConstants { + + //后台首页登录图片 + /** 登录页LOGO */ + public static final String CONFIG_KEY_ADMIN_LOGIN_LOGO_LEFT_TOP = "site_logo_lefttop"; + public static final String CONFIG_KEY_ADMIN_LOGIN_LOGO_LOGIN = "site_logo_login"; + /** 登录页背景图 */ + public static final String CONFIG_KEY_ADMIN_LOGIN_BACKGROUND_IMAGE = "admin_login_bg_pic"; + + +} diff --git a/crmeb/src/main/java/com/constants/SysGroupDataConstants.java b/crmeb/src/main/java/com/constants/SysGroupDataConstants.java new file mode 100644 index 00000000..7af8fc2f --- /dev/null +++ b/crmeb/src/main/java/com/constants/SysGroupDataConstants.java @@ -0,0 +1,56 @@ +package com.constants; + +/** + * 组合数据常量类 + * +---------------------------------------------------------------------- + * | CRMEB [ CRMEB赋能开发者,助力企业发展 ] + * +---------------------------------------------------------------------- + * | Copyright (c) 2016~2020 https://www.crmeb.com All rights reserved. + * +---------------------------------------------------------------------- + * | Licensed CRMEB并不是自由软件,未经许可不能去掉CRMEB相关版权 + * +---------------------------------------------------------------------- + * | Author: CRMEB Team + * +---------------------------------------------------------------------- + */ +public class SysGroupDataConstants { + + /** 中部推荐banner图 */ + public static final Integer GROUP_DATA_ID_INDEX_BEST_BANNER = 37; + /** 首页banner滚动图 */ + public static final Integer GROUP_DATA_ID_INDEX_BANNER = 48; + /** 首页精品推荐Banner图片 */ + public static final Integer GROUP_DATA_ID_INDEX_RECOMMEND_BANNER = 52; + /** 订单详情状态图 */ + public static final Integer GROUP_DATA_ID_ORDER_STATUS_PIC = 53; + /** 个人中心菜单 */ + public static final Integer GROUP_DATA_ID_USER_CENTER_MENU = 54; + /** 签到配置 */ + public static final Integer GROUP_DATA_ID_SIGN = 55; + /** 热门搜索 */ + public static final Integer GROUP_DATA_ID_HOT_SEARCH = 56; + /** 热门榜单推荐Banner图片 */ + public static final Integer GROUP_DATA_ID_INDEX_HOT_BANNER = 57; + /** 首发新品推荐Banner图片 */ + public static final Integer GROUP_DATA_ID_INDEX_NEW_BANNER = 58; + /** 首页促销单品推荐Banner图片 */ + public static final Integer GROUP_DATA_ID_INDEX_BENEFIT_BANNER = 59; + /** 推广海报图 */ + public static final Integer GROUP_DATA_ID_SPREAD_BANNER_LIST = 60; + /** 充值金额设置 */ + public static final Integer GROUP_DATA_ID_RECHARGE_LIST = 62; + /** 个人中心轮播图 */ + public static final Integer GROUP_DATA_ID_USER_CENTER_BANNER = 65; + /** 导航模块 */ + public static final Integer GROUP_DATA_ID_INDEX_MENU = 67; + /** 首页滚动新闻 */ + public static final Integer GROUP_DATA_ID_INDEX_NEWS_BANNER = 68; + /** 首页活动区域图片 */ + public static final Integer GROUP_DATA_ID_INDEX_ACTIVITY_BANNER = 69; + /** 首页超值爆款 */ + public static final Integer GROUP_DATA_ID_INDEX_EX_BANNER = 70; + /** 热门搜索 */ + public static final Integer GROUP_DATA_ID_INDEX_KEYWORDS = 71; + /** 后台登录页面轮播图 */ + public static final Integer GROUP_DATA_ID_ADMIN_LOGIN_BANNER_IMAGE_LIST = 72; + +} diff --git a/crmeb/src/main/java/com/constants/UserConstants.java b/crmeb/src/main/java/com/constants/UserConstants.java new file mode 100644 index 00000000..82749de2 --- /dev/null +++ b/crmeb/src/main/java/com/constants/UserConstants.java @@ -0,0 +1,35 @@ +package com.constants; + +/** + * 用户常量表 + * +---------------------------------------------------------------------- + * | CRMEB [ CRMEB赋能开发者,助力企业发展 ] + * +---------------------------------------------------------------------- + * | Copyright (c) 2016~2020 https://www.crmeb.com All rights reserved. + * +---------------------------------------------------------------------- + * | Licensed CRMEB并不是自由软件,未经许可不能去掉CRMEB相关版权 + * +---------------------------------------------------------------------- + * | Author: CRMEB Team + * +---------------------------------------------------------------------- + */ +public class UserConstants { + + /** 用户类型——H5 */ + public static final String USER_TYPE_H5 = "h5"; + /** 用户类型——公众号 */ + public static final String USER_TYPE_WECHAT = "wechat"; + /** 用户类型——小程序 */ + public static final String USER_TYPE_ROUTINE = "routine"; + + /** + * ========================================================= + * UserToken部分 + * ========================================================= + */ + /** 用户Token类型——公众号 */ + public static final Integer USER_TOKEN_TYPE_WECHAT = 1; + /** 用户Token类型——小程序 */ + public static final Integer USER_TOKEN_TYPE_ROUTINE = 2; + /** 用户Token类型——unionid */ + public static final Integer USER_TOKEN_TYPE_UNIONID = 3; +} diff --git a/crmeb/src/main/java/com/filter/ResponseRouter.java b/crmeb/src/main/java/com/filter/ResponseRouter.java index 27ad7a54..5ed5f328 100644 --- a/crmeb/src/main/java/com/filter/ResponseRouter.java +++ b/crmeb/src/main/java/com/filter/ResponseRouter.java @@ -29,7 +29,8 @@ public class ResponseRouter { //根据需要处理返回值 - if(data.contains("image/") && !data.contains("data:image/png;base64")){ +// if(data.contains("image/") && !data.contains("data:image/png;base64")){ + if(data.contains("crmebimage/") && !data.contains("data:image/png;base64")){ data = SpringUtil.getBean(SystemAttachmentService.class).prefixImage(data); } diff --git a/crmeb/src/main/java/com/utils/CrmebUtil.java b/crmeb/src/main/java/com/utils/CrmebUtil.java index e7f153e3..87ac9326 100644 --- a/crmeb/src/main/java/com/utils/CrmebUtil.java +++ b/crmeb/src/main/java/com/utils/CrmebUtil.java @@ -603,6 +603,7 @@ public class CrmebUtil { /** * 同比率计算 //同比增长率= ((当前周期 - 上一个周期) ÷ 上一个周期 ) *100% + * 如果上个周期为0, = 当前周期 * 100% * @param b1 当前周期 * @param b2 上一个周期 * @author Mr.Zhang @@ -619,7 +620,7 @@ public class CrmebUtil { if(b2.equals(BigDecimal.ZERO)){ //b2是0 - return BigDecimal.TEN.multiply(BigDecimal.TEN).setScale(2, BigDecimal.ROUND_UP); + return b1.setScale(2, BigDecimal.ROUND_UP); } return (b1.subtract(b2)).multiply(BigDecimal.TEN).multiply(BigDecimal.TEN).divide(b2, BigDecimal.ROUND_UP); @@ -679,7 +680,7 @@ public class CrmebUtil { * @return 生成的随机码 */ public static String getOrderNo(String payType){ - return getOrderNoPrefix(payType) + DateUtil.nowDate(Constants.DATE_TIME_FORMAT_NUM) + randomCount(11111, 99999); + return payType + DateUtil.nowDate(Constants.DATE_TIME_FORMAT_NUM) + randomCount(11111, 99999); } /** diff --git a/crmeb/src/main/java/com/utils/RequestUtil.java b/crmeb/src/main/java/com/utils/RequestUtil.java index 4c68a4d9..444bc5c0 100644 --- a/crmeb/src/main/java/com/utils/RequestUtil.java +++ b/crmeb/src/main/java/com/utils/RequestUtil.java @@ -99,7 +99,8 @@ public class RequestUtil extends HttpServlet{ public static String getUri(HttpServletRequest request){ String uri = request.getRequestURI(); List list = CrmebUtil.stringToArrayStrRegex(uri, "/"); - list.removeIf(StringUtils::isNumeric); + list.removeIf(StringUtils::isNumeric); //去掉url中的数字参数 + list.removeIf(c -> c.contains(","));// 去掉url中的逗号分隔参数 return StringUtils.join(list, "/"); } } diff --git a/crmeb/src/main/java/com/utils/RestTemplateUtil.java b/crmeb/src/main/java/com/utils/RestTemplateUtil.java index 4544e1c2..2c1ca9e3 100644 --- a/crmeb/src/main/java/com/utils/RestTemplateUtil.java +++ b/crmeb/src/main/java/com/utils/RestTemplateUtil.java @@ -21,6 +21,7 @@ import org.apache.http.ssl.SSLContexts; import org.apache.http.util.EntityUtils; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.http.*; +import org.springframework.http.client.SimpleClientHttpRequestFactory; import org.springframework.stereotype.Component; import org.springframework.util.LinkedMultiValueMap; import org.springframework.util.MultiValueMap; @@ -68,6 +69,17 @@ public class RestTemplateUtil { " (" + System.getProperty("os.arch") + " " + System.getProperty("os.name") + " " + System.getProperty("os.version") + ") Java/" + System.getProperty("java.version") + " HttpClient/" + HttpClient.class.getPackage().getImplementationVersion(); +// /** +// * 设置超时时间 +// */ +// public RestTemplateUtil() { +// SimpleClientHttpRequestFactory requestFactory = new SimpleClientHttpRequestFactory(); +// //30s +// requestFactory.setConnectTimeout(30*1000); +// requestFactory.setReadTimeout(30*1000); +// restTemplate = new RestTemplate(requestFactory); +// } + /** * 发送GET请求 * @param url @@ -436,6 +448,11 @@ public class RestTemplateUtil { HttpEntity> requestEntity = new HttpEntity<>(params, headers); +// SimpleClientHttpRequestFactory requestFactory = new SimpleClientHttpRequestFactory(); +// //30s +// requestFactory.setConnectTimeout(30*1000); +// requestFactory.setReadTimeout(30*1000); +// restTemplate = new RestTemplate(requestFactory); return restTemplate.postForEntity(url, requestEntity, String.class).getBody(); } } diff --git a/crmeb/src/main/java/com/utils/UploadUtil.java b/crmeb/src/main/java/com/utils/UploadUtil.java index 26ef75b7..8f823d92 100644 --- a/crmeb/src/main/java/com/utils/UploadUtil.java +++ b/crmeb/src/main/java/com/utils/UploadUtil.java @@ -1,6 +1,7 @@ package com.utils; import cn.hutool.core.util.RandomUtil; +import cn.hutool.core.util.StrUtil; import com.constants.Constants; import com.exception.CrmebException; import com.zbkj.crmeb.upload.vo.FileResultVo; @@ -35,7 +36,8 @@ public class UploadUtil { //类型 // private static String imagePath = "/image"; - private static String type = "/image"; +// private static String type = "/image"; + private static String type = "/crmebimage"; //模块 @@ -260,12 +262,17 @@ public class UploadUtil { } // 文件名 String fileName = multipartFile.getOriginalFilename(); + System.out.println("fileName = " + fileName); // 文件后缀名 String extName = FilenameUtils.getExtension(fileName); if (StringUtils.isEmpty(extName)) { throw new RuntimeException("文件类型未定义不能上传..."); } + if (fileName.length() > 99) { + fileName = StrUtil.subPre(fileName, 90).concat(".").concat(extName); + } + //文件大小验证 checkSize(multipartFile.getSize()); diff --git a/crmeb/src/main/java/com/zbkj/crmeb/article/controller/ArticleController.java b/crmeb/src/main/java/com/zbkj/crmeb/article/controller/ArticleController.java index 95d776e6..60c71fa2 100644 --- a/crmeb/src/main/java/com/zbkj/crmeb/article/controller/ArticleController.java +++ b/crmeb/src/main/java/com/zbkj/crmeb/article/controller/ArticleController.java @@ -36,7 +36,6 @@ import org.springframework.web.bind.annotation.*; @RestController @RequestMapping("api/admin/article") @Api(tags = "文章管理") - public class ArticleController { @Autowired diff --git a/crmeb/src/main/java/com/zbkj/crmeb/article/service/impl/ArticleServiceImpl.java b/crmeb/src/main/java/com/zbkj/crmeb/article/service/impl/ArticleServiceImpl.java index 0c50c239..024050f0 100644 --- a/crmeb/src/main/java/com/zbkj/crmeb/article/service/impl/ArticleServiceImpl.java +++ b/crmeb/src/main/java/com/zbkj/crmeb/article/service/impl/ArticleServiceImpl.java @@ -3,6 +3,8 @@ package com.zbkj.crmeb.article.service.impl; import cn.hutool.core.util.ObjectUtil; import cn.hutool.core.util.StrUtil; import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; +import com.baomidou.mybatisplus.core.toolkit.Constants; +import com.baomidou.mybatisplus.core.toolkit.Wrappers; import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; import com.common.CommonPage; import com.common.PageParamRequest; @@ -18,16 +20,20 @@ import com.zbkj.crmeb.article.service.ArticleService; import com.zbkj.crmeb.article.vo.ArticleVo; import com.zbkj.crmeb.category.model.Category; import com.zbkj.crmeb.category.service.CategoryService; +import com.zbkj.crmeb.system.service.SystemConfigService; import org.apache.commons.lang3.StringUtils; import org.springframework.beans.BeanUtils; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; import javax.annotation.Resource; +import java.io.Console; import java.util.ArrayList; import java.util.List; import java.util.Optional; +import static com.constants.Constants.ARTICLE_BANNER_LIMIT; + /** * ArticleServiceImpl 接口实现 * +---------------------------------------------------------------------- @@ -49,7 +55,8 @@ public class ArticleServiceImpl extends ServiceImpl impleme @Autowired private CategoryService categoryService; - + @Autowired + private SystemConfigService systemConfigService; /** * 列表 * @param request ArticleSearchRequest 请求参数 @@ -62,7 +69,7 @@ public class ArticleServiceImpl extends ServiceImpl impleme public PageInfo getList(ArticleSearchRequest request, PageParamRequest pageParamRequest) { Page
articlePage = PageHelper.startPage(pageParamRequest.getPage(), pageParamRequest.getLimit()); - LambdaQueryWrapper
lambdaQueryWrapper = new LambdaQueryWrapper<>(); + LambdaQueryWrapper
lambdaQueryWrapper = Wrappers.lambdaQuery(); if(StringUtils.isNotBlank(request.getCid())){ lambdaQueryWrapper.eq(Article::getCid, request.getCid()); @@ -104,6 +111,9 @@ public class ArticleServiceImpl extends ServiceImpl impleme if(articleList.size() < 1){ return CommonPage.copyPageInfo(articlePage, articleVoArrayList); } + // 根据配置控制banner的数量 + String articleBannerLimitString = systemConfigService.getValueByKey(ARTICLE_BANNER_LIMIT); + int articleBannerLimit = Integer.parseInt(articleBannerLimitString); for (Article article : articleList) { ArticleVo articleVo = new ArticleVo(); @@ -113,6 +123,9 @@ public class ArticleServiceImpl extends ServiceImpl impleme articleVo.setImageInputs(article.getImageInput()); } articleVoArrayList.add(articleVo); + if(articleVoArrayList.size() >= articleBannerLimit){ + break; + } } return CommonPage.copyPageInfo(articlePage, articleVoArrayList); diff --git a/crmeb/src/main/java/com/zbkj/crmeb/authorization/controller/AdminUserController.java b/crmeb/src/main/java/com/zbkj/crmeb/authorization/controller/AdminUserController.java new file mode 100644 index 00000000..919f5660 --- /dev/null +++ b/crmeb/src/main/java/com/zbkj/crmeb/authorization/controller/AdminUserController.java @@ -0,0 +1,102 @@ +package com.zbkj.crmeb.authorization.controller; + +import com.common.CheckAdminToken; +import com.common.CommonResult; +import com.utils.CrmebUtil; +import com.zbkj.crmeb.system.request.SystemAdminLoginRequest; +import com.zbkj.crmeb.system.response.SystemAdminResponse; +import com.zbkj.crmeb.system.service.SystemAdminService; +import io.swagger.annotations.Api; +import io.swagger.annotations.ApiOperation; +import lombok.extern.slf4j.Slf4j; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.validation.annotation.Validated; +import org.springframework.web.bind.annotation.*; + +import javax.servlet.http.HttpServletRequest; +import java.util.Map; + +/** + * Admin 平台用户 + * +---------------------------------------------------------------------- + * | CRMEB [ CRMEB赋能开发者,助力企业发展 ] + * +---------------------------------------------------------------------- + * | Copyright (c) 2016~2020 https://www.crmeb.com All rights reserved. + * +---------------------------------------------------------------------- + * | Licensed CRMEB并不是自由软件,未经许可不能去掉CRMEB相关版权 + * +---------------------------------------------------------------------- + * | Author: CRMEB Team + * +---------------------------------------------------------------------- + */ +@Slf4j +@RestController +@RequestMapping("api/admin") +@Api(tags = "Admin 平台用户") +public class AdminUserController { + + @Autowired + private SystemAdminService systemAdminService; + + @Autowired + private CheckAdminToken checkAdminToken; + + @ApiOperation(value="PC登录") + @PostMapping(value = "/login", produces = "application/json") + public CommonResult SystemAdminLogin(@RequestBody @Validated SystemAdminLoginRequest systemAdminLoginRequest, HttpServletRequest request) throws Exception { + String ip = CrmebUtil.getClientIp(request); + SystemAdminResponse systemAdminResponse = systemAdminService.login(systemAdminLoginRequest, ip); +// if(StringUtils.isNotBlank(systemAdminLoginRequest.getWxCode())){ +// systemAdminService.bind(systemAdminLoginRequest.getWxCode(), systemAdminResponse.getId()); +// } + return CommonResult.success(systemAdminResponse, "login success"); + } + + @ApiOperation(value="PC登出") + @GetMapping(value = "/logout") + public CommonResult SystemAdminLogout(HttpServletRequest request) throws Exception { + String token = checkAdminToken.getTokenFormRequest(request); + systemAdminService.logout(token); + return CommonResult.success("logout success"); + } + + @ApiOperation(value="获取用户详情") + @GetMapping(value = "/getAdminInfoByToken") + public CommonResult getAdminInfo(HttpServletRequest request) throws Exception{ + String token = checkAdminToken.getTokenFormRequest(request); + SystemAdminResponse systemAdminResponse = systemAdminService.getInfoByToken(token); + + return CommonResult.success(systemAdminResponse); + } + + /** + * 获取登录页图片 + * @return Map + */ + @ApiOperation(value = "获取登录页图片") + @RequestMapping(value = "/getLoginPic", method = RequestMethod.GET) + public CommonResult> getLoginPic(){ + return CommonResult.success(systemAdminService.getLoginPic()); + } + +// /** +// * 微信登录公共号授权登录 +// * @author Mr.Zhang +// * @since 2020-05-25 +// */ +// @ApiOperation(value = "微信登录公共号授权登录") +// @RequestMapping(value = "/authorize/login", method = RequestMethod.GET) +// public CommonResult login(@RequestParam(value = "code") String code, HttpServletRequest request) throws Exception { +// return CommonResult.success(systemAdminService.weChatAuthorizeLogin(code, CrmebUtil.getClientIp(request))); +// } +// +// /** +// * 解绑微信 +// * @author Mr.Zhang +// * @since 2020-05-25 +// */ +// @ApiOperation(value = "解绑微信") +// @RequestMapping(value = "/unbind", method = RequestMethod.GET) +// public CommonResult bind(){ +// return CommonResult.success(systemAdminService.unBind()); +// } +} diff --git a/crmeb/src/main/java/com/zbkj/crmeb/authorization/controller/adminUser.java b/crmeb/src/main/java/com/zbkj/crmeb/authorization/controller/adminUser.java deleted file mode 100644 index 72b5c4a1..00000000 --- a/crmeb/src/main/java/com/zbkj/crmeb/authorization/controller/adminUser.java +++ /dev/null @@ -1,146 +0,0 @@ -package com.zbkj.crmeb.authorization.controller; - -import com.common.CheckAdminToken; -import com.common.CommonResult; -import com.constants.Constants; -import com.exception.CrmebException; -import com.exception.ExceptionCodeEnum; -import com.utils.CrmebUtil; -import com.zbkj.crmeb.system.request.SystemAdminLoginRequest; -import com.zbkj.crmeb.system.request.SystemAdminRequest; -import com.zbkj.crmeb.system.response.SystemAdminResponse; -import com.zbkj.crmeb.system.response.SystemGroupDataAdminLoginBannerResponse; -import com.zbkj.crmeb.system.service.SystemAdminService; -import com.zbkj.crmeb.system.service.SystemConfigService; -import com.zbkj.crmeb.system.service.SystemGroupDataService; -import com.zbkj.crmeb.validatecode.model.ValidateCode; -import com.zbkj.crmeb.validatecode.service.ValidateCodeService; -import io.swagger.annotations.Api; -import io.swagger.annotations.ApiOperation; -import lombok.extern.slf4j.Slf4j; -import org.apache.commons.lang3.StringUtils; -import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.validation.annotation.Validated; -import org.springframework.web.bind.annotation.*; - -import javax.servlet.http.HttpServletRequest; -import java.util.HashMap; -import java.util.List; -import java.util.Map; - -/** - * Admin 平台用户 - * +---------------------------------------------------------------------- - * | CRMEB [ CRMEB赋能开发者,助力企业发展 ] - * +---------------------------------------------------------------------- - * | Copyright (c) 2016~2020 https://www.crmeb.com All rights reserved. - * +---------------------------------------------------------------------- - * | Licensed CRMEB并不是自由软件,未经许可不能去掉CRMEB相关版权 - * +---------------------------------------------------------------------- - * | Author: CRMEB Team - * +---------------------------------------------------------------------- - */ -@Slf4j -@RestController -@RequestMapping("api/admin") -@Api(tags = "Admin 平台用户") -public class adminUser { - - @Autowired - private SystemAdminService systemAdminService; - - @Autowired - private CheckAdminToken checkAdminToken; - - @Autowired - private SystemConfigService systemConfigService; - - @Autowired - private SystemGroupDataService systemGroupDataService; - - @Autowired - private ValidateCodeService validateCodeService; - - @ApiOperation(value="AdminUserLogin") - @PostMapping(value = "/login", produces = "application/json") - public CommonResult SystemAdminLogin(@RequestBody @Validated SystemAdminLoginRequest systemAdminLoginRequest, HttpServletRequest request) throws Exception { - // 判断验证码 - ValidateCode validateCode = new ValidateCode(systemAdminLoginRequest.getKey(),systemAdminLoginRequest.getCode()); - boolean codeCheckResult = validateCodeService.check(validateCode); - if(!codeCheckResult) throw new CrmebException("验证码不正确"); - // 执行登录 - SystemAdminRequest systemAdminRequest = new SystemAdminRequest(); - systemAdminRequest.setAccount(systemAdminLoginRequest.getAccount()); - systemAdminRequest.setPwd(systemAdminLoginRequest.getPwd()); - SystemAdminResponse systemAdminResponse = systemAdminService.login(systemAdminRequest, CrmebUtil.getClientIp(request)); - if(null == systemAdminResponse){ - return CommonResult.failed(ExceptionCodeEnum.FAILED, "login failed"); - } - - if(StringUtils.isNotBlank(systemAdminLoginRequest.getWxCode())){ - systemAdminService.bind(systemAdminLoginRequest.getWxCode(), systemAdminResponse.getId()); - } - return CommonResult.success(systemAdminResponse, "login success"); - } - - @ApiOperation(value="AdminUserLogout") - @GetMapping(value = "/logout") - public CommonResult SystemAdminLogout(HttpServletRequest request) throws Exception { - String token = checkAdminToken.getTokenFormRequest(request); -// TokenModel tokenModel = tokenManager.getToken(token); -// if(StringUtils.isEmpty(tokenModel.getUserNo())){ -// throw new CrmebException(""); -// } - systemAdminService.logout(token); - return CommonResult.success("logout success"); - } - - @ApiOperation(value="GetAdminUserByToken") - @GetMapping(value = "/getAdminInfoByToken") - public CommonResult getAdminInfo(HttpServletRequest request) throws Exception{ - String token = checkAdminToken.getTokenFormRequest(request); - SystemAdminResponse systemAdminResponse = systemAdminService.getInfoByToken(token); - - return CommonResult.success(systemAdminResponse); - } - - /** - * 获取登录页图片 - * @return Map - */ - @ApiOperation(value = "获取登录页图片") - @RequestMapping(value = "/getLoginPic", method = RequestMethod.GET) - public CommonResult> getLoginPic(){ - Map map = new HashMap<>(); - //背景图 - map.put("backgroundImage", systemConfigService.getValueByKey(Constants.CONFIG_KEY_ADMIN_LOGIN_BACKGROUND_IMAGE)); - //logo - map.put("logo", systemConfigService.getValueByKey(Constants.CONFIG_KEY_ADMIN_LOGIN_LOGO)); - //轮播图 - List bannerList = systemGroupDataService.getListByGid(Constants.GROUP_DATA_ID_ADMIN_LOGIN_BANNER_IMAGE_LIST, SystemGroupDataAdminLoginBannerResponse.class); - map.put("banner", bannerList); - return CommonResult.success(map); - } - - /** - * 微信登录公共号授权登录 - * @author Mr.Zhang - * @since 2020-05-25 - */ - @ApiOperation(value = "微信登录公共号授权登录") - @RequestMapping(value = "/authorize/login", method = RequestMethod.GET) - public CommonResult login(@RequestParam(value = "code") String code, HttpServletRequest request) throws Exception { - return CommonResult.success(systemAdminService.weChatAuthorizeLogin(code, CrmebUtil.getClientIp(request))); - } - - /** - * 解绑微信 - * @author Mr.Zhang - * @since 2020-05-25 - */ - @ApiOperation(value = "解绑微信") - @RequestMapping(value = "/unbind", method = RequestMethod.GET) - public CommonResult bind(){ - return CommonResult.success(systemAdminService.unBind()); - } -} diff --git a/crmeb/src/main/java/com/zbkj/crmeb/authorization/manager/TokenManagerImpl.java b/crmeb/src/main/java/com/zbkj/crmeb/authorization/manager/TokenManagerImpl.java index 61cccf6b..32277161 100644 --- a/crmeb/src/main/java/com/zbkj/crmeb/authorization/manager/TokenManagerImpl.java +++ b/crmeb/src/main/java/com/zbkj/crmeb/authorization/manager/TokenManagerImpl.java @@ -1,6 +1,5 @@ package com.zbkj.crmeb.authorization.manager; -import cn.hutool.Hutool; import cn.hutool.core.thread.ThreadUtil; import com.common.CheckAdminToken; import com.common.CommonResult; @@ -16,10 +15,8 @@ import com.zbkj.crmeb.express.service.impl.ExpressServiceImpl; import com.zbkj.crmeb.validatecode.service.impl.ValidateCodeServiceImpl; import lombok.SneakyThrows; import org.apache.commons.lang3.StringUtils; -import org.apache.commons.lang3.ThreadUtils; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Value; -import org.springframework.boot.autoconfigure.condition.ConditionalOnSingleCandidate; import org.springframework.stereotype.Component; import javax.servlet.http.HttpServletRequest; diff --git a/crmeb/src/main/java/com/zbkj/crmeb/authorization/model/TokenModel.java b/crmeb/src/main/java/com/zbkj/crmeb/authorization/model/TokenModel.java index 3c0f6d58..f41c2c15 100644 --- a/crmeb/src/main/java/com/zbkj/crmeb/authorization/model/TokenModel.java +++ b/crmeb/src/main/java/com/zbkj/crmeb/authorization/model/TokenModel.java @@ -21,14 +21,15 @@ import java.util.Locale; */ @Data public class TokenModel implements Serializable { + private static final long serialVersionUID = 4903514237492573024L; // 加密后的token key public static final String TOKEN_KEY = "TOKEN"; // Redis 存储的key - public static final String TOKEN_REDIS = "TOKEN_ADMIN_"; + public static final String TOKEN_REDIS = "TOKEN:ADMIN:"; // 用户号 private String userNo; private Integer userId; - private String Token; + private String token; // 最后访问时间 private long lastAccessedTime = System.currentTimeMillis(); // 过期时间 @@ -43,12 +44,12 @@ public class TokenModel implements Serializable { private SystemAdmin systemAdmin; public String getAuthorization() throws Exception { - return CrmebUtil.encryptPassword(userNo+"_"+Token, TOKEN_KEY); + return CrmebUtil.encryptPassword(userNo+"_"+ token, TOKEN_KEY); } public TokenModel(String userno, String token){ this.userNo = userno; - this.Token = token; + this.token = token; } public TokenModel() { diff --git a/crmeb/src/main/java/com/zbkj/crmeb/bargain/service/impl/StoreBargainServiceImpl.java b/crmeb/src/main/java/com/zbkj/crmeb/bargain/service/impl/StoreBargainServiceImpl.java index c24b3e0c..b6e77ff3 100644 --- a/crmeb/src/main/java/com/zbkj/crmeb/bargain/service/impl/StoreBargainServiceImpl.java +++ b/crmeb/src/main/java/com/zbkj/crmeb/bargain/service/impl/StoreBargainServiceImpl.java @@ -12,7 +12,9 @@ import com.baomidou.mybatisplus.core.conditions.update.UpdateWrapper; import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; import com.common.CommonPage; import com.common.PageParamRequest; +import com.constants.BargainConstants; import com.constants.Constants; +import com.constants.ProductConstants; import com.exception.CrmebException; import com.github.pagehelper.Page; import com.github.pagehelper.PageHelper; @@ -158,7 +160,8 @@ public class StoreBargainServiceImpl extends ServiceImpl o.getStatus().equals(3)).count(); + Long countPeopleSuccess = bargainUserList.stream() + .filter(o -> o.getStatus().equals(BargainConstants.BARGAIN_USER_STATUS_SUCCESS)).count(); //帮忙砍价人数 Long countPeopleHelp = storeBargainUserHelpService.getHelpCountByBargainId(storeBargain.getId()); storeBargainResponse.setCountPeopleAll(countPeopleAll.longValue()); @@ -231,14 +234,15 @@ public class StoreBargainServiceImpl extends ServiceImpl 0 - ? systemAttachmentService.clearPrefix(request.getContent()) : "" , Constants.PRODUCT_TYPE_BARGAIN); - storeProductDescriptionService.deleteByProductId(spd.getProductId(), Constants.PRODUCT_TYPE_BARGAIN); + ? systemAttachmentService.clearPrefix(request.getContent()) : "" , ProductConstants.PRODUCT_TYPE_BARGAIN); + storeProductDescriptionService.deleteByProductId(spd.getProductId(), ProductConstants.PRODUCT_TYPE_BARGAIN); boolean saveDesc = storeProductDescriptionService.save(spd); if (!saveDesc) throw new CrmebException("新增商品富文本失败"); @@ -303,21 +307,21 @@ public class StoreBargainServiceImpl extends ServiceImpl 0; @@ -325,9 +329,9 @@ public class StoreBargainServiceImpl extends ServiceImpl attrs = attrService.getByEntity(spaPram); storeProductResponse.setAttr(attrs); storeProductResponse.setSliderImage(String.join(",",storeBargain.getImages())); @@ -378,15 +382,15 @@ public class StoreBargainServiceImpl extends ServiceImpl storeProductAttrValuesBargain = attrValueService.getByEntity(spavPramBargain); - List> attrValuesBargain = genratorSkuInfo(bargainId, specType, storeBargain, storeProductAttrValuesBargain, Constants.PRODUCT_TYPE_BARGAIN); + List> attrValuesBargain = genratorSkuInfo(bargainId, specType, storeBargain, storeProductAttrValuesBargain, ProductConstants.PRODUCT_TYPE_BARGAIN); // 查询attrValue StoreProductAttrValue spavPramProduct = new StoreProductAttrValue(); - spavPramProduct.setProductId(storeBargain.getProductId()).setType(Constants.PRODUCT_TYPE_NORMAL); + spavPramProduct.setProductId(storeBargain.getProductId()).setType(ProductConstants.PRODUCT_TYPE_NORMAL); List storeProductAttrValuesProduct = attrValueService.getByEntity(spavPramProduct); - List> attrValuesProduct = genratorSkuInfo(storeBargain.getProductId(), specType, storeBargain, storeProductAttrValuesProduct, Constants.PRODUCT_TYPE_NORMAL); + List> attrValuesProduct = genratorSkuInfo(storeBargain.getProductId(), specType, storeBargain, storeProductAttrValuesProduct, ProductConstants.PRODUCT_TYPE_NORMAL); // H5 端用于生成skuList List sPAVResponses = new ArrayList<>(); @@ -423,7 +427,7 @@ public class StoreBargainServiceImpl extends ServiceImpl() .eq(StoreProductDescription::getProductId, bargainId) - .eq(StoreProductDescription::getType, Constants.PRODUCT_TYPE_BARGAIN)); + .eq(StoreProductDescription::getType, ProductConstants.PRODUCT_TYPE_BARGAIN)); if(null != sd){ storeProductResponse.setContent(StrUtil.isBlank(sd.getDescription()) ? "" : sd.getDescription()); } @@ -470,7 +474,6 @@ public class StoreBargainServiceImpl extends ServiceImpl map = getMap(qw); -// Long userCount = storeBargainUserHelpService.getHelpPeopleCount(); Integer count = storeBargainUserHelpService.count(); map.put("userCount", count.longValue()); return map; @@ -478,8 +481,7 @@ public class StoreBargainServiceImpl extends ServiceImpl storeProductAttrValuesBargain = storeProductAttrValueService.getByEntity(spavPramBargain); // 查询attr StoreProductAttr spaPramNormal = new StoreProductAttr(); - spaPramNormal.setProductId(storeBargain.getProductId() ).setType(Constants.PRODUCT_TYPE_NORMAL); + spaPramNormal.setProductId(storeBargain.getProductId() ).setType(ProductConstants.PRODUCT_TYPE_NORMAL); List attrs = attrService.getByEntity(spaPramNormal); boolean specType = false; if (attrs.size() > 1) { specType = true; } - List> attrValuesBargain = genratorSkuInfo(id, specType, storeBargain, storeProductAttrValuesBargain, Constants.PRODUCT_TYPE_BARGAIN); + List> attrValuesBargain = genratorSkuInfo(id, specType, storeBargain, storeProductAttrValuesBargain, ProductConstants.PRODUCT_TYPE_BARGAIN); // H5 端用于生成skuList List sPAVResponses = new ArrayList<>(); @@ -523,7 +525,7 @@ public class StoreBargainServiceImpl extends ServiceImpl() .eq(StoreProductDescription::getProductId, id) - .eq(StoreProductDescription::getType, Constants.PRODUCT_TYPE_BARGAIN)); + .eq(StoreProductDescription::getType, ProductConstants.PRODUCT_TYPE_BARGAIN)); if(null != sd){ storeProductResponse.setContent(null == sd.getDescription()?"":sd.getDescription()); } @@ -546,23 +548,14 @@ public class StoreBargainServiceImpl extends ServiceImpl list = storeBargainUserService.getListByBargainIdAndUid(storeBargain.getId(), uid); -// if (CollUtil.isNotEmpty(list) && list.size() >= storeBargain.getNum()) { -// userBargainStatus = 1; -// } List list = storeBargainUserService.getListByBargainIdAndUid(storeBargain.getId(), uid); if (CollUtil.isNotEmpty(list)) { userBargainStatus = list.size(); @@ -572,13 +565,12 @@ public class StoreBargainServiceImpl extends ServiceImpl getCurrentBargainByProductId(Integer productId) { long timeMillis = System.currentTimeMillis(); - PageParamRequest pageParamRequest = new PageParamRequest(); LambdaQueryWrapper lqw = new LambdaQueryWrapper<>(); lqw.eq(StoreBargain::getProductId, productId); lqw.eq(StoreBargain::getIsDel, false); @@ -590,8 +582,8 @@ public class StoreBargainServiceImpl extends ServiceImpl historyList = storeBargainUserService.getByEntity(spavBargainUser); if (CollUtil.isNotEmpty(historyList)) { - List collect = historyList.stream().filter(i -> i.getStatus() == 1).collect(Collectors.toList()); + List collect = historyList.stream().filter(i -> i.getStatus().equals(BargainConstants.BARGAIN_USER_STATUS_PARTICIPATE)).collect(Collectors.toList()); if (CollUtil.isNotEmpty(collect)) throw new CrmebException("请先完成当前砍价活动"); // 判断是否达到参与砍价活动上限 if (historyList.size() >= storeBargain.getNum()) { @@ -620,14 +612,14 @@ public class StoreBargainServiceImpl extends ServiceImpl getByEntity(StoreBargain storeBargainParam) { @@ -650,7 +642,7 @@ public class StoreBargainServiceImpl extends ServiceImpl attrvalues = storeProductAttrValueService.getByEntity(spavParm); if (CollUtil.isEmpty(attrvalues)) throw new CrmebException("未找到相关商品属性"); @@ -658,7 +650,7 @@ public class StoreBargainServiceImpl extends ServiceImpl currentProAttrValues = storeProductAttrValueService.getListByProductId(productId); List existAttrValues = currentProAttrValues.stream().filter(e -> - e.getSuk().equals(bargaunAttrValue.getSuk()) && e.getType().equals(Constants.PRODUCT_TYPE_NORMAL)) + e.getSuk().equals(bargaunAttrValue.getSuk()) && e.getType().equals(ProductConstants.PRODUCT_TYPE_NORMAL)) .collect(Collectors.toList()); if (CollUtil.isEmpty(existAttrValues)) throw new CrmebException("未找到扣减库存的商品"); // 砍价SKU 库存减,销量、限购总数减 @@ -674,8 +666,8 @@ public class StoreBargainServiceImpl extends ServiceImpl { - storeProductAttrValueService.decProductAttrStock(bargainId, attrValueId, num, Constants.PRODUCT_TYPE_BARGAIN); - storeProductService.decProductStock(productId, num, existAttrValues.get(0).getId(), Constants.PRODUCT_TYPE_NORMAL); + storeProductAttrValueService.decProductAttrStock(bargainId, attrValueId, num, ProductConstants.PRODUCT_TYPE_BARGAIN); + storeProductService.decProductStock(productId, num, existAttrValues.get(0).getId(), ProductConstants.PRODUCT_TYPE_NORMAL); update(luw); storeBargainUserService.updateById(storeBargainUser); return Boolean.TRUE; @@ -743,14 +735,14 @@ public class StoreBargainServiceImpl extends ServiceImpl bargainUsers = storeBargainUserService.getByEntity(spavBargainUser); if (CollUtil.isEmpty(bargainUsers)) { continue ; } for (int i = 0; i < bargainUsers.size(); i++) { - bargainUsers.get(i).setStatus(2); + bargainUsers.get(i).setStatus(BargainConstants.BARGAIN_USER_STATUS_FAIL); } bargainUserList.addAll(bargainUsers); } diff --git a/crmeb/src/main/java/com/zbkj/crmeb/bargain/service/impl/StoreBargainUserHelpServiceImpl.java b/crmeb/src/main/java/com/zbkj/crmeb/bargain/service/impl/StoreBargainUserHelpServiceImpl.java index 9fb6fbe5..48ccc303 100644 --- a/crmeb/src/main/java/com/zbkj/crmeb/bargain/service/impl/StoreBargainUserHelpServiceImpl.java +++ b/crmeb/src/main/java/com/zbkj/crmeb/bargain/service/impl/StoreBargainUserHelpServiceImpl.java @@ -8,7 +8,9 @@ import com.baomidou.mybatisplus.core.conditions.update.LambdaUpdateWrapper; import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; import com.common.CommonPage; import com.common.PageParamRequest; +import com.constants.BargainConstants; import com.constants.Constants; +import com.constants.UserConstants; import com.exception.CrmebException; import com.github.pagehelper.Page; import com.github.pagehelper.PageHelper; @@ -25,7 +27,9 @@ import com.zbkj.crmeb.bargain.service.StoreBargainUserService; import com.zbkj.crmeb.front.request.BargainFrontRequest; import com.zbkj.crmeb.front.response.BargainCountResponse; import com.zbkj.crmeb.user.model.User; +import com.zbkj.crmeb.user.model.UserToken; import com.zbkj.crmeb.user.service.UserService; +import com.zbkj.crmeb.user.service.UserTokenService; import com.zbkj.crmeb.wechat.service.TemplateMessageService; import org.springframework.beans.BeanUtils; import org.springframework.beans.factory.annotation.Autowired; @@ -68,6 +72,9 @@ public class StoreBargainUserHelpServiceImpl extends ServiceImpl storeBargainUserHelps = dao.selectList(lqw); if (CollUtil.isEmpty(storeBargainUserHelps)) { - return new BargainCountResponse(ZERO, 0, bargainUser.getBargainPrice().subtract(bargainUser.getBargainPriceMin()), 0, 1, true, isConsume); + return new BargainCountResponse(ZERO, 0, bargainUser.getBargainPrice().subtract(bargainUser.getBargainPriceMin()), 0, BargainConstants.BARGAIN_USER_STATUS_PARTICIPATE, true, isConsume); } // 已砍金额 @@ -176,19 +183,6 @@ public class StoreBargainUserHelpServiceImpl extends ServiceImpl lqWrapper = new LambdaQueryWrapper<>(); -// lqWrapper.eq(StoreBargainUserHelp::getBargainId, request.getBargainId()); -// lqWrapper.eq(StoreBargainUserHelp::getUid, user.getUid()); -// lqWrapper.ne(StoreBargainUserHelp::getBargainUserId, bargainUser.getId()); -// List myHelps = dao.selectList(lqWrapper); -// if (CollUtil.isEmpty(myHelps)) { -// userBargainStatus = true; -// } else if (myHelps.size() < storeBargain.getBargainNum()) { -// userBargainStatus = true; -// } else { -// isConsume = true; -// } } } @@ -246,7 +240,7 @@ public class StoreBargainUserHelpServiceImpl extends ServiceImpl= 0) { + if (storeBargainUser.getStatus().equals(BargainConstants.BARGAIN_USER_STATUS_SUCCESS) || storeBargainUser.getBargainPriceMin().compareTo(storeBargainUser.getBargainPrice().subtract(storeBargainUser.getPrice())) >= 0) { throw new CrmebException("商品已完成砍价"); } @@ -302,22 +296,61 @@ public class StoreBargainUserHelpServiceImpl extends ServiceImpl temMap = new HashMap<>(); - temMap.put(Constants.WE_CHAT_TEMP_KEY_FIRST, "好腻害!你的朋友们已经帮你砍到底价了!"); - temMap.put("keyword1", storeBargain.getTitle()); - temMap.put("keyword2", storeBargain.getMinPrice().toString()); - temMap.put(Constants.WE_CHAT_TEMP_KEY_END, "感谢您的参与!"); +// HashMap temMap = new HashMap<>(); +// temMap.put(Constants.WE_CHAT_TEMP_KEY_FIRST, "好腻害!你的朋友们已经帮你砍到底价了!"); +// temMap.put("keyword1", storeBargain.getTitle()); +// temMap.put("keyword2", storeBargain.getMinPrice().toString()); +// temMap.put(Constants.WE_CHAT_TEMP_KEY_END, "感谢您的参与!"); +// +// templateMessageService.push(Constants.WE_CHAT_TEMP_KEY_BARGAIN_SUCCESS, temMap, storeBargainUser.getUid(), Constants.PAY_TYPE_WE_CHAT_FROM_PUBLIC); - templateMessageService.push(Constants.WE_CHAT_TEMP_KEY_BARGAIN_SUCCESS, temMap, storeBargainUser.getUid(), Constants.PAY_TYPE_WE_CHAT_FROM_PUBLIC); + User tempUser = userService.getById(storeBargainUser.getUid()); + pushMessageOrder(storeBargain, tempUser); } map.put("bargainPrice", bargainPrice); return map; } + /** + * 发送消息通知 + * @param storeBargain 砍价商品 + * @param user 发起砍价用户 + */ + private void pushMessageOrder(StoreBargain storeBargain, User user) { + if (user.getUserType().equals(UserConstants.USER_TYPE_H5)) { + return; + } + UserToken userToken; + HashMap temMap = new HashMap<>(); + // 公众号 + if (user.getUserType().equals(UserConstants.USER_TYPE_WECHAT)) { + userToken = userTokenService.getTokenByUserId(user.getUid(), UserConstants.USER_TOKEN_TYPE_WECHAT); + if (ObjectUtil.isNull(userToken)) { + return ; + } + // 发送微信模板消息 + temMap.put(Constants.WE_CHAT_TEMP_KEY_FIRST, "好腻害!你的朋友们已经帮你砍到底价了!"); + temMap.put("keyword1", storeBargain.getTitle()); + temMap.put("keyword2", storeBargain.getMinPrice().toString()); + temMap.put(Constants.WE_CHAT_TEMP_KEY_END, "请尽快支付!"); + templateMessageService.pushTemplateMessage(Constants.WE_CHAT_TEMP_KEY_BARGAIN_SUCCESS, temMap, userToken.getToken()); + return; + } + // 小程序发送订阅消息 + userToken = userTokenService.getTokenByUserId(user.getUid(), UserConstants.USER_TOKEN_TYPE_ROUTINE); + if (ObjectUtil.isNull(userToken)) { + return ; + } + // 组装数据 + temMap.put("thing6", storeBargain.getTitle()); + temMap.put("amount3", storeBargain.getMinPrice().toString() + "元"); + temMap.put("thing7", "好腻害!你的朋友们已经帮你砍到底价了!"); + templateMessageService.pushMiniTemplateMessage(Constants.WE_CHAT_PROGRAM_TEMP_KEY_BARGAIN_SUCCESS, temMap, userToken.getToken()); + } + /** * 获取参与砍价人员数量 - * @return */ @Override public Long getHelpPeopleCount() { @@ -339,8 +372,7 @@ public class StoreBargainUserHelpServiceImpl extends ServiceImpl startUser(BargainFrontRequest bargainFrontRequest) { @@ -427,7 +458,6 @@ public class StoreBargainUserHelpServiceImpl extends ServiceImpl lambdaQueryWrapper = new LambdaQueryWrapper<>(); diff --git a/crmeb/src/main/java/com/zbkj/crmeb/bargain/service/impl/StoreBargainUserServiceImpl.java b/crmeb/src/main/java/com/zbkj/crmeb/bargain/service/impl/StoreBargainUserServiceImpl.java index bfe1aecc..a5cdab70 100644 --- a/crmeb/src/main/java/com/zbkj/crmeb/bargain/service/impl/StoreBargainUserServiceImpl.java +++ b/crmeb/src/main/java/com/zbkj/crmeb/bargain/service/impl/StoreBargainUserServiceImpl.java @@ -8,6 +8,7 @@ import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; import com.common.CommonPage; import com.common.PageParamRequest; +import com.constants.BargainConstants; import com.constants.Constants; import com.github.pagehelper.Page; import com.github.pagehelper.PageHelper; @@ -100,7 +101,7 @@ public class StoreBargainUserServiceImpl extends ServiceImpl userList = dao.selectList(lqw); if (CollUtil.isEmpty(userList)) { diff --git a/crmeb/src/main/java/com/zbkj/crmeb/category/controller/CategoryController.java b/crmeb/src/main/java/com/zbkj/crmeb/category/controller/CategoryController.java index 214ebc29..1d9d6ebe 100644 --- a/crmeb/src/main/java/com/zbkj/crmeb/category/controller/CategoryController.java +++ b/crmeb/src/main/java/com/zbkj/crmeb/category/controller/CategoryController.java @@ -66,23 +66,11 @@ import java.util.List; /** * 新增分类表 * @param categoryRequest 新增参数 - * @author Mr.Zhang - * @since 2020-04-16 */ @ApiOperation(value = "新增") @RequestMapping(value = "/save", method = RequestMethod.POST) public CommonResult save(@Validated CategoryRequest categoryRequest){ - Category category = new Category(); - - //检测标题是否存在 - if(categoryService.checkName(categoryRequest.getName(), category.getType()) > 0){ - throw new CrmebException("此分类已存在"); - } - - BeanUtils.copyProperties(categoryRequest, category); - category.setPath(categoryService.getPathByPId(category.getPid())); - category.setExtra(systemAttachmentService.clearPrefix(category.getExtra())); - if(categoryService.save(category)){ + if(categoryService.create(categoryRequest)){ return CommonResult.success(); }else{ return CommonResult.failed(); diff --git a/crmeb/src/main/java/com/zbkj/crmeb/category/service/CategoryService.java b/crmeb/src/main/java/com/zbkj/crmeb/category/service/CategoryService.java index b4d748bc..ef4f7f3c 100644 --- a/crmeb/src/main/java/com/zbkj/crmeb/category/service/CategoryService.java +++ b/crmeb/src/main/java/com/zbkj/crmeb/category/service/CategoryService.java @@ -36,8 +36,6 @@ public interface CategoryService extends IService { HashMap getListInId(List cateIdList); - void checkCategoryIsExist(List categoryIdList); - Boolean checkAuth(List pathIdList, String uri); boolean update(CategoryRequest request, Integer id); @@ -49,4 +47,9 @@ public interface CategoryService extends IService { boolean checkUrl(String uri); boolean updateStatus(Integer id); + + /** + * 新增分类表 + */ + Boolean create(CategoryRequest categoryRequest); } diff --git a/crmeb/src/main/java/com/zbkj/crmeb/category/service/impl/CategoryServiceImpl.java b/crmeb/src/main/java/com/zbkj/crmeb/category/service/impl/CategoryServiceImpl.java index b5383a3b..884be45d 100644 --- a/crmeb/src/main/java/com/zbkj/crmeb/category/service/impl/CategoryServiceImpl.java +++ b/crmeb/src/main/java/com/zbkj/crmeb/category/service/impl/CategoryServiceImpl.java @@ -1,5 +1,6 @@ package com.zbkj.crmeb.category.service.impl; +import cn.hutool.core.collection.CollUtil; import cn.hutool.core.util.ObjectUtil; import com.alibaba.fastjson.JSON; import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; @@ -8,6 +9,7 @@ import com.baomidou.mybatisplus.core.toolkit.StringUtils; import com.baomidou.mybatisplus.core.toolkit.Wrappers; import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; import com.common.PageParamRequest; +import com.constants.CategoryConstants; import com.exception.CrmebException; import com.github.pagehelper.PageHelper; import com.utils.CrmebUtil; @@ -17,7 +19,9 @@ import com.zbkj.crmeb.category.request.CategoryRequest; import com.zbkj.crmeb.category.request.CategorySearchRequest; import com.zbkj.crmeb.category.service.CategoryService; import com.zbkj.crmeb.category.vo.CategoryTreeVo; +import com.zbkj.crmeb.system.service.SystemAttachmentService; import org.springframework.beans.BeanUtils; +import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; import javax.annotation.Resource; @@ -25,6 +29,7 @@ import java.util.ArrayList; import java.util.HashMap; import java.util.List; import java.util.Map; +import java.util.stream.Collectors; /** * CategoryServiceImpl 接口实现 @@ -44,6 +49,9 @@ public class CategoryServiceImpl extends ServiceImpl impl @Resource private CategoryDao dao; + @Autowired + private SystemAttachmentService systemAttachmentService; + /** * 获取分类下子类的数量 @@ -57,7 +65,6 @@ public class CategoryServiceImpl extends ServiceImpl impl public List getList(CategorySearchRequest request, PageParamRequest pageParamRequest) { PageHelper.startPage(pageParamRequest.getPage(), pageParamRequest.getLimit()); LambdaQueryWrapper lambdaQueryWrapper = new LambdaQueryWrapper<>(); -// objectQueryWrapper.setEntity(category); if(null != request.getPid()){ lambdaQueryWrapper.eq(Category::getPid, request.getPid()); } @@ -65,7 +72,7 @@ public class CategoryServiceImpl extends ServiceImpl impl lambdaQueryWrapper.eq(Category::getType, request.getType()); } if(ObjectUtil.isNotNull(request.getStatus()) && request.getStatus() >= 0){ - lambdaQueryWrapper.eq(Category::getStatus, request.getStatus().equals(1)); + lambdaQueryWrapper.eq(Category::getStatus, request.getStatus().equals(CategoryConstants.CATEGORY_STATUS_NORMAL)); } if(null != request.getName()){ lambdaQueryWrapper.like(Category::getName, request.getName()); @@ -106,28 +113,6 @@ public class CategoryServiceImpl extends ServiceImpl impl return map; } - /** - * 批量查询分类id是否合法 - * @param categoryIdList List id集合 - * @author Mr.Zhang - * @since 2020-04-16 - */ - @Override - public void checkCategoryIsExist(List categoryIdList) { - //查询分类id是否合法 - HashMap categoryServiceListInId = getListInId(categoryIdList); - if(categoryServiceListInId.size() != categoryIdList.size()){ - for (Integer categoryId: categoryIdList) { - String categoryName = CrmebUtil.getStrValueByIndex(categoryServiceListInId, categoryId); - - if(categoryName.equals("")){ - //如果取出的分类名称是空, 那么有问题 - throw new CrmebException("ID是 " + categoryId + "的分类不存在,或者分类名称为空!"); - } - } - } - } - /** * 查询id和url是否存在 * @author Mr.Zhang @@ -213,7 +198,6 @@ public class CategoryServiceImpl extends ServiceImpl impl private int getChildCountByPid(Integer pid) { //查看是否有子类 QueryWrapper objectQueryWrapper = new QueryWrapper<>(); -// objectQueryWrapper.eq("status", 1); objectQueryWrapper.like("path", "/"+pid+"/"); return dao.selectCount(objectQueryWrapper); } @@ -297,10 +281,14 @@ public class CategoryServiceImpl extends ServiceImpl impl // 根据名称搜索特殊处理 这里仅仅处理两层搜索后有子父级关系的数据 if(StringUtils.isNotBlank(name) && allTree.size() >0){ List searchCategory = new ArrayList<>(); - for (Category category : allTree) { - if(category.getPid() >0){ - searchCategory.add(dao.selectById(category.getPid())); - } + List categoryIds = allTree.stream().map(Category::getId).collect(Collectors.toList()); + + List pidList = allTree.stream().filter(c -> c.getPid() > 0 && !categoryIds.contains(c.getPid())) + .map(Category::getPid).distinct().collect(Collectors.toList()); + if (CollUtil.isNotEmpty(pidList)) { + pidList.forEach(pid -> { + searchCategory.add(dao.selectById(pid)); + }); } allTree.addAll(searchCategory); } @@ -361,7 +349,7 @@ public class CategoryServiceImpl extends ServiceImpl impl public List getChildVoListByPid(Integer pid) { //查看是否有子类 QueryWrapper objectQueryWrapper = new QueryWrapper<>(); - objectQueryWrapper.eq("status", 1); + objectQueryWrapper.eq("status", CategoryConstants.CATEGORY_STATUS_NORMAL); objectQueryWrapper.like("path", "/"+pid+"/"); return dao.selectList(objectQueryWrapper); } @@ -377,8 +365,10 @@ public class CategoryServiceImpl extends ServiceImpl impl @Override public int checkName(String name, Integer type) { LambdaQueryWrapper lambdaQueryWrapper = new LambdaQueryWrapper<>(); - lambdaQueryWrapper.eq(Category::getName, name) - .eq(Category::getType, type); + lambdaQueryWrapper.eq(Category::getName, name); + if (ObjectUtil.isNotNull(type)) { + lambdaQueryWrapper.eq(Category::getType, type); + } return dao.selectCount(lambdaQueryWrapper); } @@ -402,5 +392,22 @@ public class CategoryServiceImpl extends ServiceImpl impl category.setStatus(!category.getStatus()); return updateById(category); } + + /** + * 新增分类 + * @param categoryRequest + */ + @Override + public Boolean create(CategoryRequest categoryRequest) { + //检测标题是否存在 + if(checkName(categoryRequest.getName(), null) > 0){ + throw new CrmebException("此分类已存在"); + } + Category category = new Category(); + BeanUtils.copyProperties(categoryRequest, category); + category.setPath(getPathByPId(category.getPid())); + category.setExtra(systemAttachmentService.clearPrefix(category.getExtra())); + return save(category); + } } diff --git a/crmeb/src/main/java/com/zbkj/crmeb/combination/request/StoreCombinationRequest.java b/crmeb/src/main/java/com/zbkj/crmeb/combination/request/StoreCombinationRequest.java index 0dbde28f..6857c907 100644 --- a/crmeb/src/main/java/com/zbkj/crmeb/combination/request/StoreCombinationRequest.java +++ b/crmeb/src/main/java/com/zbkj/crmeb/combination/request/StoreCombinationRequest.java @@ -1,7 +1,5 @@ package com.zbkj.crmeb.combination.request; -import com.baomidou.mybatisplus.annotation.IdType; -import com.baomidou.mybatisplus.annotation.TableId; import com.baomidou.mybatisplus.annotation.TableName; import com.zbkj.crmeb.store.model.StoreProductAttr; import com.zbkj.crmeb.store.request.StoreProductAttrValueRequest; @@ -155,9 +153,8 @@ public class StoreCombinationRequest implements Serializable { @Min(value = 1, message = "单次购买数量限制不能小于1") private Integer onceNum; - @ApiModelProperty(value = "虚拟成团百分比") - @Min(value = 1, message = "虚拟成团百分比不能小于1") - @Max(value = 100, message = "虚拟成团百分比不能大于100") + @ApiModelProperty(value = "虚拟成团数量") + @Min(value = 0, message = "虚拟成团数量不能小于0") private Integer virtualRation; @ApiModelProperty(value = "商品属性") diff --git a/crmeb/src/main/java/com/zbkj/crmeb/combination/service/StorePinkService.java b/crmeb/src/main/java/com/zbkj/crmeb/combination/service/StorePinkService.java index 4b66f207..37c88683 100644 --- a/crmeb/src/main/java/com/zbkj/crmeb/combination/service/StorePinkService.java +++ b/crmeb/src/main/java/com/zbkj/crmeb/combination/service/StorePinkService.java @@ -78,4 +78,11 @@ public interface StorePinkService extends IService { * @return */ boolean pinkSuccess(Integer kid); + + /** + * 根据订单编号获取 + * @param orderId + * @return + */ + StorePink getByOrderId(String orderId); } \ No newline at end of file diff --git a/crmeb/src/main/java/com/zbkj/crmeb/combination/service/impl/StoreCombinationServiceImpl.java b/crmeb/src/main/java/com/zbkj/crmeb/combination/service/impl/StoreCombinationServiceImpl.java index e57c7f04..de61a9f4 100644 --- a/crmeb/src/main/java/com/zbkj/crmeb/combination/service/impl/StoreCombinationServiceImpl.java +++ b/crmeb/src/main/java/com/zbkj/crmeb/combination/service/impl/StoreCombinationServiceImpl.java @@ -432,7 +432,10 @@ public class StoreCombinationServiceImpl extends ServiceImpl 1) { + StoreProductAttr proPram = new StoreProductAttr(); + spaPram.setProductId(id).setType(Constants.PRODUCT_TYPE_NORMAL); + List proAttrs = storeProductAttrService.getByEntity(proPram); + if (proAttrs.size() > 1) { specType = true; } storeProductResponse.setSpecType(specType); @@ -860,15 +863,16 @@ public class StoreCombinationServiceImpl extends ServiceImpl 0 ? userPink.getKId() : userPink.getId(); + Integer count = storePinkService.getCountByKid(kid); if (count.equals(userPink.getPeople())) { // 拼团完成操作 - storePinkService.pinkSuccess(userPink.getId()); + storePinkService.pinkSuccess(kid); throw new CrmebException("拼团已完成,无法取消"); } if (userPink.getStatus() == 3) { @@ -884,6 +888,7 @@ public class StoreCombinationServiceImpl extends ServiceImpl i @Autowired private TemplateMessageService templateMessageService; + @Autowired + private UserTokenService userTokenService; + /** * 列表 @@ -207,26 +215,20 @@ public class StorePinkServiceImpl extends ServiceImpl i for (StorePink headPink : headList) { // 查询团员 List memberList = getListByCidAndKid(headPink.getCid(), headPink.getId()); - if (CollUtil.isNotEmpty(memberList)) { - if (headPink.getPeople().equals(memberList.size() + 1)) { - headPink.setStatus(2); - memberList.forEach(i -> i.setStatus(2)); - pinkSuccessList.add(headPink); - pinkSuccessList.addAll(memberList); - continue; - } - // 计算虚拟比例,判断是否拼团成功 - StoreCombination storeCombination = storeCombinationService.getById(headPink.getCid()); - Integer virtual = storeCombination.getVirtualRation();// 虚拟成团比例 - int a = (memberList.size() + 1) * 100; - int b = storeCombination.getPeople() * virtual; - if (a >= b) {// 可以虚拟成团 - headPink.setStatus(2).setIs_virtual(true); - memberList.forEach(i -> i.setStatus(2).setIs_virtual(true)); - pinkSuccessList.add(headPink); - pinkSuccessList.addAll(memberList); - continue; - } + memberList.add(headPink); + if (headPink.getPeople().equals(memberList.size())) { + memberList.forEach(i -> i.setStatus(2)); + pinkSuccessList.addAll(memberList); + continue; + } + // 计算虚拟比例,判断是否拼团成功 + StoreCombination storeCombination = storeCombinationService.getById(headPink.getCid()); + Integer virtual = storeCombination.getVirtualRation();// 虚拟成团比例 + if (headPink.getPeople() <= memberList.size() + virtual) { + // 可以虚拟成团 + memberList.forEach(i -> i.setStatus(2).setIs_virtual(true)); + pinkSuccessList.addAll(memberList); + continue; } // 失败 headPink.setStatus(3); @@ -266,18 +268,61 @@ public class StorePinkServiceImpl extends ServiceImpl i pinkSuccessList.forEach(i -> { StoreOrder storeOrder = storeOrderService.getByOderId(i.getOrderId()); StoreCombination storeCombination = storeCombinationService.getById(i.getCid()); + User tempUser = userService.getById(i.getUid()); // 发送微信模板消息 - HashMap map = new HashMap<>(); - map.put(Constants.WE_CHAT_TEMP_KEY_FIRST, "恭喜您拼团成功!我们将尽快为您发货。"); - map.put("keyword1", storeOrder.getOrderId()); - map.put("keyword2", storeCombination.getTitle()); - map.put(Constants.WE_CHAT_TEMP_KEY_END, "感谢你的使用!"); - - templateMessageService.push(Constants.WE_CHAT_TEMP_KEY_COMBINATION_SUCCESS, map, storeOrder.getUid(), Constants.PAY_TYPE_WE_CHAT_FROM_PUBLIC); + MyRecord record = new MyRecord(); + record.set("orderNo", storeOrder.getOrderId()); + record.set("proName", storeCombination.getTitle()); + pushMessageOrder(record, tempUser); +// map.put(Constants.WE_CHAT_TEMP_KEY_FIRST, "恭喜您拼团成功!我们将尽快为您发货。"); +// map.put("keyword1", storeOrder.getOrderId()); +// map.put("keyword2", storeCombination.getTitle()); +// map.put(Constants.WE_CHAT_TEMP_KEY_END, "感谢你的使用!"); +// +// templateMessageService.push(Constants.WE_CHAT_TEMP_KEY_COMBINATION_SUCCESS, map, storeOrder.getUid(), Constants.PAY_TYPE_WE_CHAT_FROM_PUBLIC); }); } } + /** + * 发送消息通知 + * @param record 参数 + * @param user 拼团用户 + */ + private void pushMessageOrder(MyRecord record, User user) { + if (user.getUserType().equals(UserConstants.USER_TYPE_H5)) { + return; + } + UserToken userToken; + HashMap temMap = new HashMap<>(); + // 公众号 + if (user.getUserType().equals(UserConstants.USER_TYPE_WECHAT)) { + userToken = userTokenService.getTokenByUserId(user.getUid(), UserConstants.USER_TOKEN_TYPE_WECHAT); + if (ObjectUtil.isNull(userToken)) { + return ; + } + // 发送微信模板消息 + temMap.put(Constants.WE_CHAT_TEMP_KEY_FIRST, "恭喜您拼团成功!我们将尽快为您发货。"); + temMap.put("keyword1", record.getStr("orderNo")); + temMap.put("keyword2", record.getStr("proName")); + temMap.put(Constants.WE_CHAT_TEMP_KEY_END, "感谢你的使用!"); + templateMessageService.pushTemplateMessage(Constants.WE_CHAT_TEMP_KEY_COMBINATION_SUCCESS, temMap, userToken.getToken()); + return; + } + // 小程序发送订阅消息 + userToken = userTokenService.getTokenByUserId(user.getUid(), UserConstants.USER_TOKEN_TYPE_ROUTINE); + if (ObjectUtil.isNull(userToken)) { + return ; + } + // 组装数据 + temMap.put("character_string1", record.getStr("orderNo")); + temMap.put("thing2", record.getStr("proName")); + temMap.put("thing5", "恭喜您拼团成功!我们将尽快为您发货。"); + templateMessageService.pushMiniTemplateMessage(Constants.WE_CHAT_PROGRAM_TEMP_KEY_COMBINATION_SUCCESS, temMap, userToken.getToken()); + + + } + /** * 拼团成功 * @param kid @@ -299,6 +344,18 @@ public class StorePinkServiceImpl extends ServiceImpl i return updateBatchById(memberList); } + /** + * 根据订单编号获取 + * @param orderId + * @return + */ + @Override + public StorePink getByOrderId(String orderId) { + LambdaQueryWrapper lqw = new LambdaQueryWrapper<>(); + lqw.eq(StorePink::getOrderId, orderId); + return dao.selectOne(lqw); + } + private Integer getCountByKidAndCid(Integer cid, Integer kid) { LambdaQueryWrapper lqw = new LambdaQueryWrapper<>(); lqw.select(StorePink::getId); diff --git a/crmeb/src/main/java/com/zbkj/crmeb/express/request/ExpressRequest.java b/crmeb/src/main/java/com/zbkj/crmeb/express/request/ExpressRequest.java new file mode 100644 index 00000000..c97786b4 --- /dev/null +++ b/crmeb/src/main/java/com/zbkj/crmeb/express/request/ExpressRequest.java @@ -0,0 +1,50 @@ +package com.zbkj.crmeb.express.request; + +import com.baomidou.mybatisplus.annotation.IdType; +import com.baomidou.mybatisplus.annotation.TableId; +import com.baomidou.mybatisplus.annotation.TableName; +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; +import lombok.EqualsAndHashCode; +import lombok.experimental.Accessors; + +import javax.validation.constraints.NotBlank; +import javax.validation.constraints.NotNull; +import java.io.Serializable; + +/** + *

+ * 快递公司表 + *

+ * + * @author Mr.Zhang + * @since 2020-04-17 + */ +@Data +@EqualsAndHashCode(callSuper = false) +@Accessors(chain = true) +@TableName("eb_express") +@ApiModel(value="ExpressRequest对象", description="快递公司") +public class ExpressRequest implements Serializable { + + private static final long serialVersionUID=1L; + + @ApiModelProperty(value = "快递公司简称", required = true) + @NotBlank(message = "快递公司简称必须填写") + private String code; + + @ApiModelProperty(value = "快递公司全称", required = true) + @NotBlank(message = "快递公司全称必须填写") + private String name; + + @ApiModelProperty(value = "排序") + @NotNull(message = "排序数字必须填写") + private Integer sort; + + @ApiModelProperty(value = "是否显示 0=否 1=是", required = true) + @NotNull(message = "请选择是否弃用") + private Integer isShow; + + +} diff --git a/crmeb/src/main/java/com/zbkj/crmeb/express/service/impl/ShippingTemplatesServiceImpl.java b/crmeb/src/main/java/com/zbkj/crmeb/express/service/impl/ShippingTemplatesServiceImpl.java index 628046e5..82b2993c 100644 --- a/crmeb/src/main/java/com/zbkj/crmeb/express/service/impl/ShippingTemplatesServiceImpl.java +++ b/crmeb/src/main/java/com/zbkj/crmeb/express/service/impl/ShippingTemplatesServiceImpl.java @@ -1,5 +1,6 @@ package com.zbkj.crmeb.express.service.impl; +import cn.hutool.core.collection.CollUtil; import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; import com.common.PageParamRequest; import com.exception.CrmebException; @@ -140,7 +141,7 @@ public class ShippingTemplatesServiceImpl extends ServiceImpl shippingTemplatesFreeRequestList = request.getShippingTemplatesFreeRequestList(); - if(shippingTemplatesFreeRequestList.size() > 0 && request.getAppoint()){ + if(CollUtil.isNotEmpty(shippingTemplatesFreeRequestList) && request.getAppoint()){ shippingTemplatesFreeService.saveAll(shippingTemplatesFreeRequestList, request.getType(), shippingTemplates.getId()); } diff --git a/crmeb/src/main/java/com/zbkj/crmeb/finance/controller/FundsMonitorController.java b/crmeb/src/main/java/com/zbkj/crmeb/finance/controller/FundsMonitorController.java index ae3c8215..1e3d7068 100644 --- a/crmeb/src/main/java/com/zbkj/crmeb/finance/controller/FundsMonitorController.java +++ b/crmeb/src/main/java/com/zbkj/crmeb/finance/controller/FundsMonitorController.java @@ -3,18 +3,14 @@ package com.zbkj.crmeb.finance.controller; import com.common.CommonPage; import com.common.CommonResult; import com.common.PageParamRequest; -import com.github.pagehelper.PageInfo; import com.zbkj.crmeb.finance.model.UserFundsMonitor; -import com.zbkj.crmeb.finance.request.FundsMonitorSearchRequest; +import com.zbkj.crmeb.finance.request.FundsMonitorRequest; import com.zbkj.crmeb.finance.request.FundsMonitorUserSearchRequest; import com.zbkj.crmeb.finance.service.UserFundsMonitorService; -import com.zbkj.crmeb.user.model.User; -import com.zbkj.crmeb.user.model.UserBill; -import com.zbkj.crmeb.user.request.UserBillDetailListRequest; +import com.zbkj.crmeb.user.model.UserBrokerageRecord; import com.zbkj.crmeb.user.response.BillType; import com.zbkj.crmeb.user.response.UserBillResponse; import com.zbkj.crmeb.user.service.UserBillService; -import com.zbkj.crmeb.user.service.UserService; import io.swagger.annotations.Api; import io.swagger.annotations.ApiOperation; import lombok.extern.slf4j.Slf4j; @@ -59,8 +55,8 @@ public class FundsMonitorController { */ @ApiOperation(value = "资金监控") @RequestMapping(value = "/list", method = RequestMethod.GET) - public CommonResult> getList(@Validated FundsMonitorSearchRequest request, @Validated PageParamRequest pageParamRequest){ - CommonPage userExtractCommonPage = CommonPage.restPage(userBillService.getListAdmin(request, pageParamRequest)); + public CommonResult> getList(@Validated FundsMonitorRequest request, @Validated PageParamRequest pageParamRequest){ + CommonPage userExtractCommonPage = CommonPage.restPage(userBillService.fundMonitoring(request, pageParamRequest)); return CommonResult.success(userExtractCommonPage); } @@ -75,7 +71,7 @@ public class FundsMonitorController { } /** - * 分页显示资金监控 + * 佣金记录 * @param request 搜索条件 * @param pageParamRequest 分页参数 * @author Mr.Zhang @@ -91,18 +87,17 @@ public class FundsMonitorController { /** * 佣金详细记录 - * @param request 查询基本参数 * @param pageParamRequest 分页参数 * @param userId 被查询的用户id * @return 佣金查询结果 */ @ApiOperation(value = "佣金详细记录") @RequestMapping(value = "/list/user/detail/{userId}", method = RequestMethod.GET) - public CommonResult> userDetail(UserBillDetailListRequest request, - PageParamRequest pageParamRequest, - @PathVariable Integer userId){ - CommonPage ub = CommonPage.restPage(userBillService.getByBaseSearch(userId, request, pageParamRequest)); - return CommonResult.success(ub); + public CommonResult> userDetail(PageParamRequest pageParamRequest, + @RequestParam(value = "dateLimit", required = false) String dateLimit, + @PathVariable Integer userId){ + CommonPage commonPage = CommonPage.restPage(userFundsMonitorService.getFundsMonitorDetail(userId, dateLimit, pageParamRequest)); + return CommonResult.success(commonPage); } diff --git a/crmeb/src/main/java/com/zbkj/crmeb/finance/controller/UserExtractController.java b/crmeb/src/main/java/com/zbkj/crmeb/finance/controller/UserExtractController.java index e6fb3158..434d34b8 100644 --- a/crmeb/src/main/java/com/zbkj/crmeb/finance/controller/UserExtractController.java +++ b/crmeb/src/main/java/com/zbkj/crmeb/finance/controller/UserExtractController.java @@ -39,7 +39,6 @@ import org.springframework.web.bind.annotation.RestController; @RestController @RequestMapping("api/admin/finance/apply") @Api(tags = "财务 -- 提现申请") - public class UserExtractController { @Autowired @@ -81,26 +80,17 @@ public class UserExtractController { } /** - * 提现总金额 + * 提现统计 * @Param dateLimit 时间限制 today,yesterday,lately7,lately30,month,year,/yyyy-MM-dd hh:mm:ss,yyyy-MM-dd hh:mm:ss/ * @author Mr.Zhang * @since 2020-05-11 */ - @ApiOperation(value = "提现总金额") + @ApiOperation(value = "提现统计") @RequestMapping(value = "/balance", method = RequestMethod.POST) public CommonResult balance( - @RequestParam(value = "dateLimit", required = false, - defaultValue = "") + @RequestParam(value = "dateLimit", required = false,defaultValue = "") String dateLimit){ - String startTime = null; - String endTime = null; - if(StringUtils.isNotBlank(dateLimit)){ - dateLimitUtilVo dateRage = DateUtil.getDateLimit(dateLimit); - startTime = dateRage.getStartTime(); - endTime = dateRage.getEndTime(); - } - - return CommonResult.success(userExtractService.getBalance(startTime,endTime)); + return CommonResult.success(userExtractService.getBalance(dateLimit)); } /** diff --git a/crmeb/src/main/java/com/zbkj/crmeb/finance/controller/UserRechargeController.java b/crmeb/src/main/java/com/zbkj/crmeb/finance/controller/UserRechargeController.java index b3e5d022..28b093ee 100644 --- a/crmeb/src/main/java/com/zbkj/crmeb/finance/controller/UserRechargeController.java +++ b/crmeb/src/main/java/com/zbkj/crmeb/finance/controller/UserRechargeController.java @@ -51,6 +51,7 @@ public class UserRechargeController { @ApiOperation(value = "分页列表") @RequestMapping(value = "/list", method = RequestMethod.GET) public CommonResult> getList(@Validated UserRechargeSearchRequest request, @Validated PageParamRequest pageParamRequest){ + request.setPaid(true); CommonPage userRechargeCommonPage = CommonPage.restPage(userRechargeService.getList(request, pageParamRequest)); return CommonResult.success(userRechargeCommonPage); } diff --git a/crmeb/src/main/java/com/zbkj/crmeb/finance/request/FundsMonitorRequest.java b/crmeb/src/main/java/com/zbkj/crmeb/finance/request/FundsMonitorRequest.java new file mode 100644 index 00000000..4b3f684c --- /dev/null +++ b/crmeb/src/main/java/com/zbkj/crmeb/finance/request/FundsMonitorRequest.java @@ -0,0 +1,40 @@ +package com.zbkj.crmeb.finance.request; + +import com.fasterxml.jackson.annotation.JsonIgnore; +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; +import lombok.EqualsAndHashCode; +import lombok.experimental.Accessors; + +import java.io.Serializable; +import java.math.BigDecimal; +import java.util.List; + +/** + * 资金监控 + * +---------------------------------------------------------------------- + * | CRMEB [ CRMEB赋能开发者,助力企业发展 ] + * +---------------------------------------------------------------------- + * | Copyright (c) 2016~2020 https://www.crmeb.com All rights reserved. + * +---------------------------------------------------------------------- + * | Licensed CRMEB并不是自由软件,未经许可不能去掉CRMEB相关版权 + * +---------------------------------------------------------------------- + * | Author: CRMEB Team + * +---------------------------------------------------------------------- + */ +@Data +@EqualsAndHashCode(callSuper = false) +@Accessors(chain = true) +@ApiModel(value="FundsMonitorRequest对象", description="资金监控") +public class FundsMonitorRequest implements Serializable { + + private static final long serialVersionUID = 3362714265772774491L; + + @ApiModelProperty(value = "搜索关键字") + private String keywords; + + @ApiModelProperty(value = "添加时间") + private String dateLimit; + +} diff --git a/crmeb/src/main/java/com/zbkj/crmeb/finance/request/UserExtractRequest.java b/crmeb/src/main/java/com/zbkj/crmeb/finance/request/UserExtractRequest.java index dd0c8c2d..70b2167f 100644 --- a/crmeb/src/main/java/com/zbkj/crmeb/finance/request/UserExtractRequest.java +++ b/crmeb/src/main/java/com/zbkj/crmeb/finance/request/UserExtractRequest.java @@ -38,7 +38,7 @@ public class UserExtractRequest implements Serializable { private String realName; @ApiModelProperty(value = "提现方式| alipay=支付宝,bank=银行卡,weixin=微信", allowableValues = "range[alipay,weixin,bank]") - @NotBlank(message = "请选择提现方式, 支付宝|者微信|银行卡") + @NotBlank(message = "请选择提现方式, 支付宝|微信|银行卡") private String extractType; @ApiModelProperty(value = "银行卡") diff --git a/crmeb/src/main/java/com/zbkj/crmeb/finance/service/UserExtractService.java b/crmeb/src/main/java/com/zbkj/crmeb/finance/service/UserExtractService.java index 1f7328a4..04e61966 100644 --- a/crmeb/src/main/java/com/zbkj/crmeb/finance/service/UserExtractService.java +++ b/crmeb/src/main/java/com/zbkj/crmeb/finance/service/UserExtractService.java @@ -31,11 +31,8 @@ public interface UserExtractService extends IService { /** * 提现总金额 - * @author Mr.Zhang - * @since 2020-05-11 - * @return BalanceResponse */ - BalanceResponse getBalance(String startTime,String endTime); + BalanceResponse getBalance(String dateLimit); /** * 提现总金额 @@ -76,9 +73,15 @@ public interface UserExtractService extends IService { * @param backMessage 驳回原因 * @return 审核结果 */ - boolean updateStatus(Integer id,Integer status,String backMessage); + Boolean updateStatus(Integer id,Integer status,String backMessage); PageInfo getExtractRecord(Integer userId, PageParamRequest pageParamRequest); BigDecimal getExtractTotalMoney(Integer userId); + + /** + * 提现申请 + * @return + */ + Boolean extractApply(UserExtractRequest request); } diff --git a/crmeb/src/main/java/com/zbkj/crmeb/finance/service/UserFundsMonitorService.java b/crmeb/src/main/java/com/zbkj/crmeb/finance/service/UserFundsMonitorService.java index c339c397..8c9a3108 100644 --- a/crmeb/src/main/java/com/zbkj/crmeb/finance/service/UserFundsMonitorService.java +++ b/crmeb/src/main/java/com/zbkj/crmeb/finance/service/UserFundsMonitorService.java @@ -2,9 +2,10 @@ package com.zbkj.crmeb.finance.service; import com.baomidou.mybatisplus.extension.service.IService; import com.common.PageParamRequest; +import com.github.pagehelper.PageInfo; import com.zbkj.crmeb.finance.model.UserFundsMonitor; -import com.zbkj.crmeb.finance.model.UserRecharge; import com.zbkj.crmeb.finance.request.FundsMonitorUserSearchRequest; +import com.zbkj.crmeb.user.model.UserBrokerageRecord; import java.util.List; @@ -29,4 +30,13 @@ public interface UserFundsMonitorService extends IService { * @return List */ List getFundsMonitor(FundsMonitorUserSearchRequest request, PageParamRequest pageParamRequest); + + /** + * 佣金详细记录 + * @param uid 用户uid + * @param dateLimit 时间参数 + * @param pageParamRequest 分页参数 + * @return + */ + PageInfo getFundsMonitorDetail(Integer uid, String dateLimit, PageParamRequest pageParamRequest); } diff --git a/crmeb/src/main/java/com/zbkj/crmeb/finance/service/impl/UserExtractServiceImpl.java b/crmeb/src/main/java/com/zbkj/crmeb/finance/service/impl/UserExtractServiceImpl.java index 0546d029..59ab4465 100644 --- a/crmeb/src/main/java/com/zbkj/crmeb/finance/service/impl/UserExtractServiceImpl.java +++ b/crmeb/src/main/java/com/zbkj/crmeb/finance/service/impl/UserExtractServiceImpl.java @@ -2,6 +2,7 @@ package com.zbkj.crmeb.finance.service.impl; import cn.hutool.core.collection.CollUtil; import cn.hutool.core.collection.CollectionUtil; +import cn.hutool.core.util.ObjectUtil; import cn.hutool.core.util.StrUtil; import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; @@ -9,6 +10,7 @@ import com.baomidou.mybatisplus.core.toolkit.Wrappers; import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; import com.common.CommonPage; import com.common.PageParamRequest; +import com.constants.BrokerageRecordConstants; import com.constants.Constants; import com.exception.CrmebException; import com.github.pagehelper.Page; @@ -27,7 +29,9 @@ import com.zbkj.crmeb.front.response.UserExtractRecordResponse; import com.zbkj.crmeb.system.service.SystemAttachmentService; import com.zbkj.crmeb.system.service.SystemConfigService; import com.zbkj.crmeb.user.model.User; +import com.zbkj.crmeb.user.model.UserBrokerageRecord; import com.zbkj.crmeb.user.service.UserBillService; +import com.zbkj.crmeb.user.service.UserBrokerageRecordService; import com.zbkj.crmeb.user.service.UserService; import com.zbkj.crmeb.wechat.service.impl.WechatSendMessageForMinService; import com.zbkj.crmeb.wechat.vo.WechatSendMessageForCash; @@ -35,6 +39,7 @@ import org.apache.commons.lang3.StringUtils; import org.springframework.beans.BeanUtils; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; +import org.springframework.transaction.support.TransactionTemplate; import javax.annotation.Resource; import java.math.BigDecimal; @@ -79,6 +84,12 @@ public class UserExtractServiceImpl extends ServiceImpl lqw = Wrappers.lambdaQuery(); - if(null != userId) lqw.eq(UserExtract::getUid,userId); + if(null != userId) { + lqw.eq(UserExtract::getUid,userId); + } lqw.eq(UserExtract::getStatus,status); if(StringUtils.isNotBlank(startTime) && StringUtils.isNotBlank(endTime)){ - lqw.between(UserExtract::getCreateTime,startTime,endTime); + lqw.between(UserExtract::getCreateTime, startTime, endTime); } List userExtracts = dao.selectList(lqw); -// double sum = 0; BigDecimal sum = ZERO; - if(null != userExtracts && userExtracts.size() > 0) { + if(CollUtil.isNotEmpty(userExtracts)) { sum = userExtracts.stream().map(UserExtract::getExtractPrice).reduce(ZERO, BigDecimal::add); } -// sum = userExtracts.stream().mapToDouble(e -> e.getExtractPrice().doubleValue()).sum(); return sum; } @@ -393,18 +397,66 @@ public class UserExtractServiceImpl extends ServiceImpl 0; + if (userExtract.getStatus() != 0) { + throw new CrmebException("提现申请已处理过"); + } + userExtract.setStatus(status); + + User user = userService.getById(userExtract.getUid()); + if (ObjectUtil.isNull(user)) { + throw new CrmebException("提现用户数据异常"); + } + + Boolean execute = false; + + // 拒绝 + if (status == -1) {//未通过时恢复用户总金额 + userExtract.setFailMsg(backMessage); + // 添加提现申请拒绝佣金记录 + UserBrokerageRecord brokerageRecord = new UserBrokerageRecord(); + brokerageRecord.setUid(user.getUid()); + brokerageRecord.setLinkId(userExtract.getId().toString()); + brokerageRecord.setLinkType(BrokerageRecordConstants.BROKERAGE_RECORD_LINK_TYPE_WITHDRAW); + brokerageRecord.setType(BrokerageRecordConstants.BROKERAGE_RECORD_TYPE_ADD); + brokerageRecord.setTitle(BrokerageRecordConstants.BROKERAGE_RECORD_TITLE_WITHDRAW_FAIL); + brokerageRecord.setPrice(userExtract.getExtractPrice()); + brokerageRecord.setBalance(user.getBrokeragePrice().add(userExtract.getExtractPrice())); + brokerageRecord.setMark(StrUtil.format("提现申请拒绝返还佣金{}", userExtract.getExtractPrice())); + brokerageRecord.setStatus(BrokerageRecordConstants.BROKERAGE_RECORD_STATUS_COMPLETE); + brokerageRecord.setCreateTime(DateUtil.nowDateTime()); + + execute = transactionTemplate.execute(e -> { + // 返还佣金 + userService.operationBrokerage(userExtract.getUid(), userExtract.getExtractPrice(), user.getBrokeragePrice(), "add"); + updateById(userExtract); + userBrokerageRecordService.save(brokerageRecord); + return Boolean.TRUE; + }); + } + + // 同意 + if (status == 1) { + // 获取佣金提现记录 + UserBrokerageRecord brokerageRecord = userBrokerageRecordService.getByLinkIdAndLinkType(userExtract.getId().toString(), BrokerageRecordConstants.BROKERAGE_RECORD_LINK_TYPE_WITHDRAW); + if (ObjectUtil.isNull(brokerageRecord)) { + throw new CrmebException("对应的佣金记录不存在"); + } + execute = transactionTemplate.execute(e -> { + updateById(userExtract); + brokerageRecord.setStatus(BrokerageRecordConstants.BROKERAGE_RECORD_STATUS_COMPLETE); + userBrokerageRecordService.updateById(brokerageRecord); + return Boolean.TRUE; + }); + } + return execute; } /** @@ -434,11 +486,11 @@ public class UserExtractServiceImpl extends ServiceImpl getListByMonth(Integer userId, String date) { - LambdaQueryWrapper lambdaQueryWrapper = new LambdaQueryWrapper<>(); - lambdaQueryWrapper.eq(UserExtract::getUid, userId); -// lambdaQueryWrapper.in(UserExtract::getStatus, -1, 1); - lambdaQueryWrapper.orderByDesc(UserExtract::getCreateTime, UserExtract::getId); - return dao.selectList(lambdaQueryWrapper); + QueryWrapper queryWrapper = new QueryWrapper<>(); + queryWrapper.eq("uid", userId); + queryWrapper.apply(StrUtil.format(" left(create_time, 7) = '{}'", date)); + queryWrapper.orderByDesc("create_time"); + return dao.selectList(queryWrapper); } /** @@ -450,5 +502,68 @@ public class UserExtractServiceImpl extends ServiceImpl { + // 保存提现记录 + save(userExtract); + // 修改用户佣金 + userService.operationBrokerage(user.getUid(), userExtract.getExtractPrice(), money, "sub"); + // 添加佣金记录 + brokerageRecord.setLinkId(userExtract.getId().toString()); + userBrokerageRecordService.save(brokerageRecord); + return Boolean.TRUE; + }); + + //todo 提现申请通知 + return execute; + } } diff --git a/crmeb/src/main/java/com/zbkj/crmeb/finance/service/impl/UserFundsMonitorServiceImpl.java b/crmeb/src/main/java/com/zbkj/crmeb/finance/service/impl/UserFundsMonitorServiceImpl.java index f7cf133c..3f8bbd1c 100644 --- a/crmeb/src/main/java/com/zbkj/crmeb/finance/service/impl/UserFundsMonitorServiceImpl.java +++ b/crmeb/src/main/java/com/zbkj/crmeb/finance/service/impl/UserFundsMonitorServiceImpl.java @@ -1,18 +1,15 @@ package com.zbkj.crmeb.finance.service.impl; -import cn.hutool.core.collection.CollUtil; -import cn.hutool.core.util.ObjectUtil; import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; import com.common.PageParamRequest; import com.github.pagehelper.PageHelper; +import com.github.pagehelper.PageInfo; import com.zbkj.crmeb.finance.dao.UserFundsMonitorDao; import com.zbkj.crmeb.finance.model.UserFundsMonitor; import com.zbkj.crmeb.finance.request.FundsMonitorUserSearchRequest; import com.zbkj.crmeb.finance.service.UserFundsMonitorService; -import com.zbkj.crmeb.user.model.User; -import com.zbkj.crmeb.user.model.UserBill; -import com.zbkj.crmeb.user.service.UserService; -import com.zbkj.crmeb.user.service.impl.UserServiceImpl; +import com.zbkj.crmeb.user.model.UserBrokerageRecord; +import com.zbkj.crmeb.user.service.UserBrokerageRecordService; import org.apache.commons.lang3.StringUtils; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; @@ -20,8 +17,6 @@ import org.springframework.stereotype.Service; import javax.annotation.Resource; import java.util.HashMap; import java.util.List; -import java.util.Optional; -import java.util.stream.Collectors; /** * UserRechargeServiceImpl 接口实现 @@ -42,7 +37,7 @@ public class UserFundsMonitorServiceImpl extends ServiceImpl monitorList = dao.getFundsMonitor(map); - List spreadUidList = monitorList.stream().map(UserFundsMonitor::getSpreadUid).distinct().collect(Collectors.toList()); - if (CollUtil.isEmpty(spreadUidList)) { - return monitorList; - } - HashMap mapListInUid = userService.getMapListInUid(spreadUidList); - for (UserFundsMonitor temp: monitorList) { - if (ObjectUtil.isNotNull(temp.getSpreadUid())) { - User user = mapListInUid.get(temp.getSpreadUid()); - if (ObjectUtil.isNotNull(user)) { - temp.setSpreadName(Optional.ofNullable(user.getNickname()).orElse("")); - } - } - } +// if (CollUtil.isEmpty(monitorList)) { +// return monitorList; +// } +// List spreadUidList = monitorList.stream().map(UserFundsMonitor::getSpreadUid).distinct().collect(Collectors.toList()); +// HashMap mapListInUid = userService.getMapListInUid(spreadUidList); +// for (UserFundsMonitor temp: monitorList) { +// if (ObjectUtil.isNotNull(temp.getSpreadUid())) { +// User user = mapListInUid.get(temp.getSpreadUid()); +// if (ObjectUtil.isNotNull(user)) { +// temp.setSpreadName(Optional.ofNullable(user.getNickname()).orElse("")); +// } +// } +// } return monitorList; } + /** + * 佣金详细记录 + * @param uid 用户uid + * @param pageParamRequest 分页参数 + * @return + */ + @Override + public PageInfo getFundsMonitorDetail(Integer uid, String dateLimit, PageParamRequest pageParamRequest) { + return userBrokerageRecordService.getFundsMonitorDetail(uid, dateLimit, pageParamRequest); + } } diff --git a/crmeb/src/main/java/com/zbkj/crmeb/finance/service/impl/UserRechargeServiceImpl.java b/crmeb/src/main/java/com/zbkj/crmeb/finance/service/impl/UserRechargeServiceImpl.java index 3a5b9d71..0af63266 100644 --- a/crmeb/src/main/java/com/zbkj/crmeb/finance/service/impl/UserRechargeServiceImpl.java +++ b/crmeb/src/main/java/com/zbkj/crmeb/finance/service/impl/UserRechargeServiceImpl.java @@ -261,9 +261,11 @@ public class UserRechargeServiceImpl extends ServiceImpl { updateById(userRecharge); - userService.updateById(user); + userService.operationNowMoney(user.getUid(), refundPrice, user.getNowMoney(), "sub"); +// userService.updateById(user); userBillService.save(userBill); return Boolean.TRUE; }); @@ -301,9 +304,9 @@ public class UserRechargeServiceImpl extends ServiceImpl> getList(@RequestParam Boolean isValid, @Validated PageParamRequest pageParamRequest){ StoreCart storeCart = new StoreCart(); - storeCart.setUid(userService.getUserIdException()); CommonPage storeCartCommonPage = - CommonPage.restPage(storeCartService.getList(pageParamRequest, storeCart, isValid)); + CommonPage.restPage(storeCartService.getList(pageParamRequest, isValid)); return CommonResult.success(storeCartCommonPage); } diff --git a/crmeb/src/main/java/com/zbkj/crmeb/front/controller/LoginController.java b/crmeb/src/main/java/com/zbkj/crmeb/front/controller/LoginController.java index 3b245269..d63a20d6 100644 --- a/crmeb/src/main/java/com/zbkj/crmeb/front/controller/LoginController.java +++ b/crmeb/src/main/java/com/zbkj/crmeb/front/controller/LoginController.java @@ -9,6 +9,7 @@ import com.zbkj.crmeb.front.request.LoginMobileRequest; import com.zbkj.crmeb.front.request.LoginRequest; import com.zbkj.crmeb.front.request.RegisterRequest; import com.zbkj.crmeb.front.response.LoginResponse; +import com.zbkj.crmeb.front.service.LoginService; import com.zbkj.crmeb.sms.service.SmsService; import com.zbkj.crmeb.user.service.UserService; import io.swagger.annotations.Api; @@ -49,6 +50,9 @@ public class LoginController { @Autowired private SmsService smsService; + @Autowired + private LoginService loginService; + /** * 手机号登录接口 @@ -59,9 +63,7 @@ public class LoginController { @RequestMapping(value = "/login/mobile", method = RequestMethod.POST) public CommonResult phoneLogin(@RequestBody @Validated LoginMobileRequest loginRequest, HttpServletRequest request) throws Exception { String clientIp = CrmebUtil.getClientIp(request); - RegisterRequest registerRequest = new RegisterRequest(); - BeanUtils.copyProperties(loginRequest, registerRequest); - return CommonResult.success(userService.register(registerRequest, clientIp)); + return CommonResult.success(loginService.phoneLogin(loginRequest, clientIp)); } /** @@ -72,7 +74,7 @@ public class LoginController { @ApiOperation(value = "账号密码登录") @RequestMapping(value = "/login", method = RequestMethod.POST) public CommonResult login(@RequestBody @Validated LoginRequest loginRequest) throws Exception { - return CommonResult.success(userService.login(loginRequest)); + return CommonResult.success(loginService.login(loginRequest)); } @@ -89,18 +91,18 @@ public class LoginController { } /** - * 发送短信 + * 发送短信登录验证码 * @param phone 手机号码 * @return 发送是否成功 */ - @ApiOperation(value = " 发送短信") + @ApiOperation(value = "发送短信登录验证码") @RequestMapping(value = "/sendCode", method = RequestMethod.POST) @ApiImplicitParams({ @ApiImplicitParam(name="phone", value="手机号码", required = true) }) public CommonResult sendCode(@RequestParam String phone){ ValidateFormUtil.isPhone(phone,"手机号码错误"); - if(smsService.pushCodeToList(phone,1, null)){ + if(smsService.sendCommonCode(phone)){ return CommonResult.success("发送成功"); }else{ return CommonResult.failed("发送失败"); diff --git a/crmeb/src/main/java/com/zbkj/crmeb/front/controller/StoreOrderController.java b/crmeb/src/main/java/com/zbkj/crmeb/front/controller/StoreOrderController.java index cdce04f8..7d354c09 100644 --- a/crmeb/src/main/java/com/zbkj/crmeb/front/controller/StoreOrderController.java +++ b/crmeb/src/main/java/com/zbkj/crmeb/front/controller/StoreOrderController.java @@ -62,7 +62,7 @@ public class StoreOrderController { @ApiOperation(value = "生成订单") @RequestMapping(value = "/create/{key}", method = RequestMethod.POST) public CommonResult> createOrder(@PathVariable String key, @Validated @RequestBody OrderCreateRequest orderRequest, HttpServletRequest request){ - return CommonResult.success(orderService.createOrder_1_3_1(orderRequest, key)); + return CommonResult.success(orderService.createOrder(orderRequest, key)); } /** diff --git a/crmeb/src/main/java/com/zbkj/crmeb/front/controller/UserController.java b/crmeb/src/main/java/com/zbkj/crmeb/front/controller/UserController.java index 9104e431..bc2af369 100644 --- a/crmeb/src/main/java/com/zbkj/crmeb/front/controller/UserController.java +++ b/crmeb/src/main/java/com/zbkj/crmeb/front/controller/UserController.java @@ -5,7 +5,7 @@ import com.common.CommonPage; import com.common.CommonResult; import com.common.PageParamRequest; import com.constants.Constants; -import com.exception.CrmebException; +import com.github.pagehelper.PageInfo; import com.zbkj.crmeb.finance.request.UserExtractRequest; import com.zbkj.crmeb.front.request.PasswordRequest; import com.zbkj.crmeb.front.request.UserBindingRequest; @@ -23,7 +23,6 @@ import io.swagger.annotations.Api; import io.swagger.annotations.ApiImplicitParam; import io.swagger.annotations.ApiOperation; import lombok.extern.slf4j.Slf4j; -import org.apache.commons.lang3.StringUtils; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.validation.annotation.Validated; import org.springframework.web.bind.annotation.*; @@ -146,16 +145,26 @@ public class UserController { return CommonResult.success(userCenterService.getCommission()); } +// /** +// * 推广佣金明细 +// * @author Mr.Zhang +// * @since 2020-06-08 +// */ +// @ApiOperation(value = "推广佣金明细") +// @RequestMapping(value = "/spread/commission/{type}", method = RequestMethod.GET) +// @ApiImplicitParam(name = "type", value = "类型 佣金类型|0=全部,1=消费,2=充值,3=返佣,4=提现", allowableValues = "range[0,1,2,3,4]", dataType = "int") +// public CommonResult> getSpreadCommissionByType(@PathVariable int type, @Validated PageParamRequest pageParamRequest){ +// return CommonResult.success(CommonPage.restPage(userCenterService.getSpreadCommissionByType(type, pageParamRequest))); +// } + /** * 推广佣金明细 - * @author Mr.Zhang - * @since 2020-06-08 */ @ApiOperation(value = "推广佣金明细") - @RequestMapping(value = "/spread/commission/{type}", method = RequestMethod.GET) - @ApiImplicitParam(name = "type", value = "类型 佣金类型|0=全部,1=消费,2=充值,3=返佣,4=提现", allowableValues = "range[0,1,2,3,4]", dataType = "int") - public CommonResult> getSpreadCommissionByType(@PathVariable int type, @Validated PageParamRequest pageParamRequest){ - return CommonResult.success(CommonPage.restPage(userCenterService.getSpreadCommissionByType(type, pageParamRequest))); + @RequestMapping(value = "/spread/commission/detail", method = RequestMethod.GET) + public CommonResult> getSpreadCommissionDetail(@Validated PageParamRequest pageParamRequest){ + PageInfo commissionDetail = userCenterService.getSpreadCommissionDetail(pageParamRequest); + return CommonResult.success(CommonPage.restPage(commissionDetail)); } /** @@ -180,36 +189,6 @@ public class UserController { @ApiOperation(value = "提现申请") @RequestMapping(value = "/extract/cash", method = RequestMethod.POST) public CommonResult extractCash(@RequestBody @Validated UserExtractRequest request){ - switch (request.getExtractType()){ - case "weixin": - if(StringUtils.isBlank(request.getWechat())){ - throw new CrmebException("请填写微信号!"); - } - request.setAlipayCode(null); - request.setBankCode(null); - request.setBankName(null); - break; - case "alipay": - if(StringUtils.isBlank(request.getAlipayCode())){ - throw new CrmebException("请填写支付宝账号!"); - } - request.setWechat(null); - request.setBankCode(null); - request.setBankName(null); - break; - case "bank": - if(StringUtils.isBlank(request.getBankName())){ - throw new CrmebException("请填写银行名称!"); - } - if(StringUtils.isBlank(request.getBankCode())){ - throw new CrmebException("请填写银行卡号!"); - } - request.setWechat(null); - request.setAlipayCode(null); - break; - default: - throw new CrmebException("请选择支付方式"); - } return CommonResult.success(userCenterService.extractCash(request)); } diff --git a/crmeb/src/main/java/com/zbkj/crmeb/front/controller/UserCouponController.java b/crmeb/src/main/java/com/zbkj/crmeb/front/controller/UserCouponController.java index 64703246..5e46c998 100644 --- a/crmeb/src/main/java/com/zbkj/crmeb/front/controller/UserCouponController.java +++ b/crmeb/src/main/java/com/zbkj/crmeb/front/controller/UserCouponController.java @@ -57,37 +57,17 @@ public class UserCouponController { /** * 领券 * @param request UserCouponReceiveRequest 新增参数 - * @author Mr.Zhang - * @since 2020-05-18 */ @ApiOperation(value = "领券") @RequestMapping(value = "/receive", method = RequestMethod.POST) public CommonResult receive(@RequestBody @Validated UserCouponReceiveRequest request){ - StoreCouponUserRequest storeCouponUserRequest = new StoreCouponUserRequest(); - storeCouponUserRequest.setUid(userService.getUserIdException().toString()); - storeCouponUserRequest.setCouponId(request.getCouponId()[0]); - if(storeCouponUserService.receive(storeCouponUserRequest)){ + if(storeCouponUserService.receiveCoupon(request)){ return CommonResult.success(); }else{ return CommonResult.failed(); } } - /** - * 领券 - * @param request UserCouponReceiveRequest 新增参数 - * @author Mr.Zhang - * @since 2020-05-18 - */ - @ApiOperation(value = "批量领券") - @RequestMapping(value = "/receive/batch", method = RequestMethod.POST) - public CommonResult receiveAll(@RequestBody @Validated UserCouponReceiveRequest request){ - if(storeCouponUserService.receiveAll(request, userService.getUserIdException(), "get")){ - return CommonResult.success(); - }else{ - return CommonResult.failed(); - } - } } diff --git a/crmeb/src/main/java/com/zbkj/crmeb/front/controller/UserRechargeController.java b/crmeb/src/main/java/com/zbkj/crmeb/front/controller/UserRechargeController.java index 68397c40..5563682f 100644 --- a/crmeb/src/main/java/com/zbkj/crmeb/front/controller/UserRechargeController.java +++ b/crmeb/src/main/java/com/zbkj/crmeb/front/controller/UserRechargeController.java @@ -1,13 +1,17 @@ package com.zbkj.crmeb.front.controller; +import com.common.CommonPage; import com.common.CommonResult; +import com.common.PageParamRequest; import com.constants.Constants; import com.utils.CrmebUtil; import com.zbkj.crmeb.front.request.UserRechargeRequest; -import com.zbkj.crmeb.front.response.UserRechargePaymentResponse; +import com.zbkj.crmeb.front.response.OrderPayResultResponse; +import com.zbkj.crmeb.front.response.UserRechargeBillRecordResponse; import com.zbkj.crmeb.front.response.UserRechargeResponse; import com.zbkj.crmeb.front.service.UserCenterService; import io.swagger.annotations.Api; +import io.swagger.annotations.ApiImplicitParam; import io.swagger.annotations.ApiOperation; import lombok.extern.slf4j.Slf4j; import org.springframework.beans.factory.annotation.Autowired; @@ -60,11 +64,12 @@ public class UserRechargeController { @RequestMapping(value = "/routine", method = RequestMethod.POST) public CommonResult> routineRecharge(HttpServletRequest httpServletRequest, @RequestBody @Validated UserRechargeRequest request){ request.setFromType(Constants.PAY_TYPE_WE_CHAT_FROM_PROGRAM); - UserRechargePaymentResponse responseVo = userCenterService.recharge(request); +// UserRechargePaymentResponse responseVo = userCenterService.recharge(request); + OrderPayResultResponse recharge = userCenterService.recharge(request); request.setClientIp(CrmebUtil.getClientIp(httpServletRequest)); Map map = new HashMap<>(); - map.put("data", responseVo); + map.put("data", recharge); map.put("type", request.getFromType()); return CommonResult.success(map); } @@ -73,10 +78,11 @@ public class UserRechargeController { * 充值 * @author Mr.Zhang * @since 2020-05-18 + * @return */ @ApiOperation(value = "公众号充值") @RequestMapping(value = "/wechat", method = RequestMethod.POST) - public CommonResult weChatRecharge(HttpServletRequest httpServletRequest, @RequestBody @Validated UserRechargeRequest request){ + public CommonResult weChatRecharge(HttpServletRequest httpServletRequest, @RequestBody @Validated UserRechargeRequest request){ request.setClientIp(CrmebUtil.getClientIp(httpServletRequest)); return CommonResult.success(userCenterService.recharge(request)); } @@ -91,6 +97,17 @@ public class UserRechargeController { public CommonResult transferIn(@RequestParam(name = "price") BigDecimal price){ return CommonResult.success(userCenterService.transferIn(price)); } + + /** + * 用户账单记录 + * @return + */ + @ApiOperation(value = "用户账单记录") + @RequestMapping(value = "/bill/record", method = RequestMethod.GET) + @ApiImplicitParam(name = "type", value = "记录类型:all-全部,expenditure-支出,income-收入", required = true) + public CommonResult> billRecord(@RequestParam(name = "type") String type, @ModelAttribute PageParamRequest pageRequest){ + return CommonResult.success(userCenterService.nowMoneyBillRecord(type, pageRequest)); + } } diff --git a/crmeb/src/main/java/com/zbkj/crmeb/front/controller/WeChatController.java b/crmeb/src/main/java/com/zbkj/crmeb/front/controller/WeChatController.java index a9206972..5408ab43 100644 --- a/crmeb/src/main/java/com/zbkj/crmeb/front/controller/WeChatController.java +++ b/crmeb/src/main/java/com/zbkj/crmeb/front/controller/WeChatController.java @@ -1,13 +1,10 @@ package com.zbkj.crmeb.front.controller; import com.common.CommonResult; -import com.common.PageParamRequest; import com.zbkj.crmeb.front.response.LoginResponse; import com.zbkj.crmeb.front.service.UserCenterService; import com.zbkj.crmeb.user.request.RegisterThirdUserRequest; import com.zbkj.crmeb.wechat.model.TemplateMessage; -import com.zbkj.crmeb.wechat.model.WechatProgramMyTemp; -import com.zbkj.crmeb.wechat.request.WechatProgramMyTempSearchRequest; import com.zbkj.crmeb.wechat.service.TemplateMessageService; import com.zbkj.crmeb.wechat.service.WeChatService; import com.zbkj.crmeb.wechat.service.WechatProgramMyTempService; @@ -130,13 +127,12 @@ public class WeChatController { /** * 订阅消息模板列表 - * @author Mr.Zhang - * @since 2020-06-03 */ @ApiOperation(value = "订阅消息模板列表") - @RequestMapping(value = "/program/my/temp/list", method = RequestMethod.POST) - public CommonResult> programMyTempList(@RequestBody @Validated WechatProgramMyTempSearchRequest request, PageParamRequest pageParamRequest){ - return CommonResult.success(wechatProgramMyTempService.getList(request, pageParamRequest)); + @RequestMapping(value = "/program/my/temp/list", method = RequestMethod.GET) + @ApiImplicitParam(name = "type", value = "支付之前:beforePay|支付成功:afterPay|申请退款:refundApply|充值之前:beforeRecharge|创建砍价:createBargain|参与拼团:pink|取消拼团:cancelPink") + public CommonResult> programMyTempList(@RequestParam(name = "type") String type){ + return CommonResult.success(templateMessageService.getMiniTempList(type)); } } diff --git a/crmeb/src/main/java/com/zbkj/crmeb/front/request/LoginRequest.java b/crmeb/src/main/java/com/zbkj/crmeb/front/request/LoginRequest.java index 8aa0a323..77f1d0c6 100644 --- a/crmeb/src/main/java/com/zbkj/crmeb/front/request/LoginRequest.java +++ b/crmeb/src/main/java/com/zbkj/crmeb/front/request/LoginRequest.java @@ -12,7 +12,7 @@ import javax.validation.constraints.Pattern; import java.io.Serializable; /** - * 手机快速登录 + * 移动端手机密码登录请求对象 * +---------------------------------------------------------------------- * | CRMEB [ CRMEB赋能开发者,助力企业发展 ] * +---------------------------------------------------------------------- @@ -26,7 +26,7 @@ import java.io.Serializable; @Data @EqualsAndHashCode(callSuper = false) @Accessors(chain = true) -@ApiModel(value="LoginRequest对象", description="手机快速登录") +@ApiModel(value="LoginRequest对象", description="移动端手机密码登录请求对象") public class LoginRequest implements Serializable { private static final long serialVersionUID=1L; diff --git a/crmeb/src/main/java/com/zbkj/crmeb/front/request/UserCouponReceiveRequest.java b/crmeb/src/main/java/com/zbkj/crmeb/front/request/UserCouponReceiveRequest.java index 060fe921..ea75f7b9 100644 --- a/crmeb/src/main/java/com/zbkj/crmeb/front/request/UserCouponReceiveRequest.java +++ b/crmeb/src/main/java/com/zbkj/crmeb/front/request/UserCouponReceiveRequest.java @@ -8,11 +8,12 @@ import lombok.experimental.Accessors; import javax.validation.constraints.Min; import javax.validation.constraints.NotBlank; +import javax.validation.constraints.NotNull; import javax.validation.constraints.Size; import java.io.Serializable; /** - * 用户领券 + * 用户领取优惠券请求对象 * +---------------------------------------------------------------------- * | CRMEB [ CRMEB赋能开发者,助力企业发展 ] * +---------------------------------------------------------------------- @@ -26,12 +27,12 @@ import java.io.Serializable; @Data @EqualsAndHashCode(callSuper = false) @Accessors(chain = true) -@ApiModel(value="UserCouponReceiveRequest对象", description="用户领券") +@ApiModel(value="UserCouponReceiveRequest对象", description="用户领取优惠券请求对象") public class UserCouponReceiveRequest implements Serializable { private static final long serialVersionUID=1L; @ApiModelProperty(value = "优惠券id") - @Size(min = 1, message = "请选择优惠券") - private Integer[] couponId; + @NotNull(message = "优惠券编号不能为空") + private Integer couponId; } diff --git a/crmeb/src/main/java/com/zbkj/crmeb/front/response/SpreadCommissionDetailResponse.java b/crmeb/src/main/java/com/zbkj/crmeb/front/response/SpreadCommissionDetailResponse.java new file mode 100644 index 00000000..40488a3c --- /dev/null +++ b/crmeb/src/main/java/com/zbkj/crmeb/front/response/SpreadCommissionDetailResponse.java @@ -0,0 +1,47 @@ +package com.zbkj.crmeb.front.response; + +import com.zbkj.crmeb.user.model.UserBrokerageRecord; +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; +import lombok.EqualsAndHashCode; +import lombok.experimental.Accessors; + +import java.io.Serializable; +import java.util.List; + +/** + * 推广佣金明细响应对象 + * +---------------------------------------------------------------------- + * | CRMEB [ CRMEB赋能开发者,助力企业发展 ] + * +---------------------------------------------------------------------- + * | Copyright (c) 2016~2020 https://www.crmeb.com All rights reserved. + * +---------------------------------------------------------------------- + * | Licensed CRMEB并不是自由软件,未经许可不能去掉CRMEB相关版权 + * +---------------------------------------------------------------------- + * | Author: CRMEB Team + * +---------------------------------------------------------------------- + */ +@Data +@EqualsAndHashCode(callSuper = false) +@Accessors(chain = true) +@ApiModel(value = "SpreadCommissionDetailResponse对象", description = "推广佣金明细响应对象") +public class SpreadCommissionDetailResponse implements Serializable { + + private static final long serialVersionUID = 1L; + + public SpreadCommissionDetailResponse() {} + + public SpreadCommissionDetailResponse(String date, List list) { + this.date = date; + this.list = list; + } + + @ApiModelProperty(value = "月份") + private String date; + + @ApiModelProperty(value = "数据") + private List list; + + +} diff --git a/crmeb/src/main/java/com/zbkj/crmeb/front/response/UserRechargeBillRecordResponse.java b/crmeb/src/main/java/com/zbkj/crmeb/front/response/UserRechargeBillRecordResponse.java new file mode 100644 index 00000000..d6120b8e --- /dev/null +++ b/crmeb/src/main/java/com/zbkj/crmeb/front/response/UserRechargeBillRecordResponse.java @@ -0,0 +1,38 @@ +package com.zbkj.crmeb.front.response; + +import com.zbkj.crmeb.user.model.UserBill; +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; +import lombok.EqualsAndHashCode; +import lombok.experimental.Accessors; + +import java.io.Serializable; +import java.util.List; + +/** + * 用户余额账单记录 + * +---------------------------------------------------------------------- + * | CRMEB [ CRMEB赋能开发者,助力企业发展 ] + * +---------------------------------------------------------------------- + * | Copyright (c) 2016~2020 https://www.crmeb.com All rights reserved. + * +---------------------------------------------------------------------- + * | Licensed CRMEB并不是自由软件,未经许可不能去掉CRMEB相关版权 + * +---------------------------------------------------------------------- + * | Author: CRMEB Team + * +---------------------------------------------------------------------- + */ +@Data +@EqualsAndHashCode(callSuper = false) +@Accessors(chain = true) +@ApiModel(value="UserRechargeBillRecordResponse对象", description="用户余额账单记录") +public class UserRechargeBillRecordResponse implements Serializable { + + private static final long serialVersionUID=1L; + + @ApiModelProperty(value = "月份") + private String date; + + @ApiModelProperty(value = "数据") + private List list; +} diff --git a/crmeb/src/main/java/com/zbkj/crmeb/front/response/UserSpreadPeopleItemResponse.java b/crmeb/src/main/java/com/zbkj/crmeb/front/response/UserSpreadPeopleItemResponse.java index 0b6e4f77..8acd2180 100644 --- a/crmeb/src/main/java/com/zbkj/crmeb/front/response/UserSpreadPeopleItemResponse.java +++ b/crmeb/src/main/java/com/zbkj/crmeb/front/response/UserSpreadPeopleItemResponse.java @@ -24,7 +24,7 @@ import java.math.BigDecimal; @Data @EqualsAndHashCode(callSuper = false) @Accessors(chain = true) -@ApiModel(value="UserSpreadPeopleResponse对象", description="推广人信息") +@ApiModel(value="UserSpreadPeopleItemResponse对象", description="推广人信息") public class UserSpreadPeopleItemResponse implements Serializable { private static final long serialVersionUID=1L; diff --git a/crmeb/src/main/java/com/zbkj/crmeb/front/service/LoginService.java b/crmeb/src/main/java/com/zbkj/crmeb/front/service/LoginService.java new file mode 100644 index 00000000..72d0e942 --- /dev/null +++ b/crmeb/src/main/java/com/zbkj/crmeb/front/service/LoginService.java @@ -0,0 +1,31 @@ +package com.zbkj.crmeb.front.service; + +import com.zbkj.crmeb.front.request.LoginMobileRequest; +import com.zbkj.crmeb.front.request.LoginRequest; +import com.zbkj.crmeb.front.response.LoginResponse; + +/** + * 移动端登录服务类 + * +---------------------------------------------------------------------- + * | CRMEB [ CRMEB赋能开发者,助力企业发展 ] + * +---------------------------------------------------------------------- + * | Copyright (c) 2016~2020 https://www.crmeb.com All rights reserved. + * +---------------------------------------------------------------------- + * | Licensed CRMEB并不是自由软件,未经许可不能去掉CRMEB相关版权 + * +---------------------------------------------------------------------- + * | Author: CRMEB Team + * +---------------------------------------------------------------------- + */ +public interface LoginService { + + /** + * 账号密码登录 + * @return LoginResponse + */ + LoginResponse login(LoginRequest loginRequest) throws Exception; + + /** + * 手机号验证码登录 + */ + LoginResponse phoneLogin(LoginMobileRequest loginRequest, String clientIp) throws Exception; +} diff --git a/crmeb/src/main/java/com/zbkj/crmeb/front/service/OrderService.java b/crmeb/src/main/java/com/zbkj/crmeb/front/service/OrderService.java index 937c08fd..3f1faa50 100644 --- a/crmeb/src/main/java/com/zbkj/crmeb/front/service/OrderService.java +++ b/crmeb/src/main/java/com/zbkj/crmeb/front/service/OrderService.java @@ -38,21 +38,13 @@ public interface OrderService { ConfirmOrderResponse confirmOrder(ConfirmOrderRequest request); - /** - * 创建订单 - * @param request 创建订单参数 - * @param key 订单key - * @return payResponse - */ - OrderPayResponse createOrder(OrderCreateRequest request, String key, String ip); - /** * 创建订单 * @param request 创建订单参数 * @param key 订单key * @return MyRecord */ - MyRecord createOrder_1_3_1(OrderCreateRequest request, String key); + MyRecord createOrder(OrderCreateRequest request, String key); /** * 再次下单 @@ -114,7 +106,7 @@ public interface OrderService { /** * 订单退款申请Task使用 - * @param request + * @param applyList * @return */ Boolean refundApplyTask(List applyList); diff --git a/crmeb/src/main/java/com/zbkj/crmeb/front/service/UserCenterService.java b/crmeb/src/main/java/com/zbkj/crmeb/front/service/UserCenterService.java index 6ca08c95..0953d8a9 100644 --- a/crmeb/src/main/java/com/zbkj/crmeb/front/service/UserCenterService.java +++ b/crmeb/src/main/java/com/zbkj/crmeb/front/service/UserCenterService.java @@ -1,9 +1,9 @@ package com.zbkj.crmeb.front.service; import com.baomidou.mybatisplus.extension.service.IService; +import com.common.CommonPage; import com.common.PageParamRequest; import com.github.pagehelper.PageInfo; -import com.zbkj.crmeb.finance.model.UserExtract; import com.zbkj.crmeb.finance.request.UserExtractRequest; import com.zbkj.crmeb.front.request.UserRechargeRequest; import com.zbkj.crmeb.front.request.UserSpreadPeopleRequest; @@ -51,7 +51,7 @@ public interface UserCenterService extends IService { UserSpreadOrderResponse getSpreadOrder(PageParamRequest pageParamRequest); - UserRechargePaymentResponse recharge(UserRechargeRequest request); + OrderPayResultResponse recharge(UserRechargeRequest request); LoginResponse weChatAuthorizeLogin(String code, Integer spreadUid); @@ -72,4 +72,17 @@ public interface UserCenterService extends IService { PageInfo getExtractRecord(PageParamRequest pageParamRequest); BigDecimal getExtractTotalMoney(); + + /** + * 推广佣金明细 + * @param pageParamRequest 分页参数 + */ + PageInfo getSpreadCommissionDetail(PageParamRequest pageParamRequest); + + /** + * 用户账单记录(现金) + * @param type 记录类型:all-全部,expenditure-支出,income-收入 + * @return CommonPage + */ + CommonPage nowMoneyBillRecord(String type, PageParamRequest pageRequest); } diff --git a/crmeb/src/main/java/com/zbkj/crmeb/front/service/impl/LoginServiceImpl.java b/crmeb/src/main/java/com/zbkj/crmeb/front/service/impl/LoginServiceImpl.java new file mode 100644 index 00000000..0fd2d879 --- /dev/null +++ b/crmeb/src/main/java/com/zbkj/crmeb/front/service/impl/LoginServiceImpl.java @@ -0,0 +1,180 @@ +package com.zbkj.crmeb.front.service.impl; + +import cn.hutool.core.util.ObjectUtil; +import cn.hutool.core.util.StrUtil; +import com.constants.Constants; +import com.constants.SmsConstants; +import com.exception.CrmebException; +import com.utils.CrmebUtil; +import com.utils.DateUtil; +import com.utils.RedisUtil; +import com.zbkj.crmeb.front.request.LoginMobileRequest; +import com.zbkj.crmeb.front.request.LoginRequest; +import com.zbkj.crmeb.front.response.LoginResponse; +import com.zbkj.crmeb.front.service.LoginService; +import com.zbkj.crmeb.user.model.User; +import com.zbkj.crmeb.user.service.UserService; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Service; +import org.springframework.transaction.support.TransactionTemplate; + +import java.util.Optional; + +/** + * 移动端登录服务类 + * +---------------------------------------------------------------------- + * | CRMEB [ CRMEB赋能开发者,助力企业发展 ] + * +---------------------------------------------------------------------- + * | Copyright (c) 2016~2020 https://www.crmeb.com All rights reserved. + * +---------------------------------------------------------------------- + * | Licensed CRMEB并不是自由软件,未经许可不能去掉CRMEB相关版权 + * +---------------------------------------------------------------------- + * | Author: CRMEB Team + * +---------------------------------------------------------------------- + */ +@Service +public class LoginServiceImpl implements LoginService { + + private static final Logger logger = LoggerFactory.getLogger(LoginServiceImpl.class); + + @Autowired + private UserService userService; + + @Autowired + private TransactionTemplate transactionTemplate; + + @Autowired + private RedisUtil redisUtil; + + /** + * 账号密码登录 + * @return + */ + @Override + public LoginResponse login(LoginRequest loginRequest) throws Exception { + User user = userService.getUserByAccount(loginRequest.getPhone()); + if (ObjectUtil.isNull(user)) { + throw new CrmebException("此账号未注册"); + } + if(!user.getStatus()){ + throw new CrmebException("此账号被禁用"); + } + + // 校验密码 + String password = CrmebUtil.encryptPassword(loginRequest.getPassword(), loginRequest.getPhone()); + if(!user.getPwd().equals(password)){ + throw new CrmebException("密码错误"); + } + + LoginResponse loginResponse = new LoginResponse(); + String token = userService.token(user); + loginResponse.setToken(token); + user.setPwd(null); + + //绑定推广关系 + if (user.getSpreadUid() < 1 && loginRequest.getSpreadPid() > 0) { + bindSpread(user, loginRequest.getSpreadPid()); + } + + // 记录最后一次登录时间 + user.setLastLoginTime(DateUtil.nowDateTime()); + userService.updateById(user); + + loginResponse.setUser(user); + long time = Constants.TOKEN_EXPRESS_MINUTES * 60; + loginResponse.setExpiresTime(DateUtil.addSecond(DateUtil.nowDateTime(), (int)time)); + return loginResponse; + } + + /** + * 手机号验证码登录 + * @param loginRequest 登录请求信息 + * @param clientIp ip + * @return LoginResponse + */ + @Override + public LoginResponse phoneLogin(LoginMobileRequest loginRequest, String clientIp) throws Exception { + //检测验证码 + checkValidateCode(loginRequest.getPhone(), loginRequest.getValidateCode()); + + //查询手机号信息 + User user = userService.getUserByAccount(loginRequest.getPhone()); + Integer spread = Optional.ofNullable(loginRequest.getSpread()).orElse(0); + if(ObjectUtil.isNull(user)){ + //此用户不存在,走新用户注册流程 + user = userService.registerPhone(loginRequest.getPhone(), spread, clientIp); + } else { + // 正常流程 + // 绑定推广关系 + if (user.getSpreadUid() < 1 && spread > 0) { + bindSpread(user, spread); + } + } + + // 记录最后一次登录时间 + user.setLastLoginTime(DateUtil.nowDateTime()); + userService.updateById(user); + + //生成token + LoginResponse loginResponse = new LoginResponse(); + String token = userService.token(user); + loginResponse.setToken(token); + user.setPwd(null); + + loginResponse.setUser(user); + long time = Constants.TOKEN_EXPRESS_MINUTES * 60; + loginResponse.setExpiresTime(DateUtil.addSecond(DateUtil.nowDateTime(), (int)time)); + return loginResponse; + } + + /** + * 检测手机验证码 + * @param phone 手机号 + * @param code 验证码 + */ + private void checkValidateCode(String phone, String code) { + Object validateCode = redisUtil.get(SmsConstants.SMS_VALIDATE_PHONE + phone); + if(validateCode == null){ + throw new CrmebException("验证码已过期"); + } + + if(!validateCode.toString().equals(code)){ + throw new CrmebException("验证码错误"); + } + + //删除验证码 + redisUtil.remove(SmsConstants.SMS_VALIDATE_PHONE + phone); + } + + /** + * 绑定分销关系 + * @param user User 用户user类 + * @param spreadUid Integer 推广人id + * @return Boolean + * 1.判断分销功能是否启用 + * 2.判断分销模式 + * 3.根据不同的分销模式校验 + * 4.指定分销,只有分销员才可以分销,需要spreadUid是推广员才可以绑定 + * 5.满额分销,同上 + * 6.人人分销,可以直接绑定 + */ + private Boolean bindSpread(User user, Integer spreadUid) { + Boolean checkBingSpread = userService.checkBingSpread(user, spreadUid, "old"); + if (!checkBingSpread) return false; + + user.setSpreadUid(spreadUid); + user.setSpreadTime(DateUtil.nowDateTime()); + + Boolean execute = transactionTemplate.execute(e -> { + userService.updateById(user); + userService.updateSpreadCountByUid(spreadUid); + return Boolean.TRUE; + }); + if (!execute) { + logger.error(StrUtil.format("绑定推广人时出错,userUid = {}, spreadUid = {}", user.getUid(), spreadUid)); + } + return execute; + } +} diff --git a/crmeb/src/main/java/com/zbkj/crmeb/front/service/impl/OrderServiceImpl.java b/crmeb/src/main/java/com/zbkj/crmeb/front/service/impl/OrderServiceImpl.java index c5fad540..709de5ff 100644 --- a/crmeb/src/main/java/com/zbkj/crmeb/front/service/impl/OrderServiceImpl.java +++ b/crmeb/src/main/java/com/zbkj/crmeb/front/service/impl/OrderServiceImpl.java @@ -4,10 +4,12 @@ import cn.hutool.core.collection.CollUtil; import cn.hutool.core.util.ObjectUtil; import cn.hutool.core.util.StrUtil; import com.alibaba.fastjson.JSONObject; +import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; import com.common.MyRecord; import com.common.PageParamRequest; import com.constants.Constants; import com.constants.PayConstants; +import com.constants.SmsConstants; import com.exception.CrmebException; import com.utils.CrmebUtil; import com.utils.DateUtil; @@ -39,8 +41,10 @@ import com.zbkj.crmeb.store.response.StoreCartResponse; import com.zbkj.crmeb.store.service.*; import com.zbkj.crmeb.store.utilService.OrderUtils; import com.zbkj.crmeb.store.vo.StoreOrderInfoVo; +import com.zbkj.crmeb.system.model.SystemAdmin; import com.zbkj.crmeb.system.model.SystemAttachment; import com.zbkj.crmeb.system.model.SystemStore; +import com.zbkj.crmeb.system.service.SystemAdminService; import com.zbkj.crmeb.system.service.SystemAttachmentService; import com.zbkj.crmeb.system.service.SystemConfigService; import com.zbkj.crmeb.system.service.SystemStoreService; @@ -52,8 +56,11 @@ import com.zbkj.crmeb.wechat.service.impl.WechatSendMessageForMinService; import com.zbkj.crmeb.wechat.vo.WechatSendMessageForCreateOrder; import com.zbkj.crmeb.wechat.vo.WechatSendMessageForReFundNotify; import org.apache.commons.lang3.StringUtils; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; import org.springframework.beans.BeanUtils; import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.scheduling.annotation.Async; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; import org.springframework.transaction.support.TransactionTemplate; @@ -77,6 +84,8 @@ import java.util.stream.Collectors; @Service public class OrderServiceImpl implements OrderService { + private Logger logger = LoggerFactory.getLogger(OrderServiceImpl.class); + @Autowired private UserService userService; @@ -138,6 +147,12 @@ public class OrderServiceImpl implements OrderService { @Autowired private TransactionTemplate transactionTemplate; + @Autowired + private SystemAdminService systemAdminService; + + @Autowired + private SmsService smsService; + /** * 确认订单 * @return 确认订单response @@ -245,98 +260,6 @@ public class OrderServiceImpl implements OrderService { return response; } - /** - * 订单创建 - * @param request 创建订单参数 - * @param orderKey orderKey - * @return 创建订单结果 - */ - @Override - public OrderPayResponse createOrder(OrderCreateRequest request, String orderKey, String ip) { - OrderPayResponse orderPayResponse = new OrderPayResponse(); - User currentUser = userService.getInfo(); - if (ObjectUtil.isNull(currentUser)) throw new CrmebException("当前用户不存在!"); - // 检查订单是否存在 - if(orderUtils.checkOrderExist(orderKey, currentUser.getUid())) throw new CrmebException(orderKey + "订单已存在"); - - // 检测支付方式 - if(!orderUtils.checkPayType(request.getPayType())) throw new CrmebException("暂不支持该支付方式,请刷新页面或者联系管理员"); - - // 判断订单是否过期 - String existCacheOrder = orderUtils.cacheGetOrderInfo(currentUser.getUid(), orderKey); - if(null == existCacheOrder) throw new CrmebException("订单已过期,请刷新当前页面!"); - - ConfirmOrderResponse cor = JSONObject.parseObject(existCacheOrder,ConfirmOrderResponse.class); - - // 缓存订单并做计算 - orderUtils.computedOrder(request, cor, orderKey, currentUser); - - // 检查订单状态 - StoreOrder orderCreated = orderUtils.createOrder(request, cor, 0, request.getStoreId(), orderKey); - if(null == orderCreated) - throw new CrmebException("订单生成失败"); - - // 立即购买支付 - if(request.getIsNew()){ - HashMap resultMap = new HashMap<>(); - OrderPayRequest orderPayRequest = new OrderPayRequest(); -// orderPayRequest.setFrom(request.getFrom()); - orderPayRequest.setPayType(request.getPayType()); - orderPayRequest.setUni(orderCreated.getOrderId()); - boolean b = doPayOrder(orderPayRequest, ip, resultMap, orderCreated); - OrderPayItemResponse itemResponse = new OrderPayItemResponse(); - String payType = null; - switch (request.getPayType()){ - case Constants.PAY_TYPE_WE_CHAT: - case Constants.PAY_TYPE_WE_CHAT_FROM_PROGRAM: - payType = "微信支付下单成功 请支付"; - orderPayResponse.setStatus("WECHAT_PAY"); - orderPayResponse.setJsConfig(resultMap.get("jsConfig")); - break; - case Constants.PAY_TYPE_YUE: - payType = "余额支付成功"; - orderPayResponse.setStatus("SUCCESS"); - break; - case Constants.PAY_TYPE_OFFLINE: - payType = "线下支付"; - orderPayResponse.setStatus("SUCCESS"); - break; - } - itemResponse.setKey(orderCreated.getOrderId()); - itemResponse.setOrderId(orderKey); - orderPayResponse.setResult(itemResponse); - }else{ - String tempStatus = ""; - switch (request.getPayType()){ - case Constants.PAY_TYPE_WE_CHAT:tempStatus="WECHAT_H5_PAY"; break; - case Constants.PAY_TYPE_YUE:tempStatus="SUCCESS"; break; - case Constants.PAY_TYPE_OFFLINE:tempStatus="SUCCESS"; break; - } - orderPayResponse.setStatus(tempStatus); - OrderPayItemResponse itemResponse = new OrderPayItemResponse(); - itemResponse.setKey(orderCreated.getOrderId()); - itemResponse.setOrderId(orderKey); - orderPayResponse.setResult(itemResponse); - } - - // 清除购物车数据 - List cartInfo = cor.getCartInfo(); - List cartList = cartInfo.stream().filter(i -> ObjectUtil.isNotNull(i.getId())).collect(Collectors.toList()); - if (CollUtil.isNotEmpty(cartList)) { - List cartIdList = cartList.stream().map(temp -> temp.getId().intValue()).collect(Collectors.toList()); - storeCartService.deleteCartByIds(cartIdList); - } - - // 小程序消息订阅发送 - WechatSendMessageForCreateOrder createOrder = new WechatSendMessageForCreateOrder( - orderUtils.getPayTypeStrByOrder(orderCreated),orderUtils.getStoreNameAndCarNumString(orderCreated.getId()), - orderCreated.getPayPrice()+"",orderCreated.getId()+"","CRMEB",orderCreated.getCreateTime()+"","创建订单成功","暂无地址", - orderUtils.getPayTypeStrByOrder(orderCreated),orderCreated.getUserAddress()); - wechatSendMessageForMinService.sendCreateOrderMessage(createOrder, userService.getUserIdException()); - - return orderPayResponse; - } - /** * 订单创建 * 订单创建只生成订单返回订单编号 @@ -346,7 +269,7 @@ public class OrderServiceImpl implements OrderService { * @return 创建订单结果 */ @Override - public MyRecord createOrder_1_3_1(OrderCreateRequest request, String orderKey) { + public MyRecord createOrder(OrderCreateRequest request, String orderKey) { User currentUser = userService.getInfo(); if (ObjectUtil.isNull(currentUser)) throw new CrmebException("当前用户不存在!"); // 检查订单是否存在 @@ -383,12 +306,40 @@ public class OrderServiceImpl implements OrderService { List cartIdList = cartList.stream().map(temp -> temp.getId().intValue()).collect(Collectors.toList()); storeCartService.deleteCartByIds(cartIdList); } + // 加入自动未支付自动取消队列 + redisUtil.lPush(Constants.ORDER_AUTO_CANCEL_KEY, orderCreated.getOrderId()); + + // 发送后台管理员下单提醒通知短信 + sendAdminOrderNotice(orderCreated.getOrderId()); MyRecord record = new MyRecord(); record.set("orderNo", orderCreated.getOrderId()); return record; } + /** + * 发送后台管理员下单提醒通知短信 + * @param orderNo 订单编号 + */ + @Async + public void sendAdminOrderNotice(String orderNo) { + // 系统是否开启用户下单管理员提醒开关 + String smsSwitch = systemConfigService.getValueByKey(SmsConstants.SMS_CONFIG_ADMIN_LOWER_ORDER_SWITCH); + if (StrUtil.isBlank(smsSwitch) || smsSwitch.equals("1")) { + return ; + } + // 查询可已发送短信的管理员 + List systemAdminList = systemAdminService.findIsSmsList(); + if (CollUtil.isEmpty(systemAdminList)) { + return ; + } + + // 发送短信 + systemAdminList.forEach(admin -> { + smsService.sendCreateOrderNotice(admin.getPhone(), orderNo, admin.getRealName()); + }); + } + /** * 删除已完成订单 @@ -539,6 +490,20 @@ public class OrderServiceImpl implements OrderService { return Boolean.TRUE; }); + if (execute) { + // 发送用户退款管理员提醒短信 + String smsSwitch = systemConfigService.getValueByKey(SmsConstants.SMS_CONFIG_ADMIN_CONFIRM_TAKE_OVER_SWITCH); + if (StrUtil.isNotBlank(smsSwitch) || smsSwitch.equals("1")) { + // 查询可已发送短信的管理员 + List systemAdminList = systemAdminService.findIsSmsList(); + if (CollUtil.isNotEmpty(systemAdminList)) { + // 发送短信 + systemAdminList.forEach(admin -> { + smsService.sendOrderRefundApplyNotice(admin.getPhone(), existStoreOrder.getOrderId(), admin.getRealName()); + }); + } + } + } if(!execute) throw new CrmebException("申请退款失败"); // HashMap smsInfo = new HashMap<>(); @@ -571,24 +536,32 @@ public class OrderServiceImpl implements OrderService { if (CollUtil.isEmpty(applyList)) { return false; } + String smsSwitch = systemConfigService.getValueByKey(SmsConstants.SMS_CONFIG_ADMIN_CONFIRM_TAKE_OVER_SWITCH); List orderList = CollUtil.newArrayList(); - List> notifyMapList = CollUtil.newArrayList(); for (OrderRefundApplyRequest request : applyList) { StoreOrder storeOrder = storeOrderService.getById(request.getId()); if(ObjectUtil.isNull(storeOrder)){ //订单号错误 - throw new CrmebException("没有找到相关订单信息!"); +// throw new CrmebException("没有找到相关订单信息!"); + logger.error("拼团自动处理订单申请退款:没有找到相关订单信息!"); + continue; } if(storeOrder.getRefundStatus() == 1){ - throw new CrmebException("正在申请退款中"); +// throw new CrmebException("正在申请退款中"); + logger.error("拼团自动处理订单申请退款:正在申请退款中!"); + continue; } if(storeOrder.getRefundStatus() == 2){ - throw new CrmebException("订单已退款"); +// throw new CrmebException("订单已退款"); + logger.error("拼团自动处理订单申请退款:订单已退款!"); + continue; } if(storeOrder.getRefundStatus() == 3){ - throw new CrmebException("订单退款中"); +// throw new CrmebException("订单退款中"); + logger.error("拼团自动处理订单申请退款:订单退款中!"); + continue; } // if(storeOrder.getStatus() == 1){ @@ -602,32 +575,20 @@ public class OrderServiceImpl implements OrderService { storeOrder.setRefundReasonTime(DateUtil.nowDateTime()); orderList.add(storeOrder); - // 发送微信小程序订阅消息 - String storeNameAndCarNumString = orderUtils.getStoreNameAndCarNumString(storeOrder.getId()); - if(StringUtils.isNotBlank(storeNameAndCarNumString)){ - WechatSendMessageForReFundNotify notify = new WechatSendMessageForReFundNotify( - storeNameAndCarNumString,storeOrder.getPayPrice().toString(), - storeOrder.getCreateTime().toString(),storeOrder.getOrderId()+"",DateUtil.nowDateTimeStr(), - "CRMEB","发起申请",request.getExplain(),storeOrder.getPayPrice()+"", - request.getText(),storeOrder.getUserPhone(),"CRMEB"); - Map map = CollUtil.newHashMap(); - map.put("notify", notify); - map.put("uid", storeOrder.getUid()); - notifyMapList.add(map); + // 发送用户退款管理员提醒短信 + if (StrUtil.isNotBlank(smsSwitch) || smsSwitch.equals("1")) { + // 查询可已发送短信的管理员 + List systemAdminList = systemAdminService.findIsSmsList(); + if (CollUtil.isNotEmpty(systemAdminList)) { + // 发送短信 + systemAdminList.forEach(admin -> { + smsService.sendOrderRefundApplyNotice(admin.getPhone(), storeOrder.getOrderId(), admin.getRealName()); + }); + } } } - boolean batch = storeOrderService.updateBatchById(orderList, 100); - if (batch && notifyMapList.size() > 0) { - // 发送微信小程序订阅消息 - notifyMapList.forEach(i -> { - WechatSendMessageForReFundNotify notify = (WechatSendMessageForReFundNotify) i.get("notify"); - Integer uid = (Integer) i.get("uid"); - wechatSendMessageForMinService.sendReFundNotifyMessage(notify, uid); - }); - } - - return batch; + return storeOrderService.updateBatchById(orderList, 100); } diff --git a/crmeb/src/main/java/com/zbkj/crmeb/front/service/impl/ProductServiceImpl.java b/crmeb/src/main/java/com/zbkj/crmeb/front/service/impl/ProductServiceImpl.java index f5ee798f..eaf77238 100644 --- a/crmeb/src/main/java/com/zbkj/crmeb/front/service/impl/ProductServiceImpl.java +++ b/crmeb/src/main/java/com/zbkj/crmeb/front/service/impl/ProductServiceImpl.java @@ -200,7 +200,17 @@ public class ProductServiceImpl implements ProductService { if(null != user && null != user.getUid()){ storeInfo.setUserLike(storeProductRelationService.getLikeOrCollectByUser(user.getUid(),id,true).size() > 0); storeInfo.setUserCollect(storeProductRelationService.getLikeOrCollectByUser(user.getUid(),id,false).size() > 0); - productDetailResponse.setPriceName(getPacketPriceRange(productResponse, user.getIsPromoter())); + + // 判断是否开启分销 + String brokerageFuncStatus = systemConfigService.getValueByKey("brokerage_func_status"); + String storeBrokerageStatus = systemConfigService.getValueByKey("store_brokerage_status"); + if (brokerageFuncStatus.equals("1")) { + if (storeBrokerageStatus.equals("1")) { + productDetailResponse.setPriceName(getPacketPriceRange(productResponse, user.getIsPromoter())); + } else { + productDetailResponse.setPriceName(getPacketPriceRange(productResponse, true)); + } + } }else{ storeInfo.setUserLike(false); storeInfo.setUserCollect(false); diff --git a/crmeb/src/main/java/com/zbkj/crmeb/front/service/impl/UserCenterServiceImpl.java b/crmeb/src/main/java/com/zbkj/crmeb/front/service/impl/UserCenterServiceImpl.java index 44e6e2e4..afb0c955 100644 --- a/crmeb/src/main/java/com/zbkj/crmeb/front/service/impl/UserCenterServiceImpl.java +++ b/crmeb/src/main/java/com/zbkj/crmeb/front/service/impl/UserCenterServiceImpl.java @@ -1,16 +1,20 @@ package com.zbkj.crmeb.front.service.impl; import cn.hutool.core.collection.CollUtil; +import cn.hutool.core.util.ObjectUtil; +import cn.hutool.core.util.StrUtil; import com.alibaba.fastjson.JSON; import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; import com.common.CommonPage; +import com.common.MyRecord; import com.common.PageParamRequest; +import com.constants.BrokerageRecordConstants; import com.constants.Constants; +import com.constants.PayConstants; import com.exception.CrmebException; import com.github.pagehelper.PageInfo; import com.utils.CrmebUtil; import com.utils.DateUtil; -import com.zbkj.crmeb.finance.model.UserExtract; import com.zbkj.crmeb.finance.model.UserRecharge; import com.zbkj.crmeb.finance.request.FundsMonitorSearchRequest; import com.zbkj.crmeb.finance.request.UserExtractRequest; @@ -20,8 +24,13 @@ import com.zbkj.crmeb.front.request.UserRechargeRequest; import com.zbkj.crmeb.front.request.UserSpreadPeopleRequest; import com.zbkj.crmeb.front.response.*; import com.zbkj.crmeb.front.service.UserCenterService; +import com.zbkj.crmeb.front.vo.WxPayJsResultVo; +import com.zbkj.crmeb.marketing.model.StoreCoupon; +import com.zbkj.crmeb.marketing.model.StoreCouponUser; +import com.zbkj.crmeb.marketing.service.StoreCouponService; +import com.zbkj.crmeb.marketing.service.StoreCouponUserService; import com.zbkj.crmeb.payment.service.RechargePayService; -import com.zbkj.crmeb.payment.vo.wechat.CreateOrderResponseVo; +import com.zbkj.crmeb.payment.wechat.WeChatPayService; import com.zbkj.crmeb.store.model.StoreOrder; import com.zbkj.crmeb.store.service.StoreOrderService; import com.zbkj.crmeb.system.model.SystemUserLevel; @@ -33,10 +42,11 @@ import com.zbkj.crmeb.system.vo.SystemGroupDataRechargeConfigVo; import com.zbkj.crmeb.user.dao.UserDao; import com.zbkj.crmeb.user.model.User; import com.zbkj.crmeb.user.model.UserBill; +import com.zbkj.crmeb.user.model.UserBrokerageRecord; import com.zbkj.crmeb.user.model.UserToken; import com.zbkj.crmeb.user.request.RegisterThirdUserRequest; -import com.zbkj.crmeb.user.request.UserOperateFundsRequest; import com.zbkj.crmeb.user.service.UserBillService; +import com.zbkj.crmeb.user.service.UserBrokerageRecordService; import com.zbkj.crmeb.user.service.UserService; import com.zbkj.crmeb.user.service.UserTokenService; import com.zbkj.crmeb.wechat.response.WeChatAuthorizeLoginGetOpenIdResponse; @@ -44,12 +54,12 @@ import com.zbkj.crmeb.wechat.response.WeChatAuthorizeLoginUserInfoResponse; import com.zbkj.crmeb.wechat.response.WeChatProgramAuthorizeLoginGetOpenIdResponse; import com.zbkj.crmeb.wechat.service.WeChatService; import com.zbkj.crmeb.wechat.service.impl.WechatSendMessageForMinService; -import com.zbkj.crmeb.wechat.vo.WechatSendMessageForTopped; import org.apache.commons.lang3.StringUtils; import org.springframework.beans.BeanUtils; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; +import org.springframework.transaction.support.TransactionTemplate; import java.math.BigDecimal; import java.util.ArrayList; @@ -108,26 +118,40 @@ public class UserCenterServiceImpl extends ServiceImpl implements private WeChatService weChatService; @Autowired - private WechatSendMessageForMinService wechatSendMessageForMinService; + private UserBrokerageRecordService userBrokerageRecordService; + @Autowired + private TransactionTemplate transactionTemplate; + + @Autowired + private WeChatPayService weChatPayService; + + @Autowired + private StoreCouponService storeCouponService; + + @Autowired + private StoreCouponUserService storeCouponUserService; /** * 推广数据接口(昨天的佣金 累计提现金额 当前佣金) - * @author Mr.Zhang - * @since 2020-06-08 */ @Override public UserCommissionResponse getCommission() { - UserCommissionResponse userCommissionResponse = new UserCommissionResponse(); - //昨天的佣金 - userCommissionResponse.setLastDayCount(userBillService.getSumBigDecimal(0, userService.getUserIdException(), Constants.USER_BILL_CATEGORY_BROKERAGE_PRICE, Constants.SEARCH_DATE_YESTERDAY, null)); + User user = userService.getInfo(); + if (ObjectUtil.isNull(user)) { + throw new CrmebException("用户数据异常"); + } -// userCommissionResponse.setExtractCount(userBillService.getSumBigDecimal(0, userService.getUserIdException(), Constants.USER_BILL_CATEGORY_BROKERAGE_PRICE, null, Constants.USER_BILL_TYPE_EXTRACT)); + // 昨天得佣金 + BigDecimal yesterdayIncomes = userBrokerageRecordService.getYesterdayIncomes(user.getUid()); //累计已提取佣金 - userCommissionResponse.setExtractCount(userExtractService.getExtractTotalMoney(userService.getUserIdException())); + BigDecimal totalMoney = userExtractService.getExtractTotalMoney(userService.getUserIdException()); - userCommissionResponse.setCommissionCount(userService.getInfo().getBrokeragePrice()); + UserCommissionResponse userCommissionResponse = new UserCommissionResponse(); + userCommissionResponse.setLastDayCount(yesterdayIncomes); + userCommissionResponse.setExtractCount(totalMoney); + userCommissionResponse.setCommissionCount(user.getBrokeragePrice()); return userCommissionResponse; } @@ -207,7 +231,38 @@ public class UserCenterServiceImpl extends ServiceImpl implements */ @Override public Boolean extractCash(UserExtractRequest request) { - return userExtractService.create(request, userService.getUserIdException()); + switch (request.getExtractType()){ + case "weixin": + if(StringUtils.isBlank(request.getWechat())){ + throw new CrmebException("请填写微信号!"); + } + request.setAlipayCode(null); + request.setBankCode(null); + request.setBankName(null); + break; + case "alipay": + if(StringUtils.isBlank(request.getAlipayCode())){ + throw new CrmebException("请填写支付宝账号!"); + } + request.setWechat(null); + request.setBankCode(null); + request.setBankName(null); + break; + case "bank": + if(StringUtils.isBlank(request.getBankName())){ + throw new CrmebException("请填写银行名称!"); + } + if(StringUtils.isBlank(request.getBankCode())){ + throw new CrmebException("请填写银行卡号!"); + } + request.setWechat(null); + request.setAlipayCode(null); + break; + default: + throw new CrmebException("请选择支付方式"); + } + return userExtractService.extractApply(request); +// return userExtractService.create(request, userService.getUserIdException()); } /** @@ -218,13 +273,17 @@ public class UserCenterServiceImpl extends ServiceImpl implements */ @Override public UserExtractCashResponse minExtractCash() { - String bank = systemConfigService.getValueByKeyException(Constants.CONFIG_BANK_LIST).replace("\r\n", "\n"); + + // 提现最低金额 String minPrice = systemConfigService.getValueByKeyException(Constants.CONFIG_EXTRACT_MIN_PRICE); - + // 冻结天数 String extractTime = systemConfigService.getValueByKey(Constants.CONFIG_EXTRACT_FREEZING_TIME); - + // 可提现佣金 BigDecimal brokeragePrice = userService.getInfo().getBrokeragePrice(); - BigDecimal freeze = userExtractService.getFreeze(userService.getUserIdException()); + // 冻结佣金 + BigDecimal freeze = userBrokerageRecordService.getFreezePrice(userService.getUserIdException()); + // 获取提现银行 + String bank = systemConfigService.getValueByKeyException(Constants.CONFIG_BANK_LIST).replace("\r\n", "\n"); List bankArr = new ArrayList<>(); if(bank.indexOf("\n") > 0){ for (String s : bank.split("\n")) { @@ -236,7 +295,7 @@ public class UserCenterServiceImpl extends ServiceImpl implements return new UserExtractCashResponse( bankArr, minPrice, - brokeragePrice.subtract(freeze), + brokeragePrice, freeze, extractTime ); @@ -349,107 +408,176 @@ public class UserCenterServiceImpl extends ServiceImpl implements return new UserBalanceResponse(info.getNowMoney(), recharge, orderStatusSum); } +// /** +// * 推广订单 +// * @author Mr.Zhang +// * @since 2020-06-10 +// * @return UserSpreadOrderResponse; +// */ +// @Override +// public UserSpreadOrderResponse getSpreadOrder(PageParamRequest pageParamRequest) { +// UserSpreadOrderResponse userSpreadOrderResponse = new UserSpreadOrderResponse(); +// Integer userId = userService.getUserIdException(); +// List userIdList = new ArrayList<>(); +// userIdList.add(userId); +// userIdList = userService.getSpreadPeopleIdList(userIdList); //拿到一级推广id +// if(null == userIdList){ +// return userSpreadOrderResponse; +// } +// //查询所有推广人的由于订单获取佣金记录,分页 +// +// FundsMonitorSearchRequest request = new FundsMonitorSearchRequest(); +//// request.setCategory(Constants.USER_BILL_CATEGORY_MONEY); +//// request.setType(Constants.USER_BILL_TYPE_PAY_MONEY); +// request.setCategory(Constants.USER_BILL_CATEGORY_BROKERAGE_PRICE); +// request.setType(Constants.USER_BILL_TYPE_BROKERAGE); +// request.setUserIdList(CollUtil.newArrayList(userId)); +// request.setLinkId("gt"); +// request.setPm(1); +// List list = userBillService.getList(request, pageParamRequest); +// if(null == list){ +// return userSpreadOrderResponse; +// } +// CommonPage userBillCommonPage = CommonPage.restPage(list); //拿到分页信息 +// userSpreadOrderResponse.setCount(userBillCommonPage.getTotal()); //总数 +// +// //拿到订单id, 查询订单信息 +// List orderIdList = list.stream().map(i -> Integer.parseInt(i.getLinkId())).distinct().collect(Collectors.toList()); +// Map orderList = storeOrderService.getMapInId(orderIdList); +// +// //用户信息 +//// userIdList = list.stream().map(UserBill::getUid).distinct().collect(Collectors.toList()); +// List storeOrderList = new ArrayList<>(orderList.values()); +// userIdList = storeOrderList.stream().map(StoreOrder::getUid).distinct().collect(Collectors.toList()); +// HashMap userList = userService.getMapListInUid(userIdList); +// +// //按时间分组数据 +// List userSpreadOrderItemResponseList = new ArrayList<>(); +// for (UserBill userBill : list) { +// String date = DateUtil.dateToStr(userBill.getCreateTime(), Constants.DATE_FORMAT_MONTH); +// boolean isAdd = false; +// String orderId = ""; +// Integer linkId = Integer.parseInt(userBill.getLinkId()); +// if(null != orderList && orderList.containsKey(linkId)){ +// orderId = orderList.get(linkId).getOrderId(); +// } +// +// UserSpreadOrderItemChildResponse userSpreadOrderItemChildResponse = new UserSpreadOrderItemChildResponse( +// orderId, //订单号 +// userBill.getCreateTime(), +// (userBill.getStatus() == 1) ? userBill.getNumber() : BigDecimal.ZERO, +//// userList.get(userBill.getUid()).getAvatar(), +//// userList.get(userBill.getUid()).getNickname(), +// userList.get(orderList.get(linkId).getUid()).getAvatar(), +// userList.get(orderList.get(linkId).getUid()).getNickname(), +// userBill.getType() +// ); +// +// //如果在已有的数据中找到当前月份数据则追加 +// for (UserSpreadOrderItemResponse userSpreadOrderItemResponse: userSpreadOrderItemResponseList) { +// if(userSpreadOrderItemResponse.getTime().equals(date)){ +// userSpreadOrderItemResponse.getChild().add(userSpreadOrderItemChildResponse); +// isAdd = true; +// break; +// } +// } +// +// //没月找到则创建一条数据 +// if(!isAdd){ +// //创建一个 +// UserSpreadOrderItemResponse userSpreadOrderItemResponse = new UserSpreadOrderItemResponse(); +// userSpreadOrderItemResponse.setTime(date); +// userSpreadOrderItemResponse.getChild().add(userSpreadOrderItemChildResponse); +// userSpreadOrderItemResponseList.add(userSpreadOrderItemResponse); +// } +// } +// +// List monthList = userSpreadOrderItemResponseList.stream().map(s -> "'" + s.getTime() + "'").collect(Collectors.toList()); +// +// if(monthList.size() < 1){ +// return userSpreadOrderResponse; +// } +// +// //获取每个月分的总数 +// Map countMap = userBillService.getCountListByMonth(request, monthList); +// +// //统计每月的订单数量 +// for (UserSpreadOrderItemResponse userSpreadOrderItemResponse: userSpreadOrderItemResponseList) { +// userSpreadOrderItemResponse.setCount(countMap.get(userSpreadOrderItemResponse.getTime())); +// } +// +// userSpreadOrderResponse.setList(userSpreadOrderItemResponseList); +// +// return userSpreadOrderResponse; +// } + /** * 推广订单 - * @author Mr.Zhang - * @since 2020-06-10 * @return UserSpreadOrderResponse; */ @Override public UserSpreadOrderResponse getSpreadOrder(PageParamRequest pageParamRequest) { - UserSpreadOrderResponse userSpreadOrderResponse = new UserSpreadOrderResponse(); - Integer userId = userService.getUserIdException(); - List userIdList = new ArrayList<>(); - userIdList.add(userId); - userIdList = userService.getSpreadPeopleIdList(userIdList); //拿到一级推广id - if(null == userIdList){ - return userSpreadOrderResponse; + User user = userService.getInfo(); + if (ObjectUtil.isNull(user)) { + throw new CrmebException("用户数据异常"); } - //查询所有推广人的由于订单获取佣金记录,分页 - - FundsMonitorSearchRequest request = new FundsMonitorSearchRequest(); -// request.setCategory(Constants.USER_BILL_CATEGORY_MONEY); -// request.setType(Constants.USER_BILL_TYPE_PAY_MONEY); - request.setCategory(Constants.USER_BILL_CATEGORY_BROKERAGE_PRICE); - request.setType(Constants.USER_BILL_TYPE_BROKERAGE); - request.setUserIdList(CollUtil.newArrayList(userId)); - request.setLinkId("gt"); - request.setPm(1); - List list = userBillService.getList(request, pageParamRequest); - if(null == list){ - return userSpreadOrderResponse; + UserSpreadOrderResponse spreadOrderResponse = new UserSpreadOrderResponse(); + // 获取累计推广条数 + Integer spreadCount = userBrokerageRecordService.getSpreadCountByUid(user.getUid()); + spreadOrderResponse.setCount(spreadCount.longValue()); + if (spreadCount.equals(0)) { + return spreadOrderResponse; } - CommonPage userBillCommonPage = CommonPage.restPage(list); //拿到分页信息 - userSpreadOrderResponse.setCount(userBillCommonPage.getTotal()); //总数 - //拿到订单id, 查询订单信息 - List orderIdList = list.stream().map(i -> Integer.parseInt(i.getLinkId())).distinct().collect(Collectors.toList()); - Map orderList = storeOrderService.getMapInId(orderIdList); + // 获取推广订单记录,分页 + List recordList = userBrokerageRecordService.findSpreadListByUid(user.getUid(), pageParamRequest); + // 获取对应的订单信息 + List orderNoList = recordList.stream().map(UserBrokerageRecord::getLinkId).collect(Collectors.toList()); + Map orderMap = storeOrderService.getMapInOrderNo(orderNoList); + // 获取对应的用户信息 + List storeOrderList = new ArrayList<>(orderMap.values()); + List uidList = storeOrderList.stream().map(StoreOrder::getUid).distinct().collect(Collectors.toList()); + HashMap userMap = userService.getMapListInUid(uidList); - //用户信息 -// userIdList = list.stream().map(UserBill::getUid).distinct().collect(Collectors.toList()); - List storeOrderList = new ArrayList<>(orderList.values()); - userIdList = storeOrderList.stream().map(StoreOrder::getUid).distinct().collect(Collectors.toList()); - HashMap userList = userService.getMapListInUid(userIdList); - - //按时间分组数据 List userSpreadOrderItemResponseList = new ArrayList<>(); - for (UserBill userBill : list) { - String date = DateUtil.dateToStr(userBill.getCreateTime(), Constants.DATE_FORMAT_MONTH); - boolean isAdd = false; - String orderId = ""; - Integer linkId = Integer.parseInt(userBill.getLinkId()); - if(null != orderList && orderList.containsKey(linkId)){ - orderId = orderList.get(linkId).getOrderId(); - } + List monthList = CollUtil.newArrayList(); + recordList.forEach(record -> { + UserSpreadOrderItemChildResponse userSpreadOrderItemChildResponse = new UserSpreadOrderItemChildResponse(); + userSpreadOrderItemChildResponse.setOrderId(record.getLinkId()); + userSpreadOrderItemChildResponse.setTime(record.getUpdateTime()); + userSpreadOrderItemChildResponse.setNumber(record.getPrice()); + Integer orderUid = orderMap.get(record.getLinkId()).getUid(); + userSpreadOrderItemChildResponse.setAvatar(userMap.get(orderUid).getAvatar()); + userSpreadOrderItemChildResponse.setNickname(userMap.get(orderUid).getNickname()); + userSpreadOrderItemChildResponse.setType("返佣"); - UserSpreadOrderItemChildResponse userSpreadOrderItemChildResponse = new UserSpreadOrderItemChildResponse( - orderId, //订单号 - userBill.getCreateTime(), - (userBill.getStatus() == 1) ? userBill.getNumber() : BigDecimal.ZERO, -// userList.get(userBill.getUid()).getAvatar(), -// userList.get(userBill.getUid()).getNickname(), - userList.get(orderList.get(linkId).getUid()).getAvatar(), - userList.get(orderList.get(linkId).getUid()).getNickname(), - userBill.getType() - ); - - //如果在已有的数据中找到当前月份数据则追加 - for (UserSpreadOrderItemResponse userSpreadOrderItemResponse: userSpreadOrderItemResponseList) { - if(userSpreadOrderItemResponse.getTime().equals(date)){ - userSpreadOrderItemResponse.getChild().add(userSpreadOrderItemChildResponse); - isAdd = true; - break; + String month = DateUtil.dateToStr(record.getUpdateTime(), Constants.DATE_FORMAT_MONTH); + if (monthList.contains(month)) { + //如果在已有的数据中找到当前月份数据则追加 + for (UserSpreadOrderItemResponse userSpreadOrderItemResponse : userSpreadOrderItemResponseList) { + if(userSpreadOrderItemResponse.getTime().equals(month)){ + userSpreadOrderItemResponse.getChild().add(userSpreadOrderItemChildResponse); + break; + } } - } - - //没月找到则创建一条数据 - if(!isAdd){ + } else {// 不包含此月份 //创建一个 UserSpreadOrderItemResponse userSpreadOrderItemResponse = new UserSpreadOrderItemResponse(); - userSpreadOrderItemResponse.setTime(date); + userSpreadOrderItemResponse.setTime(month); userSpreadOrderItemResponse.getChild().add(userSpreadOrderItemChildResponse); userSpreadOrderItemResponseList.add(userSpreadOrderItemResponse); + monthList.add(month); } - } + }); - List monthList = userSpreadOrderItemResponseList.stream().map(s -> "'" + s.getTime() + "'").collect(Collectors.toList()); - - if(monthList.size() < 1){ - return userSpreadOrderResponse; - } - - //获取每个月分的总数 - Map countMap = userBillService.getCountListByMonth(request, monthList); - - //统计每月的订单数量 + // 获取月份总订单数 + Map countMap = userBrokerageRecordService.getSpreadCountByUidAndMonth(user.getUid(), monthList); for (UserSpreadOrderItemResponse userSpreadOrderItemResponse: userSpreadOrderItemResponseList) { userSpreadOrderItemResponse.setCount(countMap.get(userSpreadOrderItemResponse.getTime())); } - userSpreadOrderResponse.setList(userSpreadOrderItemResponseList); - - return userSpreadOrderResponse; + spreadOrderResponse.setList(userSpreadOrderItemResponseList); + return spreadOrderResponse; } /** @@ -460,7 +588,7 @@ public class UserCenterServiceImpl extends ServiceImpl implements */ @Override @Transactional(rollbackFor = {RuntimeException.class, Error.class, CrmebException.class}) - public UserRechargePaymentResponse recharge(UserRechargeRequest request) { + public OrderPayResultResponse recharge(UserRechargeRequest request) { request.setPayType(Constants.PAY_TYPE_WE_CHAT); //验证金额是否为最低金额 @@ -470,7 +598,7 @@ public class UserCenterServiceImpl extends ServiceImpl implements if(compareResult > 0){ throw new CrmebException("充值金额不能低于" + rechargeMinAmountStr); } - request.setPrice(request.getPrice()); + request.setGivePrice(BigDecimal.ZERO); if(request.getGroupDataId() > 0){ @@ -486,28 +614,37 @@ public class UserCenterServiceImpl extends ServiceImpl implements } User currentUser = userService.getInfoException(); //生成系统订单 - request.setUserId(currentUser.getUid()); - UserRecharge userRecharge = userRechargeService.create(request); - - //微信支付 - try{ - CreateOrderResponseVo responseVo = rechargePayService.payOrder(userRecharge.getId(), request.getPayType(), request.getClientIp()); - if(null == responseVo){ - throw new CrmebException("下单失败!"); - } - // 小程序订阅通知 充值成功通知 - WechatSendMessageForTopped topped = new WechatSendMessageForTopped( - userRecharge.getOrderId(),userRecharge.getOrderId(),userRecharge.getPrice()+"", - currentUser.getNowMoney()+"",userRecharge.getCreateTime()+"", userRecharge.getGivePrice()+"", - "暂无",userRecharge.getPrice()+"","CRMEB","微信" - ); - wechatSendMessageForMinService.sendToppedMessage(topped, currentUser.getUid()); - - return weChatService.response(responseVo); - }catch (Exception e){ - throw new CrmebException(e.getMessage()); + UserRecharge userRecharge = new UserRecharge(); + userRecharge.setUid(currentUser.getUid()); + userRecharge.setOrderId(CrmebUtil.getOrderNo("recharge")); + userRecharge.setPrice(request.getPrice()); + userRecharge.setGivePrice(request.getGivePrice()); + userRecharge.setRechargeType(request.getFromType()); + boolean save = userRechargeService.save(userRecharge); + if (!save) { + throw new CrmebException("生成充值订单失败!"); } + + OrderPayResultResponse response = new OrderPayResultResponse(); + MyRecord record = new MyRecord(); + Map unifiedorder = weChatPayService.unifiedRecharge(userRecharge, request.getClientIp()); + record.set("status", true); + response.setStatus(true); + WxPayJsResultVo vo = new WxPayJsResultVo(); + vo.setAppId(unifiedorder.get("appId")); + vo.setNonceStr(unifiedorder.get("nonceStr")); + vo.setPackages(unifiedorder.get("package")); + vo.setSignType(unifiedorder.get("signType")); + vo.setTimeStamp(unifiedorder.get("timeStamp")); + vo.setPaySign(unifiedorder.get("paySign")); + if (userRecharge.getRechargeType().equals(PayConstants.PAY_CHANNEL_WE_CHAT_H5)) { + vo.setMwebUrl(unifiedorder.get("mweb_url")); + response.setPayType(PayConstants.PAY_CHANNEL_WE_CHAT_H5); + } + response.setJsConfig(vo); + response.setOrderNo(userRecharge.getOrderId()); + return response; } /** @@ -520,19 +657,17 @@ public class UserCenterServiceImpl extends ServiceImpl implements @Transactional(rollbackFor = {RuntimeException.class, Error.class, CrmebException.class}) public LoginResponse weChatAuthorizeLogin(String code, Integer spreadUid) { try{ - System.out.println("code = " + code); + // 通过code获取获取公众号授权信息 WeChatAuthorizeLoginGetOpenIdResponse response = weChatService.authorizeLogin(code); - System.out.println("response = " + response); - User user = publicLogin(response.getOpenId(), response.getAccessToken()); - System.out.println("user = " + user); + // 获取登录用户 + User user = publicLogin(response.getOpenId(), response.getAccessToken(), spreadUid); //通过用户id获取登录token信息 LoginResponse loginResponse = new LoginResponse(); loginResponse.setToken(userService.token(user)); user.setPwd(null); - //绑定推广关系 - userService.bindSpread(user, spreadUid); loginResponse.setUser(user); + // 记录最后一次登录时间 user.setLastLoginTime(DateUtil.nowDateTime()); updateById(user); return loginResponse; @@ -549,30 +684,53 @@ public class UserCenterServiceImpl extends ServiceImpl implements * @since 2020-05-25 * @return List */ - private User publicLogin(String openId, String token) { + private User publicLogin(String openId, String token, Integer spreadUid) { try { //检测是否存在 - System.out.println("openId = " + openId); - System.out.println("token = " + token); UserToken userToken = userTokenService.checkToken(openId, Constants.THIRD_LOGIN_TOKEN_TYPE_PUBLIC); - System.out.println("userToken = " + userToken); if(null != userToken){ - return userService.getById(userToken.getUid()); + User user = userService.getById(userToken.getUid()); + // 分销绑定 + if (userService.checkBingSpread(user, spreadUid, "old")) { + user.setSpreadUid(spreadUid); + user.setSpreadTime(DateUtil.nowDateTime()); + Boolean execute = transactionTemplate.execute(e -> { + userService.updateById(user); + userService.updateSpreadCountByUid(spreadUid); + return Boolean.TRUE; + }); + if (!execute) { + System.out.println(StrUtil.format("公众号登录绑定分销关系失败,uid={},spreadUid={}", user.getUid(), spreadUid)); + } + } + return user; } //没有注册, 获取微信用户信息, 小程序需要前端传入用户信息参数 WeChatAuthorizeLoginUserInfoResponse userInfo = weChatService.getUserInfo(openId, token); - System.out.println("userInfo = " + userInfo); RegisterThirdUserRequest registerThirdUserRequest = new RegisterThirdUserRequest(); BeanUtils.copyProperties(userInfo, registerThirdUserRequest); - System.out.println("registerThirdUserRequest = " + registerThirdUserRequest); String unionId = userInfo.getUnionId(); //看unionid是否已经绑定 if(StringUtils.isNotBlank(unionId)){ userToken = userTokenService.checkToken(userInfo.getUnionId(), Constants.THIRD_LOGIN_TOKEN_TYPE_UNION_ID); if(null != userToken){ - return userService.getById(userToken.getUid()); + User user = userService.getById(userToken.getUid()); + // 分销绑定 + if (userService.checkBingSpread(user, spreadUid, "old")) { + user.setSpreadUid(spreadUid); + user.setSpreadTime(DateUtil.nowDateTime()); + Boolean execute = transactionTemplate.execute(e -> { + userService.updateById(user); + userService.updateSpreadCountByUid(spreadUid); + return Boolean.TRUE; + }); + if (!execute) { + System.out.println(StrUtil.format("公众号登录绑定分销关系失败,uid={},spreadUid={}", user.getUid(), spreadUid)); + } + } + return user; } } @@ -584,6 +742,56 @@ public class UserCenterServiceImpl extends ServiceImpl implements //有就绑定 userTokenService.bind(unionId, Constants.THIRD_LOGIN_TOKEN_TYPE_UNION_ID, user.getUid()); } + // 分销绑定 + if (userService.checkBingSpread(user, spreadUid, "new")) { + user.setSpreadUid(spreadUid); + user.setSpreadTime(DateUtil.nowDateTime()); + Boolean execute = transactionTemplate.execute(e -> { + userService.updateById(user); + userService.updateSpreadCountByUid(spreadUid); + return Boolean.TRUE; + }); + if (!execute) { + System.out.println(StrUtil.format("公众号登录绑定分销关系失败,uid={},spreadUid={}", user.getUid(), spreadUid)); + } + } + + // 赠送优惠券 + // 查询是否有新人注册赠送优惠券 + List couponUserList = CollUtil.newArrayList(); + List couponList = storeCouponService.findRegisterList(); + if (CollUtil.isNotEmpty(couponList)) { + couponList.forEach(storeCoupon -> { + StoreCouponUser storeCouponUser = new StoreCouponUser(); + storeCouponUser.setCouponId(storeCoupon.getId()); +// storeCouponUser.setUid(userId); + storeCouponUser.setName(storeCoupon.getName()); + storeCouponUser.setMoney(storeCoupon.getMoney()); + storeCouponUser.setMinPrice(storeCoupon.getMinPrice()); + storeCouponUser.setStartTime(storeCoupon.getUseStartTime()); + storeCouponUser.setEndTime(storeCoupon.getUseEndTime()); + storeCouponUser.setUseType(storeCoupon.getUseType()); + storeCouponUser.setType("register"); + if (storeCoupon.getUseType() > 1) { + storeCouponUser.setPrimaryKey(storeCoupon.getPrimaryKey()); + } + couponUserList.add(storeCouponUser); + }); + } + + // 赠送客户优惠券 + if (CollUtil.isNotEmpty(couponUserList)) { + couponUserList.forEach(couponUser -> { + couponUser.setUid(user.getUid()); + + }); + storeCouponUserService.saveBatch(couponUserList); + couponList.forEach(coupon -> { + storeCouponService.deduction(coupon.getId(), 1, coupon.getIsLimited()); + }); + } + + return user; }catch (Exception e){ throw new CrmebException(e.getMessage()); @@ -598,7 +806,7 @@ public class UserCenterServiceImpl extends ServiceImpl implements */ @Override public String getLogo() { - String url = systemConfigService.getValueByKey(Constants.CONFIG_KEY_SITE_LOGO); + String url = systemConfigService.getValueByKey(Constants.CONFIG_KEY_MOBILE_LOGIN_LOGO); // if(StringUtils.isNotBlank(url) && !url.contains("http")){ // url = systemConfigService.getValueByKey(Constants.CONFIG_KEY_SITE_URL) + url; // url = url.replace("\\", "/"); @@ -624,10 +832,9 @@ public class UserCenterServiceImpl extends ServiceImpl implements LoginResponse loginResponse = new LoginResponse(); loginResponse.setToken(userService.token(user)); user.setPwd(null); - //绑定推广关系 - userService.bindSpread(user, request.getSpreadPid()); loginResponse.setUser(user); + // 记录最后一次登录时间 user.setLastLoginTime(DateUtil.nowDateTime()); updateById(user); return loginResponse; @@ -653,43 +860,36 @@ public class UserCenterServiceImpl extends ServiceImpl implements * 佣金排行榜 * @param type String 时间范围 * @param pageParamRequest PageParamRequest 分页 - * @author Mr.Zhang - * @since 2020-05-25 - * @return List + * @return List */ @Override public List getTopBrokerageListByDate(String type, PageParamRequest pageParamRequest) { - List userBillVoList = userBillService.getTopBrokerageListByDate(type, pageParamRequest); - if(userBillVoList.size() < 1){ + // 获取佣金排行榜(周、月) + List recordList = userBrokerageRecordService.getBrokerageTopByDate(type, pageParamRequest); + if (CollUtil.isEmpty(recordList)) { return null; } - List uidList = userBillVoList.stream().map(UserBill::getUid).collect(Collectors.toList()); - if(uidList.size() < 1){ - return null; - } - - ArrayList userList = new ArrayList<>(); + List uidList = recordList.stream().map(UserBrokerageRecord::getUid).collect(Collectors.toList()); //查询用户 HashMap userVoList = userService.getMapListInUid(uidList); //解决排序问题 - for (UserBill userBillVo: userBillVoList) { + List userList = CollUtil.newArrayList(); + for (UserBrokerageRecord record: recordList) { User user = new User(); - User userVo = userVoList.get(userBillVo.getUid()); + User userVo = userVoList.get(record.getUid()); - user.setUid(userBillVo.getUid()); + user.setUid(record.getUid()); user.setAvatar(userVo.getAvatar()); - user.setBrokeragePrice(userBillVo.getNumber()); - if(StringUtils.isBlank(userVo.getNickname())){ + user.setBrokeragePrice(record.getPrice()); + if(StrUtil.isBlank(userVo.getNickname())){ user.setNickname(userVo.getPhone().substring(0, 2) + "****" + userVo.getPhone().substring(7)); }else{ user.setNickname(userVo.getNickname()); } - userList.add(user); } - return userList; } @@ -716,25 +916,17 @@ public class UserCenterServiceImpl extends ServiceImpl implements PageParamRequest pageParamRequest = new PageParamRequest(); pageParamRequest.setLimit(100); - List userBillVoList = userBillService.getTopBrokerageListByDate(type, pageParamRequest); - if(userBillVoList.size() < 1){ + List recordList = userBrokerageRecordService.getBrokerageTopByDate(type, pageParamRequest); + if (CollUtil.isEmpty(recordList)) { return number; } - List uidList = userBillVoList.stream().map(UserBill::getUid).collect(Collectors.toList()); - if(uidList.size() < 1){ - return number; - } - - int i = 1; - for (UserBill userBill : userBillVoList) { - if(userBill.getUid().equals(userId)){ - number = i; - break; + for (int i = 0; i < recordList.size(); i++) { + if (recordList.get(i).getUid().equals(userId)) { + number = i + 1; + break ; } - i++; } - return number; } @@ -745,41 +937,57 @@ public class UserCenterServiceImpl extends ServiceImpl implements * @return Boolean */ @Override - @Transactional(rollbackFor = {RuntimeException.class, Error.class, CrmebException.class}) public Boolean transferIn(BigDecimal price) { - try{ - //当前可提现佣金 - User user = userService.getInfo(); - BigDecimal freeze = userExtractService.getFreeze(user.getUid()); //冻结佣金 - BigDecimal subtract = user.getBrokeragePrice().subtract(freeze); - - if(subtract.compareTo(price) < 0){ - throw new CrmebException("您当前可充值余额为 " + subtract + "元"); - } - - UserOperateFundsRequest request = new UserOperateFundsRequest(); - request.setFoundsCategory(Constants.USER_BILL_CATEGORY_BROKERAGE_PRICE); - request.setType(0); - request.setFoundsType(Constants.USER_BILL_TYPE_TRANSFER_IN); - request.setUid(user.getUid()); - request.setValue(price); - request.setTitle("佣金转余额"); - userService.updateFounds(request, true); //更新佣金 - - - UserOperateFundsRequest money = new UserOperateFundsRequest(); - money.setFoundsCategory(Constants.USER_BILL_CATEGORY_MONEY); - money.setType(1); - money.setFoundsType(Constants.USER_BILL_TYPE_TRANSFER_IN); - money.setUid(user.getUid()); - money.setValue(price); - money.setTitle("佣金转余额"); - userService.updateFounds(money, true); //更新佣金 - return true; - }catch (Exception e){ - throw new CrmebException("操作失败:" + e.getMessage()); + //当前可提现佣金 + User user = userService.getInfo(); + if (ObjectUtil.isNull(user)) { + throw new CrmebException("用户数据异常"); } + BigDecimal subtract = user.getBrokeragePrice(); + if (price.compareTo(BigDecimal.ZERO) <= 0) { + throw new CrmebException("转入金额不能为0"); + } + if(subtract.compareTo(price) < 0){ + throw new CrmebException("您当前可充值余额为 " + subtract + "元"); + } + // userBill现金增加记录 + UserBill userBill = new UserBill(); + userBill.setUid(user.getUid()); + userBill.setLinkId("0"); + userBill.setPm(1); + userBill.setTitle("佣金转余额"); + userBill.setCategory(Constants.USER_BILL_CATEGORY_MONEY); + userBill.setType(Constants.USER_BILL_TYPE_TRANSFER_IN); + userBill.setNumber(price); + userBill.setBalance(user.getNowMoney().add(price)); + userBill.setMark(StrUtil.format("佣金转余额,增加{}", price)); + userBill.setStatus(1); + userBill.setCreateTime(DateUtil.nowDateTime()); + + // userBrokerage转出记录 + UserBrokerageRecord brokerageRecord = new UserBrokerageRecord(); + brokerageRecord.setUid(user.getUid()); + brokerageRecord.setLinkId("0"); + brokerageRecord.setLinkType(BrokerageRecordConstants.BROKERAGE_RECORD_LINK_TYPE_YUE); + brokerageRecord.setType(BrokerageRecordConstants.BROKERAGE_RECORD_TYPE_SUB); + brokerageRecord.setTitle(BrokerageRecordConstants.BROKERAGE_RECORD_TITLE_BROKERAGE_YUE); + brokerageRecord.setPrice(price); + brokerageRecord.setBalance(user.getNowMoney().add(price)); + brokerageRecord.setMark(StrUtil.format("佣金转余额,减少{}", price)); + brokerageRecord.setStatus(BrokerageRecordConstants.BROKERAGE_RECORD_STATUS_COMPLETE); + brokerageRecord.setCreateTime(DateUtil.nowDateTime()); + + Boolean execute = transactionTemplate.execute(e -> { + // 扣佣金 + userService.operationBrokerage(user.getUid(), price, user.getBrokeragePrice(), "sub"); + // 加余额 + userService.operationNowMoney(user.getUid(), price, user.getNowMoney(), "add"); + userBillService.save(userBill); + userBrokerageRecordService.save(brokerageRecord); + return Boolean.TRUE; + }); + return execute; } /** @@ -795,13 +1003,41 @@ public class UserCenterServiceImpl extends ServiceImpl implements //检测是否存在 UserToken userToken = userTokenService.checkToken(openId, Constants.THIRD_LOGIN_TOKEN_TYPE_PROGRAM); if(null != userToken){ - return userService.getById(userToken.getUid()); + User user = userService.getById(userToken.getUid()); + // 分销绑定 + if (userService.checkBingSpread(user, request.getSpreadPid(), "old")) { + user.setSpreadUid(request.getSpreadPid()); + user.setSpreadTime(DateUtil.nowDateTime()); + Boolean execute = transactionTemplate.execute(e -> { + userService.updateById(user); + userService.updateSpreadCountByUid(request.getSpreadPid()); + return Boolean.TRUE; + }); + if (!execute) { + System.out.println(StrUtil.format("公众号登录绑定分销关系失败,uid={},spreadUid={}", user.getUid(), request.getSpreadPid())); + } + } + return user; } if(StringUtils.isNotBlank(unionId)) { userToken = userTokenService.checkToken(unionId, Constants.THIRD_LOGIN_TOKEN_TYPE_PROGRAM); if (null != userToken) { - return userService.getById(userToken.getUid()); + User user = userService.getById(userToken.getUid()); + // 分销绑定 + if (userService.checkBingSpread(user, request.getSpreadPid(), "old")) { + user.setSpreadUid(request.getSpreadPid()); + user.setSpreadTime(DateUtil.nowDateTime()); + Boolean execute = transactionTemplate.execute(e -> { + userService.updateById(user); + userService.updateSpreadCountByUid(request.getSpreadPid()); + return Boolean.TRUE; + }); + if (!execute) { + System.out.println(StrUtil.format("公众号登录绑定分销关系失败,uid={},spreadUid={}", user.getUid(), request.getSpreadPid())); + } + } + return user; } } @@ -813,6 +1049,55 @@ public class UserCenterServiceImpl extends ServiceImpl implements //有就绑定 userTokenService.bind(unionId, Constants.THIRD_LOGIN_TOKEN_TYPE_UNION_ID, user.getUid()); } + // 分销绑定 + if (userService.checkBingSpread(user, request.getSpreadPid(), "new")) { + user.setSpreadUid(request.getSpreadPid()); + user.setSpreadTime(DateUtil.nowDateTime()); + Boolean execute = transactionTemplate.execute(e -> { + userService.updateById(user); + userService.updateSpreadCountByUid(request.getSpreadPid()); + return Boolean.TRUE; + }); + if (!execute) { + System.out.println(StrUtil.format("公众号登录绑定分销关系失败,uid={},spreadUid={}", user.getUid(), request.getSpreadPid())); + } + } + + // 赠送优惠券 + // 查询是否有新人注册赠送优惠券 + List couponUserList = CollUtil.newArrayList(); + List couponList = storeCouponService.findRegisterList(); + if (CollUtil.isNotEmpty(couponList)) { + couponList.forEach(storeCoupon -> { + StoreCouponUser storeCouponUser = new StoreCouponUser(); + storeCouponUser.setCouponId(storeCoupon.getId()); +// storeCouponUser.setUid(userId); + storeCouponUser.setName(storeCoupon.getName()); + storeCouponUser.setMoney(storeCoupon.getMoney()); + storeCouponUser.setMinPrice(storeCoupon.getMinPrice()); + storeCouponUser.setStartTime(storeCoupon.getUseStartTime()); + storeCouponUser.setEndTime(storeCoupon.getUseEndTime()); + storeCouponUser.setUseType(storeCoupon.getUseType()); + storeCouponUser.setType("register"); + if (storeCoupon.getUseType() > 1) { + storeCouponUser.setPrimaryKey(storeCoupon.getPrimaryKey()); + } + couponUserList.add(storeCouponUser); + }); + } + + // 赠送客户优惠券 + if (CollUtil.isNotEmpty(couponUserList)) { + couponUserList.forEach(couponUser -> { + couponUser.setUid(user.getUid()); + + }); + storeCouponUserService.saveBatch(couponUserList); + couponList.forEach(coupon -> { + storeCouponService.deduction(coupon.getId(), 1, coupon.getIsLimited()); + }); + } + return user; }catch (Exception e){ throw new CrmebException(e.getMessage()); @@ -823,7 +1108,6 @@ public class UserCenterServiceImpl extends ServiceImpl implements * 提现记录 * @author HZE * @since 2020-10-27 - * @return */ @Override public PageInfo getExtractRecord(PageParamRequest pageParamRequest) { @@ -834,10 +1118,61 @@ public class UserCenterServiceImpl extends ServiceImpl implements * 提现总金额 * @author HZE * @since 2020-10-27 - * @return */ @Override public BigDecimal getExtractTotalMoney(){ return userExtractService.getExtractTotalMoney(userService.getUserIdException()); } + + /** + * 推广佣金明细 + * @param pageParamRequest 分页参数 + */ + @Override + public PageInfo getSpreadCommissionDetail(PageParamRequest pageParamRequest) { + User user = userService.getInfo(); + if (ObjectUtil.isNull(user)) { + throw new CrmebException("用户数据异常"); + } + + return userBrokerageRecordService.findDetailListByUid(user.getUid(), pageParamRequest); + } + + /** + * 用户账单记录(现金) + * @param type 记录类型:all-全部,expenditure-支出,income-收入 + * @return CommonPage + */ + @Override + public CommonPage nowMoneyBillRecord(String type, PageParamRequest pageRequest) { + User user = userService.getInfo(); + if (ObjectUtil.isNull(user)) { + throw new CrmebException("用户数据异常"); + } + PageInfo billPageInfo = userBillService.nowMoneyBillRecord(user.getUid(), type, pageRequest); + List list = billPageInfo.getList(); + + // 获取年-月 + Map> map = CollUtil.newHashMap(); + list.forEach(i -> { + String month = StrUtil.subPre(DateUtil.dateToStr(i.getCreateTime(), Constants.DATE_FORMAT), 7); + if (map.containsKey(month)) { + map.get(month).add(i); + } else { + List billList = CollUtil.newArrayList(); + billList.add(i); + map.put(month, billList); + } + }); + List responseList = CollUtil.newArrayList(); + map.forEach((key, value) -> { + UserRechargeBillRecordResponse response = new UserRechargeBillRecordResponse(); + response.setDate(key); + response.setList(value); + responseList.add(response); + }); + + PageInfo pageInfo = CommonPage.copyPageInfo(billPageInfo, responseList); + return CommonPage.restPage(pageInfo); + } } diff --git a/crmeb/src/main/java/com/zbkj/crmeb/log/service/impl/StoreProductLogServiceImpl.java b/crmeb/src/main/java/com/zbkj/crmeb/log/service/impl/StoreProductLogServiceImpl.java index 3cc8e16d..754010c6 100644 --- a/crmeb/src/main/java/com/zbkj/crmeb/log/service/impl/StoreProductLogServiceImpl.java +++ b/crmeb/src/main/java/com/zbkj/crmeb/log/service/impl/StoreProductLogServiceImpl.java @@ -54,7 +54,9 @@ public class StoreProductLogServiceImpl extends ServiceImpl { * @return */ List getByIds(List ids); + + /** + * 扣减数量 + * @param id 优惠券id + * @param num 数量 + * @param isLimited 是否限量 + */ + Boolean deduction(Integer id, Integer num, Boolean isLimited); + + /** + * 获取用户注册赠送新人券 + * @return + */ + List findRegisterList(); } diff --git a/crmeb/src/main/java/com/zbkj/crmeb/marketing/service/StoreCouponUserService.java b/crmeb/src/main/java/com/zbkj/crmeb/marketing/service/StoreCouponUserService.java index 708513e4..f9e224d8 100644 --- a/crmeb/src/main/java/com/zbkj/crmeb/marketing/service/StoreCouponUserService.java +++ b/crmeb/src/main/java/com/zbkj/crmeb/marketing/service/StoreCouponUserService.java @@ -1,6 +1,7 @@ package com.zbkj.crmeb.marketing.service; import com.baomidou.mybatisplus.extension.service.IService; +import com.common.MyRecord; import com.common.PageParamRequest; import com.github.pagehelper.PageInfo; import com.zbkj.crmeb.front.request.UserCouponReceiveRequest; @@ -70,4 +71,17 @@ public interface StoreCouponUserService extends IService { * 优惠券过期定时任务 */ void overdueTask(); + + /** + * 用户领取优惠券 + */ + Boolean receiveCoupon(UserCouponReceiveRequest request); + + /** + * 支付成功赠送处理 + * @param couponId 优惠券编号 + * @param uid 用户uid + * @return + */ + MyRecord paySuccessGiveAway(Integer couponId, Integer uid); } diff --git a/crmeb/src/main/java/com/zbkj/crmeb/marketing/service/impl/StoreCouponServiceImpl.java b/crmeb/src/main/java/com/zbkj/crmeb/marketing/service/impl/StoreCouponServiceImpl.java index 7ae89e59..1a1d038a 100644 --- a/crmeb/src/main/java/com/zbkj/crmeb/marketing/service/impl/StoreCouponServiceImpl.java +++ b/crmeb/src/main/java/com/zbkj/crmeb/marketing/service/impl/StoreCouponServiceImpl.java @@ -1,6 +1,10 @@ package com.zbkj.crmeb.marketing.service.impl; +import cn.hutool.core.collection.CollUtil; +import cn.hutool.core.util.ObjectUtil; +import cn.hutool.core.util.StrUtil; import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; +import com.baomidou.mybatisplus.core.conditions.update.UpdateWrapper; import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; import com.common.PageParamRequest; import com.constants.Constants; @@ -32,6 +36,7 @@ import java.util.ArrayList; import java.util.Date; import java.util.HashMap; import java.util.List; +import java.util.stream.Collectors; /** * StoreCouponServiceImpl 接口实现 @@ -320,6 +325,59 @@ public class StoreCouponServiceImpl extends ServiceImpl updateWrapper = new UpdateWrapper<>(); + if (isLimited) { + updateWrapper.setSql(StrUtil.format("last_total = last_total - {}", num)); + updateWrapper.last(StrUtil.format(" and (last_total - {} >= 0)", num)); + } else { + updateWrapper.setSql(StrUtil.format("last_total = last_total + {}", num)); + } + updateWrapper.eq("id", id); + return update(updateWrapper); + } + + /** + * 获取用户注册赠送新人券 + * @return + */ + @Override + public List findRegisterList() { + String dateStr = DateUtil.nowDate(Constants.DATE_FORMAT); + LambdaQueryWrapper lqw = new LambdaQueryWrapper<>(); +// lqw.gt(StoreCoupon::getLastTotal, 0); + lqw.eq(StoreCoupon::getType, 2); + lqw.eq(StoreCoupon::getStatus, true); + lqw.eq(StoreCoupon::getIsDel, false); + lqw.le(StoreCoupon::getReceiveStartTime, dateStr); + List list = dao.selectList(lqw); + if (CollUtil.isEmpty(list)) { + return CollUtil.newArrayList(); + } + List couponList = list.stream().filter(coupon -> { + // 是否限量 + if (coupon.getIsLimited() && coupon.getLastTotal() <= 0) { + return false; + } + // 是否有领取结束时间 + if (ObjectUtil.isNotNull(coupon.getReceiveEndTime())) { + int compareDate = DateUtil.compareDate(dateStr, DateUtil.dateToStr(coupon.getReceiveEndTime(), Constants.DATE_FORMAT), Constants.DATE_FORMAT); + if (compareDate > 0) { + return false; + } + } + return true; + }).collect(Collectors.toList()); + return couponList; + } + /** * 用户可领取的优惠券 * @author Mr.Zhang diff --git a/crmeb/src/main/java/com/zbkj/crmeb/marketing/service/impl/StoreCouponUserServiceImpl.java b/crmeb/src/main/java/com/zbkj/crmeb/marketing/service/impl/StoreCouponUserServiceImpl.java index c22c6e94..092130a1 100644 --- a/crmeb/src/main/java/com/zbkj/crmeb/marketing/service/impl/StoreCouponUserServiceImpl.java +++ b/crmeb/src/main/java/com/zbkj/crmeb/marketing/service/impl/StoreCouponUserServiceImpl.java @@ -1,11 +1,13 @@ package com.zbkj.crmeb.marketing.service.impl; import cn.hutool.core.collection.CollUtil; +import cn.hutool.core.util.ObjectUtil; import cn.hutool.core.util.StrUtil; import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; import com.baomidou.mybatisplus.core.conditions.update.LambdaUpdateWrapper; import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; import com.common.CommonPage; +import com.common.MyRecord; import com.common.PageParamRequest; import com.constants.Constants; import com.exception.CrmebException; @@ -30,7 +32,6 @@ import com.zbkj.crmeb.store.service.StoreCartService; import com.zbkj.crmeb.store.service.StoreProductService; import com.zbkj.crmeb.user.model.User; import com.zbkj.crmeb.user.service.UserService; -import com.zbkj.crmeb.wechat.vo.WechatSendMessageForOrderCancel; import org.apache.commons.lang3.StringUtils; import org.springframework.beans.BeanUtils; import org.springframework.beans.factory.annotation.Autowired; @@ -365,12 +366,20 @@ public class StoreCouponUserServiceImpl extends ServiceImpl primaryKeyIdList = CrmebUtil.stringToArray(storeCouponUser.getPrimaryKey()); //取两个集合的交集,如果是false则证明没有相同的值 - if(storeCouponUser.getUseType() == 2 && !primaryKeyIdList.retainAll(productIdList)){ - throw new CrmebException("此优惠券为商品券,请购买相关商品之后再使用!"); + //oldList.retainAll(newList)返回值代表oldList是否保持原样,如果old和new完全相同,那old保持原样并返回false。 + //交集:listA.retainAll(listB) ——listA内容变为listA和listB都存在的对象;listB不变 + if(storeCouponUser.getUseType() == 2){ + primaryKeyIdList.retainAll(productIdList); + if (CollUtil.isEmpty(primaryKeyIdList)) { + throw new CrmebException("此优惠券为商品券,请购买相关商品之后再使用!"); + } } - if(storeCouponUser.getUseType() == 3 && !primaryKeyIdList.retainAll(categoryIdList)){ - throw new CrmebException("此优惠券为分类券,请购买相关分类下的商品之后再使用!"); + if(storeCouponUser.getUseType() == 3){ + primaryKeyIdList.retainAll(categoryIdList); + if (CollUtil.isEmpty(primaryKeyIdList)) { + throw new CrmebException("此优惠券为分类券,请购买相关分类下的商品之后再使用!"); + } } } return true; @@ -580,10 +589,12 @@ public class StoreCouponUserServiceImpl extends ServiceImpl updateList = CollUtil.newArrayList(); String nowDateStr = DateUtil.nowDate(Constants.DATE_FORMAT); couponList.forEach(coupon -> { - String endDateStr = DateUtil.dateToStr(coupon.getEndTime(), Constants.DATE_FORMAT); - if (DateUtil.compareDate(nowDateStr, endDateStr, Constants.DATE_FORMAT) >= 0) { - coupon.setStatus(2); - updateList.add(coupon); + if (ObjectUtil.isNotNull(coupon.getEndTime())) { + String endDateStr = DateUtil.dateToStr(coupon.getEndTime(), Constants.DATE_FORMAT); + if (DateUtil.compareDate(nowDateStr, endDateStr, Constants.DATE_FORMAT) >= 0) { + coupon.setStatus(2); + updateList.add(coupon); + } } }); @@ -594,6 +605,134 @@ public class StoreCouponUserServiceImpl extends ServiceImpl uidList = CollUtil.newArrayList(); + uidList.add(userId); + filterReceiveUserInUid(storeCoupon.getId(), uidList); + if(uidList.size() < 1){ + //都已经领取过了 + throw new CrmebException("当前用户已经领取过此优惠券了!"); + + } + + //是否有固定的使用时间 + if(!storeCoupon.getIsFixedTime()){ + String endTime = DateUtil.addDay(DateUtil.nowDate(Constants.DATE_FORMAT), storeCoupon.getDay(), Constants.DATE_FORMAT); + storeCoupon.setUseEndTime(DateUtil.strToDate(endTime, Constants.DATE_FORMAT)); + storeCoupon.setUseStartTime(DateUtil.nowDateTimeReturnDate(Constants.DATE_FORMAT)); + } + + + StoreCouponUser storeCouponUser = new StoreCouponUser(); + storeCouponUser.setCouponId(storeCoupon.getId()); + storeCouponUser.setUid(userId); + storeCouponUser.setName(storeCoupon.getName()); + storeCouponUser.setMoney(storeCoupon.getMoney()); + storeCouponUser.setMinPrice(storeCoupon.getMinPrice()); + storeCouponUser.setStartTime(storeCoupon.getUseStartTime()); + storeCouponUser.setEndTime(storeCoupon.getUseEndTime()); + storeCouponUser.setUseType(storeCoupon.getUseType()); + storeCouponUser.setType("receive"); + if (storeCoupon.getUseType() > 1) { + storeCouponUser.setPrimaryKey(storeCoupon.getPrimaryKey()); + } + + Boolean execute = transactionTemplate.execute(e -> { + save(storeCouponUser); + storeCouponService.deduction(storeCoupon.getId(), 1, storeCoupon.getIsLimited()); + return Boolean.TRUE; + }); + + return execute; + } + + /** + * 支付成功赠送处理 + * @param couponId 优惠券编号 + * @param uid 用户uid + * @return MyRecord + */ + @Override + public MyRecord paySuccessGiveAway(Integer couponId, Integer uid) { + MyRecord record = new MyRecord(); + record.set("status", "fail"); + // 获取优惠券信息 + StoreCoupon storeCoupon = storeCouponService.getById(couponId); + if(ObjectUtil.isNull(storeCoupon) || storeCoupon.getIsDel() || !storeCoupon.getStatus()){ + record.set("errMsg", "优惠券信息不存在或者已失效!"); + return record; + } + + //看是否过期 + if(!(storeCoupon.getReceiveEndTime() == null || storeCoupon.getReceiveEndTime().equals(""))){ + //非永久可领取 + String date = DateUtil.nowDateTimeStr(); + int result = DateUtil.compareDate(date, DateUtil.dateToStr(storeCoupon.getReceiveEndTime(), Constants.DATE_FORMAT), Constants.DATE_FORMAT); + if(result == 1){ + //过期了 + record.set("errMsg", "已超过优惠券领取最后期限!"); + return record; + } + } + + //看是否有剩余数量 + if(storeCoupon.getIsLimited() && storeCoupon.getLastTotal() < 1){ + record.set("errMsg", "此优惠券已经被领完了!"); + return record; + } + + //过滤掉已经领取过的用户 + List uidList = CollUtil.newArrayList(); + uidList.add(uid); + filterReceiveUserInUid(storeCoupon.getId(), uidList); + if(uidList.size() < 1){ + //都已经领取过了 + record.set("errMsg", "当前用户已经领取过此优惠券了!"); + return record; + } + + //是否有固定的使用时间 + if(!storeCoupon.getIsFixedTime()){ + String endTime = DateUtil.addDay(DateUtil.nowDate(Constants.DATE_FORMAT), storeCoupon.getDay(), Constants.DATE_FORMAT); + storeCoupon.setUseEndTime(DateUtil.strToDate(endTime, Constants.DATE_FORMAT)); + storeCoupon.setUseStartTime(DateUtil.nowDateTimeReturnDate(Constants.DATE_FORMAT)); + } + + + StoreCouponUser storeCouponUser = new StoreCouponUser(); + storeCouponUser.setCouponId(storeCoupon.getId()); + storeCouponUser.setUid(uid); + storeCouponUser.setName(storeCoupon.getName()); + storeCouponUser.setMoney(storeCoupon.getMoney()); + storeCouponUser.setMinPrice(storeCoupon.getMinPrice()); + storeCouponUser.setStartTime(storeCoupon.getUseStartTime()); + storeCouponUser.setEndTime(storeCoupon.getUseEndTime()); + storeCouponUser.setUseType(storeCoupon.getUseType()); + storeCouponUser.setType("receive"); + if (storeCoupon.getUseType() > 1) { + storeCouponUser.setPrimaryKey(storeCoupon.getPrimaryKey()); + } + record.set("status", "ok"); + record.set("storeCouponUser", storeCouponUser); + record.set("isLimited", storeCoupon.getIsLimited()); + return record; + } + private void getPrimaryKeySql(LambdaQueryWrapper lambdaQueryWrapper, String productIdStr){ if(StringUtils.isBlank(productIdStr)){ return; diff --git a/crmeb/src/main/java/com/zbkj/crmeb/pass/controller/OnePassController.java b/crmeb/src/main/java/com/zbkj/crmeb/pass/controller/OnePassController.java index 28c90d23..8a602bc0 100644 --- a/crmeb/src/main/java/com/zbkj/crmeb/pass/controller/OnePassController.java +++ b/crmeb/src/main/java/com/zbkj/crmeb/pass/controller/OnePassController.java @@ -115,6 +115,17 @@ public class OnePassController { return CommonResult.failed(); } + /** + * 修改手机号——验证账号密码 + */ + @ApiOperation(value = "修改手机号——验证账号密码") + @RequestMapping(value = "/update/phone/validator", method = RequestMethod.POST) + public CommonResult updatePhone(@Validated @RequestBody OnePassLoginRequest request){ + if (onePassService.beforeUpdatePhoneValidator(request)) { + return CommonResult.success(); + } + return CommonResult.failed(); + } /** * 修改手机号 diff --git a/crmeb/src/main/java/com/zbkj/crmeb/pass/service/OnePassService.java b/crmeb/src/main/java/com/zbkj/crmeb/pass/service/OnePassService.java index ed93ae68..88b7d29b 100644 --- a/crmeb/src/main/java/com/zbkj/crmeb/pass/service/OnePassService.java +++ b/crmeb/src/main/java/com/zbkj/crmeb/pass/service/OnePassService.java @@ -106,4 +106,10 @@ public interface OnePassService { * @return OnePassLogisticsQueryVo */ OnePassLogisticsQueryVo exprQuery(String expressNo, String com); + + /** + * 修改手机号——验证账号密码 + * @return Boolean + */ + Boolean beforeUpdatePhoneValidator(OnePassLoginRequest request); } diff --git a/crmeb/src/main/java/com/zbkj/crmeb/pass/service/impl/OnePassServiceImpl.java b/crmeb/src/main/java/com/zbkj/crmeb/pass/service/impl/OnePassServiceImpl.java index f43b34c7..9a527da0 100644 --- a/crmeb/src/main/java/com/zbkj/crmeb/pass/service/impl/OnePassServiceImpl.java +++ b/crmeb/src/main/java/com/zbkj/crmeb/pass/service/impl/OnePassServiceImpl.java @@ -399,6 +399,23 @@ public class OnePassServiceImpl implements OnePassService { return JSONObject.toJavaObject(jsonObject, OnePassLogisticsQueryVo.class); } + /** + * 修改手机号——验证账号密码 + * @return Boolean + */ + @Override + public Boolean beforeUpdatePhoneValidator(OnePassLoginRequest request) { + OnePassLoginVo loginVo = onePassUtil.getLoginVo(); + if (!loginVo.getAccount().equals(request.getAccount())) { + throw new CrmebException("账号不匹配"); + } + String secret = SecureUtil.md5(request.getAccount() + SecureUtil.md5(request.getPassword())); + if (!loginVo.getSecret().equals(secret)) { + throw new CrmebException("密码不匹配"); + } + return Boolean.TRUE; + } + /** * 物流、电子面单开通参数校验 */ diff --git a/crmeb/src/main/java/com/zbkj/crmeb/payment/service/RechargePayService.java b/crmeb/src/main/java/com/zbkj/crmeb/payment/service/RechargePayService.java index f4d90c4a..7c5566ac 100644 --- a/crmeb/src/main/java/com/zbkj/crmeb/payment/service/RechargePayService.java +++ b/crmeb/src/main/java/com/zbkj/crmeb/payment/service/RechargePayService.java @@ -24,7 +24,6 @@ public interface RechargePayService { /** * 支付成功处理 * @param userRecharge 充值订单 - * @param userToken 用户Token */ - Boolean paySuccess(UserRecharge userRecharge, UserToken userToken); + Boolean paySuccess(UserRecharge userRecharge); } diff --git a/crmeb/src/main/java/com/zbkj/crmeb/payment/service/impl/CallbackServiceImpl.java b/crmeb/src/main/java/com/zbkj/crmeb/payment/service/impl/CallbackServiceImpl.java index b6276245..2b8e64f2 100644 --- a/crmeb/src/main/java/com/zbkj/crmeb/payment/service/impl/CallbackServiceImpl.java +++ b/crmeb/src/main/java/com/zbkj/crmeb/payment/service/impl/CallbackServiceImpl.java @@ -1,6 +1,7 @@ package com.zbkj.crmeb.payment.service.impl; import cn.hutool.core.codec.Base64; +import cn.hutool.core.date.DateTime; import cn.hutool.core.util.ObjectUtil; import cn.hutool.core.util.StrUtil; import cn.hutool.crypto.SecureUtil; @@ -9,6 +10,10 @@ import com.common.MyRecord; import com.constants.Constants; import com.exception.CrmebException; import com.utils.*; +import com.zbkj.crmeb.combination.model.StoreCombination; +import com.zbkj.crmeb.combination.model.StorePink; +import com.zbkj.crmeb.combination.service.StoreCombinationService; +import com.zbkj.crmeb.combination.service.StorePinkService; import com.zbkj.crmeb.finance.model.UserRecharge; import com.zbkj.crmeb.finance.service.UserRechargeService; import com.zbkj.crmeb.payment.service.CallbackService; @@ -23,6 +28,7 @@ import com.zbkj.crmeb.user.model.User; import com.zbkj.crmeb.user.model.UserToken; import com.zbkj.crmeb.user.service.UserService; import com.zbkj.crmeb.user.service.UserTokenService; +import org.bouncycastle.jce.provider.BouncyCastleProvider; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.beans.factory.annotation.Autowired; @@ -33,6 +39,7 @@ import org.springframework.transaction.support.TransactionTemplate; import javax.crypto.Cipher; import javax.crypto.spec.SecretKeySpec; import java.nio.charset.StandardCharsets; +import java.security.Security; import java.util.ArrayList; import java.util.HashMap; import java.util.List; @@ -84,6 +91,12 @@ public class CallbackServiceImpl implements CallbackService { @Autowired private TransactionTemplate transactionTemplate; + @Autowired + private StoreCombinationService storeCombinationService; + + @Autowired + private StorePinkService storePinkService; + /** * 微信支付回调 * @author Mr.Zhang @@ -128,11 +141,11 @@ public class CallbackServiceImpl implements CallbackService { AttachVo attachVo = JSONObject.toJavaObject(JSONObject.parseObject(callbackVo.getAttach()), AttachVo.class); //判断openid - UserToken userToken = userTokenService.getByOpenid(callbackVo.getOpenid()); - if(null == userToken || !userToken.getUid().equals(attachVo.getUserId())){ - //用户信息错误 - throw new CrmebException("用户信息错误!"); - } +// UserToken userToken = userTokenService.getByOpenid(callbackVo.getOpenid()); +// if(null == userToken || !userToken.getUid().equals(attachVo.getUserId())){ +// //用户信息错误 +// throw new CrmebException("用户信息错误!"); +// } User user = userService.getById(attachVo.getUserId()); if (ObjectUtil.isNull(user)) { //用户信息错误 @@ -168,6 +181,57 @@ public class CallbackServiceImpl implements CallbackService { if (storeOrder.getUseIntegral() > 0) { userService.updateIntegral(user, storeOrder.getUseIntegral(), "sub"); } + + // 处理拼团 + if (storeOrder.getCombinationId() > 0) { + // 判断拼团团长是否存在 + StorePink headPink = new StorePink(); + Integer pinkId = storeOrder.getPinkId(); + if (pinkId > 0) { + headPink = storePinkService.getById(pinkId); + if (ObjectUtil.isNull(headPink) || headPink.getIsRefund().equals(true) || headPink.getStatus() == 3) { + pinkId = 0; + } + } + StoreCombination storeCombination = storeCombinationService.getById(storeOrder.getCombinationId()); + // 生成拼团表数据 + StorePink storePink = new StorePink(); + storePink.setUid(user.getUid()); + storePink.setAvatar(user.getAvatar()); + storePink.setNickname(user.getNickname()); + storePink.setOrderId(storeOrder.getOrderId()); + storePink.setOrderIdKey(storeOrder.getId()); + storePink.setTotalNum(storeOrder.getTotalNum()); + storePink.setTotalPrice(storeOrder.getTotalPrice()); + storePink.setCid(storeCombination.getId()); + storePink.setPid(storeCombination.getProductId()); + storePink.setPeople(storeCombination.getPeople()); + storePink.setPrice(storeCombination.getPrice()); + Integer effectiveTime = storeCombination.getEffectiveTime();// 有效小时数 + DateTime dateTime = cn.hutool.core.date.DateUtil.date(); + storePink.setAddTime(dateTime.getTime()); + if (pinkId > 0) { + storePink.setStopTime(headPink.getStopTime()); + } else { + DateTime hourTime = cn.hutool.core.date.DateUtil.offsetHour(dateTime, effectiveTime); + long stopTime = hourTime.getTime(); + if (stopTime > storeCombination.getStopTime()) { + stopTime = storeCombination.getStopTime(); + } + storePink.setStopTime(stopTime); + } + storePink.setKId(pinkId); + storePink.setIsTpl(false); + storePink.setIsRefund(false); + storePink.setStatus(1); + storePinkService.save(storePink); + // 如果是开团,需要更新订单数据 + if (storePink.getKId() == 0) { + storeOrder.setPinkId(storePink.getId()); + storeOrderService.updateById(storeOrder); + } + } + return Boolean.TRUE; }); if (!execute) { @@ -195,7 +259,7 @@ public class CallbackServiceImpl implements CallbackService { return sb.toString(); } // 支付成功处理 - Boolean rechargePayAfter = rechargePayService.paySuccess(userRecharge, userToken); + Boolean rechargePayAfter = rechargePayService.paySuccess(userRecharge); if (!rechargePayAfter) { logger.error("wechat pay error : 数据保存失败==》" + callbackVo.getOutTradeNo()); throw new CrmebException("wechat pay error : 数据保存失败==》" + callbackVo.getOutTradeNo()); @@ -334,7 +398,14 @@ public class CallbackServiceImpl implements CallbackService { return signKey; } - public String decryptToStr(String reqInfo, String signKey) throws Exception { + /** + * java自带的是PKCS5Padding填充,不支持PKCS7Padding填充。 + * 通过BouncyCastle组件来让java里面支持PKCS7Padding填充 + * 在加解密之前加上:Security.addProvider(new BouncyCastleProvider()), + * 并给Cipher.getInstance方法传入参数来指定Java使用这个库里的加/解密算法。 + */ + public static String decryptToStr(String reqInfo, String signKey) throws Exception { + Security.addProvider(new BouncyCastleProvider()); byte[] decodeReqInfo = Base64.decode(reqInfo); SecretKeySpec key = new SecretKeySpec(SecureUtil.md5(signKey).toLowerCase().getBytes(), "AES"); Cipher cipher; diff --git a/crmeb/src/main/java/com/zbkj/crmeb/payment/service/impl/OrderPayServiceImpl.java b/crmeb/src/main/java/com/zbkj/crmeb/payment/service/impl/OrderPayServiceImpl.java index 9f2554a4..f431c334 100644 --- a/crmeb/src/main/java/com/zbkj/crmeb/payment/service/impl/OrderPayServiceImpl.java +++ b/crmeb/src/main/java/com/zbkj/crmeb/payment/service/impl/OrderPayServiceImpl.java @@ -5,8 +5,7 @@ import cn.hutool.core.date.DateTime; import cn.hutool.core.util.ObjectUtil; import cn.hutool.core.util.StrUtil; import com.common.MyRecord; -import com.constants.Constants; -import com.constants.PayConstants; +import com.constants.*; import com.exception.CrmebException; import com.utils.DateUtil; import com.utils.RedisUtil; @@ -21,7 +20,8 @@ import com.zbkj.crmeb.front.request.OrderPayRequest; import com.zbkj.crmeb.front.response.OrderPayResultResponse; import com.zbkj.crmeb.front.response.UserRechargePaymentResponse; import com.zbkj.crmeb.front.vo.WxPayJsResultVo; -import com.zbkj.crmeb.marketing.request.StoreCouponUserRequest; +import com.zbkj.crmeb.marketing.model.StoreCouponUser; +import com.zbkj.crmeb.marketing.service.StoreCouponService; import com.zbkj.crmeb.marketing.service.StoreCouponUserService; import com.zbkj.crmeb.payment.service.OrderPayService; import com.zbkj.crmeb.payment.service.PayService; @@ -36,12 +36,14 @@ import com.zbkj.crmeb.store.model.StoreProductCoupon; import com.zbkj.crmeb.store.service.*; import com.zbkj.crmeb.store.utilService.OrderUtils; import com.zbkj.crmeb.store.vo.StoreOrderInfoVo; +import com.zbkj.crmeb.system.model.SystemAdmin; +import com.zbkj.crmeb.system.service.SystemAdminService; import com.zbkj.crmeb.system.service.SystemConfigService; import com.zbkj.crmeb.user.model.User; import com.zbkj.crmeb.user.model.UserBill; -import com.zbkj.crmeb.user.service.UserBillService; -import com.zbkj.crmeb.user.service.UserLevelService; -import com.zbkj.crmeb.user.service.UserService; +import com.zbkj.crmeb.user.model.UserBrokerageRecord; +import com.zbkj.crmeb.user.model.UserToken; +import com.zbkj.crmeb.user.service.*; import com.zbkj.crmeb.wechat.service.TemplateMessageService; import com.zbkj.crmeb.wechat.service.WeChatService; import com.zbkj.crmeb.wechat.vo.WechatSendMessageForPaySuccess; @@ -57,6 +59,7 @@ import org.springframework.transaction.annotation.Transactional; import org.springframework.transaction.support.TransactionTemplate; import java.math.BigDecimal; +import java.util.HashMap; import java.util.List; import java.util.Map; import java.util.Optional; @@ -152,6 +155,18 @@ public class OrderPayServiceImpl extends PayService implements OrderPayService { @Autowired private StorePinkService storePinkService; + @Autowired + private UserBrokerageRecordService userBrokerageRecordService; + + @Autowired + private StoreCouponService storeCouponService; + + @Autowired + private SystemAdminService systemAdminService; + + @Autowired + private UserTokenService userTokenService; + /** * 订单支付 * @param orderId Integer 订单号 @@ -315,7 +330,7 @@ public class OrderPayServiceImpl extends PayService implements OrderPayService { Integer integral = 0; // 下单赠送积分 //赠送积分比例 - String integralStr = systemConfigService.getValueByKey(Constants.CONFIG_KEY_INTEGRAL_RATE); + String integralStr = systemConfigService.getValueByKey(Constants.CONFIG_KEY_INTEGRAL_RATE_ORDER_GIVE); if (StrUtil.isNotBlank(integralStr)) { BigDecimal integralBig = new BigDecimal(integralStr); integral = integralBig.multiply(storeOrder.getPayPrice()).setScale(0, BigDecimal.ROUND_DOWN).intValue(); @@ -348,6 +363,11 @@ public class OrderPayServiceImpl extends PayService implements OrderPayService { // 更新用户下单数量 user.setPayCount(user.getPayCount() + 1); + /** + * 计算佣金,生成佣金记录 + */ + List recordList = assignCommission(storeOrder); + Boolean execute = transactionTemplate.execute(e -> { //订单日志 storeOrderStatusService.addLog(storeOrder.getId(), Constants.ORDER_LOG_PAY_SUCCESS, Constants.ORDER_LOG_MESSAGE_PAY_SUCCESS); @@ -361,6 +381,14 @@ public class OrderPayServiceImpl extends PayService implements OrderPayService { //经验升级 userLevelService.upLevel(user); + // 佣金记录 + if (CollUtil.isNotEmpty(recordList)) { + recordList.forEach(temp -> { + temp.setLinkId(storeOrder.getOrderId()); + }); + userBrokerageRecordService.saveBatch(recordList); + } + // 如果是砍价商品,修改砍价状态 if (storeOrder.getBargainId() > 0) { StoreBargainUser storeBargainUser = storeBargainUserService.getByBargainIdAndUid(storeOrder.getBargainId(), user.getUid()); @@ -371,72 +399,235 @@ public class OrderPayServiceImpl extends PayService implements OrderPayService { // TODO 拼团整体逻辑需调整 // TODO 将拼团生成放到订单生成,如果取消订单,则删除生成的拼团的数据 // TODO 在这里,只负责将拼团状态改为已完成(用消息列队发送拼团task形式处理) - if (storeOrder.getCombinationId() > 0) { - // 判断拼团团长是否存在 - StorePink headPink = new StorePink(); - Integer pinkId = storeOrder.getPinkId(); - if (pinkId > 0) { - headPink = storePinkService.getById(pinkId); - if (ObjectUtil.isNull(headPink) || headPink.getIsRefund().equals(true) || headPink.getStatus() == 3) { - pinkId = 0; - } - } - StoreCombination storeCombination = storeCombinationService.getById(storeOrder.getCombinationId()); - // 生成拼团表数据 - StorePink storePink = new StorePink(); - storePink.setUid(user.getUid()); - storePink.setAvatar(user.getAvatar()); - storePink.setNickname(user.getNickname()); - storePink.setOrderId(storeOrder.getOrderId()); - storePink.setOrderIdKey(storeOrder.getId()); - storePink.setTotalNum(storeOrder.getTotalNum()); - storePink.setTotalPrice(storeOrder.getTotalPrice()); - storePink.setCid(storeCombination.getId()); - storePink.setPid(storeCombination.getProductId()); - storePink.setPeople(storeCombination.getPeople()); - storePink.setPrice(storeCombination.getPrice()); - Integer effectiveTime = storeCombination.getEffectiveTime();// 有效小时数 - DateTime dateTime = cn.hutool.core.date.DateUtil.date(); - storePink.setAddTime(dateTime.getTime()); - if (pinkId > 0) { - storePink.setStopTime(headPink.getStopTime()); - } else { - DateTime hourTime = cn.hutool.core.date.DateUtil.offsetHour(dateTime, effectiveTime); - long stopTime = hourTime.getTime(); - if (stopTime > storeCombination.getStopTime()) { - stopTime = storeCombination.getStopTime(); - } - storePink.setStopTime(stopTime); - } - storePink.setKId(pinkId); - storePink.setIsTpl(false); - storePink.setIsRefund(false); - storePink.setStatus(1); - storePinkService.save(storePink); - // 如果是开团,需要更新订单数据 - if (storePink.getKId() == 0) { - storeOrder.setPinkId(storePink.getId()); - storeOrderService.updateById(storeOrder); - } - } +// if (storeOrder.getCombinationId() > 0) { +// // 判断拼团团长是否存在 +// StorePink headPink = new StorePink(); +// Integer pinkId = storeOrder.getPinkId(); +// if (pinkId > 0) { +// headPink = storePinkService.getById(pinkId); +// if (ObjectUtil.isNull(headPink) || headPink.getIsRefund().equals(true) || headPink.getStatus() == 3) { +// pinkId = 0; +// } +// } +// StoreCombination storeCombination = storeCombinationService.getById(storeOrder.getCombinationId()); +// // 生成拼团表数据 +// StorePink storePink = new StorePink(); +// storePink.setUid(user.getUid()); +// storePink.setAvatar(user.getAvatar()); +// storePink.setNickname(user.getNickname()); +// storePink.setOrderId(storeOrder.getOrderId()); +// storePink.setOrderIdKey(storeOrder.getId()); +// storePink.setTotalNum(storeOrder.getTotalNum()); +// storePink.setTotalPrice(storeOrder.getTotalPrice()); +// storePink.setCid(storeCombination.getId()); +// storePink.setPid(storeCombination.getProductId()); +// storePink.setPeople(storeCombination.getPeople()); +// storePink.setPrice(storeCombination.getPrice()); +// Integer effectiveTime = storeCombination.getEffectiveTime();// 有效小时数 +// DateTime dateTime = cn.hutool.core.date.DateUtil.date(); +// storePink.setAddTime(dateTime.getTime()); +// if (pinkId > 0) { +// storePink.setStopTime(headPink.getStopTime()); +// } else { +// DateTime hourTime = cn.hutool.core.date.DateUtil.offsetHour(dateTime, effectiveTime); +// long stopTime = hourTime.getTime(); +// if (stopTime > storeCombination.getStopTime()) { +// stopTime = storeCombination.getStopTime(); +// } +// storePink.setStopTime(stopTime); +// } +// storePink.setKId(pinkId); +// storePink.setIsTpl(false); +// storePink.setIsRefund(false); +// storePink.setStatus(1); +// storePinkService.save(storePink); +// // 如果是开团,需要更新订单数据 +// if (storePink.getKId() == 0) { +// storeOrder.setPinkId(storePink.getId()); +// storeOrderService.updateById(storeOrder); +// } +// } return Boolean.TRUE; }); if (execute) { try { + // 发送短信 + if (StrUtil.isNotBlank(user.getPhone())) { + // 支付成功提醒开关 + String lowerOrderSwitch = systemConfigService.getValueByKey(SmsConstants.SMS_CONFIG_LOWER_ORDER_SWITCH); + if (StrUtil.isNotBlank(lowerOrderSwitch) && lowerOrderSwitch.equals("1")) { + smsService.sendPaySuccess(user.getPhone(), storeOrder.getOrderId(), storeOrder.getPayPrice()); + } + } + + // 发送用户支付成功管理员提醒短信 + String smsSwitch = systemConfigService.getValueByKey(SmsConstants.SMS_CONFIG_ADMIN_PAY_SUCCESS_SWITCH); + if (StrUtil.isNotBlank(smsSwitch) || smsSwitch.equals("1")) { + // 查询可已发送短信的管理员 + List systemAdminList = systemAdminService.findIsSmsList(); + if (CollUtil.isNotEmpty(systemAdminList)) { + // 发送短信 + systemAdminList.forEach(admin -> { + smsService.sendOrderPaySuccessNotice(admin.getPhone(), storeOrder.getOrderId(), admin.getRealName()); + }); + } + } + //下发模板通知 - pushTempMessageOrder(storeOrder); + pushMessageOrder(storeOrder, user); // 购买成功后根据配置送优惠券 autoSendCoupons(storeOrder); } catch (Exception e) { e.printStackTrace(); - logger.error("模板通知或优惠券异常"); + logger.error("短信、模板通知或优惠券异常"); } } return execute; } + /** + * 分配佣金 + * @param storeOrder + * @return + */ + private List assignCommission(StoreOrder storeOrder) { + // 检测商城是否开启分销功能 + String isOpen = systemConfigService.getValueByKey(Constants.CONFIG_KEY_STORE_BROKERAGE_IS_OPEN); + if(StrUtil.isBlank(isOpen) || isOpen.equals("0")){ + return CollUtil.newArrayList(); + } + // 营销产品不参与 + if(storeOrder.getCombinationId() > 0 || storeOrder.getSeckillId() > 0 || storeOrder.getBargainId() > 0){ + return CollUtil.newArrayList(); + } + // 查找订单所属人信息 + User user = userService.getById(storeOrder.getUid()); + // 当前用户不存在 没有上级 或者 当用用户上级时自己 直接返回 + if(null == user.getSpreadUid() || user.getSpreadUid() < 1 || user.getSpreadUid().equals(storeOrder.getUid())){ + return CollUtil.newArrayList(); + } + // 获取参与分佣的人(两级) + List spreadRecordList = getSpreadRecordList(user.getSpreadUid()); + if (CollUtil.isEmpty(spreadRecordList)) { + return CollUtil.newArrayList(); + } + // 获取佣金冻结期 + String fronzenTime = systemConfigService.getValueByKey(Constants.CONFIG_KEY_STORE_BROKERAGE_EXTRACT_TIME); + + // 生成佣金记录 + List brokerageRecordList = spreadRecordList.stream().map(record -> { + BigDecimal brokerage = calculateCommission(record, storeOrder.getId()); + UserBrokerageRecord brokerageRecord = new UserBrokerageRecord(); + brokerageRecord.setUid(record.getInt("spreadUid")); + brokerageRecord.setLinkType(BrokerageRecordConstants.BROKERAGE_RECORD_LINK_TYPE_ORDER); + brokerageRecord.setType(BrokerageRecordConstants.BROKERAGE_RECORD_TYPE_ADD); + brokerageRecord.setTitle(BrokerageRecordConstants.BROKERAGE_RECORD_TITLE_ORDER); + brokerageRecord.setPrice(brokerage); + brokerageRecord.setMark(StrUtil.format("获得推广佣金,分佣{}", brokerage)); + brokerageRecord.setStatus(BrokerageRecordConstants.BROKERAGE_RECORD_STATUS_CREATE); + brokerageRecord.setFrozenTime(Integer.valueOf(Optional.ofNullable(fronzenTime).orElse("0"))); + brokerageRecord.setCreateTime(DateUtil.nowDateTime()); + return brokerageRecord; + }).collect(Collectors.toList()); + + return brokerageRecordList; + } + + /** + * 计算佣金 + * @param record index-分销级数,spreadUid-分销人 + * @param orderId 订单id + * @return + */ + private BigDecimal calculateCommission(MyRecord record, Integer orderId) { + BigDecimal brokeragePrice = BigDecimal.ZERO; + //先看商品是否有固定分佣 + List orderInfoVoList = storeOrderInfoService.getOrderListByOrderId(orderId); + if(null == orderInfoVoList || orderInfoVoList.size() < 1){ + return brokeragePrice; + } + + //查询对应等级的分销比例 + Integer index = record.getInt("index"); + String key = ""; + if (index == 1) { + key = Constants.CONFIG_KEY_STORE_BROKERAGE_RATE_ONE; + } + if (index == 2) { + key = Constants.CONFIG_KEY_STORE_BROKERAGE_RATE_TWO; + } + String rate = systemConfigService.getValueByKey(key); + if(StringUtils.isBlank(rate)){ + rate = "1"; + } + //佣金比例整数存储, 例如80, 所以计算的时候要除以 10*10 + BigDecimal rateBigDecimal = brokeragePrice; + if(StringUtils.isNotBlank(rate)){ + rateBigDecimal = new BigDecimal(rate).divide(BigDecimal.TEN.multiply(BigDecimal.TEN)); + } + + BigDecimal totalBrokerPrice = BigDecimal.ZERO; + for (StoreOrderInfoVo orderInfoVo : orderInfoVoList) { + if(index == 1){ + brokeragePrice = orderInfoVo.getInfo().getProductInfo().getAttrInfo().getBrokerage(); + } + if(index == 2){ + brokeragePrice = orderInfoVo.getInfo().getProductInfo().getAttrInfo().getBrokerageTwo(); + } + + if(brokeragePrice.compareTo(BigDecimal.ZERO) == 0 && !rateBigDecimal.equals(BigDecimal.ZERO)){ + // 商品没有分销金额, 并且有设置对应等级的分佣比例 + // 舍入模式向零舍入。 + brokeragePrice = orderInfoVo.getInfo().getTruePrice().multiply(rateBigDecimal).setScale(2, BigDecimal.ROUND_DOWN); + } + + totalBrokerPrice = totalBrokerPrice.add(brokeragePrice); + } + return totalBrokerPrice; + } + + /** + * 获取参与奋勇人员(两级) + * @param spreadUid 一级奋分佣人Uid + * @return + */ + private List getSpreadRecordList(Integer spreadUid) { + List recordList = CollUtil.newArrayList(); + + // 第一级 + User spreadUser = userService.getById(spreadUid); + if (ObjectUtil.isNull(spreadUser)) { + return recordList; + } + // 判断分销模式 + String model = systemConfigService.getValueByKey(Constants.CONFIG_KEY_STORE_BROKERAGE_MODEL); + if (StrUtil.isNotBlank(model) && model.equals("1") && !spreadUser.getIsPromoter()) { + // 指定分销模式下:不是推广员不参与分销 + return recordList; + } + MyRecord firstRecord = new MyRecord(); + firstRecord.set("index", 1); + firstRecord.set("spreadUid", spreadUid); + recordList.add(firstRecord); + + // 第二级 + User spreadSpreadUser = userService.getById(spreadUser.getSpreadUid()); + if (ObjectUtil.isNull(spreadSpreadUser)) { + return recordList; + } + if (StrUtil.isNotBlank(model) && model.equals("1") && !spreadSpreadUser.getIsPromoter()) { + // 指定分销模式下:不是推广员不参与分销 + return recordList; + } + MyRecord secondRecord = new MyRecord(); + secondRecord.set("index", 2); + secondRecord.set("spreadUid", spreadSpreadUser.getUid()); + recordList.add(secondRecord); + return recordList; + } + /** * 余额支付 * @param storeOrder 订单 @@ -647,17 +838,48 @@ public class OrderPayServiceImpl extends PayService implements OrderPayService { } /** - * 发送模板消息通知 + * 发送消息通知 + * 根据用户类型发送 + * 公众号模板消息 + * 小程序订阅消息 */ - private void pushTempMessageOrder(StoreOrder storeOrder) { - // 小程序发送订阅消息 - String storeNameAndCarNumString = orderUtils.getStoreNameAndCarNumString(storeOrder.getId()); - if(StringUtils.isNotBlank(storeNameAndCarNumString)){ - WechatSendMessageForPaySuccess paySuccess = new WechatSendMessageForPaySuccess( - storeOrder.getId()+"",storeOrder.getPayPrice()+"",storeOrder.getPayTime()+"","暂无", - storeOrder.getTotalPrice()+"",storeNameAndCarNumString); - orderUtils.sendWeiChatMiniMessageForPaySuccess(paySuccess, userService.getById(storeOrder).getUid()); + private void pushMessageOrder(StoreOrder storeOrder, User user) { + if (user.getUserType().equals(UserConstants.USER_TYPE_H5)) { + return; } + UserToken userToken; + HashMap temMap = new HashMap<>(); + // 公众号 + if (user.getUserType().equals(UserConstants.USER_TYPE_WECHAT)) { + userToken = userTokenService.getTokenByUserId(user.getUid(), UserConstants.USER_TOKEN_TYPE_WECHAT); + if (ObjectUtil.isNull(userToken)) { + return ; + } + // 发送微信模板消息 + temMap.put(Constants.WE_CHAT_TEMP_KEY_FIRST, "您的订单已支付成功!"); + temMap.put("keyword1", storeOrder.getOrderId()); + temMap.put("keyword2", storeOrder.getPayPrice().toString()); + temMap.put(Constants.WE_CHAT_TEMP_KEY_END, "欢迎下次再来!"); + templateMessageService.pushTemplateMessage(Constants.WE_CHAT_TEMP_KEY_ORDER_PAY, temMap, userToken.getToken()); + return; + } + // 小程序发送订阅消息 + userToken = userTokenService.getTokenByUserId(user.getUid(), UserConstants.USER_TOKEN_TYPE_ROUTINE); + if (ObjectUtil.isNull(userToken)) { + return ; + } + // 组装数据 + temMap.put("character_string1", storeOrder.getOrderId()); + temMap.put("amount2", storeOrder.getPayPrice().toString() + "元"); + temMap.put("thing7", "您的订单已支付成功"); + templateMessageService.pushMiniTemplateMessage(Constants.WE_CHAT_PROGRAM_TEMP_KEY_ORDER_PAY, temMap, userToken.getToken()); +// String storeNameAndCarNumString = orderUtils.getStoreNameAndCarNumString(storeOrder.getId()); +// if(StringUtils.isNotBlank(storeNameAndCarNumString)){ +// WechatSendMessageForPaySuccess paySuccess = new WechatSendMessageForPaySuccess( +// storeOrder.getId()+"",storeOrder.getPayPrice()+"",storeOrder.getPayTime()+"","暂无", +// storeOrder.getTotalPrice()+"",storeNameAndCarNumString); +// orderUtils.sendWeiChatMiniMessageForPaySuccess(paySuccess, userService.getById(storeOrder).getUid()); +// } } /** @@ -683,16 +905,45 @@ public class OrderPayServiceImpl extends PayService implements OrderPayService { if(null == orders){ return; } + List couponUserList = CollUtil.newArrayList(); + Map couponMap = CollUtil.newHashMap(); for (StoreOrderInfoVo order : orders) { List couponsForGiveUser = storeProductCouponService.getListByProductId(order.getProductId()); - User currentUser = userService.getById(storeOrder.getUid()); - for (StoreProductCoupon storeProductCoupon : couponsForGiveUser) { - StoreCouponUserRequest crp = new StoreCouponUserRequest(); - crp.setUid(currentUser.getUid()+""); - crp.setCouponId(storeProductCoupon.getIssueCouponId()); - storeCouponUserService.receive(crp); +// User currentUser = userService.getById(storeOrder.getUid()); +// for (StoreProductCoupon storeProductCoupon : couponsForGiveUser) { +// StoreCouponUserRequest crp = new StoreCouponUserRequest(); +// crp.setUid(currentUser.getUid()+""); +// crp.setCouponId(storeProductCoupon.getIssueCouponId()); +// storeCouponUserService.receive(crp); +// } + for (int i = 0; i < couponsForGiveUser.size();) { + StoreProductCoupon storeProductCoupon = couponsForGiveUser.get(i); + MyRecord record = storeCouponUserService.paySuccessGiveAway(storeProductCoupon.getIssueCouponId(), storeOrder.getUid()); + if (record.getStr("status").equals("fail")) { + logger.error(StrUtil.format("支付成功领取优惠券失败,失败原因:{}", record.getStr("errMsg"))); + couponsForGiveUser.remove(i); + continue; + } + + StoreCouponUser storeCouponUser = record.get("storeCouponUser"); + couponUserList.add(storeCouponUser); + couponMap.put(storeCouponUser.getCouponId(), record.getBoolean("isLimited")); + i++; } } + + Boolean execute = transactionTemplate.execute(e -> { + if (CollUtil.isNotEmpty(couponUserList)) { + storeCouponUserService.saveBatch(couponUserList); + couponUserList.forEach(i -> { + storeCouponService.deduction(i.getCouponId(), 1, couponMap.get(i.getCouponId())); + }); + } + return Boolean.TRUE; + }); + if (!execute) { + logger.error(StrUtil.format("支付成功领取优惠券,更新数据库失败,订单编号:{}", storeOrder.getOrderId())); + } } private void userBillCreate() { diff --git a/crmeb/src/main/java/com/zbkj/crmeb/payment/service/impl/RechargePayServiceImpl.java b/crmeb/src/main/java/com/zbkj/crmeb/payment/service/impl/RechargePayServiceImpl.java index 63cc214d..3cf4daaa 100644 --- a/crmeb/src/main/java/com/zbkj/crmeb/payment/service/impl/RechargePayServiceImpl.java +++ b/crmeb/src/main/java/com/zbkj/crmeb/payment/service/impl/RechargePayServiceImpl.java @@ -1,5 +1,6 @@ package com.zbkj.crmeb.payment.service.impl; +import cn.hutool.core.util.StrUtil; import com.constants.Constants; import com.exception.CrmebException; import com.utils.DateUtil; @@ -13,8 +14,10 @@ import com.zbkj.crmeb.payment.vo.wechat.PayParamsVo; import com.zbkj.crmeb.payment.wechat.WeChatPayService; import com.zbkj.crmeb.sms.service.SmsService; import com.zbkj.crmeb.user.model.User; +import com.zbkj.crmeb.user.model.UserBill; import com.zbkj.crmeb.user.model.UserToken; import com.zbkj.crmeb.user.request.UserOperateFundsRequest; +import com.zbkj.crmeb.user.service.UserBillService; import com.zbkj.crmeb.user.service.UserService; import com.zbkj.crmeb.wechat.service.TemplateMessageService; import lombok.Data; @@ -27,6 +30,7 @@ import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; import org.springframework.transaction.support.TransactionTemplate; +import java.math.BigDecimal; import java.util.HashMap; @@ -67,6 +71,9 @@ public class RechargePayServiceImpl extends PayService implements RechargePaySer @Autowired private TransactionTemplate transactionTemplate; + @Autowired + private UserBillService userBillService; + //订单类 private UserRecharge userRecharge; @@ -155,14 +162,33 @@ public class RechargePayServiceImpl extends PayService implements RechargePaySer /** * 支付成功处理 + * 增加余额,userBill记录 * @param userRecharge 充值订单 - * @param userToken 用户Token */ @Override - public Boolean paySuccess(UserRecharge userRecharge, UserToken userToken) { + public Boolean paySuccess(UserRecharge userRecharge) { userRecharge.setPaid(true); userRecharge.setPayTime(DateUtil.nowDateTime()); + + User user = userService.getById(userRecharge.getUid()); + + BigDecimal payPrice = userRecharge.getPrice().add(userRecharge.getGivePrice()); + BigDecimal balance = user.getNowMoney().add(payPrice); // 余额变动对象 + UserBill userBill = new UserBill(); + userBill.setUid(userRecharge.getUid()); + userBill.setLinkId(userRecharge.getOrderId()); + userBill.setPm(1); + userBill.setTitle("充值支付"); + userBill.setCategory(Constants.USER_BILL_CATEGORY_MONEY); + userBill.setType(Constants.USER_BILL_TYPE_PAY_RECHARGE); + userBill.setNumber(payPrice); + userBill.setBalance(balance); + userBill.setMark(StrUtil.format("余额增加了{}元", payPrice)); + userBill.setStatus(1); + userBill.setCreateTime(DateUtil.nowDateTime()); + + UserOperateFundsRequest userOperateFundsRequest = new UserOperateFundsRequest(); userOperateFundsRequest.setValue(userRecharge.getPrice().add(userRecharge.getGivePrice())); userOperateFundsRequest.setFoundsType(Constants.USER_BILL_TYPE_PAY_RECHARGE); @@ -174,15 +200,15 @@ public class RechargePayServiceImpl extends PayService implements RechargePaySer Boolean execute = transactionTemplate.execute(e -> { // 订单变动 userRechargeService.updateById(userRecharge); - //余额变动 - userService.updateFounds(userOperateFundsRequest, true); - //增加经验、积分 - userService.consumeAfterUpdateUserFounds(userRecharge.getUid(), userRecharge.getPrice(), Constants.USER_BILL_TYPE_PAY_RECHARGE); + // 余额变动 + userService.operationNowMoney(user.getUid(), payPrice, user.getNowMoney(), "add"); + // 创建记录 + userBillService.save(userBill); return Boolean.TRUE; }); if (execute) { //下发模板通知 - pushTempMessageRecharge(userRecharge); +// pushTempMessageRecharge(userRecharge); } return execute; } diff --git a/crmeb/src/main/java/com/zbkj/crmeb/payment/wechat/WeChatPayService.java b/crmeb/src/main/java/com/zbkj/crmeb/payment/wechat/WeChatPayService.java index 18ba30fd..d378b086 100644 --- a/crmeb/src/main/java/com/zbkj/crmeb/payment/wechat/WeChatPayService.java +++ b/crmeb/src/main/java/com/zbkj/crmeb/payment/wechat/WeChatPayService.java @@ -1,5 +1,6 @@ package com.zbkj.crmeb.payment.wechat; +import com.zbkj.crmeb.finance.model.UserRecharge; import com.zbkj.crmeb.payment.vo.wechat.CreateOrderResponseVo; import com.zbkj.crmeb.payment.vo.wechat.PayParamsVo; import com.zbkj.crmeb.store.model.StoreOrder; @@ -35,4 +36,12 @@ public interface WeChatPayService { * @return */ Boolean queryPayResult(String orderNo); + + /** + * 微信充值预下单接口 + * @param userRecharge 充值订单 + * @param clientIp ip + * @return 获取wechat.requestPayment()参数 + */ + Map unifiedRecharge(UserRecharge userRecharge, String clientIp); } diff --git a/crmeb/src/main/java/com/zbkj/crmeb/payment/wechat/impl/WeChatPayServiceImpl.java b/crmeb/src/main/java/com/zbkj/crmeb/payment/wechat/impl/WeChatPayServiceImpl.java index 2e657ac3..f60eb824 100644 --- a/crmeb/src/main/java/com/zbkj/crmeb/payment/wechat/impl/WeChatPayServiceImpl.java +++ b/crmeb/src/main/java/com/zbkj/crmeb/payment/wechat/impl/WeChatPayServiceImpl.java @@ -1,6 +1,7 @@ package com.zbkj.crmeb.payment.wechat.impl; import cn.hutool.core.collection.CollUtil; +import cn.hutool.core.date.DateTime; import cn.hutool.core.util.ObjectUtil; import cn.hutool.core.util.StrUtil; import com.alibaba.fastjson.JSONObject; @@ -10,6 +11,13 @@ import com.constants.PayConstants; import com.constants.WeChatConstants; import com.exception.CrmebException; import com.utils.*; +import com.zbkj.crmeb.combination.model.StoreCombination; +import com.zbkj.crmeb.combination.model.StorePink; +import com.zbkj.crmeb.combination.service.StoreCombinationService; +import com.zbkj.crmeb.combination.service.StorePinkService; +import com.zbkj.crmeb.finance.model.UserRecharge; +import com.zbkj.crmeb.finance.service.UserRechargeService; +import com.zbkj.crmeb.payment.service.RechargePayService; import com.zbkj.crmeb.payment.vo.wechat.*; import com.zbkj.crmeb.payment.wechat.WeChatPayService; import com.zbkj.crmeb.store.model.StoreOrder; @@ -87,6 +95,18 @@ public class WeChatPayServiceImpl implements WeChatPayService { @Autowired private UserService userService; + @Autowired + private UserRechargeService userRechargeService; + + @Autowired + private RechargePayService rechargePayService; + + @Autowired + private StoreCombinationService storeCombinationService; + + @Autowired + private StorePinkService storePinkService; + /** * 统一下单 * @param payParamsVo PayParamsVo 支付参数 @@ -343,66 +363,227 @@ public class WeChatPayServiceImpl implements WeChatPayService { if (StrUtil.isBlank(orderNo)) { throw new CrmebException("订单编号不能为空"); } - StoreOrder storeOrder = storeOrderService.getByOderId(orderNo); - if (ObjectUtil.isNull(storeOrder)) { - throw new CrmebException("订单不存在"); - } - if (storeOrder.getIsDel()) { - throw new CrmebException("订单已被删除"); - } - if (!storeOrder.getPayType().equals(PayConstants.PAY_TYPE_WE_CHAT)) { - throw new CrmebException("不是微信支付类型订单,请重新选择支付方式"); - } + // 切割字符串,判断是支付订单还是充值订单 + String pre = StrUtil.subPre(orderNo, 5); + if (pre.equals("order")) {// 支付订单 + StoreOrder storeOrder = storeOrderService.getByOderId(orderNo); + if (ObjectUtil.isNull(storeOrder)) { + throw new CrmebException("订单不存在"); + } + if (storeOrder.getIsDel()) { + throw new CrmebException("订单已被删除"); + } + if (!storeOrder.getPayType().equals(PayConstants.PAY_TYPE_WE_CHAT)) { + throw new CrmebException("不是微信支付类型订单,请重新选择支付方式"); + } - if (storeOrder.getPaid()) { + if (storeOrder.getPaid()) { // throw new CrmebException("订单已支付"); + return Boolean.TRUE; + } + + User user = userService.getById(storeOrder.getUid()); + if (ObjectUtil.isNull(user)) throw new CrmebException("用户不存在"); + + + // 获取appid、mch_id + // 微信签名key + String appId = ""; + String mchId = ""; + String signKey = ""; + if (storeOrder.getIsChannel() == 0) {// 公众号 + appId = systemConfigService.getValueByKeyException(Constants.CONFIG_KEY_PAY_WE_CHAT_APP_ID); + mchId = systemConfigService.getValueByKeyException(Constants.CONFIG_KEY_PAY_WE_CHAT_MCH_ID); + signKey = systemConfigService.getValueByKeyException(Constants.CONFIG_KEY_PAY_WE_CHAT_APP_KEY); + } + if (storeOrder.getIsChannel() == 1) {// 小程序 + appId = systemConfigService.getValueByKeyException(Constants.CONFIG_KEY_PAY_ROUTINE_APP_ID); + mchId = systemConfigService.getValueByKeyException(Constants.CONFIG_KEY_PAY_ROUTINE_MCH_ID); + signKey = systemConfigService.getValueByKeyException(Constants.CONFIG_KEY_PAY_ROUTINE_APP_KEY); + } + if (storeOrder.getIsChannel() == 2) {// H5 + appId = systemConfigService.getValueByKeyException(Constants.CONFIG_KEY_PAY_ROUTINE_APP_ID); + mchId = systemConfigService.getValueByKeyException(Constants.CONFIG_KEY_PAY_ROUTINE_MCH_ID); + signKey = systemConfigService.getValueByKeyException(Constants.CONFIG_KEY_PAY_ROUTINE_APP_KEY); + } + + // 生成查询订单对象 + Map payVo = getWxChantQueryPayVo(orderNo, appId, mchId, signKey); + // 查询订单信息 + MyRecord record = orderPayQuery(payVo); + + Boolean updatePaid = transactionTemplate.execute(e -> { + storeOrderService.updatePaid(orderNo); + if (storeOrder.getUseIntegral() > 0) { + userService.updateIntegral(user, storeOrder.getUseIntegral(), "sub"); + } + // 处理拼团 + if (storeOrder.getCombinationId() > 0) { + // 判断拼团团长是否存在 + StorePink headPink = new StorePink(); + Integer pinkId = storeOrder.getPinkId(); + if (pinkId > 0) { + headPink = storePinkService.getById(pinkId); + if (ObjectUtil.isNull(headPink) || headPink.getIsRefund().equals(true) || headPink.getStatus() == 3) { + pinkId = 0; + } + } + StoreCombination storeCombination = storeCombinationService.getById(storeOrder.getCombinationId()); + // 生成拼团表数据 + StorePink storePink = new StorePink(); + storePink.setUid(user.getUid()); + storePink.setAvatar(user.getAvatar()); + storePink.setNickname(user.getNickname()); + storePink.setOrderId(storeOrder.getOrderId()); + storePink.setOrderIdKey(storeOrder.getId()); + storePink.setTotalNum(storeOrder.getTotalNum()); + storePink.setTotalPrice(storeOrder.getTotalPrice()); + storePink.setCid(storeCombination.getId()); + storePink.setPid(storeCombination.getProductId()); + storePink.setPeople(storeCombination.getPeople()); + storePink.setPrice(storeCombination.getPrice()); + Integer effectiveTime = storeCombination.getEffectiveTime();// 有效小时数 + DateTime dateTime = cn.hutool.core.date.DateUtil.date(); + storePink.setAddTime(dateTime.getTime()); + if (pinkId > 0) { + storePink.setStopTime(headPink.getStopTime()); + } else { + DateTime hourTime = cn.hutool.core.date.DateUtil.offsetHour(dateTime, effectiveTime); + long stopTime = hourTime.getTime(); + if (stopTime > storeCombination.getStopTime()) { + stopTime = storeCombination.getStopTime(); + } + storePink.setStopTime(stopTime); + } + storePink.setKId(pinkId); + storePink.setIsTpl(false); + storePink.setIsRefund(false); + storePink.setStatus(1); + storePinkService.save(storePink); + // 如果是开团,需要更新订单数据 + if (storePink.getKId() == 0) { + storeOrder.setPinkId(storePink.getId()); + storeOrderService.updateById(storeOrder); + } + } + return Boolean.TRUE; + }); + if (!updatePaid) { + throw new CrmebException("支付成功更新订单失败"); + } + // 添加支付成功task + redisUtil.lPush(Constants.ORDER_TASK_PAY_SUCCESS_AFTER, orderNo); return Boolean.TRUE; } + // 充值订单 + UserRecharge userRecharge = new UserRecharge(); + userRecharge.setOrderId(orderNo); + userRecharge = userRechargeService.getInfoByEntity(userRecharge); + if(ObjectUtil.isNull(userRecharge)){ + throw new CrmebException("没有找到订单信息"); + } + if(userRecharge.getPaid()){ + return Boolean.TRUE; + } + // 查询订单 + // 获取appid、mch_id + // 微信签名key + String appId = ""; + String mchId = ""; + String signKey = ""; + if (userRecharge.getRechargeType().equals("public")) {// 公众号 + appId = systemConfigService.getValueByKeyException(Constants.CONFIG_KEY_PAY_WE_CHAT_APP_ID); + mchId = systemConfigService.getValueByKeyException(Constants.CONFIG_KEY_PAY_WE_CHAT_MCH_ID); + signKey = systemConfigService.getValueByKeyException(Constants.CONFIG_KEY_PAY_WE_CHAT_APP_KEY); + } + if (userRecharge.getRechargeType().equals("routine")) {// 小程序 + appId = systemConfigService.getValueByKeyException(Constants.CONFIG_KEY_PAY_ROUTINE_APP_ID); + mchId = systemConfigService.getValueByKeyException(Constants.CONFIG_KEY_PAY_ROUTINE_MCH_ID); + signKey = systemConfigService.getValueByKeyException(Constants.CONFIG_KEY_PAY_ROUTINE_APP_KEY); + } + // 生成查询订单对象 + Map payVo = getWxChantQueryPayVo(orderNo, appId, mchId, signKey); + // 查询订单信息 + MyRecord record = orderPayQuery(payVo); + // 支付成功处理 + Boolean rechargePayAfter = rechargePayService.paySuccess(userRecharge); + if (!rechargePayAfter) { + throw new CrmebException("wechat pay error : 数据保存失败==》" + orderNo); + } + return rechargePayAfter; + } - User user = userService.getById(storeOrder.getUid()); - if (ObjectUtil.isNull(user)) throw new CrmebException("用户不存在"); + /** + * 微信充值预下单接口 + * @param userRecharge 充值订单 + * @param clientIp ip + * @return + */ + @Override + public Map unifiedRecharge(UserRecharge userRecharge, String clientIp) { + if (ObjectUtil.isNull(userRecharge)) { + throw new CrmebException("订单不存在"); + } +// if (userRecharge.getPaid()) { +// throw new CrmebException("订单已支付"); +// } + // 获取用户openId + // 根据订单支付类型来判断获取公众号openId还是小程序openId + UserToken userToken = new UserToken(); + if (userRecharge.getRechargeType().equals(PayConstants.PAY_CHANNEL_WE_CHAT_PUBLIC)) {// 公众号 + userToken = userTokenService.getTokenByUserId(userRecharge.getUid(), 1); + } + if (userRecharge.getRechargeType().equals(PayConstants.PAY_CHANNEL_WE_CHAT_PROGRAM)) {// 小程序 + userToken = userTokenService.getTokenByUserId(userRecharge.getUid(), 2); + } + if (userRecharge.getRechargeType().equals(PayConstants.PAY_CHANNEL_WE_CHAT_H5)) {// H5 +// userTokenService.getByUid(storeOrder.getUid()); + userToken.setToken(""); + } + if (ObjectUtil.isNull(userToken)) { + throw new CrmebException("该用户没有openId"); + } // 获取appid、mch_id // 微信签名key String appId = ""; String mchId = ""; String signKey = ""; - if (storeOrder.getIsChannel() == 0) {// 公众号 + if (userRecharge.getRechargeType().equals(PayConstants.PAY_CHANNEL_WE_CHAT_PUBLIC)) {// 公众号 appId = systemConfigService.getValueByKeyException(Constants.CONFIG_KEY_PAY_WE_CHAT_APP_ID); mchId = systemConfigService.getValueByKeyException(Constants.CONFIG_KEY_PAY_WE_CHAT_MCH_ID); signKey = systemConfigService.getValueByKeyException(Constants.CONFIG_KEY_PAY_WE_CHAT_APP_KEY); } - if (storeOrder.getIsChannel() == 1) {// 小程序 + if (userRecharge.getRechargeType().equals(PayConstants.PAY_CHANNEL_WE_CHAT_PROGRAM)) {// 小程序 appId = systemConfigService.getValueByKeyException(Constants.CONFIG_KEY_PAY_ROUTINE_APP_ID); mchId = systemConfigService.getValueByKeyException(Constants.CONFIG_KEY_PAY_ROUTINE_MCH_ID); signKey = systemConfigService.getValueByKeyException(Constants.CONFIG_KEY_PAY_ROUTINE_APP_KEY); } - if (storeOrder.getIsChannel() == 2) {// H5 - appId = systemConfigService.getValueByKeyException(Constants.CONFIG_KEY_PAY_ROUTINE_APP_ID); - mchId = systemConfigService.getValueByKeyException(Constants.CONFIG_KEY_PAY_ROUTINE_MCH_ID); - signKey = systemConfigService.getValueByKeyException(Constants.CONFIG_KEY_PAY_ROUTINE_APP_KEY); + if (userRecharge.getRechargeType().equals(PayConstants.PAY_CHANNEL_WE_CHAT_H5)) {// H5,使用公众号的 + appId = systemConfigService.getValueByKeyException(Constants.CONFIG_KEY_PAY_WE_CHAT_APP_ID); + mchId = systemConfigService.getValueByKeyException(Constants.CONFIG_KEY_PAY_WE_CHAT_MCH_ID); + signKey = systemConfigService.getValueByKeyException(Constants.CONFIG_KEY_PAY_WE_CHAT_APP_KEY); } - // 生成查询订单对象 - Map payVo = getWxChantQueryPayVo(orderNo, appId, mchId, signKey); - // 查询订单信息 - MyRecord record = orderPayQuery(payVo); + // 获取微信预下单对象 + CreateOrderRequestVo unifiedorderVo = getUnifiedorderVo(userRecharge, userToken.getToken(), clientIp, appId, mchId, signKey); + // 预下单 + CreateOrderResponseVo responseVo = unifiedOrder(unifiedorderVo); - Boolean updatePaid = transactionTemplate.execute(e -> { - storeOrderService.updatePaid(orderNo); - if (storeOrder.getUseIntegral() > 0) { - userService.updateIntegral(user, storeOrder.getUseIntegral(), "sub"); - } - return Boolean.TRUE; - }); - - if (!updatePaid) { - throw new CrmebException("支付成功更新订单失败"); + // 组装前端预下单参数 + Map map = new HashMap<>(); + map.put("appId", unifiedorderVo.getAppid()); + map.put("nonceStr", WxPayUtil.getNonceStr()); + map.put("package", "prepay_id=".concat(responseVo.getPrepayId())); + map.put("signType", unifiedorderVo.getSign_type()); + map.put("timeStamp", Long.toString(WxPayUtil.getCurrentTimestamp())); + String paySign = WxPayUtil.getSign(map, signKey); + map.put("paySign", paySign); + if (userRecharge.getRechargeType().equals(PayConstants.PAY_CHANNEL_WE_CHAT_H5)) { + map.put("mweb_url", responseVo.getMWebUrl()); } - // 添加支付成功task - redisUtil.lPush(Constants.ORDER_TASK_PAY_SUCCESS_AFTER, orderNo); - return Boolean.TRUE; + return map; } private MyRecord orderPayQuery(Map payVo) { @@ -416,13 +597,17 @@ public class WeChatPayServiceImpl implements WeChatPayService { throw new CrmebException("微信订单查询失败!"); } record.setColums(map); - if(record.getStr("return_code").toUpperCase().equals("FAIL")){ - throw new CrmebException("微信下单失败1!" + record.getStr("return_msg")); + if (record.getStr("return_code").toUpperCase().equals("FAIL")){ + throw new CrmebException("微信订单查询失败1!" + record.getStr("return_msg")); } - if(record.getStr("result_code").toUpperCase().equals("FAIL")){ - throw new CrmebException("微信下单失败2!" + record.getStr("err_code_des")); + if (record.getStr("result_code").toUpperCase().equals("FAIL")){ + throw new CrmebException("微信订单查询失败2!" + record.getStr("err_code") + record.getStr("err_code_des")); } + if (!record.getStr("trade_state").toUpperCase().equals("SUCCESS")){ + throw new CrmebException("微信订单支付失败!" + record.getStr("trade_state")); + } + return record; } catch (Exception e) { e.printStackTrace(); @@ -487,6 +672,48 @@ public class WeChatPayServiceImpl implements WeChatPayService { return vo; } + /** + * 获取微信预下单对象 + * @return + */ + private CreateOrderRequestVo getUnifiedorderVo(UserRecharge userRecharge, String openid, String ip, String appId, String mchId, String signKey) { + + // 获取域名 + String domain = systemConfigService.getValueByKeyException(Constants.CONFIG_KEY_SITE_URL); + String apiDomain = systemConfigService.getValueByKeyException(Constants.CONFIG_KEY_API_URL); + + AttachVo attachVo = new AttachVo(Constants.SERVICE_PAY_TYPE_RECHARGE, userRecharge.getUid()); + CreateOrderRequestVo vo = new CreateOrderRequestVo(); + + vo.setAppid(appId); + vo.setMch_id(mchId); + vo.setNonce_str(WxPayUtil.getNonceStr()); + vo.setSign_type(PayConstants.WX_PAY_SIGN_TYPE_MD5); + vo.setBody(PayConstants.PAY_BODY); + vo.setAttach(JSONObject.toJSONString(attachVo)); + vo.setOut_trade_no(userRecharge.getOrderId()); + // 订单中使用的是BigDecimal,这里要转为Integer类型 + vo.setTotal_fee(userRecharge.getPrice().multiply(BigDecimal.TEN).multiply(BigDecimal.TEN).intValue()); + vo.setSpbill_create_ip(ip); + vo.setNotify_url(apiDomain + PayConstants.WX_PAY_NOTIFY_API_URI); + vo.setTrade_type(PayConstants.WX_PAY_TRADE_TYPE_JS); + vo.setOpenid(openid); + if (userRecharge.getRechargeType().equals(PayConstants.PAY_CHANNEL_WE_CHAT_H5)){// H5 + vo.setTrade_type(PayConstants.WX_PAY_TRADE_TYPE_H5); + vo.setOpenid(null); + } + CreateOrderH5SceneInfoVo createOrderH5SceneInfoVo = new CreateOrderH5SceneInfoVo( + new CreateOrderH5SceneInfoDetailVo( + domain, + systemConfigService.getValueByKeyException(Constants.CONFIG_KEY_SITE_NAME) + ) + ); + vo.setScene_info(JSONObject.toJSONString(createOrderH5SceneInfoVo)); + String sign = WxPayUtil.getSign(vo, signKey); + vo.setSign(sign); + return vo; + } + /** * 作用:统一下单
* 场景:公共号支付、扫码支付、APP支付 diff --git a/crmeb/src/main/java/com/zbkj/crmeb/pub/controller/WeChatMessageController.java b/crmeb/src/main/java/com/zbkj/crmeb/pub/controller/WeChatMessageController.java index f63fc865..d4008ee6 100644 --- a/crmeb/src/main/java/com/zbkj/crmeb/pub/controller/WeChatMessageController.java +++ b/crmeb/src/main/java/com/zbkj/crmeb/pub/controller/WeChatMessageController.java @@ -7,9 +7,13 @@ import lombok.extern.slf4j.Slf4j; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RequestMethod; +import org.springframework.web.bind.annotation.RequestParam; import org.springframework.web.bind.annotation.RestController; import javax.servlet.http.HttpServletRequest; +import javax.servlet.http.HttpServletResponse; +import java.io.IOException; +import java.io.PrintWriter; /** @@ -43,19 +47,28 @@ public class WeChatMessageController { public String webHook(HttpServletRequest request){ return weChatMessageService.init(request); } -//微信推送地址验证 -// @RequestMapping(value = { "/webHook" }, method = RequestMethod.GET) -// private void webHook( -// @RequestParam(value = "signature", required = false) String signature, -// @RequestParam(value = "timestamp", required = false) String timestamp, -// @RequestParam(value = "nonce", required = false) String nonce, -// @RequestParam(value = "echostr") String echostr, -// HttpServletResponse response) throws IOException { -// PrintWriter writer = response.getWriter(); -// writer.print(echostr); -// writer.flush(); -// writer.close(); -// } + + /** + * 微信推送地址验证 + * @param signature + * @param timestamp + * @param nonce + * @param echostr + * @param response + * @throws IOException + */ + @RequestMapping(value = { "/webHook" }, method = RequestMethod.GET) + private void webHook( + @RequestParam(value = "signature", required = false) String signature, + @RequestParam(value = "timestamp", required = false) String timestamp, + @RequestParam(value = "nonce", required = false) String nonce, + @RequestParam(value = "echostr") String echostr, + HttpServletResponse response) throws IOException { + PrintWriter writer = response.getWriter(); + writer.print(echostr); + writer.flush(); + writer.close(); + } } diff --git a/crmeb/src/main/java/com/zbkj/crmeb/seckill/controller/StoreSeckillMangerController.java b/crmeb/src/main/java/com/zbkj/crmeb/seckill/controller/StoreSeckillMangerController.java index 419b8157..09e217b4 100644 --- a/crmeb/src/main/java/com/zbkj/crmeb/seckill/controller/StoreSeckillMangerController.java +++ b/crmeb/src/main/java/com/zbkj/crmeb/seckill/controller/StoreSeckillMangerController.java @@ -63,7 +63,7 @@ public class StoreSeckillMangerController { StoreSeckillManger storeSeckillManger = new StoreSeckillManger(); BeanUtils.copyProperties(request, storeSeckillManger); // 对request中的time做分割后赋值给mode中的start和end属性 - setTimeRangeFromRequest(request, storeSeckillManger); + storeSeckillMangerService.setTimeRangeFromRequest(request, storeSeckillManger); CommonPage storeSeckillMangerCommonPage = CommonPage.restPage(storeSeckillMangerService.getList(storeSeckillManger, pageParamRequest)); return CommonResult.success(storeSeckillMangerCommonPage); @@ -81,7 +81,7 @@ public class StoreSeckillMangerController { StoreSeckillManger storeSeckillManger = new StoreSeckillManger(); BeanUtils.copyProperties(storeSeckillMangerRequest, storeSeckillManger); // 对request中的time做分割后赋值给mode中的start和end属性 - setTimeRangeFromRequest(storeSeckillMangerRequest, storeSeckillManger); + storeSeckillMangerService.setTimeRangeFromRequest(storeSeckillMangerRequest, storeSeckillManger); List storeSeckillMangers = storeSeckillMangerService.checkTimeRangeUnique(storeSeckillManger); if(storeSeckillMangers.size() > 0){ throw new CrmebException("当前时间段的秒杀配置已存在"); @@ -122,29 +122,7 @@ public class StoreSeckillMangerController { @ApiOperation(value = "修改") @RequestMapping(value = "/update", method = RequestMethod.POST) public CommonResult update(@RequestParam Integer id, @RequestBody @Validated StoreSeckillMangerRequest storeSeckillMangerRequest){ - StoreSeckillManger storeSeckillManger = new StoreSeckillManger(); - BeanUtils.copyProperties(storeSeckillMangerRequest, storeSeckillManger); - storeSeckillManger.setId(id); - // 对request中的time做分割后赋值给mode中的start和end属性 - setTimeRangeFromRequest(storeSeckillMangerRequest, storeSeckillManger); - List existTimes = storeSeckillMangerService.checkTimeRangeUnique(storeSeckillManger); - if(existTimes.size() == 0){ - storeSeckillMangerService.updateByCondition(storeSeckillManger); - }else{ - // 更新时排除自身更新 - StoreSeckillManger ssm = existTimes.get(0); - if(ssm.getId() == id && ssm.getStartTime() == storeSeckillManger.getStartTime() - && ssm.getEndTime() == storeSeckillManger.getEndTime()){ - if(storeSeckillMangerService.updateByCondition(storeSeckillManger)){ - return CommonResult.success(); - }else{ - return CommonResult.failed(); - } - }else{ - throw new CrmebException("当前时间段的秒杀配置已存在"); - } - } - return CommonResult.failed(); + return storeSeckillMangerService.update(id,storeSeckillMangerRequest) ? CommonResult.success() : CommonResult.failed(); } /** @@ -176,38 +154,7 @@ public class StoreSeckillMangerController { return CommonResult.success(storeSeckillMangerService.updateStatus(id,status)); } - /** - * 兼容时间参数 request中String格式 mode中Integer - * @param storeSeckillMangerRequest request参数 - * @param storeSeckillManger 秒杀配置实体 - */ - private void setTimeRangeFromRequest(@Validated @RequestBody StoreSeckillMangerRequest storeSeckillMangerRequest, StoreSeckillManger storeSeckillManger) { - if(!storeSeckillMangerRequest.getTime().contains(",")){ - throw new CrmebException("时间参数不正确 例如:01:00,02:00"); - } - String[] timeRage = storeSeckillMangerRequest.getTime().split(","); - Integer startTime = Integer.parseInt(timeRage[0].split(":")[0]); - Integer endTime = Integer.parseInt(timeRage[1].split(":")[0]); - storeSeckillManger.setStartTime(startTime); - storeSeckillManger.setEndTime(endTime); - } - /** - * 兼容时间参数 request中String格式 mode中Integer - * @param request request参数 - * @param storeSeckillManger 秒杀配置实体 - */ - private void setTimeRangeFromRequest(@Validated @RequestBody StoreSeckillMangerSearchRequest request, StoreSeckillManger storeSeckillManger) { - if(null == request.getTime()) return; - if(!request.getTime().contains(",")){ - throw new CrmebException("时间参数不正确 例如:01:00,02:00"); - } - String[] timeRage = request.getTime().split(","); - Integer startTime = Integer.parseInt(timeRage[0].split(":")[0]); - Integer endTime = Integer.parseInt(timeRage[1].split(":")[0]); - storeSeckillManger.setStartTime(startTime); - storeSeckillManger.setEndTime(endTime); - } } diff --git a/crmeb/src/main/java/com/zbkj/crmeb/seckill/service/StoreSeckillMangerService.java b/crmeb/src/main/java/com/zbkj/crmeb/seckill/service/StoreSeckillMangerService.java index f33358c1..30e825a5 100644 --- a/crmeb/src/main/java/com/zbkj/crmeb/seckill/service/StoreSeckillMangerService.java +++ b/crmeb/src/main/java/com/zbkj/crmeb/seckill/service/StoreSeckillMangerService.java @@ -3,7 +3,11 @@ package com.zbkj.crmeb.seckill.service; import com.baomidou.mybatisplus.extension.service.IService; import com.common.PageParamRequest; import com.zbkj.crmeb.seckill.model.StoreSeckillManger; +import com.zbkj.crmeb.seckill.request.StoreSeckillMangerRequest; +import com.zbkj.crmeb.seckill.request.StoreSeckillMangerSearchRequest; import com.zbkj.crmeb.seckill.response.StoreSeckillManagerResponse; +import org.springframework.validation.annotation.Validated; +import org.springframework.web.bind.annotation.RequestBody; import java.util.List; @@ -64,4 +68,14 @@ public interface StoreSeckillMangerService extends IService * @return 结果 */ boolean updateStatus(int id, boolean status); -} \ No newline at end of file + + /** + * 更新秒杀配置 + * @param id id + * @param storeSeckillMangerRequest 秒杀配置 + * @return 结果 + */ + boolean update(Integer id,StoreSeckillMangerRequest storeSeckillMangerRequest); + void setTimeRangeFromRequest(@Validated @RequestBody StoreSeckillMangerRequest storeSeckillMangerRequest, StoreSeckillManger storeSeckillManger); + void setTimeRangeFromRequest(@Validated @RequestBody StoreSeckillMangerSearchRequest request, StoreSeckillManger storeSeckillManger); +} diff --git a/crmeb/src/main/java/com/zbkj/crmeb/seckill/service/impl/StoreSeckillMangerServiceImpl.java b/crmeb/src/main/java/com/zbkj/crmeb/seckill/service/impl/StoreSeckillMangerServiceImpl.java index 0ce41f1e..4b70cf61 100644 --- a/crmeb/src/main/java/com/zbkj/crmeb/seckill/service/impl/StoreSeckillMangerServiceImpl.java +++ b/crmeb/src/main/java/com/zbkj/crmeb/seckill/service/impl/StoreSeckillMangerServiceImpl.java @@ -1,9 +1,12 @@ package com.zbkj.crmeb.seckill.service.impl; +import cn.hutool.core.collection.CollUtil; import com.baomidou.mybatisplus.core.conditions.update.LambdaUpdateWrapper; import com.baomidou.mybatisplus.core.toolkit.StringUtils; import com.baomidou.mybatisplus.core.toolkit.Wrappers; +import com.common.CommonResult; import com.common.PageParamRequest; +import com.exception.CrmebException; import com.github.pagehelper.PageHelper; import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; @@ -11,6 +14,7 @@ import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; import com.utils.DateUtil; import com.zbkj.crmeb.seckill.dao.StoreSeckillMangerDao; import com.zbkj.crmeb.seckill.model.StoreSeckillManger; +import com.zbkj.crmeb.seckill.request.StoreSeckillMangerRequest; import com.zbkj.crmeb.seckill.request.StoreSeckillMangerSearchRequest; import com.zbkj.crmeb.seckill.response.StoreSeckillManagerResponse; import com.zbkj.crmeb.seckill.service.StoreSeckillMangerService; @@ -18,6 +22,8 @@ import com.zbkj.crmeb.system.service.SystemAttachmentService; import org.springframework.beans.BeanUtils; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; +import org.springframework.validation.annotation.Validated; +import org.springframework.web.bind.annotation.RequestBody; import javax.annotation.Resource; import java.util.ArrayList; @@ -172,6 +178,52 @@ public class StoreSeckillMangerServiceImpl extends ServiceImpl 0; } + /** + * 更新秒杀配置 + * @param id id + * @param storeSeckillMangerRequest 秒杀配置 + * @return 结果 + */ + @Override + public boolean update(Integer id,StoreSeckillMangerRequest storeSeckillMangerRequest) { + StoreSeckillManger storeSeckillManger = new StoreSeckillManger(); + BeanUtils.copyProperties(storeSeckillMangerRequest, storeSeckillManger); + storeSeckillManger.setId(id); + // 对request中的time做分割后赋值给mode中的start和end属性 + setTimeRangeFromRequest(storeSeckillMangerRequest, storeSeckillManger); + List existTimes = checkTimeRangeUnique(storeSeckillManger); + if(existTimes.size() == 0){ + return updateByCondition(storeSeckillManger); + } + // 更新时排除自身更新 + StoreSeckillManger ssm = existTimes.get(0); +// if(ssm.getStartTime().equals(storeSeckillManger.getStartTime()) +// && ssm.getEndTime().equals(storeSeckillManger.getEndTime())){ +// return updateByCondition(storeSeckillManger); +// // 更新时 时间更改的判断 +// }else + if (!ssm.getStartTime().equals(storeSeckillManger.getStartTime()) + || !ssm.getEndTime().equals(storeSeckillManger.getEndTime())){ + // 判断开始时间 结束时间 是否被包涵 + LambdaQueryWrapper startAndEndExcuseQuery = Wrappers.lambdaQuery(); + startAndEndExcuseQuery.ge(StoreSeckillManger::getStartTime,storeSeckillManger.getStartTime()) + .or() + .le(StoreSeckillManger::getEndTime,storeSeckillManger.getEndTime()); + List storeSeckillMangers = dao.selectList(startAndEndExcuseQuery); + // 时间区间改大 不存在的情况 + if(CollUtil.isEmpty(storeSeckillMangers) && storeSeckillMangers.size() == 0){ + return updateByCondition(storeSeckillManger); + // 时间区间改小 id一样且仅仅存在一条 + }else if(storeSeckillMangers.size() == 1 && storeSeckillMangers.get(0).getId().equals(id)){ + return updateByCondition(storeSeckillManger); + }else{ + throw new CrmebException("当前时间段的秒杀配置已存在"); + } + }else { + throw new CrmebException("当前时间段的秒杀配置已存在"); + } + } + /////////////////////////////////////////////////// 自定义方法 // 列表用 格式化time 对前端输出一致 @@ -192,5 +244,40 @@ public class StoreSeckillMangerServiceImpl extends ServiceImpl sendCode(@RequestParam String phone){ - ValidateFormUtil.isPhone(phone,"手机号码错误"); - boolean codeResult = smsService.pushCodeToList(phone,1, null); - return codeResult ? CommonResult.success("短信加入发送队列成功"):CommonResult.failed("短信加入发送队列失败"); - } +// /** +// * 发送短信 +// * @param phone 手机号码 +// * @return 发送是否成功 +// */ +// @ApiOperation(value = " 发送短信") +// @RequestMapping(value = "/sendCode", method = RequestMethod.POST) +// @ApiImplicitParams({ +// @ApiImplicitParam(name="phone", value="手机号码", required = true) +// }) +// public CommonResult sendCode(@RequestParam String phone){ +// ValidateFormUtil.isPhone(phone,"手机号码错误"); +// boolean codeResult = smsService.pushCodeToList(phone,1, null); +// return codeResult ? CommonResult.success("短信加入发送队列成功"):CommonResult.failed("短信加入发送队列失败"); +// } } diff --git a/crmeb/src/main/java/com/zbkj/crmeb/sms/service/SmsService.java b/crmeb/src/main/java/com/zbkj/crmeb/sms/service/SmsService.java index c0ff98fb..b5ad0c62 100644 --- a/crmeb/src/main/java/com/zbkj/crmeb/sms/service/SmsService.java +++ b/crmeb/src/main/java/com/zbkj/crmeb/sms/service/SmsService.java @@ -6,6 +6,7 @@ import com.zbkj.crmeb.sms.request.SendSmsVo; import com.zbkj.crmeb.sms.request.SmsApplyTempRequest; import com.zbkj.crmeb.sms.request.SmsModifySignRequest; +import java.math.BigDecimal; import java.util.HashMap; /** @@ -20,41 +21,98 @@ import java.util.HashMap; * | Author: CRMEB Team * +---------------------------------------------------------------------- */ -public interface SmsService{ +public interface SmsService { - /** - * 发送短信到短信列表 - */ - Boolean pushCodeToList(String phone, Integer tag,HashMap pram); - - void push(String phone,String tempKey,Integer msgTempId,boolean valid, HashMap mapPram); + void push(String phone, String tempKey, Integer msgTempId, HashMap mapPram); void consume(); - boolean sendCode(SendSmsVo sendSmsVo); + Boolean sendCode(SendSmsVo sendSmsVo); /** * 修改签名 - * @return */ Boolean modifySign(SmsModifySignRequest request); /** * 短信模板 - * @return */ MyRecord temps(PageParamRequest pageParamRequest); /** * 申请模板消息 - * @return */ Boolean applyTempMessage(SmsApplyTempRequest request); /** * 模板申请记录 + * * @param type (1=验证码 2=通知 3=推广) - * @return */ MyRecord applys(Integer type, PageParamRequest pageParamRequest); + + /** + * 发送公共验证码 + * + * @param phone 手机号 + */ + Boolean sendCommonCode(String phone); + + /** + * 发送支付成功短信 + * @param phone 手机号 + * @param orderNo 订单编号 + * @param payPrice 支付金额 + * @return Boolean + */ + Boolean sendPaySuccess(String phone, String orderNo, BigDecimal payPrice); + + /** + * 发送管理员下单短信提醒短信 + * @param phone 手机号 + * @param orderNo 订单编号 + * @param realName 管理员名称 + */ + Boolean sendCreateOrderNotice(String phone, String orderNo, String realName); + + /** + * 发送订单支付成功管理员提醒短信 + * @param phone 手机号 + * @param orderNo 订单编号 + * @param realName 管理员名称 + */ + Boolean sendOrderPaySuccessNotice(String phone, String orderNo, String realName); + + /** + * 发送用户退款管理员提醒短信 + * @param phone 手机号 + * @param orderNo 订单编号 + * @param realName 管理员名称 + */ + Boolean sendOrderRefundApplyNotice(String phone, String orderNo, String realName); + + /** + * 发送用户确认收货管理员提醒短信 + * @param phone 手机号 + * @param orderNo 订单编号 + * @param realName 管理员名称 + */ + Boolean sendOrderReceiptNotice(String phone, String orderNo, String realName); + + /** + * 发送订单改价提醒短信 + * @param phone 手机号 + * @param orderNo 订单编号 + * @param price 修改后的支付金额 + */ + Boolean sendOrderEditPriceNotice(String phone, String orderNo, BigDecimal price); + + /** + * 发送订单发货提醒短信 + * @param phone 手机号 + * @param nickName 用户昵称 + * @param storeName 商品名称 + * @param orderNo 订单编号 + */ + Boolean sendOrderDeliverNotice(String phone, String nickName, String storeName, String orderNo); } diff --git a/crmeb/src/main/java/com/zbkj/crmeb/sms/service/impl/SmsServiceImpl.java b/crmeb/src/main/java/com/zbkj/crmeb/sms/service/impl/SmsServiceImpl.java index aef40aa0..7035772e 100644 --- a/crmeb/src/main/java/com/zbkj/crmeb/sms/service/impl/SmsServiceImpl.java +++ b/crmeb/src/main/java/com/zbkj/crmeb/sms/service/impl/SmsServiceImpl.java @@ -32,6 +32,7 @@ import org.springframework.transaction.annotation.Transactional; import org.springframework.util.LinkedMultiValueMap; import org.springframework.util.MultiValueMap; +import java.math.BigDecimal; import java.util.HashMap; import java.util.List; import java.util.Map; @@ -50,7 +51,6 @@ import java.util.stream.Collectors; * | Author: CRMEB Team * +---------------------------------------------------------------------- */ -@Data @Service public class SmsServiceImpl implements SmsService { @@ -78,72 +78,71 @@ public class SmsServiceImpl implements SmsService { * 添加到短信队列 * 验证码特殊处理其他的参数自行根据要求处理 * 参数处理逻辑 {code:value,code1:value1} + * * @param phone String 手机号码 * @return boolean - * @author Mr.Zhang - * @since 2020-04-16 */ - @Override - public Boolean pushCodeToList(String phone, Integer tag, HashMap pram) { + private Boolean pushCodeToList(String phone, Integer tag, HashMap pram) { //发送手机验证码, 记录到redis sms_validate_code_手机号 switch (tag) { case SmsConstants.SMS_CONFIG_TYPE_VERIFICATION_CODE: // 验证码 特殊处理 code //获取短信验证码过期时间 String codeExpireStr = systemConfigService.getValueByKey(Constants.CONFIG_KEY_SMS_CODE_EXPIRE); if (StringUtils.isBlank(codeExpireStr) || Integer.parseInt(codeExpireStr) == 0) { - codeExpireStr = Constants.NUM_FIVE + ""; + codeExpireStr = Constants.NUM_FIVE + "";// 默认5分钟过期 } Integer code = CrmebUtil.randomCount(111111, 999999); HashMap justPram = new HashMap<>(); justPram.put("code", code); + justPram.put("time", codeExpireStr); push(phone, SmsConstants.SMS_CONFIG_VERIFICATION_CODE, - SmsConstants.SMS_CONFIG_VERIFICATION_CODE_TEMP_ID, false, justPram); - - redisUtil.set(userService.getValidateCodeRedisKey(phone), code, Long.valueOf(codeExpireStr), TimeUnit.MINUTES);//5分钟过期 + SmsConstants.SMS_CONFIG_VERIFICATION_CODE_TEMP_ID, justPram); + // 将验证码存入redis + redisUtil.set(userService.getValidateCodeRedisKey(phone), code, Long.valueOf(codeExpireStr), TimeUnit.MINUTES); break; case SmsConstants.SMS_CONFIG_TYPE_LOWER_ORDER_SWITCH: // 支付成功短信提醒 pay_price order_id push(phone, SmsConstants.SMS_CONFIG_LOWER_ORDER_SWITCH, - SmsConstants.SMS_CONFIG_LOWER_ORDER_SWITCH_TEMP_ID, true, pram); + SmsConstants.SMS_CONFIG_LOWER_ORDER_SWITCH_TEMP_ID, pram); break; case SmsConstants.SMS_CONFIG_TYPE_DELIVER_GOODS_SWITCH: // 发货短信提醒 nickname store_name push(phone, SmsConstants.SMS_CONFIG_DELIVER_GOODS_SWITCH, - SmsConstants.SMS_CONFIG_DELIVER_GOODS_SWITCH_TEMP_ID, true, pram); + SmsConstants.SMS_CONFIG_DELIVER_GOODS_SWITCH_TEMP_ID, pram); break; case SmsConstants.SMS_CONFIG_TYPE_CONFIRM_TAKE_OVER_SWITCH: // 确认收货短信提醒 order_id store_name push(phone, SmsConstants.SMS_CONFIG_CONFIRM_TAKE_OVER_SWITCH, - SmsConstants.SMS_CONFIG_CONFIRM_TAKE_OVER_SWITCH_TEMP_ID, true, pram); + SmsConstants.SMS_CONFIG_CONFIRM_TAKE_OVER_SWITCH_TEMP_ID, pram); break; case SmsConstants.SMS_CONFIG_TYPE_ADMIN_LOWER_ORDER_SWITCH: // 用户下单管理员短信提醒 admin_name order_id push(phone, SmsConstants.SMS_CONFIG_ADMIN_LOWER_ORDER_SWITCH, - SmsConstants.SMS_CONFIG_ADMIN_LOWER_ORDER_SWITCH_TEMP_ID, true, pram); + SmsConstants.SMS_CONFIG_ADMIN_LOWER_ORDER_SWITCH_TEMP_ID, pram); break; case SmsConstants.SMS_CONFIG_TYPE_ADMIN_PAY_SUCCESS_SWITCH: // 支付成功管理员短信提醒 admin_name order_id push(phone, SmsConstants.SMS_CONFIG_ADMIN_PAY_SUCCESS_SWITCH, - SmsConstants.SMS_CONFIG_ADMIN_PAY_SUCCESS_SWITCH_TEMP_ID, true, pram); + SmsConstants.SMS_CONFIG_ADMIN_PAY_SUCCESS_SWITCH_TEMP_ID, pram); break; case SmsConstants.SMS_CONFIG_TYPE_ADMIN_REFUND_SWITCH: // 用户确认收货管理员短信提醒 admin_name order_id push(phone, SmsConstants.SMS_CONFIG_ADMIN_REFUND_SWITCH, - SmsConstants.SMS_CONFIG_ADMIN_REFUND_SWITCH_TEMP_ID, true, pram); + SmsConstants.SMS_CONFIG_ADMIN_REFUND_SWITCH_TEMP_ID, pram); break; case SmsConstants.SMS_CONFIG_TYPE_ADMIN_CONFIRM_TAKE_OVER_SWITCH: // 用户发起退款管理员短信提醒 admin_name order_id push(phone, SmsConstants.SMS_CONFIG_ADMIN_CONFIRM_TAKE_OVER_SWITCH, - SmsConstants.SMS_CONFIG_ADMIN_CONFIRM_TAKE_OVER_SWITCH_TEMP_ID, true, pram); + SmsConstants.SMS_CONFIG_ADMIN_CONFIRM_TAKE_OVER_SWITCH_TEMP_ID, pram); break; case SmsConstants.SMS_CONFIG_TYPE_PRICE_REVISION_SWITCH: // 改价短信提醒 order_id pay_price push(phone, SmsConstants.SMS_CONFIG_PRICE_REVISION_SWITCH, - SmsConstants.SMS_CONFIG_PRICE_REVISION_SWITCH_TEMP_ID, true, pram); + SmsConstants.SMS_CONFIG_PRICE_REVISION_SWITCH_TEMP_ID, pram); break; case SmsConstants.SMS_CONFIG_TYPE_ORDER_PAY_FALSE: // 订单未支付 order_id push(phone, SmsConstants.SMS_CONFIG_ORDER_PAY_FALSE, - SmsConstants.SMS_CONFIG_ORDER_PAY_FALSE_TEMP_ID, false, pram); + SmsConstants.SMS_CONFIG_ORDER_PAY_FALSE_TEMP_ID, pram); break; } return true; } @Override - public boolean sendCode(SendSmsVo sendSmsVo) { + public Boolean sendCode(SendSmsVo sendSmsVo) { String result; try { String token = onePassUtil.getToken(); @@ -154,7 +153,7 @@ public class SmsServiceImpl implements SmsService { param.add("phone", sendSmsVo.getMobile()); param.add("temp_id", sendSmsVo.getTemplate()); map.entrySet().stream().forEach(entry -> param.add(StrUtil.format(SmsConstants.SMS_COMMON_PARAM_FORMAT, entry.getKey()), entry.getValue())); - + System.out.println("============发送短信=========header = " + header); result = restTemplateUtil.postFromUrlencoded(OnePassConstants.ONE_PASS_API_URL + OnePassConstants.ONE_PASS_API_SEND_URI, param, header); } catch (Exception e) { //接口请求异常,需要重新发送 @@ -227,9 +226,14 @@ public class SmsServiceImpl implements SmsService { /** * 添加待发送消息到redis队列 + * + * @param phone 手机号 + * @param tempKey 模板key + * @param msgTempId 模板id + * @param mapPram 参数map */ @Override - public void push(String phone, String tempKey, Integer msgTempId, boolean valid, HashMap mapPram) { + public void push(String phone, String tempKey, Integer msgTempId, HashMap mapPram) { if (StringUtils.isBlank(phone) || StringUtils.isBlank(tempKey) || msgTempId <= 0) { return; } @@ -242,14 +246,7 @@ public class SmsServiceImpl implements SmsService { mParam.put("template", msgTempId); mParam.put("param", JSONObject.toJSONString(mapPram)); - if (!valid) { - redisUtil.lPush(SmsConstants.SMS_SEND_KEY, JSONObject.toJSONString(mParam)); - return; - } - String value = systemConfigService.getValueByKey(tempKey); - if (value.equals("1")) { - redisUtil.lPush(SmsConstants.SMS_SEND_KEY, JSONObject.toJSONString(mParam)); - } + redisUtil.lPush(SmsConstants.SMS_SEND_KEY, JSONObject.toJSONString(mParam)); } /** @@ -329,7 +326,7 @@ public class SmsServiceImpl implements SmsService { /** * 模板申请记录 * - * @param type (1=验证码 2=通知 3=推广) + * @param type (1=验证码 2=通知 3=推广) */ @Override public MyRecord applys(Integer type, PageParamRequest pageParamRequest) { @@ -371,6 +368,123 @@ public class SmsServiceImpl implements SmsService { return myRecord; } + /** + * 发送公共验证码 + * + * @param phone 手机号 + * @return Boolean + */ + @Override + public Boolean sendCommonCode(String phone) { + return pushCodeToList(phone, SmsConstants.SMS_CONFIG_TYPE_VERIFICATION_CODE, null); + } + + /** + * 发送支付成功短信 + * @param phone 手机号 + * @param orderNo 订单编号 + * @param payPrice 支付金额 + * @return Boolean + */ + @Override + public Boolean sendPaySuccess(String phone, String orderNo, BigDecimal payPrice) { + HashMap map = CollUtil.newHashMap(); + map.put("pay_price", payPrice); + map.put("order_id", orderNo); + return pushCodeToList(phone, SmsConstants.SMS_CONFIG_TYPE_LOWER_ORDER_SWITCH, map); + } + + /** + * 发送管理员下单短信提醒 + * @param phone 手机号 + * @param orderNo 订单编号 + * @param realName 管理员名称 + * @return Boolean + */ + @Override + public Boolean sendCreateOrderNotice(String phone, String orderNo, String realName) { + HashMap map = CollUtil.newHashMap(); + map.put("admin_name", realName); + map.put("order_id", orderNo); + return pushCodeToList(phone, SmsConstants.SMS_CONFIG_TYPE_ADMIN_LOWER_ORDER_SWITCH, map); + } + + /** + * 发送订单支付成功管理员提醒短信 + * @param phone 手机号 + * @param orderNo 订单编号 + * @param realName 管理员名称 + * @return Boolean + */ + @Override + public Boolean sendOrderPaySuccessNotice(String phone, String orderNo, String realName) { + HashMap map = CollUtil.newHashMap(); + map.put("admin_name", realName); + map.put("order_id", orderNo); + return pushCodeToList(phone, SmsConstants.SMS_CONFIG_TYPE_ADMIN_PAY_SUCCESS_SWITCH, map); + } + + /** + * 发送用户退款管理员提醒短信 + * @param phone 手机号 + * @param orderNo 订单编号 + * @param realName 管理员名称 + * @return Boolean + */ + @Override + public Boolean sendOrderRefundApplyNotice(String phone, String orderNo, String realName) { + HashMap map = CollUtil.newHashMap(); + map.put("admin_name", realName); + map.put("order_id", orderNo); + return pushCodeToList(phone, SmsConstants.SMS_CONFIG_TYPE_ADMIN_CONFIRM_TAKE_OVER_SWITCH, map); + } + + /** + * 发送用户确认收货管理员提醒短信 + * @param phone 手机号 + * @param orderNo 订单编号 + * @param realName 管理员名称 + * @return Boolean + */ + @Override + public Boolean sendOrderReceiptNotice(String phone, String orderNo, String realName) { + HashMap map = CollUtil.newHashMap(); + map.put("admin_name", realName); + map.put("order_id", orderNo); + return pushCodeToList(phone, SmsConstants.SMS_CONFIG_TYPE_ADMIN_REFUND_SWITCH, map); + } + + /** + * 发送订单改价提醒短信 + * @param phone 手机号 + * @param orderNo 订单编号 + * @param price 修改后的支付金额 + * @return Boolean + */ + @Override + public Boolean sendOrderEditPriceNotice(String phone, String orderNo, BigDecimal price) { + HashMap map = CollUtil.newHashMap(); + map.put("order_id", orderNo); + map.put("pay_price", price); + return pushCodeToList(phone, SmsConstants.SMS_CONFIG_TYPE_PRICE_REVISION_SWITCH, map); + } + + /** + * 发送订单发货提醒短信 + * @param phone 手机号 + * @param nickName 用户昵称 + * @param storeName 商品名称 + * @param orderNo 订单编号 + */ + @Override + public Boolean sendOrderDeliverNotice(String phone, String nickName, String storeName, String orderNo) { + HashMap map = CollUtil.newHashMap(); + map.put("nickname", nickName); + map.put("store_name", storeName); + map.put("order_id", orderNo); + return pushCodeToList(phone, SmsConstants.SMS_CONFIG_TYPE_DELIVER_GOODS_SWITCH, map); + } + /** * post请求from表单模式提交 */ diff --git a/crmeb/src/main/java/com/zbkj/crmeb/store/controller/RetailShopController.java b/crmeb/src/main/java/com/zbkj/crmeb/store/controller/RetailShopController.java index 291ec9fd..1b0a6863 100644 --- a/crmeb/src/main/java/com/zbkj/crmeb/store/controller/RetailShopController.java +++ b/crmeb/src/main/java/com/zbkj/crmeb/store/controller/RetailShopController.java @@ -3,17 +3,13 @@ package com.zbkj.crmeb.store.controller; import com.common.CommonPage; import com.common.CommonResult; import com.common.PageParamRequest; -import com.github.pagehelper.PageInfo; -import com.zbkj.crmeb.finance.service.UserExtractService; import com.zbkj.crmeb.store.model.StoreOrder; import com.zbkj.crmeb.store.request.RetailShopRequest; import com.zbkj.crmeb.store.request.RetailShopStairUserRequest; import com.zbkj.crmeb.store.response.RetailShopStatisticsResponse; -import com.zbkj.crmeb.store.response.RetailShopUserResponse; import com.zbkj.crmeb.store.service.RetailShopService; -import com.zbkj.crmeb.store.service.StoreOrderService; import com.zbkj.crmeb.user.model.User; -import com.zbkj.crmeb.user.response.UserResponse; +import com.zbkj.crmeb.user.response.SpreadUserResponse; import com.zbkj.crmeb.user.service.UserService; import io.swagger.annotations.Api; import io.swagger.annotations.ApiImplicitParam; @@ -24,11 +20,6 @@ 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.ArrayList; -import java.util.List; -import java.util.stream.Collectors; - /** * 分销模块 * +---------------------------------------------------------------------- @@ -53,37 +44,29 @@ public class RetailShopController { @Autowired private UserService userService; - @Autowired - private StoreOrderService storeOrderService; - - @Autowired - private UserExtractService userExtractService; - /** - * 分销列表 - * @param keywords - * @param dateLimit - * @param pageParamRequest - * @return + * 分销员列表 + * @param keywords 搜索参数 + * @param dateLimit 时间参数 + * @param pageParamRequest 分页参数 */ - @ApiOperation(value = "分销列表") + @ApiOperation(value = "分销员列表") @RequestMapping(value = "/list", method = RequestMethod.GET) @ApiImplicitParams({ @ApiImplicitParam(name = "keywords", value = "搜索关键字[身份证,手机,昵称,备注等]"), @ApiImplicitParam(name = "dateLimit", value = "today,yesterday,lately7,lately30,month,year,/yyyy-MM-dd hh:mm:ss,yyyy-MM-dd hh:mm:ss/") }) - public CommonResult> getList(@RequestParam(required = false) String keywords, - @RequestParam(required = false) String dateLimit, - @ModelAttribute PageParamRequest pageParamRequest){ - return CommonResult.success(retailShopService.getList(keywords,dateLimit,pageParamRequest)); + public CommonResult> getList(@RequestParam(required = false) String keywords, + @RequestParam(required = false) String dateLimit, + @ModelAttribute PageParamRequest pageParamRequest) { + return CommonResult.success(retailShopService.getSpreadPeopleList(keywords, dateLimit, pageParamRequest)); } /** * 分销头部信息 - * @param keywords 搜索参数 + * @param keywords 搜索参数 * @param dateLimit 时间参数 - * @return */ @ApiOperation(value = "分销头部数据") @RequestMapping(value = "/statistics", method = RequestMethod.GET) @@ -92,14 +75,14 @@ public class RetailShopController { @ApiImplicitParam(name = "dateLimit", value = "today,yesterday,lately7,lately30,month,year,/yyyy-MM-dd hh:mm:ss,yyyy-MM-dd hh:mm:ss/") }) public CommonResult getStatistics(@RequestParam(required = false) String keywords, - @RequestParam(required = false) String dateLimit){ + @RequestParam(required = false) String dateLimit) { return CommonResult.success(retailShopService.getAdminStatistics(keywords, dateLimit)); } /** * 添加推广关系 * @param currentUserId 当前用户id - * @param spreadUserId 推广人用户id + * @param spreadUserId 推广人用户id * @return 结果 */ @ApiOperation(value = "添加推广关系") @@ -108,35 +91,35 @@ public class RetailShopController { @ApiImplicitParam(name = "currentUserId", value = "当前用户id"), @ApiImplicitParam(name = "spreadUserId", value = "推广人id") }) - public CommonResult save(Integer currentUserId, Integer spreadUserId){ + public CommonResult save(Integer currentUserId, Integer spreadUserId) { return CommonResult.success(userService.spread(currentUserId, spreadUserId)); } /** * 根据用户参数获取推广人列表 - * @param request 查询参数 + * @param request 查询参数 * @param pageParamRequest 分页参数 * @return 查询结果推广人列表 */ @ApiOperation(value = "根据条件获取推广人列表") @RequestMapping(value = "/spread/userlist", method = RequestMethod.POST) public CommonResult> getUserListBySpreadLevel(@RequestBody @Validated RetailShopStairUserRequest request, - @ModelAttribute PageParamRequest pageParamRequest){ - return CommonResult.success(CommonPage.restPage(userService.getUserListBySpreadLevel(request,pageParamRequest))); + @ModelAttribute PageParamRequest pageParamRequest) { + return CommonResult.success(CommonPage.restPage(userService.getUserListBySpreadLevel(request, pageParamRequest))); } /** * 根据参数获取推广订单列表 - * @param request 查询参数 + * @param request 查询参数 * @param pageParamRequest 分页参数 * @return 查询结果推广人订单列表 */ @ApiOperation(value = "根据条件获取推广人订单") @RequestMapping(value = "/spread/orderlist", method = RequestMethod.POST) public CommonResult> getOrdersBySpreadLevel(@RequestBody @Validated RetailShopStairUserRequest request, - @ModelAttribute PageParamRequest pageParamRequest){ - return CommonResult.success(CommonPage.restPage(userService.getOrderListBySpreadLevel(request,pageParamRequest))); + @ModelAttribute PageParamRequest pageParamRequest) { + return CommonResult.success(CommonPage.restPage(userService.getOrderListBySpreadLevel(request, pageParamRequest))); } /** @@ -146,7 +129,7 @@ public class RetailShopController { */ @ApiOperation(value = "清除上级推广人") @RequestMapping(value = "/spread/clean/{id}", method = RequestMethod.GET) - public CommonResult clearSpread(@PathVariable Integer id){ + public CommonResult clearSpread(@PathVariable Integer id) { return CommonResult.success(userService.clearSpread(id)); } @@ -156,7 +139,7 @@ public class RetailShopController { */ @ApiOperation(value = "分销配置信息获取") @RequestMapping(value = "/spread/manage/get", method = RequestMethod.GET) - public CommonResult getSpreadInfo(){ + public CommonResult getSpreadInfo() { return CommonResult.success(retailShopService.getManageInfo()); } @@ -167,7 +150,7 @@ public class RetailShopController { */ @ApiOperation(value = "分销管理信息保存") @RequestMapping(value = "/spread/manage/set", method = RequestMethod.POST) - public CommonResult setSpreadInfo(@RequestBody @Validated RetailShopRequest retailShopRequest){ + public CommonResult setSpreadInfo(@RequestBody @Validated RetailShopRequest retailShopRequest) { return CommonResult.success(retailShopService.setManageInfo(retailShopRequest)); } } diff --git a/crmeb/src/main/java/com/zbkj/crmeb/store/controller/StoreOrderController.java b/crmeb/src/main/java/com/zbkj/crmeb/store/controller/StoreOrderController.java index 78116a6c..8e2fef21 100644 --- a/crmeb/src/main/java/com/zbkj/crmeb/store/controller/StoreOrderController.java +++ b/crmeb/src/main/java/com/zbkj/crmeb/store/controller/StoreOrderController.java @@ -247,15 +247,9 @@ public class StoreOrderController { * @since 2020-09-01 */ @ApiOperation(value = "一键改价") - @RequestMapping(value = "/editPrice", method = RequestMethod.GET) - public CommonResult editOrderPrice( - @RequestParam String orderId, @RequestParam(required = true,defaultValue = "0") BigDecimal price){ - try { - if(price.compareTo(BigDecimal.ZERO) < 0) throw new CrmebException("请输入合法参数"); - }catch (Exception e){ - throw new CrmebException("价格参数错误"); - } - return CommonResult.success(storeOrderService.editPrice(orderId,price)); + @RequestMapping(value = "/editPrice", method = RequestMethod.POST) + public CommonResult editOrderPrice(@RequestBody @Validated StoreOrderEditPriceRequest request){ + return CommonResult.success(storeOrderService.editPrice(request)); } /** diff --git a/crmeb/src/main/java/com/zbkj/crmeb/store/controller/StoreProductController.java b/crmeb/src/main/java/com/zbkj/crmeb/store/controller/StoreProductController.java index b3d677c8..5f88fa9e 100644 --- a/crmeb/src/main/java/com/zbkj/crmeb/store/controller/StoreProductController.java +++ b/crmeb/src/main/java/com/zbkj/crmeb/store/controller/StoreProductController.java @@ -4,6 +4,7 @@ import com.common.CommonPage; import com.common.CommonResult; import com.common.PageParamRequest; import com.zbkj.crmeb.store.model.StoreProduct; +import com.zbkj.crmeb.store.request.StoreCopyProductRequest; import com.zbkj.crmeb.store.request.StoreProductRequest; import com.zbkj.crmeb.store.request.StoreProductSearchRequest; import com.zbkj.crmeb.store.request.StoreProductStockRequest; @@ -158,17 +159,11 @@ public class StoreProductController { /** * 上架 - * @param id integer id - * @author Mr.Zhang - * @since 2020-05-06 */ @ApiOperation(value = "上架") @RequestMapping(value = "/putOnShell/{id}", method = RequestMethod.GET) public CommonResult putOn(@PathVariable Integer id){ - StoreProduct storeProduct = new StoreProduct(); - storeProduct.setId(id); - storeProduct.setIsShow(true); - if(storeProductService.updateById(storeProduct)){ + if(storeProductService.putOnShelf(id)){ return CommonResult.success(); }else{ return CommonResult.failed(); @@ -177,17 +172,11 @@ public class StoreProductController { /** * 下架 - * @param id integer id - * @author Mr.Zhang - * @since 2020-05-06 */ @ApiOperation(value = "下架") @RequestMapping(value = "/offShell/{id}", method = RequestMethod.GET) public CommonResult offShell(@PathVariable Integer id){ - StoreProduct storeProduct = storeProductService.getById(id); - storeProduct.setIsShow(false); - if(storeProductService.updateById(storeProduct)){ - storeCartService.productStatusNotEnable(id); + if(storeProductService.offShelf(id)){ return CommonResult.success(); }else{ return CommonResult.failed(); @@ -278,9 +267,8 @@ public class StoreProductController { @ApiOperation(value = "复制平台商品") @RequestMapping(value = "/copy/product", method = RequestMethod.POST) - @ApiImplicitParam(name = "url", value = "URL", dataType = "String", required = true) - public CommonResult> copyProduct(@RequestParam @Valid String url) { - return CommonResult.success(storeProductService.copyProduct(url)); + public CommonResult> copyProduct(@RequestBody @Valid StoreCopyProductRequest request) { + return CommonResult.success(storeProductService.copyProduct(request.getUrl())); } } diff --git a/crmeb/src/main/java/com/zbkj/crmeb/store/request/RetailShopRequest.java b/crmeb/src/main/java/com/zbkj/crmeb/store/request/RetailShopRequest.java index 3aebce20..479acf20 100644 --- a/crmeb/src/main/java/com/zbkj/crmeb/store/request/RetailShopRequest.java +++ b/crmeb/src/main/java/com/zbkj/crmeb/store/request/RetailShopRequest.java @@ -28,11 +28,11 @@ public class RetailShopRequest { public RetailShopRequest() { } - @ApiModelProperty(value = "是否启用分销") + @ApiModelProperty(value = "是否启用分销:1-启用,0-禁止") @NotNull(message = "是否启用分销 不能为空") private String brokerageFuncStatus; - @ApiModelProperty(value = "分销模式") + @ApiModelProperty(value = "分销模式:1-指定分销,2-人人分销,3-满额分销") @NotNull(message = "分销模式 不能为空") private String storeBrokerageStatus; @@ -46,7 +46,7 @@ public class RetailShopRequest { @Range(min = 0, max = 100, message = "二级返佣比例在0-100中选择") private Integer storeBrokerageTwo; - @ApiModelProperty(value = "分销关系绑定") + @ApiModelProperty(value = "分销关系绑定:0-所有用户,1-新用户") @NotNull(message = "分销关系绑定 不能为空") private String brokerageBindind; @@ -64,8 +64,8 @@ public class RetailShopRequest { @Min(value = 0, message = "冻结时间最少为0天") private Integer extractTime; - @ApiModelProperty(value = "人人分销满足金额") - @NotNull(message = "人人分销满足金额 不能为空") - @DecimalMin(value = "0", message = "人人分销满足金额最小为0") - private BigDecimal storeBrokeragePrice; +// @ApiModelProperty(value = "满额分销满足金额") +// @NotNull(message = "满额分销满足金额 不能为空") +// @DecimalMin(value = "0", message = "满额分销满足金额最小为0") +// private BigDecimal storeBrokeragePrice; } diff --git a/crmeb/src/main/java/com/zbkj/crmeb/store/request/RetailShopStairUserRequest.java b/crmeb/src/main/java/com/zbkj/crmeb/store/request/RetailShopStairUserRequest.java index c2b8a689..7b065155 100644 --- a/crmeb/src/main/java/com/zbkj/crmeb/store/request/RetailShopStairUserRequest.java +++ b/crmeb/src/main/java/com/zbkj/crmeb/store/request/RetailShopStairUserRequest.java @@ -36,10 +36,6 @@ public class RetailShopStairUserRequest { @Range(min = 0, max = 3, message = "请选择正确的用户类型") private Integer type; - // 推广订单中的参数,公用对象 - @ApiModelProperty() - private String orderPriceId; - @ApiModelProperty(value = "用户id") @Min(value = 1, message = "用户id不能为空") private Integer uid; diff --git a/crmeb/src/main/java/com/zbkj/crmeb/store/request/StoreCopyProductRequest.java b/crmeb/src/main/java/com/zbkj/crmeb/store/request/StoreCopyProductRequest.java new file mode 100644 index 00000000..076a6f76 --- /dev/null +++ b/crmeb/src/main/java/com/zbkj/crmeb/store/request/StoreCopyProductRequest.java @@ -0,0 +1,34 @@ +package com.zbkj.crmeb.store.request; + +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; +import lombok.EqualsAndHashCode; +import lombok.experimental.Accessors; + +import javax.validation.constraints.NotBlank; +import javax.validation.constraints.NotNull; + +/** + * 复制商品请求对象 + * +---------------------------------------------------------------------- + * | CRMEB [ CRMEB赋能开发者,助力企业发展 ] + * +---------------------------------------------------------------------- + * | Copyright (c) 2016~2020 https://www.crmeb.com All rights reserved. + * +---------------------------------------------------------------------- + * | Licensed CRMEB并不是自由软件,未经许可不能去掉CRMEB相关版权 + * +---------------------------------------------------------------------- + * | Author: CRMEB Team + * +---------------------------------------------------------------------- + */ +@Data +@EqualsAndHashCode(callSuper = false) +@Accessors(chain = true) +@ApiModel(value="StoreCopyProductRequest对象", description="复制商品请求对象") +public class StoreCopyProductRequest { + + @ApiModelProperty(value = "复制商品地址") + @NotBlank(message = "复制商品地址 不能为空") + private String url; + +} diff --git a/crmeb/src/main/java/com/zbkj/crmeb/store/request/StoreOrderEditPriceRequest.java b/crmeb/src/main/java/com/zbkj/crmeb/store/request/StoreOrderEditPriceRequest.java new file mode 100644 index 00000000..e3381281 --- /dev/null +++ b/crmeb/src/main/java/com/zbkj/crmeb/store/request/StoreOrderEditPriceRequest.java @@ -0,0 +1,43 @@ +package com.zbkj.crmeb.store.request; + +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; +import lombok.EqualsAndHashCode; +import lombok.experimental.Accessors; + +import javax.validation.constraints.DecimalMin; +import javax.validation.constraints.Min; +import javax.validation.constraints.NotBlank; +import javax.validation.constraints.NotNull; +import java.math.BigDecimal; + +/** + * 订单改价请求对象 + * +---------------------------------------------------------------------- + * | CRMEB [ CRMEB赋能开发者,助力企业发展 ] + * +---------------------------------------------------------------------- + * | Copyright (c) 2016~2020 https://www.crmeb.com All rights reserved. + * +---------------------------------------------------------------------- + * | Licensed CRMEB并不是自由软件,未经许可不能去掉CRMEB相关版权 + * +---------------------------------------------------------------------- + * | Author: CRMEB Team + * +---------------------------------------------------------------------- + */ +@Data +@EqualsAndHashCode(callSuper = false) +@Accessors(chain = true) +@ApiModel(value="StoreOrderEditPriceRequest对象", description="订单改价请求对象") +public class StoreOrderEditPriceRequest { + private static final long serialVersionUID=1L; + + @ApiModelProperty(value = "订单号") + @NotBlank(message = "订单号不能为空") + private String orderId; + + @ApiModelProperty(value = "订单金额") + @DecimalMin(value = "0.00", message = "订单金额不能少于0.00") + @NotNull(message = "订单金额不能为空") + private BigDecimal price; + +} diff --git a/crmeb/src/main/java/com/zbkj/crmeb/store/request/StoreProductRelationRequest.java b/crmeb/src/main/java/com/zbkj/crmeb/store/request/StoreProductRelationRequest.java new file mode 100644 index 00000000..d69d12e9 --- /dev/null +++ b/crmeb/src/main/java/com/zbkj/crmeb/store/request/StoreProductRelationRequest.java @@ -0,0 +1,11 @@ +package com.zbkj.crmeb.store.request; + +/** + * @author stivepeim + * @title: StoreProductRelationRequest + * @projectName crmeb + * @description: TODO + * @date 2020/5/2811:35 + */ +public class StoreProductRelationRequest { +} diff --git a/crmeb/src/main/java/com/zbkj/crmeb/store/service/OrderTaskService.java b/crmeb/src/main/java/com/zbkj/crmeb/store/service/OrderTaskService.java index 38546823..a188fd9f 100644 --- a/crmeb/src/main/java/com/zbkj/crmeb/store/service/OrderTaskService.java +++ b/crmeb/src/main/java/com/zbkj/crmeb/store/service/OrderTaskService.java @@ -26,4 +26,19 @@ package com.zbkj.crmeb.store.service; void deleteByUser(); void orderPaySuccessAfter(); + + /** + * 自动取消未支付订单 + */ + void autoCancel(); + + /** + * 订单收货 + */ + void orderReceiving(); + + /** + * 订单自动完成 + */ + void autoComplete(); } diff --git a/crmeb/src/main/java/com/zbkj/crmeb/store/service/RetailShopService.java b/crmeb/src/main/java/com/zbkj/crmeb/store/service/RetailShopService.java index f4d5b4d8..e64e1236 100644 --- a/crmeb/src/main/java/com/zbkj/crmeb/store/service/RetailShopService.java +++ b/crmeb/src/main/java/com/zbkj/crmeb/store/service/RetailShopService.java @@ -7,8 +7,8 @@ import com.github.pagehelper.PageInfo; import com.zbkj.crmeb.store.request.RetailShopRequest; import com.zbkj.crmeb.store.request.RetailShopStairUserRequest; import com.zbkj.crmeb.store.response.RetailShopStatisticsResponse; -import com.zbkj.crmeb.store.response.RetailShopUserResponse; import com.zbkj.crmeb.user.model.User; +import com.zbkj.crmeb.user.response.SpreadUserResponse; import com.zbkj.crmeb.user.response.UserResponse; import java.util.List; @@ -28,13 +28,13 @@ import java.util.List; public interface RetailShopService extends IService { /** - * 获取分销列表 - * @param keywords - * @param dateLimit - * @param pageRequest + * 分销员列表 + * @param keywords 搜索参数 + * @param dateLimit 时间参数 + * @param pageRequest 分页参数 * @return */ - CommonPage getList(String keywords, String dateLimit, PageParamRequest pageRequest); + CommonPage getSpreadPeopleList(String keywords, String dateLimit, PageParamRequest pageRequest); /** * 获取分销头部数据 diff --git a/crmeb/src/main/java/com/zbkj/crmeb/store/service/StoreCartService.java b/crmeb/src/main/java/com/zbkj/crmeb/store/service/StoreCartService.java index 1a5cbf57..621366e1 100644 --- a/crmeb/src/main/java/com/zbkj/crmeb/store/service/StoreCartService.java +++ b/crmeb/src/main/java/com/zbkj/crmeb/store/service/StoreCartService.java @@ -27,10 +27,10 @@ public interface StoreCartService extends IService { /** * 根据有效标识符获取出数据 * @param pageParamRequest 分页参数 - * @param cart 购物车参数 + * @param isValid 是否失效 * @return 购物车列表 */ - List getList(PageParamRequest pageParamRequest, StoreCart cart, boolean isValid); + List getList(PageParamRequest pageParamRequest, boolean isValid); /** * 根据用户id和购物车ids查询购物车集合 @@ -93,7 +93,7 @@ public interface StoreCartService extends IService { * @param productId 商品id * @return 跟新结果 */ - boolean productStatusNotEnable(Integer productId); + Boolean productStatusNotEnable(Integer productId); /** * 购物车重选提交 @@ -101,4 +101,10 @@ public interface StoreCartService extends IService { * @return 提交结果 */ boolean resetCart(CartResetRequest resetRequest); + + /** + * 对应sku购物车生效 + * @param skuIdList skuIdList + */ + Boolean productStatusNoEnable(List skuIdList); } diff --git a/crmeb/src/main/java/com/zbkj/crmeb/store/service/StoreOrderInfoService.java b/crmeb/src/main/java/com/zbkj/crmeb/store/service/StoreOrderInfoService.java index 92925a01..bf50c171 100644 --- a/crmeb/src/main/java/com/zbkj/crmeb/store/service/StoreOrderInfoService.java +++ b/crmeb/src/main/java/com/zbkj/crmeb/store/service/StoreOrderInfoService.java @@ -27,7 +27,7 @@ public interface StoreOrderInfoService extends IService { HashMap> getMapInId(List orderIdList); - public List getOrderListByOrderId(Integer orderId); + List getOrderListByOrderId(Integer orderId); /** * 批量添加订单详情 diff --git a/crmeb/src/main/java/com/zbkj/crmeb/store/service/StoreOrderService.java b/crmeb/src/main/java/com/zbkj/crmeb/store/service/StoreOrderService.java index 98577ffe..ba68b8d8 100644 --- a/crmeb/src/main/java/com/zbkj/crmeb/store/service/StoreOrderService.java +++ b/crmeb/src/main/java/com/zbkj/crmeb/store/service/StoreOrderService.java @@ -6,10 +6,7 @@ import com.github.pagehelper.PageInfo; import com.zbkj.crmeb.express.vo.ExpressSheetVo; import com.zbkj.crmeb.express.vo.LogisticsResultVo; import com.zbkj.crmeb.store.model.StoreOrder; -import com.zbkj.crmeb.store.request.RetailShopStairUserRequest; -import com.zbkj.crmeb.store.request.StoreOrderRefundRequest; -import com.zbkj.crmeb.store.request.StoreOrderSearchRequest; -import com.zbkj.crmeb.store.request.StoreOrderSendRequest; +import com.zbkj.crmeb.store.request.*; import com.zbkj.crmeb.store.response.*; import com.zbkj.crmeb.system.request.SystemWriteOffOrderSearchRequest; import com.zbkj.crmeb.system.response.SystemWriteOffOrderResponse; @@ -143,11 +140,10 @@ public interface StoreOrderService extends IService { /** * 更改订单价格 - * @param orderId 订单id wx开头 - * @param price 待更改价格 + * @param request 订单改价对象 * @return 更改结果 */ - boolean editPrice(String orderId,BigDecimal price); + boolean editPrice(StoreOrderEditPriceRequest request); /** * 确认付款 @@ -214,4 +210,27 @@ public interface StoreOrderService extends IService { * @param orderNo 订单编号 */ Boolean updatePaid(String orderNo); + + Map getMapInOrderNo(List orderNoList); + + /** + * 获取推广订单总金额 + * @param orderNoList 订单编号列表 + * @return + */ + BigDecimal getSpreadOrderTotalPriceByOrderList(List orderNoList); + + /** + * 获取所有收货订单id集合 + * @return + */ + List findIdAndUidListByReceipt(); + + /** + * 根据用户uid查询所有已支付订单 + * @param userId 用户uid + * @param pageParamRequest 分页参数 + * @return + */ + List findPaidListByUid(Integer userId, PageParamRequest pageParamRequest); } diff --git a/crmeb/src/main/java/com/zbkj/crmeb/store/service/StoreOrderStatusService.java b/crmeb/src/main/java/com/zbkj/crmeb/store/service/StoreOrderStatusService.java index 95ae2c55..08537577 100644 --- a/crmeb/src/main/java/com/zbkj/crmeb/store/service/StoreOrderStatusService.java +++ b/crmeb/src/main/java/com/zbkj/crmeb/store/service/StoreOrderStatusService.java @@ -36,4 +36,11 @@ public interface StoreOrderStatusService extends IService { * @return 订单状态结果 */ List getByEntity(StoreOrderStatus storeOrderStatus); + + /** + * 根据订单id获取最后一条记录 + * @param orderId 订单id + * @return + */ + StoreOrderStatus getLastByOrderId(Integer orderId); } diff --git a/crmeb/src/main/java/com/zbkj/crmeb/store/service/StoreOrderTaskService.java b/crmeb/src/main/java/com/zbkj/crmeb/store/service/StoreOrderTaskService.java index 650f0d79..0f31f9b5 100644 --- a/crmeb/src/main/java/com/zbkj/crmeb/store/service/StoreOrderTaskService.java +++ b/crmeb/src/main/java/com/zbkj/crmeb/store/service/StoreOrderTaskService.java @@ -15,19 +15,21 @@ import com.zbkj.crmeb.store.model.StoreOrder; * | Author: CRMEB Team * +---------------------------------------------------------------------- */ - public interface StoreOrderTaskService { +public interface StoreOrderTaskService { - Boolean cancelByUser(StoreOrder storeOrder); + Boolean cancelByUser(StoreOrder storeOrder); - Boolean refundApply(StoreOrder storeOrder); + Boolean complete(StoreOrder storeOrder); - Boolean complete(StoreOrder storeOrder); + Boolean takeByUser(StoreOrder storeOrder); - Boolean takeByUser(StoreOrder storeOrder); + Boolean deleteByUser(StoreOrder storeOrder); - Boolean deleteByUser(StoreOrder storeOrder); + Boolean refundOrder(StoreOrder storeOrder); - Boolean refundOrder(StoreOrder storeOrder); + Boolean paySuccessAfter(StoreOrder storeOrder); - Boolean paySuccessAfter(StoreOrder storeOrder); - } + Boolean autoCancel(StoreOrder storeOrder); + + Boolean orderReceiving(Integer orderId); +} diff --git a/crmeb/src/main/java/com/zbkj/crmeb/store/service/StoreProductReplyService.java b/crmeb/src/main/java/com/zbkj/crmeb/store/service/StoreProductReplyService.java index cbfa0740..13321957 100644 --- a/crmeb/src/main/java/com/zbkj/crmeb/store/service/StoreProductReplyService.java +++ b/crmeb/src/main/java/com/zbkj/crmeb/store/service/StoreProductReplyService.java @@ -46,6 +46,14 @@ public interface StoreProductReplyService extends IService { */ List isReply(String unique,String replayType, Integer orderId); + /** + * 查询是否已经回复 + * @param unique skuId + * @param orderId 订单id + * @return Boolean + */ + Boolean isReply(String unique, Integer orderId); + /** * 获取商品评论列表 * @param productId 商品ID diff --git a/crmeb/src/main/java/com/zbkj/crmeb/store/service/StoreProductService.java b/crmeb/src/main/java/com/zbkj/crmeb/store/service/StoreProductService.java index 0b38bd06..64138d70 100644 --- a/crmeb/src/main/java/com/zbkj/crmeb/store/service/StoreProductService.java +++ b/crmeb/src/main/java/com/zbkj/crmeb/store/service/StoreProductService.java @@ -175,4 +175,17 @@ public interface StoreProductService extends IService { * @param type 类型:add—添加,sub—扣减 */ Boolean operationStock(Integer id, Integer num, String type); + + /** + * 下架 + * @param id 商品id + */ + Boolean offShelf(Integer id); + + /** + * 上架 + * @param id 商品id + * @return Boolean + */ + Boolean putOnShelf(Integer id); } diff --git a/crmeb/src/main/java/com/zbkj/crmeb/store/service/impl/OrderTaskServiceImpl.java b/crmeb/src/main/java/com/zbkj/crmeb/store/service/impl/OrderTaskServiceImpl.java index 0337ba18..42a71210 100644 --- a/crmeb/src/main/java/com/zbkj/crmeb/store/service/impl/OrderTaskServiceImpl.java +++ b/crmeb/src/main/java/com/zbkj/crmeb/store/service/impl/OrderTaskServiceImpl.java @@ -1,6 +1,7 @@ package com.zbkj.crmeb.store.service.impl; +import cn.hutool.core.collection.CollUtil; import cn.hutool.core.util.ObjectUtil; import com.alibaba.fastjson.JSONObject; import com.constants.Constants; @@ -8,11 +9,13 @@ import com.exception.CrmebException; import com.utils.DateUtil; import com.utils.RedisUtil; import com.zbkj.crmeb.store.model.StoreOrder; -import com.zbkj.crmeb.store.service.OrderTaskService; -import com.zbkj.crmeb.store.service.StoreOrderService; -import com.zbkj.crmeb.store.service.StoreOrderTaskService; +import com.zbkj.crmeb.store.model.StoreOrderStatus; +import com.zbkj.crmeb.store.model.StoreProductReply; +import com.zbkj.crmeb.store.service.*; import com.zbkj.crmeb.store.utilService.OrderUtils; -import com.zbkj.crmeb.task.order.OrderRefundTask; +import com.zbkj.crmeb.store.vo.StoreOrderInfoVo; +import com.zbkj.crmeb.user.model.User; +import com.zbkj.crmeb.user.service.UserService; import com.zbkj.crmeb.wechat.service.impl.WechatSendMessageForMinService; import com.zbkj.crmeb.wechat.vo.WechatSendMessageForGetPackage; import com.zbkj.crmeb.wechat.vo.WechatSendMessageForOrderCancel; @@ -20,6 +23,9 @@ import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; +import org.springframework.transaction.support.TransactionTemplate; + +import java.util.List; /** * StoreOrderServiceImpl 接口实现 @@ -53,6 +59,21 @@ public class OrderTaskServiceImpl implements OrderTaskService { @Autowired private OrderUtils orderUtils; + @Autowired + private StoreOrderStatusService storeOrderStatusService; + + @Autowired + private StoreOrderInfoService storeOrderInfoService; + + @Autowired + private UserService userService; + + @Autowired + private StoreProductReplyService storeProductReplyService; + + @Autowired + private TransactionTemplate transactionTemplate; + /** * 用户取消订单 * @author Mr.Zhang @@ -265,4 +286,151 @@ public class OrderTaskServiceImpl implements OrderTaskService { } } } + + /** + * 自动取消未支付订单 + */ + @Override + public void autoCancel() { + String redisKey = Constants.ORDER_AUTO_CANCEL_KEY; + Long size = redisUtil.getListSize(redisKey); + logger.info("OrderTaskServiceImpl.autoCancel | size:" + size); + if(size < 1){ + return; + } + for (int i = 0; i < size; i++) { + //如果10秒钟拿不到一个数据,那么退出循环 + Object data = redisUtil.getRightPop(redisKey, 10L); + if(null == data){ + continue; + } + try{ + StoreOrder storeOrder = storeOrderService.getByOderId(String.valueOf(data)); + if (ObjectUtil.isNull(storeOrder)) { + logger.error("OrderTaskServiceImpl.autoCancel | 订单不存在,orderNo: " + data); + throw new CrmebException("订单不存在,orderNo: " + data); + } + boolean result = storeOrderTaskService.autoCancel(storeOrder); + if(!result){ + redisUtil.lPush(redisKey, data); + } + }catch (Exception e){ + e.printStackTrace(); + redisUtil.lPush(redisKey, data); + } + } + } + + /** + * 订单收货 + */ + @Override + public void orderReceiving() { + String redisKey = Constants.ORDER_TASK_REDIS_KEY_AFTER_TAKE_BY_USER; + Long size = redisUtil.getListSize(redisKey); + logger.info("OrderTaskServiceImpl.orderReceiving | size:" + size); + if(size < 1){ + return; + } + for (int i = 0; i < size; i++) { + //如果10秒钟拿不到一个数据,那么退出循环 + Object id = redisUtil.getRightPop(redisKey, 10L); + if(null == id){ + continue; + } + try{ + Boolean result = storeOrderTaskService.orderReceiving(Integer.valueOf(id.toString())); + if(!result){ + redisUtil.lPush(redisKey, id); + } + }catch (Exception e){ + redisUtil.lPush(redisKey, id); + } + } + } + + /** + * 订单自动完成 + */ + @Override + public void autoComplete() { + // 查找所有收获状态订单 + List orderList = storeOrderService.findIdAndUidListByReceipt(); + if (CollUtil.isEmpty(orderList)) { + return ; + } + logger.info("OrderTaskServiceImpl.autoComplete | size:0"); + + // 根据订单状态表判断订单是否可以自动完成 + for (StoreOrder order : orderList) { + StoreOrderStatus orderStatus = storeOrderStatusService.getLastByOrderId(order.getId()); + if (!orderStatus.getChangeType().equals("user_take_delivery")) { + logger.error("订单自动完成:订单记录最后一条不是收货状态,orderId = " + order.getId()); + continue ; + } + // 判断是否到自动完成时间(收货时间向后偏移7天) + String comTime = DateUtil.addDay(orderStatus.getCreateTime(), 7, Constants.DATE_FORMAT); + int compareDate = DateUtil.compareDate(comTime, DateUtil.nowDateTime(Constants.DATE_FORMAT), Constants.DATE_FORMAT); + if (compareDate < 0) { + continue ; + } + + /** + * --------------- + * 自动好评转完成 + * --------------- + */ + // 获取订单详情 + List orderInfoVoList = storeOrderInfoService.getOrderListByOrderId(order.getId()); + if (CollUtil.isEmpty(orderInfoVoList)) { + logger.error("订单自动完成:无订单详情数据,orderId = " + order.getId()); + continue; + } + List replyList = CollUtil.newArrayList(); + User user = userService.getById(order.getUid()); + // 生成评论 + for (StoreOrderInfoVo orderInfo : orderInfoVoList) { + // 判断是否已评论 + if (orderInfo.getInfo().getIsReply().equals(1)) { + continue; + } + String replyType = Constants.STORE_REPLY_TYPE_PRODUCT; + if (ObjectUtil.isNotNull(orderInfo.getInfo().getSeckillId()) && orderInfo.getInfo().getSeckillId() > 0) { + replyType = Constants.STORE_REPLY_TYPE_SECKILL; + } + if (ObjectUtil.isNotNull(orderInfo.getInfo().getBargainId()) && orderInfo.getInfo().getBargainId() > 0) { + replyType = Constants.STORE_REPLY_TYPE_BARGAIN; + } + if (ObjectUtil.isNotNull(orderInfo.getInfo().getCombinationId()) && orderInfo.getInfo().getCombinationId() > 0) { + replyType = Constants.STORE_REPLY_TYPE_PINTUAN; + } + StoreProductReply reply = new StoreProductReply(); + reply.setUid(order.getUid()); + reply.setOid(order.getId()); + reply.setProductId(orderInfo.getProductId()); + reply.setUnique(orderInfo.getUnique()); + reply.setReplyType(replyType); + reply.setProductScore(5); + reply.setServiceScore(5); + reply.setComment(""); + reply.setPics(""); + reply.setNickname(user.getNickname()); + reply.setAvatar(user.getAvatar()); + reply.setSku(orderInfo.getInfo().getProductInfo().getAttrInfo().getSuk()); + reply.setCreateTime(DateUtil.nowDateTime()); + replyList.add(reply); + } + order.setStatus(Constants.ORDER_STATUS_INT_COMPLETE); + Boolean execute = transactionTemplate.execute(e -> { + storeOrderService.updateById(order); + storeProductReplyService.saveBatch(replyList); + return Boolean.TRUE; + }); + if (execute) { + redisUtil.lPush(Constants.ORDER_TASK_REDIS_KEY_AFTER_COMPLETE_BY_USER, order.getId()); + } else { + logger.error("订单自动完成:更新数据库失败,orderId = " + order.getId()); + } + } + } } diff --git a/crmeb/src/main/java/com/zbkj/crmeb/store/service/impl/RetailShopServiceImpl.java b/crmeb/src/main/java/com/zbkj/crmeb/store/service/impl/RetailShopServiceImpl.java index 8259dab6..26b6a2f1 100644 --- a/crmeb/src/main/java/com/zbkj/crmeb/store/service/impl/RetailShopServiceImpl.java +++ b/crmeb/src/main/java/com/zbkj/crmeb/store/service/impl/RetailShopServiceImpl.java @@ -1,6 +1,7 @@ package com.zbkj.crmeb.store.service.impl; import cn.hutool.core.collection.CollUtil; +import cn.hutool.core.util.ObjectUtil; import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; import com.common.CommonPage; import com.common.PageParamRequest; @@ -8,27 +9,32 @@ import com.exception.CrmebException; import com.github.pagehelper.Page; import com.github.pagehelper.PageHelper; import com.github.pagehelper.PageInfo; +import com.zbkj.crmeb.finance.response.UserExtractResponse; import com.zbkj.crmeb.finance.service.UserExtractService; import com.zbkj.crmeb.store.model.StoreOrder; import com.zbkj.crmeb.store.request.RetailShopRequest; import com.zbkj.crmeb.store.request.RetailShopStairUserRequest; import com.zbkj.crmeb.store.response.RetailShopStatisticsResponse; -import com.zbkj.crmeb.store.response.RetailShopUserResponse; import com.zbkj.crmeb.store.service.RetailShopService; import com.zbkj.crmeb.store.service.StoreOrderService; import com.zbkj.crmeb.system.service.SystemConfigService; import com.zbkj.crmeb.user.dao.UserDao; import com.zbkj.crmeb.user.model.User; +import com.zbkj.crmeb.user.model.UserBrokerageRecord; import com.zbkj.crmeb.user.request.UserSearchRequest; +import com.zbkj.crmeb.user.response.SpreadUserResponse; import com.zbkj.crmeb.user.response.UserResponse; import com.zbkj.crmeb.user.service.UserBillService; +import com.zbkj.crmeb.user.service.UserBrokerageRecordService; import com.zbkj.crmeb.user.service.UserService; +import org.springframework.beans.BeanUtils; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; import java.math.BigDecimal; import java.util.ArrayList; import java.util.List; +import java.util.Optional; import java.util.stream.Collectors; /** @@ -61,55 +67,72 @@ public class RetailShopServiceImpl extends ServiceImpl implements @Autowired private SystemConfigService systemConfigService; + @Autowired + private UserBrokerageRecordService userBrokerageRecordService; + /** * 获取分销列表 - * @param keywords - * @param dateLimit - * @param pageRequest + * @param keywords 搜索参数 + * @param dateLimit 时间参数 + * @param pageRequest 分页参数 * @return */ @Override - public CommonPage getList(String keywords, String dateLimit, PageParamRequest pageRequest) { + public CommonPage getSpreadPeopleList(String keywords, String dateLimit, PageParamRequest pageRequest) { + // 获取分销模式 storeBrokerageStatus 1-指定分销,2-人人分销 + String storeBrokerageStatus = systemConfigService.getValueByKeyException("store_brokerage_status"); Page pageUserPage = PageHelper.startPage(pageRequest.getPage(), pageRequest.getLimit()); + // id,头像,昵称,姓名,电话,推广用户数,推广订单数,推广订单额,佣金总金额,已提现金额,提现次数,未提现金额,上级推广人 + PageInfo userPageInfo = userService.getAdminSpreadPeopleList(storeBrokerageStatus, keywords, dateLimit, pageRequest); -// User currentUser = userService.getUserByEntity(); - UserSearchRequest userSearchRequest = new UserSearchRequest(); - userSearchRequest.setStatus(true); - userSearchRequest.setIsPromoter(true); - userSearchRequest.setKeywords(keywords); - userSearchRequest.setDateLimit(dateLimit); - PageInfo userResponses = userService.getList(userSearchRequest,pageRequest); - List retailShopUserResponses = new ArrayList<>(); - for (UserResponse rp:userResponses.getList()) { - RetailShopUserResponse nrp = new RetailShopUserResponse( - rp.getUid(),rp.getAccount(),rp.getPwd(),rp.getRealName(),rp.getBirthday(),rp.getCardId(),rp.getMark(), - rp.getPartnerId(),rp.getGroupId(),rp.getGroupName(),rp.getTagName(),rp.getNickname(),rp.getAvatar(),rp.getPhone(), - rp.getAddIp(),rp.getLastIp(),rp.getNowMoney(),rp.getBrokeragePrice(),rp.getIntegral(),rp.getExperience(),rp.getSignNum(), - rp.getStatus(),rp.getLevel(),rp.getSpreadUid(),rp.getSpreadTime(),rp.getSpreadNickname(),rp.getUserType(),rp.getIsPromoter(), - rp.getPayCount(),rp.getSpreadCount(),rp.getAddres(),rp.getAdminid(),rp.getLoginType(),rp.getUpdateTime(),rp.getCreateTime(), - rp.getLastLoginTime(),rp.getCleanTime(),null,null); - retailShopUserResponses.add(nrp); + if (CollUtil.isEmpty(userPageInfo.getList())) { +// return CommonPage.restPage(userPageInfo); } + List userList = userPageInfo.getList(); + List responseList = CollUtil.newArrayList(); + userList.forEach(user -> { + SpreadUserResponse userResponse = new SpreadUserResponse(); + BeanUtils.copyProperties(user, userResponse); + // 上级推广员名称 + userResponse.setSpreadNickname("无"); + if (ObjectUtil.isNotNull(user.getSpreadUid()) && user.getSpreadUid() > 0) { + User spreadUser = userService.getById(user.getSpreadUid()); + userResponse.setSpreadNickname(Optional.ofNullable(spreadUser.getNickname()).orElse("")); + } - for (RetailShopUserResponse rShopUser:retailShopUserResponses) { - // 推广用户数量 -// List userIds = new ArrayList<>(); - List userIds = userResponses.getList().stream().map(e -> { - return e.getUid(); - }).collect(Collectors.toList()); -// userIds.add(currentUser.getUid()); -// rShopUser.setSpreadPeopleCount(userService.getSpreadPeopleIdList(userIds).size()); - rShopUser.setSpreadPeopleCount(userService.getSpreadPeopleIdList(userIds).size()); - // 获取提现数据 - rShopUser.setUserExtractResponse(userExtractService.getUserExtractByUserId(rShopUser.getUid())); - // 获取订单数据 - rShopUser.setRetailShopOrderDataResponse(storeOrderService.getOrderDataByUserId(rShopUser.getUid())); - // 佣金数据 - rShopUser.setBrokerageMoney(userBillService.getDataByUserId(rShopUser.getUid())); - } - PageInfo responsePageInfo = CommonPage.copyPageInfo(pageUserPage, retailShopUserResponses); - responsePageInfo.setTotal(userResponses.getTotal()); - responsePageInfo.setPages(userResponses.getPages()); + List recordList = userBrokerageRecordService.getSpreadListByUid(user.getUid()); + if (CollUtil.isEmpty(recordList)) { + // 推广订单数 + userResponse.setSpreadOrderNum(0); + // 推广订单额 + userResponse.setSpreadOrderTotalPrice(BigDecimal.ZERO); + // 佣金总金额 + userResponse.setTotalBrokeragePrice(BigDecimal.ZERO); + // 已提现金额 + userResponse.setExtractCountPrice(BigDecimal.ZERO); + // 提现次数 + userResponse.setExtractCountNum(0); + } else { + // 推广订单数 + userResponse.setSpreadOrderNum(recordList.size()); + // 佣金总金额 + userResponse.setTotalBrokeragePrice(recordList.stream().map(UserBrokerageRecord::getPrice).reduce(BigDecimal.ZERO, BigDecimal::add)); + // 推广订单额 + List orderNoList = recordList.stream().map(UserBrokerageRecord::getLinkId).collect(Collectors.toList()); + BigDecimal spreadOrderTotalPrice = storeOrderService.getSpreadOrderTotalPriceByOrderList(orderNoList); + userResponse.setSpreadOrderTotalPrice(spreadOrderTotalPrice); + + UserExtractResponse extractResponse = userExtractService.getUserExtractByUserId(user.getUid()); + // 已提现金额 + userResponse.setExtractCountPrice(extractResponse.getExtractCountPrice()); + // 提现次数 + userResponse.setExtractCountNum(extractResponse.getExtractCountNum()); + } + responseList.add(userResponse); + }); + PageInfo responsePageInfo = CommonPage.copyPageInfo(pageUserPage, responseList); + responsePageInfo.setTotal(userPageInfo.getTotal()); + responsePageInfo.setPages(userPageInfo.getPages()); return CommonPage.restPage(responsePageInfo); } @@ -157,8 +180,8 @@ public class RetailShopServiceImpl extends ServiceImpl implements response.setUserExtractMinPrice(new BigDecimal(systemConfigService.getValueByKey(keys.get(4)))); response.setUserExtractBank(systemConfigService.getValueByKey(keys.get(5)).replace("\\n","\n")); response.setExtractTime(Integer.parseInt(systemConfigService.getValueByKey(keys.get(6)))); - response.setStoreBrokeragePrice(new BigDecimal(systemConfigService.getValueByKey(keys.get(7)))); - response.setBrokerageBindind(systemConfigService.getValueByKey(keys.get(8))); +// response.setStoreBrokeragePrice(new BigDecimal(systemConfigService.getValueByKey(keys.get(7)))); + response.setBrokerageBindind(systemConfigService.getValueByKey(keys.get(7))); return response; } @@ -181,8 +204,8 @@ public class RetailShopServiceImpl extends ServiceImpl implements systemConfigService.updateOrSaveValueByName(keys.get(4), retailShopRequest.getUserExtractMinPrice().toString()); systemConfigService.updateOrSaveValueByName(keys.get(5), retailShopRequest.getUserExtractBank()); systemConfigService.updateOrSaveValueByName(keys.get(6), retailShopRequest.getExtractTime().toString()); - systemConfigService.updateOrSaveValueByName(keys.get(7), retailShopRequest.getStoreBrokeragePrice().toString()); - systemConfigService.updateOrSaveValueByName(keys.get(8), retailShopRequest.getBrokerageBindind()); +// systemConfigService.updateOrSaveValueByName(keys.get(7), retailShopRequest.getStoreBrokeragePrice().toString()); + systemConfigService.updateOrSaveValueByName(keys.get(7), retailShopRequest.getBrokerageBindind()); return true; } @@ -195,8 +218,11 @@ public class RetailShopServiceImpl extends ServiceImpl implements @Override public RetailShopStatisticsResponse getAdminStatistics(String keywords, String dateLimit) { + // 获取分销模式 storeBrokerageStatus 1-指定分销,2-人人分销 + String storeBrokerageStatus = systemConfigService.getValueByKeyException("store_brokerage_status"); + // 获取分销人数 - List userDisList = userService.findDistributionList(keywords, dateLimit); + List userDisList = userService.findDistributionList(keywords, dateLimit, storeBrokerageStatus); if (CollUtil.isEmpty(userDisList)) { return new RetailShopStatisticsResponse(0, 0, 0, BigDecimal.ZERO, 0, BigDecimal.ZERO); } @@ -231,7 +257,7 @@ public class RetailShopServiceImpl extends ServiceImpl implements keys.add("user_extract_min_price"); keys.add("user_extract_bank"); keys.add("extract_time"); - keys.add("store_brokerage_price"); +// keys.add("store_brokerage_price"); keys.add("brokerage_bindind"); return keys; } diff --git a/crmeb/src/main/java/com/zbkj/crmeb/store/service/impl/StoreCartServiceImpl.java b/crmeb/src/main/java/com/zbkj/crmeb/store/service/impl/StoreCartServiceImpl.java index e1a9efff..1fff6b72 100644 --- a/crmeb/src/main/java/com/zbkj/crmeb/store/service/impl/StoreCartServiceImpl.java +++ b/crmeb/src/main/java/com/zbkj/crmeb/store/service/impl/StoreCartServiceImpl.java @@ -4,6 +4,7 @@ import cn.hutool.core.collection.CollUtil; import cn.hutool.core.util.ObjectUtil; import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; +import com.baomidou.mybatisplus.core.conditions.update.LambdaUpdateWrapper; import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; import com.common.MyRecord; import com.common.PageParamRequest; @@ -81,12 +82,11 @@ public class StoreCartServiceImpl extends ServiceImpl i /** * 列表 * @param pageParamRequest 分页类参数 - * @author Mr.Zhang edite by stivepeim 2020-7-4 - * @since 2020-05-28 + * @param isValid 是否失效 * @return List */ @Override - public List getList(PageParamRequest pageParamRequest, StoreCart cart, boolean isValid) { + public List getList(PageParamRequest pageParamRequest, boolean isValid) { PageHelper.startPage(pageParamRequest.getPage(), pageParamRequest.getLimit()); //带 StoreCart 类的多条件查询 LambdaQueryWrapper lambdaQueryWrapper = new LambdaQueryWrapper<>(); @@ -108,6 +108,7 @@ public class StoreCartServiceImpl extends ServiceImpl i BeanUtils.copyProperties(storeCart,storeCartResponse); storeCartResponse.setAttrStatus(false); response.add(storeCartResponse); + continue ; } BeanUtils.copyProperties(storeCart,storeCartResponse); StoreProductResponse product = storeProductService.getByProductId(storeCart.getProductId()); @@ -341,13 +342,11 @@ public class StoreCartServiceImpl extends ServiceImpl i * @return 跟新结果 */ @Override - public boolean productStatusNotEnable(Integer productId) { -// StoreProductResponse storeProductResponse = storeProductService.getByProductId(productId); -// if(null == storeProductResponse) return false; + public Boolean productStatusNotEnable(Integer productId) { StoreCart storeCartPram = new StoreCart(); storeCartPram.setProductId(productId); List existStoreCartProducts = getByEntity(storeCartPram); - if(null == existStoreCartProducts) return false; + if(null == existStoreCartProducts) return true; existStoreCartProducts = existStoreCartProducts.stream().map(e->{ e.setStatus(false); return e; @@ -376,6 +375,20 @@ public class StoreCartServiceImpl extends ServiceImpl i return updateResult; } + /** + * 对应sku购物车生效 + * @param skuIdList skuIdList + * @return Boolean + */ + @Override + public Boolean productStatusNoEnable(List skuIdList) { + LambdaUpdateWrapper lqw = new LambdaUpdateWrapper<>(); + lqw.set(StoreCart::getStatus, true); + lqw.in(StoreCart::getProductAttrUnique, skuIdList); + lqw.eq(StoreCart::getIsNew, false); + return update(lqw); + } + ///////////////////////////////////////////////////////////////////自定义方法 /** * 购物车商品种类数量 diff --git a/crmeb/src/main/java/com/zbkj/crmeb/store/service/impl/StoreOrderInfoServiceImpl.java b/crmeb/src/main/java/com/zbkj/crmeb/store/service/impl/StoreOrderInfoServiceImpl.java index 64575bc3..eb7bc753 100644 --- a/crmeb/src/main/java/com/zbkj/crmeb/store/service/impl/StoreOrderInfoServiceImpl.java +++ b/crmeb/src/main/java/com/zbkj/crmeb/store/service/impl/StoreOrderInfoServiceImpl.java @@ -123,13 +123,13 @@ public class StoreOrderInfoServiceImpl extends ServiceImpl storeOrderInfoVoList = new ArrayList<>(); for (StoreOrderInfo storeOrderInfo : systemStoreStaffList) { //解析商品详情JSON - StoreOrderInfoVo StoreOrderInfoVo = new StoreOrderInfoVo(); - BeanUtils.copyProperties(storeOrderInfo, StoreOrderInfoVo, "info"); - StoreOrderInfoVo.setInfo(JSON.parseObject(storeOrderInfo.getInfo(),StoreCartResponse.class)); - StoreOrderInfoVo.getInfo().setIsReply( - storeProductReplyService.isReply(StoreOrderInfoVo.getUnique(),"product",StoreOrderInfoVo.getOrderId()).size() + StoreOrderInfoVo storeOrderInfoVo = new StoreOrderInfoVo(); + BeanUtils.copyProperties(storeOrderInfo, storeOrderInfoVo, "info"); + storeOrderInfoVo.setInfo(JSON.parseObject(storeOrderInfo.getInfo(),StoreCartResponse.class)); + storeOrderInfoVo.getInfo().setIsReply( + storeProductReplyService.isReply(storeOrderInfoVo.getUnique(), storeOrderInfoVo.getOrderId()) ? 1 : 0 ); - storeOrderInfoVoList.add(StoreOrderInfoVo); + storeOrderInfoVoList.add(storeOrderInfoVo); } return storeOrderInfoVoList; } diff --git a/crmeb/src/main/java/com/zbkj/crmeb/store/service/impl/StoreOrderRefundServiceImpl.java b/crmeb/src/main/java/com/zbkj/crmeb/store/service/impl/StoreOrderRefundServiceImpl.java index 14cce286..90a8eabb 100644 --- a/crmeb/src/main/java/com/zbkj/crmeb/store/service/impl/StoreOrderRefundServiceImpl.java +++ b/crmeb/src/main/java/com/zbkj/crmeb/store/service/impl/StoreOrderRefundServiceImpl.java @@ -104,10 +104,11 @@ public class StoreOrderRefundServiceImpl extends ServiceImpl 0) { throw new CrmebException("退款金额大于支付金额,请修改退款金额"); } + if (request.getAmount().compareTo(BigDecimal.ZERO) == 0) { + if (storeOrder.getPayPrice().compareTo(BigDecimal.ZERO) != 0) { + throw new CrmebException("退款金额不能为0,请修改退款金额"); + } + } //用户 User user = userService.getById(storeOrder.getUid()); //退款 - if (storeOrder.getPayType().equals(Constants.PAY_TYPE_WE_CHAT)) { + if (storeOrder.getPayType().equals(Constants.PAY_TYPE_WE_CHAT) && request.getAmount().compareTo(BigDecimal.ZERO) > 0) { try { storeOrderRefundService.refund(request, storeOrder); } catch (Exception e) { @@ -813,6 +825,15 @@ public class StoreOrderServiceImpl extends ServiceImpl temMap = new HashMap<>(); + temMap.put(Constants.WE_CHAT_TEMP_KEY_FIRST, "您的订单退款申请被通过,钱款将退还至您的支付账户,请耐心等待。"); + temMap.put("keyword1", storeOrder.getOrderId()); + temMap.put("keyword2", storeOrder.getPayPrice().toString()); + temMap.put("keyword3", DateUtil.dateToStr(storeOrder.getCreateTime(), Constants.DATE_FORMAT)); + temMap.put(Constants.WE_CHAT_TEMP_KEY_END, "感谢你的使用。"); + pushMessageRefundOrder(storeOrder, user, temMap); // // 小程序订阅消息 退款成功 // String storeNameAndCarNumString = orderUtils.getStoreNameAndCarNumString(storeOrder.getId()); // WechatSendMessageForReFundEd forReFundEd = new WechatSendMessageForReFundEd( @@ -826,6 +847,37 @@ public class StoreOrderServiceImpl extends ServiceImpl temMap) { + if (user.getUserType().equals(UserConstants.USER_TYPE_H5)) { + return; + } + UserToken userToken; + // 公众号 + if (user.getUserType().equals(UserConstants.USER_TYPE_WECHAT)) { + userToken = userTokenService.getTokenByUserId(user.getUid(), UserConstants.USER_TOKEN_TYPE_WECHAT); + if (ObjectUtil.isNull(userToken)) { + return ; + } + // 发送微信模板消息 + templateMessageService.pushTemplateMessage(Constants.WE_CHAT_TEMP_KEY_ORDER_REFUND, temMap, userToken.getToken()); + return; + } + // 小程序发送订阅消息 + String storeNameAndCarNumString = orderUtils.getStoreNameAndCarNumString(storeOrder.getId()); + if(StringUtils.isNotBlank(storeNameAndCarNumString)){ + WechatSendMessageForPaySuccess paySuccess = new WechatSendMessageForPaySuccess( + storeOrder.getId()+"",storeOrder.getPayPrice()+"",storeOrder.getPayTime()+"","暂无", + storeOrder.getTotalPrice()+"",storeNameAndCarNumString); + orderUtils.sendWeiChatMiniMessageForPaySuccess(paySuccess, userService.getById(storeOrder).getUid()); + } + } + /** 订单详情 * @param id Integer 订单id * @author Mr.Zhang @@ -875,11 +927,11 @@ public class StoreOrderServiceImpl extends ServiceImpl { updateById(storeOrder); storeOrderStatusService.createLog(storeOrder.getId(), Constants.ORDER_LOG_REFUND_REFUSE, Constants.ORDER_LOG_MESSAGE_REFUND_REFUSE.replace("{reason}", reason)); return Boolean.TRUE; }); if (execute) { - - //TODO 模板消息通知 + // 如果是拼团订单要将拼团状态改回去 + if (ObjectUtil.isNotNull(storeOrder) && storeOrder.getPinkId() > 0) { + StorePink storePink = storePinkService.getById(storeOrder.getPinkId()); + if (storePink.getStatus().equals(3)) { + storePink.setStatus(1); + storePinkService.updateById(storePink); + } + } + // 发送消息通知 + HashMap temMap = new HashMap<>(); + temMap.put(Constants.WE_CHAT_TEMP_KEY_FIRST, "您的订单退款申请被拒绝!"); + temMap.put("keyword1", storeOrder.getOrderId()); + temMap.put("keyword2", storeOrder.getPayPrice().toString()); + temMap.put("keyword3", DateUtil.dateToStr(storeOrder.getCreateTime(), Constants.DATE_FORMAT)); + temMap.put(Constants.WE_CHAT_TEMP_KEY_END, "拒绝原因:"+ reason); + pushMessageRefundOrder(storeOrder, user, temMap); } return execute; } @@ -1035,36 +1103,67 @@ public class StoreOrderServiceImpl extends ServiceImpl { + // 修改订单价格 + orderEditPrice(request.getOrderId(), request.getPrice()); + // 订单修改状态操作 + storeOrderStatusService.createLog(existOrder.getId(), Constants.ORDER_LOG_EDIT, + Constants.RESULT_ORDER_EDIT_PRICE_LOGS.replace("${orderPrice}", oldPrice) + .replace("${price}", request.getPrice() + "")); + return Boolean.TRUE; + }); + if(!execute) { + throw new CrmebException(Constants.RESULT_ORDER_EDIT_PRICE_SUCCESS + .replace("${orderNo}", existOrder.getOrderId()).replace("${price}", request.getPrice()+"")); + } + // 发送改价短信提醒 + User user = userService.getById(existOrder.getUid()); + if (StrUtil.isNotBlank(user.getPhone())) { + // 改价短信开关是否开启 + String smsSwitch = systemConfigService.getValueByKey(SmsConstants.SMS_CONFIG_PRICE_REVISION_SWITCH); + if (StrUtil.isNotBlank(smsSwitch) && smsSwitch.equals("1")) { + // 发送改价短信提醒 + smsService.sendOrderEditPriceNotice(user.getPhone(), existOrder.getOrderId(), request.getPrice()); + } + } + + return execute; + } + + /** + * 改价 + * @param orderNo 订单编号 + * @param price 修改后的价格 + */ + private Boolean orderEditPrice(String orderNo, BigDecimal price) { + LambdaUpdateWrapper luw = new LambdaUpdateWrapper<>(); + luw.set(StoreOrder::getPayPrice, price); + luw.eq(StoreOrder::getOrderId, orderNo); + luw.eq(StoreOrder::getPaid, false); + return update(luw); } /** @@ -1183,6 +1282,7 @@ public class StoreOrderServiceImpl extends ServiceImpl getUserCurrentBargainOrders(StoreOrder storeOrder) { LambdaQueryWrapper lqw = Wrappers.lambdaQuery(); lqw.eq(StoreOrder::getUid,storeOrder.getUid()).eq(StoreOrder::getBargainId,storeOrder.getBargainId()); + lqw.eq(StoreOrder::getIsDel, false); return dao.selectList(lqw); } @@ -1260,11 +1360,74 @@ public class StoreOrderServiceImpl extends ServiceImpl lqw = new LambdaUpdateWrapper<>(); lqw.set(StoreOrder::getPaid, true); + lqw.set(StoreOrder::getPayTime, DateUtil.nowDateTime()); lqw.eq(StoreOrder::getOrderId, orderNo); lqw.eq(StoreOrder::getPaid,false); return update(lqw); } + @Override + public Map getMapInOrderNo(List orderNoList) { + Map map = CollUtil.newHashMap(); + LambdaUpdateWrapper lqw = new LambdaUpdateWrapper<>(); + lqw.in(StoreOrder::getOrderId, orderNoList); + List orderList = dao.selectList(lqw); + orderList.forEach(order -> { + map.put(order.getOrderId(), order); + }); + return map; + } + + /** + * 获取推广订单总金额 + * @param orderNoList 订单编号列表 + * @return + */ + @Override + public BigDecimal getSpreadOrderTotalPriceByOrderList(List orderNoList) { + LambdaQueryWrapper lqw = new LambdaQueryWrapper<>(); + lqw.select(StoreOrder::getPayPrice); + lqw.in(StoreOrder::getOrderId, orderNoList); + List orderList = dao.selectList(lqw); + return orderList.stream().map(StoreOrder::getPayPrice).reduce(BigDecimal.ZERO, BigDecimal::add); + } + + /** + * 获取所有收货订单id集合 + * @return + */ + @Override + public List findIdAndUidListByReceipt() { + LambdaQueryWrapper lqw = new LambdaQueryWrapper<>(); + lqw.select(StoreOrder::getId, StoreOrder::getUid); + lqw.eq(StoreOrder::getStatus, 2); + lqw.eq(StoreOrder::getRefundStatus, 0); + lqw.eq(StoreOrder::getIsDel, false); + List orderList = dao.selectList(lqw); + if (CollUtil.isEmpty(orderList)) { + return CollUtil.newArrayList(); + } + return orderList; + } + + /** + * + * @param userId 用户uid + * @param pageParamRequest 分页参数 + * @return List + */ + @Override + public List findPaidListByUid(Integer userId, PageParamRequest pageParamRequest) { + Page orderPage = pageInfo = PageHelper.startPage(pageParamRequest.getPage(), pageParamRequest.getLimit()); + LambdaQueryWrapper lqw = new LambdaQueryWrapper<>(); + lqw.eq(StoreOrder::getUid, userId); + lqw.eq(StoreOrder::getPaid, true); + lqw.eq(StoreOrder::getIsDel, false); +// lqw.in(StoreOrder::getRefundStatus, 0, 1); + lqw.orderByDesc(StoreOrder::getId); + return dao.selectList(lqw); + } + ///////////////////////////////////////////////////////////////////////////////////////////////////// 以下为自定义方法 /** @@ -1379,16 +1542,74 @@ public class StoreOrderServiceImpl extends ServiceImpl map = new HashMap<>(); - map.put(Constants.WE_CHAT_TEMP_KEY_FIRST, "订单发货提醒"); - map.put("keyword1", storeOrder.getOrderId()); - map.put("keyword2", storeOrder.getDeliveryName()); - map.put("keyword3", storeOrder.getDeliveryId()); - map.put(Constants.WE_CHAT_TEMP_KEY_END, "欢迎再次购买!"); - templateMessageService.push(Constants.WE_CHAT_TEMP_KEY_EXPRESS, map, storeOrder.getUid(), Constants.PAY_TYPE_WE_CHAT_FROM_PUBLIC); + if (!execute) throw new CrmebException("快递发货失败!"); + User user = userService.getById(storeOrder.getUid()); + if (StrUtil.isNotBlank(user.getPhone())) { + // 发货短信提醒 + String smsSwitch = systemConfigService.getValueByKey(SmsConstants.SMS_CONFIG_DELIVER_GOODS_SWITCH); + if (StrUtil.isNotBlank(smsSwitch) && smsSwitch.equals("1")) { + String proName = ""; + List voList = storeOrderInfoService.getOrderListByOrderId(storeOrder.getId()); + proName = voList.get(0).getInfo().getProductInfo().getStoreName(); + if (voList.size() > 1) { + proName = proName.concat("等"); + } + smsService.sendOrderDeliverNotice(user.getPhone(), user.getNickname(), proName, storeOrder.getOrderId()); + } + } + + // 发送消息通知 + pushMessageOrder(storeOrder, user); + +// //微信模板消息发送 +// HashMap map = new HashMap<>(); +// map.put(Constants.WE_CHAT_TEMP_KEY_FIRST, "订单发货提醒"); +// map.put("keyword1", storeOrder.getOrderId()); +// map.put("keyword2", storeOrder.getDeliveryName()); +// map.put("keyword3", storeOrder.getDeliveryId()); +// map.put(Constants.WE_CHAT_TEMP_KEY_END, "欢迎再次购买!"); +// templateMessageService.push(Constants.WE_CHAT_TEMP_KEY_EXPRESS, map, storeOrder.getUid(), Constants.PAY_TYPE_WE_CHAT_FROM_PUBLIC); + } + + /** + * 发送消息通知 + * 根据用户类型发送 + * 公众号模板消息 + * 小程序订阅消息 + */ + private void pushMessageOrder(StoreOrder storeOrder, User user) { + if (user.getUserType().equals(UserConstants.USER_TYPE_H5)) { + return; + } + UserToken userToken; + HashMap temMap = new HashMap<>(); + // 公众号 + if (user.getUserType().equals(UserConstants.USER_TYPE_WECHAT)) { + userToken = userTokenService.getTokenByUserId(user.getUid(), UserConstants.USER_TOKEN_TYPE_WECHAT); + if (ObjectUtil.isNull(userToken)) { + return ; + } + // 发送微信模板消息 + temMap.put(Constants.WE_CHAT_TEMP_KEY_FIRST, "订单发货提醒"); + temMap.put("keyword1", storeOrder.getOrderId()); + temMap.put("keyword2", storeOrder.getDeliveryName()); + temMap.put("keyword3", storeOrder.getDeliveryId()); + temMap.put(Constants.WE_CHAT_TEMP_KEY_END, "欢迎再次购买!"); + templateMessageService.pushTemplateMessage(Constants.WE_CHAT_TEMP_KEY_EXPRESS, temMap, userToken.getToken()); + return; + } + // 小程序发送订阅消息 + userToken = userTokenService.getTokenByUserId(user.getUid(), UserConstants.USER_TOKEN_TYPE_ROUTINE); + if (ObjectUtil.isNull(userToken)) { + return ; + } + // 组装数据 + temMap.put("character_string1", storeOrder.getOrderId()); + temMap.put("name3", storeOrder.getDeliveryName()); + temMap.put("character_string4", storeOrder.getDeliveryId()); + temMap.put("thing7", "您的订单已发货"); + templateMessageService.pushMiniTemplateMessage(Constants.WE_CHAT_PROGRAM_TEMP_KEY_EXPRESS, temMap, userToken.getToken()); } /** @@ -1506,18 +1727,67 @@ public class StoreOrderServiceImpl extends ServiceImpl map = new HashMap<>(); - map.put(Constants.WE_CHAT_TEMP_KEY_FIRST, "订单发货提醒"); - map.put("keyword1", StringUtils.join(productNameList, "|")); - map.put("keyword2", DateUtil.dateToStr(storeOrder.getCreateTime(), Constants.DATE_FORMAT)); - map.put("keyword3", storeOrder.getUserAddress()); - map.put("keyword4", request.getDeliveryName()); - map.put("keyword5", request.getDeliveryTel()); - map.put(Constants.WE_CHAT_TEMP_KEY_END, "欢迎再次购买!"); - - templateMessageService.push(Constants.WE_CHAT_TEMP_KEY_DELIVERY, map, storeOrder.getUid() , Constants.PAY_TYPE_WE_CHAT_FROM_PUBLIC); + User user = userService.getById(storeOrder.getUid()); + // 发送消息通知 + pushMessageDeliveryOrder(storeOrder, user, request, productNameList); } + + /** + * 发送消息通知 + * 根据用户类型发送 + * 公众号模板消息 + * 小程序订阅消息 + */ + private void pushMessageDeliveryOrder(StoreOrder storeOrder, User user, StoreOrderSendRequest request, List productNameList) { + if (user.getUserType().equals(UserConstants.USER_TYPE_H5)) { + return; + } + UserToken userToken; + HashMap map = new HashMap<>(); + String proName = ""; + if (CollUtil.isNotEmpty(productNameList)) { + proName = StringUtils.join(productNameList, "|"); + } + // 公众号 + if (user.getUserType().equals(UserConstants.USER_TYPE_WECHAT)) { + userToken = userTokenService.getTokenByUserId(user.getUid(), UserConstants.USER_TOKEN_TYPE_WECHAT); + if (ObjectUtil.isNull(userToken)) { + return ; + } + map.put(Constants.WE_CHAT_TEMP_KEY_FIRST, "订单配送提醒"); + map.put("keyword1", storeOrder.getOrderId()); + map.put("keyword2", DateUtil.dateToStr(storeOrder.getCreateTime(), Constants.DATE_FORMAT)); + map.put("keyword3", storeOrder.getUserAddress()); + map.put("keyword4", request.getDeliveryName()); + map.put("keyword5", request.getDeliveryTel()); + map.put(Constants.WE_CHAT_TEMP_KEY_END, "欢迎再次购买!"); + // 发送微信模板消息 + templateMessageService.pushTemplateMessage(Constants.WE_CHAT_TEMP_KEY_DELIVERY, map, userToken.getToken()); + return; + } + // 小程序发送订阅消息 + userToken = userTokenService.getTokenByUserId(user.getUid(), UserConstants.USER_TOKEN_TYPE_ROUTINE); + if (ObjectUtil.isNull(userToken)) { + return ; + } + + if (proName.length() > 20) { + proName = proName.substring(0, 15) + "***"; + } + map.put("thing8", proName); + map.put("character_string1", storeOrder.getOrderId()); + map.put("name4", request.getDeliveryName()); + map.put("phone_number10", request.getDeliveryTel()); + templateMessageService.pushMiniTemplateMessage(Constants.WE_CHAT_PROGRAM_TEMP_KEY_DELIVERY, map, userToken.getToken()); +// String storeNameAndCarNumString = orderUtils.getStoreNameAndCarNumString(storeOrder.getId()); +// if(StringUtils.isNotBlank(storeNameAndCarNumString)){ +// WechatSendMessageForPaySuccess paySuccess = new WechatSendMessageForPaySuccess( +// storeOrder.getId()+"",storeOrder.getPayPrice()+"",storeOrder.getPayTime()+"","暂无", +// storeOrder.getTotalPrice()+"",storeNameAndCarNumString); +// orderUtils.sendWeiChatMiniMessageForPaySuccess(paySuccess, userService.getById(storeOrder).getUid()); +// } + } + /** 虚拟 * @param request StoreOrderSendRequest 发货参数 * @param storeOrder StoreOrder 订单信息 diff --git a/crmeb/src/main/java/com/zbkj/crmeb/store/service/impl/StoreOrderStatusServiceImpl.java b/crmeb/src/main/java/com/zbkj/crmeb/store/service/impl/StoreOrderStatusServiceImpl.java index 56984b81..8b173f25 100644 --- a/crmeb/src/main/java/com/zbkj/crmeb/store/service/impl/StoreOrderStatusServiceImpl.java +++ b/crmeb/src/main/java/com/zbkj/crmeb/store/service/impl/StoreOrderStatusServiceImpl.java @@ -1,6 +1,6 @@ package com.zbkj.crmeb.store.service.impl; -import cn.hutool.core.date.DateTime; +import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; import com.common.PageParamRequest; import com.constants.Constants; import com.github.pagehelper.PageHelper; @@ -19,7 +19,6 @@ import org.springframework.stereotype.Service; import javax.annotation.Resource; import java.math.BigDecimal; -import java.util.Date; import java.util.List; /** @@ -111,6 +110,20 @@ public class StoreOrderStatusServiceImpl extends ServiceImpl queryWrapper = new QueryWrapper<>(); + queryWrapper.eq("oid", orderId); + queryWrapper.orderByDesc("oid"); + queryWrapper.last(" limit 1"); + return dao.selectOne(queryWrapper); + } + public Boolean addLog(Integer orderId, String type, String message) { StoreOrderStatus storeOrderStatus = new StoreOrderStatus(); storeOrderStatus.setOid(orderId); diff --git a/crmeb/src/main/java/com/zbkj/crmeb/store/service/impl/StoreOrderTaskServiceImpl.java b/crmeb/src/main/java/com/zbkj/crmeb/store/service/impl/StoreOrderTaskServiceImpl.java index 282fe927..158661fc 100644 --- a/crmeb/src/main/java/com/zbkj/crmeb/store/service/impl/StoreOrderTaskServiceImpl.java +++ b/crmeb/src/main/java/com/zbkj/crmeb/store/service/impl/StoreOrderTaskServiceImpl.java @@ -1,30 +1,46 @@ package com.zbkj.crmeb.store.service.impl; import cn.hutool.core.collection.CollUtil; +import cn.hutool.core.date.DateField; import cn.hutool.core.date.DateTime; import cn.hutool.core.date.DateUnit; import cn.hutool.core.util.ObjectUtil; import cn.hutool.core.util.StrUtil; +import com.common.MyRecord; +import com.constants.BrokerageRecordConstants; import com.constants.Constants; +import com.constants.SmsConstants; +import com.constants.UserConstants; import com.exception.CrmebException; import com.utils.CrmebUtil; import com.utils.DateUtil; import com.zbkj.crmeb.bargain.service.StoreBargainService; +import com.zbkj.crmeb.combination.model.StorePink; import com.zbkj.crmeb.combination.service.StoreCombinationService; +import com.zbkj.crmeb.combination.service.StorePinkService; import com.zbkj.crmeb.marketing.service.StoreCouponUserService; import com.zbkj.crmeb.payment.service.OrderPayService; import com.zbkj.crmeb.seckill.service.StoreSeckillService; +import com.zbkj.crmeb.sms.service.SmsService; import com.zbkj.crmeb.store.model.StoreOrder; -import com.zbkj.crmeb.store.model.StoreProduct; import com.zbkj.crmeb.store.request.StoreProductStockRequest; import com.zbkj.crmeb.store.service.*; +import com.zbkj.crmeb.store.utilService.OrderUtils; import com.zbkj.crmeb.store.vo.StoreOrderInfoVo; +import com.zbkj.crmeb.system.model.SystemAdmin; +import com.zbkj.crmeb.system.service.SystemAdminService; import com.zbkj.crmeb.system.service.SystemConfigService; import com.zbkj.crmeb.user.model.User; import com.zbkj.crmeb.user.model.UserBill; +import com.zbkj.crmeb.user.model.UserBrokerageRecord; +import com.zbkj.crmeb.user.model.UserToken; import com.zbkj.crmeb.user.request.UserOperateFundsRequest; import com.zbkj.crmeb.user.service.UserBillService; +import com.zbkj.crmeb.user.service.UserBrokerageRecordService; import com.zbkj.crmeb.user.service.UserService; +import com.zbkj.crmeb.user.service.UserTokenService; +import com.zbkj.crmeb.wechat.service.TemplateMessageService; +import com.zbkj.crmeb.wechat.vo.WechatSendMessageForPaySuccess; import org.apache.commons.lang3.StringUtils; import org.slf4j.Logger; import org.slf4j.LoggerFactory; @@ -91,9 +107,33 @@ public class StoreOrderTaskServiceImpl implements StoreOrderTaskService { @Autowired private UserBillService userBillService; + @Autowired + private StoreProductAttrValueService storeProductAttrValueService; + @Autowired private TransactionTemplate transactionTemplate; + @Autowired + private UserBrokerageRecordService userBrokerageRecordService; + + @Autowired + private SmsService smsService; + + @Autowired + private SystemAdminService systemAdminService; + + @Autowired + private UserTokenService userTokenService; + + @Autowired + private TemplateMessageService templateMessageService; + + @Autowired + private OrderUtils orderUtils; + + @Autowired + private StorePinkService storePinkService; + /** * 用户取消订单 * @author Mr.Zhang @@ -115,11 +155,11 @@ public class StoreOrderTaskServiceImpl implements StoreOrderTaskService { storeOrderStatusService.createLog(storeOrder.getId(), "cancel_order", "取消订单"); //回滚优惠券 - rollbackCoupon(storeOrder); +// rollbackCoupon(storeOrder); // 回滚积分 - rollbackIntegral(storeOrder); - setIntegral(storeOrder, 1); //单独回滚使用积分 +// rollbackIntegral(storeOrder); +// setIntegral(storeOrder, 1); //单独回滚使用积分 return rollbackStock(storeOrder); }catch (Exception e){ @@ -127,43 +167,6 @@ public class StoreOrderTaskServiceImpl implements StoreOrderTaskService { } } - /** - * 用户退款申请 - * @author Mr.Zhang - * @since 2020-07-09 - */ - @Override - @Transactional(rollbackFor = {RuntimeException.class, Error.class, CrmebException.class}) - public Boolean refundApply(StoreOrder storeOrder) { - /* - * 1、修改订单状态 (用户操作的时候已处理) - * 2、写订单日志 - * 3、回滚消耗积分 - * 4、回滚获得积分 - * 5、回滚冻结期佣金 - * 6、回滚经验 - * */ - try{ - //写订单日志 - storeOrderStatusService.saveRefund(storeOrder.getId(), storeOrder.getRefundPrice(), "成功"); - - //回滚积分 消耗和获得 - rollbackIntegral(storeOrder); - - //回滚冻结期佣金 - rollbackBrokeragePrice(storeOrder); - - //回滚经验 - rollbackExp(storeOrder); - - // 回滚库存 - rollbackStock(storeOrder); - return true; - }catch (Exception e){ - return false; - } - } - /** * 完成订单 * @author Mr.Zhang @@ -190,7 +193,6 @@ public class StoreOrderTaskServiceImpl implements StoreOrderTaskService { * @since 2020-07-09 */ @Override - @Transactional(rollbackFor = {RuntimeException.class, Error.class, CrmebException.class}) public Boolean takeByUser(StoreOrder storeOrder) { /* * 1、写订单日志 @@ -249,25 +251,6 @@ public class StoreOrderTaskServiceImpl implements StoreOrderTaskService { userService.updateFounds(userOperateFundsRequest, true); } - // 获取额外赠送积分 - private void setGiveIntegral(StoreOrder storeOrder){ - // 获取商品额外赠送积分 - List orderInfoList = storeOrderInfoService.getOrderListByOrderId(storeOrder.getId()); - List productIds = orderInfoList.stream().map(StoreOrderInfoVo::getProductId).collect(Collectors.toList()); - if(productIds.size() > 0){ - List products = storeProductService.getListInIds(productIds); - int sumIntegral = products.stream().mapToInt(e -> e.getGiveIntegral().intValue()).sum(); - UserOperateFundsRequest userOperateFundsRequest = new UserOperateFundsRequest(); - userOperateFundsRequest.setValue(BigDecimal.valueOf(sumIntegral)); - userOperateFundsRequest.setFoundsType(Constants.ORDER_STATUS_STR_BARGAIN); - userOperateFundsRequest.setUid(storeOrder.getUid()); - userOperateFundsRequest.setTitle(Constants.ORDER_STATUS_STR_TAKE); - userOperateFundsRequest.setFoundsCategory(Constants.USER_BILL_CATEGORY_INTEGRAL); - userOperateFundsRequest.setType(1); - userService.updateFounds(userOperateFundsRequest, true); - } - } - /** * 计算积分 * @author Mr.Zhang @@ -711,7 +694,19 @@ public class StoreOrderTaskServiceImpl implements StoreOrderTaskService { StoreOrder tempOrder = new StoreOrder(); tempOrder.setId(storeOrder.getId()); tempOrder.setRefundStatus(2); - // 回滚佣金 TODO 这里之后处理 + // 佣金处理:只处理冻结期佣金 + // 查询佣金记录 + List brokerageRecordList = CollUtil.newArrayList(); + List recordList = userBrokerageRecordService.findListByLinkIdAndLinkType(storeOrder.getOrderId(), BrokerageRecordConstants.BROKERAGE_RECORD_LINK_TYPE_ORDER); + if (CollUtil.isNotEmpty(recordList)) { + recordList.forEach(r -> { + //创建、冻结期佣金置为失效状态 + if (r.getStatus() < BrokerageRecordConstants.BROKERAGE_RECORD_STATUS_COMPLETE) { + r.setStatus(BrokerageRecordConstants.BROKERAGE_RECORD_STATUS_INVALIDATION); + brokerageRecordList.add(r); + } + }); + } Boolean execute = transactionTemplate.execute(e -> { //写订单日志 @@ -723,13 +718,24 @@ public class StoreOrderTaskServiceImpl implements StoreOrderTaskService { // 用户账单记录处理 userBillService.saveBatch(userBillList); - //回滚冻结期佣金 - rollbackBrokeragePrice(storeOrder); + // 佣金处理 + if (CollUtil.isNotEmpty(brokerageRecordList)) { + userBrokerageRecordService.updateBatchById(brokerageRecordList); + } +// rollbackBrokeragePrice(storeOrder); // 回滚库存 rollbackStock(storeOrder); storeOrderService.updateById(tempOrder); + + // 拼团状态处理 + if (storeOrder.getCombinationId() > 0) { + StorePink storePink = storePinkService.getByOrderId(storeOrder.getOrderId()); + storePink.setStatus(3); + storePink.setIsRefund(true); + storePinkService.updateById(storePink); + } return Boolean.TRUE; }); @@ -742,8 +748,6 @@ public class StoreOrderTaskServiceImpl implements StoreOrderTaskService { /** * 订单支付成功后置处理 - * @param storeOrder - * @return */ @Override public Boolean paySuccessAfter(StoreOrder storeOrder) { @@ -751,206 +755,306 @@ public class StoreOrderTaskServiceImpl implements StoreOrderTaskService { } /** - * 回滚佣金 - * @param storeOrder 订单信息 - * @param user 订单用户 + * 超时未支付系统自动取消 */ - private void rollbackBrokeragePrice(StoreOrder storeOrder, User user) { - //计算分销人 - List spreadList = getSpreadList(user.getSpreadUid()); - if(null == spreadList || spreadList.size() < 1){ + @Override + public Boolean autoCancel(StoreOrder storeOrder) { + // 判断订单是否支付 + if (storeOrder.getPaid()) { + return Boolean.TRUE; + } + // 获取过期时间 + String cancelStr = ""; + if (storeOrder.getBargainId() > 0 || storeOrder.getSeckillId() > 0 || storeOrder.getCombinationId() > 0) { + cancelStr = systemConfigService.getValueByKey("order_activity_time"); + } else { + cancelStr = systemConfigService.getValueByKey("order_cancel_time"); + } + if (StrUtil.isBlank(cancelStr)) { + cancelStr = "1"; + } + DateTime cancelTime = cn.hutool.core.date.DateUtil.offset(storeOrder.getCreateTime(), DateField.HOUR_OF_DAY, Integer.parseInt(cancelStr)); + long between = cn.hutool.core.date.DateUtil.between(cancelTime, cn.hutool.core.date.DateUtil.date(), DateUnit.SECOND, false); + if (between < 0) {// 未到过期时间继续循环 + return Boolean.FALSE; + } + storeOrder.setIsDel(true).setIsSystemDel(true); + + Boolean execute = transactionTemplate.execute(e -> { + storeOrderService.updateById(storeOrder); + //写订单日志 + storeOrderStatusService.createLog(storeOrder.getId(), "cancel", "到期未支付系统自动取消"); + // TODO 回滚库存 + + return Boolean.TRUE; + }); + if (execute) { + // 回滚库存 + rollbackStock(storeOrder); + /*// 查找出商品详情 + List orderInfoVoList = storeOrderInfoService.getOrderListByOrderId(storeOrder.getId()); + if(null == orderInfoVoList || orderInfoVoList.size() < 1){ + logger.error("自动取消未付款订单式,未找到对应的订单商品详情,orderNo===" + storeOrder.getOrderId()); + return true; + } + if (storeOrder.getSeckillId() > 0) {// 秒杀回滚 + StoreOrderInfoVo storeOrderInfoVo = orderInfoVoList.get(0); + // 秒杀商品回滚库存 + storeSeckillService.operationStock(storeOrderInfoVo.getInfo().getSeckillId(), storeOrderInfoVo.getInfo().getCartNum(), "add"); + // 秒杀商品规格回滚库存 + storeProductAttrValueService.operationStock(Integer.valueOf(storeOrderInfoVo.getInfo().getProductAttrUnique()), storeOrderInfoVo.getInfo().getCartNum(), "add", Constants.PRODUCT_TYPE_SECKILL); + // 普通商品回滚库存 + storeProductService.operationStock(storeOrderInfoVo.getProductId(), storeOrderInfoVo.getInfo().getCartNum(), "add"); + // 普通商品规格回滚库存 + storeProductAttrValueService.operationStock(skuRecord.getInt("attrValueId"), storeOrderInfoVo.getInfo().getCartNum(), "add", Constants.PRODUCT_TYPE_NORMAL); + } + if (storeOrder.getBargainId() > 0) {// 砍价回滚 + + } + if (storeOrder.getCombinationId() > 0) {// 拼团回滚 + + } + // 普通回滚*/ + } + return execute; + } + + /** + * 订单收货task处理 + * @param orderId 订单id + * @return Boolean + * 1.写订单日志 + * 2.分佣-佣金进入冻结期 + */ + @Override + public Boolean orderReceiving(Integer orderId) { + StoreOrder storeOrder = storeOrderService.getById(orderId); + if (ObjectUtil.isNull(storeOrder)) { + throw new CrmebException(StrUtil.format("订单收货task处理,未找到订单,id={}", orderId)); + } + User user = userService.getById(storeOrder.getUid()); + + // 获取佣金记录 + List recordList = userBrokerageRecordService.findListByLinkIdAndLinkType(storeOrder.getOrderId(), BrokerageRecordConstants.BROKERAGE_RECORD_LINK_TYPE_ORDER); + recordList.forEach(record -> { + if (!record.getStatus().equals(BrokerageRecordConstants.BROKERAGE_RECORD_STATUS_CREATE)) { + throw new CrmebException(StrUtil.format("订单收货task处理,订单佣金记录不是创建状态,id={}", orderId)); + } + // 佣金进入冻结期 + record.setStatus(BrokerageRecordConstants.BROKERAGE_RECORD_STATUS_FROZEN); + // 计算解冻时间 + Long thawTime = cn.hutool.core.date.DateUtil.current(false); + if (record.getFrozenTime() > 0) { + DateTime dateTime = cn.hutool.core.date.DateUtil.offsetDay(new Date(), record.getFrozenTime()); + thawTime = dateTime.getTime(); + } + record.setThawTime(thawTime); + }); + + Boolean execute = transactionTemplate.execute(e -> { + // 日志 + storeOrderStatusService.createLog(storeOrder.getId(), "user_take_delivery", Constants.ORDER_STATUS_STR_TAKE); + // 分佣-佣金进入冻结期 + if (CollUtil.isNotEmpty(recordList)) { + userBrokerageRecordService.updateBatchById(recordList); + } + return Boolean.TRUE; + }); + if (execute) { + // 发送用户确认收货管理员提醒短信 + String smsSwitch = systemConfigService.getValueByKey(SmsConstants.SMS_CONFIG_ADMIN_REFUND_SWITCH); + if (StrUtil.isNotBlank(smsSwitch) || smsSwitch.equals("1")) { + // 查询可已发送短信的管理员 + List systemAdminList = systemAdminService.findIsSmsList(); + if (CollUtil.isNotEmpty(systemAdminList)) { + // 发送短信 + systemAdminList.forEach(admin -> { + smsService.sendOrderReceiptNotice(admin.getPhone(), storeOrder.getOrderId(), admin.getRealName()); + }); + } + } + + // 发送消息通知 + pushMessageOrder(storeOrder, user); + } + + return execute; + } + + /** + * 发送消息通知 + * 根据用户类型发送 + * 公众号模板消息 + * 小程序订阅消息 + */ + private void pushMessageOrder(StoreOrder storeOrder, User user) { + if (user.getUserType().equals(UserConstants.USER_TYPE_H5)) { return; } - //资金明细加一条数据 - UserOperateFundsRequest userOperateFundsRequest = new UserOperateFundsRequest(); - userOperateFundsRequest.setLinkId(storeOrder.getId().toString()); - userOperateFundsRequest.setTitle("推广佣金"); - userOperateFundsRequest.setFoundsCategory(Constants.USER_BILL_CATEGORY_BROKERAGE_PRICE); - userOperateFundsRequest.setFoundsType(Constants.USER_BILL_TYPE_BROKERAGE); - userOperateFundsRequest.setType(0); - - - //计算每个人的佣金 - int i = 1; - for (Integer spreadId: spreadList) { - if(spreadId < 1){ - continue; + UserToken userToken; + HashMap temMap = new HashMap<>(); + // 公众号 + if (user.getUserType().equals(UserConstants.USER_TYPE_WECHAT)) { + userToken = userTokenService.getTokenByUserId(user.getUid(), UserConstants.USER_TOKEN_TYPE_WECHAT); + if (ObjectUtil.isNull(userToken)) { + return ; } - //大于0的用户开始计算佣金, 并更新数据库 - BigDecimal brokeragePrice = getBrokeragePriceByOrder(i, storeOrder.getId()); - User userInfo = userService.getById(spreadId); - userInfo.setBrokeragePrice(userInfo.getBrokeragePrice().add(brokeragePrice)); - - //获得推广佣金 - userOperateFundsRequest.setUid(spreadId); - userOperateFundsRequest.setValue(brokeragePrice); - userService.updateFounds(userOperateFundsRequest, true); - i++; + // 发送微信模板消息 + temMap.put(Constants.WE_CHAT_TEMP_KEY_FIRST, "您购买的商品已确认收货!"); + temMap.put("keyword1", storeOrder.getOrderId()); + temMap.put("keyword2", "已收货"); + temMap.put("keyword3", DateUtil.nowDateTimeStr()); + temMap.put("keyword4", "详情请进入订单查看"); + temMap.put(Constants.WE_CHAT_TEMP_KEY_END, "感谢你的使用。"); + templateMessageService.pushTemplateMessage(Constants.WE_CHAT_TEMP_KEY_ORDER_RECEIVING, temMap, userToken.getToken()); + return; } + // 小程序发送订阅消息 + userToken = userTokenService.getTokenByUserId(user.getUid(), UserConstants.USER_TOKEN_TYPE_ROUTINE); + if (ObjectUtil.isNull(userToken)) { + return ; + } + // 组装数据 + // 获取商品名称 + String storeNameAndCarNumString = orderUtils.getStoreNameAndCarNumString(storeOrder.getId()); + if (StrUtil.isBlank(storeNameAndCarNumString)) { + return ; + } + if (storeNameAndCarNumString.length() > 20) { + storeNameAndCarNumString = storeNameAndCarNumString.substring(0, 15) + "***"; + } + temMap.put("character_string6", storeOrder.getOrderId()); + temMap.put("phrase4", "已收货"); + temMap.put("time7", DateUtil.nowDateTimeStr()); + temMap.put("thing1", storeNameAndCarNumString); + temMap.put("thing5", "您购买的商品已确认收货!"); + templateMessageService.pushMiniTemplateMessage(Constants.WE_CHAT_PROGRAM_TEMP_KEY_ORDER_RECEIVING, temMap, userToken.getToken()); } /** - * 检查是否需要回滚佣金 - * @param storeOrder 订单 - * @param user + * 分配佣金 + * @param storeOrder + * @return */ - private Boolean checkRollbackBrokeragePrice(StoreOrder storeOrder, User user) { - //营销产品不参与 - if(storeOrder.getCombinationId() > 0 || storeOrder.getSeckillId() > 0 || storeOrder.getBargainId() > 0){ - return Boolean.FALSE; - } - - //当前用户不存在 没有上级 或者 当用用户上级时自己 直接返回 - if(user.getSpreadUid() < 1 || null == user.getSpreadUid() || 0 == user.getSpreadUid() || user.getSpreadUid().equals(storeOrder.getUid())){ - return Boolean.FALSE; - } - - //检测商城是否开启分销功能 + private List assignCommission(StoreOrder storeOrder) { + // 检测商城是否开启分销功能 String isOpen = systemConfigService.getValueByKey(Constants.CONFIG_KEY_STORE_BROKERAGE_IS_OPEN); - if(StringUtils.isBlank(isOpen) || isOpen.equals("0")){ - return Boolean.FALSE; + if(StrUtil.isBlank(isOpen) || isOpen.equals("0")){ + return CollUtil.newArrayList(); } - - // 查看是否在冻结期之内, 如果在是需要回滚的,如果不在则不需要回滚 - String time = systemConfigService.getValueByKey(Constants.CONFIG_KEY_STORE_BROKERAGE_EXTRACT_TIME); - if(StringUtils.isBlank(time)){ - return Boolean.FALSE; + // 营销产品不参与 + if(storeOrder.getCombinationId() > 0 || storeOrder.getSeckillId() > 0 || storeOrder.getBargainId() > 0){ + return CollUtil.newArrayList(); } - DateTime patTime = cn.hutool.core.date.DateUtil.offsetDay(storeOrder.getPayTime(), Integer.parseInt(time)); - long between = cn.hutool.core.date.DateUtil.between(patTime, DateUtil.nowDateTime(), DateUnit.MS, false); - if (between < 0) { - return Boolean.FALSE; + // 查找订单所属人信息 + User user = userService.getById(storeOrder.getUid()); + // 当前用户不存在 没有上级 或者 当用用户上级时自己 直接返回 + if(null == user.getSpreadUid() || user.getSpreadUid() < 1 || user.getSpreadUid().equals(storeOrder.getUid())){ + return CollUtil.newArrayList(); } - return Boolean.TRUE; - } - - /** - * 创建退款UserBill对象(包含积分、佣金、经验) - * @param storeOrder 订单 - * @param user 用户 - * @param category 分类 - * @param pm 1 = 增加, 0 = 减少 - * - */ - private UserBill createRefundUserBill(StoreOrder storeOrder, User user, String category, Integer pm) { - UserBill userBill = new UserBill(); - BigDecimal balance = getUserBalance(user, category); - userBill.setTitle(Constants.ORDER_STATUS_STR_REFUNDED); - userBill.setUid(storeOrder.getUid()); - userBill.setCategory(category); - userBill.setLinkId(storeOrder.getOrderId()); //链接id - userBill.setPm(pm); - userBill.setBalance(balance); - switch (category) { - case Constants.USER_BILL_CATEGORY_INTEGRAL:// 积分 - userBill.setType(Constants.USER_BILL_TYPE_PAY_PRODUCT_INTEGRAL_BACK); - if (pm.equals(1)) {// 返还积分 - userBill.setNumber(new BigDecimal(storeOrder.getUseIntegral())); - } else {// 扣除奖励积分 - userBill.setNumber(new BigDecimal(storeOrder.getGainIntegral())); - } - userBill.setMark(getMark(userBill)); - break; - case Constants.USER_BILL_CATEGORY_EXPERIENCE:// 经验 - break; - case Constants.USER_BILL_CATEGORY_BROKERAGE_PRICE:// 佣金 - break; - case Constants.USER_BILL_CATEGORY_MONEY:// 余额 - break; + // 获取参与分佣的人(两级) + List spreadRecordList = getSpreadRecordList(user.getSpreadUid()); + if (CollUtil.isEmpty(spreadRecordList)) { + return CollUtil.newArrayList(); } - return userBill; - } - - /** - * 获取用户剩余 - * @param user 用户 - * @param category 分类 - * @return BigDecimal - */ - private BigDecimal getUserBalance(User user, String category) { - BigDecimal value = BigDecimal.ZERO; - switch (category) { - case Constants.USER_BILL_CATEGORY_INTEGRAL:// 积分 - value = new BigDecimal(user.getIntegral()); - break; - case Constants.USER_BILL_CATEGORY_EXPERIENCE:// 经验 - value = new BigDecimal(user.getExperience()); - break; - case Constants.USER_BILL_CATEGORY_BROKERAGE_PRICE:// 佣金 - value = user.getBrokeragePrice(); - break; - case Constants.USER_BILL_CATEGORY_MONEY:// 余额 - value = user.getNowMoney(); - break; - } - return value; - } - - private String getMark(UserBill userBill) { - String operate = (userBill.getPm() == 1) ? "增加" : "减少"; - String founds = ""; - switch (userBill.getCategory()){ - case Constants.USER_BILL_CATEGORY_INTEGRAL: - founds = "积分"; - break; - case Constants.USER_BILL_CATEGORY_MONEY: - founds = "余额"; - break; - case Constants.USER_BILL_CATEGORY_EXPERIENCE: - founds = "经验"; - break; - case Constants.USER_BILL_CATEGORY_BROKERAGE_PRICE: - founds = "佣金"; - break; - } - - return Constants.USER_BILL_OPERATE_LOG_TITLE.replace("{$title}", userBill.getTitle()).replace("{$operate}", operate).replace("{$founds}", founds); + spreadRecordList.forEach(record -> { + BigDecimal brokerage = calculateCommission(record, storeOrder.getId()); + record.set("brokerage", brokerage); + }); + return spreadRecordList; } /** * 计算佣金 - * @param i Integer 分销员等级 - * @param id Integer 订单id + * @param record index-分销级数,spreadUid-分销人 + * @param orderId 订单id + * @return */ - private BigDecimal getBrokeragePrice(Integer i, Integer id) { + private BigDecimal calculateCommission(MyRecord record, Integer orderId) { BigDecimal brokeragePrice = BigDecimal.ZERO; - //先看商品是否有固定分佣 - List orderInfoVoList = storeOrderInfoService.getOrderListByOrderId(id); + List orderInfoVoList = storeOrderInfoService.getOrderListByOrderId(orderId); if(null == orderInfoVoList || orderInfoVoList.size() < 1){ return brokeragePrice; } //查询对应等级的分销比例 + Integer index = record.getInt("index"); String key = ""; - if (i == 1) { + if (index == 1) { key = Constants.CONFIG_KEY_STORE_BROKERAGE_RATE_ONE; } - if (i == 2) { + if (index == 2) { key = Constants.CONFIG_KEY_STORE_BROKERAGE_RATE_TWO; } String rate = systemConfigService.getValueByKey(key); - if(StrUtil.isBlank(rate)){ - return brokeragePrice; + if(StringUtils.isBlank(rate)){ + rate = "1"; } //佣金比例整数存储, 例如80, 所以计算的时候要除以 10*10 - BigDecimal rateBigDecimal = new BigDecimal(rate).divide(new BigDecimal(100)); + BigDecimal rateBigDecimal = brokeragePrice; + if(StringUtils.isNotBlank(rate)){ + rateBigDecimal = new BigDecimal(rate).divide(BigDecimal.TEN.multiply(BigDecimal.TEN)); + } BigDecimal totalBrokerPrice = BigDecimal.ZERO; for (StoreOrderInfoVo orderInfoVo : orderInfoVoList) { - if(i == 1){ + if(index == 1){ brokeragePrice = orderInfoVo.getInfo().getProductInfo().getAttrInfo().getBrokerage(); - }else if(i == 2){ + } + if(index == 2){ brokeragePrice = orderInfoVo.getInfo().getProductInfo().getAttrInfo().getBrokerageTwo(); } if(brokeragePrice.compareTo(BigDecimal.ZERO) == 0 && !rateBigDecimal.equals(BigDecimal.ZERO)){ - //商品没有分销金额, 并且有设置对应等级的分佣比例 - brokeragePrice = orderInfoVo.getInfo().getTruePrice().multiply(rateBigDecimal).setScale(2, BigDecimal.ROUND_HALF_UP); + // 商品没有分销金额, 并且有设置对应等级的分佣比例 + // 舍入模式向零舍入。 + brokeragePrice = orderInfoVo.getInfo().getTruePrice().multiply(rateBigDecimal).setScale(2, BigDecimal.ROUND_DOWN); } totalBrokerPrice = totalBrokerPrice.add(brokeragePrice); } return totalBrokerPrice; + + } + + /** + * 获取参与奋勇人员(两级) + * @param spreadUid 一级奋分佣人Uid + * @return + */ + private List getSpreadRecordList(Integer spreadUid) { + List recordList = CollUtil.newArrayList(); + + // 第一级 + User spreadUser = userService.getById(spreadUid); + if (ObjectUtil.isNull(spreadUser)) { + return recordList; + } + // 判断分销模式 + String model = systemConfigService.getValueByKey(Constants.CONFIG_KEY_STORE_BROKERAGE_MODEL); + if (StrUtil.isNotBlank(model) && model.equals("1") && !spreadUser.getIsPromoter()) { + // 指定分销模式下:不是推广员不参与分销 + return recordList; + } + MyRecord firstRecord = new MyRecord(); + firstRecord.set("index", 1); + firstRecord.set("spreadUid", spreadUid); + + // 第二级 + User spreadSpreadUser = userService.getById(spreadUser.getSpreadUid()); + if (ObjectUtil.isNull(spreadSpreadUser)) { + return recordList; + } + if (StrUtil.isNotBlank(model) && model.equals("1") && !spreadSpreadUser.getIsPromoter()) { + // 指定分销模式下:不是推广员不参与分销 + return recordList; + } + MyRecord secondRecord = new MyRecord(); + secondRecord.set("index", 2); + secondRecord.set("spreadUid", spreadSpreadUser.getUid()); + return recordList; + } + } diff --git a/crmeb/src/main/java/com/zbkj/crmeb/store/service/impl/StoreProductReplyServiceImpl.java b/crmeb/src/main/java/com/zbkj/crmeb/store/service/impl/StoreProductReplyServiceImpl.java index 50d3cfed..d2c9e84a 100644 --- a/crmeb/src/main/java/com/zbkj/crmeb/store/service/impl/StoreProductReplyServiceImpl.java +++ b/crmeb/src/main/java/com/zbkj/crmeb/store/service/impl/StoreProductReplyServiceImpl.java @@ -1,5 +1,6 @@ package com.zbkj.crmeb.store.service.impl; +import cn.hutool.core.collection.CollUtil; import cn.hutool.core.util.StrUtil; import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; @@ -38,7 +39,6 @@ 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.stream.Collectors; @@ -255,6 +255,24 @@ public class StoreProductReplyServiceImpl extends ServiceImpl lqw = new LambdaQueryWrapper<>(); + lqw.eq(StoreProductReply::getUnique, unique); + lqw.eq(StoreProductReply::getOid, orderId); + List replyList = dao.selectList(lqw); + if (CollUtil.isEmpty(replyList)) { + return Boolean.FALSE; + } + return Boolean.TRUE; + } + /** * 商品评论列表 * @param productId 商品ID diff --git a/crmeb/src/main/java/com/zbkj/crmeb/store/service/impl/StoreProductServiceImpl.java b/crmeb/src/main/java/com/zbkj/crmeb/store/service/impl/StoreProductServiceImpl.java index c710ff21..dd69a292 100644 --- a/crmeb/src/main/java/com/zbkj/crmeb/store/service/impl/StoreProductServiceImpl.java +++ b/crmeb/src/main/java/com/zbkj/crmeb/store/service/impl/StoreProductServiceImpl.java @@ -51,6 +51,7 @@ import org.slf4j.LoggerFactory; import org.springframework.beans.BeanUtils; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; +import org.springframework.transaction.support.TransactionTemplate; import javax.annotation.Resource; import java.math.BigDecimal; @@ -126,6 +127,12 @@ public class StoreProductServiceImpl extends ServiceImpl 20) throw new CrmebException("获取推荐商品数量不合法 limit > 0 || limit < 20"); LambdaQueryWrapper lambdaQueryWrapper = new LambdaQueryWrapper(); lambdaQueryWrapper.eq(StoreProduct::getIsGood,1); + lambdaQueryWrapper.eq(StoreProduct::getIsShow,1); + lambdaQueryWrapper.eq(StoreProduct::getIsDel,false); + lambdaQueryWrapper.orderByDesc(StoreProduct::getSort).orderByDesc(StoreProduct::getId); return dao.selectList(lambdaQueryWrapper); } @@ -1068,7 +1078,7 @@ public class StoreProductServiceImpl extends ServiceImpl { + dao.updateById(storeProduct); + storeCartService.productStatusNotEnable(id); + return Boolean.TRUE; + }); + + return execute; + } + + /** + * 上架 + * @param id 商品id + * @return Boolean + */ + @Override + public Boolean putOnShelf(Integer id) { + StoreProduct storeProduct = getById(id); + if (ObjectUtil.isNull(storeProduct)) { + throw new CrmebException("商品不存在"); + } + if (storeProduct.getIsShow()) { + return true; + } + + // 获取商品skuid + StoreProductAttrValue tempSku = new StoreProductAttrValue(); + tempSku.setProductId(id); + tempSku.setType(Constants.PRODUCT_TYPE_NORMAL); + List skuList = storeProductAttrValueService.getByEntity(tempSku); + List skuIdList = skuList.stream().map(StoreProductAttrValue::getId).collect(Collectors.toList()); + + storeProduct.setIsShow(true); + Boolean execute = transactionTemplate.execute(e -> { + dao.updateById(storeProduct); + storeCartService.productStatusNoEnable(skuIdList); + return Boolean.TRUE; + }); + return execute; + } + } diff --git a/crmeb/src/main/java/com/zbkj/crmeb/store/utilService/OrderUtils.java b/crmeb/src/main/java/com/zbkj/crmeb/store/utilService/OrderUtils.java index 3063e0e0..7cb0e822 100644 --- a/crmeb/src/main/java/com/zbkj/crmeb/store/utilService/OrderUtils.java +++ b/crmeb/src/main/java/com/zbkj/crmeb/store/utilService/OrderUtils.java @@ -833,10 +833,9 @@ public class OrderUtils { } } - String orderNo = ""; + String orderNo = CrmebUtil.getOrderNo("order"); int isChannel = 3; // 支付渠道 if (request.getPayType().equals(PayConstants.PAY_TYPE_WE_CHAT)) { - orderNo = CrmebUtil.getOrderNo(Constants.PAY_TYPE_WE_CHAT); switch (request.getPayChannel()){ case PayConstants.PAY_CHANNEL_WE_CHAT_H5:// H5 isChannel = 2; @@ -849,7 +848,7 @@ public class OrderUtils { break; } } else {// 目前只有余额支付 - orderNo = CrmebUtil.getOrderNo(Constants.PAY_TYPE_YUE); +// orderNo = CrmebUtil.getOrderNo(Constants.PAY_TYPE_YUE); } @@ -1377,7 +1376,7 @@ public class OrderUtils { */ public String cacheSetOrderInfo(Integer userId,ConfirmOrderResponse confirmOrderResponse){ String key = DigestUtils.md5Hex(DateUtil.getNowTime().toString()); - redisUtil.set("user_order_" + userId + key, JSONObject.toJSONString(confirmOrderResponse),Constants.ORDER_CASH_CONFIRM, TimeUnit.MINUTES); + redisUtil.set("user_order:" + userId + key, JSONObject.toJSONString(confirmOrderResponse),Constants.ORDER_CASH_CONFIRM, TimeUnit.MINUTES); return key; } @@ -1388,7 +1387,7 @@ public class OrderUtils { * @return 订单确认对象JSON */ public String cacheGetOrderInfo(Integer userId, String cacheKey){ - String key = "user_order_" + userId + cacheKey; + String key = "user_order:" + userId + cacheKey; boolean exists = redisUtil.exists(key); if(!exists) return null; return redisUtil.get(key).toString(); @@ -1400,7 +1399,7 @@ public class OrderUtils { * @param cacheKey 缓存key */ public void cacheDeleteOrderInfo(Integer userId, String cacheKey){ - String key = "user_order_" + userId + cacheKey; + String key = "user_order:" + userId + cacheKey; boolean exists = redisUtil.exists(key); if(!exists) return; redisUtil.remove(key); @@ -1413,7 +1412,7 @@ public class OrderUtils { * @param confirmOrderResponse */ public void cacheRepliceOrderInfo(String orderKey,Integer userId, ConfirmOrderResponse confirmOrderResponse){ - String key = "user_order_" + userId + orderKey; + String key = "user_order:" + userId + orderKey; if(redisUtil.exists(key)){ redisUtil.remove(key); } @@ -1543,7 +1542,7 @@ public class OrderUtils { queryWrapper.eq(StoreOrder::getPaid, true); queryWrapper.eq(StoreOrder::getStatus, 0); queryWrapper.eq(StoreOrder::getRefundStatus, 0); - queryWrapper.eq(StoreOrder::getShippingType, 1); +// queryWrapper.eq(StoreOrder::getShippingType, 1); break; case Constants.ORDER_STATUS_H5_SPIKE: // 待收货 queryWrapper.eq(StoreOrder::getPaid, true); diff --git a/crmeb/src/main/java/com/zbkj/crmeb/system/controller/SystemAdminController.java b/crmeb/src/main/java/com/zbkj/crmeb/system/controller/SystemAdminController.java index 48c0c5fa..e345abb5 100644 --- a/crmeb/src/main/java/com/zbkj/crmeb/system/controller/SystemAdminController.java +++ b/crmeb/src/main/java/com/zbkj/crmeb/system/controller/SystemAdminController.java @@ -41,19 +41,6 @@ public class SystemAdminController { @Autowired private SystemAdminService systemAdminService; -// @ApiOperation(value="后台用户登录") -// @PostMapping(value = "/login") -// public CommonResult SystemAdminLogin(@Validated SystemAdminLoginRequest systemAdminLoginRequest) throws Exception { -// SystemAdminRequest systemAdminRequest = new SystemAdminRequest(); -// systemAdminRequest.setAccount(systemAdminLoginRequest.getAccount()); -// systemAdminRequest.setPwd(systemAdminLoginRequest.getPwd()); -// SystemAdminResponse systemAdminResponse = systemAdminService.login(systemAdminRequest); -// if(null == systemAdminResponse){ -// return CommonResult.failed(ExceptionCodeEnum.FAILED, "login failed"); -// } -// -// return CommonResult.success(systemAdminResponse, "login success"); -// } /** * 分页显示后台管理员表 * @param systemAdminRequest 搜索条件 @@ -158,6 +145,18 @@ public class SystemAdminController { } return CommonResult.failed("修改失败"); } + + /** + * 修改后台管理员是否接收状态 + */ + @ApiOperation(value = "修改后台管理员是否接收状态") + @RequestMapping(value = "/update/isSms", method = RequestMethod.GET) + public CommonResult updateIsSms(@RequestParam(value = "id") @Valid Integer id){ + if (systemAdminService.updateIsSms(id)) { + return CommonResult.success("修改成功"); + } + return CommonResult.failed("修改失败"); + } } diff --git a/crmeb/src/main/java/com/zbkj/crmeb/system/controller/SystemGroupController.java b/crmeb/src/main/java/com/zbkj/crmeb/system/controller/SystemGroupController.java index cdf45db1..b31b9f5f 100644 --- a/crmeb/src/main/java/com/zbkj/crmeb/system/controller/SystemGroupController.java +++ b/crmeb/src/main/java/com/zbkj/crmeb/system/controller/SystemGroupController.java @@ -5,6 +5,8 @@ import com.common.CommonResult; import com.common.PageParamRequest; import com.zbkj.crmeb.system.request.SystemGroupRequest; import com.zbkj.crmeb.system.request.SystemGroupSearchRequest; +import com.zbkj.crmeb.user.service.UserService; +import com.zbkj.crmeb.user.service.impl.UserServiceImpl; import lombok.extern.slf4j.Slf4j; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.validation.annotation.Validated; @@ -37,6 +39,9 @@ public class SystemGroupController { @Autowired private SystemGroupService systemGroupService; + @Autowired + private UserService userService; + /** * 分页显示组合数据表 * @param request 搜索条件 @@ -73,13 +78,13 @@ public class SystemGroupController { /** * 删除组合数据表 * @param id Integer - * @author Mr.Zhang - * @since 2020-05-15 */ @ApiOperation(value = "删除") @RequestMapping(value = "/delete", method = RequestMethod.GET) public CommonResult delete(@RequestParam(value = "id") Integer id){ if(systemGroupService.removeById(id)){ + // 删除用户对应已经存在的分组标签 虽然数据库用的是String类型但逻辑仅仅只存储一个数据,这里直接删除对应的用户分组id即可 + userService.clearGroupByGroupId(id+""); return CommonResult.success(); }else{ return CommonResult.failed(); diff --git a/crmeb/src/main/java/com/zbkj/crmeb/system/model/SystemAdmin.java b/crmeb/src/main/java/com/zbkj/crmeb/system/model/SystemAdmin.java index 3e7a7f0d..c78e3fb4 100644 --- a/crmeb/src/main/java/com/zbkj/crmeb/system/model/SystemAdmin.java +++ b/crmeb/src/main/java/com/zbkj/crmeb/system/model/SystemAdmin.java @@ -70,4 +70,9 @@ public class SystemAdmin implements Serializable { @ApiModelProperty(value = "登录次数") private Integer loginCount; + @ApiModelProperty(value = "手机号码") + private String phone; + + @ApiModelProperty(value = "是否接收短信") + private Boolean isSms; } diff --git a/crmeb/src/main/java/com/zbkj/crmeb/system/request/SystemAdminAddRequest.java b/crmeb/src/main/java/com/zbkj/crmeb/system/request/SystemAdminAddRequest.java index c6c3931f..431a580a 100644 --- a/crmeb/src/main/java/com/zbkj/crmeb/system/request/SystemAdminAddRequest.java +++ b/crmeb/src/main/java/com/zbkj/crmeb/system/request/SystemAdminAddRequest.java @@ -33,10 +33,6 @@ public class SystemAdminAddRequest implements Serializable { private static final long serialVersionUID=1L; -// @ApiModelProperty(value = "后台管理员表ID") -// @TableId(value = "id", type = IdType.AUTO) -// private Integer id; - @ApiModelProperty(value = "后台管理员账号", required = true) @NotNull(message = "后台管理员账号不能为空") private String account; @@ -53,18 +49,6 @@ public class SystemAdminAddRequest implements Serializable { @NotNull(message = "menus_id不能为空") private String roles; -// @ApiModelProperty(value = "后台管理员最后一次登录ip") -// private String lastIp; - -// @ApiModelProperty(value = "后台管理员最后一次登录时间") -// private Integer lastTime; - -// @ApiModelProperty(value = "后台管理员添加时间") -// private Integer addTime; - -// @ApiModelProperty(value = "登录次数") -// private Integer loginCount; - @ApiModelProperty(value = "后台管理员级别", required = true) @Min(value=0, message = "管理员级别不能小于0") private Integer level; @@ -75,8 +59,6 @@ public class SystemAdminAddRequest implements Serializable { @Max(value = 1, message = "不能大于1") private Boolean status; -// @ApiModelProperty(value = "是否删除 1删除 0未删除") -// private Boolean isDel; - - + @ApiModelProperty(value = "手机号") + private String phone; } diff --git a/crmeb/src/main/java/com/zbkj/crmeb/system/request/SystemAdminLoginRequest.java b/crmeb/src/main/java/com/zbkj/crmeb/system/request/SystemAdminLoginRequest.java index a2702d4b..2640a826 100644 --- a/crmeb/src/main/java/com/zbkj/crmeb/system/request/SystemAdminLoginRequest.java +++ b/crmeb/src/main/java/com/zbkj/crmeb/system/request/SystemAdminLoginRequest.java @@ -7,7 +7,7 @@ import org.hibernate.validator.constraints.Length; import javax.validation.constraints.NotEmpty; /** - * SystemAdminLoginRequest + * PC登录请求对象 * +---------------------------------------------------------------------- * | CRMEB [ CRMEB赋能开发者,助力企业发展 ] * +---------------------------------------------------------------------- diff --git a/crmeb/src/main/java/com/zbkj/crmeb/system/request/SystemAdminRequest.java b/crmeb/src/main/java/com/zbkj/crmeb/system/request/SystemAdminRequest.java index 98a78bf1..b5c91cda 100644 --- a/crmeb/src/main/java/com/zbkj/crmeb/system/request/SystemAdminRequest.java +++ b/crmeb/src/main/java/com/zbkj/crmeb/system/request/SystemAdminRequest.java @@ -70,5 +70,9 @@ public class SystemAdminRequest implements Serializable { @ApiModelProperty(value = "是否删除 1删除 0未删除") private Boolean isDel; + @ApiModelProperty(value = "手机号码") + private String phone; + @ApiModelProperty(value = "是否接收短信") + private Boolean isSms; } diff --git a/crmeb/src/main/java/com/zbkj/crmeb/system/response/SystemAdminResponse.java b/crmeb/src/main/java/com/zbkj/crmeb/system/response/SystemAdminResponse.java index 98d0efa9..15e298da 100644 --- a/crmeb/src/main/java/com/zbkj/crmeb/system/response/SystemAdminResponse.java +++ b/crmeb/src/main/java/com/zbkj/crmeb/system/response/SystemAdminResponse.java @@ -49,4 +49,10 @@ public class SystemAdminResponse implements Serializable { // private Boolean isDel; private String Token; + + @ApiModelProperty(value = "手机号码") + private String phone; + + @ApiModelProperty(value = "是否接收短信") + private Boolean isSms; } diff --git a/crmeb/src/main/java/com/zbkj/crmeb/system/service/SystemAdminService.java b/crmeb/src/main/java/com/zbkj/crmeb/system/service/SystemAdminService.java index f68533b6..a4e13064 100644 --- a/crmeb/src/main/java/com/zbkj/crmeb/system/service/SystemAdminService.java +++ b/crmeb/src/main/java/com/zbkj/crmeb/system/service/SystemAdminService.java @@ -4,11 +4,13 @@ import com.baomidou.mybatisplus.extension.service.IService; import com.common.PageParamRequest; import com.zbkj.crmeb.system.model.SystemAdmin; import com.zbkj.crmeb.system.request.SystemAdminAddRequest; +import com.zbkj.crmeb.system.request.SystemAdminLoginRequest; import com.zbkj.crmeb.system.request.SystemAdminRequest; import com.zbkj.crmeb.system.response.SystemAdminResponse; import java.util.HashMap; import java.util.List; +import java.util.Map; /** * SystemAdminService 接口 @@ -27,39 +29,28 @@ public interface SystemAdminService extends IService { SystemAdminResponse getInfo(SystemAdminRequest request) throws Exception; - SystemAdminResponse login(SystemAdminRequest request, String ip) throws Exception; + /** + * PC登录 + */ + SystemAdminResponse login(SystemAdminLoginRequest request, String ip) throws Exception; /** * 根据Token获取对应用户信息 - * - * @param token - * @return */ SystemAdminResponse getInfoByToken(String token) throws Exception; /** * 用户登出 - * - * @param token - * @return - * @throws Exception */ Boolean logout(String token) throws Exception; /** * 新增管理员 - * - * @param systemAdminAddRequest - * @return */ SystemAdminResponse saveAdmin(SystemAdminAddRequest systemAdminAddRequest) throws Exception; /** * 更新管理员 - * - * @param systemAdminRequest - * @return - * @throws Exception */ SystemAdminResponse updateAdmin(SystemAdminRequest systemAdminRequest) throws Exception; @@ -78,4 +69,22 @@ public interface SystemAdminService extends IService { Boolean updateStatus(Integer id, Boolean status); HashMap getMapInId(List adminIdList); + + /** + * 修改后台管理员是否接收状态 + * @param id 管理员id + * @return Boolean + */ + Boolean updateIsSms(Integer id); + + /** + * 获取可以接收短信的管理员 + */ + List findIsSmsList(); + + /** + * 获取登录页图片 + * @return Map + */ + Map getLoginPic(); } diff --git a/crmeb/src/main/java/com/zbkj/crmeb/system/service/impl/SystemAdminServiceImpl.java b/crmeb/src/main/java/com/zbkj/crmeb/system/service/impl/SystemAdminServiceImpl.java index 7fbd7965..467cee0f 100644 --- a/crmeb/src/main/java/com/zbkj/crmeb/system/service/impl/SystemAdminServiceImpl.java +++ b/crmeb/src/main/java/com/zbkj/crmeb/system/service/impl/SystemAdminServiceImpl.java @@ -1,29 +1,39 @@ package com.zbkj.crmeb.system.service.impl; +import cn.hutool.core.collection.CollUtil; import cn.hutool.core.util.ObjectUtil; +import cn.hutool.core.util.StrUtil; import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; import com.baomidou.mybatisplus.core.toolkit.Wrappers; import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; import com.common.PageParamRequest; import com.constants.Constants; +import com.constants.SysConfigConstants; +import com.constants.SysGroupDataConstants; import com.exception.CrmebException; import com.github.pagehelper.PageHelper; import com.utils.CrmebUtil; +import com.utils.ValidateFormUtil; import com.zbkj.crmeb.authorization.manager.TokenManager; import com.zbkj.crmeb.authorization.model.TokenModel; import com.zbkj.crmeb.system.dao.SystemAdminDao; import com.zbkj.crmeb.system.model.SystemAdmin; import com.zbkj.crmeb.system.model.SystemRole; -import com.zbkj.crmeb.system.model.SystemStoreStaff; import com.zbkj.crmeb.system.request.SystemAdminAddRequest; +import com.zbkj.crmeb.system.request.SystemAdminLoginRequest; import com.zbkj.crmeb.system.request.SystemAdminRequest; import com.zbkj.crmeb.system.request.SystemRoleSearchRequest; import com.zbkj.crmeb.system.response.SystemAdminResponse; +import com.zbkj.crmeb.system.response.SystemGroupDataAdminLoginBannerResponse; import com.zbkj.crmeb.system.service.SystemAdminService; +import com.zbkj.crmeb.system.service.SystemConfigService; +import com.zbkj.crmeb.system.service.SystemGroupDataService; import com.zbkj.crmeb.system.service.SystemRoleService; import com.zbkj.crmeb.user.model.UserToken; import com.zbkj.crmeb.user.service.UserTokenService; +import com.zbkj.crmeb.validatecode.model.ValidateCode; +import com.zbkj.crmeb.validatecode.service.ValidateCodeService; import com.zbkj.crmeb.wechat.response.WeChatAuthorizeLoginGetOpenIdResponse; import com.zbkj.crmeb.wechat.service.WeChatService; import org.apache.commons.lang3.StringUtils; @@ -35,6 +45,7 @@ import javax.annotation.Resource; import java.util.ArrayList; import java.util.HashMap; import java.util.List; +import java.util.Map; import java.util.stream.Collectors; /** @@ -67,6 +78,15 @@ public class SystemAdminServiceImpl extends ServiceImpl getList(SystemAdminRequest request, PageParamRequest pageParamRequest){ @@ -132,27 +152,30 @@ public class SystemAdminServiceImpl extends ServiceImpl lambdaQueryWrapper = new LambdaQueryWrapper<>(); - lambdaQueryWrapper.eq(SystemAdmin::getAccount, request.getAccount()); + lambdaQueryWrapper.eq(SystemAdmin::getAccount, systemAdminLoginRequest.getAccount()); SystemAdmin systemAdmin = dao.selectOne(lambdaQueryWrapper); - String encryptPassword = - CrmebUtil.encryptPassword(request.getPwd(),request.getAccount()); if(null == systemAdmin){ throw new CrmebException("用户不存在"); } - + // base64加密获取真正密码 + String encryptPassword = CrmebUtil.encryptPassword(systemAdminLoginRequest.getPwd(), systemAdminLoginRequest.getAccount()); + if(!systemAdmin.getPwd().equals(encryptPassword)){ + throw new CrmebException("账号或者密码不正确"); + } if(!systemAdmin.getStatus()){ throw new CrmebException("用户已经被禁用"); } - if(systemAdmin.getIsDel()){ throw new CrmebException("用户已经被删除"); } - if(!systemAdmin.getPwd().equals(encryptPassword)){ - throw new CrmebException("账号或者密码不正确"); - } TokenModel tokenModel = tokenManager.createToken(systemAdmin.getAccount(), systemAdmin.getId().toString(), TokenModel.TOKEN_REDIS); SystemAdminResponse systemAdminResponse = new SystemAdminResponse(); systemAdminResponse.setToken(tokenModel.getToken()); @@ -208,6 +231,11 @@ public class SystemAdminServiceImpl extends ServiceImpl findIsSmsList() { + LambdaQueryWrapper lqw = Wrappers.lambdaQuery(); + lqw.eq(SystemAdmin::getStatus, true); + lqw.eq(SystemAdmin::getIsDel, false); + lqw.eq(SystemAdmin::getIsSms, true); + List list = dao.selectList(lqw); + if (CollUtil.isEmpty(list)) { + return list; + } + return list.stream().filter(i -> StrUtil.isNotBlank(i.getPhone())).collect(Collectors.toList()); + } + + /** + * 获取登录页图片 + * @return + */ + @Override + public Map getLoginPic() { + Map map = new HashMap<>(); + //背景图 + map.put("backgroundImage", systemConfigService.getValueByKey(SysConfigConstants.CONFIG_KEY_ADMIN_LOGIN_BACKGROUND_IMAGE)); + //logo + map.put("logo", systemConfigService.getValueByKey(SysConfigConstants.CONFIG_KEY_ADMIN_LOGIN_LOGO_LEFT_TOP)); + map.put("loginLogo", systemConfigService.getValueByKey(SysConfigConstants.CONFIG_KEY_ADMIN_LOGIN_LOGO_LOGIN)); + //轮播图 + List bannerList = systemGroupDataService.getListByGid(SysGroupDataConstants.GROUP_DATA_ID_ADMIN_LOGIN_BANNER_IMAGE_LIST, SystemGroupDataAdminLoginBannerResponse.class); + map.put("banner", bannerList); + return map; + } + /** * 解绑微信 * @author Mr.Zhang diff --git a/crmeb/src/main/java/com/zbkj/crmeb/system/service/impl/SystemAttachmentServiceImpl.java b/crmeb/src/main/java/com/zbkj/crmeb/system/service/impl/SystemAttachmentServiceImpl.java index d9cc572e..b0798387 100644 --- a/crmeb/src/main/java/com/zbkj/crmeb/system/service/impl/SystemAttachmentServiceImpl.java +++ b/crmeb/src/main/java/com/zbkj/crmeb/system/service/impl/SystemAttachmentServiceImpl.java @@ -141,7 +141,7 @@ public class SystemAttachmentServiceImpl extends ServiceImpl + * +---------------------------------------------------------------------- + */ +@Component +@Configuration //读取配置 +@EnableScheduling // 2.开启定时任务 +public class BrokerageFrozenTask { + + //日志 + private static final Logger logger = LoggerFactory.getLogger(OrderReceiptTask.class); + + @Autowired + private UserBrokerageRecordService userBrokerageRecordService; + +// @Scheduled(fixedDelay = 1000 * 60 * 60L) //1小时同步一次数据 + @Scheduled(fixedDelay = 1000 * 60L) //1小时同步一次数据 + public void init(){ + logger.info("---BrokerageFrozenTask task------produce Data with fixed rate task: Execution Time - {}", DateUtil.nowDateTime()); + try { + userBrokerageRecordService.brokerageThaw(); + + }catch (Exception e){ + e.printStackTrace(); + logger.error("BrokerageFrozenTask.task" + " | msg : " + e.getMessage()); + } + + } +} diff --git a/crmeb/src/main/java/com/zbkj/crmeb/task/cloud/AsyncCloud.java b/crmeb/src/main/java/com/zbkj/crmeb/task/cloud/AsyncCloud.java index ae96c993..eae05c5e 100644 --- a/crmeb/src/main/java/com/zbkj/crmeb/task/cloud/AsyncCloud.java +++ b/crmeb/src/main/java/com/zbkj/crmeb/task/cloud/AsyncCloud.java @@ -22,9 +22,9 @@ import org.springframework.stereotype.Component; * | Author: CRMEB Team * +---------------------------------------------------------------------- */ -@Component -@Configuration //读取配置 -@EnableScheduling // 2.开启定时任务 +//@Component +//@Configuration //读取配置 +//@EnableScheduling // 2.开启定时任务 public class AsyncCloud { //日志 private static final Logger logger = LoggerFactory.getLogger(AsyncCloud.class); diff --git a/crmeb/src/main/java/com/zbkj/crmeb/task/order/OrderAutoCancelTask.java b/crmeb/src/main/java/com/zbkj/crmeb/task/order/OrderAutoCancelTask.java new file mode 100644 index 00000000..e460b5fc --- /dev/null +++ b/crmeb/src/main/java/com/zbkj/crmeb/task/order/OrderAutoCancelTask.java @@ -0,0 +1,47 @@ +package com.zbkj.crmeb.task.order; + +import com.utils.DateUtil; +import com.zbkj.crmeb.store.service.OrderTaskService; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.context.annotation.Configuration; +import org.springframework.scheduling.annotation.EnableScheduling; +import org.springframework.scheduling.annotation.Scheduled; +import org.springframework.stereotype.Component; + +/** + * 系统自动取消未支付订单task任务 + * +---------------------------------------------------------------------- + * | CRMEB [ CRMEB赋能开发者,助力企业发展 ] + * +---------------------------------------------------------------------- + * | Copyright (c) 2016~2020 https://www.crmeb.com All rights reserved. + * +---------------------------------------------------------------------- + * | Licensed CRMEB并不是自由软件,未经许可不能去掉CRMEB相关版权 + * +---------------------------------------------------------------------- + * | Author: CRMEB Team + * +---------------------------------------------------------------------- + */ +@Component +@Configuration //读取配置 +@EnableScheduling // 2.开启定时任务 +public class OrderAutoCancelTask { + //日志 + private static final Logger logger = LoggerFactory.getLogger(OrderAutoCancelTask.class); + + @Autowired + private OrderTaskService orderTaskService; + + @Scheduled(fixedDelay = 1000 * 60L) //1分钟同步一次数据 + public void init(){ + logger.info("---OrderAutoCancelTask task------produce Data with fixed rate task: Execution Time - {}", DateUtil.nowDateTime()); + try { + orderTaskService.autoCancel(); + + }catch (Exception e){ + e.printStackTrace(); + logger.error("OrderAutoCancelTask.task" + " | msg : " + e.getMessage()); + } + + } +} diff --git a/crmeb/src/main/java/com/zbkj/crmeb/task/order/OrderAutoCompleteTask.java b/crmeb/src/main/java/com/zbkj/crmeb/task/order/OrderAutoCompleteTask.java new file mode 100644 index 00000000..009e7dc0 --- /dev/null +++ b/crmeb/src/main/java/com/zbkj/crmeb/task/order/OrderAutoCompleteTask.java @@ -0,0 +1,48 @@ +package com.zbkj.crmeb.task.order; + +import com.utils.DateUtil; +import com.zbkj.crmeb.store.service.OrderTaskService; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.context.annotation.Configuration; +import org.springframework.scheduling.annotation.EnableScheduling; +import org.springframework.scheduling.annotation.Scheduled; +import org.springframework.stereotype.Component; + +/** + * 订单自动完成Task + * +---------------------------------------------------------------------- + * | CRMEB [ CRMEB赋能开发者,助力企业发展 ] + * +---------------------------------------------------------------------- + * | Copyright (c) 2016~2020 https://www.crmeb.com All rights reserved. + * +---------------------------------------------------------------------- + * | Licensed CRMEB并不是自由软件,未经许可不能去掉CRMEB相关版权 + * +---------------------------------------------------------------------- + * | Author: CRMEB Team + * +---------------------------------------------------------------------- + */ +@Component +@Configuration //读取配置 +@EnableScheduling // 2.开启定时任务 +public class OrderAutoCompleteTask { + + //日志 + private static final Logger logger = LoggerFactory.getLogger(OrderCompleteTask.class); + + @Autowired + private OrderTaskService orderTaskService; + + @Scheduled(fixedDelay = 1000 * 60L * 60) //每小时同步一次数据 + public void init(){ + logger.info("---OrderAutoCompleteTask task------produce Data with fixed rate task: Execution Time - {}", DateUtil.nowDateTime()); + try { + orderTaskService.autoComplete(); + }catch (Exception e){ + e.printStackTrace(); + logger.error("OrderAutoCompleteTask.task" + " | msg : " + e.getMessage()); + } + + } + +} diff --git a/crmeb/src/main/java/com/zbkj/crmeb/task/order/OrderCancelByUser.java b/crmeb/src/main/java/com/zbkj/crmeb/task/order/OrderCancelByUser.java index 22a33a5f..33e636a1 100644 --- a/crmeb/src/main/java/com/zbkj/crmeb/task/order/OrderCancelByUser.java +++ b/crmeb/src/main/java/com/zbkj/crmeb/task/order/OrderCancelByUser.java @@ -11,18 +11,6 @@ import org.springframework.scheduling.annotation.EnableScheduling; import org.springframework.scheduling.annotation.Scheduled; import org.springframework.stereotype.Component; -/** - * 用户取消订单后台任务 - * +---------------------------------------------------------------------- - * | CRMEB [ CRMEB赋能开发者,助力企业发展 ] - * +---------------------------------------------------------------------- - * | Copyright (c) 2016~2020 https://www.crmeb.com All rights reserved. - * +---------------------------------------------------------------------- - * | Licensed CRMEB并不是自由软件,未经许可不能去掉CRMEB相关版权 - * +---------------------------------------------------------------------- - * | Author: CRMEB Team - * +---------------------------------------------------------------------- - */ @Component @Configuration //读取配置 @EnableScheduling // 2.开启定时任务 @@ -36,7 +24,7 @@ public class OrderCancelByUser { @Scheduled(fixedDelay = 1000 * 60L) //1分钟同步一次数据 public void init(){ - logger.info("---OrderRefundByUser task------produce Data with fixed rate task: Execution Time - {}", DateUtil.nowDateTime()); +// logger.info("---OrderRefundByUser task------produce Data with fixed rate task: Execution Time - {}", DateUtil.nowDateTime()); try { orderTaskService.cancelByUser(); diff --git a/crmeb/src/main/java/com/zbkj/crmeb/task/order/OrderCompleteByUser.java b/crmeb/src/main/java/com/zbkj/crmeb/task/order/OrderCompleteByUser.java index 33210d7a..760252dd 100644 --- a/crmeb/src/main/java/com/zbkj/crmeb/task/order/OrderCompleteByUser.java +++ b/crmeb/src/main/java/com/zbkj/crmeb/task/order/OrderCompleteByUser.java @@ -10,18 +10,6 @@ import org.springframework.scheduling.annotation.EnableScheduling; import org.springframework.scheduling.annotation.Scheduled; import org.springframework.stereotype.Component; -/** - * 用户订单收货 后台任务 - * +---------------------------------------------------------------------- - * | CRMEB [ CRMEB赋能开发者,助力企业发展 ] - * +---------------------------------------------------------------------- - * | Copyright (c) 2016~2020 https://www.crmeb.com All rights reserved. - * +---------------------------------------------------------------------- - * | Licensed CRMEB并不是自由软件,未经许可不能去掉CRMEB相关版权 - * +---------------------------------------------------------------------- - * | Author: CRMEB Team - * +---------------------------------------------------------------------- - */ @Component @Configuration //读取配置 @EnableScheduling // 2.开启定时任务 @@ -35,7 +23,7 @@ public class OrderCompleteByUser { @Scheduled(fixedDelay = 1000 * 60L) //1分钟同步一次数据 public void init(){ - logger.info("---OrderCompleteByUser task------produce Data with fixed rate task: Execution Time - {}", DateUtil.nowDateTime()); +// logger.info("---OrderCompleteByUser task------produce Data with fixed rate task: Execution Time - {}", DateUtil.nowDateTime()); try { orderTaskService.complete(); diff --git a/crmeb/src/main/java/com/zbkj/crmeb/task/order/OrderDeleteByUser.java b/crmeb/src/main/java/com/zbkj/crmeb/task/order/OrderDeleteByUser.java index 6a66048f..a9e86b14 100644 --- a/crmeb/src/main/java/com/zbkj/crmeb/task/order/OrderDeleteByUser.java +++ b/crmeb/src/main/java/com/zbkj/crmeb/task/order/OrderDeleteByUser.java @@ -10,18 +10,6 @@ import org.springframework.scheduling.annotation.EnableScheduling; import org.springframework.scheduling.annotation.Scheduled; import org.springframework.stereotype.Component; -/** - * 用户订单删除 后台任务 - * +---------------------------------------------------------------------- - * | CRMEB [ CRMEB赋能开发者,助力企业发展 ] - * +---------------------------------------------------------------------- - * | Copyright (c) 2016~2020 https://www.crmeb.com All rights reserved. - * +---------------------------------------------------------------------- - * | Licensed CRMEB并不是自由软件,未经许可不能去掉CRMEB相关版权 - * +---------------------------------------------------------------------- - * | Author: CRMEB Team - * +---------------------------------------------------------------------- - */ @Component @Configuration //读取配置 @EnableScheduling // 2.开启定时任务 @@ -35,7 +23,7 @@ public class OrderDeleteByUser { @Scheduled(fixedDelay = 1000 * 60L) //1分钟同步一次数据 public void init(){ - logger.info("---OrderDeleteByUser task------produce Data with fixed rate task: Execution Time - {}", DateUtil.nowDateTime()); +// logger.info("---OrderDeleteByUser task------produce Data with fixed rate task: Execution Time - {}", DateUtil.nowDateTime()); try { orderTaskService.deleteByUser(); diff --git a/crmeb/src/main/java/com/zbkj/crmeb/task/order/OrderReceiptTask.java b/crmeb/src/main/java/com/zbkj/crmeb/task/order/OrderReceiptTask.java index c867964a..adf00516 100644 --- a/crmeb/src/main/java/com/zbkj/crmeb/task/order/OrderReceiptTask.java +++ b/crmeb/src/main/java/com/zbkj/crmeb/task/order/OrderReceiptTask.java @@ -35,7 +35,7 @@ public class OrderReceiptTask { public void init(){ logger.info("---OrderReceiptTask task------produce Data with fixed rate task: Execution Time - {}", DateUtil.nowDateTime()); try { - orderTaskService.takeByUser(); + orderTaskService.orderReceiving(); }catch (Exception e){ e.printStackTrace(); diff --git a/crmeb/src/main/java/com/zbkj/crmeb/task/order/OrderRefundByUser.java b/crmeb/src/main/java/com/zbkj/crmeb/task/order/OrderRefundByUser.java index 9e846836..8d3656e3 100644 --- a/crmeb/src/main/java/com/zbkj/crmeb/task/order/OrderRefundByUser.java +++ b/crmeb/src/main/java/com/zbkj/crmeb/task/order/OrderRefundByUser.java @@ -1,6 +1,5 @@ package com.zbkj.crmeb.task.order; -import com.utils.DateUtil; import com.zbkj.crmeb.store.service.OrderTaskService; import org.slf4j.Logger; import org.slf4j.LoggerFactory; @@ -10,21 +9,10 @@ import org.springframework.scheduling.annotation.EnableScheduling; import org.springframework.scheduling.annotation.Scheduled; import org.springframework.stereotype.Component; -/** - * 账单退款操作 - * +---------------------------------------------------------------------- - * | CRMEB [ CRMEB赋能开发者,助力企业发展 ] - * +---------------------------------------------------------------------- - * | Copyright (c) 2016~2020 https://www.crmeb.com All rights reserved. - * +---------------------------------------------------------------------- - * | Licensed CRMEB并不是自由软件,未经许可不能去掉CRMEB相关版权 - * +---------------------------------------------------------------------- - * | Author: CRMEB Team - * +---------------------------------------------------------------------- - */ @Component @Configuration //读取配置 @EnableScheduling // 2.开启定时任务 + public class OrderRefundByUser { //日志 private static final Logger logger = LoggerFactory.getLogger(OrderRefundByUser.class); @@ -34,7 +22,7 @@ public class OrderRefundByUser { @Scheduled(fixedDelay = 1000 * 60L) //1分钟同步一次数据 public void init(){ - logger.info("---OrderRefundByUser task------produce Data with fixed rate task: Execution Time - {}", DateUtil.nowDateTime()); +// logger.info("---OrderRefundByUser task------produce Data with fixed rate task: Execution Time - {}", DateUtil.nowDateTime()); try { orderTaskService.refundApply(); diff --git a/crmeb/src/main/java/com/zbkj/crmeb/task/order/OrderTakeByUser.java b/crmeb/src/main/java/com/zbkj/crmeb/task/order/OrderTakeByUser.java index 9d211c2a..4c0814a3 100644 --- a/crmeb/src/main/java/com/zbkj/crmeb/task/order/OrderTakeByUser.java +++ b/crmeb/src/main/java/com/zbkj/crmeb/task/order/OrderTakeByUser.java @@ -10,17 +10,6 @@ import org.springframework.scheduling.annotation.EnableScheduling; import org.springframework.scheduling.annotation.Scheduled; import org.springframework.stereotype.Component; -/** 用户确认收货 - * +---------------------------------------------------------------------- - * | CRMEB [ CRMEB赋能开发者,助力企业发展 ] - * +---------------------------------------------------------------------- - * | Copyright (c) 2016~2020 https://www.crmeb.com All rights reserved. - * +---------------------------------------------------------------------- - * | Licensed CRMEB并不是自由软件,未经许可不能去掉CRMEB相关版权 - * +---------------------------------------------------------------------- - * | Author: CRMEB Team - * +---------------------------------------------------------------------- - */ @Component @Configuration //读取配置 @EnableScheduling // 2.开启定时任务 @@ -34,7 +23,7 @@ public class OrderTakeByUser { @Scheduled(fixedDelay = 1000 * 60L) //1分钟同步一次数据 public void init(){ - logger.info("---OrderTakeByUser task------produce Data with fixed rate task: Execution Time - {}", DateUtil.nowDateTime()); +// logger.info("---OrderTakeByUser task------produce Data with fixed rate task: Execution Time - {}", DateUtil.nowDateTime()); try { orderTaskService.takeByUser(); diff --git a/crmeb/src/main/java/com/zbkj/crmeb/task/pink/PinkStatusChange.java b/crmeb/src/main/java/com/zbkj/crmeb/task/pink/PinkStatusChange.java index 8e8eae68..566741b8 100644 --- a/crmeb/src/main/java/com/zbkj/crmeb/task/pink/PinkStatusChange.java +++ b/crmeb/src/main/java/com/zbkj/crmeb/task/pink/PinkStatusChange.java @@ -36,12 +36,12 @@ public class PinkStatusChange { @Scheduled(cron = "0 */1 * * * ?") //每分钟执行一次 public void init(){ - logger.info("---BargainStopChangeTask------bargain stop status change task: Execution Time - {}", DateUtil.nowDateTime()); + logger.info("---PinkStatusChange------bargain stop status change task: Execution Time - {}", DateUtil.nowDateTime()); try { storePinkService.detectionStatus(); }catch (Exception e){ e.printStackTrace(); - logger.error("BargainStopChangeTask" + " | msg : " + e.getMessage()); + logger.error("PinkStatusChange" + " | msg : " + e.getMessage()); } } diff --git a/crmeb/src/main/java/com/zbkj/crmeb/task/wechat/AsyncWeChatProgramTempList.java b/crmeb/src/main/java/com/zbkj/crmeb/task/wechat/AsyncWeChatProgramTempList.java index 81ea2f26..e31cfaa6 100644 --- a/crmeb/src/main/java/com/zbkj/crmeb/task/wechat/AsyncWeChatProgramTempList.java +++ b/crmeb/src/main/java/com/zbkj/crmeb/task/wechat/AsyncWeChatProgramTempList.java @@ -23,9 +23,9 @@ import org.springframework.stereotype.Component; * | Author: CRMEB Team * +---------------------------------------------------------------------- */ -@Component -@Configuration //读取配置 -@EnableScheduling // 2.开启定时任务 +//@Component +//@Configuration //读取配置 +//@EnableScheduling // 2.开启定时任务 public class AsyncWeChatProgramTempList { //日志 private static final Logger logger = LoggerFactory.getLogger(AsyncWeChatProgramTempList.class); diff --git a/crmeb/src/main/java/com/zbkj/crmeb/user/controller/UserController.java b/crmeb/src/main/java/com/zbkj/crmeb/user/controller/UserController.java index c67aed1b..46b7ec51 100644 --- a/crmeb/src/main/java/com/zbkj/crmeb/user/controller/UserController.java +++ b/crmeb/src/main/java/com/zbkj/crmeb/user/controller/UserController.java @@ -1,6 +1,7 @@ package com.zbkj.crmeb.user.controller; +import cn.hutool.core.util.ObjectUtil; import com.common.CommonPage; import com.common.CommonResult; import com.common.PageParamRequest; @@ -90,10 +91,8 @@ public class UserController { @ApiOperation(value = "修改") @RequestMapping(value = "/update", method = RequestMethod.POST) public CommonResult update(@RequestParam Integer id, @RequestBody UserRequest userRequest){ - User user = new User(); - BeanUtils.copyProperties(userRequest, user); - user.setUid(id); - if(userService.updateById(user)){ + userRequest.setUid(id); + if(userService.updateUser(userRequest)){ return CommonResult.success(); }else{ return CommonResult.failed(); @@ -142,14 +141,11 @@ public class UserController { @ApiOperation(value = "会员详情页Top数据") @RequestMapping(value = "topdetail", method = RequestMethod.GET) public CommonResult topDetail (@RequestParam @Valid Integer userId){ - return CommonResult.success(userService.getTopDetail(userId)); } /** * 操作积分 - * @author Mr.Zhang - * @since 2020-04-10 */ @ApiOperation(value = "积分余额") @RequestMapping(value = "/operate/founds", method = RequestMethod.GET) diff --git a/crmeb/src/main/java/com/zbkj/crmeb/user/controller/UserTagController.java b/crmeb/src/main/java/com/zbkj/crmeb/user/controller/UserTagController.java index cf26fdab..8ba9265d 100644 --- a/crmeb/src/main/java/com/zbkj/crmeb/user/controller/UserTagController.java +++ b/crmeb/src/main/java/com/zbkj/crmeb/user/controller/UserTagController.java @@ -4,6 +4,7 @@ import com.common.CommonPage; import com.common.CommonResult; import com.common.PageParamRequest; import com.zbkj.crmeb.user.request.UserTagRequest; +import com.zbkj.crmeb.user.service.UserService; import lombok.extern.slf4j.Slf4j; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.validation.annotation.Validated; @@ -16,7 +17,7 @@ import com.zbkj.crmeb.user.model.UserTag; /** - * 用户分组表 前端控制器 + * 用户标签 前端控制器 * +---------------------------------------------------------------------- * | CRMEB [ CRMEB赋能开发者,助力企业发展 ] * +---------------------------------------------------------------------- @@ -37,11 +38,12 @@ public class UserTagController { @Autowired private UserTagService userTagService; + @Autowired + private UserService userService; + /** - * 分页显示用户分组表 + * 分页显示用户分标签 * @param pageParamRequest 分页参数 - * @author Mr.Zhang - * @since 2020-06-05 */ @ApiOperation(value = "分页列表") //配合swagger使用 @RequestMapping(value = "/list", method = RequestMethod.GET) @@ -51,10 +53,8 @@ public class UserTagController { } /** - * 新增用户分组表 + * 新增用户分标签 * @param userTagRequest 新增参数 - * @author Mr.Zhang - * @since 2020-06-05 */ @ApiOperation(value = "新增") @RequestMapping(value = "/save", method = RequestMethod.POST) @@ -70,15 +70,14 @@ public class UserTagController { } /** - * 删除用户分组表 + * 删除用户分标签 * @param id Integer - * @author Mr.Zhang - * @since 2020-06-05 */ @ApiOperation(value = "删除") @RequestMapping(value = "/delete", method = RequestMethod.GET) public CommonResult delete(@RequestParam(value = "id") Integer id){ if(userTagService.removeById(id)){ + userService.clearGroupByGroupId(id+""); return CommonResult.success(); }else{ return CommonResult.failed(); @@ -86,11 +85,9 @@ public class UserTagController { } /** - * 修改用户分组表 + * 修改用户标签 * @param id integer id * @param userTagRequest 修改参数 - * @author Mr.Zhang - * @since 2020-06-05 */ @ApiOperation(value = "修改") @RequestMapping(value = "/update", method = RequestMethod.POST) @@ -107,10 +104,8 @@ public class UserTagController { } /** - * 查询用户分组表信息 + * 查询用户标签 * @param id Integer - * @author Mr.Zhang - * @since 2020-06-05 */ @ApiOperation(value = "详情") @RequestMapping(value = "/info", method = RequestMethod.GET) diff --git a/crmeb/src/main/java/com/zbkj/crmeb/user/dao/UserBillDao.java b/crmeb/src/main/java/com/zbkj/crmeb/user/dao/UserBillDao.java index b6ce8959..f8afa5ba 100644 --- a/crmeb/src/main/java/com/zbkj/crmeb/user/dao/UserBillDao.java +++ b/crmeb/src/main/java/com/zbkj/crmeb/user/dao/UserBillDao.java @@ -25,4 +25,6 @@ public interface UserBillDao extends BaseMapper { List getListAdmin(Map map); List getListAdminAndIntegeal(Map map); + + List fundMonitoring(Map map); } diff --git a/crmeb/src/main/java/com/zbkj/crmeb/user/dao/UserBrokerageRecordDao.java b/crmeb/src/main/java/com/zbkj/crmeb/user/dao/UserBrokerageRecordDao.java new file mode 100644 index 00000000..6dc4f105 --- /dev/null +++ b/crmeb/src/main/java/com/zbkj/crmeb/user/dao/UserBrokerageRecordDao.java @@ -0,0 +1,20 @@ +package com.zbkj.crmeb.user.dao; + +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import com.zbkj.crmeb.user.model.UserBrokerageRecord; + +/** + * 用户佣金记录表 Mapper 接口 + * +---------------------------------------------------------------------- + * | CRMEB [ CRMEB赋能开发者,助力企业发展 ] + * +---------------------------------------------------------------------- + * | Copyright (c) 2016~2020 https://www.crmeb.com All rights reserved. + * +---------------------------------------------------------------------- + * | Licensed CRMEB并不是自由软件,未经许可不能去掉CRMEB相关版权 + * +---------------------------------------------------------------------- + * | Author: CRMEB Team + * +---------------------------------------------------------------------- + */ +public interface UserBrokerageRecordDao extends BaseMapper { + +} diff --git a/crmeb/src/main/java/com/zbkj/crmeb/user/model/UserBrokerageRecord.java b/crmeb/src/main/java/com/zbkj/crmeb/user/model/UserBrokerageRecord.java new file mode 100644 index 00000000..3e43863e --- /dev/null +++ b/crmeb/src/main/java/com/zbkj/crmeb/user/model/UserBrokerageRecord.java @@ -0,0 +1,81 @@ +package com.zbkj.crmeb.user.model; + +import com.baomidou.mybatisplus.annotation.IdType; +import com.baomidou.mybatisplus.annotation.TableId; +import com.baomidou.mybatisplus.annotation.TableName; +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; +import lombok.EqualsAndHashCode; +import lombok.experimental.Accessors; + +import java.io.Serializable; +import java.math.BigDecimal; +import java.util.Date; + +/** + * 用户佣金记录表 + * +---------------------------------------------------------------------- + * | CRMEB [ CRMEB赋能开发者,助力企业发展 ] + * +---------------------------------------------------------------------- + * | Copyright (c) 2016~2020 https://www.crmeb.com All rights reserved. + * +---------------------------------------------------------------------- + * | Licensed CRMEB并不是自由软件,未经许可不能去掉CRMEB相关版权 + * +---------------------------------------------------------------------- + * | Author: CRMEB Team + * +---------------------------------------------------------------------- + */ +@Data +@EqualsAndHashCode(callSuper = false) +@Accessors(chain = true) +@TableName("eb_user_brokerage_record") +@ApiModel(value="UserBrokerageRecord对象", description="用户佣金记录表") +public class UserBrokerageRecord implements Serializable { + + private static final long serialVersionUID=1L; + + @ApiModelProperty(value = "记录id") + @TableId(value = "id", type = IdType.AUTO) + private Integer id; + + @ApiModelProperty(value = "用户uid") + private Integer uid; + + @ApiModelProperty(value = "关联id(orderNo,提现id)") + private String linkId; + + @ApiModelProperty(value = "关联类型(order,extract,yue)") + private String linkType; + + @ApiModelProperty(value = "类型:1-增加,2-扣减(提现)") + private Integer type; + + @ApiModelProperty(value = "标题") + private String title; + + @ApiModelProperty(value = "金额") + private BigDecimal price; + + @ApiModelProperty(value = "剩余") + private BigDecimal balance; + + @ApiModelProperty(value = "备注") + private String mark; + + @ApiModelProperty(value = "状态:1-订单创建,2-冻结期,3-完成,4-失效(订单退款),5-提现申请") + private Integer status; + + @ApiModelProperty(value = "冻结期时间(天)") + private Integer frozenTime; + + @ApiModelProperty(value = "解冻时间") + private Long thawTime; + + @ApiModelProperty(value = "添加时间") + private Date createTime; + + @ApiModelProperty(value = "更新时间") + private Date updateTime; + + +} diff --git a/crmeb/src/main/java/com/zbkj/crmeb/user/request/UserRequest.java b/crmeb/src/main/java/com/zbkj/crmeb/user/request/UserRequest.java index c59ad70f..16a1ef6e 100644 --- a/crmeb/src/main/java/com/zbkj/crmeb/user/request/UserRequest.java +++ b/crmeb/src/main/java/com/zbkj/crmeb/user/request/UserRequest.java @@ -35,6 +35,9 @@ public class UserRequest implements Serializable { private static final long serialVersionUID=1L; + @ApiModelProperty(value = "uid") + private Integer uid; + @ApiModelProperty(value = "真实姓名") @NotNull private String realName; diff --git a/crmeb/src/main/java/com/zbkj/crmeb/user/response/SpreadUserResponse.java b/crmeb/src/main/java/com/zbkj/crmeb/user/response/SpreadUserResponse.java new file mode 100644 index 00000000..2e324809 --- /dev/null +++ b/crmeb/src/main/java/com/zbkj/crmeb/user/response/SpreadUserResponse.java @@ -0,0 +1,74 @@ +package com.zbkj.crmeb.user.response; + +import com.baomidou.mybatisplus.annotation.IdType; +import com.baomidou.mybatisplus.annotation.TableId; +import com.fasterxml.jackson.annotation.JsonIgnore; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +import java.math.BigDecimal; +import java.util.Date; + +/** + * 推广用户响应体 + * +---------------------------------------------------------------------- + * | CRMEB [ CRMEB赋能开发者,助力企业发展 ] + * +---------------------------------------------------------------------- + * | Copyright (c) 2016~2020 https://www.crmeb.com All rights reserved. + * +---------------------------------------------------------------------- + * | Licensed CRMEB并不是自由软件,未经许可不能去掉CRMEB相关版权 + * +---------------------------------------------------------------------- + * | Author: CRMEB Team + * +---------------------------------------------------------------------- + */ +@Data +public class SpreadUserResponse { + + @ApiModelProperty(value = "用户id") + private Integer uid; + + @ApiModelProperty(value = "真实姓名") + private String realName; + + @ApiModelProperty(value = "用户昵称") + private String nickname; + + @ApiModelProperty(value = "用户头像") + private String avatar; + + @ApiModelProperty(value = "手机号码") + private String phone; + + @ApiModelProperty(value = "佣金金额,未提现金额") + private BigDecimal brokeragePrice; + + @ApiModelProperty(value = "推广人id") + private Integer spreadUid; + + @ApiModelProperty(value = "上级推广员名称") + private String spreadNickname; + + @ApiModelProperty(value = "用户购买次数") + private Integer payCount; + + @ApiModelProperty(value = "推广用户数") + private Integer spreadCount; + + @ApiModelProperty(value = "推广订单数") + private Integer spreadOrderNum; + + @ApiModelProperty(value = "推广订单额") + private BigDecimal spreadOrderTotalPrice; + + @ApiModelProperty(value = "佣金总金额") + private BigDecimal totalBrokeragePrice; + + @ApiModelProperty(value = "推广用户数量") + private int spreadPeopleCount; + + @ApiModelProperty(value = "已提现金额") + private BigDecimal extractCountPrice; + + @ApiModelProperty(value = "已提现次数") + private Integer extractCountNum; +} diff --git a/crmeb/src/main/java/com/zbkj/crmeb/user/response/UserResponse.java b/crmeb/src/main/java/com/zbkj/crmeb/user/response/UserResponse.java index 78201617..2ae3e088 100644 --- a/crmeb/src/main/java/com/zbkj/crmeb/user/response/UserResponse.java +++ b/crmeb/src/main/java/com/zbkj/crmeb/user/response/UserResponse.java @@ -50,7 +50,7 @@ public class UserResponse { private Integer partnerId; @ApiModelProperty(value = "用户分组id") - private Integer groupId; + private String groupId; @ApiModelProperty(value = "分组名称") private String groupName; @@ -58,6 +58,9 @@ public class UserResponse { @ApiModelProperty(value = "标签名称") private String tagName; + @ApiModelProperty(value = "标签Ids") + private String tagId; + @ApiModelProperty(value = "用户昵称") private String nickname; @@ -141,4 +144,7 @@ public class UserResponse { @ApiModelProperty(value = "清除时间") private Date cleanTime; + + @ApiModelProperty(value = "是否关注公众号") + private Boolean subscribe; } diff --git a/crmeb/src/main/java/com/zbkj/crmeb/user/service/UserBillService.java b/crmeb/src/main/java/com/zbkj/crmeb/user/service/UserBillService.java index c1e1ec95..c9675234 100644 --- a/crmeb/src/main/java/com/zbkj/crmeb/user/service/UserBillService.java +++ b/crmeb/src/main/java/com/zbkj/crmeb/user/service/UserBillService.java @@ -3,6 +3,7 @@ package com.zbkj.crmeb.user.service; import com.baomidou.mybatisplus.extension.service.IService; import com.common.PageParamRequest; import com.github.pagehelper.PageInfo; +import com.zbkj.crmeb.finance.request.FundsMonitorRequest; import com.zbkj.crmeb.finance.request.FundsMonitorSearchRequest; import com.zbkj.crmeb.front.response.UserSpreadCommissionResponse; import com.zbkj.crmeb.store.request.StoreOrderRefundRequest; @@ -188,4 +189,20 @@ public interface UserBillService extends IService { * @param uid 用户id */ List findListByOrderIdAndUid(Integer orderId, Integer uid); + + /** + * 资金监控 + * @param request 查询参数 + * @param pageParamRequest 分页参数 + * @return PageInfo + */ + PageInfo fundMonitoring(FundsMonitorRequest request, PageParamRequest pageParamRequest); + + /** + * 用户账单记录(现金) + * @param uid 用户uid + * @param type 记录类型:all-全部,expenditure-支出,income-收入 + * @return + */ + PageInfo nowMoneyBillRecord(Integer uid, String type, PageParamRequest pageRequest); } \ No newline at end of file diff --git a/crmeb/src/main/java/com/zbkj/crmeb/user/service/UserBrokerageRecordService.java b/crmeb/src/main/java/com/zbkj/crmeb/user/service/UserBrokerageRecordService.java new file mode 100644 index 00000000..311db286 --- /dev/null +++ b/crmeb/src/main/java/com/zbkj/crmeb/user/service/UserBrokerageRecordService.java @@ -0,0 +1,128 @@ +package com.zbkj.crmeb.user.service; + +import com.baomidou.mybatisplus.extension.service.IService; +import com.common.PageParamRequest; +import com.github.pagehelper.PageInfo; +import com.zbkj.crmeb.front.response.SpreadCommissionDetailResponse; +import com.zbkj.crmeb.user.model.UserBrokerageRecord; + +import java.math.BigDecimal; +import java.util.List; +import java.util.Map; + +/** + * 用户佣金记录服务接口 + * +---------------------------------------------------------------------- + * | CRMEB [ CRMEB赋能开发者,助力企业发展 ] + * +---------------------------------------------------------------------- + * | Copyright (c) 2016~2020 https://www.crmeb.com All rights reserved. + * +---------------------------------------------------------------------- + * | Licensed CRMEB并不是自由软件,未经许可不能去掉CRMEB相关版权 + * +---------------------------------------------------------------------- + * | Author: CRMEB Team + * +---------------------------------------------------------------------- + */ +public interface UserBrokerageRecordService extends IService { + + /** + * 获取记录列表 + * @param linkId 关联id + * @param linkType 关联类型 + * @return 记录列表 + */ + List findListByLinkIdAndLinkType(String linkId, String linkType); + + /** + * 获取记录(订单不可用此方法) + * @param linkId 关联id + * @param linkType 关联类型 + * @return 记录列表 + */ + UserBrokerageRecord getByLinkIdAndLinkType(String linkId, String linkType); + + /** + * 佣金解冻 + */ + void brokerageThaw(); + + /** + * 昨天得佣金 + * @param uid 用户uid + */ + BigDecimal getYesterdayIncomes(Integer uid); + + /** + * 获取佣金明细列表根据uid + * @param uid uid + * @param pageParamRequest 分页参数 + */ + PageInfo findDetailListByUid(Integer uid, PageParamRequest pageParamRequest); + + /** + * 获取累计推广条数 + * @param uid 用户uid + * @return Integer + */ + Integer getSpreadCountByUid(Integer uid); + + /** + * 获取推广记录列表 + * @param uid 用户uid + * @param pageParamRequest 分页参数 + * @return List + */ + List findSpreadListByUid(Integer uid, PageParamRequest pageParamRequest); + + /** + * 获取月份对应的推广订单数 + * @param uid 用户uid + * @param monthList 月份列表 + * @return Map + */ + Map getSpreadCountByUidAndMonth(Integer uid, List monthList); + + /** + * 获取佣金排行榜(周、月) + * @param type week、month + * @param pageParamRequest 分页参数 + * @return List + */ + List getBrokerageTopByDate(String type, PageParamRequest pageParamRequest); + + /** + * 根据Uid和时间参数获取分佣记录列表 + * @param uid 用户uid + * @return List + */ + List getSpreadListByUid(Integer uid); + + /** + * 佣金总金额(单位时间) + * @param dateLimit 时间参数 + * @return BigDecimal + */ + BigDecimal getTotalSpreadPriceBydateLimit(String dateLimit); + + /** + * 单位时间消耗的佣金 + * @param dateLimit 时间参数 + * @return BigDecimal + */ + BigDecimal getSubSpreadPriceByDateLimit(String dateLimit); + + /** + * 佣金详情列表 + * @param uid uid + * @param dateLimit 时间参数 + * @param pageParamRequest 分页参数 + * @return PageInfo + */ + PageInfo getFundsMonitorDetail(Integer uid, String dateLimit, PageParamRequest pageParamRequest); + + /** + * 获取冻结期佣金 + * @param uid uid + * @return BigDecimal + */ + BigDecimal getFreezePrice(Integer uid); +} \ No newline at end of file diff --git a/crmeb/src/main/java/com/zbkj/crmeb/user/service/UserService.java b/crmeb/src/main/java/com/zbkj/crmeb/user/service/UserService.java index 1fc2fc3a..4f4549ff 100644 --- a/crmeb/src/main/java/com/zbkj/crmeb/user/service/UserService.java +++ b/crmeb/src/main/java/com/zbkj/crmeb/user/service/UserService.java @@ -60,8 +60,18 @@ public interface UserService extends IService { */ Boolean updateNowMoney(User user, BigDecimal price, String type); + /** + * 会员分组 + * @param id String id + * @param groupId Integer 分组Id + */ boolean group(String id, String groupId); + /** + * 清除会员登记 + * @param userId 用户id + * @return 清除结果 + */ boolean cleanLevel(Integer userId); LoginResponse register(RegisterRequest loginRequest, String ip) throws Exception; @@ -164,8 +174,9 @@ public interface UserService extends IService { * 获取分销人员列表 * @param keywords 搜索参数 * @param dateLimit 时间参数 + * @param storeBrokerageStatus 分销状态:1-指定分销,2-人人分销 */ - List findDistributionList(String keywords, String dateLimit); + List findDistributionList(String keywords, String dateLimit, String storeBrokerageStatus); /** * 获取发展会员人数 @@ -174,4 +185,94 @@ public interface UserService extends IService { * @return */ Integer getDevelopDistributionPeopleNum(List ids, String dateLimit); + + User getUserByAccount(String account); + + /** + * 手机号注册用户 + * @param phone 手机号 + * @param spreadUid 推广人编号 + * @param clientIp ip + * @return + */ + User registerPhone(String phone, Integer spreadUid, String clientIp); + + /** + * 检测能否绑定关系 + * @param user 当前用户 + * @param spreadUid 推广员Uid + * @param type 用户类型:new-新用户,old—老用户 + * @return Boolean + */ + Boolean checkBingSpread(User user, Integer spreadUid, String type); + + /** + * 更新推广员推广数 + * @param uid uid + * @return Boolean + */ + Boolean updateSpreadCountByUid(Integer uid); + + /** + * 添加/扣减佣金 + * @param uid 用户id + * @param price 金额 + * @param brokeragePrice 历史金额 + * @param type 类型:add—添加,sub—扣减 + */ + Boolean operationBrokerage(Integer uid, BigDecimal price, BigDecimal brokeragePrice, String type); + + /** + * 添加/扣减余额 + * @param uid 用户id + * @param price 金额 + * @param nowMoney 历史金额 + * @param type 类型:add—添加,sub—扣减 + */ + Boolean operationNowMoney(Integer uid, BigDecimal price, BigDecimal nowMoney, String type); + + /** + * 添加/扣减积分 + * @param uid 用户id + * @param integral 积分 + * @param nowIntegral 历史积分 + * @param type 类型:add—添加,sub—扣减 + */ + Boolean operationIntegral(Integer uid, Integer integral, Integer nowIntegral, String type); + + /** + * PC后台分销员列表 + * @param storeBrokerageStatus 分销模式 1-指定分销,2-人人分销 + * @param keywords 搜索参数 + * @param dateLimit 时间参数 + * @param pageRequest 分页参数 + * @return + */ + PageInfo getAdminSpreadPeopleList(String storeBrokerageStatus, String keywords, String dateLimit, PageParamRequest pageRequest); + + /** + * 推广用户数 + * @param uid 用户id + * @param dateLimit 时间参数 + * @return Integer + */ + Integer getSpreadNumberByUidAndDateLimit(Integer uid, String dateLimit); + + /** + * 清除User Group id + * @param groupId 待清除的GroupId + */ + void clearGroupByGroupId(String groupId); + + /** + * 清除tag + * @param tagIds tagIds + */ + void clearTagByTagId(String tagIds); + + /** + * 更新用户 + * @param userRequest 用户参数 + */ + Boolean updateUser(UserRequest userRequest); } diff --git a/crmeb/src/main/java/com/zbkj/crmeb/user/service/impl/UserBillServiceImpl.java b/crmeb/src/main/java/com/zbkj/crmeb/user/service/impl/UserBillServiceImpl.java index 8d38bcc1..7f5f42fa 100644 --- a/crmeb/src/main/java/com/zbkj/crmeb/user/service/impl/UserBillServiceImpl.java +++ b/crmeb/src/main/java/com/zbkj/crmeb/user/service/impl/UserBillServiceImpl.java @@ -16,6 +16,7 @@ import com.github.pagehelper.PageHelper; import com.github.pagehelper.PageInfo; import com.utils.DateUtil; import com.utils.vo.dateLimitUtilVo; +import com.zbkj.crmeb.finance.request.FundsMonitorRequest; import com.zbkj.crmeb.finance.request.FundsMonitorSearchRequest; import com.zbkj.crmeb.front.response.UserSpreadCommissionResponse; import com.zbkj.crmeb.store.request.StoreOrderRefundRequest; @@ -574,20 +575,6 @@ public class UserBillServiceImpl extends ServiceImpl impl */ @Override public List getSearchOption() { - -// LambdaQueryWrapper lqw = Wrappers.lambdaQuery(); -// lqw.select("DISTINCT title, type"); -// lqw.notIn(UserBill::getType,"gain", "system_sub", "deduction", "sign"); -// lqw.notIn(UserBill::getCategory,"exp", "integral"); -// lqw.groupBy(UserBill::getType); -// List userBills = dao.selectList(lqw); -// List result = new ArrayList<>(); -// for (UserBill userBill : userBills) { -// List existUserBills = result.stream().filter(e -> -// e.getTitle().equals(userBill.getTitle())).collect(Collectors.toList()); -// if(existUserBills.size() == 0) result.add(userBill); -// } -// return result; QueryWrapper qw = new QueryWrapper<>(); qw.select("DISTINCT title, type"); qw.notIn("type","gain", "system_sub", "deduction", "sign"); @@ -610,6 +597,57 @@ public class UserBillServiceImpl extends ServiceImpl impl return dao.selectList(lqw); } + /** + * 资金监控 + * @param request 查询参数 + * @param pageParamRequest 分页参数 + * @return PageInfo + */ + @Override + public PageInfo fundMonitoring(FundsMonitorRequest request, PageParamRequest pageParamRequest) { + Page billPage = PageHelper.startPage(pageParamRequest.getPage(), pageParamRequest.getLimit()); + Map map = new HashMap<>(); + if (StrUtil.isNotBlank(request.getKeywords())) { + map.put("keywords", StrUtil.format("%{}%", request.getKeywords())); + } + //时间范围 + if(StrUtil.isNotBlank(request.getDateLimit())){ + dateLimitUtilVo dateLimit = DateUtil.getDateLimit(request.getDateLimit()); + map.put("startTime", dateLimit.getStartTime()); + map.put("endTime", dateLimit.getEndTime()); + } + List userBillResponses = dao.fundMonitoring(map); + return CommonPage.copyPageInfo(billPage, userBillResponses); + } + + /** + * 用户账单记录(现金) + * @param uid 用户uid + * @param type 记录类型:all-全部,expenditure-支出,income-收入 + * @return + */ + @Override + public PageInfo nowMoneyBillRecord(Integer uid, String type, PageParamRequest pageRequest) { + Page billPage = PageHelper.startPage(pageRequest.getPage(), pageRequest.getLimit()); + LambdaQueryWrapper lqw = Wrappers.lambdaQuery(); + lqw.eq(UserBill::getUid, uid); + lqw.eq(UserBill::getCategory, Constants.USER_BILL_CATEGORY_MONEY); + switch (type) { + case "all": + break; + case "expenditure": + lqw.eq(UserBill::getPm, 0); + break; + case "income": + lqw.eq(UserBill::getPm, 1); + break; + } + lqw.eq(UserBill::getStatus, 1); + lqw.orderByDesc(UserBill::getId); + List billList = dao.selectList(lqw); + return CommonPage.copyPageInfo(billPage, billList); + } + /////////////////////////////////////////////////////////////////////// 自定义方法 private BigDecimal getIntegerByEntity(UserBill userBill) { diff --git a/crmeb/src/main/java/com/zbkj/crmeb/user/service/impl/UserBrokerageRecordServiceImpl.java b/crmeb/src/main/java/com/zbkj/crmeb/user/service/impl/UserBrokerageRecordServiceImpl.java new file mode 100644 index 00000000..ee3b8078 --- /dev/null +++ b/crmeb/src/main/java/com/zbkj/crmeb/user/service/impl/UserBrokerageRecordServiceImpl.java @@ -0,0 +1,373 @@ +package com.zbkj.crmeb.user.service.impl; + +import cn.hutool.core.collection.CollUtil; +import cn.hutool.core.util.ObjectUtil; +import cn.hutool.core.util.StrUtil; +import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; +import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; +import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; +import com.common.CommonPage; +import com.common.PageParamRequest; +import com.constants.BrokerageRecordConstants; +import com.constants.Constants; +import com.github.pagehelper.Page; +import com.github.pagehelper.PageHelper; +import com.github.pagehelper.PageInfo; +import com.utils.DateUtil; +import com.utils.vo.dateLimitUtilVo; +import com.zbkj.crmeb.front.response.SpreadCommissionDetailResponse; +import com.zbkj.crmeb.user.dao.UserBrokerageRecordDao; +import com.zbkj.crmeb.user.model.User; +import com.zbkj.crmeb.user.model.UserBrokerageRecord; +import com.zbkj.crmeb.user.service.UserBrokerageRecordService; +import com.zbkj.crmeb.user.service.UserService; +import org.apache.commons.lang3.StringUtils; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Service; +import org.springframework.transaction.support.TransactionTemplate; + +import javax.annotation.Resource; +import java.math.BigDecimal; +import java.util.List; +import java.util.Map; + +/** + * 用户佣金记录服务接口实现类 + * +---------------------------------------------------------------------- + * | CRMEB [ CRMEB赋能开发者,助力企业发展 ] + * +---------------------------------------------------------------------- + * | Copyright (c) 2016~2020 https://www.crmeb.com All rights reserved. + * +---------------------------------------------------------------------- + * | Licensed CRMEB并不是自由软件,未经许可不能去掉CRMEB相关版权 + * +---------------------------------------------------------------------- + * | Author: CRMEB Team + * +---------------------------------------------------------------------- + */ +@Service +public class UserBrokerageRecordServiceImpl extends ServiceImpl implements UserBrokerageRecordService { + + private static final Logger logger = LoggerFactory.getLogger(UserBrokerageRecordServiceImpl.class); + + @Resource + private UserBrokerageRecordDao dao; + + @Autowired + private UserService userService; + + @Autowired + private TransactionTemplate transactionTemplate; + + /** + * 根据订单编号获取记录列表 + * @param linkId 关联id + * @param linkType 关联类型 + * @return 记录列表 + */ + @Override + public List findListByLinkIdAndLinkType(String linkId, String linkType) { + LambdaQueryWrapper lqw = new LambdaQueryWrapper<>(); + lqw.eq(UserBrokerageRecord::getLinkId, linkId); + lqw.eq(UserBrokerageRecord::getLinkType, linkType); + return dao.selectList(lqw); + } + + /** + * 获取记录(订单不可用此方法) + * @param linkId 关联id + * @param linkType 关联类型 + * @return 记录列表 + */ + @Override + public UserBrokerageRecord getByLinkIdAndLinkType(String linkId, String linkType) { + LambdaQueryWrapper lqw = new LambdaQueryWrapper<>(); + lqw.eq(UserBrokerageRecord::getLinkId, linkId); + lqw.eq(UserBrokerageRecord::getLinkType, linkType); + return dao.selectOne(lqw); + } + + /** + * 佣金解冻 + */ + @Override + public void brokerageThaw() { + // 查询需要解冻的佣金 + List thawList = findThawList(); + if (CollUtil.isEmpty(thawList)) { + return; + } + for (UserBrokerageRecord record : thawList) { + // 查询对应的用户 + User user = userService.getById(record.getUid()); + if (ObjectUtil.isNull(user)) { + continue ; + } + record.setStatus(BrokerageRecordConstants.BROKERAGE_RECORD_STATUS_COMPLETE); + // 计算佣金余额 + BigDecimal balance = user.getBrokeragePrice().add(record.getPrice()); + record.setBalance(balance); + + // 分佣 + Boolean execute = transactionTemplate.execute(e -> { + updateById(record); + userService.operationBrokerage(record.getUid(), record.getPrice(), user.getBrokeragePrice(), "add"); + return Boolean.TRUE; + }); + if (!execute) { + logger.error(StrUtil.format("佣金解冻处理—分佣出错,记录id = {}", record.getId())); + } + } + + } + + /** + * 昨天得佣金 + * @param uid 用户uid + * @return BigDecimal + */ + @Override + public BigDecimal getYesterdayIncomes(Integer uid) { + LambdaQueryWrapper lqw = new LambdaQueryWrapper<>(); + lqw.select(UserBrokerageRecord::getPrice); + lqw.eq(UserBrokerageRecord::getUid, uid); + dateLimitUtilVo dateLimit = DateUtil.getDateLimit(Constants.SEARCH_DATE_YESTERDAY); + lqw.between(UserBrokerageRecord::getUpdateTime, dateLimit.getStartTime(), dateLimit.getEndTime()); + List recordList = dao.selectList(lqw); + if (CollUtil.isEmpty(recordList)) { + return BigDecimal.ZERO; + } + return recordList.stream().map(UserBrokerageRecord::getPrice).reduce(BigDecimal.ZERO, BigDecimal::add); + } + + /** + * 获取佣金明细列表根据uid + * @param uid uid + * @param pageParamRequest 分页参数 + */ + @Override + public PageInfo findDetailListByUid(Integer uid, PageParamRequest pageParamRequest) { + Page recordPage = PageHelper.startPage(pageParamRequest.getPage(), pageParamRequest.getLimit()); + QueryWrapper queryWrapper = new QueryWrapper<>(); + queryWrapper.eq("uid", uid); + queryWrapper.in("status", BrokerageRecordConstants.BROKERAGE_RECORD_STATUS_COMPLETE + , BrokerageRecordConstants.BROKERAGE_RECORD_STATUS_WITHDRAW); + queryWrapper.groupBy("left(update_time, 7)"); + queryWrapper.orderByDesc("left(update_time, 7)"); + List list = dao.selectList(queryWrapper); + if (CollUtil.isEmpty(list)) { + return new PageInfo<>(); + } + + List responseList = CollUtil.newArrayList(); + for (UserBrokerageRecord record : list) { + String month = DateUtil.dateToStr(record.getUpdateTime(), Constants.DATE_FORMAT_MONTH); + responseList.add(new SpreadCommissionDetailResponse(month, getListByUidAndMonth(uid, month))); + } + return CommonPage.copyPageInfo(recordPage, responseList); + } + + /** + * 获取累计推广条数 + * @param uid 用户uid + * @return Integer + */ + @Override + public Integer getSpreadCountByUid(Integer uid) { + LambdaQueryWrapper lqw = new LambdaQueryWrapper<>(); + lqw.select(UserBrokerageRecord::getId); + lqw.eq(UserBrokerageRecord::getUid, uid); + lqw.eq(UserBrokerageRecord::getLinkType, BrokerageRecordConstants.BROKERAGE_RECORD_LINK_TYPE_ORDER); + lqw.eq(UserBrokerageRecord::getStatus, BrokerageRecordConstants.BROKERAGE_RECORD_STATUS_COMPLETE); + return dao.selectCount(lqw); + } + + /** + * 获取推广记录列表 + * @param uid 用户uid + * @param pageParamRequest 分页参数 + * @return + */ + @Override + public List findSpreadListByUid(Integer uid, PageParamRequest pageParamRequest) { + PageHelper.startPage(pageParamRequest.getPage(), pageParamRequest.getLimit()); + LambdaQueryWrapper lqw = new LambdaQueryWrapper<>(); + lqw.eq(UserBrokerageRecord::getUid, uid); + lqw.eq(UserBrokerageRecord::getLinkType, BrokerageRecordConstants.BROKERAGE_RECORD_LINK_TYPE_ORDER); + lqw.eq(UserBrokerageRecord::getStatus, BrokerageRecordConstants.BROKERAGE_RECORD_STATUS_COMPLETE); + lqw.orderByDesc(UserBrokerageRecord::getUpdateTime); + return dao.selectList(lqw); + } + + /** + * 获取月份对应的推广订单数 + * @param uid 用户uid + * @param monthList 月份列表 + * @return Map + */ + @Override + public Map getSpreadCountByUidAndMonth(Integer uid, List monthList) { + QueryWrapper queryWrapper = new QueryWrapper<>(); + queryWrapper.select("count(id) as uid, update_time"); + queryWrapper.eq("uid", uid); + queryWrapper.eq("link_type", BrokerageRecordConstants.BROKERAGE_RECORD_LINK_TYPE_ORDER); + queryWrapper.eq("status", BrokerageRecordConstants.BROKERAGE_RECORD_STATUS_COMPLETE); + queryWrapper.apply(StrUtil.format("left(update_time, 7) in ({})", StrUtil.join(",", monthList))); + queryWrapper.groupBy("left(update_time, 7)"); + List list = dao.selectList(queryWrapper); + Map map = CollUtil.newHashMap(); + if (CollUtil.isEmpty(list)) { + return map; + } + list.forEach(record -> { + map.put(DateUtil.dateToStr(record.getUpdateTime(), Constants.DATE_FORMAT_MONTH), record.getUid()); + }); + return map; + } + + /** + * 获取佣金排行榜(周、月) + * @param type week、month + * @param pageParamRequest 分页参数 + * @return List + */ + @Override + public List getBrokerageTopByDate(String type, PageParamRequest pageParamRequest) { + QueryWrapper queryWrapper = new QueryWrapper<>(); + queryWrapper.select("uid", "sum(price)AS price"); + queryWrapper.eq("link_type", BrokerageRecordConstants.BROKERAGE_RECORD_LINK_TYPE_ORDER); + queryWrapper.eq("status", BrokerageRecordConstants.BROKERAGE_RECORD_STATUS_COMPLETE); + dateLimitUtilVo dateLimit = DateUtil.getDateLimit(type); + if(!StringUtils.isBlank(dateLimit.getStartTime())){ + queryWrapper.between("update_time", dateLimit.getStartTime(), dateLimit.getEndTime()); + } + queryWrapper.groupBy("uid"); + queryWrapper.orderByDesc("price"); + return dao.selectList(queryWrapper); + } + + /** + * 根据Uid获取分佣记录列表 + * @param uid 用户uid + * @return List + */ + @Override + public List getSpreadListByUid(Integer uid) { + LambdaQueryWrapper lqw = new LambdaQueryWrapper<>(); + lqw.eq(UserBrokerageRecord::getUid, uid); + lqw.eq(UserBrokerageRecord::getLinkType, BrokerageRecordConstants.BROKERAGE_RECORD_LINK_TYPE_ORDER); + lqw.eq(UserBrokerageRecord::getType, BrokerageRecordConstants.BROKERAGE_RECORD_TYPE_ADD); + lqw.eq(UserBrokerageRecord::getStatus, BrokerageRecordConstants.BROKERAGE_RECORD_STATUS_COMPLETE); + return dao.selectList(lqw); + } + + /** + * 佣金总金额(单位时间) + * @param dateLimit 时间参数 + * @return BigDecimal + */ + @Override + public BigDecimal getTotalSpreadPriceBydateLimit(String dateLimit) { + LambdaQueryWrapper lqw = new LambdaQueryWrapper<>(); + lqw.select(UserBrokerageRecord::getPrice); + lqw.eq(UserBrokerageRecord::getLinkType, BrokerageRecordConstants.BROKERAGE_RECORD_LINK_TYPE_ORDER); + lqw.eq(UserBrokerageRecord::getType, BrokerageRecordConstants.BROKERAGE_RECORD_TYPE_ADD); + lqw.eq(UserBrokerageRecord::getStatus, BrokerageRecordConstants.BROKERAGE_RECORD_STATUS_COMPLETE); + if (StrUtil.isNotBlank(dateLimit)) { + dateLimitUtilVo dateLimitVo = DateUtil.getDateLimit(dateLimit); + lqw.between(UserBrokerageRecord::getUpdateTime, dateLimitVo.getStartTime(), dateLimitVo.getEndTime()); + } + List list = dao.selectList(lqw); + if (CollUtil.isEmpty(list)) { + return BigDecimal.ZERO; + } + return list.stream().map(UserBrokerageRecord::getPrice).reduce(BigDecimal.ZERO, BigDecimal::add); + } + + /** + * 单位时间消耗的佣金 + * @param dateLimit 时间参数 + * @return + */ + @Override + public BigDecimal getSubSpreadPriceByDateLimit(String dateLimit) { + LambdaQueryWrapper lqw = new LambdaQueryWrapper<>(); + lqw.select(UserBrokerageRecord::getPrice); + lqw.eq(UserBrokerageRecord::getType, BrokerageRecordConstants.BROKERAGE_RECORD_TYPE_SUB); + lqw.eq(UserBrokerageRecord::getStatus, BrokerageRecordConstants.BROKERAGE_RECORD_STATUS_COMPLETE); + if (StrUtil.isNotBlank(dateLimit)) { + dateLimitUtilVo dateLimitVo = DateUtil.getDateLimit(dateLimit); + lqw.between(UserBrokerageRecord::getUpdateTime, dateLimitVo.getStartTime(), dateLimitVo.getEndTime()); + } + List list = dao.selectList(lqw); + if (CollUtil.isEmpty(list)) { + return BigDecimal.ZERO; + } + return list.stream().map(UserBrokerageRecord::getPrice).reduce(BigDecimal.ZERO, BigDecimal::add); + } + + /** + * 佣金详情列表 + * @param uid uid + * @param pageParamRequest 分页参数 + * @return + */ + @Override + public PageInfo getFundsMonitorDetail(Integer uid, String dateLimit, PageParamRequest pageParamRequest) { + Page page = PageHelper.startPage(pageParamRequest.getPage(), pageParamRequest.getLimit()); + LambdaQueryWrapper lqw = new LambdaQueryWrapper<>(); + lqw.eq(UserBrokerageRecord::getUid, uid); +// lqw.eq(UserBrokerageRecord::getLinkType, BrokerageRecordConstants.BROKERAGE_RECORD_LINK_TYPE_ORDER); + lqw.in(UserBrokerageRecord::getStatus, BrokerageRecordConstants.BROKERAGE_RECORD_STATUS_COMPLETE, BrokerageRecordConstants.BROKERAGE_RECORD_STATUS_WITHDRAW); + if (StrUtil.isNotBlank(dateLimit)) { + dateLimitUtilVo utilVo = DateUtil.getDateLimit(dateLimit); + lqw.between(UserBrokerageRecord::getUpdateTime, utilVo.getStartTime(), utilVo.getEndTime()); + } + lqw.orderByDesc(UserBrokerageRecord::getUpdateTime); + List recordList = dao.selectList(lqw); + return CommonPage.copyPageInfo(page, recordList); + } + + /** + * 获取冻结期佣金 + * @param uid uid + * @return BigDecimal + */ + @Override + public BigDecimal getFreezePrice(Integer uid) { + LambdaQueryWrapper lqw = new LambdaQueryWrapper<>(); + lqw.select(UserBrokerageRecord::getPrice); + lqw.eq(UserBrokerageRecord::getUid, uid); + lqw.eq(UserBrokerageRecord::getLinkType, BrokerageRecordConstants.BROKERAGE_RECORD_LINK_TYPE_ORDER); + lqw.eq(UserBrokerageRecord::getStatus, BrokerageRecordConstants.BROKERAGE_RECORD_STATUS_FROZEN); + List list = dao.selectList(lqw); + if (CollUtil.isEmpty(list)) { + return BigDecimal.ZERO; + } + return list.stream().map(UserBrokerageRecord::getPrice).reduce(BigDecimal.ZERO, BigDecimal::add); + } + + private List getListByUidAndMonth(Integer uid, String month) { + QueryWrapper queryWrapper = new QueryWrapper<>(); + queryWrapper.eq("uid", uid); + queryWrapper.in("status", BrokerageRecordConstants.BROKERAGE_RECORD_STATUS_COMPLETE + , BrokerageRecordConstants.BROKERAGE_RECORD_STATUS_WITHDRAW); + queryWrapper.eq("left(update_time, 7)", month); + queryWrapper.orderByDesc("update_time"); + return dao.selectList(queryWrapper); + } + + /** + * 获取需要解冻的记录列表 + * @return 记录列表 + */ + private List findThawList() { + LambdaQueryWrapper lqw = new LambdaQueryWrapper<>(); + lqw.le(UserBrokerageRecord::getThawTime, System.currentTimeMillis()); + lqw.eq(UserBrokerageRecord::getLinkType, BrokerageRecordConstants.BROKERAGE_RECORD_LINK_TYPE_ORDER); + lqw.eq(UserBrokerageRecord::getType, BrokerageRecordConstants.BROKERAGE_RECORD_TYPE_ADD); + lqw.eq(UserBrokerageRecord::getStatus, BrokerageRecordConstants.BROKERAGE_RECORD_STATUS_FROZEN); + return dao.selectList(lqw); + } +} + diff --git a/crmeb/src/main/java/com/zbkj/crmeb/user/service/impl/UserLevelServiceImpl.java b/crmeb/src/main/java/com/zbkj/crmeb/user/service/impl/UserLevelServiceImpl.java index de825131..642431a5 100644 --- a/crmeb/src/main/java/com/zbkj/crmeb/user/service/impl/UserLevelServiceImpl.java +++ b/crmeb/src/main/java/com/zbkj/crmeb/user/service/impl/UserLevelServiceImpl.java @@ -216,11 +216,14 @@ public class UserLevelServiceImpl extends ServiceImpl i Boolean execute = transactionTemplate.execute(e -> { if (userLevel == null) { //创建新的会员等级信息 - save(userLevel); + save(newLevel); } else { //有数据,更新即可 newLevel.setId(userLevel.getId()); updateById(newLevel); + // 将原等级删除 + userLevel.setIsDel(true); + updateById(userLevel); } userService.updateById(user); diff --git a/crmeb/src/main/java/com/zbkj/crmeb/user/service/impl/UserServiceImpl.java b/crmeb/src/main/java/com/zbkj/crmeb/user/service/impl/UserServiceImpl.java index 142bb6da..0402a185 100644 --- a/crmeb/src/main/java/com/zbkj/crmeb/user/service/impl/UserServiceImpl.java +++ b/crmeb/src/main/java/com/zbkj/crmeb/user/service/impl/UserServiceImpl.java @@ -29,8 +29,11 @@ import com.zbkj.crmeb.front.request.PasswordRequest; import com.zbkj.crmeb.front.request.RegisterRequest; import com.zbkj.crmeb.front.request.UserBindingRequest; import com.zbkj.crmeb.front.response.*; +import com.zbkj.crmeb.marketing.model.StoreCoupon; +import com.zbkj.crmeb.marketing.model.StoreCouponUser; import com.zbkj.crmeb.marketing.request.StoreCouponUserSearchRequest; import com.zbkj.crmeb.marketing.response.StoreCouponUserResponse; +import com.zbkj.crmeb.marketing.service.StoreCouponService; import com.zbkj.crmeb.marketing.service.StoreCouponUserService; import com.zbkj.crmeb.store.model.StoreOrder; import com.zbkj.crmeb.store.request.RetailShopStairUserRequest; @@ -55,6 +58,7 @@ import org.apache.commons.lang3.StringUtils; import org.springframework.beans.BeanUtils; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; +import org.springframework.transaction.support.TransactionTemplate; import javax.annotation.Resource; import java.math.BigDecimal; @@ -112,6 +116,12 @@ public class UserServiceImpl extends ServiceImpl implements UserS @Autowired private StoreCouponUserService storeCouponUserService; + @Autowired + private StoreCouponService storeCouponService; + + @Autowired + private TransactionTemplate transactionTemplate; + /** * 分页显示用户表 * @param request 搜索条件 @@ -212,11 +222,13 @@ public class UserServiceImpl extends ServiceImpl implements UserS // 获取分组信息 if(!StringUtils.isBlank(user.getGroupId())){ userResponse.setGroupName(userGroupService.getGroupNameInId(user.getGroupId())); + userResponse.setGroupId(user.getGroupId()); } // 获取标签信息 if(!StringUtils.isBlank(user.getTagId())){ userResponse.setTagName(userTagService.getGroupNameInId(user.getTagId())); + userResponse.setTagId(user.getTagId()); } //获取推广人信息 @@ -265,45 +277,83 @@ public class UserServiceImpl extends ServiceImpl implements UserS } if(request.getMoneyValue().compareTo(BigDecimal.ZERO) < 1 && request.getIntegralValue() <= 0){ - throw new CrmebException("最小值为0.01"); + throw new CrmebException("修改值不能等小于等于0"); } -// if (request.getMoneyValue().compareTo(BigDecimal.valueOf(1000000)) >= 0 || request.getIntegralValue().compareTo(BigDecimal.valueOf(1000000)) >= 0) { -// throw new CrmebException("最大值为999999"); -// } + User user = getById(request.getUid()); + if (ObjectUtil.isNull(user)) { + throw new CrmebException("用户不存在"); + } - UserOperateFundsRequest userOperateFundsRequest = new UserOperateFundsRequest(); - userOperateFundsRequest.setTitle("后台操作"); - userOperateFundsRequest.setUid(request.getUid()); - // 处理余额 - if(request.getMoneyValue().compareTo(BigDecimal.ZERO) > 0){ - if(request.getMoneyType() == 1){ - userOperateFundsRequest.setFoundsType(Constants.USER_BILL_TYPE_SYSTEM_ADD); - userOperateFundsRequest.setType(request.getMoneyType()); - }else{ - userOperateFundsRequest.setFoundsType(Constants.USER_BILL_TYPE_SYSTEM_SUB); - userOperateFundsRequest.setType(0); + Boolean execute = transactionTemplate.execute(e -> { + // 处理余额 + if(request.getMoneyValue().compareTo(BigDecimal.ZERO) > 0){ + // 生成UserBill + UserBill userBill = new UserBill(); + userBill.setUid(user.getUid()); + userBill.setLinkId("0"); + userBill.setTitle("后台操作"); + userBill.setCategory(Constants.USER_BILL_CATEGORY_MONEY); + userBill.setNumber(request.getMoneyValue()); + userBill.setStatus(1); + userBill.setCreateTime(DateUtil.nowDateTime()); + + if(request.getMoneyType() == 1){// 增加 + userBill.setPm(1); + userBill.setType(Constants.USER_BILL_TYPE_SYSTEM_ADD); + userBill.setBalance(user.getNowMoney().add(request.getMoneyValue())); + userBill.setMark(StrUtil.format("后台操作增加了{}余额", request.getMoneyValue())); + + userBillService.save(userBill); + operationNowMoney(user.getUid(), request.getMoneyValue(), user.getNowMoney(), "add"); + }else{ + userBill.setPm(0); + userBill.setType(Constants.USER_BILL_TYPE_SYSTEM_SUB); + userBill.setBalance(user.getNowMoney().subtract(request.getMoneyValue())); + userBill.setMark(StrUtil.format("后台操作减少了{}余额", request.getMoneyValue())); + + userBillService.save(userBill); + operationNowMoney(user.getUid(), request.getMoneyValue(), user.getNowMoney(), "sub"); + } } - userOperateFundsRequest.setFoundsCategory(Constants.USER_BILL_CATEGORY_MONEY); - userOperateFundsRequest.setValue(request.getMoneyValue()); - updateFounds(userOperateFundsRequest, true); - } - // 处理积分 - if(request.getIntegralValue() > 0){ - if(request.getIntegralType() == 1){ - userOperateFundsRequest.setFoundsType(Constants.USER_BILL_TYPE_SYSTEM_ADD); - userOperateFundsRequest.setType(request.getIntegralType()); - }else{ - userOperateFundsRequest.setFoundsType(Constants.USER_BILL_TYPE_SYSTEM_SUB); - userOperateFundsRequest.setType(0); + // 处理积分 + if(request.getIntegralValue() > 0){ + // 生成UserBill + UserBill userBill = new UserBill(); + userBill.setUid(user.getUid()); + userBill.setLinkId("0"); + userBill.setTitle("后台操作"); + userBill.setCategory(Constants.USER_BILL_CATEGORY_INTEGRAL); + userBill.setNumber(new BigDecimal(request.getIntegralValue())); + userBill.setStatus(1); + userBill.setCreateTime(DateUtil.nowDateTime()); + if(request.getIntegralType() == 1){// 增加 + userBill.setPm(1); + userBill.setType(Constants.USER_BILL_TYPE_SYSTEM_ADD); + userBill.setBalance(new BigDecimal(user.getIntegral() + request.getIntegralValue())); + userBill.setMark(StrUtil.format("后台操作增加了{}积分", request.getIntegralValue())); + + userBillService.save(userBill); + operationIntegral(user.getUid(), request.getIntegralValue(), user.getIntegral(), "add"); + }else{ + userBill.setPm(0); + userBill.setType(Constants.USER_BILL_TYPE_SYSTEM_SUB); + userBill.setBalance(new BigDecimal(user.getIntegral() - request.getIntegralValue())); + userBill.setMark(StrUtil.format("后台操作减少了{}积分", request.getIntegralValue())); + + userBillService.save(userBill); + operationIntegral(user.getUid(), request.getIntegralValue(), user.getIntegral(), "sub"); + } } - userOperateFundsRequest.setFoundsCategory(Constants.USER_BILL_CATEGORY_INTEGRAL); - userOperateFundsRequest.setValue(new BigDecimal(request.getIntegralValue())); - updateFounds(userOperateFundsRequest, true); - } - return true; + return Boolean.TRUE; + }); + + if (!execute) { + throw new CrmebException("修改积分/余额失败"); + } + return execute; } /** @@ -845,6 +895,17 @@ public class UserServiceImpl extends ServiceImpl implements UserS if (StrUtil.isNotBlank(rechargeSwitch)) { userCenterResponse.setRechargeSwitch(Boolean.valueOf(rechargeSwitch)); } + + // 判断是否展示我的推广,1.分销模式是否开启,2.如果是人人分销,所有人都是推广员 + String funcStatus = systemConfigService.getValueByKey("brokerage_func_status"); + if (funcStatus.equals("1")) { + String brokerageStatus = systemConfigService.getValueByKey("store_brokerage_status"); + if (brokerageStatus.equals("2")) {// 人人分销 + userCenterResponse.setIsPromoter(true); + } + } else { + userCenterResponse.setIsPromoter(false); + } return userCenterResponse; } @@ -1072,12 +1133,260 @@ public class UserServiceImpl extends ServiceImpl implements UserS * @author Mr.Zhang * @since 2020-04-29 */ - private User getUserByAccount(String account) { + public User getUserByAccount(String account) { LambdaQueryWrapper lambdaQueryWrapper = new LambdaQueryWrapper<>(); lambdaQueryWrapper.eq(User::getAccount, account); return userDao.selectOne(lambdaQueryWrapper); } + /** + * 手机号注册用户 + * @param phone 手机号 + * @param spreadUid 推广人编号 + * @param clientIp id + * @return + */ + @Override + public User registerPhone(String phone, Integer spreadUid, String clientIp) { + User user = new User(); + user.setAccount(phone); + String password = "Abc" + CrmebUtil.randomCount(10000, 99999); + user.setPwd(CrmebUtil.encryptPassword(password, phone)); + user.setPhone(phone); + user.setUserType(Constants.USER_LOGIN_TYPE_H5); + user.setAddIp(clientIp); + user.setLastIp(clientIp); + user.setNickname( + DigestUtils.md5Hex(phone + DateUtil.getNowTime()). + subSequence(0, 12). + toString() + ); + user.setAvatar(systemConfigService.getValueByKey(Constants.USER_DEFAULT_AVATAR_CONFIG_KEY)); + + user.setSpreadUid(0); + Boolean check = checkBingSpread(user, spreadUid, "new"); + if (check) { + user.setSpreadUid(spreadUid); + user.setSpreadTime(DateUtil.nowDateTime()); + } + + // 查询是否有新人注册赠送优惠券 + List couponUserList = CollUtil.newArrayList(); + List couponList = storeCouponService.findRegisterList(); + if (CollUtil.isNotEmpty(couponList)) { + couponList.forEach(storeCoupon -> { + StoreCouponUser storeCouponUser = new StoreCouponUser(); + storeCouponUser.setCouponId(storeCoupon.getId()); +// storeCouponUser.setUid(userId); + storeCouponUser.setName(storeCoupon.getName()); + storeCouponUser.setMoney(storeCoupon.getMoney()); + storeCouponUser.setMinPrice(storeCoupon.getMinPrice()); + storeCouponUser.setStartTime(storeCoupon.getUseStartTime()); + storeCouponUser.setEndTime(storeCoupon.getUseEndTime()); + storeCouponUser.setUseType(storeCoupon.getUseType()); + storeCouponUser.setType("register"); + if (storeCoupon.getUseType() > 1) { + storeCouponUser.setPrimaryKey(storeCoupon.getPrimaryKey()); + } + couponUserList.add(storeCouponUser); + }); + } + + Boolean execute = transactionTemplate.execute(e -> { + save(user); + if (check) { + updateSpreadCountByUid(spreadUid); + } + return Boolean.TRUE; + }); + if (!execute) { + throw new CrmebException("创建用户失败!"); + } + // 赠送客户优惠券 + if (CollUtil.isNotEmpty(couponUserList)) { + couponUserList.forEach(couponUser -> { + couponUser.setUid(user.getUid()); + + }); + storeCouponUserService.saveBatch(couponUserList); + couponList.forEach(coupon -> { + storeCouponService.deduction(coupon.getId(), 1, coupon.getIsLimited()); + }); + } + return user; + } + + /** + * 更新推广员推广数 + * @param uid uid + */ + public Boolean updateSpreadCountByUid(Integer uid) { + UpdateWrapper updateWrapper = new UpdateWrapper<>(); + updateWrapper.setSql("spread_count = spread_count + 1"); + updateWrapper.eq("uid", uid); + return update(updateWrapper); + } + + /** + * 添加/扣减佣金 + * @param uid 用户id + * @param price 金额 + * @param brokeragePrice 历史金额 + * @param type 类型:add—添加,sub—扣减 + * @return Boolean + */ + @Override + public Boolean operationBrokerage(Integer uid, BigDecimal price, BigDecimal brokeragePrice, String type) { + UpdateWrapper updateWrapper = new UpdateWrapper<>(); + if (type.equals("add")) { + updateWrapper.setSql(StrUtil.format("brokerage_price = brokerage_price + {}", price)); + } else { + updateWrapper.setSql(StrUtil.format("brokerage_price = brokerage_price - {}", price)); + updateWrapper.last(StrUtil.format(" and (brokerage_price - {} >= 0)", price)); + } + updateWrapper.eq("uid", uid); + updateWrapper.eq("brokerage_price", brokeragePrice); + return update(updateWrapper); + } + + /** + * 添加/扣减余额 + * @param uid 用户id + * @param price 金额 + * @param nowMoney 历史金额 + * @param type 类型:add—添加,sub—扣减 + */ + @Override + public Boolean operationNowMoney(Integer uid, BigDecimal price, BigDecimal nowMoney, String type) { + UpdateWrapper updateWrapper = new UpdateWrapper<>(); + if (type.equals("add")) { + updateWrapper.setSql(StrUtil.format("now_money = now_money + {}", price)); + } else { + updateWrapper.setSql(StrUtil.format("now_money = now_money - {}", price)); + updateWrapper.last(StrUtil.format(" and (now_money - {} >= 0)", price)); + } + updateWrapper.eq("uid", uid); + updateWrapper.eq("now_money", nowMoney); + return update(updateWrapper); + } + + /** + * 添加/扣减积分 + * @param uid 用户id + * @param integral 积分 + * @param nowIntegral 历史积分 + * @param type 类型:add—添加,sub—扣减 + * @return Boolean + */ + @Override + public Boolean operationIntegral(Integer uid, Integer integral, Integer nowIntegral, String type) { + UpdateWrapper updateWrapper = new UpdateWrapper<>(); + if (type.equals("add")) { + updateWrapper.setSql(StrUtil.format("integral = integral + {}", integral)); + } else { + updateWrapper.setSql(StrUtil.format("integral = integral - {}", integral)); + updateWrapper.last(StrUtil.format(" and (integral - {} >= 0)", integral)); + } + updateWrapper.eq("uid", uid); + updateWrapper.eq("integral", nowIntegral); + return update(updateWrapper); + } + + /** + * PC后台分销员列表 + * @param storeBrokerageStatus 分销模式 1-指定分销,2-人人分销 + * @param keywords 搜索参数 + * @param dateLimit 时间参数 + * @param pageRequest 分页参数 + * @return PageInfo + */ + @Override + public PageInfo getAdminSpreadPeopleList(String storeBrokerageStatus, String keywords, String dateLimit, PageParamRequest pageRequest) { + Page pageUser = PageHelper.startPage(pageRequest.getPage(), pageRequest.getLimit()); + LambdaQueryWrapper lqw = new LambdaQueryWrapper<>(); + // id,头像,昵称,姓名,电话,推广用户数,推广订单数,推广订单额,佣金总金额,已提现金额,提现次数,未提现金额,上级推广人 + lqw.select(User::getUid, User::getNickname, User::getRealName, User::getPhone, User::getAvatar, User::getSpreadCount, User::getBrokeragePrice, User::getSpreadUid); + if (storeBrokerageStatus.equals("1")) { + lqw.eq(User::getIsPromoter, true); + } + // 后台分销员列表不根据时间判断 +// if (StrUtil.isNotBlank(dateLimit)) { +// dateLimitUtilVo dateLimitUtilVo = DateUtil.getDateLimit(dateLimit); +// lqw.between(User::getCreateTime, dateLimitUtilVo.getStartTime(), dateLimitUtilVo.getEndTime()); +// } + lqw.apply("1 = 1"); + if (StrUtil.isNotBlank(keywords)) { + lqw.and(i -> i.eq(User::getUid, keywords) //用户账号 + .or().like(User::getNickname, keywords) //昵称 + .or().like(User::getPhone, keywords)); //手机号码 + } + lqw.orderByDesc(User::getUid); + List userList = userDao.selectList(lqw); + return CommonPage.copyPageInfo(pageUser, userList); + } + + /** + * 推广用户数 + * @param uid 用户id + * @param dateLimit 时间参数 + * @return Integer + */ + @Override + public Integer getSpreadNumberByUidAndDateLimit(Integer uid, String dateLimit) { + LambdaQueryWrapper lqw = new LambdaQueryWrapper<>(); + lqw.eq(User::getUid, uid); + if (StrUtil.isNotBlank(dateLimit)) { + dateLimitUtilVo dateVo = DateUtil.getDateLimit(dateLimit); + lqw.between(User::getSpreadTime, dateVo.getStartTime(), dateVo.getEndTime()); + } + return userDao.selectCount(lqw); + } + + /** + * 检测能否绑定关系 + * @param user 当前用户 + * @param spreadUid 推广员Uid + * @param type 用户类型:new-新用户,old—老用户 + * @return Boolean + * 1.判断分销功能是否启用 + * 2.判断分销模式 + * 3.根据不同的分销模式校验 + * 4.指定分销,只有分销员才可以分销,需要spreadUid是推广员才可以绑定 + * 5.人人分销,可以直接绑定 + */ + public Boolean checkBingSpread(User user, Integer spreadUid, String type) { + if (spreadUid <= 0 || user.getSpreadUid() > 0) { + return false; + } + // 判断分销功能是否启用 + String isOpen = systemConfigService.getValueByKey(Constants.CONFIG_KEY_DISTRIBUTION_TYPE); + if (StrUtil.isBlank(isOpen) || isOpen.equals("0")) { + return false; + } + if (type.equals("old")) { + // 判断分销关系绑定类型(所有、新用户) + String bindType = systemConfigService.getValueByKey(Constants.CONFIG_KEY_STORE_BROKERAGE_BIND_TYPE); + if (StrUtil.isBlank(bindType) || bindType.equals("1")) { + return false; + } + } + // 判断分销模式 + String model = systemConfigService.getValueByKey(Constants.CONFIG_KEY_STORE_BROKERAGE_MODEL); + if (StrUtil.isBlank(model)) { + return false; + } + // 查询推广员 + User spreadUser = getById(spreadUid); + if (ObjectUtil.isNull(spreadUser) || !spreadUser.getStatus()) { + return false; + } + // 指定分销不是推广员不绑定 + if (model.equals("1") && !spreadUser.getIsPromoter()) { + return false; + } + return true; + } + /** * 日志title * @author Mr.Zhang @@ -1227,7 +1536,8 @@ public class UserServiceImpl extends ServiceImpl implements UserS case 0: StoreOrderSearchRequest sor = new StoreOrderSearchRequest(); sor.setUid(userId); - return storeOrderService.getList(sor, pageParamRequest); + return storeOrderService.findPaidListByUid(userId, pageParamRequest); +// return storeOrderService.getList(sor, pageParamRequest); case 1: FundsMonitorSearchRequest fmsq = new FundsMonitorSearchRequest(); fmsq.setUid(userId); @@ -1356,13 +1666,10 @@ public class UserServiceImpl extends ServiceImpl implements UserS */ @Override public PageInfo getUserListBySpreadLevel(RetailShopStairUserRequest request, PageParamRequest pageParamRequest) { -// Page userPage = PageHelper.startPage(pageParamRequest.getPage(),pageParamRequest.getLimit()); -// List users = getUsersBySpreadLevel(request); -// return CommonPage.copyPageInfo(userPage, users); - if (request.getType().equals(1)) { + if (request.getType().equals(1)) {// 一级推广人 return getFirstSpreadUserListPage(request, pageParamRequest); } - if (request.getType().equals(2)) { + if (request.getType().equals(2)) {// 二级推广人 return getSecondSpreadUserListPage(request, pageParamRequest); } return getAllSpreadUserListPage(request, pageParamRequest); @@ -1370,17 +1677,18 @@ public class UserServiceImpl extends ServiceImpl implements UserS // 分页获取一级推广员 private PageInfo getFirstSpreadUserListPage(RetailShopStairUserRequest request, PageParamRequest pageParamRequest) { - Page userPage = PageHelper.startPage(pageParamRequest.getPage(),pageParamRequest.getLimit()); + Page userPage = PageHelper.startPage(pageParamRequest.getPage(), pageParamRequest.getLimit()); LambdaQueryWrapper queryWrapper = new LambdaQueryWrapper<>(); + queryWrapper.select(User::getUid, User::getAvatar, User::getNickname, User::getIsPromoter, User::getSpreadCount, User::getPayCount); queryWrapper.eq(User::getSpreadUid, request.getUid()); if (StrUtil.isNotBlank(request.getNickName())) { queryWrapper.and(e -> e.like(User::getNickname, request.getNickName()).or().eq(User::getUid, request.getNickName()) .or().eq(User::getPhone, request.getNickName())); } - if (StrUtil.isNotBlank(request.getDateLimit())) { - dateLimitUtilVo dateLimit = DateUtil.getDateLimit(request.getDateLimit()); - queryWrapper.between(User::getCreateTime, dateLimit.getStartTime(), dateLimit.getEndTime()); - } +// if (StrUtil.isNotBlank(request.getDateLimit())) { +// dateLimitUtilVo dateLimit = DateUtil.getDateLimit(request.getDateLimit()); +// queryWrapper.between(User::getCreateTime, dateLimit.getStartTime(), dateLimit.getEndTime()); +// } List userList = userDao.selectList(queryWrapper); return CommonPage.copyPageInfo(userPage, userList); } @@ -1393,17 +1701,18 @@ public class UserServiceImpl extends ServiceImpl implements UserS return new PageInfo(CollUtil.newArrayList()); } List userIds = firstUserList.stream().map(User::getUid).distinct().collect(Collectors.toList()); - Page userPage = PageHelper.startPage(pageParamRequest.getPage(),pageParamRequest.getLimit()); + Page userPage = PageHelper.startPage(pageParamRequest.getPage(), pageParamRequest.getLimit()); LambdaQueryWrapper queryWrapper = new LambdaQueryWrapper<>(); + queryWrapper.select(User::getUid, User::getAvatar, User::getNickname, User::getIsPromoter, User::getSpreadCount, User::getPayCount); queryWrapper.in(User::getSpreadUid, userIds); if (StrUtil.isNotBlank(request.getNickName())) { queryWrapper.and(e -> e.like(User::getNickname, request.getNickName()).or().eq(User::getUid, request.getNickName()) .or().eq(User::getPhone, request.getNickName())); } - if (StrUtil.isNotBlank(request.getDateLimit())) { - dateLimitUtilVo dateLimit = DateUtil.getDateLimit(request.getDateLimit()); - queryWrapper.between(User::getCreateTime, dateLimit.getStartTime(), dateLimit.getEndTime()); - } +// if (StrUtil.isNotBlank(request.getDateLimit())) { +// dateLimitUtilVo dateLimit = DateUtil.getDateLimit(request.getDateLimit()); +// queryWrapper.between(User::getCreateTime, dateLimit.getStartTime(), dateLimit.getEndTime()); +// } List userList = userDao.selectList(queryWrapper); return CommonPage.copyPageInfo(userPage, userList); } @@ -1411,23 +1720,23 @@ public class UserServiceImpl extends ServiceImpl implements UserS // 分页获取所有推广员 private PageInfo getAllSpreadUserListPage(RetailShopStairUserRequest request, PageParamRequest pageParamRequest) { // 先所有一级推广员 - List firstUserList = getSpreadListBySpreadIdAndType(request.getUid(), 1); + List firstUserList = getSpreadListBySpreadIdAndType(request.getUid(), 0); if (CollUtil.isEmpty(firstUserList)) { return new PageInfo(CollUtil.newArrayList()); } List userIds = firstUserList.stream().map(User::getUid).distinct().collect(Collectors.toList()); - userIds.add(request.getUid()); - Page userPage = PageHelper.startPage(pageParamRequest.getPage(),pageParamRequest.getLimit()); + Page userPage = PageHelper.startPage(pageParamRequest.getPage(), pageParamRequest.getLimit()); LambdaQueryWrapper queryWrapper = new LambdaQueryWrapper<>(); - queryWrapper.in(User::getSpreadUid, userIds); + queryWrapper.select(User::getUid, User::getAvatar, User::getNickname, User::getIsPromoter, User::getSpreadCount, User::getPayCount); + queryWrapper.in(User::getUid, userIds); if (StrUtil.isNotBlank(request.getNickName())) { queryWrapper.and(e -> e.like(User::getNickname, request.getNickName()).or().eq(User::getUid, request.getNickName()) .or().eq(User::getPhone, request.getNickName())); } - if (StrUtil.isNotBlank(request.getDateLimit())) { - dateLimitUtilVo dateLimit = DateUtil.getDateLimit(request.getDateLimit()); - queryWrapper.between(User::getCreateTime, dateLimit.getStartTime(), dateLimit.getEndTime()); - } +// if (StrUtil.isNotBlank(request.getDateLimit())) { +// dateLimitUtilVo dateLimit = DateUtil.getDateLimit(request.getDateLimit()); +// queryWrapper.between(User::getCreateTime, dateLimit.getStartTime(), dateLimit.getEndTime()); +// } List userList = userDao.selectList(queryWrapper); return CommonPage.copyPageInfo(userPage, userList); } @@ -1794,14 +2103,17 @@ public class UserServiceImpl extends ServiceImpl implements UserS /** * 获取分销人员列表 - * @param keywords 搜索参数 + * @param keywords 搜索参数 * @param dateLimit 时间参数 - * @return List + * @param storeBrokerageStatus 分销状态:1-指定分销,2-人人分销 + * @return */ @Override - public List findDistributionList(String keywords, String dateLimit) { + public List findDistributionList(String keywords, String dateLimit, String storeBrokerageStatus) { LambdaQueryWrapper lqw = new LambdaQueryWrapper<>(); - lqw.eq(User::getIsPromoter, true); + if (storeBrokerageStatus.equals("1")) { + lqw.eq(User::getIsPromoter, true); + } if (StrUtil.isNotBlank(dateLimit)) { dateLimitUtilVo dateLimitVo = DateUtil.getDateLimit(dateLimit); lqw.between(User::getCreateTime, dateLimitVo.getStartTime(), dateLimitVo.getEndTime()); @@ -1823,7 +2135,7 @@ public class UserServiceImpl extends ServiceImpl implements UserS */ @Override public Integer getDevelopDistributionPeopleNum(List ids, String dateLimit) { - LambdaQueryWrapper lqw = new LambdaQueryWrapper<>(); + LambdaQueryWrapper lqw = Wrappers.lambdaQuery(); lqw.in(User::getSpreadUid, ids); if (StrUtil.isNotBlank(dateLimit)) { dateLimitUtilVo dateLimitVo = DateUtil.getDateLimit(dateLimit); @@ -1831,4 +2143,78 @@ public class UserServiceImpl extends ServiceImpl implements UserS } return userDao.selectCount(lqw); } + + /** + * 清除User Group id + * + * @param groupId 待清除的GroupId + */ + @Override + public void clearGroupByGroupId(String groupId) { + LambdaUpdateWrapper upw = Wrappers.lambdaUpdate(); + upw.set(User::getGroupId,"").eq(User::getGroupId,groupId); + update(upw); + } + + /** + * 清除 用户对应 tag + * + * @param tagIds tagIds + */ + @Override + public void clearTagByTagId(String tagIds) { + LambdaQueryWrapper lqw = Wrappers.lambdaQuery(); + lqw.in(User::getTagId,tagIds); + List users = userDao.selectList(lqw); + users.forEach(e-> { + LambdaUpdateWrapper upw = Wrappers.lambdaUpdate(); + upw.set(User::getGroupId,e.getTagId().replace(tagIds+",","")); + update(upw); + }); + + } + + /** + * 更新用户 + * @param userRequest 用户参数 + * @return Boolean + */ + @Override + public Boolean updateUser(UserRequest userRequest) { + User tempUser = getById(userRequest.getUid()); + User user = new User(); + BeanUtils.copyProperties(userRequest, user); + if (ObjectUtil.isNull(userRequest.getLevel())) { + user.setLevel(0); + } + Boolean execute = transactionTemplate.execute(e -> { + updateById(user); + if (ObjectUtil.isNotNull(userRequest.getLevel()) && !tempUser.getLevel().equals(userRequest.getLevel())) { + // 修改用户等级表 + UserLevel userLevel = userLevelService.getUserLevelByUserId(tempUser.getUid()); + if (ObjectUtil.isNotNull(userLevel)) { + userLevel.setIsDel(true); + userLevelService.updateById(userLevel); + } + + SystemUserLevel systemUserLevel = systemUserLevelService.getByLevelId(userRequest.getLevel()); + UserLevel newLevel = new UserLevel(); + newLevel.setUid(tempUser.getUid()); + newLevel.setLevelId(systemUserLevel.getId()); + newLevel.setGrade(systemUserLevel.getGrade()); + newLevel.setStatus(true); + newLevel.setMark(StrUtil.format("尊敬的用户 {},在{}管理员调整会员等级成为{}", tempUser.getNickname(), DateUtil.nowDateTimeStr(), systemUserLevel.getName())); + newLevel.setDiscount(systemUserLevel.getDiscount()); + newLevel.setCreateTime(DateUtil.nowDateTime()); + userLevelService.save(newLevel); + } + if (ObjectUtil.isNull(userRequest.getLevel()) && tempUser.getLevel() > 0) { + UserLevel userLevel = userLevelService.getUserLevelByUserId(tempUser.getUid()); + userLevel.setIsDel(true); + userLevelService.updateById(userLevel); + } + return Boolean.TRUE; + }); + return execute; + } } diff --git a/crmeb/src/main/java/com/zbkj/crmeb/wechat/controller/TemplateMessageController.java b/crmeb/src/main/java/com/zbkj/crmeb/wechat/controller/TemplateMessageController.java index d7f6ad38..8a6dc8e5 100644 --- a/crmeb/src/main/java/com/zbkj/crmeb/wechat/controller/TemplateMessageController.java +++ b/crmeb/src/main/java/com/zbkj/crmeb/wechat/controller/TemplateMessageController.java @@ -41,120 +41,127 @@ public class TemplateMessageController { /** * 分页显示微信模板 - * @param request 搜索条件 + * + * @param request 搜索条件 * @param pageParamRequest 分页参数 * @author Mr.Zhang * @since 2020-06-03 */ @ApiOperation(value = "分页列表") //配合swagger使用 @RequestMapping(value = "/list", method = RequestMethod.GET) - public CommonResult> getList( + public CommonResult> getList( @Validated TemplateMessageSearchRequest request, - @Validated PageParamRequest pageParamRequest){ + @Validated PageParamRequest pageParamRequest) { CommonPage templateMessageCommonPage = CommonPage.restPage(templateMessageService.getList(request, pageParamRequest)); return CommonResult.success(templateMessageCommonPage); } - /** - * 新增微信模板 - * @param templateMessageRequest 新增参数 - * @author Mr.Zhang - * @since 2020-06-03 - */ - @ApiOperation(value = "新增") - @RequestMapping(value = "/save", method = RequestMethod.POST) - public CommonResult save(@RequestBody @Validated TemplateMessageRequest templateMessageRequest){ - TemplateMessage templateMessage = new TemplateMessage(); - BeanUtils.copyProperties(templateMessageRequest, templateMessage); - templateMessage.setType(true); - if(templateMessageService.save(templateMessage)){ - return CommonResult.success(); - }else{ - return CommonResult.failed(); - } - } - - /** - * 删除微信模板 - * @param id Integer - * @author Mr.Zhang - * @since 2020-06-03 - */ - @ApiOperation(value = "删除") - @RequestMapping(value = "/delete/{id}", method = RequestMethod.GET) - public CommonResult delete(@PathVariable Integer id){ - if(templateMessageService.removeById(id)){ - return CommonResult.success(); - }else{ - return CommonResult.failed(); - } - } - - /** - * 修改微信模板 - * @param templateMessageRequest 修改参数 - * @author Mr.Zhang - * @since 2020-06-03 - */ - @ApiOperation(value = "修改") - @RequestMapping(value = "/update/{id}", method = RequestMethod.POST) - public CommonResult update(@PathVariable Integer id, - @RequestBody @Validated TemplateMessageRequest templateMessageRequest){ - TemplateMessage templateMessage = templateMessageService.infoException(id); - templateMessage.setTempId(templateMessageRequest.getTempId()); +// /** +// * 新增微信模板 +// * +// * @param templateMessageRequest 新增参数 +// * @author Mr.Zhang +// * @since 2020-06-03 +// */ +// @ApiOperation(value = "新增") +// @RequestMapping(value = "/save", method = RequestMethod.POST) +// public CommonResult save(@RequestBody @Validated TemplateMessageRequest templateMessageRequest) { +// TemplateMessage templateMessage = new TemplateMessage(); // BeanUtils.copyProperties(templateMessageRequest, templateMessage); - if(templateMessageService.updateById(templateMessage)){ - return CommonResult.success(); - }else{ - return CommonResult.failed(); - } - } +// templateMessage.setType(true); +// if (templateMessageService.save(templateMessage)) { +// return CommonResult.success(); +// } else { +// return CommonResult.failed(); +// } +// } + +// /** +// * 删除微信模板 +// * +// * @param id Integer +// * @author Mr.Zhang +// * @since 2020-06-03 +// */ +// @ApiOperation(value = "删除") +// @RequestMapping(value = "/delete/{id}", method = RequestMethod.GET) +// public CommonResult delete(@PathVariable Integer id) { +// if (templateMessageService.removeById(id)) { +// return CommonResult.success(); +// } else { +// return CommonResult.failed(); +// } +// } + +// /** +// * 修改微信模板 +// * +// * @param templateMessageRequest 修改参数 +// * @author Mr.Zhang +// * @since 2020-06-03 +// */ +// @ApiOperation(value = "修改") +// @RequestMapping(value = "/update/{id}", method = RequestMethod.POST) +// public CommonResult update(@PathVariable Integer id, +// @RequestBody @Validated TemplateMessageRequest templateMessageRequest) { +// TemplateMessage templateMessage = templateMessageService.infoException(id); +// templateMessage.setTempId(templateMessageRequest.getTempId()); +//// BeanUtils.copyProperties(templateMessageRequest, templateMessage); +// if (templateMessageService.updateById(templateMessage)) { +// return CommonResult.success(); +// } else { +// return CommonResult.failed(); +// } +// } /** * 修改状态 - * @param id Integer id + * + * @param id Integer id * @param status Integer 状态 * @author Mr.Zhang * @since 2020-06-03 */ @ApiOperation(value = "修改") @RequestMapping(value = "/update/status/{id}", method = RequestMethod.POST) - public CommonResult updateStatus(@PathVariable Integer id, @RequestParam Integer status){ + public CommonResult updateStatus(@PathVariable Integer id, @RequestParam Integer status) { // TemplateMessage templateMessage = templateMessageService.infoException(id); TemplateMessage templateMessage = templateMessageService.getById(id); - if(null == templateMessage){ + if (null == templateMessage) { throw new CrmebException("此模板" + id + " 不存在或者已删除"); } templateMessage.setStatus(status); - if(templateMessageService.updateById(templateMessage)){ + if (templateMessageService.updateById(templateMessage)) { return CommonResult.success(); - }else{ + } else { return CommonResult.failed(); } } /** * 查询微信模板信息 + * * @param id Integer * @author Mr.Zhang * @since 2020-06-03 */ @ApiOperation(value = "详情") @RequestMapping(value = "/info/{id}", method = RequestMethod.GET) - public CommonResult info(@PathVariable Integer id){ + public CommonResult info(@PathVariable Integer id) { TemplateMessage templateMessage = templateMessageService.infoException(id); return CommonResult.success(templateMessage); } /** * 查询微信模板信息 + * * @author Mr.Zhang * @since 2020-06-03 */ @ApiOperation(value = "行业信息") @RequestMapping(value = "/industry", method = RequestMethod.GET) - public CommonResult getIndustry(){ + public CommonResult getIndustry() { return CommonResult.success(templateMessageService.getIndustry()); } } diff --git a/crmeb/src/main/java/com/zbkj/crmeb/wechat/controller/WeChatController.java b/crmeb/src/main/java/com/zbkj/crmeb/wechat/controller/WeChatController.java index 78227030..9a657765 100644 --- a/crmeb/src/main/java/com/zbkj/crmeb/wechat/controller/WeChatController.java +++ b/crmeb/src/main/java/com/zbkj/crmeb/wechat/controller/WeChatController.java @@ -5,6 +5,7 @@ import com.common.CommonResult; import com.constants.WeChatConstants; import com.utils.RedisUtil; import com.zbkj.crmeb.wechat.service.WeChatService; +import com.zbkj.crmeb.wechat.service.WechatPublicService; import io.swagger.annotations.Api; import io.swagger.annotations.ApiImplicitParam; import io.swagger.annotations.ApiOperation; @@ -36,6 +37,9 @@ public class WeChatController { @Autowired private RedisUtil redisUtil; + @Autowired + private WechatPublicService wechatPublicService; + /** * 获取微信菜单 * @author Mr.Zhang @@ -43,16 +47,8 @@ public class WeChatController { */ @ApiOperation(value = "获取自定义菜单") @RequestMapping(value = "/public/get", method = RequestMethod.GET) - @ApiImplicitParam(name="isAsync", value="是否同步微信数据, true是,false否") - public CommonResult get(@RequestParam(name = "isAsync", defaultValue = "false") Boolean isAsync){ - Object list = redisUtil.get(WeChatConstants.REDIS_PUBLIC_MENU_KEY); - if(list == null || list.equals("") || isAsync){ - //如果没有, 去读取 - JSONObject tagsList = weChatService.get(); - redisUtil.set(WeChatConstants.REDIS_PUBLIC_MENU_KEY, tagsList); - list = tagsList; - } - return CommonResult.success(list); + public CommonResult get(){ + return CommonResult.success(wechatPublicService.getCustomizeMenus()); } /** @@ -64,7 +60,7 @@ public class WeChatController { @ApiOperation(value = "保存自定义菜单") @RequestMapping(value = "/public/create", method = RequestMethod.POST) public CommonResult create(@RequestBody String data){ - return CommonResult.success(weChatService.create(data)); + return CommonResult.success(wechatPublicService.createMenus(data)); } /** @@ -75,7 +71,7 @@ public class WeChatController { @ApiOperation(value = "删除自定义菜单") @RequestMapping(value = "/public/delete", method = RequestMethod.GET) public CommonResult delete(){ - return CommonResult.success(weChatService.delete()); + return CommonResult.success(wechatPublicService.deleteMenus()); } //自定义菜单 diff --git a/crmeb/src/main/java/com/zbkj/crmeb/wechat/request/TemplateMessageSearchRequest.java b/crmeb/src/main/java/com/zbkj/crmeb/wechat/request/TemplateMessageSearchRequest.java index 12dd9dfe..9bb0adc0 100644 --- a/crmeb/src/main/java/com/zbkj/crmeb/wechat/request/TemplateMessageSearchRequest.java +++ b/crmeb/src/main/java/com/zbkj/crmeb/wechat/request/TemplateMessageSearchRequest.java @@ -31,4 +31,7 @@ public class TemplateMessageSearchRequest { @ApiModelProperty(value = "状态, 0 正常,1 禁用") private Integer status = null; + + @ApiModelProperty(value = "0=订阅消息,1=微信模板消息") + private Boolean type; } diff --git a/crmeb/src/main/java/com/zbkj/crmeb/wechat/service/TemplateMessageService.java b/crmeb/src/main/java/com/zbkj/crmeb/wechat/service/TemplateMessageService.java index 56af8ecf..8d139a68 100644 --- a/crmeb/src/main/java/com/zbkj/crmeb/wechat/service/TemplateMessageService.java +++ b/crmeb/src/main/java/com/zbkj/crmeb/wechat/service/TemplateMessageService.java @@ -34,4 +34,27 @@ public interface TemplateMessageService extends IService { void consumeProgram(); TemplateMessageIndustryVo getIndustry(); + + /** + * 发送公众号模板消息 + * @param templateNo 模板消息编号 + * @param temMap 内容Map + * @param openId 微信用户openId + */ + void pushTemplateMessage(String templateNo, HashMap temMap, String openId); + + /** + * 发送小程序订阅消息 + * @param templateNo 模板消息编号 + * @param temMap 内容Map + * @param openId 微信用户openId + */ + void pushMiniTemplateMessage(String templateNo, HashMap temMap, String openId); + + /** + * 获取小程序订阅模板编号 + * @param type 场景类型(支付之前:beforePay|支付成功:afterPay|申请退款:refundApply|充值之前:beforeRecharge|创建砍价:createBargain|参与拼团:pink|取消拼团:cancelPink) + * @return + */ + List getMiniTempList(String type); } \ No newline at end of file diff --git a/crmeb/src/main/java/com/zbkj/crmeb/wechat/service/WechatPublicService.java b/crmeb/src/main/java/com/zbkj/crmeb/wechat/service/WechatPublicService.java new file mode 100644 index 00000000..bdf74bda --- /dev/null +++ b/crmeb/src/main/java/com/zbkj/crmeb/wechat/service/WechatPublicService.java @@ -0,0 +1,36 @@ +package com.zbkj.crmeb.wechat.service; + +import com.alibaba.fastjson.JSONObject; + +/** + * 微信公众号service + * +---------------------------------------------------------------------- + * | CRMEB [ CRMEB赋能开发者,助力企业发展 ] + * +---------------------------------------------------------------------- + * | Copyright (c) 2016~2020 https://www.crmeb.com All rights reserved. + * +---------------------------------------------------------------------- + * | Licensed CRMEB并不是自由软件,未经许可不能去掉CRMEB相关版权 + * +---------------------------------------------------------------------- + * | Author: CRMEB Team + * +---------------------------------------------------------------------- + */ +public interface WechatPublicService { + + /** + * 获取公众号自定义菜单 + */ + Object getCustomizeMenus(); + + /** + * 保存自定义菜单 + * @param data 菜单json + * @return + */ + JSONObject createMenus(String data); + + /** + * 删除自定义菜单 + * @return + */ + JSONObject deleteMenus(); +} diff --git a/crmeb/src/main/java/com/zbkj/crmeb/wechat/service/impl/TemplateMessageServiceImpl.java b/crmeb/src/main/java/com/zbkj/crmeb/wechat/service/impl/TemplateMessageServiceImpl.java index 4013d3e3..e7ffcc45 100644 --- a/crmeb/src/main/java/com/zbkj/crmeb/wechat/service/impl/TemplateMessageServiceImpl.java +++ b/crmeb/src/main/java/com/zbkj/crmeb/wechat/service/impl/TemplateMessageServiceImpl.java @@ -1,5 +1,7 @@ package com.zbkj.crmeb.wechat.service.impl; +import cn.hutool.core.util.ObjectUtil; +import cn.hutool.core.util.StrUtil; import com.alibaba.fastjson.JSONObject; import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; @@ -16,9 +18,7 @@ import com.zbkj.crmeb.wechat.request.TemplateMessageSearchRequest; import com.zbkj.crmeb.wechat.service.TemplateMessageService; import com.zbkj.crmeb.wechat.service.WeChatService; import com.zbkj.crmeb.wechat.service.WechatProgramMyTempService; -import com.zbkj.crmeb.wechat.vo.SendTemplateMessageItemVo; -import com.zbkj.crmeb.wechat.vo.TemplateMessageIndustryVo; -import com.zbkj.crmeb.wechat.vo.TemplateMessageVo; +import com.zbkj.crmeb.wechat.vo.*; import org.apache.commons.lang3.StringUtils; import org.slf4j.Logger; import org.slf4j.LoggerFactory; @@ -90,6 +90,9 @@ public class TemplateMessageServiceImpl extends ServiceImpl temMap, String openId) { + TemplateMessageVo templateMessageVo = new TemplateMessageVo(); + + TemplateMessage templateMessage = getInfoByTempKey(templateNo); + if(ObjectUtil.isNull(templateMessage) || StrUtil.isBlank(templateMessage.getContent())){ + return; + } + templateMessageVo.setTemplate_id(templateMessage.getTempId()); + + HashMap hashMap = new HashMap<>(); + for (Map.Entry entry : temMap.entrySet()){ + hashMap.put(entry.getKey(), new SendTemplateMessageItemVo(entry.getValue())); + } + + templateMessageVo.setData(hashMap); + templateMessageVo.setTouser(openId); + redisUtil.lPush(Constants.WE_CHAT_MESSAGE_KEY_PUBLIC, JSONObject.toJSONString(templateMessageVo)); + } + + /** + * 发送小程序订阅消息 + * @param templateNo 模板消息编号 + * @param temMap 内容Map + * @param openId 微信用户openId + */ + @Override + public void pushMiniTemplateMessage(String templateNo, HashMap temMap, String openId) { + TemplateMessage templateMessage = getInfoByTempKey(templateNo); + if(ObjectUtil.isNull(templateMessage) || StrUtil.isBlank(templateMessage.getContent())){ + return; + } + + ProgramTemplateMessageVo programTemplateMessageVo = new ProgramTemplateMessageVo(); + programTemplateMessageVo.setTemplate_id(templateMessage.getTempId()); + + //组装关键字数据 + HashMap hashMap = new HashMap<>(); + temMap.forEach((key, value) -> hashMap.put(key, new SendProgramTemplateMessageItemVo(value))); + + programTemplateMessageVo.setData(hashMap); + programTemplateMessageVo.setTouser(openId); + redisUtil.lPush(Constants.WE_CHAT_MESSAGE_KEY_PROGRAM, JSONObject.toJSONString(programTemplateMessageVo)); + } + + /** + * 获取小程序订阅模板编号 + * @param type 场景类型 + * 支付之前:beforePay + * 支付成功通知 + * 支付成功:afterPay + * 发货、配送、收货 + * 申请退款:refundApply + * 退款成功、拒绝退款 + * 充值之前:beforeRecharge + * 充值成功通知 + * 创建砍价:createBargain + * 砍价成功、失败通知 + * 参与拼团:pink + * 拼团成功、失败通知 + * 取消拼团:cancelPink + * 退款成功、拒绝退款 + * @return + */ + @Override + public List getMiniTempList(String type) { + LambdaQueryWrapper lqw = new LambdaQueryWrapper<>(); + lqw.select(TemplateMessage::getName, TemplateMessage::getTempId); + lqw.eq(TemplateMessage::getStatus, 1); //没有禁用的数据 + lqw.eq(TemplateMessage::getType, 0); + switch (type) { + case "beforePay":// 支付之前 + lqw.eq(TemplateMessage::getTempKey, Constants.WE_CHAT_PROGRAM_TEMP_KEY_ORDER_PAY); + break; + case "afterPay":// 支付成功 + lqw.in(TemplateMessage::getTempKey, Constants.WE_CHAT_PROGRAM_TEMP_KEY_EXPRESS, Constants.WE_CHAT_PROGRAM_TEMP_KEY_DELIVERY, Constants.WE_CHAT_PROGRAM_TEMP_KEY_ORDER_RECEIVING); + break; + case "refundApply":// 申请退款 + lqw.eq(TemplateMessage::getTempKey, "-1"); + break; + case "beforeRecharge":// 充值之前 + lqw.eq(TemplateMessage::getTempKey, "-1"); + break; + case "createBargain":// 创建砍价 + lqw.in(TemplateMessage::getTempKey, Constants.WE_CHAT_PROGRAM_TEMP_KEY_BARGAIN_SUCCESS); + break; + case "pink":// 参与拼团 + lqw.in(TemplateMessage::getTempKey, Constants.WE_CHAT_PROGRAM_TEMP_KEY_COMBINATION_SUCCESS); + break; + case "cancelPink":// cancelPink + lqw.eq(TemplateMessage::getTempKey, "-1"); + break; + } + return dao.selectList(lqw); + } + /** * 查询单条数据 * @param id Integer id diff --git a/crmeb/src/main/java/com/zbkj/crmeb/wechat/service/impl/WechatPublicServiceImpl.java b/crmeb/src/main/java/com/zbkj/crmeb/wechat/service/impl/WechatPublicServiceImpl.java new file mode 100644 index 00000000..393a70b2 --- /dev/null +++ b/crmeb/src/main/java/com/zbkj/crmeb/wechat/service/impl/WechatPublicServiceImpl.java @@ -0,0 +1,81 @@ +package com.zbkj.crmeb.wechat.service.impl; + +import com.alibaba.fastjson.JSONObject; +import com.constants.WeChatConstants; +import com.utils.RedisUtil; +import com.zbkj.crmeb.wechat.service.WeChatService; +import com.zbkj.crmeb.wechat.service.WechatPublicService; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Service; + +/** + * 微信公众号Service实现类 + * +---------------------------------------------------------------------- + * | CRMEB [ CRMEB赋能开发者,助力企业发展 ] + * +---------------------------------------------------------------------- + * | Copyright (c) 2016~2020 https://www.crmeb.com All rights reserved. + * +---------------------------------------------------------------------- + * | Licensed CRMEB并不是自由软件,未经许可不能去掉CRMEB相关版权 + * +---------------------------------------------------------------------- + * | Author: CRMEB Team + * +---------------------------------------------------------------------- + */ +@Service +public class WechatPublicServiceImpl implements WechatPublicService { + + private static final Logger logger = LoggerFactory.getLogger(WechatPublicServiceImpl.class); + + @Autowired + private RedisUtil redisUtil; + + @Autowired + private WeChatService weChatService; + + + /** + * 获取公众号自定义菜单 + * @return Object + */ + @Override + public Object getCustomizeMenus() { + Object list = redisUtil.get(WeChatConstants.REDIS_PUBLIC_MENU_KEY); + if(list == null || list.equals("")){ + //如果没有, 去读取 + JSONObject tagsList = weChatService.get(); + redisUtil.set(WeChatConstants.REDIS_PUBLIC_MENU_KEY, tagsList); + list = tagsList; + } + return list; + } + + /** + * 保存自定义菜单 + * @param data 菜单json + * @return JSONObject + */ + @Override + public JSONObject createMenus(String data) { + JSONObject jsonObject = weChatService.create(data); + // 清除历史缓存 + if (redisUtil.exists(WeChatConstants.REDIS_PUBLIC_MENU_KEY)) { + redisUtil.remove(WeChatConstants.REDIS_PUBLIC_MENU_KEY); + } + return jsonObject; + } + + /** + * 删除自定义菜单 + * @return + */ + @Override + public JSONObject deleteMenus() { + JSONObject delete = weChatService.delete(); + // 清除历史缓存 + if (redisUtil.exists(WeChatConstants.REDIS_PUBLIC_MENU_KEY)) { + redisUtil.remove(WeChatConstants.REDIS_PUBLIC_MENU_KEY); + } + return delete; + } +} diff --git a/crmeb/src/main/resources/application-beta.yml b/crmeb/src/main/resources/application-beta.yml index d0826880..99241b08 100644 --- a/crmeb/src/main/resources/application-beta.yml +++ b/crmeb/src/main/resources/application-beta.yml @@ -2,7 +2,7 @@ server: port: 20001 domain: #配合swagger使用 # 待部署域名 - version: v1.3.1 # 当前代码版本 + version: v1.3.2 # 当前代码版本 wechat-api-url: asyncConfig: false asyncWeChatProgramTempList: false @@ -15,14 +15,14 @@ spring: datasource: type: com.alibaba.druid.pool.DruidDataSource driver-class-name: com.mysql.jdbc.Driver - url: jdbc:mysql://127.0.0.1:3306/crmeb_java_beta?characterEncoding=utf-8&useSSL=false&serverTimeZone=GMT+8 - username: crmeb_java_beta - password: yourPwd + url: + username: + password: redis: - host: 127.0.0.1 #地址 + host: #地址 port: 6379 #端口 - password: youPwd - timeout: 30000 # 连接超时时间(毫秒) + password: + timeout: 1000 # 连接超时时间(毫秒) database: 0 #默认数据库 jedis: pool: diff --git a/crmeb/src/main/resources/application-dev.yml b/crmeb/src/main/resources/application-dev.yml index 5c0522a5..70e64b5f 100644 --- a/crmeb/src/main/resources/application-dev.yml +++ b/crmeb/src/main/resources/application-dev.yml @@ -2,7 +2,7 @@ server: port: 20002 domain: #配合swagger使用 # 待部署域名 - version: v1.3.1 # 当前代码版本 + version: v1.3.2 # 当前代码版本 wechat-api-url: asyncConfig: false asyncWeChatProgramTempList: false @@ -15,15 +15,15 @@ spring: datasource: type: com.alibaba.druid.pool.DruidDataSource driver-class-name: com.mysql.jdbc.Driver - url: jdbc:mysql://127.0.0.1:3306/crmeb_java_beta?characterEncoding=utf-8&useSSL=false&serverTimeZone=GMT+8 - username: crmeb_java_beta - password: yourPwd + url: + username: + password: redis: - host: 127.0.0.1 #地址 + host: #地址 port: 6379 #端口 - password: youPwd - timeout: 30000 # 连接超时时间(毫秒) - database: 0 #默认数据库 + password: + timeout: 1000 # 连接超时时间(毫秒) + database: 10 #默认数据库 jedis: pool: max-active: 200 # 连接池最大连接数(使用负值表示没有限制) diff --git a/crmeb/src/main/resources/application-prod.yml b/crmeb/src/main/resources/application-prod.yml index 4e1fdd65..3e1adb96 100644 --- a/crmeb/src/main/resources/application-prod.yml +++ b/crmeb/src/main/resources/application-prod.yml @@ -1,8 +1,8 @@ # 配置端口 server: port: 20000 - domain: #配合swagger使用 # 待部署域名 - version: v1.3.1 # 当前代码版本 + domain: api.java.crmeb.net #配合swagger使用 # 待部署域名 + version: v1.3.2 # 当前代码版本 wechat-api-url: wechat-js-api-debug: false wechat-js-api-beta: false @@ -17,15 +17,15 @@ spring: datasource: type: com.alibaba.druid.pool.DruidDataSource driver-class-name: com.mysql.jdbc.Driver - url: jdbc:mysql://127.0.0.1:3306/crmeb_java_beta?characterEncoding=utf-8&useSSL=false&serverTimeZone=GMT+8 - username: crmeb_java_beta - password: yourPwd + url: + username: + password: redis: host: 127.0.0.1 #地址 port: 6379 #端口 - password: youPwd - timeout: 30000 # 连接超时时间(毫秒) - database: 0 #默认数据库 + password: + timeout: 1000 # 连接超时时间(毫秒) + database: 9 #默认数据库 jedis: pool: max-active: 200 # 连接池最大连接数(使用负值表示没有限制) diff --git a/crmeb/src/main/resources/application.yml b/crmeb/src/main/resources/application.yml index 72d5f184..ebc76c9d 100644 --- a/crmeb/src/main/resources/application.yml +++ b/crmeb/src/main/resources/application.yml @@ -2,8 +2,8 @@ server: port: 8080 domain: #配合swagger使用 # 待部署域名 - version: v1.3.1 # 当前代码版本 - wechat-api-url: #请求微信接口中转服务器 + version: v1.3.2 # 当前代码版本 + wechat-api-url: #请求微信接口中专服务器 wechat-js-api-debug: false #微信js api系列是否开启调试模式 wechat-js-api-beta: true #微信js api是否是beta版本 asyncConfig: false #是否同步config表数据到redis @@ -31,13 +31,13 @@ spring: datasource: type: com.alibaba.druid.pool.DruidDataSource driver-class-name: com.mysql.jdbc.Driver - url: jdbc:mysql://127.0.0.1:3306/crmeb_java_beta?characterEncoding=utf-8&useSSL=false&serverTimeZone=GMT+8 - username: crmeb_java_beta - password: yourPwd + url: jdbc:mysql://127.0.0.1:3306/crmeb_java?characterEncoding=utf-8&useSSL=false&serverTimeZone=GMT+8 + username: root + password: root redis: - host: 127.0.0.1 #地址 + host: #地址 port: 6379 #端口 - password: youPwd + password: timeout: 30000 # 连接超时时间(毫秒) database: 0 #默认数据库 jedis: diff --git a/crmeb/src/main/resources/logback-spring.xml b/crmeb/src/main/resources/logback-spring.xml index 069a3629..7a1f40dd 100644 --- a/crmeb/src/main/resources/logback-spring.xml +++ b/crmeb/src/main/resources/logback-spring.xml @@ -223,7 +223,7 @@ - + diff --git a/crmeb/src/main/resources/mapper/finance/UserFundsMonitorMapper.xml b/crmeb/src/main/resources/mapper/finance/UserFundsMonitorMapper.xml index d3e45059..3d1c0eea 100644 --- a/crmeb/src/main/resources/mapper/finance/UserFundsMonitorMapper.xml +++ b/crmeb/src/main/resources/mapper/finance/UserFundsMonitorMapper.xml @@ -3,9 +3,9 @@ + + diff --git a/crmeb/src/main/resources/mapper/user/UserBrokerageRecordMapper.xml b/crmeb/src/main/resources/mapper/user/UserBrokerageRecordMapper.xml new file mode 100644 index 00000000..658253c3 --- /dev/null +++ b/crmeb/src/main/resources/mapper/user/UserBrokerageRecordMapper.xml @@ -0,0 +1,5 @@ + + + + +