Pu Zhibing
2024-12-16 7e9667699856022efcac2941eacddd25e20d0c1f
新增加管理后台订单模块接口
21个文件已修改
12个文件已添加
1087 ■■■■■ 已修改文件
ruoyi-api/ruoyi-api-account/src/main/java/com/ruoyi/account/api/factory/AppUserClientFallbackFactory.java 14 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-api/ruoyi-api-account/src/main/java/com/ruoyi/account/api/feignClient/AppUserClient.java 16 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-api/ruoyi-api-account/src/main/java/com/ruoyi/account/api/model/BalanceChangeRecord.java 2 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-api/ruoyi-api-order/src/main/java/com/ruoyi/order/model/Order.java 1 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-api/ruoyi-api-order/src/main/java/com/ruoyi/order/model/OrderBalancePayment.java 39 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-api/ruoyi-api-system/src/main/java/com/ruoyi/system/api/query/ChangeUserQuery.java 1 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-auth/src/main/java/com/ruoyi/auth/form/LoginBody.java 12 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-common/ruoyi-common-core/src/main/java/com/ruoyi/common/core/utils/MsgUtil.java 6 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-common/ruoyi-common-core/src/main/java/com/ruoyi/common/core/web/page/TableDataInfo.java 3 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-modules/ruoyi-system/src/main/java/com/ruoyi/system/controller/SysUserController.java 25 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-modules/ruoyi-system/src/main/java/com/ruoyi/system/query/GetSysUserList.java 1 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-modules/ruoyi-system/src/main/java/com/ruoyi/system/service/impl/SysUserServiceImpl.java 10 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-modules/ruoyi-system/src/main/resources/mapping/system/SysUserMapper.xml 18 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-service/ruoyi-account/src/main/java/com/ruoyi/account/controller/AppUserController.java 29 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-service/ruoyi-account/src/main/java/com/ruoyi/account/service/impl/AppUserServiceImpl.java 44 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-service/ruoyi-order/pom.xml 6 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-service/ruoyi-order/src/main/java/com/ruoyi/order/controller/OrderController.java 51 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-service/ruoyi-order/src/main/java/com/ruoyi/order/mapper/OrderBalancePaymentMapper.java 11 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-service/ruoyi-order/src/main/java/com/ruoyi/order/mapper/OrderMapper.java 10 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-service/ruoyi-order/src/main/java/com/ruoyi/order/service/OrderBalancePaymentService.java 11 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-service/ruoyi-order/src/main/java/com/ruoyi/order/service/OrderService.java 47 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-service/ruoyi-order/src/main/java/com/ruoyi/order/service/impl/OrderBalancePaymentServiceImpl.java 15 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-service/ruoyi-order/src/main/java/com/ruoyi/order/service/impl/OrderServiceImpl.java 322 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-service/ruoyi-order/src/main/java/com/ruoyi/order/service/impl/ShoppingCartServiceImpl.java 32 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-service/ruoyi-order/src/main/java/com/ruoyi/order/util/ExpressDeliveryUtil.java 101 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-service/ruoyi-order/src/main/java/com/ruoyi/order/util/vo/MapTrackKD100Vo.java 36 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-service/ruoyi-order/src/main/java/com/ruoyi/order/util/vo/QueryKD100ListVo.java 22 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-service/ruoyi-order/src/main/java/com/ruoyi/order/util/vo/QueryKD100Vo.java 27 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-service/ruoyi-order/src/main/java/com/ruoyi/order/vo/OrderInfoVo.java 58 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-service/ruoyi-order/src/main/java/com/ruoyi/order/vo/OrderPageList.java 32 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-service/ruoyi-order/src/main/java/com/ruoyi/order/vo/OrderPageListVo.java 39 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-service/ruoyi-order/src/main/resources/mapper/order/OrderBalancePaymentMapper.xml 6 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-service/ruoyi-order/src/main/resources/mapper/order/OrderMapper.xml 40 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-api/ruoyi-api-account/src/main/java/com/ruoyi/account/api/factory/AppUserClientFallbackFactory.java
@@ -65,8 +65,18 @@
                log.error("获取直推会员数失败:{}", cause.getMessage());
                throw new RuntimeException("获取直推会员数失败");
            }
            @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());
            }
        };
    }
}
ruoyi-api/ruoyi-api-account/src/main/java/com/ruoyi/account/api/feignClient/AppUserClient.java
@@ -53,4 +53,20 @@
    @PostMapping("/app-user/getVipCount")
    R<Long> getVipCount(@RequestParam("userId")Long userId, @RequestParam("vipId") Integer vipId );
    /**
     * 根据用户名称模糊搜索用户列表
     * @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);
}
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 roleType =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 roleType = 1
        </where>
ruoyi-service/ruoyi-account/src/main/java/com/ruoyi/account/controller/AppUserController.java
@@ -1,6 +1,7 @@
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;
@@ -330,6 +331,34 @@
        appUserService.onlineRecord();
        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);
    }
}
ruoyi-service/ruoyi-account/src/main/java/com/ruoyi/account/service/impl/AppUserServiceImpl.java
@@ -305,8 +305,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());
@@ -319,6 +325,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);
@@ -375,6 +393,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();
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;
@@ -206,8 +205,50 @@
        orderService.updateById(order);
        return R.ok();
    }
    @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;
@@ -23,5 +24,45 @@
    boolean check(Order order, Integer shopId, Long userId);
    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;
@@ -16,24 +18,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;
/**
@@ -62,6 +68,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
@@ -224,4 +253,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.*;
@@ -107,6 +105,9 @@
    
    @Resource
    private PointSettingClient pointSettingClient;
    @Resource
    private OrderBalancePaymentService orderBalancePaymentService;
    
    
    
@@ -923,17 +924,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);
@@ -941,6 +947,7 @@
                    appUser.setTotalRedPacketAmount(totalRedPacketAmount);
                    appUser.setTotalDistributionAmount(totalDistributionAmount);
                    appUser.setBalance(balance);
                    distributionAmount = paymentMoney;
                }else{
                    paymentMoney = paymentMoney.subtract(totalDistributionAmount);
                    totalDistributionAmount = BigDecimal.ZERO;
@@ -948,6 +955,7 @@
                    appUser.setTotalRedPacketAmount(totalRedPacketAmount);
                    appUser.setTotalDistributionAmount(totalDistributionAmount);
                    appUser.setBalance(balance);
                    distributionAmount = totalDistributionAmount;
                }
            }
            //构建积分流水记录
@@ -1006,7 +1014,6 @@
            appUser.setShopPoint(appUser.getShopPoint() + 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);
            //检查消费积分满足后升级会员
@@ -1016,7 +1023,8 @@
            UserPoint userPoint = new UserPoint();
            userPoint.setType(1);
            userPoint.setHistoricalPoint(lavePoint);
            userPoint.setVariablePoint(orderPoint);
            Integer point = appUser.getLavePoint() - lavePoint;
            userPoint.setVariablePoint(point >= 0 ? point : point * -1);
            userPoint.setBalance(appUser.getLavePoint());
            userPoint.setCreateTime(LocalDateTime.now());
            userPoint.setAppUserId(appUser.getId());
@@ -1036,8 +1044,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);
@@ -1045,6 +1055,7 @@
                            appUser.setTotalRedPacketAmount(totalRedPacketAmount);
                            appUser.setTotalDistributionAmount(totalDistributionAmount);
                            appUser.setBalance(balance);
                            distributionAmount = expressFee;
                        }else{
                            expressFee = expressFee.subtract(totalDistributionAmount);
                            totalDistributionAmount = BigDecimal.ZERO;
@@ -1052,6 +1063,7 @@
                            appUser.setTotalRedPacketAmount(totalRedPacketAmount);
                            appUser.setTotalDistributionAmount(totalDistributionAmount);
                            appUser.setBalance(balance);
                            distributionAmount = totalDistributionAmount;
                        }
                    }
                    
@@ -1081,6 +1093,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>