luofl
2025-02-20 e4eaabefaaa2ca95f809c47a11712c3bee56e1b5
修改物流信息导入模板
29个文件已修改
2个文件已添加
580 ■■■■■ 已修改文件
ruoyi-api/ruoyi-api-account/src/main/java/com/ruoyi/account/api/feignClient/AppUserClient.java 5 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-api/ruoyi-api-account/src/main/java/com/ruoyi/account/api/model/UserCoupon.java 9 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-api/ruoyi-api-account/src/main/java/com/ruoyi/account/api/vo/CouponInfoVo.java 3 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-api/ruoyi-api-order/src/main/java/com/ruoyi/order/factory/OrderClientFallbackFactory.java 6 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-api/ruoyi-api-order/src/main/java/com/ruoyi/order/feignClient/OrderClient.java 4 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-api/ruoyi-api-order/src/main/java/com/ruoyi/order/vo/OrderSaleNum.java 11 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-common/ruoyi-common-security/src/main/java/com/ruoyi/common/security/service/TokenService.java 9 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-service/ruoyi-account/src/main/java/com/ruoyi/account/controller/AppUserController.java 32 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-service/ruoyi-account/src/main/java/com/ruoyi/account/controller/BalanceChangeRecordController.java 15 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-service/ruoyi-account/src/main/java/com/ruoyi/account/controller/UserCouponController.java 13 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-service/ruoyi-account/src/main/java/com/ruoyi/account/controller/VipCenterController.java 31 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-service/ruoyi-account/src/main/java/com/ruoyi/account/controller/WithdrawalRequestsController.java 18 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-service/ruoyi-account/src/main/java/com/ruoyi/account/service/impl/AppUserServiceImpl.java 4 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-service/ruoyi-account/src/main/java/com/ruoyi/account/service/impl/BalanceChangeRecordServiceImpl.java 23 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-service/ruoyi-account/src/main/java/com/ruoyi/account/vo/WalletStatisticsDetail.java 4 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-service/ruoyi-account/src/main/resources/mapper/account/AppUserMapper.xml 2 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-service/ruoyi-account/src/main/resources/mapper/account/BalanceChangeRecordMapper.xml 2 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-service/ruoyi-order/src/main/java/com/ruoyi/order/controller/OrderController.java 6 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-service/ruoyi-order/src/main/java/com/ruoyi/order/mapper/OrderMapper.java 2 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-service/ruoyi-order/src/main/java/com/ruoyi/order/service/OrderService.java 2 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-service/ruoyi-order/src/main/java/com/ruoyi/order/service/impl/CommissionServiceImpl.java 2 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-service/ruoyi-order/src/main/java/com/ruoyi/order/service/impl/OrderServiceImpl.java 267 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-service/ruoyi-order/src/main/java/com/ruoyi/order/vo/OrderInfoVo.java 4 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-service/ruoyi-order/src/main/resources/mapper/order/OrderMapper.xml 13 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-service/ruoyi-other/Dockerfile 24 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-service/ruoyi-other/src/main/java/com/ruoyi/other/controller/CouponInfoController.java 3 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-service/ruoyi-other/src/main/java/com/ruoyi/other/controller/GoodsEvaluateController.java 2 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-service/ruoyi-other/src/main/java/com/ruoyi/other/controller/ShareController.java 10 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-service/ruoyi-other/src/main/java/com/ruoyi/other/controller/ShopController.java 36 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-service/ruoyi-other/src/main/java/com/ruoyi/other/service/impl/ShopServiceImpl.java 14 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-service/ruoyi-other/src/main/resources/mapper/other/ShopMapper.xml 4 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-api/ruoyi-api-account/src/main/java/com/ruoyi/account/api/feignClient/AppUserClient.java
@@ -81,6 +81,11 @@
    @PostMapping("/app-user/getAppUserByPhone")
    R<List<AppUser>> getAppUserByPhone(@RequestParam("phone") String phone);
    /**
     * 根据用户电话模糊搜索用户列表(包含被删除的用户)
     * @param phone
     * @return
     */
    @GetMapping("/app-user/getAppUserByPhoneNoFilter")
    public R<List<AppUser>> getAppUserByPhoneNoFilter(@RequestParam("phone") String phone);
ruoyi-api/ruoyi-api-account/src/main/java/com/ruoyi/account/api/model/UserCoupon.java
@@ -66,6 +66,15 @@
    @ApiModelProperty(value = "优惠劵id")
    @TableField("coupon_id")
    private Integer couponId;
    /**
     * 优惠券快照
     */
    @TableField("coupon_info")
    private String couponInfo;
    @ApiModelProperty(value = "优惠劵信息")
    @TableField(exist = false)
    private CouponInfoVo couponInfoVo;
ruoyi-api/ruoyi-api-account/src/main/java/com/ruoyi/account/api/vo/CouponInfoVo.java
@@ -120,5 +120,8 @@
    @TableField(exist = false)
    private List<String> goodNames;
    @ApiModelProperty(value = "其他商品名称")
    private String goodsNameJson;
}
ruoyi-api/ruoyi-api-order/src/main/java/com/ruoyi/order/factory/OrderClientFallbackFactory.java
@@ -3,6 +3,7 @@
import com.ruoyi.common.core.domain.R;
import com.ruoyi.order.feignClient.OrderClient;
import com.ruoyi.order.model.Order;
import com.ruoyi.order.vo.OrderSaleNum;
import org.springframework.cloud.openfeign.FallbackFactory;
import java.util.List;
@@ -29,6 +30,11 @@
            }
            @Override
            public R<Integer> getShopSaleNumByShopIds(OrderSaleNum orderSaleNum) {
                return R.fail("获取门店销售订单数量失败:" + cause.getMessage());
            }
            @Override
            public R<Set<Long>> getAppUserByShoppingShop(Integer shopId) {
                return R.fail("获取所有在指定门店消费的用户id失败:" + cause.getMessage());
            }
