xuhy
7 天以前 89351ad17c81b37495f21d4dfbf28f0d306a155a
虚拟号修改
13个文件已修改
9个文件已添加
387 ■■■■■ 已修改文件
ruoyi-api/ruoyi-api-order/src/main/java/com/ruoyi/order/api/factory/OrderFallbackFactory.java 5 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-api/ruoyi-api-order/src/main/java/com/ruoyi/order/api/feignClient/OrderClient.java 8 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-service/ruoyi-admin/src/main/java/com/ruoyi/admin/controller/OrderController.java 22 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-service/ruoyi-admin/src/main/java/com/ruoyi/admin/controller/PrivateNumberCallBackController.java 37 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-service/ruoyi-admin/src/main/java/com/ruoyi/admin/entity/OrderRecording.java 45 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-service/ruoyi-admin/src/main/java/com/ruoyi/admin/mapper/OrderRecordingMapper.java 17 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-service/ruoyi-admin/src/main/java/com/ruoyi/admin/service/OrderRecordingService.java 18 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-service/ruoyi-admin/src/main/java/com/ruoyi/admin/service/impl/OrderRecordingServiceImpl.java 26 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-service/ruoyi-admin/src/main/java/com/ruoyi/admin/service/impl/OrderServiceImpl.java 9 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-service/ruoyi-admin/src/main/java/com/ruoyi/admin/utils/PrivateNumberUtil.java 16 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-service/ruoyi-admin/src/main/java/com/ruoyi/admin/vo/OrderDetailRecordIngVO.java 18 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-service/ruoyi-admin/src/main/java/com/ruoyi/admin/vo/OrderInfoVO.java 4 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-service/ruoyi-order/src/main/java/com/ruoyi/order/controller/OrderController.java 12 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-service/ruoyi-order/src/main/java/com/ruoyi/order/service/impl/OrderServiceImpl.java 14 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-service/ruoyi-order/src/main/resources/mapper/order/OrderMapper.xml 7 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-service/ruoyi-worker/src/main/java/com/ruoyi/worker/controller/OrderController.java 25 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-service/ruoyi-worker/src/main/java/com/ruoyi/worker/entity/OrderRecording.java 42 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-service/ruoyi-worker/src/main/java/com/ruoyi/worker/mapper/OrderRecordingMapper.java 16 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-service/ruoyi-worker/src/main/java/com/ruoyi/worker/service/OrderRecordingService.java 16 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-service/ruoyi-worker/src/main/java/com/ruoyi/worker/service/impl/MasterWorkerServiceImpl.java 3 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-service/ruoyi-worker/src/main/java/com/ruoyi/worker/service/impl/OrderRecordingServiceImpl.java 20 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-service/ruoyi-worker/src/main/java/com/ruoyi/worker/vo/OrderListVO.java 7 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-api/ruoyi-api-order/src/main/java/com/ruoyi/order/api/factory/OrderFallbackFactory.java
@@ -283,6 +283,11 @@
            }
            @Override
            public R<Order> detailBySubscriptionId(String subscriptionId) {
                return R.fail(cause.getMessage());
            }
            @Override
            public R<Boolean> changeOrderState(String orderId, Integer state) {
                return R.fail(cause.getMessage());
            }
ruoyi-api/ruoyi-api-order/src/main/java/com/ruoyi/order/api/feignClient/OrderClient.java
@@ -479,4 +479,12 @@
    R<String> updatePhoneRecording(@RequestParam("orderId")String orderId,
                              @RequestParam("audioUrl")String audioUrl);
    /**
     * 通过subscriptionId查询订单详情
     * @param subscriptionId 绑定id
     * @return
     */
    @GetMapping(value = "/order/detailBySubscriptionId")
    R<Order> detailBySubscriptionId(@RequestParam("subscriptionId")String subscriptionId);
}
ruoyi-service/ruoyi-admin/src/main/java/com/ruoyi/admin/controller/OrderController.java
@@ -15,10 +15,7 @@
import com.ruoyi.admin.utils.DescribeInstances;
import com.ruoyi.admin.utils.HttpUtil;
import com.ruoyi.admin.utils.PrivateNumberUtil;
import com.ruoyi.admin.vo.OrderByServeRecordVO;
import com.ruoyi.admin.vo.OrderDetailVO;
import com.ruoyi.admin.vo.OrderReasinDto;
import com.ruoyi.admin.vo.ReassinDto;
import com.ruoyi.admin.vo.*;
import com.ruoyi.admin.voice.util.AXBUtil;
import com.ruoyi.common.core.constant.Constants;
import com.ruoyi.common.core.domain.BaseEntity;
@@ -113,6 +110,8 @@
    private PrivateNumberUtil privateNumberUtil;
    @Autowired
    private IamConfigService iamConfigService;
    @Autowired
    private OrderRecordingService orderRecordingService;
    /**
     * 雪花算法类
     */
