From 5920f9b1cb2c696a7809bfddc2ea3086954ea371 Mon Sep 17 00:00:00 2001 From: Junling Bu Date: Wed, 26 Sep 2018 17:12:16 +0800 Subject: [PATCH] =?UTF-8?q?=E9=87=87=E7=94=A8=E4=B9=90=E8=A7=82=E9=94=81?= =?UTF-8?q?=E6=9B=B4=E6=96=B0=E6=95=B0=E6=8D=AE=EF=BC=8C=E9=9C=80=E8=A6=81?= =?UTF-8?q?=E5=A4=84=E7=90=86=E6=9B=B4=E6=96=B0=E5=A4=B1=E8=B4=A5=E7=9A=84?= =?UTF-8?q?=E6=83=85=E5=86=B5=E3=80=82?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../litemall/admin/web/AdminAdController.java | 6 +- .../admin/web/AdminAdminController.java | 5 +- .../admin/web/AdminBrandController.java | 4 +- .../admin/web/AdminCategoryController.java | 4 +- .../admin/web/AdminGoodsController.java | 12 +- .../admin/web/AdminGrouponController.java | 4 +- .../admin/web/AdminIssueController.java | 5 +- .../admin/web/AdminKeywordController.java | 4 +- .../admin/web/AdminOrderController.java | 43 ++-- .../admin/web/AdminStorageController.java | 4 +- .../admin/web/AdminTopicController.java | 4 +- .../admin/web/AdminUserController.java | 4 +- .../core/notify/WxTemplateSender.java | 14 +- .../litemall/core/util/ResponseUtil.java | 7 +- .../db/service/LitemallAddressService.java | 2 +- .../db/service/LitemallCartService.java | 2 +- .../service/LitemallGrouponRulesService.java | 6 +- .../db/service/LitemallGrouponService.java | 2 +- .../db/service/LitemallOrderService.java | 8 +- .../db/service/LitemallUserFormIdService.java | 6 +- .../db/service/LitemallUserService.java | 2 +- .../litemall/wx/web/WxAddressController.java | 4 +- .../litemall/wx/web/WxAuthController.java | 12 +- .../litemall/wx/web/WxCartController.java | 12 +- .../litemall/wx/web/WxOrderController.java | 189 +++++++++++------- .../litemall/wx/web/WxSearchController.java | 57 +++--- 26 files changed, 256 insertions(+), 166 deletions(-) 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 a36af86b..4b09557e 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 @@ -72,7 +72,11 @@ public class AdminAdController { if(adminId == null){ return ResponseUtil.unlogin(); } - adService.updateById(ad); + + if(adService.updateById(ad) == 0){ + return ResponseUtil.updatedDateExpired(); + } + return ResponseUtil.ok(ad); } 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 cc8544d6..b340035b 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 @@ -124,7 +124,10 @@ public class AdminAdminController { String encodedPassword = encoder.encode(rawPassword); admin.setPassword(encodedPassword); - adminService.updateById(admin); + if(adminService.updateById(admin) == 0){ + return ResponseUtil.updatedDateExpired(); + } + return ResponseUtil.ok(admin); } diff --git a/litemall-admin-api/src/main/java/org/linlinjava/litemall/admin/web/AdminBrandController.java b/litemall-admin-api/src/main/java/org/linlinjava/litemall/admin/web/AdminBrandController.java index 9559ea31..42b2f20d 100644 --- a/litemall-admin-api/src/main/java/org/linlinjava/litemall/admin/web/AdminBrandController.java +++ b/litemall-admin-api/src/main/java/org/linlinjava/litemall/admin/web/AdminBrandController.java @@ -72,7 +72,9 @@ public class AdminBrandController { if(adminId == null){ return ResponseUtil.unlogin(); } - brandService.updateById(brand); + if(brandService.updateById(brand) == 0){ + return ResponseUtil.updatedDateExpired(); + } return ResponseUtil.ok(brand); } diff --git a/litemall-admin-api/src/main/java/org/linlinjava/litemall/admin/web/AdminCategoryController.java b/litemall-admin-api/src/main/java/org/linlinjava/litemall/admin/web/AdminCategoryController.java index 7ec42977..a8da9e53 100644 --- a/litemall-admin-api/src/main/java/org/linlinjava/litemall/admin/web/AdminCategoryController.java +++ b/litemall-admin-api/src/main/java/org/linlinjava/litemall/admin/web/AdminCategoryController.java @@ -74,7 +74,9 @@ public class AdminCategoryController { if(adminId == null){ return ResponseUtil.unlogin(); } - categoryService.updateById(category); + if(categoryService.updateById(category) == 0){ + return ResponseUtil.updatedDateExpired(); + } return ResponseUtil.ok(); } diff --git a/litemall-admin-api/src/main/java/org/linlinjava/litemall/admin/web/AdminGoodsController.java b/litemall-admin-api/src/main/java/org/linlinjava/litemall/admin/web/AdminGoodsController.java index ff599373..e69d6ce5 100644 --- a/litemall-admin-api/src/main/java/org/linlinjava/litemall/admin/web/AdminGoodsController.java +++ b/litemall-admin-api/src/main/java/org/linlinjava/litemall/admin/web/AdminGoodsController.java @@ -101,7 +101,9 @@ public class AdminGoodsController { goods.setShareUrl(url); // 商品基本信息表litemall_goods - goodsService.updateById(goods); + if(goodsService.updateById(goods) == 0){ + throw new Exception("跟新数据已失效"); + } Integer gid = goods.getId(); specificationService.deleteByGid(gid); @@ -109,12 +111,10 @@ public class AdminGoodsController { productService.deleteByGid(gid); // 商品规格表litemall_goods_specification - Map specIds = new HashMap<>(); for (LitemallGoodsSpecification specification : specifications) { specification.setGoodsId(goods.getId()); specification.setAddTime(LocalDateTime.now()); specificationService.add(specification); - specIds.put(specification.getValue(), specification.getId()); } // 商品参数表litemall_goods_attribute @@ -196,15 +196,15 @@ public class AdminGoodsController { //将生成的分享图片地址写入数据库 String url = qCodeService.createGoodShareImage(goods.getId().toString(), goods.getPicUrl(), goods.getName()); goods.setShareUrl(url); - goodsService.updateById(goods); + if(goodsService.updateById(goods) == 0){ + throw new Exception("跟新数据已失效"); + } // 商品规格表litemall_goods_specification - Map specIds = new HashMap<>(); for (LitemallGoodsSpecification specification : specifications) { specification.setGoodsId(goods.getId()); specification.setAddTime(LocalDateTime.now()); specificationService.add(specification); - specIds.put(specification.getValue(), specification.getId()); } // 商品参数表litemall_goods_attribute diff --git a/litemall-admin-api/src/main/java/org/linlinjava/litemall/admin/web/AdminGrouponController.java b/litemall-admin-api/src/main/java/org/linlinjava/litemall/admin/web/AdminGrouponController.java index d367d666..5f7f9db7 100644 --- a/litemall-admin-api/src/main/java/org/linlinjava/litemall/admin/web/AdminGrouponController.java +++ b/litemall-admin-api/src/main/java/org/linlinjava/litemall/admin/web/AdminGrouponController.java @@ -126,7 +126,9 @@ public class AdminGrouponController { grouponRules.setExpireTime(expireTime); grouponRules.setPicUrl(goods.getPicUrl()); - rulesService.update(grouponRules); + if(rulesService.updateById(grouponRules) == 0){ + return ResponseUtil.updatedDateExpired(); + } return ResponseUtil.ok(); } diff --git a/litemall-admin-api/src/main/java/org/linlinjava/litemall/admin/web/AdminIssueController.java b/litemall-admin-api/src/main/java/org/linlinjava/litemall/admin/web/AdminIssueController.java index 32f0afd9..9e7beaa2 100644 --- a/litemall-admin-api/src/main/java/org/linlinjava/litemall/admin/web/AdminIssueController.java +++ b/litemall-admin-api/src/main/java/org/linlinjava/litemall/admin/web/AdminIssueController.java @@ -72,7 +72,10 @@ public class AdminIssueController { if(adminId == null){ return ResponseUtil.unlogin(); } - issueService.updateById(issue); + if(issueService.updateById(issue) == 0){ + return ResponseUtil.updatedDateExpired(); + } + return ResponseUtil.ok(issue); } diff --git a/litemall-admin-api/src/main/java/org/linlinjava/litemall/admin/web/AdminKeywordController.java b/litemall-admin-api/src/main/java/org/linlinjava/litemall/admin/web/AdminKeywordController.java index 270e6bac..b3b68752 100644 --- a/litemall-admin-api/src/main/java/org/linlinjava/litemall/admin/web/AdminKeywordController.java +++ b/litemall-admin-api/src/main/java/org/linlinjava/litemall/admin/web/AdminKeywordController.java @@ -72,7 +72,9 @@ public class AdminKeywordController { if(adminId == null){ return ResponseUtil.unlogin(); } - keywordService.updateById(keywords); + if(keywordService.updateById(keywords) == 0){ + return ResponseUtil.updatedDateExpired(); + } return ResponseUtil.ok(keywords); } diff --git a/litemall-admin-api/src/main/java/org/linlinjava/litemall/admin/web/AdminOrderController.java b/litemall-admin-api/src/main/java/org/linlinjava/litemall/admin/web/AdminOrderController.java index 62a68d24..91c36010 100644 --- a/litemall-admin-api/src/main/java/org/linlinjava/litemall/admin/web/AdminOrderController.java +++ b/litemall-admin-api/src/main/java/org/linlinjava/litemall/admin/web/AdminOrderController.java @@ -134,7 +134,9 @@ public class AdminOrderController { try { // 设置订单取消状态 order.setOrderStatus(OrderUtil.STATUS_REFUND_CONFIRM); - orderService.updateById(order); + if(orderService.updateById(order) == 0) { + throw new Exception("跟新数据已失效"); + } // 商品货品数量增加 List orderGoodsList = orderGoodsService.queryByOid(orderId); @@ -143,7 +145,9 @@ public class AdminOrderController { LitemallProduct product = productService.findById(productId); Integer number = product.getNumber() + orderGoods.getNumber(); product.setNumber(number); - productService.updateById(product); + if(productService.updateById(product) == 0){ + throw new Exception("跟新数据已失效"); + } } } catch (Exception ex) { txManager.rollback(status); @@ -204,15 +208,13 @@ public class AdminOrderController { order.setShipSn(shipSn); order.setShipChannel(shipChannel); order.setShipTime(LocalDateTime.now()); - orderService.updateById(order); + if(orderService.updateById(order) == 0){ + return ResponseUtil.updatedDateExpired(); + } //TODO 发送邮件和短信通知,这里采用异步发送 - // 发货会发送通知短信给用户 - /** - * - * 您的订单已经发货,快递公司 {1},快递单 {2} ,请注意查收 - * - */ + // 发货会发送通知短信给用户: * + // "您的订单已经发货,快递公司 {1},快递单 {2} ,请注意查收" notifyService.notifySmsTemplate(order.getMobile(), NotifyType.SHIP, new String[]{shipChannel, shipSn}); return ResponseUtil.ok(); @@ -230,7 +232,7 @@ public class AdminOrderController { */ @Scheduled(fixedDelay = 30 * 60 * 1000) public void checkOrderUnpaid() { - logger.debug(LocalDateTime.now()); + logger.info("系统开启任务检查订单是否已经超期自动取消订单"); List orderList = orderService.queryUnpaid(); for (LitemallOrder order : orderList) { @@ -249,7 +251,9 @@ public class AdminOrderController { // 设置订单已取消状态 order.setOrderStatus(OrderUtil.STATUS_AUTO_CANCEL); order.setEndTime(LocalDateTime.now()); - orderService.updateById(order); + if(orderService.updateById(order) == 0){ + throw new Exception("跟新数据已失效"); + } // 商品货品数量增加 Integer orderId = order.getId(); @@ -259,13 +263,17 @@ public class AdminOrderController { LitemallProduct product = productService.findById(productId); Integer number = product.getNumber() + orderGoods.getNumber(); product.setNumber(number); - productService.updateById(product); + if(productService.updateById(product) == 0){ + throw new Exception("跟新数据已失效"); + } } } catch (Exception ex) { txManager.rollback(status); - logger.error("系统内部错误", ex); + logger.info("订单 ID=" + order.getId() + " 数据已经更新,放弃自动确认收货"); + return; } txManager.commit(status); + logger.info("订单 ID=" + order.getId() + " 已经超期自动取消订单"); } } @@ -288,7 +296,7 @@ public class AdminOrderController { */ @Scheduled(cron = "0 0 3 * * ?") public void checkOrderUnconfirm() { - logger.debug(LocalDateTime.now()); + logger.info("系统开启任务检查订单是否已经超期自动确认收货"); List orderList = orderService.queryUnconfirm(); for (LitemallOrder order : orderList) { @@ -301,7 +309,12 @@ public class AdminOrderController { // 设置订单已取消状态 order.setOrderStatus(OrderUtil.STATUS_AUTO_CONFIRM); order.setConfirmTime(now); - orderService.updateById(order); + if(orderService.updateById(order) == 0){ + logger.info("订单 ID=" + order.getId() + " 数据已经更新,放弃自动确认收货"); + } + else{ + logger.info("订单 ID=" + order.getId() + " 已经超期自动确认收货"); + } } } } diff --git a/litemall-admin-api/src/main/java/org/linlinjava/litemall/admin/web/AdminStorageController.java b/litemall-admin-api/src/main/java/org/linlinjava/litemall/admin/web/AdminStorageController.java index 72d82889..8ff62656 100644 --- a/litemall-admin-api/src/main/java/org/linlinjava/litemall/admin/web/AdminStorageController.java +++ b/litemall-admin-api/src/main/java/org/linlinjava/litemall/admin/web/AdminStorageController.java @@ -73,7 +73,9 @@ public class AdminStorageController { if (adminId == null) { return ResponseUtil.unlogin(); } - litemallStorageService.update(litemallStorage); + if(litemallStorageService.update(litemallStorage) == 0){ + return ResponseUtil.updatedDateExpired(); + } return ResponseUtil.ok(litemallStorage); } diff --git a/litemall-admin-api/src/main/java/org/linlinjava/litemall/admin/web/AdminTopicController.java b/litemall-admin-api/src/main/java/org/linlinjava/litemall/admin/web/AdminTopicController.java index 5e20cf25..123712cb 100644 --- a/litemall-admin-api/src/main/java/org/linlinjava/litemall/admin/web/AdminTopicController.java +++ b/litemall-admin-api/src/main/java/org/linlinjava/litemall/admin/web/AdminTopicController.java @@ -72,7 +72,9 @@ public class AdminTopicController { if(adminId == null){ return ResponseUtil.unlogin(); } - topicService.updateById(topic); + if(topicService.updateById(topic) == 0){ + return ResponseUtil.updatedDateExpired(); + } return ResponseUtil.ok(topic); } diff --git a/litemall-admin-api/src/main/java/org/linlinjava/litemall/admin/web/AdminUserController.java b/litemall-admin-api/src/main/java/org/linlinjava/litemall/admin/web/AdminUserController.java index 527615ab..6100d966 100644 --- a/litemall-admin-api/src/main/java/org/linlinjava/litemall/admin/web/AdminUserController.java +++ b/litemall-admin-api/src/main/java/org/linlinjava/litemall/admin/web/AdminUserController.java @@ -100,7 +100,9 @@ public class AdminUserController { String encodedPassword = encoder.encode(password); user.setPassword(encodedPassword); - userService.update(user); + if(userService.updateById(user) == 0){ + return ResponseUtil.updatedDateExpired(); + } return ResponseUtil.ok(user); } } diff --git a/litemall-core/src/main/java/org/linlinjava/litemall/core/notify/WxTemplateSender.java b/litemall-core/src/main/java/org/linlinjava/litemall/core/notify/WxTemplateSender.java index e8dd998d..3d1b0149 100644 --- a/litemall-core/src/main/java/org/linlinjava/litemall/core/notify/WxTemplateSender.java +++ b/litemall-core/src/main/java/org/linlinjava/litemall/core/notify/WxTemplateSender.java @@ -2,6 +2,8 @@ package org.linlinjava.litemall.core.notify; import cn.binarywang.wx.miniapp.api.WxMaService; import cn.binarywang.wx.miniapp.bean.WxMaTemplateMessage; +import org.apache.commons.logging.Log; +import org.apache.commons.logging.LogFactory; import org.linlinjava.litemall.db.domain.LitemallUserFormid; import org.linlinjava.litemall.db.service.LitemallUserFormIdService; import org.springframework.beans.factory.annotation.Autowired; @@ -13,11 +15,13 @@ import java.util.List; * 微信模版消息通知 */ public class WxTemplateSender { - @Autowired - WxMaService wxMaService; + private final Log logger = LogFactory.getLog(WxTemplateSender.class); @Autowired - LitemallUserFormIdService formIdService; + private WxMaService wxMaService; + + @Autowired + private LitemallUserFormIdService formIdService; /** * 发送微信消息(模板消息),不带跳转 @@ -59,7 +63,9 @@ public class WxTemplateSender { try { wxMaService.getMsgService().sendTemplateMsg(msg); - formIdService.updateUserFormId(userFormid); + if(formIdService.updateUserFormId(userFormid) == 0){ + logger.warn("更新数据已失效"); + } } catch (Exception e) { e.printStackTrace(); } diff --git a/litemall-core/src/main/java/org/linlinjava/litemall/core/util/ResponseUtil.java b/litemall-core/src/main/java/org/linlinjava/litemall/core/util/ResponseUtil.java index 223fa644..08821b40 100644 --- a/litemall-core/src/main/java/org/linlinjava/litemall/core/util/ResponseUtil.java +++ b/litemall-core/src/main/java/org/linlinjava/litemall/core/util/ResponseUtil.java @@ -41,17 +41,18 @@ public class ResponseUtil { return obj; } - - public static Object badArgument(){ return fail(401, "参数不对"); } - public static Object badArgumentValue(){ return fail(402, "参数值不对"); } + public static Object updatedDateExpired(){ + return fail(403, "更新数据已经失效"); + } + public static Object unlogin(){ return fail(501, "请登录"); } diff --git a/litemall-db/src/main/java/org/linlinjava/litemall/db/service/LitemallAddressService.java b/litemall-db/src/main/java/org/linlinjava/litemall/db/service/LitemallAddressService.java index 22bca754..7cee6952 100644 --- a/litemall-db/src/main/java/org/linlinjava/litemall/db/service/LitemallAddressService.java +++ b/litemall-db/src/main/java/org/linlinjava/litemall/db/service/LitemallAddressService.java @@ -29,7 +29,7 @@ public class LitemallAddressService { return addressMapper.insertSelective(address); } - public int update(LitemallAddress address) { + public int updateId(LitemallAddress address) { return addressMapper.updateWithVersionByPrimaryKeySelective(address.getVersion(), address); } diff --git a/litemall-db/src/main/java/org/linlinjava/litemall/db/service/LitemallCartService.java b/litemall-db/src/main/java/org/linlinjava/litemall/db/service/LitemallCartService.java index 80daee8a..657aef0c 100644 --- a/litemall-db/src/main/java/org/linlinjava/litemall/db/service/LitemallCartService.java +++ b/litemall-db/src/main/java/org/linlinjava/litemall/db/service/LitemallCartService.java @@ -25,7 +25,7 @@ public class LitemallCartService { cartMapper.insertSelective(cart); } - public int update(LitemallCart cart) { + public int updateById(LitemallCart cart) { return cartMapper.updateWithVersionByPrimaryKeySelective(cart.getVersion(), cart); } diff --git a/litemall-db/src/main/java/org/linlinjava/litemall/db/service/LitemallGrouponRulesService.java b/litemall-db/src/main/java/org/linlinjava/litemall/db/service/LitemallGrouponRulesService.java index bc229ffa..4536ec1e 100644 --- a/litemall-db/src/main/java/org/linlinjava/litemall/db/service/LitemallGrouponRulesService.java +++ b/litemall-db/src/main/java/org/linlinjava/litemall/db/service/LitemallGrouponRulesService.java @@ -65,9 +65,7 @@ public class LitemallGrouponRulesService { * @return */ public boolean isExpired(LitemallGrouponRules rules) { - if (rules == null || rules.getExpireTime().isBefore(LocalDateTime.now())) - return true; - return false; + return (rules == null || rules.getExpireTime().isBefore(LocalDateTime.now())); } /** @@ -109,7 +107,7 @@ public class LitemallGrouponRulesService { mapper.logicalDeleteByPrimaryKey(id); } - public int update(LitemallGrouponRules grouponRules) { + public int updateById(LitemallGrouponRules grouponRules) { return mapper.updateWithVersionByPrimaryKeySelective(grouponRules.getVersion(), grouponRules); } } diff --git a/litemall-db/src/main/java/org/linlinjava/litemall/db/service/LitemallGrouponService.java b/litemall-db/src/main/java/org/linlinjava/litemall/db/service/LitemallGrouponService.java index 6e16334e..dcfddddb 100644 --- a/litemall-db/src/main/java/org/linlinjava/litemall/db/service/LitemallGrouponService.java +++ b/litemall-db/src/main/java/org/linlinjava/litemall/db/service/LitemallGrouponService.java @@ -90,7 +90,7 @@ public class LitemallGrouponService { return (int) mapper.countByExample(example); } - public int update(LitemallGroupon groupon) { + public int updateById(LitemallGroupon groupon) { return mapper.updateWithVersionByPrimaryKeySelective(groupon.getVersion(), groupon); } diff --git a/litemall-db/src/main/java/org/linlinjava/litemall/db/service/LitemallOrderService.java b/litemall-db/src/main/java/org/linlinjava/litemall/db/service/LitemallOrderService.java index aa214936..adca63f3 100644 --- a/litemall-db/src/main/java/org/linlinjava/litemall/db/service/LitemallOrderService.java +++ b/litemall-db/src/main/java/org/linlinjava/litemall/db/service/LitemallOrderService.java @@ -98,10 +98,6 @@ public class LitemallOrderService { return (int)orderMapper.countByExample(example); } - public int update(LitemallOrder order) { - return orderMapper.updateByPrimaryKeySelective(order); - } - public List querySelective(Integer userId, String orderSn, List orderStatusArray, Integer page, Integer size, String sort, String order) { LitemallOrderExample example = new LitemallOrderExample(); LitemallOrderExample.Criteria criteria = example.createCriteria(); @@ -140,8 +136,8 @@ public class LitemallOrderService { return (int)orderMapper.countByExample(example); } - public void updateById(LitemallOrder order) { - orderMapper.updateByPrimaryKeySelective(order); + public int updateById(LitemallOrder order) { + return orderMapper.updateWithVersionByPrimaryKeySelective(order.getVersion(), order); } public void deleteById(Integer id) { diff --git a/litemall-db/src/main/java/org/linlinjava/litemall/db/service/LitemallUserFormIdService.java b/litemall-db/src/main/java/org/linlinjava/litemall/db/service/LitemallUserFormIdService.java index 20504978..b709df12 100644 --- a/litemall-db/src/main/java/org/linlinjava/litemall/db/service/LitemallUserFormIdService.java +++ b/litemall-db/src/main/java/org/linlinjava/litemall/db/service/LitemallUserFormIdService.java @@ -31,13 +31,13 @@ public class LitemallUserFormIdService { * * @param userFormid */ - public void updateUserFormId(LitemallUserFormid userFormid) { + public int updateUserFormId(LitemallUserFormid userFormid) { //更新或者删除缓存 if (userFormid.getIsprepay() && userFormid.getUseamount() > 1) { userFormid.setUseamount(userFormid.getUseamount() - 1); - formidMapper.updateWithVersionByPrimaryKey(userFormid.getVersion(), userFormid); + return formidMapper.updateWithVersionByPrimaryKey(userFormid.getVersion(), userFormid); } else { - formidMapper.deleteByPrimaryKey(userFormid.getId()); + return formidMapper.deleteByPrimaryKey(userFormid.getId()); } } diff --git a/litemall-db/src/main/java/org/linlinjava/litemall/db/service/LitemallUserService.java b/litemall-db/src/main/java/org/linlinjava/litemall/db/service/LitemallUserService.java index 67f06fc0..156da8e2 100644 --- a/litemall-db/src/main/java/org/linlinjava/litemall/db/service/LitemallUserService.java +++ b/litemall-db/src/main/java/org/linlinjava/litemall/db/service/LitemallUserService.java @@ -39,7 +39,7 @@ public class LitemallUserService { userMapper.insertSelective(user); } - public int update(LitemallUser user) { + public int updateById(LitemallUser user) { return userMapper.updateWithVersionByPrimaryKeySelective(user.getVersion(), user); } diff --git a/litemall-wx-api/src/main/java/org/linlinjava/litemall/wx/web/WxAddressController.java b/litemall-wx-api/src/main/java/org/linlinjava/litemall/wx/web/WxAddressController.java index 076d0988..e3e19d63 100644 --- a/litemall-wx-api/src/main/java/org/linlinjava/litemall/wx/web/WxAddressController.java +++ b/litemall-wx-api/src/main/java/org/linlinjava/litemall/wx/web/WxAddressController.java @@ -160,7 +160,9 @@ public class WxAddressController { addressService.add(address); } else { address.setUserId(userId); - addressService.update(address); + if(addressService.updateId(address) == 0){ + return ResponseUtil.updatedDateExpired(); + } } return ResponseUtil.ok(address.getId()); } diff --git a/litemall-wx-api/src/main/java/org/linlinjava/litemall/wx/web/WxAuthController.java b/litemall-wx-api/src/main/java/org/linlinjava/litemall/wx/web/WxAuthController.java index 3d6df538..6a30315d 100644 --- a/litemall-wx-api/src/main/java/org/linlinjava/litemall/wx/web/WxAuthController.java +++ b/litemall-wx-api/src/main/java/org/linlinjava/litemall/wx/web/WxAuthController.java @@ -166,7 +166,9 @@ public class WxAuthController { } else { user.setLastLoginTime(LocalDateTime.now()); user.setLastLoginIp(IpUtil.client(request)); - userService.update(user); + if(userService.updateById(user) == 0){ + return ResponseUtil.updatedDateExpired(); + } } // token @@ -333,7 +335,9 @@ public class WxAuthController { String encodedPassword = encoder.encode(password); user.setPassword(encodedPassword); - userService.update(user); + if(userService.updateById(user) == 0){ + return ResponseUtil.updatedDateExpired(); + } return ResponseUtil.ok(); } @@ -347,7 +351,9 @@ public class WxAuthController { String phone = phoneNumberInfo.getPhoneNumber(); LitemallUser user = userService.findById(userId); user.setMobile(phone); - userService.update(user); + if(userService.updateById(user) == 0){ + return ResponseUtil.updatedDateExpired(); + } return ResponseUtil.ok(); } } diff --git a/litemall-wx-api/src/main/java/org/linlinjava/litemall/wx/web/WxCartController.java b/litemall-wx-api/src/main/java/org/linlinjava/litemall/wx/web/WxCartController.java index 46146d59..2ef8d5ac 100644 --- a/litemall-wx-api/src/main/java/org/linlinjava/litemall/wx/web/WxCartController.java +++ b/litemall-wx-api/src/main/java/org/linlinjava/litemall/wx/web/WxCartController.java @@ -150,7 +150,9 @@ public class WxCartController { return ResponseUtil.fail(400, "库存不足"); } existCart.setNumber((short) num); - cartService.update(existCart); + if(cartService.updateById(existCart) == 0){ + return ResponseUtil.updatedDateExpired(); + } } return goodscount(userId); @@ -221,7 +223,9 @@ public class WxCartController { return ResponseUtil.fail(400, "库存不足"); } existCart.setNumber((short) num); - cartService.update(existCart); + if(cartService.updateById(existCart) == 0){ + return ResponseUtil.updatedDateExpired(); + } } return ResponseUtil.ok(existCart != null ? existCart.getId() : cart.getId()); @@ -281,7 +285,9 @@ public class WxCartController { } existCart.setNumber(number.shortValue()); - cartService.update(existCart); + if(cartService.updateById(existCart) == 0){ + return ResponseUtil.updatedDateExpired(); + } return ResponseUtil.ok(); } diff --git a/litemall-wx-api/src/main/java/org/linlinjava/litemall/wx/web/WxOrderController.java b/litemall-wx-api/src/main/java/org/linlinjava/litemall/wx/web/WxOrderController.java index 7c706ad6..d0f5e847 100644 --- a/litemall-wx-api/src/main/java/org/linlinjava/litemall/wx/web/WxOrderController.java +++ b/litemall-wx-api/src/main/java/org/linlinjava/litemall/wx/web/WxOrderController.java @@ -5,6 +5,7 @@ import com.github.binarywang.wxpay.bean.notify.WxPayOrderNotifyResult; import com.github.binarywang.wxpay.bean.order.WxPayMpOrderResult; import com.github.binarywang.wxpay.bean.request.WxPayUnifiedOrderRequest; import com.github.binarywang.wxpay.bean.result.BaseWxPayResult; +import com.github.binarywang.wxpay.exception.WxPayException; import com.github.binarywang.wxpay.service.WxPayService; import org.apache.commons.io.IOUtils; import org.apache.commons.logging.Log; @@ -37,6 +38,7 @@ import org.springframework.web.bind.annotation.*; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import javax.validation.constraints.NotNull; +import java.io.IOException; import java.math.BigDecimal; import java.time.LocalDate; import java.time.LocalDateTime; @@ -426,7 +428,9 @@ public class WxOrderController { throw new RuntimeException("下单的商品货品数量大于库存量"); } product.setNumber(remainNumber); - productService.updateById(product); + if(productService.updateById(product) == 0){ + throw new Exception("更新数据已失效"); + } } //如果是团购项目,添加团购信息 @@ -509,7 +513,9 @@ public class WxOrderController { // 设置订单已取消状态 order.setOrderStatus(OrderUtil.STATUS_CANCEL); order.setEndTime(LocalDateTime.now()); - orderService.updateById(order); + if(orderService.updateById(order) == 0){ + throw new Exception("更新数据已失效"); + } // 商品货品数量增加 List orderGoodsList = orderGoodsService.queryByOid(orderId); @@ -518,7 +524,9 @@ public class WxOrderController { LitemallProduct product = productService.findById(productId); Integer number = product.getNumber() + orderGoods.getNumber(); product.setNumber(number); - productService.updateById(product); + if(productService.updateById(product) == 0){ + throw new Exception("更新数据已失效"); + } } } catch (Exception ex) { txManager.rollback(status); @@ -603,7 +611,9 @@ public class WxOrderController { return ResponseUtil.fail(403, "订单不能支付"); } - orderService.updateById(order); + if(orderService.updateById(order) == 0){ + return ResponseUtil.updatedDateExpired(); + } return ResponseUtil.ok(result); } @@ -623,78 +633,103 @@ public class WxOrderController { */ @PostMapping("pay-notify") public Object payNotify(HttpServletRequest request, HttpServletResponse response) { + String xmlResult = null; try { - String xmlResult = IOUtils.toString(request.getInputStream(), request.getCharacterEncoding()); - WxPayOrderNotifyResult result = wxPayService.parseOrderNotifyResult(xmlResult); - - String orderSn = result.getOutTradeNo(); - String payId = result.getTransactionId(); - - // 分转化成元 - String totalFee = BaseWxPayResult.fenToYuan(result.getTotalFee()); - - LitemallOrder order = orderService.findBySn(orderSn); - if (order == null) { - throw new Exception("订单不存在 sn=" + orderSn); - } - - // 检查这个订单是否已经处理过 - if (OrderUtil.isPayStatus(order) && order.getPayId() != null) { - return WxPayNotifyResponse.success("处理成功!"); - } - - // 检查支付订单金额 - if (!totalFee.equals(order.getActualPrice().toString())) { - throw new Exception(order.getOrderSn() + " : 支付金额不符合 totalFee=" + totalFee); - } - - order.setPayId(payId); - order.setPayTime(LocalDateTime.now()); - order.setOrderStatus(OrderUtil.STATUS_PAY); - orderService.updateById(order); - - // 支付成功,有团购信息,更新团购信息 - LitemallGroupon groupon = grouponService.queryByOrderId(order.getId()); - if (groupon != null) { - LitemallGrouponRules grouponRules = grouponRulesService.queryById(groupon.getRulesId()); - - //仅当发起者才创建分享图片 - if (groupon.getGrouponId() == 0) { - String url = qCodeService.createGrouponShareImage(grouponRules.getGoodsName(), grouponRules.getPicUrl(), groupon); - groupon.setShareUrl(url); - } - groupon.setPayed(true); - grouponService.update(groupon); - } - - //TODO 发送邮件和短信通知,这里采用异步发送 - // 订单支付成功以后,会发送短信给用户,以及发送邮件给管理员 - notifyService.notifyMail("新订单通知", order.toString()); - /** - * 这里微信的短信平台对参数长度有限制,所以将订单号只截取后6位 - * - */ - notifyService.notifySmsTemplateSync(order.getMobile(), NotifyType.PAY_SUCCEED, new String[]{orderSn.substring(8, 14)}); - - /** - * 请依据自己的模版消息配置更改参数 - */ - String[] parms = new String[]{ - order.getOrderSn(), - order.getOrderPrice().toString(), - DateTimeUtil.getDateTimeDisplayString(order.getAddTime()), - order.getConsignee(), - order.getMobile(), - order.getAddress() - }; - - notifyService.notifyWxTemplate(result.getOpenid(), NotifyType.PAY_SUCCEED, parms, "pages/index/index?orderId=" + order.getId()); - - return WxPayNotifyResponse.success("处理成功!"); - } catch (Exception e) { - logger.error("微信回调结果异常,异常原因 " + e.getMessage()); + xmlResult = IOUtils.toString(request.getInputStream(), request.getCharacterEncoding()); + } catch (IOException e) { + e.printStackTrace(); return WxPayNotifyResponse.fail(e.getMessage()); } + + WxPayOrderNotifyResult result = null; + try { + result = wxPayService.parseOrderNotifyResult(xmlResult); + } catch (WxPayException e) { + e.printStackTrace(); + return WxPayNotifyResponse.fail(e.getMessage()); + } + + logger.info("处理腾讯支付平台的订单支付"); + logger.info(result); + + String orderSn = result.getOutTradeNo(); + String payId = result.getTransactionId(); + + // 分转化成元 + String totalFee = BaseWxPayResult.fenToYuan(result.getTotalFee()); + LitemallOrder order = orderService.findBySn(orderSn); + if (order == null) { + return WxPayNotifyResponse.fail("订单不存在 sn=" + orderSn); + } + + // 检查这个订单是否已经处理过 + if (OrderUtil.isPayStatus(order) && order.getPayId() != null) { + return WxPayNotifyResponse.success("订单已经处理成功!"); + } + + // 检查支付订单金额 + if (!totalFee.equals(order.getActualPrice().toString())) { + return WxPayNotifyResponse.fail(order.getOrderSn() + " : 支付金额不符合 totalFee=" + totalFee); + } + + order.setPayId(payId); + order.setPayTime(LocalDateTime.now()); + order.setOrderStatus(OrderUtil.STATUS_PAY); + if (orderService.updateById(order) == 0) { + // 这里可能存在这样一个问题,用户支付和系统自动取消订单发生在同时 + // 如果数据库首先因为系统自动取消订单而更新了订单状态; + // 此时用户支付完成回调这里也要更新数据库,而由于乐观锁机制这里的更新会失败 + // 因此,这里会重新读取数据库检查状态是否是订单自动取消,如果是则更新成支付状态。 + order = orderService.findBySn(orderSn); + int updated = 0; + if(OrderUtil.isAutoCancelStatus(order)){ + order.setPayId(payId); + order.setPayTime(LocalDateTime.now()); + order.setOrderStatus(OrderUtil.STATUS_PAY); + updated = orderService.updateById(order); + } + + // 如果updated是0,那么数据库更新失败 + if(updated == 0) { + return WxPayNotifyResponse.fail("更新数据已失效"); + } + } + + // 支付成功,有团购信息,更新团购信息 + LitemallGroupon groupon = grouponService.queryByOrderId(order.getId()); + if (groupon != null) { + LitemallGrouponRules grouponRules = grouponRulesService.queryById(groupon.getRulesId()); + + //仅当发起者才创建分享图片 + if (groupon.getGrouponId() == 0) { + String url = qCodeService.createGrouponShareImage(grouponRules.getGoodsName(), grouponRules.getPicUrl(), groupon); + groupon.setShareUrl(url); + } + groupon.setPayed(true); + if (grouponService.updateById(groupon) == 0) { + return WxPayNotifyResponse.fail("更新数据已失效"); + } + } + + //TODO 发送邮件和短信通知,这里采用异步发送 + // 订单支付成功以后,会发送短信给用户,以及发送邮件给管理员 + notifyService.notifyMail("新订单通知", order.toString()); + // 这里微信的短信平台对参数长度有限制,所以将订单号只截取后6位 + notifyService.notifySmsTemplateSync(order.getMobile(), NotifyType.PAY_SUCCEED, new String[]{orderSn.substring(8, 14)}); + + // 请依据自己的模版消息配置更改参数 + String[] parms = new String[]{ + order.getOrderSn(), + order.getOrderPrice().toString(), + DateTimeUtil.getDateTimeDisplayString(order.getAddTime()), + order.getConsignee(), + order.getMobile(), + order.getAddress() + }; + + notifyService.notifyWxTemplate(result.getOpenid(), NotifyType.PAY_SUCCEED, parms, "pages/index/index?orderId=" + order.getId()); + + return WxPayNotifyResponse.success("处理成功!"); } /** @@ -733,7 +768,9 @@ public class WxOrderController { // 设置订单申请退款状态 order.setOrderStatus(OrderUtil.STATUS_REFUND); - orderService.updateById(order); + if(orderService.updateById(order) == 0){ + return ResponseUtil.updatedDateExpired(); + } //TODO 发送邮件和短信通知,这里采用异步发送 // 有用户申请退款,邮件通知运营人员 @@ -778,7 +815,9 @@ public class WxOrderController { order.setOrderStatus(OrderUtil.STATUS_CONFIRM); order.setConfirmTime(LocalDateTime.now()); - orderService.updateById(order); + if(orderService.updateById(order) == 0){ + return ResponseUtil.updatedDateExpired(); + } return ResponseUtil.ok(); } diff --git a/litemall-wx-api/src/main/java/org/linlinjava/litemall/wx/web/WxSearchController.java b/litemall-wx-api/src/main/java/org/linlinjava/litemall/wx/web/WxSearchController.java index 0b8ee4e9..be4c905a 100644 --- a/litemall-wx-api/src/main/java/org/linlinjava/litemall/wx/web/WxSearchController.java +++ b/litemall-wx-api/src/main/java/org/linlinjava/litemall/wx/web/WxSearchController.java @@ -27,23 +27,23 @@ public class WxSearchController { /** * 搜索页面信息 - * + *

* 如果用户已登录,则给出用户历史搜索记录。 * * @param userId 用户ID * @return 搜索页面信息 - * 成功则 - * { - * errno: 0, - * errmsg: '成功', - * data: - * { - * defaultKeyword: xxx, - * historyKeywordList: xxx, - * hotKeywordList: xxx - * } - * } - * 失败则 { errno: XXX, errmsg: XXX } + * 成功则 + * { + * errno: 0, + * errmsg: '成功', + * data: + * { + * defaultKeyword: xxx, + * historyKeywordList: xxx, + * hotKeywordList: xxx + * } + * } + * 失败则 { errno: XXX, errmsg: XXX } */ @GetMapping("index") public Object index(@LoginUser Integer userId) { @@ -53,11 +53,10 @@ public class WxSearchController { List hotKeywordList = keywordsService.queryHots(); List historyList = null; - if(userId != null) { + if (userId != null) { //取出用户历史关键字 historyList = searchHistoryService.queryByUid(userId); - } - else { + } else { historyList = new ArrayList<>(0); } @@ -70,18 +69,18 @@ public class WxSearchController { /** * 关键字提醒 - * + *

* 当用户输入关键字一部分时,可以推荐系统中合适的关键字。 * * @param keyword 关键字 * @return 合适的关键字 - * 成功则 - * { - * errno: 0, - * errmsg: '成功', - * data: xxx - * } - * 失败则 { errno: XXX, errmsg: XXX } + * 成功则 + * { + * errno: 0, + * errmsg: '成功', + * data: xxx + * } + * 失败则 { errno: XXX, errmsg: XXX } */ @GetMapping("helper") public Object helper(@NotEmpty String keyword, @@ -91,24 +90,24 @@ public class WxSearchController { String[] keys = new String[keywordsList.size()]; int index = 0; for (LitemallKeyword key : keywordsList) { - keys[index++] = key.getKeyword(); + keys[index++] = key.getKeyword(); } return ResponseUtil.ok(keys); } /** * 关键字清理 - * + *

* 当用户输入关键字一部分时,可以推荐系统中合适的关键字。 * * @param userId 用户ID * @return 清理是否成功 - * 成功则 { errno: 0, errmsg: '成功' } - * 失败则 { errno: XXX, errmsg: XXX } + * 成功则 { errno: 0, errmsg: '成功' } + * 失败则 { errno: XXX, errmsg: XXX } */ @PostMapping("clearhistory") public Object clearhistory(@LoginUser Integer userId) { - if(userId == null){ + if (userId == null) { return ResponseUtil.unlogin(); }