package com.ruoyi.applet.contoller; import com.baomidou.mybatisplus.extension.plugins.pagination.Page; import com.cyl.manager.staff.domain.vo.StaffVO; import com.cyl.manager.ums.domain.Member; import com.cyl.manager.ums.mapper.MemberMapper; import com.cyl.manager.ums.service.MemberWechatService; import com.ruoyi.applet.mallpojo.TeacherListRequest; import com.ruoyi.common.core.controller.BaseController; import com.ruoyi.common.core.domain.AjaxResult; import com.ruoyi.common.core.page.TableDataInfo; import com.ruoyi.common.exception.ServiceException; import com.ruoyi.common.utils.StringUtils; import com.ruoyi.model.domain.*; import com.ruoyi.model.service.*; import io.swagger.annotations.Api; import io.swagger.annotations.ApiOperation; import lombok.extern.slf4j.Slf4j; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.web.bind.annotation.*; import java.text.SimpleDateFormat; import java.time.LocalDateTime; import java.util.ArrayList; import java.util.Date; import java.util.List; @Slf4j @Api(description = "下单小程序端 - 派单指定相关接口") @RestController @RequestMapping("/applet/mall/teacher") public class ApiMallUserTeacherController extends BaseController { @Autowired private IAppUsersService appUsersService; @Autowired private IAppletUsersTeacherService appletUsersTeacherService; @Autowired private IAppletConfigService appletConfigService; @Autowired private IAppletAddressService appletAddressService; @Autowired private IAppletOutDateService appletOutDateService; @Autowired private IOmsOrderEvaluationService omsOrderEvaluationService; @Autowired private MemberMapper memberMapper; @Autowired private MemberWechatService memberWechatService; //mall-首页周边伴宠师 @ApiOperation("mall-首页周边伴宠师接口") @GetMapping("/getTeacherListIndex") public TableDataInfo getTeacherListIndex() { startPage(); AppUsers appUsers = new AppUsers(); appUsers.setUserBcs(1); List appUsersList = appUsersService.selectAppUsersList(appUsers); for (AppUsers appUsers1 : appUsersList){ AppletUsersTeacher appletUsersTeacher = appletUsersTeacherService.selectAppletUsersTeacherByUserId(appUsers1.getUserId()); appUsers1.setAppletUsersTeacher(appletUsersTeacher); AppletAddress appletAddress = new AppletAddress(); appletAddress.setUserId(appUsers.getUserId()); List appletAddresses = appletAddressService.selectAppletAddressList(appletAddress); appUsers.setAppletAddresseList(appletAddresses); } return getDataTable(appUsersList); } //mall端-查询周边伴宠师集合 @ApiOperation("mall端-查询周边伴宠师列表集合接口") @GetMapping("/getTeacherList") public TableDataInfo getTeacherList(TeacherListRequest request) { startPage(); AppUsers appUsers = new AppUsers(); appUsers.setUserBcs(1); //如果伴宠师等级传入 if (request.getTeacherLevels() != null) { appUsers.setUserBcsRole(request.getTeacherLevels()); } //如果传入staffName if (request.getStaffName() != null) { appUsers.setUserName(request.getStaffName()); } String petType =request.getPetTypes(); List appUsersList = appUsersService.selectAppUsersList(appUsers); List appUsersListNew = new ArrayList<>(); for (AppUsers appUsers1 : appUsersList){ AppletUsersTeacher appletUsersTeacher = appletUsersTeacherService.selectAppletUsersTeacherByUserId(appUsers1.getUserId()); appUsers1.setAppletUsersTeacher(appletUsersTeacher); AppletAddress appletAddress = new AppletAddress(); appletAddress.setUserId(appUsers1.getUserId()); List appletAddresses = appletAddressService.selectAppletAddressList(appletAddress); appUsers1.setAppletAddresseList(appletAddresses); //如果经纬度不为空 if (request.getLatitude() != null && request.getLongitude() != null) { //查询该经纬度下3-15公里内的接单地址 for (AppletAddress address : appletAddresses) { if (address.getLatitude() != null && address.getLongitude() != null) { //计算距离 Double distance = getDistance( Double.parseDouble(request.getLatitude()), Double.parseDouble(request.getLongitude()), Double.parseDouble(address.getLatitude()), Double.parseDouble(address.getLongitude()) ); //如果距离在3-15公里内 if (distance <= 100) { // 检查appUsers1是否已经存在于appUsersListNew中 if (!appUsersListNew.contains(appUsers1)) { appUsers1.setDistance(distance); //如果性别不为空 if (request.getSex() != null) { //判断性别跟查出来的性别相同 if (request.getSex().equals(appletUsersTeacher.getSex())) { if (!appUsersListNew.contains(appUsers1)) { appUsersListNew.add(appUsers1); } } }else{ if (!appUsersListNew.contains(appUsers1)) { appUsersListNew.add(appUsers1); } } // 如果写入了接单日期 if (request.getSelectedDate() != null) { // 创建一个AppletOutDate对象 AppletOutDate appletOutDate = new AppletOutDate(); appletOutDate.setAddressId(address.getId()); // 获取不接单日期列表 List appletOutDates = appletOutDateService.selectAppletOutDateList(appletOutDate); // 创建一个SimpleDateFormat对象,用于格式化日期 SimpleDateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd"); // 提取不接单日期字符串列表 List outDates = new ArrayList<>(); for (AppletOutDate outDate : appletOutDates) { Date date = outDate.getDate(); // 假设AppletOutDate有一个getDate()方法 if (date != null) { outDates.add(dateFormat.format(date)); // 将Date格式化为字符串 } } // 分割request.getSelectedDate()为多个日期 String[] selectedDates = request.getSelectedDate().split(","); // 初始化一个标志,用于判断是否所有日期都不在不接单日期列表中 boolean allDatesValid = true; // 检查每个日期是否不在不接单日期列表中 for (String selectedDate : selectedDates) { if (outDates.contains(selectedDate.trim())) { allDatesValid = false; break; } } // 如果所有日期都不在不接单日期列表中,并且appUsers1不在列表中,则添加 if (allDatesValid) { if (!appUsersListNew.contains(appUsers1)) { appUsersListNew.add(appUsers1); } } else { // 如果至少有一个日期在不接单日期列表中,检查并删除appUsers1 if (appUsersListNew.contains(appUsers1)) { appUsersListNew.remove(appUsers1); } } } // 假设 petType 是一个字符串,格式为 "3,4,5" if (petType != null && appletUsersTeacher != null && appletUsersTeacher.getPetType() != null) { // 将 petType 分割为字符串数组 String[] petTypes = petType.split(","); // 遍历分割后的数组,检查是否包含 appletUsersTeacher.getPetType() boolean containsPetType = false; for (String type : petTypes) { if (type.trim().equals(appletUsersTeacher.getPetType())) { containsPetType = true; break; } } if (containsPetType) { // 如果包含,检查是否已存在于列表中,不存在则添加 if (!appUsersListNew.contains(appUsers1)) { appUsersListNew.add(appUsers1); } } else { // 如果不包含,检查是否存在并删除 if (appUsersListNew.contains(appUsers1)) { appUsersListNew.remove(appUsers1); } } } else { // 如果 petType 为空,或者 appletUsersTeacher 或其 getPetType() 为空,则检查并添加 appUsers1 if (!appUsersListNew.contains(appUsers1)) { appUsersListNew.add(appUsers1); } } } } } } }else { appUsersListNew.add(appUsersList.get(0)); } } for (AppUsers users : appUsersListNew) { users.setEvaluationNum(omsOrderEvaluationService.lambdaQuery() .eq(OmsOrderEvaluation::getTechnicianId, users.getUserHh()).count()); } return getDataTable(appUsersListNew); } /** * 计算两个经纬度之间的距离(单位:公里) * @param lat1 第一个点的纬度 * @param lon1 第一个点的经度 * @param lat2 第二个点的纬度 * @param lon2 第二个点的经度 * @return 两点之间的距离(公里) */ public static double getDistance(double lat1, double lon1, double lat2, double lon2) { // 地球半径(公里) final int EARTH_RADIUS = 6371; // 将经纬度转换为弧度 double lat1Rad = Math.toRadians(lat1); double lon1Rad = Math.toRadians(lon1); double lat2Rad = Math.toRadians(lat2); double lon2Rad = Math.toRadians(lon2); // 计算纬度差和经度差 double latDiff = lat2Rad - lat1Rad; double lonDiff = lon2Rad - lon1Rad; // Haversine公式计算 double a = Math.pow(Math.sin(latDiff / 2), 2) + Math.cos(lat1Rad) * Math.cos(lat2Rad) * Math.pow(Math.sin(lonDiff / 2), 2); double c = 2 * Math.atan2(Math.sqrt(a), Math.sqrt(1 - a)); // 计算距离 double distance = EARTH_RADIUS * c; // 保留两位小数 return Math.round(distance * 100) / 100.0; } //mall端-查询指定伴宠师详情 @ApiOperation("mall端-查询指定伴宠师详情接口") @GetMapping("/getTeacherDetail") public AppUsers getTeacherDetail(AppUsers app) { //用户标识不能为空 AppUsers appUsers = appUsersService.selectAppUsersByUserId(app.getUserId()); AppletUsersTeacher appletUsersTeacher = appletUsersTeacherService.selectAppletUsersTeacherByUserId(appUsers.getUserId()); appUsers.setAppletUsersTeacher(appletUsersTeacher); AppletAddress appletAddress = new AppletAddress(); appletAddress.setUserId(appUsers.getUserId()); List appletAddresses = appletAddressService.selectAppletAddressList(appletAddress); appUsers.setAppletAddresseList(appletAddresses); return appUsers; } //mall端-查询指定伴宠师近期评价 @ApiOperation("mall端-查询指定伴宠师近期评价") @GetMapping("/getTeacherEvaluate") public AjaxResult getTeacherEvaluate(@RequestParam String id) { Page page = omsOrderEvaluationService.lambdaQuery() .eq(OmsOrderEvaluation::getTechnicianId, id) .page(new Page<>(1, 10)); for (OmsOrderEvaluation record : page.getRecords()) { record.setMember(memberMapper.selectById(record.getMemberId())); } return AjaxResult.success(page); } //mall端-系统派单的时候需要选择的伴宠师等级说明 @ApiOperation("mall端-系统派单的时候需要选择的伴宠师等级说明接口") @GetMapping("/getTeacherLevels") public TableDataInfo getTeacherLevels() { AppletConfig appletConfig = new AppletConfig(); appletConfig.setParamClass("order_mall"); List appletConfigs = appletConfigService.selectAppletConfigList(appletConfig); return getDataTable(appletConfigs); } //mall端-下单端用户通过邀请码绑定伴宠师 @ApiOperation("mall端-下单端用户通过邀请码绑定伴宠师") @GetMapping("/bindCode") public AjaxResult bindCode(String code, String openId) { if (StringUtils.isEmpty(openId)){ throw new ServiceException("openId不能为空"); } Member member = memberWechatService.isRegister(openId); if (member == null){ throw new ServiceException("用户不存在"); } //判断当前用户有没有绑定 if (StringUtils.isNotEmpty(member.getInviteCode())){ throw new ServiceException("已经绑定过了"); } AppUsers users = appUsersService.bindCode(code); member.setInviteCode(code); member.setSpreadTime(LocalDateTime.now()); member.setSpreadUid(users.getUserId()); memberMapper.updateById(member); return AjaxResult.success(); } }