| | |
| | | import cn.hutool.http.HttpUtil; |
| | | import cn.hutool.json.JSONUtil; |
| | | import cn.stylefeng.guns.modular.business.dto.*; |
| | | import cn.stylefeng.guns.modular.business.dto.request.CounsellingOrderRequest; |
| | | import cn.stylefeng.guns.modular.business.dto.request.CounsellingReservationRequest; |
| | | import cn.stylefeng.guns.modular.business.dto.request.CounsellingUserRequest; |
| | | import cn.stylefeng.guns.modular.business.dto.request.CreateCounsellingOrderRequest; |
| | | import cn.stylefeng.guns.modular.business.dto.request.*; |
| | | import cn.stylefeng.guns.modular.business.entity.*; |
| | | import cn.stylefeng.guns.modular.business.service.*; |
| | | import cn.stylefeng.guns.modular.business.service.impl.ImBizService; |
| | | import cn.stylefeng.rest.ijpay.controller.AliPayController; |
| | | import cn.stylefeng.rest.ijpay.controller.WxPayController; |
| | | import cn.stylefeng.roses.kernel.auth.api.context.LoginContext; |
| | | import cn.stylefeng.roses.kernel.auth.api.pojo.login.LoginUser; |
| | | import cn.stylefeng.roses.kernel.cache.api.CacheOperatorApi; |
| | | import cn.stylefeng.roses.kernel.customer.api.pojo.CustomerInfo; |
| | | import cn.stylefeng.roses.kernel.customer.modular.entity.Customer; |
| | | import cn.stylefeng.roses.kernel.customer.modular.service.CustomerService; |
| | | import cn.stylefeng.roses.kernel.db.api.factory.PageFactory; |
| | |
| | | import cn.stylefeng.roses.kernel.scanner.api.annotation.ApiResource; |
| | | import cn.stylefeng.roses.kernel.scanner.api.annotation.GetResource; |
| | | import cn.stylefeng.roses.kernel.scanner.api.annotation.PostResource; |
| | | import cn.stylefeng.roses.kernel.system.modular.role.entity.SysRole; |
| | | import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; |
| | | import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; |
| | | import com.baomidou.mybatisplus.core.conditions.update.LambdaUpdateWrapper; |
| | |
| | | import io.swagger.annotations.ApiImplicitParams; |
| | | import io.swagger.annotations.ApiOperation; |
| | | import lombok.extern.slf4j.Slf4j; |
| | | import org.redisson.api.RLock; |
| | | import org.redisson.api.RedissonClient; |
| | | import org.springframework.beans.factory.annotation.Value; |
| | | import org.springframework.transaction.annotation.Transactional; |
| | | import org.springframework.web.bind.annotation.PathVariable; |
| | |
| | | |
| | | import javax.annotation.Resource; |
| | | import java.math.BigDecimal; |
| | | import java.text.ParseException; |
| | | import java.text.SimpleDateFormat; |
| | | import java.util.*; |
| | | import java.util.concurrent.TimeUnit; |
| | | import java.util.concurrent.atomic.AtomicLong; |
| | | import java.util.stream.Collectors; |
| | | |
| | |
| | | |
| | | @Resource |
| | | private AliPayController aliPayController; |
| | | @Resource |
| | | private IMentalAppointmentService mentalAppointmentService; |
| | | |
| | | @Value("${refund.alipay-url}") |
| | | private String refundAlipayUrl; |
| | | @Value("${refund.wxpay-url}") |
| | | private String refundWxpayUrl; |
| | | |
| | | @Resource |
| | | private RedissonClient redissonClient; |
| | | |
| | | |
| | | |
| | |
| | | } |
| | | |
| | | |
| | | @Resource |
| | | private CacheOperatorApi<List<CounsellinginfoResponseDTO>> roleInfoCacheApi; |
| | | |
| | | |
| | | /** |
| | | * 获取咨询师信息列表(分页) |
| | | */ |
| | |
| | | @ApiImplicitParam(name = "searchType", value = "查询类型 1-严选,2-普通查询,默认2", dataTypeClass = Integer.class, paramType = "query") |
| | | }) |
| | | public ResponseData<PageResult<CounsellinginfoResponseDTO>> page(Integer pageNo, Integer pageSize,Integer searchType) { |
| | | // if (roleInfoCacheApi.get("customer:"+LoginContext.me().getLoginUser().getUserId())!=null){ |
| | | // List<CounsellinginfoResponseDTO> customer = roleInfoCacheApi.get("customer:"+LoginContext.me().getLoginUser().getUserId()); |
| | | // return new SuccessResponseData<>(customer); |
| | | // } |
| | | // |
| | | // LambdaQueryWrapper<CounsellingInfo> lambdaQueryWrapper = new LambdaQueryWrapper<CounsellingInfo>().eq(CounsellingInfo::getIsDelete,false) |
| | | // .orderByDesc(CounsellingInfo::getSort,CounsellingInfo::getCreateTime).eq(CounsellingInfo::getListingStatus,1); |
| | | // //默认普通查询 |
| | | // if (searchType != null && searchType.intValue() == 1){ |
| | | // List<Customer> customerList = customerService.getWorkerListByLineStatusAndPost(null, null, PostIdEnum.PO_22.getCode(), CustomerWorkStatusEnum.ON_WORK.getCode()); |
| | | // if (CollectionUtil.isNotEmpty(customerList)){ |
| | | // List<Long> customerIds = customerList.stream().map(Customer::getCustomerId).collect(Collectors.toList()); |
| | | // lambdaQueryWrapper.in(CounsellingInfo::getUserId,customerIds); |
| | | // } |
| | | // } |
| | | // List<CounsellingInfo> page = this.counsellingInfoService.list(lambdaQueryWrapper); |
| | | // if (CollectionUtil.isNotEmpty(page)){ |
| | | // List<Long> counseIds = page.stream().map(CounsellingInfo::getId).collect(Collectors.toList()); |
| | | // QueryWrapper<CounsellingOrder> orderQueryWrapper = new QueryWrapper<CounsellingOrder>().select("counselling_info_id counsellingInfoId,count(1) num "); |
| | | // //查询是否首次咨询 |
| | | // orderQueryWrapper.lambda().eq(CounsellingOrder::getUserId,LoginContext.me().getLoginUser().getUserId()).in(CounsellingOrder::getStatusFlag,1,2).in(CounsellingOrder::getCounsellingInfoId,counseIds) |
| | | // .eq(CounsellingOrder::getOrderType,1).groupBy(CounsellingOrder::getCounsellingInfoId).having(" num > 0 "); |
| | | // List<Map<String,Object>> mapList = this.counsellingOrderService.listMaps(orderQueryWrapper); |
| | | // Map<Long,Object> fristMap = new HashMap<>(); |
| | | // if (CollectionUtil.isNotEmpty(mapList)){ |
| | | // |
| | | // mapList.stream().forEach(stringObjectMap -> { |
| | | // fristMap.put(Long.parseLong(stringObjectMap.get("counsellingInfoId").toString()),stringObjectMap.get("num")); |
| | | // }); |
| | | // } |
| | | // //查询标签总条数 |
| | | // List<CounsellingTag> counsellingTags = this.counsellingTagService.list(new LambdaQueryWrapper<CounsellingTag>() |
| | | // .select(CounsellingTag::getId,CounsellingTag::getTagName)); |
| | | // List<Long> custommerIds = page.stream().map(CounsellingInfo::getUserId).collect(Collectors.toList()); |
| | | // //查询客户ids |
| | | // List<Customer> customerList = this.customerService.list(new LambdaQueryWrapper<Customer>().select(Customer::getCustomerId,Customer::getNickName).in(Customer::getCustomerId,custommerIds)); |
| | | // //查询套餐最低价 |
| | | // List<Map<String,Object>> lowMapList = this.counsellingSetMealService.listMaps(new QueryWrapper<CounsellingSetMeal>().select(" counselling_info_id counsellingInfoId,IFNULL(min(price),0) price ").lambda().in(CounsellingSetMeal::getCounsellingInfoId,counseIds) |
| | | // .eq(CounsellingSetMeal::getSetMealType,1).eq(CounsellingSetMeal::getIsDelete,0)); |
| | | // |
| | | // List<CounsellinginfoResponseDTO> counsellinginfoResponseDTOS = BeanUtil.copyToList(page,CounsellinginfoResponseDTO.class, CopyOptions.create()); |
| | | // counsellinginfoResponseDTOS.stream().forEach(counsellinginfoResponseDTO -> { |
| | | // if (fristMap.get(counsellinginfoResponseDTO.getId()) != null){ |
| | | // counsellinginfoResponseDTO.setIsFirstBuy(true); |
| | | // } |
| | | // if (StrUtil.isNotBlank(counsellinginfoResponseDTO.getCounsellingTagIds())){ |
| | | // List<String> counsellingTagList = Arrays.asList(counsellinginfoResponseDTO.getCounsellingTagIds().split(",")); |
| | | // String tagNames = counsellingTags.stream().filter(cou -> counsellingTagList.contains(cou.getId().toString())).map(CounsellingTag::getTagName).collect(Collectors.joining(",")); |
| | | // //获取课程标签名称 |
| | | //// LambdaQueryWrapper<CounsellingTag> counsellingTagLambdaQueryWrapper = new QueryWrapper<CounsellingTag>().select(" GROUP_CONCAT(tag_name) tagName ").lambda(); |
| | | //// Map<String,Object> map = counsellingTagService.getMap(counsellingTagLambdaQueryWrapper.in(CounsellingTag::getId,counsellinginfoResponseDTO.getCounsellingTagIds().split(","))); |
| | | //// if (ObjectUtil.isNotEmpty(map)){ |
| | | // counsellinginfoResponseDTO.setCounsellingTagNames(tagNames); |
| | | //// } |
| | | // } |
| | | // counsellinginfoResponseDTO.setPersonalProfile(null); |
| | | // |
| | | // counsellinginfoResponseDTO.setNikeName(customerList.stream().filter(cus -> counsellinginfoResponseDTO.getUserId().longValue() == cus.getCustomerId().longValue()).findFirst().get().getNickName()); |
| | | // |
| | | //// BigDecimal lowPrice = this.counsellingSetMealService.getObj(new QueryWrapper<CounsellingSetMeal>().select(" counselling_info_id counsellingInfoId,IFNULL(min(price),0) price ").lambda().eq(CounsellingSetMeal::getCounsellingInfoId,counsellinginfoResponseDTO.getId()) |
| | | //// .eq(CounsellingSetMeal::getSetMealType,1).eq(CounsellingSetMeal::getIsDelete,0),Convert::toBigDecimal); |
| | | // |
| | | // |
| | | // if (CollectionUtil.isNotEmpty(lowMapList)){ |
| | | // lowMapList.stream().forEach(stringObjectMap -> { |
| | | // if (stringObjectMap.get("counsellingInfoId") != null){ |
| | | // counsellinginfoResponseDTO.setLowPrice(new BigDecimal(stringObjectMap.get("price").toString())); |
| | | // } |
| | | // }); |
| | | // if (counsellinginfoResponseDTO.getLowPrice() == null){ |
| | | // counsellinginfoResponseDTO.setLowPrice(new BigDecimal(0)); |
| | | // } |
| | | // } |
| | | // |
| | | // |
| | | // }); |
| | | // roleInfoCacheApi.put("customer:"+LoginContext.me().getLoginUser().getUserId(),counsellinginfoResponseDTOS,600L); |
| | | // |
| | | // return new SuccessResponseData<>(counsellinginfoResponseDTOS); |
| | | // } |
| | | // |
| | | // return new SuccessResponseData<>(); |
| | | |
| | | |
| | | |
| | | |
| | | |
| | | |
| | | LambdaQueryWrapper<CounsellingInfo> lambdaQueryWrapper = new LambdaQueryWrapper<CounsellingInfo>().eq(CounsellingInfo::getIsDelete,false) |
| | | .orderByDesc(CounsellingInfo::getSort,CounsellingInfo::getCreateTime).eq(CounsellingInfo::getListingStatus,1); |
| | | //默认普通查询 |
| | |
| | | |
| | | if (CollectionUtil.isNotEmpty(lowMapList)){ |
| | | lowMapList.stream().forEach(stringObjectMap -> { |
| | | if (stringObjectMap.get("counsellingInfoId") != null){ |
| | | if (stringObjectMap.get("counsellingInfoId") != null && stringObjectMap.get("counsellingInfoId").toString().equals(counsellinginfoResponseDTO.getId().toString()) ){ |
| | | counsellinginfoResponseDTO.setLowPrice(new BigDecimal(stringObjectMap.get("price").toString())); |
| | | } |
| | | }); |
| | |
| | | public ResponseData<CounsellingOrder> createCounsellingOrder(@RequestBody CreateCounsellingOrderRequest counsellingOrderRequest) { |
| | | counsellingOrderRequest.setIsBack(false); |
| | | counsellingOrderRequest.setUserId(LoginContext.me().getLoginUser().getUserId()); |
| | | CounsellingInfo counsellingInfo = this.counsellingInfoService.getOne(new LambdaQueryWrapper<CounsellingInfo>().select(CounsellingInfo::getId,CounsellingInfo::getListingStatus).eq(CounsellingInfo::getId,counsellingOrderRequest.getCounsellingInfoId())); |
| | | if (counsellingInfo != null){ |
| | | if(counsellingInfo.getListingStatus().intValue() != 1){ |
| | | return new ErrorResponseData<>("咨询师已经下架,无法进行购买,请联系咨询顾问"); |
| | | } |
| | | } |
| | | Customer customer = this.customerService.getById(LoginContext.me().getLoginUser().getUserId()); |
| | | if (customer.getStatusFlag() != null &&customer.getStatusFlag() !=1){ |
| | | return new ErrorResponseData<>("账号已被冻结或者被注销,无法进行下单"); |
| | |
| | | } |
| | | |
| | | |
| | | |
| | | @ApiOperation("咨询订单预约") |
| | | @PostResource(name = "咨询订单预约", path = "/counsellingOrderReservation/saveCounsellingOrderReservation") |
| | | public ResponseData<CounsellingOrderReservation> saveCounsellingOrderReservation(@RequestBody CounsellingReservationRequest counsellingReservationRequest){ |
| | | public ResponseData<CounsellingOrderReservation> saveCounsellingOrderReservation(@RequestBody CounsellingReservationRequest counsellingReservationRequest) throws ParseException { |
| | | |
| | | //查询咨询师当天是否取消预约 |
| | | CounsellingSpecialTimeConfig specialTimeConfig = this.counsellingSpecialTimeConfigService.getOne(new LambdaQueryWrapper<CounsellingSpecialTimeConfig>().eq(CounsellingSpecialTimeConfig::getCounsellingInfoId,counsellingReservationRequest.getCounsellingId()) |
| | | .eq(CounsellingSpecialTimeConfig::getSpecialDay,counsellingReservationRequest.getDayTime()).eq(CounsellingSpecialTimeConfig::getIsCancelDay,1)); |
| | |
| | | if (counsellingOrder == null){ |
| | | throw new ServiceException("没有在咨询的订单,无法进行预约!"); |
| | | } |
| | | String key = "counsel:" + counsellingReservationRequest.getCounsellingId()+"_"+counsellingReservationRequest.getDayTime()+"_"+counsellingReservationRequest.getTimePoint(); |
| | | RLock lock = redissonClient.getLock(key); |
| | | boolean tryLock = false; |
| | | try { |
| | | log.info("咨询key:"+key+",userId:"+counsellingOrder.getUserId()); |
| | | tryLock = lock.tryLock(20, TimeUnit.SECONDS); |
| | | if (!tryLock) { |
| | | throw new ServiceException("当前时间段已预约,请选择其他时间段!"); |
| | | } |
| | | |
| | | //验证未支付的首次咨询订单 |
| | | long counselllingCount = this.counsellingOrderService.count(new LambdaQueryWrapper<CounsellingOrder>().eq(CounsellingOrder::getFirstAppointmentDate,counsellingReservationRequest.getDayTime()) |
| | |
| | | this.counsellingOrderService.updateById(counsellingOrder); |
| | | this.counsellingUserService.updateById(counsellingUserOld); |
| | | |
| | | CounsellingInfo counsellingInfo = this.counsellingInfoService.getById(counsellingOrder.getCounsellingInfoId()); |
| | | |
| | | //将此条消息加入到可聊天的表中t_mental_appointment |
| | | MentalAppointment mentalAppointment = MentalAppointment.builder() |
| | | .userId(counsellingOrder.getUserId()) |
| | | .type("1") |
| | | .statusFlag(1) |
| | | .appointmentDay(new SimpleDateFormat("yyyy-MM-dd").parse(counsellingReservationRequest.getDayTime())) |
| | | .beginTimePoint(counsellingReservationRequest.getTimePoint().split("-")[0]) |
| | | .endTimePoint(counsellingReservationRequest.getTimePoint().split("-")[1]) |
| | | .workerId(counsellingInfo.getUserId()) |
| | | .build(); |
| | | // 用户信息 |
| | | CustomerInfo customerInfo = customerService.getCustomerInfoById(counsellingOrder.getUserId()); |
| | | mentalAppointment.setUserName(customerInfo.getRealName()); |
| | | mentalAppointment.setPhone(customerInfo.getLinkPhone()); |
| | | mentalAppointmentService.save(mentalAppointment); |
| | | |
| | | // 发送IM消息 |
| | | ImPushDataDTO pushData1 = ImPushDataDTO.builder() |
| | | .type(ImPushTypeEnum.C_TO_W_IM_1V1_START_CONSULT_FIRST.getCode()) |
| | | .title(ImPushTypeEnum.C_TO_W_IM_1V1_START_CONSULT_FIRST.getName()) |
| | | .content("预约成功"+",请注意预约时间:"+counsellingReservationRequest.getDayTime()+counsellingReservationRequest.getTimePoint()) |
| | | // .content("预约成功!") |
| | | .objId(ObjUtil.toString(counsellingInfo.getId())) |
| | | .data1(ObjUtil.toString(counsellingOrder.getUserId())) |
| | | .data2(ObjUtil.toString(counsellingInfo.getUserId())) |
| | | .build(); |
| | | imBizService.messageSendPrivate( |
| | | ObjUtil.toString(counsellingOrder.getUserId()), |
| | | new String[]{ObjUtil.toString(counsellingInfo.getUserId())}, |
| | | pushData1); |
| | | |
| | | // 推送消息内容 |
| | | String pushContent = "你的预约("+DateUtil.formatDate(counsellingOrder.getFirstAppointmentDate())+" "+counsellingOrder.getFirstAppointmentTimes()+")已确认,请按时参加"; |
| | | // IM推送数据json |
| | |
| | | .type(ImPushTypeEnum.S_TO_W_TIP_CONSULT_PAY_SUCCESS.getCode()) |
| | | .objId(ObjUtil.toString(counsellingOrderReservation.getId())) |
| | | .title("通知") |
| | | .data1(ObjUtil.toString(counsellingInfo.getUserId())) |
| | | .data2(ObjUtil.toString(counsellingOrder.getUserId())) |
| | | .content(pushContent) |
| | | // .extra("("+DateUtil.formatDate(counsellingOrder.getFirstAppointmentDate())+" "+counsellingOrder.getFirstAppointmentTimes()+")") |
| | | .build(); |
| | | // 发送首次预约 |
| | | imBizService.messageSendSystem(counsellingOrderReservation.getUserId()+"", new String[]{counsellingOrderReservation.getUserId()+""}, pushData, ImUserTypeEnum.USER, null, true); |
| | | |
| | | |
| | | //给咨询师发消息 |
| | | Customer customerOld = this.customerService.getById(counsellingOrderReservation.getUserId()); |
| | | |
| | | String pushContent1 = "你有新的预约,请注意查收。预约用户:"+customerOld.getNickName()+",预约时间:"+DateUtil.formatDate(counsellingOrder.getFirstAppointmentDate())+" "+counsellingOrder.getFirstAppointmentTimes(); |
| | | // +"预约时间:"+counsellingOrder.getEffectiveEndTime()+"~"+counsellingOrder.getEffectiveEndTime(); |
| | | // IM推送数据json |
| | | ImPushDataDTO pushData2 = ImPushDataDTO.builder() |
| | | .type(ImPushTypeEnum.S_TO_W_TIP_CONSULT_PAY_GROUP_SUCCESS.getCode()) |
| | | .objId(ObjUtil.toString(counsellingInfo.getUserId())) |
| | | .title("通知") |
| | | .content(pushContent1) |
| | | .data1(ObjUtil.toString(counsellingOrder.getUserId())) |
| | | .data2(ObjUtil.toString(counsellingInfo.getUserId())) |
| | | // .extra("去查看。") |
| | | .build(); |
| | | // 发送预约提示 |
| | | imBizService.messageSendSystem(counsellingOrder.getUserId()+"", new String[]{counsellingInfo.getUserId()+""}, pushData2, ImUserTypeEnum.WORKER, PostIdEnum.PO_22, true); |
| | | }else{ |
| | | counsellingOrderReservation.setStauts(1); |
| | | counsellingOrderReservation.setReservationType(2); |
| | |
| | | customerService.updateCustomerRemoveCache(customer); |
| | | } |
| | | |
| | | try { |
| | | |
| | | return new SuccessResponseData<>(counsellingOrderReservation); |
| | | } |
| | | CustomerUpdateRequest customerUpdateRequest = counsellingReservationRequest.getCustomerUpdateRequest(); |
| | | Customer customer = new Customer(); |
| | | BeanUtil.copyProperties(customerUpdateRequest,customer); |
| | | LoginUser loginUser = LoginContext.me().getLoginUser(); |
| | | customer.setCustomerId(loginUser.getUserId()); |
| | | customerService.updateById(customer); |
| | | }catch (Exception e){ |
| | | e.printStackTrace(); |
| | | log.info("编辑用户报错"); |
| | | } |
| | | return new SuccessResponseData<>(counsellingOrderReservation); |
| | | }catch (Exception ex){ |
| | | log.error("咨询预约服务异常",ex.getStackTrace()); |
| | | throw new ServiceException("当前时间段已在进行预约,请稍后再试!"); |
| | | }finally { |
| | | if(tryLock){ |
| | | lock.unlock(); |
| | | } |
| | | } |
| | | |
| | | } |
| | | |
| | | |
| | | @ApiOperation("根据咨询订单id查询咨询信息") |
| | | @ApiOperation("根据咨询订单id查询咨询信息") |
| | | @GetResource(name = "根据咨询订单id查询咨询信息", path = {"/counsellingOrder/getCounsellingOrderInfoById","/worker/counsellingOrder/getCounsellingOrderInfoById"}) |
| | | public ResponseData<CounsellingOrderResponseDTO> getCounsellingOrderInfoById(Long counsellingOrderId){ |
| | | CounsellingOrder counsellingOrder = this.counsellingOrderService.getById(counsellingOrderId); |
| | |
| | | counsellingOrderReservationRequestDTO.setCustomerId(LoginContext.me().getLoginUser().getUserId()); |
| | | } |
| | | Page<CounsellingOrderReservation> page = this.counsellingOrderReservationService.findReservationPage(PageFactory.defaultPage(), counsellingOrderReservationRequestDTO); |
| | | |
| | | |
| | | return new SuccessResponseData<>(PageResultFactory.createPageResult(page)); |
| | | } |
| | | |