xuhy
1 天以前 73195f372cdb8d59b74ee86b76fbf4c9595caea1
ruoyi-service/ruoyi-admin/src/main/java/com/ruoyi/admin/controller/OrderController.java
@@ -14,13 +14,13 @@
import com.ruoyi.admin.service.*;
import com.ruoyi.admin.utils.DescribeInstances;
import com.ruoyi.admin.utils.HttpUtil;
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.utils.PrivateNumberUtil;
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;
import com.ruoyi.common.core.domain.R;
import com.ruoyi.common.core.exception.GlobalException;
import com.ruoyi.common.core.exception.ServiceException;
import com.ruoyi.common.core.utils.DateUtils;
import com.ruoyi.common.core.utils.GaoDeMapUtil;
@@ -61,7 +61,9 @@
import javax.servlet.http.HttpServletResponse;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
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;
@@ -99,7 +101,17 @@
    private ExchangeDispatchClient dispatchClient;
    @Resource
    private TokenService tokenService;
    @Resource
    private RecoveryClassifyService recoveryClassifyService;
    @Resource
    private FranchiseeService franchiseeService;
    @Resource
    private PrivateNumberUtil privateNumberUtil;
    @Autowired
    private IamConfigService iamConfigService;
    @Autowired
    private OrderRecordingService orderRecordingService;
    /**
     * 雪花算法类
     */
