This commit is contained in:
ָ·ìdeÑô¹â
2021-02-06 17:45:04 +08:00
parent 247655dbdb
commit 10d83d7cff
165 changed files with 6754 additions and 2034 deletions

View File

@@ -78,4 +78,17 @@ public class CommonPage<T> {
BeanUtils.copyProperties(originPageInfo, pageInfo, "list"); BeanUtils.copyProperties(originPageInfo, pageInfo, "list");
return pageInfo; return pageInfo;
} }
/**
* 对象A复制对象B的分页信息 //TODO 多次数据查询导致分页数据异常解决办法
*/
public static <T> PageInfo<T> copyPageInfo(PageInfo<?> originPageInfo, List<T> list) {
PageInfo<T> 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;
}
} }

View File

@@ -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 <admin@crmeb.com>
* +----------------------------------------------------------------------
*/
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;
}

View File

@@ -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 <admin@crmeb.com>
* +----------------------------------------------------------------------
*/
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 = "佣金转余额";
}

View File

@@ -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 <admin@crmeb.com>
* +----------------------------------------------------------------------
*/
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;
}

View File

@@ -62,7 +62,7 @@ public class Constants {
public static final String USER_LOGIN_PASSWORD_MD5_KEYWORDS = "crmeb"; public static final String USER_LOGIN_PASSWORD_MD5_KEYWORDS = "crmeb";
//用户登token redis存储前缀 //用户登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 //用户登录方式 h5
@@ -101,7 +101,8 @@ public class Constants {
public static final Integer PRODUCT_SELECT_CATEGORY_NUM_MAX = 10; 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"; public static final String UPLOAD_TYPE_FILE = "file";
@@ -119,6 +120,9 @@ public class Constants {
public static final int UPLOAD_TYPE_USER = 7; //用户上传 public static final int UPLOAD_TYPE_USER = 7; //用户上传
// 移动端文章顶部的banner图最大数量 配置数据最小3最大10
public static final String ARTICLE_BANNER_LIMIT = "news_slides_limit";
//城市数据 redis key //城市数据 redis key
public static final String CITY_LIST = "city_list"; public static final String CITY_LIST = "city_list";
//城市数据 tree redis key //城市数据 tree redis key
@@ -158,7 +162,8 @@ public class Constants {
//config配置的key //config配置的key
public static final String CONFIG_KEY_SITE_URL = "site_url"; //域名 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_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_KEY_SITE_NAME = "site_name"; //网站名称
public static final String CONFIG_SITE_TENG_XUN_MAP_KEY = "tengxun_map_key"; //腾讯地图key public static final String CONFIG_SITE_TENG_XUN_MAP_KEY = "tengxun_map_key"; //腾讯地图key
public static final String CONFIG_BANK_LIST = "user_extract_bank"; //可提现银行 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_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_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_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_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_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_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_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 = "integral_ratio"; //积分抵用比例(1积分抵多少金额
public static final String CONFIG_KEY_INTEGRAL_RATE_ORDER_GIVE = "order_give_integral"; //下单支付金额按比例赠送积分实际支付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"; public static final String CONFIG_KEY_DISTRIBUTION_TYPE = "brokerage_bindind";
@@ -213,7 +215,7 @@ public class Constants {
//config配置的formId //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; //公众号配置 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 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}元"; //退款 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; //小程序 public static final int ORDER_PAY_CHANNEL_PROGRAM = 1; //小程序
//微信消息模板 tempKey //微信消息模板 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_FIRST = "first";
public static final String WE_CHAT_TEMP_KEY_END = "remark"; 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_COMBINATION_SUCCESS = "OPENTM407456411";// 拼团成功
public static final String WE_CHAT_TEMP_KEY_BARGAIN_SUCCESS = "OPENTM410292733";// 砍价成功 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测试用 //CND URL测试用
@@ -510,4 +523,7 @@ public class Constants {
public static final String FAIL = "FAIL"; public static final String FAIL = "FAIL";
public static final String SUCCESS = "SUCCESS"; public static final String SUCCESS = "SUCCESS";
// 订单取消Key
public static final String ORDER_AUTO_CANCEL_KEY = "order_auto_cancel_key";
} }

View File

@@ -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 <admin@crmeb.com>
* +----------------------------------------------------------------------
*/
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= "拼团";
}

View File

@@ -1,7 +1,7 @@
package com.constants; package com.constants;
/** /**
* 短信配置常量类 * 短信常量类
* +---------------------------------------------------------------------- * +----------------------------------------------------------------------
* | CRMEB [ CRMEB赋能开发者助力企业发展 ] * | CRMEB [ CRMEB赋能开发者助力企业发展 ]
* +---------------------------------------------------------------------- * +----------------------------------------------------------------------
@@ -13,112 +13,103 @@ package com.constants;
* +---------------------------------------------------------------------- * +----------------------------------------------------------------------
*/ */
public class SmsConstants { 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; public static final Integer SMS_ERROR_CODE = 400;
//短信发送队列key /** 短信发送队列key */
public static final String SMS_SEND_KEY = "sms_send_list"; public static final String SMS_SEND_KEY = "sms_send_list";
// 发送短信后状态同步key
public static final String SMS_SEND_RESULT_KEY = "sms_send_result_list";
// 短信模版配置开关常量 /** 手机验证码redis key */
public static final String SMS_CONFIG_VERIFICATION_CODE = "verificationCode";// 验证码 public static final String SMS_VALIDATE_PHONE = "sms_validate_code:";
public static final Integer SMS_CONFIG_VERIFICATION_CODE_TEMP_ID = 518076;//
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 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 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 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 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[{}]"; public static final String SMS_COMMON_PARAM_FORMAT = "param[{}]";
// 用户token前缀 // /** 用户token前缀 */
public static final String SMS_USER_TOKEN_PREFIX = "Bearer-"; // 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_{}";
}

View File

@@ -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 <admin@crmeb.com>
* +----------------------------------------------------------------------
*/
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";
}

View File

@@ -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 <admin@crmeb.com>
* +----------------------------------------------------------------------
*/
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;
}

View File

@@ -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 <admin@crmeb.com>
* +----------------------------------------------------------------------
*/
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;
}

View File

@@ -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); data = SpringUtil.getBean(SystemAttachmentService.class).prefixImage(data);
} }

View File

@@ -603,6 +603,7 @@ public class CrmebUtil {
/** /**
* 同比率计算 //同比增长率= ((当前周期 - 上一个周期) ÷ 上一个周期 ) *100% * 同比率计算 //同比增长率= ((当前周期 - 上一个周期) ÷ 上一个周期 ) *100%
* 如果上个周期为0 = 当前周期 * 100%
* @param b1 当前周期 * @param b1 当前周期
* @param b2 上一个周期 * @param b2 上一个周期
* @author Mr.Zhang * @author Mr.Zhang
@@ -619,7 +620,7 @@ public class CrmebUtil {
if(b2.equals(BigDecimal.ZERO)){ if(b2.equals(BigDecimal.ZERO)){
//b2是0 //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); return (b1.subtract(b2)).multiply(BigDecimal.TEN).multiply(BigDecimal.TEN).divide(b2, BigDecimal.ROUND_UP);
@@ -679,7 +680,7 @@ public class CrmebUtil {
* @return 生成的随机码 * @return 生成的随机码
*/ */
public static String getOrderNo(String payType){ 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);
} }
/** /**

View File

@@ -99,7 +99,8 @@ public class RequestUtil extends HttpServlet{
public static String getUri(HttpServletRequest request){ public static String getUri(HttpServletRequest request){
String uri = request.getRequestURI(); String uri = request.getRequestURI();
List<String> list = CrmebUtil.stringToArrayStrRegex(uri, "/"); List<String> list = CrmebUtil.stringToArrayStrRegex(uri, "/");
list.removeIf(StringUtils::isNumeric); list.removeIf(StringUtils::isNumeric); //去掉url中的数字参数
list.removeIf(c -> c.contains(","));// 去掉url中的逗号分隔参数
return StringUtils.join(list, "/"); return StringUtils.join(list, "/");
} }
} }

View File

@@ -21,6 +21,7 @@ import org.apache.http.ssl.SSLContexts;
import org.apache.http.util.EntityUtils; import org.apache.http.util.EntityUtils;
import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.http.*; import org.springframework.http.*;
import org.springframework.http.client.SimpleClientHttpRequestFactory;
import org.springframework.stereotype.Component; import org.springframework.stereotype.Component;
import org.springframework.util.LinkedMultiValueMap; import org.springframework.util.LinkedMultiValueMap;
import org.springframework.util.MultiValueMap; import org.springframework.util.MultiValueMap;
@@ -68,6 +69,17 @@ public class RestTemplateUtil {
" (" + System.getProperty("os.arch") + " " + System.getProperty("os.name") + " " + System.getProperty("os.version") + " (" + System.getProperty("os.arch") + " " + System.getProperty("os.name") + " " + System.getProperty("os.version") +
") Java/" + System.getProperty("java.version") + " HttpClient/" + HttpClient.class.getPackage().getImplementationVersion(); ") 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请求 * 发送GET请求
* @param url * @param url
@@ -436,6 +448,11 @@ public class RestTemplateUtil {
HttpEntity<MultiValueMap<String, Object>> requestEntity = HttpEntity<MultiValueMap<String, Object>> requestEntity =
new HttpEntity<>(params, headers); 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(); return restTemplate.postForEntity(url, requestEntity, String.class).getBody();
} }
} }

View File

@@ -1,6 +1,7 @@
package com.utils; package com.utils;
import cn.hutool.core.util.RandomUtil; import cn.hutool.core.util.RandomUtil;
import cn.hutool.core.util.StrUtil;
import com.constants.Constants; import com.constants.Constants;
import com.exception.CrmebException; import com.exception.CrmebException;
import com.zbkj.crmeb.upload.vo.FileResultVo; import com.zbkj.crmeb.upload.vo.FileResultVo;
@@ -35,7 +36,8 @@ public class UploadUtil {
//类型 //类型
// private static String imagePath = "/image"; // 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(); String fileName = multipartFile.getOriginalFilename();
System.out.println("fileName = " + fileName);
// 文件后缀名 // 文件后缀名
String extName = FilenameUtils.getExtension(fileName); String extName = FilenameUtils.getExtension(fileName);
if (StringUtils.isEmpty(extName)) { if (StringUtils.isEmpty(extName)) {
throw new RuntimeException("文件类型未定义不能上传..."); throw new RuntimeException("文件类型未定义不能上传...");
} }
if (fileName.length() > 99) {
fileName = StrUtil.subPre(fileName, 90).concat(".").concat(extName);
}
//文件大小验证 //文件大小验证
checkSize(multipartFile.getSize()); checkSize(multipartFile.getSize());

View File

@@ -36,7 +36,6 @@ import org.springframework.web.bind.annotation.*;
@RestController @RestController
@RequestMapping("api/admin/article") @RequestMapping("api/admin/article")
@Api(tags = "文章管理") @Api(tags = "文章管理")
public class ArticleController { public class ArticleController {
@Autowired @Autowired

View File

@@ -3,6 +3,8 @@ package com.zbkj.crmeb.article.service.impl;
import cn.hutool.core.util.ObjectUtil; import cn.hutool.core.util.ObjectUtil;
import cn.hutool.core.util.StrUtil; import cn.hutool.core.util.StrUtil;
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; 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.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import com.common.CommonPage; import com.common.CommonPage;
import com.common.PageParamRequest; 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.article.vo.ArticleVo;
import com.zbkj.crmeb.category.model.Category; import com.zbkj.crmeb.category.model.Category;
import com.zbkj.crmeb.category.service.CategoryService; import com.zbkj.crmeb.category.service.CategoryService;
import com.zbkj.crmeb.system.service.SystemConfigService;
import org.apache.commons.lang3.StringUtils; import org.apache.commons.lang3.StringUtils;
import org.springframework.beans.BeanUtils; import org.springframework.beans.BeanUtils;
import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service; import org.springframework.stereotype.Service;
import javax.annotation.Resource; import javax.annotation.Resource;
import java.io.Console;
import java.util.ArrayList; import java.util.ArrayList;
import java.util.List; import java.util.List;
import java.util.Optional; import java.util.Optional;
import static com.constants.Constants.ARTICLE_BANNER_LIMIT;
/** /**
* ArticleServiceImpl 接口实现 * ArticleServiceImpl 接口实现
* +---------------------------------------------------------------------- * +----------------------------------------------------------------------
@@ -49,7 +55,8 @@ public class ArticleServiceImpl extends ServiceImpl<ArticleDao, Article> impleme
@Autowired @Autowired
private CategoryService categoryService; private CategoryService categoryService;
@Autowired
private SystemConfigService systemConfigService;
/** /**
* 列表 * 列表
* @param request ArticleSearchRequest 请求参数 * @param request ArticleSearchRequest 请求参数
@@ -62,7 +69,7 @@ public class ArticleServiceImpl extends ServiceImpl<ArticleDao, Article> impleme
public PageInfo<ArticleVo> getList(ArticleSearchRequest request, PageParamRequest pageParamRequest) { public PageInfo<ArticleVo> getList(ArticleSearchRequest request, PageParamRequest pageParamRequest) {
Page<Article> articlePage = PageHelper.startPage(pageParamRequest.getPage(), pageParamRequest.getLimit()); Page<Article> articlePage = PageHelper.startPage(pageParamRequest.getPage(), pageParamRequest.getLimit());
LambdaQueryWrapper<Article> lambdaQueryWrapper = new LambdaQueryWrapper<>(); LambdaQueryWrapper<Article> lambdaQueryWrapper = Wrappers.lambdaQuery();
if(StringUtils.isNotBlank(request.getCid())){ if(StringUtils.isNotBlank(request.getCid())){
lambdaQueryWrapper.eq(Article::getCid, request.getCid()); lambdaQueryWrapper.eq(Article::getCid, request.getCid());
@@ -104,6 +111,9 @@ public class ArticleServiceImpl extends ServiceImpl<ArticleDao, Article> impleme
if(articleList.size() < 1){ if(articleList.size() < 1){
return CommonPage.copyPageInfo(articlePage, articleVoArrayList); return CommonPage.copyPageInfo(articlePage, articleVoArrayList);
} }
// 根据配置控制banner的数量
String articleBannerLimitString = systemConfigService.getValueByKey(ARTICLE_BANNER_LIMIT);
int articleBannerLimit = Integer.parseInt(articleBannerLimitString);
for (Article article : articleList) { for (Article article : articleList) {
ArticleVo articleVo = new ArticleVo(); ArticleVo articleVo = new ArticleVo();
@@ -113,6 +123,9 @@ public class ArticleServiceImpl extends ServiceImpl<ArticleDao, Article> impleme
articleVo.setImageInputs(article.getImageInput()); articleVo.setImageInputs(article.getImageInput());
} }
articleVoArrayList.add(articleVo); articleVoArrayList.add(articleVo);
if(articleVoArrayList.size() >= articleBannerLimit){
break;
}
} }
return CommonPage.copyPageInfo(articlePage, articleVoArrayList); return CommonPage.copyPageInfo(articlePage, articleVoArrayList);

View File

@@ -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 <admin@crmeb.com>
* +----------------------------------------------------------------------
*/
@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<SystemAdminResponse> 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<SystemAdminResponse> 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<SystemAdminResponse> getAdminInfo(HttpServletRequest request) throws Exception{
String token = checkAdminToken.getTokenFormRequest(request);
SystemAdminResponse systemAdminResponse = systemAdminService.getInfoByToken(token);
return CommonResult.success(systemAdminResponse);
}
/**
* 获取登录页图片
* @return Map<String, Object>
*/
@ApiOperation(value = "获取登录页图片")
@RequestMapping(value = "/getLoginPic", method = RequestMethod.GET)
public CommonResult<Map<String, Object>> getLoginPic(){
return CommonResult.success(systemAdminService.getLoginPic());
}
// /**
// * 微信登录公共号授权登录
// * @author Mr.Zhang
// * @since 2020-05-25
// */
// @ApiOperation(value = "微信登录公共号授权登录")
// @RequestMapping(value = "/authorize/login", method = RequestMethod.GET)
// public CommonResult<SystemAdminResponse> 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<Boolean> bind(){
// return CommonResult.success(systemAdminService.unBind());
// }
}

View File

@@ -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 <admin@crmeb.com>
* +----------------------------------------------------------------------
*/
@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<SystemAdminResponse> 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<SystemAdminResponse> 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<SystemAdminResponse> getAdminInfo(HttpServletRequest request) throws Exception{
String token = checkAdminToken.getTokenFormRequest(request);
SystemAdminResponse systemAdminResponse = systemAdminService.getInfoByToken(token);
return CommonResult.success(systemAdminResponse);
}
/**
* 获取登录页图片
* @return Map<String, Object>
*/
@ApiOperation(value = "获取登录页图片")
@RequestMapping(value = "/getLoginPic", method = RequestMethod.GET)
public CommonResult<Map<String, Object>> getLoginPic(){
Map<String, Object> 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<SystemGroupDataAdminLoginBannerResponse> 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<SystemAdminResponse> 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<Boolean> bind(){
return CommonResult.success(systemAdminService.unBind());
}
}

View File

@@ -1,6 +1,5 @@
package com.zbkj.crmeb.authorization.manager; package com.zbkj.crmeb.authorization.manager;
import cn.hutool.Hutool;
import cn.hutool.core.thread.ThreadUtil; import cn.hutool.core.thread.ThreadUtil;
import com.common.CheckAdminToken; import com.common.CheckAdminToken;
import com.common.CommonResult; 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 com.zbkj.crmeb.validatecode.service.impl.ValidateCodeServiceImpl;
import lombok.SneakyThrows; import lombok.SneakyThrows;
import org.apache.commons.lang3.StringUtils; 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.Autowired;
import org.springframework.beans.factory.annotation.Value; import org.springframework.beans.factory.annotation.Value;
import org.springframework.boot.autoconfigure.condition.ConditionalOnSingleCandidate;
import org.springframework.stereotype.Component; import org.springframework.stereotype.Component;
import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletRequest;

View File

