From 4d16b04fa5ee1ff8d37e833c047ebc9d080385a0 Mon Sep 17 00:00:00 2001 From: gxwebsoft Date: Thu, 30 May 2024 20:01:06 +0800 Subject: [PATCH] =?UTF-8?q?=E6=96=B0=E5=A2=9E=EF=BC=9A=E4=BC=9A=E5=91=98?= =?UTF-8?q?=E5=8D=A1=E5=8A=9F=E8=83=BD=E5=8F=8A=E6=94=AF=E6=8C=81=E4=BD=BF?= =?UTF-8?q?=E7=94=A8=E4=BD=99=E9=A2=9D=E6=94=AF=E4=BB=98=E5=8A=9F=E8=83=BD?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../booking/controller/PeriodController.java | 2 +- .../controller/UserCardController.java | 2 +- .../gxwebsoft/booking/entity/UserCard.java | 45 +++++-- .../booking/mapper/UserCardMapper.java | 2 +- .../booking/mapper/xml/UserCardMapper.xml | 34 ++++-- .../booking/param/UserCardParam.java | 20 ++- .../booking/service/UserCardService.java | 2 +- .../service/impl/UserCardServiceImpl.java | 2 +- .../common/core/utils/CommonUtil.java | 9 ++ .../common/core/utils/RequestUtil.java | 36 ++++-- .../shop/controller/OrderController.java | 38 +++--- .../controller/UserBalanceLogController.java | 115 ++++++++++++++++++ .../java/com/gxwebsoft/shop/entity/Order.java | 13 ++ .../gxwebsoft/shop/entity/UserBalanceLog.java | 83 +++++++++++++ .../shop/mapper/UserBalanceLogMapper.java | 37 ++++++ .../shop/mapper/xml/UserBalanceLogMapper.xml | 69 +++++++++++ .../shop/param/UserBalanceLogParam.java | 67 ++++++++++ .../gxwebsoft/shop/service/OrderService.java | 3 + .../shop/service/UserBalanceLogService.java | 42 +++++++ .../shop/service/impl/OrderServiceImpl.java | 56 ++++++++- .../impl/UserBalanceLogServiceImpl.java | 47 +++++++ src/main/resources/application-dev.yml | 2 +- .../gxwebsoft/generator/ShopGenerator.java | 27 ++-- 23 files changed, 683 insertions(+), 70 deletions(-) create mode 100644 src/main/java/com/gxwebsoft/shop/controller/UserBalanceLogController.java create mode 100644 src/main/java/com/gxwebsoft/shop/entity/UserBalanceLog.java create mode 100644 src/main/java/com/gxwebsoft/shop/mapper/UserBalanceLogMapper.java create mode 100644 src/main/java/com/gxwebsoft/shop/mapper/xml/UserBalanceLogMapper.xml create mode 100644 src/main/java/com/gxwebsoft/shop/param/UserBalanceLogParam.java create mode 100644 src/main/java/com/gxwebsoft/shop/service/UserBalanceLogService.java create mode 100644 src/main/java/com/gxwebsoft/shop/service/impl/UserBalanceLogServiceImpl.java diff --git a/src/main/java/com/gxwebsoft/booking/controller/PeriodController.java b/src/main/java/com/gxwebsoft/booking/controller/PeriodController.java index 9ddf8ac..4196300 100644 --- a/src/main/java/com/gxwebsoft/booking/controller/PeriodController.java +++ b/src/main/java/com/gxwebsoft/booking/controller/PeriodController.java @@ -100,7 +100,7 @@ public class PeriodController extends BaseController { // 查询是否含有未支付订单 final User loginUser = getLoginUser(); if(loginUser != null){ - if (orderService.count(new LambdaQueryWrapper().eq(Order::getPayStatus,0).eq(Order::getOrderStatus,0).eq(Order::getUserId,loginUser.getUserId())) > 0) { + if (orderService.count(new LambdaQueryWrapper().eq(Order::getType,1).eq(Order::getPayStatus,0).eq(Order::getOrderStatus,0).eq(Order::getUserId,loginUser.getUserId())) > 0) { return fail("您还有未支付订单,请先支付",null); } } diff --git a/src/main/java/com/gxwebsoft/booking/controller/UserCardController.java b/src/main/java/com/gxwebsoft/booking/controller/UserCardController.java index 58cadab..f049002 100644 --- a/src/main/java/com/gxwebsoft/booking/controller/UserCardController.java +++ b/src/main/java/com/gxwebsoft/booking/controller/UserCardController.java @@ -22,7 +22,7 @@ import java.util.List; * 会员卡控制器 * * @author 科技小王子 - * @since 2024-05-27 19:58:58 + * @since 2024-05-29 14:29:43 */ @Api(tags = "会员卡管理") @RestController diff --git a/src/main/java/com/gxwebsoft/booking/entity/UserCard.java b/src/main/java/com/gxwebsoft/booking/entity/UserCard.java index bff2ead..24ac286 100644 --- a/src/main/java/com/gxwebsoft/booking/entity/UserCard.java +++ b/src/main/java/com/gxwebsoft/booking/entity/UserCard.java @@ -1,22 +1,20 @@ package com.gxwebsoft.booking.entity; -import java.math.BigDecimal; -import com.baomidou.mybatisplus.annotation.TableName; -import com.baomidou.mybatisplus.annotation.IdType; -import com.baomidou.mybatisplus.annotation.TableId; -import java.io.Serializable; -import java.util.Date; - +import com.baomidou.mybatisplus.annotation.*; import io.swagger.annotations.ApiModel; import io.swagger.annotations.ApiModelProperty; import lombok.Data; import lombok.EqualsAndHashCode; +import java.io.Serializable; +import java.math.BigDecimal; +import java.util.Date; + /** * 会员卡 * * @author 科技小王子 - * @since 2024-05-27 19:58:57 + * @since 2024-05-29 14:29:43 */ @Data @EqualsAndHashCode(callSuper = false) @@ -58,11 +56,14 @@ public class UserCard implements Serializable { @ApiModelProperty(value = "手机号码") private String phone; + @ApiModelProperty(value = "会员卡图片") + private String image; + @ApiModelProperty(value = "vip购卡价格") private BigDecimal price; @ApiModelProperty(value = "会员卡介绍") - private String desc; + private String cardDesc; @ApiModelProperty(value = "会员卡说明") private String info; @@ -119,7 +120,10 @@ public class UserCard implements Serializable { private Integer isInvoice; @ApiModelProperty(value = "vip卡到期时间") - private Date expireTime; + private Date expirationTime; + + @ApiModelProperty(value = "vip卡到期时间") + private Integer expireTimeOld; @ApiModelProperty(value = "紧急联系人") private String urgentName; @@ -137,13 +141,16 @@ public class UserCard implements Serializable { private Integer useTime; @ApiModelProperty(value = "创建时间") - private Integer createTime; + private Integer createTimeOld; - private Integer updateTime; + private Integer updateTimeOld; @ApiModelProperty(value = "身份证号码") private String idCard; + @ApiModelProperty(value = "商户ID") + private Integer merchantId; + @ApiModelProperty(value = "备注") private String remark; @@ -153,7 +160,21 @@ public class UserCard implements Serializable { @ApiModelProperty(value = "排序号") private Integer sortNumber; + @ApiModelProperty(value = "是否删除, 0否, 1是") + @TableLogic + private Integer deleted; + @ApiModelProperty(value = "租户id") private Integer tenantId; + @ApiModelProperty(value = "注册时间") + private Date createTime; + + @ApiModelProperty(value = "修改时间") + private Date updateTime; + + @ApiModelProperty(value = "商户头像") + @TableField(exist = false) + private String merchantAvatar; + } diff --git a/src/main/java/com/gxwebsoft/booking/mapper/UserCardMapper.java b/src/main/java/com/gxwebsoft/booking/mapper/UserCardMapper.java index adac643..3af07d0 100644 --- a/src/main/java/com/gxwebsoft/booking/mapper/UserCardMapper.java +++ b/src/main/java/com/gxwebsoft/booking/mapper/UserCardMapper.java @@ -12,7 +12,7 @@ import java.util.List; * 会员卡Mapper * * @author 科技小王子 - * @since 2024-05-27 19:58:57 + * @since 2024-05-29 14:29:43 */ public interface UserCardMapper extends BaseMapper { diff --git a/src/main/java/com/gxwebsoft/booking/mapper/xml/UserCardMapper.xml b/src/main/java/com/gxwebsoft/booking/mapper/xml/UserCardMapper.xml index 498acdf..d6d79fe 100644 --- a/src/main/java/com/gxwebsoft/booking/mapper/xml/UserCardMapper.xml +++ b/src/main/java/com/gxwebsoft/booking/mapper/xml/UserCardMapper.xml @@ -4,8 +4,9 @@ - SELECT a.* + SELECT a.*,b.merchant_name,b.image as merchant_avatar FROM booking_user_card a + LEFT JOIN shop_merchant b ON a.merchant_id = b.merchant_id AND a.id = #{param.id} @@ -43,8 +44,8 @@ AND a.price = #{param.price} - - AND a.desc LIKE CONCAT('%', #{param.desc}, '%') + + AND a.card_desc LIKE CONCAT('%', #{param.cardDesc}, '%') AND a.info LIKE CONCAT('%', #{param.info}, '%') @@ -100,8 +101,11 @@ AND a.is_invoice = #{param.isInvoice} - - AND a.expire_time = #{param.expireTime} + + AND a.expiration_time LIKE CONCAT('%', #{param.expirationTime}, '%') + + + AND a.expire_time_old = #{param.expireTimeOld} AND a.urgent_name LIKE CONCAT('%', #{param.urgentName}, '%') @@ -118,11 +122,11 @@ AND a.use_time = #{param.useTime} - - AND a.create_time >= #{param.createTimeStart} + + AND a.create_time_old = #{param.createTimeOld} - - AND a.create_time <= #{param.createTimeEnd} + + AND a.update_time_old = #{param.updateTimeOld} AND a.id_card LIKE CONCAT('%', #{param.idCard}, '%') @@ -136,6 +140,18 @@ AND a.sort_number = #{param.sortNumber} + + AND a.deleted = #{param.deleted} + + + AND a.deleted = 0 + + + AND a.create_time >= #{param.createTimeStart} + + + AND a.create_time <= #{param.createTimeEnd} + AND (a.comments LIKE CONCAT('%', #{param.keywords}, '%') ) diff --git a/src/main/java/com/gxwebsoft/booking/param/UserCardParam.java b/src/main/java/com/gxwebsoft/booking/param/UserCardParam.java index 95ca0aa..2f12348 100644 --- a/src/main/java/com/gxwebsoft/booking/param/UserCardParam.java +++ b/src/main/java/com/gxwebsoft/booking/param/UserCardParam.java @@ -14,7 +14,7 @@ import lombok.EqualsAndHashCode; * 会员卡查询参数 * * @author 科技小王子 - * @since 2024-05-27 19:58:57 + * @since 2024-05-29 14:29:43 */ @Data @EqualsAndHashCode(callSuper = false) @@ -65,7 +65,7 @@ public class UserCardParam extends BaseParam { private BigDecimal price; @ApiModelProperty(value = "会员卡介绍") - private String desc; + private String cardDesc; @ApiModelProperty(value = "会员卡说明") private String info; @@ -136,9 +136,12 @@ public class UserCardParam extends BaseParam { @QueryField(type = QueryType.EQ) private Integer isInvoice; + @ApiModelProperty(value = "vip卡到期时间") + private String expirationTime; + @ApiModelProperty(value = "vip卡到期时间") @QueryField(type = QueryType.EQ) - private String expireTime; + private Integer expireTimeOld; @ApiModelProperty(value = "紧急联系人") private String urgentName; @@ -156,6 +159,13 @@ public class UserCardParam extends BaseParam { @QueryField(type = QueryType.EQ) private Integer useTime; + @ApiModelProperty(value = "创建时间") + @QueryField(type = QueryType.EQ) + private Integer createTimeOld; + + @QueryField(type = QueryType.EQ) + private Integer updateTimeOld; + @ApiModelProperty(value = "身份证号码") private String idCard; @@ -169,4 +179,8 @@ public class UserCardParam extends BaseParam { @QueryField(type = QueryType.EQ) private Integer sortNumber; + @ApiModelProperty(value = "是否删除, 0否, 1是") + @QueryField(type = QueryType.EQ) + private Integer deleted; + } diff --git a/src/main/java/com/gxwebsoft/booking/service/UserCardService.java b/src/main/java/com/gxwebsoft/booking/service/UserCardService.java index 7f52a6f..3802c87 100644 --- a/src/main/java/com/gxwebsoft/booking/service/UserCardService.java +++ b/src/main/java/com/gxwebsoft/booking/service/UserCardService.java @@ -11,7 +11,7 @@ import java.util.List; * 会员卡Service * * @author 科技小王子 - * @since 2024-05-27 19:58:57 + * @since 2024-05-29 14:29:43 */ public interface UserCardService extends IService { diff --git a/src/main/java/com/gxwebsoft/booking/service/impl/UserCardServiceImpl.java b/src/main/java/com/gxwebsoft/booking/service/impl/UserCardServiceImpl.java index aff3151..7e9a628 100644 --- a/src/main/java/com/gxwebsoft/booking/service/impl/UserCardServiceImpl.java +++ b/src/main/java/com/gxwebsoft/booking/service/impl/UserCardServiceImpl.java @@ -15,7 +15,7 @@ import java.util.List; * 会员卡Service实现 * * @author 科技小王子 - * @since 2024-05-27 19:58:57 + * @since 2024-05-29 14:29:43 */ @Service public class UserCardServiceImpl extends ServiceImpl implements UserCardService { diff --git a/src/main/java/com/gxwebsoft/common/core/utils/CommonUtil.java b/src/main/java/com/gxwebsoft/common/core/utils/CommonUtil.java index d84e2ed..94abf94 100644 --- a/src/main/java/com/gxwebsoft/common/core/utils/CommonUtil.java +++ b/src/main/java/com/gxwebsoft/common/core/utils/CommonUtil.java @@ -127,6 +127,15 @@ public class CommonUtil { return prefix + tenantId + RandomUtil.randomNumbers(2); } + /** + * 生成会员卡号 + * @return + */ + public static String createCardNo() { + String prefix = DateTime.now().toString(DatePattern.PURE_TIME_PATTERN); + return "00" + prefix + RandomUtil.randomNumbers(2); + } + /** * 检查List是否有重复元素 * diff --git a/src/main/java/com/gxwebsoft/common/core/utils/RequestUtil.java b/src/main/java/com/gxwebsoft/common/core/utils/RequestUtil.java index f9dc83b..333aabb 100644 --- a/src/main/java/com/gxwebsoft/common/core/utils/RequestUtil.java +++ b/src/main/java/com/gxwebsoft/common/core/utils/RequestUtil.java @@ -3,14 +3,20 @@ package com.gxwebsoft.common.core.utils; import cn.hutool.http.HttpRequest; import com.alibaba.fastjson.JSONObject; import com.gxwebsoft.common.core.security.JwtUtil; +import com.gxwebsoft.common.core.web.ApiResult; import com.gxwebsoft.common.system.entity.Role; import com.gxwebsoft.common.system.entity.User; import com.gxwebsoft.common.system.entity.UserRole; import com.gxwebsoft.common.system.param.RoleParam; import com.gxwebsoft.shop.entity.MerchantAccount; +import com.gxwebsoft.shop.entity.Order; +import org.springframework.http.*; import org.springframework.stereotype.Component; +import org.springframework.web.client.RestClientException; +import org.springframework.web.client.RestTemplate; import javax.servlet.http.HttpServletRequest; +import java.math.BigDecimal; import java.util.ArrayList; import java.util.HashMap; @@ -20,15 +26,15 @@ public class RequestUtil { private static String ACCESS_TOKEN; private static String TENANT_ID; - public void setTenantId(String tenantId){ + public void setTenantId(String tenantId) { TENANT_ID = tenantId; } - public void setAccessToken(String token){ + public void setAccessToken(String token) { ACCESS_TOKEN = token; } - public User getUserByPhone(String phone){ + public User getUserByPhone(String phone) { String path = "/system/user/getByPhone/" + phone; try { // 链式构建请求 @@ -72,18 +78,18 @@ public class RequestUtil { String path = "/system/user/"; try { HashMap map = new HashMap<>(); - map.put("nickname",merchantAccount.getRealName()); + map.put("nickname", merchantAccount.getRealName()); map.put("username", merchantAccount.getPhone()); - map.put("realName",merchantAccount.getRealName()); + map.put("realName", merchantAccount.getRealName()); map.put("phone", merchantAccount.getPhone()); - map.put("password",merchantAccount.getPassword()); + map.put("password", merchantAccount.getPassword()); final ArrayList roles = new ArrayList<>(); final UserRole userRole = new UserRole(); userRole.setUserId(merchantAccount.getUserId()); userRole.setRoleId(merchantAccount.getRoleId()); userRole.setTenantId(merchantAccount.getTenantId()); roles.add(userRole); - map.put("roles",roles); + map.put("roles", roles); map.put("tenantId", TENANT_ID); // 链式构建请求 String result = HttpRequest.post(host.concat(path)) @@ -97,4 +103,20 @@ public class RequestUtil { } return true; } + + public ApiResult updateUserBalance(String path,User user) { + try { + // 链式构建请求 + final String body = HttpRequest.put(host.concat(path)) + .header("Authorization", ACCESS_TOKEN) + .header("Tenantid", TENANT_ID) + .body(JSONUtil.toJSONString(user)) + .timeout(20000) + .execute().body(); + return JSONUtil.parseObject(body, ApiResult.class); + } catch (Exception e) { + e.printStackTrace(); + } + return null; + } } diff --git a/src/main/java/com/gxwebsoft/shop/controller/OrderController.java b/src/main/java/com/gxwebsoft/shop/controller/OrderController.java index d2e9e1c..1ce15ff 100644 --- a/src/main/java/com/gxwebsoft/shop/controller/OrderController.java +++ b/src/main/java/com/gxwebsoft/shop/controller/OrderController.java @@ -11,6 +11,7 @@ import com.gxwebsoft.booking.entity.UserCard; import com.gxwebsoft.booking.param.UserCardParam; import com.gxwebsoft.booking.service.CardService; import com.gxwebsoft.booking.service.UserCardService; +import com.gxwebsoft.common.core.security.JwtUtil; import com.gxwebsoft.common.core.utils.CommonUtil; import com.gxwebsoft.common.core.web.BaseController; import com.gxwebsoft.shop.entity.OrderInfo; @@ -33,6 +34,7 @@ import org.springframework.util.CollectionUtils; import org.springframework.web.bind.annotation.*; import javax.annotation.Resource; +import javax.servlet.http.HttpServletRequest; import java.math.BigDecimal; import java.util.List; @@ -82,8 +84,9 @@ public class OrderController extends BaseController { @PreAuthorize("hasAuthority('sys:order:save')") @ApiOperation("下单") @PostMapping() - public ApiResult save(@RequestBody Order order) { + public ApiResult save(@RequestBody Order order, HttpServletRequest request) { System.out.println("order = " + order); + String access_token = JwtUtil.getAccessToken(request); // 记录当前登录用户id User loginUser = getLoginUser(); if (loginUser == null) { @@ -98,11 +101,11 @@ public class OrderController extends BaseController { return fail("商品描述(必填)"); } // 微信支付(商品金额不能为0) - if (order.getPayType().equals(1)) { - if (order.getTotalPrice().compareTo(BigDecimal.ZERO) == 0) { - return fail("商品金额不能为0"); - } - } +// if (order.getPayType().equals(1)) { +// if (order.getTotalPrice().compareTo(BigDecimal.ZERO) == 0) { +// return fail("商品金额不能为0"); +// } +// } // 已下过订单 if(order.getOrderId() != null){ @@ -162,17 +165,17 @@ public class OrderController extends BaseController { if (order.getType().equals(2)) { // 会员卡信息 final Card card = cardService.getByIdRel(Integer.valueOf(order.getCardId())); - System.out.println("card = " + card); final UserCard userCard = new UserCard(); userCard.setUserId(loginUser.getUserId()); // 适用场馆 userCard.setSid(card.getMerchantIds()); - userCard.setCardNum(CommonUtil.randomUUID8()); + userCard.setCardNum(CommonUtil.createCardNo()); userCard.setName(card.getCardName()); userCard.setUsername(loginUser.getRealName()); userCard.setPhone(loginUser.getPhone()); userCard.setPrice(card.getPrice()); - userCard.setDesc(card.getCardDesc()); + userCard.setImage(card.getImage()); + userCard.setCardDesc(card.getCardDesc()); userCard.setInfo(card.getComments()); userCard.setUid(loginUser.getUserId()); userCard.setVid(0); @@ -181,20 +184,25 @@ public class OrderController extends BaseController { userCard.setDiscount(card.getDiscount()); userCard.setNumber(1); userCard.setNum(card.getNumber()); - userCard.setTerm(1); - userCard.setTerm(card.getMonth()/12); userCard.setMonth(card.getMonth()); + userCard.setMerchantId(card.getMerchantId()); userCard.setPayType(1); - userCard.setExpireTime(DateUtil.offset(DateUtil.date(), DateField.MONTH, card.getMonth())); - System.out.println("userCard = " + userCard); - return fail("下单失败2",userCard); -// userCardService.save(userCard); + userCard.setTenantId(card.getTenantId()); + userCard.setExpirationTime(DateUtil.offset(DateUtil.date(), DateField.MONTH, card.getMonth())); + userCardService.save(userCard); } // 微信统一下单接口 if (order.getPayType().equals(1)) { return success("下单成功", orderService.createWxOrder(order)); } + + // 余额支付 + if (order.getPayType().equals(0)) { + order.setAccessToken(access_token); + order.setLoginUser(loginUser); + return success("下单成功", orderService.payByBalance(order)); + } } return fail("下单失败"); } diff --git a/src/main/java/com/gxwebsoft/shop/controller/UserBalanceLogController.java b/src/main/java/com/gxwebsoft/shop/controller/UserBalanceLogController.java new file mode 100644 index 0000000..cb6bcd3 --- /dev/null +++ b/src/main/java/com/gxwebsoft/shop/controller/UserBalanceLogController.java @@ -0,0 +1,115 @@ +package com.gxwebsoft.shop.controller; + +import com.gxwebsoft.common.core.web.BaseController; +import com.gxwebsoft.shop.service.UserBalanceLogService; +import com.gxwebsoft.shop.entity.UserBalanceLog; +import com.gxwebsoft.shop.param.UserBalanceLogParam; +import com.gxwebsoft.common.core.web.ApiResult; +import com.gxwebsoft.common.core.web.PageResult; +import com.gxwebsoft.common.core.web.PageParam; +import com.gxwebsoft.common.core.web.BatchParam; +import com.gxwebsoft.common.core.annotation.OperationLog; +import com.gxwebsoft.common.system.entity.User; +import io.swagger.annotations.Api; +import io.swagger.annotations.ApiOperation; +import org.springframework.security.access.prepost.PreAuthorize; +import org.springframework.web.bind.annotation.*; + +import javax.annotation.Resource; +import java.util.List; + +/** + * 用户余额变动明细表控制器 + * + * @author 科技小王子 + * @since 2024-05-29 15:57:44 + */ +@Api(tags = "用户余额变动明细表管理") +@RestController +@RequestMapping("/api/shop/user-balance-log") +public class UserBalanceLogController extends BaseController { + @Resource + private UserBalanceLogService userBalanceLogService; + + @ApiOperation("分页查询用户余额变动明细表") + @GetMapping("/page") + public ApiResult> page(UserBalanceLogParam param) { + // 使用关联查询 + return success(userBalanceLogService.pageRel(param)); + } + + @ApiOperation("查询全部用户余额变动明细表") + @GetMapping() + public ApiResult> list(UserBalanceLogParam param) { + // 使用关联查询 + return success(userBalanceLogService.listRel(param)); + } + + @PreAuthorize("hasAuthority('shop:userBalanceLog:list')") + @ApiOperation("根据id查询用户余额变动明细表") + @GetMapping("/{id}") + public ApiResult get(@PathVariable("id") Integer id) { + // 使用关联查询 + return success(userBalanceLogService.getByIdRel(id)); + } + + @ApiOperation("添加用户余额变动明细表") + @PostMapping() + public ApiResult save(@RequestBody UserBalanceLog userBalanceLog) { + // 记录当前登录用户id + User loginUser = getLoginUser(); + if (loginUser != null) { + userBalanceLog.setUserId(loginUser.getUserId()); + } + if (userBalanceLogService.save(userBalanceLog)) { + return success("添加成功"); + } + return fail("添加失败"); + } + + @ApiOperation("修改用户余额变动明细表") + @PutMapping() + public ApiResult update(@RequestBody UserBalanceLog userBalanceLog) { + if (userBalanceLogService.updateById(userBalanceLog)) { + return success("修改成功"); + } + return fail("修改失败"); + } + + @ApiOperation("删除用户余额变动明细表") + @DeleteMapping("/{id}") + public ApiResult remove(@PathVariable("id") Integer id) { + if (userBalanceLogService.removeById(id)) { + return success("删除成功"); + } + return fail("删除失败"); + } + + @ApiOperation("批量添加用户余额变动明细表") + @PostMapping("/batch") + public ApiResult saveBatch(@RequestBody List list) { + if (userBalanceLogService.saveBatch(list)) { + return success("添加成功"); + } + return fail("添加失败"); + } + + @ApiOperation("批量修改用户余额变动明细表") + @PutMapping("/batch") + public ApiResult removeBatch(@RequestBody BatchParam batchParam) { + if (batchParam.update(userBalanceLogService, "log_id")) { + return success("修改成功"); + } + return fail("修改失败"); + } + + @ApiOperation("批量删除用户余额变动明细表") + @DeleteMapping("/batch") + public ApiResult removeBatch(@RequestBody List ids) { + if (userBalanceLogService.removeByIds(ids)) { + return success("删除成功"); + } + return fail("删除失败"); + } + +} diff --git a/src/main/java/com/gxwebsoft/shop/entity/Order.java b/src/main/java/com/gxwebsoft/shop/entity/Order.java index dc1acc9..aa33ead 100644 --- a/src/main/java/com/gxwebsoft/shop/entity/Order.java +++ b/src/main/java/com/gxwebsoft/shop/entity/Order.java @@ -10,6 +10,7 @@ import java.util.List; import com.gxwebsoft.common.core.annotation.QueryField; import com.gxwebsoft.common.core.annotation.QueryType; +import com.gxwebsoft.common.system.entity.User; import io.swagger.annotations.ApiModel; import io.swagger.annotations.ApiModelProperty; import lombok.Data; @@ -190,6 +191,18 @@ public class Order implements Serializable { @TableField(exist = false) private String openid; + @ApiModelProperty(value = "余额变动场景(10用户充值 20用户消费 30管理员操作 40订单退款)") + @TableField(exist = false) + private Integer scene; + + @ApiModelProperty(value = "用于请求主服务器时附加token") + @TableField(exist = false) + private String accessToken; + + @ApiModelProperty(value = "当前登录用户") + @TableField(exist = false) + private User loginUser; + @ApiModelProperty(value = "预定信息") @TableField(exist = false) private List orderInfoList; diff --git a/src/main/java/com/gxwebsoft/shop/entity/UserBalanceLog.java b/src/main/java/com/gxwebsoft/shop/entity/UserBalanceLog.java new file mode 100644 index 0000000..181bdfa --- /dev/null +++ b/src/main/java/com/gxwebsoft/shop/entity/UserBalanceLog.java @@ -0,0 +1,83 @@ +package com.gxwebsoft.shop.entity; + +import java.math.BigDecimal; +import com.baomidou.mybatisplus.annotation.TableName; +import com.baomidou.mybatisplus.annotation.IdType; +import com.baomidou.mybatisplus.annotation.TableId; +import java.time.LocalDateTime; +import com.baomidou.mybatisplus.annotation.TableLogic; +import java.io.Serializable; +import java.util.Date; + +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; +import lombok.EqualsAndHashCode; + +/** + * 用户余额变动明细表 + * + * @author 科技小王子 + * @since 2024-05-29 15:57:44 + */ +@Data +@EqualsAndHashCode(callSuper = false) +@ApiModel(value = "UserBalanceLog对象", description = "用户余额变动明细表") +@TableName("shop_user_balance_log") +public class UserBalanceLog implements Serializable { + private static final long serialVersionUID = 1L; + + @ApiModelProperty(value = "主键ID") + @TableId(value = "log_id", type = IdType.AUTO) + private Integer logId; + + @ApiModelProperty(value = "用户ID") + private Integer userId; + + @ApiModelProperty(value = "余额变动场景(10用户充值 20用户消费 30管理员操作 40订单退款)") + private Integer scene; + + @ApiModelProperty(value = "变动金额") + private BigDecimal money; + + @ApiModelProperty(value = "变动后余额") + private BigDecimal balance; + + @ApiModelProperty(value = "管理员备注") + private String remark; + + @ApiModelProperty(value = "操作人ID") + private Integer adminId; + + @ApiModelProperty(value = "订单编号") + private String orderNo; + + @ApiModelProperty(value = "商户ID") + private Integer merchantId; + + @ApiModelProperty(value = "排序(数字越小越靠前)") + private Integer sortNumber; + + @ApiModelProperty(value = "备注") + private String comments; + + @ApiModelProperty(value = "状态, 0正常, 1冻结") + private Integer status; + + @ApiModelProperty(value = "是否删除, 0否, 1是") + @TableLogic + private Integer deleted; + + @ApiModelProperty(value = "商户编码") + private String merchantCode; + + @ApiModelProperty(value = "租户id") + private Integer tenantId; + + @ApiModelProperty(value = "注册时间") + private Date createTime; + + @ApiModelProperty(value = "修改时间") + private Date updateTime; + +} diff --git a/src/main/java/com/gxwebsoft/shop/mapper/UserBalanceLogMapper.java b/src/main/java/com/gxwebsoft/shop/mapper/UserBalanceLogMapper.java new file mode 100644 index 0000000..bba2131 --- /dev/null +++ b/src/main/java/com/gxwebsoft/shop/mapper/UserBalanceLogMapper.java @@ -0,0 +1,37 @@ +package com.gxwebsoft.shop.mapper; + +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import com.baomidou.mybatisplus.core.metadata.IPage; +import com.gxwebsoft.shop.entity.UserBalanceLog; +import com.gxwebsoft.shop.param.UserBalanceLogParam; +import org.apache.ibatis.annotations.Param; + +import java.util.List; + +/** + * 用户余额变动明细表Mapper + * + * @author 科技小王子 + * @since 2024-05-29 15:57:44 + */ +public interface UserBalanceLogMapper extends BaseMapper { + + /** + * 分页查询 + * + * @param page 分页对象 + * @param param 查询参数 + * @return List + */ + List selectPageRel(@Param("page") IPage page, + @Param("param") UserBalanceLogParam param); + + /** + * 查询全部 + * + * @param param 查询参数 + * @return List + */ + List selectListRel(@Param("param") UserBalanceLogParam param); + +} diff --git a/src/main/java/com/gxwebsoft/shop/mapper/xml/UserBalanceLogMapper.xml b/src/main/java/com/gxwebsoft/shop/mapper/xml/UserBalanceLogMapper.xml new file mode 100644 index 0000000..3bd2500 --- /dev/null +++ b/src/main/java/com/gxwebsoft/shop/mapper/xml/UserBalanceLogMapper.xml @@ -0,0 +1,69 @@ + + + + + + + SELECT a.* + FROM shop_user_balance_log a + + + AND a.log_id = #{param.logId} + + + AND a.user_id = #{param.userId} + + + AND a.scene = #{param.scene} + + + AND a.money = #{param.money} + + + AND a.balance = #{param.balance} + + + AND a.remark LIKE CONCAT('%', #{param.remark}, '%') + + + AND a.sort_number = #{param.sortNumber} + + + AND a.comments LIKE CONCAT('%', #{param.comments}, '%') + + + AND a.status = #{param.status} + + + AND a.deleted = #{param.deleted} + + + AND a.deleted = 0 + + + AND a.merchant_code LIKE CONCAT('%', #{param.merchantCode}, '%') + + + AND a.create_time >= #{param.createTimeStart} + + + AND a.create_time <= #{param.createTimeEnd} + + + AND (a.comments LIKE CONCAT('%', #{param.keywords}, '%') + ) + + + + + + + + + + + diff --git a/src/main/java/com/gxwebsoft/shop/param/UserBalanceLogParam.java b/src/main/java/com/gxwebsoft/shop/param/UserBalanceLogParam.java new file mode 100644 index 0000000..22c12ed --- /dev/null +++ b/src/main/java/com/gxwebsoft/shop/param/UserBalanceLogParam.java @@ -0,0 +1,67 @@ +package com.gxwebsoft.shop.param; + +import java.math.BigDecimal; +import com.gxwebsoft.common.core.annotation.QueryField; +import com.gxwebsoft.common.core.annotation.QueryType; +import com.gxwebsoft.common.core.web.BaseParam; +import com.fasterxml.jackson.annotation.JsonInclude; +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; +import lombok.EqualsAndHashCode; + +/** + * 用户余额变动明细表查询参数 + * + * @author 科技小王子 + * @since 2024-05-29 15:57:44 + */ +@Data +@EqualsAndHashCode(callSuper = false) +@JsonInclude(JsonInclude.Include.NON_NULL) +@ApiModel(value = "UserBalanceLogParam对象", description = "用户余额变动明细表查询参数") +public class UserBalanceLogParam extends BaseParam { + private static final long serialVersionUID = 1L; + + @ApiModelProperty(value = "主键ID") + @QueryField(type = QueryType.EQ) + private Integer logId; + + @ApiModelProperty(value = "用户ID") + @QueryField(type = QueryType.EQ) + private Integer userId; + + @ApiModelProperty(value = "余额变动场景(10用户充值 20用户消费 30管理员操作 40订单退款)") + @QueryField(type = QueryType.EQ) + private Integer scene; + + @ApiModelProperty(value = "变动金额") + @QueryField(type = QueryType.EQ) + private BigDecimal money; + + @ApiModelProperty(value = "变动后余额") + @QueryField(type = QueryType.EQ) + private BigDecimal balance; + + @ApiModelProperty(value = "管理员备注") + private String remark; + + @ApiModelProperty(value = "排序(数字越小越靠前)") + @QueryField(type = QueryType.EQ) + private Integer sortNumber; + + @ApiModelProperty(value = "备注") + private String comments; + + @ApiModelProperty(value = "状态, 0正常, 1冻结") + @QueryField(type = QueryType.EQ) + private Integer status; + + @ApiModelProperty(value = "是否删除, 0否, 1是") + @QueryField(type = QueryType.EQ) + private Integer deleted; + + @ApiModelProperty(value = "商户编码") + private String merchantCode; + +} diff --git a/src/main/java/com/gxwebsoft/shop/service/OrderService.java b/src/main/java/com/gxwebsoft/shop/service/OrderService.java index 36d90d6..ae3671d 100644 --- a/src/main/java/com/gxwebsoft/shop/service/OrderService.java +++ b/src/main/java/com/gxwebsoft/shop/service/OrderService.java @@ -2,6 +2,7 @@ package com.gxwebsoft.shop.service; import com.baomidou.mybatisplus.extension.service.IService; import com.gxwebsoft.common.core.web.PageResult; +import com.gxwebsoft.common.system.entity.User; import com.gxwebsoft.shop.entity.Order; import com.gxwebsoft.shop.param.OrderParam; @@ -45,4 +46,6 @@ public interface OrderService extends IService { Order getByOutTradeNo(String outTradeNo); void updateByOutTradeNo(Order order); + + Boolean payByBalance(Order order); } diff --git a/src/main/java/com/gxwebsoft/shop/service/UserBalanceLogService.java b/src/main/java/com/gxwebsoft/shop/service/UserBalanceLogService.java new file mode 100644 index 0000000..69adec2 --- /dev/null +++ b/src/main/java/com/gxwebsoft/shop/service/UserBalanceLogService.java @@ -0,0 +1,42 @@ +package com.gxwebsoft.shop.service; + +import com.baomidou.mybatisplus.extension.service.IService; +import com.gxwebsoft.common.core.web.PageResult; +import com.gxwebsoft.shop.entity.UserBalanceLog; +import com.gxwebsoft.shop.param.UserBalanceLogParam; + +import java.util.List; + +/** + * 用户余额变动明细表Service + * + * @author 科技小王子 + * @since 2024-05-29 15:57:44 + */ +public interface UserBalanceLogService extends IService { + + /** + * 分页关联查询 + * + * @param param 查询参数 + * @return PageResult + */ + PageResult pageRel(UserBalanceLogParam param); + + /** + * 关联查询全部 + * + * @param param 查询参数 + * @return List + */ + List listRel(UserBalanceLogParam param); + + /** + * 根据id查询 + * + * @param logId 主键ID + * @return UserBalanceLog + */ + UserBalanceLog getByIdRel(Integer logId); + +} diff --git a/src/main/java/com/gxwebsoft/shop/service/impl/OrderServiceImpl.java b/src/main/java/com/gxwebsoft/shop/service/impl/OrderServiceImpl.java index a246160..ad5f09e 100644 --- a/src/main/java/com/gxwebsoft/shop/service/impl/OrderServiceImpl.java +++ b/src/main/java/com/gxwebsoft/shop/service/impl/OrderServiceImpl.java @@ -7,20 +7,24 @@ import com.alibaba.fastjson.JSONObject; import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; import com.gxwebsoft.common.core.config.ConfigProperties; +import com.gxwebsoft.common.core.exception.BusinessException; +import com.gxwebsoft.common.core.security.JwtUtil; import com.gxwebsoft.common.core.utils.RedisUtil; +import com.gxwebsoft.common.core.utils.RequestUtil; +import com.gxwebsoft.common.core.web.ApiResult; +import com.gxwebsoft.common.system.entity.User; import com.gxwebsoft.common.system.service.SettingService; -import com.gxwebsoft.shop.entity.OrderGoods; -import com.gxwebsoft.shop.entity.OrderInfo; -import com.gxwebsoft.shop.entity.Payment; +import com.gxwebsoft.common.system.service.UserService; +import com.gxwebsoft.shop.entity.*; import com.gxwebsoft.shop.mapper.OrderMapper; import com.gxwebsoft.shop.param.OrderInfoParam; import com.gxwebsoft.shop.service.OrderGoodsService; import com.gxwebsoft.shop.service.OrderInfoService; import com.gxwebsoft.shop.service.OrderService; -import com.gxwebsoft.shop.entity.Order; import com.gxwebsoft.shop.param.OrderParam; import com.gxwebsoft.common.core.web.PageParam; import com.gxwebsoft.common.core.web.PageResult; +import com.gxwebsoft.shop.service.UserBalanceLogService; import com.wechat.pay.java.core.Config; import com.wechat.pay.java.core.RSAConfig; import com.wechat.pay.java.service.payments.jsapi.JsapiServiceExtension; @@ -28,11 +32,18 @@ import com.wechat.pay.java.service.payments.jsapi.model.Amount; import com.wechat.pay.java.service.payments.jsapi.model.Payer; import com.wechat.pay.java.service.payments.jsapi.model.PrepayRequest; import com.wechat.pay.java.service.payments.jsapi.model.PrepayWithRequestPaymentResponse; +import org.springframework.beans.BeansException; import org.springframework.beans.factory.annotation.Value; +import org.springframework.http.*; import org.springframework.stereotype.Service; +import org.springframework.transaction.annotation.Transactional; import org.springframework.util.CollectionUtils; +import org.springframework.util.LinkedMultiValueMap; +import org.springframework.util.MultiValueMap; +import org.springframework.web.client.RestTemplate; import javax.annotation.Resource; +import java.beans.Beans; import java.math.BigDecimal; import java.util.HashMap; import java.util.List; @@ -59,6 +70,10 @@ public class OrderServiceImpl extends ServiceImpl implements @Resource private SettingService settingService; @Resource + private UserService userService; + @Resource + private UserBalanceLogService userBalanceLogService; + @Resource private RedisUtil redisUtil; public static String privateKeyPath = "/Users/gxwebsoft/JAVA/com.gxwebsoft.core/src/main/resources/cert/apiclient_key.pem"; public static String privateCertPath = "/Users/gxwebsoft/JAVA/com.gxwebsoft.core/src/main/resources/cert/apiclient_cert.pem"; @@ -71,7 +86,7 @@ public class OrderServiceImpl extends ServiceImpl implements page.setDefaultOrder("sort_number asc, create_time desc"); List list = baseMapper.selectPageRel(page, param); - if(param.getSceneType() != null){ + if (param.getSceneType() != null) { final Set orderIds = list.stream().map(Order::getOrderId).collect(Collectors.toSet()); if (!CollectionUtils.isEmpty(orderIds)) { // 查询预定订单信息 @@ -235,4 +250,35 @@ public class OrderServiceImpl extends ServiceImpl implements baseMapper.updateByOutTradeNo(order); } + @Override + @Transactional(rollbackFor = {Exception.class}) + public Boolean payByBalance(Order order) { + final User loginUser = order.getLoginUser(); + if (loginUser.getBalance().compareTo(order.getTotalPrice()) < 0) { + throw new BusinessException("余额不足"); + } + // 发起网络请求(更新余额接口) + final RequestUtil requestUtil = new RequestUtil(); + requestUtil.setAccessToken(order.getAccessToken()); + requestUtil.setTenantId(order.getTenantId().toString()); + String api = "/system/user/updateUserBalance"; // 更新余额接口 + final BigDecimal subtract = loginUser.getBalance().subtract(order.getTotalPrice()); + loginUser.setBalance(subtract); + final ApiResult apiResult = requestUtil.updateUserBalance(api, loginUser); + if (apiResult.getCode().equals(0)) { + // 记录余额明细 + final UserBalanceLog balanceLog = new UserBalanceLog(); + balanceLog.setUserId(order.getUserId()); + balanceLog.setScene(20); + balanceLog.setOrderNo(order.getOrderNo()); + balanceLog.setMoney(order.getPayPrice()); + balanceLog.setBalance(subtract); + balanceLog.setRemark(order.getComments()); + balanceLog.setMerchantId(order.getMerchantId()); + userBalanceLogService.save(balanceLog); + return true; + } + return false; + } + } diff --git a/src/main/java/com/gxwebsoft/shop/service/impl/UserBalanceLogServiceImpl.java b/src/main/java/com/gxwebsoft/shop/service/impl/UserBalanceLogServiceImpl.java new file mode 100644 index 0000000..ec4ecb8 --- /dev/null +++ b/src/main/java/com/gxwebsoft/shop/service/impl/UserBalanceLogServiceImpl.java @@ -0,0 +1,47 @@ +package com.gxwebsoft.shop.service.impl; + +import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; +import com.gxwebsoft.shop.mapper.UserBalanceLogMapper; +import com.gxwebsoft.shop.service.UserBalanceLogService; +import com.gxwebsoft.shop.entity.UserBalanceLog; +import com.gxwebsoft.shop.param.UserBalanceLogParam; +import com.gxwebsoft.common.core.web.PageParam; +import com.gxwebsoft.common.core.web.PageResult; +import org.springframework.stereotype.Service; + +import java.util.List; + +/** + * 用户余额变动明细表Service实现 + * + * @author 科技小王子 + * @since 2024-05-29 15:57:44 + */ +@Service +public class UserBalanceLogServiceImpl extends ServiceImpl implements UserBalanceLogService { + + @Override + public PageResult pageRel(UserBalanceLogParam param) { + PageParam page = new PageParam<>(param); + page.setDefaultOrder("sort_number asc, create_time desc"); + List list = baseMapper.selectPageRel(page, param); + return new PageResult<>(list, page.getTotal()); + } + + @Override + public List listRel(UserBalanceLogParam param) { + List list = baseMapper.selectListRel(param); + // 排序 + PageParam page = new PageParam<>(); + page.setDefaultOrder("sort_number asc, create_time desc"); + return page.sortRecords(list); + } + + @Override + public UserBalanceLog getByIdRel(Integer logId) { + UserBalanceLogParam param = new UserBalanceLogParam(); + param.setLogId(logId); + return param.getOne(baseMapper.selectListRel(param)); + } + +} diff --git a/src/main/resources/application-dev.yml b/src/main/resources/application-dev.yml index b6f26b7..b0267c7 100644 --- a/src/main/resources/application-dev.yml +++ b/src/main/resources/application-dev.yml @@ -21,5 +21,5 @@ socketio: # 框架配置 config: # 开发环境接口 - server-url: http://127.0.0.1:9090/api + server-url: http://127.0.0.1:9091/api upload-path: D:\Temp diff --git a/src/test/java/com/gxwebsoft/generator/ShopGenerator.java b/src/test/java/com/gxwebsoft/generator/ShopGenerator.java index 0684a38..90d2adb 100644 --- a/src/test/java/com/gxwebsoft/generator/ShopGenerator.java +++ b/src/test/java/com/gxwebsoft/generator/ShopGenerator.java @@ -47,7 +47,7 @@ public class ShopGenerator { // 需要生成的表 private static final String[] TABLE_NAMES = new String[]{ // "shop_spec", -// "shop_spec_value" +// "shop_spec_value", // "shop_goods", // "shop_goods_spec", // "shop_goods_sku", @@ -57,23 +57,24 @@ public class ShopGenerator { // "shop_goods_log", // "shop_goods_relation", // "shop_goods_comment", -// "shop_goods_rule" -// "shop_brand", +// "shop_goods_rule", +// "shop_brand", // "shop_merchant", // "shop_merchant_type", -// "shop_merchant_apply", +// "shop_merchant_apply", // "shop_merchant_account", // "shop_chat_message", -// "shop_chat_conversation" +// "shop_chat_conversation", // "shop_user_collection", -// "shop_mp_menu" -// "shop_order", -// "shop_order_info", -// "shop_order_info_log", - "shop_order_goods", -// "shop_wechat_deposit" -// "shop_users", -// "shop_user_address" +// "shop_mp_menu", +// "shop_order", +// "shop_order_info", +// "shop_order_info_log", +// "shop_order_goods", +// "shop_wechat_deposit", +// "shop_users", +// "shop_user_address", + "shop_user_balance_log" }; // 需要去除的表前缀 private static final String[] TABLE_PREFIX = new String[]{