ruoyi-api/ruoyi-api-order/src/main/java/com/ruoyi/order/feignClient/OrderClient.java
@@ -5,6 +5,7 @@
import com.ruoyi.common.core.domain.R;
import com.ruoyi.order.factory.OrderClientFallbackFactory;
import com.ruoyi.order.model.Order;
import com.ruoyi.order.vo.OrderSaleNum;
import org.springframework.cloud.openfeign.FeignClient;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestBody;
@@ -40,6 +41,9 @@
    @PostMapping("/order/getShopSaleNum")
    R<Integer> getShopSaleNum(@RequestParam("shopId") Integer shopId, @RequestParam("type") Integer type);
    @PostMapping("/order/getShopSaleNumByShopIds")
    R<Integer> getShopSaleNumByShopIds(@RequestBody OrderSaleNum orderSaleNum);
    /**
     * 获取所有在指定门店消费的用户id
ruoyi-api/ruoyi-api-order/src/main/java/com/ruoyi/order/vo/OrderSaleNum.java
New file
@@ -0,0 +1,11 @@
package com.ruoyi.order.vo;
import lombok.Data;
import java.util.List;
@Data
public class OrderSaleNum {
    private List<Integer> shopIds;
    private Integer type;
}
ruoyi-common/ruoyi-common-security/src/main/java/com/ruoyi/common/security/service/TokenService.java
@@ -91,6 +91,7 @@
    public LoginUser getLoginUserApplet() {
        LoginUser loginUserAppletToken = getLoginUserAppletToken(ServletUtils.getRequest());
        if (loginUserAppletToken == null) {
            System.out.println("loginUserAppletToken: "+loginUserAppletToken);
            throw new NotPermissionException("令牌已过期,请重新登录!");
        }
        return loginUserAppletToken;
@@ -101,6 +102,14 @@
        String token = SecurityUtils.getToken(request);
        return getLoginUserApplet(token);
    }
    /**
     * 判断用户是否登录
     */
    public boolean isLoginApplet() {
        LoginUser loginUserAppletToken = getLoginUserAppletToken(ServletUtils.getRequest());
        return loginUserAppletToken != null;
    }
    
    /**
     * 小程序 获取用户身份信息
ruoyi-service/ruoyi-account/src/main/java/com/ruoyi/account/controller/AppUserController.java
@@ -131,6 +131,7 @@
    @PostMapping("/getAppUserById")
    public AppUser getAppUserById(@RequestParam("id") Long id) {
        System.out.println("根据id获取用户:"+id);
        return appUserService.getById(id);
    }
@@ -399,23 +400,42 @@
    @GetMapping("/change")
    @ApiOperation(value = "推广中心", tags = {"小程序-推广中心"})
    public R<AppUser> change(@ApiParam("换绑用户手机号") String phone) {
        Long userId1 = tokenService.getLoginUserApplet().getUserid();
        AppUser byId = appUserService.getById(userId1);
        List<AppUser> appUserList = appUserService.list(new LambdaQueryWrapper<AppUser>()
                .eq(AppUser::getInviteUserId, userId1)
                .eq(AppUser::getPhone, phone));
        if (!CollectionUtils.isEmpty(appUserList)){
            return R.fail("绑定关系已存在!");
        }
//        List<AppUser> appUserList = appUserService.list(new LambdaQueryWrapper<AppUser>()
//                .eq(AppUser::getInviteUserId, userId1)
//                .eq(AppUser::getPhone, phone));
//        if (!CollectionUtils.isEmpty(appUserList)){
//            return R.fail("绑定关系已存在!");
//        }
        //获取绑定门店
        AppUser user = appUserService.lambdaQuery()
                .eq(AppUser::getPhone, phone)
                .eq(AppUser::getDelFlag, 0)
                .eq(AppUser::getStatus, 1)
                .one();
        // 获取当前用户的所有下级
        List<AppUser> allSubordinates = getAllSubordinates(byId.getId());
        long count = allSubordinates.stream().filter(appUser -> appUser.getId().equals(user.getId())).count();
        if (count > 0) {
            return R.fail("绑定关系已存在!");
        }
        if (user == null) {
            return R.fail("当前手机号未注册");
        }
        Long userId = user.getId();
        if (userId.equals(byId.getId())) {
            return R.fail("不能选择自己为绑定人。");
        }
        byId.setInviteUserId(user.getId());
        appUserService.updateById(byId);
        return R.ok();
ruoyi-service/ruoyi-account/src/main/java/com/ruoyi/account/controller/BalanceChangeRecordController.java
@@ -2,11 +2,9 @@
import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.ruoyi.account.api.model.AppUser;
import com.ruoyi.account.api.model.BalanceChangeRecord;
import com.ruoyi.account.dto.BalanceQuery;
import com.ruoyi.account.service.BalanceChangeRecordService;
import com.ruoyi.account.vo.CommissionDetail;
import com.ruoyi.account.vo.CommissionStatistics;
import com.ruoyi.account.vo.WalletStatistics;
import com.ruoyi.account.vo.WalletStatisticsDetail;
@@ -18,6 +16,7 @@
import javax.annotation.Resource;
import javax.servlet.http.HttpServletResponse;
import java.math.BigDecimal;
import java.util.List;
/**
@@ -48,7 +47,17 @@
    @ApiOperation(value = "余额变更明细", tags = {"后台"})
    public R<IPage<BalanceChangeRecord>> page(@RequestBody BalanceQuery agentQuery) {
        return R.ok(balanceChangeRecordService.pageList(agentQuery));
        IPage<BalanceChangeRecord> page = balanceChangeRecordService.pageList(agentQuery);
        for (BalanceChangeRecord record : page.getRecords()) {
            BigDecimal beforeAmount = record.getBeforeAmount();
            BigDecimal afterAmount = record.getAfterAmount();
            if (beforeAmount.compareTo(afterAmount) > 0){
                record.setFlag(2);
            }else {
                record.setFlag(1);
            }
        }
        return R.ok(page);
    }
    /**
ruoyi-service/ruoyi-account/src/main/java/com/ruoyi/account/controller/UserCouponController.java
@@ -88,9 +88,9 @@
        Page<UserCoupon> page = chainWrapper.page(Page.of(pageNum-1, pageSize));
        for (UserCoupon record : page.getRecords()) {
            record.setIdStr(record.getId().toString());
            CouponInfo data = couponClient.detail(record.getCouponId()).getData();
            CouponInfoVo vo = new CouponInfoVo();
            BeanUtils.copyProperties(data,vo);
            String couponInfo = record.getCouponInfo();
            CouponInfoVo vo = JSON.parseObject(couponInfo, CouponInfoVo.class);
//            BeanUtils.copyProperties(data,vo);
            //如果是商品券,将商品名称返回
            if (vo.getCouponType()==4){
                List<String> goodNames = new ArrayList<>();
@@ -98,8 +98,8 @@
                    List<Goods> data1 = goodsClient.getAllGoods().getData();
                    List<String> collect = data1.stream().map(Goods::getName).collect(Collectors.toList());
                    goodNames.addAll(collect);
                }else if(StringUtils.isEmpty(data.getForGoodIds())){
                    goodNames.addAll(JSON.parseArray(data.getGoodsNameJson(), String.class));
                }else if(StringUtils.isEmpty(vo.getForGoodIds())){
                    goodNames.addAll(JSON.parseArray(vo.getGoodsNameJson(), String.class));
                }else {
                    String[] split = vo.getForGoodIds().split(",");
                    R<List<Goods>> goodsById = goodsClient.getGoodsById(split);
@@ -255,9 +255,12 @@
                userPointService.save(userPoint);
            }
        }
        //增加优惠券记录,根据时间类型设置开始结束时间
        UserCoupon userCoupon = new UserCoupon();
        userCoupon.setAppUserId(userid);
        userCoupon.setCouponInfo(JSON.toJSONString(data));
        if (data.getPeriodType()==1) {
            userCoupon.setStartTime(data.getPeriodStartTime().atTime(0, 0, 0));
            userCoupon.setEndTime(data.getPeriodEndTime().atTime(23, 59, 59));
ruoyi-service/ruoyi-account/src/main/java/com/ruoyi/account/controller/VipCenterController.java
@@ -12,6 +12,7 @@
import com.ruoyi.account.vo.vip.VipLevel;
import com.ruoyi.common.core.domain.R;
import com.ruoyi.common.core.exception.ServiceException;
import com.ruoyi.common.core.utils.StringUtils;
import com.ruoyi.common.core.utils.bean.BeanUtils;
import com.ruoyi.common.security.service.TokenService;
import com.ruoyi.other.api.domain.*;
@@ -87,29 +88,27 @@
            VipLevel vipLevel = new VipLevel();
            List<Level> levelList = new ArrayList<>();
            // 批量获取 goodsVip 和 vipGoods
            List<Integer> vipIds = vipSettingList.stream().map(VipSetting::getId).collect(Collectors.toList());
            Map<Integer, R<List<VipGood>>> vipGoodsMap = getVipGoods(vipIds);
            vipSettingList.forEach(vipSetting -> {
                Level level = new Level();
                level.setName(vipSetting.getVipName());
                BeanUtils.copyBeanProp(level, vipSetting);
                level.setVipDesc(baseSetting.getContent());
                R<List<VipGood>> vipGoodR = vipGoodsMap.get(vipSetting.getId());
                if (R.isError(vipGoodR)) {
                    throw new ServiceException("会员商品获取失败");
                List<String> goodsNames = new ArrayList<>();
                if (StringUtils.isNotEmpty(vipSetting.getGoodIds())){
                    String[] goodsIds = vipSetting.getGoodIds().split(",");
                    List<Goods> goodsList = goodsClient.getGoodsById(goodsIds).getData();
                    if (goodsList != null) {
                        for (Goods goods : goodsList) {
                            if (goods.getDelFlag().equals(0)){
                                goodsNames.add(goods.getName());
                            }
                        }
                    }
                }
                List<VipGood> vipGoodList = vipGoodR.getData();
                if (vipGoodList != null && !vipGoodList.isEmpty()) {
                    List<String> goodsNames = new ArrayList<>();
                    vipGoodList.forEach(vipGood -> {
                        Goods goods = JSON.parseObject(vipGood.getGood_json(), Goods.class);
                        goodsNames.add(goods.getName());
                    });
                    level.setGoodsNames(goodsNames);
                }
                level.setGoodsNames(goodsNames);
                levelList.add(level);
            });
ruoyi-service/ruoyi-account/src/main/java/com/ruoyi/account/controller/WithdrawalRequestsController.java
@@ -19,6 +19,8 @@
import com.ruoyi.account.vo.WithdrawalAuth;
import com.ruoyi.common.core.domain.R;
import com.ruoyi.common.core.web.domain.AjaxResult;
import com.ruoyi.common.security.service.TokenService;
import com.ruoyi.system.api.model.LoginUser;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiOperation;
import io.swagger.annotations.ApiParam;
@@ -49,6 +51,8 @@
    
    @Resource
    private BalanceChangeRecordService balanceChangeRecordService;
    @Resource
    private TokenService tokenService;
    /**
     * 提现申请
@@ -112,6 +116,20 @@
                singlePay.setCallbackUrl("/account/withdrawal-requests/withdrawalCallback");
                SinglePayResult singlePayResult = TransferUtil.singlePay(singlePay);
                if(null == singlePayResult){
                    LoginUser loginUserApplet = tokenService.getLoginUserApplet();
                    AppUser appUser = appUserService.getById(loginUserApplet.getUserid());
                    BigDecimal balance = appUser.getBalance();
                    BalanceChangeRecord balanceChangeRecord = new BalanceChangeRecord();
                    balanceChangeRecord.setAppUserId(appUser.getId());
                    balanceChangeRecord.setVipId(appUser.getVipId());
//                    balanceChangeRecord.setOrderId(withdrawalRequests.getId());
                    balanceChangeRecord.setChangeType(2);
                    balanceChangeRecord.setBeforeAmount(balance);
                    balanceChangeRecord.setChangeAmount(withdrawalAmount);
                    balanceChangeRecord.setAfterAmount(appUser.getBalance());
                    balanceChangeRecord.setDelFlag(0);
                    balanceChangeRecord.setCreateTime(LocalDateTime.now());
                    balanceChangeRecordService.save(balanceChangeRecord);
                    return R.fail("转账失败");
                }
                withdrawal.setStatus(1);
ruoyi-service/ruoyi-account/src/main/java/com/ruoyi/account/service/impl/AppUserServiceImpl.java
@@ -492,8 +492,8 @@
        loginVo.setFailureTime(Long.valueOf(tokenApplet.get("expires_in").toString()));
        return R.ok(loginVo);
    }
    /**
     * 会员等级变化
     */
