ruoyi-api/ruoyi-api-account/src/main/java/com/ruoyi/account/api/factory/AppUserClientFallbackFactory.java
@@ -74,12 +74,23 @@ } @Override public R<List<AppUser>> getAppUserByName(String name) { return R.fail("根据用户名称模糊搜索用户列表失败:" + cause.getMessage()); } @Override public R<List<AppUser>> getAppUserByPhone(String phone) { return R.fail("根据用户电话模糊搜索用户列表失败:" + cause.getMessage()); } @Override public R<Void> addAppUserShop(AppUserShop appUserShop) { return R.fail("添加失败"); } @Override public R<AppUser> getAppUserByPhone(String phone) { public R<AppUser> getAppUserByPhone1(String phone) { return R.fail("通过手机号查询用户失败"); } ruoyi-api/ruoyi-api-account/src/main/java/com/ruoyi/account/api/feignClient/AppUserClient.java
@@ -58,9 +58,27 @@ @PostMapping("/app-user/getVipCount") R<Long> getVipCount(@RequestParam("userId")Long userId, @RequestParam("vipId") Integer vipId ); @GetMapping("/app-user/getAppUserByPhone") R<AppUser> getAppUserByPhone(@RequestParam("phone") String phone); @GetMapping("/app-user/listByIds") List<AppUser> listByIds(List<String> list); /** * 根据用户名称模糊搜索用户列表 * @param name * @return */ @PostMapping("/app-user/getAppUserByName") R<List<AppUser>> getAppUserByName(@RequestParam("name") String name); /** * 根据用户电话模糊搜索用户列表 * @param phone * @return */ @PostMapping("/app-user/getAppUserByPhone") R<List<AppUser>> getAppUserByPhone(@RequestParam("phone") String phone); @PostMapping("/app-user/getAppUserByPhone1") R<AppUser> getAppUserByPhone1(String phone); } ruoyi-api/ruoyi-api-account/src/main/java/com/ruoyi/account/api/model/BalanceChangeRecord.java
@@ -31,7 +31,7 @@ @ApiModelProperty("订单id") private Long orderId; @ApiModelProperty("类型:1充值2提现3红包4分佣5商城购物") @ApiModelProperty("类型:1充值2提现3红包4分佣5商城购物6订单取消回退") private Integer changeType; @ApiModelProperty("变更前金额") ruoyi-api/ruoyi-api-order/src/main/java/com/ruoyi/order/model/Order.java
@@ -104,7 +104,6 @@ @TableField("discount_total_amount") private BigDecimal discountTotalAmount; @ApiModelProperty(value = "实际支付价格") @TableField("payment_amount") private BigDecimal paymentAmount; ruoyi-api/ruoyi-api-order/src/main/java/com/ruoyi/order/model/OrderBalancePayment.java
New file @@ -0,0 +1,39 @@ package com.ruoyi.order.model; import com.baomidou.mybatisplus.annotation.IdType; import com.baomidou.mybatisplus.annotation.TableField; import com.baomidou.mybatisplus.annotation.TableId; import com.baomidou.mybatisplus.annotation.TableName; import io.swagger.annotations.ApiModelProperty; import lombok.Data; import java.math.BigDecimal; /** * @author zhibing.pu * @Date 2024/12/13 16:41 */ @Data @TableName("t_order_balance_payment") public class OrderBalancePayment { /** * 主键 */ @TableId(value = "id", type = IdType.NONE) private Long id; /** * 订单id */ @TableField("order_id") private Long orderId; /** * 红包支付金额 */ @TableField("red_packet_amount") private BigDecimal redPacketAmount; /** * 分销金额支付金额 */ @TableField("distribution_amount") private BigDecimal distributionAmount; } ruoyi-api/ruoyi-api-system/src/main/java/com/ruoyi/system/api/query/ChangeUserQuery.java
@@ -11,5 +11,6 @@ @ApiModelProperty(value = "用户名称") private String nickName; private Integer objectId; } ruoyi-auth/src/main/java/com/ruoyi/auth/form/LoginBody.java
@@ -16,6 +16,10 @@ * 用户密码 */ private String password; /** * 登录平台类型(1=平台,2=门店) */ private Integer roleType; public String getUsername() { @@ -36,4 +40,12 @@ { this.password = password; } public Integer getRoleType() { return roleType; } public void setRoleType(Integer roleType) { this.roleType = roleType; } } ruoyi-common/ruoyi-common-core/src/main/java/com/ruoyi/common/core/utils/MsgUtil.java
@@ -9,9 +9,9 @@ public class MsgUtil { public final static String ecName= "四川明星新能源科技有限公司"; public final static String secretKey= "MX_xny2023?9"; public final static String sign= "1PUAVuY2b"; public final static String ecName= ""; public final static String secretKey= ""; public final static String sign= ""; ruoyi-common/ruoyi-common-core/src/main/java/com/ruoyi/common/core/web/page/TableDataInfo.java
@@ -1,5 +1,7 @@ package com.ruoyi.common.core.web.page; import io.swagger.annotations.ApiModel; import java.io.Serializable; import java.util.List; @@ -8,6 +10,7 @@ * * @author ruoyi */ @ApiModel public class TableDataInfo<T> implements Serializable { private static final long serialVersionUID = 1L; ruoyi-modules/ruoyi-system/src/main/java/com/ruoyi/system/controller/SysUserController.java
@@ -10,6 +10,7 @@ import com.ruoyi.common.log.annotation.Log; import com.ruoyi.common.log.enums.BusinessType; import com.ruoyi.common.security.annotation.InnerAuth; import com.ruoyi.common.security.service.TokenService; import com.ruoyi.common.security.utils.SecurityUtils; import com.ruoyi.system.api.domain.SysDept; import com.ruoyi.system.api.domain.SysRole; @@ -69,6 +70,9 @@ @Resource private UserShopService userShopService; @Resource private TokenService tokenService; @@ -77,7 +81,7 @@ * 获取用户列表 */ @GetMapping("/list") @ApiOperation(value = "获取系统用户列表", tags = {"管理后台-账号管理"}) @ApiOperation(value = "获取系统用户列表", tags = {"管理后台-账号管理", "门店后台-部门管理"}) public AjaxResult list(GetSysUserList getSysUserList) { PageInfo<SysUser> pageInfo = new PageInfo<>(getSysUserList.getPageCurr(), getSysUserList.getPageSize()); PageInfo<SysUser> page = userService.getList(pageInfo, getSysUserList); @@ -88,7 +92,7 @@ * 获取用户选择列表 */ @PostMapping("/getChangeUserList") @ApiOperation(value = "获取用户选择列表", tags = {"管理后台-获取用户选择列表"}) @ApiOperation(value = "获取用户选择列表", tags = {"管理后台-获取用户选择列表", "门店后台-部门管理"}) public AjaxResult<PageInfo<SysUser>> getChangeUserList(@RequestBody ChangeUserQuery query) { return AjaxResult.success(userService.getChangeUserList(query)); } @@ -98,9 +102,14 @@ */ @Log(title = "用户管理", businessType = BusinessType.INSERT) @PostMapping("/add") @ApiOperation(value = "添加系统用户", tags = {"管理后台-账号管理"}) @ApiOperation(value = "添加系统用户", tags = {"管理后台-账号管理", "门店后台-部门管理"}) public AjaxResult add(@RequestBody SysUser user) { user.setUserName(user.getPhonenumber()); Long userid = tokenService.getLoginUser().getUserid(); SysUser sysUser1 = userService.getById(userid); if(sysUser1.getRoleType() == 2){ user.setObjectId(sysUser1.getObjectId()); } if(!org.springframework.util.StringUtils.hasLength(user.getNickName())){ user.setNickName(user.getPhonenumber()); } @@ -141,7 +150,7 @@ /** * 根据用户编号获取详细信息 */ @ApiOperation(value = "获取用户详情", tags = {"管理后台-账号管理"}) @ApiOperation(value = "获取用户详情", tags = {"管理后台-账号管理", "门店后台-部门管理"}) @GetMapping("/getInfo/{userId}") public AjaxResult getInfo(@PathVariable Long userId) { userService.checkUserDataScope(userId); @@ -164,7 +173,7 @@ */ @Log(title = "用户管理", businessType = BusinessType.UPDATE) @PutMapping("/update") @ApiOperation(value = "编辑系统用户", tags = {"管理后台-账号管理"}) @ApiOperation(value = "编辑系统用户", tags = {"管理后台-账号管理", "门店后台-部门管理"}) public AjaxResult edit(@Validated @RequestBody SysUser user) { user.setUserName(user.getPhonenumber()); if(!org.springframework.util.StringUtils.hasLength(user.getNickName())){ @@ -214,7 +223,7 @@ */ @Log(title = "用户管理", businessType = BusinessType.DELETE) @DeleteMapping("/{userIds}") @ApiOperation(value = "删除系统用户", tags = {"管理后台-账号管理"}) @ApiOperation(value = "删除系统用户", tags = {"管理后台-账号管理", "门店后台-部门管理"}) public AjaxResult remove(@PathVariable Long[] userIds) { if (ArrayUtils.contains(userIds, SecurityUtils.getUserId())) { return error("当前用户不能删除"); @@ -226,7 +235,7 @@ @PostMapping("/shopUserStart") @ApiOperation(value = "账号管理--禁用/启用", tags = {"管理后台-账号管理"}) @ApiOperation(value = "账号管理--禁用/启用", tags = {"管理后台-账号管理", "门店后台-部门管理"}) public AjaxResult shopUserStart(@RequestBody ShopUserStart shopUserStart) { if (shopUserStart.getUserId() == null) { return AjaxResult.error("userId不能为空"); @@ -352,7 +361,7 @@ */ @Log(title = "用户管理", businessType = BusinessType.UPDATE) @PutMapping("/resetPwd") @ApiOperation(value = "重置密码", tags = {"管理后台-账号管理"}) @ApiOperation(value = "重置密码", tags = {"管理后台-账号管理", "门店后台-部门管理"}) public AjaxResult resetPwd(@RequestBody SysUser user) { userService.checkUserAllowed(user); userService.checkUserDataScope(user.getUserId()); ruoyi-modules/ruoyi-system/src/main/java/com/ruoyi/system/query/GetSysUserList.java
@@ -22,4 +22,5 @@ private List<Integer> roleIds; @ApiModelProperty(value = "账户状态(0=正常,1=禁用)") private Integer status; private Integer objectId; } ruoyi-modules/ruoyi-system/src/main/java/com/ruoyi/system/service/impl/SysUserServiceImpl.java
@@ -509,6 +509,11 @@ @Override public PageInfo<SysUser> getList(PageInfo<SysUser> pageInfo, GetSysUserList getSysUserList) { Long userid = tokenService.getLoginUser().getUserid(); SysUser sysUser1 = this.getById(userid); if(sysUser1.getRoleType() == 2){ getSysUserList.setObjectId(sysUser1.getObjectId()); } List<SysUser> list = this.baseMapper.getList(pageInfo, getSysUserList); for (SysUser sysUser : list) { List<SysUserRole> list1 = sysUserRoleService.list(new LambdaQueryWrapper<SysUserRole>().eq(SysUserRole::getUserId, sysUser.getUserId())); @@ -541,6 +546,11 @@ @Override public PageInfo<SysUser> getChangeUserList(ChangeUserQuery query) { Long userid = tokenService.getLoginUser().getUserid(); SysUser sysUser1 = this.getById(userid); if(sysUser1.getRoleType() == 2){ query.setObjectId(sysUser1.getObjectId()); } PageInfo<SysUser> pageInfo = new PageInfo<>(query.getPageCurr(), query.getPageSize()); List<SysUser> list = this.baseMapper.getChangeUserList(pageInfo, query); return pageInfo.setRecords(list); ruoyi-modules/ruoyi-system/src/main/resources/mapping/system/SysUserMapper.xml
@@ -113,11 +113,19 @@ </select> <select id="checkUserNameUnique" parameterType="String" resultMap="SysUserResult"> select user_id, user_name from sys_user where user_name = #{userName} and del_flag = '0' limit 1 select user_id, user_name from sys_user where user_name = #{userName} <if test="null != objectId"> and objectId = #{objectId} </if> and del_flag = '0' limit 1 </select> <select id="checkPhoneUnique" parameterType="String" resultMap="SysUserResult"> select user_id, phonenumber from sys_user where phonenumber = #{phonenumber} and del_flag = '0' limit 1 select user_id, phonenumber from sys_user where phonenumber = #{phonenumber} <if test="null != objectId"> and objectId = #{objectId} </if> and del_flag = '0' limit 1 </select> <select id="checkEmailUnique" parameterType="String" resultMap="SysUserResult"> @@ -141,6 +149,9 @@ </if> <if test="null != req.status"> and status = #{req.status} </if> <if test="null != req.objectId"> and objectId = #{req.objectId} </if> and del_flag = '0' and role_type =1 order by create_time desc @@ -168,6 +179,9 @@ <if test="query.nickName != null and query.nickName != ''"> AND nick_name LIKE concat('%',#{query.nickName},'%') </if> <if test="null != query.objectId"> and objectId = #{query.objectId} </if> AND del_flag = '0' AND role_type = 1 </where> ruoyi-service/ruoyi-account/src/main/java/com/ruoyi/account/controller/AppUserController.java
@@ -1,6 +1,15 @@ package com.ruoyi.account.controller; import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; import com.ruoyi.account.api.model.AppUser; import com.ruoyi.account.api.model.UserCancellationLog; import com.ruoyi.account.api.model.UserCoupon; import com.ruoyi.account.api.model.UserSignRecord; import com.ruoyi.account.service.AppUserService; import com.ruoyi.account.service.UserCancellationLogService; import com.ruoyi.account.service.UserCouponService; import com.ruoyi.account.service.UserSignRecordService; import com.baomidou.mybatisplus.core.metadata.IPage; import com.baomidou.mybatisplus.extension.plugins.pagination.Page; import com.ruoyi.account.api.model.*; @@ -73,6 +82,10 @@ public R<LoginVo> mobileLogin(@RequestBody MobileLogin mobileLogin){ return appUserService.mobileLogin(mobileLogin); } @ResponseBody @@ -349,6 +362,34 @@ return R.ok(); } /** * 根据用户名称模糊搜索用户列表 * @param name * @return */ @PostMapping("/getAppUserByName") public R<List<AppUser>> getAppUserByName(@RequestParam("name") String name){ List<AppUser> list = appUserService.list(new LambdaQueryWrapper<AppUser>().eq(AppUser::getDelFlag, 0).eq(AppUser::getStatus, 1) .like(AppUser::getName, name)); return R.ok(list); } /** * 根据用户电话模糊搜索用户列表 * @param phone * @return */ @PostMapping("/getAppUserByPhone") public R<List<AppUser>> getAppUserByPhone(@RequestParam("phone") String phone){ List<AppUser> list = appUserService.list(new LambdaQueryWrapper<AppUser>().eq(AppUser::getDelFlag, 0).eq(AppUser::getStatus, 1) .like(AppUser::getPhone, phone)); return R.ok(list); } /** * 获取用户列表 */ @@ -473,17 +514,20 @@ @GetMapping("/getAppUserByPhone") public R<AppUser> getAppUserByPhone(String phone){ AppUser appUser = appUserService.lambdaQuery().eq(AppUser::getPhone, phone).one(); return R.ok(appUser); } @GetMapping("/listByIds") List<AppUser> listByIds(List<String> list){ return appUserService.listByIds(list); } @PostMapping("/getAppUserByPhone1") public R<AppUser> getAppUserByPhone1(@RequestParam("phone") String phone){ AppUser appUser = appUserService.getOne(new LambdaQueryWrapper<AppUser>().eq(AppUser::getDelFlag, 0).eq(AppUser::getStatus, 1) .eq(AppUser::getPhone, phone)); return R.ok(appUser); } } ruoyi-service/ruoyi-account/src/main/java/com/ruoyi/account/controller/UserCouponController.java
@@ -14,7 +14,9 @@ import com.ruoyi.common.core.utils.bean.BeanUtils; import com.ruoyi.account.api.vo.PaymentUserCoupon; import com.ruoyi.other.api.domain.Goods; import com.ruoyi.other.api.domain.PointSetting; import com.ruoyi.other.api.feignClient.GoodsClient; import com.ruoyi.other.api.feignClient.PointSettingClient; import org.springframework.web.bind.annotation.*; import javax.annotation.Resource; @@ -54,6 +56,9 @@ private UserPointService userPointService; @Resource private GoodsClient goodsClient; @Resource private PointSettingClient pointSettingClient; @@ -131,16 +136,20 @@ } //如果是积分兑换,增加积分的历史记录 if (data.getSendType()!=1){ int point = data.getNeedPoint().intValue(); Integer lavePoint = byId.getLavePoint(); //扣除积分 byId.setLavePoint(byId.getLavePoint() - point); appUserService.updateById(byId); UserPoint userPoint = new UserPoint(); userPoint.setType(4); userPoint.setHistoricalPoint(byId.getLavePoint()); userPoint.setVariablePoint(data.getNeedPoint().intValue()); userPoint.setHistoricalPoint(lavePoint); userPoint.setVariablePoint(point); userPoint.setBalance(byId.getLavePoint()); userPoint.setAppUserId(userid); userPoint.setObjectId(Long.valueOf(data.getId())); userPointService.save(userPoint); //扣除积分 byId.setLavePoint(byId.getLavePoint() - userPoint.getVariablePoint()); appUserService.updateById(byId); } //增加优惠券记录,根据时间类型设置开始结束时间 UserCoupon userCoupon = new UserCoupon(); ruoyi-service/ruoyi-account/src/main/java/com/ruoyi/account/service/impl/AppUserServiceImpl.java
@@ -306,8 +306,14 @@ if (pointSetting == null){ throw new RuntimeException("积分设置不存在"); } appUser.setLavePoint(pointSetting.getGetRegisPoint()); appUser.setTotalPoint(0); Integer getRegisPoint = pointSetting.getGetRegisPoint(); Integer getRegisPoint1 = getRegisPoint; //计算可用积分比例 if(1 == pointSetting.getGetRegisPointOpen()){ getRegisPoint1 = getRegisPoint1 * (100 - pointSetting.getGetRegisPoint()); } appUser.setLavePoint(getRegisPoint1); appUser.setTotalPoint(getRegisPoint); //根据平台的配置未达标,则标注为可修改推广人 appUser.setChangePromoter(0); appUser.setLongitude(registerAccount.getLongitude()); @@ -320,6 +326,18 @@ // appUser.setDistrict(); // appUser.setDistrictCode(); this.save(appUser); //增加积分变动记录 if(getRegisPoint1 > 0){ //构建积分流水记录 UserPoint userPoint = new UserPoint(); userPoint.setType(10); userPoint.setHistoricalPoint(0); userPoint.setVariablePoint(getRegisPoint1); userPoint.setBalance(appUser.getLavePoint()); userPoint.setCreateTime(LocalDateTime.now()); userPoint.setAppUserId(appUser.getId()); userPointService.save(userPoint); } //获取微信推广二维码 String fileName = UUID.randomUUID() + ".jpg"; weChatUtil.getwxacodeunlimit("pages/login/login", "id=" + appUser.getId(), EnvVersion.DEVELOP, filePath + fileName); @@ -376,6 +394,28 @@ */ public void vipUpgrade(Long id){ AppUser appUser = this.getById(id); Integer lavePoint = appUser.getLavePoint(); //计算积分 PointSetting pointSetting = pointSettingClient.getPointSetting(appUser.getVipId()).getData(); Integer newPoint = pointSetting.getNewPoint(); Integer newPoint1 = newPoint; if(null != pointSetting && 1 == pointSetting.getGetNewPointOpen()){ newPoint1 = newPoint1 * (100 - pointSetting.getGetNewPoint()); } appUser.setLavePoint(appUser.getLavePoint() + newPoint1); appUser.setTotalPoint(appUser.getTotalPoint() + newPoint); //记录积分变动 if(newPoint1 > 0){ //构建积分流水记录 UserPoint userPoint = new UserPoint(); userPoint.setType(3); userPoint.setHistoricalPoint(lavePoint); userPoint.setVariablePoint(newPoint1); userPoint.setBalance(appUser.getLavePoint()); userPoint.setCreateTime(LocalDateTime.now()); userPoint.setAppUserId(appUser.getId()); userPointService.save(userPoint); } Integer vipId = appUser.getVipId(); //钻石会员 VipSetting vipSetting3 = vipSettingClient.getVipSetting(3).getData(); @@ -592,9 +632,13 @@ PointSetting pointSetting = pointSettingClient.getPointSetting(appUser.getVipId()).getData(); if(null != pointSetting){ int hourPoint = pointSetting.getHourPoint().intValue(); int hourPoint1 = hourPoint; if(1 == pointSetting.getWorkPointOpen()){ hourPoint1 = hourPoint1 * (100 - pointSetting.getWorkPoint()); } Integer lavePoint = appUser.getLavePoint(); appUser.setTotalPoint(appUser.getTotalPoint() + hourPoint); appUser.setLavePoint(appUser.getLavePoint() + hourPoint); appUser.setLavePoint(appUser.getLavePoint() + hourPoint1); this.updateById(appUser); //添加积分变动记录 UserPoint userPoint = new UserPoint(); ruoyi-service/ruoyi-account/src/main/java/com/ruoyi/account/service/impl/UserPointServiceImpl.java
@@ -213,8 +213,8 @@ Page<UserPoint> userPointPage = page(page, new LambdaQueryWrapper<UserPoint>() .in(!CollectionUtils.isEmpty(userIds), UserPoint::getAppUserId, userIds) .eq(UserPoint::getType, userPoint.getType()) .between(UserPoint::getCreateTime, userPoint.getStartTime(), userPoint.getEndTime()) .eq(userPoint.getType() != null, UserPoint::getType, userPoint.getType()) .between( userPoint.getStartTime()!= null && userPoint.getEndTime() !=null,UserPoint::getCreateTime, userPoint.getStartTime(), userPoint.getEndTime()) .orderByDesc(UserPoint::getCreateTime)); userPointPage.getRecords().forEach(userPoint1 -> appUserList.stream() ruoyi-service/ruoyi-order/pom.xml
@@ -150,6 +150,12 @@ <groupId>com.github.pagehelper</groupId> <artifactId>pagehelper-spring-boot-starter</artifactId> </dependency> <dependency> <groupId>com.github.kuaidi100-api</groupId> <artifactId>sdk</artifactId> <version>1.0.11</version> </dependency> </dependencies> <build> ruoyi-service/ruoyi-order/src/main/java/com/ruoyi/order/controller/OrderController.java
@@ -14,8 +14,7 @@ import com.ruoyi.order.model.Order; import com.ruoyi.order.service.CommissionService; import com.ruoyi.order.service.OrderService; import com.ruoyi.order.vo.OrderDetailVO; import com.ruoyi.order.vo.OrderVO; import com.ruoyi.order.vo.*; import com.ruoyi.other.api.domain.BaseSetting; import com.ruoyi.other.api.feignClient.BaseSettingClient; import com.ruoyi.system.api.model.LoginUser; @@ -213,5 +212,50 @@ } @ResponseBody @GetMapping("/getOrderPageList") @ApiOperation(value = "获取订单列表", tags = {"管理后台-订单管理", "门店后台-订单管理"}) public TableDataInfo<OrderPageListVo> getOrderPageList(OrderPageList orderPageList){ startPage(); List<OrderPageListVo> list = orderService.getOrderPageList(orderPageList); return getDataTable(list); } @ResponseBody @PutMapping("/confirmDelivery/{orderId}") @ApiOperation(value = "已发货操作", tags = {"管理后台-订单管理"}) public R confirmDelivery(@PathVariable("orderId") String orderId, String code){ return orderService.confirmDelivery(orderId, code); } @ResponseBody @PutMapping("/cancelOrder/{orderId}") @ApiOperation(value = "取消订单操作", tags = {"管理后台-订单管理"}) public R cancelOrder(@PathVariable("orderId") Long orderId){ return orderService.cancelOrder(orderId); } @ResponseBody @PutMapping("/receivingOperation/{orderId}") @ApiOperation(value = "收货操作", tags = {"管理后台-订单管理"}) public R receivingOperation(@PathVariable("orderId") Long orderId){ return orderService.receivingOperation(orderId); } @ResponseBody @GetMapping("/getOrderInfo/{orderId}") @ApiOperation(value = "查询订单详情", tags = {"管理后台-订单管理"}) public R<OrderInfoVo> getOrderInfo(@PathVariable("orderId") Long orderId){ OrderInfoVo orderInfo = orderService.getOrderInfo(orderId); return R.ok(orderInfo); } } ruoyi-service/ruoyi-order/src/main/java/com/ruoyi/order/mapper/OrderBalancePaymentMapper.java
New file @@ -0,0 +1,11 @@ package com.ruoyi.order.mapper; import com.baomidou.mybatisplus.core.mapper.BaseMapper; import com.ruoyi.order.model.OrderBalancePayment; /** * @author zhibing.pu * @Date 2024/12/13 16:44 */ public interface OrderBalancePaymentMapper extends BaseMapper<OrderBalancePayment> { } ruoyi-service/ruoyi-order/src/main/java/com/ruoyi/order/mapper/OrderMapper.java
@@ -1,6 +1,8 @@ package com.ruoyi.order.mapper; import com.baomidou.mybatisplus.core.mapper.BaseMapper; import com.ruoyi.order.vo.OrderPageList; import com.ruoyi.order.vo.OrderPageListVo; import com.ruoyi.order.vo.OrderVO; import com.ruoyi.order.model.Order; import org.apache.ibatis.annotations.Param; @@ -20,4 +22,12 @@ * 查询用户id */ List<OrderVO> selectOrderListByUserId(@Param("status") Integer status, @Param("userId") Long userId); /** * 管理后台获取订单列表数据 * @param orderPageList * @return */ List<OrderPageListVo> getOrderPageList(@Param("item") OrderPageList orderPageList); } ruoyi-service/ruoyi-order/src/main/java/com/ruoyi/order/service/OrderBalancePaymentService.java
New file @@ -0,0 +1,11 @@ package com.ruoyi.order.service; import com.baomidou.mybatisplus.extension.service.IService; import com.ruoyi.order.model.OrderBalancePayment; /** * @author zhibing.pu * @Date 2024/12/13 16:43 */ public interface OrderBalancePaymentService extends IService<OrderBalancePayment> { } ruoyi-service/ruoyi-order/src/main/java/com/ruoyi/order/service/OrderService.java
@@ -1,9 +1,10 @@ package com.ruoyi.order.service; import com.baomidou.mybatisplus.extension.service.IService; import com.ruoyi.common.core.domain.R; import com.ruoyi.order.model.Order; import com.ruoyi.order.vo.OrderDetailVO; import com.ruoyi.order.vo.OrderVO; import com.ruoyi.order.vo.*; import org.springframework.web.bind.annotation.PathVariable; import java.util.List; @@ -24,4 +25,44 @@ void writeOff(String code,Integer shopId); /** * 获取管理后台订单列表数据 * @param orderPageList * @return */ List<OrderPageListVo> getOrderPageList(OrderPageList orderPageList); /** * 确认发货操作 * @param orderId * @param code * @return */ R confirmDelivery(String orderId, String code); /** * 取消订单操作 * @param orderId * @return */ R cancelOrder(Long orderId); /** * 收货操作 * @param orderId * @return */ R receivingOperation(Long orderId); /** * 获取订单详情 * @param orderId * @return */ OrderInfoVo getOrderInfo(Long orderId); } ruoyi-service/ruoyi-order/src/main/java/com/ruoyi/order/service/impl/OrderBalancePaymentServiceImpl.java
New file @@ -0,0 +1,15 @@ package com.ruoyi.order.service.impl; import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; import com.ruoyi.order.mapper.OrderBalancePaymentMapper; import com.ruoyi.order.model.OrderBalancePayment; import com.ruoyi.order.service.OrderBalancePaymentService; import org.springframework.stereotype.Service; /** * @author zhibing.pu * @Date 2024/12/13 16:43 */ @Service public class OrderBalancePaymentServiceImpl extends ServiceImpl<OrderBalancePaymentMapper, OrderBalancePayment> implements OrderBalancePaymentService { } ruoyi-service/ruoyi-order/src/main/java/com/ruoyi/order/service/impl/OrderServiceImpl.java
@@ -1,12 +1,14 @@ package com.ruoyi.order.service.impl; import cn.hutool.core.collection.CollectionUtil; import com.alibaba.fastjson2.JSON; import com.alibaba.fastjson2.JSONObject; import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; import com.ruoyi.account.api.feignClient.AppUserClient; import com.ruoyi.account.api.model.AppUserShop; import com.ruoyi.account.api.model.UserAddress; import com.ruoyi.account.api.feignClient.BalanceChangeRecordClient; import com.ruoyi.account.api.feignClient.UserPointClient; import com.ruoyi.account.api.model.*; import com.ruoyi.common.core.domain.R; import com.ruoyi.common.core.exception.ServiceException; import com.ruoyi.common.core.utils.StringUtils; @@ -15,24 +17,28 @@ import com.ruoyi.order.mapper.OrderGoodMapper; import com.ruoyi.order.mapper.OrderMapper; import com.ruoyi.order.model.Order; import com.ruoyi.order.model.OrderBalancePayment; import com.ruoyi.order.model.OrderGood; import com.ruoyi.order.service.CommissionService; import com.ruoyi.order.service.OrderBalancePaymentService; import com.ruoyi.order.service.OrderService; import com.ruoyi.order.vo.OrderDetailVO; import com.ruoyi.order.vo.OrderGoodsVO; import com.ruoyi.order.vo.OrderVO; import com.ruoyi.order.util.ExpressDeliveryUtil; import com.ruoyi.order.util.vo.QueryKD100Vo; import com.ruoyi.order.vo.*; import com.ruoyi.other.api.domain.*; import com.ruoyi.other.api.feignClient.BaseSettingClient; import com.ruoyi.other.api.feignClient.ShopClient; import com.ruoyi.other.api.feignClient.TechnicianClient; import com.ruoyi.other.api.feignClient.*; import com.ruoyi.system.api.domain.SysUser; import com.ruoyi.system.api.feignClient.SysUserClient; import com.ruoyi.system.api.model.LoginUser; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; import javax.annotation.Resource; import java.math.BigDecimal; import java.math.RoundingMode; import java.time.LocalDateTime; import java.util.ArrayList; import java.util.List; import java.time.format.DateTimeFormatter; import java.util.*; import java.util.stream.Collectors; /** @@ -61,6 +67,29 @@ private CommissionService commissionService; @Resource private BaseSettingClient baseSettingClient; @Resource private SysUserClient sysUserClient; @Resource private BalanceChangeRecordClient balanceChangeRecordClient; @Resource private UserPointClient userPointClient; @Resource private PointSettingClient pointSettingClient; @Resource private OrderBalancePaymentService orderBalancePaymentService; @Resource private VipSettingClient vipSettingClient; @Resource private GoodsClient goodsClient; @Override @@ -223,4 +252,277 @@ Long days = jsonObject.getLong("days"); commissionService.addToCommissionDelayQueue(order.getId(), LocalDateTime.now().plusDays(days)); } /** * 管理后台获取订单列表数据 * @param orderPageList * @return */ @Override public List<OrderPageListVo> getOrderPageList(OrderPageList orderPageList) { Long userid = tokenService.getLoginUser().getUserid(); SysUser sysUser = sysUserClient.getSysUser(userid).getData(); if(2 == sysUser.getRoleType()){ orderPageList.setShopId(sysUser.getObjectId()); } //搜索条件,用户姓名 if(StringUtils.isNotEmpty(orderPageList.getUserName())){ List<AppUser> data = appUserClient.getAppUserByName(orderPageList.getUserName()).getData(); List<Long> collect = data.stream().map(AppUser::getId).collect(Collectors.toList()); if(null != orderPageList.getAppUserIds()){ List<Long> appUserIds = orderPageList.getAppUserIds(); appUserIds.addAll(collect); orderPageList.setAppUserIds(appUserIds); }else{ orderPageList.setAppUserIds(collect); } } //搜索条件,用户电话 if(StringUtils.isNotEmpty(orderPageList.getPhone())){ List<AppUser> data = appUserClient.getAppUserByPhone(orderPageList.getPhone()).getData(); List<Long> collect = data.stream().map(AppUser::getId).collect(Collectors.toList()); if(null != orderPageList.getAppUserIds()){ List<Long> appUserIds = orderPageList.getAppUserIds(); appUserIds.addAll(collect); orderPageList.setAppUserIds(appUserIds); }else{ orderPageList.setAppUserIds(collect); } } List<OrderPageListVo> list = this.baseMapper.getOrderPageList(orderPageList); for (OrderPageListVo orderPageListVo : list) { Long appUserId = orderPageListVo.getAppUserId(); AppUser appUser = appUserClient.getAppUserById(appUserId); orderPageListVo.setUserName(appUser.getName()); orderPageListVo.setPhone(appUser.getPhone()); } return list; } /** * 确认发货操作 * @param orderId * @param code * @return */ @Override public R confirmDelivery(String orderId, String code) { Order order = this.getById(orderId); if(1 == order.getPayStatus()){ return R.fail("订单还未完成支付"); } if(1 == order.getOrderType() || null == order.getAddressJson()){ return R.fail("该订单不支付快递配送"); } if(1 != order.getOrderStatus()){ return R.fail("无效的操作"); } //添加快递号和修改订单状态 order.setExpressJson(code); order.setOrderStatus(2); this.updateById(order); return R.ok(); } /** * 取消订单操作 * @param orderId * @return */ @Override public R cancelOrder(Long orderId) { Order order = this.getById(orderId); if(Arrays.asList(4, 5, 6, 7, 8).contains(order.getOrderStatus())){ return R.fail("无效的操作"); } order.setOrderStatus(5); this.updateById(order); //开始退款 Integer payMethod = order.getPayMethod(); BigDecimal paymentAmount = order.getPaymentAmount(); AppUser appUser = appUserClient.getAppUserById(order.getAppUserId()); if(1 == payMethod){ //微信退款 } if(2 == payMethod){ //余额退款 OrderBalancePayment orderBalancePayment = orderBalancePaymentService.getOne(new LambdaQueryWrapper<OrderBalancePayment>().eq(OrderBalancePayment::getOrderId, orderId)); BigDecimal balance = appUser.getBalance(); appUser.setTotalRedPacketAmount(appUser.getTotalRedPacketAmount().add(orderBalancePayment.getRedPacketAmount()).setScale(2, RoundingMode.HALF_EVEN)); appUser.setTotalDistributionAmount(appUser.getTotalDistributionAmount().add(orderBalancePayment.getDistributionAmount()).setScale(2, RoundingMode.HALF_EVEN)); appUser.setBalance(balance.add(paymentAmount).setScale(2, RoundingMode.HALF_EVEN)); appUser.setShopAmount(appUser.getShopAmount().subtract(paymentAmount).setScale(2, RoundingMode.HALF_EVEN)); //构建账户余额流水明细 BalanceChangeRecord balanceChangeRecord = new BalanceChangeRecord(); balanceChangeRecord.setOrderId(orderId); balanceChangeRecord.setAppUserId(order.getAppUserId()); balanceChangeRecord.setChangeType(6); balanceChangeRecord.setBeforeAmount(balance); balanceChangeRecord.setChangeAmount(paymentAmount); balanceChangeRecord.setAfterAmount(appUser.getBalance()); balanceChangeRecord.setDelFlag(0); balanceChangeRecord.setCreateTime(LocalDateTime.now()); balanceChangeRecordClient.saveBalanceChangeRecord(balanceChangeRecord); } Integer lavePoint = appUser.getLavePoint(); if(3 == payMethod){ //积分退款 appUser.setLavePoint(appUser.getLavePoint() + order.getPoint()); //开始运费退款,积分支付,运费是单独进行支付的,所以需要单独退款 if(null != order.getExpressAmount() && BigDecimal.ZERO.compareTo(order.getExpressAmount()) < 0){ BigDecimal expressAmount = order.getExpressAmount(); if(1 == order.getExpressPayMethod()){ //微信退款 } if(2 == order.getExpressPayMethod()){ //余额退款 OrderBalancePayment orderBalancePayment = orderBalancePaymentService.getOne(new LambdaQueryWrapper<OrderBalancePayment>().eq(OrderBalancePayment::getOrderId, orderId)); BigDecimal balance = appUser.getBalance(); appUser.setTotalRedPacketAmount(appUser.getTotalRedPacketAmount().add(orderBalancePayment.getRedPacketAmount()).setScale(2, RoundingMode.HALF_EVEN)); appUser.setTotalDistributionAmount(appUser.getTotalDistributionAmount().add(orderBalancePayment.getDistributionAmount()).setScale(2, RoundingMode.HALF_EVEN)); appUser.setBalance(balance.add(expressAmount).setScale(2, RoundingMode.HALF_EVEN)); //构建账户余额流水明细 BalanceChangeRecord balanceChangeRecord = new BalanceChangeRecord(); balanceChangeRecord.setOrderId(orderId); balanceChangeRecord.setAppUserId(order.getAppUserId()); balanceChangeRecord.setChangeType(6); balanceChangeRecord.setBeforeAmount(balance); balanceChangeRecord.setChangeAmount(expressAmount); balanceChangeRecord.setAfterAmount(appUser.getBalance()); balanceChangeRecord.setDelFlag(0); balanceChangeRecord.setCreateTime(LocalDateTime.now()); balanceChangeRecordClient.saveBalanceChangeRecord(balanceChangeRecord); } } } //退回获得的消费积分 //需要先检查会员等级时候回回退,使用回退后的会员等级查询配置 Integer getPoint = order.getGetPoint(); boolean vipDemotion = vipDemotion(appUser.getShopPoint() - getPoint, appUser.getVipId()); PointSetting pointSetting = pointSettingClient.getPointSetting(vipDemotion ? appUser.getVipId() - 1 : appUser.getVipId()).getData(); int earnPoint1 = getPoint; if(null != pointSetting && 1 == pointSetting.getBuyPointOpen()){ earnPoint1 = getPoint / (100 - pointSetting.getBuyPoint()); } appUser.setLavePoint(lavePoint - getPoint); appUser.setShopPoint(appUser.getShopPoint() - earnPoint1); appUser.setTotalPoint(appUser.getTotalPoint() - earnPoint1); if(vipDemotion){ appUser.setVipId(appUser.getVipId() - 1); } //构建积分流水明细 UserPoint userPoint = new UserPoint(); userPoint.setType(11); userPoint.setHistoricalPoint(lavePoint); Integer point = appUser.getLavePoint() - lavePoint; userPoint.setVariablePoint(point >= 0 ? point : point * -1); userPoint.setBalance(appUser.getLavePoint()); userPoint.setCreateTime(LocalDateTime.now()); userPoint.setAppUserId(order.getAppUserId()); userPoint.setObjectId(orderId); userPointClient.saveUserPoint(userPoint); appUserClient.editAppUserById(appUser); return R.ok(); } /** * 会员降级检测 */ public boolean vipDemotion(Integer shopPoint, Integer vipId){ if(vipId == 1 || vipId > 3){ return false; } VipSetting vipSetting = vipSettingClient.getVipSetting(vipId).getData(); Integer vipLevelUpShopRole = vipSetting.getVipLevelUpShopRole(); Integer vipLevelUpShop = vipSetting.getVipLevelUpShop(); if(1 == vipLevelUpShopRole && shopPoint < vipLevelUpShop){ return true; } return false; } /** * 收货操作 * @param orderId * @return */ @Override public R receivingOperation(Long orderId) { Order order = this.getById(orderId); if(order.getOrderStatus() != 2){ return R.fail("无效的操作"); } order.setOrderStatus(4); this.updateById(order); return R.ok(); } /** * 获取订单详情 * @param orderId * @return */ @Override public OrderInfoVo getOrderInfo(Long orderId) { Order order = this.getById(orderId); OrderInfoVo orderInfo = new OrderInfoVo(); orderInfo.setId(orderId.toString()); orderInfo.setOrderNumber(order.getOrderNumber()); orderInfo.setOrderStatus(order.getOrderStatus()); orderInfo.setCreateTime(order.getCreateTime().format(DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss"))); AppUser appUser = appUserClient.getAppUserById(order.getAppUserId()); orderInfo.setUserName(appUser.getName()); orderInfo.setPhone(appUser.getPhone()); orderInfo.setOrderType(order.getOrderType() == 1 ? "服务" : (StringUtils.isNotEmpty(order.getExpressJson()) ? "单品-快递配送" : "单品-自提")); Shop shop = shopClient.getShopById(order.getShopId()).getData(); if(null != shop){ orderInfo.setShopName(shop.getName()); } orderInfo.setPaymentMethod(order.getPayMethod()); orderInfo.setTotalAmount(order.getTotalAmount()); if(StringUtils.isNotEmpty(order.getCouponJson())){ CouponInfo couponInfo = JSON.parseObject(order.getCouponJson(), CouponInfo.class); orderInfo.setCouponName(couponInfo.getCouponName()); } orderInfo.setDiscountAmount(order.getDiscountTotalAmount()); orderInfo.setExpressAmount(order.getExpressAmount()); orderInfo.setPaymentAmount(order.getPaymentAmount()); orderInfo.setPoint(order.getGetPoint()); if(StringUtils.isNotEmpty(order.getAddressJson())){ UserAddress userAddress = JSON.parseObject(order.getAddressJson(), UserAddress.class); orderInfo.setRecipient(userAddress.getRecieveName() + "-" + userAddress.getRecievePhone()); orderInfo.setAddress(userAddress.getRecieveAddress()); } if(StringUtils.isNotEmpty(order.getExpressJson())){ JSONObject jsonObject = JSON.parseObject(order.getExpressJson()); String com = jsonObject.getString("com"); String num = jsonObject.getString("num"); QueryKD100Vo queryKD100Vo = ExpressDeliveryUtil.kd100QueryTrack(com, num); orderInfo.setExpress(queryKD100Vo); } List<OrderGood> orderGoods = orderGoodMapper.selectList(new LambdaQueryWrapper<OrderGood>().eq(OrderGood::getOrderId, orderId).eq(OrderGood::getDelFlag, 0)); int sum = orderGoods.stream().mapToInt(OrderGood::getNum).sum(); orderInfo.setGoodsNum(sum); List<Object> goodsJson = new ArrayList<>(); for (OrderGood orderGood : orderGoods) { Goods goods = JSON.parseObject(orderGood.getGoodJson(), Goods.class); Map<String, Object> map = new HashMap<>(); map.put("name", goods.getName()); map.put("imgUrl", goods.getHomePagePicture()); map.put("number", orderGood.getNum()); goodsJson.add(map); } orderInfo.setGoodsJson(JSON.toJSONString(goodsJson)); return orderInfo; } } ruoyi-service/ruoyi-order/src/main/java/com/ruoyi/order/service/impl/ShoppingCartServiceImpl.java
@@ -15,12 +15,10 @@ import com.ruoyi.common.security.service.TokenService; import com.ruoyi.order.mapper.ShoppingCartMapper; import com.ruoyi.order.model.Order; import com.ruoyi.order.model.OrderBalancePayment; import com.ruoyi.order.model.OrderGood; import com.ruoyi.order.model.ShoppingCart; import com.ruoyi.order.service.CommissionService; import com.ruoyi.order.service.OrderGoodService; import com.ruoyi.order.service.OrderService; import com.ruoyi.order.service.ShoppingCartService; import com.ruoyi.order.service.*; import com.ruoyi.order.vo.*; import com.ruoyi.other.api.domain.*; import com.ruoyi.other.api.feignClient.*; @@ -102,6 +100,18 @@ @Resource private UserChangeLogClient userChangeLogClient; @Resource private PointSettingClient pointSettingClient; @Resource private OrderBalancePaymentService orderBalancePaymentService; @@ -854,17 +864,22 @@ } //账户余额 BigDecimal redPacketAmount = BigDecimal.ZERO; BigDecimal distributionAmount = BigDecimal.ZERO; if(2 == shoppingCartPayment.getPaymentType()){ BigDecimal totalRedPacketAmount = appUser.getTotalRedPacketAmount(); BigDecimal totalDistributionAmount = appUser.getTotalDistributionAmount(); BigDecimal balance = appUser.getBalance(); //红包金额满足支付 if(paymentMoney.compareTo(totalRedPacketAmount) <= 0){ totalRedPacketAmount = totalRedPacketAmount.subtract(paymentMoney); balance = balance.subtract(paymentMoney); appUser.setTotalRedPacketAmount(totalRedPacketAmount); appUser.setBalance(balance); redPacketAmount = paymentMoney; }else{ paymentMoney = paymentMoney.subtract(totalRedPacketAmount); redPacketAmount = totalRedPacketAmount; totalRedPacketAmount = BigDecimal.ZERO; if(paymentMoney.compareTo(totalDistributionAmount) <= 0){ totalDistributionAmount = totalDistributionAmount.subtract(paymentMoney); @@ -872,6 +887,7 @@ appUser.setTotalRedPacketAmount(totalRedPacketAmount); appUser.setTotalDistributionAmount(totalDistributionAmount); appUser.setBalance(balance); distributionAmount = paymentMoney; }else{ paymentMoney = paymentMoney.subtract(totalDistributionAmount); totalDistributionAmount = BigDecimal.ZERO; @@ -879,17 +895,23 @@ appUser.setTotalRedPacketAmount(totalRedPacketAmount); appUser.setTotalDistributionAmount(totalDistributionAmount); appUser.setBalance(balance); distributionAmount = totalDistributionAmount; } } //构建积分流水记录 if(earnPoint > 0){ PointSetting pointSetting = pointSettingClient.getPointSetting(appUser.getVipId()).getData(); int earnPoint1 = earnPoint; if(null != pointSetting && 1 == pointSetting.getBuyPointOpen()){ earnPoint1 = earnPoint1 * (100 - pointSetting.getBuyPoint()); } appUser.setShopPoint(appUser.getShopPoint() + earnPoint); appUser.setLavePoint(appUser.getLavePoint() + earnPoint); appUser.setLavePoint(appUser.getLavePoint() + earnPoint1); appUser.setTotalPoint(appUser.getTotalPoint() + earnPoint); UserPoint userPoint = new UserPoint(); userPoint.setType(1); userPoint.setHistoricalPoint(appUser.getLavePoint() - earnPoint); userPoint.setHistoricalPoint(appUser.getLavePoint() - earnPoint1); userPoint.setVariablePoint(earnPoint); userPoint.setBalance(appUser.getLavePoint()); userPoint.setCreateTime(LocalDateTime.now()); @@ -925,11 +947,16 @@ //积分支付 if(3 == shoppingCartPayment.getPaymentType()){ Integer lavePoint = appUser.getLavePoint(); appUser.setLavePoint(lavePoint - orderPoint); PointSetting pointSetting = pointSettingClient.getPointSetting(appUser.getVipId()).getData(); int earnPoint1 = earnPoint; //计算可用积分比例 if(null != pointSetting && 1 == pointSetting.getBuyPointOpen()){ earnPoint1 = earnPoint1 * (100 - pointSetting.getBuyPoint()); } appUser.setLavePoint(appUser.getLavePoint() - orderPoint); appUser.setShopPoint(appUser.getShopPoint() + earnPoint); appUser.setLavePoint(appUser.getLavePoint() + earnPoint); appUser.setLavePoint(appUser.getLavePoint() + earnPoint1); appUser.setTotalPoint(appUser.getTotalPoint() + earnPoint); appUser.setShopAmount(appUser.getShopAmount().add(paymentMoney).setScale(2, RoundingMode.HALF_EVEN)); appUser.setLastShopTime(LocalDateTime.now()); appUserClient.editAppUserById(appUser); //检查消费积分满足后升级会员 @@ -937,25 +964,15 @@ //构建积分流水记录 UserPoint userPoint = new UserPoint(); userPoint.setType(4); userPoint.setHistoricalPoint(lavePoint); userPoint.setVariablePoint(orderPoint); userPoint.setBalance(appUser.getLavePoint()); userPoint.setCreateTime(LocalDateTime.now()); userPoint.setAppUserId(appUser.getId()); userPoint.setObjectId(order.getId()); userPointClient.saveUserPoint(userPoint); if(earnPoint > 0){ userPoint = new UserPoint(); userPoint.setType(1); userPoint.setHistoricalPoint(appUser.getLavePoint() - earnPoint); userPoint.setVariablePoint(earnPoint); userPoint.setHistoricalPoint(lavePoint); Integer point = appUser.getLavePoint() - lavePoint; userPoint.setVariablePoint(point >= 0 ? point : point * -1); userPoint.setBalance(appUser.getLavePoint()); userPoint.setCreateTime(LocalDateTime.now()); userPoint.setAppUserId(appUser.getId()); userPoint.setObjectId(order.getId()); userPointClient.saveUserPoint(userPoint); } //如果有运费,需要先扣除账户积分,再进行支付。支付成功后修改订单状态,未支付成功则回退积分,删除的订单 if(expressFee.compareTo(BigDecimal.ZERO) > 0){ if(shoppingCartPayment.getFreightPaymentType() == 1){ @@ -970,8 +987,10 @@ balance = balance.subtract(expressFee); appUser.setTotalRedPacketAmount(totalRedPacketAmount); appUser.setBalance(balance); redPacketAmount = expressFee; }else{ expressFee = expressFee.subtract(totalRedPacketAmount); redPacketAmount = totalRedPacketAmount; totalRedPacketAmount = BigDecimal.ZERO; if(expressFee.compareTo(totalDistributionAmount) <= 0){ totalDistributionAmount = totalDistributionAmount.subtract(expressFee); @@ -979,6 +998,7 @@ appUser.setTotalRedPacketAmount(totalRedPacketAmount); appUser.setTotalDistributionAmount(totalDistributionAmount); appUser.setBalance(balance); distributionAmount = expressFee; }else{ expressFee = expressFee.subtract(totalDistributionAmount); totalDistributionAmount = BigDecimal.ZERO; @@ -986,6 +1006,7 @@ appUser.setTotalRedPacketAmount(totalRedPacketAmount); appUser.setTotalDistributionAmount(totalDistributionAmount); appUser.setBalance(balance); distributionAmount = totalDistributionAmount; } } @@ -1021,6 +1042,14 @@ this.removeBatchByIds(ids); } } //添加账户余额支付明细 if(redPacketAmount.compareTo(BigDecimal.ZERO) > 0 || distributionAmount.compareTo(BigDecimal.ZERO) > 0){ OrderBalancePayment orderBalancePayment = new OrderBalancePayment(); orderBalancePayment.setOrderId(order.getId()); orderBalancePayment.setRedPacketAmount(redPacketAmount); orderBalancePayment.setDistributionAmount(distributionAmount); orderBalancePaymentService.save(orderBalancePayment); } return R.ok(order.getId().toString()); } ruoyi-service/ruoyi-order/src/main/java/com/ruoyi/order/util/ExpressDeliveryUtil.java
New file @@ -0,0 +1,101 @@ package com.ruoyi.order.util; import cn.hutool.http.HttpRequest; import cn.hutool.http.HttpResponse; import cn.hutool.http.HttpUtil; import com.alibaba.fastjson2.JSON; import com.alibaba.fastjson2.JSONObject; import com.google.gson.Gson; import com.kuaidi100.sdk.api.QueryTrack; import com.kuaidi100.sdk.api.QueryTrackMap; import com.kuaidi100.sdk.contant.CompanyConstant; import com.kuaidi100.sdk.core.IBaseClient; import com.kuaidi100.sdk.pojo.HttpResult; import com.kuaidi100.sdk.request.QueryTrackParam; import com.kuaidi100.sdk.request.QueryTrackReq; import com.kuaidi100.sdk.response.QueryTrackMapResp; import com.kuaidi100.sdk.utils.SignUtils; import com.ruoyi.order.util.vo.MapTrackKD100Vo; import com.ruoyi.order.util.vo.QueryKD100Vo; import lombok.extern.slf4j.Slf4j; /** * 快递工具类 * @author zhibing.pu * @Date 2024/12/13 18:05 */ @Slf4j public class ExpressDeliveryUtil { private static String customer = "8FC09A2DE534142E93BE068830FCA43E"; private static String key = "KFBYEnrO3201"; /** * 查询快递实时数据 * @param com 快递公司代码 * @param num 快递单号 * @return */ public static QueryKD100Vo kd100QueryTrack(String com, String num){ QueryTrackReq queryTrackReq = new QueryTrackReq(); QueryTrackParam queryTrackParam = new QueryTrackParam(); queryTrackParam.setCom(com); queryTrackParam.setNum(num); String param = new Gson().toJson(queryTrackParam); queryTrackReq.setParam(param); queryTrackReq.setCustomer(customer); queryTrackReq.setSign(SignUtils.querySign(param ,key,customer)); IBaseClient baseClient = new QueryTrack(); HttpResult execute = null; try { execute = baseClient.execute(queryTrackReq); } catch (Exception e) { throw new RuntimeException(e); } String result = execute.getBody(); QueryKD100Vo queryKD100Vo = JSON.parseObject(result, QueryKD100Vo.class); return queryKD100Vo; } /** * 快递100查询带有地图轨迹数据的快递详情 * @param com 快递公司代码 * @param num 快递单号 * @param from 触发城市名称 * @param to 到达城市名称 * @return */ public static MapTrackKD100Vo kd100MapTrack(String com, String num, String from, String to){ QueryTrackReq queryTrackReq = new QueryTrackReq(); QueryTrackParam queryTrackParam = new QueryTrackParam(); queryTrackParam.setCom(CompanyConstant.YD); queryTrackParam.setNum(num); queryTrackParam.setFrom(from); queryTrackParam.setTo(to); queryTrackParam.setResultv2("2"); String param = new Gson().toJson(queryTrackParam); queryTrackReq.setParam(param); queryTrackReq.setCustomer(customer); queryTrackReq.setSign(SignUtils.querySign(param ,key,customer)); IBaseClient baseClient = new QueryTrackMap(); HttpResult execute = null; try { execute = baseClient.execute(queryTrackReq); } catch (Exception e) { throw new RuntimeException(e); } String result = execute.getBody(); MapTrackKD100Vo mapTrackKD100Vo = JSON.parseObject(result, MapTrackKD100Vo.class); return mapTrackKD100Vo; } } ruoyi-service/ruoyi-order/src/main/java/com/ruoyi/order/util/vo/MapTrackKD100Vo.java
New file @@ -0,0 +1,36 @@ package com.ruoyi.order.util.vo; import io.swagger.annotations.ApiModel; import io.swagger.annotations.ApiModelProperty; import lombok.Data; import java.util.List; /** * @author zhibing.pu * @Date 2024/12/16 15:09 */ @Data @ApiModel public class MapTrackKD100Vo { @ApiModelProperty("快递状态(0在途,1揽收,2疑难,3签收,4退签,5派件,8清关,14拒签)") private String state; @ApiModelProperty("是否签收标记,0未签收,1已签收,请忽略,明细状态请参考state字段") private String ischeck; @ApiModelProperty("快递公司编码") private String com; @ApiModelProperty("单号") private String nu; @ApiModelProperty("轨迹地图链接") private String trailUrl; @ApiModelProperty("预计到达时间") private String arrivalTime; @ApiModelProperty("平均耗时") private String totalTime; @ApiModelProperty("到达还需多少时间") private String remainTime; @ApiModelProperty("是否存在环路") private Boolean isLoop; @ApiModelProperty("查询结果数组") private List<QueryKD100ListVo> data; } ruoyi-service/ruoyi-order/src/main/java/com/ruoyi/order/util/vo/QueryKD100ListVo.java
New file @@ -0,0 +1,22 @@ package com.ruoyi.order.util.vo; import io.swagger.annotations.ApiModel; import io.swagger.annotations.ApiModelProperty; import lombok.Data; /** * @author zhibing.pu * @Date 2024/12/16 15:00 */ @Data @ApiModel public class QueryKD100ListVo { @ApiModelProperty("内容") private String context; @ApiModelProperty("时间") private String time; @ApiModelProperty("格式化为后时间") private String ftime; @ApiModelProperty("本数据元对应的物流状态名称或者高级状态名称,实时查询接口中提交resultv2=1或者resultv2=4标记后才会出现") private String status; } ruoyi-service/ruoyi-order/src/main/java/com/ruoyi/order/util/vo/QueryKD100Vo.java
New file @@ -0,0 +1,27 @@ package com.ruoyi.order.util.vo; import io.swagger.annotations.ApiModel; import io.swagger.annotations.ApiModelProperty; import lombok.Data; import java.util.List; /** * 快递100查询快递详情 * @author zhibing.pu * @Date 2024/12/16 14:56 */ @Data @ApiModel public class QueryKD100Vo { @ApiModelProperty("快递状态(0在途,1揽收,2疑难,3签收,4退签,5派件,8清关,14拒签)") private String state; @ApiModelProperty("是否签收标记,0未签收,1已签收,请忽略,明细状态请参考state字段") private String ischeck; @ApiModelProperty("快递公司编码") private String com; @ApiModelProperty("单号") private String nu; @ApiModelProperty("查询结果数组") private List<QueryKD100ListVo> data; } ruoyi-service/ruoyi-order/src/main/java/com/ruoyi/order/vo/OrderInfoVo.java
New file @@ -0,0 +1,58 @@ package com.ruoyi.order.vo; import com.ruoyi.order.util.vo.QueryKD100Vo; import io.swagger.annotations.ApiModel; import io.swagger.annotations.ApiModelProperty; import lombok.Data; import java.math.BigDecimal; /** * @author zhibing.pu * @Date 2024/12/13 17:37 */ @Data @ApiModel public class OrderInfoVo { @ApiModelProperty("订单id") private String id; @ApiModelProperty("订单编号") private String orderNumber; @ApiModelProperty("下单时间") private String createTime; @ApiModelProperty("订单状态(1待发货2待收货3待使用4已完成5已取消6已退款7售后中8已评价)") private Integer orderStatus; @ApiModelProperty("下单用户") private String userName; @ApiModelProperty("联系电话") private String phone; @ApiModelProperty("订单类型") private String orderType; @ApiModelProperty("核销门店") private String shopName; @ApiModelProperty("支付方式(1=微信,2=余额,3=积分)") private Integer paymentMethod; @ApiModelProperty("订单总金额") private BigDecimal totalAmount; @ApiModelProperty("优惠券") private String couponName; @ApiModelProperty("抵扣金额") private BigDecimal discountAmount; @ApiModelProperty("快递费") private BigDecimal expressAmount; @ApiModelProperty("支付金额") private BigDecimal paymentAmount; @ApiModelProperty("获得积分") private Integer point; @ApiModelProperty("收件人") private String recipient; @ApiModelProperty("收件地址") private String address; @ApiModelProperty("物流信息") private QueryKD100Vo express; @ApiModelProperty("商品数量") private Integer goodsNum; @ApiModelProperty("商品信息") private String goodsJson; } ruoyi-service/ruoyi-order/src/main/java/com/ruoyi/order/vo/OrderPageList.java
New file @@ -0,0 +1,32 @@ package com.ruoyi.order.vo; import com.ruoyi.common.core.web.page.BasePage; import io.swagger.annotations.ApiModel; import io.swagger.annotations.ApiModelProperty; import lombok.Data; import java.util.List; /** * @author zhibing.pu * @Date 2024/12/12 17:29 */ @Data @ApiModel public class OrderPageList extends BasePage { @ApiModelProperty("订单编号") public String code; @ApiModelProperty("下单用户") private String userName; @ApiModelProperty("联系电话") private String phone; @ApiModelProperty("商品类型(1=服务,2=单品)") private Integer goodsType; @ApiModelProperty("支付方式(1=微信,2=余额,3=积分)") private Integer paymentType; @ApiModelProperty("订单状态(1待发货2待收货3待使用4已完成5已取消6已退款7售后中8已评价)") private Integer status; private Integer shopId; private List<Long> appUserIds; } ruoyi-service/ruoyi-order/src/main/java/com/ruoyi/order/vo/OrderPageListVo.java
New file @@ -0,0 +1,39 @@ package com.ruoyi.order.vo; import io.swagger.annotations.ApiModel; import io.swagger.annotations.ApiModelProperty; import lombok.Data; import java.math.BigDecimal; /** * @author zhibing.pu * @Date 2024/12/12 17:34 */ @Data @ApiModel public class OrderPageListVo { @ApiModelProperty("订单id") private String id; @ApiModelProperty("订单编号") private String code; @ApiModelProperty("下单时间") private String createTime; @ApiModelProperty("下单用户") private String userName; @ApiModelProperty("联系电话") private String phone; @ApiModelProperty("商品类型(1=服务,2=单品)") private Integer goodsType; @ApiModelProperty("支付方式(1=微信,2=余额,3=积分)") private Integer paymentType; @ApiModelProperty("订单金额") private BigDecimal orderMoney; @ApiModelProperty("订单状态(1待发货2待收货3待使用4已完成5已取消6已退款7售后中8已评价)") private Integer status; /** * 用户id */ private Long appUserId; } ruoyi-service/ruoyi-order/src/main/resources/mapper/order/OrderBalancePaymentMapper.xml
New file @@ -0,0 +1,6 @@ <?xml version="1.0" encoding="UTF-8"?> <!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd"> <mapper namespace="com.ruoyi.order.mapper.OrderBalancePayment"> </mapper> ruoyi-service/ruoyi-order/src/main/resources/mapper/order/OrderMapper.xml
@@ -37,4 +37,44 @@ ORDER BY o.create_time DESC </select> <select id="getOrderPageList" resultType="com.ruoyi.order.vo.OrderPageListVo"> select id, order_number as code, DATE_FORMAT(create_time, '%Y-%m-%d %H:%i:%s') as createTime, app_user_id as appUserId, order_type as goodsType, pay_method as paymentType, total_amount as orderMoney, order_status as status from t_order where del_flag = 0 and pay_status = 2 <if test="null != item.code and '' != item.code"> and order_number like CONCAT('%', #{item.code}, '%') </if> <if test="null != item.appUserIds and item.appUserIds.size() > 0"> and app_user_id in <foreach collection="item.appUserIds" separator="," item="tem" index="index" open="(" close=")"> #{tem} </foreach> </if> <if test="null != item.goodsType"> and order_type = #{item.goodsType} </if> <if test="null != item.paymentType"> and pay_method = #{item.paymentType} </if> <if test="null != item.status and 4 != item.status"> and order_status = #{item.status} </if> <if test="null != item.status and 4 == item.status"> and order_status in (4, 8) </if> <if test="null != item.shopId"> and shop_id = #{item.shopId} and address_json is null </if> order by create_time desc </select> </mapper> ruoyi-service/ruoyi-other/src/main/java/com/ruoyi/other/controller/GoodsBargainPriceController.java
@@ -180,7 +180,7 @@ GoodsCategory goodsCategory = goodsCategoryService.getById(g.getGoodsCategoryId()); Integer shopId = goodsBargainPrice.getShopId(); Shop shop = shopService.getById(shopId); R<AppUser> r = appUserClient.getAppUserByPhone(shop.getPhone()); R<AppUser> r = appUserClient.getAppUserByPhone1(shop.getPhone()); if (R.isError(r)){ throw new RuntimeException("获取店长信息失败"); } ruoyi-service/ruoyi-other/src/main/java/com/ruoyi/other/service/impl/ShopServiceImpl.java
@@ -101,7 +101,7 @@ @Override public Boolean cheUserByPhone(String phone) { R<AppUser> r = appUserClient.getAppUserByPhone(phone); R<AppUser> r = appUserClient.getAppUserByPhone1(phone); if (R.isError(r)){ return false; }