@@ -21,14 +21,15 @@ import java.util.Locale;
*/ */
@Data @Data
public class TokenModel implements Serializable { public class TokenModel implements Serializable {
private static final long serialVersionUID = 4903514237492573024L;
// 加密后的token key // 加密后的token key
public static final String TOKEN_KEY = "TOKEN"; public static final String TOKEN_KEY = "TOKEN";
// Redis 存储的key // Redis 存储的key
public static final String TOKEN_REDIS = "TOKEN_ADMIN_"; public static final String TOKEN_REDIS = "TOKEN:ADMIN:";
// 用户号 // 用户号
private String userNo; private String userNo;
private Integer userId; private Integer userId;
private String Token; private String token;
// 最后访问时间 // 最后访问时间
private long lastAccessedTime = System.currentTimeMillis(); private long lastAccessedTime = System.currentTimeMillis();
// 过期时间 // 过期时间
@@ -43,12 +44,12 @@ public class TokenModel implements Serializable {
private SystemAdmin systemAdmin; private SystemAdmin systemAdmin;
public String getAuthorization() throws Exception { 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){ public TokenModel(String userno, String token){
this.userNo = userno; this.userNo = userno;
this.Token = token; this.token = token;
} }
public TokenModel() { public TokenModel() {

View File

@@ -12,7 +12,9 @@ import com.baomidou.mybatisplus.core.conditions.update.UpdateWrapper;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import com.common.CommonPage; import com.common.CommonPage;
import com.common.PageParamRequest; import com.common.PageParamRequest;
import com.constants.BargainConstants;
import com.constants.Constants; import com.constants.Constants;
import com.constants.ProductConstants;
import com.exception.CrmebException; import com.exception.CrmebException;
import com.github.pagehelper.Page; import com.github.pagehelper.Page;
import com.github.pagehelper.PageHelper; import com.github.pagehelper.PageHelper;
@@ -158,7 +160,8 @@ public class StoreBargainServiceImpl extends ServiceImpl<StoreBargainDao, StoreB
//砍价参与人数 //砍价参与人数
Integer countPeopleAll = bargainUserList.size(); Integer countPeopleAll = bargainUserList.size();
//砍价成功人数 //砍价成功人数
Long countPeopleSuccess = bargainUserList.stream().filter(o -> 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()); Long countPeopleHelp = storeBargainUserHelpService.getHelpCountByBargainId(storeBargain.getId());
storeBargainResponse.setCountPeopleAll(countPeopleAll.longValue()); storeBargainResponse.setCountPeopleAll(countPeopleAll.longValue());
@@ -231,14 +234,15 @@ public class StoreBargainServiceImpl extends ServiceImpl<StoreBargainDao, StoreB
// 处理商品属性,给砍价商品一份单规格默认属性 // 处理商品属性,给砍价商品一份单规格默认属性
StoreProductAttr singleAttr = new StoreProductAttr(); StoreProductAttr singleAttr = new StoreProductAttr();
singleAttr.setProductId(bargain.getId()).setAttrName("规格").setAttrValues("默认").setType(Constants.PRODUCT_TYPE_BARGAIN); singleAttr.setProductId(bargain.getId()).setAttrName(ProductConstants.SINGLE_ATTR_NAME)
.setAttrValues(ProductConstants.SINGLE_ATTR_VALUE).setType(ProductConstants.PRODUCT_TYPE_BARGAIN);
boolean attrAddResult = attrService.save(singleAttr); boolean attrAddResult = attrService.save(singleAttr);
if (!attrAddResult) throw new CrmebException("新增属性名失败"); if (!attrAddResult) throw new CrmebException("新增属性名失败");
// 处理商品属性值,砍价商品只有一条属性值 // 处理商品属性值,砍价商品只有一条属性值
StoreProductAttrValue singleAttrValue = new StoreProductAttrValue(); StoreProductAttrValue singleAttrValue = new StoreProductAttrValue();
BeanUtils.copyProperties(attrValueRequest, singleAttrValue); BeanUtils.copyProperties(attrValueRequest, singleAttrValue);
singleAttrValue.setProductId(bargain.getId()).setType(Constants.PRODUCT_TYPE_BARGAIN); singleAttrValue.setProductId(bargain.getId()).setType(ProductConstants.PRODUCT_TYPE_BARGAIN);
singleAttrValue.setImage(systemAttachmentService.clearPrefix(singleAttrValue.getImage())); singleAttrValue.setImage(systemAttachmentService.clearPrefix(singleAttrValue.getImage()));
boolean saveAttrValue = attrValueService.save(singleAttrValue); boolean saveAttrValue = attrValueService.save(singleAttrValue);
if(!saveAttrValue) throw new CrmebException("新增属性详情失败"); if(!saveAttrValue) throw new CrmebException("新增属性详情失败");
@@ -248,15 +252,15 @@ public class StoreBargainServiceImpl extends ServiceImpl<StoreBargainDao, StoreB
0, 0,
bargain.getId(), bargain.getId(),
systemAttachmentService.clearPrefix(JSON.toJSONString(request.getAttrValue())), systemAttachmentService.clearPrefix(JSON.toJSONString(request.getAttrValue())),
DateUtil.getNowTime(),Constants.PRODUCT_TYPE_BARGAIN); DateUtil.getNowTime(),ProductConstants.PRODUCT_TYPE_BARGAIN);
boolean saveResult = storeProductAttrResultService.save(attrResult); boolean saveResult = storeProductAttrResultService.save(attrResult);
if(!saveResult) throw new CrmebException("新增商品属性详情详情失败"); if(!saveResult) throw new CrmebException("新增商品属性详情详情失败");
// 处理富文本 // 处理富文本
StoreProductDescription spd = new StoreProductDescription( StoreProductDescription spd = new StoreProductDescription(
bargain.getId(), request.getContent().length() > 0 bargain.getId(), request.getContent().length() > 0
? systemAttachmentService.clearPrefix(request.getContent()) : "" , Constants.PRODUCT_TYPE_BARGAIN); ? systemAttachmentService.clearPrefix(request.getContent()) : "" , ProductConstants.PRODUCT_TYPE_BARGAIN);
storeProductDescriptionService.deleteByProductId(spd.getProductId(), Constants.PRODUCT_TYPE_BARGAIN); storeProductDescriptionService.deleteByProductId(spd.getProductId(), ProductConstants.PRODUCT_TYPE_BARGAIN);
boolean saveDesc = storeProductDescriptionService.save(spd); boolean saveDesc = storeProductDescriptionService.save(spd);
if (!saveDesc) throw new CrmebException("新增商品富文本失败"); if (!saveDesc) throw new CrmebException("新增商品富文本失败");
@@ -303,21 +307,21 @@ public class StoreBargainServiceImpl extends ServiceImpl<StoreBargainDao, StoreB
} }
// 砍价商品属性attr不用变化attrValue删除原有的替换为现有的 // 砍价商品属性attr不用变化attrValue删除原有的替换为现有的
attrValueService.removeByProductId(request.getId(), Constants.PRODUCT_TYPE_BARGAIN); attrValueService.removeByProductId(request.getId(), ProductConstants.PRODUCT_TYPE_BARGAIN);
StoreProductAttrValue singleAttrValue = new StoreProductAttrValue(); StoreProductAttrValue singleAttrValue = new StoreProductAttrValue();
BeanUtils.copyProperties(attrValueRequest, singleAttrValue); BeanUtils.copyProperties(attrValueRequest, singleAttrValue);
singleAttrValue.setProductId(bargain.getId()).setType(Constants.PRODUCT_TYPE_BARGAIN); singleAttrValue.setProductId(bargain.getId()).setType(ProductConstants.PRODUCT_TYPE_BARGAIN);
singleAttrValue.setImage(systemAttachmentService.clearPrefix(singleAttrValue.getImage())); singleAttrValue.setImage(systemAttachmentService.clearPrefix(singleAttrValue.getImage()));
boolean saveAttrValue = attrValueService.save(singleAttrValue); boolean saveAttrValue = attrValueService.save(singleAttrValue);
if(!saveAttrValue) throw new CrmebException("编辑属性详情失败"); if(!saveAttrValue) throw new CrmebException("编辑属性详情失败");
// attrResult整存整取不做更新 // attrResult整存整取不做更新
storeProductAttrResultService.deleteByProductId(bargain.getId(),Constants.PRODUCT_TYPE_BARGAIN); storeProductAttrResultService.deleteByProductId(bargain.getId(),ProductConstants.PRODUCT_TYPE_BARGAIN);
StoreProductAttrResult attrResult = new StoreProductAttrResult( StoreProductAttrResult attrResult = new StoreProductAttrResult(
0, 0,
bargain.getId(), bargain.getId(),
systemAttachmentService.clearPrefix(JSON.toJSONString(request.getAttrValue())), systemAttachmentService.clearPrefix(JSON.toJSONString(request.getAttrValue())),
DateUtil.getNowTime(),Constants.PRODUCT_TYPE_BARGAIN); DateUtil.getNowTime(),ProductConstants.PRODUCT_TYPE_BARGAIN);
storeProductAttrResultService.save(attrResult); storeProductAttrResultService.save(attrResult);
return saveCount > 0; return saveCount > 0;
@@ -325,9 +329,9 @@ public class StoreBargainServiceImpl extends ServiceImpl<StoreBargainDao, StoreB
/** /**
* 更新砍价商品状态 * 更新砍价商品状态
* @param id * @param id 砍价商品id
* @param status * @param status 砍价商品状态
* @return * @return Boolean
*/ */
@Override @Override
public boolean updateBargainStatus(Integer id, boolean status) { public boolean updateBargainStatus(Integer id, boolean status) {
@@ -365,7 +369,7 @@ public class StoreBargainServiceImpl extends ServiceImpl<StoreBargainDao, StoreB
// 查询attr // 查询attr
StoreProductAttr spaPram = new StoreProductAttr(); StoreProductAttr spaPram = new StoreProductAttr();
spaPram.setProductId(storeBargain.getProductId() ).setType(Constants.PRODUCT_TYPE_NORMAL); spaPram.setProductId(storeBargain.getProductId() ).setType(ProductConstants.PRODUCT_TYPE_NORMAL);
List<StoreProductAttr> attrs = attrService.getByEntity(spaPram); List<StoreProductAttr> attrs = attrService.getByEntity(spaPram);
storeProductResponse.setAttr(attrs); storeProductResponse.setAttr(attrs);
storeProductResponse.setSliderImage(String.join(",",storeBargain.getImages())); storeProductResponse.setSliderImage(String.join(",",storeBargain.getImages()));
@@ -378,15 +382,15 @@ public class StoreBargainServiceImpl extends ServiceImpl<StoreBargainDao, StoreB
// 注意数据瓶装步骤分别查询砍价和商品本身信息组装sku信息之后再对比sku属性是否相等来赋值是否砍价sku信息 // 注意数据瓶装步骤分别查询砍价和商品本身信息组装sku信息之后再对比sku属性是否相等来赋值是否砍价sku信息
StoreProductAttrValue spavPramBargain = new StoreProductAttrValue(); StoreProductAttrValue spavPramBargain = new StoreProductAttrValue();
spavPramBargain.setProductId(bargainId).setType(Constants.PRODUCT_TYPE_BARGAIN); spavPramBargain.setProductId(bargainId).setType(ProductConstants.PRODUCT_TYPE_BARGAIN);
List<StoreProductAttrValue> storeProductAttrValuesBargain = attrValueService.getByEntity(spavPramBargain); List<StoreProductAttrValue> storeProductAttrValuesBargain = attrValueService.getByEntity(spavPramBargain);
List<HashMap<String, Object>> attrValuesBargain = genratorSkuInfo(bargainId, specType, storeBargain, storeProductAttrValuesBargain, Constants.PRODUCT_TYPE_BARGAIN); List<HashMap<String, Object>> attrValuesBargain = genratorSkuInfo(bargainId, specType, storeBargain, storeProductAttrValuesBargain, ProductConstants.PRODUCT_TYPE_BARGAIN);
// 查询attrValue // 查询attrValue
StoreProductAttrValue spavPramProduct = new StoreProductAttrValue(); StoreProductAttrValue spavPramProduct = new StoreProductAttrValue();
spavPramProduct.setProductId(storeBargain.getProductId()).setType(Constants.PRODUCT_TYPE_NORMAL); spavPramProduct.setProductId(storeBargain.getProductId()).setType(ProductConstants.PRODUCT_TYPE_NORMAL);
List<StoreProductAttrValue> storeProductAttrValuesProduct = attrValueService.getByEntity(spavPramProduct); List<StoreProductAttrValue> storeProductAttrValuesProduct = attrValueService.getByEntity(spavPramProduct);
List<HashMap<String, Object>> attrValuesProduct = genratorSkuInfo(storeBargain.getProductId(), specType, storeBargain, storeProductAttrValuesProduct, Constants.PRODUCT_TYPE_NORMAL); List<HashMap<String, Object>> attrValuesProduct = genratorSkuInfo(storeBargain.getProductId(), specType, storeBargain, storeProductAttrValuesProduct, ProductConstants.PRODUCT_TYPE_NORMAL);
// H5 端用于生成skuList // H5 端用于生成skuList
List<StoreProductAttrValueResponse> sPAVResponses = new ArrayList<>(); List<StoreProductAttrValueResponse> sPAVResponses = new ArrayList<>();
@@ -423,7 +427,7 @@ public class StoreBargainServiceImpl extends ServiceImpl<StoreBargainDao, StoreB
StoreProductDescription sd = storeProductDescriptionService.getOne( StoreProductDescription sd = storeProductDescriptionService.getOne(
new LambdaQueryWrapper<StoreProductDescription>() new LambdaQueryWrapper<StoreProductDescription>()
.eq(StoreProductDescription::getProductId, bargainId) .eq(StoreProductDescription::getProductId, bargainId)
.eq(StoreProductDescription::getType, Constants.PRODUCT_TYPE_BARGAIN)); .eq(StoreProductDescription::getType, ProductConstants.PRODUCT_TYPE_BARGAIN));
if(null != sd){ if(null != sd){
storeProductResponse.setContent(StrUtil.isBlank(sd.getDescription()) ? "" : sd.getDescription()); storeProductResponse.setContent(StrUtil.isBlank(sd.getDescription()) ? "" : sd.getDescription());
} }
@@ -470,7 +474,6 @@ public class StoreBargainServiceImpl extends ServiceImpl<StoreBargainDao, StoreB
qw.select("ifnull(sum(look), 0) as lookCount", "ifnull(sum(share), 0) as shareCount"); qw.select("ifnull(sum(look), 0) as lookCount", "ifnull(sum(share), 0) as shareCount");
qw.eq("is_del", false); qw.eq("is_del", false);
Map<String, Object> map = getMap(qw); Map<String, Object> map = getMap(qw);
// Long userCount = storeBargainUserHelpService.getHelpPeopleCount();
Integer count = storeBargainUserHelpService.count(); Integer count = storeBargainUserHelpService.count();
map.put("userCount", count.longValue()); map.put("userCount", count.longValue());
return map; return map;
@@ -478,8 +481,7 @@ public class StoreBargainServiceImpl extends ServiceImpl<StoreBargainDao, StoreB
/** /**
* H5 砍价商品详情 * H5 砍价商品详情
* @param id * @param id 砍价商品id
* @return
*/ */
@Override @Override
public BargainDetailResponse getH5Detail(Integer id) { public BargainDetailResponse getH5Detail(Integer id) {
@@ -491,22 +493,22 @@ public class StoreBargainServiceImpl extends ServiceImpl<StoreBargainDao, StoreB
storeProductResponse.setEndTime(storeBargain.getStopTime()); storeProductResponse.setEndTime(storeBargain.getStopTime());
StoreProductAttr spaPram = new StoreProductAttr(); StoreProductAttr spaPram = new StoreProductAttr();
spaPram.setProductId(id).setType(Constants.PRODUCT_TYPE_BARGAIN); spaPram.setProductId(id).setType(ProductConstants.PRODUCT_TYPE_BARGAIN);
storeProductResponse.setAttr(attrService.getByEntity(spaPram)); storeProductResponse.setAttr(attrService.getByEntity(spaPram));
StoreProductAttrValue spavPramBargain = new StoreProductAttrValue(); StoreProductAttrValue spavPramBargain = new StoreProductAttrValue();
spavPramBargain.setProductId(id).setType(Constants.PRODUCT_TYPE_BARGAIN); spavPramBargain.setProductId(id).setType(ProductConstants.PRODUCT_TYPE_BARGAIN);
List<StoreProductAttrValue> storeProductAttrValuesBargain = storeProductAttrValueService.getByEntity(spavPramBargain); List<StoreProductAttrValue> storeProductAttrValuesBargain = storeProductAttrValueService.getByEntity(spavPramBargain);
// 查询attr // 查询attr
StoreProductAttr spaPramNormal = new StoreProductAttr(); StoreProductAttr spaPramNormal = new StoreProductAttr();
spaPramNormal.setProductId(storeBargain.getProductId() ).setType(Constants.PRODUCT_TYPE_NORMAL); spaPramNormal.setProductId(storeBargain.getProductId() ).setType(ProductConstants.PRODUCT_TYPE_NORMAL);
List<StoreProductAttr> attrs = attrService.getByEntity(spaPramNormal); List<StoreProductAttr> attrs = attrService.getByEntity(spaPramNormal);
boolean specType = false; boolean specType = false;
if (attrs.size() > 1) { if (attrs.size() > 1) {
specType = true; specType = true;
} }
List<HashMap<String, Object>> attrValuesBargain = genratorSkuInfo(id, specType, storeBargain, storeProductAttrValuesBargain, Constants.PRODUCT_TYPE_BARGAIN); List<HashMap<String, Object>> attrValuesBargain = genratorSkuInfo(id, specType, storeBargain, storeProductAttrValuesBargain, ProductConstants.PRODUCT_TYPE_BARGAIN);
// H5 端用于生成skuList // H5 端用于生成skuList
List<StoreProductAttrValueResponse> sPAVResponses = new ArrayList<>(); List<StoreProductAttrValueResponse> sPAVResponses = new ArrayList<>();
@@ -523,7 +525,7 @@ public class StoreBargainServiceImpl extends ServiceImpl<StoreBargainDao, StoreB
StoreProductDescription sd = storeProductDescriptionService.getOne( StoreProductDescription sd = storeProductDescriptionService.getOne(
new LambdaQueryWrapper<StoreProductDescription>() new LambdaQueryWrapper<StoreProductDescription>()
.eq(StoreProductDescription::getProductId, id) .eq(StoreProductDescription::getProductId, id)
.eq(StoreProductDescription::getType, Constants.PRODUCT_TYPE_BARGAIN)); .eq(StoreProductDescription::getType, ProductConstants.PRODUCT_TYPE_BARGAIN));
if(null != sd){ if(null != sd){
storeProductResponse.setContent(null == sd.getDescription()?"":sd.getDescription()); storeProductResponse.setContent(null == sd.getDescription()?"":sd.getDescription());
} }
@@ -546,23 +548,14 @@ public class StoreBargainServiceImpl extends ServiceImpl<StoreBargainDao, StoreB
/** /**
* 用户砍价活动次数 * 用户砍价活动次数
* @param storeBargain * @param storeBargain 砍价商品
* @param uid * @param uid 用户uid
* @return * @return
* 1.用户有没有砍价中的活动 * 1.用户有没有砍价中的活动
* 2.没有的,用户的砍价次数有没有到 * 2.没有的,用户的砍价次数有没有到
*/ */
private int isCanPink(StoreBargain storeBargain, Integer uid) { private int isCanPink(StoreBargain storeBargain, Integer uid) {
int userBargainStatus = 0; // 能 int userBargainStatus = 0; // 能
// StoreBargainUser storeBargainUser = storeBargainUserService.getByBargainIdAndUidAndPink(storeBargain.getId(), uid);
// if (ObjectUtil.isNotNull(storeBargainUser)) {
// userBargainStatus = 1; // 不能
// return userBargainStatus;
// }
// List<StoreBargainUser> list = storeBargainUserService.getListByBargainIdAndUid(storeBargain.getId(), uid);
// if (CollUtil.isNotEmpty(list) && list.size() >= storeBargain.getNum()) {
// userBargainStatus = 1;
// }
List<StoreBargainUser> list = storeBargainUserService.getListByBargainIdAndUid(storeBargain.getId(), uid); List<StoreBargainUser> list = storeBargainUserService.getListByBargainIdAndUid(storeBargain.getId(), uid);
if (CollUtil.isNotEmpty(list)) { if (CollUtil.isNotEmpty(list)) {
userBargainStatus = list.size(); userBargainStatus = list.size();
@@ -572,13 +565,12 @@ public class StoreBargainServiceImpl extends ServiceImpl<StoreBargainDao, StoreB
/** /**
* 获取当前时间段的砍价商品 * 获取当前时间段的砍价商品
* @param productId * @param productId 砍价商品id
* @return * @return
*/ */
@Override @Override
public List<StoreBargain> getCurrentBargainByProductId(Integer productId) { public List<StoreBargain> getCurrentBargainByProductId(Integer productId) {
long timeMillis = System.currentTimeMillis(); long timeMillis = System.currentTimeMillis();
PageParamRequest pageParamRequest = new PageParamRequest();
LambdaQueryWrapper<StoreBargain> lqw = new LambdaQueryWrapper<>(); LambdaQueryWrapper<StoreBargain> lqw = new LambdaQueryWrapper<>();
lqw.eq(StoreBargain::getProductId, productId); lqw.eq(StoreBargain::getProductId, productId);
lqw.eq(StoreBargain::getIsDel, false); lqw.eq(StoreBargain::getIsDel, false);
@@ -590,8 +582,8 @@ public class StoreBargainServiceImpl extends ServiceImpl<StoreBargainDao, StoreB
/** /**
* 参与砍价商品活动 * 参与砍价商品活动
* @param request * @param request 请求参数
* @return * @return Boolean
*/ */
@Override @Override
public Boolean start(BargainFrontRequest request) { public Boolean start(BargainFrontRequest request) {
@@ -605,7 +597,7 @@ public class StoreBargainServiceImpl extends ServiceImpl<StoreBargainDao, StoreB
spavBargainUser.setIsDel(false).setBargainId(request.getBargainId()).setUid(user.getUid()); spavBargainUser.setIsDel(false).setBargainId(request.getBargainId()).setUid(user.getUid());
List<StoreBargainUser> historyList = storeBargainUserService.getByEntity(spavBargainUser); List<StoreBargainUser> historyList = storeBargainUserService.getByEntity(spavBargainUser);
if (CollUtil.isNotEmpty(historyList)) { if (CollUtil.isNotEmpty(historyList)) {
List<StoreBargainUser> collect = historyList.stream().filter(i -> i.getStatus() == 1).collect(Collectors.toList()); List<StoreBargainUser> collect = historyList.stream().filter(i -> i.getStatus().equals(BargainConstants.BARGAIN_USER_STATUS_PARTICIPATE)).collect(Collectors.toList());
if (CollUtil.isNotEmpty(collect)) throw new CrmebException("请先完成当前砍价活动"); if (CollUtil.isNotEmpty(collect)) throw new CrmebException("请先完成当前砍价活动");
// 判断是否达到参与砍价活动上限 // 判断是否达到参与砍价活动上限
if (historyList.size() >= storeBargain.getNum()) { if (historyList.size() >= storeBargain.getNum()) {
@@ -620,14 +612,14 @@ public class StoreBargainServiceImpl extends ServiceImpl<StoreBargainDao, StoreB
storeBargainUser.setBargainPrice(storeBargain.getPrice()); storeBargainUser.setBargainPrice(storeBargain.getPrice());
storeBargainUser.setPrice(BigDecimal.ZERO); storeBargainUser.setPrice(BigDecimal.ZERO);
storeBargainUser.setAddTime(System.currentTimeMillis()); storeBargainUser.setAddTime(System.currentTimeMillis());
storeBargainUser.setStatus(1); storeBargainUser.setStatus(BargainConstants.BARGAIN_USER_STATUS_PARTICIPATE);
return storeBargainUserService.save(storeBargainUser); return storeBargainUserService.save(storeBargainUser);
} }
/** /**
* 砍价商品根据实体查询 * 砍价商品根据实体查询
* @param storeBargainParam * @param storeBargainParam 请求参数
* @return * @return list
*/ */
@Override @Override
public List<StoreBargain> getByEntity(StoreBargain storeBargainParam) { public List<StoreBargain> getByEntity(StoreBargain storeBargainParam) {
@@ -650,7 +642,7 @@ public class StoreBargainServiceImpl extends ServiceImpl<StoreBargainDao, StoreB
// 因为attrvalue表中unique使用Id代替更新前先查询此表是否存在 // 因为attrvalue表中unique使用Id代替更新前先查询此表是否存在
StoreProductAttrValue spavParm = new StoreProductAttrValue(); StoreProductAttrValue spavParm = new StoreProductAttrValue();
spavParm.setProductId(bargainId); spavParm.setProductId(bargainId);
spavParm.setType(Constants.PRODUCT_TYPE_BARGAIN); spavParm.setType(ProductConstants.PRODUCT_TYPE_BARGAIN);
spavParm.setId(attrValueId); spavParm.setId(attrValueId);
List<StoreProductAttrValue> attrvalues = storeProductAttrValueService.getByEntity(spavParm); List<StoreProductAttrValue> attrvalues = storeProductAttrValueService.getByEntity(spavParm);
if (CollUtil.isEmpty(attrvalues)) throw new CrmebException("未找到相关商品属性"); if (CollUtil.isEmpty(attrvalues)) throw new CrmebException("未找到相关商品属性");
@@ -658,7 +650,7 @@ public class StoreBargainServiceImpl extends ServiceImpl<StoreBargainDao, StoreB
// 对应的主商品sku // 对应的主商品sku
List<StoreProductAttrValue> currentProAttrValues = storeProductAttrValueService.getListByProductId(productId); List<StoreProductAttrValue> currentProAttrValues = storeProductAttrValueService.getListByProductId(productId);
List<StoreProductAttrValue> existAttrValues = currentProAttrValues.stream().filter(e -> List<StoreProductAttrValue> 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()); .collect(Collectors.toList());
if (CollUtil.isEmpty(existAttrValues)) throw new CrmebException("未找到扣减库存的商品"); if (CollUtil.isEmpty(existAttrValues)) throw new CrmebException("未找到扣减库存的商品");
// 砍价SKU 库存减,销量、限购总数减 // 砍价SKU 库存减,销量、限购总数减
@@ -674,8 +666,8 @@ public class StoreBargainServiceImpl extends ServiceImpl<StoreBargainDao, StoreB
if (ObjectUtil.isNull(storeBargainUser)) throw new CrmebException("砍价用户信息不存在"); if (ObjectUtil.isNull(storeBargainUser)) throw new CrmebException("砍价用户信息不存在");
storeBargainUser.setStatus(3); storeBargainUser.setStatus(3);
Boolean execute = transactionTemplate.execute(e -> { Boolean execute = transactionTemplate.execute(e -> {
storeProductAttrValueService.decProductAttrStock(bargainId, attrValueId, num, Constants.PRODUCT_TYPE_BARGAIN); storeProductAttrValueService.decProductAttrStock(bargainId, attrValueId, num, ProductConstants.PRODUCT_TYPE_BARGAIN);
storeProductService.decProductStock(productId, num, existAttrValues.get(0).getId(), Constants.PRODUCT_TYPE_NORMAL); storeProductService.decProductStock(productId, num, existAttrValues.get(0).getId(), ProductConstants.PRODUCT_TYPE_NORMAL);
update(luw); update(luw);
storeBargainUserService.updateById(storeBargainUser); storeBargainUserService.updateById(storeBargainUser);
return Boolean.TRUE; return Boolean.TRUE;
@@ -743,14 +735,14 @@ public class StoreBargainServiceImpl extends ServiceImpl<StoreBargainDao, StoreB
// 查询用户参与活动表中状态为进行中的数据 // 查询用户参与活动表中状态为进行中的数据
StoreBargainUser spavBargainUser = new StoreBargainUser(); StoreBargainUser spavBargainUser = new StoreBargainUser();
spavBargainUser.setBargainId(bargain.getId()); spavBargainUser.setBargainId(bargain.getId());
spavBargainUser.setStatus(1); spavBargainUser.setStatus(BargainConstants.BARGAIN_USER_STATUS_PARTICIPATE);
spavBargainUser.setIsDel(false); spavBargainUser.setIsDel(false);
List<StoreBargainUser> bargainUsers = storeBargainUserService.getByEntity(spavBargainUser); List<StoreBargainUser> bargainUsers = storeBargainUserService.getByEntity(spavBargainUser);
if (CollUtil.isEmpty(bargainUsers)) { if (CollUtil.isEmpty(bargainUsers)) {
continue ; continue ;
} }
for (int i = 0; i < bargainUsers.size(); i++) { 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); bargainUserList.addAll(bargainUsers);
} }

View File

@@ -8,7 +8,9 @@ import com.baomidou.mybatisplus.core.conditions.update.LambdaUpdateWrapper;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import com.common.CommonPage; import com.common.CommonPage;
import com.common.PageParamRequest; import com.common.PageParamRequest;
import com.constants.BargainConstants;
import com.constants.Constants; import com.constants.Constants;
import com.constants.UserConstants;
import com.exception.CrmebException; import com.exception.CrmebException;
import com.github.pagehelper.Page; import com.github.pagehelper.Page;
import com.github.pagehelper.PageHelper; 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.request.BargainFrontRequest;
import com.zbkj.crmeb.front.response.BargainCountResponse; import com.zbkj.crmeb.front.response.BargainCountResponse;
import com.zbkj.crmeb.user.model.User; 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.UserService;
import com.zbkj.crmeb.user.service.UserTokenService;
import com.zbkj.crmeb.wechat.service.TemplateMessageService; import com.zbkj.crmeb.wechat.service.TemplateMessageService;
import org.springframework.beans.BeanUtils; import org.springframework.beans.BeanUtils;
import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Autowired;
@@ -68,6 +72,9 @@ public class StoreBargainUserHelpServiceImpl extends ServiceImpl<StoreBargainUse
@Autowired @Autowired
private TemplateMessageService templateMessageService; private TemplateMessageService templateMessageService;
@Autowired
private UserTokenService userTokenService;
/** /**
* 列表 * 列表
@@ -145,7 +152,7 @@ public class StoreBargainUserHelpServiceImpl extends ServiceImpl<StoreBargainUse
lqw.eq(StoreBargainUserHelp::getBargainUserId, bargainUser.getId()); lqw.eq(StoreBargainUserHelp::getBargainUserId, bargainUser.getId());
List<StoreBargainUserHelp> storeBargainUserHelps = dao.selectList(lqw); List<StoreBargainUserHelp> storeBargainUserHelps = dao.selectList(lqw);
if (CollUtil.isEmpty(storeBargainUserHelps)) { 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<StoreBargainUse
} else { } else {
isConsume = true; isConsume = true;
} }
//
// LambdaQueryWrapper<StoreBargainUserHelp> lqWrapper = new LambdaQueryWrapper<>();
// lqWrapper.eq(StoreBargainUserHelp::getBargainId, request.getBargainId());
// lqWrapper.eq(StoreBargainUserHelp::getUid, user.getUid());
// lqWrapper.ne(StoreBargainUserHelp::getBargainUserId, bargainUser.getId());
// List<StoreBargainUserHelp> 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<StoreBargainUse
User user = userService.getInfo(); User user = userService.getInfo();
// 判断是否砍价成功 // 判断是否砍价成功
if (storeBargainUser.getStatus() == 3 || storeBargainUser.getBargainPriceMin().compareTo(storeBargainUser.getBargainPrice().subtract(storeBargainUser.getPrice())) >= 0) { if (storeBargainUser.getStatus().equals(BargainConstants.BARGAIN_USER_STATUS_SUCCESS) || storeBargainUser.getBargainPriceMin().compareTo(storeBargainUser.getBargainPrice().subtract(storeBargainUser.getPrice())) >= 0) {
throw new CrmebException("商品已完成砍价"); throw new CrmebException("商品已完成砍价");
} }
@@ -302,22 +296,61 @@ public class StoreBargainUserHelpServiceImpl extends ServiceImpl<StoreBargainUse
// 如果砍价完成,发送微信模板消息 // 如果砍价完成,发送微信模板消息
if (storeBargain.getPeopleNum().equals(helpCount.intValue() + 1)) { if (storeBargain.getPeopleNum().equals(helpCount.intValue() + 1)) {
// 发送微信模板消息 // 发送微信模板消息
HashMap<String, String> temMap = new HashMap<>(); // HashMap<String, String> temMap = new HashMap<>();
temMap.put(Constants.WE_CHAT_TEMP_KEY_FIRST, "好腻害!你的朋友们已经帮你砍到底价了!"); // temMap.put(Constants.WE_CHAT_TEMP_KEY_FIRST, "好腻害!你的朋友们已经帮你砍到底价了!");
temMap.put("keyword1", storeBargain.getTitle()); // temMap.put("keyword1", storeBargain.getTitle());
temMap.put("keyword2", storeBargain.getMinPrice().toString()); // temMap.put("keyword2", storeBargain.getMinPrice().toString());
temMap.put(Constants.WE_CHAT_TEMP_KEY_END, "感谢您的参与!"); // 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); map.put("bargainPrice", bargainPrice);
return map; 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<String, String> 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 @Override
public Long getHelpPeopleCount() { public Long getHelpPeopleCount() {
@@ -339,8 +372,7 @@ public class StoreBargainUserHelpServiceImpl extends ServiceImpl<StoreBargainUse
/** /**
* 获取参与砍价人员数量 * 获取参与砍价人员数量
* @param bargainId * @param bargainId 砍价商品id
* @return
*/ */
@Override @Override
public Long getHelpPeopleCountByBargainId(Integer bargainId) { public Long getHelpPeopleCountByBargainId(Integer bargainId) {
@@ -375,8 +407,7 @@ public class StoreBargainUserHelpServiceImpl extends ServiceImpl<StoreBargainUse
/** /**
* 砍价发起用户信息 * 砍价发起用户信息
* @param bargainFrontRequest * @param bargainFrontRequest 砍价公共请求参数
* @return
*/ */
@Override @Override
public Map<String, String> startUser(BargainFrontRequest bargainFrontRequest) { public Map<String, String> startUser(BargainFrontRequest bargainFrontRequest) {
@@ -427,7 +458,6 @@ public class StoreBargainUserHelpServiceImpl extends ServiceImpl<StoreBargainUse
/** /**
* 获取帮助砍价用户的帮砍次数 * 获取帮助砍价用户的帮砍次数
* @return
*/ */
private StoreBargainUserHelp getByUidAndBargainIdAndBargainUserId(Integer uid, Integer bargainId, Integer bargainUserId) { private StoreBargainUserHelp getByUidAndBargainIdAndBargainUserId(Integer uid, Integer bargainId, Integer bargainUserId) {
LambdaQueryWrapper<StoreBargainUserHelp> lambdaQueryWrapper = new LambdaQueryWrapper<>(); LambdaQueryWrapper<StoreBargainUserHelp> lambdaQueryWrapper = new LambdaQueryWrapper<>();

View File

@@ -8,6 +8,7 @@ import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import com.common.CommonPage; import com.common.CommonPage;
import com.common.PageParamRequest; import com.common.PageParamRequest;
import com.constants.BargainConstants;
import com.constants.Constants; import com.constants.Constants;
import com.github.pagehelper.Page; import com.github.pagehelper.Page;
import com.github.pagehelper.PageHelper; import com.github.pagehelper.PageHelper;
@@ -100,7 +101,7 @@ public class StoreBargainUserServiceImpl extends ServiceImpl<StoreBargainUserDao
bargainUserResponse.setPeopleNum(storeBargain.getPeopleNum()); bargainUserResponse.setPeopleNum(storeBargain.getPeopleNum());
// 剩余砍价次数 // 剩余砍价次数
Long helpCount = storeBargainUserHelpService.getHelpCountByBargainIdAndBargainUid(storeBargain.getId(), bargainUser.getId()); Long helpCount = storeBargainUserHelpService.getHelpCountByBargainIdAndBargainUid(storeBargain.getId(), bargainUser.getId());
bargainUserResponse.setNum(helpCount.intValue()); bargainUserResponse.setNum(storeBargain.getPeopleNum() - helpCount.intValue());
return bargainUserResponse; return bargainUserResponse;
}).collect(Collectors.toList()); }).collect(Collectors.toList());
@@ -165,7 +166,7 @@ public class StoreBargainUserServiceImpl extends ServiceImpl<StoreBargainUserDao
lqw.eq(StoreBargainUser::getBargainId, bargainId); lqw.eq(StoreBargainUser::getBargainId, bargainId);
lqw.eq(StoreBargainUser::getUid, uid); lqw.eq(StoreBargainUser::getUid, uid);
lqw.eq(StoreBargainUser::getIsDel, false); lqw.eq(StoreBargainUser::getIsDel, false);
lqw.eq(StoreBargainUser::getStatus, 1); lqw.eq(StoreBargainUser::getStatus, BargainConstants.BARGAIN_USER_STATUS_PARTICIPATE);
lqw.orderByDesc(StoreBargainUser::getId); lqw.orderByDesc(StoreBargainUser::getId);
List<StoreBargainUser> userList = dao.selectList(lqw); List<StoreBargainUser> userList = dao.selectList(lqw);
if (CollUtil.isEmpty(userList)) { if (CollUtil.isEmpty(userList)) {

View File

@@ -66,23 +66,11 @@ import java.util.List;
/** /**
* 新增分类表 * 新增分类表
* @param categoryRequest 新增参数 * @param categoryRequest 新增参数
* @author Mr.Zhang
* @since 2020-04-16
*/ */
@ApiOperation(value = "新增") @ApiOperation(value = "新增")
@RequestMapping(value = "/save", method = RequestMethod.POST) @RequestMapping(value = "/save", method = RequestMethod.POST)
public CommonResult<String> save(@Validated CategoryRequest categoryRequest){ public CommonResult<String> save(@Validated CategoryRequest categoryRequest){
Category category = new Category(); if(categoryService.create(categoryRequest)){
//检测标题是否存在
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)){
return CommonResult.success(); return CommonResult.success();
}else{ }else{
return CommonResult.failed(); return CommonResult.failed();

View File

@@ -36,8 +36,6 @@ public interface CategoryService extends IService<Category> {
HashMap<Integer, String> getListInId(List<Integer> cateIdList); HashMap<Integer, String> getListInId(List<Integer> cateIdList);
void checkCategoryIsExist(List<Integer> categoryIdList);
Boolean checkAuth(List<Integer> pathIdList, String uri); Boolean checkAuth(List<Integer> pathIdList, String uri);
boolean update(CategoryRequest request, Integer id); boolean update(CategoryRequest request, Integer id);
@@ -49,4 +47,9 @@ public interface CategoryService extends IService<Category> {
boolean checkUrl(String uri); boolean checkUrl(String uri);
boolean updateStatus(Integer id); boolean updateStatus(Integer id);
/**
* 新增分类表
*/
Boolean create(CategoryRequest categoryRequest);
} }

View File

@@ -1,5 +1,6 @@
package com.zbkj.crmeb.category.service.impl; package com.zbkj.crmeb.category.service.impl;
import cn.hutool.core.collection.CollUtil;
import cn.hutool.core.util.ObjectUtil; import cn.hutool.core.util.ObjectUtil;
import com.alibaba.fastjson.JSON; import com.alibaba.fastjson.JSON;
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; 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.core.toolkit.Wrappers;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import com.common.PageParamRequest; import com.common.PageParamRequest;
import com.constants.CategoryConstants;
import com.exception.CrmebException; import com.exception.CrmebException;
import com.github.pagehelper.PageHelper; import com.github.pagehelper.PageHelper;
import com.utils.CrmebUtil; 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.request.CategorySearchRequest;
import com.zbkj.crmeb.category.service.CategoryService; import com.zbkj.crmeb.category.service.CategoryService;
import com.zbkj.crmeb.category.vo.CategoryTreeVo; import com.zbkj.crmeb.category.vo.CategoryTreeVo;
import com.zbkj.crmeb.system.service.SystemAttachmentService;
import org.springframework.beans.BeanUtils; import org.springframework.beans.BeanUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service; import org.springframework.stereotype.Service;
import javax.annotation.Resource; import javax.annotation.Resource;
@@ -25,6 +29,7 @@ import java.util.ArrayList;
import java.util.HashMap; import java.util.HashMap;
import java.util.List; import java.util.List;
import java.util.Map; import java.util.Map;
import java.util.stream.Collectors;
/** /**
* CategoryServiceImpl 接口实现 * CategoryServiceImpl 接口实现
@@ -44,6 +49,9 @@ public class CategoryServiceImpl extends ServiceImpl<CategoryDao, Category> impl
@Resource @Resource
private CategoryDao dao; private CategoryDao dao;
@Autowired
private SystemAttachmentService systemAttachmentService;
/** /**
* 获取分类下子类的数量 * 获取分类下子类的数量
@@ -57,7 +65,6 @@ public class CategoryServiceImpl extends ServiceImpl<CategoryDao, Category> impl
public List<Category> getList(CategorySearchRequest request, PageParamRequest pageParamRequest) { public List<Category> getList(CategorySearchRequest request, PageParamRequest pageParamRequest) {
PageHelper.startPage(pageParamRequest.getPage(), pageParamRequest.getLimit()); PageHelper.startPage(pageParamRequest.getPage(), pageParamRequest.getLimit());
LambdaQueryWrapper<Category> lambdaQueryWrapper = new LambdaQueryWrapper<>(); LambdaQueryWrapper<Category> lambdaQueryWrapper = new LambdaQueryWrapper<>();
// objectQueryWrapper.setEntity(category);
if(null != request.getPid()){ if(null != request.getPid()){
lambdaQueryWrapper.eq(Category::getPid, request.getPid()); lambdaQueryWrapper.eq(Category::getPid, request.getPid());
} }
@@ -65,7 +72,7 @@ public class CategoryServiceImpl extends ServiceImpl<CategoryDao, Category> impl
lambdaQueryWrapper.eq(Category::getType, request.getType()); lambdaQueryWrapper.eq(Category::getType, request.getType());
} }
if(ObjectUtil.isNotNull(request.getStatus()) && request.getStatus() >= 0){ 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()){ if(null != request.getName()){
lambdaQueryWrapper.like(Category::getName, request.getName()); lambdaQueryWrapper.like(Category::getName, request.getName());
@@ -106,28 +113,6 @@ public class CategoryServiceImpl extends ServiceImpl<CategoryDao, Category> impl
return map; return map;
} }
/**
* 批量查询分类id是否合法
* @param categoryIdList List<Integer> id集合
* @author Mr.Zhang
* @since 2020-04-16
*/
@Override
public void checkCategoryIsExist(List<Integer> categoryIdList) {
//查询分类id是否合法
HashMap<Integer, String> 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是否存在 * 查询id和url是否存在
* @author Mr.Zhang * @author Mr.Zhang
@@ -213,7 +198,6 @@ public class CategoryServiceImpl extends ServiceImpl<CategoryDao, Category> impl
private int getChildCountByPid(Integer pid) { private int getChildCountByPid(Integer pid) {
//查看是否有子类 //查看是否有子类
QueryWrapper<Category> objectQueryWrapper = new QueryWrapper<>(); QueryWrapper<Category> objectQueryWrapper = new QueryWrapper<>();
// objectQueryWrapper.eq("status", 1);
objectQueryWrapper.like("path", "/"+pid+"/"); objectQueryWrapper.like("path", "/"+pid+"/");
return dao.selectCount(objectQueryWrapper); return dao.selectCount(objectQueryWrapper);
} }
@@ -297,10 +281,14 @@ public class CategoryServiceImpl extends ServiceImpl<CategoryDao, Category> impl
// 根据名称搜索特殊处理 这里仅仅处理两层搜索后有子父级关系的数据 // 根据名称搜索特殊处理 这里仅仅处理两层搜索后有子父级关系的数据
if(StringUtils.isNotBlank(name) && allTree.size() >0){ if(StringUtils.isNotBlank(name) && allTree.size() >0){
List<Category> searchCategory = new ArrayList<>(); List<Category> searchCategory = new ArrayList<>();
for (Category category : allTree) { List<Integer> categoryIds = allTree.stream().map(Category::getId).collect(Collectors.toList());
if(category.getPid() >0){
searchCategory.add(dao.selectById(category.getPid())); List<Integer> 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); allTree.addAll(searchCategory);
} }
@@ -361,7 +349,7 @@ public class CategoryServiceImpl extends ServiceImpl<CategoryDao, Category> impl
public List<Category> getChildVoListByPid(Integer pid) { public List<Category> getChildVoListByPid(Integer pid) {
//查看是否有子类 //查看是否有子类
QueryWrapper<Category> objectQueryWrapper = new QueryWrapper<>(); QueryWrapper<Category> objectQueryWrapper = new QueryWrapper<>();
objectQueryWrapper.eq("status", 1); objectQueryWrapper.eq("status", CategoryConstants.CATEGORY_STATUS_NORMAL);
objectQueryWrapper.like("path", "/"+pid+"/"); objectQueryWrapper.like("path", "/"+pid+"/");
return dao.selectList(objectQueryWrapper); return dao.selectList(objectQueryWrapper);
} }
@@ -377,8 +365,10 @@ public class CategoryServiceImpl extends ServiceImpl<CategoryDao, Category> impl
@Override @Override
public int checkName(String name, Integer type) { public int checkName(String name, Integer type) {
LambdaQueryWrapper<Category> lambdaQueryWrapper = new LambdaQueryWrapper<>(); LambdaQueryWrapper<Category> lambdaQueryWrapper = new LambdaQueryWrapper<>();
lambdaQueryWrapper.eq(Category::getName, name) lambdaQueryWrapper.eq(Category::getName, name);
.eq(Category::getType, type); if (ObjectUtil.isNotNull(type)) {
lambdaQueryWrapper.eq(Category::getType, type);
}
return dao.selectCount(lambdaQueryWrapper); return dao.selectCount(lambdaQueryWrapper);
} }
@@ -402,5 +392,22 @@ public class CategoryServiceImpl extends ServiceImpl<CategoryDao, Category> impl
category.setStatus(!category.getStatus()); category.setStatus(!category.getStatus());
return updateById(category); 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);
}
} }

View File

@@ -1,7 +1,5 @@
package com.zbkj.crmeb.combination.request; 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.baomidou.mybatisplus.annotation.TableName;
import com.zbkj.crmeb.store.model.StoreProductAttr; import com.zbkj.crmeb.store.model.StoreProductAttr;
import com.zbkj.crmeb.store.request.StoreProductAttrValueRequest; import com.zbkj.crmeb.store.request.StoreProductAttrValueRequest;
@@ -155,9 +153,8 @@ public class StoreCombinationRequest implements Serializable {
@Min(value = 1, message = "单次购买数量限制不能小于1") @Min(value = 1, message = "单次购买数量限制不能小于1")
private Integer onceNum; private Integer onceNum;
@ApiModelProperty(value = "虚拟成团百分比") @ApiModelProperty(value = "虚拟成团数量")
@Min(value = 1, message = "虚拟成团百分比不能小于1") @Min(value = 0, message = "虚拟成团数量不能小于0")
@Max(value = 100, message = "虚拟成团百分比不能大于100")
private Integer virtualRation; private Integer virtualRation;
@ApiModelProperty(value = "商品属性") @ApiModelProperty(value = "商品属性")

View File

@@ -78,4 +78,11 @@ public interface StorePinkService extends IService<StorePink> {
* @return * @return
*/ */
boolean pinkSuccess(Integer kid); boolean pinkSuccess(Integer kid);
/**
* 根据订单编号获取
* @param orderId
* @return
*/
StorePink getByOrderId(String orderId);
} }

View File

@@ -432,7 +432,10 @@ public class StoreCombinationServiceImpl extends ServiceImpl<StoreCombinationDao
storeProductResponse.setSliderImage(String.join(",",storeCombination.getImages())); storeProductResponse.setSliderImage(String.join(",",storeCombination.getImages()));
boolean specType = false; boolean specType = false;
if (attrs.size() > 1) { StoreProductAttr proPram = new StoreProductAttr();
spaPram.setProductId(id).setType(Constants.PRODUCT_TYPE_NORMAL);
List<StoreProductAttr> proAttrs = storeProductAttrService.getByEntity(proPram);
if (proAttrs.size() > 1) {
specType = true; specType = true;
} }
storeProductResponse.setSpecType(specType); storeProductResponse.setSpecType(specType);
@@ -860,15 +863,16 @@ public class StoreCombinationServiceImpl extends ServiceImpl<StoreCombinationDao
public Boolean removePink(StorePinkRequest storePinkRequest) { public Boolean removePink(StorePinkRequest storePinkRequest) {
StorePink userPink = storePinkService.getById(storePinkRequest.getId()); StorePink userPink = storePinkService.getById(storePinkRequest.getId());
if (ObjectUtil.isNull(userPink)) throw new CrmebException("未查到拼团信息,无法取消"); if (ObjectUtil.isNull(userPink)) throw new CrmebException("未查到拼团信息,无法取消");
if (userPink.getIsRefund()) throw new CrmebException("拼团已取消"); if (userPink.getIsRefund()) throw new CrmebException("拼团订单已退款");
// 获取是否拼团成功 // 获取是否拼团成功
if (userPink.getStatus() == 2) { if (userPink.getStatus() == 2) {
throw new CrmebException("拼团已完成,无法取消"); throw new CrmebException("拼团已完成,无法取消");
} }
Integer count = storePinkService.getCountByKid(userPink.getKId()); Integer kid = userPink.getKId() > 0 ? userPink.getKId() : userPink.getId();
Integer count = storePinkService.getCountByKid(kid);
if (count.equals(userPink.getPeople())) { if (count.equals(userPink.getPeople())) {
// 拼团完成操作 // 拼团完成操作
storePinkService.pinkSuccess(userPink.getId()); storePinkService.pinkSuccess(kid);
throw new CrmebException("拼团已完成,无法取消"); throw new CrmebException("拼团已完成,无法取消");
} }
if (userPink.getStatus() == 3) { if (userPink.getStatus() == 3) {
@@ -884,6 +888,7 @@ public class StoreCombinationServiceImpl extends ServiceImpl<StoreCombinationDao
// 订单申请退款 // 订单申请退款
OrderRefundApplyRequest refundRequest = new OrderRefundApplyRequest(); OrderRefundApplyRequest refundRequest = new OrderRefundApplyRequest();
refundRequest.setId(order.getId()); refundRequest.setId(order.getId());
refundRequest.setUni(order.getOrderId());
refundRequest.setText("拼团订单取消,申请退款"); refundRequest.setText("拼团订单取消,申请退款");
refundRequest.setExplain("用户取消拼团订单,申请退款"); refundRequest.setExplain("用户取消拼团订单,申请退款");
boolean apply = orderService.refundApply(refundRequest); boolean apply = orderService.refundApply(refundRequest);

View File

@@ -7,8 +7,10 @@ import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.baomidou.mybatisplus.core.toolkit.Wrappers; import com.baomidou.mybatisplus.core.toolkit.Wrappers;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import com.common.CommonPage; import com.common.CommonPage;
import com.common.MyRecord;
import com.common.PageParamRequest; import com.common.PageParamRequest;
import com.constants.Constants; import com.constants.Constants;
import com.constants.UserConstants;
import com.exception.CrmebException; import com.exception.CrmebException;
import com.github.pagehelper.Page; import com.github.pagehelper.Page;
import com.github.pagehelper.PageHelper; import com.github.pagehelper.PageHelper;
@@ -27,7 +29,10 @@ import com.zbkj.crmeb.front.request.OrderRefundApplyRequest;
import com.zbkj.crmeb.front.service.OrderService; import com.zbkj.crmeb.front.service.OrderService;
import com.zbkj.crmeb.store.model.StoreOrder; import com.zbkj.crmeb.store.model.StoreOrder;
import com.zbkj.crmeb.store.service.StoreOrderService; import com.zbkj.crmeb.store.service.StoreOrderService;
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.UserService;
import com.zbkj.crmeb.user.service.UserTokenService;
import com.zbkj.crmeb.wechat.service.TemplateMessageService; import com.zbkj.crmeb.wechat.service.TemplateMessageService;
import org.springframework.beans.BeanUtils; import org.springframework.beans.BeanUtils;
import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Autowired;
@@ -72,6 +77,9 @@ public class StorePinkServiceImpl extends ServiceImpl<StorePinkDao, StorePink> i
@Autowired @Autowired
private TemplateMessageService templateMessageService; private TemplateMessageService templateMessageService;
@Autowired
private UserTokenService userTokenService;
/** /**
* 列表 * 列表
@@ -207,26 +215,20 @@ public class StorePinkServiceImpl extends ServiceImpl<StorePinkDao, StorePink> i
for (StorePink headPink : headList) { for (StorePink headPink : headList) {
// 查询团员 // 查询团员
List<StorePink> memberList = getListByCidAndKid(headPink.getCid(), headPink.getId()); List<StorePink> memberList = getListByCidAndKid(headPink.getCid(), headPink.getId());
if (CollUtil.isNotEmpty(memberList)) { memberList.add(headPink);
if (headPink.getPeople().equals(memberList.size() + 1)) { if (headPink.getPeople().equals(memberList.size())) {
headPink.setStatus(2); memberList.forEach(i -> i.setStatus(2));
memberList.forEach(i -> i.setStatus(2)); pinkSuccessList.addAll(memberList);
pinkSuccessList.add(headPink); continue;
pinkSuccessList.addAll(memberList); }
continue; // 计算虚拟比例,判断是否拼团成功
} StoreCombination storeCombination = storeCombinationService.getById(headPink.getCid());
// 计算虚拟比例,判断是否拼团成功 Integer virtual = storeCombination.getVirtualRation();// 虚拟成团比例
StoreCombination storeCombination = storeCombinationService.getById(headPink.getCid()); if (headPink.getPeople() <= memberList.size() + virtual) {
Integer virtual = storeCombination.getVirtualRation();// 虚拟成团比例 // 可以虚拟成团
int a = (memberList.size() + 1) * 100; memberList.forEach(i -> i.setStatus(2).setIs_virtual(true));
int b = storeCombination.getPeople() * virtual; pinkSuccessList.addAll(memberList);
if (a >= b) {// 可以虚拟成团 continue;
headPink.setStatus(2).setIs_virtual(true);
memberList.forEach(i -> i.setStatus(2).setIs_virtual(true));
pinkSuccessList.add(headPink);
pinkSuccessList.addAll(memberList);
continue;
}
} }
// 失败 // 失败
headPink.setStatus(3); headPink.setStatus(3);
@@ -266,18 +268,61 @@ public class StorePinkServiceImpl extends ServiceImpl<StorePinkDao, StorePink> i
pinkSuccessList.forEach(i -> { pinkSuccessList.forEach(i -> {
StoreOrder storeOrder = storeOrderService.getByOderId(i.getOrderId()); StoreOrder storeOrder = storeOrderService.getByOderId(i.getOrderId());
StoreCombination storeCombination = storeCombinationService.getById(i.getCid()); StoreCombination storeCombination = storeCombinationService.getById(i.getCid());
User tempUser = userService.getById(i.getUid());
// 发送微信模板消息 // 发送微信模板消息
HashMap<String, String> map = new HashMap<>(); MyRecord record = new MyRecord();
map.put(Constants.WE_CHAT_TEMP_KEY_FIRST, "恭喜您拼团成功!我们将尽快为您发货。"); record.set("orderNo", storeOrder.getOrderId());
map.put("keyword1", storeOrder.getOrderId()); record.set("proName", storeCombination.getTitle());
map.put("keyword2", storeCombination.getTitle()); pushMessageOrder(record, tempUser);
map.put(Constants.WE_CHAT_TEMP_KEY_END, "感谢你的使用!"); // map.put(Constants.WE_CHAT_TEMP_KEY_FIRST, "恭喜您拼团成功!我们将尽快为您发货。");
// map.put("keyword1", storeOrder.getOrderId());
templateMessageService.push(Constants.WE_CHAT_TEMP_KEY_COMBINATION_SUCCESS, map, storeOrder.getUid(), Constants.PAY_TYPE_WE_CHAT_FROM_PUBLIC); // 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<String, String> 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 * @param kid
@@ -299,6 +344,18 @@ public class StorePinkServiceImpl extends ServiceImpl<StorePinkDao, StorePink> i
return updateBatchById(memberList); return updateBatchById(memberList);
} }
/**
* 根据订单编号获取
* @param orderId
* @return
*/
@Override
public StorePink getByOrderId(String orderId) {
LambdaQueryWrapper<StorePink> lqw = new LambdaQueryWrapper<>();
lqw.eq(StorePink::getOrderId, orderId);
return dao.selectOne(lqw);
}
private Integer getCountByKidAndCid(Integer cid, Integer kid) { private Integer getCountByKidAndCid(Integer cid, Integer kid) {
LambdaQueryWrapper<StorePink> lqw = new LambdaQueryWrapper<>(); LambdaQueryWrapper<StorePink> lqw = new LambdaQueryWrapper<>();
lqw.select(StorePink::getId); lqw.select(StorePink::getId);

View File

@@ -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;
/**
* <p>
* 快递公司表
* </p>
*
* @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;
}

View File

@@ -1,5 +1,6 @@
package com.zbkj.crmeb.express.service.impl; package com.zbkj.crmeb.express.service.impl;
import cn.hutool.core.collection.CollUtil;
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.common.PageParamRequest; import com.common.PageParamRequest;
import com.exception.CrmebException; import com.exception.CrmebException;
@@ -140,7 +141,7 @@ public class ShippingTemplatesServiceImpl extends ServiceImpl<ShippingTemplatesD
shippingTemplatesRegionService.saveAll(shippingTemplatesRegionRequestList, request.getType(), shippingTemplates.getId()); shippingTemplatesRegionService.saveAll(shippingTemplatesRegionRequestList, request.getType(), shippingTemplates.getId());
List<ShippingTemplatesFreeRequest> shippingTemplatesFreeRequestList = request.getShippingTemplatesFreeRequestList(); List<ShippingTemplatesFreeRequest> shippingTemplatesFreeRequestList = request.getShippingTemplatesFreeRequestList();
if(shippingTemplatesFreeRequestList.size() > 0 && request.getAppoint()){ if(CollUtil.isNotEmpty(shippingTemplatesFreeRequestList) && request.getAppoint()){
shippingTemplatesFreeService.saveAll(shippingTemplatesFreeRequestList, request.getType(), shippingTemplates.getId()); shippingTemplatesFreeService.saveAll(shippingTemplatesFreeRequestList, request.getType(), shippingTemplates.getId());
} }

View File

@@ -3,18 +3,14 @@ package com.zbkj.crmeb.finance.controller;
import com.common.CommonPage; import com.common.CommonPage;
import com.common.CommonResult; import com.common.CommonResult;
import com.common.PageParamRequest; import com.common.PageParamRequest;
import com.github.pagehelper.PageInfo;
import com.zbkj.crmeb.finance.model.UserFundsMonitor; 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.request.FundsMonitorUserSearchRequest;
import com.zbkj.crmeb.finance.service.UserFundsMonitorService; import com.zbkj.crmeb.finance.service.UserFundsMonitorService;
import com.zbkj.crmeb.user.model.User; import com.zbkj.crmeb.user.model.UserBrokerageRecord;
import com.zbkj.crmeb.user.model.UserBill;
import com.zbkj.crmeb.user.request.UserBillDetailListRequest;
import com.zbkj.crmeb.user.response.BillType; import com.zbkj.crmeb.user.response.BillType;
import com.zbkj.crmeb.user.response.UserBillResponse; import com.zbkj.crmeb.user.response.UserBillResponse;
import com.zbkj.crmeb.user.service.UserBillService; import com.zbkj.crmeb.user.service.UserBillService;
import com.zbkj.crmeb.user.service.UserService;
import io.swagger.annotations.Api; import io.swagger.annotations.Api;
import io.swagger.annotations.ApiOperation; import io.swagger.annotations.ApiOperation;
import lombok.extern.slf4j.Slf4j; import lombok.extern.slf4j.Slf4j;
@@ -59,8 +55,8 @@ public class FundsMonitorController {
*/ */
@ApiOperation(value = "资金监控") @ApiOperation(value = "资金监控")
@RequestMapping(value = "/list", method = RequestMethod.GET) @RequestMapping(value = "/list", method = RequestMethod.GET)
public CommonResult<CommonPage<UserBillResponse>> getList(@Validated FundsMonitorSearchRequest request, @Validated PageParamRequest pageParamRequest){ public CommonResult<CommonPage<UserBillResponse>> getList(@Validated FundsMonitorRequest request, @Validated PageParamRequest pageParamRequest){
CommonPage<UserBillResponse> userExtractCommonPage = CommonPage.restPage(userBillService.getListAdmin(request, pageParamRequest)); CommonPage<UserBillResponse> userExtractCommonPage = CommonPage.restPage(userBillService.fundMonitoring(request, pageParamRequest));
return CommonResult.success(userExtractCommonPage); return CommonResult.success(userExtractCommonPage);
} }
@@ -75,7 +71,7 @@ public class FundsMonitorController {
} }
/** /**
* 分页显示资金监控 * 佣金记录
* @param request 搜索条件 * @param request 搜索条件
* @param pageParamRequest 分页参数 * @param pageParamRequest 分页参数
* @author Mr.Zhang * @author Mr.Zhang
@@ -91,18 +87,17 @@ public class FundsMonitorController {
/** /**
* 佣金详细记录 * 佣金详细记录
* @param request 查询基本参数
* @param pageParamRequest 分页参数 * @param pageParamRequest 分页参数
* @param userId 被查询的用户id * @param userId 被查询的用户id
* @return 佣金查询结果 * @return 佣金查询结果
*/ */
@ApiOperation(value = "佣金详细记录") @ApiOperation(value = "佣金详细记录")
@RequestMapping(value = "/list/user/detail/{userId}", method = RequestMethod.GET) @RequestMapping(value = "/list/user/detail/{userId}", method = RequestMethod.GET)
public CommonResult<CommonPage<UserBillResponse>> userDetail(UserBillDetailListRequest request, public CommonResult<CommonPage<UserBrokerageRecord>> userDetail(PageParamRequest pageParamRequest,
PageParamRequest pageParamRequest, @RequestParam(value = "dateLimit", required = false) String dateLimit,
@PathVariable Integer userId){ @PathVariable Integer userId){
CommonPage<UserBillResponse> ub = CommonPage.restPage(userBillService.getByBaseSearch(userId, request, pageParamRequest)); CommonPage<UserBrokerageRecord> commonPage = CommonPage.restPage(userFundsMonitorService.getFundsMonitorDetail(userId, dateLimit, pageParamRequest));
return CommonResult.success(ub); return CommonResult.success(commonPage);
} }

View File

@@ -39,7 +39,6 @@ import org.springframework.web.bind.annotation.RestController;
@RestController @RestController
@RequestMapping("api/admin/finance/apply") @RequestMapping("api/admin/finance/apply")
@Api(tags = "财务 -- 提现申请") @Api(tags = "财务 -- 提现申请")
public class UserExtractController { public class UserExtractController {
@Autowired @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/ * @Param dateLimit 时间限制 today,yesterday,lately7,lately30,month,year,/yyyy-MM-dd hh:mm:ss,yyyy-MM-dd hh:mm:ss/
* @author Mr.Zhang * @author Mr.Zhang
* @since 2020-05-11 * @since 2020-05-11
*/ */
@ApiOperation(value = "提现总金额") @ApiOperation(value = "提现统计")
@RequestMapping(value = "/balance", method = RequestMethod.POST) @RequestMapping(value = "/balance", method = RequestMethod.POST)
public CommonResult<BalanceResponse> balance( public CommonResult<BalanceResponse> balance(
@RequestParam(value = "dateLimit", required = false, @RequestParam(value = "dateLimit", required = false,defaultValue = "")
defaultValue = "")
String dateLimit){ String dateLimit){
String startTime = null; return CommonResult.success(userExtractService.getBalance(dateLimit));
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));
} }
/** /**

View File

@@ -51,6 +51,7 @@ public class UserRechargeController {
@ApiOperation(value = "分页列表") @ApiOperation(value = "分页列表")
@RequestMapping(value = "/list", method = RequestMethod.GET) @RequestMapping(value = "/list", method = RequestMethod.GET)
public CommonResult<CommonPage<UserRechargeResponse>> getList(@Validated UserRechargeSearchRequest request, @Validated PageParamRequest pageParamRequest){ public CommonResult<CommonPage<UserRechargeResponse>> getList(@Validated UserRechargeSearchRequest request, @Validated PageParamRequest pageParamRequest){
request.setPaid(true);
CommonPage<UserRechargeResponse> userRechargeCommonPage = CommonPage.restPage(userRechargeService.getList(request, pageParamRequest)); CommonPage<UserRechargeResponse> userRechargeCommonPage = CommonPage.restPage(userRechargeService.getList(request, pageParamRequest));
return CommonResult.success(userRechargeCommonPage); return CommonResult.success(userRechargeCommonPage);
} }

View File

@@ -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 <admin@crmeb.com>
* +----------------------------------------------------------------------
*/
@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;
}

View File

@@ -38,7 +38,7 @@ public class UserExtractRequest implements Serializable {
private String realName; private String realName;
@ApiModelProperty(value = "提现方式| alipay=支付宝,bank=银行卡,weixin=微信", allowableValues = "range[alipay,weixin,bank]") @ApiModelProperty(value = "提现方式| alipay=支付宝,bank=银行卡,weixin=微信", allowableValues = "range[alipay,weixin,bank]")
@NotBlank(message = "请选择提现方式, 支付宝|微信|银行卡") @NotBlank(message = "请选择提现方式, 支付宝|微信|银行卡")
private String extractType; private String extractType;
@ApiModelProperty(value = "银行卡") @ApiModelProperty(value = "银行卡")

View File

@@ -31,11 +31,8 @@ public interface UserExtractService extends IService<UserExtract> {
/** /**
* 提现总金额 * 提现总金额
* @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<UserExtract> {
* @param backMessage 驳回原因 * @param backMessage 驳回原因
* @return 审核结果 * @return 审核结果
*/ */
boolean updateStatus(Integer id,Integer status,String backMessage); Boolean updateStatus(Integer id,Integer status,String backMessage);
PageInfo<UserExtractRecordResponse> getExtractRecord(Integer userId, PageParamRequest pageParamRequest); PageInfo<UserExtractRecordResponse> getExtractRecord(Integer userId, PageParamRequest pageParamRequest);
BigDecimal getExtractTotalMoney(Integer userId); BigDecimal getExtractTotalMoney(Integer userId);
/**
* 提现申请
* @return
*/
Boolean extractApply(UserExtractRequest request);
} }

View File

@@ -2,9 +2,10 @@ package com.zbkj.crmeb.finance.service;
import com.baomidou.mybatisplus.extension.service.IService; import com.baomidou.mybatisplus.extension.service.IService;
import com.common.PageParamRequest; import com.common.PageParamRequest;
import com.github.pagehelper.PageInfo;
import com.zbkj.crmeb.finance.model.UserFundsMonitor; 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.finance.request.FundsMonitorUserSearchRequest;
import com.zbkj.crmeb.user.model.UserBrokerageRecord;
import java.util.List; import java.util.List;
@@ -29,4 +30,13 @@ public interface UserFundsMonitorService extends IService<UserFundsMonitor> {
* @return List<User> * @return List<User>
*/ */
List<UserFundsMonitor> getFundsMonitor(FundsMonitorUserSearchRequest request, PageParamRequest pageParamRequest); List<UserFundsMonitor> getFundsMonitor(FundsMonitorUserSearchRequest request, PageParamRequest pageParamRequest);
/**
* 佣金详细记录
* @param uid 用户uid
* @param dateLimit 时间参数
* @param pageParamRequest 分页参数
* @return
*/
PageInfo<UserBrokerageRecord> getFundsMonitorDetail(Integer uid, String dateLimit, PageParamRequest pageParamRequest);
} }

View File

@@ -2,6 +2,7 @@ package com.zbkj.crmeb.finance.service.impl;
import cn.hutool.core.collection.CollUtil; import cn.hutool.core.collection.CollUtil;
import cn.hutool.core.collection.CollectionUtil; import cn.hutool.core.collection.CollectionUtil;
import cn.hutool.core.util.ObjectUtil;
import cn.hutool.core.util.StrUtil; import cn.hutool.core.util.StrUtil;
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; 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.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import com.common.CommonPage; import com.common.CommonPage;
import com.common.PageParamRequest; import com.common.PageParamRequest;
import com.constants.BrokerageRecordConstants;
import com.constants.Constants; import com.constants.Constants;
import com.exception.CrmebException; import com.exception.CrmebException;
import com.github.pagehelper.Page; 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.SystemAttachmentService;
import com.zbkj.crmeb.system.service.SystemConfigService; import com.zbkj.crmeb.system.service.SystemConfigService;
import com.zbkj.crmeb.user.model.User; 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.UserBillService;
import com.zbkj.crmeb.user.service.UserBrokerageRecordService;
import com.zbkj.crmeb.user.service.UserService; import com.zbkj.crmeb.user.service.UserService;
import com.zbkj.crmeb.wechat.service.impl.WechatSendMessageForMinService; import com.zbkj.crmeb.wechat.service.impl.WechatSendMessageForMinService;
import com.zbkj.crmeb.wechat.vo.WechatSendMessageForCash; 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.BeanUtils;
import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service; import org.springframework.stereotype.Service;
import org.springframework.transaction.support.TransactionTemplate;
import javax.annotation.Resource; import javax.annotation.Resource;
import java.math.BigDecimal; import java.math.BigDecimal;
@@ -79,6 +84,12 @@ public class UserExtractServiceImpl extends ServiceImpl<UserExtractDao, UserExtr
@Autowired @Autowired
private SystemAttachmentService systemAttachmentService; private SystemAttachmentService systemAttachmentService;
@Autowired
private TransactionTemplate transactionTemplate;
@Autowired
private UserBrokerageRecordService userBrokerageRecordService;
/** /**
* 列表 * 列表
@@ -138,9 +149,6 @@ public class UserExtractServiceImpl extends ServiceImpl<UserExtractDao, UserExtr
/** /**
* 提现总金额 * 提现总金额
* @author Mr.Zhang
* @since 2020-05-11
* @return BalanceResponse
* 总佣金 = 已提现佣金 + 未提现佣金 * 总佣金 = 已提现佣金 + 未提现佣金
* 已提现佣金 = 用户成功提现的金额 * 已提现佣金 = 用户成功提现的金额
* 未提现佣金 = 用户未提现的佣金 = 可提现佣金 + 冻结佣金 = 用户佣金 * 未提现佣金 = 用户未提现的佣金 = 可提现佣金 + 冻结佣金 = 用户佣金
@@ -150,28 +158,26 @@ public class UserExtractServiceImpl extends ServiceImpl<UserExtractDao, UserExtr
* 退回佣金 = 因退款导致的冻结佣金退回 * 退回佣金 = 因退款导致的冻结佣金退回
*/ */
@Override @Override
public BalanceResponse getBalance(String startTime,String endTime) { public BalanceResponse getBalance(String dateLimit) {
// BigDecimal withdrawn = getWithdrawn(startTime,endTime);//已提现 String startTime = "";
// BigDecimal unDrawn = getUnDrawn(startTime,endTime);//审核中现 String endTime = "";
//// BigDecimal commissionTotal = user.getBrokeragePrice();//佣金总金额 if(StringUtils.isNotBlank(dateLimit)){
// BigDecimal commissionTotal = userBillService.getSumBrokerage();//佣金总金额 dateLimitUtilVo dateRage = DateUtil.getDateLimit(dateLimit);
// BigDecimal toBeWithdrawn = getWaiteForDrawn(startTime,endTime); //待提现 startTime = dateRage.getStartTime();
endTime = dateRage.getEndTime();
BigDecimal withdrawn = getWithdrawn(startTime,endTime);//已提现
BigDecimal toBeWithdrawn = getWithdrawning(startTime,endTime); //待提现(审核中)
// BigDecimal unDrawn = userService.getUnCommissionPrice();//未提现
//未提现佣金 = (单位时间内) 增加的佣金 - 消耗的佣金(佣金转余额) - 待提现的佣金 - 已提现金额 (可能会产生负值)
String date = null;
if (StrUtil.isNotBlank(startTime) && StrUtil.isNotBlank(endTime)) {
date = startTime.concat(",").concat(endTime);
} }
BigDecimal addSum = userBillService.getSumBigDecimal(1, null, Constants.USER_BILL_CATEGORY_BROKERAGE_PRICE, date, null);
BigDecimal subSum = userBillService.getSumBigDecimal(0, null, Constants.USER_BILL_CATEGORY_BROKERAGE_PRICE, date, null);
BigDecimal unDrawn = addSum.subtract(subSum).subtract(toBeWithdrawn).subtract(withdrawn);
//佣金总金额 = 已提现 + 待提现 + 未提现 //提现
BigDecimal commissionTotal = withdrawn.add(toBeWithdrawn).add(unDrawn);//佣金总金额 BigDecimal withdrawn = getWithdrawn(startTime, endTime);
// 待提现(审核中)
BigDecimal toBeWithdrawn = getWithdrawning(startTime, endTime);
// 佣金总金额(单位时间)
BigDecimal commissionTotal = userBrokerageRecordService.getTotalSpreadPriceBydateLimit(dateLimit);
// 单位时间消耗的佣金
BigDecimal subWithdarw = userBrokerageRecordService.getSubSpreadPriceByDateLimit(dateLimit);
// 未提现
BigDecimal unDrawn = commissionTotal.subtract(subWithdarw);
return new BalanceResponse(withdrawn, unDrawn, commissionTotal, toBeWithdrawn); return new BalanceResponse(withdrawn, unDrawn, commissionTotal, toBeWithdrawn);
} }
@@ -183,8 +189,8 @@ public class UserExtractServiceImpl extends ServiceImpl<UserExtractDao, UserExtr
* @return BalanceResponse * @return BalanceResponse
*/ */
@Override @Override
public BigDecimal getWithdrawn(String startTime,String endTime) { public BigDecimal getWithdrawn(String startTime, String endTime) {
return getSum(null,1,startTime,endTime); return getSum(null, 1, startTime, endTime);
} }
/** /**
@@ -195,7 +201,7 @@ public class UserExtractServiceImpl extends ServiceImpl<UserExtractDao, UserExtr
*/ */
@Override @Override
public BigDecimal getWithdrawning(String startTime, String endTime) { public BigDecimal getWithdrawning(String startTime, String endTime) {
return getSum(null, 0,startTime,endTime); return getSum(null, 0, startTime, endTime);
} }
/** /**
@@ -325,24 +331,22 @@ public class UserExtractServiceImpl extends ServiceImpl<UserExtractDao, UserExtr
/** /**
* 根据状态获取总额 * 根据状态获取总额
* @author Mr.Zhang
* @since 2020-05-11 edite by stivepeim 2020-09-29
* @return BigDecimal * @return BigDecimal
*/ */
private BigDecimal getSum(Integer userId, int status, String startTime, String endTime) { private BigDecimal getSum(Integer userId, int status, String startTime, String endTime) {
LambdaQueryWrapper<UserExtract> lqw = Wrappers.lambdaQuery(); LambdaQueryWrapper<UserExtract> lqw = Wrappers.lambdaQuery();
if(null != userId) lqw.eq(UserExtract::getUid,userId); if(null != userId) {
lqw.eq(UserExtract::getUid,userId);
}
lqw.eq(UserExtract::getStatus,status); lqw.eq(UserExtract::getStatus,status);
if(StringUtils.isNotBlank(startTime) && StringUtils.isNotBlank(endTime)){ if(StringUtils.isNotBlank(startTime) && StringUtils.isNotBlank(endTime)){
lqw.between(UserExtract::getCreateTime,startTime,endTime); lqw.between(UserExtract::getCreateTime, startTime, endTime);
} }
List<UserExtract> userExtracts = dao.selectList(lqw); List<UserExtract> userExtracts = dao.selectList(lqw);
// double sum = 0;
BigDecimal sum = ZERO; 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().map(UserExtract::getExtractPrice).reduce(ZERO, BigDecimal::add);
} }
// sum = userExtracts.stream().mapToDouble(e -> e.getExtractPrice().doubleValue()).sum();
return sum; return sum;
} }
@@ -393,18 +397,66 @@ public class UserExtractServiceImpl extends ServiceImpl<UserExtractDao, UserExtr
* @return 审核结果 * @return 审核结果
*/ */
@Override @Override
public boolean updateStatus(Integer id, Integer status, String backMessage) { public Boolean updateStatus(Integer id, Integer status, String backMessage) {
if(status == -1 && StringUtils.isBlank(backMessage)) if(status == -1 && StringUtils.isBlank(backMessage))
throw new CrmebException("驳回时请填写驳回原因"); throw new CrmebException("驳回时请填写驳回原因");
UserExtract ue = new UserExtract().setId(id).setStatus(status).setFailMsg(backMessage); UserExtract userExtract = getById(id);
if (status == -1) {//未通过时恢复用户总金额 if (ObjectUtil.isNull(userExtract)) {
UserExtract userExtract = getById(id); throw new CrmebException("提现申请记录不存在");
User user = userService.getById(userExtract.getUid());
userService.upadteBrokeragePrice(user, user.getBrokeragePrice().add(userExtract.getExtractPrice()));
} }
//TODO 审核申请通过已提现是否添加user_bill用户账单表记录 if (userExtract.getStatus() != 0) {
return dao.updateById(ue) > 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<UserExtractDao, UserExtr
} }
private List<UserExtract> getListByMonth(Integer userId, String date) { private List<UserExtract> getListByMonth(Integer userId, String date) {
LambdaQueryWrapper<UserExtract> lambdaQueryWrapper = new LambdaQueryWrapper<>(); QueryWrapper<UserExtract> queryWrapper = new QueryWrapper<>();
lambdaQueryWrapper.eq(UserExtract::getUid, userId); queryWrapper.eq("uid", userId);
// lambdaQueryWrapper.in(UserExtract::getStatus, -1, 1); queryWrapper.apply(StrUtil.format(" left(create_time, 7) = '{}'", date));
lambdaQueryWrapper.orderByDesc(UserExtract::getCreateTime, UserExtract::getId); queryWrapper.orderByDesc("create_time");
return dao.selectList(lambdaQueryWrapper); return dao.selectList(queryWrapper);
} }
/** /**
@@ -450,5 +502,68 @@ public class UserExtractServiceImpl extends ServiceImpl<UserExtractDao, UserExtr
public BigDecimal getExtractTotalMoney(Integer userId){ public BigDecimal getExtractTotalMoney(Integer userId){
return getSum(userId, 1, null, null); return getSum(userId, 1, null, null);
} }
/**
* 提现申请
* @return
*/
@Override
public Boolean extractApply(UserExtractRequest request) {
//添加判断,提现金额不能后台配置金额
String value = systemConfigService.getValueByKeyException(Constants.CONFIG_EXTRACT_MIN_PRICE);
BigDecimal ten = new BigDecimal(value);
if (request.getExtractPrice().compareTo(ten) < 0) {
throw new CrmebException(StrUtil.format("最低提现金额{}元", ten));
}
User user = userService.getInfo();
if (ObjectUtil.isNull(user)) {
throw new CrmebException("提现用户信息异常");
}
BigDecimal money = user.getBrokeragePrice();//可提现总金额
if(money.compareTo(ZERO) < 1){
throw new CrmebException("您当前没有金额可以提现");
}
if(money.compareTo(request.getExtractPrice()) < 0){
throw new CrmebException("你当前最多可提现 " + money + "");
}
UserExtract userExtract = new UserExtract();
BeanUtils.copyProperties(request, userExtract);
userExtract.setUid(user.getUid());
userExtract.setBalance(money.subtract(request.getExtractPrice()));
//存入银行名称
if (StrUtil.isNotBlank(userExtract.getQrcodeUrl())) {
userExtract.setQrcodeUrl(systemAttachmentService.clearPrefix(userExtract.getQrcodeUrl()));
}
// 添加佣金记录
UserBrokerageRecord brokerageRecord = new UserBrokerageRecord();
brokerageRecord.setUid(user.getUid());
brokerageRecord.setLinkType(BrokerageRecordConstants.BROKERAGE_RECORD_LINK_TYPE_WITHDRAW);
brokerageRecord.setType(BrokerageRecordConstants.BROKERAGE_RECORD_TYPE_SUB);
brokerageRecord.setTitle(BrokerageRecordConstants.BROKERAGE_RECORD_TITLE_WITHDRAW_APPLY);
brokerageRecord.setPrice(userExtract.getExtractPrice());
brokerageRecord.setBalance(money.subtract(userExtract.getExtractPrice()));
brokerageRecord.setMark(StrUtil.format("提现申请扣除佣金{}", userExtract.getExtractPrice()));
brokerageRecord.setStatus(BrokerageRecordConstants.BROKERAGE_RECORD_STATUS_WITHDRAW);
brokerageRecord.setCreateTime(DateUtil.nowDateTime());
Boolean execute = transactionTemplate.execute(e -> {
// 保存提现记录
save(userExtract);
// 修改用户佣金
userService.operationBrokerage(user.getUid(), userExtract.getExtractPrice(), money, "sub");
// 添加佣金记录
brokerageRecord.setLinkId(userExtract.getId().toString());
userBrokerageRecordService.save(brokerageRecord);
return Boolean.TRUE;
});
//todo 提现申请通知
return execute;
}
} }

View File

@@ -1,18 +1,15 @@
package com.zbkj.crmeb.finance.service.impl; 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.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import com.common.PageParamRequest; import com.common.PageParamRequest;
import com.github.pagehelper.PageHelper; import com.github.pagehelper.PageHelper;
import com.github.pagehelper.PageInfo;
import com.zbkj.crmeb.finance.dao.UserFundsMonitorDao; import com.zbkj.crmeb.finance.dao.UserFundsMonitorDao;
import com.zbkj.crmeb.finance.model.UserFundsMonitor; import com.zbkj.crmeb.finance.model.UserFundsMonitor;
import com.zbkj.crmeb.finance.request.FundsMonitorUserSearchRequest; import com.zbkj.crmeb.finance.request.FundsMonitorUserSearchRequest;
import com.zbkj.crmeb.finance.service.UserFundsMonitorService; import com.zbkj.crmeb.finance.service.UserFundsMonitorService;
import com.zbkj.crmeb.user.model.User; import com.zbkj.crmeb.user.model.UserBrokerageRecord;
import com.zbkj.crmeb.user.model.UserBill; import com.zbkj.crmeb.user.service.UserBrokerageRecordService;
import com.zbkj.crmeb.user.service.UserService;
import com.zbkj.crmeb.user.service.impl.UserServiceImpl;
import org.apache.commons.lang3.StringUtils; import org.apache.commons.lang3.StringUtils;
import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service; import org.springframework.stereotype.Service;
@@ -20,8 +17,6 @@ import org.springframework.stereotype.Service;
import javax.annotation.Resource; import javax.annotation.Resource;
import java.util.HashMap; import java.util.HashMap;
import java.util.List; import java.util.List;
import java.util.Optional;
import java.util.stream.Collectors;
/** /**
* UserRechargeServiceImpl 接口实现 * UserRechargeServiceImpl 接口实现
@@ -42,7 +37,7 @@ public class UserFundsMonitorServiceImpl extends ServiceImpl<UserFundsMonitorDao
private UserFundsMonitorDao dao; private UserFundsMonitorDao dao;
@Autowired @Autowired
private UserService userService; private UserBrokerageRecordService userBrokerageRecordService;
/** /**
* 佣金列表 * 佣金列表
@@ -67,22 +62,32 @@ public class UserFundsMonitorServiceImpl extends ServiceImpl<UserFundsMonitorDao
} }
map.put("sort", sort); map.put("sort", sort);
List<UserFundsMonitor> monitorList = dao.getFundsMonitor(map); List<UserFundsMonitor> monitorList = dao.getFundsMonitor(map);
List<Integer> spreadUidList = monitorList.stream().map(UserFundsMonitor::getSpreadUid).distinct().collect(Collectors.toList()); // if (CollUtil.isEmpty(monitorList)) {
if (CollUtil.isEmpty(spreadUidList)) { // return monitorList;
return monitorList; // }
} // List<Integer> spreadUidList = monitorList.stream().map(UserFundsMonitor::getSpreadUid).distinct().collect(Collectors.toList());
HashMap<Integer, User> mapListInUid = userService.getMapListInUid(spreadUidList); // HashMap<Integer, User> mapListInUid = userService.getMapListInUid(spreadUidList);
for (UserFundsMonitor temp: monitorList) { // for (UserFundsMonitor temp: monitorList) {
if (ObjectUtil.isNotNull(temp.getSpreadUid())) { // if (ObjectUtil.isNotNull(temp.getSpreadUid())) {
User user = mapListInUid.get(temp.getSpreadUid()); // User user = mapListInUid.get(temp.getSpreadUid());
if (ObjectUtil.isNotNull(user)) { // if (ObjectUtil.isNotNull(user)) {
temp.setSpreadName(Optional.ofNullable(user.getNickname()).orElse("")); // temp.setSpreadName(Optional.ofNullable(user.getNickname()).orElse(""));
} // }
} // }
} // }
return monitorList; return monitorList;
} }
/**
* 佣金详细记录
* @param uid 用户uid
* @param pageParamRequest 分页参数
* @return
*/
@Override
public PageInfo<UserBrokerageRecord> getFundsMonitorDetail(Integer uid, String dateLimit, PageParamRequest pageParamRequest) {
return userBrokerageRecordService.getFundsMonitorDetail(uid, dateLimit, pageParamRequest);
}
} }

View File

@@ -261,9 +261,11 @@ public class UserRechargeServiceImpl extends ServiceImpl<UserRechargeDao, UserRe
if (ObjectUtil.isNull(user)) throw new CrmebException("用户不存在!"); if (ObjectUtil.isNull(user)) throw new CrmebException("用户不存在!");
// 退款金额 // 退款金额
BigDecimal refundPrice = userRecharge.getPrice(); BigDecimal refundPrice;
if (request.getType().equals(2)) {// 本金+赠送 if (request.getType().equals(2)) {// 本金+赠送
refundPrice = userRecharge.getPrice().add(userRecharge.getGivePrice()); refundPrice = userRecharge.getPrice().add(userRecharge.getGivePrice());
} else {
refundPrice = userRecharge.getPrice();
} }
// 判断充值方式进行退款 // 判断充值方式进行退款
@@ -286,7 +288,8 @@ public class UserRechargeServiceImpl extends ServiceImpl<UserRechargeDao, UserRe
Boolean execute = transactionTemplate.execute(e -> { Boolean execute = transactionTemplate.execute(e -> {
updateById(userRecharge); updateById(userRecharge);
userService.updateById(user); userService.operationNowMoney(user.getUid(), refundPrice, user.getNowMoney(), "sub");
// userService.updateById(user);
userBillService.save(userBill); userBillService.save(userBill);
return Boolean.TRUE; return Boolean.TRUE;
}); });
@@ -301,9 +304,9 @@ public class UserRechargeServiceImpl extends ServiceImpl<UserRechargeDao, UserRe
userBill.setUid(userRecharge.getUid()); userBill.setUid(userRecharge.getUid());
userBill.setLinkId(userRecharge.getOrderId()); userBill.setLinkId(userRecharge.getOrderId());
userBill.setPm(0); userBill.setPm(0);
userBill.setTitle("系统退款"); userBill.setTitle("系统充值退款");
userBill.setCategory("now_money"); userBill.setCategory(Constants.USER_BILL_CATEGORY_MONEY);
userBill.setType("user_recharge_refund"); userBill.setType(Constants.USER_BILL_TYPE_USER_RECHARGE_REFUND);
userBill.setNumber(refundPrice); userBill.setNumber(refundPrice);
userBill.setBalance(nowMoney.subtract(refundPrice)); userBill.setBalance(nowMoney.subtract(refundPrice));
userBill.setMark(StrUtil.format("退款给用户{}元", userRecharge.getPrice())); userBill.setMark(StrUtil.format("退款给用户{}元", userRecharge.getPrice()));
@@ -327,7 +330,7 @@ public class UserRechargeServiceImpl extends ServiceImpl<UserRechargeDao, UserRe
wxRefundVo.setOut_refund_no(userRecharge.getOrderId()); wxRefundVo.setOut_refund_no(userRecharge.getOrderId());
wxRefundVo.setTotal_fee(userRecharge.getPrice().multiply(BigDecimal.TEN).multiply(BigDecimal.TEN).intValue()); wxRefundVo.setTotal_fee(userRecharge.getPrice().multiply(BigDecimal.TEN).multiply(BigDecimal.TEN).intValue());
wxRefundVo.setRefund_fee(userRecharge.getPrice().multiply(BigDecimal.TEN).multiply(BigDecimal.TEN).intValue()); wxRefundVo.setRefund_fee(userRecharge.getPrice().multiply(BigDecimal.TEN).multiply(BigDecimal.TEN).intValue());
String signKey = systemConfigService.getValueByKey(Constants.CONFIG_KEY_PAY_WE_CHAT_APP_KEY); String signKey = systemConfigService.getValueByKey(Constants.CONFIG_KEY_PAY_ROUTINE_APP_KEY);
String sign = CrmebUtil.getSign(CrmebUtil.objectToMap(wxRefundVo), signKey); String sign = CrmebUtil.getSign(CrmebUtil.objectToMap(wxRefundVo), signKey);
wxRefundVo.setSign(sign); wxRefundVo.setSign(sign);
String path = systemConfigService.getValueByKeyException("pay_mini_client_p12"); String path = systemConfigService.getValueByKeyException("pay_mini_client_p12");

View File

@@ -59,9 +59,8 @@ public class CartController {
@RequestMapping(value = "/list", method = RequestMethod.GET) @RequestMapping(value = "/list", method = RequestMethod.GET)
public CommonResult<CommonPage<StoreCartResponse>> getList(@RequestParam Boolean isValid, @Validated PageParamRequest pageParamRequest){ public CommonResult<CommonPage<StoreCartResponse>> getList(@RequestParam Boolean isValid, @Validated PageParamRequest pageParamRequest){
StoreCart storeCart = new StoreCart(); StoreCart storeCart = new StoreCart();
storeCart.setUid(userService.getUserIdException());
CommonPage<StoreCartResponse> storeCartCommonPage = CommonPage<StoreCartResponse> storeCartCommonPage =
CommonPage.restPage(storeCartService.getList(pageParamRequest, storeCart, isValid)); CommonPage.restPage(storeCartService.getList(pageParamRequest, isValid));
return CommonResult.success(storeCartCommonPage); return CommonResult.success(storeCartCommonPage);
} }

View File

@@ -9,6 +9,7 @@ import com.zbkj.crmeb.front.request.LoginMobileRequest;
import com.zbkj.crmeb.front.request.LoginRequest; import com.zbkj.crmeb.front.request.LoginRequest;
import com.zbkj.crmeb.front.request.RegisterRequest; import com.zbkj.crmeb.front.request.RegisterRequest;
import com.zbkj.crmeb.front.response.LoginResponse; 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.sms.service.SmsService;
import com.zbkj.crmeb.user.service.UserService; import com.zbkj.crmeb.user.service.UserService;
import io.swagger.annotations.Api; import io.swagger.annotations.Api;
@@ -49,6 +50,9 @@ public class LoginController {
@Autowired @Autowired
private SmsService smsService; private SmsService smsService;
@Autowired
private LoginService loginService;
/** /**
* 手机号登录接口 * 手机号登录接口
@@ -59,9 +63,7 @@ public class LoginController {
@RequestMapping(value = "/login/mobile", method = RequestMethod.POST) @RequestMapping(value = "/login/mobile", method = RequestMethod.POST)
public CommonResult<LoginResponse> phoneLogin(@RequestBody @Validated LoginMobileRequest loginRequest, HttpServletRequest request) throws Exception { public CommonResult<LoginResponse> phoneLogin(@RequestBody @Validated LoginMobileRequest loginRequest, HttpServletRequest request) throws Exception {
String clientIp = CrmebUtil.getClientIp(request); String clientIp = CrmebUtil.getClientIp(request);
RegisterRequest registerRequest = new RegisterRequest(); return CommonResult.success(loginService.phoneLogin(loginRequest, clientIp));
BeanUtils.copyProperties(loginRequest, registerRequest);
return CommonResult.success(userService.register(registerRequest, clientIp));
} }
/** /**
@@ -72,7 +74,7 @@ public class LoginController {
@ApiOperation(value = "账号密码登录") @ApiOperation(value = "账号密码登录")
@RequestMapping(value = "/login", method = RequestMethod.POST) @RequestMapping(value = "/login", method = RequestMethod.POST)
public CommonResult<LoginResponse> login(@RequestBody @Validated LoginRequest loginRequest) throws Exception { public CommonResult<LoginResponse> 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 手机号码 * @param phone 手机号码
* @return 发送是否成功 * @return 发送是否成功
*/ */
@ApiOperation(value = " 发送短信") @ApiOperation(value = "发送短信登录验证码")
@RequestMapping(value = "/sendCode", method = RequestMethod.POST) @RequestMapping(value = "/sendCode", method = RequestMethod.POST)
@ApiImplicitParams({ @ApiImplicitParams({
@ApiImplicitParam(name="phone", value="手机号码", required = true) @ApiImplicitParam(name="phone", value="手机号码", required = true)
}) })
public CommonResult<Object> sendCode(@RequestParam String phone){ public CommonResult<Object> sendCode(@RequestParam String phone){
ValidateFormUtil.isPhone(phone,"手机号码错误"); ValidateFormUtil.isPhone(phone,"手机号码错误");
if(smsService.pushCodeToList(phone,1, null)){ if(smsService.sendCommonCode(phone)){
return CommonResult.success("发送成功"); return CommonResult.success("发送成功");
}else{ }else{
return CommonResult.failed("发送失败"); return CommonResult.failed("发送失败");

View File

@@ -62,7 +62,7 @@ public class StoreOrderController {
@ApiOperation(value = "生成订单") @ApiOperation(value = "生成订单")
@RequestMapping(value = "/create/{key}", method = RequestMethod.POST) @RequestMapping(value = "/create/{key}", method = RequestMethod.POST)
public CommonResult<Map<String, Object>> createOrder(@PathVariable String key, @Validated @RequestBody OrderCreateRequest orderRequest, HttpServletRequest request){ public CommonResult<Map<String, Object>> 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));
} }
/** /**

View File

@@ -5,7 +5,7 @@ import com.common.CommonPage;
import com.common.CommonResult; import com.common.CommonResult;
import com.common.PageParamRequest; import com.common.PageParamRequest;
import com.constants.Constants; import com.constants.Constants;
import com.exception.CrmebException; import com.github.pagehelper.PageInfo;
import com.zbkj.crmeb.finance.request.UserExtractRequest; import com.zbkj.crmeb.finance.request.UserExtractRequest;
import com.zbkj.crmeb.front.request.PasswordRequest; import com.zbkj.crmeb.front.request.PasswordRequest;
import com.zbkj.crmeb.front.request.UserBindingRequest; 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.ApiImplicitParam;
import io.swagger.annotations.ApiOperation; import io.swagger.annotations.ApiOperation;
import lombok.extern.slf4j.Slf4j; import lombok.extern.slf4j.Slf4j;
import org.apache.commons.lang3.StringUtils;
import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.validation.annotation.Validated; import org.springframework.validation.annotation.Validated;
import org.springframework.web.bind.annotation.*; import org.springframework.web.bind.annotation.*;
@@ -146,16 +145,26 @@ public class UserController {
return CommonResult.success(userCenterService.getCommission()); 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,34]", dataType = "int")
// public CommonResult<CommonPage<UserSpreadCommissionResponse>> 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 = "推广佣金明细") @ApiOperation(value = "推广佣金明细")
@RequestMapping(value = "/spread/commission/{type}", method = RequestMethod.GET) @RequestMapping(value = "/spread/commission/detail", method = RequestMethod.GET)
@ApiImplicitParam(name = "type", value = "类型 佣金类型|0=全部,1=消费,2=充值,3=返佣,4=提现", allowableValues = "range[0,1,2,34]", dataType = "int") public CommonResult<CommonPage<SpreadCommissionDetailResponse>> getSpreadCommissionDetail(@Validated PageParamRequest pageParamRequest){
public CommonResult<CommonPage<UserSpreadCommissionResponse>> getSpreadCommissionByType(@PathVariable int type, @Validated PageParamRequest pageParamRequest){ PageInfo<SpreadCommissionDetailResponse> commissionDetail = userCenterService.getSpreadCommissionDetail(pageParamRequest);
return CommonResult.success(CommonPage.restPage(userCenterService.getSpreadCommissionByType(type, pageParamRequest))); return CommonResult.success(CommonPage.restPage(commissionDetail));
} }
/** /**
@@ -180,36 +189,6 @@ public class UserController {
@ApiOperation(value = "提现申请") @ApiOperation(value = "提现申请")
@RequestMapping(value = "/extract/cash", method = RequestMethod.POST) @RequestMapping(value = "/extract/cash", method = RequestMethod.POST)
public CommonResult<Boolean> extractCash(@RequestBody @Validated UserExtractRequest request){ public CommonResult<Boolean> 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)); return CommonResult.success(userCenterService.extractCash(request));
} }

View File

@@ -57,37 +57,17 @@ public class UserCouponController {
/** /**
* 领券 * 领券
* @param request UserCouponReceiveRequest 新增参数 * @param request UserCouponReceiveRequest 新增参数
* @author Mr.Zhang
* @since 2020-05-18
*/ */
@ApiOperation(value = "领券") @ApiOperation(value = "领券")
@RequestMapping(value = "/receive", method = RequestMethod.POST) @RequestMapping(value = "/receive", method = RequestMethod.POST)
public CommonResult<String> receive(@RequestBody @Validated UserCouponReceiveRequest request){ public CommonResult<String> receive(@RequestBody @Validated UserCouponReceiveRequest request){
StoreCouponUserRequest storeCouponUserRequest = new StoreCouponUserRequest(); if(storeCouponUserService.receiveCoupon(request)){
storeCouponUserRequest.setUid(userService.getUserIdException().toString());
storeCouponUserRequest.setCouponId(request.getCouponId()[0]);
if(storeCouponUserService.receive(storeCouponUserRequest)){
return CommonResult.success(); return CommonResult.success();
}else{ }else{
return CommonResult.failed(); return CommonResult.failed();
} }
} }
/**
* 领券
* @param request UserCouponReceiveRequest 新增参数
* @author Mr.Zhang
* @since 2020-05-18
*/
@ApiOperation(value = "批量领券")
@RequestMapping(value = "/receive/batch", method = RequestMethod.POST)
public CommonResult<String> receiveAll(@RequestBody @Validated UserCouponReceiveRequest request){
if(storeCouponUserService.receiveAll(request, userService.getUserIdException(), "get")){
return CommonResult.success();
}else{
return CommonResult.failed();
}
}
} }

View File

@@ -1,13 +1,17 @@
package com.zbkj.crmeb.front.controller; package com.zbkj.crmeb.front.controller;
import com.common.CommonPage;
import com.common.CommonResult; import com.common.CommonResult;
import com.common.PageParamRequest;
import com.constants.Constants; import com.constants.Constants;
import com.utils.CrmebUtil; import com.utils.CrmebUtil;
import com.zbkj.crmeb.front.request.UserRechargeRequest; 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.response.UserRechargeResponse;
import com.zbkj.crmeb.front.service.UserCenterService; import com.zbkj.crmeb.front.service.UserCenterService;
import io.swagger.annotations.Api; import io.swagger.annotations.Api;
import io.swagger.annotations.ApiImplicitParam;
import io.swagger.annotations.ApiOperation; import io.swagger.annotations.ApiOperation;
import lombok.extern.slf4j.Slf4j; import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Autowired;
@@ -60,11 +64,12 @@ public class UserRechargeController {
@RequestMapping(value = "/routine", method = RequestMethod.POST) @RequestMapping(value = "/routine", method = RequestMethod.POST)
public CommonResult<Map<String, Object>> routineRecharge(HttpServletRequest httpServletRequest, @RequestBody @Validated UserRechargeRequest request){ public CommonResult<Map<String, Object>> routineRecharge(HttpServletRequest httpServletRequest, @RequestBody @Validated UserRechargeRequest request){
request.setFromType(Constants.PAY_TYPE_WE_CHAT_FROM_PROGRAM); 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)); request.setClientIp(CrmebUtil.getClientIp(httpServletRequest));
Map<String, Object> map = new HashMap<>(); Map<String, Object> map = new HashMap<>();
map.put("data", responseVo); map.put("data", recharge);
map.put("type", request.getFromType()); map.put("type", request.getFromType());
return CommonResult.success(map); return CommonResult.success(map);
} }
@@ -73,10 +78,11 @@ public class UserRechargeController {
* 充值 * 充值
* @author Mr.Zhang * @author Mr.Zhang
* @since 2020-05-18 * @since 2020-05-18
* @return
*/ */
@ApiOperation(value = "公众号充值") @ApiOperation(value = "公众号充值")
@RequestMapping(value = "/wechat", method = RequestMethod.POST) @RequestMapping(value = "/wechat", method = RequestMethod.POST)
public CommonResult<UserRechargePaymentResponse> weChatRecharge(HttpServletRequest httpServletRequest, @RequestBody @Validated UserRechargeRequest request){ public CommonResult<OrderPayResultResponse> weChatRecharge(HttpServletRequest httpServletRequest, @RequestBody @Validated UserRechargeRequest request){
request.setClientIp(CrmebUtil.getClientIp(httpServletRequest)); request.setClientIp(CrmebUtil.getClientIp(httpServletRequest));
return CommonResult.success(userCenterService.recharge(request)); return CommonResult.success(userCenterService.recharge(request));
} }
@@ -91,6 +97,17 @@ public class UserRechargeController {
public CommonResult<Boolean> transferIn(@RequestParam(name = "price") BigDecimal price){ public CommonResult<Boolean> transferIn(@RequestParam(name = "price") BigDecimal price){
return CommonResult.success(userCenterService.transferIn(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<CommonPage<UserRechargeBillRecordResponse>> billRecord(@RequestParam(name = "type") String type, @ModelAttribute PageParamRequest pageRequest){
return CommonResult.success(userCenterService.nowMoneyBillRecord(type, pageRequest));
}
} }

View File

@@ -1,13 +1,10 @@
package com.zbkj.crmeb.front.controller; package com.zbkj.crmeb.front.controller;
import com.common.CommonResult; import com.common.CommonResult;
import com.common.PageParamRequest;
import com.zbkj.crmeb.front.response.LoginResponse; import com.zbkj.crmeb.front.response.LoginResponse;
import com.zbkj.crmeb.front.service.UserCenterService; import com.zbkj.crmeb.front.service.UserCenterService;
import com.zbkj.crmeb.user.request.RegisterThirdUserRequest; import com.zbkj.crmeb.user.request.RegisterThirdUserRequest;
import com.zbkj.crmeb.wechat.model.TemplateMessage; 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.TemplateMessageService;
import com.zbkj.crmeb.wechat.service.WeChatService; import com.zbkj.crmeb.wechat.service.WeChatService;
import com.zbkj.crmeb.wechat.service.WechatProgramMyTempService; import com.zbkj.crmeb.wechat.service.WechatProgramMyTempService;
@@ -130,13 +127,12 @@ public class WeChatController {
/** /**
* 订阅消息模板列表 * 订阅消息模板列表
* @author Mr.Zhang
* @since 2020-06-03
*/ */
@ApiOperation(value = "订阅消息模板列表") @ApiOperation(value = "订阅消息模板列表")
@RequestMapping(value = "/program/my/temp/list", method = RequestMethod.POST) @RequestMapping(value = "/program/my/temp/list", method = RequestMethod.GET)
public CommonResult<List<WechatProgramMyTemp>> programMyTempList(@RequestBody @Validated WechatProgramMyTempSearchRequest request, PageParamRequest pageParamRequest){ @ApiImplicitParam(name = "type", value = "支付之前beforePay|支付成功afterPay|申请退款refundApply|充值之前beforeRecharge|创建砍价createBargain|参与拼团pink|取消拼团cancelPink")
return CommonResult.success(wechatProgramMyTempService.getList(request, pageParamRequest)); public CommonResult<List<TemplateMessage>> programMyTempList(@RequestParam(name = "type") String type){
return CommonResult.success(templateMessageService.getMiniTempList(type));
} }
} }

View File

@@ -12,7 +12,7 @@ import javax.validation.constraints.Pattern;
import java.io.Serializable; import java.io.Serializable;
/** /**
* 手机快速登录 * 移动端手机密码登录请求对象
* +---------------------------------------------------------------------- * +----------------------------------------------------------------------
* | CRMEB [ CRMEB赋能开发者助力企业发展 ] * | CRMEB [ CRMEB赋能开发者助力企业发展 ]
* +---------------------------------------------------------------------- * +----------------------------------------------------------------------
@@ -26,7 +26,7 @@ import java.io.Serializable;
@Data @Data
@EqualsAndHashCode(callSuper = false) @EqualsAndHashCode(callSuper = false)
@Accessors(chain = true) @Accessors(chain = true)
@ApiModel(value="LoginRequest对象", description="手机快速登录") @ApiModel(value="LoginRequest对象", description="移动端手机密码登录请求对象")
public class LoginRequest implements Serializable { public class LoginRequest implements Serializable {
private static final long serialVersionUID=1L; private static final long serialVersionUID=1L;

View File

@@ -8,11 +8,12 @@ import lombok.experimental.Accessors;
import javax.validation.constraints.Min; import javax.validation.constraints.Min;
import javax.validation.constraints.NotBlank; import javax.validation.constraints.NotBlank;
import javax.validation.constraints.NotNull;
import javax.validation.constraints.Size; import javax.validation.constraints.Size;
import java.io.Serializable; import java.io.Serializable;
/** /**
* 用户领 * 用户领取优惠券请求对象
* +---------------------------------------------------------------------- * +----------------------------------------------------------------------
* | CRMEB [ CRMEB赋能开发者助力企业发展 ] * | CRMEB [ CRMEB赋能开发者助力企业发展 ]
* +---------------------------------------------------------------------- * +----------------------------------------------------------------------
@@ -26,12 +27,12 @@ import java.io.Serializable;
@Data @Data
@EqualsAndHashCode(callSuper = false) @EqualsAndHashCode(callSuper = false)
@Accessors(chain = true) @Accessors(chain = true)
@ApiModel(value="UserCouponReceiveRequest对象", description="用户领") @ApiModel(value="UserCouponReceiveRequest对象", description="用户领取优惠券请求对象")
public class UserCouponReceiveRequest implements Serializable { public class UserCouponReceiveRequest implements Serializable {
private static final long serialVersionUID=1L; private static final long serialVersionUID=1L;
@ApiModelProperty(value = "优惠券id") @ApiModelProperty(value = "优惠券id")
@Size(min = 1, message = "请选择优惠券") @NotNull(message = "优惠券编号不能为空")
private Integer[] couponId; private Integer couponId;
} }

View File

@@ -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 <admin@crmeb.com>
* +----------------------------------------------------------------------
*/
@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<UserBrokerageRecord> list) {
this.date = date;
this.list = list;
}
@ApiModelProperty(value = "月份")
private String date;
@ApiModelProperty(value = "数据")
private List<UserBrokerageRecord> list;
}

View File

@@ -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 <admin@crmeb.com>
* +----------------------------------------------------------------------
*/
@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<UserBill> list;
}

View File

@@ -24,7 +24,7 @@ import java.math.BigDecimal;
@Data @Data
@EqualsAndHashCode(callSuper = false) @EqualsAndHashCode(callSuper = false)
@Accessors(chain = true) @Accessors(chain = true)
@ApiModel(value="UserSpreadPeopleResponse对象", description="推广人信息") @ApiModel(value="UserSpreadPeopleItemResponse对象", description="推广人信息")
public class UserSpreadPeopleItemResponse implements Serializable { public class UserSpreadPeopleItemResponse implements Serializable {
private static final long serialVersionUID=1L; private static final long serialVersionUID=1L;

View File

@@ -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 <admin@crmeb.com>
* +----------------------------------------------------------------------
*/
public interface LoginService {
/**
* 账号密码登录
* @return LoginResponse
*/
LoginResponse login(LoginRequest loginRequest) throws Exception;
/**
* 手机号验证码登录
*/
LoginResponse phoneLogin(LoginMobileRequest loginRequest, String clientIp) throws Exception;
}

View File

@@ -38,21 +38,13 @@ public interface OrderService {
ConfirmOrderResponse confirmOrder(ConfirmOrderRequest request); ConfirmOrderResponse confirmOrder(ConfirmOrderRequest request);
/**
* 创建订单
* @param request 创建订单参数
* @param key 订单key
* @return payResponse
*/
OrderPayResponse createOrder(OrderCreateRequest request, String key, String ip);
/** /**
* 创建订单 * 创建订单
* @param request 创建订单参数 * @param request 创建订单参数
* @param key 订单key * @param key 订单key
* @return MyRecord * @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使用 * 订单退款申请Task使用
* @param request * @param applyList
* @return * @return
*/ */
Boolean refundApplyTask(List<OrderRefundApplyRequest> applyList); Boolean refundApplyTask(List<OrderRefundApplyRequest> applyList);

View File

@@ -1,9 +1,9 @@
package com.zbkj.crmeb.front.service; package com.zbkj.crmeb.front.service;
import com.baomidou.mybatisplus.extension.service.IService; import com.baomidou.mybatisplus.extension.service.IService;
import com.common.CommonPage;
import com.common.PageParamRequest; import com.common.PageParamRequest;
import com.github.pagehelper.PageInfo; import com.github.pagehelper.PageInfo;
import com.zbkj.crmeb.finance.model.UserExtract;
import com.zbkj.crmeb.finance.request.UserExtractRequest; import com.zbkj.crmeb.finance.request.UserExtractRequest;
import com.zbkj.crmeb.front.request.UserRechargeRequest; import com.zbkj.crmeb.front.request.UserRechargeRequest;
import com.zbkj.crmeb.front.request.UserSpreadPeopleRequest; import com.zbkj.crmeb.front.request.UserSpreadPeopleRequest;
@@ -51,7 +51,7 @@ public interface UserCenterService extends IService<User> {
UserSpreadOrderResponse getSpreadOrder(PageParamRequest pageParamRequest); UserSpreadOrderResponse getSpreadOrder(PageParamRequest pageParamRequest);
UserRechargePaymentResponse recharge(UserRechargeRequest request); OrderPayResultResponse recharge(UserRechargeRequest request);
LoginResponse weChatAuthorizeLogin(String code, Integer spreadUid); LoginResponse weChatAuthorizeLogin(String code, Integer spreadUid);
@@ -72,4 +72,17 @@ public interface UserCenterService extends IService<User> {
PageInfo<UserExtractRecordResponse> getExtractRecord(PageParamRequest pageParamRequest); PageInfo<UserExtractRecordResponse> getExtractRecord(PageParamRequest pageParamRequest);
BigDecimal getExtractTotalMoney(); BigDecimal getExtractTotalMoney();
/**
* 推广佣金明细
* @param pageParamRequest 分页参数
*/
PageInfo<SpreadCommissionDetailResponse> getSpreadCommissionDetail(PageParamRequest pageParamRequest);
/**
* 用户账单记录(现金)
* @param type 记录类型all-全部expenditure-支出income-收入
* @return CommonPage
*/
CommonPage<UserRechargeBillRecordResponse> nowMoneyBillRecord(String type, PageParamRequest pageRequest);
} }

View File

@@ -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 <admin@crmeb.com>
* +----------------------------------------------------------------------
*/
@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;
}
}

View File

@@ -4,10 +4,12 @@ import cn.hutool.core.collection.CollUtil;
import cn.hutool.core.util.ObjectUtil; import cn.hutool.core.util.ObjectUtil;
import cn.hutool.core.util.StrUtil; import cn.hutool.core.util.StrUtil;
import com.alibaba.fastjson.JSONObject; import com.alibaba.fastjson.JSONObject;
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.common.MyRecord; import com.common.MyRecord;
import com.common.PageParamRequest; import com.common.PageParamRequest;
import com.constants.Constants; import com.constants.Constants;
import com.constants.PayConstants; import com.constants.PayConstants;
import com.constants.SmsConstants;
import com.exception.CrmebException; import com.exception.CrmebException;
import com.utils.CrmebUtil; import com.utils.CrmebUtil;
import com.utils.DateUtil; 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.service.*;
import com.zbkj.crmeb.store.utilService.OrderUtils; import com.zbkj.crmeb.store.utilService.OrderUtils;
import com.zbkj.crmeb.store.vo.StoreOrderInfoVo; 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.SystemAttachment;
import com.zbkj.crmeb.system.model.SystemStore; 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.SystemAttachmentService;
import com.zbkj.crmeb.system.service.SystemConfigService; import com.zbkj.crmeb.system.service.SystemConfigService;
import com.zbkj.crmeb.system.service.SystemStoreService; 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.WechatSendMessageForCreateOrder;
import com.zbkj.crmeb.wechat.vo.WechatSendMessageForReFundNotify; import com.zbkj.crmeb.wechat.vo.WechatSendMessageForReFundNotify;
import org.apache.commons.lang3.StringUtils; import org.apache.commons.lang3.StringUtils;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.BeanUtils; import org.springframework.beans.BeanUtils;
import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.scheduling.annotation.Async;
import org.springframework.stereotype.Service; import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional; import org.springframework.transaction.annotation.Transactional;
import org.springframework.transaction.support.TransactionTemplate; import org.springframework.transaction.support.TransactionTemplate;
@@ -77,6 +84,8 @@ import java.util.stream.Collectors;
@Service @Service
public class OrderServiceImpl implements OrderService { public class OrderServiceImpl implements OrderService {
private Logger logger = LoggerFactory.getLogger(OrderServiceImpl.class);
@Autowired @Autowired
private UserService userService; private UserService userService;
@@ -138,6 +147,12 @@ public class OrderServiceImpl implements OrderService {
@Autowired @Autowired
private TransactionTemplate transactionTemplate; private TransactionTemplate transactionTemplate;
@Autowired
private SystemAdminService systemAdminService;
@Autowired
private SmsService smsService;
/** /**
* 确认订单 * 确认订单
* @return 确认订单response * @return 确认订单response
@@ -245,98 +260,6 @@ public class OrderServiceImpl implements OrderService {
return response; 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<String, Object> 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<StoreCartResponse> cartInfo = cor.getCartInfo();
List<StoreCartResponse> cartList = cartInfo.stream().filter(i -> ObjectUtil.isNotNull(i.getId())).collect(Collectors.toList());
if (CollUtil.isNotEmpty(cartList)) {
List<Integer> 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 创建订单结果 * @return 创建订单结果
*/ */
@Override @Override
public MyRecord createOrder_1_3_1(OrderCreateRequest request, String orderKey) { public MyRecord createOrder(OrderCreateRequest request, String orderKey) {
User currentUser = userService.getInfo(); User currentUser = userService.getInfo();
if (ObjectUtil.isNull(currentUser)) throw new CrmebException("当前用户不存在!"); if (ObjectUtil.isNull(currentUser)) throw new CrmebException("当前用户不存在!");
// 检查订单是否存在 // 检查订单是否存在
@@ -383,12 +306,40 @@ public class OrderServiceImpl implements OrderService {
List<Integer> cartIdList = cartList.stream().map(temp -> temp.getId().intValue()).collect(Collectors.toList()); List<Integer> cartIdList = cartList.stream().map(temp -> temp.getId().intValue()).collect(Collectors.toList());
storeCartService.deleteCartByIds(cartIdList); storeCartService.deleteCartByIds(cartIdList);
} }
// 加入自动未支付自动取消队列
redisUtil.lPush(Constants.ORDER_AUTO_CANCEL_KEY, orderCreated.getOrderId());
// 发送后台管理员下单提醒通知短信
sendAdminOrderNotice(orderCreated.getOrderId());
MyRecord record = new MyRecord(); MyRecord record = new MyRecord();
record.set("orderNo", orderCreated.getOrderId()); record.set("orderNo", orderCreated.getOrderId());
return record; 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<SystemAdmin> 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; 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<SystemAdmin> systemAdminList = systemAdminService.findIsSmsList();
if (CollUtil.isNotEmpty(systemAdminList)) {
// 发送短信
systemAdminList.forEach(admin -> {
smsService.sendOrderRefundApplyNotice(admin.getPhone(), existStoreOrder.getOrderId(), admin.getRealName());
});
}
}
}
if(!execute) throw new CrmebException("申请退款失败"); if(!execute) throw new CrmebException("申请退款失败");
// HashMap<String, Object> smsInfo = new HashMap<>(); // HashMap<String, Object> smsInfo = new HashMap<>();
@@ -571,24 +536,32 @@ public class OrderServiceImpl implements OrderService {
if (CollUtil.isEmpty(applyList)) { if (CollUtil.isEmpty(applyList)) {
return false; return false;
} }
String smsSwitch = systemConfigService.getValueByKey(SmsConstants.SMS_CONFIG_ADMIN_CONFIRM_TAKE_OVER_SWITCH);
List<StoreOrder> orderList = CollUtil.newArrayList(); List<StoreOrder> orderList = CollUtil.newArrayList();
List<Map<String, Object>> notifyMapList = CollUtil.newArrayList();
for (OrderRefundApplyRequest request : applyList) { for (OrderRefundApplyRequest request : applyList) {
StoreOrder storeOrder = storeOrderService.getById(request.getId()); StoreOrder storeOrder = storeOrderService.getById(request.getId());
if(ObjectUtil.isNull(storeOrder)){ if(ObjectUtil.isNull(storeOrder)){
//订单号错误 //订单号错误
throw new CrmebException("没有找到相关订单信息!"); // throw new CrmebException("没有找到相关订单信息!");
logger.error("拼团自动处理订单申请退款:没有找到相关订单信息!");
continue;
} }
if(storeOrder.getRefundStatus() == 1){ if(storeOrder.getRefundStatus() == 1){
throw new CrmebException("正在申请退款中"); // throw new CrmebException("正在申请退款中");
logger.error("拼团自动处理订单申请退款:正在申请退款中!");
continue;
} }
if(storeOrder.getRefundStatus() == 2){ if(storeOrder.getRefundStatus() == 2){
throw new CrmebException("订单已退款"); // throw new CrmebException("订单已退款");
logger.error("拼团自动处理订单申请退款:订单已退款!");
continue;
} }
if(storeOrder.getRefundStatus() == 3){ if(storeOrder.getRefundStatus() == 3){
throw new CrmebException("订单退款中"); // throw new CrmebException("订单退款中");
logger.error("拼团自动处理订单申请退款:订单退款中!");
continue;
} }
// if(storeOrder.getStatus() == 1){ // if(storeOrder.getStatus() == 1){
@@ -602,32 +575,20 @@ public class OrderServiceImpl implements OrderService {
storeOrder.setRefundReasonTime(DateUtil.nowDateTime()); storeOrder.setRefundReasonTime(DateUtil.nowDateTime());
orderList.add(storeOrder); orderList.add(storeOrder);
// 发送微信小程序订阅消息 // 发送用户退款管理员提醒短信
String storeNameAndCarNumString = orderUtils.getStoreNameAndCarNumString(storeOrder.getId()); if (StrUtil.isNotBlank(smsSwitch) || smsSwitch.equals("1")) {
if(StringUtils.isNotBlank(storeNameAndCarNumString)){ // 查询可已发送短信的管理员
WechatSendMessageForReFundNotify notify = new WechatSendMessageForReFundNotify( List<SystemAdmin> systemAdminList = systemAdminService.findIsSmsList();
storeNameAndCarNumString,storeOrder.getPayPrice().toString(), if (CollUtil.isNotEmpty(systemAdminList)) {
storeOrder.getCreateTime().toString(),storeOrder.getOrderId()+"",DateUtil.nowDateTimeStr(), // 发送短信
"CRMEB","发起申请",request.getExplain(),storeOrder.getPayPrice()+"", systemAdminList.forEach(admin -> {
request.getText(),storeOrder.getUserPhone(),"CRMEB"); smsService.sendOrderRefundApplyNotice(admin.getPhone(), storeOrder.getOrderId(), admin.getRealName());
Map<String, Object> map = CollUtil.newHashMap(); });
map.put("notify", notify); }
map.put("uid", storeOrder.getUid());
notifyMapList.add(map);
} }
} }
boolean batch = storeOrderService.updateBatchById(orderList, 100); return 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;
} }

View File

@@ -200,7 +200,17 @@ public class ProductServiceImpl implements ProductService {
if(null != user && null != user.getUid()){ if(null != user && null != user.getUid()){
storeInfo.setUserLike(storeProductRelationService.getLikeOrCollectByUser(user.getUid(),id,true).size() > 0); storeInfo.setUserLike(storeProductRelationService.getLikeOrCollectByUser(user.getUid(),id,true).size() > 0);
storeInfo.setUserCollect(storeProductRelationService.getLikeOrCollectByUser(user.getUid(),id,false).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{ }else{
storeInfo.setUserLike(false); storeInfo.setUserLike(false);
storeInfo.setUserCollect(false); storeInfo.setUserCollect(false);

View File

File diff suppressed because it is too large Load Diff

View File

@@ -54,7 +54,9 @@ public class StoreProductLogServiceImpl extends ServiceImpl<StoreProductLogDao,
dateLimitUtilVo dateLimit = DateUtil.getDateLimit(time); dateLimitUtilVo dateLimit = DateUtil.getDateLimit(time);
//时间范围 //时间范围
if(dateLimit.getStartTime() != null && dateLimit.getEndTime() != null){ if(dateLimit.getStartTime() != null && dateLimit.getEndTime() != null){
lqw.between(StoreProductLog::getAddTime, dateLimit.getStartTime(), dateLimit.getEndTime()); Long startTime = DateUtil.dateStr2Timestamp(dateLimit.getStartTime(), Constants.DATE_TIME_TYPE_BEGIN);
Long endTime = DateUtil.dateStr2Timestamp(dateLimit.getEndTime(), Constants.DATE_TIME_TYPE_END);
lqw.between(StoreProductLog::getAddTime, startTime, endTime);
} }
return dao.selectCount(lqw); return dao.selectCount(lqw);
} }

View File

@@ -56,7 +56,7 @@ public class StoreCouponUser implements Serializable {
@ApiModelProperty(value = "最低消费多少金额可用优惠券") @ApiModelProperty(value = "最低消费多少金额可用优惠券")
private BigDecimal minPrice; private BigDecimal minPrice;
@ApiModelProperty(value = "获取方式") @ApiModelProperty(value = "获取方式send后台发放, 用户领取 get,register用户注册")
private String type; private String type;
@ApiModelProperty(value = "状态0未使用1已使用, 2:已失效)") @ApiModelProperty(value = "状态0未使用1已使用, 2:已失效)")

View File

@@ -7,7 +7,6 @@ import com.zbkj.crmeb.marketing.request.StoreCouponRequest;
import com.zbkj.crmeb.marketing.request.StoreCouponSearchRequest; import com.zbkj.crmeb.marketing.request.StoreCouponSearchRequest;
import com.zbkj.crmeb.marketing.response.StoreCouponFrontResponse; import com.zbkj.crmeb.marketing.response.StoreCouponFrontResponse;
import com.zbkj.crmeb.marketing.response.StoreCouponInfoResponse; import com.zbkj.crmeb.marketing.response.StoreCouponInfoResponse;
import io.swagger.models.auth.In;
import java.util.List; import java.util.List;
@@ -47,4 +46,18 @@ public interface StoreCouponService extends IService<StoreCoupon> {
* @return * @return
*/ */
List<StoreCoupon> getByIds(List<Integer> ids); List<StoreCoupon> getByIds(List<Integer> ids);
/**
* 扣减数量
* @param id 优惠券id
* @param num 数量
* @param isLimited 是否限量
*/
Boolean deduction(Integer id, Integer num, Boolean isLimited);
/**
* 获取用户注册赠送新人券
* @return
*/
List<StoreCoupon> findRegisterList();
} }

View File

@@ -1,6 +1,7 @@
package com.zbkj.crmeb.marketing.service; package com.zbkj.crmeb.marketing.service;
import com.baomidou.mybatisplus.extension.service.IService; import com.baomidou.mybatisplus.extension.service.IService;
import com.common.MyRecord;
import com.common.PageParamRequest; import com.common.PageParamRequest;
import com.github.pagehelper.PageInfo; import com.github.pagehelper.PageInfo;
import com.zbkj.crmeb.front.request.UserCouponReceiveRequest; import com.zbkj.crmeb.front.request.UserCouponReceiveRequest;
@@ -70,4 +71,17 @@ public interface StoreCouponUserService extends IService<StoreCouponUser> {
* 优惠券过期定时任务 * 优惠券过期定时任务
*/ */
void overdueTask(); void overdueTask();
/**
* 用户领取优惠券
*/
Boolean receiveCoupon(UserCouponReceiveRequest request);
/**
* 支付成功赠送处理
* @param couponId 优惠券编号
* @param uid 用户uid
* @return
*/
MyRecord paySuccessGiveAway(Integer couponId, Integer uid);
} }

View File

@@ -1,6 +1,10 @@
package com.zbkj.crmeb.marketing.service.impl; 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.query.LambdaQueryWrapper;
import com.baomidou.mybatisplus.core.conditions.update.UpdateWrapper;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import com.common.PageParamRequest; import com.common.PageParamRequest;
import com.constants.Constants; import com.constants.Constants;
@@ -32,6 +36,7 @@ import java.util.ArrayList;
import java.util.Date; import java.util.Date;
import java.util.HashMap; import java.util.HashMap;
import java.util.List; import java.util.List;
import java.util.stream.Collectors;
/** /**
* StoreCouponServiceImpl 接口实现 * StoreCouponServiceImpl 接口实现
@@ -320,6 +325,59 @@ public class StoreCouponServiceImpl extends ServiceImpl<StoreCouponDao, StoreCou
return dao.selectList(lambdaQueryWrapper); return dao.selectList(lambdaQueryWrapper);
} }
/**
* 扣减数量
* @param id 优惠券id
* @param num 数量
* @param isLimited 是否限量
*/
@Override
public Boolean deduction(Integer id, Integer num, Boolean isLimited) {
UpdateWrapper<StoreCoupon> 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<StoreCoupon> findRegisterList() {
String dateStr = DateUtil.nowDate(Constants.DATE_FORMAT);
LambdaQueryWrapper<StoreCoupon> 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<StoreCoupon> list = dao.selectList(lqw);
if (CollUtil.isEmpty(list)) {
return CollUtil.newArrayList();
}
List<StoreCoupon> 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 * @author Mr.Zhang

View File

@@ -1,11 +1,13 @@
package com.zbkj.crmeb.marketing.service.impl; package com.zbkj.crmeb.marketing.service.impl;
import cn.hutool.core.collection.CollUtil; import cn.hutool.core.collection.CollUtil;
import cn.hutool.core.util.ObjectUtil;
import cn.hutool.core.util.StrUtil; import cn.hutool.core.util.StrUtil;
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.baomidou.mybatisplus.core.conditions.update.LambdaUpdateWrapper; import com.baomidou.mybatisplus.core.conditions.update.LambdaUpdateWrapper;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import com.common.CommonPage; import com.common.CommonPage;
import com.common.MyRecord;
import com.common.PageParamRequest; import com.common.PageParamRequest;
import com.constants.Constants; import com.constants.Constants;
import com.exception.CrmebException; 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.store.service.StoreProductService;
import com.zbkj.crmeb.user.model.User; import com.zbkj.crmeb.user.model.User;
import com.zbkj.crmeb.user.service.UserService; import com.zbkj.crmeb.user.service.UserService;
import com.zbkj.crmeb.wechat.vo.WechatSendMessageForOrderCancel;
import org.apache.commons.lang3.StringUtils; import org.apache.commons.lang3.StringUtils;
import org.springframework.beans.BeanUtils; import org.springframework.beans.BeanUtils;
import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Autowired;
@@ -365,12 +366,20 @@ public class StoreCouponUserServiceImpl extends ServiceImpl<StoreCouponUserDao,
List<Integer> primaryKeyIdList = CrmebUtil.stringToArray(storeCouponUser.getPrimaryKey()); List<Integer> primaryKeyIdList = CrmebUtil.stringToArray(storeCouponUser.getPrimaryKey());
//取两个集合的交集如果是false则证明没有相同的值 //取两个集合的交集如果是false则证明没有相同的值
if(storeCouponUser.getUseType() == 2 && !primaryKeyIdList.retainAll(productIdList)){ //oldList.retainAll(newList)返回值代表oldList是否保持原样如果old和new完全相同那old保持原样并返回false。
throw new CrmebException("此优惠券为商品券,请购买相关商品之后再使用!"); //交集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)){ if(storeCouponUser.getUseType() == 3){
throw new CrmebException("此优惠券为分类券,请购买相关分类下的商品之后再使用!"); primaryKeyIdList.retainAll(categoryIdList);
if (CollUtil.isEmpty(primaryKeyIdList)) {
throw new CrmebException("此优惠券为分类券,请购买相关分类下的商品之后再使用!");
}
} }
} }
return true; return true;
@@ -580,10 +589,12 @@ public class StoreCouponUserServiceImpl extends ServiceImpl<StoreCouponUserDao,
List<StoreCouponUser> updateList = CollUtil.newArrayList(); List<StoreCouponUser> updateList = CollUtil.newArrayList();
String nowDateStr = DateUtil.nowDate(Constants.DATE_FORMAT); String nowDateStr = DateUtil.nowDate(Constants.DATE_FORMAT);
couponList.forEach(coupon -> { couponList.forEach(coupon -> {
String endDateStr = DateUtil.dateToStr(coupon.getEndTime(), Constants.DATE_FORMAT); if (ObjectUtil.isNotNull(coupon.getEndTime())) {
if (DateUtil.compareDate(nowDateStr, endDateStr, Constants.DATE_FORMAT) >= 0) { String endDateStr = DateUtil.dateToStr(coupon.getEndTime(), Constants.DATE_FORMAT);
coupon.setStatus(2); if (DateUtil.compareDate(nowDateStr, endDateStr, Constants.DATE_FORMAT) >= 0) {
updateList.add(coupon); coupon.setStatus(2);
updateList.add(coupon);
}
} }
}); });
@@ -594,6 +605,134 @@ public class StoreCouponUserServiceImpl extends ServiceImpl<StoreCouponUserDao,
if (!update) throw new CrmebException("批量更新优惠券过期动作失败"); if (!update) throw new CrmebException("批量更新优惠券过期动作失败");
} }
/**
* 用户领取优惠券
*/
@Override
public Boolean receiveCoupon(UserCouponReceiveRequest request) {
// 获取优惠券信息
StoreCoupon storeCoupon = storeCouponService.getInfoException(request.getCouponId());
Integer userId = userService.getUserIdException();
//看是否有剩余数量,是否够给当前用户
if(storeCoupon.getIsLimited() && storeCoupon.getLastTotal() < 1){
throw new CrmebException("当前剩余数量不够领取!");
}
//过滤掉已经领取过的用户
List<Integer> 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<Integer> 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<StoreCouponUser> lambdaQueryWrapper, String productIdStr){ private void getPrimaryKeySql(LambdaQueryWrapper<StoreCouponUser> lambdaQueryWrapper, String productIdStr){
if(StringUtils.isBlank(productIdStr)){ if(StringUtils.isBlank(productIdStr)){
return; return;

View File

@@ -115,6 +115,17 @@ public class OnePassController {
return CommonResult.failed(); return CommonResult.failed();
} }
/**
* 修改手机号——验证账号密码
*/
@ApiOperation(value = "修改手机号——验证账号密码")
@RequestMapping(value = "/update/phone/validator", method = RequestMethod.POST)
public CommonResult<JSONObject> updatePhone(@Validated @RequestBody OnePassLoginRequest request){
if (onePassService.beforeUpdatePhoneValidator(request)) {
return CommonResult.success();
}
return CommonResult.failed();
}
/** /**
* 修改手机号 * 修改手机号

View File

@@ -106,4 +106,10 @@ public interface OnePassService {
* @return OnePassLogisticsQueryVo * @return OnePassLogisticsQueryVo
*/ */
OnePassLogisticsQueryVo exprQuery(String expressNo, String com); OnePassLogisticsQueryVo exprQuery(String expressNo, String com);
/**
* 修改手机号——验证账号密码
* @return Boolean
*/
Boolean beforeUpdatePhoneValidator(OnePassLoginRequest request);
} }

View File

@@ -399,6 +399,23 @@ public class OnePassServiceImpl implements OnePassService {
return JSONObject.toJavaObject(jsonObject, OnePassLogisticsQueryVo.class); 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;
}
/** /**
* 物流、电子面单开通参数校验 * 物流、电子面单开通参数校验
*/ */

View File

@@ -24,7 +24,6 @@ public interface RechargePayService {
/** /**
* 支付成功处理 * 支付成功处理
* @param userRecharge 充值订单 * @param userRecharge 充值订单
* @param userToken 用户Token
*/ */
Boolean paySuccess(UserRecharge userRecharge, UserToken userToken); Boolean paySuccess(UserRecharge userRecharge);
} }

View File

@@ -1,6 +1,7 @@
package com.zbkj.crmeb.payment.service.impl; package com.zbkj.crmeb.payment.service.impl;
import cn.hutool.core.codec.Base64; import cn.hutool.core.codec.Base64;
import cn.hutool.core.date.DateTime;
import cn.hutool.core.util.ObjectUtil; import cn.hutool.core.util.ObjectUtil;
import cn.hutool.core.util.StrUtil; import cn.hutool.core.util.StrUtil;
import cn.hutool.crypto.SecureUtil; import cn.hutool.crypto.SecureUtil;
@@ -9,6 +10,10 @@ import com.common.MyRecord;
import com.constants.Constants; import com.constants.Constants;
import com.exception.CrmebException; import com.exception.CrmebException;
import com.utils.*; 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.model.UserRecharge;
import com.zbkj.crmeb.finance.service.UserRechargeService; import com.zbkj.crmeb.finance.service.UserRechargeService;
import com.zbkj.crmeb.payment.service.CallbackService; 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.model.UserToken;
import com.zbkj.crmeb.user.service.UserService; import com.zbkj.crmeb.user.service.UserService;
import com.zbkj.crmeb.user.service.UserTokenService; import com.zbkj.crmeb.user.service.UserTokenService;
import org.bouncycastle.jce.provider.BouncyCastleProvider;
import org.slf4j.Logger; import org.slf4j.Logger;
import org.slf4j.LoggerFactory; import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Autowired;
@@ -33,6 +39,7 @@ import org.springframework.transaction.support.TransactionTemplate;
import javax.crypto.Cipher; import javax.crypto.Cipher;
import javax.crypto.spec.SecretKeySpec; import javax.crypto.spec.SecretKeySpec;
import java.nio.charset.StandardCharsets; import java.nio.charset.StandardCharsets;
import java.security.Security;
import java.util.ArrayList; import java.util.ArrayList;
import java.util.HashMap; import java.util.HashMap;
import java.util.List; import java.util.List;
@@ -84,6 +91,12 @@ public class CallbackServiceImpl implements CallbackService {
@Autowired @Autowired
private TransactionTemplate transactionTemplate; private TransactionTemplate transactionTemplate;
@Autowired
private StoreCombinationService storeCombinationService;
@Autowired
private StorePinkService storePinkService;
/** /**
* 微信支付回调 * 微信支付回调
* @author Mr.Zhang * @author Mr.Zhang
@@ -128,11 +141,11 @@ public class CallbackServiceImpl implements CallbackService {
AttachVo attachVo = JSONObject.toJavaObject(JSONObject.parseObject(callbackVo.getAttach()), AttachVo.class); AttachVo attachVo = JSONObject.toJavaObject(JSONObject.parseObject(callbackVo.getAttach()), AttachVo.class);
//判断openid //判断openid
UserToken userToken = userTokenService.getByOpenid(callbackVo.getOpenid()); // UserToken userToken = userTokenService.getByOpenid(callbackVo.getOpenid());
if(null == userToken || !userToken.getUid().equals(attachVo.getUserId())){ // if(null == userToken || !userToken.getUid().equals(attachVo.getUserId())){
//用户信息错误 // //用户信息错误
throw new CrmebException("用户信息错误!"); // throw new CrmebException("用户信息错误!");
} // }
User user = userService.getById(attachVo.getUserId()); User user = userService.getById(attachVo.getUserId());
if (ObjectUtil.isNull(user)) { if (ObjectUtil.isNull(user)) {
//用户信息错误 //用户信息错误
@@ -168,6 +181,57 @@ public class CallbackServiceImpl implements CallbackService {
if (storeOrder.getUseIntegral() > 0) { if (storeOrder.getUseIntegral() > 0) {
userService.updateIntegral(user, storeOrder.getUseIntegral(), "sub"); 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; return Boolean.TRUE;
}); });
if (!execute) { if (!execute) {
@@ -195,7 +259,7 @@ public class CallbackServiceImpl implements CallbackService {
return sb.toString(); return sb.toString();
} }
// 支付成功处理 // 支付成功处理
Boolean rechargePayAfter = rechargePayService.paySuccess(userRecharge, userToken); Boolean rechargePayAfter = rechargePayService.paySuccess(userRecharge);
if (!rechargePayAfter) { if (!rechargePayAfter) {
logger.error("wechat pay error : 数据保存失败==》" + callbackVo.getOutTradeNo()); logger.error("wechat pay error : 数据保存失败==》" + callbackVo.getOutTradeNo());
throw new CrmebException("wechat pay error : 数据保存失败==》" + callbackVo.getOutTradeNo()); throw new CrmebException("wechat pay error : 数据保存失败==》" + callbackVo.getOutTradeNo());
@@ -334,7 +398,14 @@ public class CallbackServiceImpl implements CallbackService {
return signKey; 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); byte[] decodeReqInfo = Base64.decode(reqInfo);
SecretKeySpec key = new SecretKeySpec(SecureUtil.md5(signKey).toLowerCase().getBytes(), "AES"); SecretKeySpec key = new SecretKeySpec(SecureUtil.md5(signKey).toLowerCase().getBytes(), "AES");
Cipher cipher; Cipher cipher;

View File

@@ -5,8 +5,7 @@ import cn.hutool.core.date.DateTime;
import cn.hutool.core.util.ObjectUtil; import cn.hutool.core.util.ObjectUtil;
import cn.hutool.core.util.StrUtil; import cn.hutool.core.util.StrUtil;
import com.common.MyRecord; import com.common.MyRecord;
import com.constants.Constants; import com.constants.*;
import com.constants.PayConstants;
import com.exception.CrmebException; import com.exception.CrmebException;
import com.utils.DateUtil; import com.utils.DateUtil;
import com.utils.RedisUtil; 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.OrderPayResultResponse;
import com.zbkj.crmeb.front.response.UserRechargePaymentResponse; import com.zbkj.crmeb.front.response.UserRechargePaymentResponse;
import com.zbkj.crmeb.front.vo.WxPayJsResultVo; 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.marketing.service.StoreCouponUserService;
import com.zbkj.crmeb.payment.service.OrderPayService; import com.zbkj.crmeb.payment.service.OrderPayService;
import com.zbkj.crmeb.payment.service.PayService; 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.service.*;
import com.zbkj.crmeb.store.utilService.OrderUtils; import com.zbkj.crmeb.store.utilService.OrderUtils;
import com.zbkj.crmeb.store.vo.StoreOrderInfoVo; 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.system.service.SystemConfigService;
import com.zbkj.crmeb.user.model.User; import com.zbkj.crmeb.user.model.User;
import com.zbkj.crmeb.user.model.UserBill; import com.zbkj.crmeb.user.model.UserBill;
import com.zbkj.crmeb.user.service.UserBillService; import com.zbkj.crmeb.user.model.UserBrokerageRecord;
import com.zbkj.crmeb.user.service.UserLevelService; import com.zbkj.crmeb.user.model.UserToken;
import com.zbkj.crmeb.user.service.UserService; import com.zbkj.crmeb.user.service.*;
import com.zbkj.crmeb.wechat.service.TemplateMessageService; import com.zbkj.crmeb.wechat.service.TemplateMessageService;
import com.zbkj.crmeb.wechat.service.WeChatService; import com.zbkj.crmeb.wechat.service.WeChatService;
import com.zbkj.crmeb.wechat.vo.WechatSendMessageForPaySuccess; import com.zbkj.crmeb.wechat.vo.WechatSendMessageForPaySuccess;
@@ -57,6 +59,7 @@ import org.springframework.transaction.annotation.Transactional;
import org.springframework.transaction.support.TransactionTemplate; import org.springframework.transaction.support.TransactionTemplate;
import java.math.BigDecimal; import java.math.BigDecimal;
import java.util.HashMap;
import java.util.List; import java.util.List;
import java.util.Map; import java.util.Map;
import java.util.Optional; import java.util.Optional;
@@ -152,6 +155,18 @@ public class OrderPayServiceImpl extends PayService implements OrderPayService {
@Autowired @Autowired
private StorePinkService storePinkService; private StorePinkService storePinkService;
@Autowired
private UserBrokerageRecordService userBrokerageRecordService;
@Autowired
private StoreCouponService storeCouponService;
@Autowired
private SystemAdminService systemAdminService;
@Autowired
private UserTokenService userTokenService;
/** /**
* 订单支付 * 订单支付
* @param orderId Integer 订单号 * @param orderId Integer 订单号
@@ -315,7 +330,7 @@ public class OrderPayServiceImpl extends PayService implements OrderPayService {
Integer integral = 0; 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)) { if (StrUtil.isNotBlank(integralStr)) {
BigDecimal integralBig = new BigDecimal(integralStr); BigDecimal integralBig = new BigDecimal(integralStr);
integral = integralBig.multiply(storeOrder.getPayPrice()).setScale(0, BigDecimal.ROUND_DOWN).intValue(); 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); user.setPayCount(user.getPayCount() + 1);
/**
* 计算佣金,生成佣金记录
*/
List<UserBrokerageRecord> recordList = assignCommission(storeOrder);
Boolean execute = transactionTemplate.execute(e -> { Boolean execute = transactionTemplate.execute(e -> {
//订单日志 //订单日志
storeOrderStatusService.addLog(storeOrder.getId(), Constants.ORDER_LOG_PAY_SUCCESS, Constants.ORDER_LOG_MESSAGE_PAY_SUCCESS); 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); userLevelService.upLevel(user);
// 佣金记录
if (CollUtil.isNotEmpty(recordList)) {
recordList.forEach(temp -> {
temp.setLinkId(storeOrder.getOrderId());
});
userBrokerageRecordService.saveBatch(recordList);
}
// 如果是砍价商品,修改砍价状态 // 如果是砍价商品,修改砍价状态
if (storeOrder.getBargainId() > 0) { if (storeOrder.getBargainId() > 0) {
StoreBargainUser storeBargainUser = storeBargainUserService.getByBargainIdAndUid(storeOrder.getBargainId(), user.getUid()); StoreBargainUser storeBargainUser = storeBargainUserService.getByBargainIdAndUid(storeOrder.getBargainId(), user.getUid());
@@ -371,72 +399,235 @@ public class OrderPayServiceImpl extends PayService implements OrderPayService {
// TODO 拼团整体逻辑需调整 // TODO 拼团整体逻辑需调整
// TODO 将拼团生成放到订单生成,如果取消订单,则删除生成的拼团的数据 // TODO 将拼团生成放到订单生成,如果取消订单,则删除生成的拼团的数据
// TODO 在这里只负责将拼团状态改为已完成用消息列队发送拼团task形式处理 // TODO 在这里只负责将拼团状态改为已完成用消息列队发送拼团task形式处理
if (storeOrder.getCombinationId() > 0) { // if (storeOrder.getCombinationId() > 0) {
// 判断拼团团长是否存在 // // 判断拼团团长是否存在
StorePink headPink = new StorePink(); // StorePink headPink = new StorePink();
Integer pinkId = storeOrder.getPinkId(); // Integer pinkId = storeOrder.getPinkId();
if (pinkId > 0) { // if (pinkId > 0) {
headPink = storePinkService.getById(pinkId); // headPink = storePinkService.getById(pinkId);
if (ObjectUtil.isNull(headPink) || headPink.getIsRefund().equals(true) || headPink.getStatus() == 3) { // if (ObjectUtil.isNull(headPink) || headPink.getIsRefund().equals(true) || headPink.getStatus() == 3) {
pinkId = 0; // pinkId = 0;
} // }
} // }
StoreCombination storeCombination = storeCombinationService.getById(storeOrder.getCombinationId()); // StoreCombination storeCombination = storeCombinationService.getById(storeOrder.getCombinationId());
// 生成拼团表数据 // // 生成拼团表数据
StorePink storePink = new StorePink(); // StorePink storePink = new StorePink();
storePink.setUid(user.getUid()); // storePink.setUid(user.getUid());
storePink.setAvatar(user.getAvatar()); // storePink.setAvatar(user.getAvatar());
storePink.setNickname(user.getNickname()); // storePink.setNickname(user.getNickname());
storePink.setOrderId(storeOrder.getOrderId()); // storePink.setOrderId(storeOrder.getOrderId());
storePink.setOrderIdKey(storeOrder.getId()); // storePink.setOrderIdKey(storeOrder.getId());
storePink.setTotalNum(storeOrder.getTotalNum()); // storePink.setTotalNum(storeOrder.getTotalNum());
storePink.setTotalPrice(storeOrder.getTotalPrice()); // storePink.setTotalPrice(storeOrder.getTotalPrice());
storePink.setCid(storeCombination.getId()); // storePink.setCid(storeCombination.getId());
storePink.setPid(storeCombination.getProductId()); // storePink.setPid(storeCombination.getProductId());
storePink.setPeople(storeCombination.getPeople()); // storePink.setPeople(storeCombination.getPeople());
storePink.setPrice(storeCombination.getPrice()); // storePink.setPrice(storeCombination.getPrice());
Integer effectiveTime = storeCombination.getEffectiveTime();// 有效小时数 // Integer effectiveTime = storeCombination.getEffectiveTime();// 有效小时数
DateTime dateTime = cn.hutool.core.date.DateUtil.date(); // DateTime dateTime = cn.hutool.core.date.DateUtil.date();
storePink.setAddTime(dateTime.getTime()); // storePink.setAddTime(dateTime.getTime());
if (pinkId > 0) { // if (pinkId > 0) {
storePink.setStopTime(headPink.getStopTime()); // storePink.setStopTime(headPink.getStopTime());
} else { // } else {
DateTime hourTime = cn.hutool.core.date.DateUtil.offsetHour(dateTime, effectiveTime); // DateTime hourTime = cn.hutool.core.date.DateUtil.offsetHour(dateTime, effectiveTime);
long stopTime = hourTime.getTime(); // long stopTime = hourTime.getTime();
if (stopTime > storeCombination.getStopTime()) { // if (stopTime > storeCombination.getStopTime()) {
stopTime = storeCombination.getStopTime(); // stopTime = storeCombination.getStopTime();
} // }
storePink.setStopTime(stopTime); // storePink.setStopTime(stopTime);
} // }
storePink.setKId(pinkId); // storePink.setKId(pinkId);
storePink.setIsTpl(false); // storePink.setIsTpl(false);
storePink.setIsRefund(false); // storePink.setIsRefund(false);
storePink.setStatus(1); // storePink.setStatus(1);
storePinkService.save(storePink); // storePinkService.save(storePink);
// 如果是开团,需要更新订单数据 // // 如果是开团,需要更新订单数据
if (storePink.getKId() == 0) { // if (storePink.getKId() == 0) {
storeOrder.setPinkId(storePink.getId()); // storeOrder.setPinkId(storePink.getId());
storeOrderService.updateById(storeOrder); // storeOrderService.updateById(storeOrder);
} // }
} // }
return Boolean.TRUE; return Boolean.TRUE;
}); });
if (execute) { if (execute) {
try { 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<SystemAdmin> 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); autoSendCoupons(storeOrder);
} catch (Exception e) { } catch (Exception e) {
e.printStackTrace(); e.printStackTrace();
logger.error("模板通知或优惠券异常"); logger.error("短信、模板通知或优惠券异常");
} }
} }
return execute; return execute;
} }
/**
* 分配佣金
* @param storeOrder
* @return
*/
private List<UserBrokerageRecord> 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<MyRecord> spreadRecordList = getSpreadRecordList(user.getSpreadUid());
if (CollUtil.isEmpty(spreadRecordList)) {
return CollUtil.newArrayList();
}
// 获取佣金冻结期
String fronzenTime = systemConfigService.getValueByKey(Constants.CONFIG_KEY_STORE_BROKERAGE_EXTRACT_TIME);
// 生成佣金记录
List<UserBrokerageRecord> 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<StoreOrderInfoVo> 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<MyRecord> getSpreadRecordList(Integer spreadUid) {
List<MyRecord> 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 订单 * @param storeOrder 订单
@@ -647,17 +838,48 @@ public class OrderPayServiceImpl extends PayService implements OrderPayService {
} }
/** /**
* 发送模板消息通知 * 发送消息通知
* 根据用户类型发送
* 公众号模板消息
* 小程序订阅消息
*/ */
private void pushTempMessageOrder(StoreOrder storeOrder) { private void pushMessageOrder(StoreOrder storeOrder, User user) {
// 小程序发送订阅消息 if (user.getUserType().equals(UserConstants.USER_TYPE_H5)) {
String storeNameAndCarNumString = orderUtils.getStoreNameAndCarNumString(storeOrder.getId()); return;
if(StringUtils.isNotBlank(storeNameAndCarNumString)){
WechatSendMessageForPaySuccess paySuccess = new WechatSendMessageForPaySuccess(
storeOrder.getId()+"",storeOrder.getPayPrice()+"",storeOrder.getPayTime()+"","暂无",
storeOrder.getTotalPrice()+"",storeNameAndCarNumString);
orderUtils.sendWeiChatMiniMessageForPaySuccess(paySuccess, userService.getById(storeOrder).getUid());
} }
UserToken userToken;
HashMap<String, String> 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){ if(null == orders){
return; return;
} }
List<StoreCouponUser> couponUserList = CollUtil.newArrayList();
Map<Integer, Boolean> couponMap = CollUtil.newHashMap();
for (StoreOrderInfoVo order : orders) { for (StoreOrderInfoVo order : orders) {
List<StoreProductCoupon> couponsForGiveUser = storeProductCouponService.getListByProductId(order.getProductId()); List<StoreProductCoupon> couponsForGiveUser = storeProductCouponService.getListByProductId(order.getProductId());
User currentUser = userService.getById(storeOrder.getUid()); // User currentUser = userService.getById(storeOrder.getUid());
for (StoreProductCoupon storeProductCoupon : couponsForGiveUser) { // for (StoreProductCoupon storeProductCoupon : couponsForGiveUser) {
StoreCouponUserRequest crp = new StoreCouponUserRequest(); // StoreCouponUserRequest crp = new StoreCouponUserRequest();
crp.setUid(currentUser.getUid()+""); // crp.setUid(currentUser.getUid()+"");
crp.setCouponId(storeProductCoupon.getIssueCouponId()); // crp.setCouponId(storeProductCoupon.getIssueCouponId());
storeCouponUserService.receive(crp); // 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() { private void userBillCreate() {

View File

@@ -1,5 +1,6 @@
package com.zbkj.crmeb.payment.service.impl; package com.zbkj.crmeb.payment.service.impl;
import cn.hutool.core.util.StrUtil;
import com.constants.Constants; import com.constants.Constants;
import com.exception.CrmebException; import com.exception.CrmebException;
import com.utils.DateUtil; 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.payment.wechat.WeChatPayService;
import com.zbkj.crmeb.sms.service.SmsService; import com.zbkj.crmeb.sms.service.SmsService;
import com.zbkj.crmeb.user.model.User; 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.model.UserToken;
import com.zbkj.crmeb.user.request.UserOperateFundsRequest; 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.user.service.UserService;
import com.zbkj.crmeb.wechat.service.TemplateMessageService; import com.zbkj.crmeb.wechat.service.TemplateMessageService;
import lombok.Data; import lombok.Data;
@@ -27,6 +30,7 @@ import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional; import org.springframework.transaction.annotation.Transactional;
import org.springframework.transaction.support.TransactionTemplate; import org.springframework.transaction.support.TransactionTemplate;
import java.math.BigDecimal;
import java.util.HashMap; import java.util.HashMap;
@@ -67,6 +71,9 @@ public class RechargePayServiceImpl extends PayService implements RechargePaySer
@Autowired @Autowired
private TransactionTemplate transactionTemplate; private TransactionTemplate transactionTemplate;
@Autowired
private UserBillService userBillService;
//订单类 //订单类
private UserRecharge userRecharge; private UserRecharge userRecharge;
@@ -155,14 +162,33 @@ public class RechargePayServiceImpl extends PayService implements RechargePaySer
/** /**
* 支付成功处理 * 支付成功处理
* 增加余额userBill记录
* @param userRecharge 充值订单 * @param userRecharge 充值订单
* @param userToken 用户Token
*/ */
@Override @Override
public Boolean paySuccess(UserRecharge userRecharge, UserToken userToken) { public Boolean paySuccess(UserRecharge userRecharge) {
userRecharge.setPaid(true); userRecharge.setPaid(true);
userRecharge.setPayTime(DateUtil.nowDateTime()); 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 userOperateFundsRequest = new UserOperateFundsRequest();
userOperateFundsRequest.setValue(userRecharge.getPrice().add(userRecharge.getGivePrice())); userOperateFundsRequest.setValue(userRecharge.getPrice().add(userRecharge.getGivePrice()));
userOperateFundsRequest.setFoundsType(Constants.USER_BILL_TYPE_PAY_RECHARGE); userOperateFundsRequest.setFoundsType(Constants.USER_BILL_TYPE_PAY_RECHARGE);
@@ -174,15 +200,15 @@ public class RechargePayServiceImpl extends PayService implements RechargePaySer
Boolean execute = transactionTemplate.execute(e -> { Boolean execute = transactionTemplate.execute(e -> {
// 订单变动 // 订单变动
userRechargeService.updateById(userRecharge); userRechargeService.updateById(userRecharge);
//余额变动 // 余额变动
userService.updateFounds(userOperateFundsRequest, true); userService.operationNowMoney(user.getUid(), payPrice, user.getNowMoney(), "add");
//增加经验、积分 // 创建记录
userService.consumeAfterUpdateUserFounds(userRecharge.getUid(), userRecharge.getPrice(), Constants.USER_BILL_TYPE_PAY_RECHARGE); userBillService.save(userBill);
return Boolean.TRUE; return Boolean.TRUE;
}); });
if (execute) { if (execute) {
//下发模板通知 //下发模板通知
pushTempMessageRecharge(userRecharge); // pushTempMessageRecharge(userRecharge);
} }
return execute; return execute;
} }

View File

@@ -1,5 +1,6 @@
package com.zbkj.crmeb.payment.wechat; 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.CreateOrderResponseVo;
import com.zbkj.crmeb.payment.vo.wechat.PayParamsVo; import com.zbkj.crmeb.payment.vo.wechat.PayParamsVo;
import com.zbkj.crmeb.store.model.StoreOrder; import com.zbkj.crmeb.store.model.StoreOrder;
@@ -35,4 +36,12 @@ public interface WeChatPayService {
* @return * @return
*/ */
Boolean queryPayResult(String orderNo); Boolean queryPayResult(String orderNo);
/**
* 微信充值预下单接口
* @param userRecharge 充值订单
* @param clientIp ip
* @return 获取wechat.requestPayment()参数
*/
Map<String, String> unifiedRecharge(UserRecharge userRecharge, String clientIp);
} }

View File

@@ -1,6 +1,7 @@
package com.zbkj.crmeb.payment.wechat.impl; package com.zbkj.crmeb.payment.wechat.impl;
import cn.hutool.core.collection.CollUtil; import cn.hutool.core.collection.CollUtil;
import cn.hutool.core.date.DateTime;
import cn.hutool.core.util.ObjectUtil; import cn.hutool.core.util.ObjectUtil;
import cn.hutool.core.util.StrUtil; import cn.hutool.core.util.StrUtil;
import com.alibaba.fastjson.JSONObject; import com.alibaba.fastjson.JSONObject;
@@ -10,6 +11,13 @@ import com.constants.PayConstants;
import com.constants.WeChatConstants; import com.constants.WeChatConstants;
import com.exception.CrmebException; import com.exception.CrmebException;
import com.utils.*; 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.vo.wechat.*;
import com.zbkj.crmeb.payment.wechat.WeChatPayService; import com.zbkj.crmeb.payment.wechat.WeChatPayService;
import com.zbkj.crmeb.store.model.StoreOrder; import com.zbkj.crmeb.store.model.StoreOrder;
@@ -87,6 +95,18 @@ public class WeChatPayServiceImpl implements WeChatPayService {
@Autowired @Autowired
private UserService userService; private UserService userService;
@Autowired
private UserRechargeService userRechargeService;
@Autowired
private RechargePayService rechargePayService;
@Autowired
private StoreCombinationService storeCombinationService;
@Autowired
private StorePinkService storePinkService;
/** /**
* 统一下单 * 统一下单
* @param payParamsVo PayParamsVo 支付参数 * @param payParamsVo PayParamsVo 支付参数
@@ -343,66 +363,227 @@ public class WeChatPayServiceImpl implements WeChatPayService {
if (StrUtil.isBlank(orderNo)) { if (StrUtil.isBlank(orderNo)) {
throw new CrmebException("订单编号不能为空"); throw new CrmebException("订单编号不能为空");
} }
StoreOrder storeOrder = storeOrderService.getByOderId(orderNo); // 切割字符串,判断是支付订单还是充值订单
if (ObjectUtil.isNull(storeOrder)) { String pre = StrUtil.subPre(orderNo, 5);
throw new CrmebException("订单不存在"); if (pre.equals("order")) {// 支付订单
} StoreOrder storeOrder = storeOrderService.getByOderId(orderNo);
if (storeOrder.getIsDel()) { if (ObjectUtil.isNull(storeOrder)) {
throw new CrmebException("订单已被删除"); throw new CrmebException("订单不存在");
} }
if (!storeOrder.getPayType().equals(PayConstants.PAY_TYPE_WE_CHAT)) { if (storeOrder.getIsDel()) {
throw new CrmebException("不是微信支付类型订单,请重新选择支付方式"); throw new CrmebException("订单已被删除");
} }
if (!storeOrder.getPayType().equals(PayConstants.PAY_TYPE_WE_CHAT)) {
throw new CrmebException("不是微信支付类型订单,请重新选择支付方式");
}
if (storeOrder.getPaid()) { if (storeOrder.getPaid()) {
// throw new CrmebException("订单已支付"); // 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<String, String> 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; 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<String, String> 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<String, String> 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 // 获取appid、mch_id
// 微信签名key // 微信签名key
String appId = ""; String appId = "";
String mchId = ""; String mchId = "";
String signKey = ""; 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); appId = systemConfigService.getValueByKeyException(Constants.CONFIG_KEY_PAY_WE_CHAT_APP_ID);
mchId = systemConfigService.getValueByKeyException(Constants.CONFIG_KEY_PAY_WE_CHAT_MCH_ID); mchId = systemConfigService.getValueByKeyException(Constants.CONFIG_KEY_PAY_WE_CHAT_MCH_ID);
signKey = systemConfigService.getValueByKeyException(Constants.CONFIG_KEY_PAY_WE_CHAT_APP_KEY); 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); appId = systemConfigService.getValueByKeyException(Constants.CONFIG_KEY_PAY_ROUTINE_APP_ID);
mchId = systemConfigService.getValueByKeyException(Constants.CONFIG_KEY_PAY_ROUTINE_MCH_ID); mchId = systemConfigService.getValueByKeyException(Constants.CONFIG_KEY_PAY_ROUTINE_MCH_ID);
signKey = systemConfigService.getValueByKeyException(Constants.CONFIG_KEY_PAY_ROUTINE_APP_KEY); signKey = systemConfigService.getValueByKeyException(Constants.CONFIG_KEY_PAY_ROUTINE_APP_KEY);
} }
if (storeOrder.getIsChannel() == 2) {// H5 if (userRecharge.getRechargeType().equals(PayConstants.PAY_CHANNEL_WE_CHAT_H5)) {// H5,使用公众号的
appId = systemConfigService.getValueByKeyException(Constants.CONFIG_KEY_PAY_ROUTINE_APP_ID); appId = systemConfigService.getValueByKeyException(Constants.CONFIG_KEY_PAY_WE_CHAT_APP_ID);
mchId = systemConfigService.getValueByKeyException(Constants.CONFIG_KEY_PAY_ROUTINE_MCH_ID); mchId = systemConfigService.getValueByKeyException(Constants.CONFIG_KEY_PAY_WE_CHAT_MCH_ID);
signKey = systemConfigService.getValueByKeyException(Constants.CONFIG_KEY_PAY_ROUTINE_APP_KEY); signKey = systemConfigService.getValueByKeyException(Constants.CONFIG_KEY_PAY_WE_CHAT_APP_KEY);
} }
// 生成查询订单对象 // 获取微信预下单对象
Map<String, String> payVo = getWxChantQueryPayVo(orderNo, appId, mchId, signKey); CreateOrderRequestVo unifiedorderVo = getUnifiedorderVo(userRecharge, userToken.getToken(), clientIp, appId, mchId, signKey);
// 查询订单信息 // 预下单
MyRecord record = orderPayQuery(payVo); CreateOrderResponseVo responseVo = unifiedOrder(unifiedorderVo);
Boolean updatePaid = transactionTemplate.execute(e -> { // 组装前端预下单参数
storeOrderService.updatePaid(orderNo); Map<String, String> map = new HashMap<>();
if (storeOrder.getUseIntegral() > 0) { map.put("appId", unifiedorderVo.getAppid());
userService.updateIntegral(user, storeOrder.getUseIntegral(), "sub"); map.put("nonceStr", WxPayUtil.getNonceStr());
} map.put("package", "prepay_id=".concat(responseVo.getPrepayId()));
return Boolean.TRUE; map.put("signType", unifiedorderVo.getSign_type());
}); map.put("timeStamp", Long.toString(WxPayUtil.getCurrentTimestamp()));
String paySign = WxPayUtil.getSign(map, signKey);
if (!updatePaid) { map.put("paySign", paySign);
throw new CrmebException("支付成功更新订单失败"); if (userRecharge.getRechargeType().equals(PayConstants.PAY_CHANNEL_WE_CHAT_H5)) {
map.put("mweb_url", responseVo.getMWebUrl());
} }
// 添加支付成功task return map;
redisUtil.lPush(Constants.ORDER_TASK_PAY_SUCCESS_AFTER, orderNo);
return Boolean.TRUE;
} }
private MyRecord orderPayQuery(Map<String, String> payVo) { private MyRecord orderPayQuery(Map<String, String> payVo) {
@@ -416,13 +597,17 @@ public class WeChatPayServiceImpl implements WeChatPayService {
throw new CrmebException("微信订单查询失败!"); throw new CrmebException("微信订单查询失败!");
} }
record.setColums(map); record.setColums(map);
if(record.getStr("return_code").toUpperCase().equals("FAIL")){ if (record.getStr("return_code").toUpperCase().equals("FAIL")){
throw new CrmebException("微信下单失败1" + record.getStr("return_msg")); throw new CrmebException("微信订单查询失败1" + record.getStr("return_msg"));
} }
if(record.getStr("result_code").toUpperCase().equals("FAIL")){ if (record.getStr("result_code").toUpperCase().equals("FAIL")){
throw new CrmebException("微信下单失败2" + record.getStr("err_code_des")); 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; return record;
} catch (Exception e) { } catch (Exception e) {
e.printStackTrace(); e.printStackTrace();
@@ -487,6 +672,48 @@ public class WeChatPayServiceImpl implements WeChatPayService {
return vo; 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;
}
/** /**
* 作用:统一下单<br> * 作用:统一下单<br>
* 场景公共号支付、扫码支付、APP支付 * 场景公共号支付、扫码支付、APP支付

View File

@@ -7,9 +7,13 @@ import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod; import org.springframework.web.bind.annotation.RequestMethod;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.RestController; import org.springframework.web.bind.annotation.RestController;
import javax.servlet.http.HttpServletRequest; 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){ public String webHook(HttpServletRequest request){
return weChatMessageService.init(request); return weChatMessageService.init(request);
} }
//微信推送地址验证
// @RequestMapping(value = { "/webHook" }, method = RequestMethod.GET) /**
// private void webHook( * 微信推送地址验证
// @RequestParam(value = "signature", required = false) String signature, * @param signature
// @RequestParam(value = "timestamp", required = false) String timestamp, * @param timestamp
// @RequestParam(value = "nonce", required = false) String nonce, * @param nonce
// @RequestParam(value = "echostr") String echostr, * @param echostr
// HttpServletResponse response) throws IOException { * @param response
// PrintWriter writer = response.getWriter(); * @throws IOException
// writer.print(echostr); */
// writer.flush(); @RequestMapping(value = { "/webHook" }, method = RequestMethod.GET)
// writer.close(); 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();
}
} }

View File

@@ -63,7 +63,7 @@ public class StoreSeckillMangerController {
StoreSeckillManger storeSeckillManger = new StoreSeckillManger(); StoreSeckillManger storeSeckillManger = new StoreSeckillManger();
BeanUtils.copyProperties(request, storeSeckillManger); BeanUtils.copyProperties(request, storeSeckillManger);
// 对request中的time做分割后赋值给mode中的start和end属性 // 对request中的time做分割后赋值给mode中的start和end属性
setTimeRangeFromRequest(request, storeSeckillManger); storeSeckillMangerService.setTimeRangeFromRequest(request, storeSeckillManger);
CommonPage<StoreSeckillManagerResponse> storeSeckillMangerCommonPage = CommonPage<StoreSeckillManagerResponse> storeSeckillMangerCommonPage =
CommonPage.restPage(storeSeckillMangerService.getList(storeSeckillManger, pageParamRequest)); CommonPage.restPage(storeSeckillMangerService.getList(storeSeckillManger, pageParamRequest));
return CommonResult.success(storeSeckillMangerCommonPage); return CommonResult.success(storeSeckillMangerCommonPage);
@@ -81,7 +81,7 @@ public class StoreSeckillMangerController {
StoreSeckillManger storeSeckillManger = new StoreSeckillManger(); StoreSeckillManger storeSeckillManger = new StoreSeckillManger();
BeanUtils.copyProperties(storeSeckillMangerRequest, storeSeckillManger); BeanUtils.copyProperties(storeSeckillMangerRequest, storeSeckillManger);
// 对request中的time做分割后赋值给mode中的start和end属性 // 对request中的time做分割后赋值给mode中的start和end属性
setTimeRangeFromRequest(storeSeckillMangerRequest, storeSeckillManger); storeSeckillMangerService.setTimeRangeFromRequest(storeSeckillMangerRequest, storeSeckillManger);
List<StoreSeckillManger> storeSeckillMangers = storeSeckillMangerService.checkTimeRangeUnique(storeSeckillManger); List<StoreSeckillManger> storeSeckillMangers = storeSeckillMangerService.checkTimeRangeUnique(storeSeckillManger);
if(storeSeckillMangers.size() > 0){ if(storeSeckillMangers.size() > 0){
throw new CrmebException("当前时间段的秒杀配置已存在"); throw new CrmebException("当前时间段的秒杀配置已存在");
@@ -122,29 +122,7 @@ public class StoreSeckillMangerController {
@ApiOperation(value = "修改") @ApiOperation(value = "修改")
@RequestMapping(value = "/update", method = RequestMethod.POST) @RequestMapping(value = "/update", method = RequestMethod.POST)
public CommonResult<String> update(@RequestParam Integer id, @RequestBody @Validated StoreSeckillMangerRequest storeSeckillMangerRequest){ public CommonResult<String> update(@RequestParam Integer id, @RequestBody @Validated StoreSeckillMangerRequest storeSeckillMangerRequest){
StoreSeckillManger storeSeckillManger = new StoreSeckillManger(); return storeSeckillMangerService.update(id,storeSeckillMangerRequest) ? CommonResult.success() : CommonResult.failed();
BeanUtils.copyProperties(storeSeckillMangerRequest, storeSeckillManger);
storeSeckillManger.setId(id);
// 对request中的time做分割后赋值给mode中的start和end属性
setTimeRangeFromRequest(storeSeckillMangerRequest, storeSeckillManger);
List<StoreSeckillManger> 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();
} }
/** /**
@@ -176,38 +154,7 @@ public class StoreSeckillMangerController {
return CommonResult.success(storeSeckillMangerService.updateStatus(id,status)); 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("时间参数不正确 例如:0100,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);
}
} }

View File

@@ -3,7 +3,11 @@ package com.zbkj.crmeb.seckill.service;
import com.baomidou.mybatisplus.extension.service.IService; import com.baomidou.mybatisplus.extension.service.IService;
import com.common.PageParamRequest; import com.common.PageParamRequest;
import com.zbkj.crmeb.seckill.model.StoreSeckillManger; 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.response.StoreSeckillManagerResponse;
import org.springframework.validation.annotation.Validated;
import org.springframework.web.bind.annotation.RequestBody;
import java.util.List; import java.util.List;
@@ -64,4 +68,14 @@ public interface StoreSeckillMangerService extends IService<StoreSeckillManger>
* @return 结果 * @return 结果
*/ */
boolean updateStatus(int id, boolean status); boolean updateStatus(int id, boolean status);
}
/**
* 更新秒杀配置
* @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);
}

View File

@@ -1,9 +1,12 @@
package com.zbkj.crmeb.seckill.service.impl; 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.conditions.update.LambdaUpdateWrapper;
import com.baomidou.mybatisplus.core.toolkit.StringUtils; import com.baomidou.mybatisplus.core.toolkit.StringUtils;
import com.baomidou.mybatisplus.core.toolkit.Wrappers; import com.baomidou.mybatisplus.core.toolkit.Wrappers;
import com.common.CommonResult;
import com.common.PageParamRequest; import com.common.PageParamRequest;
import com.exception.CrmebException;
import com.github.pagehelper.PageHelper; import com.github.pagehelper.PageHelper;
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; 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.utils.DateUtil;
import com.zbkj.crmeb.seckill.dao.StoreSeckillMangerDao; import com.zbkj.crmeb.seckill.dao.StoreSeckillMangerDao;
import com.zbkj.crmeb.seckill.model.StoreSeckillManger; 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.request.StoreSeckillMangerSearchRequest;
import com.zbkj.crmeb.seckill.response.StoreSeckillManagerResponse; import com.zbkj.crmeb.seckill.response.StoreSeckillManagerResponse;
import com.zbkj.crmeb.seckill.service.StoreSeckillMangerService; 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.BeanUtils;
import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service; import org.springframework.stereotype.Service;
import org.springframework.validation.annotation.Validated;
import org.springframework.web.bind.annotation.RequestBody;
import javax.annotation.Resource; import javax.annotation.Resource;
import java.util.ArrayList; import java.util.ArrayList;
@@ -172,6 +178,52 @@ public class StoreSeckillMangerServiceImpl extends ServiceImpl<StoreSeckillMange
return dao.updateById(ssm) > 0; return dao.updateById(ssm) > 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<StoreSeckillManger> 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<StoreSeckillManger> startAndEndExcuseQuery = Wrappers.lambdaQuery();
startAndEndExcuseQuery.ge(StoreSeckillManger::getStartTime,storeSeckillManger.getStartTime())
.or()
.le(StoreSeckillManger::getEndTime,storeSeckillManger.getEndTime());
List<StoreSeckillManger> 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 对前端输出一致 // 列表用 格式化time 对前端输出一致
@@ -192,5 +244,40 @@ public class StoreSeckillMangerServiceImpl extends ServiceImpl<StoreSeckillMange
String endTime = pEndTime.length() == 1? "0"+pEndTime:pEndTime; String endTime = pEndTime.length() == 1? "0"+pEndTime:pEndTime;
r.setTime(startTime+":00,"+endTime+":00"); r.setTime(startTime+":00,"+endTime+":00");
} }
/**
* 兼容时间参数 request中String格式 mode中Integer
* @param storeSeckillMangerRequest request参数
* @param storeSeckillManger 秒杀配置实体
*/
@Override
public 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 秒杀配置实体
*/
@Override
public void setTimeRangeFromRequest(@Validated @RequestBody StoreSeckillMangerSearchRequest request, StoreSeckillManger storeSeckillManger) {
if(null == request.getTime()) return;
if(!request.getTime().contains(",")){
throw new CrmebException("时间参数不正确 例如:0100,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);
}
} }

View File

@@ -87,21 +87,21 @@ public class SmsRecordController {
return CommonResult.success(smsService.applys(type, pageParamRequest)); return CommonResult.success(smsService.applys(type, pageParamRequest));
} }
/** // /**
* 发送短信 // * 发送短信
* @param phone 手机号码 // * @param phone 手机号码
* @return 发送是否成功 // * @return 发送是否成功
*/ // */
@ApiOperation(value = " 发送短信") // @ApiOperation(value = " 发送短信")
@RequestMapping(value = "/sendCode", method = RequestMethod.POST) // @RequestMapping(value = "/sendCode", method = RequestMethod.POST)
@ApiImplicitParams({ // @ApiImplicitParams({
@ApiImplicitParam(name="phone", value="手机号码", required = true) // @ApiImplicitParam(name="phone", value="手机号码", required = true)
}) // })
public CommonResult<Object> sendCode(@RequestParam String phone){ // public CommonResult<Object> sendCode(@RequestParam String phone){
ValidateFormUtil.isPhone(phone,"手机号码错误"); // ValidateFormUtil.isPhone(phone,"手机号码错误");
boolean codeResult = smsService.pushCodeToList(phone,1, null); // boolean codeResult = smsService.pushCodeToList(phone,1, null);
return codeResult ? CommonResult.success("短信加入发送队列成功"):CommonResult.failed("短信加入发送队列失败"); // return codeResult ? CommonResult.success("短信加入发送队列成功"):CommonResult.failed("短信加入发送队列失败");
} // }
} }

View File

@@ -6,6 +6,7 @@ import com.zbkj.crmeb.sms.request.SendSmsVo;
import com.zbkj.crmeb.sms.request.SmsApplyTempRequest; import com.zbkj.crmeb.sms.request.SmsApplyTempRequest;
import com.zbkj.crmeb.sms.request.SmsModifySignRequest; import com.zbkj.crmeb.sms.request.SmsModifySignRequest;
import java.math.BigDecimal;
import java.util.HashMap; import java.util.HashMap;
/** /**
@@ -20,41 +21,98 @@ import java.util.HashMap;
* | Author: CRMEB Team <admin@crmeb.com> * | Author: CRMEB Team <admin@crmeb.com>
* +---------------------------------------------------------------------- * +----------------------------------------------------------------------
*/ */
public interface SmsService{ public interface SmsService {
/** void push(String phone, String tempKey, Integer msgTempId, HashMap<String, Object> mapPram);
* 发送短信到短信列表
*/
Boolean pushCodeToList(String phone, Integer tag,HashMap<String, Object> pram);
void push(String phone,String tempKey,Integer msgTempId,boolean valid, HashMap<String,Object> mapPram);
void consume(); void consume();
boolean sendCode(SendSmsVo sendSmsVo); Boolean sendCode(SendSmsVo sendSmsVo);
/** /**
* 修改签名 * 修改签名
* @return
*/ */
Boolean modifySign(SmsModifySignRequest request); Boolean modifySign(SmsModifySignRequest request);
/** /**
* 短信模板 * 短信模板
* @return
*/ */
MyRecord temps(PageParamRequest pageParamRequest); MyRecord temps(PageParamRequest pageParamRequest);
/** /**
* 申请模板消息 * 申请模板消息
* @return
*/ */
Boolean applyTempMessage(SmsApplyTempRequest request); Boolean applyTempMessage(SmsApplyTempRequest request);
/** /**
* 模板申请记录 * 模板申请记录
*
* @param type (1=验证码 2=通知 3=推广) * @param type (1=验证码 2=通知 3=推广)
* @return
*/ */
MyRecord applys(Integer type, PageParamRequest pageParamRequest); 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);
} }

View File

@@ -32,6 +32,7 @@ import org.springframework.transaction.annotation.Transactional;
import org.springframework.util.LinkedMultiValueMap; import org.springframework.util.LinkedMultiValueMap;
import org.springframework.util.MultiValueMap; import org.springframework.util.MultiValueMap;
import java.math.BigDecimal;
import java.util.HashMap; import java.util.HashMap;
import java.util.List; import java.util.List;
import java.util.Map; import java.util.Map;
@@ -50,7 +51,6 @@ import java.util.stream.Collectors;
* | Author: CRMEB Team <admin@crmeb.com> * | Author: CRMEB Team <admin@crmeb.com>
* +---------------------------------------------------------------------- * +----------------------------------------------------------------------
*/ */
@Data
@Service @Service
public class SmsServiceImpl implements SmsService { public class SmsServiceImpl implements SmsService {
@@ -78,72 +78,71 @@ public class SmsServiceImpl implements SmsService {
* 添加到短信队列 * 添加到短信队列
* 验证码特殊处理其他的参数自行根据要求处理 * 验证码特殊处理其他的参数自行根据要求处理
* 参数处理逻辑 {code:value,code1:value1} * 参数处理逻辑 {code:value,code1:value1}
*
* @param phone String 手机号码 * @param phone String 手机号码
* @return boolean * @return boolean
* @author Mr.Zhang
* @since 2020-04-16
*/ */
@Override private Boolean pushCodeToList(String phone, Integer tag, HashMap<String, Object> pram) {
public Boolean pushCodeToList(String phone, Integer tag, HashMap<String, Object> pram) {
//发送手机验证码, 记录到redis sms_validate_code_手机号 //发送手机验证码, 记录到redis sms_validate_code_手机号
switch (tag) { switch (tag) {
case SmsConstants.SMS_CONFIG_TYPE_VERIFICATION_CODE: // 验证码 特殊处理 code case SmsConstants.SMS_CONFIG_TYPE_VERIFICATION_CODE: // 验证码 特殊处理 code
//获取短信验证码过期时间 //获取短信验证码过期时间
String codeExpireStr = systemConfigService.getValueByKey(Constants.CONFIG_KEY_SMS_CODE_EXPIRE); String codeExpireStr = systemConfigService.getValueByKey(Constants.CONFIG_KEY_SMS_CODE_EXPIRE);
if (StringUtils.isBlank(codeExpireStr) || Integer.parseInt(codeExpireStr) == 0) { if (StringUtils.isBlank(codeExpireStr) || Integer.parseInt(codeExpireStr) == 0) {
codeExpireStr = Constants.NUM_FIVE + ""; codeExpireStr = Constants.NUM_FIVE + "";// 默认5分钟过期
} }
Integer code = CrmebUtil.randomCount(111111, 999999); Integer code = CrmebUtil.randomCount(111111, 999999);
HashMap<String, Object> justPram = new HashMap<>(); HashMap<String, Object> justPram = new HashMap<>();
justPram.put("code", code); justPram.put("code", code);
justPram.put("time", codeExpireStr);
push(phone, SmsConstants.SMS_CONFIG_VERIFICATION_CODE, push(phone, SmsConstants.SMS_CONFIG_VERIFICATION_CODE,
SmsConstants.SMS_CONFIG_VERIFICATION_CODE_TEMP_ID, false, justPram); SmsConstants.SMS_CONFIG_VERIFICATION_CODE_TEMP_ID, justPram);
redisUtil.set(userService.getValidateCodeRedisKey(phone), code, Long.valueOf(codeExpireStr), TimeUnit.MINUTES);//5分钟过期
// 将验证码存入redis
redisUtil.set(userService.getValidateCodeRedisKey(phone), code, Long.valueOf(codeExpireStr), TimeUnit.MINUTES);
break; break;
case SmsConstants.SMS_CONFIG_TYPE_LOWER_ORDER_SWITCH: // 支付成功短信提醒 pay_price order_id case SmsConstants.SMS_CONFIG_TYPE_LOWER_ORDER_SWITCH: // 支付成功短信提醒 pay_price order_id
push(phone, SmsConstants.SMS_CONFIG_LOWER_ORDER_SWITCH, 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; break;
case SmsConstants.SMS_CONFIG_TYPE_DELIVER_GOODS_SWITCH: // 发货短信提醒 nickname store_name case SmsConstants.SMS_CONFIG_TYPE_DELIVER_GOODS_SWITCH: // 发货短信提醒 nickname store_name
push(phone, SmsConstants.SMS_CONFIG_DELIVER_GOODS_SWITCH, 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; break;
case SmsConstants.SMS_CONFIG_TYPE_CONFIRM_TAKE_OVER_SWITCH: // 确认收货短信提醒 order_id store_name case SmsConstants.SMS_CONFIG_TYPE_CONFIRM_TAKE_OVER_SWITCH: // 确认收货短信提醒 order_id store_name
push(phone, SmsConstants.SMS_CONFIG_CONFIRM_TAKE_OVER_SWITCH, 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; break;
case SmsConstants.SMS_CONFIG_TYPE_ADMIN_LOWER_ORDER_SWITCH: // 用户下单管理员短信提醒 admin_name order_id case SmsConstants.SMS_CONFIG_TYPE_ADMIN_LOWER_ORDER_SWITCH: // 用户下单管理员短信提醒 admin_name order_id
push(phone, SmsConstants.SMS_CONFIG_ADMIN_LOWER_ORDER_SWITCH, 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; break;
case SmsConstants.SMS_CONFIG_TYPE_ADMIN_PAY_SUCCESS_SWITCH: // 支付成功管理员短信提醒 admin_name order_id case SmsConstants.SMS_CONFIG_TYPE_ADMIN_PAY_SUCCESS_SWITCH: // 支付成功管理员短信提醒 admin_name order_id
push(phone, SmsConstants.SMS_CONFIG_ADMIN_PAY_SUCCESS_SWITCH, 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; break;
case SmsConstants.SMS_CONFIG_TYPE_ADMIN_REFUND_SWITCH: // 用户确认收货管理员短信提醒 admin_name order_id case SmsConstants.SMS_CONFIG_TYPE_ADMIN_REFUND_SWITCH: // 用户确认收货管理员短信提醒 admin_name order_id
push(phone, SmsConstants.SMS_CONFIG_ADMIN_REFUND_SWITCH, 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; break;
case SmsConstants.SMS_CONFIG_TYPE_ADMIN_CONFIRM_TAKE_OVER_SWITCH: // 用户发起退款管理员短信提醒 admin_name order_id case SmsConstants.SMS_CONFIG_TYPE_ADMIN_CONFIRM_TAKE_OVER_SWITCH: // 用户发起退款管理员短信提醒 admin_name order_id
push(phone, SmsConstants.SMS_CONFIG_ADMIN_CONFIRM_TAKE_OVER_SWITCH, 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; break;
case SmsConstants.SMS_CONFIG_TYPE_PRICE_REVISION_SWITCH: // 改价短信提醒 order_id pay_price case SmsConstants.SMS_CONFIG_TYPE_PRICE_REVISION_SWITCH: // 改价短信提醒 order_id pay_price
push(phone, SmsConstants.SMS_CONFIG_PRICE_REVISION_SWITCH, 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; break;
case SmsConstants.SMS_CONFIG_TYPE_ORDER_PAY_FALSE: // 订单未支付 order_id case SmsConstants.SMS_CONFIG_TYPE_ORDER_PAY_FALSE: // 订单未支付 order_id
push(phone, SmsConstants.SMS_CONFIG_ORDER_PAY_FALSE, 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; break;
} }
return true; return true;
} }
@Override @Override
public boolean sendCode(SendSmsVo sendSmsVo) { public Boolean sendCode(SendSmsVo sendSmsVo) {
String result; String result;
try { try {
String token = onePassUtil.getToken(); String token = onePassUtil.getToken();
@@ -154,7 +153,7 @@ public class SmsServiceImpl implements SmsService {
param.add("phone", sendSmsVo.getMobile()); param.add("phone", sendSmsVo.getMobile());
param.add("temp_id", sendSmsVo.getTemplate()); param.add("temp_id", sendSmsVo.getTemplate());
map.entrySet().stream().forEach(entry -> param.add(StrUtil.format(SmsConstants.SMS_COMMON_PARAM_FORMAT, entry.getKey()), entry.getValue())); 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); result = restTemplateUtil.postFromUrlencoded(OnePassConstants.ONE_PASS_API_URL + OnePassConstants.ONE_PASS_API_SEND_URI, param, header);
} catch (Exception e) { } catch (Exception e) {
//接口请求异常,需要重新发送 //接口请求异常,需要重新发送
@@ -227,9 +226,14 @@ public class SmsServiceImpl implements SmsService {
/** /**
* 添加待发送消息到redis队列 * 添加待发送消息到redis队列
*
* @param phone 手机号
* @param tempKey 模板key
* @param msgTempId 模板id
* @param mapPram 参数map
*/ */
@Override @Override
public void push(String phone, String tempKey, Integer msgTempId, boolean valid, HashMap<String, Object> mapPram) { public void push(String phone, String tempKey, Integer msgTempId, HashMap<String, Object> mapPram) {
if (StringUtils.isBlank(phone) || StringUtils.isBlank(tempKey) || msgTempId <= 0) { if (StringUtils.isBlank(phone) || StringUtils.isBlank(tempKey) || msgTempId <= 0) {
return; return;
} }
@@ -242,14 +246,7 @@ public class SmsServiceImpl implements SmsService {
mParam.put("template", msgTempId); mParam.put("template", msgTempId);
mParam.put("param", JSONObject.toJSONString(mapPram)); mParam.put("param", JSONObject.toJSONString(mapPram));
if (!valid) { redisUtil.lPush(SmsConstants.SMS_SEND_KEY, JSONObject.toJSONString(mParam));
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));
}
} }
/** /**
@@ -329,7 +326,7 @@ public class SmsServiceImpl implements SmsService {
/** /**
* 模板申请记录 * 模板申请记录
* *
* @param type (1=验证码 2=通知 3=推广) * @param type (1=验证码 2=通知 3=推广)
*/ */
@Override @Override
public MyRecord applys(Integer type, PageParamRequest pageParamRequest) { public MyRecord applys(Integer type, PageParamRequest pageParamRequest) {
@@ -371,6 +368,123 @@ public class SmsServiceImpl implements SmsService {
return myRecord; 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<String, Object> 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<String, Object> 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<String, Object> 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<String, Object> 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<String, Object> 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<String, Object> 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<String, Object> 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表单模式提交 * post请求from表单模式提交
*/ */

View File

@@ -3,17 +3,13 @@ package com.zbkj.crmeb.store.controller;
import com.common.CommonPage; import com.common.CommonPage;
import com.common.CommonResult; import com.common.CommonResult;
import com.common.PageParamRequest; 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.model.StoreOrder;
import com.zbkj.crmeb.store.request.RetailShopRequest; import com.zbkj.crmeb.store.request.RetailShopRequest;
import com.zbkj.crmeb.store.request.RetailShopStairUserRequest; import com.zbkj.crmeb.store.request.RetailShopStairUserRequest;
import com.zbkj.crmeb.store.response.RetailShopStatisticsResponse; 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.RetailShopService;
import com.zbkj.crmeb.store.service.StoreOrderService;
import com.zbkj.crmeb.user.model.User; 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 com.zbkj.crmeb.user.service.UserService;
import io.swagger.annotations.Api; import io.swagger.annotations.Api;
import io.swagger.annotations.ApiImplicitParam; 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.validation.annotation.Validated;
import org.springframework.web.bind.annotation.*; 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 @Autowired
private UserService userService; private UserService userService;
@Autowired
private StoreOrderService storeOrderService;
@Autowired
private UserExtractService userExtractService;
/** /**
* 分销列表 * 分销列表
* @param keywords * @param keywords 搜索参数
* @param dateLimit * @param dateLimit 时间参数
* @param pageParamRequest * @param pageParamRequest 分页参数
* @return
*/ */
@ApiOperation(value = "分销列表") @ApiOperation(value = "分销列表")
@RequestMapping(value = "/list", method = RequestMethod.GET) @RequestMapping(value = "/list", method = RequestMethod.GET)
@ApiImplicitParams({ @ApiImplicitParams({
@ApiImplicitParam(name = "keywords", value = "搜索关键字[身份证,手机,昵称,备注等]"), @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/") @ApiImplicitParam(name = "dateLimit", value = "today,yesterday,lately7,lately30,month,year,/yyyy-MM-dd hh:mm:ss,yyyy-MM-dd hh:mm:ss/")
}) })
public CommonResult<CommonPage<RetailShopUserResponse>> getList(@RequestParam(required = false) String keywords, public CommonResult<CommonPage<SpreadUserResponse>> getList(@RequestParam(required = false) String keywords,
@RequestParam(required = false) String dateLimit, @RequestParam(required = false) String dateLimit,
@ModelAttribute PageParamRequest pageParamRequest){ @ModelAttribute PageParamRequest pageParamRequest) {
return CommonResult.success(retailShopService.getList(keywords,dateLimit,pageParamRequest)); return CommonResult.success(retailShopService.getSpreadPeopleList(keywords, dateLimit, pageParamRequest));
} }
/** /**
* 分销头部信息 * 分销头部信息
* @param keywords 搜索参数 * @param keywords 搜索参数
* @param dateLimit 时间参数 * @param dateLimit 时间参数
* @return
*/ */
@ApiOperation(value = "分销头部数据") @ApiOperation(value = "分销头部数据")
@RequestMapping(value = "/statistics", method = RequestMethod.GET) @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/") @ApiImplicitParam(name = "dateLimit", value = "today,yesterday,lately7,lately30,month,year,/yyyy-MM-dd hh:mm:ss,yyyy-MM-dd hh:mm:ss/")
}) })
public CommonResult<RetailShopStatisticsResponse> getStatistics(@RequestParam(required = false) String keywords, public CommonResult<RetailShopStatisticsResponse> getStatistics(@RequestParam(required = false) String keywords,
@RequestParam(required = false) String dateLimit){ @RequestParam(required = false) String dateLimit) {
return CommonResult.success(retailShopService.getAdminStatistics(keywords, dateLimit)); return CommonResult.success(retailShopService.getAdminStatistics(keywords, dateLimit));
} }
/** /**
* 添加推广关系 * 添加推广关系
* @param currentUserId 当前用户id * @param currentUserId 当前用户id
* @param spreadUserId 推广人用户id * @param spreadUserId 推广人用户id
* @return 结果 * @return 结果
*/ */
@ApiOperation(value = "添加推广关系") @ApiOperation(value = "添加推广关系")
@@ -108,35 +91,35 @@ public class RetailShopController {
@ApiImplicitParam(name = "currentUserId", value = "当前用户id"), @ApiImplicitParam(name = "currentUserId", value = "当前用户id"),
@ApiImplicitParam(name = "spreadUserId", value = "推广人id") @ApiImplicitParam(name = "spreadUserId", value = "推广人id")
}) })
public CommonResult<Object> save(Integer currentUserId, Integer spreadUserId){ public CommonResult<Object> save(Integer currentUserId, Integer spreadUserId) {
return CommonResult.success(userService.spread(currentUserId, spreadUserId)); return CommonResult.success(userService.spread(currentUserId, spreadUserId));
} }
/** /**
* 根据用户参数获取推广人列表 * 根据用户参数获取推广人列表
* @param request 查询参数 * @param request 查询参数
* @param pageParamRequest 分页参数 * @param pageParamRequest 分页参数
* @return 查询结果推广人列表 * @return 查询结果推广人列表
*/ */
@ApiOperation(value = "根据条件获取推广人列表") @ApiOperation(value = "根据条件获取推广人列表")
@RequestMapping(value = "/spread/userlist", method = RequestMethod.POST) @RequestMapping(value = "/spread/userlist", method = RequestMethod.POST)
public CommonResult<CommonPage<User>> getUserListBySpreadLevel(@RequestBody @Validated RetailShopStairUserRequest request, public CommonResult<CommonPage<User>> getUserListBySpreadLevel(@RequestBody @Validated RetailShopStairUserRequest request,
@ModelAttribute PageParamRequest pageParamRequest){ @ModelAttribute PageParamRequest pageParamRequest) {
return CommonResult.success(CommonPage.restPage(userService.getUserListBySpreadLevel(request,pageParamRequest))); return CommonResult.success(CommonPage.restPage(userService.getUserListBySpreadLevel(request, pageParamRequest)));
} }
/** /**
* 根据参数获取推广订单列表 * 根据参数获取推广订单列表
* @param request 查询参数 * @param request 查询参数
* @param pageParamRequest 分页参数 * @param pageParamRequest 分页参数
* @return 查询结果推广人订单列表 * @return 查询结果推广人订单列表
*/ */
@ApiOperation(value = "根据条件获取推广人订单") @ApiOperation(value = "根据条件获取推广人订单")
@RequestMapping(value = "/spread/orderlist", method = RequestMethod.POST) @RequestMapping(value = "/spread/orderlist", method = RequestMethod.POST)
public CommonResult<CommonPage<StoreOrder>> getOrdersBySpreadLevel(@RequestBody @Validated RetailShopStairUserRequest request, public CommonResult<CommonPage<StoreOrder>> getOrdersBySpreadLevel(@RequestBody @Validated RetailShopStairUserRequest request,
@ModelAttribute PageParamRequest pageParamRequest){ @ModelAttribute PageParamRequest pageParamRequest) {
return CommonResult.success(CommonPage.restPage(userService.getOrderListBySpreadLevel(request,pageParamRequest))); return CommonResult.success(CommonPage.restPage(userService.getOrderListBySpreadLevel(request, pageParamRequest)));
} }
/** /**
@@ -146,7 +129,7 @@ public class RetailShopController {
*/ */
@ApiOperation(value = "清除上级推广人") @ApiOperation(value = "清除上级推广人")
@RequestMapping(value = "/spread/clean/{id}", method = RequestMethod.GET) @RequestMapping(value = "/spread/clean/{id}", method = RequestMethod.GET)
public CommonResult<Object> clearSpread(@PathVariable Integer id){ public CommonResult<Object> clearSpread(@PathVariable Integer id) {
return CommonResult.success(userService.clearSpread(id)); return CommonResult.success(userService.clearSpread(id));
} }
@@ -156,7 +139,7 @@ public class RetailShopController {
*/ */
@ApiOperation(value = "分销配置信息获取") @ApiOperation(value = "分销配置信息获取")
@RequestMapping(value = "/spread/manage/get", method = RequestMethod.GET) @RequestMapping(value = "/spread/manage/get", method = RequestMethod.GET)
public CommonResult<Object> getSpreadInfo(){ public CommonResult<Object> getSpreadInfo() {
return CommonResult.success(retailShopService.getManageInfo()); return CommonResult.success(retailShopService.getManageInfo());
} }
@@ -167,7 +150,7 @@ public class RetailShopController {
*/ */
@ApiOperation(value = "分销管理信息保存") @ApiOperation(value = "分销管理信息保存")
@RequestMapping(value = "/spread/manage/set", method = RequestMethod.POST) @RequestMapping(value = "/spread/manage/set", method = RequestMethod.POST)
public CommonResult<Object> setSpreadInfo(@RequestBody @Validated RetailShopRequest retailShopRequest){ public CommonResult<Object> setSpreadInfo(@RequestBody @Validated RetailShopRequest retailShopRequest) {
return CommonResult.success(retailShopService.setManageInfo(retailShopRequest)); return CommonResult.success(retailShopService.setManageInfo(retailShopRequest));
} }
} }

View File

@@ -247,15 +247,9 @@ public class StoreOrderController {
* @since 2020-09-01 * @since 2020-09-01
*/ */
@ApiOperation(value = "一键改价") @ApiOperation(value = "一键改价")
@RequestMapping(value = "/editPrice", method = RequestMethod.GET) @RequestMapping(value = "/editPrice", method = RequestMethod.POST)
public CommonResult<Object> editOrderPrice( public CommonResult<Object> editOrderPrice(@RequestBody @Validated StoreOrderEditPriceRequest request){
@RequestParam String orderId, @RequestParam(required = true,defaultValue = "0") BigDecimal price){ return CommonResult.success(storeOrderService.editPrice(request));
try {
if(price.compareTo(BigDecimal.ZERO) < 0) throw new CrmebException("请输入合法参数");
}catch (Exception e){
throw new CrmebException("价格参数错误");
}
return CommonResult.success(storeOrderService.editPrice(orderId,price));
} }
/** /**

View File

@@ -4,6 +4,7 @@ import com.common.CommonPage;
import com.common.CommonResult; import com.common.CommonResult;
import com.common.PageParamRequest; import com.common.PageParamRequest;
import com.zbkj.crmeb.store.model.StoreProduct; 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.StoreProductRequest;
import com.zbkj.crmeb.store.request.StoreProductSearchRequest; import com.zbkj.crmeb.store.request.StoreProductSearchRequest;
import com.zbkj.crmeb.store.request.StoreProductStockRequest; 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 = "上架") @ApiOperation(value = "上架")
@RequestMapping(value = "/putOnShell/{id}", method = RequestMethod.GET) @RequestMapping(value = "/putOnShell/{id}", method = RequestMethod.GET)
public CommonResult<String> putOn(@PathVariable Integer id){ public CommonResult<String> putOn(@PathVariable Integer id){
StoreProduct storeProduct = new StoreProduct(); if(storeProductService.putOnShelf(id)){
storeProduct.setId(id);
storeProduct.setIsShow(true);
if(storeProductService.updateById(storeProduct)){
return CommonResult.success(); return CommonResult.success();
}else{ }else{
return CommonResult.failed(); return CommonResult.failed();
@@ -177,17 +172,11 @@ public class StoreProductController {
/** /**
* 下架 * 下架
* @param id integer id
* @author Mr.Zhang
* @since 2020-05-06
*/ */
@ApiOperation(value = "下架") @ApiOperation(value = "下架")
@RequestMapping(value = "/offShell/{id}", method = RequestMethod.GET) @RequestMapping(value = "/offShell/{id}", method = RequestMethod.GET)
public CommonResult<String> offShell(@PathVariable Integer id){ public CommonResult<String> offShell(@PathVariable Integer id){
StoreProduct storeProduct = storeProductService.getById(id); if(storeProductService.offShelf(id)){
storeProduct.setIsShow(false);
if(storeProductService.updateById(storeProduct)){
storeCartService.productStatusNotEnable(id);
return CommonResult.success(); return CommonResult.success();
}else{ }else{
return CommonResult.failed(); return CommonResult.failed();
@@ -278,9 +267,8 @@ public class StoreProductController {
@ApiOperation(value = "复制平台商品") @ApiOperation(value = "复制平台商品")
@RequestMapping(value = "/copy/product", method = RequestMethod.POST) @RequestMapping(value = "/copy/product", method = RequestMethod.POST)
@ApiImplicitParam(name = "url", value = "URL", dataType = "String", required = true) public CommonResult<Map<String, Object>> copyProduct(@RequestBody @Valid StoreCopyProductRequest request) {
public CommonResult<Map<String, Object>> copyProduct(@RequestParam @Valid String url) { return CommonResult.success(storeProductService.copyProduct(request.getUrl()));
return CommonResult.success(storeProductService.copyProduct(url));
} }
} }

View File

@@ -28,11 +28,11 @@ public class RetailShopRequest {
public RetailShopRequest() { public RetailShopRequest() {
} }
@ApiModelProperty(value = "是否启用分销") @ApiModelProperty(value = "是否启用分销:1-启用0-禁止")
@NotNull(message = "是否启用分销 不能为空") @NotNull(message = "是否启用分销 不能为空")
private String brokerageFuncStatus; private String brokerageFuncStatus;
@ApiModelProperty(value = "分销模式") @ApiModelProperty(value = "分销模式1-指定分销2-人人分销3-满额分销")
@NotNull(message = "分销模式 不能为空") @NotNull(message = "分销模式 不能为空")
private String storeBrokerageStatus; private String storeBrokerageStatus;
@@ -46,7 +46,7 @@ public class RetailShopRequest {
@Range(min = 0, max = 100, message = "二级返佣比例在0-100中选择") @Range(min = 0, max = 100, message = "二级返佣比例在0-100中选择")
private Integer storeBrokerageTwo; private Integer storeBrokerageTwo;
@ApiModelProperty(value = "分销关系绑定") @ApiModelProperty(value = "分销关系绑定:0-所有用户1-新用户")
@NotNull(message = "分销关系绑定 不能为空") @NotNull(message = "分销关系绑定 不能为空")
private String brokerageBindind; private String brokerageBindind;
@@ -64,8 +64,8 @@ public class RetailShopRequest {
@Min(value = 0, message = "冻结时间最少为0天") @Min(value = 0, message = "冻结时间最少为0天")
private Integer extractTime; private Integer extractTime;
@ApiModelProperty(value = "人人分销满足金额") // @ApiModelProperty(value = "满额分销满足金额")
@NotNull(message = "人人分销满足金额 不能为空") // @NotNull(message = "满额分销满足金额 不能为空")
@DecimalMin(value = "0", message = "人人分销满足金额最小为0") // @DecimalMin(value = "0", message = "满额分销满足金额最小为0")
private BigDecimal storeBrokeragePrice; // private BigDecimal storeBrokeragePrice;
} }

View File

@@ -36,10 +36,6 @@ public class RetailShopStairUserRequest {
@Range(min = 0, max = 3, message = "请选择正确的用户类型") @Range(min = 0, max = 3, message = "请选择正确的用户类型")
private Integer type; private Integer type;
// 推广订单中的参数,公用对象
@ApiModelProperty()
private String orderPriceId;
@ApiModelProperty(value = "用户id") @ApiModelProperty(value = "用户id")
@Min(value = 1, message = "用户id不能为空") @Min(value = 1, message = "用户id不能为空")
private Integer uid; private Integer uid;

View File

@@ -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 <admin@crmeb.com>
* +----------------------------------------------------------------------
*/
@Data
@EqualsAndHashCode(callSuper = false)
@Accessors(chain = true)
@ApiModel(value="StoreCopyProductRequest对象", description="复制商品请求对象")
public class StoreCopyProductRequest {
@ApiModelProperty(value = "复制商品地址")
@NotBlank(message = "复制商品地址 不能为空")
private String url;
}

View File

@@ -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 <admin@crmeb.com>
* +----------------------------------------------------------------------
*/
@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;
}

View File

@@ -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 {
}

View File

@@ -26,4 +26,19 @@ package com.zbkj.crmeb.store.service;
void deleteByUser(); void deleteByUser();
void orderPaySuccessAfter(); void orderPaySuccessAfter();
/**
* 自动取消未支付订单
*/
void autoCancel();
/**
* 订单收货
*/
void orderReceiving();
/**
* 订单自动完成
*/
void autoComplete();
} }

View File

@@ -7,8 +7,8 @@ import com.github.pagehelper.PageInfo;
import com.zbkj.crmeb.store.request.RetailShopRequest; import com.zbkj.crmeb.store.request.RetailShopRequest;
import com.zbkj.crmeb.store.request.RetailShopStairUserRequest; import com.zbkj.crmeb.store.request.RetailShopStairUserRequest;
import com.zbkj.crmeb.store.response.RetailShopStatisticsResponse; 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.model.User;
import com.zbkj.crmeb.user.response.SpreadUserResponse;
import com.zbkj.crmeb.user.response.UserResponse; import com.zbkj.crmeb.user.response.UserResponse;
import java.util.List; import java.util.List;
@@ -28,13 +28,13 @@ import java.util.List;
public interface RetailShopService extends IService<User> { public interface RetailShopService extends IService<User> {
/** /**
* 获取分销列表 * 分销列表
* @param keywords * @param keywords 搜索参数
* @param dateLimit * @param dateLimit 时间参数
* @param pageRequest * @param pageRequest 分页参数
* @return * @return
*/ */
CommonPage<RetailShopUserResponse> getList(String keywords, String dateLimit, PageParamRequest pageRequest); CommonPage<SpreadUserResponse> getSpreadPeopleList(String keywords, String dateLimit, PageParamRequest pageRequest);
/** /**
* 获取分销头部数据 * 获取分销头部数据

View File

@@ -27,10 +27,10 @@ public interface StoreCartService extends IService<StoreCart> {
/** /**
* 根据有效标识符获取出数据 * 根据有效标识符获取出数据
* @param pageParamRequest 分页参数 * @param pageParamRequest 分页参数
* @param cart 购物车参数 * @param isValid 是否失效
* @return 购物车列表 * @return 购物车列表
*/ */
List<StoreCartResponse> getList(PageParamRequest pageParamRequest, StoreCart cart, boolean isValid); List<StoreCartResponse> getList(PageParamRequest pageParamRequest, boolean isValid);
/** /**
* 根据用户id和购物车ids查询购物车集合 * 根据用户id和购物车ids查询购物车集合
@@ -93,7 +93,7 @@ public interface StoreCartService extends IService<StoreCart> {
* @param productId 商品id * @param productId 商品id
* @return 跟新结果 * @return 跟新结果
*/ */
boolean productStatusNotEnable(Integer productId); Boolean productStatusNotEnable(Integer productId);
/** /**
* 购物车重选提交 * 购物车重选提交
@@ -101,4 +101,10 @@ public interface StoreCartService extends IService<StoreCart> {
* @return 提交结果 * @return 提交结果
*/ */
boolean resetCart(CartResetRequest resetRequest); boolean resetCart(CartResetRequest resetRequest);
/**
* 对应sku购物车生效
* @param skuIdList skuIdList
*/
Boolean productStatusNoEnable(List<Integer> skuIdList);
} }

View File

@@ -27,7 +27,7 @@ public interface StoreOrderInfoService extends IService<StoreOrderInfo> {
HashMap<Integer, List<StoreOrderInfoVo>> getMapInId(List<Integer> orderIdList); HashMap<Integer, List<StoreOrderInfoVo>> getMapInId(List<Integer> orderIdList);
public List<StoreOrderInfoVo> getOrderListByOrderId(Integer orderId); List<StoreOrderInfoVo> getOrderListByOrderId(Integer orderId);
/** /**
* 批量添加订单详情 * 批量添加订单详情

View File

@@ -6,10 +6,7 @@ import com.github.pagehelper.PageInfo;
import com.zbkj.crmeb.express.vo.ExpressSheetVo; import com.zbkj.crmeb.express.vo.ExpressSheetVo;
import com.zbkj.crmeb.express.vo.LogisticsResultVo; import com.zbkj.crmeb.express.vo.LogisticsResultVo;
import com.zbkj.crmeb.store.model.StoreOrder; import com.zbkj.crmeb.store.model.StoreOrder;
import com.zbkj.crmeb.store.request.RetailShopStairUserRequest; import com.zbkj.crmeb.store.request.*;
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.response.*; import com.zbkj.crmeb.store.response.*;
import com.zbkj.crmeb.system.request.SystemWriteOffOrderSearchRequest; import com.zbkj.crmeb.system.request.SystemWriteOffOrderSearchRequest;
import com.zbkj.crmeb.system.response.SystemWriteOffOrderResponse; import com.zbkj.crmeb.system.response.SystemWriteOffOrderResponse;
@@ -143,11 +140,10 @@ public interface StoreOrderService extends IService<StoreOrder> {
/** /**
* 更改订单价格 * 更改订单价格
* @param orderId 订单id wx开头 * @param request 订单改价对象
* @param price 待更改价格
* @return 更改结果 * @return 更改结果
*/ */
boolean editPrice(String orderId,BigDecimal price); boolean editPrice(StoreOrderEditPriceRequest request);
/** /**
* 确认付款 * 确认付款
@@ -214,4 +210,27 @@ public interface StoreOrderService extends IService<StoreOrder> {
* @param orderNo 订单编号 * @param orderNo 订单编号
*/ */
Boolean updatePaid(String orderNo); Boolean updatePaid(String orderNo);
Map<String, StoreOrder> getMapInOrderNo(List<String> orderNoList);
/**
* 获取推广订单总金额
* @param orderNoList 订单编号列表
* @return
*/
BigDecimal getSpreadOrderTotalPriceByOrderList(List<String> orderNoList);
/**
* 获取所有收货订单id集合
* @return
*/
List<StoreOrder> findIdAndUidListByReceipt();
/**
* 根据用户uid查询所有已支付订单
* @param userId 用户uid
* @param pageParamRequest 分页参数
* @return
*/
List<StoreOrder> findPaidListByUid(Integer userId, PageParamRequest pageParamRequest);
} }

View File

@@ -36,4 +36,11 @@ public interface StoreOrderStatusService extends IService<StoreOrderStatus> {
* @return 订单状态结果 * @return 订单状态结果
*/ */
List<StoreOrderStatus> getByEntity(StoreOrderStatus storeOrderStatus); List<StoreOrderStatus> getByEntity(StoreOrderStatus storeOrderStatus);
/**
* 根据订单id获取最后一条记录
* @param orderId 订单id
* @return
*/
StoreOrderStatus getLastByOrderId(Integer orderId);
} }

View File

@@ -15,19 +15,21 @@ import com.zbkj.crmeb.store.model.StoreOrder;
* | Author: CRMEB Team <admin@crmeb.com> * | Author: CRMEB Team <admin@crmeb.com>
* +---------------------------------------------------------------------- * +----------------------------------------------------------------------
*/ */
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);
}

View File

@@ -46,6 +46,14 @@ public interface StoreProductReplyService extends IService<StoreProductReply> {
*/ */
List<StoreProductReply> isReply(String unique,String replayType, Integer orderId); List<StoreProductReply> isReply(String unique,String replayType, Integer orderId);
/**
* 查询是否已经回复
* @param unique skuId
* @param orderId 订单id
* @return Boolean
*/
Boolean isReply(String unique, Integer orderId);
/** /**
* 获取商品评论列表 * 获取商品评论列表
* @param productId 商品ID * @param productId 商品ID

Some files were not shown because too many files have changed in this diff Show More