Pu Zhibing
2025-01-14 2a2f435d52d358cba6e239e29b586777678c2baf
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
package com.ruoyi.other.service.impl;
 
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import com.ruoyi.account.api.feignClient.AppUserClient;
import com.ruoyi.account.api.feignClient.AppUserShopClient;
import com.ruoyi.account.api.model.AppUser;
import com.ruoyi.account.api.model.AppUserShop;
import com.ruoyi.common.core.utils.StringUtils;
import com.ruoyi.common.core.web.page.PageInfo;
import com.ruoyi.common.security.service.TokenService;
import com.ruoyi.common.security.utils.SecurityUtils;
import com.ruoyi.order.feignClient.RemoteOrderGoodsClient;
import com.ruoyi.other.api.domain.TechnicianSubscribe;
import com.ruoyi.other.enums.TechnicianStatus;
import com.ruoyi.other.mapper.TechnicianSubscribeMapper;
import com.ruoyi.other.service.TechnicianSubscribeService;
import com.ruoyi.other.vo.TechnicianSubscribeVO;
import org.springframework.data.redis.connection.RedisZSetCommands;
import org.springframework.data.redis.core.RedisTemplate;
import org.springframework.stereotype.Service;
 
import javax.annotation.Resource;
import java.time.LocalDateTime;
import java.time.ZoneId;
import java.time.ZoneOffset;
import java.util.List;
import java.util.Optional;
import java.util.Set;
 
/**
 * <p>
 * 服务实现类
 * </p>
 *
 * @author luodangjia
 * @since 2024-11-20
 */
@Service
public class TechnicianSubscribeServiceImpl extends ServiceImpl<TechnicianSubscribeMapper, TechnicianSubscribe> implements TechnicianSubscribeService {
    @Resource
    private TechnicianSubscribeMapper technicianSubscribeMapper;
    @Resource
    private RemoteOrderGoodsClient orderGoodsClient;
    @Resource
    private RedisTemplate redisTemplate;
    @Resource
    private AppUserClient appUserClient;
    
    @Resource
    private TokenService tokenService;
    @Resource
    private AppUserShopClient appUserShopClient;
    
    
    
    
 
    @Override
    public PageInfo<TechnicianSubscribeVO> getTechnicianSubscribeByUserAndShop(Long shopId, Integer status, Integer pageCurr, Integer pageSize) {
        PageInfo<TechnicianSubscribeVO> pageInfo = new PageInfo(pageCurr, pageSize);
        Long userid = tokenService.getLoginUserApplet().getUserid();
        List<AppUserShop> data = appUserShopClient.getAppUserShop(userid).getData();
        Optional<AppUserShop> first = data.stream().filter(s -> s.getShopId() == shopId.intValue() && s.getRoleType() == 3).findFirst();
        
        if(first.isPresent()){
        
        }
    
    
        List<TechnicianSubscribeVO> list = technicianSubscribeMapper.getTechnicianSubscribeByUserAndShop(pageInfo, shopId, status);
        for (TechnicianSubscribeVO technicianSubscribeVO : list) {
            String id = technicianSubscribeVO.getId();
            TechnicianSubscribe technicianSubscribe = this.getById(id);
            AppUser appUser = appUserClient.getAppUserById(technicianSubscribe.getAppUserId());
            technicianSubscribeVO.setUserName(appUser.getName());
            technicianSubscribeVO.setPhone(appUser.getPhone());
        }
        return pageInfo.setRecords(list);
    }
    @Override
    public PageInfo<TechnicianSubscribeVO> getTechnicianSubscribeByUserAndShop1(Long shopId, Integer status , String phone,
                                                                                String name,
                                                                                Integer serviceMode, Integer pageCurr, Integer pageSize) {
        PageInfo<TechnicianSubscribeVO> pageInfo = new PageInfo(pageCurr, pageSize);
        List<TechnicianSubscribeVO> technicianSubscribeByUserAndShop1 = technicianSubscribeMapper.getTechnicianSubscribeByUserAndShop1(pageInfo, shopId, status, phone, name, serviceMode);
        for (TechnicianSubscribeVO technicianSubscribeVO : technicianSubscribeByUserAndShop1) {
            AppUser appUser = appUserClient.getAppUserById(technicianSubscribeVO.getAppUserId());
            technicianSubscribeVO.setUserName(appUser.getName());
            technicianSubscribeVO.setPhone(appUser.getPhone());
        }
        return pageInfo.setRecords(technicianSubscribeByUserAndShop1);
    }
    @Override
    public IPage<TechnicianSubscribeVO> getTechnicianSubscribeByUser(Page<TechnicianSubscribe> page, Long userId, Integer status) {
        return technicianSubscribeMapper.getTechnicianSubscribeByUser(page, userId, status);
    }
 
    @Override
    public void subscribe(TechnicianSubscribe subscribe) {
        Long userId = SecurityUtils.getUserId();
        subscribe.setAppUserId(userId);
        subscribe.setStatus(TechnicianStatus.UNSUBSCRIBE.getCode());
        subscribe.setDelFlag(0);
        subscribe.setCreateTime(LocalDateTime.now());
        technicianSubscribeMapper.insert(subscribe);
        if (subscribe.getOrderId() != null){
            orderGoodsClient.subscribe(subscribe.getOrderId(), subscribe.getTechnicianId());
        }
        //添加到redis有序队列中用于定时处理状态
        redisTemplate.opsForZSet().add("technician_subscribe", subscribe.getId().toString(), subscribe.getSubscribeTime().toEpochSecond(ZoneOffset.UTC));
    }
 
 
    @Override
    public void switchingTechnician(TechnicianSubscribe technicianSubscribe) {
        List<TechnicianSubscribe> list = this.list(new LambdaQueryWrapper<TechnicianSubscribe>().eq(TechnicianSubscribe::getOrderId, technicianSubscribe.getOrderId())
                .eq(TechnicianSubscribe::getDelFlag, 0).eq(TechnicianSubscribe::getStatus, 0));
        for (TechnicianSubscribe subscribe : list) {
            if(subscribe.getTechnicianId().equals(technicianSubscribe.getTechnicianId())){
                throw new RuntimeException("不能切换相同的技师");
            }
            subscribe.setTechnicianId(technicianSubscribe.getTechnicianId());
            this.updateById(subscribe);
        }
 
    }
 
    /**
     * 定时修改到期状态
     */
    @Override
    public void taskEditStstus() {
        long second = LocalDateTime.now().toEpochSecond(ZoneOffset.UTC);
        Set<String> technician_subscribe = redisTemplate.opsForZSet().rangeByScore("technician_subscribe", 0, second);
        if(technician_subscribe.size() > 0){
            List<TechnicianSubscribe> list = this.listByIds(technician_subscribe);
            list.forEach(s->s.setStatus(3));
            this.updateBatchById(list);
            redisTemplate.opsForZSet().remove("technician_subscribe", technician_subscribe.toArray());
        }
    }
}