商品和支付

pull/2/head
js199000131 2023-05-14 15:44:42 +08:00
parent 3f213a4ae6
commit d624879f22
35 changed files with 2269 additions and 60 deletions

View File

@ -563,4 +563,13 @@ public class Constants {
/** 公共JS配置 */
// CRMEB chat 统计
public static final String JS_CONFIG_CRMEB_CHAT_TONGJI="crmeb_tongji_js";
/** 退款理由 */
public static final String CONFIG_KEY_STOR_REASON = "stor_reason";
/** 订单支付成功后Task */
public static final String ORDER_TASK_PAY_SUCCESS_AFTER = "orderPaySuccessTask";
/** 订单收货后Task */
public static final String ORDER_TASK_REDIS_KEY_AFTER_TAKE_BY_USER = "alterOrderTakeByUser";
}

View File

@ -34,7 +34,7 @@ public final class ServiceException extends RuntimeException {
this.message = errorCode.getMsg();
}
public ServiceException( String message) {
this.code = GlobalErrorCodeConstants.INTERNAL_SERVER_ERROR.getCode();
// this.code = GlobalErrorCodeants.INTERNAL_SERVER_ERROR.getCode();
this.message = message;
}
public ServiceException(Integer code, String message) {

View File

@ -198,15 +198,7 @@ public class DateUtils {
public static Date nowDateTime() {
return strToDate(nowDateTimeStr(), Constants.DATE_FORMAT);
}
/**
* ,
* :<>.
*
* @return
*/
public static String nowDateTimeStr() {
return nowDate(Constants.DATE_FORMAT);
}
/**
* ,
* :<>.
@ -218,6 +210,27 @@ public class DateUtils {
return dft.format(new Date());
}
/**
* ,
* :<>.
*
* @return
*/
public static String nowDateTimeStr() {
return nowDate(Constants.DATE_FORMAT);
}
/**
* ,
* :<>.
*
* @return
*/
public static Integer getNowTime() {
long t = (System.currentTimeMillis()/1000L);
return Integer.parseInt(String.valueOf(t));
}
/**
*
*
@ -461,4 +474,31 @@ public class DateUtils {
}
return new DateLimitUtilVo(startTime, endTime);
}
/**
* compare two date String with a pattern
*
* @param date1
* @param date2
* @param pattern
* @return
*/
public static int compareDate(String date1, String date2, String pattern) {
SimpleDateFormat DATE_FORMAT = new SimpleDateFormat(pattern);
try {
Date dt1 = DATE_FORMAT.parse(date1);
Date dt2 = DATE_FORMAT.parse(date2);
if (dt1.getTime() > dt2.getTime()) {
return 1;
} else if (dt1.getTime() < dt2.getTime()) {
return -1;
} else {
return 0;
}
} catch (ParseException e) {
e.printStackTrace();
return 0;
}
}
}

View File

@ -29,6 +29,16 @@
<artifactId>spring-boot-starter-validation</artifactId>
<optional>true</optional>
</dependency>
<dependency>
<groupId>com.baomidou</groupId>
<artifactId>mybatis-plus-annotation</artifactId>
<version>3.5.3.1</version>
<scope>compile</scope>
</dependency>
<dependency>
<groupId>cn.iocoder.boot</groupId>
<artifactId>yudao-spring-boot-starter-biz-tenant</artifactId>
</dependency>
</dependencies>
</project>

View File

@ -3,6 +3,7 @@ package cn.iocoder.yudao.module.product.api.property;
import cn.iocoder.yudao.module.product.api.property.dto.ProductPropertyValueDetailRespDTO;
import cn.iocoder.yudao.module.product.convert.propertyvalue.ProductPropertyValueConvert;
import cn.iocoder.yudao.module.product.service.property.ProductPropertyValueService;
import com.baomidou.mybatisplus.core.toolkit.Wrappers;
import org.springframework.stereotype.Service;
import org.springframework.validation.annotation.Validated;
@ -28,4 +29,5 @@ public class ProductPropertyValueApiImpl implements ProductPropertyValueApi {
productPropertyValueService.getPropertyValueDetailList(ids));
}
}

View File

@ -1,6 +1,7 @@
package cn.iocoder.yudao.module.product.service.property;
import cn.iocoder.yudao.framework.common.pojo.PageResult;
import cn.iocoder.yudao.module.product.api.property.dto.ProductPropertyValueDetailRespDTO;
import cn.iocoder.yudao.module.product.controller.admin.property.vo.value.ProductPropertyValueCreateReqVO;
import cn.iocoder.yudao.module.product.controller.admin.property.vo.value.ProductPropertyValuePageReqVO;
import cn.iocoder.yudao.module.product.controller.admin.property.vo.value.ProductPropertyValueUpdateReqVO;
@ -87,4 +88,11 @@ public interface ProductPropertyValueService {
*/
void deletePropertyValueByPropertyId(Long propertyId);
/**
* id
* @param id ID
* @param type
* @return StoreProductAttrValue
*/
ProductPropertyValueDetailRespDTO getByIdAndProductIdAndType(Integer id, Integer productId, Integer type);
}

View File

@ -2,6 +2,7 @@ package cn.iocoder.yudao.module.product.service.property;
import cn.hutool.core.collection.CollUtil;
import cn.iocoder.yudao.framework.common.pojo.PageResult;
import cn.iocoder.yudao.module.product.api.property.dto.ProductPropertyValueDetailRespDTO;
import cn.iocoder.yudao.module.product.controller.admin.property.vo.value.ProductPropertyValueCreateReqVO;
import cn.iocoder.yudao.module.product.controller.admin.property.vo.value.ProductPropertyValuePageReqVO;
import cn.iocoder.yudao.module.product.controller.admin.property.vo.value.ProductPropertyValueUpdateReqVO;
@ -125,4 +126,9 @@ public class ProductPropertyValueServiceImpl implements ProductPropertyValueServ
productPropertyValueMapper.deleteByPropertyId(propertyId);
}
@Override
public ProductPropertyValueDetailRespDTO getByIdAndProductIdAndType(Integer id, Integer productId, Integer type) {
return null;
}
}

View File