@@ -143,11 +155,6 @@
        }
        return R.ok(orderDetailVO);
    }
    @Resource
    private RecoveryClassifyService recoveryClassifyService;
    @Resource
    private FranchiseeService franchiseeService;
    /**
     * 订单列表
     *
@@ -326,8 +333,8 @@
            order.setServerName(masterWorker.getRealName());
            order.setServerPhone(masterWorker.getPhone());
            order.setAcceptTime(new Date());
            // 待上门
            order.setState(Constants.ONE);
            // 待上门    2.0 改为待预约
            order.setState(7);
        } else {
            // 待派单状态
            order.setState(Constants.ZERO);
@@ -349,9 +356,10 @@
        }else {
            order.setOrderMoney(one.getRecoveryPrice());
        }
        Boolean data = orderClient.save(order).getData();
        if (null == data) {
            return R.fail(orderClient.save(order).getMsg());
        R<String> saveResult = orderClient.save(order);
        String orderId = saveResult.getData();
        if (!StringUtils.hasLength(orderId)) {
            return R.fail(saveResult.getMsg());
        }
        System.out.println("服务人员id:" + order.getServerId());
        ChannelHandlerContext context = NettyChannelMap.getData(String.valueOf(order.getServerId()));
@@ -360,7 +368,31 @@
            System.out.println("服务端发送消息到: " + order.getServerId());
            NettyWebSocketController.sendMsgToClient(context, "您有一条新的订单,请注意查收!");
        }
        return data ? R.ok() : R.fail();
        if (null != order.getServerId()) {
            MasterWorker masterWorker = masterWorkerService.lambdaQuery()
                    .eq(MasterWorker::getId, order.getServerId())
                    .eq(MasterWorker::getIsDelete, 0).one();
            // 虚拟号码配置
            IamConfig iamConfig = iamConfigService.getById(1);
            if(Objects.nonNull(order.getIsOpenVirtualNumber()) && order.getIsOpenVirtualNumber() == 1){
                try{
                    // 虚拟号码  师傅号码备案
                    String fileName = privateNumberUtil.uploadNumberFile(masterWorker.getProfilePicture()).getData();
                    R r = privateNumberUtil.addANumber(masterWorker.getPhone(), masterWorker.getRealName(), masterWorker.getIdNumber(), fileName);
                }catch (Exception e){
                    throw new GlobalException("虚拟号码绑定异常!");
                }
                // 虚拟号码绑定
                String result = AXBUtil.axbBindNumber(iamConfig.getAppKey(), iamConfig.getAppSecret(), iamConfig.getVirtualNumber(), order.getReservationPhone(), masterWorker.getPhone());
                // 存储绑定后的唯一标识
                JSONObject jsonObject = JSONObject.parseObject(result);
                String subscriptionId = jsonObject.getString("subscriptionId");
                orderClient.updateSubscriptionId(orderId, subscriptionId,iamConfig.getVirtualNumber());
            }
        }
        return StringUtils.hasLength(orderId) ? R.ok() : R.fail();
    }
@@ -379,6 +411,13 @@
            order.setSiteName(site.getSiteName());
        }
        Order orderData = orderClient.detail(order.getOrderId()).getData();
        if(order.getTime()!=null&& order.getServerId()!=null&&(!order.getTime().equals(orderData.getTime()) || !order.getServerId().equals(orderData.getServerId()))){
            // 修改sys_change_dispatch 为已改派
            dispatchClient.changeReason(order.getOrderId(),"");
        }
        // 师傅信息
        if (null != order.getServerId()) {
            MasterWorker masterWorker = masterWorkerService.lambdaQuery()
@@ -386,6 +425,17 @@
                    .eq(MasterWorker::getIsDelete, 0).one();
            order.setServerName(masterWorker.getRealName());
            order.setServerPhone(masterWorker.getPhone());
            IamConfig iamConfig = iamConfigService.getById(1);
            if(Objects.nonNull(order.getIsOpenVirtualNumber()) && order.getIsOpenVirtualNumber() == 1){
                // 虚拟号码绑定
                String result = AXBUtil.axbBindNumber(iamConfig.getAppKey(), iamConfig.getAppSecret(), iamConfig.getVirtualNumber(), order.getReservationPhone(), masterWorker.getPhone());
                // 存储绑定后的唯一标识
                JSONObject jsonObject = JSONObject.parseObject(result);
                String subscriptionId = jsonObject.getString("subscriptionId");
                orderClient.updateSubscriptionId(orderData.getId(), subscriptionId,iamConfig.getVirtualNumber());
            }
        } else {
            // 待派单状态
            order.setState(Constants.ZERO);
@@ -421,70 +471,76 @@
    @RequiresPermissions("order_reassignment")
    @ApiOperation(value = "订单列表-订单派单/改派", tags = {"后台-订单管理"})
    @PostMapping(value = "/reassignment")
    @Transactional(rollbackFor = Exception.class)
    public R<String> reassignment(@RequestBody OrderReasinDto orderReasinDto) {
//        String[] split = orderIds.split(",");
        for (ReassinDto orderId : orderReasinDto.getReassinDtos()) {
        MasterWorker masterWorker = masterWorkerService.lambdaQuery()
                .eq(MasterWorker::getId, orderReasinDto.getWorkerId())
                .eq(MasterWorker::getIsDelete, 0).one();
        Order item = orderClient.detail(orderId.getOrderId()).getData();
        Order order = orderClient.exchangeOrder(orderId.getType(), orderId.getOrderId(), orderReasinDto.getWorkerId(),
                masterWorker.getRealName(), masterWorker.getPhone()).getData();
        // 订单派单
        boolean result = true;
        if (Constants.TWO.equals(orderId.getType())) {
            orderClient.updateArrivalTime(order.getId(),orderReasinDto.getArriveTime());
            if (order.getState().equals(Constants.SIX) || order.getState().equals(Constants.THREE)) {
                orderClient.updateState(order.getId(), Constants.ONE);
                //如果是待改派,将上门时间设置为最新的,并且更新再投原因
                if (order.getState().equals(Constants.SIX)){
                    dispatchClient.changeReason(order.getId(), "");
            MasterWorker masterWorker = masterWorkerService.lambdaQuery()
                    .eq(MasterWorker::getId, orderReasinDto.getWorkerId())
                    .eq(MasterWorker::getIsDelete, 0).one();
            Order order1 = orderClient.detail(orderId.getOrderId()).getData();
            if(Objects.nonNull(order1.getIsOpenVirtualNumber()) && order1.getIsOpenVirtualNumber() == 1){
                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);
            // 订单派单
            if (Constants.TWO.equals(orderId.getType())) {
                orderClient.updateArrivalTime(order.getId(),orderReasinDto.getArriveTime());
                if (order.getState().equals(Constants.SIX) || order.getState().equals(Constants.THREE)) {
                    orderClient.updateState(order.getId(), 7);
                    //如果是待改派,将上门时间设置为最新的,并且更新再投原因
                    if (order.getState().equals(Constants.SIX)){
                        dispatchClient.changeReason(order.getId(), "");
                    }
                }
                // 订单状态为 待完工时,需要更改状态 待上门且清空师傅到达预约点时间
                if (order.getState().equals(Constants.TWO)) {
                    orderClient.updateStateAndArrivalTime(orderId.getOrderId(), Constants.ONE);
                }
                if(Objects.nonNull(order.getIsOpenVirtualNumber()) && order.getIsOpenVirtualNumber() == 1){
                    if(StringUtils.hasLength(order.getSubscriptionId())){
                        // 虚拟号码更换
                        AXBUtil.axbModifyNumber(iamConfig.getAppKey(),iamConfig.getAppSecret(),order.getSubscriptionId(), order.getReservationPhone(), masterWorker.getPhone());
                    }else {
                        // 虚拟号码绑定
                        String result = AXBUtil.axbBindNumber(iamConfig.getAppKey(), iamConfig.getAppSecret(), iamConfig.getVirtualNumber(), order.getReservationPhone(), masterWorker.getPhone());
                        // 存储绑定后的唯一标识
                        JSONObject jsonObject = JSONObject.parseObject(result);
                        String subscriptionId = jsonObject.getString("subscriptionId");
                        orderClient.updateSubscriptionId(order.getId(), subscriptionId,iamConfig.getVirtualNumber());
                    }
                }
            }else {
                orderClient.updateArrivalTime(order.getId(),orderReasinDto.getArriveTime());
                orderClient.updateState(order.getId(), 7);
                if(Objects.nonNull(order.getIsOpenVirtualNumber()) && order.getIsOpenVirtualNumber() == 1){
                    // 虚拟号码绑定
                    String result = AXBUtil.axbBindNumber(iamConfig.getAppKey(), iamConfig.getAppSecret(), iamConfig.getVirtualNumber(), order.getReservationPhone(), masterWorker.getPhone());
                    // 存储绑定后的唯一标识
                    JSONObject jsonObject = JSONObject.parseObject(result);
                    String subscriptionId = jsonObject.getString("subscriptionId");
                    orderClient.updateSubscriptionId(order.getId(), subscriptionId,iamConfig.getVirtualNumber());
                }
            }
            // 订单状态为 待完工时,需要更改状态 待上门且清空师傅到达预约点时间
            if (order.getState().equals(Constants.TWO)) {
                orderClient.updateStateAndArrivalTime(orderId.getOrderId(), Constants.ONE);
            ChannelHandlerContext context = NettyChannelMap.getData(String.valueOf(orderReasinDto.getWorkerId()));
            if (null != context) {
                NettyWebSocketController.sendMsgToClient(context, "您有一条新的订单,请注意查收!");
            }
            // 生成改派信息
//            ChangeDispatch changeDispatch = new ChangeDispatch();
//            changeDispatch.setWorkerId(item.getServerId());
//            changeDispatch.setWorkerName(item.getServerName());
//            changeDispatch.setApplyReason(orderReasinDto.getApplyReason());
//            changeDispatch.setApplyTime(new Date());
//            changeDispatch.setState(Constants.ONE);
//            changeDispatch.setOrderId(orderId.getOrderId());
//            changeDispatch.setOrderNumber(item.getOrderNumber());
//            if (null != item.getUserId()) {
//                changeDispatch.setUserId(item.getUserId());
//            }
//            changeDispatch.setUserName(item.getReservationName());
//            changeDispatch.setIsDelete(Constants.ZERO);
//            result = dispatchClient.saveRecord(changeDispatch).getData();
        }else {
            orderClient.updateArrivalTime(order.getId(),orderReasinDto.getArriveTime());
        }
        ChannelHandlerContext context = NettyChannelMap.getData(String.valueOf(orderReasinDto.getWorkerId()));
        if (null != context) {
            NettyWebSocketController.sendMsgToClient(context, "您有一条新的订单,请注意查收!");
        }
//        try {
//            WebSocketServer.sendInfo("您有一条新的订单,请注意查收!", String.valueOf(workerId));
//        } catch (IOException e) {
//            return R.fail("订单推送失败!");
//        }
        }
        return R.ok() ;
    }
@@ -514,17 +570,80 @@
    @ApiOperation(value = "订单列表-excel导出", tags = {"后台-订单管理"})
    @PostMapping(value = "/excelExport")
    public R<String> excelExport(@RequestBody OrderQueryRequest orderQueryRequest, HttpServletResponse response) {
        LoginUser loginUser = tokenService.getLoginUser();
        if (null == loginUser) {
            return R.loginExpire("登录失效!");
        }
        if (loginUser.getIsFranchisee()) {
            if (null == orderQueryRequest.getCityList() || orderQueryRequest.getCityList().isEmpty()) {
                orderQueryRequest.setCityList(loginUser.getCityList());
            } else {
                orderQueryRequest.getCityList().addAll(loginUser.getCityList());
            }
        }
        List<Integer> servIds = new ArrayList<>();
        if (orderQueryRequest.getClassNameId()!=null){
            List<Integer> classIds = recoveryClassifyService.lambdaQuery().eq(RecoveryClassify::getId, orderQueryRequest.getClassNameId()).list().stream().map(RecoveryClassify::getId).collect(Collectors.toList());
            servIds = recoveryServeService.lambdaQuery().eq(BaseEntity::getIsDelete,0).in(RecoveryServe::getClassifyId, classIds).list().stream().map(RecoveryServe::getId).collect(Collectors.toList());
        }
        if(orderQueryRequest.getServeId()!=null){
            servIds.add(orderQueryRequest.getServeId());
        }
        orderQueryRequest.setServIds(servIds);
        Integer franchiseeId = loginUser.getSysUser().getFranchiseeId();
        Integer isDisplay = 0;
        if (franchiseeId!=null) {
            Franchisee byId = franchiseeService.getById(franchiseeId);
            isDisplay = byId.getIsDisplay();
            String[] siteIds = byId.getSiteIds().split(",");
            orderQueryRequest.setSiteIds(siteIds);
            if (loginUser.getIsFranchisee() && siteIds.length == 0) {
                return orderService.excelExport(new ArrayList<>(), response);
            }
        }
//        List<Integer> servIds = new ArrayList<>();
//        if (orderQueryRequest.getClassNameId()!=null){
//            List<Integer> classIds = recoveryClassifyService.lambdaQuery().eq(RecoveryClassify::getId, orderQueryRequest.getClassNameId()).list().stream().map(RecoveryClassify::getId).collect(Collectors.toList());
//            servIds = recoveryServeService.lambdaQuery().eq(BaseEntity::getIsDelete,0).in(RecoveryServe::getClassifyId, classIds).list().stream().map(RecoveryServe::getId).collect(Collectors.toList());
//        }
//        orderQueryRequest.setServIds(servIds);
        R<List<Order>> result = orderClient.excelExport(orderQueryRequest);
        if(franchiseeId!=null){
            if(isDisplay == 0){
                for (Order datum : result.getData()) {
                    if(StringUtils.hasLength(datum.getServerName())){
                        datum.setServerName(datum.getServerName().charAt(0)+"***");
                    }
                    if(StringUtils.hasLength(datum.getServerPhone())){
                        datum.setServerPhone(around(datum.getServerPhone(), 3, 4));
                    }
                }
                return orderService.excelExport(result.getData(), response);
            }
            return orderService.excelExport(result.getData(), response);
        }
        for (Order datum : result.getData()) {
            if(StringUtils.hasLength(datum.getServerName()) && !"admin".equals(loginUser.getSysUser().getAccount())){
                datum.setServerName(datum.getServerName().charAt(0)+"***");
            }
            if(StringUtils.hasLength(datum.getServerPhone())){
                datum.setServerPhone(around(datum.getServerPhone(), 3, 4));
            }
        }
        // 独立orderService
        return orderService.excelExport(result.getData(), response);
    }
    private static String around(String str, int left, int right){
        if (str == null || (str.length() < left + right +1)){
            return str;
        }
        String regex = String.format("(?<=\\w{%d})\\w(?=\\w{%d})", left, right);
        return str.replaceAll(regex, "*");
    }
    /**
@@ -552,36 +671,23 @@
    /**
     * 订单列表-excel导出
     *
     * @param name  师傅姓名
     * @param phone 师傅电话
     */
    @RequiresPermissions("order_count")
    @ApiOperation(value = "订单统计", tags = {"后台-订单管理"})
    @GetMapping(value = "/orderCount")
    @ApiImplicitParams({
            @ApiImplicitParam(value = "师傅姓名", name = "name", dataType = "String"),
            @ApiImplicitParam(value = "师傅电话", name = "phone", dataType = "String"),
            @ApiImplicitParam(value = "页码", name = "pageNum", dataType = "Integer", required = true),
            @ApiImplicitParam(value = "每页条数", name = "pageSize", dataType = "Integer", required = true)
    })
    public R<Page<OrderCountVO>> orderCount(String name, String phone,
                                            @RequestParam(name = "pageNum", defaultValue = "1") Integer pageNum,
                                            @RequestParam(name = "pageSize", defaultValue = "10") Integer pageSize) {
    @PostMapping(value = "/orderCount")
    public R<Page<OrderCountVO>> orderCount(@RequestBody OrderCountDataRequest orderCountDataRequest) {
        LoginUser loginUser = tokenService.getLoginUser();
        if (null == loginUser) {
            return R.loginExpire("登录失效!");
        }
        List<String> cityList = new ArrayList<>();
        if (loginUser.getIsFranchisee()) {
            cityList = loginUser.getCityList();
        if (orderCountDataRequest.getCityList().isEmpty()) {
            List<String> cityList = new ArrayList<>();
            if (loginUser.getIsFranchisee()) {
                cityList = loginUser.getCityList();
                orderCountDataRequest.setCityList(cityList);
            }
        }
        // 查询参数
        OrderCountDataRequest orderCountDataRequest = new OrderCountDataRequest();
        orderCountDataRequest.setWorkerName(name);
        orderCountDataRequest.setWorkerPhone(phone);
        orderCountDataRequest.setCityList(cityList);
        orderCountDataRequest.setPageNum(pageNum);
        orderCountDataRequest.setPageSize(pageSize);
        Integer franchiseeId = loginUser.getSysUser().getFranchiseeId();
@@ -651,16 +757,16 @@
    @Resource
    private RedisService redisService;
    @ApiOperation(value = "地图统计", tags = {"后台-订单管理-地图统计"})
    @ApiOperation(value = "地图统计", tags = {"后台-订单管理-地图统计[2.0]"})
    @PostMapping(value = "/map/works")
    public R<List<MasterWorker>> map(String cityCode,String name) {
        LoginUser loginUser = tokenService.getLoginUser();
        if (null == loginUser) {
            return R.loginExpire("登录失效!");
        }
//        if (null == loginUser) {
//            return R.loginExpire("登录失效!");
//        }
        if (cityCode==null) {
            if (loginUser.getIsFranchisee()) {
            if (loginUser!=null&&loginUser.getIsFranchisee()) {
                cityCode = loginUser.getCityList().get(0);
            } else {
                cityCode = "420100";
@@ -670,7 +776,10 @@
        if (workIds==null||workIds.isEmpty()){
            return R.ok(new ArrayList<>());
        }
        List<MasterWorker> list = masterWorkerService.lambdaQuery().in(MasterWorker::getId, workIds).eq(name!=null&&name!="",MasterWorker::getRealName,name).eq(cityCode!=null&&cityCode!="", MasterWorker::getCityCode,cityCode).list();
        List<MasterWorker> list = masterWorkerService.lambdaQuery()
                .in(MasterWorker::getId, workIds)
                .eq(name!=null&&name!="",MasterWorker::getRealName,name)
                .eq(cityCode!=null&&cityCode!=""&&!cityCode.contains("0000"), MasterWorker::getCityCode,cityCode).list();
        for (MasterWorker masterWorker : list) {
            masterWorker.setLacation(redisService.getCacheObject("work:"+masterWorker.getId()+":"));
        }
@@ -679,7 +788,10 @@
    @ApiOperation(value = "获师傅", tags = {"后台-订单管理-地图统计"})
    @PostMapping(value = "/map/line")
    public R<List<OrderByServeRecordVO>> line(Integer id) {
    public R<Map<String,Object>> line(Integer id) {
        Map<String,Object> map = new HashMap<>();
        List<OrderByServeRecordVO> list = new ArrayList<>();
        // 获取当天时间
        String today = DateUtils.dateTimeNow("yyyy-MM-dd");
@@ -713,7 +825,11 @@
            }
            list.add(orderByServeRecord);
        }
        return R.ok(list);
        map.put("orderByServeRecordVO", list);
        MasterWorker masterWorker = masterWorkerService.getById(id);
        map.put("masterWorker", masterWorker);
        return R.ok(map);
    }
    /**
@@ -809,6 +925,20 @@
        return R.ok();
    }
    /**
     * 批量修改订单时间
     * @param ids 站点多条id拼接
     */
    @ApiOperation(value = "订单列表-批量修改订单时间", tags = {"后台-订单管理[2.0]"})
    @GetMapping(value = "/batchOrderUpdateTime")
    @ApiImplicitParams({
            @ApiImplicitParam(value = "多个id ',' 拼接", name = "ids", dataType = "String", required = true),
            @ApiImplicitParam(value = "修改上门时间", name = "time", dataType = "String", required = true),
    })
    public R<Boolean> batchOrderUpdateTime(@RequestParam("ids") String ids, @RequestParam("time") String time) {
        orderClient.batchUpdateTime(ids, time);
        return R.ok();
    }
    /**
     * 最简单的读的监听器
@@ -912,9 +1042,10 @@
            }else {
                order.setOrderMoney(one.getRecoveryPrice());
            }
            Boolean data = orderClient.save(order).getData();
            if (null == data) {
                return R.fail(orderClient.save(order).getMsg());
            R<String> saveResult = orderClient.save(order);
            String orderId = saveResult.getData();
            if (!StringUtils.hasLength(orderId)) {
                return R.fail(saveResult.getMsg());
            }
            System.out.println("服务人员id:" + order.getServerId());
            ChannelHandlerContext context = NettyChannelMap.getData(String.valueOf(order.getServerId()));