ruoyi-service/ruoyi-account/src/main/java/com/ruoyi/account/service/impl/BalanceChangeRecordServiceImpl.java
@@ -78,9 +78,22 @@
        List<BalanceChangeRecord> balanceChangeRecordList = this.baseMapper.selectBalanceChangeRecordList1(balanceChangeRecord);
        List<WalletStatisticsDetail> walletStatisticsDetailList = new ArrayList<>();
        BigDecimal totalWithdraw = BigDecimal.ZERO;
        for (BalanceChangeRecord changeRecord : balanceChangeRecordList) {
            WalletStatisticsDetail walletStatisticsDetail = new WalletStatisticsDetail();
            BeanUtils.copyBeanProp(walletStatisticsDetail, changeRecord);
            BigDecimal beforeAmount = changeRecord.getBeforeAmount();
            BigDecimal afterAmount = changeRecord.getAfterAmount();
            if (beforeAmount.compareTo(afterAmount) < 0 && changeRecord.getChangeType().equals(2)){
                BigDecimal changeAmount = changeRecord.getChangeAmount();
                totalWithdraw = totalWithdraw.add(changeAmount);
                walletStatisticsDetail.setFlag(2);
            }else {
                walletStatisticsDetail.setFlag(1);
            }
            walletStatisticsDetailList.add(walletStatisticsDetail);
        }
        // 按时间排序(倒序)
@@ -113,15 +126,15 @@
                ));
        BigDecimal totalRecharge = shopCommissionMap.get(1);
        BigDecimal totalWithdraw = shopCommissionMap.get(2);
        BigDecimal totalShopWithdraw = shopCommissionMap.get(7);
        List<WalletStatisticsDetail> walletStatisticsDetailList2 = walletStatisticsDetailList.subList(fromIndex, toIndex);
        for (WalletStatisticsDetail changeRecord : walletStatisticsDetailList2) {
            if (changeRecord.getChangeType().equals(1) || changeRecord.getChangeType().equals(3) || changeRecord.getChangeType().equals(4) || changeRecord.getChangeType().equals(6)) {
                changeRecord.setChangeAmountString("+¥" + changeRecord.getChangeAmount());
            } else {
                changeRecord.setChangeAmountString("-¥" + changeRecord.getChangeAmount());
            Integer flag = changeRecord.getFlag();
            if (flag.equals(1)){
                changeRecord.setChangeAmountString("+¥"+changeRecord.getChangeAmount());
            }else {
                changeRecord.setChangeAmountString("-¥"+changeRecord.getChangeAmount());
            }
            walletStatisticsDetailPage.setCurrent(current);
            walletStatisticsDetailPage.setSize(size);
ruoyi-service/ruoyi-account/src/main/java/com/ruoyi/account/vo/WalletStatisticsDetail.java
@@ -1,5 +1,6 @@
package com.ruoyi.account.vo;
import com.baomidou.mybatisplus.annotation.TableField;
import com.fasterxml.jackson.annotation.JsonFormat;
import com.ruoyi.common.core.annotation.Excel;
import io.swagger.annotations.ApiModelProperty;
@@ -50,4 +51,7 @@
    @ApiModelProperty(value = "变更数量--带金额符号")
    @Excel(name = "变更数量")
    private String changeAmountString;
    @ApiModelProperty(value = "增或减标识: 1-增 2-减")
    private Integer flag;
}
ruoyi-service/ruoyi-account/src/main/resources/mapper/account/AppUserMapper.xml
@@ -144,7 +144,7 @@
    </select>
    <select id="getUserStatisticsDetail" resultType="com.ruoyi.account.vo.UserStatisticsDetail">
        SELECT
            SUM(tau.total_point) totalScore,
            SUM(tau.shop_point+tau.share_point+tau.total_invite_point+tau.total_register_point+tau.total_share_point+tau.total_sign_point+tau.total_hour_point+total_performance_point) totalScore,
            SUM(tau.shop_point) consumeScore,
            SUM(tau.share_point) rebateScore,
            SUM(tau.total_invite_point) inviteScore,
ruoyi-service/ruoyi-account/src/main/resources/mapper/account/BalanceChangeRecordMapper.xml
@@ -70,7 +70,7 @@
        tbcr.after_amount
        FROM
        t_balance_change_record tbcr
        LEFT JOIN t_app_user tau ON tbcr.app_user_id = tau.id
        LEFT JOIN t_app_user tau ON tbcr.app_user_id = tau.id and tau.del_flag = 0
        <where>
            <if test="changeRecord.userName != null and changeRecord.userName != ''">
                and tau.name like concat('%',#{changeRecord.userName},'%')
ruoyi-service/ruoyi-order/src/main/java/com/ruoyi/order/controller/OrderController.java
@@ -461,6 +461,12 @@
        return R.ok(shopSaleNum);
    }
    @PostMapping("/getShopSaleNumByShopIds")
    public R<Integer> getShopSaleNumByShopIds(@RequestBody OrderSaleNum orderSaleNum){
        Integer shopSaleNum = orderService.getShopSaleNumByShopIds(orderSaleNum.getShopIds(), orderSaleNum.getType());
        return R.ok(shopSaleNum);
    }
    /**
     * 获取所有在指定门店消费的用户id
ruoyi-service/ruoyi-order/src/main/java/com/ruoyi/order/mapper/OrderMapper.java
@@ -55,4 +55,6 @@
     * @return
     */
    Integer getShopSaleNum(@Param("shopId") Integer shopId, @Param("type") Integer type);
    Integer getShopSaleNumByShopIds(@Param("shopIds") List<Integer> shopIds, @Param("type") Integer type);
}
ruoyi-service/ruoyi-order/src/main/java/com/ruoyi/order/service/OrderService.java
@@ -117,4 +117,6 @@
     * 导入物流信息
     */
    void importExpress(String url);
    Integer getShopSaleNumByShopIds(List<Integer> shopIds, Integer type);
}
ruoyi-service/ruoyi-order/src/main/java/com/ruoyi/order/service/impl/CommissionServiceImpl.java
@@ -69,7 +69,7 @@
                    .eq(OrderGood::getOrderId, order.getId()));
            AppUser appUser = appUserClient.getAppUserById(order.getAppUserId());
            if(null == appUser){
                return;
                continue;
            }
            //直推上级分佣金额
            BigDecimal ztsj_price = BigDecimal.ZERO;