@@ -385,7 +384,7 @@
            IamConfig iamConfig = iamConfigService.getById(1);
            if(Objects.nonNull(order.getIsOpenVirtualNumber()) && order.getIsOpenVirtualNumber() == 1){
                // 虚拟号码绑定
                String result = AXBUtil.axbBindNumber(iamConfig.getAppKey(), iamConfig.getAppSecret(), order.getOrderNumber(), order.getReservationPhone(), masterWorker.getPhone());
                String result = AXBUtil.axbBindNumber(iamConfig.getAppKey(), iamConfig.getAppSecret(), iamConfig.getVirtualNumber(), order.getReservationPhone(), masterWorker.getPhone());
                // 存储绑定后的唯一标识
                JSONObject jsonObject = JSONObject.parseObject(result);
                String subscriptionId = jsonObject.getString("subscriptionId");
@@ -430,7 +429,7 @@
            IamConfig iamConfig = iamConfigService.getById(1);
            if(Objects.nonNull(order.getIsOpenVirtualNumber()) && order.getIsOpenVirtualNumber() == 1){
                // 虚拟号码绑定
                String result = AXBUtil.axbBindNumber(iamConfig.getAppKey(), iamConfig.getAppSecret(), order.getOrderNumber(), order.getReservationPhone(), masterWorker.getPhone());
                String result = AXBUtil.axbBindNumber(iamConfig.getAppKey(), iamConfig.getAppSecret(), iamConfig.getVirtualNumber(), order.getReservationPhone(), masterWorker.getPhone());
                // 存储绑定后的唯一标识
                JSONObject jsonObject = JSONObject.parseObject(result);
                String subscriptionId = jsonObject.getString("subscriptionId");
@@ -478,15 +477,18 @@
            MasterWorker masterWorker = masterWorkerService.lambdaQuery()
                    .eq(MasterWorker::getId, orderReasinDto.getWorkerId())
                    .eq(MasterWorker::getIsDelete, 0).one();
            Order order = orderClient.exchangeOrder(orderId.getType(), orderId.getOrderId(), orderReasinDto.getWorkerId(),
                    masterWorker.getRealName(), masterWorker.getPhone()).getData();
            try{
                // 虚拟号码  师傅号码备案
                String fileName = privateNumberUtil.uploadNumberFile(masterWorker.getProfilePicture()).getData();
                R r = privateNumberUtil.addANumber(masterWorker.getPhone(), masterWorker.getRealName(), masterWorker.getIdNumber(), fileName);
                if(r.getCode() == 500){
                    throw new GlobalException(r.getMsg());
                }
            }catch (Exception e){
                throw new GlobalException("虚拟号码绑定异常!");
            }
            Order order = orderClient.exchangeOrder(orderId.getType(), orderId.getOrderId(), orderReasinDto.getWorkerId(),
                    masterWorker.getRealName(), masterWorker.getPhone()).getData();
            // 虚拟号码配置
            IamConfig iamConfig = iamConfigService.getById(1);
            // 订单派单
@@ -510,7 +512,7 @@
                        AXBUtil.axbModifyNumber(iamConfig.getAppKey(),iamConfig.getAppSecret(),order.getSubscriptionId(), order.getReservationPhone(), masterWorker.getPhone());
                    }else {
                        // 虚拟号码绑定
                        String result = AXBUtil.axbBindNumber(iamConfig.getAppKey(), iamConfig.getAppSecret(), order.getOrderNumber(), order.getReservationPhone(), masterWorker.getPhone());
                        String result = AXBUtil.axbBindNumber(iamConfig.getAppKey(), iamConfig.getAppSecret(), iamConfig.getVirtualNumber(), order.getReservationPhone(), masterWorker.getPhone());
                        // 存储绑定后的唯一标识
                        JSONObject jsonObject = JSONObject.parseObject(result);
                        String subscriptionId = jsonObject.getString("subscriptionId");
@@ -524,7 +526,7 @@
                orderClient.updateState(order.getId(), 7);
                if(Objects.nonNull(order.getIsOpenVirtualNumber()) && order.getIsOpenVirtualNumber() == 1){
                    // 虚拟号码绑定
                    String result = AXBUtil.axbBindNumber(iamConfig.getAppKey(), iamConfig.getAppSecret(), order.getOrderNumber(), order.getReservationPhone(), masterWorker.getPhone());
                    String result = AXBUtil.axbBindNumber(iamConfig.getAppKey(), iamConfig.getAppSecret(), iamConfig.getVirtualNumber(), order.getReservationPhone(), masterWorker.getPhone());
                    // 存储绑定后的唯一标识
                    JSONObject jsonObject = JSONObject.parseObject(result);
                    String subscriptionId = jsonObject.getString("subscriptionId");
ruoyi-service/ruoyi-admin/src/main/java/com/ruoyi/admin/controller/PrivateNumberCallBackController.java
@@ -4,9 +4,15 @@
import com.alibaba.fastjson.JSONArray;
import com.alibaba.fastjson.JSONObject;
import com.baomidou.mybatisplus.core.toolkit.Wrappers;
import com.ruoyi.admin.entity.Order;
import com.ruoyi.admin.entity.IamConfig;
import com.ruoyi.admin.entity.OrderRecording;
import com.ruoyi.admin.service.IamConfigService;
import com.ruoyi.admin.service.OrderRecordingService;
import com.ruoyi.admin.service.OrderService;
import com.ruoyi.admin.voice.util.AXBUtil;
import com.ruoyi.common.core.domain.R;
import com.ruoyi.order.api.entity.Order;
import com.ruoyi.order.api.feignClient.OrderClient;
import lombok.extern.slf4j.Slf4j;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestBody;
@@ -29,9 +35,12 @@
@RequestMapping("/privateNumber")
public class PrivateNumberCallBackController {
    @Resource
    private OrderService orderService;
    private OrderClient orderClient;
    @Resource
    private OrderRecordingService orderRecordingService;
    @Resource
    private IamConfigService iamConfigService;
    /**
     * 隐私号码回调
@@ -46,16 +55,22 @@
            String recordObjectName = feeLstJson.getString("recordObjectName");
            String recordBucketName = feeLstJson.getString("recordBucketName");
            log.info("隐私号码回调:{},录音文件名:{},录音服务器名:{}", subscriptionId, recordObjectName, recordDomain);
            Order order = orderService.getOne(Wrappers.lambdaQuery(Order.class)
                    .eq(Order::getSubscriptionId, subscriptionId)
                    .last("LIMIT 1"));
            if(Objects.nonNull(order)){
                order.setRecordDomain(recordDomain);
                order.setRecordObjectName(recordObjectName);
                orderService.updateById(order);
            Order order = orderClient.detailBySubscriptionId(subscriptionId).getData();
            long count = orderRecordingService.count(Wrappers.<OrderRecording>lambdaQuery()
                    .eq(OrderRecording::getRecordObjectName, recordObjectName)
                    .eq(OrderRecording::getRecordDomain, recordDomain));
            if (Objects.nonNull(order) && count == 0) {
                IamConfig iamConfig = iamConfigService.getById(1);
                OrderRecording orderRecording = new OrderRecording();
                orderRecording.setOrderId(order.getId());
                orderRecording.setRecordDomain(recordDomain);
                orderRecording.setRecordObjectName(recordObjectName);
                String recordingUrl = AXBUtil.axbGetRecordDownloadLink(iamConfig.getAppKey(), iamConfig.getAppSecret(), recordDomain, recordObjectName);
                orderRecording.setPhoneRecording(recordingUrl);
                orderRecordingService.save(orderRecording);
            }
        }
        return R.ok("OK");
        return R.ok();
    }
}
ruoyi-service/ruoyi-admin/src/main/java/com/ruoyi/admin/entity/OrderRecording.java
New file
@@ -0,0 +1,45 @@
package com.ruoyi.admin.entity;
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 com.ruoyi.common.core.domain.BaseEntity;
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import lombok.Getter;
import lombok.Setter;
import javax.validation.constraints.NotBlank;
import java.io.Serializable;
/**
 * <p>
 * 通话录音
 * </p>
 *
 * @author hjl
 * @since 2024-05-29
 */
@Getter
@Setter
@TableName("t_order_recording")
@ApiModel(value = "OrderRecording对象", description = "通话录音")
public class OrderRecording implements Serializable {
    @TableId(value = "id",type = IdType.AUTO)
    private Integer id;
    @ApiModelProperty("订单id")
    @TableField("order_id")
    private String orderId;
    @ApiModelProperty("录音文件存储的服务器域名")
    @TableField("record_domain")
    private String recordDomain;
    @ApiModelProperty("录音文件名")
    @TableField("record_object_name")
    private String recordObjectName;
    @ApiModelProperty("录音内容")
    @TableField("phone_recording")
    private String phoneRecording;
}
ruoyi-service/ruoyi-admin/src/main/java/com/ruoyi/admin/mapper/OrderRecordingMapper.java
New file
@@ -0,0 +1,17 @@
package com.ruoyi.admin.mapper;
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import com.ruoyi.admin.entity.Agreement;
import com.ruoyi.admin.entity.OrderRecording;
/**
 * <p>
 * 通话录音 Mapper 接口
 * </p>
 *
 * @author hjl
 * @since 2024-05-29
 */
public interface OrderRecordingMapper extends BaseMapper<OrderRecording> {
}
ruoyi-service/ruoyi-admin/src/main/java/com/ruoyi/admin/service/OrderRecordingService.java
New file
@@ -0,0 +1,18 @@
package com.ruoyi.admin.service;
import com.baomidou.mybatisplus.extension.service.IService;
import com.ruoyi.admin.entity.Agreement;
import com.ruoyi.admin.entity.OrderRecording;
import com.ruoyi.common.core.domain.R;
/**
 * <p>
 * 通话录音 服务类
 * </p>
 *
 * @author hjl
 * @since 2024-05-29
 */
public interface OrderRecordingService extends IService<OrderRecording> {
}
ruoyi-service/ruoyi-admin/src/main/java/com/ruoyi/admin/service/impl/OrderRecordingServiceImpl.java
New file
@@ -0,0 +1,26 @@
package com.ruoyi.admin.service.impl;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import com.ruoyi.admin.entity.Agreement;
import com.ruoyi.admin.entity.OrderRecording;
import com.ruoyi.admin.mapper.AgreementMapper;
import com.ruoyi.admin.mapper.OrderRecordingMapper;
import com.ruoyi.admin.service.AgreementService;
import com.ruoyi.admin.service.OrderRecordingService;
import com.ruoyi.common.core.constant.Constants;
import com.ruoyi.common.core.domain.R;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
/**
 * <p>
 * 通话录音 服务实现类
 * </p>
 *
 * @author hjl
 * @since 2024-05-29
 */
@Service
public class OrderRecordingServiceImpl extends ServiceImpl<OrderRecordingMapper, OrderRecording> implements OrderRecordingService {
}
ruoyi-service/ruoyi-admin/src/main/java/com/ruoyi/admin/service/impl/OrderServiceImpl.java
@@ -5,10 +5,12 @@
import com.alibaba.excel.write.builder.ExcelWriterBuilder;
import com.alibaba.excel.write.metadata.WriteSheet;
import com.alibaba.fastjson2.JSONObject;
import com.baomidou.mybatisplus.core.toolkit.Wrappers;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import com.ruoyi.admin.entity.*;
import com.ruoyi.admin.mapper.OrderMapper;
import com.ruoyi.admin.mapper.OrderRecordingMapper;
import com.ruoyi.admin.mapper.UserMapper;
import com.ruoyi.admin.service.MasterWorkerService;
import com.ruoyi.admin.service.OrderService;
@@ -66,6 +68,8 @@
    private EvaluateClient evaluateClient;
    @Resource
    private ServeRecordClient serveRecordClient;
    @Resource
    private OrderRecordingMapper orderRecordingMapper;
    /**
     * linux服务器保存订单轨迹文件夹
@@ -220,7 +224,10 @@
            orderInfo.setRemark(order.getRemark());
            orderInfo.setCompleteTime(order.getCompleteTime());
            orderInfo.setReservationRemark(order.getReservationRemark());
            orderInfo.setPhoneRecording(order.getPhoneRecording());
            // 查询通话录音
            List<OrderRecording> orderRecordingList = orderRecordingMapper.selectList(Wrappers.lambdaQuery(OrderRecording.class)
                    .eq(OrderRecording::getOrderId, order.getId()));
            orderInfo.setOrderRecordingList(orderRecordingList);
        }
        result.setOrderInfo(orderInfo);
    }
ruoyi-service/ruoyi-admin/src/main/java/com/ruoyi/admin/utils/PrivateNumberUtil.java
@@ -15,6 +15,9 @@
import org.springframework.web.multipart.MultipartFile;
import java.io.IOException;
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.time.Instant;
import java.util.Date;
import java.util.concurrent.TimeUnit;
@@ -68,8 +71,15 @@
                    log.info("获取token:{}",string);
                    JSONObject jsonObject = JSONObject.parseObject(string);
                    JSONObject tokenJson = jsonObject.getJSONObject("token");
                    Date expiresAt = tokenJson.getDate("expires_at");
                    redisService.setCacheObject("PRIVATE_NUMBER:",token,expiresAt.getTime()-System.currentTimeMillis(), TimeUnit.MILLISECONDS);
                    // 2025-10-23T07:27:59.224000Z
                    String expiresAt = tokenJson.getString("expires_at");
                    // 将字符串解析为Instant
                    Instant instant = Instant.parse(expiresAt);
                    // 转换为Date
                    Date date = Date.from(instant);
//                    String replace = expiresAt.substring(0, expiresAt.lastIndexOf(".")).replace("T", " ");
//                    Date date = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").parse(replace);
                    redisService.setCacheObject("PRIVATE_NUMBER:",token,date.getTime()-System.currentTimeMillis(), TimeUnit.MILLISECONDS);
                } catch (IOException e) {
                    throw new ServiceException(e.getMessage());
                }
@@ -132,6 +142,7 @@
                            multipartFile.getBytes()
                    );
                    builder.addFormDataPart("files", multipartFile.getOriginalFilename(), fileBody);
                    System.err.println("文件名称+"+multipartFile.getOriginalFilename());
                }
            }
        } catch (IOException e) {
@@ -156,6 +167,7 @@
                    JSONObject jsonObject = JSONObject.parseObject(string);
                    String result = jsonObject.getString("result");
                    if("Upload Successful.".equals(result)){
                        System.err.println("返回的文件名称+"+file.getOriginalFilename());
                        return R.ok(file.getOriginalFilename(),"");
                    }else {
                        String failReason = jsonObject.getString("failReason");
ruoyi-service/ruoyi-admin/src/main/java/com/ruoyi/admin/vo/OrderDetailRecordIngVO.java
New file
@@ -0,0 +1,18 @@
package com.ruoyi.admin.vo;
import com.ruoyi.admin.entity.OrderRecording;
import com.ruoyi.order.api.entity.Order;
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
import java.util.List;
@Data
@ApiModel(value = "订单详情返回OrderDetailRecordIngVO-含通话录音列表")
public class OrderDetailRecordIngVO extends Order {
    @ApiModelProperty(value = "通话录音列表")
    private List<OrderRecording> orderRecordingList;
}
ruoyi-service/ruoyi-admin/src/main/java/com/ruoyi/admin/vo/OrderInfoVO.java
@@ -2,11 +2,13 @@
import com.baomidou.mybatisplus.annotation.TableField;
import com.fasterxml.jackson.annotation.JsonFormat;
import com.ruoyi.admin.entity.OrderRecording;
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
import java.util.Date;
import java.util.List;
/**
 * @author HJL
@@ -33,5 +35,5 @@
    @ApiModelProperty("备注")
    private String remark;
    @ApiModelProperty("电话录音")
    private String phoneRecording;
    private List<OrderRecording> orderRecordingList;
}
ruoyi-service/ruoyi-order/src/main/java/com/ruoyi/order/controller/OrderController.java
@@ -161,6 +161,18 @@
        return R.ok();
    }
    /**
     * 通过subscriptionId查询订单详情
     */
    @ApiOperation(value = "订单列表-通过subscriptionId查询订单详情", tags = {"后台-订单管理"})
    @GetMapping(value = "/detailBySubscriptionId")
    public R<Order> detailBySubscriptionId(@RequestParam("subscriptionId")String subscriptionId) {
        // 通过subscriptionId查询订单详情
        Order order = orderService.getOne(Wrappers.lambdaQuery(Order.class)
                    .eq(Order::getSubscriptionId, subscriptionId)
                    .last("LIMIT 1"));
        return R.ok(order);
    }
    @ApiOperation(value = "订单列表-增加打印次数", tags = {"后台-订单管理"})
    @PostMapping(value = "/count")
ruoyi-service/ruoyi-order/src/main/java/com/ruoyi/order/service/impl/OrderServiceImpl.java
@@ -38,6 +38,7 @@
import javax.annotation.Resource;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
import org.springframework.util.CollectionUtils;
/**
 * <p>
@@ -142,10 +143,19 @@
    public Page<Order> queryPage(OrderQueryRequest orderQueryRequest) {
        Page<Order> page = Page.of(orderQueryRequest.getPageNum(), orderQueryRequest.getPageSize());
        // 基础查询
        Page<Order> pageList = baseMapper.queryPage(orderQueryRequest, page);
        List<Order> records = pageList.getRecords();
        if(CollectionUtils.isEmpty(records)){
            return pageList;
        }
        List<String> orderIds = records.stream().map(Order::getId).collect(Collectors.toList());
        List<ChangeDispatch> list = changeDispatchService.lambdaQuery()
                .eq(ChangeDispatch::getIsDelete, 0)
                .orderByDesc(ChangeDispatch::getCreateTime).list();
                .orderByDesc(ChangeDispatch::getCreateTime)
                .in(ChangeDispatch::getOrderId, orderIds).list();
        for (Order order : pageList.getRecords()) {
            ChangeDispatch changeDispatch = list.stream().filter(e -> e.getOrderId().equals(order.getId()))
                    .findFirst().orElse(null);
@@ -223,7 +233,7 @@
    @Override
    public Page<Order> orderListWorker(Integer userId, Integer state,String searchValues, Integer pageNum, Integer pageSize) {
        Page<Order> orderPage = baseMapper.orderListWorker(userId, state, searchValues, Page.of(pageNum, pageSize));
        return baseMapper.orderListWorker(userId, state,searchValues, Page.of(pageNum, pageSize));
        return orderPage;
    }
    @Override
ruoyi-service/ruoyi-order/src/main/resources/mapper/order/OrderMapper.xml
@@ -31,6 +31,9 @@
        <result column="is_delete" property="isDelete"/>
        <result column="fake" property="fake"/>
        <result column="apply_reason" property="applyReason"/>
        <result column="virtual_number" property="virtualNumber"/>
        <result column="is_open_virtual_number" property="isOpenVirtualNumber"/>
        <result column="phone_recording" property="phoneRecording"/>
    </resultMap>
@@ -835,7 +838,6 @@
        o.address,
        o.top_sort,
        o.cancel_reason,
        o.remark,
        o.package_info,
        o.msg_count,
@@ -846,6 +848,9 @@
        o.fake,
        o.city_code,
        o.is_reinvest,
        o.virtual_number,
        o.is_open_virtual_number,
        o.phone_recording,
        o.is_evaluate
        from t_order o
        <where>
ruoyi-service/ruoyi-worker/src/main/java/com/ruoyi/worker/controller/OrderController.java
@@ -3,6 +3,7 @@
import cn.afterturn.easypoi.cache.manager.IFileLoader;
import com.alibaba.fastjson2.JSONObject;
import com.baomidou.mybatisplus.core.toolkit.Wrappers;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.ruoyi.admin.api.feignClient.AdminClient;
import com.ruoyi.common.core.constant.Constants;
@@ -22,9 +23,11 @@
import com.ruoyi.system.api.model.LoginUserInfo;
import com.ruoyi.worker.entity.IamConfig;
import com.ruoyi.worker.entity.MasterWorker;
import com.ruoyi.worker.entity.OrderRecording;
import com.ruoyi.worker.entity.RecoveryServe;
import com.ruoyi.worker.service.IamConfigService;
import com.ruoyi.worker.service.MasterWorkerService;
import com.ruoyi.worker.service.OrderRecordingService;
import com.ruoyi.worker.service.RecoveryServeService;
import com.ruoyi.worker.vo.ServeCoordinate;
import com.ruoyi.worker.voice.util.AXBUtil;
@@ -47,6 +50,7 @@
import lombok.Synchronized;
import org.springframework.transaction.annotation.Transactional;
import org.springframework.util.CollectionUtils;
import org.springframework.util.StringUtils;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PostMapping;
@@ -83,6 +87,8 @@
    private RedisService redisService;
    @Resource
    private IamConfigService iamConfigService;
    @Resource
    private OrderRecordingService orderRecordingService;
    /**
     * linux服务器保存订单轨迹文件夹
@@ -300,12 +306,19 @@
            if(Objects.nonNull(data)){
                Order orderInfo = data.getOrderInfo();
                if (Objects.nonNull(orderInfo) && Objects.nonNull(orderInfo.getIsOpenVirtualNumber()) && orderInfo.getIsOpenVirtualNumber() == 1){
                    String recordDomain = orderInfo.getRecordDomain();
                    String recordObjectName = orderInfo.getRecordObjectName();
                    String audioUrl = AXBUtil.axbGetRecordDownloadLink(iamConfig.getAppKey(), iamConfig.getAppSecret(),recordDomain, recordObjectName);
                    orderInfo.setPhoneRecording(audioUrl);
                    // 设置音频
                    orderClient.updatePhoneRecording(orderInfo.getId(), audioUrl);
//                    List<OrderRecording> orderRecordingList = orderRecordingService.list(Wrappers.lambdaQuery(OrderRecording.class)
//                            .eq(OrderRecording::getOrderId, orderInfo.getId()));
//                    if(!CollectionUtils.isEmpty(orderRecordingList)){
//                        for (OrderRecording orderRecording : orderRecordingList) {
//                            String recordDomain = orderRecording.getRecordDomain();
//                            String recordObjectName = orderRecording.getRecordObjectName();
//                            String audioUrl = AXBUtil.axbGetRecordDownloadLink(iamConfig.getAppKey(), iamConfig.getAppSecret(),recordDomain, recordObjectName);
//                            orderRecording.setPhoneRecording(audioUrl);
////                            // 设置音频
////                            orderClient.updatePhoneRecording(orderInfo.getId(), audioUrl);
//                        }
//                        orderRecordingService.updateBatchById(orderRecordingList);
//                    }
                    // 虚拟号码解绑
                    AXBUtil.axbUnbindNumber(iamConfig.getAppKey(), iamConfig.getAppSecret(),subscriptionId, iamConfig.getVirtualNumber());
                }
ruoyi-service/ruoyi-worker/src/main/java/com/ruoyi/worker/entity/OrderRecording.java
New file
@@ -0,0 +1,42 @@
package com.ruoyi.worker.entity;
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 com.ruoyi.common.core.domain.BaseEntity;
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import lombok.Getter;
import lombok.Setter;
/**
 * <p>
 * 通话录音
 * </p>
 *
 * @author hjl
 * @since 2024-05-29
 */
@Getter
@Setter
@TableName("t_order_recording")
@ApiModel(value = "OrderRecording对象", description = "通话录音")
public class OrderRecording extends BaseEntity {
    @TableId(value = "id",type = IdType.AUTO)
    private Integer id;
    @ApiModelProperty("订单id")
    @TableField("order_id")
    private String orderId;
    @ApiModelProperty("录音文件存储的服务器域名")
    @TableField("record_domain")
    private String recordDomain;
    @ApiModelProperty("录音文件名")
    @TableField("record_object_name")
    private String recordObjectName;
    @ApiModelProperty("录音内容")
    @TableField("phone_recording")
    private String phoneRecording;
}
ruoyi-service/ruoyi-worker/src/main/java/com/ruoyi/worker/mapper/OrderRecordingMapper.java
New file
@@ -0,0 +1,16 @@
package com.ruoyi.worker.mapper;
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import com.ruoyi.worker.entity.OrderRecording;
/**
 * <p>
 * 通话录音 Mapper 接口
 * </p>
 *
 * @author hjl
 * @since 2024-05-29
 */
public interface OrderRecordingMapper extends BaseMapper<OrderRecording> {
}
ruoyi-service/ruoyi-worker/src/main/java/com/ruoyi/worker/service/OrderRecordingService.java
New file
@@ -0,0 +1,16 @@
package com.ruoyi.worker.service;
import com.baomidou.mybatisplus.extension.service.IService;
import com.ruoyi.worker.entity.OrderRecording;
/**
 * <p>
 * 通话录音 服务类
 * </p>
 *
 * @author hjl
 * @since 2024-05-29
 */
public interface OrderRecordingService extends IService<OrderRecording> {
}
ruoyi-service/ruoyi-worker/src/main/java/com/ruoyi/worker/service/impl/MasterWorkerServiceImpl.java
@@ -95,6 +95,9 @@
            orderListVO.setLatitude(order.getLatitude());
            orderListVO.setTopSort(topSort);
            orderListVO.setFake(order.getFake()==null?0:order.getFake());
            orderListVO.setVirtualNumber(order.getVirtualNumber());
            orderListVO.setIsOpenVirtualNumber(order.getIsOpenVirtualNumber());
            orderListVO.setPhoneRecording(order.getPhoneRecording());
            OrderNotHandleVO vo = new OrderNotHandleVO(distance, orderListVO);
            list.add(vo);
        }
ruoyi-service/ruoyi-worker/src/main/java/com/ruoyi/worker/service/impl/OrderRecordingServiceImpl.java
New file
@@ -0,0 +1,20 @@
package com.ruoyi.worker.service.impl;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import com.ruoyi.worker.entity.OrderRecording;
import com.ruoyi.worker.mapper.OrderRecordingMapper;
import com.ruoyi.worker.service.OrderRecordingService;
import org.springframework.stereotype.Service;
/**
 * <p>
 * 通话录音 服务实现类
 * </p>
 *
 * @author hjl
 * @since 2024-05-29
 */
@Service
public class OrderRecordingServiceImpl extends ServiceImpl<OrderRecordingMapper, OrderRecording> implements OrderRecordingService {
}
ruoyi-service/ruoyi-worker/src/main/java/com/ruoyi/worker/vo/OrderListVO.java
@@ -100,6 +100,13 @@
    @TableField("top_sort")
    private Integer topSort;
    @ApiModelProperty("虚拟号码")
    private String virtualNumber;
    @ApiModelProperty("电话录音")
    private String phoneRecording;
    @ApiModelProperty("是否启用虚拟号 1=是 0=否")
    private Integer isOpenVirtualNumber;
    public String getOrderIdStr() {
        return String.valueOf(getOrderId());
    }