couponUserList = couponUserService.queryExpired();
- for(LitemallCouponUser couponUser : couponUserList){
+ for (LitemallCouponUser couponUser : couponUserList) {
couponUser.setStatus(CouponUserConstant.STATUS_EXPIRED);
couponUserService.update(couponUser);
}
diff --git a/litemall-admin-api/src/main/java/org/linlinjava/litemall/admin/job/OrderJob.java b/litemall-admin-api/src/main/java/org/linlinjava/litemall/admin/job/OrderJob.java
index a29536ee..c286367c 100644
--- a/litemall-admin-api/src/main/java/org/linlinjava/litemall/admin/job/OrderJob.java
+++ b/litemall-admin-api/src/main/java/org/linlinjava/litemall/admin/job/OrderJob.java
@@ -3,12 +3,8 @@ package org.linlinjava.litemall.admin.job;
import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
import org.linlinjava.litemall.core.system.SystemConfig;
-import org.linlinjava.litemall.db.domain.LitemallGoodsProduct;
-import org.linlinjava.litemall.db.domain.LitemallOrder;
-import org.linlinjava.litemall.db.domain.LitemallOrderGoods;
-import org.linlinjava.litemall.db.service.LitemallGoodsProductService;
-import org.linlinjava.litemall.db.service.LitemallOrderGoodsService;
-import org.linlinjava.litemall.db.service.LitemallOrderService;
+import org.linlinjava.litemall.db.domain.*;
+import org.linlinjava.litemall.db.service.*;
import org.linlinjava.litemall.db.util.OrderUtil;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.scheduling.annotation.Scheduled;
@@ -31,43 +27,10 @@ public class OrderJob {
private LitemallOrderService orderService;
@Autowired
private LitemallGoodsProductService productService;
-
- /**
- * 自动取消订单
- *
- * 定时检查订单未付款情况,如果超时 LITEMALL_ORDER_UNPAID 分钟则自动取消订单
- * 定时时间是每次相隔半个小时。
- *
- * TODO
- * 注意,因为是相隔半小时检查,因此导致订单真正超时时间是 [LITEMALL_ORDER_UNPAID, 30 + LITEMALL_ORDER_UNPAID]
- */
- @Scheduled(fixedDelay = 30 * 60 * 1000)
- @Transactional
- public void checkOrderUnpaid() {
- logger.info("系统开启任务检查订单是否已经超期自动取消订单");
-
- List orderList = orderService.queryUnpaid(SystemConfig.getOrderUnpaid());
- for (LitemallOrder order : orderList) {
- // 设置订单已取消状态
- order.setOrderStatus(OrderUtil.STATUS_AUTO_CANCEL);
- order.setEndTime(LocalDateTime.now());
- if (orderService.updateWithOptimisticLocker(order) == 0) {
- throw new RuntimeException("更新数据已失效");
- }
-
- // 商品货品数量增加
- Integer orderId = order.getId();
- List orderGoodsList = orderGoodsService.queryByOid(orderId);
- for (LitemallOrderGoods orderGoods : orderGoodsList) {
- Integer productId = orderGoods.getProductId();
- Short number = orderGoods.getNumber();
- if (productService.addStock(productId, number) == 0) {
- throw new RuntimeException("商品货品库存增加失败");
- }
- }
- logger.info("订单 ID=" + order.getId() + " 已经超期自动取消订单");
- }
- }
+ @Autowired
+ private LitemallGrouponService grouponService;
+ @Autowired
+ private LitemallGrouponRulesService rulesService;
/**
* 自动确认订单
@@ -80,7 +43,7 @@ public class OrderJob {
*/
@Scheduled(cron = "0 0 3 * * ?")
public void checkOrderUnconfirm() {
- logger.info("系统开启任务检查订单是否已经超期自动确认收货");
+ logger.info("系统开启定时任务检查订单是否已经超期自动确认收货");
List orderList = orderService.queryUnconfirm(SystemConfig.getOrderUnconfirm());
for (LitemallOrder order : orderList) {
@@ -109,7 +72,6 @@ public class OrderJob {
public void checkOrderComment() {
logger.info("系统开启任务检查订单是否已经超期未评价");
- LocalDateTime now = LocalDateTime.now();
List orderList = orderService.queryComment(SystemConfig.getOrderComment());
for (LitemallOrder order : orderList) {
order.setComments((short) 0);
diff --git a/litemall-admin-api/src/main/java/org/linlinjava/litemall/admin/service/AdminGoodsService.java b/litemall-admin-api/src/main/java/org/linlinjava/litemall/admin/service/AdminGoodsService.java
index 9ac2fc05..a049e925 100644
--- a/litemall-admin-api/src/main/java/org/linlinjava/litemall/admin/service/AdminGoodsService.java
+++ b/litemall-admin-api/src/main/java/org/linlinjava/litemall/admin/service/AdminGoodsService.java
@@ -1,6 +1,5 @@
package org.linlinjava.litemall.admin.service;
-import com.github.pagehelper.PageInfo;
import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
import org.linlinjava.litemall.admin.dto.GoodsAllinone;
@@ -40,21 +39,13 @@ public class AdminGoodsService {
private LitemallBrandService brandService;
@Autowired
private LitemallCartService cartService;
- @Autowired
- private LitemallOrderGoodsService orderGoodsService;
-
@Autowired
private QCodeService qCodeService;
- public Object list(String goodsSn, String name,
+ public Object list(Integer goodsId, String goodsSn, String name,
Integer page, Integer limit, String sort, String order) {
- List goodsList = goodsService.querySelective(goodsSn, name, page, limit, sort, order);
- long total = PageInfo.of(goodsList).getTotal();
- Map data = new HashMap<>();
- data.put("total", total);
- data.put("items", goodsList);
-
- return ResponseUtil.ok(data);
+ List goodsList = goodsService.querySelective(goodsId, goodsSn, name, page, limit, sort, order);
+ return ResponseUtil.okList(goodsList);
}
private Object validate(GoodsAllinone goodsAllinone) {
@@ -129,19 +120,25 @@ public class AdminGoodsService {
/**
* 编辑商品
- *
- * TODO
- * 目前商品修改的逻辑是
- * 1. 更新litemall_goods表
- * 2. 逻辑删除litemall_goods_specification、litemall_goods_attribute、litemall_goods_product
- * 3. 添加litemall_goods_specification、litemall_goods_attribute、litemall_goods_product
- *
- * 这里商品三个表的数据采用删除再添加的策略是因为
- * 商品编辑页面,支持管理员添加删除商品规格、添加删除商品属性,因此这里仅仅更新是不可能的,
- * 只能删除三个表旧的数据,然后添加新的数据。
- * 但是这里又会引入新的问题,就是存在订单商品货品ID指向了失效的商品货品表。
- * 因此这里会拒绝管理员编辑商品,如果订单或购物车中存在商品。
- * 所以这里可能需要重新设计。
+ *
+ * NOTE:
+ * 由于商品涉及到四个表,特别是litemall_goods_product表依赖litemall_goods_specification表,
+ * 这导致允许所有字段都是可编辑会带来一些问题,因此这里商品编辑功能是受限制:
+ * (1)litemall_goods表可以编辑字段;
+ * (2)litemall_goods_specification表只能编辑pic_url字段,其他操作不支持;
+ * (3)litemall_goods_product表只能编辑price, number和url字段,其他操作不支持;
+ * (4)litemall_goods_attribute表支持编辑、添加和删除操作。
+ *
+ * NOTE2:
+ * 前后端这里使用了一个小技巧:
+ * 如果前端传来的update_time字段是空,则说明前端已经更新了某个记录,则这个记录会更新;
+ * 否则说明这个记录没有编辑过,无需更新该记录。
+ *
+ * NOTE3:
+ * (1)购物车缓存了一些商品信息,因此需要及时更新。
+ * 目前这些字段是goods_sn, goods_name, price, pic_url。
+ * (2)但是订单里面的商品信息则是不会更新。
+ * 如果订单是未支付订单,此时仍然以旧的价格支付。
*/
@Transactional
public Object update(GoodsAllinone goodsAllinone) {
@@ -155,38 +152,62 @@ public class AdminGoodsService {
LitemallGoodsSpecification[] specifications = goodsAllinone.getSpecifications();
LitemallGoodsProduct[] products = goodsAllinone.getProducts();
- Integer id = goods.getId();
-
//将生成的分享图片地址写入数据库
String url = qCodeService.createGoodShareImage(goods.getId().toString(), goods.getPicUrl(), goods.getName());
goods.setShareUrl(url);
+ // 商品表里面有一个字段retailPrice记录当前商品的最低价
+ BigDecimal retailPrice = new BigDecimal(Integer.MAX_VALUE);
+ for (LitemallGoodsProduct product : products) {
+ BigDecimal productPrice = product.getPrice();
+ if(retailPrice.compareTo(productPrice) == 1){
+ retailPrice = productPrice;
+ }
+ }
+ goods.setRetailPrice(retailPrice);
+
// 商品基本信息表litemall_goods
if (goodsService.updateById(goods) == 0) {
throw new RuntimeException("更新数据失败");
}
Integer gid = goods.getId();
- specificationService.deleteByGid(gid);
- attributeService.deleteByGid(gid);
- productService.deleteByGid(gid);
// 商品规格表litemall_goods_specification
for (LitemallGoodsSpecification specification : specifications) {
- specification.setGoodsId(goods.getId());
- specificationService.add(specification);
- }
-
- // 商品参数表litemall_goods_attribute
- for (LitemallGoodsAttribute attribute : attributes) {
- attribute.setGoodsId(goods.getId());
- attributeService.add(attribute);
+ // 目前只支持更新规格表的图片字段
+ if(specification.getUpdateTime() == null){
+ specification.setSpecification(null);
+ specification.setValue(null);
+ specificationService.updateById(specification);
+ }
}
// 商品货品表litemall_product
for (LitemallGoodsProduct product : products) {
- product.setGoodsId(goods.getId());
- productService.add(product);
+ if(product.getUpdateTime() == null) {
+ productService.updateById(product);
+ }
+ }
+
+ // 商品参数表litemall_goods_attribute
+ for (LitemallGoodsAttribute attribute : attributes) {
+ if (attribute.getId() == null || attribute.getId().equals(0)){
+ attribute.setGoodsId(goods.getId());
+ attributeService.add(attribute);
+ }
+ else if(attribute.getDeleted()){
+ attributeService.deleteById(attribute.getId());
+ }
+ else if(attribute.getUpdateTime() == null){
+ attributeService.updateById(attribute);
+ }
+ }
+
+ // 这里需要注意的是购物车litemall_cart有些字段是拷贝商品的一些字段,因此需要及时更新
+ // 目前这些字段是goods_sn, goods_name, price, pic_url
+ for (LitemallGoodsProduct product : products) {
+ cartService.updateProduct(product.getId(), goods.getGoodsSn(), goods.getName(), product.getPrice(), product.getUrl());
}
return ResponseUtil.ok();
@@ -224,6 +245,16 @@ public class AdminGoodsService {
return ResponseUtil.fail(GOODS_NAME_EXIST, "商品名已经存在");
}
+ // 商品表里面有一个字段retailPrice记录当前商品的最低价
+ BigDecimal retailPrice = new BigDecimal(Integer.MAX_VALUE);
+ for (LitemallGoodsProduct product : products) {
+ BigDecimal productPrice = product.getPrice();
+ if(retailPrice.compareTo(productPrice) == 1){
+ retailPrice = productPrice;
+ }
+ }
+ goods.setRetailPrice(retailPrice);
+
// 商品基本信息表litemall_goods
goodsService.add(goods);
diff --git a/litemall-admin-api/src/main/java/org/linlinjava/litemall/admin/service/AdminOrderService.java b/litemall-admin-api/src/main/java/org/linlinjava/litemall/admin/service/AdminOrderService.java
index e361922c..cb56fdd4 100644
--- a/litemall-admin-api/src/main/java/org/linlinjava/litemall/admin/service/AdminOrderService.java
+++ b/litemall-admin-api/src/main/java/org/linlinjava/litemall/admin/service/AdminOrderService.java
@@ -4,7 +4,6 @@ import com.github.binarywang.wxpay.bean.request.WxPayRefundRequest;
import com.github.binarywang.wxpay.bean.result.WxPayRefundResult;
import com.github.binarywang.wxpay.exception.WxPayException;
import com.github.binarywang.wxpay.service.WxPayService;
-import com.github.pagehelper.PageInfo;
import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
import org.linlinjava.litemall.core.notify.NotifyService;
@@ -54,14 +53,9 @@ public class AdminOrderService {
public Object list(Integer userId, String orderSn, List orderStatusArray,
Integer page, Integer limit, String sort, String order) {
- List orderList = orderService.querySelective(userId, orderSn, orderStatusArray, page, limit, sort, order);
- long total = PageInfo.of(orderList).getTotal();
-
- Map data = new HashMap<>();
- data.put("total", total);
- data.put("items", orderList);
-
- return ResponseUtil.ok(data);
+ List orderList = orderService.querySelective(userId, orderSn, orderStatusArray, page, limit,
+ sort, order);
+ return ResponseUtil.okList(orderList);
}
public Object detail(Integer id) {
@@ -126,11 +120,11 @@ public class AdminOrderService {
wxPayRefundRequest.setTotalFee(totalFee);
wxPayRefundRequest.setRefundFee(totalFee);
- WxPayRefundResult wxPayRefundResult = null;
+ WxPayRefundResult wxPayRefundResult;
try {
wxPayRefundResult = wxPayService.refund(wxPayRefundRequest);
} catch (WxPayException e) {
- e.printStackTrace();
+ logger.error(e.getMessage(), e);
return ResponseUtil.fail(ORDER_REFUND_FAILED, "订单退款失败");
}
if (!wxPayRefundResult.getReturnCode().equals("SUCCESS")) {
@@ -142,8 +136,15 @@ public class AdminOrderService {
return ResponseUtil.fail(ORDER_REFUND_FAILED, "订单退款失败");
}
+ LocalDateTime now = LocalDateTime.now();
// 设置订单取消状态
order.setOrderStatus(OrderUtil.STATUS_REFUND_CONFIRM);
+ order.setEndTime(now);
+ // 记录订单退款相关信息
+ order.setRefundAmount(order.getActualPrice());
+ order.setRefundType("微信退款接口");
+ order.setRefundContent(wxPayRefundResult.getRefundId());
+ order.setRefundTime(now);
if (orderService.updateWithOptimisticLocker(order) == 0) {
throw new RuntimeException("更新数据已失效");
}
@@ -161,7 +162,8 @@ public class AdminOrderService {
//TODO 发送邮件和短信通知,这里采用异步发送
// 退款成功通知用户, 例如“您申请的订单退款 [ 单号:{1} ] 已成功,请耐心等待到账。”
// 注意订单号只发后6位
- notifyService.notifySmsTemplate(order.getMobile(), NotifyType.REFUND, new String[]{order.getOrderSn().substring(8, 14)});
+ notifyService.notifySmsTemplate(order.getMobile(), NotifyType.REFUND,
+ new String[]{order.getOrderSn().substring(8, 14)});
logHelper.logOrderSucceed("退款", "订单编号 " + orderId);
return ResponseUtil.ok();
diff --git a/litemall-admin-api/src/main/java/org/linlinjava/litemall/admin/service/LogHelper.java b/litemall-admin-api/src/main/java/org/linlinjava/litemall/admin/service/LogHelper.java
index 445cc29f..70e5d58c 100644
--- a/litemall-admin-api/src/main/java/org/linlinjava/litemall/admin/service/LogHelper.java
+++ b/litemall-admin-api/src/main/java/org/linlinjava/litemall/admin/service/LogHelper.java
@@ -19,87 +19,86 @@ import javax.servlet.http.HttpServletRequest;
* 安全日志:用户安全相关的操作日志,例如登录、删除管理员
* 订单日志:用户交易相关的操作日志,例如订单发货、退款
* 其他日志:如果以上三种不合适,可以选择其他日志,建议是优先级最低的日志级别
- *
+ *
* 当然可能很多操作是不需要记录到数据库的,例如编辑商品、编辑广告品之类。
*/
@Component
public class LogHelper {
- public final static Integer LOG_TYPE_GENERAL = 0;
- public final static Integer LOG_TYPE_AUTH = 1;
- public final static Integer LOG_TYPE_ORDER = 2;
- public final static Integer LOG_TYPE_OTHER = 3;
+ public static final Integer LOG_TYPE_GENERAL = 0;
+ public static final Integer LOG_TYPE_AUTH = 1;
+ public static final Integer LOG_TYPE_ORDER = 2;
+ public static final Integer LOG_TYPE_OTHER = 3;
@Autowired
private LitemallLogService logService;
- public void logGeneralSucceed(String action){
+ public void logGeneralSucceed(String action) {
logAdmin(LOG_TYPE_GENERAL, action, true, "", "");
}
- public void logGeneralSucceed(String action, String result){
+ public void logGeneralSucceed(String action, String result) {
logAdmin(LOG_TYPE_GENERAL, action, true, result, "");
}
- public void logGeneralFail(String action, String error){
+ public void logGeneralFail(String action, String error) {
logAdmin(LOG_TYPE_GENERAL, action, false, error, "");
}
- public void logAuthSucceed(String action){
+ public void logAuthSucceed(String action) {
logAdmin(LOG_TYPE_AUTH, action, true, "", "");
}
- public void logAuthSucceed(String action, String result){
+ public void logAuthSucceed(String action, String result) {
logAdmin(LOG_TYPE_AUTH, action, true, result, "");
}
- public void logAuthFail(String action, String error){
+ public void logAuthFail(String action, String error) {
logAdmin(LOG_TYPE_AUTH, action, false, error, "");
}
- public void logOrderSucceed(String action){
+ public void logOrderSucceed(String action) {
logAdmin(LOG_TYPE_ORDER, action, true, "", "");
}
- public void logOrderSucceed(String action, String result){
+ public void logOrderSucceed(String action, String result) {
logAdmin(LOG_TYPE_ORDER, action, true, result, "");
}
- public void logOrderFail(String action, String error){
+ public void logOrderFail(String action, String error) {
logAdmin(LOG_TYPE_ORDER, action, false, error, "");
}
- public void logOtherSucceed(String action){
+ public void logOtherSucceed(String action) {
logAdmin(LOG_TYPE_OTHER, action, true, "", "");
}
- public void logOtherSucceed(String action, String result){
+ public void logOtherSucceed(String action, String result) {
logAdmin(LOG_TYPE_OTHER, action, true, result, "");
}
- public void logOtherFail(String action, String error){
+ public void logOtherFail(String action, String error) {
logAdmin(LOG_TYPE_OTHER, action, false, error, "");
}
- public void logAdmin (Integer type, String action, Boolean succeed, String result, String comment){
+ public void logAdmin(Integer type, String action, Boolean succeed, String result, String comment) {
LitemallLog log = new LitemallLog();
Subject currentUser = SecurityUtils.getSubject();
- if(currentUser != null) {
+ if (currentUser != null) {
LitemallAdmin admin = (LitemallAdmin) currentUser.getPrincipal();
- if(admin != null) {
+ if (admin != null) {
log.setAdmin(admin.getUsername());
- }
- else{
+ } else {
log.setAdmin("匿名用户");
}
- }
- else{
+ } else {
log.setAdmin("匿名用户");
}
- HttpServletRequest request = ((ServletRequestAttributes) RequestContextHolder.getRequestAttributes()).getRequest();
- if(request != null) {
+ HttpServletRequest request =
+ ((ServletRequestAttributes) RequestContextHolder.getRequestAttributes()).getRequest();
+ if (request != null) {
log.setIp(IpUtil.getIpAddr(request));
}
diff --git a/litemall-admin-api/src/main/java/org/linlinjava/litemall/admin/shiro/AdminAuthorizingRealm.java b/litemall-admin-api/src/main/java/org/linlinjava/litemall/admin/shiro/AdminAuthorizingRealm.java
index 0c1654bd..505f3ec4 100644
--- a/litemall-admin-api/src/main/java/org/linlinjava/litemall/admin/shiro/AdminAuthorizingRealm.java
+++ b/litemall-admin-api/src/main/java/org/linlinjava/litemall/admin/shiro/AdminAuthorizingRealm.java
@@ -12,8 +12,6 @@ import org.linlinjava.litemall.db.domain.LitemallAdmin;
import org.linlinjava.litemall.db.service.LitemallAdminService;
import org.linlinjava.litemall.db.service.LitemallPermissionService;
import org.linlinjava.litemall.db.service.LitemallRoleService;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.util.Assert;
import org.springframework.util.StringUtils;
@@ -23,7 +21,6 @@ import java.util.Set;
public class AdminAuthorizingRealm extends AuthorizingRealm {
- private static final Logger log = LoggerFactory.getLogger(AdminAuthorizingRealm.class);
@Autowired
private LitemallAdminService adminService;
@Autowired
@@ -52,7 +49,7 @@ public class AdminAuthorizingRealm extends AuthorizingRealm {
UsernamePasswordToken upToken = (UsernamePasswordToken) token;
String username = upToken.getUsername();
- String password=new String(upToken.getPassword());
+ String password = new String(upToken.getPassword());
if (StringUtils.isEmpty(username)) {
throw new AccountException("用户名不能为空");
@@ -64,16 +61,16 @@ public class AdminAuthorizingRealm extends AuthorizingRealm {
List adminList = adminService.findAdmin(username);
Assert.state(adminList.size() < 2, "同一个用户名存在两个账户");
if (adminList.size() == 0) {
- throw new UnknownAccountException("找不到用户("+username+")的帐号信息");
+ throw new UnknownAccountException("找不到用户(" + username + ")的帐号信息");
}
LitemallAdmin admin = adminList.get(0);
BCryptPasswordEncoder encoder = new BCryptPasswordEncoder();
if (!encoder.matches(password, admin.getPassword())) {
- throw new UnknownAccountException("找不到用户("+username+")的帐号信息");
+ throw new UnknownAccountException("找不到用户(" + username + ")的帐号信息");
}
- return new SimpleAuthenticationInfo(admin,password,getName());
+ return new SimpleAuthenticationInfo(admin, password, getName());
}
}
diff --git a/litemall-admin-api/src/main/java/org/linlinjava/litemall/admin/shiro/AdminWebSessionManager.java b/litemall-admin-api/src/main/java/org/linlinjava/litemall/admin/shiro/AdminWebSessionManager.java
index 46cfdcbb..e2795bbb 100644
--- a/litemall-admin-api/src/main/java/org/linlinjava/litemall/admin/shiro/AdminWebSessionManager.java
+++ b/litemall-admin-api/src/main/java/org/linlinjava/litemall/admin/shiro/AdminWebSessionManager.java
@@ -17,13 +17,13 @@ public class AdminWebSessionManager extends DefaultWebSessionManager {
@Override
protected Serializable getSessionId(ServletRequest request, ServletResponse response) {
String id = WebUtils.toHttp(request).getHeader(LOGIN_TOKEN_KEY);
- if (!StringUtils.isEmpty(id)) {
+ if (!StringUtils.isEmpty(id)) {
request.setAttribute(ShiroHttpServletRequest.REFERENCED_SESSION_ID_SOURCE, REFERENCED_SESSION_ID_SOURCE);
request.setAttribute(ShiroHttpServletRequest.REFERENCED_SESSION_ID, id);
request.setAttribute(ShiroHttpServletRequest.REFERENCED_SESSION_ID_IS_VALID, Boolean.TRUE);
return id;
- } else {
- return super.getSessionId(request, response);
- }
+ } else {
+ return super.getSessionId(request, response);
+ }
}
}
diff --git a/litemall-admin-api/src/main/java/org/linlinjava/litemall/admin/task/AdminTaskStartupRunner.java b/litemall-admin-api/src/main/java/org/linlinjava/litemall/admin/task/AdminTaskStartupRunner.java
new file mode 100644
index 00000000..2a033942
--- /dev/null
+++ b/litemall-admin-api/src/main/java/org/linlinjava/litemall/admin/task/AdminTaskStartupRunner.java
@@ -0,0 +1,41 @@
+package org.linlinjava.litemall.admin.task;
+
+import org.linlinjava.litemall.core.task.TaskService;
+import org.linlinjava.litemall.db.domain.LitemallGrouponRules;
+import org.linlinjava.litemall.db.service.LitemallGrouponRulesService;
+import org.linlinjava.litemall.db.util.GrouponConstant;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.boot.ApplicationArguments;
+import org.springframework.boot.ApplicationRunner;
+import org.springframework.stereotype.Component;
+
+import java.time.LocalDateTime;
+import java.time.temporal.ChronoUnit;
+import java.util.List;
+
+@Component
+public class AdminTaskStartupRunner implements ApplicationRunner {
+
+ @Autowired
+ private LitemallGrouponRulesService rulesService;
+ @Autowired
+ private TaskService taskService;
+
+ @Override
+ public void run(ApplicationArguments args) throws Exception {
+ List grouponRulesList = rulesService.queryByStatus(GrouponConstant.RULE_STATUS_ON);
+ for(LitemallGrouponRules grouponRules : grouponRulesList){
+ LocalDateTime now = LocalDateTime.now();
+ LocalDateTime expire = grouponRules.getExpireTime();
+ if(expire.isBefore(now)) {
+ // 已经过期,则加入延迟队列
+ taskService.addTask(new GrouponRuleExpiredTask(grouponRules.getId(), 0));
+ }
+ else{
+ // 还没过期,则加入延迟队列
+ long delay = ChronoUnit.MILLIS.between(now, expire);
+ taskService.addTask(new GrouponRuleExpiredTask(grouponRules.getId(), delay));
+ }
+ }
+ }
+}
\ No newline at end of file
diff --git a/litemall-admin-api/src/main/java/org/linlinjava/litemall/admin/task/GrouponRuleExpiredTask.java b/litemall-admin-api/src/main/java/org/linlinjava/litemall/admin/task/GrouponRuleExpiredTask.java
new file mode 100644
index 00000000..8d0f72f6
--- /dev/null
+++ b/litemall-admin-api/src/main/java/org/linlinjava/litemall/admin/task/GrouponRuleExpiredTask.java
@@ -0,0 +1,68 @@
+package org.linlinjava.litemall.admin.task;
+
+import org.apache.commons.logging.Log;
+import org.apache.commons.logging.LogFactory;
+import org.linlinjava.litemall.core.task.Task;
+import org.linlinjava.litemall.core.util.BeanUtil;
+import org.linlinjava.litemall.db.domain.LitemallGroupon;
+import org.linlinjava.litemall.db.domain.LitemallGrouponRules;
+import org.linlinjava.litemall.db.domain.LitemallOrder;
+import org.linlinjava.litemall.db.service.*;
+import org.linlinjava.litemall.db.util.GrouponConstant;
+import org.linlinjava.litemall.db.util.OrderUtil;
+
+import java.util.List;
+
+public class GrouponRuleExpiredTask extends Task {
+ private final Log logger = LogFactory.getLog(GrouponRuleExpiredTask.class);
+ private int grouponRuleId = -1;
+
+ public GrouponRuleExpiredTask(Integer grouponRuleId, long delayInMilliseconds){
+ super("GrouponRuleExpiredTask-" + grouponRuleId, delayInMilliseconds);
+ this.grouponRuleId = grouponRuleId;
+ }
+
+ @Override
+ public void run() {
+ logger.info("系统开始处理延时任务---团购规则过期---" + this.grouponRuleId);
+
+ LitemallOrderService orderService = BeanUtil.getBean(LitemallOrderService.class);
+ LitemallGrouponService grouponService = BeanUtil.getBean(LitemallGrouponService.class);
+ LitemallGrouponRulesService grouponRulesService = BeanUtil.getBean(LitemallGrouponRulesService.class);
+
+ LitemallGrouponRules grouponRules = grouponRulesService.findById(grouponRuleId);
+ if(grouponRules == null){
+ return;
+ }
+ if(!grouponRules.getStatus().equals(GrouponConstant.RULE_STATUS_ON)){
+ return;
+ }
+
+ // 团购活动取消
+ grouponRules.setStatus(GrouponConstant.RULE_STATUS_DOWN_EXPIRE);
+ grouponRulesService.updateById(grouponRules);
+
+ List grouponList = grouponService.queryByRuleId(grouponRuleId);
+ // 用户团购处理
+ for(LitemallGroupon groupon : grouponList){
+ Short status = groupon.getStatus();
+ LitemallOrder order = orderService.findById(groupon.getOrderId());
+ if(status.equals(GrouponConstant.STATUS_NONE)){
+ groupon.setStatus(GrouponConstant.STATUS_FAIL);
+ grouponService.updateById(groupon);
+ }
+ else if(status.equals(GrouponConstant.STATUS_ON)){
+ // 如果团购进行中
+ // (1) 团购设置团购失败等待退款状态
+ groupon.setStatus(GrouponConstant.STATUS_FAIL);
+ grouponService.updateById(groupon);
+ // (2) 团购订单申请退款
+ if(OrderUtil.isPayStatus(order)) {
+ order.setOrderStatus(OrderUtil.STATUS_REFUND);
+ orderService.updateWithOptimisticLocker(order);
+ }
+ }
+ }
+ logger.info("系统结束处理延时任务---团购规则过期---" + this.grouponRuleId);
+ }
+}
diff --git a/litemall-admin-api/src/main/java/org/linlinjava/litemall/admin/util/AdminResponseCode.java b/litemall-admin-api/src/main/java/org/linlinjava/litemall/admin/util/AdminResponseCode.java
index f096a295..327df024 100644
--- a/litemall-admin-api/src/main/java/org/linlinjava/litemall/admin/util/AdminResponseCode.java
+++ b/litemall-admin-api/src/main/java/org/linlinjava/litemall/admin/util/AdminResponseCode.java
@@ -20,5 +20,8 @@ public class AdminResponseCode {
public static final Integer ROLE_NAME_EXIST = 640;
public static final Integer ROLE_SUPER_SUPERMISSION = 641;
public static final Integer ROLE_USER_EXIST = 642;
+ public static final Integer GROUPON_GOODS_UNKNOWN = 650;
+ public static final Integer GROUPON_GOODS_EXISTED = 651;
+ public static final Integer GROUPON_GOODS_OFFLINE = 652;
}
diff --git a/litemall-admin-api/src/main/java/org/linlinjava/litemall/admin/util/Permission.java b/litemall-admin-api/src/main/java/org/linlinjava/litemall/admin/util/Permission.java
index 5a425165..8960c10b 100644
--- a/litemall-admin-api/src/main/java/org/linlinjava/litemall/admin/util/Permission.java
+++ b/litemall-admin-api/src/main/java/org/linlinjava/litemall/admin/util/Permission.java
@@ -2,7 +2,6 @@ package org.linlinjava.litemall.admin.util;
import org.apache.shiro.authz.annotation.RequiresPermissions;
import org.linlinjava.litemall.admin.annotation.RequiresPermissionsDesc;
-import org.springframework.web.bind.annotation.RequestMapping;
public class Permission {
private RequiresPermissions requiresPermissions;
diff --git a/litemall-admin-api/src/main/java/org/linlinjava/litemall/admin/util/PermissionUtil.java b/litemall-admin-api/src/main/java/org/linlinjava/litemall/admin/util/PermissionUtil.java
index 4c9991ac..7b6a0c2a 100644
--- a/litemall-admin-api/src/main/java/org/linlinjava/litemall/admin/util/PermissionUtil.java
+++ b/litemall-admin-api/src/main/java/org/linlinjava/litemall/admin/util/PermissionUtil.java
@@ -74,8 +74,7 @@ public class PermissionUtil {
leftPerm.setLabel(requiresPermissionsDesc.button());
leftPerm.setApi(api);
perm2.getChildren().add(leftPerm);
- }
- else{
+ } else {
// TODO
// 目前限制Controller里面每个方法的RequiresPermissionsDesc注解是唯一的
// 如果允许相同,可能会造成内部权限不一致。
@@ -100,8 +99,10 @@ public class PermissionUtil {
RequestMapping clazzRequestMapping = AnnotationUtils.findAnnotation(controllerClz, RequestMapping.class);
List methods = MethodUtils.getMethodsListWithAnnotation(controllerClz, RequiresPermissions.class);
for (Method method : methods) {
- RequiresPermissions requiresPermissions = AnnotationUtils.getAnnotation(method, RequiresPermissions.class);
- RequiresPermissionsDesc requiresPermissionsDesc = AnnotationUtils.getAnnotation(method, RequiresPermissionsDesc.class);
+ RequiresPermissions requiresPermissions = AnnotationUtils.getAnnotation(method,
+ RequiresPermissions.class);
+ RequiresPermissionsDesc requiresPermissionsDesc = AnnotationUtils.getAnnotation(method,
+ RequiresPermissionsDesc.class);
if (requiresPermissions == null || requiresPermissionsDesc == null) {
continue;
@@ -143,7 +144,7 @@ public class PermissionUtil {
public static Set listPermissionString(List permissions) {
Set permissionsString = new HashSet<>();
- for(Permission permission : permissions){
+ for (Permission permission : permissions) {
permissionsString.add(permission.getRequiresPermissions().value()[0]);
}
return permissionsString;
diff --git a/litemall-admin-api/src/main/java/org/linlinjava/litemall/admin/web/AdminAdController.java b/litemall-admin-api/src/main/java/org/linlinjava/litemall/admin/web/AdminAdController.java
index 6238f6cf..eaad1c4a 100644
--- a/litemall-admin-api/src/main/java/org/linlinjava/litemall/admin/web/AdminAdController.java
+++ b/litemall-admin-api/src/main/java/org/linlinjava/litemall/admin/web/AdminAdController.java
@@ -1,6 +1,5 @@
package org.linlinjava.litemall.admin.web;
-import com.github.pagehelper.PageInfo;
import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
import org.apache.shiro.authz.annotation.RequiresPermissions;
@@ -16,9 +15,7 @@ import org.springframework.validation.annotation.Validated;
import org.springframework.web.bind.annotation.*;
import javax.validation.constraints.NotNull;
-import java.util.HashMap;
import java.util.List;
-import java.util.Map;
@RestController
@RequestMapping("/admin/ad")
@@ -30,7 +27,7 @@ public class AdminAdController {
private LitemallAdService adService;
@RequiresPermissions("admin:ad:list")
- @RequiresPermissionsDesc(menu={"推广管理" , "广告管理"}, button="查询")
+ @RequiresPermissionsDesc(menu = {"推广管理", "广告管理"}, button = "查询")
@GetMapping("/list")
public Object list(String name, String content,
@RequestParam(defaultValue = "1") Integer page,
@@ -38,12 +35,7 @@ public class AdminAdController {
@Sort @RequestParam(defaultValue = "add_time") String sort,
@Order @RequestParam(defaultValue = "desc") String order) {
List adList = adService.querySelective(name, content, page, limit, sort, order);
- long total = PageInfo.of(adList).getTotal();
- Map data = new HashMap<>();
- data.put("total", total);
- data.put("items", adList);
-
- return ResponseUtil.ok(data);
+ return ResponseUtil.okList(adList);
}
private Object validate(LitemallAd ad) {
@@ -59,7 +51,7 @@ public class AdminAdController {
}
@RequiresPermissions("admin:ad:create")
- @RequiresPermissionsDesc(menu={"推广管理" , "广告管理"}, button="添加")
+ @RequiresPermissionsDesc(menu = {"推广管理", "广告管理"}, button = "添加")
@PostMapping("/create")
public Object create(@RequestBody LitemallAd ad) {
Object error = validate(ad);
@@ -71,15 +63,15 @@ public class AdminAdController {
}
@RequiresPermissions("admin:ad:read")
- @RequiresPermissionsDesc(menu={"推广管理" , "广告管理"}, button="详情")
+ @RequiresPermissionsDesc(menu = {"推广管理", "广告管理"}, button = "详情")
@GetMapping("/read")
public Object read(@NotNull Integer id) {
- LitemallAd brand = adService.findById(id);
- return ResponseUtil.ok(brand);
+ LitemallAd ad = adService.findById(id);
+ return ResponseUtil.ok(ad);
}
@RequiresPermissions("admin:ad:update")
- @RequiresPermissionsDesc(menu={"推广管理" , "广告管理"}, button="编辑")
+ @RequiresPermissionsDesc(menu = {"推广管理", "广告管理"}, button = "编辑")
@PostMapping("/update")
public Object update(@RequestBody LitemallAd ad) {
Object error = validate(ad);
@@ -94,7 +86,7 @@ public class AdminAdController {
}
@RequiresPermissions("admin:ad:delete")
- @RequiresPermissionsDesc(menu={"推广管理" , "广告管理"}, button="删除")
+ @RequiresPermissionsDesc(menu = {"推广管理", "广告管理"}, button = "删除")
@PostMapping("/delete")
public Object delete(@RequestBody LitemallAd ad) {
Integer id = ad.getId();
diff --git a/litemall-admin-api/src/main/java/org/linlinjava/litemall/admin/web/AdminAddressController.java b/litemall-admin-api/src/main/java/org/linlinjava/litemall/admin/web/AdminAddressController.java
index c6ace8d8..2a487c40 100644
--- a/litemall-admin-api/src/main/java/org/linlinjava/litemall/admin/web/AdminAddressController.java
+++ b/litemall-admin-api/src/main/java/org/linlinjava/litemall/admin/web/AdminAddressController.java
@@ -1,6 +1,5 @@
package org.linlinjava.litemall.admin.web;
-import com.github.pagehelper.PageInfo;
import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
import org.apache.shiro.authz.annotation.RequiresPermissions;
@@ -18,10 +17,7 @@ import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.RestController;
-import java.util.ArrayList;
-import java.util.HashMap;
import java.util.List;
-import java.util.Map;
@RestController
@RequestMapping("/admin/address")
@@ -35,7 +31,7 @@ public class AdminAddressController {
private LitemallRegionService regionService;
@RequiresPermissions("admin:address:list")
- @RequiresPermissionsDesc(menu={"用户管理" , "收货地址"}, button="查询")
+ @RequiresPermissionsDesc(menu = {"用户管理", "收货地址"}, button = "查询")
@GetMapping("/list")
public Object list(Integer userId, String name,
@RequestParam(defaultValue = "1") Integer page,
@@ -44,13 +40,6 @@ public class AdminAddressController {
@Order @RequestParam(defaultValue = "desc") String order) {
List addressList = addressService.querySelective(userId, name, page, limit, sort, order);
- long total = PageInfo.of(addressList).getTotal();
-
-
- Map data = new HashMap<>();
- data.put("total", total);
- data.put("items", addressList);
-
- return ResponseUtil.ok(data);
+ return ResponseUtil.okList(addressList);
}
}
diff --git a/litemall-admin-api/src/main/java/org/linlinjava/litemall/admin/web/AdminAdminController.java b/litemall-admin-api/src/main/java/org/linlinjava/litemall/admin/web/AdminAdminController.java
index f00cc6aa..a8bc1b2b 100644
--- a/litemall-admin-api/src/main/java/org/linlinjava/litemall/admin/web/AdminAdminController.java
+++ b/litemall-admin-api/src/main/java/org/linlinjava/litemall/admin/web/AdminAdminController.java
@@ -1,6 +1,5 @@
package org.linlinjava.litemall.admin.web;
-import com.github.pagehelper.PageInfo;
import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
import org.apache.shiro.SecurityUtils;
@@ -21,9 +20,7 @@ import org.springframework.validation.annotation.Validated;
import org.springframework.web.bind.annotation.*;
import javax.validation.constraints.NotNull;
-import java.util.HashMap;
import java.util.List;
-import java.util.Map;
import static org.linlinjava.litemall.admin.util.AdminResponseCode.*;
@@ -39,7 +36,7 @@ public class AdminAdminController {
private LogHelper logHelper;
@RequiresPermissions("admin:admin:list")
- @RequiresPermissionsDesc(menu={"系统管理" , "管理员管理"}, button="查询")
+ @RequiresPermissionsDesc(menu = {"系统管理", "管理员管理"}, button = "查询")
@GetMapping("/list")
public Object list(String username,
@RequestParam(defaultValue = "1") Integer page,
@@ -47,12 +44,7 @@ public class AdminAdminController {
@Sort @RequestParam(defaultValue = "add_time") String sort,
@Order @RequestParam(defaultValue = "desc") String order) {
List adminList = adminService.querySelective(username, page, limit, sort, order);
- long total = PageInfo.of(adminList).getTotal();
- Map data = new HashMap<>();
- data.put("total", total);
- data.put("items", adminList);
-
- return ResponseUtil.ok(data);
+ return ResponseUtil.okList(adminList);
}
private Object validate(LitemallAdmin admin) {
@@ -71,7 +63,7 @@ public class AdminAdminController {
}
@RequiresPermissions("admin:admin:create")
- @RequiresPermissionsDesc(menu={"系统管理" , "管理员管理"}, button="添加")
+ @RequiresPermissionsDesc(menu = {"系统管理", "管理员管理"}, button = "添加")
@PostMapping("/create")
public Object create(@RequestBody LitemallAdmin admin) {
Object error = validate(admin);
@@ -95,7 +87,7 @@ public class AdminAdminController {
}
@RequiresPermissions("admin:admin:read")
- @RequiresPermissionsDesc(menu={"系统管理" , "管理员管理"}, button="详情")
+ @RequiresPermissionsDesc(menu = {"系统管理", "管理员管理"}, button = "详情")
@GetMapping("/read")
public Object read(@NotNull Integer id) {
LitemallAdmin admin = adminService.findById(id);
@@ -103,7 +95,7 @@ public class AdminAdminController {
}
@RequiresPermissions("admin:admin:update")
- @RequiresPermissionsDesc(menu={"系统管理" , "管理员管理"}, button="编辑")
+ @RequiresPermissionsDesc(menu = {"系统管理", "管理员管理"}, button = "编辑")
@PostMapping("/update")
public Object update(@RequestBody LitemallAdmin admin) {
Object error = validate(admin);
@@ -128,7 +120,7 @@ public class AdminAdminController {
}
@RequiresPermissions("admin:admin:delete")
- @RequiresPermissionsDesc(menu={"系统管理" , "管理员管理"}, button="删除")
+ @RequiresPermissionsDesc(menu = {"系统管理", "管理员管理"}, button = "删除")
@PostMapping("/delete")
public Object delete(@RequestBody LitemallAdmin admin) {
Integer anotherAdminId = admin.getId();
diff --git a/litemall-admin-api/src/main/java/org/linlinjava/litemall/admin/web/AdminAuthController.java b/litemall-admin-api/src/main/java/org/linlinjava/litemall/admin/web/AdminAuthController.java
index f1ce0541..59becab5 100644
--- a/litemall-admin-api/src/main/java/org/linlinjava/litemall/admin/web/AdminAuthController.java
+++ b/litemall-admin-api/src/main/java/org/linlinjava/litemall/admin/web/AdminAuthController.java
@@ -16,9 +16,7 @@ import org.linlinjava.litemall.core.util.IpUtil;
import org.linlinjava.litemall.core.util.JacksonUtil;
import org.linlinjava.litemall.core.util.ResponseUtil;
import org.linlinjava.litemall.db.domain.LitemallAdmin;
-import org.linlinjava.litemall.db.domain.LitemallLog;
import org.linlinjava.litemall.db.service.LitemallAdminService;
-import org.linlinjava.litemall.db.service.LitemallLogService;
import org.linlinjava.litemall.db.service.LitemallPermissionService;
import org.linlinjava.litemall.db.service.LitemallRoleService;
import org.springframework.beans.factory.annotation.Autowired;
@@ -82,7 +80,16 @@ public class AdminAuthController {
adminService.updateById(admin);
logHelper.logAuthSucceed("登录");
- return ResponseUtil.ok(currentUser.getSession().getId());
+
+ // userInfo
+ Map adminInfo = new HashMap();
+ adminInfo.put("nickName", admin.getUsername());
+ adminInfo.put("avatar", admin.getAvatar());
+
+ Map