ruoyi-service/ruoyi-order/src/main/java/com/ruoyi/order/service/impl/OrderServiceImpl.java
@@ -66,7 +66,7 @@
/**
 * <p>
 *  服务实现类
 * 服务实现类
 * </p>
 *
 * @author luodangjia
@@ -90,22 +90,22 @@
    private CommissionService commissionService;
    @Resource
    private BaseSettingClient baseSettingClient;
    @Resource
    private SysUserClient sysUserClient;
    @Resource
    private BalanceChangeRecordClient balanceChangeRecordClient;
    @Resource
    private UserPointClient userPointClient;
    @Resource
    private OrderBalancePaymentService orderBalancePaymentService;
    @Resource
    private VipSettingClient vipSettingClient;
    @Resource
    private GoodsClient goodsClient;
@@ -115,22 +115,21 @@
    private TechnicianSubscribeClient technicianSubscribeClient;
    @Resource
    private ShopBalanceStatementClient shopBalanceStatementClient;
    @Resource
    private RedisTemplate redisTemplate;
    @Resource
    private SystemConfigClient systemConfigClient;
    @Resource
    private UserCouponClient userCouponClient;
    @Resource
    private UserChangeLogClient userChangeLogClient;
    @Resource
    private RegionClient regionClient;
    @Override
@@ -139,16 +138,14 @@
    }
    @Override
    public OrderDetailVO getOrderDetail(Long orderId) {
        Order order = orderMapper.selectById(orderId);
        if (order == null){
        if (order == null) {
            throw new ServiceException("订单不存在");
        }
        R<Shop> shopR = shopClient.getShopById(order.getShopId());
        if (!R.isSuccess(shopR)){
        if (!R.isSuccess(shopR)) {
            throw new ServiceException("获取门店信息失败");
        }
@@ -174,20 +171,20 @@
        // 收货地址
        String addressJson = order.getAddressJson();
        UserAddress userAddress = new UserAddress();
        if (2 == order.getDistributionMode()){
        if (2 == order.getDistributionMode()) {
            userAddress = JSONObject.parseObject(addressJson, UserAddress.class);
        }
        // 优惠券
        String couponJson = order.getCouponJson();
        CouponInfo couponInfo = new CouponInfo();
        if (StringUtils.isNotEmpty(couponJson)){
        if (StringUtils.isNotEmpty(couponJson)) {
            couponInfo = JSONObject.parseObject(couponJson, CouponInfo.class);
        }
        // 参与活动
        String activityJson = order.getActivityJson();
        OrderActivityInfo orderActivityInfo = new OrderActivityInfo();
        if (StringUtils.isNotEmpty(activityJson)){
        if (StringUtils.isNotEmpty(activityJson)) {
            orderActivityInfo = JSONObject.parseObject(activityJson, OrderActivityInfo.class);
        }
        OrderDetailVO orderDetailVO = new OrderDetailVO();
@@ -216,15 +213,15 @@
        orderDetailVO.setLongitude(shop.getLongitude());
        orderDetailVO.setLatitude(shop.getLatitude());
        orderDetailVO.setShopId(shop.getId());
        if(StringUtils.isNotEmpty(order.getExpressResult())){
        if (StringUtils.isNotEmpty(order.getExpressResult())) {
            MapTrackKD100Vo mapTrackKD100Vo = JSON.parseObject(order.getExpressResult(), MapTrackKD100Vo.class);
            List<QueryKD100ListVo> data = mapTrackKD100Vo.getData();
            orderDetailVO.setExpress(null != data && data.size() > 0 ? data.get(0).getContext() : "");
        }
        if(order.getOrderType() == 1){
        if (order.getOrderType() == 1) {
            List<TechnicianSubscribe> data = technicianSubscribeClient.getTechnicianSubscribeList(order.getId()).getData();
            if(data.size() > 0){
            if (data.size() > 0) {
                Long id = data.get(0).getId();
                orderDetailVO.setTechnicianSubscribeId(id.toString());
                Technician technician = technicianClient.shopdetail(order.getTechnicianId()).getData();
@@ -246,11 +243,11 @@
    @Override
    public boolean check(Order order, Integer shopId, Long userId) {
        R<List<AppUserShop>> r = appUserClient.getAppUserShop(userId);
        if (r.getCode() != R.SUCCESS){
        if (r.getCode() != R.SUCCESS) {
            throw new ServiceException("获取用户门店信息失败");
        }
        List<AppUserShop> appUserShopList = r.getData();
        if (appUserShopList == null || appUserShopList.isEmpty()){
        if (appUserShopList == null || appUserShopList.isEmpty()) {
            return false;
        }
@@ -258,12 +255,12 @@
        List<AppUserShop> userShopList = appUserShopList.stream()
                .filter(appUserShop -> appUserShop.getShopId().equals(shopId))
                .collect(Collectors.toList());
        if (userShopList.isEmpty()){
        if (userShopList.isEmpty()) {
            return false;
        }
        // 判断订单是否属于该门店
        if (order == null){
        if (order == null) {
            throw new ServiceException("订单不存在");
        }
@@ -276,7 +273,7 @@
        LoginUser loginUserApplet = tokenService.getLoginUserApplet();
        Order order = orderMapper.selectById(id);
        boolean check = check(order, shopId, loginUserApplet.getUserid());
        if (!check){
        if (!check) {
            throw new ServiceException("该订单与当前扫码门店不一致");
        }
@@ -297,16 +294,17 @@
        order.setAfterSaleTime(LocalDateTime.now().plusDays(days));
        order.setEndTime(LocalDateTime.now());
        order.setCancellerAppUserId(loginUserApplet.getUserid());
        if(StringUtils.isNotEmpty(technicianId) && !"null".equals(technicianId)){
        if (StringUtils.isNotEmpty(technicianId) && !"null".equals(technicianId)) {
            order.setTechnicianId(Integer.valueOf(technicianId));
        }
        // TODO
        orderMapper.updateById(order);
    }
    /**
     * 管理后台获取订单列表数据
     *
     * @param orderPageList
     * @return
     */