@ -29,29 +29,29 @@ public class OrderDataResponse implements Serializable {
private static final long serialVersionUID = 1387727608277207652L;
@Schema(description = "已完成订单数量")
private Integer completeCount;
private Long completeCount;
@Schema(description = "待核销订单数量")
private Integer evaluatedCount;
private Long evaluatedCount;
// @Schema(description = "用户昵称")
// private Integer verificationCount;
@Schema(description = "支付订单总数")
private Integer orderCount;
private Long orderCount;
@Schema(description = "待收货订单数量")
private Integer receivedCount;
private Long receivedCount;
@Schema(description = "退款订单数量")
private Integer refundCount;
private Long refundCount;
@Schema(description = "总消费钱数")
private BigDecimal sumPrice;
@Schema(description = "未支付订单数量")
private Integer unPaidCount;
private Long unPaidCount;
@Schema(description = "待发货订单数量")
private Integer unShippedCount;
private Long unShippedCount;
}

View File

@ -1,5 +1,6 @@
package cn.iocoder.yudao.module.shop.response.order;
import cn.iocoder.yudao.module.shop.vo.order.WxPayJsResultVo;
import io.swagger.v3.oas.annotations.media.Schema;
import lombok.Data;
import lombok.EqualsAndHashCode;
@ -28,8 +29,8 @@ public class OrderPayResultResponse {
@Schema(description = "支付状态")
private Boolean status;
// @Schema(description = "微信调起支付参数对象")
// private WxPayJsResultVo jsConfig;
@Schema(description = "微信调起支付参数对象")
private WxPayJsResultVo jsConfig;
@Schema(description = "支付类型")
private String payType;

View File

@ -0,0 +1,52 @@
package cn.iocoder.yudao.module.shop.vo.order;
import io.swagger.v3.oas.annotations.media.Schema;
import lombok.Data;
import lombok.EqualsAndHashCode;
import lombok.experimental.Accessors;
/**
*
* +----------------------------------------------------------------------
* | CRMEB [ CRMEB ]
* +----------------------------------------------------------------------
* | Copyright (c) 2016~2022 https://www.crmeb.com All rights reserved.
* +----------------------------------------------------------------------
* | Licensed CRMEBCRMEB
* +----------------------------------------------------------------------
* | Author: CRMEB Team <admin@crmeb.com>
* +----------------------------------------------------------------------
*/
@Data
@EqualsAndHashCode(callSuper = false)
@Accessors(chain = true)
@Schema(description="微信调起支付参数对象")
public class WxPayJsResultVo {
@Schema(description = "微信分配的小程序ID", required = true)
private String appId;
@Schema(description = "随机字符串不长于32位", required = true)
private String nonceStr;
@Schema(description = "统一下单接口返回的 prepay_id 参数值", required = true)
private String packages;
@Schema(description = "签名类型默认为MD5支持HMAC-SHA256和MD5。", required = true)
private String signType;
@Schema(description = "时间戳从1970年1月1日00:00:00至今的秒数,即当前的时间", required = true)
private String timeStamp;
@Schema(description = "支付签名", required = true)
private String paySign;
@Schema(description = "H5支付跳转链接", required = true)
private String mwebUrl;
@Schema(description = "微信商户号", required = true)
private String partnerid;
@Schema(description = "拉起收银台的ticket", required = true)
private String ticket;
}

View File

@ -110,8 +110,8 @@ public class StoreOrderController {
*/
@Operation(summary = "订单头部数量")
@RequestMapping(value = "/data", method = RequestMethod.GET)
public CommonResult<OrderDataResponse> orderData() {
return CommonResult.success(orderService.orderData());
public CommonResult<OrderDataResponse> orderData(String dateLimit, Integer type,String payType) {
return CommonResult.success(orderService.orderData(dateLimit, type,payType));
}
/**

View File

@ -0,0 +1,17 @@
package cn.iocoder.yudao.module.shop.convert.order;
import cn.iocoder.yudao.module.shop.dal.dataobject.order.StoreOrder;
import cn.iocoder.yudao.module.shop.response.order.OrderDetailResponse;
import org.mapstruct.Mapper;
import org.mapstruct.factory.Mappers;
import java.util.List;
@Mapper
public interface StoreOrderConvert {
StoreOrderConvert INSTANCE = Mappers.getMapper(StoreOrderConvert.class);
List<OrderDetailResponse> convert(List<StoreOrder> list);
}

View File

@ -0,0 +1,15 @@
package cn.iocoder.yudao.module.shop.convert.order;
import cn.iocoder.yudao.module.shop.dal.dataobject.order.StoreOrder;
import cn.iocoder.yudao.module.shop.response.order.StoreOrderDetailInfoResponse;
import org.mapstruct.Mapper;
import org.mapstruct.factory.Mappers;
@Mapper
public interface StoreOrderOneConvert {
StoreOrderOneConvert INSTANCE = Mappers.getMapper(StoreOrderOneConvert.class);
StoreOrderDetailInfoResponse convert(StoreOrder storeOrder);
}

View File

@ -38,7 +38,7 @@ public class StoreProductReply implements Serializable {
private Integer id;
@Schema(description= "用户ID")
private Integer uid;
private Long uid;
@Schema(description= "订单ID")
private Integer oid;

View File

@ -1,5 +1,6 @@
package cn.iocoder.yudao.module.shop.dal.mysql.order;
import cn.iocoder.yudao.framework.mybatis.core.mapper.BaseMapperX;
import cn.iocoder.yudao.module.shop.dal.dataobject.order.StoreOrder;
import cn.iocoder.yudao.module.shop.request.order.StoreOrderStaticsticsRequest;
import cn.iocoder.yudao.module.shop.response.order.OrderBrokerageData;
@ -26,7 +27,7 @@ import java.util.List;
* +----------------------------------------------------------------------
*/
@Mapper
public interface StoreOrderMapper extends BaseMapper<StoreOrder> {
public interface StoreOrderMapper extends BaseMapperX<StoreOrder> {
/**
*

View File

@ -2,6 +2,9 @@ package cn.iocoder.yudao.module.shop.service.order;
import cn.iocoder.yudao.framework.common.pojo.PageParam;
import cn.iocoder.yudao.framework.common.pojo.PageResult;
import cn.iocoder.yudao.module.shop.controller.admin.order.vo.StoreOrderPageQueryReqVo;
import cn.iocoder.yudao.module.shop.dal.dataobject.order.StoreOrder;
import cn.iocoder.yudao.module.shop.request.order.*;
import cn.iocoder.yudao.module.shop.request.product.StoreProductReplyAddRequest;
import cn.iocoder.yudao.module.shop.response.order.*;
@ -26,8 +29,6 @@ public interface OrderService {
/**
*
* @param type
* @param pageRequest
* @return
*/
PageInfo<OrderDetailResponse> list(Integer type, PageParam pageRequest);
@ -42,7 +43,7 @@ public interface OrderService {
*
* @return
*/
OrderDataResponse orderData();
OrderDataResponse orderData(String dateLimit, Integer type,String payType);
/**
* 退

View File

@ -1,6 +1,8 @@
package cn.iocoder.yudao.module.shop.service.order;
import org.springframework.stereotype.Service;
/**
* StoreOrderService
* +----------------------------------------------------------------------
@ -13,6 +15,7 @@ package cn.iocoder.yudao.module.shop.service.order;
* | Author: CRMEB Team <admin@crmeb.com>
* +----------------------------------------------------------------------
*/
@Service
public interface OrderTaskService{
void cancelByUser();

View File

@ -1,13 +1,38 @@
package cn.iocoder.yudao.module.shop.service.order.impl;
import cn.hutool.core.collection.CollUtil;
import cn.hutool.core.util.ObjectUtil;
import cn.iocoder.yudao.framework.common.enums.Constants;
import cn.iocoder.yudao.framework.common.exception.ServiceException;
import cn.iocoder.yudao.framework.common.util.date.DateUtils;
import cn.iocoder.yudao.module.infra.api.config.ApiConfigApi;
import cn.iocoder.yudao.module.member.api.user.MemberUserApi;
import cn.iocoder.yudao.module.member.api.user.dto.MemberUserBillDTO;
import cn.iocoder.yudao.module.member.api.user.dto.MemberUserRespDTO;
import cn.iocoder.yudao.module.shop.constants.PayConstants;
import cn.iocoder.yudao.module.shop.dal.dataobject.order.StoreOrder;
import cn.iocoder.yudao.module.shop.request.order.OrderPayRequest;
import cn.iocoder.yudao.module.shop.response.order.OrderPayResultResponse;
import cn.iocoder.yudao.module.shop.service.order.OrderPayService;
import cn.iocoder.yudao.module.shop.service.order.StoreOrderInfoService;
import cn.iocoder.yudao.module.shop.service.order.StoreOrderService;
import cn.iocoder.yudao.module.shop.service.order.StoreOrderStatusService;
import cn.iocoder.yudao.module.shop.service.product.StoreProductAttrValueService;
import cn.iocoder.yudao.module.shop.service.product.StoreProductService;
import cn.iocoder.yudao.module.shop.utils.OrderUtil;
import cn.iocoder.yudao.module.shop.utils.RedisUtil;
import cn.iocoder.yudao.module.shop.vo.order.WxPayJsResultVo;
import lombok.Data;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.transaction.support.TransactionTemplate;
import java.math.BigDecimal;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
/**
@ -27,6 +52,41 @@ import org.springframework.stereotype.Service;
public class OrderPayServiceImpl implements OrderPayService {
private static final Logger logger = LoggerFactory.getLogger(OrderPayServiceImpl.class);
@Autowired
private StoreOrderService storeOrderService;
@Autowired
private StoreOrderStatusService storeOrderStatusService;
@Autowired
private StoreOrderInfoService storeOrderInfoService;
@Autowired
private MemberUserApi userService;
@Autowired
private OrderUtil orderUtil;
//订单类
private StoreOrder order;
@Autowired
private TransactionTemplate transactionTemplate;
@Autowired
private RedisUtil redisUtil;
@Autowired
private StoreProductService storeProductService;
@Autowired
private StoreProductAttrValueService storeProductAttrValueService;
@Autowired
private ApiConfigApi apiConfigApi;
/**
*
*
@ -34,7 +94,67 @@ public class OrderPayServiceImpl implements OrderPayService {
*/
@Override
public Boolean paySuccess(StoreOrder storeOrder) {
return null;
MemberUserRespDTO user = userService.getUser(storeOrder.getUid());
List<MemberUserBillDTO> billList = CollUtil.newArrayList();
// 订单支付记录
// MemberUserBillDTO userBill = userBillInit(storeOrder, user);
// billList.add(userBill);
// 更新用户下单数量
// user.setPayCount(user.getPayCount() + 1);
Boolean execute = transactionTemplate.execute(e -> {
//订单日志
storeOrderStatusService.createLog(storeOrder.getId(), Constants.ORDER_LOG_PAY_SUCCESS, Constants.ORDER_LOG_MESSAGE_PAY_SUCCESS);
// 用户信息变更
userService.updateById(user);
return Boolean.TRUE;
});
if (execute) {
try {
// 发送短信
// 发送用户支付成功管理员提醒短信
// 根据配置 打印小票
} catch (Exception e) {
e.printStackTrace();
logger.error("短信、模板通知、优惠券或打印小票异常");
}
}
return execute;
}
/**
*
* @param storeOrder
* @return Boolean Boolean
*/
private Boolean yuePay(StoreOrder storeOrder) {
// 用户余额扣除
MemberUserRespDTO user = userService.getUser(storeOrder.getUid());
if (ObjectUtil.isNull(user)) throw new ServiceException("用户不存在");
storeOrder.setPaid(true);
storeOrder.setPayTime(DateUtils.nowDateTime());
Boolean execute = transactionTemplate.execute(e -> {
// 订单修改
storeOrderService.updateById(storeOrder);
// 这里只扣除金额账单记录在task中处理
// 添加支付成功redis队列
redisUtil.lPush(Constants.ORDER_TASK_PAY_SUCCESS_AFTER, storeOrder.getOrderId());
return Boolean.TRUE;
});
if (!execute) throw new ServiceException("余额支付订单失败");
return execute;
}
/**
@ -46,6 +166,154 @@ public class OrderPayServiceImpl implements OrderPayService {
*/
@Override
public OrderPayResultResponse payment(OrderPayRequest orderPayRequest, String ip) {
return null;
StoreOrder storeOrder = storeOrderService.getByOderId(orderPayRequest.getOrderNo());
if (ObjectUtil.isNull(storeOrder)) {
throw new ServiceException("订单不存在");
}
if (storeOrder.getIsDel()) {
throw new ServiceException("订单已被删除");
}
if (storeOrder.getPaid()) {
throw new ServiceException("订单已支付");
}
MemberUserRespDTO user = userService.getUser(storeOrder.getUid());
if (ObjectUtil.isNull(user)) throw new ServiceException("用户不存在");
// 判断订单是否还是之前的支付类型
if (!storeOrder.getPayType().equals(orderPayRequest.getPayType())) {
// 根据支付类型进行校验,更换支付类型
storeOrder.setPayType(orderPayRequest.getPayType());
// 余额支付
if (orderPayRequest.getPayType().equals(PayConstants.PAY_TYPE_YUE)) {
// if (user.getNowMoney().compareTo(storeOrder.getPayPrice()) < 0) {
// throw new ServiceException("用户余额不足");
// }
storeOrder.setIsChannel(3);
}
if (orderPayRequest.getPayType().equals(PayConstants.PAY_TYPE_WE_CHAT)) {
switch (orderPayRequest.getPayChannel()){
case PayConstants.PAY_CHANNEL_WE_CHAT_H5:// H5
storeOrder.setIsChannel(2);
break;
case PayConstants.PAY_CHANNEL_WE_CHAT_PUBLIC:// 公众号
storeOrder.setIsChannel(0);
break;
case PayConstants.PAY_CHANNEL_WE_CHAT_PROGRAM:// 小程序
storeOrder.setIsChannel(1);
break;
}
}
boolean changePayType = storeOrderService.updateById(storeOrder);
if (!changePayType) {
throw new ServiceException("变更订单支付类型失败!");
}
}
//
// if (user.getIntegral() < storeOrder.getUseIntegral()) {
// throw new ServiceException("用户积分不足");
// }
OrderPayResultResponse response = new OrderPayResultResponse();
response.setOrderNo(storeOrder.getOrderId());
response.setPayType(storeOrder.getPayType());
// 0元付
if (storeOrder.getPayPrice().compareTo(BigDecimal.ZERO) <= 0) {
Boolean aBoolean = yuePay(storeOrder);
response.setPayType(PayConstants.PAY_TYPE_YUE);
response.setStatus(aBoolean);
return response;
}
// 微信支付,调用微信预下单,返回拉起微信支付需要的信息
if (storeOrder.getPayType().equals(PayConstants.PAY_TYPE_WE_CHAT)) {
// 预下单
Map<String, String> unifiedorder = unifiedorder(storeOrder, ip);
response.setStatus(true);
WxPayJsResultVo vo = new WxPayJsResultVo();
vo.setAppId(unifiedorder.get("appId"));
vo.setNonceStr(unifiedorder.get("nonceStr"));
vo.setPackages(unifiedorder.get("package"));
vo.setSignType(unifiedorder.get("signType"));
vo.setTimeStamp(unifiedorder.get("timeStamp"));
vo.setPaySign(unifiedorder.get("paySign"));
if (storeOrder.getIsChannel() == 2) {
vo.setMwebUrl(unifiedorder.get("mweb_url"));
response.setPayType(PayConstants.PAY_CHANNEL_WE_CHAT_H5);
}
if (storeOrder.getIsChannel() == 4 || storeOrder.getIsChannel() == 5) {
vo.setPartnerid(unifiedorder.get("partnerid"));
}
// 更新商户订单号
storeOrder.setOutTradeNo(unifiedorder.get("outTradeNo"));
storeOrderService.updateById(storeOrder);
response.setJsConfig(vo);
return response;
}
// 余额支付
if (storeOrder.getPayType().equals(PayConstants.PAY_TYPE_YUE)) {
Boolean yueBoolean = yuePay(storeOrder);
response.setStatus(yueBoolean);
return response;
}
if (storeOrder.getPayType().equals(PayConstants.PAY_TYPE_OFFLINE)) {
throw new ServiceException("暂时不支持线下支付");
}
response.setStatus(false);
return response;
}
/**
*
* @param storeOrder
* @param ip ip
* @return
*/
private Map<String, String> unifiedorder(StoreOrder storeOrder, String ip) {
// 获取用户openId
// 根据订单支付类型来判断获取公众号openId还是小程序openId
// 获取appid、mch_id
// 微信签名key
String appId = "";
String mchId = "";
String signKey = "";
if (storeOrder.getIsChannel() == 0) {// 公众号
appId = apiConfigApi.getConfigKey(Constants.CONFIG_KEY_PAY_WE_CHAT_APP_ID).toString();
mchId = apiConfigApi.getConfigKey(Constants.CONFIG_KEY_PAY_WE_CHAT_MCH_ID).toString();
signKey = apiConfigApi.getConfigKey(Constants.CONFIG_KEY_PAY_WE_CHAT_APP_KEY).toString();
}
if (storeOrder.getIsChannel() == 1) {// 小程序
appId = apiConfigApi.getConfigKey(Constants.CONFIG_KEY_PAY_ROUTINE_APP_ID).toString();
mchId = apiConfigApi.getConfigKey(Constants.CONFIG_KEY_PAY_ROUTINE_MCH_ID).toString();
signKey = apiConfigApi.getConfigKey(Constants.CONFIG_KEY_PAY_ROUTINE_APP_KEY).toString();
}
if (storeOrder.getIsChannel() == 2) {// H5,使用公众号的
appId = apiConfigApi.getConfigKey(Constants.CONFIG_KEY_PAY_WE_CHAT_APP_ID).toString();
mchId = apiConfigApi.getConfigKey(Constants.CONFIG_KEY_PAY_WE_CHAT_MCH_ID).toString();
signKey = apiConfigApi.getConfigKey(Constants.CONFIG_KEY_PAY_WE_CHAT_APP_KEY).toString();
}
// 获取微信预下单对象
//CreateOrderRequestVo unifiedorderVo = getUnifiedorderVo(storeOrder, userToken.getToken(), ip, appId, mchId, signKey);
// 预下单(统一下单)
//CreateOrderResponseVo responseVo = wechatNewService.payUnifiedorder(unifiedorderVo);
// 组装前端预下单参数
Map<String, String> map = new HashMap<>();
// map.put("appId", unifiedorderVo.getAppid());
// map.put("nonceStr", unifiedorderVo.getAppid());
// map.put("package", "prepay_id=".concat(responseVo.getPrepayId()));
// map.put("signType", unifiedorderVo.getSign_type());
// Long currentTimestamp = WxPayUtil.getCurrentTimestamp();
// map.put("timeStamp", Long.toString(currentTimestamp));
// String paySign = WxPayUtil.getSign(map, signKey);
// map.put("paySign", paySign);
// map.put("prepayId", responseVo.getPrepayId());
// map.put("prepayTime", DateUtil.nowDateTimeStr());
// map.put("outTradeNo", unifiedorderVo.getOut_trade_no());
// if (storeOrder.getIsChannel() == 2) {
// map.put("mweb_url", responseVo.getMWebUrl());
// }
return map;
}
}

View File

@ -1,10 +1,28 @@
package cn.iocoder.yudao.module.shop.service.order.impl;
import cn.iocoder.yudao.module.shop.service.order.OrderTaskService;
import cn.hutool.core.collection.CollUtil;
import cn.hutool.core.util.ObjectUtil;
import cn.hutool.json.JSONUtil;
import cn.iocoder.yudao.framework.common.util.date.DateUtils;
import cn.iocoder.yudao.module.member.api.user.MemberUserApi;
import cn.iocoder.yudao.module.member.api.user.dto.MemberUserRespDTO;
import cn.iocoder.yudao.module.shop.dal.dataobject.order.StoreOrderStatus;
import cn.iocoder.yudao.module.shop.dal.dataobject.product.StoreProductReply;
import cn.iocoder.yudao.module.shop.vo.order.StoreOrderInfoOldVo;
import cn.iocoder.yudao.framework.common.enums.Constants;
import cn.iocoder.yudao.framework.common.exception.ServiceException;
import cn.iocoder.yudao.module.shop.dal.dataobject.order.StoreOrder;
import cn.iocoder.yudao.module.shop.service.order.*;
import cn.iocoder.yudao.module.shop.service.product.StoreProductReplyService;
import cn.iocoder.yudao.module.shop.utils.RedisUtil;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.transaction.support.TransactionTemplate;
import java.util.List;
/**
* StoreOrderServiceImpl
@ -20,27 +38,156 @@ import org.springframework.stereotype.Service;
*/
@Service
public class OrderTaskServiceImpl implements OrderTaskService {
@Autowired
private RedisUtil redisUtil;
@Autowired
private StoreOrderTaskService storeOrderTaskService;
@Autowired
private StoreOrderService storeOrderService;
@Autowired
private StoreOrderStatusService storeOrderStatusService;
@Autowired
private StoreOrderInfoService storeOrderInfoService;
@Autowired
private MemberUserApi userService;
@Autowired
private StoreProductReplyService storeProductReplyService;
@Autowired
private TransactionTemplate transactionTemplate;
@Autowired
private OrderPayService orderPayService;
//日志
private static final Logger logger = LoggerFactory.getLogger(OrderTaskServiceImpl.class);
@Override
public void cancelByUser() {
String redisKey = Constants.ORDER_TASK_REDIS_KEY_AFTER_CANCEL_BY_USER;
Long size = redisUtil.getListSize(redisKey);
logger.info("OrderTaskServiceImpl.cancelByUser | size:" + size);
if (size < 1) {
return;
}
for (int i = 0; i < size; i++) {
//如果10秒钟拿不到一个数据那么退出循环
Object data = redisUtil.getRightPop(redisKey, 10L);
if (null == data) {
continue;
}
try {
// StoreOrder storeOrder = getJavaBeanStoreOrder(data);
StoreOrder storeOrder = storeOrderService.getById(Integer.valueOf(data.toString()));
boolean result = storeOrderTaskService.cancelByUser(storeOrder);
if (!result) {
redisUtil.lPush(redisKey, data);
}
} catch (Exception e) {
redisUtil.lPush(redisKey, data);
}
}
}
@Override
public void refundApply() {
String redisKey = Constants.ORDER_TASK_REDIS_KEY_AFTER_REFUND_BY_USER;
Long size = redisUtil.getListSize(redisKey);
logger.info("OrderTaskServiceImpl.refundApply | size:" + size);
if (size < 1) {
return;
}
for (int i = 0; i < size; i++) {
//如果10秒钟拿不到一个数据那么退出循环
Object orderId = redisUtil.getRightPop(redisKey, 10L);
if (null == orderId) {
continue;
}
try {
StoreOrder storeOrder = storeOrderService.getById(Integer.valueOf(orderId.toString()));
if (ObjectUtil.isNull(storeOrder)) {
throw new ServiceException("订单不存在,orderNo = " + orderId);
}
// boolean result = storeOrderTaskService.refundApply(storeOrder);
boolean result = storeOrderTaskService.refundOrder(storeOrder);
if (!result) {
logger.error("订单退款错误result = " + result);
redisUtil.lPush(redisKey, orderId);
}
} catch (Exception e) {
logger.error("订单退款错误:" + e.getMessage());
redisUtil.lPush(redisKey, orderId);
}
}
}
@Override
public void complete() {
String redisKey = Constants.ORDER_TASK_REDIS_KEY_AFTER_COMPLETE_BY_USER;
Long size = redisUtil.getListSize(redisKey);
logger.info("OrderTaskServiceImpl.complete | size:" + size);
if (size < 1) {
return;
}
for (int i = 0; i < size; i++) {
//如果10秒钟拿不到一个数据那么退出循环
Object data = redisUtil.getRightPop(redisKey, 10L);
if (null == data) {
continue;
}
try {
StoreOrder storeOrder = getJavaBeanStoreOrder(data);
boolean result = storeOrderTaskService.complete(storeOrder);
if (!result) {
redisUtil.lPush(redisKey, data);
}
} catch (Exception e) {
redisUtil.lPush(redisKey, data);
}
}
}
private StoreOrder getJavaBeanStoreOrder(Object data) {
return JSONUtil.toBean(JSONUtil.parseObj(data.toString()), StoreOrder.class);
}
@Override
public void orderPaySuccessAfter() {
String redisKey = Constants.ORDER_TASK_PAY_SUCCESS_AFTER;
Long size = redisUtil.getListSize(redisKey);
logger.info("OrderTaskServiceImpl.orderPaySuccessAfter | size:" + size);
if (size < 1) {
return;
}
for (int i = 0; i < size; i++) {
//如果10秒钟拿不到一个数据那么退出循环
Object data = redisUtil.getRightPop(redisKey, 10L);
if (ObjectUtil.isNull(data)) {
continue;
}
try {
StoreOrder storeOrder = storeOrderService.getByOderId(String.valueOf(data));
if (ObjectUtil.isNull(storeOrder)) {
logger.error("OrderTaskServiceImpl.orderPaySuccessAfter | 订单不存在orderNo: " + data);
throw new ServiceException("订单不存在orderNo: " + data);
}
boolean result = orderPayService.paySuccess(storeOrder);
if (!result) {
redisUtil.lPush(redisKey, data);
}
} catch (Exception e) {
e.printStackTrace();
redisUtil.lPush(redisKey, data);
}
}
}
/**
@ -48,7 +195,33 @@ public class OrderTaskServiceImpl implements OrderTaskService {
*/
@Override
public void autoCancel() {
String redisKey = Constants.ORDER_AUTO_CANCEL_KEY;
Long size = redisUtil.getListSize(redisKey);
logger.info("OrderTaskServiceImpl.autoCancel | size:" + size);
if (size < 1) {
return;
}
for (int i = 0; i < size; i++) {
//如果10秒钟拿不到一个数据那么退出循环
Object data = redisUtil.getRightPop(redisKey, 10L);
if (null == data) {
continue;
}
try {
StoreOrder storeOrder = storeOrderService.getByOderId(String.valueOf(data));
if (ObjectUtil.isNull(storeOrder)) {
logger.error("OrderTaskServiceImpl.autoCancel | 订单不存在orderNo: " + data);
throw new ServiceException("订单不存在orderNo: " + data);
}
boolean result = storeOrderTaskService.autoCancel(storeOrder);
if (!result) {
redisUtil.lPush(redisKey, data);
}
} catch (Exception e) {
e.printStackTrace();
redisUtil.lPush(redisKey, data);
}
}
}
/**
@ -56,7 +229,27 @@ public class OrderTaskServiceImpl implements OrderTaskService {
*/
@Override
public void orderReceiving() {
String redisKey = Constants.ORDER_TASK_REDIS_KEY_AFTER_TAKE_BY_USER;
Long size = redisUtil.getListSize(redisKey);
logger.info("OrderTaskServiceImpl.orderReceiving | size:" + size);
if (size < 1) {
return;
}
for (int i = 0; i < size; i++) {
//如果10秒钟拿不到一个数据那么退出循环
Object id = redisUtil.getRightPop(redisKey, 10L);
if (null == id) {
continue;
}
try {
Boolean result = storeOrderTaskService.orderReceiving(Integer.valueOf(id.toString()));
if (!result) {
redisUtil.lPush(redisKey, id);
}
} catch (Exception e) {
redisUtil.lPush(redisKey, id);
}
}
}
/**
@ -64,6 +257,84 @@ public class OrderTaskServiceImpl implements OrderTaskService {
*/
@Override
public void autoComplete() {
// 查找所有收获状态订单
List<StoreOrder> orderList = storeOrderService.findIdAndUidListByReceipt();
if (CollUtil.isEmpty(orderList)) {
return ;
}
logger.info("OrderTaskServiceImpl.autoComplete | size:0");
// 根据订单状态表判断订单是否可以自动完成
for (StoreOrder order : orderList) {
StoreOrderStatus orderStatus = storeOrderStatusService.getLastByOrderId(order.getId());
if (!orderStatus.getChangeType().equals("user_take_delivery")) {
logger.error("订单自动完成订单记录最后一条不是收货状态orderId = " + order.getId());
continue ;
}
// 判断是否到自动完成时间收货时间向后偏移7天
String comTime = DateUtils.addDay(orderStatus.getCreateTime(), 7, Constants.DATE_FORMAT);
int compareDate = DateUtils.compareDate(comTime, DateUtils.nowDateTime(Constants.DATE_FORMAT), Constants.DATE_FORMAT);
if (compareDate < 0) {
continue ;
}
/**
* ---------------
*
* ---------------
*/
// 获取订单详情
List<StoreOrderInfoOldVo> orderInfoVoList = storeOrderInfoService.getOrderListByOrderId(order.getId());
if (CollUtil.isEmpty(orderInfoVoList)) {
logger.error("订单自动完成无订单详情数据orderId = " + order.getId());
continue;
}
List<StoreProductReply> replyList = CollUtil.newArrayList();
MemberUserRespDTO user = userService.getUser(order.getUid());
// 生成评论
for (StoreOrderInfoOldVo orderInfo : orderInfoVoList) {
// 判断是否已评论
if (orderInfo.getInfo().getIsReply().equals(1)) {
continue;
}
String replyType = Constants.STORE_REPLY_TYPE_PRODUCT;
// if (ObjectUtil.isNotNull(orderInfo.getInfo().getSeckillId()) && orderInfo.getInfo().getSeckillId() > 0) {
// replyType = Constants.STORE_REPLY_TYPE_SECKILL;
// }
// if (ObjectUtil.isNotNull(orderInfo.getInfo().getBargainId()) && orderInfo.getInfo().getBargainId() > 0) {
// replyType = Constants.STORE_REPLY_TYPE_BARGAIN;
// }
// if (ObjectUtil.isNotNull(orderInfo.getInfo().getCombinationId()) && orderInfo.getInfo().getCombinationId() > 0) {
// replyType = Constants.STORE_REPLY_TYPE_PINTUAN;
// }
StoreProductReply reply = new StoreProductReply();
reply.setUid(order.getUid());
reply.setOid(order.getId());
reply.setProductId(orderInfo.getProductId());
reply.setUnique(orderInfo.getUnique());
reply.setReplyType(replyType);
reply.setProductScore(5);
reply.setServiceScore(5);
reply.setComment("");
reply.setPics("");
reply.setNickname(user.getNickname());
reply.setAvatar(user.getAvatar());
reply.setSku(orderInfo.getInfo().getSku());
reply.setCreateTime(DateUtils.nowDateTime());
replyList.add(reply);
}
order.setStatus(Constants.ORDER_STATUS_INT_COMPLETE);
Boolean execute = transactionTemplate.execute(e -> {
storeOrderService.updateById(order);
storeProductReplyService.saveBatch(replyList);
return Boolean.TRUE;
});
if (execute) {
redisUtil.lPush(Constants.ORDER_TASK_REDIS_KEY_AFTER_COMPLETE_BY_USER, order.getId());
} else {
logger.error("订单自动完成更新数据库失败orderId = " + order.getId());
}
}
}
}

View File

@ -106,7 +106,7 @@ public class StoreOrderTaskServiceImpl implements StoreOrderTaskService {
attrValueService.operationStock(orderInfoVo.getAttrValueId(), orderInfoVo.getPayNum(), "add", Constants.PRODUCT_TYPE_NORMAL);
}
}catch (Exception e){
// throw new CrmebException(e.getMessage());
// throw new ServiceException(e.getMessage());
logger.error("回滚库存失败error = " + e.getMessage());
return true;
}

View File

@ -88,7 +88,7 @@ public interface StoreCartService extends IService<StoreCart> {
* @param uid uid
* @return StoreCart
*/
StoreCart getByIdAndUid(Long id, Integer uid);
StoreCart getByIdAndUid(Long id, Long uid);
/**
*

View File

@ -300,7 +300,7 @@ public class StoreCartServiceImpl extends ServiceImpl<StoreCartMapper, StoreCart
* @return StoreCart
*/
@Override
public StoreCart getByIdAndUid(Long id, Integer uid) {
public StoreCart getByIdAndUid(Long id, Long uid) {
LambdaQueryWrapper<StoreCart> lqw = Wrappers.lambdaQuery();
lqw.eq(StoreCart::getId, id);
lqw.eq(StoreCart::getUid, uid);

View File

@ -403,13 +403,13 @@ public class StoreProductServiceImpl extends ServiceImpl<StoreProductMapper, Sto
}
// 如果商品是活动商品主商品不允许修改
// if (storeSeckillService.isExistByProductId(storeProductRequest.getId())) {
// throw new CrmebException("商品作为秒杀商品的主商品,需要修改请先删除对应秒杀商品");
// throw new ServiceException("商品作为秒杀商品的主商品,需要修改请先删除对应秒杀商品");
// }
// if (storeBargainService.isExistByProductId(storeProductRequest.getId())) {
// throw new CrmebException("商品作为砍价商品的主商品,需要修改请先删除对应砍价商品");
// throw new ServiceException("商品作为砍价商品的主商品,需要修改请先删除对应砍价商品");
// }
// if (storeCombinationService.isExistByProductId(storeProductRequest.getId())) {
// throw new CrmebException("商品作为拼团商品的主商品,需要修改请先删除对应拼团商品");
// throw new ServiceException("商品作为拼团商品的主商品,需要修改请先删除对应拼团商品");
// }
StoreProduct storeProduct = new StoreProduct();

View File

@ -3,14 +3,29 @@ package cn.iocoder.yudao.module.shop.utils;
import cn.iocoder.yudao.framework.common.enums.Constants;
import cn.iocoder.yudao.framework.common.exception.ServiceException;
import cn.iocoder.yudao.module.infra.api.config.ApiConfigApi;
import cn.iocoder.yudao.module.member.api.user.MemberUserApi;
import cn.iocoder.yudao.module.shop.constants.PayConstants;
import cn.iocoder.yudao.module.shop.constants.SysConfigConstants;
import cn.iocoder.yudao.module.shop.dal.dataobject.order.StoreOrder;
import cn.iocoder.yudao.module.shop.service.order.StoreOrderService;
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;
import org.springframework.stereotype.Service;
@Component
public class OrderUtil {
@Autowired
private MemberUserApi memberUserApi;
@Autowired
private StoreOrderService storeOrderService;
@Autowired
private ApiConfigApi apiConfigApi;
/**
* h5 where status
* @param queryWrapper
@ -63,5 +78,43 @@ public class OrderUtil {
}
/**
*
* @param id id
* @return
*/
public StoreOrder getInfoById(Integer id) {
StoreOrder storeOrder = storeOrderService.getById(id);
Long userId = memberUserApi.getUserIdException();
if(null == storeOrder || !userId.equals(storeOrder.getUid())){
//订单号错误
throw new ServiceException("没有找到相关订单信息!");
}
return storeOrder;
}
/**
*
* @param payType
* @return
*/
public Boolean checkPayType(String payType){
boolean result = false;
payType = payType.toLowerCase();
switch (payType){
case PayConstants.PAY_TYPE_WE_CHAT:
result = apiConfigApi.getConfigKey(SysConfigConstants.CONFIG_PAY_WEIXIN_OPEN).equals("1");
break;
case PayConstants.PAY_TYPE_YUE:
result = (apiConfigApi.getConfigKey(SysConfigConstants.CONFIG_YUE_PAY_STATUS).equals("1"));
break;
case PayConstants.PAY_TYPE_ALI_PAY:
result = (apiConfigApi.getConfigKey(SysConfigConstants.CONFIG_ALI_PAY_STATUS).equals("1"));
break;
}
return result;
}
}

View File

@ -112,7 +112,7 @@ public class TradeOrderServiceTest extends BaseDbUnitTest {
.setStatus(ProductSpuStatusEnum.ENABLE.getStatus()));
when(productSpuApi.getSpuList(eq(asSet(11L, 21L)))).thenReturn(Arrays.asList(spu01, spu02));
// mock 方法(用户收件地址的校验)
AddressRespDTO addressRespDTO = new AddressRespDTO().setId(10L).setUserId(userId).setName("芋艿")
AddressRespDTO addressRespDTO = new AddressRespDTO().setId(10).setUserId(userId).setName("芋艿")
.setMobile("15601691300").setAreaId(3306L).setPostCode("85757").setDetailAddress("土豆村");
when(addressApi.getAddress(eq(10L), eq(userId))).thenReturn(addressRespDTO);
// mock 方法(价格计算)

View File

@ -21,6 +21,18 @@
<groupId>cn.iocoder.boot</groupId>
<artifactId>yudao-common</artifactId>
</dependency>
<dependency>
<groupId>com.baomidou</groupId>
<artifactId>mybatis-plus-annotation</artifactId>
<version>3.5.3.1</version>
<scope>compile</scope>
</dependency>
<dependency>
<groupId>com.baomidou</groupId>
<artifactId>mybatis-plus-annotation</artifactId>
<version>3.5.3.1</version>
<scope>compile</scope>
</dependency>
</dependencies>
</project>

View File

@ -18,4 +18,13 @@ public interface AddressApi {
*/
AddressRespDTO getAddress(Long id, Long userId);
AddressRespDTO getById(Integer addressId);
/**
*
* @return UserAddress
*/
AddressRespDTO getDefaultByUid(Long uid);
}

View File

@ -13,7 +13,7 @@ public class AddressRespDTO {
/**
*
*/
private Long id;
private Integer id;
/**
*
*/
@ -45,4 +45,35 @@ public class AddressRespDTO {
*/
private Boolean defaulted;
/**
*
*
*/
private String province;
/**
*
*
*/
private String city;
/**
*
* id
*/
private Integer cityId;
/**
*
*
*/
private String district;
/**
* 0 1
*
* true -
*/
private Boolean isDel;
}

View File

@ -64,4 +64,16 @@ public interface MemberUserApi {
*/
int updateById(MemberUserRespDTO member);
/**
* id
*
* @return Integer
*/
Long getUserIdException();
MemberUserRespDTO getInfoException();
Long getUserId();
MemberUserRespDTO getInfo();
}

View File

@ -0,0 +1,98 @@
package cn.iocoder.yudao.module.member.api.user.dto;
import com.baomidou.mybatisplus.annotation.IdType;
import com.baomidou.mybatisplus.annotation.TableId;
import com.baomidou.mybatisplus.annotation.TableName;
import lombok.Data;
import lombok.EqualsAndHashCode;
import lombok.experimental.Accessors;
import java.math.BigDecimal;
import java.util.Date;
/**
*
* +----------------------------------------------------------------------
* | CRMEB [ CRMEB ]
* +----------------------------------------------------------------------
* | Copyright (c) 2016~2022 https://www.crmeb.com All rights reserved.
* +----------------------------------------------------------------------
* | Licensed CRMEBCRMEB
* +----------------------------------------------------------------------
* | Author: CRMEB Team <admin@crmeb.com>
* +----------------------------------------------------------------------
*/
@Data
@EqualsAndHashCode(callSuper = false)
@Accessors(chain = true)
@TableName("eb_user_bill")
public class MemberUserBillDTO {
private static final long serialVersionUID=1L;
/**
*id
*/
@TableId(value = "id", type = IdType.AUTO)
private Integer id;
/**
*uid
*/
private Long uid;
/**
*id
*/
private String linkId;
/**
*0 = 1 =
*/
private int pm;
/**
*
*/
private String title;
/**
*
*/
private String category;
/**
*
*/
private String type;
/**
*
*/
private BigDecimal number;
/**
*
*/
private BigDecimal balance;
/**
*
*/
private String mark;
/**
*"0 = 带确定 1 = 有效 -1 = 无效"
*/
private Integer status;
/**
*
*/
private Date updateTime;
/**
*
*/
private Date createTime;
}

View File

@ -3,6 +3,8 @@ package cn.iocoder.yudao.module.member.api.user.dto;
import cn.iocoder.yudao.framework.common.enums.CommonStatusEnum;
import lombok.Data;
import java.math.BigDecimal;
/**
* Response DTO
*
@ -34,4 +36,5 @@ public class MemberUserRespDTO {
*/
private String mobile;
}

View File

@ -2,7 +2,13 @@ package cn.iocoder.yudao.module.member.api.address;
import cn.iocoder.yudao.module.member.api.address.dto.AddressRespDTO;
import cn.iocoder.yudao.module.member.convert.address.AddressConvert;
import cn.iocoder.yudao.module.member.dal.dataobject.address.AddressDO;
import cn.iocoder.yudao.module.member.dal.mysql.address.AddressMapper;
import cn.iocoder.yudao.module.member.service.address.AddressService;
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.baomidou.mybatisplus.core.toolkit.Wrappers;
import org.checkerframework.checker.units.qual.A;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.validation.annotation.Validated;
@ -20,9 +26,36 @@ public class AddressApiImpl implements AddressApi {
@Resource
private AddressService addressService;
@Resource
private AddressMapper addressMapper;
@Autowired
private AddressConvert addressConvert;
@Override
public AddressRespDTO getAddress(Long id, Long userId) {
return AddressConvert.INSTANCE.convert02(addressService.getAddress(userId, id));
}
@Override
public AddressRespDTO getById(Integer addressId) {
LambdaQueryWrapper<AddressDO> lambdaQueryWrapper = new LambdaQueryWrapper<>();
lambdaQueryWrapper.eq(AddressDO::getId, addressId);
lambdaQueryWrapper.eq(AddressDO::getIsDel, false);
return addressConvert.convert02(addressMapper.selectOne(lambdaQueryWrapper));
}
/**
*
* @return UserAddress
*/
@Override
public AddressRespDTO getDefaultByUid(Long uid) {
LambdaQueryWrapper<AddressDO> lambdaQueryWrapper = Wrappers.lambdaQuery();
lambdaQueryWrapper.eq(AddressDO::getDefaulted, true);
lambdaQueryWrapper.eq(AddressDO::getId, uid);
return addressConvert.convert02(addressMapper.selectOne(lambdaQueryWrapper));
}
}

View File

@ -1,9 +1,12 @@
package cn.iocoder.yudao.module.member.api.user;
import cn.iocoder.yudao.framework.common.exception.ServiceException;
import cn.iocoder.yudao.framework.security.core.util.SecurityFrameworkUtils;
import cn.iocoder.yudao.module.member.api.user.dto.MemberUserRespDTO;
import cn.iocoder.yudao.module.member.convert.user.UserConvert;
import cn.iocoder.yudao.module.member.dal.dataobject.user.MemberUserDO;
import cn.iocoder.yudao.module.member.service.user.MemberUserService;
import com.thoughtworks.xstream.core.SecurityUtils;
import org.springframework.stereotype.Service;
import org.springframework.validation.annotation.Validated;
@ -49,4 +52,63 @@ public class MemberUserApiImpl implements MemberUserApi {
return userService.updateById(UserConvert.INSTANCE.convert3(member));
}
@Override
public Long getUserIdException() {
Long id = SecurityFrameworkUtils.getLoginUserId();
if (null == id) {
throw new ServiceException("登录信息已过期,请重新登录!");
}
return id;
}
/**
* id
*
* @return Integer
* @author Mr.Zhang
* @since 2020-04-28
*/
@Override
public Long getUserId() {
Long id = SecurityFrameworkUtils.getLoginUserId();
if (null == id) {
return 0L;
}
return id;
}
/**
*
*
* @return User
* @author Mr.Zhang
* @since 2020-04-28
*/
@Override
public MemberUserRespDTO getInfo() {
if (getUserId() == 0L) {
return null;
}
return UserConvert.INSTANCE.convert2(userService.getById(getUserId()));
}
/**
*
*
* @return User
* @author Mr.Zhang
* @since 2020-04-28
*/
@Override
public MemberUserRespDTO getInfoException() {
MemberUserRespDTO user = getInfo();
if (user == null) {
throw new ServiceException("用户信息不存在!");
}
if (user.getStatus() == 0) {
throw new ServiceException("用户已经被禁用!");
}
return user;
}
}

View File

@ -2,6 +2,7 @@ package cn.iocoder.yudao.module.member.dal.dataobject.address;
import cn.iocoder.yudao.framework.mybatis.core.dataobject.BaseDO;
import com.baomidou.mybatisplus.annotation.TableId;
import com.baomidou.mybatisplus.annotation.TableLogic;
import com.baomidou.mybatisplus.annotation.TableName;
import lombok.*;
@ -55,4 +56,10 @@ public class AddressDO extends BaseDO {
*/
private Boolean defaulted;
/**
*
*/
@TableLogic
private Boolean isDel;
}