1、提货点
2、客服(腾讯云智服)
3、接口权限控制
4、复制第三方商品可配置
4、优化附件上传配置
5、手机端核销订单
6、手机端订单统计、订单管理
7、短信优化
8、订阅消息全自动化
This commit is contained in:
张乐
2020-09-15 16:13:25 +08:00
parent aee9c1d692
commit db2c3b44a6
245 changed files with 19900 additions and 994 deletions

View File

@@ -16,6 +16,7 @@ public class Constants {
public static final int NUM_ONE = 1;
public static final int NUM_TWO = 2;
public static final int NUM_THREE = 3;
public static final int NUM_FIVE = 5;
public static final int NUM_SEVEN = 7;
public static final int NUM_TEN = 10;
public static final int NUM_ONE_HUNDRED = 100;
@@ -166,6 +167,11 @@ public class Constants {
public static final String CONFIG_KEY_LOGISTICS_APP_CODE = "system_express_app_code"; //快递查询密钥
//云智服 小程序插件
public static final String CONFIG_KEY_YZF_H5_URL = "yzf_h5_url"; //云智服H5 url
//分销
public static final String CONFIG_KEY_STORE_BROKERAGE_LEVEL = "store_brokerage_rate_num"; //返佣比例前缀
public static final String CONFIG_KEY_STORE_BROKERAGE_USER_EXTRACT_MIN_PRICE = "user_extract_min_price"; //提现最低金额
@@ -184,7 +190,10 @@ public class Constants {
public static final String CONFIG_KEY_ADMIN_LOGIN_BACKGROUND_IMAGE = "admin_login_bg_pic"; //登录页背景图
//分销
public static final String CONFIG_KEY_DISTRIBUTION_TYPE = "brokerageBindind";
public static final String CONFIG_KEY_DISTRIBUTION_TYPE = "brokerage_bindind";
//验证码过期时间
public static final String CONFIG_KEY_SMS_CODE_EXPIRE = "sms_code_expire";
//config配置的formId
@@ -196,6 +205,7 @@ public class Constants {
public static final int THIRD_LOGIN_TOKEN_TYPE_PUBLIC = 1; //公众号
public static final int THIRD_LOGIN_TOKEN_TYPE_PROGRAM = 2; //小程序
public static final int THIRD_LOGIN_TOKEN_TYPE_UNION_ID = 3; //unionid
public static final int THIRD_ADMIN_LOGIN_TOKEN_TYPE_PUBLIC = 4; //后台登录公众号
// 商品类型 活动类型 0=商品1=秒杀2=砍价3=拼团 attrResult表用到
@@ -324,7 +334,7 @@ public class Constants {
public static final int ORDER_STATUS_H5_UNPAID = 0; // 未支付
public static final int ORDER_STATUS_H5_NOT_SHIPPED = 1; // 待发货
public static final int ORDER_STATUS_H5_SPIKE = 2; // 待收货
public static final int ORDER_STATUS_H5_BARGAIN = 3; // 待评价
public static final int ORDER_STATUS_H5_VERF = 3; // 待核销
public static final int ORDER_STATUS_H5_COMPLETE = 4; // 已完成
public static final int ORDER_STATUS_H5_REFUNDING = -1; // 退款中
public static final int ORDER_STATUS_H5_REFUNDED = -2; // 已退款
@@ -356,6 +366,10 @@ public class Constants {
public static final String PAY_TYPE_WE_CHAT_FROM_PUBLIC = "public"; //公众号
public static final String PAY_TYPE_WE_CHAT_FROM_PROGRAM = "routine"; //小程序
//后台微信登录类型
public static final String ADMIN_LOGIN_TYPE_WE_CHAT_FROM_PUBLIC = "admin_public"; //公众号
//支付方式
public static final String PAY_TYPE_STR_WE_CHAT = "微信支付"; //微信支付
@@ -380,6 +394,8 @@ public class Constants {
public static final String ORDER_LOG_REFUND_APPLY = "apply_refund"; //
public static final String ORDER_LOG_PAY_SUCCESS = "pay_success"; //支付成功
public static final String ORDER_LOG_DELIVERY_VI = "delivery_fictitious"; //虚拟发货
public static final String ORDER_LOG_EDIT = "order_edit"; //编辑订单
public static final String ORDER_LOG_PAY_OFFLINE = "offline"; //线下付款订单
// 订单缓存
@@ -417,4 +433,25 @@ public class Constants {
//物流 https://market.aliyun.com/products/56928004/cmapi021863.html#sku=yuncode15863000015
public static String LOGISTICS_API_URL = "https://wuliu.market.alicloudapi.com/kdi";
// 订单 基本 操作字样
public static String RESULT_ORDER_NOTFOUND = "订单号 ${orderCode} 未找到";
public static String RESULT_ORDER_NOTFOUND_IN_ID = "订单id ${orderId} 未找到";
public static String RESULT_ORDER_PAYED = "订单号 ${orderCode} 已支付";
public static String RESULT_ORDER_EDIT_PRICE_SAME = "修改价格不能和支付价格相同 原价 ${oldPrice} 修改价 ${editPrice}";
public static String RESULT_ORDER_EDIT_PRICE_SUCCESS = "订单号 ${orderNo} 修改价格 ${price} 成功";
public static String RESULT_ORDER_EDIT_PRICE_LOGS = "订单价格 ${orderPrice} 修改实际支付金额为 ${price} 元";
// 订单 支付 操作字样
public static String RESULT_ORDER_PAY_OFFLINE = "订单号 ${orderNo} 现在付款 ${price} 成功";
// 订单核销 返回字样 Order response text info
public static String RESULT_VERIFICATION_ORDER_NOT_FUND = "核销码 ${vCode} 的订单未找到";
public static String RESULT_VERIFICATION_ORDER_VED = "核销码 ${vCode} 的订单已核销";
public static String RESULT_VERIFICATION_NOTAUTH = "没有核销权限";
public static String RESULT_VERIFICATION_USER_EXIST = "当前用户已经是核销员";
// QRcode Response text info
public static String RESULT_QRCODE_PRAMERROR = "生成二维码参数不合法";
}

View File

@@ -46,9 +46,7 @@ public class WeChatConstants {
//获取 JsApiTicket
public static final String PUBLIC_API_JS_API_TICKET = "cgi-bin/ticket/getticket";
//发送公众号模板消息
public static final String PUBLIC_API__PUBLIC_TEMPLATE_MESSAGE_SEND = "cgi-bin/message/template/send";
//发送小程序模板消息
public static final String PUBLIC_API__PROGRAM_TEMPLATE_MESSAGE_SEND = "cgi-bin/message/subscribe/send";
public static final String PUBLIC_API_PUBLIC_TEMPLATE_MESSAGE_SEND = "cgi-bin/message/template/send";
//获取设置的行业信息
public static final String PUBLIC_API_TEMPLATE_MESSAGE_INDUSTRY = "cgi-bin/template/get_industry";
//新增其他类型永久素材
@@ -60,6 +58,20 @@ public class WeChatConstants {
//发送客服消息
public static final String PUBLIC_API_KF_MESSAGE_SEND = "cgi-bin/message/custom/send";
//小程序行业消息
public static final String PUBLIC_API_PROGRAM_CATEGORY = "wxaapi/newtmpl/getcategory";
//小程序公共模板库
public static final String PUBLIC_API_PROGRAM_PUBLIC_TEMP = "wxaapi/newtmpl/getpubtemplatetitles";
//小程序模板关键词列表
public static final String PUBLIC_API_PROGRAM_PUBLIC_TEMP_KEYWORDS = "wxaapi/newtmpl/getpubtemplatekeywords";
//添加小程序订阅消息
public static final String PUBLIC_API_ADD_PROGRAM_TEMPLATE = "wxaapi/newtmpl/addtemplate";
//删除小程序订阅消息
public static final String PUBLIC_API_DELETE_PROGRAM_TEMPLATE = "wxaapi/newtmpl/deltemplate";
//发送小程序模板消息
public static final String PUBLIC_API_PROGRAM_TEMPLATE_MESSAGE_SEND = "cgi-bin/message/subscribe/send";
//授权登录
//获取临时code跳转地址

View File

@@ -234,22 +234,22 @@ public final class DateUtil {
/**
* convert long to date
*
* @param dateLong
* @return
* @param date 待转换时间戳
* @return 转换后时间
*/
public static Date longToDate(long dateLong) {
return new Date(dateLong);
public static Date timeStamp11ToDate(Integer date) {
return new Date(date);
}
/**
* convert long to date string
*
* @param dateLong
* @param DATE_FORMAT
* @return
* @param date 待转换时间戳
* @param DATE_FORMAT 格式化时间
* @return 格式化后的时间
*/
public static String longToDate(long dateLong, String DATE_FORMAT) {
return dateToStr(new Date(dateLong), DATE_FORMAT);
public static String timeStamp11ToDate(Integer date, String DATE_FORMAT) {
return dateToStr(new Date(date), DATE_FORMAT);
}
/**
@@ -518,4 +518,28 @@ public final class DateUtil {
return date;
}
/**
* 两个日期之前的相差天数
* @param starDate 开始日期
* @param endDate 结束日期
* @return 相差天数
*/
public static int daysBetween(Date starDate,Date endDate){
Calendar cal = Calendar.getInstance();
cal.setTime(starDate);
long time1 = cal.getTimeInMillis();
cal.setTime(endDate);
long time2 = cal.getTimeInMillis();
long between_days=(time2-time1)/(1000*3600*24);
return Integer.parseInt(String.valueOf(between_days));
}
}

View File

@@ -0,0 +1,63 @@
package com.utils;
import net.sourceforge.pinyin4j.PinyinHelper;
import net.sourceforge.pinyin4j.format.HanyuPinyinCaseType;
import net.sourceforge.pinyin4j.format.HanyuPinyinOutputFormat;
import net.sourceforge.pinyin4j.format.HanyuPinyinToneType;
import net.sourceforge.pinyin4j.format.exception.BadHanyuPinyinOutputFormatCombination;
/**
* 汉字转换为拼音
* @author Red
*/
public class PinYinUtil {
/**
* 获取字符串拼音的第一个字母
* @param chinese
* @return
*/
public static String toFirstChar(String chinese){
StringBuilder pinyinStr = new StringBuilder();
char[] newChar = chinese.toCharArray(); //转为单个字符
HanyuPinyinOutputFormat defaultFormat = new HanyuPinyinOutputFormat();
defaultFormat.setCaseType(HanyuPinyinCaseType.LOWERCASE);
defaultFormat.setToneType(HanyuPinyinToneType.WITHOUT_TONE);
for (char c : newChar) {
if (c > 128) {
try {
pinyinStr.append(PinyinHelper.toHanyuPinyinStringArray(c, defaultFormat)[0].charAt(0));
} catch (BadHanyuPinyinOutputFormatCombination e) {
e.printStackTrace();
}
} else {
pinyinStr.append(c);
}
}
return pinyinStr.toString();
}
/**
* 汉字转为拼音
* @param chinese
* @return
*/
public static String toPinyin(String chinese){
StringBuilder pinyinStr = new StringBuilder();
char[] newChar = chinese.toCharArray();
HanyuPinyinOutputFormat defaultFormat = new HanyuPinyinOutputFormat();
defaultFormat.setCaseType(HanyuPinyinCaseType.LOWERCASE);
defaultFormat.setToneType(HanyuPinyinToneType.WITHOUT_TONE);
for (char c : newChar) {
if (c > 128) {
try {
pinyinStr.append(PinyinHelper.toHanyuPinyinStringArray(c, defaultFormat)[0]);
} catch (BadHanyuPinyinOutputFormatCombination e) {
e.printStackTrace();
}
} else {
pinyinStr.append(c);
}
}
return pinyinStr.toString();
}
}

View File

@@ -1,19 +1,16 @@
package com.utils;
import java.awt.Color;
import java.awt.Font;
import java.awt.Graphics;
import java.awt.Graphics2D;
import cn.hutool.core.util.RandomUtil;
import com.alibaba.druid.util.Base64;
import org.springframework.stereotype.Component;
import javax.imageio.ImageIO;
import java.awt.*;
import java.awt.image.BufferedImage;
import java.io.ByteArrayOutputStream;
import java.io.IOException;
import java.io.Serializable;
import java.util.Random;
import javax.imageio.ImageIO;
import cn.hutool.core.util.RandomUtil;
import com.alibaba.druid.util.Base64;
import org.springframework.stereotype.Component;
/**
* 验证码生成工具类
@@ -24,7 +21,7 @@ import org.springframework.stereotype.Component;
public class ValidateCodeUtil {
private static Validate validate = null; //验证码类用于最后返回此对象包含验证码图片base64和真值
private static Random random = new Random(); //随机类,用于生成随机参数
private static String randString = "0123456789abcdefghijkmnpqrtyABCDEFGHIJLMNQRTY";//随机生成字符串的取值范围
private static String randString = "0123456789abcdefghjkmnpqrstuvwxyzABCDEFGHJKLMNPQRSTUVWXYZ";//随机生成字符串的取值范围
private static int width = 80; //图片宽度
private static int height = 34; //图片高度
@@ -103,9 +100,9 @@ public class ValidateCodeUtil {
Graphics2D g2d = (Graphics2D) graphics;
g2d.setFont(getFont()); //设置字体
g2d.setColor(new Color(random.nextFloat(), random.nextFloat(), random.nextFloat()));//设置颜色
String randChar = String.valueOf(getRandomChar(random.nextInt(randString.length())));
String randChar = getRandomChar(random.nextInt(randString.length()));
randomString += randChar; //组装
int rot = getRandomNum(5,10);
int rot = getRandomNum(1,10);
g2d.translate(random.nextInt(3), random.nextInt(3));
g2d.rotate(rot * Math.PI / 180);
g2d.drawString(randChar, 13*i, 20);

View File

@@ -6,7 +6,6 @@ import com.constants.Constants;
import com.exception.CrmebException;
import com.exception.ExceptionCodeEnum;
import com.utils.CrmebUtil;
import com.zbkj.crmeb.authorization.manager.TokenManager;
import com.zbkj.crmeb.system.request.SystemAdminLoginRequest;
import com.zbkj.crmeb.system.request.SystemAdminRequest;
import com.zbkj.crmeb.system.response.SystemAdminResponse;
@@ -19,6 +18,7 @@ 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.*;
@@ -53,9 +53,6 @@ public class adminUser {
@Autowired
private SystemGroupDataService systemGroupDataService;
@Autowired
private TokenManager tokenManager;
@Autowired
private ValidateCodeService validateCodeService;
@@ -75,6 +72,9 @@ public class adminUser {
return CommonResult.failed(ExceptionCodeEnum.FAILED, "login failed");
}
if(StringUtils.isNotBlank(systemAdminLoginRequest.getWxCode())){
systemAdminService.bind(systemAdminLoginRequest.getWxCode(), systemAdminResponse.getId());
}
return CommonResult.success(systemAdminResponse, "login success");
}
@@ -116,4 +116,26 @@ public class adminUser {
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){
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

@@ -65,6 +65,8 @@ public class WebConfig implements WebMvcConfigurer {
excludePathPatterns("/api/admin/login").
excludePathPatterns("/api/admin/logout").
excludePathPatterns("/api/admin/getLoginPic").
excludePathPatterns("/api/admin/wechat/config").
excludePathPatterns("/api/admin/authorize/login").
excludePathPatterns("/api/admin/payment/callback/**").
excludePathPatterns("/swagger-resources/**", "/webjars/**", "/v2/**", "/swagger-ui.html/**");

View File

@@ -18,6 +18,8 @@ import com.zbkj.crmeb.finance.service.UserExtractService;
import com.zbkj.crmeb.system.service.SystemConfigService;
import com.zbkj.crmeb.user.service.UserBillService;
import com.zbkj.crmeb.user.service.UserService;
import com.zbkj.crmeb.wechat.service.impl.WechatSendMessageForMinService;
import com.zbkj.crmeb.wechat.vo.WechatSendMessageForCash;
import org.apache.commons.lang3.StringUtils;
import org.springframework.beans.BeanUtils;
import org.springframework.beans.factory.annotation.Autowired;
@@ -49,6 +51,9 @@ public class UserExtractServiceImpl extends ServiceImpl<UserExtractDao, UserExtr
@Autowired
private SystemConfigService systemConfigService;
@Autowired
private WechatSendMessageForMinService wechatSendMessageForMinService;
/**
* 列表
@@ -164,6 +169,14 @@ public class UserExtractServiceImpl extends ServiceImpl<UserExtractDao, UserExtr
userExtract.setUid(userId);
BeanUtils.copyProperties(request, userExtract);
userExtract.setBalance(toBeWithdrawn.subtract(request.getExtractPrice()));
// 微信小程序订阅提现通知
WechatSendMessageForCash cash = new WechatSendMessageForCash(
"提现申请成功",request.getExtractPrice()+"",request.getBankname()+request.getBankCode(),
DateUtil.nowDateTimeStr(),"暂无",request.getRealName(),"0",request.getExtractType(),"提现",
"暂无",request.getExtractType(),"暂无",request.getRealName()
);
wechatSendMessageForMinService.sendCashMessage(cash,userId);
return save(userExtract);
}

View File

@@ -2,6 +2,8 @@ package com.zbkj.crmeb.front.controller;
import com.alibaba.fastjson.JSONObject;
import com.common.CommonResult;
import com.constants.Constants;
import com.exception.CrmebException;
import com.zbkj.crmeb.front.service.QrCodeService;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiOperation;
@@ -48,6 +50,24 @@ public class QrCodeController {
public CommonResult<Map<String, Object>> get(@RequestParam String url) {
return CommonResult.success(qrCodeService.base64(url));
}
/**
* 远程图片转base64
* @author Mr.Zhang
* @since 2020-04-16
* @return CommonResult
*/
@ApiOperation(value="将字符串 转base64")
@RequestMapping(value = "/str2base64", method = RequestMethod.POST)
public CommonResult<Map<String, Object>> getQrcodeByString(
@RequestParam String text,
@RequestParam int width,
@RequestParam int height) {
if((width < 50 || height < 50) && (width > 500 || height > 500) && text.length() >= 999){
throw new CrmebException(Constants.RESULT_QRCODE_PRAMERROR);
}
return CommonResult.success(qrCodeService.base64String(text, width,height));
}
}

View File

@@ -43,8 +43,9 @@ public class StoreOrderController {
@ApiOperation(value = "确认订单")
@RequestMapping(value = "/confirm", method = RequestMethod.POST)
public CommonResult<ConfirmOrderResponse> OrderConForm(@RequestParam String cartIds,
@RequestParam boolean isNew){
return CommonResult.success(orderService.confirmOrder(CrmebUtil.stringToArrayInt(cartIds),isNew));
@RequestParam(value = "boolean", defaultValue = "false") boolean isNew,
@RequestParam(value = "addAgain", defaultValue = "false") boolean addAgain){
return CommonResult.success(orderService.confirmOrder(CrmebUtil.stringToArrayInt(cartIds),isNew,addAgain));
}
/**
@@ -105,7 +106,7 @@ public class StoreOrderController {
@ApiOperation(value = "订单列表")
@RequestMapping(value = "/list", method = RequestMethod.GET)
@ApiImplicitParams ({
@ApiImplicitParam(name = "type", value = "评价等级|0=未支付,1=待发货,2=待收货,3=待评价,4=已完成", required = true)
@ApiImplicitParam(name = "type", value = "评价等级|0=未支付,1=待发货,2=待收货,3=待评价,4=已完成,-3=售后/退款", required = true)
})
public CommonResult<List<OrderAgainVo>> orderList(
@RequestParam(name = "type") Integer type,

View File

@@ -1,12 +1,16 @@
package com.zbkj.crmeb.front.controller;
import com.common.CommonResult;
import com.common.PageParamRequest;
import com.zbkj.crmeb.front.response.LoginResponse;
import com.zbkj.crmeb.front.service.UserCenterService;
import com.zbkj.crmeb.user.request.RegisterThirdUserRequest;
import com.zbkj.crmeb.wechat.model.TemplateMessage;
import com.zbkj.crmeb.wechat.model.WechatProgramMyTemp;
import com.zbkj.crmeb.wechat.request.WechatProgramMyTempSearchRequest;
import com.zbkj.crmeb.wechat.service.TemplateMessageService;
import com.zbkj.crmeb.wechat.service.WeChatService;
import com.zbkj.crmeb.wechat.service.WechatProgramMyTempService;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiImplicitParam;
import io.swagger.annotations.ApiOperation;
@@ -16,6 +20,7 @@ import org.springframework.validation.annotation.Validated;
import org.springframework.web.bind.annotation.*;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
@@ -37,6 +42,9 @@ public class WeChatController {
@Autowired
private TemplateMessageService templateMessageService;
@Autowired
private WechatProgramMyTempService wechatProgramMyTempService;
/**
* 获取授权页面跳转地址
* @author Mr.Zhang
@@ -110,6 +118,17 @@ public class WeChatController {
TemplateMessage templateMessage = templateMessageService.infoException(id);
return CommonResult.success(templateMessage);
}
/**
* 订阅消息模板列表
* @author Mr.Zhang
* @since 2020-06-03
*/
@ApiOperation(value = "订阅消息模板列表")
@RequestMapping(value = "/program/my/temp/list", method = RequestMethod.POST)
public CommonResult<List<WechatProgramMyTemp>> programMyTempList(@RequestBody @Validated WechatProgramMyTempSearchRequest request, PageParamRequest pageParamRequest){
return CommonResult.success(wechatProgramMyTempService.getList(request, pageParamRequest));
}
}

View File

@@ -15,6 +15,7 @@ import java.math.BigDecimal;
public class OrderDataResponse {
private int completeCount;
private int evaluatedCount;
private int verificationCount;
private int orderCount;
private int receivedCount;
private int refundCount;

View File

@@ -35,8 +35,8 @@ public class UserCenterResponse implements Serializable {
@ApiModelProperty(value = "用户账号")
private String account;
@ApiModelProperty(value = "用户密码")
private String pwd;
// @ApiModelProperty(value = "用户密码")
// private String pwd;
@ApiModelProperty(value = "真实姓名")
private String realName;

View File

@@ -29,7 +29,7 @@ public interface OrderService {
* @param cartIds 购物车id集合
* @return 确认订单信息
*/
ConfirmOrderResponse confirmOrder(List<Integer> cartIds, boolean isNew);
ConfirmOrderResponse confirmOrder(List<Integer> cartIds, boolean isNew, boolean addAgain);
/**

View File

@@ -14,4 +14,7 @@ public interface QrCodeService {
Map<String, Object> get(JSONObject data) throws IOException;
Map<String, Object> base64(String url);
Map<String, Object> base64String(String text,int width, int height);
}

View File

@@ -36,6 +36,9 @@ import com.zbkj.crmeb.user.model.User;
import com.zbkj.crmeb.user.model.UserAddress;
import com.zbkj.crmeb.user.service.UserAddressService;
import com.zbkj.crmeb.user.service.UserService;
import com.zbkj.crmeb.wechat.service.impl.WechatSendMessageForMinService;
import com.zbkj.crmeb.wechat.vo.WechatSendMessageForCreateOrder;
import com.zbkj.crmeb.wechat.vo.WechatSendMessageForReFundNotify;
import org.apache.commons.lang3.StringUtils;
import org.springframework.beans.BeanUtils;
import org.springframework.beans.factory.annotation.Autowired;
@@ -103,6 +106,9 @@ public class OrderServiceImpl implements OrderService {
@Autowired
private LogisticService logisticsService;
@Autowired
private WechatSendMessageForMinService wechatSendMessageForMinService;
/**
* 确认订单
* @param cartIds 购物车id集合
@@ -110,7 +116,7 @@ public class OrderServiceImpl implements OrderService {
* @return 确认订单response
*/
@Override
public ConfirmOrderResponse confirmOrder(List<Integer> cartIds, boolean isNew) {
public ConfirmOrderResponse confirmOrder(List<Integer> cartIds, boolean isNew, boolean addAgain) {
ConfirmOrderResponse response = new ConfirmOrderResponse();
// 获取运费默认模版
ShippingTemplates template = shippingTemplatesService.getById(69);// todo 这里的默认模版写死
@@ -119,11 +125,12 @@ public class OrderServiceImpl implements OrderService {
List<StoreCartResponse> storeCartResponse = new ArrayList<>();
// isNew=false 从购物车获取 isNew=true 从缓存中获取=再次下单
if(isNew){
if(addAgain){ // 获取重新购买数据
storeCartResponse= orderUtils.getCacheOrderAgain(cartIds.get(0)+""); // todo 按照存储规格这里应该只会有一个值
}else {
storeCartResponse = storeCartService.getListByUserIdAndCartIds(currentUserInfo.getUid(),cartIds);
}else if(isNew){// 获取立即购买数据
storeCartResponse = storeCartService.getListByUserIdAndCartIds(currentUserInfo.getUid(),cartIds,1);
}else{ // 获取购物车数据
storeCartResponse = storeCartService.getListByUserIdAndCartIds(currentUserInfo.getUid(),cartIds,null);
}
// todo 跳过拼团秒杀和砍价
@@ -244,6 +251,12 @@ public class OrderServiceImpl implements OrderService {
orderPayResponse.setResult(itemResponse);
}
// 小程序消息订阅发送
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;
}
@@ -367,8 +380,6 @@ public class OrderServiceImpl implements OrderService {
smsInfo.put("adminName", currentUser.getNickname());
boolean codeResult = smsService.pushCodeToList(currentUser.getPhone(),1, smsInfo);
if(!codeResult) throw new CrmebException("短信加入发送队列失败");
// redisUtil.lPush(Constants.ORDER_TASK_REDIS_KEY_AFTER_REFUND_BY_USER, existStoreOrder.getId());
return true;
}
@@ -396,6 +407,17 @@ public class OrderServiceImpl implements OrderService {
storeOrder.setRefundReason(request.getText());
storeOrder.setRefundPrice(storeOrder.getPayPrice());
storeOrder.setRefundReasonTime(DateUtil.nowDateTime());
// 发送微信小程序订阅消息
String storeNameAndCarNumString = orderUtils.getStoreNameAndCarNumString(storeOrder.getId());
if(StringUtils.isNotBlank(storeNameAndCarNumString)){
WechatSendMessageForReFundNotify notify = new WechatSendMessageForReFundNotify(
storeNameAndCarNumString,storeOrder.getPayPrice().toString(),
storeOrder.getCreateTime().toString(),storeOrder.getOrderId()+"",DateUtil.nowDateTimeStr(),
"CRMEB","发起申请",request.getExplain(),storeOrder.getPayPrice()+"",
request.getText(),storeOrder.getUserPhone(),"CRMEB");
wechatSendMessageForMinService.sendReFundNotifyMessage(notify, userService.getUserId());
}
return storeOrderService.updateById(storeOrder);
}
@@ -533,7 +555,7 @@ public class OrderServiceImpl implements OrderService {
BeanUtils.copyProperties(storeOrderResult, storeOrderDetailResponse);
// 是否开启门店自提
String storeSelfMention = systemConfigService.getValueByKey("store_self_mention");
if(Boolean.valueOf(storeSelfMention)) storeOrderResult.setShippingType(1);
if(!Boolean.valueOf(storeSelfMention)) storeOrderResult.setShippingType(1);
if(storeOrderResult.getVerifyCode().length()>0){
String verifyCode = storeOrderResult.getVerifyCode();
List<String> verifyCodeList = new ArrayList<>();
@@ -547,8 +569,8 @@ public class OrderServiceImpl implements OrderService {
storeOrderDetailResponse.setAddTimeH(dateY);
storeOrderDetailResponse.setAddTimeH(dateH);
SystemStore systemStorePram = new SystemStore();
systemStorePram.setIsShow(true);
systemStorePram.setIsDel(false);
// systemStorePram.setIsShow(true);
// systemStorePram.setIsDel(false);
systemStorePram.setId(storeOrderResult.getStoreId());
storeOrderDetailResponse.setSystemStore(systemStoreService.getByCondition(systemStorePram));
@@ -594,8 +616,8 @@ public class OrderServiceImpl implements OrderService {
result.setUnShippedCount(storeOrderService.getTopDataUtil(Constants.ORDER_STATUS_H5_NOT_SHIPPED, currentUser.getUid()).size());
// 待收货
result.setReceivedCount(storeOrderService.getTopDataUtil(Constants.ORDER_STATUS_H5_SPIKE, currentUser.getUid()).size());
// 待评价
result.setEvaluatedCount(storeOrderService.getTopDataUtil(Constants.ORDER_STATUS_H5_BARGAIN, currentUser.getUid()).size());
// 待核销
result.setEvaluatedCount(storeOrderService.getTopDataUtil(Constants.ORDER_STATUS_H5_VERF, currentUser.getUid()).size());
// 已完成
result.setCompleteCount(storeOrderService.getTopDataUtil(Constants.ORDER_STATUS_H5_COMPLETE, currentUser.getUid()).size());
// 退款中
@@ -743,11 +765,11 @@ public class OrderServiceImpl implements OrderService {
* 仅仅支付
* 订单支付完之后给出状态值 以便前端使用, 后期这里也可以抽出对象
* ORDEREEXIST, EXTENDORDER, PAYERROR, SUCCESS, WECHATPAY, PAYDEFICIENCY, WECHATH5PAY
* @param request
* @param ip
* @param resultMap
* @param existStoreOrder
* @return
* @param request 支付订单参数
* @param ip 发起支付IP
* @param resultMap 计算订单时价格集合
* @param existStoreOrder 当前订单
* @return 支付状态
*/
@Transactional(rollbackFor = {RuntimeException.class, Error.class, CrmebException.class})
public boolean doPayOrder(OrderPayRequest request, String ip, HashMap<String, Object> resultMap, StoreOrder existStoreOrder) {

View File

@@ -152,16 +152,15 @@ public class ProductServiceImpl implements ProductService {
// 设置点赞和收藏
User user = userService.getInfo();
if(null != user){
if(null != user.getUid()){
storeInfo.setUserLike(storeProductRelationService.getLikeOrCollectByUser(user.getUid(),id,true).size() > 0);
storeInfo.setUserCollect(storeProductRelationService.getLikeOrCollectByUser(user.getUid(),id,false).size() > 0);
user = userService.updateForPromoter(user);
productDetailResponse.setPriceName(getPacketPriceRange(productResponse,user.getIsPromoter()));
}
if(null != user && null != user.getUid()){
storeInfo.setUserLike(storeProductRelationService.getLikeOrCollectByUser(user.getUid(),id,true).size() > 0);
storeInfo.setUserCollect(storeProductRelationService.getLikeOrCollectByUser(user.getUid(),id,false).size() > 0);
// user = userService.updateForPromoter(user);
productDetailResponse.setPriceName(getPacketPriceRange(productResponse,user.getIsPromoter()));
}else{
storeInfo.setUserLike(false);
storeInfo.setUserCollect(false);
}
storeInfo.setUserLike(false);
storeInfo.setUserCollect(false);
productDetailResponse.setStoreInfo(storeInfo);
// 根据制式设置attr属性

View File

@@ -3,6 +3,7 @@ package com.zbkj.crmeb.front.service.impl;
import com.alibaba.fastjson.JSONObject;
import com.exception.CrmebException;
import com.utils.CrmebUtil;
import com.utils.QRCodeUtil;
import com.utils.RestTemplateUtil;
import com.zbkj.crmeb.front.service.QrCodeService;
import com.zbkj.crmeb.wechat.service.WeChatService;
@@ -71,5 +72,24 @@ public class QrCodeServiceImpl implements QrCodeService {
map.put("code", base64Image);
return map;
}
/**
* 讲字符串转为QRcode
* @param text 待转换字符串
* @return QRcode base64格式
*/
@Override
public Map<String, Object> base64String(String text,int width, int height) {
String base64Image = null;
try {
base64Image = QRCodeUtil.crateQRCode(text,width,height);
}catch (Exception e){
throw new CrmebException("生成二维码异常");
}
Map<String, Object> map = new HashMap<>();
map.put("code", base64Image);
return map;
}
}

View File

@@ -40,6 +40,8 @@ import com.zbkj.crmeb.wechat.response.WeChatAuthorizeLoginGetOpenIdResponse;
import com.zbkj.crmeb.wechat.response.WeChatAuthorizeLoginUserInfoResponse;
import com.zbkj.crmeb.wechat.response.WeChatProgramAuthorizeLoginGetOpenIdResponse;
import com.zbkj.crmeb.wechat.service.WeChatService;
import com.zbkj.crmeb.wechat.service.impl.WechatSendMessageForMinService;
import com.zbkj.crmeb.wechat.vo.WechatSendMessageForTopped;
import org.apache.commons.lang3.StringUtils;
import org.springframework.beans.BeanUtils;
import org.springframework.beans.factory.annotation.Autowired;
@@ -98,6 +100,9 @@ public class UserCenterServiceImpl extends ServiceImpl<UserDao, User> implements
@Autowired
private WeChatService weChatService;
@Autowired
private WechatSendMessageForMinService wechatSendMessageForMinService;
/**
@@ -425,8 +430,9 @@ public class UserCenterServiceImpl extends ServiceImpl<UserDao, User> implements
request.setGivePrice(systemGroupData.getGiveMoney());
}
User currentUser = userService.getInfoException();
//生成系统订单
request.setUserId(userService.getUserIdException());
request.setUserId(currentUser.getUid());
UserRecharge userRecharge = userRechargeService.create(request);
@@ -436,6 +442,13 @@ public class UserCenterServiceImpl extends ServiceImpl<UserDao, User> implements
if(null == responseVo){
throw new CrmebException("下单失败!");
}
// 小程序订阅通知 充值成功通知
WechatSendMessageForTopped topped = new WechatSendMessageForTopped(
userRecharge.getOrderId(),userRecharge.getOrderId(),userRecharge.getPrice()+"",
currentUser.getNowMoney()+"",userRecharge.getCreateTime()+"", userRecharge.getGivePrice()+"",
"暂无",userRecharge.getPrice()+"","CRMEB","微信"
);
wechatSendMessageForMinService.sendToppedMessage(topped, currentUser.getUid());
return weChatService.response(responseVo);
}catch (Exception e){

View File

@@ -35,6 +35,15 @@ public interface StoreCouponUserService extends IService<StoreCouponUser> {
boolean use(Integer id, List<Integer> productIdList, BigDecimal price);
/**
* 检测优惠券是否可用,计算订单价格时使用
* @param id 优惠券id
* @param productIdList 商品id集合
* @param price 价格
* @return 可用状态
*/
boolean canUse(Integer id, List<Integer> productIdList, BigDecimal price);
boolean receiveAll(UserCouponReceiveRequest request, Integer userId, String type);
boolean rollbackByCancelOrder(StoreOrder storeOrder);

View File

@@ -197,7 +197,10 @@ public class StoreCouponUserServiceImpl extends ServiceImpl<StoreCouponUserDao,
*/
private void filterReceiveUserInUid(Integer couponId, List<Integer> uidList) {
LambdaQueryWrapper<StoreCouponUser> lambdaQueryWrapper = new LambdaQueryWrapper<>();
lambdaQueryWrapper.eq(StoreCouponUser::getCouponId, couponId).in(StoreCouponUser::getUid, uidList);
lambdaQueryWrapper
.eq(StoreCouponUser::getCouponId, couponId)
.in(StoreCouponUser::getUid, uidList)
.eq(StoreCouponUser::getStatus,0);
List<StoreCouponUser> storeCouponUserList = dao.selectList(lambdaQueryWrapper);
if(storeCouponUserList != null){
List<Integer> receiveUidList = storeCouponUserList.stream().map(StoreCouponUser::getUid).distinct().collect(Collectors.toList());
@@ -285,6 +288,67 @@ public class StoreCouponUserServiceImpl extends ServiceImpl<StoreCouponUserDao,
return updateById(storeCouponUser);
}
/**
* 检测优惠券是否可用,计算订单价格时使用
*
* @param id 优惠券id
* @param productIdList 商品id集合
* @param price 价格
* @return 可用状态
*/
@Override
public boolean canUse(Integer id, List<Integer> productIdList, BigDecimal price) {
StoreCouponUser storeCouponUser = getById(id);
if(storeCouponUser == null || !storeCouponUser.getUid().equals(userService.getUserIdException())){
throw new CrmebException("领取记录不存在!");
}
if(storeCouponUser.getStatus() == 1){
throw new CrmebException("此优惠券已使用!");
}
if(storeCouponUser.getStatus() == 2){
throw new CrmebException("此优惠券已失效!");
}
//判断是否在使用时间内
Date date = DateUtil.nowDateTime();
if(storeCouponUser.getStartTime().compareTo(date) > 0){
throw new CrmebException("此优惠券还未到达使用时间范围之内!");
}
if(date.compareTo(storeCouponUser.getEndTime()) > 0){
throw new CrmebException("此优惠券已经失效了");
}
if(storeCouponUser.getMinPrice().compareTo(price) > 0){
throw new CrmebException("总金额小于优惠券最小使用金额");
}
//检测优惠券信息
if(storeCouponUser.getUseType() > 1){
if(productIdList.size() < 1){
throw new CrmebException("没有找到商品");
}
//拿出需要使用优惠券的商品分类集合
List<Integer> categoryIdList = storeProductService.getSecondaryCategoryByProductId(StringUtils.join(productIdList, ","));
//设置优惠券所提供的集合
List<Integer> primaryKeyIdList = CrmebUtil.stringToArray(storeCouponUser.getPrimaryKey());
//取两个集合的交集如果是false则证明没有相同的值
if(storeCouponUser.getUseType() == 2 && !primaryKeyIdList.retainAll(productIdList)){
throw new CrmebException("此优惠券为商品券,请购买相关商品之后再使用!");
}
if(storeCouponUser.getUseType() == 3 && !primaryKeyIdList.retainAll(categoryIdList)){
throw new CrmebException("此优惠券为分类券,请购买相关分类下的商品之后再使用!");
}
}
return true;
}
/**
* 用户批量领取优惠券
* @param request UserCouponReceiveRequest 领取参数
@@ -393,7 +457,7 @@ public class StoreCouponUserServiceImpl extends ServiceImpl<StoreCouponUserDao,
public List<StoreCouponUserOrder> getListByCartIds(List<Integer> cartIds) {
//购物车产品集合
List<StoreCartResponse> storeCartResponseList = storeCartService.getListByUserIdAndCartIds(userService.getUserIdException(), cartIds);
List<StoreCartResponse> storeCartResponseList = storeCartService.getListByUserIdAndCartIds(userService.getUserIdException(), cartIds,1);
//产品id集合
List<Integer> productIds = storeCartResponseList.stream().map(StoreCartResponse::getProductId).distinct().collect(Collectors.toList());
@@ -424,6 +488,12 @@ public class StoreCouponUserServiceImpl extends ServiceImpl<StoreCouponUserDao,
return storeCouponUserOrderArrayList;
}
/**
* H5 优惠券列表
* @param userId 用户id
* @param pageParamRequest 分页参数
* @return 优惠券列表
*/
@Override
public List<StoreCouponUserResponse> getListFront(Integer userId, PageParamRequest pageParamRequest) {
StoreCouponUserSearchRequest request = new StoreCouponUserSearchRequest();
@@ -446,7 +516,7 @@ public class StoreCouponUserServiceImpl extends ServiceImpl<StoreCouponUserDao,
type = false;
}
if(date.compareTo(storeCouponUserResponse.getEndTime()) > 0){
if(date.compareTo(storeCouponUserResponse.getEndTime()) >= 0){
type = false;
}
}

View File

@@ -71,9 +71,14 @@ public class CallbackServiceImpl implements CallbackService {
AttachVo attachVo = JSONObject.toJavaObject(JSONObject.parseObject(callbackVo.getAttach()), AttachVo.class);
//判断openid
UserToken userToken = userTokenService.getUserIdByOpenId(callbackVo.getOpenid());
UserToken userToken = userTokenService.getUserIdByOpenId(callbackVo.getOpenid(), Constants.THIRD_LOGIN_TOKEN_TYPE_PUBLIC); //公众号
if(null == userToken || !userToken.getUid().equals(attachVo.getUserId())){
//用户信息错误
//继续找小程序,找不到说明没有
userToken = userTokenService.getUserIdByOpenId(callbackVo.getOpenid(), Constants.THIRD_LOGIN_TOKEN_TYPE_PROGRAM); //小程序
}
if(null == userToken || !userToken.getUid().equals(attachVo.getUserId())){
//用户信息错误
throw new CrmebException("用户信息错误!");
}

View File

@@ -19,6 +19,7 @@ import com.zbkj.crmeb.store.service.StoreOrderInfoService;
import com.zbkj.crmeb.store.service.StoreOrderService;
import com.zbkj.crmeb.store.service.StoreOrderStatusService;
import com.zbkj.crmeb.store.service.StoreProductCouponService;
import com.zbkj.crmeb.store.utilService.OrderUtils;
import com.zbkj.crmeb.store.vo.StoreOrderInfoVo;
import com.zbkj.crmeb.user.model.User;
import com.zbkj.crmeb.user.model.UserBill;
@@ -26,8 +27,10 @@ import com.zbkj.crmeb.user.service.UserBillService;
import com.zbkj.crmeb.user.service.UserService;
import com.zbkj.crmeb.wechat.service.TemplateMessageService;
import com.zbkj.crmeb.wechat.service.WeChatService;
import com.zbkj.crmeb.wechat.vo.WechatSendMessageForPaySuccess;
import lombok.Data;
import lombok.EqualsAndHashCode;
import org.apache.commons.lang3.StringUtils;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
@@ -88,6 +91,9 @@ public class OrderPayServiceImpl extends PayService implements OrderPayService {
@Autowired
private WeChatService weChatService;
@Autowired
private OrderUtils orderUtils;
//订单类
private StoreOrder order;
@@ -105,7 +111,6 @@ public class OrderPayServiceImpl extends PayService implements OrderPayService {
*/
@Override
public CreateOrderResponseVo payOrder(Integer orderId, String fromType, String clientIp) {
// todo 这里需要根据 fromType 参数直接替换当前支付方式,
CreateOrderResponseVo responseVo = new CreateOrderResponseVo();
StoreOrder storeOrder = storeOrderService.getById(orderId);
setOrder(storeOrder);
@@ -299,20 +304,28 @@ public class OrderPayServiceImpl extends PayService implements OrderPayService {
* @since 2020-07-01
*/
private void pushTempMessage() {
String tempKey = Constants.WE_CHAT_PUBLIC_TEMP_KEY_ORDER_PAY_SUCCESS;
String type = Constants.PAY_TYPE_WE_CHAT_FROM_PUBLIC;
if(Constants.ORDER_PAY_CHANNEL_PROGRAM == getOrder().getIsChannel()){
tempKey = Constants.WE_CHAT_PROGRAM_TEMP_KEY_ORDER_PAY_SUCCESS;
type = Constants.PAY_TYPE_WE_CHAT_FROM_PROGRAM;
}
HashMap<String, String> map = new HashMap<>();
map.put(Constants.WE_CHAT_TEMP_KEY_FIRST, "订单支付成功");
map.put("orderId", getOrder().getOrderId());
map.put("payAmount", getOrder().getPayPrice().toString());
map.put(Constants.WE_CHAT_TEMP_KEY_END, "感谢购买!");
// String tempKey = Constants.WE_CHAT_PUBLIC_TEMP_KEY_ORDER_PAY_SUCCESS;
// String type = Constants.PAY_TYPE_WE_CHAT_FROM_PUBLIC;
// if(Constants.ORDER_PAY_CHANNEL_PROGRAM == getOrder().getIsChannel()){
// tempKey = Constants.WE_CHAT_PROGRAM_TEMP_KEY_ORDER_PAY_SUCCESS;
// type = Constants.PAY_TYPE_WE_CHAT_FROM_PROGRAM;
// }
//
// HashMap<String, String> map = new HashMap<>();
// map.put(Constants.WE_CHAT_TEMP_KEY_FIRST, "订单支付成功");
// map.put("orderId", getOrder().getOrderId());
// map.put("payAmount", getOrder().getPayPrice().toString());
// map.put(Constants.WE_CHAT_TEMP_KEY_END, "感谢购买!");
// templateMessageService.push(tempKey, map, getOrder().getUid(), type);
// 小程序发送订阅消息
String storeNameAndCarNumString = orderUtils.getStoreNameAndCarNumString(getOrder().getId());
if(StringUtils.isNotBlank(storeNameAndCarNumString)){
WechatSendMessageForPaySuccess paySuccess = new WechatSendMessageForPaySuccess(
getOrder().getId()+"",getOrder().getPayPrice()+"",getOrder().getPayTime()+"","暂无",
getOrder().getTotalPrice()+"",storeNameAndCarNumString);
orderUtils.sendWeiChatMiniMessageForPaySuccess(paySuccess, userService.getById(getOrder()).getUid());
}
}

View File

@@ -3,6 +3,7 @@ package com.zbkj.crmeb.pub.controller;
import com.alibaba.fastjson.JSONObject;
import com.common.CommonResult;
import com.utils.RestTemplateUtil;
import com.zbkj.crmeb.system.service.SystemAdminService;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiImplicitParam;
import io.swagger.annotations.ApiImplicitParams;
@@ -34,6 +35,9 @@ public class WeChatPushController {
@Resource
private RestTemplateUtil restTemplateUtil;
@Resource
private SystemAdminService systemAdminService;
/**
* 新增后台管理员表

View File

@@ -5,25 +5,19 @@ import com.common.CommonPage;
import com.common.CommonResult;
import com.common.PageParamRequest;
import com.constants.SmsConstants;
import com.exception.CrmebException;
import com.utils.ValidateCodeUtil;
import com.utils.ValidateFormUtil;
import com.zbkj.crmeb.sms.model.SmsRecord;
import com.zbkj.crmeb.sms.request.RegisterRequest;
import com.zbkj.crmeb.sms.request.SmsConfigRequest;
import com.zbkj.crmeb.sms.request.SmsLoginRequest;
import com.zbkj.crmeb.sms.request.SmsRecordRequest;
import com.zbkj.crmeb.sms.service.SmsRecordService;
import com.zbkj.crmeb.sms.service.SmsService;
import com.zbkj.crmeb.validatecode.model.ValidateCode;
import io.swagger.annotations.*;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.BeanUtils;
import org.springframework.web.bind.annotation.*;
import com.zbkj.crmeb.sms.service.SmsRecordService;
import com.zbkj.crmeb.sms.model.SmsRecord;
import java.math.BigDecimal;
import java.util.HashMap;
/**
@@ -247,36 +241,16 @@ public class SmsRecordController {
@ApiImplicitParams({
@ApiImplicitParam(name="title", value="名称"),
@ApiImplicitParam(name="status", value="状态"),
@ApiImplicitParam(name="type", value="type (1=验证码 2=通知 3=推广)"),
})
public CommonResult<JSONObject> tempList(@RequestParam(name = "status", required = false) Integer status,
@RequestParam(name = "title", required = false) String title,
@RequestParam(name = "type", required = false) String type,
@ModelAttribute PageParamRequest pageParamRequest){
JSONObject result = smsService.tempList(title, status, pageParamRequest);
JSONObject result = smsService.tempList(title, status, type, pageParamRequest);
return CommonResult.success(getDataByResult(result));
}
/**
* 短信提醒开关
* @param request
* @return
*/
@ApiOperation(value = "短信提醒开关保存")
@RequestMapping(value = "/config/save", method = RequestMethod.POST)
public CommonResult<Object> saveConfig(@ModelAttribute SmsConfigRequest request){
smsService.configSave(request);
return CommonResult.success();
}
/**
* 短信提醒开关
* @return
*/
@ApiOperation(value = "短信提醒开关列表")
@RequestMapping(value = "/config/list", method = RequestMethod.POST)
public CommonResult<Object> configList(){
return CommonResult.success(smsService.configList());
}
/**
* 从JSONObject 中取出msg
* @param result 结果数据

View File

@@ -33,8 +33,7 @@ public class SmsRecord implements Serializable {
}
public SmsRecord(Integer id, String uid, String phone, String content, String addIp, String template, Integer resultcode, Integer recordId, String message) {
this.id = id;
public SmsRecord(String uid, String phone, String content, String addIp, String template, Integer resultcode, Integer recordId, String message) {
this.uid = uid;
this.phone = phone;
this.content = content;

View File

@@ -1,9 +1,10 @@
package com.zbkj.crmeb.sms.service;
import com.alibaba.fastjson.JSON;
import com.alibaba.fastjson.JSONObject;
import com.common.PageParamRequest;
import com.zbkj.crmeb.sms.request.*;
import com.zbkj.crmeb.sms.request.RegisterRequest;
import com.zbkj.crmeb.sms.request.SendSmsVo;
import com.zbkj.crmeb.sms.request.SmsLoginRequest;
import java.math.BigDecimal;
import java.util.HashMap;
@@ -36,11 +37,7 @@ public interface SmsService{
JSONObject applyTempMessage(String title, String content, Integer type);
JSONObject tempList(String title, Integer status, PageParamRequest pageParamRequest);
boolean configSave(SmsConfigRequest request);
SmsConfigRequest configList();
JSONObject tempList(String title, Integer status, String type, PageParamRequest pageParamRequest);
boolean pushCodeToList(String phone, Integer tag,HashMap<String, Object> pram);

View File

@@ -6,14 +6,12 @@ import com.common.PageParamRequest;
import com.constants.Constants;
import com.constants.SmsConstants;
import com.exception.CrmebException;
import com.exception.ExceptionCodeEnum;
import com.utils.CrmebUtil;
import com.utils.RedisUtil;
import com.utils.RestTemplateUtil;
import com.zbkj.crmeb.sms.model.SmsRecord;
import com.zbkj.crmeb.sms.request.RegisterRequest;
import com.zbkj.crmeb.sms.request.SendSmsVo;
import com.zbkj.crmeb.sms.request.SmsConfigRequest;
import com.zbkj.crmeb.sms.request.SmsLoginRequest;
import com.zbkj.crmeb.sms.service.SmsRecordService;
import com.zbkj.crmeb.sms.service.SmsService;
@@ -21,7 +19,6 @@ import com.zbkj.crmeb.system.service.SystemConfigService;
import com.zbkj.crmeb.user.service.UserService;
import lombok.Data;
import org.apache.commons.codec.digest.DigestUtils;
import org.apache.commons.lang3.ArrayUtils;
import org.apache.commons.lang3.StringUtils;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
@@ -341,11 +338,12 @@ public class SmsServiceImpl implements SmsService {
* @return JSONObject
*/
@Override
public JSONObject tempList(String title, Integer status, PageParamRequest pageParamRequest) {
public JSONObject tempList(String title, Integer status, String type, PageParamRequest pageParamRequest) {
init();
Map<String, Object> map = mergeToken(CrmebUtil.objectToMap(pageParamRequest));
map.put("title", title);
map.put("status", status);
map.put("temp_type", type);
return post(SmsConstants.SMS_API_URL + SmsConstants.SMS_API_TEMP_LIST_URI, map);
}
@@ -363,12 +361,19 @@ public class SmsServiceImpl implements SmsService {
//发送手机验证码, 记录到redis sms_validate_code_手机号
switch (tag){
case SmsConstants.SMS_CONFIG_TYPE_VERIFICATION_CODE : // 验证码 特殊处理 code
//获取短信验证码过期时间
String codeExpireStr = systemConfigService.getValueByKey(Constants.CONFIG_KEY_SMS_CODE_EXPIRE);
if(StringUtils.isBlank(codeExpireStr) || Integer.parseInt(codeExpireStr) == 0){
codeExpireStr = Constants.NUM_FIVE + "";
}
Integer code = CrmebUtil.randomCount(111111, 999999);
HashMap<String, Object> justPram = new HashMap<>();
justPram.put("code", code);
justPram.put("time", codeExpireStr);
push(phone,SmsConstants.SMS_CONFIG_VERIFICATION_CODE,
SmsConstants.SMS_CONFIG_VERIFICATION_CODE_TEMP_ID,false,justPram);
redisUtil.set(userService.getValidateCodeRedisKey(phone), code, 5L, TimeUnit.MINUTES);//5分钟过期
redisUtil.set(userService.getValidateCodeRedisKey(phone), code, Long.valueOf(codeExpireStr), TimeUnit.MINUTES);//5分钟过期
break;
case SmsConstants.SMS_CONFIG_TYPE_LOWER_ORDER_SWITCH : // 支付成功短信提醒 pay_price order_id
@@ -448,7 +453,7 @@ public class SmsServiceImpl implements SmsService {
if(resultCode == Constants.HTTPSTATUS_CODE_SUCCESS){
try{
// 注意这里的状态仅仅是调用是否成功的状态 需要等待5分钟一周另外一个任务去查询发送状态后再更新status数据
SmsRecord smsRecord = new SmsRecord(0,sendSmsVo.getUid(), sendSmsVo.getMobile(),sendSmsVo.getContent(),
SmsRecord smsRecord = new SmsRecord(sendSmsVo.getUid(), sendSmsVo.getMobile(),sendSmsVo.getContent(),
"", sendSmsVo.getTemplate().toString(),
resultCode,Integer.parseInt(smsRecodeId), message);
smsRecordService.save(smsRecord);
@@ -495,42 +500,6 @@ public class SmsServiceImpl implements SmsService {
}
}
/**
* 短信发送开关配置
* @param request 开关配置项
* @return 配置结果
*/
@Override
public boolean configSave(SmsConfigRequest request) {
systemConfigService.updateOrSaveValueByName(SmsConstants.SMS_CONFIG_LOWER_ORDER_SWITCH,request.getLowerOrderSwitch());
systemConfigService.updateOrSaveValueByName(SmsConstants.SMS_CONFIG_DELIVER_GOODS_SWITCH,request.getDeliverGoodsSwitch());
systemConfigService.updateOrSaveValueByName(SmsConstants.SMS_CONFIG_CONFIRM_TAKE_OVER_SWITCH,request.getConfirmTakeOverSwitch());
systemConfigService.updateOrSaveValueByName(SmsConstants.SMS_CONFIG_ADMIN_LOWER_ORDER_SWITCH,request.getAdminLowerOrderSwitch());
systemConfigService.updateOrSaveValueByName(SmsConstants.SMS_CONFIG_ADMIN_PAY_SUCCESS_SWITCH,request.getAdminPaySuccessSwitch());
systemConfigService.updateOrSaveValueByName(SmsConstants.SMS_CONFIG_ADMIN_REFUND_SWITCH,request.getAdminRefundSwitch());
systemConfigService.updateOrSaveValueByName(SmsConstants.SMS_CONFIG_ADMIN_CONFIRM_TAKE_OVER_SWITCH,request.getAdminConfirmTakeOverSwitch());
systemConfigService.updateOrSaveValueByName(SmsConstants.SMS_CONFIG_PRICE_REVISION_SWITCH,request.getPriceRevisionSwitch());
return true;
}
/**
* 获取短信配置
* @return
*/
@Override
public SmsConfigRequest configList() {
SmsConfigRequest config = new SmsConfigRequest();
config.setLowerOrderSwitch(systemConfigService.getValueByKey(SmsConstants.SMS_CONFIG_LOWER_ORDER_SWITCH));
config.setDeliverGoodsSwitch(systemConfigService.getValueByKey(SmsConstants.SMS_CONFIG_DELIVER_GOODS_SWITCH));
config.setConfirmTakeOverSwitch(systemConfigService.getValueByKey(SmsConstants.SMS_CONFIG_CONFIRM_TAKE_OVER_SWITCH));
config.setAdminLowerOrderSwitch(systemConfigService.getValueByKey(SmsConstants.SMS_CONFIG_ADMIN_LOWER_ORDER_SWITCH));
config.setAdminPaySuccessSwitch(systemConfigService.getValueByKey(SmsConstants.SMS_CONFIG_ADMIN_PAY_SUCCESS_SWITCH));
config.setAdminRefundSwitch(systemConfigService.getValueByKey(SmsConstants.SMS_CONFIG_ADMIN_REFUND_SWITCH));
config.setAdminConfirmTakeOverSwitch(systemConfigService.getValueByKey(SmsConstants.SMS_CONFIG_ADMIN_CONFIRM_TAKE_OVER_SWITCH));
config.setPriceRevisionSwitch(systemConfigService.getValueByKey(SmsConstants.SMS_CONFIG_PRICE_REVISION_SWITCH));
return config;
}
/**
* 添加待发送消息到redis队列
* @param phone
@@ -549,6 +518,7 @@ public class SmsServiceImpl implements SmsService {
mParam.put("mobile", phone);
mParam.put("template", msgTempId);
mParam.put("param", JSONObject.toJSONString(mapPram));
if(!valid){
redisUtil.lPush(SmsConstants.SMS_SEND_KEY, JSONObject.toJSONString(mParam));
return;
@@ -566,7 +536,7 @@ public class SmsServiceImpl implements SmsService {
@Override
public void pushByAsyncStatus(String recordIds) {
if(null == recordIds) return;
redisUtil.lPush(SmsConstants.SMS_SEND_RESULT_KEY, recordIds);
redisUtil.lPush(SmsConstants.SMS_SEND_RESULT_KEY, JSONObject.toJSONString(recordIds));
}
/**
@@ -714,4 +684,3 @@ public class SmsServiceImpl implements SmsService {
}
}
}

View File

@@ -5,15 +5,15 @@ import com.common.PageParamRequest;
import com.exception.CrmebException;
import com.zbkj.crmeb.express.vo.LogisticsResultVo;
import com.zbkj.crmeb.store.model.StoreOrder;
import com.zbkj.crmeb.store.request.StoreOrderRefundRequest;
import com.zbkj.crmeb.store.request.StoreOrderRequest;
import com.zbkj.crmeb.store.request.StoreOrderSearchRequest;
import com.zbkj.crmeb.store.request.StoreOrderSendRequest;
import com.zbkj.crmeb.store.request.*;
import com.zbkj.crmeb.store.response.StoreOrderInfoResponse;
import com.zbkj.crmeb.store.response.StoreOrderResponse;
import com.zbkj.crmeb.store.response.StoreStaffDetail;
import com.zbkj.crmeb.store.response.StoreStaffTopDetail;
import com.zbkj.crmeb.store.service.StoreOrderService;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiOperation;
import com.zbkj.crmeb.store.service.StoreOrderVerification;
import io.swagger.annotations.*;
import io.swagger.models.auth.In;
import lombok.extern.slf4j.Slf4j;
import org.apache.commons.lang3.StringUtils;
import org.springframework.beans.BeanUtils;
@@ -21,6 +21,8 @@ import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.validation.annotation.Validated;
import org.springframework.web.bind.annotation.*;
import java.math.BigDecimal;
import java.util.List;
/**
@@ -36,6 +38,9 @@ public class StoreOrderController {
@Autowired
private StoreOrderService storeOrderService;
@Autowired
private StoreOrderVerification storeOrderVerification;
/**
* 分页显示订单表
* @param request 搜索条件
@@ -186,6 +191,88 @@ public class StoreOrderController {
public CommonResult<LogisticsResultVo> getLogisticsInfo(@RequestParam(value = "id") Integer id){
return CommonResult.success(storeOrderService.getLogisticsInfo(id));
}
/**
* 核销订单头部数据
* @author stivepeim
* @since 2020-08-29
*/
@ApiOperation(value = "核销订单头部数据")
@RequestMapping(value = "/statistics", method = RequestMethod.GET)
public CommonResult<StoreStaffTopDetail> getStatistics(){
return CommonResult.success(storeOrderVerification.getOrderVerificationData());
}
/**
* 核销订单头部数据
* @author stivepeim
* @since 2020-08-29
*/
@ApiOperation(value = "核销订单 月列表数据")
@RequestMapping(value = "/statisticsData", method = RequestMethod.GET)
public CommonResult<List<StoreStaffDetail>> getStaffDetail(StoreOrderStaticsticsRequest request){
return CommonResult.success(storeOrderVerification.getOrderVerificationDetail(request));
}
/**
* 核销码核销订单
* @author stivepeim
* @since 2020-09-01
*/
@ApiOperation(value = "核销码核销订单")
@RequestMapping(value = "/writeUpdate/{vCode}", method = RequestMethod.GET)
public CommonResult<Object> verificationOrder(
@PathVariable String vCode){
return CommonResult.success(storeOrderVerification.verificationOrderByCode(vCode));
}
/**
* 核销码核销订单
* @author stivepeim
* @since 2020-09-01
*/
@ApiOperation(value = "核销码查询待核销订单")
@RequestMapping(value = "/writeConfirm/{vCode}", method = RequestMethod.GET)
public CommonResult<Object> verificationConfirmOrder(
@PathVariable String vCode){
return CommonResult.success(storeOrderVerification.getVerificationOrderByCode(vCode));
}
/**
* 一键改价
* @author stivepeim
* @since 2020-09-01
*/
@ApiOperation(value = "一键改价")
@RequestMapping(value = "/editPrice", method = RequestMethod.GET)
public CommonResult<Object> editOrderPrice(
@RequestParam String orderId, @RequestParam(required = true,defaultValue = "0") BigDecimal price){
try {
if(price.compareTo(BigDecimal.ZERO) < 0) throw new CrmebException("请输入合法参数");
}catch (Exception e){
throw new CrmebException("价格参数错误");
}
return CommonResult.success(storeOrderService.editPrice(orderId,price));
}
/**
* 订单统计详情
* @author stivepeim
* @since 2020-09-01
*/
@ApiOperation(value = "订单统计详情")
@RequestMapping(value = "/time", method = RequestMethod.GET)
@ApiImplicitParams({
@ApiImplicitParam(name = "dateLimit", value = "today,yesterday,lately7,lately30,month,year,/yyyy-MM-dd hh:mm:ss,yyyy-MM-dd hh:mm:ss/",
dataType = "String", required = true),
@ApiImplicitParam(name = "type", value="1=price 2=order", required = true)
})
public CommonResult<Object> statisticsOrderTime(@RequestParam String dateLimit,
@RequestParam Integer type){
return CommonResult.success(storeOrderService.orderStatisticsByTime(dateLimit,type));
}
}

View File

@@ -1,9 +1,15 @@
package com.zbkj.crmeb.store.dao;
import com.common.PageParamRequest;
import com.zbkj.crmeb.store.model.StoreOrder;
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import com.zbkj.crmeb.store.request.StoreDateRangeSqlPram;
import com.zbkj.crmeb.store.request.StoreOrderStaticsticsRequest;
import com.zbkj.crmeb.store.response.StoreOrderStatisticsChartItemResponse;
import com.zbkj.crmeb.store.response.StoreStaffDetail;
import java.math.BigDecimal;
import java.util.List;
/**
* <p>
@@ -20,4 +26,26 @@ public interface StoreOrderDao extends BaseMapper<StoreOrder> {
BigDecimal getRefundPrice(String where);
Integer getRefundTotal(String where);
/**
* 核销详情 月数据
* @param request 分页和日期
* @return 月数据
*/
List<StoreStaffDetail> getOrderVerificationDetail(StoreOrderStaticsticsRequest request);
/**
* 订单统计详情 price
* @param pram 时间区间参数
* @return 月数据
*/
List<StoreOrderStatisticsChartItemResponse> getOrderStatisticsPriceDetail(StoreDateRangeSqlPram pram);
/**
* 订单统计详情 订单量
* @param pram 时间区间参数
* @return 月数据
*/
List<StoreOrderStatisticsChartItemResponse> getOrderStatisticsOrderCountDetail(StoreDateRangeSqlPram pram);
}

View File

@@ -0,0 +1,21 @@
package com.zbkj.crmeb.store.request;
import lombok.Data;
/**
* @Classname StoreDateRangeSqlPram
* @Description 订单时间参数,开始时间结束时间
* @Date 9/4/20 10:09 上午
* @Created by stivepeim
*/
@Data
public class StoreDateRangeSqlPram {
public StoreDateRangeSqlPram(String startTime, String endTime) {
this.startTime = startTime;
this.endTime = endTime;
}
private String startTime;
private String endTime;
}

View File

@@ -0,0 +1,30 @@
package com.zbkj.crmeb.store.request;
import com.constants.Constants;
import com.fasterxml.jackson.annotation.JsonIgnore;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
/**
* @Classname StoreOrderStaticsticsRequest
* @Description 订单统计详情request
* @Date 9/4/20 12:23 下午
* @Created by stivepeim
*/
@Data
public class StoreOrderStaticsticsRequest {
@ApiModelProperty(value = "页码", example= Constants.DEFAULT_PAGE + "")
private int page = Constants.DEFAULT_PAGE;
@ApiModelProperty(value = "每页数量", example = Constants.DEFAULT_LIMIT + "")
private int limit = Constants.DEFAULT_LIMIT;
@ApiModelProperty(value = "today,yesterday,lately7,lately30,month,year,/yyyy-MM-dd hh:mm:ss,yyyy-MM-dd hh:mm:ss/")
private String dateLimit;
@JsonIgnore
private String startTime;
@JsonIgnore
private String endTime;
}

View File

@@ -62,6 +62,9 @@ public class StoreOrderCountItemResponse implements Serializable {
@ApiModelProperty(value = "已退款")
private Integer refunded;
@ApiModelProperty(value = "0 未退款 1 申请中 2 已退款")
private Integer refundStatus;
@ApiModelProperty(value = "已删除")
private Integer deleted;
}

View File

@@ -4,6 +4,9 @@ import com.baomidou.mybatisplus.annotation.IdType;
import com.baomidou.mybatisplus.annotation.TableField;
import com.baomidou.mybatisplus.annotation.TableId;
import com.baomidou.mybatisplus.annotation.TableName;
import com.zbkj.crmeb.store.model.StoreOrderInfo;
import com.zbkj.crmeb.store.vo.StoreOrderInfoVo;
import com.zbkj.crmeb.system.model.SystemStore;
import com.zbkj.crmeb.user.model.User;
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
@@ -15,6 +18,7 @@ import java.io.Serializable;
import java.math.BigDecimal;
import java.util.Date;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
/**
@@ -198,4 +202,10 @@ public class StoreOrderInfoResponse implements Serializable {
@ApiModelProperty(value = "用户信息")
private User user;
@ApiModelProperty(value = "订单商品详情")
List<StoreOrderInfoVo> orderInfo;
@ApiModelProperty(value = "提货点")
private SystemStore systemStore;
}

View File

@@ -0,0 +1,17 @@
package com.zbkj.crmeb.store.response;
import io.swagger.annotations.Api;
import lombok.Data;
/**
* @Classname StoreOrderStatisticsChartItemResponse
* @Description 订单统计 response item
* @Date 9/4/20 10:02 上午
* @Created by stivepeim
*/
@Data
public class StoreOrderStatisticsChartItemResponse {
private String num;
private String time;
}

View File

@@ -0,0 +1,33 @@
package com.zbkj.crmeb.store.response;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
import lombok.RequiredArgsConstructor;
import java.math.BigDecimal;
import java.util.HashMap;
import java.util.List;
/**
* @Classname StoreOrderStatisticsResponse
* @Description TODO
* @Date 9/2/20 5:58 下午
* @Created by stivepeim
*/
@Data
public class StoreOrderStatisticsResponse {
@ApiModelProperty(value = "订单数图标数据")
private List<StoreOrderStatisticsChartItemResponse> chart; // 订单数图标数据
@ApiModelProperty(value = "时间区间增长率")
private Integer growthRate; // 时间区间增长率
@ApiModelProperty(value = "同比")
private String increaseTime;
@ApiModelProperty(value = "同比上个时间区间增长营业额 1=增长2=减少")
private Integer increaseTimeStatus; // 同比上个时间区间增长营业额 1=增长2=减少
@ApiModelProperty(value = "时间区间订单数")
private BigDecimal time;
}

View File

@@ -0,0 +1,182 @@
package com.zbkj.crmeb.store.response;
import com.baomidou.mybatisplus.annotation.IdType;
import com.baomidou.mybatisplus.annotation.TableField;
import com.baomidou.mybatisplus.annotation.TableId;
import com.zbkj.crmeb.store.model.StoreOrderInfo;
import com.zbkj.crmeb.store.vo.StoreOrderInfoVo;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
import java.math.BigDecimal;
import java.util.Date;
import java.util.List;
/**
* @Classname StoreOrderVerificationConfirmResponse
* @Description 核销订单确认前的数据
* @Date 9/1/20 5:26 下午
* @Created by stivepeim
*/
@Data
public class StoreOrderVerificationConfirmResponse {
@ApiModelProperty(value = "订单ID")
private Integer id;
@ApiModelProperty(value = "订单号")
private String orderId;
@ApiModelProperty(value = "用户id")
private Integer uid;
@ApiModelProperty(value = "用户姓名")
private String realName;
@ApiModelProperty(value = "用户电话")
private String userPhone;
@ApiModelProperty(value = "详细地址")
private String userAddress;
@ApiModelProperty(value = "运费金额")
private BigDecimal freightPrice;
@ApiModelProperty(value = "订单商品总数")
private Integer totalNum;
@ApiModelProperty(value = "订单总价")
private BigDecimal totalPrice;
@ApiModelProperty(value = "邮费")
private BigDecimal totalPostage;
@ApiModelProperty(value = "实际支付金额")
private BigDecimal payPrice;
@ApiModelProperty(value = "支付邮费")
private BigDecimal payPostage;
@ApiModelProperty(value = "抵扣金额")
private BigDecimal deductionPrice;
@ApiModelProperty(value = "优惠券id")
private Integer couponId;
@ApiModelProperty(value = "优惠券金额")
private BigDecimal couponPrice;
@ApiModelProperty(value = "支付状态")
private Boolean paid;
@ApiModelProperty(value = "支付时间")
private Date payTime;
@ApiModelProperty(value = "支付方式")
private String payType;
@ApiModelProperty(value = "创建时间")
private Date createTime;
// @ApiModelProperty(value = "创建时间") todo ZL
// private String day;
@ApiModelProperty(value = "订单状态(-1 : 申请退款 -2 : 退货成功 0待发货1待收货2已收货待评价3已完成")
private Integer status;
@ApiModelProperty(value = "0 未退款 1 申请中 2 已退款")
private Integer refundStatus;
@ApiModelProperty(value = "退款图片")
private String refundReasonWapImg;
@ApiModelProperty(value = "退款用户说明")
private String refundReasonWapExplain;
@ApiModelProperty(value = "退款时间")
private Date refundReasonTime;
@ApiModelProperty(value = "前台退款原因")
private String refundReasonWap;
@ApiModelProperty(value = "不退款的理由")
private String refundReason;
@ApiModelProperty(value = "退款金额")
private BigDecimal refundPrice;
@ApiModelProperty(value = "快递名称/送货人姓名")
private String deliveryName;
@ApiModelProperty(value = "发货类型")
private String deliveryType;
@ApiModelProperty(value = "快递单号/手机号")
private String deliveryId;
@ApiModelProperty(value = "消费赚取积分")
private Integer gainIntegral;
@ApiModelProperty(value = "使用积分")
private Integer useIntegral;
@ApiModelProperty(value = "给用户退了多少积分")
private Integer backIntegral;
@ApiModelProperty(value = "备注")
private String mark;
@ApiModelProperty(value = "是否删除")
private Boolean isDel;
@ApiModelProperty(value = "唯一id(md5加密)类似id")
@TableField(value = "`unique`")
private String unique;
@ApiModelProperty(value = "管理员备注")
private String remark;
@ApiModelProperty(value = "商户ID")
private Integer merId;
private Integer isMerCheck;
@ApiModelProperty(value = "拼团商品id0一般商品")
private Integer combinationId;
@ApiModelProperty(value = "拼团id 0没有拼团")
private Integer pinkId;
@ApiModelProperty(value = "成本价")
private BigDecimal cost;
@ApiModelProperty(value = "秒杀商品ID")
private Integer seckillId;
@ApiModelProperty(value = "砍价id")
private Integer bargainId;
@ApiModelProperty(value = "核销码")
private String verifyCode;
@ApiModelProperty(value = "门店id")
private Integer storeId;
@ApiModelProperty(value = "配送方式 1=快递 2=门店自提")
private Integer shippingType;
@ApiModelProperty(value = "店员id")
private Integer clerkId;
@ApiModelProperty(value = "支付渠道(0微信公众号1微信小程序)")
private int isChannel;
@ApiModelProperty(value = "消息提醒")
private Boolean isRemind;
@ApiModelProperty(value = "后台是否删除")
private Boolean isSystemDel;
@ApiModelProperty(value = "订单详情")
private List<StoreOrderInfoVo> storeOrderInfoVos;
}

View File

@@ -0,0 +1,18 @@
package com.zbkj.crmeb.store.response;
import lombok.Data;
import java.math.BigDecimal;
/**
* @Classname StoreStaffDetail
* @Description 核销月详情Response
* @Date 8/31/20 2:50 下午
* @Created by stivepeim
*/
@Data
public class StoreStaffDetail {
private Integer count;
private BigDecimal price;
private String time;
}

View File

@@ -0,0 +1,30 @@
package com.zbkj.crmeb.store.response;
import lombok.Data;
import java.math.BigDecimal;
/**
* @Classname StoreStaffTopDetail
* @Description 核销订单top数据对象
* @Date 8/29/20 3:37 下午
* @Created by stivepeim
*/
@Data
public class StoreStaffTopDetail {
private Integer completeCount; // 订单完成订单数量
private Integer evaluatedCount;// 待评价订单数量
private Integer monthCount;
private BigDecimal monthPrice;
private Integer orderCount;
private Integer proCount;
private BigDecimal proPrice;
private Integer receivedCount;
private Integer refundCount;
private BigDecimal sumPrice;
private Integer todayCount;
private BigDecimal todayPrice;
private Integer unpaidCount;
private Integer unshippedCount;
private Integer verificationCount;// 待核销数量
}

View File

@@ -31,7 +31,7 @@ public interface StoreCartService extends IService<StoreCart> {
* @param cartIds 购物车id集合
* @return 购物车列表
*/
List<StoreCartResponse> getListByUserIdAndCartIds(Integer userId, List<Integer> cartIds);
List<StoreCartResponse> getListByUserIdAndCartIds(Integer userId, List<Integer> cartIds,Integer isNew);
/**
* 根据用户id和购物车id集合获取列表

View File

@@ -7,9 +7,7 @@ import com.zbkj.crmeb.store.model.StoreOrder;
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.RetailShopOrderDataResponse;
import com.zbkj.crmeb.store.response.StoreOrderInfoResponse;
import com.zbkj.crmeb.store.response.StoreOrderResponse;
import com.zbkj.crmeb.store.response.*;
import com.zbkj.crmeb.system.request.SystemWriteOffOrderSearchRequest;
import com.zbkj.crmeb.system.response.SystemWriteOffOrderResponse;
import com.zbkj.crmeb.user.model.User;
@@ -132,4 +130,34 @@ public interface StoreOrderService extends IService<StoreOrder> {
LogisticsResultVo getLogisticsInfo(Integer id);
Map<String, String> getStatus(StoreOrder storeOrder);
/**
* 更改订单价格
* @param orderId 订单id wx开头
* @param price 待更改价格
* @return 更改结果
*/
boolean editPrice(String orderId,BigDecimal price);
/**
* 确认付款
* @param orderId 订单号
* @return 确认付款结果
*/
boolean confirmPayed(String orderId);
/**
* 线下付款
* @param orderId 待付款订单id
* @return 付款结果
*/
boolean payOrderOffLine(Integer orderId);
/**
* 根据时间参数统计订单价格
* @param dateLimit 时间区间
* @param type 1=price 2=订单量
* @return 统计订单信息
*/
StoreOrderStatisticsResponse orderStatisticsByTime(String dateLimit,Integer type);
}

View File

@@ -0,0 +1,43 @@
package com.zbkj.crmeb.store.service;
import com.common.PageParamRequest;
import com.zbkj.crmeb.store.model.StoreOrder;
import com.zbkj.crmeb.store.request.StoreOrderStaticsticsRequest;
import com.zbkj.crmeb.store.response.StoreOrderVerificationConfirmResponse;
import com.zbkj.crmeb.store.response.StoreStaffDetail;
import com.zbkj.crmeb.store.response.StoreStaffTopDetail;
import java.util.List;
/**
* @Classname StoreOrderVerification
* @Description 订单核销业务
* @Date 9/1/20 10:25 上午
* @Created by stivepeim
*/
public interface StoreOrderVerification {
/**
* 获取订单核销数据
*/
StoreStaffTopDetail getOrderVerificationData();
/**
* 核销月详情
* @return 月详情
*/
List<StoreStaffDetail> getOrderVerificationDetail(StoreOrderStaticsticsRequest request);
/**
* 根据核销码核销订单
* @param vCode 核销码
* @return 核销结果
*/
boolean verificationOrderByCode(String vCode);
/**
* 根据核销码查询待核销订单
* @param vCode 核销码
* @return 待核销订单详情
*/
StoreOrderVerificationConfirmResponse getVerificationOrderByCode(String vCode);
}

View File

@@ -3,12 +3,17 @@ package com.zbkj.crmeb.store.service.impl;
import com.alibaba.fastjson.JSONObject;
import com.constants.Constants;
import com.utils.DateUtil;
import com.utils.RedisUtil;
import com.zbkj.crmeb.store.model.StoreOrder;
import com.zbkj.crmeb.store.service.OrderTaskService;
import com.zbkj.crmeb.store.service.StoreOrderService;
import com.zbkj.crmeb.store.service.StoreOrderTaskService;
import com.zbkj.crmeb.store.utilService.OrderUtils;
import com.zbkj.crmeb.task.order.OrderRefundByUser;
import com.zbkj.crmeb.wechat.service.impl.WechatSendMessageForMinService;
import com.zbkj.crmeb.wechat.vo.WechatSendMessageForGetPackage;
import com.zbkj.crmeb.wechat.vo.WechatSendMessageForOrderCancel;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
@@ -33,6 +38,12 @@ public class OrderTaskServiceImpl implements OrderTaskService {
@Autowired
private StoreOrderService storeOrderService;
@Autowired
private WechatSendMessageForMinService wechatSendMessageForMinService;
@Autowired
private OrderUtils orderUtils;
/**
* 用户取消订单
* @author Mr.Zhang
@@ -58,6 +69,14 @@ public class OrderTaskServiceImpl implements OrderTaskService {
boolean result = storeOrderTaskService.cancelByUser(storeOrder);
if(!result){
redisUtil.lPush(redisKey, data);
}else{
WechatSendMessageForOrderCancel orderCancel = new WechatSendMessageForOrderCancel(
"暂无",DateUtil.nowDateTimeStr(),"","暂无",orderUtils.getPayTypeStrByOrder(storeOrder),
orderUtils.getStoreNameAndCarNumString(storeOrder.getId()),storeOrder.getOrderId(),
storeOrder.getStatus()+"",storeOrder.getPayPrice()+"",storeOrder.getCreateTime()+"",
"CRMEB","暂无",storeOrder.getOrderId(),"CRMEB","暂无"
);
wechatSendMessageForMinService.sendOrderCancelMessage(orderCancel,storeOrder.getUid());
}
}catch (Exception e){
redisUtil.lPush(redisKey, data);
@@ -155,6 +174,13 @@ public class OrderTaskServiceImpl implements OrderTaskService {
boolean result = storeOrderTaskService.takeByUser(storeOrder);
if(!result){
redisUtil.lPush(redisKey, id);
}else{
// 微信小程序订阅消息通知 确认收货
WechatSendMessageForGetPackage getPackage = new WechatSendMessageForGetPackage(
orderUtils.getPayTypeStrByOrder(storeOrder),orderUtils.getStoreNameAndCarNumString(storeOrder.getId()),
"CRMEB",storeOrder.getUserAddress(), DateUtil.nowDateTimeStr(),storeOrder.getOrderId()
);
wechatSendMessageForMinService.sendGetPackageMessage(getPackage, storeOrder.getUid());
}
}catch (Exception e){
redisUtil.lPush(redisKey, id);

View File

@@ -121,13 +121,15 @@ public class StoreCartServiceImpl extends ServiceImpl<StoreCartDao, StoreCart> i
* 根据用户id和购物车id查询
* @param userId 用户id
* @param cartIds 购物车id集合
* @param isNew 是否立即购买
* @return 购物车列表
*/
@Override
public List<StoreCartResponse> getListByUserIdAndCartIds(Integer userId, List<Integer> cartIds) {
public List<StoreCartResponse> getListByUserIdAndCartIds(Integer userId, List<Integer> cartIds,Integer isNew) {
LambdaQueryWrapper<StoreCart> lambdaQueryWrapper = new LambdaQueryWrapper<>();
lambdaQueryWrapper.in(StoreCart::getId,cartIds);
lambdaQueryWrapper.eq(StoreCart::getUid, userId);
if(null != isNew) lambdaQueryWrapper.eq(StoreCart::getIsNew, isNew);
lambdaQueryWrapper.orderByDesc(StoreCart::getCreateTime);
List<StoreCart> storeCarts = dao.selectList(lambdaQueryWrapper);
List<StoreCartResponse> response = new ArrayList<>();
@@ -205,9 +207,10 @@ public class StoreCartServiceImpl extends ServiceImpl<StoreCartDao, StoreCart> i
storeCartPram.setProductAttrUnique(storeCart.getProductAttrUnique());
storeCartPram.setUid(userService.getUserId());
List<StoreCart> existCarts = getByEntity(storeCartPram); // todo 这里仅仅能获取一条以信息
if(existCarts.size() > 0){
if(existCarts.size() > 0 && !storeCart.getIsNew()){
StoreCart forUpdateStoreCart = existCarts.get(0);
forUpdateStoreCart.setCartNum(forUpdateStoreCart.getCartNum()+storeCart.getCartNum());
storeCart.setIsNew(false);
boolean updateResult = updateById(forUpdateStoreCart);
storeCart.setId(forUpdateStoreCart.getId());
return updateResult;
@@ -215,6 +218,7 @@ public class StoreCartServiceImpl extends ServiceImpl<StoreCartDao, StoreCart> i
User currentUser = userService.getInfo();
storeCart.setUid(currentUser.getUid());
storeCart.setType("product");
storeCart.setIsNew(true);
return dao.insert(storeCart) > 0;
}
}
@@ -339,7 +343,7 @@ public class StoreCartServiceImpl extends ServiceImpl<StoreCartDao, StoreCart> i
queryWrapper.select("sum(cart_num) as cart_num")
.eq("uid", userId)
.eq("type", type)
.eq("is_new", false);
.eq("is_new", true);
StoreCart storeCart = dao.selectOne(queryWrapper);
if(null == storeCart || null == storeCart.getCartNum()){
return 0;

View File

@@ -3,6 +3,7 @@ package com.zbkj.crmeb.store.service.impl;
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.baomidou.mybatisplus.core.conditions.update.LambdaUpdateWrapper;
import com.baomidou.mybatisplus.core.toolkit.Wrappers;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import com.common.CommonPage;
import com.common.PageParamRequest;
@@ -12,7 +13,6 @@ import com.github.pagehelper.Page;
import com.github.pagehelper.PageHelper;
import com.github.pagehelper.PageInfo;
import com.utils.DateUtil;
import com.utils.RedisUtil;
import com.utils.ValidateFormUtil;
import com.utils.vo.dateLimitUtilVo;
import com.zbkj.crmeb.express.model.Express;
@@ -21,12 +21,12 @@ import com.zbkj.crmeb.express.service.LogisticService;
import com.zbkj.crmeb.express.vo.LogisticsResultVo;
import com.zbkj.crmeb.finance.request.FundsMonitorSearchRequest;
import com.zbkj.crmeb.front.vo.OrderAgainVo;
import com.zbkj.crmeb.payment.service.OrderPayService;
import com.zbkj.crmeb.store.dao.StoreOrderDao;
import com.zbkj.crmeb.store.model.StoreOrder;
import com.zbkj.crmeb.store.model.StoreOrderStatus;
import com.zbkj.crmeb.store.model.StoreProduct;
import com.zbkj.crmeb.store.model.StoreProductAttrValue;
import com.zbkj.crmeb.store.request.StoreDateRangeSqlPram;
import com.zbkj.crmeb.store.request.StoreOrderRefundRequest;
import com.zbkj.crmeb.store.request.StoreOrderSearchRequest;
import com.zbkj.crmeb.store.request.StoreOrderSendRequest;
@@ -34,11 +34,13 @@ import com.zbkj.crmeb.store.response.*;
import com.zbkj.crmeb.store.service.*;
import com.zbkj.crmeb.store.utilService.OrderUtils;
import com.zbkj.crmeb.store.vo.StoreOrderInfoVo;
import com.zbkj.crmeb.system.model.SystemAdmin;
import com.zbkj.crmeb.system.model.SystemStore;
import com.zbkj.crmeb.system.model.SystemStoreStaff;
import com.zbkj.crmeb.system.request.SystemWriteOffOrderSearchRequest;
import com.zbkj.crmeb.system.response.StoreOrderItemResponse;
import com.zbkj.crmeb.system.response.SystemWriteOffOrderResponse;
import com.zbkj.crmeb.system.service.SystemAdminService;
import com.zbkj.crmeb.system.service.SystemStoreService;
import com.zbkj.crmeb.system.service.SystemStoreStaffService;
import com.zbkj.crmeb.user.model.User;
@@ -47,11 +49,12 @@ import com.zbkj.crmeb.user.request.UserOperateFundsRequest;
import com.zbkj.crmeb.user.service.UserBillService;
import com.zbkj.crmeb.user.service.UserService;
import com.zbkj.crmeb.wechat.service.TemplateMessageService;
import com.zbkj.crmeb.wechat.service.WeChatService;
import com.zbkj.crmeb.wechat.service.impl.WechatSendMessageForMinService;
import com.zbkj.crmeb.wechat.vo.WechatSendMessageForPaySuccess;
import com.zbkj.crmeb.wechat.vo.WechatSendMessageForReFundEd;
import org.apache.commons.lang3.StringUtils;
import org.springframework.beans.BeanUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.annotation.Lazy;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
@@ -81,10 +84,6 @@ public class StoreOrderServiceImpl extends ServiceImpl<StoreOrderDao, StoreOrder
@Autowired
private StoreOrderInfoService StoreOrderInfoService;
@Lazy
@Autowired
private WeChatService weChatService;
@Autowired
private UserService userService;
@@ -118,10 +117,10 @@ public class StoreOrderServiceImpl extends ServiceImpl<StoreOrderDao, StoreOrder
private StoreProductAttrValueService storeProductAttrValueService;
@Autowired
private RedisUtil redisUtil;
private WechatSendMessageForMinService wechatSendMessageForMinService;
@Autowired
private OrderPayService orderPayService;
private SystemAdminService systemAdminService;
@@ -206,7 +205,7 @@ public class StoreOrderServiceImpl extends ServiceImpl<StoreOrderDao, StoreOrder
public List<StoreOrder> getUserOrderList(StoreOrder storeOrder, PageParamRequest pageParamRequest) {
this.pageInfo = PageHelper.startPage(pageParamRequest.getPage(), pageParamRequest.getLimit());
LambdaQueryWrapper<StoreOrder> lqw = new LambdaQueryWrapper<>();
statusApiByWhere(lqw,storeOrder.getStatus());
orderUtils.statusApiByWhere(lqw,storeOrder.getStatus());
if(null != storeOrder.getId()){
lqw.eq(StoreOrder::getId, storeOrder.getId());
}
@@ -445,6 +444,16 @@ public class StoreOrderServiceImpl extends ServiceImpl<StoreOrderDao, StoreOrder
userBill.setMark("余额支付" + storeOrder.getPayPrice() + "元购买商品");
boolean saveUserBillResult = userBillService.save(userBill);
boolean paySuccessResult = paySuccess(storeOrder,currentUser,formId);
// 微信小程序订阅消息 付款成功
String storeNameAndCarNumString = orderUtils.getStoreNameAndCarNumString(storeOrder.getId());
if(StringUtils.isNotBlank(storeNameAndCarNumString)){
WechatSendMessageForPaySuccess paySuccess = new WechatSendMessageForPaySuccess(
storeOrder.getOrderId(),storeOrder.getPayPrice()+"",storeOrder.getPayTime()+"","暂无",
storeOrder.getTotalPrice()+"",storeNameAndCarNumString);
orderUtils.sendWeiChatMiniMessageForPaySuccess(paySuccess, currentUser.getUid());
}
return updateUserResult && saveUserBillResult && paySuccessResult;
// return updateUserResult;
}
@@ -460,16 +469,16 @@ public class StoreOrderServiceImpl extends ServiceImpl<StoreOrderDao, StoreOrder
@Override
public SystemWriteOffOrderResponse getWriteOffList(SystemWriteOffOrderSearchRequest request, PageParamRequest pageParamRequest) {
LambdaQueryWrapper<StoreOrder> lambdaQueryWrapper = new LambdaQueryWrapper<>();
String where = " is_del = 0";
String where = " is_del = 0 and shipping_type = 2";
// String where = " is_del = 0 and paid = 1";
//时间
if(!StringUtils.isBlank(request.getData())){
dateLimitUtilVo dateLimit = DateUtil.getDateLimit(request.getData());
if(!StringUtils.isBlank(request.getDateLimit())){
dateLimitUtilVo dateLimit = DateUtil.getDateLimit(request.getDateLimit());
where += " and (create_time between '" + dateLimit.getStartTime() + "' and '" + dateLimit.getEndTime() + "' )";
}
if(!StringUtils.isBlank(request.getKeywords())){
where += " and (real_name like '% "+ request.getKeywords() +" %' or user_phone = '"+ request.getKeywords() +"' or order_id = '" + request.getKeywords() + "' or id = '" + request.getKeywords() + "' )";
where += " and (real_name like '%"+ request.getKeywords() +"%' or user_phone = '"+ request.getKeywords() +"' or order_id = '" + request.getKeywords() + "' or id = '" + request.getKeywords() + "' )";
}
if(request.getStoreId() != null && request.getStoreId() > 0){
@@ -495,7 +504,6 @@ public class StoreOrderServiceImpl extends ServiceImpl<StoreOrderDao, StoreOrder
Page<StoreOrder> storeOrderPage = PageHelper.startPage(pageParamRequest.getPage(), pageParamRequest.getLimit());
lambdaQueryWrapper.apply(where);
lambdaQueryWrapper.eq(StoreOrder::getRefundStatus, 0);
lambdaQueryWrapper.orderByDesc(StoreOrder::getId);
List<StoreOrder> storeOrderList = dao.selectList(lambdaQueryWrapper);
@@ -526,7 +534,7 @@ public class StoreOrderServiceImpl extends ServiceImpl<StoreOrderDao, StoreOrder
}
//门店id
List<Integer> storeIdList = storeOrderList.stream().map(StoreOrder::getStoreId).distinct().collect(Collectors.toList());
//店员id
//店员id / 核销员id
List<Integer> clerkIdList = storeOrderList.stream().map(StoreOrder::getClerkId).distinct().collect(Collectors.toList());
//订单id集合
@@ -539,19 +547,23 @@ public class StoreOrderServiceImpl extends ServiceImpl<StoreOrderDao, StoreOrder
//获取订单详情map
HashMap<Integer, List<StoreOrderInfoVo>> orderInfoList = StoreOrderInfoService.getMapInId(orderIdList);
//根据用户获取推广人信息
//根据用户获取信息
List<Integer> userIdList = storeOrderList.stream().map(StoreOrder::getUid).distinct().collect(Collectors.toList());
//订单用户信息
HashMap<Integer, User> userList = userService.getMapListInUid(userIdList);
//获取推广人id集合
List<Integer> spreadPeopleUidList = new ArrayList<>();
for(Map.Entry<Integer, User> entry : userList.entrySet()){
spreadPeopleUidList.add(entry.getValue().getSpreadUid());
}
//推广信息
HashMap<Integer, User> mapListInUid = new HashMap<>();
if(userIdList.size() > 0){
//推广人信息
List<Integer> userServiceSpreadPeopleIdList = userService.getSpreadPeopleIdList(userIdList);
if(userServiceSpreadPeopleIdList.size() > 0){
mapListInUid = userService.getMapListInUid(userServiceSpreadPeopleIdList);
}
mapListInUid = userService.getMapListInUid(spreadPeopleUidList);
}
@@ -565,24 +577,26 @@ public class StoreOrderServiceImpl extends ServiceImpl<StoreOrderDao, StoreOrder
}
storeOrderItemResponse.setStoreName(storeName);
// 添加核销人信息
String clerkName = "";
if(systemStoreStaffList.containsKey(storeOrder.getClerkId())){
clerkName = systemStoreStaffList.get(storeOrder.getClerkId()).getStaffName();
}
storeOrderItemResponse.setProductList(orderInfoList.get(storeOrder.getId()));
storeOrderItemResponse.setTotalNum(storeOrder.getTotalNum());
//订单状态
storeOrderItemResponse.setStatusStr(getStatus(storeOrder));
storeOrderItemResponse.setStatus(storeOrder.getStatus());
//支付方式
storeOrderItemResponse.setPayTypeStr(getPayType(storeOrder.getPayType()));
//推广人信息
if(!userList.isEmpty() && userList.containsKey(storeOrder.getUid()) && !mapListInUid.isEmpty()){
if(userList.containsKey(storeOrder.getUid()) && mapListInUid.containsKey(userList.get(storeOrder.getUid()).getUid())){
storeOrderItemResponse.getSpreadInfo().setId(mapListInUid.get(userList.get(storeOrder.getUid()).getUid()).getUid());
storeOrderItemResponse.getSpreadInfo().setName(mapListInUid.get(userList.get(storeOrder.getUid()).getUid()).getNickname());
}
if(!userList.isEmpty() && null != userList.get(storeOrder.getUid()) && mapListInUid.containsKey(userList.get(storeOrder.getUid()).getSpreadUid())){
storeOrderItemResponse.getSpreadInfo().setId(mapListInUid.get(userList.get(storeOrder.getUid()).getSpreadUid()).getUid());
storeOrderItemResponse.getSpreadInfo().setName(mapListInUid.get(userList.get(storeOrder.getUid()).getSpreadUid()).getNickname());
}
storeOrderItemResponse.setRefundStatus(storeOrder.getRefundStatus());
storeOrderItemResponse.setClerkName(clerkName);
storeOrderItemResponseArrayList.add(storeOrderItemResponse);
@@ -753,6 +767,16 @@ public class StoreOrderServiceImpl extends ServiceImpl<StoreOrderDao, StoreOrder
//积分
subtractBill(request, Constants.USER_BILL_CATEGORY_INTEGRAL, Constants.USER_BILL_TYPE_GAIN, Constants.USER_BILL_CATEGORY_INTEGRAL);
// 小程序订阅消息 退款成功
String storeNameAndCarNumString = orderUtils.getStoreNameAndCarNumString(storeOrder.getId());
WechatSendMessageForReFundEd forReFundEd = new WechatSendMessageForReFundEd(
"退款成功",storeNameAndCarNumString,request.getAmount()+"",DateUtil.nowDateTimeStr(),"退款金额已到余额中",
storeOrder.getOrderId(),storeOrder.getId()+"",storeOrder.getCreateTime()+"",storeOrder.getRefundPrice()+"",
storeNameAndCarNumString,storeOrder.getRefundReason(),"CRMEB",storeOrder.getRefundReasonWapExplain(),
"暂无"
);
wechatSendMessageForMinService.sendReFundEdMessage(forReFundEd, userService.getUserIdException());
return true;
}catch (Exception e){
throw new CrmebException(e.getMessage());
@@ -768,16 +792,23 @@ public class StoreOrderServiceImpl extends ServiceImpl<StoreOrderDao, StoreOrder
@Override
public StoreOrderInfoResponse info(Integer id) {
StoreOrder storeOrder = getInfoException(id);
List<StoreOrderInfoVo> orderInfos = StoreOrderInfoService.getOrderListByOrderId(id);
StoreOrderInfoResponse storeOrderInfoResponse = new StoreOrderInfoResponse();
BeanUtils.copyProperties(storeOrder, storeOrderInfoResponse);
storeOrderInfoResponse.setOrderInfo(orderInfos);
storeOrderInfoResponse.setPayTypeStr(getPayType(storeOrder.getPayType()));
storeOrderInfoResponse.setStatusStr(getStatus(storeOrder));
SystemStore systemStorePram = new SystemStore();
systemStorePram.setId(storeOrder.getStoreId());
storeOrderInfoResponse.setSystemStore(systemStoreService.getByCondition(systemStorePram));
//用户信息
User user = userService.getById(storeOrder.getUid());
User spread = userService.getById(user.getSpreadUid());
storeOrderInfoResponse.getSpreadInfo().setId(spread.getUid());
storeOrderInfoResponse.getSpreadInfo().setName(spread.getNickname());
if(null != spread){
storeOrderInfoResponse.getSpreadInfo().setId(spread.getUid());
storeOrderInfoResponse.getSpreadInfo().setName(spread.getNickname());
}
storeOrderInfoResponse.setUser(user);
return storeOrderInfoResponse;
}
@@ -795,13 +826,16 @@ public class StoreOrderServiceImpl extends ServiceImpl<StoreOrderDao, StoreOrder
//订单信息
StoreOrder storeOrder = getInfoException(request.getId());
SystemAdmin currentAdmin = systemAdminService.getInfo();
switch (request.getType()){
case "1":
express(request, storeOrder);
orderUtils.sendWeiChatMiniMessageForPackageExpress(storeOrder,currentAdmin.getId());
break;
case "2":
delivery(request, storeOrder);
orderUtils.senWeiChatMiniMessageForDeliver(storeOrder,currentAdmin.getId());
break;
case "3":
virtual(request, storeOrder);
@@ -948,14 +982,149 @@ public class StoreOrderServiceImpl extends ServiceImpl<StoreOrderDao, StoreOrder
@Override
public List<StoreOrder> getTopDataUtil(int status, int userId) {
LambdaQueryWrapper<StoreOrder> lqw = new LambdaQueryWrapper<>();
statusApiByWhere(lqw,status);
orderUtils.statusApiByWhere(lqw,status);
lqw.eq(StoreOrder::getIsDel, false);
lqw.eq(StoreOrder::getUid,userId);
return dao.selectList(lqw);
}
/**
* 更改订单价格
*
* @param orderId 订单id wx开头
* @param price 待更改价格
* @return 更改结果
*/
@Override
public boolean editPrice(String orderId, BigDecimal price) {
String oldPrice = null;
StoreOrder existOrder = getInfoByEntity(new StoreOrder().setOrderId(orderId));
// 订单不存在
if(null == existOrder) throw new CrmebException(Constants.RESULT_ORDER_NOTFOUND.replace("${orderCode}", orderId));
// 订单已支付
if(existOrder.getPaid()) throw new CrmebException(Constants.RESULT_ORDER_PAYED.replace("${orderCode}", orderId));
// 修改价格和原来价格相同
if(existOrder.getPayPrice().compareTo(price) ==0)
throw new CrmebException(Constants.RESULT_ORDER_EDIT_PRICE_SAME.replace("${oldPrice}",existOrder.getPayPrice()+"")
.replace("${editPrice}",price+""));
oldPrice = existOrder.getPayPrice()+"";
// 修改订单价格
existOrder.setPayPrice(price);
boolean updateOrderPrice = updateByEntity(existOrder);
if(!updateOrderPrice) throw new CrmebException(Constants.RESULT_ORDER_EDIT_PRICE_SUCCESS
.replace("${orderNo}", existOrder.getOrderId()).replace("${price}", price+""));
// 订单修改状态操作
storeOrderStatusService.createLog(existOrder.getId(),Constants.ORDER_LOG_EDIT,
Constants.RESULT_ORDER_EDIT_PRICE_LOGS.replace("${orderPrice}",oldPrice)
.replace("${price}", existOrder.getPayPrice()+""));
return true;
}
/**
* 确认付款
*
* @param orderId 订单号
* @return 确认付款结果
*/
@Override
public boolean confirmPayed(String orderId) {
StoreOrder existOrder = getByEntityOne(new StoreOrder().setOrderId(orderId));
if(null == existOrder) throw new CrmebException(Constants.RESULT_ORDER_NOTFOUND.replace("${orderCode}", orderId));
return payOrderOffLine(existOrder.getId());
}
/**
* 线下付款
*
* @param orderId 待付款订单id
* @return 付款结果
*/
@Override
public boolean payOrderOffLine(Integer orderId) {
StoreOrder existOrder = getByEntityOne(new StoreOrder().setId(orderId));
if(null == existOrder) throw new CrmebException(
Constants.RESULT_ORDER_NOTFOUND_IN_ID.replace("${orderId}", orderId+""));
if(existOrder.getPaid()) throw new CrmebException(Constants.RESULT_ORDER_PAYED.replace("${orderCode}",existOrder.getOrderId()));
existOrder.setPaid(true);
// 订单修改状态操作
storeOrderStatusService.createLog(existOrder.getId(),Constants.ORDER_LOG_PAY_OFFLINE,
Constants.RESULT_ORDER_PAY_OFFLINE.replace("${orderNo}",existOrder.getOrderId())
.replace("${price}", existOrder.getPayPrice()+""));
return updateById(existOrder);
}
/**
* 根据时间参数统计订单销售额
*
* @param dateLimit 时间区间
* @param type 类型
* @return 统计订单信息
*/
@Override
public StoreOrderStatisticsResponse orderStatisticsByTime(String dateLimit,Integer type) {
StoreOrderStatisticsResponse response = new StoreOrderStatisticsResponse();
// 根据开始时间和结束时间获取时间差 再根据时间差获取上一个时间段 查询当前和上一个时间段的数据 进行比较且返回
dateLimitUtilVo dateRange = DateUtil.getDateLimit(dateLimit);
String dateStartD = dateRange.getStartTime();
String dateEndD = dateRange.getEndTime();
int days = DateUtil.daysBetween(
DateUtil.strToDate(dateStartD,Constants.DATE_FORMAT),
DateUtil.strToDate(dateEndD,Constants.DATE_FORMAT)
);
// 同时间区间的上一个时间起点
String perDateStart = DateUtil.addDay(dateStartD, -days, Constants.DATE_FORMAT_START);
// 当前时间区间
String dateStart = DateUtil.dateToStr(
DateUtil.strToDate(dateStartD,Constants.DATE_FORMAT),Constants.DATE_FORMAT_START);
String dateEnd = DateUtil.dateToStr(
DateUtil.strToDate(dateEndD,Constants.DATE_FORMAT),Constants.DATE_FORMAT_END);
// 上一个时间段查询
List<StoreOrder> orderPerList = getOrderPayedByDateLimit(perDateStart,dateStart);
// 当前时间段
List<StoreOrder> orderCurrentList = getOrderPayedByDateLimit(dateStart, dateEnd);
double increasePrice = 0;
if(type == 1){
double perSumPrice = orderPerList.stream().mapToDouble(e -> e.getPayPrice().doubleValue()).sum();
double currentSumPrice = orderCurrentList.stream().mapToDouble(e -> e.getPayPrice().doubleValue()).sum();
response.setChart(dao.getOrderStatisticsPriceDetail(new StoreDateRangeSqlPram(dateStart,dateEnd)));
response.setTime(BigDecimal.valueOf(currentSumPrice).setScale(2,BigDecimal.ROUND_HALF_UP));
// 当前营业额和上一个同比营业额增长区间
increasePrice = currentSumPrice - perSumPrice;
if(increasePrice <= 0) response.setGrowthRate(0);
else if(perSumPrice == 0) response.setGrowthRate((int) increasePrice);
else response.setGrowthRate((int)((increasePrice * perSumPrice) * 100));
}else if(type ==2){
response.setChart(dao.getOrderStatisticsOrderCountDetail(new StoreDateRangeSqlPram(dateStart,dateEnd)));
response.setTime(BigDecimal.valueOf(orderCurrentList.size()));
increasePrice = orderCurrentList.size() - orderPerList.size();
if(increasePrice <= 0) response.setGrowthRate(0);
else if(orderPerList.size() == 0) response.setGrowthRate((int) increasePrice);
else response.setGrowthRate((int)((increasePrice * orderPerList.size()) * 100));
}
response.setIncreaseTime(increasePrice+"");
response.setIncreaseTimeStatus(increasePrice >= 0 ? 1:2);
return response;
}
///////////////////////////////////////////////////////////////////////////////////////////////////// 以下为自定义方法
/**
* 根据时间参数获取有效订单
* @return 有效订单列表
*/
private List<StoreOrder> getOrderPayedByDateLimit(String startTime, String endTime){
LambdaQueryWrapper<StoreOrder> lqw = Wrappers.lambdaQuery();
lqw.eq(StoreOrder::getIsDel, false).eq(StoreOrder::getPaid, true).eq(StoreOrder::getRefundStatus,0)
.between(StoreOrder::getCreateTime, startTime, endTime);
return dao.selectList(lqw);
}
/** 退款扣除积分/余额
* @param request StoreOrderRefundRequest 退款参数
* @author Mr.Zhang
@@ -1275,54 +1444,6 @@ public class StoreOrderServiceImpl extends ServiceImpl<StoreOrderDao, StoreOrder
}
}
/**
* h5 订单查询 where status 封装
* @param queryWrapper 查询条件
* @param status 状态
*/
public void statusApiByWhere(LambdaQueryWrapper<StoreOrder> queryWrapper, int status){
switch (status){
case Constants.ORDER_STATUS_H5_UNPAID: // 未支付
queryWrapper.eq(StoreOrder::getPaid, false);
queryWrapper.eq(StoreOrder::getStatus, 0);
queryWrapper.eq(StoreOrder::getRefundStatus, 0);
break;
case Constants.ORDER_STATUS_H5_NOT_SHIPPED: // 待发货
queryWrapper.eq(StoreOrder::getPaid, true);
queryWrapper.eq(StoreOrder::getStatus, 0);
queryWrapper.eq(StoreOrder::getRefundStatus, 0);
break;
case Constants.ORDER_STATUS_H5_SPIKE: // 待收货
queryWrapper.eq(StoreOrder::getPaid, true);
queryWrapper.eq(StoreOrder::getStatus, 1);
queryWrapper.eq(StoreOrder::getRefundStatus, 0);
break;
case Constants.ORDER_STATUS_H5_BARGAIN: // 待评价
queryWrapper.eq(StoreOrder::getPaid, true);
queryWrapper.eq(StoreOrder::getStatus, 2);
queryWrapper.eq(StoreOrder::getRefundStatus, 0);
break;
case Constants.ORDER_STATUS_H5_COMPLETE: // 已完成
queryWrapper.eq(StoreOrder::getPaid, true);
queryWrapper.eq(StoreOrder::getStatus, 3);
queryWrapper.eq(StoreOrder::getRefundStatus, 0);
break;
case Constants.ORDER_STATUS_H5_REFUNDING: // 退款中
queryWrapper.eq(StoreOrder::getPaid, true);
queryWrapper.eq(StoreOrder::getRefundStatus, 1);
break;
case Constants.ORDER_STATUS_H5_REFUNDED: // 已退款
queryWrapper.eq(StoreOrder::getPaid, true);
queryWrapper.eq(StoreOrder::getStatus, 2);
break;
case Constants.ORDER_STATUS_H5_REFUND: // 退款
queryWrapper.eq(StoreOrder::getPaid, true);
queryWrapper.in(StoreOrder::getRefundStatus, "1,2"); //大于0
break;
}
queryWrapper.eq(StoreOrder::getIsDel, false);
queryWrapper.eq(StoreOrder::getIsSystemDel, false);
}
/**
* 根据订单状态获取where条件
@@ -1447,7 +1568,7 @@ public class StoreOrderServiceImpl extends ServiceImpl<StoreOrderDao, StoreOrder
if(null == storeOrder){
return map;
}
// 未支付
if(!storeOrder.getPaid()
&& storeOrder.getStatus() == 0
&& storeOrder.getRefundStatus() == 0
@@ -1457,7 +1578,7 @@ public class StoreOrderServiceImpl extends ServiceImpl<StoreOrderDao, StoreOrder
map.put("value", Constants.ORDER_STATUS_STR_UNPAID);
return map;
}
// 未发货
if(storeOrder.getPaid()
&& storeOrder.getStatus() == 0
&& storeOrder.getRefundStatus() == 0
@@ -1468,27 +1589,28 @@ public class StoreOrderServiceImpl extends ServiceImpl<StoreOrderDao, StoreOrder
map.put("value", Constants.ORDER_STATUS_STR_NOT_SHIPPED);
return map;
}
// 待收货
if(storeOrder.getPaid()
&& storeOrder.getStatus() == 1
&& storeOrder.getRefundStatus() == 0
&& storeOrder.getShippingType() == 1
&& !storeOrder.getIsDel()
&& !storeOrder.getIsSystemDel()){
map.put("key", Constants.ORDER_STATUS_SPIKE);
map.put("value", Constants.ORDER_STATUS_STR_SPIKE);
return map;
}
// 待评价
if(storeOrder.getPaid()
&& storeOrder.getStatus() == 1
&& storeOrder.getRefundStatus() == 2
&& storeOrder.getStatus() == 2
&& storeOrder.getRefundStatus() == 0
&& !storeOrder.getIsDel()
&& !storeOrder.getIsSystemDel()){
map.put("key", Constants.ORDER_STATUS_BARGAIN);
map.put("value", Constants.ORDER_STATUS_STR_BARGAIN);
return map;
}
// 交易完成
if(storeOrder.getPaid()
&& storeOrder.getStatus() == 3
&& storeOrder.getRefundStatus() == 0
@@ -1498,7 +1620,7 @@ public class StoreOrderServiceImpl extends ServiceImpl<StoreOrderDao, StoreOrder
map.put("value", Constants.ORDER_STATUS_STR_COMPLETE);
return map;
}
// 待核销
if(storeOrder.getPaid()
&& storeOrder.getStatus() == 0
&& storeOrder.getRefundStatus() == 0
@@ -1510,7 +1632,7 @@ public class StoreOrderServiceImpl extends ServiceImpl<StoreOrderDao, StoreOrder
return map;
}
//此处前端需要判断
//退款中
if(storeOrder.getPaid()
&& storeOrder.getRefundStatus() == 1
&& !storeOrder.getIsDel()
@@ -1520,6 +1642,7 @@ public class StoreOrderServiceImpl extends ServiceImpl<StoreOrderDao, StoreOrder
return map;
}
//已退款
if(storeOrder.getPaid()
&& storeOrder.getRefundStatus() == 2
&& !storeOrder.getIsDel()
@@ -1528,6 +1651,7 @@ public class StoreOrderServiceImpl extends ServiceImpl<StoreOrderDao, StoreOrder
map.put("value", Constants.ORDER_STATUS_STR_REFUNDED);
}
//未发货
if(storeOrder.getPaid()
&& storeOrder.getStatus() == 0
&& !storeOrder.getIsDel()
@@ -1536,6 +1660,7 @@ public class StoreOrderServiceImpl extends ServiceImpl<StoreOrderDao, StoreOrder
map.put("value", Constants.ORDER_STATUS_STR_NOT_SHIPPED);
}
//待收货
if(storeOrder.getPaid()
&& storeOrder.getStatus() == 1
&& !storeOrder.getIsDel()
@@ -1543,6 +1668,8 @@ public class StoreOrderServiceImpl extends ServiceImpl<StoreOrderDao, StoreOrder
map.put("key", Constants.ORDER_STATUS_SPIKE);
map.put("value", Constants.ORDER_STATUS_STR_SPIKE);
}
//用户已收货
if(storeOrder.getPaid()
&& storeOrder.getStatus() == 2
&& !storeOrder.getIsDel()
@@ -1552,7 +1679,7 @@ public class StoreOrderServiceImpl extends ServiceImpl<StoreOrderDao, StoreOrder
}
//已删除
if(storeOrder.getIsDel() || storeOrder.getIsSystemDel()){
map.put("key", Constants.ORDER_STATUS_DELETED);
map.put("value", Constants.ORDER_STATUS_STR_DELETED);

View File

@@ -0,0 +1,228 @@
package com.zbkj.crmeb.store.service.impl;
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.baomidou.mybatisplus.core.toolkit.ArrayUtils;
import com.baomidou.mybatisplus.core.toolkit.Wrappers;
import com.common.PageParamRequest;
import com.constants.Constants;
import com.exception.CrmebException;
import com.utils.DateUtil;
import com.utils.vo.dateLimitUtilVo;
import com.zbkj.crmeb.store.dao.StoreOrderDao;
import com.zbkj.crmeb.store.model.StoreOrder;
import com.zbkj.crmeb.store.model.StoreOrderInfo;
import com.zbkj.crmeb.store.request.StoreOrderStaticsticsRequest;
import com.zbkj.crmeb.store.response.StoreOrderVerificationConfirmResponse;
import com.zbkj.crmeb.store.response.StoreStaffDetail;
import com.zbkj.crmeb.store.response.StoreStaffTopDetail;
import com.zbkj.crmeb.store.service.StoreOrderInfoService;
import com.zbkj.crmeb.store.service.StoreOrderService;
import com.zbkj.crmeb.store.service.StoreOrderVerification;
import com.zbkj.crmeb.store.utilService.OrderUtils;
import com.zbkj.crmeb.system.model.SystemAdmin;
import com.zbkj.crmeb.system.model.SystemStoreStaff;
import com.zbkj.crmeb.system.service.SystemAdminService;
import com.zbkj.crmeb.system.service.SystemStoreService;
import com.zbkj.crmeb.system.service.SystemStoreStaffService;
import com.zbkj.crmeb.user.model.User;
import com.zbkj.crmeb.user.service.UserService;
import com.zbkj.crmeb.wechat.service.impl.WechatSendMessageForMinService;
import com.zbkj.crmeb.wechat.vo.WechatSendMessageForVerSuccess;
import org.springframework.beans.BeanUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import javax.annotation.Resource;
import javax.xml.ws.ServiceMode;
import java.math.BigDecimal;
import java.util.ArrayList;
import java.util.List;
/**
* @Classname StoreOrderVerificationImpl
* @Description 核销订单
* @Date 9/1/20 10:28 上午
* @Created by stivepeim
*/
@Service
public class StoreOrderVerificationImpl implements StoreOrderVerification {
@Resource
private StoreOrderDao dao;
@Autowired
private OrderUtils orderUtils;
@Autowired
private StoreOrderService storeOrderService;
@Autowired
private StoreOrderInfoService storeOrderInfoService;
@Autowired
private SystemAdminService systemAdminService;
@Autowired
private WechatSendMessageForMinService wechatSendMessageForMinService;
@Autowired
private SystemStoreStaffService systemStoreStaffService;
/**
* 获取订单核销数据
*/
@Override
public StoreStaffTopDetail getOrderVerificationData() {
StoreStaffTopDetail storeStaffTopDetail = new StoreStaffTopDetail();
//订单支付没有退款 数量-
LambdaQueryWrapper<StoreOrder> lqwOrderCount = Wrappers.lambdaQuery();
lqwOrderCount.eq(StoreOrder::getIsDel,false).eq(StoreOrder::getPaid,true).eq(StoreOrder::getRefundStatus,0);
storeStaffTopDetail.setOrderCount(dao.selectCount(lqwOrderCount));
//订单支付没有退款 支付总金额
LambdaQueryWrapper<StoreOrder> lqwSumPrice = Wrappers.lambdaQuery();
lqwSumPrice.eq(StoreOrder::getIsDel,false).eq(StoreOrder::getPaid,true).eq(StoreOrder::getRefundStatus,0);
List<StoreOrder> storeOrdersSumPrice = dao.selectList(lqwSumPrice);
Double sumPrice = storeOrdersSumPrice.stream().mapToDouble(e->e.getPayPrice().doubleValue()).sum();
storeStaffTopDetail.setSumPrice(BigDecimal.valueOf(sumPrice).setScale(2,BigDecimal.ROUND_HALF_UP));
//订单待支付 数量
LambdaQueryWrapper<StoreOrder> lqwUnPaidCount = Wrappers.lambdaQuery();
orderUtils.statusApiByWhere(lqwUnPaidCount,0);
storeStaffTopDetail.setUnpaidCount(dao.selectCount(lqwUnPaidCount));
//订单待发货 数量
LambdaQueryWrapper<StoreOrder> lqwUnShippedCount = Wrappers.lambdaQuery();
orderUtils.statusApiByWhere(lqwUnShippedCount,1);
storeStaffTopDetail.setUnshippedCount(dao.selectCount(lqwUnShippedCount));
//订单待收货 数量
LambdaQueryWrapper<StoreOrder> lqwReceivedCount = Wrappers.lambdaQuery();
orderUtils.statusApiByWhere(lqwReceivedCount,2);
storeStaffTopDetail.setReceivedCount(dao.selectCount(lqwReceivedCount));
//订单待评价 数量 verificationCount
// LambdaQueryWrapper<StoreOrder> lqwEvaluatedCount = Wrappers.lambdaQuery();
// orderUtils.statusApiByWhere(lqwEvaluatedCount,3);
// storeStaffTopDetail.setEvaluatedCount(dao.selectCount(lqwEvaluatedCount));
// 订单待核销数量
LambdaQueryWrapper<StoreOrder> verificationCount = Wrappers.lambdaQuery();
orderUtils.statusApiByWhere(verificationCount,3);
storeStaffTopDetail.setVerificationCount(dao.selectCount(verificationCount));
//订单已完成 数量
LambdaQueryWrapper<StoreOrder> lqwCompleteCount = Wrappers.lambdaQuery();
orderUtils.statusApiByWhere(lqwCompleteCount,4);
storeStaffTopDetail.setCompleteCount(dao.selectCount(lqwCompleteCount));
//订单退款 数量
LambdaQueryWrapper<StoreOrder> lqwRefundCount = Wrappers.lambdaQuery();
orderUtils.statusApiByWhere(lqwRefundCount,-3);
storeStaffTopDetail.setRefundCount(dao.selectCount(lqwRefundCount));
// 获取今日,昨日,本月,订单金额
String dayStart = DateUtil.nowDateTime(Constants.DATE_FORMAT_START);
String dayEnd = DateUtil.nowDateTime(Constants.DATE_FORMAT_END);
String monthStart = DateUtil.nowDateTime(Constants.DATE_FORMAT_MONTH_START);
String monthEnd = DateUtil.getMonthEndDay();
// 今日订单数量
LambdaQueryWrapper<StoreOrder> lqwTodayCount = Wrappers.lambdaQuery();
lqwTodayCount.eq(StoreOrder::getIsDel,false).between(StoreOrder::getPayTime,dayStart,dayEnd)
.eq(StoreOrder::getPaid,1).eq(StoreOrder::getRefundStatus,0);
List<StoreOrder> storeOrdersTodayCount = dao.selectList(lqwTodayCount);
if(null == storeOrdersTodayCount) storeOrdersTodayCount = new ArrayList<>();
storeStaffTopDetail.setTodayCount(storeOrdersTodayCount.size());
// 今日成交额
double todayPrice = storeOrdersTodayCount.stream().mapToDouble(e->e.getPayPrice().doubleValue()).sum();
storeStaffTopDetail.setTodayPrice(BigDecimal.valueOf(todayPrice).setScale(2,BigDecimal.ROUND_HALF_UP));
// 昨日订单数
LambdaQueryWrapper<StoreOrder> lqwPro = Wrappers.lambdaQuery();
lqwPro.eq(StoreOrder::getIsDel,false).between(StoreOrder::getPayTime,dayStart,dayEnd)
.eq(StoreOrder::getPaid, true).eq(StoreOrder::getRefundStatus,0);
List<StoreOrder> storeOrdersPro = dao.selectList(lqwPro);
if(null == storeOrdersPro) storeOrdersPro = new ArrayList<>();
storeStaffTopDetail.setProCount(storeOrdersPro.size());
// 昨日成交额
double proPrice = storeOrdersPro.stream().mapToDouble(e->e.getPayPrice().doubleValue()).sum();
storeStaffTopDetail.setProPrice(BigDecimal.valueOf(proPrice).setScale(2,BigDecimal.ROUND_HALF_UP));
// 本月成交订单数量
LambdaQueryWrapper<StoreOrder> lqwMonth = Wrappers.lambdaQuery();
lqwMonth.eq(StoreOrder::getIsDel,false).between(StoreOrder::getPayTime,monthStart, monthEnd)
.eq(StoreOrder::getPaid,true).eq(StoreOrder::getRefundStatus,0);
List<StoreOrder> storeOrdersMonth = dao.selectList(lqwMonth);
if(null == storeOrdersMonth) storeOrdersMonth = new ArrayList<>();
storeStaffTopDetail.setMonthCount(storeOrdersMonth.size());
// 本月成交额
double monthTotalPrice = storeOrdersMonth.stream().mapToDouble(e -> e.getPayPrice().doubleValue()).sum();
storeStaffTopDetail.setMonthPrice(BigDecimal.valueOf(monthTotalPrice).setScale(2,BigDecimal.ROUND_HALF_UP));
return storeStaffTopDetail;
}
/**
* 核销月详情
* @return 月详情
*/
@Override
public List<StoreStaffDetail> getOrderVerificationDetail(StoreOrderStaticsticsRequest request) {
request.setPage((request.getPage() - 1) * request.getLimit());
dateLimitUtilVo dateLimit = DateUtil.getDateLimit(request.getDateLimit());
request.setStartTime(dateLimit.getStartTime());
request.setEndTime(dateLimit.getEndTime());
return dao.getOrderVerificationDetail(request);
}
/**
* 根据核销码核销订单
*
* @param vCode 核销码
* @return 核销结果
*/
@Override
public boolean verificationOrderByCode(String vCode) {
StoreOrderVerificationConfirmResponse existOrder = getVerificationOrderByCode(vCode);
if(existOrder.getCombinationId() >0 && existOrder.getPinkId() > 0){
// todo 营销业务待处理
}
// 判断当前用户是否有权限核销
SystemAdmin currentAdmin = systemAdminService.getInfo();
List<Integer> currentIds = new ArrayList<>();
currentIds.add(currentAdmin.getId());
List<SystemStoreStaff> currentStaffs = systemStoreStaffService.getByAdminUserIds(currentIds);
if(currentStaffs.size() == 0) throw new CrmebException(Constants.RESULT_VERIFICATION_NOTAUTH);
// 添加核销人员后执行核销操作
StoreOrder storeOrder = new StoreOrder();
BeanUtils.copyProperties(existOrder,storeOrder);
storeOrder.setStatus(Constants.ORDER_STATUS_INT_BARGAIN);
storeOrder.setClerkId(currentStaffs.get(0).getId());
storeOrder.setStoreId(currentStaffs.get(0).getStoreId());
boolean saveStatus = dao.updateById(storeOrder) > 0;
// 小程序订阅消息发送
if(saveStatus){
WechatSendMessageForVerSuccess ver = new WechatSendMessageForVerSuccess(
"CRMEB",orderUtils.getStoreNameAndCarNumString(storeOrder.getId()),storeOrder.getOrderId(),
DateUtil.nowDateTimeStr(),storeOrder.getPayPrice()+"","暂无","CRMEB"
);
wechatSendMessageForMinService.sendVerSuccessMessage(ver,currentAdmin.getId());
}
return saveStatus;
}
/**
* 根据核销码查询待核销订单
*
* @param vCode 核销码
* @return 待核销订单详情
*/
@Override
public StoreOrderVerificationConfirmResponse getVerificationOrderByCode(String vCode) {
StoreOrderVerificationConfirmResponse response = new StoreOrderVerificationConfirmResponse();
StoreOrder storeOrderPram = new StoreOrder().setVerifyCode(vCode).setPaid(true).setRefundStatus(0);
StoreOrder existOrder = storeOrderService.getByEntityOne(storeOrderPram);
if(null == existOrder) throw new CrmebException(Constants.RESULT_VERIFICATION_ORDER_NOT_FUND.replace("${vCode}",vCode));
if(existOrder.getStatus() > 0) throw new CrmebException(Constants.RESULT_VERIFICATION_ORDER_VED.replace("${vCode}",vCode));
BeanUtils.copyProperties(existOrder, response);
response.setStoreOrderInfoVos(storeOrderInfoService.getOrderListByOrderId(existOrder.getId()));
return response;
}
}

View File

@@ -344,7 +344,6 @@ public class StoreProductServiceImpl extends ServiceImpl<StoreProductDao, StoreP
for(Map.Entry<String,String> vo: attrValuesRequest.getAttrValue().entrySet()){
skuList.add(vo.getValue());
spav.setSuk(String.join(",",skuList));
// HashMap<String, Object> attrValues = setAttrValueByRequest(storeProductRequest);
}
spav.setImage(systemAttachmentService.clearPrefix(spav.getImage()));
spav.setAttrValue(JSON.toJSONString(attrValuesRequest.getAttrValue()));
@@ -1156,15 +1155,15 @@ public class StoreProductServiceImpl extends ServiceImpl<StoreProductDao, StoreP
String rightEndUrl = "&itemid=";
switch (tag){ // 导入平台1=淘宝2=京东3=苏宁4=拼多多, 5=天猫
case 1:
baseUrl = systemConfigService.getValueByKey("inportProductTB");
baseUrl = systemConfigService.getValueByKey("importProductTB");
rightEndUrl += UrlUtil.getParamsByKey(url, "id");
break;
case 2:
baseUrl = systemConfigService.getValueByKey("inportProductJD");
baseUrl = systemConfigService.getValueByKey("importProductJD");
rightEndUrl += url.substring(url.lastIndexOf("/")+1).replace(".html","");
break;
case 3:
baseUrl = systemConfigService.getValueByKey("inportProductSN");
baseUrl = systemConfigService.getValueByKey("importProductSN");
int start = url.indexOf(".com/") + 5;
int end = url.indexOf(".html");
String sp = url.substring(start,end);
@@ -1173,11 +1172,11 @@ public class StoreProductServiceImpl extends ServiceImpl<StoreProductDao, StoreP
break;
case 4:
rightEndUrl += UrlUtil.getParamsByKey(url, "goods_id");
baseUrl = systemConfigService.getValueByKey("inportProductPDD");
baseUrl = systemConfigService.getValueByKey("importProductPDD");
break;
case 5:
rightEndUrl += UrlUtil.getParamsByKey(url, "id");
baseUrl = systemConfigService.getValueByKey("inportProductTM");
baseUrl = systemConfigService.getValueByKey("importProductTM");
break;
}
String token = systemConfigService.getValueByKey("importProductToken");
@@ -1260,21 +1259,28 @@ public class StoreProductServiceImpl extends ServiceImpl<StoreProductDao, StoreP
* @param storeProduct 当前操作的产品
*/
private void calcPriceForAttrValues(StoreProductRequest storeProductRequest, StoreProduct storeProduct) {
// 设置商品成本价和市场价,成本价=sku配置的最低价商品价格=sku配置的最高价格
// 设置商品成本价和市场价,2020-8-28日更 商品本身价钱取sku列表中最低的价格
// BigDecimal costPrice = storeProductRequest.getAttrValue()
// .stream().map(e->e.getCost()).reduce(BigDecimal.ZERO,BigDecimal::add);
int costPrice = storeProductRequest.getAttrValue()
.stream().mapToInt(e->e.getCost().intValue()).max().getAsInt();
// BigDecimal sellPrice = storeProductRequest.getAttrValue()
// .stream().map(e->e.getOtPrice()).reduce(BigDecimal.ZERO,BigDecimal::add);
int sellPrice = storeProductRequest.getAttrValue()
.stream().mapToInt(e->e.getOtPrice().intValue()).min().getAsInt();
List<StoreProductAttrValueRequest> attrValuesSortAsc = storeProductRequest.getAttrValue().stream()
.sorted(Comparator.comparing(StoreProductAttrValueRequest::getPrice))
.collect(Collectors.toList());
int stock = storeProductRequest.getAttrValue()
.stream().mapToInt(e->e.getStock()).sum();
storeProduct.setPrice(BigDecimal.valueOf(costPrice));
storeProduct.setOtPrice(BigDecimal.valueOf(sellPrice));
storeProduct.setStock(stock);
// int costPrice = storeProductRequest.getAttrValue()
// .stream().mapToInt(e->e.getCost().intValue()).min().getAsInt();
//// BigDecimal sellPrice = storeProductRequest.getAttrValue()
//// .stream().map(e->e.getOtPrice()).reduce(BigDecimal.ZERO,BigDecimal::add);
// int sellPrice = storeProductRequest.getAttrValue()
// .stream().mapToInt(e->e.getOtPrice().intValue()).min().getAsInt();
// int stock = storeProductRequest.getAttrValue()
// .stream().mapToInt(e->e.getStock()).sum();
if(attrValuesSortAsc.size() == 0){
return;
}
storeProduct.setPrice(attrValuesSortAsc.get(0).getPrice());
storeProduct.setOtPrice(attrValuesSortAsc.get(0).getOtPrice());
storeProduct.setStock(attrValuesSortAsc.get(0).getStock());
}

View File

@@ -2,18 +2,24 @@ package com.zbkj.crmeb.store.utilService;
import com.alibaba.fastjson.JSON;
import com.alibaba.fastjson.JSONObject;
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.common.PageParamRequest;
import com.constants.Constants;
import com.exception.CrmebException;
import com.utils.CrmebUtil;
import com.utils.DateUtil;
import com.utils.RedisUtil;
import com.utils.ValidateFormUtil;
import com.utils.vo.dateLimitUtilVo;
import com.zbkj.crmeb.express.model.Express;
import com.zbkj.crmeb.express.model.ShippingTemplates;
import com.zbkj.crmeb.express.model.ShippingTemplatesFree;
import com.zbkj.crmeb.express.model.ShippingTemplatesRegion;
import com.zbkj.crmeb.express.service.ShippingTemplatesFreeService;
import com.zbkj.crmeb.express.service.ShippingTemplatesRegionService;
import com.zbkj.crmeb.express.service.ShippingTemplatesService;
import com.zbkj.crmeb.finance.request.FundsMonitorSearchRequest;
import com.zbkj.crmeb.front.request.OrderCreateRequest;
import com.zbkj.crmeb.front.response.ComputeOrderResponse;
import com.zbkj.crmeb.front.response.ConfirmOrderResponse;
@@ -30,7 +36,9 @@ import com.zbkj.crmeb.marketing.service.StoreCouponUserService;
import com.zbkj.crmeb.store.model.StoreOrder;
import com.zbkj.crmeb.store.model.StoreOrderInfo;
import com.zbkj.crmeb.store.model.StoreOrderStatus;
import com.zbkj.crmeb.store.request.StoreOrderRefundRequest;
import com.zbkj.crmeb.store.request.StoreOrderSearchRequest;
import com.zbkj.crmeb.store.request.StoreOrderSendRequest;
import com.zbkj.crmeb.store.request.StoreProductRequest;
import com.zbkj.crmeb.store.response.StoreCartResponse;
import com.zbkj.crmeb.store.response.StoreProductCartProductInfoResponse;
@@ -45,14 +53,20 @@ import com.zbkj.crmeb.system.service.SystemStoreService;
import com.zbkj.crmeb.user.model.User;
import com.zbkj.crmeb.user.model.UserAddress;
import com.zbkj.crmeb.user.model.UserBill;
import com.zbkj.crmeb.user.request.UserOperateFundsRequest;
import com.zbkj.crmeb.user.service.UserAddressService;
import com.zbkj.crmeb.user.service.UserBillService;
import com.zbkj.crmeb.user.service.UserService;
import com.zbkj.crmeb.wechat.service.impl.WechatSendMessageForMinService;
import com.zbkj.crmeb.wechat.vo.WechatSendMessageForDistrbution;
import com.zbkj.crmeb.wechat.vo.WechatSendMessageForPackage;
import com.zbkj.crmeb.wechat.vo.WechatSendMessageForPaySuccess;
import org.apache.commons.codec.digest.DigestUtils;
import org.apache.commons.lang3.StringEscapeUtils;
import org.apache.commons.lang3.StringUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
import java.math.BigDecimal;
import java.util.*;
@@ -119,6 +133,9 @@ public class OrderUtils {
@Autowired
private SystemGroupDataService systemGroupDataService;
@Autowired
private WechatSendMessageForMinService wechatSendMessageForMinService;
// 组装数据给前端使用
public OrderAgainVo tidyOrder(StoreOrder storeOrder, boolean detail, boolean isPic){
OrderAgainVo orderAgainVoResult = new OrderAgainVo();
@@ -293,7 +310,7 @@ public class OrderUtils {
//此处拿到所有的商品id
primaryKey = cor.getCartInfo().stream().map(StoreCartResponse::getProductId).distinct().collect(Collectors.toList());
}
boolean couponUseResult = storeCouponUserService.use(couponId, primaryKey, payPrice);
boolean couponUseResult = storeCouponUserService.canUse(couponId, primaryKey, payPrice);
if(!couponUseResult) throw new CrmebException("使用优惠券失败");
// 减去优惠券金额 后使用优惠券
@@ -382,28 +399,28 @@ public class OrderUtils {
* @param orderId 订单id
* @return 订单信息
*/
@Transactional(rollbackFor = {RuntimeException.class, Error.class, CrmebException.class})
public StoreOrder createOrder(OrderCreateRequest request,ConfirmOrderResponse cor, Integer isChannel,Integer orderId, String orderKey){
UserAddress currentUserAddress = new UserAddress();
List<Integer> cartIds = new ArrayList<>();
Integer totalNum = 0;
Integer gainIntegral = 0;
// todo 开启事务
if(request.getShippingType() == 1){ // 是否包邮
if(request.getAddressId() <= 0) throw new CrmebException("请选择收货地址");
UserAddress userAddress = new UserAddress();
userAddress.setId(request.getAddressId());
userAddress.setIsDel(false);
if(null == userAddressService.getUserAddress(userAddress)){
currentUserAddress = userAddressService.getUserAddress(userAddress);
if(null == currentUserAddress){
throw new CrmebException("收货地址有误");
}
}else{ // 到店自提
if(StringUtils.isBlank(cor.getAddressInfo().getRealName()) || StringUtils.isBlank(cor.getAddressInfo().getRealName()))
}else if(request.getShippingType() == 2){ // 到店自提
if(StringUtils.isBlank(request.getRealName()) || StringUtils.isBlank(request.getPhone()))
throw new CrmebException("请填写姓名和电话");
currentUserAddress.setRealName(cor.getAddressInfo().getRealName());
currentUserAddress.setPhone(cor.getAddressInfo().getRealName());
currentUserAddress.setRealName(request.getRealName());
currentUserAddress.setPhone(request.getPhone());
}
for (StoreCartResponse cartResponse : cor.getCartInfo()) {
cartIds.add(cartResponse.getSeckillId());
@@ -419,7 +436,7 @@ public class OrderUtils {
// todo 检测营销产品状态
// 发快递还是门店自提
String storeSelfMention = systemConfigService.getValueByKey("store_self_mention");
if(Boolean.valueOf(storeSelfMention)) request.setShippingType(1);
if(!Boolean.valueOf(storeSelfMention)) request.setShippingType(1);
StoreOrder storeOrder = new StoreOrder();
storeOrder.setUid(cor.getUserInfo().getUid());
@@ -431,8 +448,8 @@ public class OrderUtils {
cor.setAddressInfo(selectUserAddress);
}
storeOrder.setRealName(cor.getAddressInfo().getRealName());
storeOrder.setUserPhone(cor.getAddressInfo().getPhone());
storeOrder.setRealName(currentUserAddress.getRealName());
storeOrder.setUserPhone(currentUserAddress.getPhone());
storeOrder.setUserAddress(cor.getAddressInfo().getProvince()
+ cor.getAddressInfo().getCity()
+ cor.getAddressInfo().getDistrict()
@@ -801,9 +818,12 @@ public class OrderUtils {
public void checkDeleteStatus(String orderStatus) {
//退款状态,持可以添加
// String [] deleteStatusList = {
// Constants.ORDER_STATUS_UNPAID,
// Constants.ORDER_STATUS_REFUNDED
// };
String [] deleteStatusList = {
Constants.ORDER_STATUS_UNPAID,
Constants.ORDER_STATUS_REFUNDED
Constants.ORDER_STATUS_COMPLETE
};
if(!Arrays.asList(deleteStatusList).contains(orderStatus)){
@@ -858,4 +878,117 @@ public class OrderUtils {
return payTypeStr;
}
/**
* h5 订单查询 where status 封装
* @param queryWrapper 查询条件
* @param status 状态
*/
public void statusApiByWhere(LambdaQueryWrapper<StoreOrder> queryWrapper, int status){
switch (status){
case Constants.ORDER_STATUS_H5_UNPAID: // 未支付
queryWrapper.eq(StoreOrder::getPaid, false);
queryWrapper.eq(StoreOrder::getStatus, 0);
queryWrapper.eq(StoreOrder::getRefundStatus, 0);
break;
case Constants.ORDER_STATUS_H5_NOT_SHIPPED: // 待发货
queryWrapper.eq(StoreOrder::getPaid, true);
queryWrapper.eq(StoreOrder::getStatus, 0);
queryWrapper.eq(StoreOrder::getRefundStatus, 0);
queryWrapper.eq(StoreOrder::getShippingType, 1);
break;
case Constants.ORDER_STATUS_H5_SPIKE: // 待收货
queryWrapper.eq(StoreOrder::getPaid, true);
queryWrapper.eq(StoreOrder::getStatus, 1);
queryWrapper.eq(StoreOrder::getRefundStatus, 0);
break;
case Constants.ORDER_STATUS_H5_VERF: // 待核销
queryWrapper.eq(StoreOrder::getPaid, true);
queryWrapper.eq(StoreOrder::getStatus, 0);
queryWrapper.eq(StoreOrder::getRefundStatus, 0);
queryWrapper.eq(StoreOrder::getShippingType, 2);
break;
case Constants.ORDER_STATUS_H5_COMPLETE: // 已完成
queryWrapper.eq(StoreOrder::getPaid, true);
queryWrapper.eq(StoreOrder::getStatus, 3);
queryWrapper.eq(StoreOrder::getRefundStatus, 0);
break;
case Constants.ORDER_STATUS_H5_REFUNDING: // 退款中
queryWrapper.eq(StoreOrder::getPaid, true);
queryWrapper.eq(StoreOrder::getRefundStatus, 1);
break;
case Constants.ORDER_STATUS_H5_REFUNDED: // 已退款
queryWrapper.eq(StoreOrder::getPaid, true);
queryWrapper.eq(StoreOrder::getStatus, 2);
break;
case Constants.ORDER_STATUS_H5_REFUND: // 退款
queryWrapper.eq(StoreOrder::getPaid, true);
queryWrapper.in(StoreOrder::getRefundStatus, "1,2"); //大于0
break;
}
queryWrapper.eq(StoreOrder::getIsDel, false);
queryWrapper.eq(StoreOrder::getIsSystemDel, false);
}
/**
* 根据订单id获取订单中商品和名称和购买数量字符串
* @param orderId 订单id
* @return 商品名称*购买数量
*/
public String getStoreNameAndCarNumString(int orderId){
List<StoreOrderInfoVo> currentOrderInfo = storeOrderInfoService.getOrderListByOrderId(orderId);
if(currentOrderInfo.size() > 0) {
StringBuilder sbOrderProduct = new StringBuilder();
for (StoreOrderInfoVo storeOrderInfoVo : currentOrderInfo) {
sbOrderProduct.append(storeOrderInfoVo.getInfo().getProductInfo().getStoreName() + "*"
+ storeOrderInfoVo.getInfo().getCartNum());
}
return sbOrderProduct.toString();
}
return null;
}
/**
* 根据订单对象获取订单配送中文
* @param order 订单对象
* @return 配送方式中文字符串
*/
public String getPayTypeStrByOrder(StoreOrder order){
return order.getShippingType() == 1 ? "快递":"自提";
}
/** 这里的方法完全是为了订单中调用而封装 订单支付成功有余额支付和微信支付成功回调中
* 微信小程序发送付款成功订阅消息
* @param paySuccess 付款成功订阅消息
* @param userId 用户Id
*/
public void sendWeiChatMiniMessageForPaySuccess(WechatSendMessageForPaySuccess paySuccess, int userId){
wechatSendMessageForMinService.sendPaySuccessMessage(paySuccess,userId);
}
/**
* 微信小程序发送发货快递通知订阅消息
* @param storeOrder 发送快递
* @param userId 接收消息的用户id
*/
public void sendWeiChatMiniMessageForPackageExpress(StoreOrder storeOrder, int userId){
WechatSendMessageForPackage toPackage = new WechatSendMessageForPackage(
getOrderPayTypeStr(storeOrder.getPayType()),storeOrder.getOrderId(),storeOrder.getUserAddress(),
storeOrder.getUserPhone(),storeOrder.getRealName()
);
wechatSendMessageForMinService.sendRePackageMessage(toPackage,userId);
}
/**
* 微信小程序发送 配送通知订阅消息
* @param storeOrder 配送订单信息
* @param userId 接收消息的用户id
*/
public void senWeiChatMiniMessageForDeliver(StoreOrder storeOrder, int userId){
WechatSendMessageForDistrbution distrbution = new WechatSendMessageForDistrbution(
storeOrder.getId()+"",storeOrder.getDeliveryName(),storeOrder.getDeliveryId()+"",
"商家已经开始配送", "暂无",getStoreNameAndCarNumString(storeOrder.getId()),"暂无"
);
wechatSendMessageForMinService.sendDistrbutionMessage(distrbution,userId);
}
}

View File

@@ -1,25 +1,19 @@
package com.zbkj.crmeb.system.controller;
import com.common.CommonPage;
import com.common.CommonResult;
import com.common.PageParamRequest;
import com.zbkj.crmeb.category.vo.CategoryTreeVo;
import com.zbkj.crmeb.system.model.SystemCity;
import com.zbkj.crmeb.system.request.SystemCityRequest;
import com.zbkj.crmeb.system.request.SystemCitySearchRequest;
import com.zbkj.crmeb.system.vo.SystemCityTreeVo;
import io.swagger.annotations.ApiImplicitParam;
import io.swagger.annotations.ApiImplicitParams;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import com.zbkj.crmeb.system.service.SystemCityService;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiOperation;
import org.springframework.beans.BeanUtils;
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 com.zbkj.crmeb.system.service.SystemCityService;
import com.zbkj.crmeb.system.model.SystemCity;
import java.util.List;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.RestController;
/**
@@ -107,7 +101,7 @@ public class SystemCityController {
*/
@ApiOperation(value = "修改状态")
@RequestMapping(value = "/update/status", method = RequestMethod.POST)
public CommonResult<String> update(@RequestParam Integer id, @RequestParam Boolean status){
public CommonResult<String> updateStatus(@RequestParam Integer id, @RequestParam Boolean status){
if(systemCityService.updateStatus(id, status)){
return CommonResult.success();
}else{

View File

@@ -38,7 +38,8 @@ public class SystemStoreStaffController {
@RequestMapping(value = "/list", method = RequestMethod.GET)
public CommonResult<CommonPage<SystemStoreStaffResponse>> getList(@RequestParam(name = "storeId", required = false, defaultValue = "0") Integer storeId,
@ModelAttribute PageParamRequest pageParamRequest){
CommonPage<SystemStoreStaffResponse> systemStoreStaffCommonPage = CommonPage.restPage(systemStoreStaffService.getList(storeId, pageParamRequest));
CommonPage<SystemStoreStaffResponse> systemStoreStaffCommonPage =
CommonPage.restPage(systemStoreStaffService.getList(storeId, pageParamRequest));
return CommonResult.success(systemStoreStaffCommonPage);
}
@@ -51,10 +52,7 @@ public class SystemStoreStaffController {
@ApiOperation(value = "新增")
@RequestMapping(value = "/save", method = RequestMethod.POST)
public CommonResult<String> save(@RequestBody @ModelAttribute SystemStoreStaffRequest systemStoreStaffRequest){
SystemStoreStaff systemStoreStaff = new SystemStoreStaff();
BeanUtils.copyProperties(systemStoreStaffRequest, systemStoreStaff);
if(systemStoreStaffService.save(systemStoreStaff)){
if(systemStoreStaffService.saveUnique(systemStoreStaffRequest)){
return CommonResult.success();
}else{
return CommonResult.failed();

View File

@@ -3,7 +3,6 @@ package com.zbkj.crmeb.system.request;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
import javax.validation.Valid;
import javax.validation.constraints.NotEmpty;
/**
@@ -30,4 +29,7 @@ public class SystemAdminLoginRequest {
@ApiModelProperty(value = "code", required = true)
@NotEmpty(message = "验证码 不能为空")
private String code;
@ApiModelProperty(value = "微信授权code")
private String wxCode;
}

View File

@@ -29,18 +29,18 @@ public class SystemStoreStaffRequest implements Serializable {
private static final long serialVersionUID=1L;
@ApiModelProperty(value = "微信用户id")
@Min(value = 1, message = "请选择用户")
@ApiModelProperty(value = "管理员 id")
@Min(value = 1, message = "请选择管理员")
private Integer uid;
@ApiModelProperty(value = "员头像")
@ApiModelProperty(value = "管理员头像")
private String avatar;
@ApiModelProperty(value = "提货点id")
@Min(value = 1, message = "请选择提货点")
private Integer storeId;
@ApiModelProperty(value = "店员名称")
@ApiModelProperty(value = "核销员 名称 [昵称]")
private String staffName;
@ApiModelProperty(value = "手机号码")

View File

@@ -27,7 +27,7 @@ public class SystemWriteOffOrderSearchRequest implements Serializable {
private Integer storeId;
@ApiModelProperty(value = "时间")
private String data;
private String dateLimit;
@ApiModelProperty(value = "关键字")
private String keywords;

View File

@@ -69,7 +69,7 @@ public class StoreOrderItemResponse implements Serializable {
private Date createTime;
@ApiModelProperty(value = "订单状态(-1 : 申请退款 -2 : 退货成功 0待发货1待收货2已收货3待评价-1已退款")
private Boolean status;
private Integer status;
@ApiModelProperty(value = "门店名称")
private String storeName;
@@ -131,6 +131,18 @@ public class StoreOrderItemResponse implements Serializable {
@ApiModelProperty(value = "退款金额")
private BigDecimal refundPrice;
@ApiModelProperty(value = "0 未退款 1 申请中 2 已退款")
private Integer refundStatus;
@ApiModelProperty(value = "订单商品总数")
private Integer totalNum;
@ApiModelProperty(value = "配送方式 1=快递 2=门店自提")
private Integer shippingType;
@ApiModelProperty(value = "核销码")
private String verifyCode;
@ApiModelProperty(value = "推广人信息")
private StoreOrderSpreadInfoResponse spreadInfo = new StoreOrderSpreadInfoResponse();
}

View File

@@ -60,4 +60,10 @@ public interface SystemAdminService extends IService<SystemAdmin> {
SystemAdmin getInfo(Integer adminId);
SystemAdmin getInfo();
SystemAdminResponse weChatAuthorizeLogin(String code, String ip);
Boolean unBind();
void bind(String wxCode, Integer adminId);
}

View File

@@ -5,6 +5,7 @@ import com.github.pagehelper.PageInfo;
import com.zbkj.crmeb.system.model.SystemStoreStaff;
import com.baomidou.mybatisplus.extension.service.IService;
import com.zbkj.crmeb.system.model.SystemStoreStaffResponse;
import com.zbkj.crmeb.system.request.SystemStoreStaffRequest;
import java.util.HashMap;
import java.util.List;
@@ -19,4 +20,18 @@ public interface SystemStoreStaffService extends IService<SystemStoreStaff> {
PageInfo<SystemStoreStaffResponse> getList(Integer storeId, PageParamRequest pageParamRequest);
HashMap<Integer, SystemStoreStaff> getMapInId(List<Integer> clerkIdList);
/**
* 根据用户id获取核销信息
* @param userIds 用户id集合
* @return 核销信息
*/
List<SystemStoreStaff> getByAdminUserIds(List<Integer> userIds);
/**
* 添加核销员 唯一验证
* @param request 当前添加参数
* @return 添加结果
*/
boolean saveUnique(SystemStoreStaffRequest request);
}

View File

@@ -4,6 +4,7 @@ import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import com.common.PageParamRequest;
import com.constants.Constants;
import com.exception.CrmebException;
import com.github.pagehelper.PageHelper;
import com.utils.CrmebUtil;
@@ -18,6 +19,10 @@ import com.zbkj.crmeb.system.request.SystemRoleSearchRequest;
import com.zbkj.crmeb.system.response.SystemAdminResponse;
import com.zbkj.crmeb.system.service.SystemAdminService;
import com.zbkj.crmeb.system.service.SystemRoleService;
import com.zbkj.crmeb.user.model.UserToken;
import com.zbkj.crmeb.user.service.UserTokenService;
import com.zbkj.crmeb.wechat.response.WeChatAuthorizeLoginGetOpenIdResponse;
import com.zbkj.crmeb.wechat.service.WeChatService;
import org.apache.commons.lang3.StringUtils;
import org.springframework.beans.BeanUtils;
import org.springframework.beans.factory.annotation.Autowired;
@@ -45,6 +50,12 @@ public class SystemAdminServiceImpl extends ServiceImpl<SystemAdminDao, SystemAd
@Resource
private TokenManager tokenManager;
@Autowired
private UserTokenService userTokenService;
@Autowired
private WeChatService weChatService;
@Override
public List<SystemAdminResponse> getList(SystemAdminRequest request, PageParamRequest pageParamRequest){
@@ -277,5 +288,78 @@ public class SystemAdminServiceImpl extends ServiceImpl<SystemAdminDao, SystemAd
public SystemAdmin getInfo(Integer adminId) {
return getById(adminId);
}
/**
* 微信扫码登录
* @author Mr.Zhang
* @since 2020-04-28
* @return SystemAdmin
*/
@Override
public SystemAdminResponse weChatAuthorizeLogin(String code, String ip) {
//通过code获取用户信息
WeChatAuthorizeLoginGetOpenIdResponse response = weChatService.authorizeLogin(code);
UserToken userToken = userTokenService.getUserIdByOpenId(response.getOpenId(), Constants.THIRD_ADMIN_LOGIN_TOKEN_TYPE_PUBLIC);
if(null == userToken){
throw new CrmebException("当前微信账号没有绑定后台账户,请用账号密码登录之后在个人中心扫码绑定");
}
SystemAdmin systemAdmin = getInfo(userToken.getUid());
if(null == systemAdmin){
throw new CrmebException("用户不存在");
}
if(!systemAdmin.getStatus()){
throw new CrmebException("用户已经被禁用");
}
if(systemAdmin.getIsDel()){
throw new CrmebException("用户已经被删除");
}
TokenModel tokenModel = tokenManager.createToken(systemAdmin.getAccount(), systemAdmin.getId().toString(), TokenModel.TOKEN_REDIS);
SystemAdminResponse systemAdminResponse = new SystemAdminResponse();
systemAdminResponse.setToken(tokenModel.getToken());
BeanUtils.copyProperties(systemAdmin, systemAdminResponse);
//更新最后登录信息
systemAdmin.setLoginCount(systemAdmin.getLoginCount() + 1);
systemAdmin.setLastIp(ip);
updateById(systemAdmin);
return systemAdminResponse;
}
/**
* 绑定微信
* @author Mr.Zhang
* @since 2020-04-28
* @return SystemAdmin
*/
public void bind(String code, Integer adminId) {
try{
//通过code获取用户信息
WeChatAuthorizeLoginGetOpenIdResponse response = weChatService.authorizeLogin(code);
UserToken userToken = userTokenService.checkToken(response.getOpenId(), Constants.THIRD_ADMIN_LOGIN_TOKEN_TYPE_PUBLIC);
if(null == userToken){
userTokenService.bind(response.getOpenId(), Constants.THIRD_ADMIN_LOGIN_TOKEN_TYPE_PUBLIC, adminId);
}
}catch (Exception e){
throw new CrmebException("绑定失败:" + e.getMessage());
}
}
/**
* 解绑微信
* @author Mr.Zhang
* @since 2020-04-28
* @return Boolean
*/
@Override
public Boolean unBind() {
return userTokenService.unBind(Constants.THIRD_ADMIN_LOGIN_TOKEN_TYPE_PUBLIC, tokenManager.getLocalUserId());
}
}

View File

@@ -55,7 +55,7 @@ public class SystemConfigServiceImpl extends ServiceImpl<SystemConfigDao, System
* @param pageParamRequest PageParamRequest 分页参数
* @author Mr.Zhang
* @since 2020-04-16
* @return String
* @return List<SystemConfig>
*/
@Override
public List<SystemConfig> getList(PageParamRequest pageParamRequest) {
@@ -89,7 +89,7 @@ public class SystemConfigServiceImpl extends ServiceImpl<SystemConfigDao, System
/**
* 同时获取多个配置
* @param keys 多个配置key
* @return 查询到的数据集合
* @return List<String>
*/
@Override
public List<String> getValuesByKes(List<String> keys) {
@@ -122,7 +122,7 @@ public class SystemConfigServiceImpl extends ServiceImpl<SystemConfigDao, System
* @param systemFormCheckRequest SystemFormCheckRequest 数据保存
* @author Mr.Zhang
* @since 2020-04-13
* @return bool
* @return boolean
*/
@Override
public boolean saveForm(SystemFormCheckRequest systemFormCheckRequest) {
@@ -202,7 +202,7 @@ public class SystemConfigServiceImpl extends ServiceImpl<SystemConfigDao, System
* 保存或更新配置数据
* @param name 菜单名称
* @param value 菜单值
* @return 更新或者保存的状态
* @return boolean
*/
@Override
public boolean updateOrSaveValueByName(String name, String value) {
@@ -231,7 +231,7 @@ public class SystemConfigServiceImpl extends ServiceImpl<SystemConfigDao, System
* @param formId Integer id
* @author Mr.Zhang
* @since 2020-04-16
* @return JSONObject
* @return HashMap<String, String>
*/
@Override
public HashMap<String, String> info(Integer formId){
@@ -255,7 +255,7 @@ public class SystemConfigServiceImpl extends ServiceImpl<SystemConfigDao, System
* @param name name
* @author Mr.Zhang
* @since 2020-04-16
* @return JSONObject
* @return boolean
*/
@Override
public boolean checkName(String name){
@@ -270,7 +270,6 @@ public class SystemConfigServiceImpl extends ServiceImpl<SystemConfigDao, System
* @param name name
* @author Mr.Zhang
* @since 2020-04-16
* @return JSONObject
*/
private void asyncRedis(String name){
LambdaQueryWrapper<SystemConfig> lambdaQueryWrapper = new LambdaQueryWrapper<>();
@@ -290,7 +289,6 @@ public class SystemConfigServiceImpl extends ServiceImpl<SystemConfigDao, System
* @param systemConfigList List<SystemConfig> 需要同步的数据
* @author Mr.Zhang
* @since 2020-04-16
* @return JSONObject
*/
private void async(List<SystemConfig> systemConfigList){
if (!asyncConfig) {
@@ -313,7 +311,6 @@ public class SystemConfigServiceImpl extends ServiceImpl<SystemConfigDao, System
* @param name String
* @author Mr.Zhang
* @since 2020-04-16
* @return JSONObject
*/
private void deleteRedis(String name){
if (!asyncConfig) {
@@ -328,7 +325,7 @@ public class SystemConfigServiceImpl extends ServiceImpl<SystemConfigDao, System
* @param name String
* @author Mr.Zhang
* @since 2020-04-16
* @return JSONObject
* @return String
*/
private String get(String name){
if (!asyncConfig) {
@@ -358,7 +355,6 @@ public class SystemConfigServiceImpl extends ServiceImpl<SystemConfigDao, System
* 把数据同步到redis, 此方法适用于redis为空的时候进行一次批量输入
* @author Mr.Zhang
* @since 2020-04-16
* @return JSONObject
*/
private void setRedisByVoList(){
//检测redis是否为空

View File

@@ -194,7 +194,7 @@ public class SystemStoreServiceImpl extends ServiceImpl<SystemStoreDao, SystemSt
if(StringUtils.isNotBlank(request.getLatitude()) && StringUtils.isNotBlank(request.getLongitude())){
storeNearVoArrayList = dao.getNearList(request);
}else{
List<SystemStore> list = getList(null, 2, pageParamRequest);
List<SystemStore> list = getList(null, 1, pageParamRequest);
for (SystemStore systemStore : list) {
SystemStoreNearVo systemStoreNearVo = new SystemStoreNearVo();
BeanUtils.copyProperties(systemStore, systemStoreNearVo);

View File

@@ -1,9 +1,12 @@
package com.zbkj.crmeb.system.service.impl;
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.baomidou.mybatisplus.core.toolkit.Wrappers;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import com.common.CommonPage;
import com.common.PageParamRequest;
import com.constants.Constants;
import com.exception.CrmebException;
import com.github.pagehelper.Page;
import com.github.pagehelper.PageHelper;
import com.github.pagehelper.PageInfo;
@@ -11,6 +14,7 @@ import com.zbkj.crmeb.system.dao.SystemStoreStaffDao;
import com.zbkj.crmeb.system.model.SystemStore;
import com.zbkj.crmeb.system.model.SystemStoreStaff;
import com.zbkj.crmeb.system.model.SystemStoreStaffResponse;
import com.zbkj.crmeb.system.request.SystemStoreStaffRequest;
import com.zbkj.crmeb.system.service.SystemStoreService;
import com.zbkj.crmeb.system.service.SystemStoreStaffService;
import com.zbkj.crmeb.user.model.User;
@@ -67,14 +71,14 @@ public class SystemStoreStaffServiceImpl extends ServiceImpl<SystemStoreStaffDao
//用户信息
List<Integer> userIdList = systemStoreStaffList.stream().map(SystemStoreStaff::getUid).collect(Collectors.toList());
HashMap<Integer, User> userList = null;
if(userIdList.size() > 1){
if(userIdList.size() >= 1){
userList = userService.getMapListInUid(userIdList);
}
//门店信息
List<Integer> storeIdList = systemStoreStaffList.stream().map(SystemStoreStaff::getStoreId).collect(Collectors.toList());
HashMap<Integer, SystemStore> storeList = null;
if(storeIdList.size() > 1){
if(storeIdList.size() >= 1){
storeList = systemStoreService.getMapInId(storeIdList);
}
@@ -109,7 +113,7 @@ public class SystemStoreStaffServiceImpl extends ServiceImpl<SystemStoreStaffDao
if(clerkIdList.size() < 1){
return map;
}
LambdaQueryWrapper<SystemStoreStaff> lambdaQueryWrapper = new LambdaQueryWrapper<>();
LambdaQueryWrapper<SystemStoreStaff> lambdaQueryWrapper = Wrappers.lambdaQuery();
lambdaQueryWrapper.in(SystemStoreStaff::getId, clerkIdList);
List<SystemStoreStaff> systemStoreStaffList = dao.selectList(lambdaQueryWrapper);
if(systemStoreStaffList.size() < 1){
@@ -121,5 +125,35 @@ public class SystemStoreStaffServiceImpl extends ServiceImpl<SystemStoreStaffDao
return map;
}
/**
* 根据用户id获取核销信息
*
* @param userIds 用户id集合
* @return 核销人员id集合
*/
@Override
public List<SystemStoreStaff> getByAdminUserIds(List<Integer> userIds) {
LambdaQueryWrapper<SystemStoreStaff> lambdaQueryWrapper = Wrappers.lambdaQuery();
lambdaQueryWrapper.in(SystemStoreStaff::getUid, userIds);
List<SystemStoreStaff> existStaffs = dao.selectList(lambdaQueryWrapper);
return existStaffs.stream().distinct().collect(Collectors.toList());
}
/**
* 添加核销员 唯一验证
*
* @param request 当前添加参数
* @return 添加结果
*/
@Override
public boolean saveUnique(SystemStoreStaffRequest request) {
List<Integer> userIds = new ArrayList<>();
userIds.add(request.getUid());
List<SystemStoreStaff> existStaffs = getByAdminUserIds(userIds);
if(null != existStaffs && existStaffs.size() > 0) throw new CrmebException(Constants.RESULT_VERIFICATION_USER_EXIST);
SystemStoreStaff systemStoreStaff = new SystemStoreStaff();
BeanUtils.copyProperties(request, systemStoreStaff);
return dao.insert(systemStoreStaff) > 0;
}
}

View File

@@ -1,5 +1,4 @@
package com.zbkj.crmeb.task.sms;
import com.utils.DateUtil;
import com.zbkj.crmeb.sms.model.SmsRecord;
import com.zbkj.crmeb.sms.service.SmsRecordService;

View File

@@ -0,0 +1,42 @@
package com.zbkj.crmeb.task.wechat;
import com.utils.DateUtil;
import com.zbkj.crmeb.wechat.service.WechatProgramPublicTempService;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.context.annotation.Configuration;
import org.springframework.scheduling.annotation.EnableScheduling;
import org.springframework.scheduling.annotation.Scheduled;
import org.springframework.stereotype.Component;
//小程序公共模板库
@Component
@Configuration //读取配置
@EnableScheduling // 2.开启定时任务
public class AsyncWeChatProgramTempList {
//日志
private static final Logger logger = LoggerFactory.getLogger(AsyncWeChatProgramTempList.class);
@Autowired
private WechatProgramPublicTempService wechatProgramPublicTempService;
@Value("${server.asyncWeChatProgramTempList}")
private Boolean asyncWeChatProgramTempList;
@Scheduled(fixedDelay = 1000L * 60 * 60 * 24) //1天同步一次数据
public void init(){
logger.info("---AsyncWeChatProgramTempList task------produce Data with fixed rate task: Execution Time - {}", DateUtil.nowDate());
try {
if(asyncWeChatProgramTempList){
wechatProgramPublicTempService.async();
}
}catch (Exception e){
e.printStackTrace();
logger.error("AsyncWeChatProgramTempList.task" + " | msg : " + e.getMessage());
}
}
}

View File

@@ -14,7 +14,9 @@ public interface UserTokenService extends IService<UserToken> {
UserToken checkToken(String token, int type);
void bind(String openId, int thirdLoginTokenTypeUnionId, Integer uid);
void bind(String openId, int type, Integer uid);
Boolean unBind(int type, Integer uid);
UserToken getTokenByUserId(Integer userId, int type);
@@ -22,5 +24,5 @@ public interface UserTokenService extends IService<UserToken> {
List<UserToken> getList(List<Integer> userIdList);
UserToken getUserIdByOpenId(String openid);
UserToken getUserIdByOpenId(String openid, int type);
}

View File

@@ -203,7 +203,7 @@ public class UserServiceImpl extends ServiceImpl<UserDao, User> implements UserS
}
//获取推广人信息
if(user.getSpreadUid() == 0){
if(null == user.getSpreadUid() || user.getSpreadUid() == 0){
userResponse.setSpreadNickname("");
}else{
userResponse.setSpreadNickname(userDao.selectById(user.getSpreadUid()).getNickname());
@@ -1268,9 +1268,10 @@ public class UserServiceImpl extends ServiceImpl<UserDao, User> implements UserS
return user;
}
/** 根据用户id集合获取对应用户集合
* @param userIds 用户id集合
* @return 用户集合
/**
* 根据用户id集合获取对应用户集合
* @param userIds 用户id集合
* @return 用户集合
*/
@Override
public List<User> getSpreadPeopleList(List<Integer> userIds) {
@@ -1541,7 +1542,7 @@ public class UserServiceImpl extends ServiceImpl<UserDao, User> implements UserS
if(null == spreadUid || spreadUid == 0){
return;
}
//如果当前用户没有绑定,并且后台配置人人分销,那么需要邦迪
//如果当前用户没有绑定,并且后台配置人人分销,那么需要绑定
if(user.getSpreadUid() > 0){
return;
}
@@ -1549,7 +1550,7 @@ public class UserServiceImpl extends ServiceImpl<UserDao, User> implements UserS
String distribution = systemConfigService.getValueByKey(Constants.CONFIG_KEY_DISTRIBUTION_TYPE);
//人人分销 + 当前已绑定的id和推广人id不一样
if(distribution.equals("0") && !user.getSpreadUid().equals(spreadUid)){
if(StringUtils.isNotBlank(distribution) && distribution.equals("0") && !user.getSpreadUid().equals(spreadUid)){
user.setSpreadUid(spreadUid);
user.setSpreadTime(DateUtil.nowDateTime());
}

View File

@@ -20,6 +20,9 @@ import com.zbkj.crmeb.user.service.UserService;
import com.zbkj.crmeb.user.service.UserSignService;
import com.zbkj.crmeb.user.vo.UserSignMonthVo;
import com.zbkj.crmeb.user.vo.UserSignVo;
import com.zbkj.crmeb.wechat.service.impl.WechatSendMessageForMinService;
import com.zbkj.crmeb.wechat.vo.WechatSendMessageForIntegral;
import io.swagger.models.auth.In;
import org.springframework.beans.BeanUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
@@ -51,6 +54,8 @@ public class UserSignServiceImpl extends ServiceImpl<UserSignDao, UserSign> impl
@Autowired
private UserBillService userBillService;
@Autowired
private WechatSendMessageForMinService wechatSendMessageForMinService;
/**
* 列表
@@ -114,6 +119,14 @@ public class UserSignServiceImpl extends ServiceImpl<UserSignDao, UserSign> impl
userOperateFundsRequest.setValue(new BigDecimal(configVo.getIntegral()));
userService.updateFounds(userOperateFundsRequest, true);
// 小程序消息积分变动通知
WechatSendMessageForIntegral integralPram = new WechatSendMessageForIntegral(
"您的积分变动如下","签到获得积分","签到","0",configVo.getIntegral()+"",
(user.getIntegral().add(BigDecimal.valueOf(configVo.getIntegral())))+"",
DateUtil.nowDateTimeStr(),"暂无","暂无","签到赠送积分"
);
wechatSendMessageForMinService.sendIntegralMessage(integralPram,user.getUid());
//更新用户经验信息
userOperateFundsRequest.setUid(user.getUid());
userOperateFundsRequest.setFoundsCategory(Constants.USER_BILL_CATEGORY_EXPERIENCE);

View File

@@ -60,6 +60,24 @@ public class UserTokenServiceImpl extends ServiceImpl<UserTokenDao, UserToken> i
save(userToken);
}
/**
* 解绑微信
* @author Mr.Zhang
* @since 2020-04-28
* @return Boolean
*/
@Override
public Boolean unBind(int type, Integer uid) {
try{
LambdaQueryWrapper<UserToken> lambdaQueryWrapper = new LambdaQueryWrapper<>();
lambdaQueryWrapper.eq(UserToken::getUid, uid).eq(UserToken::getType, type);
dao.delete(lambdaQueryWrapper);
return true;
}catch (Exception e){
return false;
}
}
@Override
public UserToken getTokenByUserId(Integer userId, int type) {
LambdaQueryWrapper<UserToken> lambdaQueryWrapper = new LambdaQueryWrapper<>();
@@ -91,9 +109,10 @@ public class UserTokenServiceImpl extends ServiceImpl<UserTokenDao, UserToken> i
}
@Override
public UserToken getUserIdByOpenId(String openid) {
public UserToken getUserIdByOpenId(String openid, int type) {
LambdaQueryWrapper<UserToken> lambdaQueryWrapper = new LambdaQueryWrapper<>();
lambdaQueryWrapper.eq(UserToken::getToken, openid);
lambdaQueryWrapper.eq(UserToken::getType, type);
return dao.selectOne(lambdaQueryWrapper);
}

View File

@@ -0,0 +1,57 @@
package com.zbkj.crmeb.wechat.controller;
import com.common.CommonResult;
import com.zbkj.crmeb.wechat.service.WeChatService;
import com.zbkj.crmeb.wechat.vo.ProgramCategoryVo;
import com.zbkj.crmeb.wechat.vo.ProgramTempKeywordsVo;
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.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.RestController;
import java.util.List;
/**
* 微信缓存表 前端控制器
*/
@Slf4j
@RestController
@RequestMapping("api/admin/wechat/program")
@Api(tags = "微信开放平台 -- 小程序")
public class ProgramController {
@Autowired
private WeChatService weChatService;
/**
* 小程序行业信息
* @author Mr.Zhang
* @since 2020-06-03
*/
@ApiOperation(value = "小程序行业信息")
@RequestMapping(value = "/category", method = RequestMethod.GET)
public CommonResult<List<ProgramCategoryVo>> getCategory(){
return CommonResult.success(weChatService.getProgramCategory());
}
/**
* 通过微信公共模板tid获取关键字列表
* @author Mr.Zhang
* @since 2020-06-03
*/
@ApiOperation(value = "通过微信模板tid获取关键字列表")
@RequestMapping(value = "/getWeChatKeywordsByTid", method = RequestMethod.GET)
public CommonResult<List<ProgramTempKeywordsVo>> getWeChatKeywordsByTid(@RequestParam(value = "tid") Integer tid){
return CommonResult.success(weChatService.getWeChatKeywordsByTid(tid));
}
}

View File

@@ -3,19 +3,17 @@ package com.zbkj.crmeb.wechat.controller;
import com.common.CommonPage;
import com.common.CommonResult;
import com.common.PageParamRequest;
import com.utils.DateUtil;
import com.zbkj.crmeb.wechat.model.TemplateMessage;
import com.zbkj.crmeb.wechat.request.TemplateMessageRequest;
import com.zbkj.crmeb.wechat.request.TemplateMessageSearchRequest;
import com.zbkj.crmeb.wechat.service.TemplateMessageService;
import com.zbkj.crmeb.wechat.vo.TemplateMessageIndustryVo;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.util.unit.DataUnit;
import org.springframework.validation.annotation.Validated;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiOperation;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.BeanUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.validation.annotation.Validated;
import org.springframework.web.bind.annotation.*;

View File

@@ -0,0 +1,41 @@
package com.zbkj.crmeb.wechat.controller;
import com.common.CommonResult;
import com.zbkj.crmeb.wechat.service.WeChatService;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiImplicitParam;
import io.swagger.annotations.ApiOperation;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.RestController;
/**
* @Classname WeChatAdminController
* @Description TODO
* @Date 9/4/20 2:22 下午
* @Created by stivepeim
*/
@Slf4j
@RestController("WeChatAdminController")
@RequestMapping("api/admin/wechat")
@Api(tags = "微信 -- 开放平台 admin")
public class WeChatAdminController {
@Autowired
private WeChatService weChatService;
/**
* 获取微信公众号js配置
* @author Mr.Zhang
* @since 2020-05-25
*/
@ApiOperation(value = "获取微信公众号js配置")
@RequestMapping(value = "/config", method = RequestMethod.GET)
@ApiImplicitParam(name = "url", value = "页面地址url")
public CommonResult<Object> configJs(@RequestParam(value = "url") String url){
return CommonResult.success(weChatService.getJsSdkConfig(url));
}
}

View File

@@ -0,0 +1,147 @@
package com.zbkj.crmeb.wechat.controller;
import com.common.CommonPage;
import com.common.CommonResult;
import com.common.PageParamRequest;
import com.zbkj.crmeb.wechat.model.WechatProgramMyTemp;
import com.zbkj.crmeb.wechat.request.WechatProgramMyTempRequest;
import com.zbkj.crmeb.wechat.request.WechatProgramMyTempSearchRequest;
import com.zbkj.crmeb.wechat.service.WechatProgramMyTempService;
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 java.util.List;
/**
* 小程序我的模板 前端控制器
*/
@Slf4j
@RestController
@RequestMapping("api/admin/wechat/program/my/temp")
@Api(tags = "微信开放平台 -- 小程序 -- 我的模板") //配合swagger使用
public class WechatProgramMyTempController {
@Autowired
private WechatProgramMyTempService wechatProgramMyTempService;
/**
* 分页显示小程序我的模板
* @param request 搜索条件
* @param pageParamRequest 分页参数
* @author Mr.Zhang
* @since 2020-08-28
*/
@ApiOperation(value = "分页列表") //配合swagger使用
@RequestMapping(value = "/list", method = RequestMethod.GET)
public CommonResult<CommonPage<WechatProgramMyTemp>> getList(@Validated WechatProgramMyTempSearchRequest request, @Validated PageParamRequest pageParamRequest){
CommonPage<WechatProgramMyTemp> wechatProgramMyTempCommonPage = CommonPage.restPage(wechatProgramMyTempService.getList(request, pageParamRequest));
return CommonResult.success(wechatProgramMyTempCommonPage);
}
/**
* 新增小程序我的模板
* @param wechatProgramMyTempRequest 新增参数
* @author Mr.Zhang
* @since 2020-08-28
*/
@ApiOperation(value = "新增")
@RequestMapping(value = "/save", method = RequestMethod.POST)
public CommonResult<String> save(@RequestBody @Validated WechatProgramMyTempRequest wechatProgramMyTempRequest){
if(wechatProgramMyTempService.create(wechatProgramMyTempRequest)){
return CommonResult.success();
}else{
return CommonResult.failed();
}
}
/**
* 禁用/禁用小程序我的模板
* @param id Integer
* @param status boolean
* @author Mr.Zhang
* @since 2020-08-28
*/
@ApiOperation(value = "禁用/禁用")
@RequestMapping(value = "update/status", method = RequestMethod.GET)
public CommonResult<String> delete(@RequestParam(value = "id") Integer id, @RequestParam(value = "status") boolean status){
if(wechatProgramMyTempService.updateStatus(id, status)){
return CommonResult.success();
}else{
return CommonResult.failed();
}
}
/**
* 更新应用场景
* @param id Integer
* @param type String
* @author Mr.Zhang
* @since 2020-08-28
*/
@ApiOperation(value = "禁用/禁用")
@RequestMapping(value = "update/type", method = RequestMethod.GET)
public CommonResult<String> updateType(@RequestParam(value = "id") Integer id, @RequestParam(value = "type") String type){
if(wechatProgramMyTempService.updateType(id, type)){
return CommonResult.success();
}else{
return CommonResult.failed();
}
}
/**
* 修改小程序我的模板
* @param id integer id
* @param wechatProgramMyTempRequest 修改参数
* @author Mr.Zhang
* @since 2020-08-28
*/
@ApiOperation(value = "修改")
@RequestMapping(value = "/update", method = RequestMethod.POST)
public CommonResult<String> update(@RequestParam Integer id, @RequestBody @Validated WechatProgramMyTempRequest wechatProgramMyTempRequest){
if(wechatProgramMyTempService.update(id, wechatProgramMyTempRequest)){
return CommonResult.success();
}else{
return CommonResult.failed();
}
}
/**
* 查询小程序我的模板信息
* @param id Integer
* @author Mr.Zhang
* @since 2020-08-28
*/
@ApiOperation(value = "详情")
@RequestMapping(value = "/info", method = RequestMethod.GET)
public CommonResult<WechatProgramMyTemp> info(@RequestParam(value = "id") Integer id){
WechatProgramMyTemp wechatProgramMyTemp = wechatProgramMyTempService.info(id);
return CommonResult.success(wechatProgramMyTemp);
}
/**
* 同步到小程序
* @author Mr.Zhang
* @since 2020-08-28
*/
@ApiOperation(value = "同步到小程序")
@RequestMapping(value = "/async", method = RequestMethod.GET)
public CommonResult<WechatProgramMyTemp> async(){
//查询模板信息
List<WechatProgramMyTemp> list = wechatProgramMyTempService.getAll();
if(null != list && list.size() > 0){
for (WechatProgramMyTemp wechatProgramMyTemp : list) {
wechatProgramMyTempService.async(wechatProgramMyTemp);
}
}
return CommonResult.success();
}
}

View File

@@ -0,0 +1,62 @@
package com.zbkj.crmeb.wechat.controller;
import com.common.CommonPage;
import com.common.CommonResult;
import com.common.PageParamRequest;
import com.zbkj.crmeb.wechat.model.WechatProgramPublicTemp;
import com.zbkj.crmeb.wechat.request.WechatProgramPublicTempSearchRequest;
import com.zbkj.crmeb.wechat.service.WechatProgramPublicTempService;
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.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.RestController;
/**
* 微信公共模板库
*/
@Slf4j
@RestController
@RequestMapping("api/admin/wechat/program/public/temp")
@Api(tags = "微信开放平台 -- 小程序 -- 微信公共模板库") //配合swagger使用
public class WechatProgramPublicTempController {
@Autowired
private WechatProgramPublicTempService wechatProgramPublicTempService;
/**
* 分页显示
* @param request 搜索条件
* @param pageParamRequest 分页参数
* @author Mr.Zhang
* @since 2020-08-27
*/
@ApiOperation(value = "分页列表") //配合swagger使用
@RequestMapping(value = "/list", method = RequestMethod.GET)
public CommonResult<CommonPage<WechatProgramPublicTemp>> getList(@Validated WechatProgramPublicTempSearchRequest request, @Validated PageParamRequest pageParamRequest){
CommonPage<WechatProgramPublicTemp> wechatProgramPublicTempCommonPage = CommonPage.restPage(wechatProgramPublicTempService.getList(request, pageParamRequest));
return CommonResult.success(wechatProgramPublicTempCommonPage);
}
/**
* 查询信息
* @param id Integer
* @author Mr.Zhang
* @since 2020-08-27
*/
@ApiOperation(value = "详情")
@RequestMapping(value = "/info", method = RequestMethod.GET)
public CommonResult<WechatProgramPublicTemp> info(@RequestParam(value = "id") Integer id){
WechatProgramPublicTemp wechatProgramPublicTemp = wechatProgramPublicTempService.getById(id);
return CommonResult.success(wechatProgramPublicTemp);
}
}

View File

@@ -0,0 +1,16 @@
package com.zbkj.crmeb.wechat.dao;
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import com.zbkj.crmeb.wechat.model.WechatProgramMyTemp;
/**
* <p>
* 小程序我的模板 Mapper 接口
* </p>
*
* @author Mr.Zhang
* @since 2020-08-28
*/
public interface WechatProgramMyTempDao extends BaseMapper<WechatProgramMyTemp> {
}

View File

@@ -0,0 +1,16 @@
package com.zbkj.crmeb.wechat.dao;
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import com.zbkj.crmeb.wechat.model.WechatProgramPublicTemp;
/**
* <p>
* Mapper 接口
* </p>
*
* @author Mr.Zhang
* @since 2020-08-27
*/
public interface WechatProgramPublicTempDao extends BaseMapper<WechatProgramPublicTemp> {
}

View File

@@ -0,0 +1,64 @@
package com.zbkj.crmeb.wechat.model;
import com.baomidou.mybatisplus.annotation.IdType;
import com.baomidou.mybatisplus.annotation.TableId;
import com.baomidou.mybatisplus.annotation.TableName;
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
import lombok.EqualsAndHashCode;
import lombok.experimental.Accessors;
import java.io.Serializable;
import java.util.Date;
/**
* <p>
* 小程序我的模板
* </p>
*
* @author Mr.Zhang
* @since 2020-08-28
*/
@Data
@EqualsAndHashCode(callSuper = false)
@Accessors(chain = true)
@TableName("eb_wechat_program_my_temp")
@ApiModel(value="WechatProgramMyTemp对象", description="小程序我的模板")
public class WechatProgramMyTemp implements Serializable {
private static final long serialVersionUID=1L;
@TableId(value = "id", type = IdType.AUTO)
private Integer id;
@ApiModelProperty(value = "微信模板id")
private Integer tid;
@ApiModelProperty(value = "模版标题")
private String title;
@ApiModelProperty(value = "模板关键字id多个逗号分割")
private String kid;
@ApiModelProperty(value = "场景描述")
private String sceneDesc;
@ApiModelProperty(value = "微信模板id")
private String tempId;
@ApiModelProperty(value = "扩展字段")
private String extra;
@ApiModelProperty(value = "状态 0禁用1启用")
private Boolean status;
@ApiModelProperty(value = "应用场景")
private String type;
@ApiModelProperty(value = "创建时间")
private Date createTime;
@ApiModelProperty(value = "更新时间")
private Date updateTime;
}

View File

@@ -0,0 +1,52 @@
package com.zbkj.crmeb.wechat.model;
import com.baomidou.mybatisplus.annotation.IdType;
import com.baomidou.mybatisplus.annotation.TableId;
import com.baomidou.mybatisplus.annotation.TableName;
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
import lombok.EqualsAndHashCode;
import lombok.experimental.Accessors;
import java.io.Serializable;
import java.util.Date;
/**
* <p>
*
* </p>
*
* @author Mr.Zhang
* @since 2020-08-27
*/
@Data
@EqualsAndHashCode(callSuper = false)
@Accessors(chain = true)
@TableName("eb_wechat_program_public_temp")
@ApiModel(value="WechatProgramPublicTemp对象", description="")
public class WechatProgramPublicTemp implements Serializable {
private static final long serialVersionUID=1L;
@TableId(value = "id", type = IdType.AUTO)
private Integer id;
@ApiModelProperty(value = "微信模板id")
private Integer tid;
@ApiModelProperty(value = "模版标题")
private String title;
@ApiModelProperty(value = "模版类型2 为一次性订阅3 为长期订阅")
private Integer type;
@ApiModelProperty(value = "模版所属类目 id")
private Integer categoryId;
@ApiModelProperty(value = "创建时间")
private Date createTime;
@ApiModelProperty(value = "修改时间")
private Date updateTime;
}

View File

@@ -0,0 +1,41 @@
package com.zbkj.crmeb.wechat.request;
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
import lombok.EqualsAndHashCode;
import lombok.experimental.Accessors;
import java.io.Serializable;
/**
* <p>
* 小程序我的模板
* </p>
*
* @author Mr.Zhang
* @since 2020-08-28
*/
@Data
@EqualsAndHashCode(callSuper = false)
@Accessors(chain = true)
@ApiModel(value="WechatProgramMyTempRequest对象", description="小程序我的模板")
public class WechatProgramMyTempRequest implements Serializable {
private static final long serialVersionUID=1L;
@ApiModelProperty(value = "微信模板id")
private Integer tid;
@ApiModelProperty(value = "模版标题")
private String title;
@ApiModelProperty(value = "模板关键字id多个逗号分割")
private String kid;
@ApiModelProperty(value = "场景描述")
private String sceneDesc;
@ApiModelProperty(value = "扩展字段")
private String extra;
}

View File

@@ -0,0 +1,40 @@
package com.zbkj.crmeb.wechat.request;
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
import lombok.EqualsAndHashCode;
import lombok.experimental.Accessors;
import java.io.Serializable;
/**
* <p>
* 小程序我的模板
* </p>
*
* @author Mr.Zhang
* @since 2020-08-28
*/
@Data
@EqualsAndHashCode(callSuper = false)
@Accessors(chain = true)
@ApiModel(value="WechatProgramMyTempSearchRequest对象", description="小程序我的模板")
public class WechatProgramMyTempSearchRequest implements Serializable {
private static final long serialVersionUID=1L;
@ApiModelProperty(value = "模版标题")
private String title;
@ApiModelProperty(value = "我的模板id")
private String tempId;
@ApiModelProperty(value = "状态 0禁用1启用")
private Boolean status;
@ApiModelProperty(value = "应用场景")
private String type;
private Integer id;
}

View File

@@ -0,0 +1,47 @@
package com.zbkj.crmeb.wechat.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 java.io.Serializable;
/**
* <p>
*
* </p>
*
* @author Mr.Zhang
* @since 2020-08-27
*/
@Data
@EqualsAndHashCode(callSuper = false)
@Accessors(chain = true)
@TableName("eb_wechat_program_public_temp")
@ApiModel(value="WechatProgramPublicTemp对象", description="")
public class WechatProgramPublicTempRequest implements Serializable {
private static final long serialVersionUID=1L;
@TableId(value = "id", type = IdType.AUTO)
private Integer id;
@ApiModelProperty(value = "微信模板id")
private Integer tid;
@ApiModelProperty(value = "模版标题")
private String title;
@ApiModelProperty(value = "模版类型2 为一次性订阅3 为长期订阅")
private Integer type;
@ApiModelProperty(value = "模版所属类目 id")
private Integer categoryId;
}

View File

@@ -0,0 +1,47 @@
package com.zbkj.crmeb.wechat.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 java.io.Serializable;
/**
* <p>
*
* </p>
*
* @author Mr.Zhang
* @since 2020-08-27
*/
@Data
@EqualsAndHashCode(callSuper = false)
@Accessors(chain = true)
@TableName("eb_wechat_program_public_temp")
@ApiModel(value="WechatProgramPublicTemp对象", description="")
public class WechatProgramPublicTempSearchRequest implements Serializable {
private static final long serialVersionUID=1L;
@TableId(value = "id", type = IdType.AUTO)
private Integer id;
@ApiModelProperty(value = "微信模板id")
private Integer tid;
@ApiModelProperty(value = "模版标题")
private String title;
@ApiModelProperty(value = "模版类型2 为一次性订阅3 为长期订阅")
private Integer type;
@ApiModelProperty(value = "模版所属类目 id")
private Integer categoryId;
}

View File

@@ -6,9 +6,10 @@ import com.zbkj.crmeb.payment.vo.wechat.CreateOrderResponseVo;
import com.zbkj.crmeb.wechat.response.WeChatAuthorizeLoginGetOpenIdResponse;
import com.zbkj.crmeb.wechat.response.WeChatAuthorizeLoginUserInfoResponse;
import com.zbkj.crmeb.wechat.response.WeChatProgramAuthorizeLoginGetOpenIdResponse;
import com.zbkj.crmeb.wechat.vo.TemplateMessageVo;
import com.zbkj.crmeb.wechat.vo.*;
import java.util.HashMap;
import java.util.List;
/**
* @author Mr.Zhang
@@ -74,4 +75,14 @@ public interface WeChatService {
String qrCode(String page, String uri);
UserRechargePaymentResponse response(CreateOrderResponseVo responseVo);
List<ProgramCategoryVo> getProgramCategory();
List<ProgramTempVo> getProgramPublicTempList(int page);
List<ProgramTempKeywordsVo> getWeChatKeywordsByTid(Integer tid);
String programAddMyTemp(ProgramAddMyTempVo programAddMyTempVo);
void programDeleteMyTemp(String myTempId);
}

View File

@@ -0,0 +1,36 @@
package com.zbkj.crmeb.wechat.service;
import com.baomidou.mybatisplus.extension.service.IService;
import com.common.PageParamRequest;
import com.zbkj.crmeb.wechat.model.WechatProgramMyTemp;
import com.zbkj.crmeb.wechat.request.WechatProgramMyTempRequest;
import com.zbkj.crmeb.wechat.request.WechatProgramMyTempSearchRequest;
import java.util.HashMap;
import java.util.List;
/**
* @author Mr.Zhang
* @description WechatProgramMyTempService 接口
* @date 2020-08-28
*/
public interface WechatProgramMyTempService extends IService<WechatProgramMyTemp> {
List<WechatProgramMyTemp> getList(WechatProgramMyTempSearchRequest request, PageParamRequest pageParamRequest);
WechatProgramMyTemp info(Integer id);
boolean updateStatus(Integer id, boolean status);
boolean create(WechatProgramMyTempRequest wechatProgramMyTempRequest);
boolean update(Integer id, WechatProgramMyTempRequest wechatProgramMyTempRequest);
void push(int myTempId, HashMap<String, String> map, Integer userId);
void async(WechatProgramMyTemp wechatProgramMyTemp);
List<WechatProgramMyTemp> getAll();
boolean updateType(Integer id, String type);
}

View File

@@ -0,0 +1,20 @@
package com.zbkj.crmeb.wechat.service;
import com.baomidou.mybatisplus.extension.service.IService;
import com.common.PageParamRequest;
import com.zbkj.crmeb.wechat.model.WechatProgramPublicTemp;
import com.zbkj.crmeb.wechat.request.WechatProgramPublicTempSearchRequest;
import java.util.List;
/**
* @author Mr.Zhang
* @description WechatProgramPublicTempService 接口
* @date 2020-08-27
*/
public interface WechatProgramPublicTempService extends IService<WechatProgramPublicTemp> {
List<WechatProgramPublicTemp> getList(WechatProgramPublicTempSearchRequest request, PageParamRequest pageParamRequest);
void async();
}

View File

@@ -0,0 +1,99 @@
package com.zbkj.crmeb.wechat.service;
import com.zbkj.crmeb.wechat.vo.*;
import java.util.HashMap;
/**
* @Classname WechatSendMessageForMinService
* @Description 根据已申请的模版发送小程序消息
* @Date 9/10/20 10:17 上午
* @Created by stivepeim
*/
public interface WechatSendMessageForMinService {
/**
* 发送积分到账消息
* @param integral 待发送积分参数
* @param userId 接收用户id
*/
void sendIntegralMessage(WechatSendMessageForIntegral integral, Integer userId);
/**
* 退款申请通知
* @param reFundNotify 退款申请参数
* @param userId 接收者用户Id
*/
void sendReFundNotifyMessage(WechatSendMessageForReFundNotify reFundNotify, Integer userId);
/**
* 退款通知
* @param reFundEd 退款参数
* @param userId 接收者用户Id
*/
void sendReFundEdMessage(WechatSendMessageForReFundEd reFundEd, Integer userId);
/**
* 付款成功通知
* @param paySuccess 付款成功参数
* @param userId 接受者用户Id
*/
void sendPaySuccessMessage(WechatSendMessageForPaySuccess paySuccess, Integer userId);
/**
* 充值成功过通知
* @param topped 充值成功通知
* @param userId 接收者Id
*/
void sendToppedMessage(WechatSendMessageForTopped topped, Integer userId);
/**
* 配送通知
* @param distrbution 配送参数
* @param userId 接收者Id
*/
void sendDistrbutionMessage(WechatSendMessageForDistrbution distrbution, Integer userId);
/**
* 提现通知
* @param cash 提现参数
* @param userId 用户Id
*/
void sendCashMessage(WechatSendMessageForCash cash, Integer userId);
/**
* 订单创建
* @param cateOrder 创建订单参数
* @param userId 用户Id
*/
void sendCreateOrderMessage(WechatSendMessageForCreateOrder cateOrder, Integer userId);
/**
* 收货通知
* @param getPackage 收货参数
* @param userId 用户Id
*/
void sendGetPackageMessage(WechatSendMessageForGetPackage getPackage, Integer userId);
/**
* 取消订单
* @param orderCancel 取消订单参数
* @param userId 用户Id
*/
void sendOrderCancelMessage(WechatSendMessageForOrderCancel orderCancel, Integer userId);
/**
* 发货通知
* @param toPackage 发货通知
* @param userId 用户id
*/
void sendRePackageMessage(WechatSendMessageForPackage toPackage, Integer userId);
/**
* 核销通知
* @param ver 核销参数
* @param userId 用户Id
*/
void sendVerSuccessMessage(WechatSendMessageForVerSuccess ver, Integer userId);
}

View File

@@ -15,6 +15,7 @@ import com.zbkj.crmeb.wechat.model.TemplateMessage;
import com.zbkj.crmeb.wechat.request.TemplateMessageSearchRequest;
import com.zbkj.crmeb.wechat.service.TemplateMessageService;
import com.zbkj.crmeb.wechat.service.WeChatService;
import com.zbkj.crmeb.wechat.service.WechatProgramMyTempService;
import com.zbkj.crmeb.wechat.vo.SendTemplateMessageItemVo;
import com.zbkj.crmeb.wechat.vo.TemplateMessageIndustryVo;
import com.zbkj.crmeb.wechat.vo.TemplateMessageVo;
@@ -50,6 +51,9 @@ public class TemplateMessageServiceImpl extends ServiceImpl<TemplateMessageDao,
@Autowired
private UserTokenService userTokenService;
@Autowired
private WechatProgramMyTempService wechatProgramMyTempService;
/**
* 列表
@@ -97,6 +101,29 @@ public class TemplateMessageServiceImpl extends ServiceImpl<TemplateMessageDao,
* @since 2020-06-03
*/
public void push(String tempKey, HashMap<String, String> map, Integer userId, String type){
switch (type){
case Constants.PAY_TYPE_WE_CHAT_FROM_PUBLIC:
pushPublicTempMessage(tempKey, map, userId, type);
break;
case Constants.PAY_TYPE_WE_CHAT_FROM_PROGRAM:
wechatProgramMyTempService.push(Integer.parseInt(tempKey), map, userId);
break;
default:
break;
}
}
/**
* 发送给微信消息进入队列
* @param tempKey String 模板消息key
* @param map 需要替换的数据
* @param userId Integer 用户id
* @param type String 类型, public 公众号program 小程序
* @author Mr.Zhang
* @since 2020-06-03
*/
public void pushPublicTempMessage(String tempKey, HashMap<String, String> map, Integer userId, String type){
TemplateMessageVo templateMessageVo = new TemplateMessageVo();
TemplateMessage templateMessage = getInfoByTempKey(tempKey);
@@ -109,24 +136,23 @@ public class TemplateMessageServiceImpl extends ServiceImpl<TemplateMessageDao,
for (Map.Entry<String, String> entry : map.entrySet()){
hashMap.put(entry.getKey(), new SendTemplateMessageItemVo(entry.getValue()));
}
//用户信息 TODO 公众号和小程序取的OPENID 不一样, 从token表取需要重新处理
//token 类型
int openIdType = Constants.THIRD_LOGIN_TOKEN_TYPE_PUBLIC;
templateMessageVo.setData(hashMap);
String redisKey = Constants.WE_CHAT_MESSAGE_KEY_PUBLIC;
if(Constants.PAY_TYPE_WE_CHAT_FROM_PROGRAM.equals(type)){
redisKey = Constants.WE_CHAT_MESSAGE_KEY_PROGRAM;
openIdType = Constants.THIRD_LOGIN_TOKEN_TYPE_PROGRAM;
if(Constants.ADMIN_LOGIN_TYPE_WE_CHAT_FROM_PUBLIC.equals(type)){
openIdType = Constants.THIRD_ADMIN_LOGIN_TOKEN_TYPE_PUBLIC;
}
//拿到三方登录绑定的token
UserToken UserToken = userTokenService.getTokenByUserId(userId, openIdType);
if(null == UserToken || StringUtils.isBlank(UserToken.getToken())){
return;
}
templateMessageVo.setData(hashMap);
templateMessageVo.setTouser(UserToken.getToken());
redisUtil.lPush(redisKey, JSONObject.toJSONString(templateMessageVo));
redisUtil.lPush(Constants.WE_CHAT_MESSAGE_KEY_PUBLIC, JSONObject.toJSONString(templateMessageVo));
}
/**

View File

@@ -1,5 +1,6 @@
package com.zbkj.crmeb.wechat.service.impl;
import com.alibaba.fastjson.JSONArray;
import com.alibaba.fastjson.JSONObject;
import com.constants.Constants;
import com.constants.WeChatConstants;
@@ -15,10 +16,11 @@ import com.zbkj.crmeb.wechat.response.WeChatAuthorizeLoginGetOpenIdResponse;
import com.zbkj.crmeb.wechat.response.WeChatAuthorizeLoginUserInfoResponse;
import com.zbkj.crmeb.wechat.response.WeChatProgramAuthorizeLoginGetOpenIdResponse;
import com.zbkj.crmeb.wechat.service.WeChatService;
import com.zbkj.crmeb.wechat.vo.MediaCountVo;
import com.zbkj.crmeb.wechat.vo.TemplateMessageVo;
import com.zbkj.crmeb.wechat.vo.*;
import org.apache.commons.codec.binary.Base64;
import org.apache.commons.lang3.StringUtils;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.scheduling.annotation.Async;
@@ -32,16 +34,18 @@ import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.concurrent.TimeUnit;
import java.util.stream.Collectors;
/**
* @author Mr.Zhang
* @Description WeChatPublicServiceImpl 接口实现
* @since 2020-04-22
*/
* @author Mr.Zhang
* @Description WeChatPublicServiceImpl 接口实现
* @since 2020-04-22
*/
@Service
public class WeChatServiceImpl implements WeChatService {
private static final Logger logger = LoggerFactory.getLogger(WeChatServiceImpl.class);
@Autowired
private RedisUtil redisUtil;
@@ -146,9 +150,7 @@ public class WeChatServiceImpl implements WeChatService {
//不存在, 去获取
getToken();
//存入redis
if(StringUtils.isBlank(weChartApiUrl)){
redisUtil.set(WeChatConstants.REDIS_TOKEN_KEY, this.token, this.expires - 100, TimeUnit.SECONDS);
}
redisUtil.set(WeChatConstants.REDIS_TOKEN_KEY, this.token, this.expires - 100, TimeUnit.SECONDS);
}else{
this.token = token;
}
@@ -156,10 +158,10 @@ public class WeChatServiceImpl implements WeChatService {
/**
* 获取token
* @author Mr.Zhang
* @since 2020-04-22
*/
* 获取token
* @author Mr.Zhang
* @since 2020-04-22
*/
private void getToken(){
getAppInfo();
String url = getUrl() + WeChatConstants.API_TOKEN_URI + "&appid=" + this.appId + "&secret=" + this.secret;
@@ -184,9 +186,7 @@ public class WeChatServiceImpl implements WeChatService {
//不存在, 去获取
getProgramToken();
//存入redis
if(StringUtils.isBlank(weChartApiUrl)){
redisUtil.set(WeChatConstants.REDIS_PROGRAM_TOKEN_KEY, this.programToken, this.programExpires - 100, TimeUnit.SECONDS);
}
redisUtil.set(WeChatConstants.REDIS_PROGRAM_TOKEN_KEY, this.programToken, this.programExpires - 100, TimeUnit.SECONDS);
}else{
this.programToken = token;
}
@@ -290,8 +290,10 @@ public class WeChatServiceImpl implements WeChatService {
* @return JSONObject
*/
private JSONObject post(String url, String data){
logger.info("WeChatServiceImpl.post | url:" + url + " | data:" +data);
JSONObject jsonData = JSONObject.parseObject(data);
String result = restTemplateUtil.postJsonData(url, jsonData);
logger.info("微信消息发送结果:" + result);
JSONObject jsonObject = JSONObject.parseObject(result);
return checkResult(jsonObject);
}
@@ -679,6 +681,98 @@ public class WeChatServiceImpl implements WeChatService {
return response;
}
/**
* 小程序行业信息
* @author Mr.Zhang
* @since 2020-06-03
*/
@Override
public List<ProgramCategoryVo> getProgramCategory() {
setProgramUrl(WeChatConstants.PUBLIC_API_PROGRAM_CATEGORY);
JSONObject jsonObject = get(this.url);
JSONArray data = jsonObject.getJSONArray("data");
if(null == data || data.size() < 1){
throw new CrmebException("请先设置小程序行业信息");
}
return CrmebUtil.jsonToListClass(data.toJSONString(), ProgramCategoryVo.class);
}
/**
* 小程序公共模板库
* @param page int 页码
* @author Mr.Zhang
* @since 2020-06-01
* @return List<ProgramTempVo>
*/
@Override
public List<ProgramTempVo> getProgramPublicTempList(int page) {
List<ProgramCategoryVo> programCategory = getProgramCategory();
String ids = programCategory.stream().map(s -> s.getId().toString()).distinct().collect(Collectors.joining(","));
setProgramUrl(WeChatConstants.PUBLIC_API_PROGRAM_PUBLIC_TEMP);
int limit = 30;
int start = (page - Constants.NUM_ONE) * limit;
JSONObject jsonObject = get(this.url + "&ids=" + ids + "&start=" + start + "&limit=" + limit);
JSONArray data = jsonObject.getJSONArray("data");
if(null == data || data.size() < Constants.NUM_ONE){
return null;
}
return CrmebUtil.jsonToListClass(data.toJSONString(), ProgramTempVo.class);
}
/**
* 小程序公共模板关键词库
* @param tid 公共模板id
* @author Mr.Zhang
* @since 2020-06-01
* @return List<ProgramTempVo>
*/
@Override
public List<ProgramTempKeywordsVo> getWeChatKeywordsByTid(Integer tid) {
setProgramUrl(WeChatConstants.PUBLIC_API_PROGRAM_PUBLIC_TEMP_KEYWORDS);
JSONObject jsonObject = get(this.url + "&tid=" + tid);
JSONArray data = jsonObject.getJSONArray("data");
if(null == data || data.size() < 1){
throw new CrmebException("微信没有返回关键词数据");
}
return CrmebUtil.jsonToListClass(data.toJSONString(), ProgramTempKeywordsVo.class);
}
/**
* 小程序我的模板添加
* @param programAddMyTempVo ProgramAddMyTempVo 添加我的模板参数
* @author Mr.Zhang
* @since 2020-06-01
* @return String 添加至帐号下的模板id发送小程序订阅消息时所需
*/
@Override
public String programAddMyTemp(ProgramAddMyTempVo programAddMyTempVo) {
setProgramUrl(WeChatConstants.PUBLIC_API_ADD_PROGRAM_TEMPLATE);
JSONObject data = post(this.url, JSONObject.toJSONString(programAddMyTempVo));
if(StringUtils.isBlank(data.getString("priTmplId"))){
throw new CrmebException("微信没有返回模板id");
}
return data.getString("priTmplId");
}
/**
* 小程序我的模板删除
* @param myTempId String 我的模板id
* @author Mr.Zhang
* @since 2020-06-01
*/
@Override
public void programDeleteMyTemp(String myTempId) {
setProgramUrl(WeChatConstants.PUBLIC_API_DELETE_PROGRAM_TEMPLATE);
HashMap<String, Object> map = new HashMap<>();
map.put("priTmplId", myTempId);
post(this.url, map);
}
/**
* 获取微信用户个人信息
@@ -724,6 +818,7 @@ public class WeChatServiceImpl implements WeChatService {
map.put("jsApiList", getJsApiList());
map.put("debug", debug);
map.put("beta", beta);
map.put("yzfUrl", systemConfigService.getValueByKey(Constants.CONFIG_KEY_YZF_H5_URL));
return map;
}
@@ -796,7 +891,7 @@ public class WeChatServiceImpl implements WeChatService {
*/
public boolean sendPublicTempMessage(TemplateMessageVo templateMessageVo) {
try{
setUrl(WeChatConstants.PUBLIC_API__PUBLIC_TEMPLATE_MESSAGE_SEND);
setUrl(WeChatConstants.PUBLIC_API_PUBLIC_TEMPLATE_MESSAGE_SEND);
post(this.url, JSONObject.toJSONString(templateMessageVo));
return true;
}catch (Exception e){
@@ -805,14 +900,14 @@ public class WeChatServiceImpl implements WeChatService {
}
/**
* 模板消息发送
* 订阅消息发送
* @author Mr.Zhang
* @since 2020-06-03
* @return List<String>
*/
public boolean sendProgramTempMessage(TemplateMessageVo templateMessageVo) {
try{
setUrl(WeChatConstants.PUBLIC_API__PROGRAM_TEMPLATE_MESSAGE_SEND);
setProgramUrl(WeChatConstants.PUBLIC_API_PROGRAM_TEMPLATE_MESSAGE_SEND);
post(this.url, JSONObject.toJSONString(templateMessageVo));
return true;
}catch (Exception e){

View File

@@ -0,0 +1,327 @@
package com.zbkj.crmeb.wechat.service.impl;
import com.alibaba.fastjson.JSONArray;
import com.alibaba.fastjson.JSONObject;
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.baomidou.mybatisplus.core.toolkit.Wrappers;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import com.common.PageParamRequest;
import com.constants.Constants;
import com.exception.CrmebException;
import com.github.pagehelper.PageHelper;
import com.utils.CrmebUtil;
import com.utils.PinYinUtil;
import com.utils.RedisUtil;
import com.zbkj.crmeb.user.model.UserToken;
import com.zbkj.crmeb.user.service.UserTokenService;
import com.zbkj.crmeb.wechat.dao.WechatProgramMyTempDao;
import com.zbkj.crmeb.wechat.model.WechatProgramMyTemp;
import com.zbkj.crmeb.wechat.request.WechatProgramMyTempRequest;
import com.zbkj.crmeb.wechat.request.WechatProgramMyTempSearchRequest;
import com.zbkj.crmeb.wechat.service.WeChatService;
import com.zbkj.crmeb.wechat.service.WechatProgramMyTempService;
import com.zbkj.crmeb.wechat.vo.ProgramAddMyTempVo;
import com.zbkj.crmeb.wechat.vo.ProgramTempKeywordsVo;
import com.zbkj.crmeb.wechat.vo.ProgramTemplateMessageVo;
import com.zbkj.crmeb.wechat.vo.SendProgramTemplateMessageItemVo;
import org.apache.commons.lang3.StringUtils;
import org.springframework.beans.BeanUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.scheduling.annotation.Async;
import org.springframework.stereotype.Service;
import javax.annotation.Resource;
import java.util.HashMap;
import java.util.List;
/**
* @author Mr.Zhang
* @Description WechatProgramMyTempServiceImpl 接口实现
* @since 2020-08-28
*/
@Service
public class WechatProgramMyTempServiceImpl extends ServiceImpl<WechatProgramMyTempDao, WechatProgramMyTemp> implements WechatProgramMyTempService {
@Resource
private WechatProgramMyTempDao dao;
@Autowired
private WeChatService weChatService;
@Autowired
private UserTokenService userTokenService;
@Autowired
private RedisUtil redisUtil;
/**
* 列表
* @param request 请求参数
* @param pageParamRequest 分页类参数
* @author Mr.Zhang
* @since 2020-08-28
* @return List<WechatProgramMyTemp>
*/
@Override
public List<WechatProgramMyTemp> getList(WechatProgramMyTempSearchRequest request, PageParamRequest pageParamRequest) {
PageHelper.startPage(pageParamRequest.getPage(), pageParamRequest.getLimit());
//带 WechatProgramMyTemp 类的多条件查询
LambdaQueryWrapper<WechatProgramMyTemp> lambdaQueryWrapper = Wrappers.lambdaQuery();
//模板标题模糊查询,其余精确查询
if(StringUtils.isNotBlank(request.getTitle())){
lambdaQueryWrapper.like(WechatProgramMyTemp::getTitle, request.getTitle());
}
if(StringUtils.isNotBlank(request.getTempId())){
lambdaQueryWrapper.eq(WechatProgramMyTemp::getTempId, request.getTempId());
}
if(null != request.getStatus()){
lambdaQueryWrapper.eq(WechatProgramMyTemp::getStatus, request.getStatus());
}
if(StringUtils.isNotBlank(request.getType())){
lambdaQueryWrapper.eq(WechatProgramMyTemp::getType, request.getType());
}
if(null != request.getId()){
lambdaQueryWrapper.eq(WechatProgramMyTemp::getId, request.getId());
}
lambdaQueryWrapper.orderByDesc(WechatProgramMyTemp::getUpdateTime);
return dao.selectList(lambdaQueryWrapper);
}
/**
* 查询小程序我的模板信息
* @param id Integer
* @author Mr.Zhang
* @since 2020-08-28
*/
@Override
public WechatProgramMyTemp info(Integer id) {
WechatProgramMyTemp vo = getById(id);
if(null == vo){
throw new CrmebException("没有找到数据");
}
return vo;
}
/**
* 禁用/禁用小程序我的模板
* @param id Integer
* @author Mr.Zhang
* @since 2020-08-28
*/
@Override
public boolean updateStatus(Integer id, boolean status) {
WechatProgramMyTemp vo = info(id);
vo.setStatus(status);
updateById(vo);
return true;
}
/**
* 添加我的模板
* @param wechatProgramMyTempRequest WechatProgramMyTempRequest 添加我的模板参数
* @author Mr.Zhang
* @since 2020-06-01
* @return String 添加至帐号下的模板id发送小程序订阅消息时所需
*/
@Override
public boolean create(WechatProgramMyTempRequest wechatProgramMyTempRequest) {
WechatProgramMyTemp wechatProgramMyTemp = new WechatProgramMyTemp();
BeanUtils.copyProperties(wechatProgramMyTempRequest, wechatProgramMyTemp);
//数据提交到微信
String myTempId = addMyTemp(wechatProgramMyTemp);
wechatProgramMyTemp.setTempId(myTempId);
formatExtra(wechatProgramMyTemp);
return save(wechatProgramMyTemp);
}
/**
* 更新我的模板 由于微信无更新机制先删除,后添加
* @param wechatProgramMyTempRequest WechatProgramMyTempRequest 添加我的模板参数
* @author Mr.Zhang
* @since 2020-06-01
* @return String 添加至帐号下的模板id发送小程序订阅消息时所需
*/
@Override
public boolean update(Integer id, WechatProgramMyTempRequest wechatProgramMyTempRequest) {
WechatProgramMyTemp vo = getById(id);
if(null == vo){
throw new CrmebException("没有找到模板信息");
}
//删除微信已存在的数据
deleteMyTemp(vo.getTempId());
//数据提交到微信
WechatProgramMyTemp wechatProgramMyTemp = new WechatProgramMyTemp();
BeanUtils.copyProperties(wechatProgramMyTempRequest, wechatProgramMyTemp);
wechatProgramMyTemp.setId(id);
String myTempId = addMyTemp(wechatProgramMyTemp);
wechatProgramMyTemp.setTempId(myTempId);
formatExtra(wechatProgramMyTemp);
return updateById(wechatProgramMyTemp);
}
@Override
public void push(int myTempId, HashMap<String, String> map, Integer userId) {
// 查询对应id并且状态启用的模版
WechatProgramMyTempSearchRequest pram = new WechatProgramMyTempSearchRequest();
// pram.setTempId(tempKey+"");
pram.setId(myTempId);
pram.setStatus(true);
List<WechatProgramMyTemp> existMyTemps = getList(pram, new PageParamRequest());
if(null == existMyTemps){
return;
}
WechatProgramMyTemp wechatProgramMyTemp = null;
if(existMyTemps.size() >= 1) wechatProgramMyTemp = existMyTemps.get(0);
// WechatProgramMyTemp wechatProgramMyTemp = getById(tempKey);
if(wechatProgramMyTemp == null || StringUtils.isBlank(wechatProgramMyTemp.getKid())){
return;
}
//拿到三方登录绑定的token
UserToken UserToken = userTokenService.getTokenByUserId(userId, Constants.THIRD_LOGIN_TOKEN_TYPE_PROGRAM);
if(null == UserToken || StringUtils.isBlank(UserToken.getToken())){
return;
}
ProgramTemplateMessageVo programTemplateMessageVo = new ProgramTemplateMessageVo();
programTemplateMessageVo.setTemplate_id(wechatProgramMyTemp.getTempId());
//组装关键字数据
HashMap<String, SendProgramTemplateMessageItemVo> hashMap = new HashMap<>();
List<ProgramTempKeywordsVo> programTempKeywordsVoList = JSONArray.parseArray(wechatProgramMyTemp.getExtra(), ProgramTempKeywordsVo.class);
for (ProgramTempKeywordsVo programTempKeywordsVo : programTempKeywordsVoList) {
if(StringUtils.isBlank(map.get(programTempKeywordsVo.getKey()))){
continue;
}
hashMap.put(programTempKeywordsVo.getSendKey(), new SendProgramTemplateMessageItemVo(map.get(programTempKeywordsVo.getKey())));
}
programTemplateMessageVo.setData(hashMap);
programTemplateMessageVo.setTouser(UserToken.getToken());
redisUtil.lPush(Constants.WE_CHAT_MESSAGE_KEY_PROGRAM, JSONObject.toJSONString(programTemplateMessageVo));
}
/**
* 同步我的模板到小程序
* @param wechatProgramMyTemp WechatProgramMyTemp 需要同步的数据
* @author Mr.Zhang
* @since 2020-06-01
* @return String 添加至帐号下的模板id发送小程序订阅消息时所需
*/
@Override
@Async
public void async(WechatProgramMyTemp wechatProgramMyTemp) {
try{
//删除微信已存在的数据
deleteMyTemp(wechatProgramMyTemp.getTempId());
//保存数据到微信
String myTempId = addMyTemp(wechatProgramMyTemp);
wechatProgramMyTemp.setTempId(myTempId);
updateById(wechatProgramMyTemp);
}catch (Exception e){
//异常不处理
}
}
/**
* 查询所有的模板数据
* @author Mr.Zhang
* @since 2020-06-01
* @return String 添加至帐号下的模板id发送小程序订阅消息时所需
*/
@Override
public List<WechatProgramMyTemp> getAll() {
PageParamRequest pageParamRequest = new PageParamRequest();
pageParamRequest.setLimit(Constants.EXPORT_MAX_LIMIT);
WechatProgramMyTempSearchRequest wechatProgramMyTempSearchRequest = new WechatProgramMyTempSearchRequest();
wechatProgramMyTempSearchRequest.setStatus(true);
return getList(wechatProgramMyTempSearchRequest, pageParamRequest);
}
/**
* 更新应用场景
* @param id Integer
* @param type String
* @author Mr.Zhang
* @since 2020-08-28
* @return true
*/
@Override
public boolean updateType(Integer id, String type) {
WechatProgramMyTemp vo = info(id);
vo.setType(type);
updateById(vo);
return true;
}
/**
* 小程序我的模板添加
* @param wechatProgramMyTemp WechatProgramMyTemp 添加我的模板参数
* @author Mr.Zhang
* @since 2020-06-01
* @return String 添加至帐号下的模板id发送小程序订阅消息时所需
*/
private String addMyTemp(WechatProgramMyTemp wechatProgramMyTemp) {
ProgramAddMyTempVo programAddMyTempVo = new ProgramAddMyTempVo(
wechatProgramMyTemp.getTid(),
CrmebUtil.stringToArray(wechatProgramMyTemp.getKid()),
wechatProgramMyTemp.getSceneDesc()
);
String myTempId = weChatService.programAddMyTemp(programAddMyTempVo);
if(StringUtils.isBlank(myTempId)){
throw new CrmebException("微信没有返回模板id");
}
return myTempId;
}
/**
* 小程序我的模板删除
* @param myTempId String 我的模板id
* @author Mr.Zhang
* @since 2020-06-01
*/
private void deleteMyTemp(String myTempId) {
weChatService.programDeleteMyTemp(myTempId);
}
/**
* 模板扩展字段 name转拼音sendKey计算
* @param wechatProgramMyTemp WechatProgramMyTemp 数据
* @author Mr.Zhang
* @since 2020-06-01
*/
private void formatExtra(WechatProgramMyTemp wechatProgramMyTemp) {
if(StringUtils.isBlank(wechatProgramMyTemp.getExtra())){
throw new CrmebException("扩展字段必填");
}
HashMap<String, Integer> map = new HashMap<>();
List<ProgramTempKeywordsVo> programTempKeywordsVoList = JSONArray.parseArray(wechatProgramMyTemp.getExtra(), ProgramTempKeywordsVo.class);
if(programTempKeywordsVoList.size() < Constants.NUM_ONE){
throw new CrmebException("扩展字段格式错误");
}
for (ProgramTempKeywordsVo programTempKeywordsVo : programTempKeywordsVoList) {
programTempKeywordsVo.setSendKey(programTempKeywordsVo.getRule()+programTempKeywordsVo.getKid());
programTempKeywordsVo.setKey(PinYinUtil.toPinyin(programTempKeywordsVo.getName())); //在代码里组织模板数据的时候map填充的key
}
wechatProgramMyTemp.setExtra(JSONObject.toJSONString(programTempKeywordsVoList));
}
}

View File

@@ -0,0 +1,109 @@
package com.zbkj.crmeb.wechat.service.impl;
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import com.common.PageParamRequest;
import com.github.pagehelper.PageHelper;
import com.utils.DateUtil;
import com.zbkj.crmeb.wechat.dao.WechatProgramPublicTempDao;
import com.zbkj.crmeb.wechat.model.WechatProgramPublicTemp;
import com.zbkj.crmeb.wechat.request.WechatProgramPublicTempSearchRequest;
import com.zbkj.crmeb.wechat.service.WeChatService;
import com.zbkj.crmeb.wechat.service.WechatProgramPublicTempService;
import com.zbkj.crmeb.wechat.vo.ProgramTempVo;
import org.apache.commons.lang3.StringUtils;
import org.springframework.beans.BeanUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import javax.annotation.Resource;
import java.util.List;
/**
* @author Mr.Zhang
* @Description WechatProgramPublicTempServiceImpl 接口实现
* @since 2020-08-27
*/
@Service
public class WechatProgramPublicTempServiceImpl extends ServiceImpl<WechatProgramPublicTempDao, WechatProgramPublicTemp> implements WechatProgramPublicTempService {
@Resource
private WechatProgramPublicTempDao dao;
@Autowired
private WeChatService weChatService;
/**
* 列表
* @param request 请求参数
* @param pageParamRequest 分页类参数
* @author Mr.Zhang
* @since 2020-08-27
* @return List<WechatProgramPublicTemp>
*/
@Override
public List<WechatProgramPublicTemp> getList(WechatProgramPublicTempSearchRequest request, PageParamRequest pageParamRequest) {
PageHelper.startPage(pageParamRequest.getPage(), pageParamRequest.getLimit());
//带 WechatProgramPublicTemp 类的多条件查询
LambdaQueryWrapper<WechatProgramPublicTemp> lambdaQueryWrapper = new LambdaQueryWrapper<>();
WechatProgramPublicTemp model = new WechatProgramPublicTemp();
String title = request.getTitle();
request.setTitle(null);
BeanUtils.copyProperties(request, model);
lambdaQueryWrapper.setEntity(model);
//模板标题模糊查询,其余精确查询
if(StringUtils.isNotBlank(title)){
lambdaQueryWrapper.like(WechatProgramPublicTemp::getTitle, title);
}
lambdaQueryWrapper.orderByDesc(WechatProgramPublicTemp::getUpdateTime);
return dao.selectList(lambdaQueryWrapper);
}
/**
* 把微信公众号模板同步到数据库
* @author Mr.Zhang
* @since 2020-08-27
* @return List<WechatProgramPublicTemp>
*/
@Override
public void async() {
int page = 1;
while (true){
List<ProgramTempVo> programPublicTempList = weChatService.getProgramPublicTempList(page);
if(null == programPublicTempList || programPublicTempList.size() < 1){
return;
}
WechatProgramPublicTemp wechatProgramPublicTempVo = new WechatProgramPublicTemp();
for (ProgramTempVo vo : programPublicTempList) {
WechatProgramPublicTemp wechatProgramPublicTemp = getVoByTid(vo.getTid());
if(null == wechatProgramPublicTemp){
BeanUtils.copyProperties(vo, wechatProgramPublicTempVo);
save(wechatProgramPublicTempVo);
continue;
}
BeanUtils.copyProperties(vo, wechatProgramPublicTemp);
wechatProgramPublicTemp.setUpdateTime(DateUtil.nowDateTime());
updateById(wechatProgramPublicTemp);
}
page++;
}
}
/**
* 通过模板号查询模板
* @param tid Integer 微信模板号
* @author Mr.Zhang
* @since 2020-08-27
* @return WechatProgramPublicTemp
*/
private WechatProgramPublicTemp getVoByTid(Integer tid) {
LambdaQueryWrapper<WechatProgramPublicTemp> lambdaQueryWrapper = new LambdaQueryWrapper<>();
lambdaQueryWrapper.eq(WechatProgramPublicTemp::getTid, tid);
return dao.selectOne(lambdaQueryWrapper);
}
}

View File

@@ -0,0 +1,280 @@
package com.zbkj.crmeb.wechat.service.impl;
import com.constants.Constants;
import com.zbkj.crmeb.wechat.service.TemplateMessageService;
import com.zbkj.crmeb.wechat.vo.*;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import java.util.HashMap;
/**
* @Classname WechatSendMessageForMinService
* @Description 根据已申请的模版发送小程序消息
* @Date 9/10/20 10:22 上午
* @Created by stivepeim
*/
@Service
public class WechatSendMessageForMinService implements com.zbkj.crmeb.wechat.service.WechatSendMessageForMinService {
@Autowired
private TemplateMessageService templateMessageService;
/**
* 发送积分到账消息
* @param integral 待发送积分参数
* @param userId 接收用户id
*/
@Override
public void sendIntegralMessage(WechatSendMessageForIntegral integral, Integer userId) {
HashMap<String, String> mapPram = new HashMap<>();
mapPram.put("shuoming", integral.getShangPinMingCheng());
mapPram.put("dingdanbianhao", integral.getDingDanBianHao());
mapPram.put("shangpinmingcheng", integral.getShangPinMingCheng());
mapPram.put("zhifujine", integral.getZhiFuJinE());
mapPram.put("huodejifen", integral.getHuoDeJiFen());
mapPram.put("leijijifen", integral.getLeiJiJiFen());
mapPram.put("jiaoyishijian", integral.getJiaoYiShiJian());
mapPram.put("beizhu", integral.getBeiZhu());
mapPram.put("mendian", integral.getMenDian());
mapPram.put("daozhangyuanyin", integral.getDaoZhangYuanYin());
templateMessageService.push(4+"", mapPram, userId, Constants.PAY_TYPE_WE_CHAT_FROM_PROGRAM);
}
/**
* 退款申请通知
*
* @param reFundNotify 退款申请参数
* @param userId 接收者用户Id
*/
@Override
public void sendReFundNotifyMessage(WechatSendMessageForReFundNotify reFundNotify, Integer userId) {
HashMap<String, String> mapPram = new HashMap<>();
mapPram.put("dingdanshangpin", reFundNotify.getDingDanShangPin());
mapPram.put("dingdanjine", reFundNotify.getDingDanJinE());
mapPram.put("xiadanshijian", reFundNotify.getXiaDanShiJian());
mapPram.put("dingdanbianhao", reFundNotify.getDingDanBianHao());
mapPram.put("shenqingshijian", reFundNotify.getShenQingShiJian());
mapPram.put("shangjiamingcheng", reFundNotify.getShangJiaMingCheng());
mapPram.put("tuikuanzhuangtai", reFundNotify.getTuiKuanZhuangTai());
mapPram.put("beizhu", reFundNotify.getBeiZhu());
mapPram.put("tuikuanjine", reFundNotify.getTuiKuanJinE());
mapPram.put("tuikuanyuanyin", reFundNotify.getTuiKuanYuanYin());
mapPram.put("yonghudianhua", reFundNotify.getYongHuDianHua());
mapPram.put("sheibeimingcheng", reFundNotify.getSheBeiMingCheng());
templateMessageService.push(5+"", mapPram, userId, Constants.PAY_TYPE_WE_CHAT_FROM_PROGRAM);
}
/**
* 退款通知
*
* @param reFundEd 退款参数
* @param userId 接收者用户Id
*/
@Override
public void sendReFundEdMessage(WechatSendMessageForReFundEd reFundEd, Integer userId) {
HashMap<String, String> mapPram = new HashMap<>();
mapPram.put("tuikuanzhuangtai", reFundEd.getTuiKuanZhuangTai());
mapPram.put("tuikuanshangpin", reFundEd.getTuiKuanShangPin());
mapPram.put("tuikuanjine", reFundEd.getTuiKuanJinE());
mapPram.put("chulishijian", reFundEd.getChuLiShiJian());
mapPram.put("tuikuanshuoming", reFundEd.getTuiKuanShuoMing());
mapPram.put("tuikuandanhao", reFundEd.getTuiKuaDanHao());
mapPram.put("dingdanbianhao", reFundEd.getDingDanBianHao());
mapPram.put("xiadanshijian", reFundEd.getXiaDanShiJian());
mapPram.put("zhifujine", reFundEd.getZhiFuJinE());
mapPram.put("shangpinmingcheng", reFundEd.getShangPinMingChneg());
mapPram.put("tuikuanyuanyin", reFundEd.getTuiKuanYuanYin());
mapPram.put("mendianmingcheng", reFundEd.getMenDianMingCheng());
mapPram.put("beizhu", reFundEd.getBeiZhu());
mapPram.put("shebeimingcheng", reFundEd.getSheBeiMingCheng());
templateMessageService.push(8+"", mapPram, userId, Constants.PAY_TYPE_WE_CHAT_FROM_PROGRAM);
}
/**
* 付款成功通知
*
* @param paySuccess 付款成功参数
* @param userId 接受者用户Id
*/
@Override
public void sendPaySuccessMessage(WechatSendMessageForPaySuccess paySuccess, Integer userId) {
HashMap<String, String> mapPram = new HashMap<>();
mapPram.put("fukuandanhao", paySuccess.getFuKuanDanHao());
mapPram.put("fukuanjine", paySuccess.getFuKuanJinE());
mapPram.put("fukuanshijian", paySuccess.getFuKuanShiJian());
mapPram.put("wenxintishi", paySuccess.getWenXinTiShi());
mapPram.put("dingdanjine", paySuccess.getDingDanJinE());
mapPram.put("shangpinqingdan", paySuccess.getShangPinQingDan());
templateMessageService.push(6+"", mapPram, userId, Constants.PAY_TYPE_WE_CHAT_FROM_PROGRAM);
}
/**
* 充值成功过通知
*
* @param topped 充值成功通知
* @param userId 接收者Id
*/
@Override
public void sendToppedMessage(WechatSendMessageForTopped topped, Integer userId) {
HashMap<String, String> mapPram = new HashMap<>();
mapPram.put("jiaoyidanhao", topped.getJiaoYiDanHao());
mapPram.put("chongzhikahao", topped.getChongZhiKaHao());
mapPram.put("chongzhijine", topped.getChongZhiJinE());
mapPram.put("zhanghuyue", topped.getZhangHuYuE());
mapPram.put("chongzhishijian", topped.getChongZhiShiJian());
mapPram.put("zengsongjine", topped.getZengSongJinE());
mapPram.put("beizhu", topped.getBeiZhu());
mapPram.put("shifujine", topped.getShiFuJinE());
mapPram.put("shanghumingcheng", topped.getShangHuMingCheng());
mapPram.put("zhifufangshi", topped.getZhiFuFangShi());
templateMessageService.push(7+"", mapPram, userId, Constants.PAY_TYPE_WE_CHAT_FROM_PROGRAM);
}
/**
* 配送通知
*
* @param distrbution 配送参数
* @param userId 接收者Id
*/
@Override
public void sendDistrbutionMessage(WechatSendMessageForDistrbution distrbution, Integer userId) {
HashMap<String, String> mapPram = new HashMap<>();
mapPram.put("dingdanbianhao", distrbution.getDingDanBianHao());
mapPram.put("peisongrenyuan", distrbution.getPeiSongRenYuan());
mapPram.put("lianxidianhua", distrbution.getLianXiDianHua());
mapPram.put("dingdanzhuangtai", distrbution.getDingDanZhuangTai());
mapPram.put("yujisongdashijian", distrbution.getYuJiSongDaShiJian());
mapPram.put("shangpinmingcheng", distrbution.getShangPinMingCheng());
mapPram.put("peisongshijian", distrbution.getPeiSongShiJian());
templateMessageService.push(15+"", mapPram, userId, Constants.PAY_TYPE_WE_CHAT_FROM_PROGRAM);
}
/**
* 提现通知
*
* @param cash 提现参数
* @param userId 用户Id
*/
@Override
public void sendCashMessage(WechatSendMessageForCash cash, Integer userId) {
HashMap<String, String> mapPram = new HashMap<>();
mapPram.put("tixianzhuangtai", cash.getTiXianZhuangTai());
mapPram.put("tixianjine", cash.getTiXianJinE());
mapPram.put("tixianzhanghao", cash.getTiXianZhangHao());
mapPram.put("tixianshijian", cash.getTiXianShiJian());
mapPram.put("tixianshuoming", cash.getTiXianShuoMing());
mapPram.put("xingming", cash.getXingMing());
mapPram.put("shouxufei", cash.getShouXuFei());
mapPram.put("dakuanfangshi", cash.getDaKuanFangShi());
mapPram.put("dakuanyuanyin", cash.getDaKuanYuanYin());
mapPram.put("tixiandanhao", cash.getTiXianDanHao());
mapPram.put("tixianfangshi", cash.getTiXianFangShi());
mapPram.put("shibaiyuanyin", cash.getShiBaiYuanYin());
mapPram.put("huiyuanmingcheng", cash.getHuiYuanMingCheng());
templateMessageService.push(14+"", mapPram, userId, Constants.PAY_TYPE_WE_CHAT_FROM_PROGRAM);
}
/**
* 订单创建
*
* @param cateOrder 创建订单参数
* @param userId 用户Id
*/
@Override
public void sendCreateOrderMessage(WechatSendMessageForCreateOrder cateOrder, Integer userId) {
HashMap<String, String> mapPram = new HashMap<>();
mapPram.put("dingdanleixing", cateOrder.getDingDanLeiXing());
mapPram.put("dingdanshangpin", cateOrder.getDingDanShangPin());
mapPram.put("dingdanjine", cateOrder.getDingDanJinE());
mapPram.put("dingdanbianhao", cateOrder.getDingDanBianHao());
mapPram.put("maijiaxinxi", cateOrder.getMaiJiaXinXi());
mapPram.put("dingdanshijian", cateOrder.getDingDanShiJian());
mapPram.put("wenxintishi", cateOrder.getWenXinTiShi());
mapPram.put("tihuodizhi", cateOrder.getTiHuoDiZhi());
mapPram.put("zhifufangshi", cateOrder.getZhiFuFangShi());
mapPram.put("shouhuodizhi", cateOrder.getShouHuoDiZHi());
templateMessageService.push(9+"", mapPram, userId, Constants.PAY_TYPE_WE_CHAT_FROM_PROGRAM);
}
/**
* 收货通知
*
* @param getPackage 收货参数
* @param userId 用户Id
*/
@Override
public void sendGetPackageMessage(WechatSendMessageForGetPackage getPackage, Integer userId) {
HashMap<String, String> mapPram = new HashMap<>();
mapPram.put("dingdanleixing", getPackage.getDingDanLeiXing());
mapPram.put("dingdanshangpin", getPackage.getDingDanShangPin());
mapPram.put("maijiaxinxi", getPackage.getMaiJiaXinXi());
mapPram.put("shouhuodizhi", getPackage.getShouHuoDiZhi());
mapPram.put("shouhuoshijian", getPackage.getShouHuoShiJian());
mapPram.put("dingdanbianhao", getPackage.getDingDanBianHao());
templateMessageService.push(13+"", mapPram, userId, Constants.PAY_TYPE_WE_CHAT_FROM_PROGRAM);
}
/**
* 取消订单
*
* @param orderCancel 取消订单参数
* @param userId 用户Id
*/
@Override
public void sendOrderCancelMessage(WechatSendMessageForOrderCancel orderCancel, Integer userId) {
HashMap<String, String> mapPram = new HashMap<>();
mapPram.put("quxiaoyuanyin", orderCancel.getQuXiaoYuanYin());
mapPram.put("quxiaoshijian", orderCancel.getQuXiaoShiJian());
mapPram.put("mendianziti", orderCancel.getMenDianZiTi());
mapPram.put("beizhu", orderCancel.getBeiZhu());
mapPram.put("dingdanleixing", orderCancel.getDingDanLeiXing());
mapPram.put("shangpinmingcheng", orderCancel.getShangPinMingCheng());
mapPram.put("dingdanhao", orderCancel.getDingDanHao());
mapPram.put("dingdanzhuangtai", orderCancel.getDingDanZhuangTai());
mapPram.put("dingdanjine", orderCancel.getDingDanJinE());
mapPram.put("xiadanshijian", orderCancel.getXiaDanShiJian());
mapPram.put("shangchangmingcheng", orderCancel.getShangPinMingCheng());
mapPram.put("kefudianhua", orderCancel.getKeFuDianHua());
mapPram.put("dingdanbianhao", orderCancel.getDingDanBianHao());
mapPram.put("mendianmingcheng", orderCancel.getMenDianMingCheng());
mapPram.put("lianxifangshi", orderCancel.getLianXiFangShi());
templateMessageService.push(12+"", mapPram, userId, Constants.PAY_TYPE_WE_CHAT_FROM_PROGRAM);
}
/**
* 发货通知
*
* @param toPackage 发货通知
* @param userId 用户id
*/
@Override
public void sendRePackageMessage(WechatSendMessageForPackage toPackage, Integer userId) {
HashMap<String, String> mapPram = new HashMap<>();
mapPram.put("peisongfangshi", toPackage.getPeiSongFangShi());
mapPram.put("dingdanhao", toPackage.getDingDanHao());
mapPram.put("shouhuodizhi", toPackage.getShouHuoDiZhi());
mapPram.put("kehudianhua", toPackage.getKeHuDianHua());
mapPram.put("shouhuoren", toPackage.getShouHuoRen());
templateMessageService.push(11+"", mapPram, userId, Constants.PAY_TYPE_WE_CHAT_FROM_PROGRAM);
}
/**
* 核销通知
*
* @param ver 核销参数
* @param userId 用户Id
*/
@Override
public void sendVerSuccessMessage(WechatSendMessageForVerSuccess ver, Integer userId) {
HashMap<String, String> mapPram = new HashMap<>();
mapPram.put("huodongmingcheng", ver.getHuoDongMingCheng());
mapPram.put("shangpinmingcheng", ver.getShangPinMingCheng());
mapPram.put("dingdanhao", ver.getDingDanHao());
mapPram.put("hexiaoshijian", ver.getHeXiaoShiJian());
mapPram.put("hexiaozonge", ver.getHeXiaoZongE());
mapPram.put("beizhu", ver.getBeiZhu());
mapPram.put("mendian", ver.getMenDian());
templateMessageService.push(10+"", mapPram, userId, Constants.PAY_TYPE_WE_CHAT_FROM_PROGRAM);
}
}

View File

@@ -0,0 +1,33 @@
package com.zbkj.crmeb.wechat.vo;
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
import lombok.EqualsAndHashCode;
import lombok.experimental.Accessors;
import java.util.List;
@Data
@EqualsAndHashCode(callSuper = false)
@Accessors(chain = true)
@ApiModel(value="ProgramAddMyTempVo对象", description="小程序订阅消息模板添加")
public class ProgramAddMyTempVo {
public ProgramAddMyTempVo() {
}
public ProgramAddMyTempVo(Integer tid, List<Integer> kidList, String sceneDesc) {
this.tid = tid;
this.kidList = kidList;
this.sceneDesc = sceneDesc;
}
@ApiModelProperty(value = "模板id", required = true)
private Integer tid;
@ApiModelProperty(value = "开发者自行组合好的模板关键词列表,关键词顺序可以自由搭配(例如 [3,5,4] 或 [4,5,3]最多支持5个最少2个关键词组合", required = true)
private List<Integer> kidList;
@ApiModelProperty(value = "模版类型2 为一次性订阅3 为长期订阅")
private String sceneDesc;
}

View File

@@ -0,0 +1,19 @@
package com.zbkj.crmeb.wechat.vo;
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
import lombok.EqualsAndHashCode;
import lombok.experimental.Accessors;
@Data
@EqualsAndHashCode(callSuper = false)
@Accessors(chain = true)
@ApiModel(value="ProgramCategoryVo对象", description="小程序行业信息")
public class ProgramCategoryVo {
@ApiModelProperty(value = "行业id")
private Integer id;
@ApiModelProperty(value = "行业名称")
private String name;
}

View File

@@ -0,0 +1,34 @@
package com.zbkj.crmeb.wechat.vo;
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;
@Data
@EqualsAndHashCode(callSuper = false)
@Accessors(chain = true)
@ApiModel(value="ProgramTempKeywordsVo对象", description="小程序关键词")
public class ProgramTempKeywordsVo {
@ApiModelProperty(value = "关键词 id选用模板时需要")
private Integer kid;
@ApiModelProperty(value = "关键词内容")
private String name;
@ApiModelProperty(value = "关键词内容对应的示例")
private String example;
@ApiModelProperty(value = "参数类型")
private String rule;
@ApiModelProperty(value = "代码里组装数据的时候需要用到这个key")
@JsonIgnore
private String key;
@ApiModelProperty(value = "代码里组装数据的时候需要用到这个key")
@JsonIgnore
private String sendKey;
}

View File

@@ -0,0 +1,25 @@
package com.zbkj.crmeb.wechat.vo;
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
import lombok.EqualsAndHashCode;
import lombok.experimental.Accessors;
@Data
@EqualsAndHashCode(callSuper = false)
@Accessors(chain = true)
@ApiModel(value="PProgramTempVo对象", description="小程序行业信息")
public class ProgramTempVo {
@ApiModelProperty(value = "模板id")
private Integer tid;
@ApiModelProperty(value = "模板名称")
private String title;
@ApiModelProperty(value = "模版类型2 为一次性订阅3 为长期订阅")
private Integer type;
@ApiModelProperty(value = "行业id")
private Integer categoryId;
}

View File

@@ -0,0 +1,33 @@
package com.zbkj.crmeb.wechat.vo;
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
import lombok.EqualsAndHashCode;
import lombok.experimental.Accessors;
import java.util.HashMap;
@Data
@EqualsAndHashCode(callSuper = false)
@Accessors(chain = true)
@ApiModel(value="SendTemplateMessageVo对象", description="微信模板发送类")
public class ProgramTemplateMessageVo {
@ApiModelProperty(value = "OPENID", required = true)
private String touser;
@ApiModelProperty(value = "模板ID", required = true)
private String template_id;
@ApiModelProperty(value = "模板跳转链接小程序地址")
private String page;
@ApiModelProperty(value = "发送内容", required = true)
private HashMap<String, SendProgramTemplateMessageItemVo> data;
@ApiModelProperty(value = "跳转小程序类型developer为开发版trial为体验版formal为正式版默认为正式版")
private String miniprogram_state = "formal";
@ApiModelProperty(value = "进入小程序查看”的语言类型支持zh_CN(简体中文)、en_US(英文)、zh_HK(繁体中文)、zh_TW(繁体中文)默认为zh_CN\n")
private String lang = "zh_CN";
}

View File

@@ -0,0 +1,21 @@
package com.zbkj.crmeb.wechat.vo;
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
import lombok.EqualsAndHashCode;
import lombok.experimental.Accessors;
@Data
@EqualsAndHashCode(callSuper = false)
@Accessors(chain = true)
@ApiModel(value="SendTemplateMessageItemVo对象", description="微信模板发送数据类")
public class SendProgramTemplateMessageItemVo {
public SendProgramTemplateMessageItemVo() {}
public SendProgramTemplateMessageItemVo(String value) {
this.value = value;
}
@ApiModelProperty(value = "显示的文字内容", required = true)
private String value;
}

View File

@@ -0,0 +1,42 @@
package com.zbkj.crmeb.wechat.vo;
import lombok.Data;
/**
* @Classname weChat
* @Description 提现结果通知
* @Date 9/10/20 2:09 下午
* @Created by stivepeim
*/
@Data
public class WechatSendMessageForCash {
public WechatSendMessageForCash(String tiXianZhuangTai, String tiXianJinE, String tiXianZhangHao, String tiXianShiJian, String tiXianShuoMing, String xingMing, String shouXuFei, String daKuanFangShi, String daKuanYuanYin, String tiXianDanHao, String tiXianFangShi, String shiBaiYuanYin, String huiYuanMingCheng) {
TiXianZhuangTai = tiXianZhuangTai;
TiXianJinE = tiXianJinE;
TiXianZhangHao = tiXianZhangHao;
TiXianShiJian = tiXianShiJian;
TiXianShuoMing = tiXianShuoMing;
XingMing = xingMing;
ShouXuFei = shouXuFei;
DaKuanFangShi = daKuanFangShi;
DaKuanYuanYin = daKuanYuanYin;
TiXianDanHao = tiXianDanHao;
TiXianFangShi = tiXianFangShi;
ShiBaiYuanYin = shiBaiYuanYin;
HuiYuanMingCheng = huiYuanMingCheng;
}
private String TiXianZhuangTai;
private String TiXianJinE;
private String TiXianZhangHao;
private String TiXianShiJian;
private String TiXianShuoMing;
private String XingMing;
private String ShouXuFei;
private String DaKuanFangShi;
private String DaKuanYuanYin;
private String TiXianDanHao;
private String TiXianFangShi;
private String ShiBaiYuanYin;
private String HuiYuanMingCheng;
}

View File

@@ -0,0 +1,36 @@
package com.zbkj.crmeb.wechat.vo;
import lombok.Data;
/**
* @Classname WechatSendMessageForCreateOrder
* @Description 新订单提醒
* @Date 9/10/20 12:24 下午
* @Created by stivepeim
*/
@Data
public class WechatSendMessageForCreateOrder {
public WechatSendMessageForCreateOrder(String dingDanLeiXing, String dingDanShangPin, String dingDanJinE, String dingDanBianHao, String maiJiaXinXi, String dingDanShiJian, String wenXinTiShi, String tiHuoDiZhi, String zhiFuFangShi, String shouHuoDiZHi) {
DingDanLeiXing = dingDanLeiXing;
DingDanShangPin = dingDanShangPin;
DingDanJinE = dingDanJinE;
DingDanBianHao = dingDanBianHao;
MaiJiaXinXi = maiJiaXinXi;
DingDanShiJian = dingDanShiJian;
WenXinTiShi = wenXinTiShi;
TiHuoDiZhi = tiHuoDiZhi;
ZhiFuFangShi = zhiFuFangShi;
ShouHuoDiZHi = shouHuoDiZHi;
}
private String DingDanLeiXing;
private String DingDanShangPin;
private String DingDanJinE;
private String DingDanBianHao;
private String MaiJiaXinXi;
private String DingDanShiJian;
private String WenXinTiShi;
private String TiHuoDiZhi;
private String ZhiFuFangShi;
private String ShouHuoDiZHi;
}

View File

@@ -0,0 +1,30 @@
package com.zbkj.crmeb.wechat.vo;
import lombok.Data;
/**
* @Classname WechatSendMessageForDistrbution
* @Description 配送通知
* @Date 9/10/20 2:21 下午
* @Created by stivepeim
*/
@Data
public class WechatSendMessageForDistrbution {
public WechatSendMessageForDistrbution(String dingDanBianHao, String peiSongRenYuan, String lianXiDianHua, String dingDanZhuangTai, String yuJiSongDaShiJian, String shangPinMingCheng, String peiSongShiJian) {
DingDanBianHao = dingDanBianHao;
PeiSongRenYuan = peiSongRenYuan;
LianXiDianHua = lianXiDianHua;
DingDanZhuangTai = dingDanZhuangTai;
YuJiSongDaShiJian = yuJiSongDaShiJian;
ShangPinMingCheng = shangPinMingCheng;
PeiSongShiJian = peiSongShiJian;
}
private String DingDanBianHao;
private String PeiSongRenYuan;
private String LianXiDianHua;
private String DingDanZhuangTai;
private String YuJiSongDaShiJian;
private String ShangPinMingCheng;
private String PeiSongShiJian;
}

View File

@@ -0,0 +1,28 @@
package com.zbkj.crmeb.wechat.vo;
import lombok.Data;
/**
* @Classname WechatSendMessageForGetPackage
* @Description 收货通知
* @Date 9/10/20 2:07 下午
* @Created by stivepeim
*/
@Data
public class WechatSendMessageForGetPackage {
public WechatSendMessageForGetPackage(String dingDanLeiXing, String dingDanShangPin, String maiJiaXinXi, String shouHuoDiZhi, String shouHuoShiJian, String dingDanBianHao) {
DingDanLeiXing = dingDanLeiXing;
DingDanShangPin = dingDanShangPin;
MaiJiaXinXi = maiJiaXinXi;
ShouHuoDiZhi = shouHuoDiZhi;
ShouHuoShiJian = shouHuoShiJian;
DingDanBianHao = dingDanBianHao;
}
private String DingDanLeiXing;
private String DingDanShangPin;
private String MaiJiaXinXi;
private String ShouHuoDiZhi;
private String ShouHuoShiJian;
private String DingDanBianHao;
}

View File

@@ -0,0 +1,37 @@
package com.zbkj.crmeb.wechat.vo;
import lombok.Data;
/**
* @Classname WechatSendMessageForIntegral
* @Description 赠送积分消息通知
* @Date 9/10/20 10:38 上午
* @Created by stivepeim
*/
@Data
public class WechatSendMessageForIntegral {
public WechatSendMessageForIntegral(String shuoMing, String dingDanBianHao, String shangPinMingCheng, String zhiFuJinE, String huoDeJiFen, String leiJiJiFen, String jiaoYiShiJian, String beiZhu, String menDian, String daoZhangYuanYin) {
ShuoMing = shuoMing;
DingDanBianHao = dingDanBianHao;
ShangPinMingCheng = shangPinMingCheng;
ZhiFuJinE = zhiFuJinE;
HuoDeJiFen = huoDeJiFen;
LeiJiJiFen = leiJiJiFen;
JiaoYiShiJian = jiaoYiShiJian;
BeiZhu = beiZhu;
MenDian = menDian;
DaoZhangYuanYin = daoZhangYuanYin;
}
private String ShuoMing;
private String DingDanBianHao;
private String ShangPinMingCheng;
private String ZhiFuJinE;
private String HuoDeJiFen;
private String LeiJiJiFen;
private String JiaoYiShiJian;
private String BeiZhu;
private String MenDian;
private String DaoZhangYuanYin;
}

View File

@@ -0,0 +1,46 @@
package com.zbkj.crmeb.wechat.vo;
import lombok.Data;
/**
* @Classname WechatSendMessageForOrderCancel
* @Description 订单取消通知
* @Date 9/10/20 2:01 下午
* @Created by stivepeim
*/
@Data
public class WechatSendMessageForOrderCancel {
public WechatSendMessageForOrderCancel(String quXiaoYuanYin, String quXiaoShiJian, String menDianZiTi, String beiZhu, String dingDanLeiXing, String shangPinMingCheng, String dingDanHao, String dingDanZhuangTai, String dingDanJinE, String xiaDanShiJian, String shangChangMingCheng, String keFuDianHua, String dingDanBianHao, String menDianMingCheng, String lianXiFangShi) {
QuXiaoYuanYin = quXiaoYuanYin;
QuXiaoShiJian = quXiaoShiJian;
MenDianZiTi = menDianZiTi;
BeiZhu = beiZhu;
DingDanLeiXing = dingDanLeiXing;
ShangPinMingCheng = shangPinMingCheng;
DingDanHao = dingDanHao;
DingDanZhuangTai = dingDanZhuangTai;
DingDanJinE = dingDanJinE;
XiaDanShiJian = xiaDanShiJian;
ShangChangMingCheng = shangChangMingCheng;
KeFuDianHua = keFuDianHua;
DingDanBianHao = dingDanBianHao;
MenDianMingCheng = menDianMingCheng;
LianXiFangShi = lianXiFangShi;
}
private String QuXiaoYuanYin;
private String QuXiaoShiJian;
private String MenDianZiTi;
private String BeiZhu;
private String DingDanLeiXing;
private String ShangPinMingCheng;
private String DingDanHao;
private String DingDanZhuangTai;
private String DingDanJinE;
private String XiaDanShiJian;
private String ShangChangMingCheng;
private String KeFuDianHua;
private String DingDanBianHao;
private String MenDianMingCheng;
private String LianXiFangShi;
}

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