@@ -314,47 +312,46 @@
    public PageInfo<OrderPageListVo> getOrderPageList(OrderPageList orderPageList) {
        Long userid = tokenService.getLoginUser().getUserid();
        SysUser sysUser = sysUserClient.getSysUser(userid).getData();
        if(2 == sysUser.getRoleType()){
        if (2 == sysUser.getRoleType()) {
            orderPageList.setShopId(sysUser.getObjectId());
        }
        //搜索条件,用户姓名
        if(StringUtils.isNotEmpty(orderPageList.getUserName())){
        if (StringUtils.isNotEmpty(orderPageList.getUserName())) {
            List<AppUser> data = appUserClient.getAppUserByNameNoFilter(orderPageList.getUserName()).getData();
            List<Long> collect = data.stream().map(AppUser::getId).collect(Collectors.toList());
            if (CollectionUtils.isEmpty(collect)){
            if (CollectionUtils.isEmpty(collect)) {
                return new PageInfo<>();
            }
            if(null != orderPageList.getAppUserIds()){
            if (null != orderPageList.getAppUserIds()) {
                List<Long> appUserIds = orderPageList.getAppUserIds();
                appUserIds.addAll(collect);
                orderPageList.setAppUserIds(appUserIds);
            }else{
            } else {
                orderPageList.setAppUserIds(collect);
            }
        }
        //搜索条件,用户电话
        if(StringUtils.isNotEmpty(orderPageList.getPhone())){
        if (StringUtils.isNotEmpty(orderPageList.getPhone())) {
            List<AppUser> data = appUserClient.getAppUserByPhoneNoFilter(orderPageList.getPhone()).getData();
            List<Long> collect = data.stream().map(AppUser::getId).collect(Collectors.toList());
            if (CollectionUtils.isEmpty(collect)){
            if (CollectionUtils.isEmpty(collect)) {
                return new PageInfo<>();
            }
            if(null != orderPageList.getAppUserIds()){
            if (null != orderPageList.getAppUserIds()) {
                List<Long> appUserIds = orderPageList.getAppUserIds();
                if (!containsAny(appUserIds,collect)) {
                if (!containsAny(appUserIds, collect)) {
                    return new PageInfo<>();
                }
                appUserIds.addAll(collect);
                orderPageList.setAppUserIds(appUserIds);
            }else{
            } else {
                orderPageList.setAppUserIds(collect);
            }
        }
        if (null != orderPageList.getAppUserIds()){
        if (null != orderPageList.getAppUserIds()) {
            orderPageList.setAppUserIds(orderPageList.getAppUserIds().stream().distinct().collect(Collectors.toList()));
        }
        PageInfo<OrderPageListVo> pageInfo = new PageInfo<>(orderPageList.getPageCurr(), orderPageList.getPageSize());
@@ -363,7 +360,7 @@
        for (OrderPageListVo orderPageListVo : list) {
            Long appUserId = orderPageListVo.getAppUserId();
            AppUser appUser = appUserClient.getAppUserById(appUserId);
            if(null != appUser){
            if (null != appUser) {
                orderPageListVo.setUserName(appUser.getName());
                orderPageListVo.setPhone(appUser.getPhone());
            }
@@ -376,7 +373,7 @@
            orderPageListVo.setGetCommission(reduce);
            String expressJson = orderPageListVo.getExpressJson();
            if (StringUtils.isNotEmpty(expressJson) && !expressJson.equals("NULL")){
            if (StringUtils.isNotEmpty(expressJson) && !expressJson.equals("NULL")) {
                JSONObject jsonObject = null;
                try {
                    jsonObject = JSONObject.parseObject(expressJson);
@@ -415,32 +412,31 @@
    }
    /**
     * 小程序取消订单
     *
     * @param orderId
     * @return
     */
    @Override
    public R cancel(Long orderId) {
        Order order = this.getById(orderId);
        if(null == order){
        if (null == order) {
            return R.fail("取消失败");
        }
        Long userid = tokenService.getLoginUserApplet().getUserid();
        if(!order.getAppUserId().equals(userid)){
        if (!order.getAppUserId().equals(userid)) {
            return R.fail("取消失败");
        }
        if(!Arrays.asList(1, 2, 3).contains(order.getOrderStatus())){
        if (!Arrays.asList(1, 2, 3).contains(order.getOrderStatus())) {
            return R.fail("订单取消失败");
        }
        if(null != order.getAfterSaleTime() && LocalDateTime.now().isAfter(order.getAfterSaleTime())){
        if (null != order.getAfterSaleTime() && LocalDateTime.now().isAfter(order.getAfterSaleTime())) {
            return R.fail("订单取消失败");
        }
        order.setOrderStatus(5);
        R r = refundPayMoney(order);
        if(200 == r.getCode()){
        if (200 == r.getCode()) {
            this.updateById(order);
        }
        return r;
@@ -448,18 +444,19 @@
    /**
     * 确认发货操作
     *
     * @return
     */
    @Override
    public R confirmDelivery(ConfirmDelivery confirmDelivery) {
        Order order = this.getById(confirmDelivery.getOrderId());
        if(1 == order.getPayStatus()){
        if (1 == order.getPayStatus()) {
            return R.fail("订单还未完成支付");
        }
        if(1 == order.getOrderType() || null == order.getAddressJson()){
        if (1 == order.getOrderType() || null == order.getAddressJson()) {
            return R.fail("该订单不支付快递配送");
        }
        if(1 != order.getOrderStatus()){
        if (1 != order.getOrderStatus()) {
            return R.fail("无效的操作");
        }
        //添加快递号和修改订单状态
@@ -490,54 +487,55 @@
    }
    /**
     * 取消订单操作
     *
     * @param orderId
     * @return
     */
    @Override
    public R cancelOrder(Long orderId) {
        Order order = this.getById(orderId);
        if(Arrays.asList(5, 6, 7).contains(order.getOrderStatus())){
        if (Arrays.asList(5, 6, 7).contains(order.getOrderStatus())) {
            return R.fail("无效的操作");
        }
        if(null != order.getAfterSaleTime() && LocalDateTime.now().isAfter(order.getAfterSaleTime())){
        if (null != order.getAfterSaleTime() && LocalDateTime.now().isAfter(order.getAfterSaleTime())) {
            return R.fail("订单取消失败");
        }
        order.setOrderStatus(5);
        R r = refundPayMoney(order);
        if(200 == r.getCode()){
        if (200 == r.getCode()) {
            this.updateById(order);
        }
        return r;
    }
    /**
     * 返回订单支付金额和回退积分和会员等级
     *
     * @param order
     */
    public R refundPayMoney(Order order){
    public R refundPayMoney(Order order) {
        //开始退款
        Integer payMethod = order.getPayMethod();
        BigDecimal paymentAmount = order.getPaymentAmount();
        AppUser appUser = appUserClient.getAppUserById(order.getAppUserId());
        if(1 == payMethod){
        if (1 == payMethod) {
            //微信退款
            RefundResult refund = PaymentUtil.refund(order.getOrderNumber(), "R" + order.getOrderNumber(), paymentAmount.doubleValue(), "/order/order/refundPayMoneyCallback");
            if("100".equals(refund.getRa_Status())){
            if ("100".equals(refund.getRa_Status())) {
                order.setRefundStatus(1);
                return R.ok();
            }else{
            } else {
                return R.fail(refund.getRc_CodeMsg());
            }
        }
        if(2 == payMethod){
        if (2 == payMethod) {
            //余额退款
            OrderBalancePayment orderBalancePayment = orderBalancePaymentService.getOne(new LambdaQueryWrapper<OrderBalancePayment>().eq(OrderBalancePayment::getOrderId, order.getId()));
            BigDecimal balance = appUser.getBalance();
            if(null != orderBalancePayment){
            if (null != orderBalancePayment) {
                appUser.setTotalRedPacketAmount(appUser.getTotalRedPacketAmount().add(orderBalancePayment.getRedPacketAmount()).setScale(2, RoundingMode.HALF_EVEN));
//                appUser.setTotalDistributionAmount(appUser.getTotalDistributionAmount().add(orderBalancePayment.getDistributionAmount()).setScale(2, RoundingMode.HALF_EVEN));
            }
@@ -546,12 +544,12 @@
            //查询最后一次的消费订单
            Order order1 = this.getOne(new LambdaQueryWrapper<Order>().eq(Order::getAppUserId, order.getAppUserId()).eq(Order::getPayStatus, 2)
                    .eq(Order::getDelFlag, 0).in(Order::getOrderStatus, Arrays.asList(1, 2, 3, 4, 8)).ne(Order::getId, order.getId()).last(" order by create_time desc limit 0, 1"));
            if(null != order1){
            if (null != order1) {
                appUser.setLastShopTime(order1.getCreateTime());
            }else{
            } else {
                appUser.setLastShopTime(null);
            }
            //构建账户余额流水明细
            BalanceChangeRecord balanceChangeRecord = new BalanceChangeRecord();
            balanceChangeRecord.setOrderId(order.getId());
@@ -582,13 +580,13 @@
            appUser.setLavePoint(appUser.getLavePoint() - shopPoint);
            appUser.setAvailablePoint(appUser.getAvailablePoint() - availablePoint);
            appUser.setTotalAvailablePoint(appUser.getTotalAvailablePoint() - availablePoint);
            if(null != transferablePoint){
            if (null != transferablePoint) {
                appUser.setTransferablePoint(appUser.getTransferablePoint() - transferablePoint);
            }
            appUser.setTotalPoint(appUser.getTotalPoint() - shopPoint);
            //构建积分流水明细
            if(shopPoint > 0){
            if (shopPoint > 0) {
                UserPoint userPoint = new UserPoint();
                userPoint.setType(1);
                userPoint.setHistoricalPoint(lavePoint);
@@ -600,37 +598,37 @@
                userPointClient.saveUserPoint(userPoint);
            }
            appUserClient.editAppUserById(appUser);
            //降级检测
            if(1 < appUser.getVipId() && appUser.getVipId() < 4){
            if (1 < appUser.getVipId() && appUser.getVipId() < 4) {
                appUserClient.vipDemotion(appUser.getId());
            }
            //回退优惠券状态
            if(null != order.getUserCouponId()){
            if (null != order.getUserCouponId()) {
                UserCoupon userCoupon = userCouponClient.getUserCoupon(order.getUserCouponId()).getData();
                userCoupon.setUseTime(null);
                userCouponClient.editReturnUse(userCoupon);
            }
        }
        if(3 == payMethod){
        if (3 == payMethod) {
            //开始运费退款,积分支付,运费是单独进行支付的,所以需要单独退款
            if(null != order.getExpressAmount() && BigDecimal.ZERO.compareTo(order.getExpressAmount()) < 0){
            if (null != order.getExpressAmount() && BigDecimal.ZERO.compareTo(order.getExpressAmount()) < 0) {
                BigDecimal expressAmount = order.getExpressAmount();
                if(1 == order.getExpressPayMethod()){
                if (1 == order.getExpressPayMethod()) {
                    //微信退款
                    RefundResult refund = PaymentUtil.refund(order.getOrderNumber(), "R" + order.getOrderNumber(), expressAmount.doubleValue(), "/order/order/refundExpressPayMoneyCallback");
                    if("100".equals(refund.getRa_Status())){
                    if ("100".equals(refund.getRa_Status())) {
                        order.setRefundStatus(1);
                        return R.ok();
                    }else{
                    } else {
                        return R.fail(refund.getRc_CodeMsg());
                    }
                }
                if(2 == order.getExpressPayMethod()){
                if (2 == order.getExpressPayMethod()) {
                    //余额退款
                    OrderBalancePayment orderBalancePayment = orderBalancePaymentService.getOne(new LambdaQueryWrapper<OrderBalancePayment>().eq(OrderBalancePayment::getOrderId, order.getId()));
                    BigDecimal balance = appUser.getBalance();
                    if(null != orderBalancePayment){
                    if (null != orderBalancePayment) {
                        appUser.setTotalRedPacketAmount(appUser.getTotalRedPacketAmount().add(orderBalancePayment.getRedPacketAmount()).setScale(2, RoundingMode.HALF_EVEN));
//                        appUser.setTotalDistributionAmount(appUser.getTotalDistributionAmount().add(orderBalancePayment.getDistributionAmount()).setScale(2, RoundingMode.HALF_EVEN));
                    }
@@ -659,14 +657,14 @@
            userPoint1.setObjectId(order.getId());
            List<UserPoint> data = userPointClient.getUserPointList(userPoint1).getData();
            Integer transferablePoint = order.getPoint();
            if(data.size() > 0){
            if (data.size() > 0) {
                UserPoint userPoint = data.get(0);
                transferablePoint = Integer.valueOf(userPoint.getExtention());
            }
            appUser.setTransferablePoint(appUser.getTransferablePoint() + transferablePoint);
            //构建积分流水明细
            if(order.getPoint() > 0){
            if (order.getPoint() > 0) {
                UserPoint userPoint = new UserPoint();
                userPoint.setType(11);
                userPoint.setHistoricalPoint(lavePoint);
@@ -688,13 +686,14 @@
    /**
     * 取消订单后回调处理
     *
     * @return
     */
    @Override
    public R refundPayMoneyCallback(RefundCallbackResult refundCallbackResult) {
        String code = refundCallbackResult.getR3_RefundOrderNo().substring(1);
        Order order = this.getOne(new LambdaQueryWrapper<Order>().eq(Order::getOrderNumber, code));
        if(null == order || order.getPayStatus() == 1 || order.getOrderStatus() == 6){
        if (null == order || order.getPayStatus() == 1 || order.getOrderStatus() == 6) {
            return R.ok();
        }
        order.setRefundCode(refundCallbackResult.getR5_RefundTrxNo());
@@ -718,13 +717,13 @@
        appUser.setLavePoint(appUser.getLavePoint() - shopPoint);
        appUser.setAvailablePoint(appUser.getAvailablePoint() - availablePoint);
        appUser.setTotalAvailablePoint(appUser.getTotalAvailablePoint() - availablePoint);
        if(null != transferablePoint){
        if (null != transferablePoint) {
            appUser.setTransferablePoint(appUser.getTransferablePoint() - transferablePoint);
        }
        appUser.setTotalPoint(appUser.getTotalPoint() - shopPoint);
        //构建积分流水明细
        if(shopPoint > 0){
        if (shopPoint > 0) {
            UserPoint userPoint = new UserPoint();
            userPoint.setType(1);
            userPoint.setHistoricalPoint(lavePoint);
@@ -736,14 +735,14 @@
            userPointClient.saveUserPoint(userPoint);
        }
        appUserClient.editAppUserById(appUser);
        //降级检测
        if(1 < appUser.getVipId() && appUser.getVipId() < 4){
        if (1 < appUser.getVipId() && appUser.getVipId() < 4) {
            appUserClient.vipDemotion(appUser.getId());
        }
        //回退优惠券状态
        if(null != order.getUserCouponId()){
        if (null != order.getUserCouponId()) {
            UserCoupon userCoupon = userCouponClient.getUserCoupon(order.getUserCouponId()).getData();
            userCoupon.setUseTime(null);
            userCouponClient.editReturnUse(userCoupon);
@@ -754,13 +753,14 @@
    /**
     * 取消订单快递费回退
     *
     * @return
     */
    @Override
    public R refundExpressPayMoneyCallback(RefundCallbackResult refundCallbackResult) {
        String code = refundCallbackResult.getR3_RefundOrderNo().substring(1);
        Order order = this.getOne(new LambdaQueryWrapper<Order>().eq(Order::getOrderNumber, code));
        if(null == order || order.getPayStatus() == 1 || order.getOrderStatus() == 6){
        if (null == order || order.getPayStatus() == 1 || order.getOrderStatus() == 6) {
            return R.ok();
        }
        order.setRefundCode(refundCallbackResult.getR5_RefundTrxNo());
@@ -778,14 +778,14 @@
        userPoint1.setObjectId(order.getId());
        List<UserPoint> data = userPointClient.getUserPointList(userPoint1).getData();
        Integer transferablePoint = order.getPoint();
        if(data.size() > 0){
        if (data.size() > 0) {
            UserPoint userPoint = data.get(0);
            transferablePoint = Integer.valueOf(userPoint.getExtention());
        }
        appUser.setTransferablePoint(appUser.getTransferablePoint() + transferablePoint);
        //构建积分流水明细
        if(order.getPoint() > 0){
        if (order.getPoint() > 0) {
            UserPoint userPoint = new UserPoint();
            userPoint.setType(11);
            userPoint.setHistoricalPoint(lavePoint);
@@ -799,18 +799,17 @@
        return R.ok();
    }
    /**
     * 收货操作
     *
     * @param orderId
     * @return
     */
    @Override
    public R receivingOperation(Long orderId) {
        Order order = this.getById(orderId);
        if(order.getOrderStatus() != 2){
        if (order.getOrderStatus() != 2) {
            return R.fail("无效的操作");
        }
        order.setOrderStatus(4);
@@ -829,10 +828,11 @@
        this.updateById(order);
        return R.ok();
    }
    /**
     * 获取订单详情
     *
     * @param orderId
     * @return
     */
@@ -845,18 +845,18 @@
        orderInfo.setOrderStatus(order.getOrderStatus());
        orderInfo.setCreateTime(order.getCreateTime().format(DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss")));
        AppUser appUser = appUserClient.getAppUserById(order.getAppUserId());
        if(null != appUser){
        if (null != appUser) {
            orderInfo.setUserName(appUser.getName());
            orderInfo.setPhone(appUser.getPhone());
        }
        orderInfo.setOrderType(order.getOrderType() == 1 ? "服务" : (StringUtils.isNotEmpty(order.getAddressJson()) ? "单品-快递配送" : "单品-上门自提"));
        Shop shop = shopClient.getShopById(order.getShopId()).getData();
        if(null != shop){
        if (null != shop) {
            orderInfo.setShopName(shop.getName());
        }
        orderInfo.setPaymentMethod(order.getPayMethod());
        orderInfo.setTotalAmount(order.getTotalAmount());
        if(StringUtils.isNotEmpty(order.getCouponJson())){
        if (StringUtils.isNotEmpty(order.getCouponJson())) {
            CouponInfo couponInfo = JSON.parseObject(order.getCouponJson(), CouponInfo.class);
            orderInfo.setCouponName(couponInfo.getCouponName());
        }
@@ -864,7 +864,7 @@
        orderInfo.setExpressAmount(order.getExpressAmount());
        orderInfo.setPaymentAmount(order.getPaymentAmount());
        orderInfo.setGetPoint(order.getGetPoint());
        if(2 == order.getDistributionMode()){
        if (2 == order.getDistributionMode()) {
            UserAddress userAddress = JSON.parseObject(order.getAddressJson(), UserAddress.class);
            orderInfo.setRecipient(userAddress.getRecieveName() + "-" + userAddress.getRecievePhone());
            userAddress.setRecieveAddress(userAddress.getProvince() + userAddress.getCity() + userAddress.getDistrict() + userAddress.getRecieveAddress());
@@ -872,9 +872,14 @@
            MapTrackKD100Vo mapTrackKD100Vo = JSON.parseObject(order.getExpressResult(), MapTrackKD100Vo.class);
            orderInfo.setExpress(mapTrackKD100Vo);
        }
        if (StringUtils.isNotEmpty(order.getExpressJson()) && !order.getExpressJson().equals("NULL")){
            JSONObject jsonObject = JSON.parseObject(order.getExpressJson());
            orderInfo.setExpressCompany(jsonObject.getString("com"));
            orderInfo.setExpressNumber(jsonObject.getString("num"));
        }
        List<OrderGood> orderGoods = orderGoodMapper.selectList(new LambdaQueryWrapper<OrderGood>().eq(OrderGood::getOrderId, orderId).eq(OrderGood::getDelFlag, 0));
        int sum = orderGoods.stream().mapToInt(OrderGood::getNum).sum();
        System.out.println("111111111111222");
        orderInfo.setGoodsNum(sum);
        List<Object> goodsJson = new ArrayList<>();
        for (OrderGood orderGood : orderGoods) {
@@ -887,21 +892,21 @@
        }
        orderInfo.setGoodsJson(JSON.toJSONString(goodsJson));
        orderInfo.setPoint(order.getPoint());
        if(null != order.getAfterSaleTime()){
        if (null != order.getAfterSaleTime()) {
            orderInfo.setAfterSaleTime(order.getAfterSaleTime().format(DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss")));
        }
        if(StringUtils.isNotEmpty(order.getActivityJson())){
        if (StringUtils.isNotEmpty(order.getActivityJson())) {
            OrderActivityInfo activityInfo = JSON.parseObject(order.getActivityJson(), OrderActivityInfo.class);
            orderInfo.setActivityName(activityInfo.getActivityName());
        }
        if(null != order.getEndTime()){
        if (null != order.getEndTime()) {
            AppUser user = appUserClient.getAppUserById(order.getCancellerAppUserId());
            orderInfo.setCanceller(user.getName());
            orderInfo.setWriteOffTime(order.getEndTime().format(DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss")));
        }
        if(order.getOrderType() == 1){
        if (order.getOrderType() == 1) {
            List<TechnicianSubscribe> technicianSubscribes = technicianSubscribeClient.getTechnicianSubscribeList(order.getId()).getData();
            if(technicianSubscribes.size() > 0){
            if (technicianSubscribes.size() > 0) {
                Set<Integer> collect = technicianSubscribes.stream().map(TechnicianSubscribe::getTechnicianId).collect(Collectors.toSet());
                List<Technician> data = technicianClient.getTechnicianByIds(collect).getData();
                orderInfo.setTechnicianName(data.stream().map(Technician::getName).collect(Collectors.joining(",")));
@@ -916,6 +921,7 @@
    /**
     * 获取商品销售数量
     *
     * @param goodsId
     * @return
     */
@@ -927,6 +933,7 @@
    /**
     * 获取店铺订单数量
     *
     * @param shopId
     * @param type
     * @return
@@ -935,23 +942,23 @@
    public Integer getShopSaleNum(Integer shopId, Integer type) {
        return this.baseMapper.getShopSaleNum(shopId, type);
    }
    /**
     * 定时查询快递信息
     */
    @Override
    public void taskExpress() {
        Set<Long> order_express = redisTemplate.opsForZSet().rangeByScore("order_express", 0, LocalDateTime.now().toEpochSecond(ZoneOffset.UTC));
        if(order_express.size() > 0){
        if (order_express.size() > 0) {
            for (Long id : order_express) {
                Order order = this.getById(id);
                if(order.getOrderStatus() != 2){
                if (order.getOrderStatus() != 2) {
                    redisTemplate.opsForZSet().remove("order_express", id);
                    continue;
                }
                String expressJson = order.getExpressJson();
                if(StringUtils.isEmpty(expressJson)){
                if (StringUtils.isEmpty(expressJson)) {
                    redisTemplate.opsForZSet().remove("order_express", id);
                    continue;
                }
@@ -978,7 +985,7 @@
    @Transactional(rollbackFor = Exception.class)
    public void importExpress(String url) {
        URL url1 = new URL(url);
        try (InputStream  fileInputStream = url1.openStream()) {
        try (InputStream fileInputStream = url1.openStream()) {
            Workbook workbook = new XSSFWorkbook(fileInputStream);
            Sheet sheet = workbook.getSheetAt(0); // 获取第一个Sheet
            int lastRowNum = sheet.getLastRowNum();
@@ -1002,39 +1009,39 @@
                Order order = this.getOne(new LambdaQueryWrapper<Order>()
                        .eq(Order::getOrderNumber, orderNum)
                );
                if (order == null){
                    throw new ServiceException("订单不存在:"+orderNum, 500);
                if (order == null) {
                    throw new ServiceException("订单不存在:" + orderNum, 500);
                }
                Integer orderType = order.getOrderType();
                if (orderType != 2){
                    throw new ServiceException("该订单:"+orderNum+"类型不为单品订单", 500);
                if (orderType != 2) {
                    throw new ServiceException("该订单:" + orderNum + "类型不为单品订单", 500);
                }
                if (order.getDistributionMode() != 2){
                    throw new ServiceException("该订单:"+orderNum+"配送方式不为快递", 500);
                if (order.getDistributionMode() != 2) {
                    throw new ServiceException("该订单:" + orderNum + "配送方式不为快递", 500);
                }
                Integer orderStatus = order.getOrderStatus();
                if (orderStatus != 1){
                    throw new ServiceException("该订单:"+orderNum+"状态不为待发货", 500);
                if (orderStatus != 1) {
                    throw new ServiceException("该订单:" + orderNum + "状态不为待发货", 500);
                }
                String companyNameByCode = ExpressCompanyMap.getCodeByCompanyName(expressName);
                if(StringUtils.isEmpty(companyNameByCode)){
                    throw new ServiceException("快递公司名称错误:"+expressName, 500);
                if (StringUtils.isEmpty(companyNameByCode)) {
                    throw new ServiceException("快递公司名称错误:" + expressName, 500);
                }
                R<Region> regionBiCode = regionClient.getRegionBiCode(provinceCode);
                if (regionBiCode.getData() == null) {
                    throw new ServiceException("省份编码错误:"+provinceCode, 500);
                    throw new ServiceException("省份编码错误:" + provinceCode, 500);
                }
                R<Region> regionBiCode1 = regionClient.getRegionBiCode(cityCode);
                if (regionBiCode1.getData() == null) {
                    throw new ServiceException("城市编码错误:"+cityCode, 500);
                    throw new ServiceException("城市编码错误:" + cityCode, 500);
                }
                JSONObject jsonObject = new JSONObject();
                jsonObject.put("com", companyNameByCode);
                jsonObject.put("num", expressNum);
                ConfirmDelivery confirmDelivery =new ConfirmDelivery();
                ConfirmDelivery confirmDelivery = new ConfirmDelivery();
                confirmDelivery.setOrderId(order.getId());
                confirmDelivery.setCode(jsonObject.toJSONString());
                confirmDelivery.setDeliverProvince(regionBiCode.getData().getName());
@@ -1056,7 +1063,7 @@
    public static void importExpress2(String filePath) throws MalformedURLException {
        // 从网络地址读取
        URL url = new URL(filePath);
        try (InputStream  fileInputStream = url.openStream()) {
        try (InputStream fileInputStream = url.openStream()) {
            Workbook workbook = new XSSFWorkbook(fileInputStream);
            Sheet sheet = workbook.getSheetAt(0); // 获取第一个Sheet
@@ -1080,4 +1087,8 @@
        }
    }
    @Override
    public Integer getShopSaleNumByShopIds(List<Integer> shopIds, Integer type) {
        return this.baseMapper.getShopSaleNumByShopIds(shopIds, type);
    }
}
ruoyi-service/ruoyi-order/src/main/java/com/ruoyi/order/vo/OrderInfoVo.java
@@ -73,5 +73,9 @@
    private String activityName;
    @ApiModelProperty("核销码BASE64")
    private String writeOffCode;
    @ApiModelProperty("快递公司")
    private String expressCompany;
    @ApiModelProperty("快递单号")
    private String expressNumber;
    
}
ruoyi-service/ruoyi-order/src/main/resources/mapper/order/OrderMapper.xml
@@ -143,4 +143,17 @@
            and order_type = #{type}
        </if>
    </select>
    <select id="getShopSaleNumByShopIds" resultType="java.lang.Integer">
        select
        ifnull(count(1), 0)
        from t_order a
        where del_flag = 0 and pay_status = 2 and order_status in (1, 2, 3, 4, 7, 8)
        and shop_id in
        <foreach collection="shopIds" item="shopId" separator="," open="(" close=")" index="index">
            #{shopId}
        </foreach>
        <if test="null != type">
            and order_type = #{type}
        </if>
    </select>
</mapper>
ruoyi-service/ruoyi-other/Dockerfile
New file
@@ -0,0 +1,24 @@
# 使用官方的 OpenJDK 8 JRE 镜像作为基础镜像
FROM docker.m.daocloud.io/library/openjdk:8-jre-alpine
# 设置维护者信息
LABEL maintainer="luofl,mit"
# 创建必要的目录
RUN mkdir -p /xss/server/logs \
    && mkdir -p /xss/server/temp
# 设置工作目录
WORKDIR /xss/server
# 设置默认环境变量(可被运行时覆盖)
ENV SERVER_PORT=9600
# 声明容器暴露的端口(静态值更可靠)
EXPOSE 9600
# 将本地构建的 JAR 文件复制到镜像中
ADD ./target/ruoyi-modules-other.jar ./app.jar
# 定义容器启动时运行的命令
ENTRYPOINT ["java", "-Djava.security.egd=file:/dev/./urandom", "-Dserver.port=${SERVER_PORT}", "-jar", "app.jar"]
ruoyi-service/ruoyi-other/src/main/java/com/ruoyi/other/controller/CouponInfoController.java
@@ -80,6 +80,9 @@
    @ApiOperation(value = "优惠劵管理-详情", tags = {"管理后台-活动管理"})
    public R<CouponInfo> detail(@RequestParam("id") Integer id) {
        CouponInfo byId = couponInfoService.getById(id);
        if (byId == null){
            return R.fail("优惠劵不存在");
        }
        String forGoodIds = byId.getForGoodIds();
        if (!"-1".equals(forGoodIds) && StringUtils.isNotEmpty(forGoodIds)){
            List<Goods> goods = goodsService.listByIds(Arrays.asList(forGoodIds.split(",")));
ruoyi-service/ruoyi-other/src/main/java/com/ruoyi/other/controller/GoodsEvaluateController.java
@@ -150,7 +150,7 @@
        }
        if (StringUtils.isNotEmpty(goodsEvaluate.getPhone())) {
            usersPhoneList = appUserClient.getAppUserByPhone(goodsEvaluate.getPhone()).getData().stream().map(AppUser::getId).collect(Collectors.toList());
            usersPhoneList = appUserClient.getAppUserByPhoneNoFilter(goodsEvaluate.getPhone()).getData().stream().map(AppUser::getId).collect(Collectors.toList());
            if (usersPhoneList.isEmpty()) {
                return R.ok(new Page<>());
            }
ruoyi-service/ruoyi-other/src/main/java/com/ruoyi/other/controller/ShareController.java
@@ -255,6 +255,16 @@
            userIds.addAll(userList.stream().map(AppUser::getId).collect(Collectors.toList()));
        }
        List<Share> list = shareService.list();
        if (CollectionUtils.isEmpty(list)){
            return R.ok(Page.of(pageNum, pageSize));
        }
        List<Long> objectIds = list.stream().map(Share::getObjectId).distinct().collect(Collectors.toList());
        List<AppUser> appUsers = appUserClient.listByIds(objectIds);
        List<Long> appUserIds = appUsers.stream().filter(item -> !item.getDelFlag()).map(AppUser::getId).collect(Collectors.toList());
        if (CollectionUtils.isEmpty(userIds)){
            userIds = appUserIds;
        }
        Page<Share> page = shareService.lambdaQuery()
ruoyi-service/ruoyi-other/src/main/java/com/ruoyi/other/controller/ShopController.java
@@ -15,6 +15,7 @@
import com.ruoyi.common.security.utils.MD5Generator;
import com.ruoyi.common.security.utils.SecurityUtils;
import com.ruoyi.order.feignClient.OrderClient;
import com.ruoyi.order.vo.OrderSaleNum;
import com.ruoyi.order.vo.VerifiableShopVo;
import com.ruoyi.other.api.domain.*;
import com.ruoyi.other.mapper.ShopMapper;
@@ -688,14 +689,35 @@
    @ApiOperation(value = "门店统计", tags = {"管理后台-首页统计"})
    public R<ShopStatistics> shopStatistics(@ApiParam("门店id") Integer shopId) {
        ShopStatistics shopStatistics = shopMapper.getShopStatistics(shopId);
        if(null == shopId){
            shopId = 0;
        List<Integer> shopIds;
        shopIds = shopService.list(new LambdaQueryWrapper<Shop>()
                        .eq(Shop::getDelFlag, 0)
                        .eq(shopId !=null,Shop::getId, shopId))
                .stream()
                .map(Shop::getId)
                .collect(Collectors.toList());
        if (CollectionUtils.isEmpty(shopIds)){
            shopStatistics.setTotalOrder(0);
            shopStatistics.setServiceOrder(0);
            shopStatistics.setGoodsOrder(0);
        }else {
            OrderSaleNum serviceOrderSaleNum = new OrderSaleNum();
            serviceOrderSaleNum.setShopIds(shopIds);
            serviceOrderSaleNum.setType(1);
            Integer serviceOrder = orderClient.getShopSaleNumByShopIds(serviceOrderSaleNum).getData();
            OrderSaleNum goodsOrderSaleNum = new OrderSaleNum();
            goodsOrderSaleNum.setShopIds(shopIds);
            goodsOrderSaleNum.setType(2);
            Integer goodsOrder = orderClient.getShopSaleNumByShopIds(goodsOrderSaleNum).getData();
            shopStatistics.setTotalOrder(serviceOrder + goodsOrder);
            shopStatistics.setServiceOrder(serviceOrder);
            shopStatistics.setGoodsOrder(goodsOrder);
        }
        Integer serviceOrder = orderClient.getShopSaleNum(shopId, 1).getData();
        Integer goodsOrder = orderClient.getShopSaleNum(shopId, 2).getData();
        shopStatistics.setTotalOrder(serviceOrder + goodsOrder);
        shopStatistics.setServiceOrder(serviceOrder);
        shopStatistics.setGoodsOrder(goodsOrder);
        return R.ok(shopStatistics);
    }
    
ruoyi-service/ruoyi-other/src/main/java/com/ruoyi/other/service/impl/ShopServiceImpl.java
@@ -1,5 +1,6 @@
package com.ruoyi.other.service.impl;
import cn.afterturn.easypoi.cache.manager.IFileLoader;
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
@@ -8,6 +9,7 @@
import com.ruoyi.account.api.model.AppUser;
import com.ruoyi.common.core.domain.R;
import com.ruoyi.common.core.exception.ServiceException;
import com.ruoyi.common.core.exception.auth.NotPermissionException;
import com.ruoyi.common.core.utils.GeodesyUtil;
import com.ruoyi.common.core.utils.ServletUtils;
import com.ruoyi.common.core.utils.StringUtils;
@@ -137,14 +139,20 @@
    @Override
    public ShopDetailVO getShopDetail(Integer shopId, BigDecimal longitude, BigDecimal latitude) {
        Long userid = tokenService.getLoginUserApplet().getUserid();
        Long userid = null;
        if (tokenService.isLoginApplet()){
            userid = tokenService.getLoginUserApplet().getUserid();
        }
        // 查询店铺详情
        ShopDetailVO shopDetailVO = shopMapper.selectShopDetail(shopId);
        if (shopDetailVO == null) {
            throw new ServiceException("查询店铺不存在");
        }
        ShopScore one = shopScoreService.getOne(new LambdaQueryWrapper<ShopScore>().eq(ShopScore::getAppUserId, userid).eq(ShopScore::getShopId, shopId).last(" order by create_time desc limit 0, 1"));
        shopDetailVO.setMyScore(null == one ? BigDecimal.ZERO : one.getScore());
        if (userid != null){
            ShopScore one = shopScoreService.getOne(new LambdaQueryWrapper<ShopScore>().eq(ShopScore::getAppUserId, userid).eq(ShopScore::getShopId, shopId).last(" order by create_time desc limit 0, 1"));
            shopDetailVO.setMyScore(null == one ? BigDecimal.ZERO : one.getScore());
        }
        // 计算距离
        if (shopDetailVO.getLongitude() != null && shopDetailVO.getLatitude() != null){
            String shopLocation = String.format("%s,%s", shopDetailVO.getLongitude(), shopDetailVO.getLatitude());
ruoyi-service/ruoyi-other/src/main/resources/mapper/other/ShopMapper.xml
@@ -68,9 +68,9 @@
            SUM(ts.can_withdraw_money) canWithdrawMoney,
            SUM(ts.withdraw_money) alreadyWithdrawMoney
        FROM
            t_shop ts
            t_shop ts where ts.del_flag = 0
            <if test="null != shopId">
                where ts.id = #{shopId}
                and ts.id = #{shopId}
            </if>
    </select>
</mapper>