diff --git a/pom.xml b/pom.xml index 5cc39e0..01aa2c5 100644 --- a/pom.xml +++ b/pom.xml @@ -200,7 +200,11 @@ - + + com.jcraft + jsch + 0.1.55 + diff --git a/ruoyi-admin/ruoyi-admin.iml b/ruoyi-admin/ruoyi-admin.iml index 541cb8b..93594d6 100644 --- a/ruoyi-admin/ruoyi-admin.iml +++ b/ruoyi-admin/ruoyi-admin.iml @@ -4,7 +4,10 @@ - + + + + @@ -15,6 +18,8 @@ + + @@ -123,7 +128,11 @@ - + + + + + @@ -215,5 +224,6 @@ + \ No newline at end of file diff --git a/ruoyi-admin/src/main/java/com/ruoyi/web/controller/basic/AppreciateController.java b/ruoyi-admin/src/main/java/com/ruoyi/web/controller/basic/AppreciateController.java index cf2bf80..2afb0ba 100644 --- a/ruoyi-admin/src/main/java/com/ruoyi/web/controller/basic/AppreciateController.java +++ b/ruoyi-admin/src/main/java/com/ruoyi/web/controller/basic/AppreciateController.java @@ -14,6 +14,7 @@ import org.springframework.web.bind.annotation.RestController; import javax.annotation.Resource; import java.util.List; +import java.util.Map; /** * 瑜伽欣赏 @@ -28,15 +29,16 @@ public class AppreciateController { /** * 瑜伽欣赏 列表 - * @param appreciate + * @param visitStore * @return */ @ApiOperation("获取瑜伽欣赏 列表") @PostMapping("/getList") - public RestResponse getList(@RequestBody YjAppreciate appreciate){ + public RestResponse getList(@RequestBody Map map){ + Long visitStore=Long.parseLong(map.get("visitStore").toString()); List list= service.list(new QueryWrapper() .select("id,title,image,read_num,start_time") - .eq("visit_store",appreciate.getVisitStore()) + .eq("dept_id",visitStore) .eq("status",true) .orderByDesc("modify_time")); return new RestResponse().setSuccess(true).setMessage("成功").setData(list); diff --git a/ruoyi-admin/src/main/java/com/ruoyi/web/controller/basic/ContextAppController.java b/ruoyi-admin/src/main/java/com/ruoyi/web/controller/basic/ContextAppController.java index 030bcf5..89ba040 100644 --- a/ruoyi-admin/src/main/java/com/ruoyi/web/controller/basic/ContextAppController.java +++ b/ruoyi-admin/src/main/java/com/ruoyi/web/controller/basic/ContextAppController.java @@ -2,12 +2,11 @@ package com.ruoyi.web.controller.basic; import com.ruoyi.RestResponse; import com.ruoyi.common.core.controller.BaseController; -import com.ruoyi.course.domain.Context; -import com.ruoyi.course.domain.ReqSearchClaTime; +import com.ruoyi.course.domain.req.ReqSearchClaTime; import com.ruoyi.course.domain.time.RespBusinessClaTimeCalendar; import com.ruoyi.course.service.ScClaTimeService; -import com.ruoyi.course.service.impl.ContextServicelmpl; -import com.ruoyi.system.service.impl.SysUserServiceImpl; +import com.ruoyi.system.domain.SysTeacher; +import com.ruoyi.system.service.SysTeacherService; import io.swagger.annotations.Api; import io.swagger.annotations.ApiOperation; import org.springframework.beans.factory.annotation.Autowired; @@ -24,28 +23,34 @@ import java.util.Map; @RequestMapping("/api/context") public class ContextAppController extends BaseController { @Autowired - ContextServicelmpl contextService; + private SysTeacherService teacherService; @Autowired - SysUserServiceImpl userService; + private ScClaTimeService scClaTimeService; + @Autowired - ScClaTimeService scClaTimeService; + private SysTeacherService staffService; + /** + * visitStore + * @param params + * @return + */ @ApiOperation("教练列表") @PostMapping(value = "/getList") public RestResponse findList1(@RequestBody Map params) { - List list =contextService.getList(params); + List list = teacherService.getList(Long.parseLong(params.get("visitStore").toString())); return new RestResponse().setSuccess(true).setMessage("成功").setData(list); } @ApiOperation("教练详细信息") @PostMapping("/getOne") - public RestResponse update(@RequestBody Map params) { - Context c =contextService.getOne(params); + public RestResponse update(@RequestBody Map params) { + SysTeacher c = teacherService.getByUserId(params.get("userId").toString()); return RestResponse.success().setData(c); } @ApiOperation("教练课程表") @PostMapping("/searchListForCalendar") - public RestResponse update(@RequestBody ReqSearchClaTime reqSearchClaTime) { + public RestResponse searchListForCalendar(@RequestBody ReqSearchClaTime reqSearchClaTime) { RespBusinessClaTimeCalendar c =scClaTimeService.searchListForCalendar(reqSearchClaTime); return RestResponse.success().setData(c); } diff --git a/ruoyi-admin/src/main/java/com/ruoyi/web/controller/basic/HealthyController.java b/ruoyi-admin/src/main/java/com/ruoyi/web/controller/basic/HealthyController.java index 997033f..40739be 100644 --- a/ruoyi-admin/src/main/java/com/ruoyi/web/controller/basic/HealthyController.java +++ b/ruoyi-admin/src/main/java/com/ruoyi/web/controller/basic/HealthyController.java @@ -14,6 +14,7 @@ import org.springframework.web.bind.annotation.RestController; import javax.annotation.Resource; import java.util.List; +import java.util.Map; /** * 健康饮食 @@ -27,15 +28,16 @@ public class HealthyController { /** * 健康饮食 列表 - * @param healthy + * @param visitStore * @return */ @ApiOperation(value = "获取健康饮食列表") @PostMapping("/getList") - public RestResponse getList(@RequestBody YjHealthy healthy){ + public RestResponse getList(@RequestBody Map map){ + Long visitStore=Long.parseLong(map.get("visitStore").toString()); List list= service.list(new QueryWrapper() .select("id,title,image,read_num,start_time") - .eq("visit_store",healthy.getVisitStore()) + .eq("dept_id",visitStore) .eq("status",true) .orderByDesc("modify_time")); return new RestResponse().setSuccess(true).setMessage("成功").setData(list); diff --git a/ruoyi-admin/src/main/java/com/ruoyi/web/controller/basic/IndexController.java b/ruoyi-admin/src/main/java/com/ruoyi/web/controller/basic/IndexController.java index 8fe7087..5a6ff40 100644 --- a/ruoyi-admin/src/main/java/com/ruoyi/web/controller/basic/IndexController.java +++ b/ruoyi-admin/src/main/java/com/ruoyi/web/controller/basic/IndexController.java @@ -28,50 +28,20 @@ import java.util.Map; public class IndexController { @Resource private YjStoreServiceImpl storeService; - @Autowired - private YjAppUserService appUserService; @ApiOperation("门店列表") @PostMapping("/getStores") - public RestResponse getStores(){ - Long userId = SecurityUtils.getAppLoginUser().getAppUser().getId(); - AppUser appUser =appUserService.getById(userId); - YjStore s=storeService.getOne(new QueryWrapper().select("tenant_id").eq("id",appUser.getVisitStore())); - List list= storeService.list(new QueryWrapper() - .select("address","" + - "store_name","phone","id","parent_id") - .eq("status",2) - .eq("tenant_id",s.getTenantId()) - .orderByAsc("tenant_id") - ); - - list.forEach(l->{ - if (l.getParentId().equals("0")){ - l.setStoreName(l.getStoreName()+"(总店)"); - } - }); - return new RestResponse().setSuccess(true).setData(list); + public RestResponse getStoreList(){ + return storeService.storesTree(); } @ApiOperation("切换门店") @PostMapping("/changeStore") - public RestResponse changeStore(@RequestBody Map map){ - String visitStoreId =map.get("visitStoreId"); + public RestResponse changeStore(@RequestBody Map map){ + Long visitStoreId =map.get("visitStoreId"); //登录用户的访问门店字段修改 - AppUser appUser = SecurityUtils.getAppLoginUser().getAppUser(); - appUserService.update(new UpdateWrapper() - .eq("app_user_id",appUser) - .set("visit_store",visitStoreId)); - //返回新切换的门店信息 - YjStore yjStore= storeService.getById(visitStoreId); - Map m=new HashMap(); - m.put("address",yjStore.getAddress()); - m.put("storeName",yjStore.getStoreName()); - m.put("phone",yjStore.getPhone()); - m.put("banner",yjStore.getBanner()); - m.put("id",yjStore.getId()); - return new RestResponse().setSuccess(true).setData(m); + return storeService.changeStore(visitStoreId); } } diff --git a/ruoyi-admin/src/main/java/com/ruoyi/web/controller/basic/InheritController.java b/ruoyi-admin/src/main/java/com/ruoyi/web/controller/basic/InheritController.java index 62c5b3a..4efc24c 100644 --- a/ruoyi-admin/src/main/java/com/ruoyi/web/controller/basic/InheritController.java +++ b/ruoyi-admin/src/main/java/com/ruoyi/web/controller/basic/InheritController.java @@ -14,6 +14,7 @@ import org.springframework.web.bind.annotation.RestController; import javax.annotation.Resource; import java.util.List; +import java.util.Map; /** * 瑜伽传承 @@ -28,15 +29,16 @@ public class InheritController { /** * 瑜伽传承 列表 - * @param inherit + * @param visitStore * @return */ @ApiOperation(value = "获取瑜伽传承列表") @PostMapping("/getList") - public RestResponse getList(@RequestBody YjInherit inherit){ + public RestResponse getList(@RequestBody Map map){ + Long visitStore=Long.parseLong(map.get("visitStore").toString()); List list= inheritService.list(new QueryWrapper() .select("id,title,image,read_num,start_time") - .eq("visit_store",inherit.getVisitStore()) + .eq("dept_id",visitStore) .eq("status",true) .orderByDesc("modify_time")); return new RestResponse().setSuccess(true).setMessage("成功").setData(list); diff --git a/ruoyi-admin/src/main/java/com/ruoyi/web/controller/basic/MyController.java b/ruoyi-admin/src/main/java/com/ruoyi/web/controller/basic/MyController.java new file mode 100644 index 0000000..48650be --- /dev/null +++ b/ruoyi-admin/src/main/java/com/ruoyi/web/controller/basic/MyController.java @@ -0,0 +1,246 @@ +package com.ruoyi.web.controller.basic; + +import cn.hutool.core.util.ArrayUtil; +import cn.hutool.core.util.ObjectUtil; +import cn.hutool.core.util.StrUtil; +import com.ruoyi.RestResponse; +import com.ruoyi.basic.service.YjAppUserService; +import com.ruoyi.common.core.controller.BaseController; +import com.ruoyi.common.core.domain.entity.AppUser; +import com.ruoyi.common.utils.SecurityUtils; +import com.ruoyi.course.domain.req.ReqSearchClaTime; +import com.ruoyi.course.domain.time.RespBusinessClaTimeCalendar; +import com.ruoyi.course.service.ScClaTimeService; +import com.ruoyi.im.service.FileService; +import com.sun.org.apache.regexp.internal.RE; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.web.bind.annotation.*; +import org.springframework.web.multipart.MultipartFile; + +import java.util.Map; + + +@RestController +@RequestMapping("/api/my") +public class MyController extends BaseController { + + + @Autowired + private ScClaTimeService scClaTimeService; + + @Autowired + private YjAppUserService appUserService; + + @Autowired + private FileService fileService; + + @GetMapping("/myInformation") + public RestResponse myInformation(){ + AppUser user= appUserService.getById(SecurityUtils.getAppLoginUser().getAppUserId()); + return new RestResponse().setSuccess(true).setData(user); + } + + //上传头像 + @PostMapping("/avatarUpload") + public RestResponse avatarUpload(@RequestParam("file") MultipartFile file, + @RequestParam(defaultValue = "true") Boolean isPermanent){ + String url= fileService.uploadImage(file,"app_avatar",isPermanent).getOriginUrl(); + return new RestResponse().setSuccess(true).setData(url); + } + @PostMapping("/modifyMyInformation") + public RestResponse modifyMyInformation(@RequestBody AppUser user){ + AppUser dbUser= appUserService.getById(SecurityUtils.getAppLoginUser().getAppUserId()); + AppUser modifyUser=new AppUser(); + modifyUser.setId(dbUser.getId()); + if (StrUtil.isNotEmpty(user.getPassword()) + &&SecurityUtils.matchesPassword(user.getPassword(),dbUser.getPassword())){ + modifyUser.setPassword(SecurityUtils.encryptPassword(user.getNewPassword())); + return new RestResponse().setSuccess(appUserService.updateById(modifyUser)); + } + modifyUser.setSex(user.getSex()); + modifyUser.setAvatar(user.getAvatar()); + modifyUser.setNickName(user.getNickName()); + modifyUser.setSignature(user.getSignature()); + appUserService.updateById(modifyUser); + return new RestResponse().setSuccess(true).setData(modifyUser); + } + + /** + * 我的课表-教练 + * @return + */ + @GetMapping("/getCourseList") + public RestResponse getCourseList(){ + Long[] roleId=SecurityUtils.getAppLoginUser().getRoles(); + //104 教师 105店长 103 会籍顾问 + if (!ArrayUtil.containsAny(roleId,104l)){ + return new RestResponse().setSuccess(false).setMessage("当前登录人无权限!"); + } + Long teacherId=SecurityUtils.getAppLoginUser().getManageAccountId(); + ReqSearchClaTime reqSearchClaTime=new ReqSearchClaTime(); + reqSearchClaTime.setTeacherId(teacherId);//teacherId + + RespBusinessClaTimeCalendar c =scClaTimeService.searchListForCalendar(reqSearchClaTime); + return new RestResponse().setSuccess(true).setMessage("成功").setData(c); + } + + /** + * 课程详情(教练) + * @param map + * @return + */ + @PostMapping("/courseTimeDetail") + public RestResponse courseTimeDetail(@RequestBody Map map){ + Long courseTimeId=(Long)map.get("courseTimeId"); + return scClaTimeService.courseTimeDetail(courseTimeId); + } + + /** + * 学员预约列表(教师) + * @param + * @return + */ + @GetMapping("/appointmentListForTeacher") + public RestResponse appointmentListForTeacher(){ + + return scClaTimeService.appointmentListForTeacher(); + } + /** + * 学员预约列表(店长) + * @param + * @return + */ + @GetMapping("/appointmentListForManager") + public RestResponse appointmentListForManager(){ + + return scClaTimeService.appointmentListForManager(); + } + + /** + * 确认/拒绝某个学员的 预约(教师/店长) + * bookId 预约id + * bookStatus 1->教练确认;2->店长确认/预约成功/待上课 5- >预约失败 + * @param map + * @return + */ + @PostMapping("/checkAppointment") + public RestResponse checkAppointment(@RequestBody Map map){ + Long courseTimeId=Long.parseLong(map.get("bookId").toString()); + int bookStatus=Integer.parseInt(map.get("bookStatus").toString()); + return scClaTimeService.checkAppointment(courseTimeId,bookStatus); + } + + + /** + * 确认上课(不消课) + * @param map courseTimeId + * startTime 实际上课时间//HH:mm:ss 24小时制 + * endTime 实际下课时间 //HH:mm:ss 24小时制 + * @return + */ + @PostMapping("/confirmClass") + public RestResponse confirmClass(@RequestBody Map map){ + Long courseTimeId=(Long)map.get("courseTimeId"); + String startTime=map.get("startTime").toString();//HH:mm:ss + String endTime=map.get("endTime").toString();//HH:mm:ss + if (StrUtil.hasEmpty(startTime,endTime)){ + throw new RuntimeException("请输入具体上下课时间!"); + } + return scClaTimeService.confirmClass(courseTimeId,startTime,endTime); + } + + /** + * 学员签到(消课) + * @param map code bookId + * @return + */ + @PostMapping("/checkIn") + public RestResponse checkIn(@RequestBody Map map){ + return scClaTimeService.checkIn(map); + } + + + /** + * 教练课时统计 今日 昨日 本月 上月 + * @param + * @return + * today + * yesterday + * thisMonth + * lastMonth + */ + @PostMapping("/teacherClaTotal") + public RestResponse teacherClaTotal(@RequestBody Map map){ + String time=map.get("time").toString(); + return scClaTimeService.teacherClaTotal(time); + } + + /** + * 教练费用统计 今日 昨日 本月 上月 + * @param + * @return + * today + * yesterday + * thisMonth + * lastMonth + */ + @PostMapping("/teacherFeeTotal") + public RestResponse teacherFeeTotal(@RequestBody Map map){ + String time=map.get("time").toString(); + return scClaTimeService.teacherFeeTotal(time); + } + + /** + * 课程顾问-我的客户 报课的客户 + * @return + */ + @GetMapping("/myClient") + public RestResponse myClient(){ + return scClaTimeService.myClient(); + } + + /** + * 提成统计(销售/课程顾问) 今日 昨日 本月 上月 + * @param + * @return + * today + * thisMonth + * lastMonth + */ + @PostMapping("/commissionTotal") + public RestResponse commissionTotal(@RequestBody Map map){ + String time=map.get("time").toString(); + return scClaTimeService.commissionTotal(time); + } + + /** + * 销售信息(店长) 今日 昨日 本月 上月 + * @param + * @return + * today + * yesterday + * thisMonth + * lastMonth + */ + @PostMapping("/salesInformation") + public RestResponse salesInformation(@RequestBody Map map){ + String time=map.get("time").toString(); + return scClaTimeService.salesInformation(time); + } + + /** + * 场地费用(店长) 今日 昨日 本月 上月 + * @param + * @return + * today + * thisMonth + * lastMonth + */ + @PostMapping("/claRoomFee") + public RestResponse claRoomFee(@RequestBody Map map){ + String time=map.get("time").toString(); + return scClaTimeService.claRoomFee(time); + } + + +} diff --git a/ruoyi-admin/src/main/java/com/ruoyi/web/controller/basic/PracticeMomentsController.java b/ruoyi-admin/src/main/java/com/ruoyi/web/controller/basic/PracticeMomentsController.java index 4977b1b..9f1da6d 100644 --- a/ruoyi-admin/src/main/java/com/ruoyi/web/controller/basic/PracticeMomentsController.java +++ b/ruoyi-admin/src/main/java/com/ruoyi/web/controller/basic/PracticeMomentsController.java @@ -1,7 +1,9 @@ package com.ruoyi.web.controller.basic; import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; +import com.baomidou.mybatisplus.core.conditions.update.UpdateWrapper; import com.ruoyi.RestResponse; +import com.ruoyi.basic.domain.YjInherit; import com.ruoyi.basic.domain.YjPracticeMoments; import com.ruoyi.basic.service.impl.YjPracticeMomentsServiceImpl; import io.swagger.annotations.Api; @@ -13,6 +15,7 @@ import org.springframework.web.bind.annotation.RestController; import javax.annotation.Resource; import java.util.List; +import java.util.Map; /** * 练习瞬间 @@ -27,15 +30,16 @@ public class PracticeMomentsController { /** * 练习瞬间列表 - * @param moments + * @param visitStore * @return */ @ApiOperation(value = "获取练习瞬间列表") @PostMapping("/getList") - public RestResponse getList(@RequestBody YjPracticeMoments moments){ + public RestResponse getList(@RequestBody Map map){ + Long visitStore=Long.parseLong(map.get("visitStore").toString()); List list=momentsService.list(new QueryWrapper() .select("id,title,image,read_num,start_time") - .eq("visit_store",moments.getVisitStore()) + .eq("dept_id",visitStore) .eq("status",true) .orderByDesc("modify_time")); return new RestResponse().setSuccess(true).setMessage("成功").setData(list); @@ -49,6 +53,9 @@ public class PracticeMomentsController { @ApiOperation(value = "获取练习瞬间详情") @PostMapping("/getOne") public RestResponse getOne(@RequestBody YjPracticeMoments moments){ + momentsService.update(new UpdateWrapper() + .setSql("read_num=read_num+1") + .eq("id",moments.getId()));//阅读量 YjPracticeMoments m=momentsService.getOne(new QueryWrapper() .eq("id",moments.getId())); return new RestResponse().setSuccess(true).setMessage("成功").setData(m); diff --git a/ruoyi-admin/src/main/java/com/ruoyi/web/controller/basic/SenseController.java b/ruoyi-admin/src/main/java/com/ruoyi/web/controller/basic/SenseController.java index b8c27d3..b53d167 100644 --- a/ruoyi-admin/src/main/java/com/ruoyi/web/controller/basic/SenseController.java +++ b/ruoyi-admin/src/main/java/com/ruoyi/web/controller/basic/SenseController.java @@ -14,6 +14,7 @@ import org.springframework.web.bind.annotation.RestController; import javax.annotation.Resource; import java.util.List; +import java.util.Map; /** * 瑜伽常识 @@ -27,15 +28,16 @@ public class SenseController { /** * 瑜伽常识 列表 - * @param sense + * @param visitStore * @return */ @ApiOperation(value = "获取瑜伽常识列表") @PostMapping("/getList") - public RestResponse getList(@RequestBody YjSense sense){ + public RestResponse getList(@RequestBody Map map){ + Long visitStore=Long.parseLong(map.get("visitStore").toString()); List list= service.list(new QueryWrapper() .select("id,title,image,read_num,start_time") - .eq("visit_store",sense.getVisitStore()) + .eq("dept_id",visitStore) .eq("status",true) .orderByDesc("modify_time")); return new RestResponse().setSuccess(true).setMessage("成功").setData(list); diff --git a/ruoyi-admin/src/main/java/com/ruoyi/web/controller/basic/StoreController.java b/ruoyi-admin/src/main/java/com/ruoyi/web/controller/basic/StoreController.java index f0eae7f..e250ead 100644 --- a/ruoyi-admin/src/main/java/com/ruoyi/web/controller/basic/StoreController.java +++ b/ruoyi-admin/src/main/java/com/ruoyi/web/controller/basic/StoreController.java @@ -3,7 +3,10 @@ package com.ruoyi.web.controller.basic; import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; import com.ruoyi.RestResponse; import com.ruoyi.basic.domain.YjStore; +import com.ruoyi.basic.service.YjStoreService; import com.ruoyi.basic.service.impl.YjStoreServiceImpl; +import com.ruoyi.system.domain.SysTeacher; +import com.ruoyi.system.service.SysTeacherService; import io.swagger.annotations.Api; import io.swagger.annotations.ApiOperation; import org.springframework.web.bind.annotation.PostMapping; @@ -12,6 +15,9 @@ import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RestController; import javax.annotation.Resource; +import java.util.ArrayList; +import java.util.HashMap; +import java.util.List; import java.util.Map; /** @@ -23,7 +29,10 @@ import java.util.Map; public class StoreController { @Resource - private YjStoreServiceImpl merchantService; + private YjStoreService storeService; + + @Resource + private SysTeacherService teacherService; /** * 企业简介+门店列表 * @param map @@ -32,10 +41,22 @@ public class StoreController { @ApiOperation(value = "创始人+企业简介+门店列表") @PostMapping("/getList") public RestResponse getList(@RequestBody Map map){ - YjStore m=merchantService.getOne(new QueryWrapper() - .select("id,enterprise_name,address,phone,founder,profile") - .eq("id",map.get("visitStore"))); - return new RestResponse().setSuccess(true).setMessage("成功").setData(m); + Map map1=new HashMap(); + YjStore store=storeService.getOne(Long.parseLong(map.get("visitStore").toString())); + String tenantId=store.getTenantId(); + List list= storeService.getStoreListByTenantId(tenantId); + List list1=new ArrayList<>(); + list.forEach(l->{ + if (l.getParentId()==0l){ + l.setStoreName(l.getStoreName()+"(总店)"); + } + list1.add(l); + + }); + map1.put("companyIntroduction",store); + map1.put("storeList",list1); + + return new RestResponse().setSuccess(true).setMessage("成功").setData(map1); } diff --git a/ruoyi-admin/src/main/java/com/ruoyi/web/controller/basic/dto/AppLoginUser.java b/ruoyi-admin/src/main/java/com/ruoyi/web/controller/basic/dto/AppLoginUserForGetInfor.java similarity index 83% rename from ruoyi-admin/src/main/java/com/ruoyi/web/controller/basic/dto/AppLoginUser.java rename to ruoyi-admin/src/main/java/com/ruoyi/web/controller/basic/dto/AppLoginUserForGetInfor.java index 0f82022..727f80e 100644 --- a/ruoyi-admin/src/main/java/com/ruoyi/web/controller/basic/dto/AppLoginUser.java +++ b/ruoyi-admin/src/main/java/com/ruoyi/web/controller/basic/dto/AppLoginUserForGetInfor.java @@ -8,7 +8,7 @@ import lombok.Data; @ApiModel(value = "AppLoginUser", description = "app登录用户信息") @Data -public class AppLoginUser +public class AppLoginUserForGetInfor { private static final long serialVersionUID = 1L; @@ -38,9 +38,9 @@ public class AppLoginUser private String phonenumber; /** 用户性别 */ - @ApiModelProperty("用户性别;0=男,1=女,2=未知") - @Excel(name = "用户性别", readConverterExp = "0=男,1=女,2=未知") - private String sex; + @ApiModelProperty("性别:0->未知;1->女;2->男") + @Excel(name = "用户性别", readConverterExp = "0->未知;1->女;2->男") + private Integer sex; /** 用户头像 */ @ApiModelProperty("用户头像") @@ -48,15 +48,15 @@ public class AppLoginUser /** 角色ID */ @ApiModelProperty("角色ID;顾问:103 ;教练:104 ;店长:105 ;普通用户:107;") - private Long roleId; + private Long[] roleId; /** 所属门店id */ @ApiModelProperty("所属门店id") - private String venId; + private Long venId; @ApiModelProperty("设备id") private String registerId; @ApiModelProperty("访问/浏览门店id") - private String visitStore; + private Long visitStore; } diff --git a/ruoyi-admin/src/main/java/com/ruoyi/web/controller/course/CourseController.java b/ruoyi-admin/src/main/java/com/ruoyi/web/controller/course/CourseController.java index ad7687e..e0ff6a9 100644 --- a/ruoyi-admin/src/main/java/com/ruoyi/web/controller/course/CourseController.java +++ b/ruoyi-admin/src/main/java/com/ruoyi/web/controller/course/CourseController.java @@ -1,32 +1,95 @@ package com.ruoyi.web.controller.course; +import cn.hutool.core.date.DateUtil; import com.ruoyi.RestResponse; import com.ruoyi.common.core.controller.BaseController; +import com.ruoyi.common.utils.SecurityUtils; +import com.ruoyi.course.domain.req.ReqSearchClaTime; +import com.ruoyi.course.domain.time.RespBusinessClaTimeCalendar; +import com.ruoyi.course.service.ScClaTimeService; import io.swagger.annotations.Api; -import io.swagger.annotations.ApiOperation; -import org.springframework.web.bind.annotation.PostMapping; -import org.springframework.web.bind.annotation.RequestBody; -import org.springframework.web.bind.annotation.RequestMapping; -import org.springframework.web.bind.annotation.RestController; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.web.bind.annotation.*; +import java.util.Date; import java.util.Map; -@Api(tags = "040-教练", description = "获取商品及课程分类") + @RestController -@RequestMapping("/api/course/category") +@RequestMapping("/api/course") public class CourseController extends BaseController { -// @Autowired -// ContextServicelmpl contextService; -// @Autowired -// SysUserServiceImpl userService; - - @ApiOperation("商品及课程类型列表") - @PostMapping(value = "/getList") - public RestResponse findList(@RequestBody Map params) { -// List list =contextService.getList(params); - return new RestResponse().setSuccess(true).setMessage("成功"); + + + @Autowired + private ScClaTimeService scClaTimeService; + + + /** + * 我的课表-学员 + * @return + */ + @GetMapping("/getCourseList") + public RestResponse getCourseList(){ + ReqSearchClaTime reqSearchClaTime=new ReqSearchClaTime(); + RespBusinessClaTimeCalendar c =scClaTimeService.searchListForCalendar(reqSearchClaTime); + return new RestResponse().setSuccess(true).setMessage("成功").setData(c); + } + + /** + * 我的课表 + * @return + */ + @PostMapping("/getCourseListByDate") + public RestResponse getCourseListByDate(@RequestBody Map map){ + String dateStr= map.get("date").toString(); +// Date date= DateUtil.parse(dateStr,"yyyy-MM-dd"); + return scClaTimeService.getCourseListByDate(dateStr); + + } + + /** + * 预约课程 + * @param searchClaTime + * @return + */ + @PostMapping("/bookCourse") + public RestResponse bookCourse(@RequestBody ReqSearchClaTime searchClaTime){ + + return scClaTimeService.bookCourse(searchClaTime); } + /** + * 我的预约 + * @param + * @return + */ + @GetMapping("/bookCourseList") + public RestResponse bookCourseList(){ + return new RestResponse().setData(scClaTimeService.bookCourseList()); + } + + /** + * 预约详情 + * @param map + * @return + */ + @PostMapping("/bookCourseDetail") + public RestResponse bookCourseDetail(@RequestBody Map map){ + Long bookId =Long.parseLong(map.get("bookId").toString()); + return scClaTimeService.bookCourseDetail(bookId); + } + + /** + * 取消预约 + * @return + */ + @PostMapping("/cancelCourse") + public RestResponse cancelCourse(@RequestBody Map map){ + Long courseTimeId =(Long)map.get("courseTimeId"); + return scClaTimeService.cancelCourse(courseTimeId); + } + + } diff --git a/ruoyi-admin/src/main/java/com/ruoyi/web/controller/im/FileController.java b/ruoyi-admin/src/main/java/com/ruoyi/web/controller/im/FileController.java index 8b1b520..c5de620 100644 --- a/ruoyi-admin/src/main/java/com/ruoyi/web/controller/im/FileController.java +++ b/ruoyi-admin/src/main/java/com/ruoyi/web/controller/im/FileController.java @@ -28,7 +28,7 @@ public class FileController { @PostMapping("/image/upload") public Result uploadImage(@RequestParam("file") MultipartFile file, @RequestParam(defaultValue = "true") Boolean isPermanent) { - return ResultUtils.success(fileService.uploadImage(file,isPermanent)); + return ResultUtils.success(fileService.uploadImage(file,"im",isPermanent)); } @Operation(summary = "上传文件", description = "上传文件,上传后返回文件url") @@ -37,4 +37,4 @@ public class FileController { return ResultUtils.success(fileService.uploadFile(file), Strings.EMPTY); } -} \ No newline at end of file +} diff --git a/ruoyi-admin/src/main/java/com/ruoyi/web/controller/im/FriendController.java b/ruoyi-admin/src/main/java/com/ruoyi/web/controller/im/FriendController.java index ebcd8e7..0e63e2a 100644 --- a/ruoyi-admin/src/main/java/com/ruoyi/web/controller/im/FriendController.java +++ b/ruoyi-admin/src/main/java/com/ruoyi/web/controller/im/FriendController.java @@ -15,6 +15,7 @@ import org.springframework.web.bind.annotation.*; import javax.validation.constraints.NotNull; import java.util.List; +import java.util.Map; @RestController @@ -26,11 +27,11 @@ public class FriendController { private final YjAppUserService appUserService; @GetMapping("/list") @Operation(summary = "好友列表", description = "获取好友列表") - public Result> findFriends() { - return ResultUtils.success(friendService.findFriends()); + public Result findFriends() { + return ResultUtils.success(friendService.findAllFriends()); } - @GetMapping("/find/{phonenumber}") +// @GetMapping("/find/{phonenumber}") @Operation(summary = "查找用户", description = "根据电话查找用户") public Result findById(@NotNull @PathVariable("phonenumber") String phonenumber) { //权限:课程顾问 店长 教练 查询客户信息 diff --git a/ruoyi-admin/src/main/java/com/ruoyi/web/controller/im/GroupController.java b/ruoyi-admin/src/main/java/com/ruoyi/web/controller/im/GroupController.java new file mode 100644 index 0000000..cc45975 --- /dev/null +++ b/ruoyi-admin/src/main/java/com/ruoyi/web/controller/im/GroupController.java @@ -0,0 +1,47 @@ +package com.ruoyi.web.controller.im; + +import com.ruoyi.common.annotation.RepeatSubmit; +import com.ruoyi.im.domain.vo.GroupVO; +import com.ruoyi.im.service.GroupService; +import com.ruoyi.web.controller.im.result.Result; +import com.ruoyi.web.controller.im.result.ResultUtils; +import io.swagger.v3.oas.annotations.Operation; +import io.swagger.v3.oas.annotations.tags.Tag; +import lombok.RequiredArgsConstructor; +import org.springframework.web.bind.annotation.*; + +import javax.validation.Valid; +import javax.validation.constraints.NotNull; +import java.util.List; + +@Tag(name = "群聊") +@RestController +@RequestMapping("/api/group") +@RequiredArgsConstructor +public class GroupController { + + private final GroupService groupService; + + @RepeatSubmit + @Operation(summary = "创建群聊", description = "创建群聊") + @PostMapping("/create") + public Result createGroup(@Valid @RequestBody GroupVO vo) { + return ResultUtils.success(groupService.createGroup(vo)); + } + + + @Operation(summary = "查询群聊", description = "查询单个群聊信息") + @GetMapping("/find/{groupId}") + public Result findGroup(@NotNull(message = "群聊id不能为空") @PathVariable Long groupId) { + return ResultUtils.success(groupService.findById(groupId)); + } + + @Operation(summary = "查询群聊列表", description = "查询群聊列表") + @GetMapping("/list") + public Result> findGroups() { + return ResultUtils.success(groupService.findGroups()); + } + + +} + diff --git a/ruoyi-admin/src/main/java/com/ruoyi/web/controller/im/GroupMessageController.java b/ruoyi-admin/src/main/java/com/ruoyi/web/controller/im/GroupMessageController.java new file mode 100644 index 0000000..bb28ee3 --- /dev/null +++ b/ruoyi-admin/src/main/java/com/ruoyi/web/controller/im/GroupMessageController.java @@ -0,0 +1,67 @@ +package com.ruoyi.web.controller.im; + +import com.ruoyi.im.domain.dto.GroupMessageDTO; +import com.ruoyi.im.domain.vo.GroupMessageVO; +import com.ruoyi.im.service.GroupMessageService; + +import com.ruoyi.web.controller.im.result.Result; +import com.ruoyi.web.controller.im.result.ResultUtils; +import io.swagger.v3.oas.annotations.Operation; +import io.swagger.v3.oas.annotations.tags.Tag; +import lombok.RequiredArgsConstructor; +import org.springframework.web.bind.annotation.*; + +import javax.validation.Valid; +import javax.validation.constraints.NotNull; +import java.util.List; + +@Tag(name = "群聊消息") +@RestController +@RequestMapping("/api/message/group") +@RequiredArgsConstructor +public class GroupMessageController { + + private final GroupMessageService groupMessageService; + + @PostMapping("/send") + @Operation(summary = "发送群聊消息", description = "发送群聊消息") + public Result sendMessage(@Valid @RequestBody GroupMessageDTO vo) { + return ResultUtils.success(groupMessageService.sendMessage(vo)); + } + + @GetMapping("/maxReadedId") + @Operation(summary = "获取最大已读消息的id", description = "获取某个会话中已读消息的最大id") + public Result getMaxReadedId(@RequestParam Long groupId) { + return ResultUtils.success(groupMessageService.getMaxReadedId(groupId),"成功"); + } + + @GetMapping("/pullOfflineMessage") + @Operation(summary = "拉取离线消息", description = "拉取离线消息,消息将通过webscoket异步推送") + public Result pullOfflineMessage(@RequestParam Long minId) { + groupMessageService.pullOfflineMessage(minId); + return ResultUtils.success(); + } + + @PutMapping("/readed") + @Operation(summary = "消息已读", description = "将群聊中的消息状态置为已读") + public Result readedMessage(@RequestParam Long groupId) { + groupMessageService.readedMessage(groupId); + return ResultUtils.success(); + } + + @GetMapping("/findReadedUsers") + @Operation(summary = "获取已读用户id", description = "获取消息已读用户列表") + public Result> findReadedUsers(@RequestParam Long groupId, + @RequestParam Long messageId) { + return ResultUtils.success(groupMessageService.findReadedUsers(groupId, messageId)); + } + + @GetMapping("/history") + @Operation(summary = "查询聊天记录", description = "查询聊天记录") + public Result> recallMessage(@NotNull(message = "群聊id不能为空") @RequestParam Long groupId, + @NotNull(message = "页码不能为空") @RequestParam Long page, + @NotNull(message = "size不能为空") @RequestParam Long size) { + return ResultUtils.success(groupMessageService.findHistoryMessage(groupId, page, size)); + } +} + diff --git a/ruoyi-admin/src/main/java/com/ruoyi/web/controller/im/PrivateMessageController.java b/ruoyi-admin/src/main/java/com/ruoyi/web/controller/im/PrivateMessageController.java index 7b58497..d9fdb9b 100644 --- a/ruoyi-admin/src/main/java/com/ruoyi/web/controller/im/PrivateMessageController.java +++ b/ruoyi-admin/src/main/java/com/ruoyi/web/controller/im/PrivateMessageController.java @@ -1,11 +1,17 @@ package com.ruoyi.web.controller.im; +import com.ruoyi.im.domain.Friend; import com.ruoyi.im.domain.dto.PrivateMessageDTO; import com.ruoyi.im.domain.vo.FriendVO; import com.ruoyi.im.domain.vo.PrivateMessageVO; import com.ruoyi.im.service.FriendService; import com.ruoyi.im.service.PrivateMessageService; +import com.ruoyi.mall.domain.Product; +import com.ruoyi.mall.domain.order.OrderItem; +import com.ruoyi.mall.service.ProductService; +import com.ruoyi.mall.service.impl.OrderItemService; +import com.ruoyi.mall.service.impl.OrderService; import com.ruoyi.web.controller.im.result.Result; import com.ruoyi.web.controller.im.result.ResultUtils; import io.swagger.annotations.ApiOperation; @@ -21,6 +27,7 @@ import javax.validation.Valid; import javax.validation.constraints.NotNull; import java.io.IOException; import java.util.List; +import java.util.Map; @Tag(name = "私聊消息") @RestController @@ -30,6 +37,11 @@ public class PrivateMessageController { private final PrivateMessageService privateMessageService; + private final ProductService productService; + + private final OrderService orderService; + private final OrderItemService orderItemService; + @PostMapping("/send") @Operation(summary = "发送消息", description = "发送私聊消息") public Result sendMessage(@Valid @RequestBody PrivateMessageDTO vo) { @@ -54,6 +66,8 @@ public class PrivateMessageController { privateMessageService.readedMessage(friendId); return ResultUtils.success(); } + + @GetMapping("/maxReadedId") @Operation(summary = "获取最大已读消息的id", description = "获取某个会话中已读消息的最大id") public Result getMaxReadedId(@RequestParam Long friendId) { @@ -69,5 +83,25 @@ public class PrivateMessageController { return ResultUtils.success(privateMessageService.findHistoryMessage(friendId, page, size)); } +// 选择咨询商品/订单 + @PostMapping("/getConsultProduct") + public Result getConsultProduct(@RequestBody Friend friend) { + Long storeId= friend.getStoreId(); + return ResultUtils.success(privateMessageService.getConsultProduct(storeId)); + } + + //商品信息 + @PostMapping("/getProductForIm") + public Result getProduct(@RequestBody Map map) { + Long productId= Long.parseLong(map.get("productId").toString()); + return ResultUtils.success(productService.getById(productId)); + } + //订单信息 + @PostMapping("/getOrderForIm") + public Result getOrder(@RequestBody Map map) { + Long orderItemId= Long.parseLong(map.get("orderItemId").toString()); + return ResultUtils.success(orderItemService.getById(orderItemId)); + } + } diff --git a/ruoyi-admin/src/main/java/com/ruoyi/web/controller/im/SystemController.java b/ruoyi-admin/src/main/java/com/ruoyi/web/controller/im/SystemController.java index c2496df..31112aa 100644 --- a/ruoyi-admin/src/main/java/com/ruoyi/web/controller/im/SystemController.java +++ b/ruoyi-admin/src/main/java/com/ruoyi/web/controller/im/SystemController.java @@ -11,11 +11,7 @@ import org.springframework.web.bind.annotation.GetMapping; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RestController; import com.ruoyi.web.controller.im.result.Result; -/** - * @author: blue - * @date: 2024-06-10 - * @version: 1.0 - */ + @Tag(name = "系统相关") @RestController @RequestMapping("/system") diff --git a/ruoyi-admin/src/main/java/com/ruoyi/web/controller/login/AppLoginController.java b/ruoyi-admin/src/main/java/com/ruoyi/web/controller/login/AppLoginController.java index 36dec11..f76a72a 100644 --- a/ruoyi-admin/src/main/java/com/ruoyi/web/controller/login/AppLoginController.java +++ b/ruoyi-admin/src/main/java/com/ruoyi/web/controller/login/AppLoginController.java @@ -1,36 +1,33 @@ package com.ruoyi.web.controller.login; import cn.hutool.core.util.ObjectUtil; -import cn.hutool.core.util.StrUtil; -import com.alibaba.fastjson2.JSON; +import com.ruoyi.common.core.domain.entity.SysUser; +import com.ruoyi.common.im.util.BeanUtils; import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; -import com.ruoyi.basic.domain.dto.StoreDto; +import com.ruoyi.RestResponse; import com.ruoyi.basic.mapper.YjStoreMapper; import com.ruoyi.basic.service.impl.YjAppUserServiceImpl; -import com.ruoyi.common.constant.CacheConstants; import com.ruoyi.common.constant.Constants; import com.ruoyi.common.core.domain.AjaxResult; import com.ruoyi.common.core.domain.entity.AppUser; -import com.ruoyi.common.core.domain.entity.SysUser; +import com.ruoyi.common.core.domain.model.AppLoginUser; import com.ruoyi.common.core.domain.model.AppUserLoginBody; import com.ruoyi.common.utils.SecurityUtils; import com.ruoyi.framework.web.service.AppLoginService; import com.ruoyi.basic.domain.YjStore; import com.ruoyi.basic.service.impl.YjStoreServiceImpl; -import com.ruoyi.mall.util.PayConstants; +import com.ruoyi.framework.web.service.SysPermissionService; +import com.ruoyi.web.controller.basic.dto.AppLoginUserForGetInfor; import io.swagger.annotations.Api; import io.swagger.annotations.ApiOperation; -import okhttp3.OkHttpClient; -import okhttp3.Request; -import okhttp3.Response; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.web.bind.annotation.*; import javax.annotation.Resource; -import java.io.IOException; import java.util.HashMap; import java.util.List; import java.util.Map; + @Api(tags = "01-登录与验证") @RestController @RequestMapping("/api") @@ -44,7 +41,8 @@ public class AppLoginController { @Autowired private YjStoreMapper storeMapper; - + @Autowired + private SysPermissionService permissionService; /** * 注册 @@ -52,18 +50,22 @@ public class AppLoginController { * @return */ @PostMapping("/register") - public AjaxResult register(@RequestBody AppUserLoginBody loginBody){ + public RestResponse register(@RequestBody AppUserLoginBody loginBody){ + appLoginService.validateCaptcha(loginBody.getCode(), loginBody.getUuid()); + if (!loginBody.getPassword().equals(loginBody.getPasswordSecond())){ + throw new RuntimeException("密码不一致!"); + } + Long haveUser=appUserService.count(new QueryWrapper().eq("phone_number",loginBody.getPhonenumber())); + if (haveUser>0){ + throw new RuntimeException("手机号已被注册!"); + } AppUser appUser=new AppUser(); - appUser.setPhoneNumber("15004070930"); + appUser.setPhoneNumber(loginBody.getPhonenumber()); appUser.setPassword(SecurityUtils.encryptPassword(loginBody.getPassword())); appUser.setStatus(1); - appUser.setVisitStore("14b8471ff004e074e928d795053b4233"); - appUserService.save(appUser); - //todo 默认visitstore - //todo openid - return null; + return new RestResponse().setSuccess(true).setMessage("注册成功!"); } /** @@ -89,26 +91,32 @@ public class AppLoginController { @GetMapping("/getInfo") public AjaxResult getInfo() { - AppUser user = SecurityUtils.getAppLoginUser().getAppUser(); + AppLoginUser user = SecurityUtils.getAppLoginUser(); + AppLoginUserForGetInfor appUser= + BeanUtils.copyProperties(user.getAppUser(),AppLoginUserForGetInfor.class); + appUser.setUserId(user.getAppUserId()); + appUser.setPhonenumber(user.getAppUser().getPhoneNumber()); + // 角色集合 + appUser.setRoleId(user.getRoles()); AjaxResult ajax = AjaxResult.success(); - ajax.put("appLoginUser", user); - ajax.put("visitStore",getIndex(user.getVisitStore())); + ajax.put("appLoginUser", appUser); + ajax.put("visitStore",getIndex(appUser.getVisitStore())); return ajax; } @Resource - private YjStoreServiceImpl merchantService; + private YjStoreServiceImpl storeService; - public Map getIndex(String visitStore){ + public Map getIndex(Long visitStore){ YjStore yjStore; Map m=new HashMap(); - if (StrUtil.isNotEmpty(visitStore)){ - yjStore=merchantService.getById(visitStore); + if (ObjectUtil.isNotEmpty(visitStore)){ + yjStore=storeService.getById(visitStore); }else { - yjStore= merchantService.list().get(0); + yjStore= storeService.list().get(0); } m.put("address",yjStore.getAddress()); m.put("storeName",yjStore.getStoreName()); @@ -129,8 +137,9 @@ public class AppLoginController { public AjaxResult getStoreList(String address) { AjaxResult ajax = AjaxResult.success(); - List dtoList= storeMapper.getListForLogin(); + List dtoList= storeMapper.getStoreList(); dtoList.forEach(l->{ + l.setStoreName(l.getStoreName()+"(总店)"); l.setChildList(storeMapper.getChilds(l.getId())); }); ajax.put("storeList",dtoList); diff --git a/ruoyi-admin/src/main/java/com/ruoyi/web/controller/login/CaptchaController.java b/ruoyi-admin/src/main/java/com/ruoyi/web/controller/login/CaptchaController.java index b7acbbc..b003898 100644 --- a/ruoyi-admin/src/main/java/com/ruoyi/web/controller/login/CaptchaController.java +++ b/ruoyi-admin/src/main/java/com/ruoyi/web/controller/login/CaptchaController.java @@ -2,7 +2,6 @@ package com.ruoyi.web.controller.login; import com.google.code.kaptcha.Producer; import com.ruoyi.basic.domain.YjStore; -import com.ruoyi.basic.domain.dto.StoreDto; import com.ruoyi.basic.mapper.YjStoreMapper; import com.ruoyi.common.config.RuoYiConfig; import com.ruoyi.common.constant.CacheConstants; @@ -74,6 +73,7 @@ public class CaptchaController String capText = captchaProducerMath.createText(); capStr = capText.substring(0, capText.lastIndexOf("@")); code = capText.substring(capText.lastIndexOf("@") + 1); + image = captchaProducerMath.createImage(capStr); } else if ("char".equals(captchaType)) @@ -81,7 +81,6 @@ public class CaptchaController capStr = code = captchaProducer.createText(); image = captchaProducer.createImage(capStr); } - redisCache.setCacheObject(verifyKey, code, Constants.CAPTCHA_EXPIRATION, TimeUnit.MINUTES); // 转换流信息写出 FastByteArrayOutputStream os = new FastByteArrayOutputStream(); diff --git a/ruoyi-admin/src/main/java/com/ruoyi/web/controller/mall/MemberAddressController.java b/ruoyi-admin/src/main/java/com/ruoyi/web/controller/mall/MemberAddressController.java index bc21359..841c609 100644 --- a/ruoyi-admin/src/main/java/com/ruoyi/web/controller/mall/MemberAddressController.java +++ b/ruoyi-admin/src/main/java/com/ruoyi/web/controller/mall/MemberAddressController.java @@ -34,7 +34,7 @@ public class MemberAddressController { @Resource private MemberAddressService service; - @ApiOperation("地址list") + @ApiOperation("全国省市区list") @GetMapping("/addressList") public RestResponse getAddressList(){ return new RestResponse().setSuccess(true).setData(service.getAddressList()); @@ -52,7 +52,7 @@ public class MemberAddressController { } @ApiOperation("收货地址列表") - @PostMapping("/memberAddressList") + @PostMapping("/list") public RestResponse list(){ Long userId= SecurityUtils.getAppLoginUser().getAppUser().getId(); List columns=new ArrayList<>(); diff --git a/ruoyi-admin/src/main/java/com/ruoyi/web/controller/mall/MemberCartController.java b/ruoyi-admin/src/main/java/com/ruoyi/web/controller/mall/MemberCartController.java index c52f79e..2b1b568 100644 --- a/ruoyi-admin/src/main/java/com/ruoyi/web/controller/mall/MemberCartController.java +++ b/ruoyi-admin/src/main/java/com/ruoyi/web/controller/mall/MemberCartController.java @@ -36,7 +36,7 @@ public class MemberCartController { * @return 购物车列表 */ @GetMapping("list") - public ResponseEntity> list() { + public ResponseEntity> list() { MemberCartQuery query = new MemberCartQuery(); query.setMemberId(SecurityUtils.getAppLoginUser().getAppUserId()); return ResponseEntity.ok(memberCartService.selectList(query, null)); diff --git a/ruoyi-admin/src/main/java/com/ruoyi/web/controller/mall/OrderController.java b/ruoyi-admin/src/main/java/com/ruoyi/web/controller/mall/OrderController.java index b7c8a24..a762641 100644 --- a/ruoyi-admin/src/main/java/com/ruoyi/web/controller/mall/OrderController.java +++ b/ruoyi-admin/src/main/java/com/ruoyi/web/controller/mall/OrderController.java @@ -23,6 +23,7 @@ import org.springframework.http.ResponseEntity; import org.springframework.web.bind.annotation.*; import javax.validation.Valid; +import java.util.Map; @RestController @RequestMapping("/api/order") @@ -37,7 +38,7 @@ public class OrderController { @ApiOperation("下单") @PostMapping("/add") - public ResponseEntity submit(@RequestBody OrderSubmitForm form) { + public ResponseEntity submit(@RequestBody OrderSubmitForm form) { Long memberId = SecurityUtils.getAppLoginUser().getAppUserId(); String redisKey = "app_order_add" + memberId; String redisValue = memberId + "_" + System.currentTimeMillis(); diff --git a/ruoyi-admin/src/main/java/com/ruoyi/web/controller/mall/PayNotifyController.java b/ruoyi-admin/src/main/java/com/ruoyi/web/controller/mall/PayNotifyController.java index 11577eb..ecd1ee1 100644 --- a/ruoyi-admin/src/main/java/com/ruoyi/web/controller/mall/PayNotifyController.java +++ b/ruoyi-admin/src/main/java/com/ruoyi/web/controller/mall/PayNotifyController.java @@ -91,13 +91,13 @@ public class PayNotifyController { PayNotifyMessageDTO message = new PayNotifyMessageDTO(); message.setOutTradeNo(Long.valueOf(transaction.getOutTradeNo())); message.setMemberId(Long.valueOf(transaction.getAttach())); - message.setTradeStatus(transaction.getTradeState()); + message.setTradeStatus(transaction.getTradeState().toString()); if (StrUtil.isEmpty(transaction.getSuccessTime())){ throw new RuntimeException("微信支付回调失败"); } message.setPayTime(formatter.parse(transaction.getSuccessTime().substring(0, transaction.getSuccessTime().indexOf("+")))); message.setTradeNo(transaction.getTransactionId()); -// OrderService.payCallBack(message); + OrderService.payCallBack(message); } diff --git a/ruoyi-admin/src/main/java/com/ruoyi/web/controller/mall/ProductController.java b/ruoyi-admin/src/main/java/com/ruoyi/web/controller/mall/ProductController.java index 0b94721..49364e3 100644 --- a/ruoyi-admin/src/main/java/com/ruoyi/web/controller/mall/ProductController.java +++ b/ruoyi-admin/src/main/java/com/ruoyi/web/controller/mall/ProductController.java @@ -2,20 +2,16 @@ package com.ruoyi.web.controller.mall; import cn.hutool.core.bean.BeanUtil; -import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; -import com.baomidou.mybatisplus.core.conditions.update.UpdateWrapper; import com.ruoyi.RestResponse; -import com.ruoyi.common.utils.SecurityUtils; -import com.ruoyi.mall.domain.MemberAddress; +import com.ruoyi.course.domain.req.ReqSearchClaTime; +import com.ruoyi.course.domain.time.RespBusinessClaTimeCalendar; +import com.ruoyi.course.service.ScClaTimeService; import com.ruoyi.mall.domain.Product; import com.ruoyi.mall.domain.query.ProductQuery; import com.ruoyi.mall.domain.vo.AppProductVO; import com.ruoyi.mall.domain.vo.ProductDetailVO; -import com.ruoyi.mall.domain.vo.ProductVO; -import com.ruoyi.mall.mapper.MemberAddressMapper; -import com.ruoyi.mall.service.MemberAddressService; import com.ruoyi.mall.service.ProductCategoryService; -import com.ruoyi.mall.service.impl.ProductService; +import com.ruoyi.mall.service.impl.ProductServiceImpl; import io.swagger.annotations.Api; import io.swagger.annotations.ApiOperation; import org.springframework.beans.factory.annotation.Autowired; @@ -25,8 +21,7 @@ import org.springframework.data.domain.Pageable; import org.springframework.http.ResponseEntity; import org.springframework.web.bind.annotation.*; -import javax.annotation.Resource; -import java.util.ArrayList; +import java.util.HashSet; import java.util.List; import java.util.Map; @@ -46,7 +41,10 @@ public class ProductController { @Autowired private ProductCategoryService categoryService; @Autowired - private ProductService productService; + private ProductServiceImpl productService; + + @Autowired + private ScClaTimeService scClaTimeService; /** * 商品页分类list @@ -81,6 +79,32 @@ public class ProductController { return ResponseEntity.ok(detail); } + /** + * 商品详情-课程表 + * @param id + * @return + */ + @GetMapping("/detail/calendar/{id}") + public ResponseEntity queryDetailCalendar(@PathVariable Long id) { + ReqSearchClaTime reqSearchClaTime=new ReqSearchClaTime(); + HashSet courseIds= new HashSet<>(); + reqSearchClaTime.setCourseId(id); + RespBusinessClaTimeCalendar c =scClaTimeService.searchListForCalendar(reqSearchClaTime); + return ResponseEntity.ok(c); + } + + /** + * + * 达人好物及精品课程 + * @return + */ + @PostMapping("/getGoodStuff") + public ResponseEntity getGoodStuff(@RequestBody Map map) { + Map map1 = productService.selectByGoodStuff(map.get("storeId").toString()); + return ResponseEntity.ok(map1); + } + + } diff --git a/ruoyi-admin/src/main/java/com/ruoyi/web/controller/mall/UserFavoriteController.java b/ruoyi-admin/src/main/java/com/ruoyi/web/controller/mall/UserFavoriteController.java new file mode 100644 index 0000000..4bf361b --- /dev/null +++ b/ruoyi-admin/src/main/java/com/ruoyi/web/controller/mall/UserFavoriteController.java @@ -0,0 +1,74 @@ +package com.ruoyi.web.controller.mall; + +import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; +import com.ruoyi.RestResponse; +import com.ruoyi.common.utils.SecurityUtils; +import com.ruoyi.mall.domain.UserFavorite; +import com.ruoyi.mall.service.UserFavoriteService; +import io.swagger.annotations.Api; +import io.swagger.annotations.ApiOperation; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.web.bind.annotation.*; + +import java.util.List; +import java.util.Map; + +@Api(tags = "app商品收藏") +@RestController +@RequestMapping("/api/userFavorite") +public class UserFavoriteController { + + @Autowired + private UserFavoriteService service; + + /** + * 商品收藏 + * @return + */ + @ApiOperation("收藏") + @PostMapping("/add") + public RestResponse addFavorite(@RequestBody UserFavorite favorite){ + return new RestResponse().setSuccess(true).setData(service.addFavorite(favorite.getProductId())); + } + + + /** + * 判断商品是否收藏 + * @return + */ + @ApiOperation("判断商品是否收藏") + @PostMapping("/existsByProductId") + public RestResponse existsByProductId(@RequestBody UserFavorite favorite){ + Long userId=SecurityUtils.getAppLoginUser().getAppUserId();; + return new RestResponse().setSuccess(true).setData(service.existsByUserIdAndProductId(userId,favorite.getProductId())); + } + + /** + * 取消收藏 + */ + @ApiOperation("取消收藏") + @PostMapping("/removeFavorite") + public RestResponse removeFavorite(@RequestBody UserFavorite favorite) { + Long userId=SecurityUtils.getAppLoginUser().getAppUserId();; + return new RestResponse().setSuccess(true).setData(service.removeFavorite(userId,favorite.getProductId())); + } + + /** + * 获取用户的收藏列表 + */ + @ApiOperation("获取用户的收藏列表") + @GetMapping("/getUserFavorites") + public RestResponse getUserFavorites() { + return new RestResponse().setSuccess(true).setData(service.getUserFavorites()); + } + + + /** + * 获取用户的收藏数量 + */ + @ApiOperation("获取用户的收藏数量") + @GetMapping("/getUserFavoriteCount") + public RestResponse getUserFavoriteCount() { + return new RestResponse().setSuccess(true).setData(service.getUserFavoriteCount()); + } +} diff --git a/ruoyi-admin/src/main/resources/application-dev.yml b/ruoyi-admin/src/main/resources/application-dev.yml index f7d4895..4fa42bb 100644 --- a/ruoyi-admin/src/main/resources/application-dev.yml +++ b/ruoyi-admin/src/main/resources/application-dev.yml @@ -7,10 +7,11 @@ spring: # 主库数据源 master: # url: jdbc:mysql://101.43.111.159:3306/yoga?useUnicode=true&characterEncoding=utf8&zeroDateTimeBehavior=convertToNull&useSSL=true&serverTimezone=GMT%2B8 - url: jdbc:mysql://localhost:3306/yj?useUnicode=true&characterEncoding=utf8&zeroDateTimeBehavior=convertToNull&useSSL=true&serverTimezone=GMT%2B8 +# url: jdbc:mysql://localhost:3306/yj?useUnicode=true&characterEncoding=utf8&zeroDateTimeBehavior=convertToNull&useSSL=true&serverTimezone=GMT%2B8 + url: jdbc:mysql://127.0.0.1:32768/yoga?useUnicode=true&characterEncoding=utf8&zeroDateTimeBehavior=convertToNull&useSSL=true&serverTimezone=GMT%2B8&rewriteBatchedStatements=true username: root -# password: '!Runpeng888' - password: 123456 + password: '!Runpeng888' +# password: 123456 # 从库数据源 slave: # 从数据源开关/默认关闭 @@ -58,12 +59,21 @@ spring: config: multi-statement-allow: true +#minio: +# endpoint: http://127.0.0.1:9000 #内网地址 +# domain: http://127.0.0.1:9000 #外网访问地址 +# accessKey: minioadmin +# secretKey: minioadmin +# bucketName: box-im +# imagePath: image +# filePath: file +# videoPath: video +# expireIn: 180 # 文件过期时间,单位:天 minio: - endpoint: http://127.0.0.1:9000 #内网地址 - domain: http://127.0.0.1:9000 #外网访问地址 - accessKey: minioadmin - secretKey: minioadmin - bucketName: box-im + endpoint: http://62.234.183.14:9000 + accessKey: IvostdowO3hTkXuaa392 + secretKey: wZCLColkVlNMYrxczzdvEC2VyK3lLh5DCb8yrFhE + bucketName: yoga-chatcontent imagePath: image filePath: file videoPath: video diff --git a/ruoyi-admin/src/main/resources/application-prod.yml b/ruoyi-admin/src/main/resources/application-prod.yml index da4e0eb..da4a4a9 100644 --- a/ruoyi-admin/src/main/resources/application-prod.yml +++ b/ruoyi-admin/src/main/resources/application-prod.yml @@ -6,11 +6,9 @@ spring: druid: # 主库数据源 master: - url: jdbc:mysql://101.43.111.159:3306/yoga?useUnicode=true&characterEncoding=utf8&zeroDateTimeBehavior=convertToNull&useSSL=true&serverTimezone=GMT%2B8 -# url: jdbc:mysql://localhost:3306/yj?useUnicode=true&characterEncoding=utf8&zeroDateTimeBehavior=convertToNull&useSSL=true&serverTimezone=GMT%2B8 + url: jdbc:mysql://127.0.0.1:32768/yoga?useUnicode=true&characterEncoding=utf8&zeroDateTimeBehavior=convertToNull&useSSL=true&serverTimezone=GMT%2B8 username: root password: '!Runpeng888' -# password: 123456 # 从库数据源 slave: # 从数据源开关/默认关闭 @@ -59,10 +57,10 @@ spring: multi-statement-allow: true minio: - endpoint: http://101.43.111.159:9000 #内网地址 - accessKey: KHuC4x81wQNGtDHC1dnS - secretKey: jCA4JpAJIIPXfIUJCWn0dZXKs2QCv5007dEhU1KB - bucketName: yoga-im + endpoint: http://62.234.183.14:9000 + accessKey: IvostdowO3hTkXuaa392 + secretKey: wZCLColkVlNMYrxczzdvEC2VyK3lLh5DCb8yrFhE + bucketName: yoga-chatcontent imagePath: image filePath: file videoPath: video diff --git a/ruoyi-admin/src/main/resources/application.yml b/ruoyi-admin/src/main/resources/application.yml index 4e01751..193ea05 100644 --- a/ruoyi-admin/src/main/resources/application.yml +++ b/ruoyi-admin/src/main/resources/application.yml @@ -39,6 +39,7 @@ logging: level: com.ruoyi: debug org.springframework: warn + config: classpath:logback.xml # 用户配置 user: diff --git a/ruoyi-common/pom.xml b/ruoyi-common/pom.xml index f922679..fe0a1c8 100644 --- a/ruoyi-common/pom.xml +++ b/ruoyi-common/pom.xml @@ -135,7 +135,19 @@ cn.hutool hutool-all - 5.7.1 + 5.8.22 + + + + + com.google.zxing + core + 3.5.1 + + + com.google.zxing + javase + 3.5.1 diff --git a/ruoyi-common/ruoyi-common.iml b/ruoyi-common/ruoyi-common.iml index 3c7f462..f9c200e 100644 --- a/ruoyi-common/ruoyi-common.iml +++ b/ruoyi-common/ruoyi-common.iml @@ -4,9 +4,6 @@ - - - @@ -21,7 +18,6 @@ - @@ -104,7 +100,11 @@ - + + + + + @@ -184,5 +184,6 @@ + \ No newline at end of file diff --git a/ruoyi-common/src/main/java/com/ruoyi/common/constant/Constants.java b/ruoyi-common/src/main/java/com/ruoyi/common/constant/Constants.java index 25a2ee8..cb66938 100644 --- a/ruoyi-common/src/main/java/com/ruoyi/common/constant/Constants.java +++ b/ruoyi-common/src/main/java/com/ruoyi/common/constant/Constants.java @@ -191,15 +191,12 @@ public class Constants WEEK_DAY_MAP.put(1, "星期日"); CLA_TIME_MAP.clear(); - CLA_TIME_MAP.put(8, "08:30"); - CLA_TIME_MAP.put(9, "10:00"); - CLA_TIME_MAP.put(10, "11:00"); - CLA_TIME_MAP.put(11, "14:00"); - CLA_TIME_MAP.put(12, "15:00"); - CLA_TIME_MAP.put(13, "16:00"); - CLA_TIME_MAP.put(14, "17:00"); - CLA_TIME_MAP.put(15, "18:00"); - CLA_TIME_MAP.put(16, "19:30"); + CLA_TIME_MAP.put(8, "08:00"); + CLA_TIME_MAP.put(10, "10:00"); + CLA_TIME_MAP.put(12, "12:00"); + CLA_TIME_MAP.put(14, "14:00"); + CLA_TIME_MAP.put(16, "16:00"); + CLA_TIME_MAP.put(18, "18:00"); } /** * 上架状态:0->下架;1->上架 diff --git a/ruoyi-common/src/main/java/com/ruoyi/common/core/domain/BaseEntity.java b/ruoyi-common/src/main/java/com/ruoyi/common/core/domain/BaseEntity.java index f7d5bf4..331fe2a 100644 --- a/ruoyi-common/src/main/java/com/ruoyi/common/core/domain/BaseEntity.java +++ b/ruoyi-common/src/main/java/com/ruoyi/common/core/domain/BaseEntity.java @@ -8,7 +8,7 @@ import com.fasterxml.jackson.annotation.JsonFormat; /** * Entity基类 - * + * * @author ruoyi */ public class BaseEntity implements Serializable @@ -19,14 +19,14 @@ public class BaseEntity implements Serializable private String searchValue; /** 创建者 */ - private String createBy; + private Long createBy; /** 创建时间 */ @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss") private Date createTime; /** 更新者 */ - private String updateBy; + private Long updateBy; /** 更新时间 */ @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss") @@ -48,12 +48,12 @@ public class BaseEntity implements Serializable this.searchValue = searchValue; } - public String getCreateBy() + public Long getCreateBy() { return createBy; } - public void setCreateBy(String createBy) + public void setCreateBy(Long createBy) { this.createBy = createBy; } @@ -68,12 +68,12 @@ public class BaseEntity implements Serializable this.createTime = createTime; } - public String getUpdateBy() + public Long getUpdateBy() { return updateBy; } - public void setUpdateBy(String updateBy) + public void setUpdateBy(Long updateBy) { this.updateBy = updateBy; } diff --git a/ruoyi-common/src/main/java/com/ruoyi/common/core/domain/entity/AppUser.java b/ruoyi-common/src/main/java/com/ruoyi/common/core/domain/entity/AppUser.java index e665c9b..8869588 100644 --- a/ruoyi-common/src/main/java/com/ruoyi/common/core/domain/entity/AppUser.java +++ b/ruoyi-common/src/main/java/com/ruoyi/common/core/domain/entity/AppUser.java @@ -1,9 +1,12 @@ package com.ruoyi.common.core.domain.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.fasterxml.jackson.annotation.JsonFormat; import com.ruoyi.common.annotation.Excel; +import com.ruoyi.common.utils.SecurityUtils; import io.swagger.annotations.ApiModel; import io.swagger.annotations.ApiModelProperty; import lombok.Data; @@ -26,7 +29,7 @@ public class AppUser{ @ApiModelProperty("ID") - @TableId(value = "app_user_id") + @TableId(value = "app_user_id",type = IdType.AUTO) private Long id; @ApiModelProperty("昵称") @@ -47,8 +50,8 @@ public class AppUser{ @ApiModelProperty("头像") private String avatar; - @ApiModelProperty("性别:0->未知;1->男;2->女") - private Integer gender; + @ApiModelProperty("性别:0->未知;1->女;2->男") + private Integer sex; @ApiModelProperty("用户所在城市") private String city; @@ -67,24 +70,32 @@ public class AppUser{ private String registerId; @ApiModelProperty("访问/浏览门店id") - private String visitStore; + private Long visitStore; @ApiModelProperty("小程序unionid") private String unionid; @ApiModelProperty("小程序openid") private String openid; - /** 员工所属门店id */ - private String storeId; - - /** 员工所属商户id */ - private String tenantId; /** 最后登录IP */ private String loginIp; + //个性签名(140字) + private String signature; /** 最后登录时间 */ @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss") private Date loginDate; + + /**后台账户`sys_user`的user_id*/ + @TableField("manage_account_id") + private Long manageAccountId; + + @TableField(exist = false) + private String newPassword; + + + + } diff --git a/ruoyi-common/src/main/java/com/ruoyi/common/core/domain/entity/SysDept.java b/ruoyi-common/src/main/java/com/ruoyi/common/core/domain/entity/SysDept.java index ff2027b..7c040b4 100644 --- a/ruoyi-common/src/main/java/com/ruoyi/common/core/domain/entity/SysDept.java +++ b/ruoyi-common/src/main/java/com/ruoyi/common/core/domain/entity/SysDept.java @@ -1,31 +1,34 @@ package com.ruoyi.common.core.domain.entity; +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 org.apache.commons.lang3.builder.ToStringBuilder; -import org.apache.commons.lang3.builder.ToStringStyle; +import lombok.Data; -import javax.validation.constraints.Email; -import javax.validation.constraints.NotBlank; -import javax.validation.constraints.NotNull; -import javax.validation.constraints.Size; import java.util.ArrayList; import java.util.List; /** * 部门表 sys_dept - * + * * @author ruoyi */ -public class SysDept extends BaseEntity +@Data +@TableName("sys_dept") +public class SysDept { private static final long serialVersionUID = 1L; /** 部门ID */ + @TableId private Long deptId; /** 父部门ID */ private Long parentId; + private String deptType; + /** 祖级列表 */ private String ancestors; @@ -36,10 +39,11 @@ public class SysDept extends BaseEntity private Integer orderNum; /** 负责人 */ - private String leader; + private Long leaderId; /** 联系电话 */ private String phone; + private String leader; /** 邮箱 */ private String email; @@ -48,249 +52,45 @@ public class SysDept extends BaseEntity private String status; /** 删除标志(0代表存在 2代表删除) */ - private String delFlag; + private String deleteFlag; /** 父部门名称 */ + @TableField(exist = false) private String parentName; /**商户id*/ - private String merchanId; + private String TenantId; /** * 地址 */ + @TableField(exist = false) private String address; /** * 门店介绍 */ + @TableField(exist = false) private String detail; /** * 封面简介 */ + @TableField(exist = false) private String brief; /** * 封面图片 */ + @TableField(exist = false) private String picture; - /** - * 门店是否页面显示 */ - private Boolean display; + + @TableField(exist = false) private String dimension;//纬度 + @TableField(exist = false) private String longitude;//经度 - public String getDimension() { - return dimension; - } - - public void setDimension(String dimension) { - this.dimension = dimension; - } - - public String getLongitude() { - return longitude; - } - - public void setLongitude(String longitude) { - this.longitude = longitude; - } - - public Boolean getDisplay() { - return display; - } - - public void setDisplay(Boolean display) { - this.display = display; - } - - - public String getAddress() { - return address; - } - - public void setAddress(String address) { - this.address = address; - } - - public String getDetail() { - return detail; - } - - public void setDetail(String detail) { - this.detail = detail; - } - - public String getBrief() { - return brief; - } - - public void setBrief(String brief) { - this.brief = brief; - } - - public String getPicture() { - return picture; - } - - public void setPicture(String picture) { - this.picture = picture; - } - - public String getMerchanId() { - return merchanId; - } - - public void setMerchanId(String merchanId) { - this.merchanId = merchanId; - } - /** 子部门 */ + @TableField(exist = false) private List children = new ArrayList(); - public Long getDeptId() - { - return deptId; - } - - public void setDeptId(Long deptId) - { - this.deptId = deptId; - } - - public Long getParentId() - { - return parentId; - } - - public void setParentId(Long parentId) - { - this.parentId = parentId; - } - - public String getAncestors() - { - return ancestors; - } - - public void setAncestors(String ancestors) - { - this.ancestors = ancestors; - } - - @NotBlank(message = "部门名称不能为空") - @Size(min = 0, max = 30, message = "部门名称长度不能超过30个字符") - public String getDeptName() - { - return deptName; - } - - public void setDeptName(String deptName) - { - this.deptName = deptName; - } - - @NotNull(message = "显示顺序不能为空") - public Integer getOrderNum() - { - return orderNum; - } - - public void setOrderNum(Integer orderNum) - { - this.orderNum = orderNum; - } - - public String getLeader() - { - return leader; - } - - public void setLeader(String leader) - { - this.leader = leader; - } - - @Size(min = 0, max = 11, message = "联系电话长度不能超过11个字符") - public String getPhone() - { - return phone; - } - - public void setPhone(String phone) - { - this.phone = phone; - } - - @Email(message = "邮箱格式不正确") - @Size(min = 0, max = 50, message = "邮箱长度不能超过50个字符") - public String getEmail() - { - return email; - } - - public void setEmail(String email) - { - this.email = email; - } - - public String getStatus() - { - return status; - } - - public void setStatus(String status) - { - this.status = status; - } - - public String getDelFlag() - { - return delFlag; - } - - public void setDelFlag(String delFlag) - { - this.delFlag = delFlag; - } - - public String getParentName() - { - return parentName; - } - - public void setParentName(String parentName) - { - this.parentName = parentName; - } - - public List getChildren() - { - return children; - } - - public void setChildren(List children) - { - this.children = children; - } - - @Override - public String toString() { - return new ToStringBuilder(this,ToStringStyle.MULTI_LINE_STYLE) - .append("deptId", getDeptId()) - .append("parentId", getParentId()) - .append("ancestors", getAncestors()) - .append("deptName", getDeptName()) - .append("orderNum", getOrderNum()) - .append("leader", getLeader()) - .append("phone", getPhone()) - .append("email", getEmail()) - .append("status", getStatus()) - .append("delFlag", getDelFlag()) - .append("createBy", getCreateBy()) - .append("createTime", getCreateTime()) - .append("updateBy", getUpdateBy()) - .append("updateTime", getUpdateTime()) - .toString(); - } } diff --git a/ruoyi-common/src/main/java/com/ruoyi/common/core/domain/entity/SysDictData.java b/ruoyi-common/src/main/java/com/ruoyi/common/core/domain/entity/SysDictData.java index 10f394f..d13b285 100644 --- a/ruoyi-common/src/main/java/com/ruoyi/common/core/domain/entity/SysDictData.java +++ b/ruoyi-common/src/main/java/com/ruoyi/common/core/domain/entity/SysDictData.java @@ -4,6 +4,7 @@ import com.ruoyi.common.annotation.Excel; import com.ruoyi.common.annotation.Excel.ColumnType; import com.ruoyi.common.constant.UserConstants; import com.ruoyi.common.core.domain.BaseEntity; +import lombok.Data; import org.apache.commons.lang3.builder.ToStringBuilder; import org.apache.commons.lang3.builder.ToStringStyle; @@ -12,10 +13,11 @@ import javax.validation.constraints.Size; /** * 字典数据表 sys_dict_data - * + * * @author ruoyi */ -public class SysDictData extends BaseEntity +@Data +public class SysDictData { private static final long serialVersionUID = 1L; @@ -54,134 +56,8 @@ public class SysDictData extends BaseEntity private String status; /**商户id*/ - private String merchantId; - - public String getMerchantId() { - return merchantId; - } - - public void setMerchantId(String merchantId) { - this.merchantId = merchantId; - } - public Long getDictCode() - { - return dictCode; - } - - public void setDictCode(Long dictCode) - { - this.dictCode = dictCode; - } - - public Long getDictSort() - { - return dictSort; - } - - public void setDictSort(Long dictSort) - { - this.dictSort = dictSort; - } - - @NotBlank(message = "字典标签不能为空") - @Size(min = 0, max = 100, message = "字典标签长度不能超过100个字符") - public String getDictLabel() - { - return dictLabel; - } - - public void setDictLabel(String dictLabel) - { - this.dictLabel = dictLabel; - } - - @NotBlank(message = "字典键值不能为空") - @Size(min = 0, max = 100, message = "字典键值长度不能超过100个字符") - public String getDictValue() - { - return dictValue; - } - - public void setDictValue(String dictValue) - { - this.dictValue = dictValue; - } - - @NotBlank(message = "字典类型不能为空") - @Size(min = 0, max = 100, message = "字典类型长度不能超过100个字符") - public String getDictType() - { - return dictType; - } - - public void setDictType(String dictType) - { - this.dictType = dictType; - } - - @Size(min = 0, max = 100, message = "样式属性长度不能超过100个字符") - public String getCssClass() - { - return cssClass; - } - - public void setCssClass(String cssClass) - { - this.cssClass = cssClass; - } - - public String getListClass() - { - return listClass; - } - - public void setListClass(String listClass) - { - this.listClass = listClass; - } - - public boolean getDefault() - { - return UserConstants.YES.equals(this.isDefault); - } - - public String getIsDefault() - { - return isDefault; - } - - public void setIsDefault(String isDefault) - { - this.isDefault = isDefault; - } - - public String getStatus() - { - return status; - } - - public void setStatus(String status) - { - this.status = status; - } - - @Override - public String toString() { - return new ToStringBuilder(this,ToStringStyle.MULTI_LINE_STYLE) - .append("dictCode", getDictCode()) - .append("dictSort", getDictSort()) - .append("dictLabel", getDictLabel()) - .append("dictValue", getDictValue()) - .append("dictType", getDictType()) - .append("cssClass", getCssClass()) - .append("listClass", getListClass()) - .append("isDefault", getIsDefault()) - .append("status", getStatus()) - .append("createBy", getCreateBy()) - .append("createTime", getCreateTime()) - .append("updateBy", getUpdateBy()) - .append("updateTime", getUpdateTime()) - .append("remark", getRemark()) - .toString(); - } + private String tenantId; + + + } diff --git a/ruoyi-common/src/main/java/com/ruoyi/common/core/domain/entity/SysDictType.java b/ruoyi-common/src/main/java/com/ruoyi/common/core/domain/entity/SysDictType.java index 64d437b..6fffc4c 100644 --- a/ruoyi-common/src/main/java/com/ruoyi/common/core/domain/entity/SysDictType.java +++ b/ruoyi-common/src/main/java/com/ruoyi/common/core/domain/entity/SysDictType.java @@ -3,6 +3,7 @@ package com.ruoyi.common.core.domain.entity; import com.ruoyi.common.annotation.Excel; import com.ruoyi.common.annotation.Excel.ColumnType; import com.ruoyi.common.core.domain.BaseEntity; +import lombok.Data; import org.apache.commons.lang3.builder.ToStringBuilder; import org.apache.commons.lang3.builder.ToStringStyle; @@ -12,10 +13,11 @@ import javax.validation.constraints.Size; /** * 字典类型表 sys_dict_type - * + * * @author ruoyi */ -public class SysDictType extends BaseEntity +@Data +public class SysDictType { private static final long serialVersionUID = 1L; @@ -35,63 +37,4 @@ public class SysDictType extends BaseEntity @Excel(name = "状态", readConverterExp = "0=正常,1=停用") private String status; - public Long getDictId() - { - return dictId; - } - - public void setDictId(Long dictId) - { - this.dictId = dictId; - } - - @NotBlank(message = "字典名称不能为空") - @Size(min = 0, max = 100, message = "字典类型名称长度不能超过100个字符") - public String getDictName() - { - return dictName; - } - - public void setDictName(String dictName) - { - this.dictName = dictName; - } - - @NotBlank(message = "字典类型不能为空") - @Size(min = 0, max = 100, message = "字典类型类型长度不能超过100个字符") - @Pattern(regexp = "^[a-z][a-z0-9_]*$", message = "字典类型必须以字母开头,且只能为(小写字母,数字,下滑线)") - public String getDictType() - { - return dictType; - } - - public void setDictType(String dictType) - { - this.dictType = dictType; - } - - public String getStatus() - { - return status; - } - - public void setStatus(String status) - { - this.status = status; - } - - @Override - public String toString() { - return new ToStringBuilder(this,ToStringStyle.MULTI_LINE_STYLE) - .append("dictId", getDictId()) - .append("dictName", getDictName()) - .append("dictType", getDictType()) - .append("status", getStatus()) - .append("createBy", getCreateBy()) - .append("createTime", getCreateTime()) - .append("updateBy", getUpdateBy()) - .append("updateTime", getUpdateTime()) - .append("remark", getRemark()) - .toString(); - } } diff --git a/ruoyi-common/src/main/java/com/ruoyi/common/core/domain/entity/SysMenu.java b/ruoyi-common/src/main/java/com/ruoyi/common/core/domain/entity/SysMenu.java index 042bc76..97c2302 100644 --- a/ruoyi-common/src/main/java/com/ruoyi/common/core/domain/entity/SysMenu.java +++ b/ruoyi-common/src/main/java/com/ruoyi/common/core/domain/entity/SysMenu.java @@ -5,15 +5,18 @@ import java.util.List; import javax.validation.constraints.NotBlank; import javax.validation.constraints.NotNull; import javax.validation.constraints.Size; + +import lombok.Data; import org.apache.commons.lang3.builder.ToStringBuilder; import org.apache.commons.lang3.builder.ToStringStyle; import com.ruoyi.common.core.domain.BaseEntity; /** * 菜单权限表 sys_menu - * + * * @author ruoyi */ +@Data public class SysMenu extends BaseEntity { private static final long serialVersionUID = 1L; @@ -53,7 +56,7 @@ public class SysMenu extends BaseEntity /** 显示状态(0显示 1隐藏) */ private String visible; - + /** 菜单状态(0显示 1隐藏) */ private String status; @@ -66,194 +69,4 @@ public class SysMenu extends BaseEntity /** 子菜单 */ private List children = new ArrayList(); - public Long getMenuId() - { - return menuId; - } - - public void setMenuId(Long menuId) - { - this.menuId = menuId; - } - - @NotBlank(message = "菜单名称不能为空") - @Size(min = 0, max = 50, message = "菜单名称长度不能超过50个字符") - public String getMenuName() - { - return menuName; - } - - public void setMenuName(String menuName) - { - this.menuName = menuName; - } - - public String getParentName() - { - return parentName; - } - - public void setParentName(String parentName) - { - this.parentName = parentName; - } - - public Long getParentId() - { - return parentId; - } - - public void setParentId(Long parentId) - { - this.parentId = parentId; - } - - @NotNull(message = "显示顺序不能为空") - public Integer getOrderNum() - { - return orderNum; - } - - public void setOrderNum(Integer orderNum) - { - this.orderNum = orderNum; - } - - @Size(min = 0, max = 200, message = "路由地址不能超过200个字符") - public String getPath() - { - return path; - } - - public void setPath(String path) - { - this.path = path; - } - - @Size(min = 0, max = 200, message = "组件路径不能超过255个字符") - public String getComponent() - { - return component; - } - - public void setComponent(String component) - { - this.component = component; - } - - public String getQuery() - { - return query; - } - - public void setQuery(String query) - { - this.query = query; - } - - public String getIsFrame() - { - return isFrame; - } - - public void setIsFrame(String isFrame) - { - this.isFrame = isFrame; - } - - public String getIsCache() - { - return isCache; - } - - public void setIsCache(String isCache) - { - this.isCache = isCache; - } - - @NotBlank(message = "菜单类型不能为空") - public String getMenuType() - { - return menuType; - } - - public void setMenuType(String menuType) - { - this.menuType = menuType; - } - - public String getVisible() - { - return visible; - } - - public void setVisible(String visible) - { - this.visible = visible; - } - - public String getStatus() - { - return status; - } - - public void setStatus(String status) - { - this.status = status; - } - - @Size(min = 0, max = 100, message = "权限标识长度不能超过100个字符") - public String getPerms() - { - return perms; - } - - public void setPerms(String perms) - { - this.perms = perms; - } - - public String getIcon() - { - return icon; - } - - public void setIcon(String icon) - { - this.icon = icon; - } - - public List getChildren() - { - return children; - } - - public void setChildren(List children) - { - this.children = children; - } - - @Override - public String toString() { - return new ToStringBuilder(this,ToStringStyle.MULTI_LINE_STYLE) - .append("menuId", getMenuId()) - .append("menuName", getMenuName()) - .append("parentId", getParentId()) - .append("orderNum", getOrderNum()) - .append("path", getPath()) - .append("component", getComponent()) - .append("isFrame", getIsFrame()) - .append("IsCache", getIsCache()) - .append("menuType", getMenuType()) - .append("visible", getVisible()) - .append("status ", getStatus()) - .append("perms", getPerms()) - .append("icon", getIcon()) - .append("createBy", getCreateBy()) - .append("createTime", getCreateTime()) - .append("updateBy", getUpdateBy()) - .append("updateTime", getUpdateTime()) - .append("remark", getRemark()) - .toString(); - } } diff --git a/ruoyi-common/src/main/java/com/ruoyi/common/core/domain/entity/SysRole.java b/ruoyi-common/src/main/java/com/ruoyi/common/core/domain/entity/SysRole.java index ed9fa9d..42339cb 100644 --- a/ruoyi-common/src/main/java/com/ruoyi/common/core/domain/entity/SysRole.java +++ b/ruoyi-common/src/main/java/com/ruoyi/common/core/domain/entity/SysRole.java @@ -3,6 +3,7 @@ package com.ruoyi.common.core.domain.entity; import com.ruoyi.common.annotation.Excel; import com.ruoyi.common.annotation.Excel.ColumnType; import com.ruoyi.common.core.domain.BaseEntity; +import lombok.Data; import org.apache.commons.lang3.builder.ToStringBuilder; import org.apache.commons.lang3.builder.ToStringStyle; @@ -12,11 +13,13 @@ import java.util.Set; /** * 角色表 sys_role - * + * * @author ruoyi */ -public class SysRole extends BaseEntity +@Data +public class SysRole { + private static final long serialVersionUID = 1L; /** 角色ID */ @@ -46,7 +49,7 @@ public class SysRole extends BaseEntity private boolean deptCheckStrictly; /** 角色状态(0正常 1停用) */ - @Excel(name = "角色状态", readConverterExp = "0=正常,1=停用") + @Excel(name = "角色状态", readConverterExp = "0=停用,1=正常") private String status; /** 删除标志(0代表存在 2代表删除) */ @@ -64,25 +67,6 @@ public class SysRole extends BaseEntity /** 角色菜单权限 */ private Set permissions; - public SysRole() - { - - } - - public SysRole(Long roleId) - { - this.roleId = roleId; - } - - public Long getRoleId() - { - return roleId; - } - - public void setRoleId(Long roleId) - { - this.roleId = roleId; - } public boolean isAdmin() { @@ -93,156 +77,11 @@ public class SysRole extends BaseEntity { return roleId != null && 1L == roleId; } - public boolean isMerchant() - { - return isMerchant(this.roleId); - } - public static boolean isMerchant(Long roleId) - { - return roleId != null && (1L == roleId || 100L == roleId); - } - @NotBlank(message = "角色名称不能为空") - @Size(min = 0, max = 30, message = "角色名称长度不能超过30个字符") - public String getRoleName() - { - return roleName; - } - - public void setRoleName(String roleName) - { - this.roleName = roleName; - } - - @NotBlank(message = "权限字符不能为空") - @Size(min = 0, max = 100, message = "权限字符长度不能超过100个字符") - public String getRoleKey() - { - return roleKey; - } - - public void setRoleKey(String roleKey) - { - this.roleKey = roleKey; - } - - @NotBlank(message = "显示顺序不能为空") - public String getRoleSort() - { - return roleSort; - } - - public void setRoleSort(String roleSort) - { - this.roleSort = roleSort; - } - - public String getDataScope() - { - return dataScope; - } - - public void setDataScope(String dataScope) - { - this.dataScope = dataScope; - } - - public boolean isMenuCheckStrictly() - { - return menuCheckStrictly; - } - - public void setMenuCheckStrictly(boolean menuCheckStrictly) - { - this.menuCheckStrictly = menuCheckStrictly; - } - - public boolean isDeptCheckStrictly() - { - return deptCheckStrictly; - } - - public void setDeptCheckStrictly(boolean deptCheckStrictly) - { - this.deptCheckStrictly = deptCheckStrictly; - } - - public String getStatus() - { - return status; - } - - public void setStatus(String status) - { - this.status = status; - } - - public String getDelFlag() - { - return delFlag; - } - - public void setDelFlag(String delFlag) - { - this.delFlag = delFlag; - } - - public boolean isFlag() - { - return flag; - } - - public void setFlag(boolean flag) - { - this.flag = flag; - } - - public Long[] getMenuIds() - { - return menuIds; - } - - public void setMenuIds(Long[] menuIds) - { - this.menuIds = menuIds; - } - - public Long[] getDeptIds() - { - return deptIds; - } - - public void setDeptIds(Long[] deptIds) - { - this.deptIds = deptIds; - } - - public Set getPermissions() - { - return permissions; - } - - public void setPermissions(Set permissions) + public SysRole(Long roleId) { - this.permissions = permissions; + this.roleId = roleId; } - @Override - public String toString() { - return new ToStringBuilder(this,ToStringStyle.MULTI_LINE_STYLE) - .append("roleId", getRoleId()) - .append("roleName", getRoleName()) - .append("roleKey", getRoleKey()) - .append("roleSort", getRoleSort()) - .append("dataScope", getDataScope()) - .append("menuCheckStrictly", isMenuCheckStrictly()) - .append("deptCheckStrictly", isDeptCheckStrictly()) - .append("status", getStatus()) - .append("delFlag", getDelFlag()) - .append("createBy", getCreateBy()) - .append("createTime", getCreateTime()) - .append("updateBy", getUpdateBy()) - .append("updateTime", getUpdateTime()) - .append("remark", getRemark()) - .toString(); + public SysRole() { } } diff --git a/ruoyi-common/src/main/java/com/ruoyi/common/core/domain/entity/SysUser.java b/ruoyi-common/src/main/java/com/ruoyi/common/core/domain/entity/SysUser.java index 74d547b..4437c1a 100644 --- a/ruoyi-common/src/main/java/com/ruoyi/common/core/domain/entity/SysUser.java +++ b/ruoyi-common/src/main/java/com/ruoyi/common/core/domain/entity/SysUser.java @@ -8,6 +8,7 @@ import com.ruoyi.common.annotation.Excels; import com.ruoyi.common.core.domain.BaseEntity; import com.ruoyi.common.xss.Xss; import io.swagger.annotations.ApiModelProperty; +import lombok.Data; import org.apache.commons.lang3.builder.ToStringBuilder; import org.apache.commons.lang3.builder.ToStringStyle; @@ -22,7 +23,8 @@ import java.util.List; * * @author ruoyi */ -public class SysUser extends BaseEntity +@Data +public class SysUser { private static final long serialVersionUID = 1L; @@ -34,6 +36,9 @@ public class SysUser extends BaseEntity @Excel(name = "部门编号", type = Type.IMPORT) private Long deptId; + /** 员工所属租户id */ + private String tenantId; + /** 用户账号 */ @Excel(name = "登录名称") private String userName; @@ -50,8 +55,8 @@ public class SysUser extends BaseEntity @Excel(name = "手机号码") private String phonenumber; - /** 用户性别 */ - @Excel(name = "用户性别", readConverterExp = "0=男,1=女,2=未知") + /** 用户性别 (0未知 1女 2男)*/ + private String sex; /** 用户头像 */ @@ -61,7 +66,7 @@ public class SysUser extends BaseEntity private String password; /** 帐号状态(0正常 1停用) */ - @Excel(name = "帐号状态", readConverterExp = "0=正常,1=停用") + @Excel(name = "帐号状态", readConverterExp = "0正常 1停用") private String status; /** 删除标志(0代表存在 2代表删除) */ @@ -76,135 +81,29 @@ public class SysUser extends BaseEntity private Date loginDate; /** 部门对象 */ - @Excels({ - @Excel(name = "部门名称", targetAttr = "deptName", type = Type.EXPORT), - @Excel(name = "部门负责人", targetAttr = "leader", type = Type.EXPORT) - }) + @TableField(exist = false) private SysDept dept; /** 角色对象 */ + @TableField(exist = false) private List roles; /** 角色组 */ + @TableField(exist = false) private Long[] roleIds; /** 岗位组 */ + @TableField(exist = false) private Long[] postIds; /** 角色ID */ + @TableField(exist = false) private Long roleId; - /** 员工所属门店id */ - private String venId; - - /** 员工所属商户id */ - private String merchantId; - private String context; - private Boolean releases;//教练风采是否显示 - //教练风采简短介绍 - private String intro; - @ApiModelProperty("设备id") - private String registerId; - @ApiModelProperty("访问/浏览门店id") - private String visitStore; - @TableField(exist = false) private Boolean responsible; - public String getVisitStore() { - return visitStore; - } - public void setVisitStore(String visitStore) { - this.visitStore = visitStore; - } - - public String getRegisterId() { - return registerId; - } - - public void setRegisterId(String registerId) { - this.registerId = registerId; - } - - public Boolean getResponsible() { - return responsible; - } - - public void setResponsible(Boolean responsible) { - this.responsible = responsible; - } - - public String getIntro() { - return intro; - } - - public void setIntro(String intro) { - this.intro = intro; - } - - //教练风采相册 - private String url; - - public String getUrl() { - return url; - } - - public void setUrl(String url) { - this.url = url; - } - - public Boolean getReleases() { - return releases; - } - - public void setReleases(Boolean releases) { - this.releases = releases; - } - - public String getContext() { - return context; - } - - public void setContext(String context) { - this.context = context; - } - - public void setVenId(String venId) { - this.venId = venId; - } - - public String getVenId() { - return venId; - } - - public SysUser() - { - - } - - public String getMerchantId() { - return merchantId; - } - - public void setMerchantId(String merchantId) { - this.merchantId = merchantId; - } - - public SysUser(Long userId) - { - this.userId = userId; - } - - public Long getUserId() - { - return userId; - } - - public void setUserId(Long userId) - { - this.userId = userId; - } public boolean isAdmin() { @@ -216,206 +115,11 @@ public class SysUser extends BaseEntity return userId != null && 1L == userId; } - public Long getDeptId() - { - return deptId; - } - - public void setDeptId(Long deptId) - { - this.deptId = deptId; - } - - @Xss(message = "用户昵称不能包含脚本字符") - @Size(min = 0, max = 30, message = "用户昵称长度不能超过30个字符") - public String getNickName() - { - return nickName; - } - - public void setNickName(String nickName) - { - this.nickName = nickName; - } - - @Xss(message = "用户账号不能包含脚本字符") - @NotBlank(message = "用户账号不能为空") - @Size(min = 0, max = 30, message = "用户账号长度不能超过30个字符") - public String getUserName() - { - return userName; - } - - public void setUserName(String userName) - { - this.userName = userName; - } - - @Email(message = "邮箱格式不正确") - @Size(min = 0, max = 50, message = "邮箱长度不能超过50个字符") - public String getEmail() - { - return email; - } - - public void setEmail(String email) - { - this.email = email; - } - - @Size(min = 0, max = 11, message = "手机号码长度不能超过11个字符") - public String getPhonenumber() - { - return phonenumber; - } - - public void setPhonenumber(String phonenumber) - { - this.phonenumber = phonenumber; - } - - public String getSex() - { - return sex; - } - - public void setSex(String sex) - { - this.sex = sex; - } - - public String getAvatar() - { - return avatar; - } - - public void setAvatar(String avatar) - { - this.avatar = avatar; - } - - public String getPassword() - { - return password; - } - - public void setPassword(String password) - { - this.password = password; - } - - public String getStatus() - { - return status; - } - - public void setStatus(String status) - { - this.status = status; - } - - public String getDelFlag() - { - return delFlag; - } - - public void setDelFlag(String delFlag) - { - this.delFlag = delFlag; - } - - public String getLoginIp() - { - return loginIp; - } - - public void setLoginIp(String loginIp) - { - this.loginIp = loginIp; - } - - public Date getLoginDate() - { - return loginDate; - } - - public void setLoginDate(Date loginDate) - { - this.loginDate = loginDate; - } - - public SysDept getDept() - { - return dept; - } - - public void setDept(SysDept dept) - { - this.dept = dept; - } - - public List getRoles() - { - return roles; - } - - public void setRoles(List roles) - { - this.roles = roles; - } - - public Long[] getRoleIds() - { - return roleIds; - } - - public void setRoleIds(Long[] roleIds) - { - this.roleIds = roleIds; - } - - public Long[] getPostIds() - { - return postIds; - } - - public void setPostIds(Long[] postIds) - { - this.postIds = postIds; - } - - public Long getRoleId() - { - return roleId; - } - - public void setRoleId(Long roleId) + public SysUser(Long userId) { - this.roleId = roleId; + this.userId = userId; } - @Override - public String toString() { - return new ToStringBuilder(this,ToStringStyle.MULTI_LINE_STYLE) - .append("userId", getUserId()) - .append("deptId", getDeptId()) - .append("userName", getUserName()) - .append("nickName", getNickName()) - .append("email", getEmail()) - .append("phonenumber", getPhonenumber()) - .append("sex", getSex()) - .append("avatar", getAvatar()) - .append("password", getPassword()) - .append("status", getStatus()) - .append("delFlag", getDelFlag()) - .append("loginIp", getLoginIp()) - .append("loginDate", getLoginDate()) - .append("createBy", getCreateBy()) - .append("createTime", getCreateTime()) - .append("updateBy", getUpdateBy()) - .append("updateTime", getUpdateTime()) - .append("remark", getRemark()) - .append("dept", getDept()) - .toString(); + public SysUser() { } } diff --git a/ruoyi-common/src/main/java/com/ruoyi/common/core/domain/model/AppLoginUser.java b/ruoyi-common/src/main/java/com/ruoyi/common/core/domain/model/AppLoginUser.java index 58ec33f..5b64c44 100644 --- a/ruoyi-common/src/main/java/com/ruoyi/common/core/domain/model/AppLoginUser.java +++ b/ruoyi-common/src/main/java/com/ruoyi/common/core/domain/model/AppLoginUser.java @@ -1,14 +1,12 @@ package com.ruoyi.common.core.domain.model; import java.util.Collection; -import java.util.Set; import com.ruoyi.common.core.domain.entity.AppUser; import lombok.Data; import org.springframework.security.core.GrantedAuthority; import org.springframework.security.core.userdetails.UserDetails; import com.alibaba.fastjson2.annotation.JSONField; -import com.ruoyi.common.core.domain.entity.SysUser; /** * 登录用户身份权限 @@ -21,6 +19,11 @@ public class AppLoginUser implements UserDetails private static final long serialVersionUID = 1L; private Long appUserId; + + private Long[] roles; + private Long manageAccountId; + private Long studentId; + private String userName; private String token; private Long loginTime; private Long expireTime; @@ -29,22 +32,39 @@ public class AppLoginUser implements UserDetails */ private AppUser appUser; - public AppLoginUser(Long appUserId, String token, Long loginTime, Long expireTime, AppUser appUser) { + public AppLoginUser(Long appUserId, Long[] roleId, Long studentId, String userName, Long manageAccountId, String token, Long loginTime, Long expireTime, AppUser appUser) { this.appUserId = appUserId; + this.roles = roleId; + this.studentId = studentId; + this.userName = userName; + this.manageAccountId = manageAccountId; this.token = token; this.loginTime = loginTime; this.expireTime = expireTime; this.appUser = appUser; } + public AppLoginUser() { } - public AppLoginUser(Long appUserId,AppUser appUser) { + public AppLoginUser(Long appUserId,String userName,Long manageAccountId,Long[] roles,Long studentId,AppUser appUser) { this.appUserId = appUserId; + this.userName = userName; + this.manageAccountId = manageAccountId; + this.roles =roles; + this.studentId = studentId; this.appUser = appUser; } + public Long getAppUserId() { + return appUserId; + } + + public void setAppUserId(Long appUserId) { + this.appUserId = appUserId; + } + @JSONField(serialize = false) @Override public String getPassword() diff --git a/ruoyi-common/src/main/java/com/ruoyi/common/core/domain/model/AppUserLoginBody.java b/ruoyi-common/src/main/java/com/ruoyi/common/core/domain/model/AppUserLoginBody.java index ee4f414..7f164b2 100644 --- a/ruoyi-common/src/main/java/com/ruoyi/common/core/domain/model/AppUserLoginBody.java +++ b/ruoyi-common/src/main/java/com/ruoyi/common/core/domain/model/AppUserLoginBody.java @@ -34,6 +34,7 @@ public class AppUserLoginBody * 用户密码 */ private String password; + private String passwordSecond; /** * 图片验证码 diff --git a/ruoyi-common/src/main/java/com/ruoyi/common/db/SshContextListener.java b/ruoyi-common/src/main/java/com/ruoyi/common/db/SshContextListener.java new file mode 100644 index 0000000..a71c384 --- /dev/null +++ b/ruoyi-common/src/main/java/com/ruoyi/common/db/SshContextListener.java @@ -0,0 +1,37 @@ +package com.ruoyi.common.db; + +import org.springframework.stereotype.Component; + +import javax.servlet.ServletContextEvent; +import javax.servlet.ServletContextListener; +import javax.servlet.annotation.WebListener; + + +//@Component//尽量加上这个 +//@WebListener//声明为监听器 implements ServletContextListener +public class SshContextListener implements ServletContextListener{ + + private SshTunnelConfig sshConnectionConfig; + + public SshContextListener() { + super(); + } + + @Override + public void contextInitialized(ServletContextEvent sce) { + System.out.println("Context initialized ... !"); + try { + sshConnectionConfig = new SshTunnelConfig(); + sshConnectionConfig.createSshTunnel(); + } catch (Throwable e) { + e.printStackTrace(); // 连接失败 + } + + } + + @Override + public void contextDestroyed(ServletContextEvent sce) { + System.out.println("Context destroyed ... !"); + sshConnectionConfig.closeSshTunnel();//断开ssh连接 + } +} diff --git a/ruoyi-common/src/main/java/com/ruoyi/common/db/SshTunnelConfig.java b/ruoyi-common/src/main/java/com/ruoyi/common/db/SshTunnelConfig.java new file mode 100644 index 0000000..f34af2b --- /dev/null +++ b/ruoyi-common/src/main/java/com/ruoyi/common/db/SshTunnelConfig.java @@ -0,0 +1,55 @@ +package com.ruoyi.common.db; + +import com.jcraft.jsch.JSch; +import com.jcraft.jsch.Session; +import org.springframework.stereotype.Component; + +import javax.annotation.PreDestroy; + +//@Component +public class SshTunnelConfig { + private Session session; + + //@Value("${ssh.host}") + private String sshHost="62.234.183.14"; + // @Value("${ssh.port}") + private int sshPort=22; + // @Value("${ssh.user}") + private String sshUser="root"; + // @Value("${ssh.identity}") + private String sshIdentity="E:\\runpeng\\runpeng20250915.pem"; + + // @Value("${ssh.remote.db.host}") + private String remoteDbHost="127.0.0.1"; + // @Value("${ssh.local.port}") + private int localPort=32768; + + // @Value("${ssh.remote.db.port}") + private int remoteDbPort=19116; + + public void createSshTunnel() throws Exception { + JSch jsch = new JSch(); + jsch.addIdentity(sshIdentity); + session = jsch.getSession(sshUser, sshHost, sshPort); +// session.setPassword(sshPassword); + + // 避免检查已知主机,生产环境应考虑更安全的方式 + java.util.Properties config = new java.util.Properties(); + config.put("StrictHostKeyChecking", "no"); + session.setConfig(config); + session.connect(); + // 设置本地端口转发 + session.setPortForwardingL(localPort, remoteDbHost, remoteDbPort); + System.out.println("SSH隧道已建立,本地端口:" + localPort); + + } + +// @PreDestroy + public void closeSshTunnel() { + if (session != null && session.isConnected()) { + session.disconnect(); + System.out.println("SSH隧道已关闭"); + } + } + +} diff --git a/ruoyi-common/src/main/java/com/ruoyi/common/im/enums/MessageType.java b/ruoyi-common/src/main/java/com/ruoyi/common/im/enums/MessageType.java index 224ec67..4aaf5d6 100644 --- a/ruoyi-common/src/main/java/com/ruoyi/common/im/enums/MessageType.java +++ b/ruoyi-common/src/main/java/com/ruoyi/common/im/enums/MessageType.java @@ -24,6 +24,8 @@ public enum MessageType { FILE(2, "文件消息"), AUDIO(3, "语音消息"), VIDEO(4, "视频消息"), + ORDER(5, "订单消息"), + PRODUCT(6, "商品消息"), RECALL(10, "撤回"), READED(11, "已读"), RECEIPT(12, "消息已读回执"), diff --git a/ruoyi-common/src/main/java/com/ruoyi/common/im/mq/RedisMQConfig.java b/ruoyi-common/src/main/java/com/ruoyi/common/im/mq/RedisMQConfig.java index 275345a..2a2f9af 100644 --- a/ruoyi-common/src/main/java/com/ruoyi/common/im/mq/RedisMQConfig.java +++ b/ruoyi-common/src/main/java/com/ruoyi/common/im/mq/RedisMQConfig.java @@ -17,17 +17,21 @@ public class RedisMQConfig { @Bean public RedisMQTemplate redisMQTemplate(RedisConnectionFactory redisConnectionFactory) { RedisMQTemplate redisMQTemplate = new RedisMQTemplate(); - redisMQTemplate.setConnectionFactory(redisConnectionFactory); + try{ + redisMQTemplate.setConnectionFactory(redisConnectionFactory); - // 设置值(value)的序列化采用FastJsonRedisSerializer - redisMQTemplate.setValueSerializer(fastJsonRedisSerializer()); - redisMQTemplate.setHashValueSerializer(fastJsonRedisSerializer()); + // 设置值(value)的序列化采用FastJsonRedisSerializer + redisMQTemplate.setValueSerializer(fastJsonRedisSerializer()); + redisMQTemplate.setHashValueSerializer(fastJsonRedisSerializer()); - // 设置键(key)的序列化采用StringRedisSerializer。 - redisMQTemplate.setKeySerializer(new StringRedisSerializer()); - redisMQTemplate.setHashKeySerializer(new StringRedisSerializer()); + // 设置键(key)的序列化采用StringRedisSerializer。 + redisMQTemplate.setKeySerializer(new StringRedisSerializer()); + redisMQTemplate.setHashKeySerializer(new StringRedisSerializer()); - redisMQTemplate.afterPropertiesSet(); + redisMQTemplate.afterPropertiesSet(); + }catch (Exception e){ + System.out.println(e); + } return redisMQTemplate; } diff --git a/ruoyi-common/src/main/java/com/ruoyi/common/utils/CodeUtil.java b/ruoyi-common/src/main/java/com/ruoyi/common/utils/CodeUtil.java new file mode 100644 index 0000000..c85f26d --- /dev/null +++ b/ruoyi-common/src/main/java/com/ruoyi/common/utils/CodeUtil.java @@ -0,0 +1,53 @@ +package com.ruoyi.common.utils; + +import cn.hutool.core.io.IoUtil; +import cn.hutool.extra.qrcode.QrCodeUtil; +import cn.hutool.extra.qrcode.QrConfig; +import cn.hutool.extra.qrcode.QrCodeException; + +import java.io.ByteArrayOutputStream; +import java.io.IOException; +import java.nio.charset.Charset; +import java.nio.charset.StandardCharsets; + +/** + * 二维码生成工具类(基于Hutool + ZXing,适配Java8 + SpringBoot) + * 核心功能:根据code生成二维码字节数组(接口返回)、生成二维码文件(本地保存) + */ +public class CodeUtil { + + // 二维码默认配置:宽度300px,高度300px,边距1,编码UTF-8 + private static final QrConfig DEFAULT_QR_CONFIG = new QrConfig(300, 300) + .setMargin(1) + .setCharset(Charset.forName("UTF-8")); + + /** + * 生成二维码字节数组(用于SpringBoot接口直接返回图片) + * @param code 二维码内容(如链接、编号、文本等) + * @return 二维码图片字节数组(PNG格式) + * @throws QrCodeException 二维码生成异常 + * @throws IOException 字节流操作异常 + */ + public static byte[] generateQrCodeBytes(String code) throws QrCodeException, IOException { + if (code == null || code.trim().isEmpty()) { + throw new IllegalArgumentException("二维码内容(code)不能为空"); + } + + // 字节输出流,用于存储二维码图片字节 + ByteArrayOutputStream outputStream = new ByteArrayOutputStream(); + try { + // Hutool核心方法:生成二维码并写入字节流 + QrCodeUtil.generate( + code, // 二维码内容 + DEFAULT_QR_CONFIG, // 配置(宽高、边距、编码) + "PNG", // 图片格式(PNG/JPG) + outputStream // 输出流 + ); + return outputStream.toByteArray(); + } finally { + // 关闭流,避免资源泄漏(Java8 try-finally 规范) + IoUtil.close(outputStream); + } + } + +} diff --git a/ruoyi-common/src/main/java/com/ruoyi/common/utils/SecurityUtils.java b/ruoyi-common/src/main/java/com/ruoyi/common/utils/SecurityUtils.java index 5d002d6..83520ef 100644 --- a/ruoyi-common/src/main/java/com/ruoyi/common/utils/SecurityUtils.java +++ b/ruoyi-common/src/main/java/com/ruoyi/common/utils/SecurityUtils.java @@ -6,7 +6,6 @@ import org.springframework.security.core.Authentication; import org.springframework.security.core.context.SecurityContextHolder; import org.springframework.security.crypto.bcrypt.BCryptPasswordEncoder; import com.ruoyi.common.constant.HttpStatus; -import com.ruoyi.common.core.domain.model.LoginUser; import com.ruoyi.common.exception.ServiceException; /** @@ -18,11 +17,11 @@ public class SecurityUtils { /** * 用户商户 */ - public static String getMerchanId() { + public static String getTenantId() { try { - return getLoginUser().getUser().getMerchantId(); + return getLoginUser().getUser().getTenantId(); } catch (Exception e) { - throw new ServiceException("获取商户id失败", HttpStatus.UNAUTHORIZED); + throw new ServiceException("获取租户id失败", HttpStatus.UNAUTHORIZED); } } diff --git a/ruoyi-common/src/main/java/com/ruoyi/common/utils/TimeCycleUtil.java b/ruoyi-common/src/main/java/com/ruoyi/common/utils/TimeCycleUtil.java new file mode 100644 index 0000000..2296a22 --- /dev/null +++ b/ruoyi-common/src/main/java/com/ruoyi/common/utils/TimeCycleUtil.java @@ -0,0 +1,227 @@ +package com.ruoyi.common.utils; + +import java.time.*; +import java.time.format.DateTimeFormatter; +import java.time.temporal.TemporalAdjusters; +import java.time.temporal.WeekFields; +import java.util.Locale; + +/** + * 周期时间范围工具类 + * 支持:每天/每周/半月/每月 的开始&结束时间计算,格式固定为 yyyy-MM-dd HH:mm:ss + */ +public class TimeCycleUtil { + // 时间格式化器(全局复用,线程安全) + private static final DateTimeFormatter DATETIME_FORMATTER = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss"); + // 定义周的起始(中国标准:周一为一周第一天) + private static final WeekFields WEEK_FIELDS = WeekFields.of(Locale.CHINA); + + /** + * 周期类型枚举(规范输入,避免硬编码) + */ + public enum CycleType { + DAILY("每天"), + WEEKLY("每周"), + HALF_MONTH("半月"), + MONTHLY("每月"); + + private final String desc; + + CycleType(String desc) { + this.desc = desc; + } + + // 根据输入字符串匹配枚举(忽略大小写) + public static CycleType match(String input) { + if (input == null || input.trim().isEmpty()) { + throw new IllegalArgumentException("周期类型不能为空"); + } + String trimInput = input.trim(); + for (CycleType type : CycleType.values()) { + if (type.desc.equals(trimInput) || type.name().equalsIgnoreCase(trimInput)) { + return type; + } + } + throw new IllegalArgumentException("不支持的周期类型:" + input + ",仅支持:每天、每周、半月、每月"); + } + } + + /** + * 时间范围返回结果 + */ + public static class TimeRange { + private String startTime; // 开始时间(yyyy-MM-dd HH:mm:ss) + private String endTime; // 结束时间(yyyy-MM-dd HH:mm:ss) + + public TimeRange(String startTime, String endTime) { + this.startTime = startTime; + this.endTime = endTime; + } + + // getter & setter + public String getStartTime() { + return startTime; + } + + public void setStartTime(String startTime) { + this.startTime = startTime; + } + + public String getEndTime() { + return endTime; + } + + public void setEndTime(String endTime) { + this.endTime = endTime; + } + + @Override + public String toString() { + return "TimeRange{" + + "开始时间='" + startTime + '\'' + + ", 结束时间='" + endTime + '\'' + + '}'; + } + } + + /** + * 核心方法:根据周期类型获取对应的时间范围 + * @param cycle 周期类型(支持:每天/每周/半月/每月,大小写不敏感) + * @return 时间范围(startTime + endTime) + */ + public static TimeRange getCycleTimeRange(String cycle) { + CycleType cycleType = CycleType.match(cycle); + LocalDate today = LocalDate.now(); // 当前日期(系统默认时区) + LocalDateTime startTime; + LocalDateTime endTime; + + switch (cycleType) { + case DAILY: + // 每天:当前日期 00:00:00 到 23:59:59 + startTime = today.atStartOfDay(); + endTime = today.atTime(23, 59, 59); + break; + + case WEEKLY: + // 每周:向前推1周 → 前一周的周一00:00:00 到 前一周的周日23:59:59 + // 步骤1:当前日期往前推7天,得到前一周的同天日期 + LocalDate lastWeekSameDay = today.minusWeeks(1); + // 步骤2:找到该日期所在周的周一(中国周:周一为第一天) + LocalDate lastWeekMonday = lastWeekSameDay.with(TemporalAdjusters.previousOrSame(WEEK_FIELDS.getFirstDayOfWeek())); + // 步骤3:前一周的周日 = 周一 + 6天 + LocalDate lastWeekSunday = lastWeekMonday.plusDays(6); + startTime = lastWeekMonday.atStartOfDay(); + endTime = lastWeekSunday.atTime(23, 59, 59); + break; + + case HALF_MONTH: + // 半月:向前推1个半月周期 → 规则: + // 1. 当前日期≤15号(上半月)→ 前一个半月是「上个月的16号 ~ 上个月最后一天」 + // 2. 当前日期>15号(下半月)→ 前一个半月是「本月的1号 ~ 本月15号」 + int currentDay = today.getDayOfMonth(); + if (currentDay <= 15) { + // 场景1:当前是上半月(如2026-02-10)→ 前半月=2026-01-16 ~ 2026-01-31 + LocalDate lastMonth = today.minusMonths(1); + startTime = lastMonth.withDayOfMonth(16).atStartOfDay(); + LocalDate lastMonthLastDay = lastMonth.with(TemporalAdjusters.lastDayOfMonth()); + endTime = lastMonthLastDay.atTime(23, 59, 59); + } else { + // 场景2:当前是下半月(如2026-02-18)→ 前半月=2026-02-01 ~ 2026-02-15 + startTime = today.withDayOfMonth(1).atStartOfDay(); + endTime = today.withDayOfMonth(15).atTime(23, 59, 59); + } + break; + + case MONTHLY: + // 每月:向前推1个月 → 上个月的第一天00:00:00 到 上个月最后一天23:59:59 + LocalDate lastMonth = today.minusMonths(1); + LocalDate lastMonthFirstDay = lastMonth.with(TemporalAdjusters.firstDayOfMonth()); + LocalDate lastMonthLastDay = lastMonth.with(TemporalAdjusters.lastDayOfMonth()); + startTime = lastMonthFirstDay.atStartOfDay(); + endTime = lastMonthLastDay.atTime(23, 59, 59); + break; + + default: + throw new IllegalArgumentException("未实现的周期类型:" + cycleType); + } + + // 格式化时间为指定格式 + return new TimeRange( + startTime.format(DATETIME_FORMATTER), + endTime.format(DATETIME_FORMATTER) + ); + } + + /** + * 重载方法:支持指定时区(解决跨时区场景) + * @param cycle 周期类型 + * @param zoneId 时区(如:ZoneId.of("Asia/Shanghai")) + * @return 时间范围 + */ + public static TimeRange getCycleTimeRange(String cycle, ZoneId zoneId) { + LocalDate today = LocalDate.now(zoneId); + LocalDateTime startTime; + LocalDateTime endTime; + CycleType cycleType = CycleType.match(cycle); + + switch (cycleType) { + case DAILY: + startTime = today.atStartOfDay(); + endTime = today.atTime(23, 59, 59); + break; + case WEEKLY: + LocalDate monday = today.with(TemporalAdjusters.previousOrSame(WEEK_FIELDS.getFirstDayOfWeek())); + LocalDate sunday = monday.plusDays(6); + startTime = monday.atStartOfDay(); + endTime = sunday.atTime(23, 59, 59); + break; + case HALF_MONTH: + int dayOfMonth = today.getDayOfMonth(); + if (dayOfMonth <= 15) { + startTime = today.withDayOfMonth(1).atStartOfDay(); + endTime = today.withDayOfMonth(15).atTime(23, 59, 59); + } else { + startTime = today.withDayOfMonth(16).atStartOfDay(); + LocalDate lastDayOfMonth = today.with(TemporalAdjusters.lastDayOfMonth()); + endTime = lastDayOfMonth.atTime(23, 59, 59); + } + break; + case MONTHLY: + LocalDate firstDayOfMonth = today.with(TemporalAdjusters.firstDayOfMonth()); + LocalDate lastDayOfMonth = today.with(TemporalAdjusters.lastDayOfMonth()); + startTime = firstDayOfMonth.atStartOfDay(); + endTime = lastDayOfMonth.atTime(23, 59, 59); + break; + default: + throw new IllegalArgumentException("未实现的周期类型:" + cycleType); + } + + return new TimeRange( + startTime.format(DATETIME_FORMATTER), + endTime.format(DATETIME_FORMATTER) + ); + } + + // 测试示例 +// public static void main(String[] args) { +// // 测试1:每天(当前日期:2026-02-10) +// TimeRange dailyRange = getCycleTimeRange("每天"); +// System.out.println("每天:" + dailyRange); // 输出:开始时间='2026-02-10 00:00:00', 结束时间='2026-02-10 23:59:59' +// +// // 测试2:每周(假设今天是2026-02-10,周二 → 本周一2026-02-09 到 周日2026-02-15) +// TimeRange weeklyRange = getCycleTimeRange("每周"); +// System.out.println("每周:" + weeklyRange); +// +// // 测试3:半月(2026-02-10 属于上半月 → 2026-02-01 到 2026-02-15) +// TimeRange halfMonthRange = getCycleTimeRange("半月"); +// System.out.println("半月:" + halfMonthRange); +// +// // 测试4:每月(2026-02月 → 2026-02-01 到 2026-02-28) +// TimeRange monthlyRange = getCycleTimeRange("每月"); +// System.out.println("每月:" + monthlyRange); +// +// // 测试5:指定时区(上海时区) +// TimeRange shanghaiRange = getCycleTimeRange("每天", ZoneId.of("Asia/Shanghai")); +// System.out.println("每天(上海时区):" + shanghaiRange); +// } +} diff --git a/ruoyi-framework/ruoyi-framework.iml b/ruoyi-framework/ruoyi-framework.iml index da56c9e..b1bce58 100644 --- a/ruoyi-framework/ruoyi-framework.iml +++ b/ruoyi-framework/ruoyi-framework.iml @@ -4,6 +4,7 @@ + @@ -14,10 +15,10 @@ - + @@ -120,7 +121,11 @@ - + + + + + @@ -212,5 +217,6 @@ + \ No newline at end of file diff --git a/ruoyi-framework/src/main/java/com/ruoyi/framework/config/SecurityConfig.java b/ruoyi-framework/src/main/java/com/ruoyi/framework/config/SecurityConfig.java index c732532..8c89396 100644 --- a/ruoyi-framework/src/main/java/com/ruoyi/framework/config/SecurityConfig.java +++ b/ruoyi-framework/src/main/java/com/ruoyi/framework/config/SecurityConfig.java @@ -138,10 +138,12 @@ public class SecurityConfig extends WebSecurityConfigurerAdapter // 过滤请求 .authorizeRequests() // 对于登录login 注册register 验证码captchaImage 允许匿名访问 - .antMatchers("/login", "/register", "/captchaImage","/getStoreList", "/api/login", "/api/register").anonymous() + .antMatchers("/login", "/register", "/captchaImage","/getStoreList", "/api/login", "/api/register" ).anonymous() // 静态资源,可匿名访问 .antMatchers(HttpMethod.GET, "/", "/*.html", "/**/*.html", "/**/*.css", "/**/*.js", "/profile/**").permitAll() .antMatchers("/swagger-ui.html", "/swagger-resources/**", "/webjars/**", "/*/api-docs", "/druid/**").permitAll() + .antMatchers("/api/appreciate/**","/api/context/**","/api/healthy/**","/api/index/**","/api/context/searchListForCalendar", + "/api/inherit/**", "/api/moments/**", "/api/sense/**", "/api/store/**", "/api/product/**").permitAll() // 除上面外的所有请求全部需要鉴权认证 .anyRequest().authenticated() .and() diff --git a/ruoyi-framework/src/main/java/com/ruoyi/framework/web/service/AppLoginService.java b/ruoyi-framework/src/main/java/com/ruoyi/framework/web/service/AppLoginService.java index a49b719..e644bf4 100644 --- a/ruoyi-framework/src/main/java/com/ruoyi/framework/web/service/AppLoginService.java +++ b/ruoyi-framework/src/main/java/com/ruoyi/framework/web/service/AppLoginService.java @@ -104,11 +104,12 @@ public class AppLoginService boolean update=false; UpdateWrapper wrapper=new UpdateWrapper().eq("app_user_id",loginUser.getAppUserId()); - if (!loginUser.getAppUser().getRegisterId().equals(registerId)){ + //设备id + if (StrUtil.isNotEmpty(loginUser.getAppUser().getRegisterId())&&!loginUser.getAppUser().getRegisterId().equals(registerId)){ wrapper.set("register_id",registerId); update=true; } - + //小程序登录 if (StrUtil.isNotEmpty(miniAppCode) && StrUtil.isEmpty(loginUser.getAppUser().getOpenid())){ HashMap map=getOpenId(miniAppCode); @@ -121,7 +122,9 @@ public class AppLoginService } //将登录信息存入到数据库 - recordLoginInfo(loginUser.getAppUserId()); + wrapper.set("login_ip",IpUtils.getIpAddr(ServletUtils.getRequest())); + wrapper.set("login_date",DateUtils.getNowDate()); + appUserService.update(wrapper); // 生成token return tokenService.createAppToken(loginUser); @@ -150,19 +153,7 @@ public class AppLoginService } - /** - * 记录登录信息 - * - * @param userId 用户ID - */ - public void recordLoginInfo(Long userId) - { - AppUser appUser = new AppUser(); - appUser.setId(userId); - appUser.setLoginIp(IpUtils.getIpAddr(ServletUtils.getRequest())); - appUser.setLoginDate(DateUtils.getNowDate()); - appUserService.updateById(appUser); - } + //获取openid public HashMap getOpenId(String code) { diff --git a/ruoyi-framework/src/main/java/com/ruoyi/framework/web/service/AppUserDetailsServiceImpl.java b/ruoyi-framework/src/main/java/com/ruoyi/framework/web/service/AppUserDetailsServiceImpl.java index 6053ebe..d47a7dc 100644 --- a/ruoyi-framework/src/main/java/com/ruoyi/framework/web/service/AppUserDetailsServiceImpl.java +++ b/ruoyi-framework/src/main/java/com/ruoyi/framework/web/service/AppUserDetailsServiceImpl.java @@ -1,27 +1,27 @@ package com.ruoyi.framework.web.service; +import cn.hutool.core.util.ArrayUtil; +import cn.hutool.core.util.ObjectUtil; import com.ruoyi.basic.service.impl.YjAppUserServiceImpl; -import com.ruoyi.common.constant.Constants; import com.ruoyi.common.core.domain.entity.AppUser; +import com.ruoyi.common.core.domain.entity.SysRole; import com.ruoyi.common.core.domain.entity.SysUser; import com.ruoyi.common.core.domain.model.AppLoginUser; -import com.ruoyi.common.core.domain.model.LoginUser; -import com.ruoyi.common.enums.UserStatus; import com.ruoyi.common.exception.ServiceException; -import com.ruoyi.common.utils.SecurityUtils; import com.ruoyi.common.utils.StringUtils; -import com.ruoyi.framework.security.context.AuthenticationContextHolder; +import com.ruoyi.course.service.IScStudentService; +import com.ruoyi.system.service.SysTeacherService; import com.ruoyi.system.service.ISysUserService; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.context.annotation.Primary; -import org.springframework.security.core.Authentication; import org.springframework.security.core.userdetails.UserDetails; import org.springframework.security.core.userdetails.UserDetailsService; import org.springframework.security.core.userdetails.UsernameNotFoundException; import org.springframework.stereotype.Component; -import org.springframework.stereotype.Service; + +import java.util.ArrayList; +import java.util.List; /** * 用户验证处理 @@ -37,6 +37,13 @@ public class AppUserDetailsServiceImpl implements UserDetailsService @Autowired private YjAppUserServiceImpl userService; + @Autowired + private ISysUserService sysUserService; + @Autowired + private SysPasswordService passwordService; + @Autowired + private IScStudentService studentService; + @Override public UserDetails loadUserByUsername(String username) throws UsernameNotFoundException { @@ -51,16 +58,37 @@ public class AppUserDetailsServiceImpl implements UserDetailsService log.info("登录用户:{} 已被停用.", username); throw new ServiceException("对不起,您的账号:" + username + " 已停用"); } + List roles=new ArrayList<>(); + roles.add(107l); + if (ObjectUtil.isNotEmpty(user.getManageAccountId())){ + //todo 角色ID;顾问:103 ;教练:104 ;店长:105 ;普通用户:107; + + SysUser sysUser= sysUserService.selectUserById(user.getManageAccountId()); + if (ObjectUtil.isEmpty(sysUser)){ + log.info("登录用户:{} 已被停用.", username); + throw new ServiceException("对不起,您的账号:" + username + " 所属租户异常,请联系管理员!"); + } + List roles1=sysUser.getRoles(); + for (SysRole sysRole : roles1) { + roles.add(sysRole.getRoleId()); + } + } + Long studentId=studentService.getStudentByAppUserId(user.getId()); + // Authentication usernamePasswordAuthenticationToken = AuthenticationContextHolder.getContext(); // String password = usernamePasswordAuthenticationToken.getCredentials().toString(); // if (!SecurityUtils.matchesPassword(password,user.getPassword())){ // throw new RuntimeException(Constants.LOGIN_INFO.WRONG); // } - return createLoginUser(user); + + SysUser user1=new SysUser(); + user1.setPassword(user.getPassword()); + passwordService.validate(user1); + return createLoginUser(user,roles.toArray(new Long[roles.size()]) ,studentId); } - public UserDetails createLoginUser(AppUser user) + public UserDetails createLoginUser(AppUser user, Long[] roles,Long studentId) { - return new AppLoginUser(user.getId(), user); + return new AppLoginUser(user.getId(),user.getUserName(), user.getManageAccountId(),roles,studentId, user); } } diff --git a/ruoyi-framework/src/main/java/com/ruoyi/framework/web/service/SysLoginService.java b/ruoyi-framework/src/main/java/com/ruoyi/framework/web/service/SysLoginService.java deleted file mode 100644 index f12d18d..0000000 --- a/ruoyi-framework/src/main/java/com/ruoyi/framework/web/service/SysLoginService.java +++ /dev/null @@ -1,176 +0,0 @@ -package com.ruoyi.framework.web.service; - -import cn.hutool.core.util.StrUtil; -import com.ruoyi.common.constant.CacheConstants; -import com.ruoyi.common.constant.Constants; -import com.ruoyi.common.core.domain.entity.SysUser; -import com.ruoyi.common.core.domain.model.AppLoginUser; -import com.ruoyi.common.core.domain.model.LoginUser; -import com.ruoyi.common.core.redis.RedisCache; -import com.ruoyi.common.exception.ServiceException; -import com.ruoyi.common.exception.user.CaptchaException; -import com.ruoyi.common.exception.user.CaptchaExpireException; -import com.ruoyi.common.exception.user.UserPasswordNotMatchException; -import com.ruoyi.common.utils.DateUtils; -import com.ruoyi.common.utils.MessageUtils; -import com.ruoyi.common.utils.ServletUtils; -import com.ruoyi.common.utils.StringUtils; -import com.ruoyi.common.utils.ip.IpUtils; -import com.ruoyi.framework.manager.AsyncManager; -import com.ruoyi.framework.manager.factory.AsyncFactory; -import com.ruoyi.framework.security.context.AuthenticationContextHolder; -import com.ruoyi.system.service.ISysConfigService; -import com.ruoyi.system.service.ISysUserService; -import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.beans.factory.annotation.Qualifier; -import org.springframework.security.authentication.AuthenticationManager; -import org.springframework.security.authentication.BadCredentialsException; -import org.springframework.security.authentication.UsernamePasswordAuthenticationToken; -import org.springframework.security.core.Authentication; -import org.springframework.stereotype.Component; -import org.springframework.web.bind.annotation.PostMapping; - -import javax.annotation.Resource; - -/** - * 登录校验方法 - * - * @author ruoyi - */ -@Component -public class SysLoginService -{ - @Autowired - private TokenService tokenService; - - @Resource - private AuthenticationManager authenticationManager; - - - - @Autowired - private RedisCache redisCache; - - @Autowired - private ISysUserService userService; - - @Autowired - private ISysConfigService configService; - - /** - * 登录验证 - * - * @param username 用户名 - * @param password 密码 - * @param code 验证码 - * @param uuid 唯一标识 - * @return 结果 - */ - public String login(String username, String password, String code, String uuid) - { - boolean captchaEnabled = configService.selectCaptchaEnabled(); - // 验证码开关 - if (captchaEnabled) - { - validateCaptcha(username, code, uuid); - } - // 用户验证 - Authentication authentication = null; - try - { - //UsernamePasswordAuthenticationToken是Authenticatiion的实现类 - UsernamePasswordAuthenticationToken authenticationToken = new UsernamePasswordAuthenticationToken(username, password); - //这里设置成上下文的意图是在身份验证过程中, - //其他组件或方法可以获取到该对象,以便进行相关的操作, - //比如记录登录日志、获取用户信息等。 - AuthenticationContextHolder.setContext(authenticationToken); - // 该方法会去调用UserDetailsServiceImpl.loadUserByUsername - authentication = authenticationManager.authenticate(authenticationToken); - } - catch (Exception e) - { - if (e instanceof BadCredentialsException) - { - AsyncManager.me().execute(AsyncFactory.recordLogininfor(username, Constants.LOGIN_FAIL, MessageUtils.message("user.password.not.match"))); - throw new UserPasswordNotMatchException(); - } - else - { - AsyncManager.me().execute(AsyncFactory.recordLogininfor(username, Constants.LOGIN_FAIL, e.getMessage())); - throw new ServiceException(e.getMessage()); - } - } - finally - { - //最后要在对应操作完成之后,清理Context - AuthenticationContextHolder.clearContext(); - } - AsyncManager.me().execute(AsyncFactory.recordLogininfor(username, Constants.LOGIN_SUCCESS, MessageUtils.message("user.login.success"))); - //这里就是拿到自定义封装的用户信息 - LoginUser loginUser = (LoginUser) authentication.getPrincipal(); - if (StrUtil.isEmpty(loginUser.getUser().getMerchantId())){ - throw new RuntimeException("未建商户无法登录"); - } - //将登录信息存入到数据库 - recordLoginInfo(loginUser.getUserId()); - // 生成token - return tokenService.createToken(loginUser); - } - - /** - * 校验验证码 - * - * @param username 用户名 - * @param code 验证码 - * @param uuid 唯一标识 - * @return 结果 - */ - public void validateCaptcha(String username, String code, String uuid) - { - String verifyKey = CacheConstants.CAPTCHA_CODE_KEY + StringUtils.nvl(uuid, ""); - String captcha = redisCache.getCacheObject(verifyKey); - redisCache.deleteObject(verifyKey); - if (captcha == null) - { - AsyncManager.me().execute(AsyncFactory.recordLogininfor(username, Constants.LOGIN_FAIL, MessageUtils.message("user.jcaptcha.expire"))); - throw new CaptchaExpireException(); - } - if (!code.equalsIgnoreCase(captcha)) - { - AsyncManager.me().execute(AsyncFactory.recordLogininfor(username, Constants.LOGIN_FAIL, MessageUtils.message("user.jcaptcha.error"))); - throw new CaptchaException(); - } - } - - /** - * 记录登录信息 - * - * @param userId 用户ID - */ - public void recordLoginInfo(Long userId) - { - SysUser sysUser = new SysUser(); - sysUser.setUserId(userId); - sysUser.setLoginIp(IpUtils.getIpAddr(ServletUtils.getRequest())); - sysUser.setLoginDate(DateUtils.getNowDate()); - userService.updateUserProfile(sysUser); - } - - /** - * 校验验证码有效性 - * @param uuid 唯一标识 - * @param phone 手机号 - * @param inputCode 输入的验证码 - */ - private void validateVerifyCode(String uuid, String phone, String inputCode){ - String key = uuid + "_" + phone; - String redisCode = redisCache.getCacheObject(key); - if (redisCode == null){ - throw new RuntimeException(Constants.VERIFY_CODE_INFO.EXPIRED); - }else if (!redisCode.equals(inputCode)){ - throw new RuntimeException(Constants.VERIFY_CODE_INFO.WRONG); - } - //删除缓存 - redisCache.deleteObject(key); - } -} diff --git a/ruoyi-framework/src/main/java/com/ruoyi/framework/web/service/SysRegisterService.java b/ruoyi-framework/src/main/java/com/ruoyi/framework/web/service/SysRegisterService.java deleted file mode 100644 index a3b273b..0000000 --- a/ruoyi-framework/src/main/java/com/ruoyi/framework/web/service/SysRegisterService.java +++ /dev/null @@ -1,116 +0,0 @@ -package com.ruoyi.framework.web.service; - -import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.stereotype.Component; -import com.ruoyi.common.constant.CacheConstants; -import com.ruoyi.common.constant.Constants; -import com.ruoyi.common.constant.UserConstants; -import com.ruoyi.common.core.domain.entity.SysUser; -import com.ruoyi.common.core.domain.model.RegisterBody; -import com.ruoyi.common.core.redis.RedisCache; -import com.ruoyi.common.exception.user.CaptchaException; -import com.ruoyi.common.exception.user.CaptchaExpireException; -import com.ruoyi.common.utils.MessageUtils; -import com.ruoyi.common.utils.SecurityUtils; -import com.ruoyi.common.utils.StringUtils; -import com.ruoyi.framework.manager.AsyncManager; -import com.ruoyi.framework.manager.factory.AsyncFactory; -import com.ruoyi.system.service.ISysConfigService; -import com.ruoyi.system.service.ISysUserService; - -/** - * 注册校验方法 - * - * @author ruoyi - */ -@Component -public class SysRegisterService -{ - @Autowired - private ISysUserService userService; - - @Autowired - private ISysConfigService configService; - - @Autowired - private RedisCache redisCache; - - /** - * 注册 - */ - public String register(RegisterBody registerBody) - { - String msg = "", username = registerBody.getUsername(), password = registerBody.getPassword(); - - boolean captchaEnabled = configService.selectCaptchaEnabled(); - // 验证码开关 - if (captchaEnabled) - { - validateCaptcha(username, registerBody.getCode(), registerBody.getUuid()); - } - - if (StringUtils.isEmpty(username)) - { - msg = "用户名不能为空"; - } - else if (StringUtils.isEmpty(password)) - { - msg = "用户密码不能为空"; - } - else if (username.length() < UserConstants.USERNAME_MIN_LENGTH - || username.length() > UserConstants.USERNAME_MAX_LENGTH) - { - msg = "账户长度必须在2到20个字符之间"; - } - else if (password.length() < UserConstants.PASSWORD_MIN_LENGTH - || password.length() > UserConstants.PASSWORD_MAX_LENGTH) - { - msg = "密码长度必须在5到20个字符之间"; - } - else if (UserConstants.NOT_UNIQUE.equals(userService.checkUserNameUnique(username))) - { - msg = "保存用户'" + username + "'失败,注册账号已存在"; - } - else - { - SysUser sysUser = new SysUser(); - sysUser.setUserName(username); - sysUser.setNickName(username); - sysUser.setPassword(SecurityUtils.encryptPassword(registerBody.getPassword())); - boolean regFlag = userService.registerUser(sysUser); - if (!regFlag) - { - msg = "注册失败,请联系系统管理人员"; - } - else - { - AsyncManager.me().execute(AsyncFactory.recordLogininfor(username, Constants.REGISTER, - MessageUtils.message("user.register.success"))); - } - } - return msg; - } - - /** - * 校验验证码 - * - * @param username 用户名 - * @param code 验证码 - * @param uuid 唯一标识 - * @return 结果 - */ - public void validateCaptcha(String username, String code, String uuid) - { - String verifyKey = CacheConstants.CAPTCHA_CODE_KEY + StringUtils.nvl(uuid, ""); - String captcha = redisCache.getCacheObject(verifyKey); - redisCache.deleteObject(verifyKey); - if (captcha == null) - { - throw new CaptchaExpireException(); - } - if (!code.equalsIgnoreCase(captcha)) - { - throw new CaptchaException(); - } - } -} diff --git a/ruoyi-framework/src/main/java/com/ruoyi/framework/web/service/TokenService.java b/ruoyi-framework/src/main/java/com/ruoyi/framework/web/service/TokenService.java index db9dde9..1a0b2f6 100644 --- a/ruoyi-framework/src/main/java/com/ruoyi/framework/web/service/TokenService.java +++ b/ruoyi-framework/src/main/java/com/ruoyi/framework/web/service/TokenService.java @@ -259,6 +259,7 @@ public class TokenService refreshAppToken(loginUser); Map claims = new HashMap<>(); claims.put(Constants.LOGIN_APPUSER_KEY, token); + claims.put(Constants.JWT_USERID,loginUser.getAppUserId()); return createToken(claims); } diff --git a/ruoyi-im-client/ruoyi-im-client.iml b/ruoyi-im-client/ruoyi-im-client.iml index e9a0a10..82dbb43 100644 --- a/ruoyi-im-client/ruoyi-im-client.iml +++ b/ruoyi-im-client/ruoyi-im-client.iml @@ -99,7 +99,11 @@ - + + + + + @@ -179,5 +183,6 @@ + \ No newline at end of file diff --git a/ruoyi-im-client/src/main/java/com/ruoyi/imclient/sender/IMSender.java b/ruoyi-im-client/src/main/java/com/ruoyi/imclient/sender/IMSender.java index 953e9f7..97b291a 100644 --- a/ruoyi-im-client/src/main/java/com/ruoyi/imclient/sender/IMSender.java +++ b/ruoyi-im-client/src/main/java/com/ruoyi/imclient/sender/IMSender.java @@ -156,14 +156,18 @@ public class IMSender { } // 批量拉取 List serverIds = redisMQTemplate.opsForValue().multiGet(sendMap.keySet()); + // 格式:map<服务器id,list<接收方>> Map> serverMap = new HashMap<>(); List offLineUsers = new LinkedList<>(); int idx = 0; + for (Map.Entry entry : sendMap.entrySet()) { - Integer serverId = (Integer)serverIds.get(idx++); + Long serverId = (Long) serverIds.get(idx++); + // 如果对方在线,将数据存储至redis,等待拉取推送 if (!Objects.isNull(serverId)) { - List list = serverMap.computeIfAbsent(serverId, o -> new LinkedList<>()); + + List list = serverMap.computeIfAbsent(Integer.parseInt(serverId.toString()), o -> new LinkedList<>()); list.add(entry.getValue()); } else { // 加入离线列表 diff --git a/ruoyi-im-client/target/classes/com/ruoyi/imclient/sender/IMSender.class b/ruoyi-im-client/target/classes/com/ruoyi/imclient/sender/IMSender.class index 6579197..a46cce5 100644 Binary files a/ruoyi-im-client/target/classes/com/ruoyi/imclient/sender/IMSender.class and b/ruoyi-im-client/target/classes/com/ruoyi/imclient/sender/IMSender.class differ diff --git a/ruoyi-im-server/pom.xml b/ruoyi-im-server/pom.xml index bbd9fae..be90a8a 100644 --- a/ruoyi-im-server/pom.xml +++ b/ruoyi-im-server/pom.xml @@ -54,4 +54,4 @@ ${project.artifactId} - \ No newline at end of file + diff --git a/ruoyi-im-server/ruoyi-im-server.iml b/ruoyi-im-server/ruoyi-im-server.iml index 3274637..fd62802 100644 --- a/ruoyi-im-server/ruoyi-im-server.iml +++ b/ruoyi-im-server/ruoyi-im-server.iml @@ -102,7 +102,11 @@ - + + + + + @@ -153,5 +157,6 @@ + \ No newline at end of file diff --git a/ruoyi-im-server/src/main/java/com/ruoyi/imserver/netty/IMServerGroup.java b/ruoyi-im-server/src/main/java/com/ruoyi/imserver/netty/IMServerGroup.java index 34085be..41fc76a 100644 --- a/ruoyi-im-server/src/main/java/com/ruoyi/imserver/netty/IMServerGroup.java +++ b/ruoyi-im-server/src/main/java/com/ruoyi/imserver/netty/IMServerGroup.java @@ -3,9 +3,12 @@ package com.ruoyi.imserver.netty; import com.ruoyi.common.im.constant.IMRedisKey; import com.ruoyi.common.im.mq.RedisMQTemplate; +import io.netty.channel.EventLoopGroup; import lombok.AllArgsConstructor; import lombok.extern.slf4j.Slf4j; import org.springframework.boot.CommandLineRunner; +import org.springframework.context.SmartLifecycle; +import org.springframework.data.redis.connection.RedisConnection; import org.springframework.stereotype.Component; import javax.annotation.PreDestroy; @@ -37,18 +40,52 @@ public class IMServerGroup implements CommandLineRunner { @Override public void run(String... args) { - // 初始化SERVER_ID + try { + System.out.println("========== IMServerGroup 开始初始化 =========="); + + // 1. 先验证Redis连接 + if (!testRedisConnection()) { + // 不要直接退出,记录错误,让应用继续启动(如果需要) + System.err.println("严重:Redis连接失败,但应用将继续启动(部分功能可能不可用)"); + // 根据业务决定:如果Redis是必须的,可以抛出异常: + // throw new RuntimeException("Redis连接失败,应用启动中止"); + } String key = IMRedisKey.IM_MAX_SERVER_ID; serverId = redisMQTemplate.opsForValue().increment(key, 1); - // 启动服务 + + for (IMServer imServer : imServers) { imServer.start(); } + + System.out.println("========== IMServerGroup 初始化完成 =========="); + }catch (Exception e) { + // 捕获所有异常,打印详细信息,但可以选择不向上抛出,防止应用退出 + System.err.println("IMServerGroup 初始化过程中发生严重错误:"); + e.printStackTrace(); // 打印完整的堆栈跟踪,这能帮你定位到具体行号 + // 重要决策:是否重新抛出异常? + // 如果希望应用继续运行(比如Redis失败但想先看其他功能),就注释掉下一行 + // 如果希望应用停止,就保留下一行 + // throw new RuntimeException("IMServerGroup启动失败", e); + } } + private boolean testRedisConnection() { + try { + // 使用你之前编写的连接测试代码 + // 例如:String pong = redisTemplate.getConnectionFactory().getConnection().ping(); + String pong = redisMQTemplate.getConnectionFactory().getConnection().ping(); + System.out.println("Redis连接测试成功 "+pong); + return true; + } catch (Exception e) { + System.err.println("Redis连接测试失败: " + e.getClass().getName() + " - " + e.getMessage()); + return false; + } + } @PreDestroy public void destroy() { // 停止服务 + log.info("消费线程停止12..."); for (IMServer imServer : imServers) { imServer.stop(); } diff --git a/ruoyi-im-server/src/main/java/com/ruoyi/imserver/netty/processor/LoginProcessor.java b/ruoyi-im-server/src/main/java/com/ruoyi/imserver/netty/processor/LoginProcessor.java index daf7aca..0093d03 100644 --- a/ruoyi-im-server/src/main/java/com/ruoyi/imserver/netty/processor/LoginProcessor.java +++ b/ruoyi-im-server/src/main/java/com/ruoyi/imserver/netty/processor/LoginProcessor.java @@ -1,6 +1,9 @@ package com.ruoyi.imserver.netty.processor; import cn.hutool.core.bean.BeanUtil; +import com.ruoyi.common.constant.CacheConstants; +import com.ruoyi.common.constant.Constants; +import com.ruoyi.common.core.domain.model.AppLoginUser; import com.ruoyi.common.im.constant.IMConstant; import com.ruoyi.common.im.constant.IMRedisKey; import com.ruoyi.common.im.enums.IMCmdType; diff --git a/ruoyi-im-server/src/main/resources/application-druid.yml b/ruoyi-im-server/src/main/resources/application-druid.yml index 8acfbfc..8ae77c1 100644 --- a/ruoyi-im-server/src/main/resources/application-druid.yml +++ b/ruoyi-im-server/src/main/resources/application-druid.yml @@ -6,8 +6,8 @@ spring: druid: # 主库数据源 master: - url: jdbc:mysql://101.43.111.159:3306/yoga?useUnicode=true&characterEncoding=utf8&zeroDateTimeBehavior=convertToNull&useSSL=true&serverTimezone=GMT%2B8 -# url: jdbc:mysql://localhost:3306/yj?useUnicode=true&characterEncoding=utf8&zeroDateTimeBehavior=convertToNull&useSSL=true&serverTimezone=GMT%2B8 + url: jdbc:mysql://127.0.0.1:32768/yoga?useUnicode=true&characterEncoding=utf8&zeroDateTimeBehavior=convertToNull&useSSL=true&serverTimezone=GMT%2B8 +# url: jdbc:mysql://127.0.0.1:3306/yj?useUnicode=true&characterEncoding=utf8&zeroDateTimeBehavior=convertToNull&useSSL=true&serverTimezone=GMT%2B8 username: root password: '!Runpeng888' # password: 123456 diff --git a/ruoyi-im-server/src/main/resources/application.yml b/ruoyi-im-server/src/main/resources/application.yml index 2579829..ca73400 100644 --- a/ruoyi-im-server/src/main/resources/application.yml +++ b/ruoyi-im-server/src/main/resources/application.yml @@ -12,6 +12,15 @@ tcpsocket: enable: false # 暂时不开启 port: 8879 +logging: + level: + org: + springframework: + data: + redis: TRACE # 查看Redis操作细节 + io.lettuce.core: DEBUG # 如果使用Lettuce,关注WARN以上错误 + com.ruoyi: DEBUG + # token配置 token: # 令牌自定义标识 diff --git a/ruoyi-system/pom.xml b/ruoyi-system/pom.xml index a0a8db3..43266ea 100644 --- a/ruoyi-system/pom.xml +++ b/ruoyi-system/pom.xml @@ -27,6 +27,11 @@ mysql mysql-connector-java + + com.jcraft + jsch + 0.1.46 + com.ruoyi diff --git a/ruoyi-system/ruoyi-system.iml b/ruoyi-system/ruoyi-system.iml index 6d5841c..5796973 100644 --- a/ruoyi-system/ruoyi-system.iml +++ b/ruoyi-system/ruoyi-system.iml @@ -101,7 +101,11 @@ - + + + + + @@ -179,6 +183,7 @@ + diff --git a/ruoyi-system/src/main/java/com/ruoyi/basic/domain/YjAppreciate.java b/ruoyi-system/src/main/java/com/ruoyi/basic/domain/YjAppreciate.java index 525f549..c0b5225 100644 --- a/ruoyi-system/src/main/java/com/ruoyi/basic/domain/YjAppreciate.java +++ b/ruoyi-system/src/main/java/com/ruoyi/basic/domain/YjAppreciate.java @@ -1,6 +1,7 @@ package com.ruoyi.basic.domain; import com.baomidou.mybatisplus.annotation.IdType; +import com.baomidou.mybatisplus.annotation.TableField; import com.baomidou.mybatisplus.annotation.TableId; import com.fasterxml.jackson.annotation.JsonFormat; import io.swagger.annotations.ApiModel; @@ -74,7 +75,8 @@ public class YjAppreciate implements Serializable { /** * 所属门店id */ - private String visitStore; + @TableField("dept_id") + private String deptId; } diff --git a/ruoyi-system/src/main/java/com/ruoyi/basic/domain/YjHealthy.java b/ruoyi-system/src/main/java/com/ruoyi/basic/domain/YjHealthy.java index 9bc1863..13a815f 100644 --- a/ruoyi-system/src/main/java/com/ruoyi/basic/domain/YjHealthy.java +++ b/ruoyi-system/src/main/java/com/ruoyi/basic/domain/YjHealthy.java @@ -1,6 +1,7 @@ package com.ruoyi.basic.domain; import com.baomidou.mybatisplus.annotation.IdType; +import com.baomidou.mybatisplus.annotation.TableField; import com.baomidou.mybatisplus.annotation.TableId; import com.fasterxml.jackson.annotation.JsonFormat; import io.swagger.annotations.ApiModel; @@ -74,7 +75,8 @@ public class YjHealthy implements Serializable { /** * 所属门店id */ - private String visitStore; + @TableField("dept_id") + private String deptId; } diff --git a/ruoyi-system/src/main/java/com/ruoyi/basic/domain/YjInherit.java b/ruoyi-system/src/main/java/com/ruoyi/basic/domain/YjInherit.java index cf64826..b87eb52 100644 --- a/ruoyi-system/src/main/java/com/ruoyi/basic/domain/YjInherit.java +++ b/ruoyi-system/src/main/java/com/ruoyi/basic/domain/YjInherit.java @@ -75,7 +75,7 @@ public class YjInherit implements Serializable { * * 所属商户id */ - private String visitStore; + private String deptId; } diff --git a/ruoyi-system/src/main/java/com/ruoyi/basic/domain/YjPracticeMoments.java b/ruoyi-system/src/main/java/com/ruoyi/basic/domain/YjPracticeMoments.java index 0d240be..b236cc3 100644 --- a/ruoyi-system/src/main/java/com/ruoyi/basic/domain/YjPracticeMoments.java +++ b/ruoyi-system/src/main/java/com/ruoyi/basic/domain/YjPracticeMoments.java @@ -73,5 +73,5 @@ public class YjPracticeMoments implements Serializable { /** * 所属商户id */ - private String visitStore; + private String deptId; } diff --git a/ruoyi-system/src/main/java/com/ruoyi/basic/domain/YjSense.java b/ruoyi-system/src/main/java/com/ruoyi/basic/domain/YjSense.java index 00f1e9f..c3dd03e 100644 --- a/ruoyi-system/src/main/java/com/ruoyi/basic/domain/YjSense.java +++ b/ruoyi-system/src/main/java/com/ruoyi/basic/domain/YjSense.java @@ -74,7 +74,7 @@ public class YjSense implements Serializable { /** * 所属门店id */ - private String visitStore; + private String deptId; } diff --git a/ruoyi-system/src/main/java/com/ruoyi/basic/domain/YjStore.java b/ruoyi-system/src/main/java/com/ruoyi/basic/domain/YjStore.java index 6b57003..dca69b2 100644 --- a/ruoyi-system/src/main/java/com/ruoyi/basic/domain/YjStore.java +++ b/ruoyi-system/src/main/java/com/ruoyi/basic/domain/YjStore.java @@ -3,12 +3,14 @@ package com.ruoyi.basic.domain; 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 io.swagger.annotations.ApiModelProperty; import lombok.Data; import lombok.EqualsAndHashCode; import java.io.Serializable; import java.util.Date; +import java.util.List; /** *

@@ -20,24 +22,19 @@ import java.util.Date; */ @Data @EqualsAndHashCode(callSuper = false) +@TableName("yj_store") public class YjStore implements Serializable { private static final long serialVersionUID=1L; - @TableId(value = "id", type = IdType.ASSIGN_UUID) - private String id; - - /** - * 负责人id - */ - private Long responsibleId;//负责人id - //有效期至,终身/长期用户不判断 - private Date validUntil; - /** - * 是否正常运营 - * 状态 0申请,1审核中,2审核通过,3停止运营 - */ - private Integer status; + @TableId(value = "dept_id", type = IdType.ASSIGN_UUID) + private Long id; + //总店id + @TableField(exist = false) + private Long parentId; + //租户id + @TableField(exist = false) + private String tenantId; @ApiModelProperty("banner图") private String banner; @@ -51,10 +48,11 @@ public class YjStore implements Serializable { private String founder; // 企业/门店简介(富文本) private String profile; - //租户id - private String tenantId; - //总店id - private String parentId; + + @TableField(exist = false) + private List childList; + + diff --git a/ruoyi-system/src/main/java/com/ruoyi/basic/domain/YjTenant.java b/ruoyi-system/src/main/java/com/ruoyi/basic/domain/YjTenant.java deleted file mode 100644 index 5f000f6..0000000 --- a/ruoyi-system/src/main/java/com/ruoyi/basic/domain/YjTenant.java +++ /dev/null @@ -1,80 +0,0 @@ -package com.ruoyi.basic.domain; - -import com.baomidou.mybatisplus.annotation.IdType; -import com.baomidou.mybatisplus.annotation.TableField; -import com.baomidou.mybatisplus.annotation.TableId; -import io.swagger.annotations.ApiModelProperty; -import lombok.Data; -import lombok.EqualsAndHashCode; - -import java.io.Serializable; -import java.util.Date; - -/** - *

- * 商户表 - *

- * - * @author xn - * @since 2022-09-28 - */ -@Data -@EqualsAndHashCode(callSuper = false) -public class YjTenant implements Serializable { - - private static final long serialVersionUID=1L; - - @TableId(value = "id", type = IdType.ASSIGN_UUID) - private String id; - - /** - * 负责人id - */ - private Long responsibleId;//负责人id - - private String businessLicense;//营业执照编号/统一信用编码 - - private byte[] businessLicensePicture;//营业执照照片/扫描件 - - private String legalPerson;//法人姓名 - - private String legalPersonTel;//法人联系方式 - - private String legalPersonCard;//法人证件号码 - - private byte[] legalPersonCardPicturePositive;//法人证件照片/扫描件正面 - - private byte[] legalPersonCardPictureBack;//法人证件照片/扫描件背面 - - private String vip;//付费级别 - - private String vipPrice;//付费金额 - - private String vipPriceType;//付费方式,试用,年付,终身/长期 - - private String vipPayType;//支付方式,支付宝,微信,转账银行 - - private String bankCardId;//银行转账账号 - - private Date validUntil;//有效期至,终身/长期用户不判断 - - private Date reminderDate;//年付用户预付款提醒开始日期,提醒截止日期到宽限期结束 - - private Integer gracePeriod;//宽限期 - - /** - * 是否正常运营 - */ - private Integer status;//状态 0申请,1审核中,2审核通过,3停止运营 - - @TableField(exist = false) - private String legalPersonCardPicturePositive1;//法人证件照片/扫描件正面 - - @TableField(exist = false) - private String legalPersonCardPictureBack1;//法人证件照片/扫描件背面 - - @TableField(exist = false) - private String businessLicensePicture1;//营业执照照片/扫描件 - - -} diff --git a/ruoyi-system/src/main/java/com/ruoyi/basic/domain/dto/StoreDto.java b/ruoyi-system/src/main/java/com/ruoyi/basic/domain/dto/StoreDto.java deleted file mode 100644 index ec35ac0..0000000 --- a/ruoyi-system/src/main/java/com/ruoyi/basic/domain/dto/StoreDto.java +++ /dev/null @@ -1,34 +0,0 @@ -package com.ruoyi.basic.domain.dto; - -import com.baomidou.mybatisplus.annotation.IdType; -import com.baomidou.mybatisplus.annotation.TableId; -import com.ruoyi.basic.domain.YjStore; -import io.swagger.annotations.ApiModelProperty; -import lombok.Data; -import lombok.EqualsAndHashCode; - -import java.io.Serializable; -import java.util.List; - -/** - *

- * 门店表 - *

- * - * @author xn - * @since 2022-09-28 - */ -@Data -@EqualsAndHashCode(callSuper = false) -public class StoreDto implements Serializable { - - private static final long serialVersionUID=1L; - - private String id; - - @ApiModelProperty("企业名称") - private String storeName; - //总店id - private String parentId; - private List childList; -} diff --git a/ruoyi-system/src/main/java/com/ruoyi/basic/domain/dto/YjVenueDto.java b/ruoyi-system/src/main/java/com/ruoyi/basic/domain/dto/YjVenueDto.java index e919c16..11902a6 100644 --- a/ruoyi-system/src/main/java/com/ruoyi/basic/domain/dto/YjVenueDto.java +++ b/ruoyi-system/src/main/java/com/ruoyi/basic/domain/dto/YjVenueDto.java @@ -19,7 +19,7 @@ public class YjVenueDto { private Long deptId; /** - * 商户id + * 门店id */ private String storeId; diff --git a/ruoyi-system/src/main/java/com/ruoyi/basic/mapper/YjStoreMapper.java b/ruoyi-system/src/main/java/com/ruoyi/basic/mapper/YjStoreMapper.java index 1bdb2ea..a2b7d7c 100644 --- a/ruoyi-system/src/main/java/com/ruoyi/basic/mapper/YjStoreMapper.java +++ b/ruoyi-system/src/main/java/com/ruoyi/basic/mapper/YjStoreMapper.java @@ -3,8 +3,6 @@ package com.ruoyi.basic.mapper; import com.baomidou.mybatisplus.core.mapper.BaseMapper; import com.ruoyi.basic.domain.YjStore; -import com.ruoyi.basic.domain.dto.StoreDto; -import org.apache.ibatis.annotations.Param; import java.util.List; @@ -18,7 +16,9 @@ import java.util.List; */ public interface YjStoreMapper extends BaseMapper { + YjStore getOne(Long deptId); + List getStoreListByTenantId(String tenantId); - List getListForLogin(); - List getChilds(String id); + List getStoreList(); + List getChilds(Long id); } diff --git a/ruoyi-system/src/main/java/com/ruoyi/basic/service/YjStoreService.java b/ruoyi-system/src/main/java/com/ruoyi/basic/service/YjStoreService.java index c7d42ea..2bb0b76 100644 --- a/ruoyi-system/src/main/java/com/ruoyi/basic/service/YjStoreService.java +++ b/ruoyi-system/src/main/java/com/ruoyi/basic/service/YjStoreService.java @@ -2,8 +2,11 @@ package com.ruoyi.basic.service; import com.baomidou.mybatisplus.extension.service.IService; +import com.ruoyi.RestResponse; import com.ruoyi.basic.domain.YjStore; +import java.util.List; + /** *

* 商户表 服务类 @@ -13,5 +16,9 @@ import com.ruoyi.basic.domain.YjStore; * @since 2022-09-28 */ public interface YjStoreService extends IService { + RestResponse storesTree(); + RestResponse changeStore(Long visitStoreId); + List getStoreListByTenantId(String tenantId); + YjStore getOne(Long id); } diff --git a/ruoyi-system/src/main/java/com/ruoyi/basic/service/impl/YjStoreServiceImpl.java b/ruoyi-system/src/main/java/com/ruoyi/basic/service/impl/YjStoreServiceImpl.java index 9553698..5ba7a97 100644 --- a/ruoyi-system/src/main/java/com/ruoyi/basic/service/impl/YjStoreServiceImpl.java +++ b/ruoyi-system/src/main/java/com/ruoyi/basic/service/impl/YjStoreServiceImpl.java @@ -1,12 +1,25 @@ package com.ruoyi.basic.service.impl; +import cn.hutool.core.util.ObjectUtil; +import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; +import com.baomidou.mybatisplus.core.conditions.update.UpdateWrapper; import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; +import com.ruoyi.RestResponse; import com.ruoyi.basic.domain.YjStore; import com.ruoyi.basic.mapper.YjStoreMapper; +import com.ruoyi.basic.service.YjAppUserService; import com.ruoyi.basic.service.YjStoreService; +import com.ruoyi.common.core.domain.entity.AppUser; +import com.ruoyi.common.utils.SecurityUtils; +import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; +import java.util.ArrayList; +import java.util.HashMap; +import java.util.List; +import java.util.Map; + /** *

* 商户表 服务实现类 @@ -17,5 +30,55 @@ import org.springframework.stereotype.Service; */ @Service public class YjStoreServiceImpl extends ServiceImpl implements YjStoreService { + @Autowired + private YjAppUserService appUserService; + + + @Override + public RestResponse storesTree(){ + Long userId = SecurityUtils.getAppLoginUser().getAppUserId(); + AppUser appUser =appUserService.getById(userId); + if (ObjectUtil.isEmpty(appUser.getVisitStore())){ + List dtoList= baseMapper.getStoreList(); + dtoList.forEach(l->{ + l.setStoreName(l.getStoreName()+"(总店)"); + l.setChildList(baseMapper.getChilds(l.getId())); + }); + return new RestResponse().setSuccess(true).setData(dtoList); + } + + String tenantId= baseMapper.getOne(appUser.getVisitStore()).getTenantId(); + + List list=getStoreListByTenantId(tenantId); + + list.forEach(l->{ + if (l.getParentId().equals("0")){ + l.setStoreName(l.getStoreName()+"(总店)"); + } + + }); + return new RestResponse().setSuccess(true).setData(list); + } + + @Override + public RestResponse changeStore(Long visitStoreId){ + AppUser appUser = SecurityUtils.getAppLoginUser().getAppUser(); + appUserService.update(new UpdateWrapper() + .eq("app_user_id",appUser.getId()) + .set("visit_store",visitStoreId)); + + //返回新切换的门店信息 + YjStore yjStore= this.baseMapper.getOne(visitStoreId); + return new RestResponse().setSuccess(true).setData(yjStore); + } + + @Override + public List getStoreListByTenantId(String tenantId){ + return baseMapper.getStoreListByTenantId(tenantId); + } + @Override + public YjStore getOne(Long id){ + return baseMapper.getOne(id); + } } diff --git a/ruoyi-system/src/main/java/com/ruoyi/course/domain/Context.java b/ruoyi-system/src/main/java/com/ruoyi/course/domain/Context.java index 0405b44..9ae7e69 100644 --- a/ruoyi-system/src/main/java/com/ruoyi/course/domain/Context.java +++ b/ruoyi-system/src/main/java/com/ruoyi/course/domain/Context.java @@ -1,7 +1,5 @@ package com.ruoyi.course.domain; -import com.baomidou.mybatisplus.annotation.IdType; -import com.baomidou.mybatisplus.annotation.TableId; import io.swagger.annotations.ApiModelProperty; import lombok.Data; import lombok.EqualsAndHashCode; @@ -13,9 +11,8 @@ import java.io.Serializable; public class Context implements Serializable { private static final long serialVersionUID=1L; - @TableId(value = "sys_user", type = IdType.AUTO) -// @JsonFormat (pattern = "yyy-MM-dd HH:mm:ss",timezone = "GMT+8") private Integer userId; + @ApiModelProperty(value = "教练姓名") private String userName; @ApiModelProperty(value = "性别") diff --git a/ruoyi-system/src/main/java/com/ruoyi/course/domain/ScBookCourse.java b/ruoyi-system/src/main/java/com/ruoyi/course/domain/ScBookCourse.java new file mode 100644 index 0000000..d60f2aa --- /dev/null +++ b/ruoyi-system/src/main/java/com/ruoyi/course/domain/ScBookCourse.java @@ -0,0 +1,129 @@ +package com.ruoyi.course.domain; + +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.fasterxml.jackson.annotation.JsonFormat; +import com.fasterxml.jackson.databind.annotation.JsonSerialize; +import com.fasterxml.jackson.databind.ser.std.ToStringSerializer; +import lombok.Data; +import lombok.EqualsAndHashCode; +import lombok.experimental.Accessors; +import org.apache.commons.lang3.StringUtils; + +import java.io.Serializable; +import java.math.BigDecimal; +import java.util.Date; + +/** + *

+ * 排课信息 + *

+ * + * + * + */ +@Data +@EqualsAndHashCode(callSuper = false) +@Accessors(chain = true) +@TableName("sc_book_course") +public class ScBookCourse implements Serializable { + + private static final long serialVersionUID = 1L; + + @TableId(value = "id", type = IdType.ASSIGN_ID) + private Long id; + + /** + * 排课编号 + */ + @TableField(value = "course_time_id") + @JsonSerialize(using = ToStringSerializer.class) + private Long courseTimeId; + + /** + * 预约状态:0->预约中;1->教练确认;2->店长确认/预约成功/待上课 3->已取消;4- >已完成/待评价;5- >预约失败; + */ + @TableField("book_status") + private int bookStatus; + + /** + * 学员id + */ + @TableField("student_id") + private Long studentId; + + /** + * 创建预约时间 + */ + @JsonFormat(shape = JsonFormat.Shape.STRING, pattern="yyyy-MM-dd HH:mm:ss",timezone = "GMT+8") + @TableField("create_time") + private Date createTime; + + + @TableField("code") + private Long code; + + @TableField("qr_code") + private String qrCode; + + //*0未签到 1签到 + @TableField("check_in") + private int checkIn; + + + @TableField("check_in_time") + @JsonFormat(shape = JsonFormat.Shape.STRING, pattern="yyyy-MM-dd HH:mm:ss",timezone = "GMT+8") + private Date checkInTime; + + + /** + * 收费模式 count:课时 days:时间 total_fee:储值 + */ + @TableField("charge_type") + private String chargeType; + + /** + * 卡号 + */ + @TableField(value = "card_no") + private String cardNo; + + + /** + * 划扣次数 + */ + @TableField(value = "deduct_cnt") + private BigDecimal deductCnt; + + /** + * 划扣金额 + */ + @TableField(value = "deduct_fee") + private BigDecimal deductFee; + + @TableField(value = "check_in_manager") + private Long userId; + /** + * 所属租户 + */ + @TableField("tenant_id") + private String tenantId; + + /** + * 课程id + */ + @TableField("course_id") + private Long courseId; + + @TableField("cla_id") + private Long claId; + /** + * 开班校区 + */ + @TableField("depart_id") + private Long departId; + + +} diff --git a/ruoyi-system/src/main/java/com/ruoyi/course/domain/ScBookCourseLog.java b/ruoyi-system/src/main/java/com/ruoyi/course/domain/ScBookCourseLog.java new file mode 100644 index 0000000..8743028 --- /dev/null +++ b/ruoyi-system/src/main/java/com/ruoyi/course/domain/ScBookCourseLog.java @@ -0,0 +1,64 @@ +package com.ruoyi.course.domain; + +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.fasterxml.jackson.annotation.JsonFormat; +import lombok.Data; +import lombok.EqualsAndHashCode; +import lombok.experimental.Accessors; + +import java.io.Serializable; +import java.util.Date; + +/** + *

+ * 排课信息 + *

+ * + * + * + */ +@Data +@EqualsAndHashCode(callSuper = false) +@Accessors(chain = true) +@TableName("sc_book_course_log") +public class ScBookCourseLog implements Serializable { + + private static final long serialVersionUID = 1L; + + @TableId(value = "id", type = IdType.ASSIGN_ID) + private Long id; + @TableField(value = "book_id") + private Long bookId; + + /** + * 预约状态:0->预约成功/待上课;1->已取消;2->已完成 3->待评价; + */ + @TableField("update_time") + @JsonFormat(shape = JsonFormat.Shape.STRING, pattern="yyyy-MM-dd HH:mm:ss",timezone = "GMT+8") + private Date updateTime; + + /** + * 学员id + */ + @TableField("update_user_id") + private Long updateUser; + + /** + * 备注 + */ + @TableField("remarks") + private String remarks; + + + /** + * 预约状态:0->预约中;1->教练确认;2->店长确认/预约成功/待上课 3->已取消;4- >已完成/待评价;5- >预约失败; + */ + @TableField("book_status") + private int bookStatus; + + + +} diff --git a/ruoyi-system/src/main/java/com/ruoyi/course/domain/ScClaTime.java b/ruoyi-system/src/main/java/com/ruoyi/course/domain/ScClaTime.java index 4ed2dff..1d0503a 100644 --- a/ruoyi-system/src/main/java/com/ruoyi/course/domain/ScClaTime.java +++ b/ruoyi-system/src/main/java/com/ruoyi/course/domain/ScClaTime.java @@ -4,6 +4,9 @@ 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.fasterxml.jackson.annotation.JsonFormat; +import com.fasterxml.jackson.databind.annotation.JsonSerialize; +import com.fasterxml.jackson.databind.ser.std.ToStringSerializer; import lombok.Data; import lombok.EqualsAndHashCode; import lombok.experimental.Accessors; @@ -18,8 +21,8 @@ import java.util.Date; * 排课信息 *

* - * @author zhangby - * @since 2020-09-16 + * + * */ @Data @EqualsAndHashCode(callSuper = false) @@ -33,6 +36,7 @@ public class ScClaTime implements Serializable { * 排课编号 */ @TableId(value = "course_time_id", type = IdType.ASSIGN_ID) + @JsonSerialize(using = ToStringSerializer.class) private Long courseTimeId; /** @@ -107,23 +111,15 @@ public class ScClaTime implements Serializable { @TableField("real_end_time") private String realEndTime; - /** - * 课时变更数量 - */ - @TableField("pay_hour") - private BigDecimal payHour; - /** - * 总课时消耗 - */ - @TableField("pay_total_hour") - private BigDecimal payTotalHour; + + /** - * 总学费消耗 + * 老师获取的课时费 */ - @TableField("pay_total_fee") - private BigDecimal payTotalFee; + @TableField("teacher_fee") + private BigDecimal teacherFee; /** * 来源 1:重复排课 2:未排课上课 3:单个新增 @@ -138,10 +134,10 @@ public class ScClaTime implements Serializable { private String status; /** - * 应到人数 + * 预约人数 */ - @TableField("need_attend_cnt") - private Integer needAttendCnt; + @TableField("book_attend_cnt") + private Integer bookAttendCnt; /** * 实到人数 @@ -150,22 +146,18 @@ public class ScClaTime implements Serializable { private Integer realAttendCnt; /** - * 到课人数 + * 限制最高人数 */ @TableField("at_class_cnt") private Integer atClassCnt; /** - * 请假人数 + * 最低开课人数 */ - @TableField("leave_cnt") - private Integer leaveCnt; + @TableField("less_cnt") + private Integer lessCnt; + - /** - * 缺勤人数 - */ - @TableField("out_cnt") - private Integer outCnt; /** * 备注 @@ -177,28 +169,33 @@ public class ScClaTime implements Serializable { * 创建者 */ @TableField("create_user") - private String createUser; + private Long createUser; /** * 创建时间 */ @TableField("create_time") + @JsonFormat(shape = JsonFormat.Shape.STRING, pattern="yyyy-MM-dd HH:mm:ss",timezone = "GMT+8") private Date createTime; - /** - * 更新者 - */ - @TableField("last_update_user") - private String lastUpdateUser; - /** * 更新时间 */ @TableField("last_update_time") private Date lastUpdateTime; + @TableField("venue_fee") + private BigDecimal venueFee; + @TableField("room_usage_time") + private Double roomUsageTime;//不足0.5按0.5计,>0.5小时,按1小时计 + + /** + * 所属租户 + */ + @TableField("tenant_id") + private String tenantId; @TableField(exist = false) - private Long deptId; + private Long storeId; @TableField(exist = false) private String courseName; @TableField(exist = false) diff --git a/ruoyi-system/src/main/java/com/ruoyi/course/domain/ScClaTimeAttend.java b/ruoyi-system/src/main/java/com/ruoyi/course/domain/ScClaTimeAttend.java new file mode 100644 index 0000000..1dadc4f --- /dev/null +++ b/ruoyi-system/src/main/java/com/ruoyi/course/domain/ScClaTimeAttend.java @@ -0,0 +1,167 @@ +package com.ruoyi.course.domain; + +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.fasterxml.jackson.annotation.JsonFormat; +import com.fasterxml.jackson.databind.annotation.JsonSerialize; +import com.fasterxml.jackson.databind.ser.std.ToStringSerializer; +import lombok.Data; +import lombok.EqualsAndHashCode; +import lombok.experimental.Accessors; + +import java.io.Serializable; +import java.math.BigDecimal; +import java.util.Date; + +/** + *

+ * 上课出勤表 + *

+ * + * + * @since 2020-09-30 02:33:26 + */ +@Data +@EqualsAndHashCode(callSuper = false) +@Accessors(chain = true) +@TableName("sc_cla_time_attend") +public class ScClaTimeAttend implements Serializable { + + + /** + * 主键 + */ + @TableId(value = "attend_id", type = IdType.ASSIGN_ID) + private Long attendId; + + + /** + * sc_cla_time.course_time_id + */ + @TableField("course_time_id") + @JsonSerialize(using = ToStringSerializer.class) + private Long courseTimeId; + + @TableField("book_id") + private Long bookId; + + /** + * 学生 + */ + @TableField("student_id") + private Long studentId; + + /** + * 班级 冗余自动 + */ + @TableField("cla_id") + private Long claId; + + /** + * 课程 冗余自动 + */ + @TableField("course_id") + private Long courseId; + + /** + * 上课教师 + */ + @TableField("teacher_id") + private Long teacherId; + + /** + * 教师名 + */ + @TableField("teacher_name") + private String teacherName; + + /** + * 收费模式 count:课时 days:时间 total_fee:储值 + */ + @TableField("charge_type") + private String chargeType; + + /** + * 出席状态 1:到课 2:请假 3:缺勤 + */ + @TableField("attend_status") + private String attendStatus; + + /** + * 教师获取课时费(未使用) + */ + @TableField("teacher_get_cla_fee") + private BigDecimal teacherGetClaFee; + + /** + * 扣减课时数量 + */ + @TableField("pay_hour") + private BigDecimal payHour; + + /** + * 学费消耗 + */ + @TableField("pay_fee") + private BigDecimal payFee; + + /** + * 备注 + */ + @TableField("memo") + private String memo; + + /** + * 创建者 + */ + @TableField("create_user") + private Long createUser; + + /** + * 创建时间 + */ + @TableField("create_time") + @JsonFormat(shape = JsonFormat.Shape.STRING, pattern="yyyy-MM-dd HH:mm:ss",timezone = "GMT+8") + private Date createTime; + + + /** + * 卡ID + */ + @TableField(value = "member_card_id") + private Long memberCardId; + + /** + * 划扣前次数 + */ + @TableField(value = "count_before") + private BigDecimal countBefore; + + /** + * 划扣后次数 + */ + @TableField(value = "count_after") + private BigDecimal countAfter; + + + + /** + * 划扣前余额 + */ + @TableField(value = "fee_before") + private BigDecimal feeBefore; + + /** + * 划扣后余额 + */ + @TableField(value = "fee_after") + private BigDecimal feeAfter; + + /** + * 所属租户 + */ + @TableField("tenant_id") + private String tenantId; +} diff --git a/ruoyi-system/src/main/java/com/ruoyi/course/domain/ScClaTimeRule.java b/ruoyi-system/src/main/java/com/ruoyi/course/domain/ScClaTimeRule.java new file mode 100644 index 0000000..4e0d5f6 --- /dev/null +++ b/ruoyi-system/src/main/java/com/ruoyi/course/domain/ScClaTimeRule.java @@ -0,0 +1,190 @@ +package com.ruoyi.course.domain; + +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.fasterxml.jackson.annotation.JsonFormat; +import lombok.Data; +import lombok.EqualsAndHashCode; +import lombok.experimental.Accessors; +import org.apache.commons.lang3.StringUtils; + +import java.io.Serializable; +import java.util.Date; + +/** + *

+ * 上课时间配置规则 + *

+ * + * + * @since 2020-09-14 + */ +@Data +@EqualsAndHashCode(callSuper = false) +@Accessors(chain = true) +@TableName("sc_cla_time_rule") +public class ScClaTimeRule implements Serializable { + + private static final long serialVersionUID = 1L; + + /** + * 规则id + */ + @TableId(value = "rule_id", type = IdType.ASSIGN_ID) + private Long ruleId; + + /** + * 班级 + */ + @TableField("cla_id") + private Long claId; + + /** + * 规则类型 1重复排课 2单次排课 + */ + @TableField("rule_type") + private String ruleType; + + /** + * 开始日期 + */ + @TableField("begin_date") + private String beginDate; + + /** + * 结束日期 + */ + @TableField("end_date") + private String endDate; + + /** + * 单次排课 日期 + */ + @TableField("once_date") + private String onceDate; + + /** + * 重复方式 1每周重复 2隔天重复 3隔周重复 + */ + @TableField("repeat_type") + private String repeatType; + + /** + * 上课星期 周几上课 + */ + @TableField("week_day") + private String weekDay; + + /** + * 是否过滤节假日 1过滤 0不过滤 + */ + @TableField("filter_holiday") + private boolean filterHoliday; + + /** + * 上课时间 + */ + @TableField("start_time") + private String startTime; + + /** + * 下课时间 + */ + @TableField("end_time") + private String endTime; + + /** + * 任课教师 + */ + @TableField("teacher_id") + private Long teacherId; + + /** + * 上课教室 + */ + @TableField("room_id") + private Long roomId; + + /** + * 上课教室 + */ + @TableField("room_name") + private String roomName; + + /** + * 上课主题 + */ + @TableField("class_theme") + private String classTheme; + + /** + * 创建者 + */ + @TableField("create_user") + private Long createUser; + + /** + * 创建时间 + */ + @TableField("create_time") + @JsonFormat(shape = JsonFormat.Shape.STRING, pattern="yyyy-MM-dd HH:mm:ss",timezone = "GMT+8") + private Date createTime; + + /** + * 更新者 + */ + @TableField("last_update_user") + private Long lastUpdateUser; + + /** + * 更新时间 + */ + @TableField("last_update_time") + private Date lastUpdateTime; + + /** + * 单次排课 选择的上课日期 + */ + @TableField(exist = false) + private String[] chooseDate; + + /** + * 所属校区 + */ + @TableField(exist = false) + private Long deptId; + +// public boolean checkParam() { +// if (null == claId || null == teacherId) { +// return false; +// } +// if (StringUtils.isAnyEmpty(ruleType)) { +// return false; +// } +// if (ClaTimeRuleTypeEnums.ONCE_RULE.getRuleType().equals(ruleType)) { +// if (StringUtils.isAnyEmpty(startTime, endTime)) { +// return false; +// } else if (null == chooseDate || chooseDate.length == 0) { +// return false; +// } +// } +// if ("1".equals(ruleType) && StringUtils.isAnyEmpty(repeatType)) { +// return false; +// } +// if (ClaTimeRepeatTypeEnums.EVERY_WEEK.getRepeatType().equals(repeatType) +// || ClaTimeRepeatTypeEnums.EVERY_SECOND_WEEK.getRepeatType().equals(repeatType)) { +// if (StringUtils.isAnyEmpty(weekDay, startTime, endTime, beginDate, endDate)) { +// return false; +// } +// } else { +// if (StringUtils.isAnyEmpty(startTime, endTime)) { +// return false; +// } +// } +// return true; +// } + + +} diff --git a/ruoyi-system/src/main/java/com/ruoyi/course/domain/ScCommissionPlans.java b/ruoyi-system/src/main/java/com/ruoyi/course/domain/ScCommissionPlans.java new file mode 100644 index 0000000..8e8c241 --- /dev/null +++ b/ruoyi-system/src/main/java/com/ruoyi/course/domain/ScCommissionPlans.java @@ -0,0 +1,49 @@ +package com.ruoyi.course.domain; + +import com.baomidou.mybatisplus.annotation.TableName; +import lombok.Data; + +import java.math.BigDecimal; +import java.util.Date; + +/** + * 预约学员信息 + */ +@Data +@TableName("sc_commission_plans") +public class ScCommissionPlans { + + private Long id; + //方案名称 + private String planName; + // 第一阶梯阈值(0-?元) + private BigDecimal tier1Threshold; + // 第一阶梯比例(8%) + private BigDecimal tier1Rate; + // 第二阶梯阈值(30000) + private BigDecimal tier2Threshold; + // 第二阶梯比例(10%) + private BigDecimal tier2Rate; + // 第三阶梯阈值(50000) + private BigDecimal tier3Threshold; + // 第三阶梯比例(12%) + private BigDecimal tier3Rate; + + // 第四阶梯比例(15%) + private BigDecimal tier4Rate; + // 续费率(5%) + private BigDecimal renewalRate; + // 转介绍率(8-10%) + private BigDecimal referralRate; + // 是否生效(默认0未生效 1生效 ) + private int isActive; + // 生效日期 + private Date effectiveDate; + // 创建时间 + private Date createdAt; + + + + + +} diff --git a/ruoyi-system/src/main/java/com/ruoyi/course/domain/ScCourse.java b/ruoyi-system/src/main/java/com/ruoyi/course/domain/ScCourse.java new file mode 100644 index 0000000..f307a35 --- /dev/null +++ b/ruoyi-system/src/main/java/com/ruoyi/course/domain/ScCourse.java @@ -0,0 +1,118 @@ +package com.ruoyi.course.domain; + +import com.baomidou.mybatisplus.annotation.TableField; +import com.baomidou.mybatisplus.annotation.TableId; +import com.baomidou.mybatisplus.annotation.TableLogic; +import com.baomidou.mybatisplus.annotation.TableName; +import com.fasterxml.jackson.annotation.JsonIgnore; +import lombok.Data; +import lombok.EqualsAndHashCode; +import lombok.experimental.Accessors; + +import java.io.Serializable; +import java.math.BigDecimal; +import java.util.Date; + +/** + *

+ * 课程信息 + *

+ * + + */ +@Data +@EqualsAndHashCode(callSuper = false) +@Accessors(chain = true) +@TableName("sc_course") +public class ScCourse implements Serializable { + + + /** + * 课程id + */ + @TableId(value = "course_id") + private Long courseId; + + /** + * 所属租户 + */ + @TableField("tenant_id") + private String tenantId; + + /** + * 课程名称 + */ + @TableField("course_name") + private String courseName; + + /** + * 课程类型 + */ + @TableField("course_type_id") + private Long courseTypeId; + + /** + * 授课模式 1 班课 2 一对一 + */ + @TableField("teaching_mode") + private String teachingMode; + + /** + * 课程简介 + */ + @TableField("course_intro") + private String courseIntro; + + /** + * 是否在售 1在售 0停售 + */ + @TableField("sale") + private String sale; + + /** + * 删除标志(1删除 0在用) + */ + @TableField("delete_flag") + @TableLogic + private String deleteFlag; + + /** + * 创建者 + */ + @TableField("create_user") + private Long createUser; + + /** + * 创建时间 + */ + @TableField("create_time") + private Date createTime; + + /** + * 更新者 + */ + @TableField("last_update_user") + @JsonIgnore + private Long lastUpdateUser; + + /** + * 更新时间 + */ + @TableField("last_update_time") + @JsonIgnore + private Date lastUpdateTime; + + /** + * 课时费 + */ + @TableField("cla_fee") + private BigDecimal claFee; + + +// /** +// * 导入id +// */ +// @TableId(value = "import_id") +// @JsonIgnore +// private Long importId; +} diff --git a/ruoyi-system/src/main/java/com/ruoyi/course/domain/ScCourseCharge.java b/ruoyi-system/src/main/java/com/ruoyi/course/domain/ScCourseCharge.java new file mode 100644 index 0000000..415cd94 --- /dev/null +++ b/ruoyi-system/src/main/java/com/ruoyi/course/domain/ScCourseCharge.java @@ -0,0 +1,88 @@ +package com.ruoyi.course.domain; + +import com.baomidou.mybatisplus.annotation.TableField; +import com.baomidou.mybatisplus.annotation.TableId; +import com.baomidou.mybatisplus.annotation.TableName; +import lombok.Data; +import lombok.EqualsAndHashCode; +import lombok.experimental.Accessors; + +import java.io.Serializable; +import java.math.BigDecimal; + +/** + *

+ * 课程收费模式 + *

+ * + * + * @since 2020-07-08 + */ +@Data +@EqualsAndHashCode(callSuper = false) +@Accessors(chain = true) +@TableName("sc_course_charge") +public class ScCourseCharge implements Serializable { + + private static final long serialVersionUID = 1L; + + /** + * 收费编号 + */ + @TableId(value = "charge_id") + private Long chargeId; + + /** + * 课程编号 + */ + @TableField("course_id") + private Long courseId; + + /** + * 校区 -1为全部校区 + */ + @TableField("depart_id") + private Long departId; + + /** + * 收费模式 hour:课时 date:时间 cycle:期 + */ + @TableField("charge_type") + private String chargeType; + + /** + * 课时数量 + */ + @TableField("count") + private BigDecimal count; + + /** + * 总价 + */ + @TableField("total_fee") + private BigDecimal totalFee; + + /** + * 佣金方案id + */ + @TableField("commission_plans_id") + private BigDecimal commissionPlansId; + + /** + * 时间周期 天/月/季/年 + */ + @TableField("date_unit") + private String dateUnit; + +// public String getChargeName() { +// if (CourseChargeTypeEnum.HOUR.getChargeType().equals(chargeType)) { +// return "按课时 " + count.toString() + "课时=" + totalFee +"元"; +// } else if (CourseChargeTypeEnum.DATE.getChargeType().equals(chargeType)) { +// return "按时间 " + count.toString() + ChargeDateUnitEnum.getDateUnitLabel(dateUnit) + "=" + totalFee+"元"; +// } else if (CourseChargeTypeEnum.CYCLE.getChargeType().equals(chargeType)) { +// return "按周期 " + count.toString() + "课时=" + totalFee +"元"; +// } +// return ""; +// } + +} diff --git a/ruoyi-system/src/main/java/com/ruoyi/course/domain/ScCourseCla.java b/ruoyi-system/src/main/java/com/ruoyi/course/domain/ScCourseCla.java new file mode 100644 index 0000000..acdb9a2 --- /dev/null +++ b/ruoyi-system/src/main/java/com/ruoyi/course/domain/ScCourseCla.java @@ -0,0 +1,161 @@ +package com.ruoyi.course.domain; + +import com.baomidou.mybatisplus.annotation.TableField; +import com.baomidou.mybatisplus.annotation.TableId; +import com.baomidou.mybatisplus.annotation.TableName; +import lombok.Data; +import lombok.EqualsAndHashCode; +import lombok.experimental.Accessors; +import org.apache.commons.lang3.StringUtils; + +import java.io.Serializable; +import java.math.BigDecimal; +import java.util.Date; + +/** + *

+ * 课程班级信息 + *

+ * + * + * @since 2020-08-07 + */ +@Data +@EqualsAndHashCode(callSuper = false) +@Accessors(chain = true) +@TableName("sc_course_cla") +public class ScCourseCla implements Serializable { + + private static final long serialVersionUID = 1L; + + /** + * 班级id + */ + @TableId(value = "cla_id") + private Long claId; + + /** + * 所属租户 + */ + @TableField("tenant_id") + private String tenantId; + + /** + * 课程id + */ + @TableField("course_id") + private Long courseId; + + /** + * 开班校区 + */ + @TableField("depart_id") + private Long departId; + + /** + * 班主任id + */ + @TableField("staff_id") + private Long staffId; + + /** + * 班级名称 + */ + @TableField("cla_name") + private String claName; + + /** + * 班级颜色 + */ + @TableField("cla_color") + private String claColor; + + /** + * 满班人数 + */ + @TableField("capacity") + private Integer capacity; + + /** + * 招生状态 1开放 2满班后停止 0停止 + */ + @TableField("recruit_status") + private String recruitStatus; + + + + + + /** + * 开班日期 + */ + @TableField("open_date") + private String openDate; + + /** + * 结班日期 + */ + @TableField("close_date") + private String closeDate; + + /** + * 备注 + */ + @TableField("memo") + private String memo; + + /** + * 删除标志(1删除 0在用) + */ + @TableField("delete_flag") + private String deleteFlag; + + /** + * 创建者 + */ + @TableField("create_user") + private Long createUser; + + /** + * 创建时间 + */ + @TableField("create_time") + private Date createTime; + + /** + * 更新者 + */ + @TableField("last_update_user") + private Long lastUpdateUser; + + /** + * 更新时间 + */ + @TableField("last_update_time") + private Date lastUpdateTime; + + @TableField(exist = false) + private String deptName; + + @TableField(exist = false) + private String teacherName; + + // 当前班级人数 + @TableField(exist = false) + private Integer studentCnt; + + /** + * 校验参数 + * @return + */ +// public APIBaseResponse checkParam(){ +// if(StringUtils.isAnyEmpty(claName,claColor,recruitStatus,openDate)){ +// return APIBaseResponse.fail("请求参数错误,请全部填写后,重新提交"); +// } +// if(null == courseId || null == departId || null == staffId || null == capacity || null == everyStuLoseHour || null == everyTeaGetHour){ +// return APIBaseResponse.fail("请求参数错误,请全部填写后,重新提交"); +// } +// return APIBaseResponse.success(); +// } + +} diff --git a/ruoyi-system/src/main/java/com/ruoyi/course/domain/ScCourseType.java b/ruoyi-system/src/main/java/com/ruoyi/course/domain/ScCourseType.java new file mode 100644 index 0000000..990a1ce --- /dev/null +++ b/ruoyi-system/src/main/java/com/ruoyi/course/domain/ScCourseType.java @@ -0,0 +1,66 @@ +package com.ruoyi.course.domain; + +import com.baomidou.mybatisplus.annotation.TableField; +import com.baomidou.mybatisplus.annotation.TableId; +import com.baomidou.mybatisplus.annotation.TableName; +import lombok.Data; +import lombok.EqualsAndHashCode; +import lombok.experimental.Accessors; + +import java.io.Serializable; +import java.util.Date; + +/** + *

+ * 课程类型 + *

+ * + * + * @since 2020-07-09 08:10:25 + */ +@Data +@EqualsAndHashCode(callSuper = false) +@Accessors(chain = true) +@TableName("sc_course_type") +public class ScCourseType implements Serializable { + + + @TableId(value = "course_type_id") + private Long courseTypeId; + + /** + * 所属租户 + */ + @TableField("tenant_id") + private String tenantId; + + /** + * 课程类型名 + */ + @TableField("course_type") + private String courseType; + + /** + * 排序 + */ + @TableField("sort") + private Integer sort; + + /** + * 状态(1正常 0停用) + */ + @TableField("in_use") + private String inUse; + + /** + * 创建者 + */ + @TableField("create_user") + private Long createUser; + + /** + * 创建时间 + */ + @TableField("create_time") + private Date createTime; +} diff --git a/ruoyi-system/src/main/java/com/ruoyi/course/domain/ScMemberCard.java b/ruoyi-system/src/main/java/com/ruoyi/course/domain/ScMemberCard.java new file mode 100644 index 0000000..a4fa997 --- /dev/null +++ b/ruoyi-system/src/main/java/com/ruoyi/course/domain/ScMemberCard.java @@ -0,0 +1,358 @@ +package com.ruoyi.course.domain; + +import com.baomidou.mybatisplus.annotation.*; +import com.fasterxml.jackson.annotation.JsonFormat; +import com.fasterxml.jackson.annotation.JsonIgnore; +import com.ruoyi.common.utils.SecurityUtils; +import lombok.Data; +import lombok.EqualsAndHashCode; +import lombok.experimental.Accessors; + +import java.io.Serializable; +import java.math.BigDecimal; +import java.time.LocalDate; +import java.time.LocalDateTime; + +/** + * 会员卡实体类 + * 对应数据库表: sc_member_cards + */ +@Data +@EqualsAndHashCode(callSuper = false) +@Accessors(chain = true) +@TableName("sc_member_cards") +public class ScMemberCard implements Serializable { + + private static final long serialVersionUID = 1L; + + /** + * 主键ID + */ + @TableId(value = "id", type = IdType.AUTO) + private Long id; + + @TableField(value = "tenant_id") + private String tenantId; + + /** + * 卡号 + */ + @TableField(value = "card_no") + private String cardNo; + + /** + * 会员ID + */ + @TableField(value = "member_id") + private Long memberId; + + + + /** + * 卡类型ID + */ + @TableField(value = "card_type_id") + private Long cardTypeId; + + /** + * 状态 + * ACTIVE-激活, INACTIVE-未激活, EXPIRED-已过期, + * SUSPENDED-已暂停, DEPLETED-已用完 + */ + @TableField("status") + private String status; + + /** + * 剩余次数 + */ + @TableField("remaining_count") + private BigDecimal remainingCount; + + /** + * 剩余天数 + */ + @TableField(exist = false) + private Integer remainingDays ; + + /** + * 总次数 + */ + @TableField("total_count") + private BigDecimal totalCount; + + /** + * 总天数 + */ + @TableField("total_days") + private Integer totalDays ; + + @TableField("total_fee") + private BigDecimal totalFee; + + @TableField("count_fee") + private BigDecimal countFee; + @TableField("day_fee") + private BigDecimal dayFee; + + @TableField("remaining_total_fee") + private BigDecimal remainingTotalFee; + + //时间卡 是否激活 1:立刻激活 2:首次预约激活 + @TableField("have_activation_date") + private String haveActivationDate; + + //储值or次数卡 是否设置有效期 1:不限期,用完失效 2:设置有效期 + @TableField("have_expiry_date") + private String haveExpiryDate; + + /** + * 激活日期 + */ + @TableField("activation_date") + @JsonFormat(pattern = "yyyy-MM-dd") + private LocalDate activationDate; + + /** + * 到期日期 + */ + @TableField("expiry_date") + @JsonFormat(pattern = "yyyy-MM-dd") + private LocalDate expiryDate; + + /** + * 购买日期 + */ + @TableField(value = "purchase_date", fill = FieldFill.INSERT) + @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss") + private LocalDateTime purchaseDate; + + /** + * 购买价格 + */ + @TableField("price") + private BigDecimal price; + + + /** + * 备注 + */ + @TableField("notes") + private String notes; + + /** + * 收费模式 count:课时 days:时间 total_fee:储值 + */ + @TableField("charge_type") + private String chargeType; + + /** + * 创建时间 + */ + @TableField(value = "created_at", fill = FieldFill.INSERT) + @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss") + private LocalDateTime createdAt; + + /** + * 更新时间 + */ + @TableField(value = "updated_at", fill = FieldFill.INSERT_UPDATE) + @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss") + private LocalDateTime updatedAt; + + /** + * 逻辑删除标志 (0-未删除,1-已删除) + */ + @TableLogic + @TableField(value = "is_deleted") + private Integer isDeleted = 0; + + + + /** + * 会员实体(关联查询用) + * 注意:MyBatis Plus 不支持直接实体关联,这里仅作为查询结果接收字段 + */ + @TableField(exist = false) + @JsonIgnore + private ScStudent member; + + /** + * 卡类型实体(关联查询用) + * 注意:MyBatis Plus 不支持直接实体关联,这里仅作为查询结果接收字段 + */ + + @TableField(exist = false) + private String cardName; + + /** + * 是否有效(可用的卡) + */ + @TableField(exist = false) + private Boolean valid; + + /** + * 是否已过期 + */ + @TableField(exist = false) + private Boolean expired; + + /** + * 是否可用(激活且未过期) + */ + @TableField(exist = false) + private Boolean available; + + /** + * 是否可以续费 + */ + @TableField(exist = false) + private Boolean canRenew; + + // 枚举类 + public enum CardStatus { + ACTIVE("激活"), + INACTIVE("未激活"), + EXPIRED("已过期"), + SUSPENDED("已暂停"), + DEPLETED("已用完"); + + private final String description; + + CardStatus(String description) { + this.description = description; + } + + public String getDescription() { + return description; + } + + public static CardStatus fromString(String status) { + if (status == null) return null; + for (CardStatus s : CardStatus.values()) { + if (s.name().equalsIgnoreCase(status)) { + return s; + } + } + return null; + } + } + + /** + * 获取卡状态枚举 + */ + public CardStatus getCardStatus() { + return CardStatus.fromString(this.status); + } + + + + public Integer getRemainingDays() { + if (activationDate== null || expiryDate == null ) { + return totalDays; + } + + if (expiryDate.isBefore(LocalDate.now())) { + return 0; + } + Long days= java.time.temporal.ChronoUnit.DAYS.between( + LocalDate.now(), expiryDate + ); + return days.intValue(); + } + + /** + * 设置卡状态 + */ + public void setCardStatus(CardStatus cardStatus) { + this.status = cardStatus != null ? cardStatus.name() : null; + } + + /** + * 是否有效(可用的卡) + */ + public Boolean isValid() { + CardStatus currentStatus = getCardStatus(); + return CardStatus.ACTIVE.equals(currentStatus) || + CardStatus.INACTIVE.equals(currentStatus); + } + + /** + * 是否已过期 + */ + public Boolean isExpired() { + if (CardStatus.EXPIRED.equals(getCardStatus())) { + return true; + } + if (expiryDate != null && LocalDate.now().isAfter(expiryDate)) { + return true; + } + return false; + } + + /** + * 是否可用(激活且未过期) + */ + public Boolean isAvailable() { + return CardStatus.ACTIVE.equals(getCardStatus()) && !isExpired(); + } + + /** + * 是否可以续费 + */ + public Boolean canRenew() { + CardStatus currentStatus = getCardStatus(); + return CardStatus.ACTIVE.equals(currentStatus) || + CardStatus.INACTIVE.equals(currentStatus) || + CardStatus.EXPIRED.equals(currentStatus); + } + + /** + * 使用次数 + * @param count 使用次数 + * @return 是否成功使用 + */ + public boolean consume(BigDecimal count) { + if (!isAvailable() || remainingCount == null || remainingCount.compareTo(count)<1) { + return false; + } + remainingCount= remainingCount .multiply(count); + return true; + } + + /** + * 添加次数 + * @param count 添加的次数 + */ + public void addCount(BigDecimal count) { + if (remainingCount == null) { + remainingCount = new BigDecimal(0); + } + if (totalCount == null) { + totalCount = new BigDecimal(0); + } + remainingCount=remainingCount.add(count); + totalCount=totalCount.add(count); + } + + /** + * 计算剩余有效期天数 + */ + public Long calculateRemainingDays() { + if (expiryDate == null || LocalDate.now().isAfter(expiryDate)) { + return 0L; + } + return java.time.temporal.ChronoUnit.DAYS.between( + LocalDate.now(), expiryDate + ); + } + + /** + * 初始化计算字段 + */ + public void calculateFields() { + this.valid = isValid(); + this.expired = isExpired(); + this.available = isAvailable(); + this.canRenew = canRenew(); + } +} diff --git a/ruoyi-system/src/main/java/com/ruoyi/course/domain/ScRoom.java b/ruoyi-system/src/main/java/com/ruoyi/course/domain/ScRoom.java new file mode 100644 index 0000000..f03a6f1 --- /dev/null +++ b/ruoyi-system/src/main/java/com/ruoyi/course/domain/ScRoom.java @@ -0,0 +1,41 @@ +package com.ruoyi.course.domain; + +import com.baomidou.mybatisplus.annotation.TableField; +import com.baomidou.mybatisplus.annotation.TableId; +import com.baomidou.mybatisplus.annotation.TableLogic; +import com.baomidou.mybatisplus.annotation.TableName; +import com.fasterxml.jackson.annotation.JsonFormat; +import lombok.Data; +import lombok.EqualsAndHashCode; +import lombok.experimental.Accessors; +import org.joda.time.DateTime; +import org.joda.time.Period; +import org.joda.time.PeriodType; + +import java.io.Serializable; +import java.math.BigDecimal; +import java.util.Date; +import java.util.List; + +/** + *

+ * 学生基本信息 + *

+ * + */ +@Data +@TableName("sc_room") +public class ScRoom implements Serializable { + + @TableId(value = "room_id") + private Long roomId; + private Long deptId; + private String roomName; + private String memo; + private Long createUser; + private Date createTime; + private Long lastUpdateUser; + private Date lastUpdateTime; + private BigDecimal venueFee; + +} diff --git a/ruoyi-system/src/main/java/com/ruoyi/course/domain/ScStudent.java b/ruoyi-system/src/main/java/com/ruoyi/course/domain/ScStudent.java new file mode 100644 index 0000000..49c3482 --- /dev/null +++ b/ruoyi-system/src/main/java/com/ruoyi/course/domain/ScStudent.java @@ -0,0 +1,138 @@ +package com.ruoyi.course.domain; + +import com.baomidou.mybatisplus.annotation.TableField; +import com.baomidou.mybatisplus.annotation.TableId; +import com.baomidou.mybatisplus.annotation.TableLogic; +import com.baomidou.mybatisplus.annotation.TableName; +import com.fasterxml.jackson.annotation.JsonFormat; +import lombok.Data; +import lombok.EqualsAndHashCode; +import lombok.experimental.Accessors; +import org.joda.time.DateTime; +import org.joda.time.Period; +import org.joda.time.PeriodType; + +import java.io.Serializable; +import java.math.BigDecimal; +import java.util.Date; +import java.util.List; + +/** + *

+ * 学生基本信息 + *

+ * + */ +@Data +@EqualsAndHashCode(callSuper = false) +@Accessors(chain = true) +@TableName("sc_student") +public class ScStudent implements Serializable { + + + /** + * 学生id + */ + @TableId(value = "student_id") + private Long studentId; + + /** + * 所属机构 + */ + @TableField("tenant_id") + private String tenantId; + + + /** + * 学生姓名 + */ + @TableField("student_name") + private String studentName; + + /** + * 出生日期 + */ + @TableField("birth_day") + @JsonFormat(pattern="yyyy-MM-dd") + private Date birthDay; + + /** + * 0->未知;1->女;2->男 + */ + @TableField("sex") + private String sex; + + /** + * 联系电话 + */ + @TableField("phone") + private String phone; + + @TableField("app_user_id") + private String appUserId; + + /** + * 入校时间 + */ + @TableField("in_time") + private String inTime; + + /** + * 删除标志(1删除 0在用) + */ + @TableField("delete_flag") + @TableLogic + private String deleteFlag; + + /** + * 创建者 + */ + @TableField("create_user") + private Long createUser; + + /** + * 创建时间 + */ + @TableField("create_time") + private Date createTime; + + + /** + * 更新者 + */ + @TableField("last_update_user") + private Long lastUpdateUser; + + /** + * 更新时间 + */ + @TableField("last_update_time") + private Date lastUpdateTime; + + @TableField(exist = false) + private String schoolName; + @TableField(exist = false) + private Integer age; + @TableField(exist = false) + private String course_name; + @TableField(exist = false) + private BigDecimal receiptFee; + @TableField(exist = false) + private String orderStatus; + + + + @TableField(exist = false) + List contactList; + + public Integer getAge() { + if(null == age && null != birthDay) { + DateTime now = new DateTime(); + DateTime birthDateTime = new DateTime(birthDay); + Period period = new Period(birthDateTime, now, PeriodType.years()); + return period.getYears(); + } else { + return age; + } + } +} diff --git a/ruoyi-system/src/main/java/com/ruoyi/course/domain/ScStudentContact.java b/ruoyi-system/src/main/java/com/ruoyi/course/domain/ScStudentContact.java new file mode 100644 index 0000000..e657601 --- /dev/null +++ b/ruoyi-system/src/main/java/com/ruoyi/course/domain/ScStudentContact.java @@ -0,0 +1,71 @@ +package com.ruoyi.course.domain; + +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 lombok.Data; +import lombok.EqualsAndHashCode; +import lombok.experimental.Accessors; + +import java.io.Serializable; +import java.util.Date; + +/** + *

+ * 联系人 + *

+ * + * + * @since 2020-09-27 + */ +@Data +@EqualsAndHashCode(callSuper = false) +@Accessors(chain = true) +@TableName("sc_student_contact") +public class ScStudentContact implements Serializable { + + private static final long serialVersionUID = 1L; + + /** + * 联系人编号 + */ + @TableId(value = "contact_id", type = IdType.ASSIGN_ID) + private Long contactId; + + /** + * 学生 + */ + @TableField("student_id") + private Long studentId; + + /** + * 联系人称呼 + */ + @TableField("contact_nick") + private String contactNick; + + /** + * 与学生关系 + */ + @TableField("contact_relation") + private String contactRelation; + + /** + * 联系电话 + */ + @TableField("contact_phone") + private String contactPhone; + + /** + * 创建者 + */ + @TableField("create_user") + private Long createUser; + + /** + * 创建时间 + */ + @TableField("create_time") + private Date createTime; +} diff --git a/ruoyi-system/src/main/java/com/ruoyi/course/domain/ScStudentCourse.java b/ruoyi-system/src/main/java/com/ruoyi/course/domain/ScStudentCourse.java new file mode 100644 index 0000000..f4343d2 --- /dev/null +++ b/ruoyi-system/src/main/java/com/ruoyi/course/domain/ScStudentCourse.java @@ -0,0 +1,139 @@ +package com.ruoyi.course.domain; + +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 lombok.Data; +import lombok.EqualsAndHashCode; +import lombok.experimental.Accessors; + +import java.io.Serializable; +import java.math.BigDecimal; +import java.util.Date; + +/** + *

+ * 学生课程 + *

+ * + * + * + */ +@Data +@EqualsAndHashCode(callSuper = false) +@Accessors(chain = true) +@TableName("sc_student_course") +public class ScStudentCourse implements Serializable { + + private static final long serialVersionUID = 1L; + + /** + * 主键 + */ + @TableId(value = "student_course_id", type = IdType.ASSIGN_ID) + private Long studentCourseId; + + /** + * 学生 + */ + @TableField("student_id") + private Long studentId; + + /** + * 课程 + */ + @TableField("course_id") + private Long courseId; + + /** + * 课程 + */ + @TableField("course_name") + private String courseName; + + /** + * 报读校区 + */ + @TableField("dept_id") + private Long deptId; + + /** + * 班级 + */ + @TableField("cla_id") + private Long claId; + + /** + * 班级 + */ + @TableField("cla_name") + private String claName; + + /** + * 收费模式 hour:课时 date:时间 cycle:期 + */ + @TableField("charge_type") + private String chargeType; + + /** + * 总天数 + */ + @TableField("total_day") + private BigDecimal totalDay; + + /** + * 总课时 + */ + @TableField("total_hour") + private BigDecimal totalHour; + + /** + * 剩余课时 + */ + @TableField("balance_hour") + private BigDecimal balanceHour; + + /** + * 总学费 + */ + @TableField("total_fee") + private BigDecimal totalFee; + + /** + * 状态 1在读 2停课 + */ + @TableField("status") + private String status; + + /** + * 创建者 + */ + @TableField("create_user") + private Long createUser; + + /** + * 创建时间 + */ + @TableField("create_time") + private Date createTime; + + /** + * 更新者 + */ + @TableField("last_update_user") + private Long lastUpdateUser; + + /** + * 更新时间 + */ + @TableField("last_update_time") + private Date lastUpdateTime; + + /** + * 更新的途径app or sys + */ + @TableField("update_user_type") + private String updateUserType; + +} diff --git a/ruoyi-system/src/main/java/com/ruoyi/course/domain/ScStudentCourseLog.java b/ruoyi-system/src/main/java/com/ruoyi/course/domain/ScStudentCourseLog.java new file mode 100644 index 0000000..9291e2f --- /dev/null +++ b/ruoyi-system/src/main/java/com/ruoyi/course/domain/ScStudentCourseLog.java @@ -0,0 +1,132 @@ +package com.ruoyi.course.domain; + +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 lombok.*; +import lombok.experimental.Accessors; + +import java.io.Serializable; +import java.math.BigDecimal; +import java.util.Date; + +/** + *

+ * 课程缴费扣费记录 + *

+ * + * + * @since 2020-12-17 + */ +@Data +@EqualsAndHashCode(callSuper = false) +@Accessors(chain = true) +@TableName("sc_student_course_log") +@Builder +@NoArgsConstructor +@AllArgsConstructor +public class ScStudentCourseLog implements Serializable { + + private static final long serialVersionUID = 1L; + + /** + * 主键 + */ + @TableId(value = "log_id", type = IdType.ASSIGN_ID) + private Long logId; + + /** + * 学生 + */ + @TableField("student_id") + private Long studentId; + + /** + * 日志类型 参照 LogTypeEnum + */ + @TableField("log_type") + private String logType; + + /** + * 课程 + */ + @TableField("course_id") + private Long courseId; + + /** + * 课程名称 + */ + @TableField("course_name") + private String courseName; + + /** + * 班级 + */ + @TableField("cla_id") + private Long claId; + + /** + * 班级名称 + */ + @TableField("cla_name") + private String claName; + + /** + * 经办校区 + */ + @TableField("dept_name") + private String deptName; + + /** + * 变更课时 + */ + @TableField("change_hour") + private BigDecimal changeHour; + + /** + * 变更后剩余课时 + */ + @TableField("after_balance_hour") + private BigDecimal afterBalanceHour; + + /** + * 变更金额 + */ + @TableField("change_fee") + private BigDecimal changeFee; + + /** + * 备注 + */ + @TableField("memo") + private String memo; + + /** + * 创建者 + */ + @TableField("create_user") + private Long createUser; + + /** + * 创建者 + */ + @TableField("create_user_name") + private String createUserName; + /** + * 途径app or sys + */ + @TableField("create_user_type") + private String createUserType; + + /** + * 创建时间 + */ + @TableField("create_time") + private Date createTime; + + // 学生姓名 + @TableField(exist = false) + private String studentName; + +} diff --git a/ruoyi-system/src/main/java/com/ruoyi/course/domain/ScStudentCourseOrder.java b/ruoyi-system/src/main/java/com/ruoyi/course/domain/ScStudentCourseOrder.java new file mode 100644 index 0000000..461530c --- /dev/null +++ b/ruoyi-system/src/main/java/com/ruoyi/course/domain/ScStudentCourseOrder.java @@ -0,0 +1,130 @@ +package com.ruoyi.course.domain; + +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 lombok.Builder; +import lombok.Data; +import lombok.EqualsAndHashCode; +import lombok.experimental.Accessors; + +import java.io.Serializable; +import java.math.BigDecimal; +import java.util.Date; + +/** + *

+ * 学生课程关联订单 + *

+ */ +@Data +@Builder +@EqualsAndHashCode(callSuper = false) +@Accessors(chain = true) +@TableName("sc_student_course_order") +public class ScStudentCourseOrder implements Serializable { + + private static final long serialVersionUID = 1L; + + /** + * 主键 + */ + @TableId(value = "course_order_id", type = IdType.ASSIGN_ID) + private Long courseOrderId; + + @TableField("student_course_id") + private Long studentCourseId; + + /** + * 订单 + */ + @TableField("order_id") + private Long orderId; + + /** + * 购买课程订单 + */ + @TableField("order_detail_id") + private Long orderDetailId; + + /** + * 购买课时数量 + */ + @TableField("total_hour") + private BigDecimal totalHour; + + /** + * 剩余课时数量 + */ + @TableField("balance_hour") + private BigDecimal balanceHour; + + /** + * 购买天数 + */ + @TableField("total_day") + private BigDecimal totalDay; + + /** + * 开始时间 按时间收费 + */ + @TableField("begin_date") + private String beginDate; + + /** + * 结束时间 按时间收费 + */ + @TableField("end_date") + private String endDate; + + /** + * 失效时间 + */ + @TableField("expire_date") + private String expireDate; + + /** + * 总金额 + */ + @TableField("total_fee") + private BigDecimal totalFee; + + /** + * 单价 + */ + @TableField("unit_fee") + private BigDecimal unitFee; + + /** + * 是否有效 1有效 0失效 + */ + @TableField("valid") + private Boolean valid; + + /** + * 创建者 + */ + @TableField("create_user") + private Long createUser; + + /** + * 创建时间 + */ + @TableField("create_time") + private Date createTime; + + /** + * 更新者 + */ + @TableField("last_update_user") + private Long lastUpdateUser; + + /** + * 更新时间 + */ + @TableField("last_update_time") + private Date lastUpdateTime; + + +} diff --git a/ruoyi-system/src/main/java/com/ruoyi/course/domain/enums/ChargeDateUnitEnum.java b/ruoyi-system/src/main/java/com/ruoyi/course/domain/enums/ChargeDateUnitEnum.java new file mode 100644 index 0000000..f954c66 --- /dev/null +++ b/ruoyi-system/src/main/java/com/ruoyi/course/domain/enums/ChargeDateUnitEnum.java @@ -0,0 +1,41 @@ +package com.ruoyi.course.domain.enums; + +/** + * 按时间收费周期枚举 + * @author :zhangbaoyu + * @date :Created in 2020/9/5 13:23 + */ +public enum ChargeDateUnitEnum { + + DAY("day","天"), + MONTH("month","月"), + SEASON("season","季"), + YEAR("year","年"), + ; + + ChargeDateUnitEnum(String dateUnit, String dateUnitLabel) { + this.dateUnit = dateUnit; + this.dateUnitLabel = dateUnitLabel; + } + + private final String dateUnit; + + private final String dateUnitLabel; + + public String getDateUnit() { + return dateUnit; + } + + public String getDateUnitLabel() { + return dateUnitLabel; + } + + public static String getDateUnitLabel(String dateUnit) { + for (ChargeDateUnitEnum dateUnitEnum : ChargeDateUnitEnum.values()) { + if (dateUnitEnum.getDateUnit().equals(dateUnit)) { + return dateUnitEnum.getDateUnitLabel(); + } + } + return ""; + } +} diff --git a/ruoyi-system/src/main/java/com/ruoyi/course/domain/enums/ClaTimeAttendStatusEnums.java b/ruoyi-system/src/main/java/com/ruoyi/course/domain/enums/ClaTimeAttendStatusEnums.java new file mode 100644 index 0000000..07c3512 --- /dev/null +++ b/ruoyi-system/src/main/java/com/ruoyi/course/domain/enums/ClaTimeAttendStatusEnums.java @@ -0,0 +1,45 @@ +package com.ruoyi.course.domain.enums; + +/** + * 到课状态 + * @author :zhangbaoyu + * @date :Created in 2020/4/30 15:16 + */ +public enum ClaTimeAttendStatusEnums { + + AT_CLASS("1","到课"), + LEAVE_CLASS("2","请假"), + OUT_CLASS("3","缺勤"), + ; + + private final String attendStatus; + + private final String statusName; + + ClaTimeAttendStatusEnums(String attendStatus, String statusName) { + this.attendStatus = attendStatus; + this.statusName = statusName; + } + + public String getAttendStatus() { + return attendStatus; + } + + public String getStatusName() { + return statusName; + } + + /** + * 根据状态获取名称 + * @param status + * @return + */ + public static String getNameByStatus(String status) { + for (ClaTimeAttendStatusEnums value : ClaTimeAttendStatusEnums.values()) { + if(value.getAttendStatus().equals(status)) { + return value.getStatusName(); + } + } + return ""; + } +} diff --git a/ruoyi-system/src/main/java/com/ruoyi/course/domain/enums/ClaTimeStatusEnums.java b/ruoyi-system/src/main/java/com/ruoyi/course/domain/enums/ClaTimeStatusEnums.java new file mode 100644 index 0000000..12b95b6 --- /dev/null +++ b/ruoyi-system/src/main/java/com/ruoyi/course/domain/enums/ClaTimeStatusEnums.java @@ -0,0 +1,31 @@ +package com.ruoyi.course.domain.enums; + +/** + * 排课 状态 + * @author :zhangbaoyu + * @date :Created in 2020/4/30 15:16 + */ +public enum ClaTimeStatusEnums { + + WAIT_CLASS("1","待上课"), + HAD_CLASS("2","已上课"), + CHANGE_CLASS("3","已调课"), + ; + + private final String status; + + private final String statusName; + + ClaTimeStatusEnums(String status, String statusName) { + this.status = status; + this.statusName = statusName; + } + + public String getStatus() { + return status; + } + + public String getStatusName() { + return statusName; + } +} diff --git a/ruoyi-system/src/main/java/com/ruoyi/course/domain/enums/CourseChargeTypeEnum.java b/ruoyi-system/src/main/java/com/ruoyi/course/domain/enums/CourseChargeTypeEnum.java new file mode 100644 index 0000000..fc9e363 --- /dev/null +++ b/ruoyi-system/src/main/java/com/ruoyi/course/domain/enums/CourseChargeTypeEnum.java @@ -0,0 +1,42 @@ +package com.ruoyi.course.domain.enums; + +/** + * 课程收费模式 + * @author :zhangbaoyu + * @date :Created in 2020/8/4 15:30 + */ +public enum CourseChargeTypeEnum { + + // 按课时 + HOUR("hour", "按课时"), + // 按时间 + DATE("date", "按时间"), + // 按期 + CYCLE("cycle", "按期"); + + private final String chargeType; + + private final String chargeTypeName; + + CourseChargeTypeEnum(String chargeType, String chargeTypeName) { + this.chargeType = chargeType; + this.chargeTypeName = chargeTypeName; + } + + public String getChargeType() { + return chargeType; + } + + public String getChargeTypeName() { + return chargeTypeName; + } + + public static String getChargeType(String chargeType) { + for (CourseChargeTypeEnum chargeTypeEnum : CourseChargeTypeEnum.values()) { + if (chargeTypeEnum.getChargeType().equals(chargeType)){ + return chargeTypeEnum.getChargeTypeName(); + } + } + return "未知"; + } +} diff --git a/ruoyi-system/src/main/java/com/ruoyi/course/domain/enums/LogTypeEnum.java b/ruoyi-system/src/main/java/com/ruoyi/course/domain/enums/LogTypeEnum.java new file mode 100644 index 0000000..46388a1 --- /dev/null +++ b/ruoyi-system/src/main/java/com/ruoyi/course/domain/enums/LogTypeEnum.java @@ -0,0 +1,34 @@ +package com.ruoyi.course.domain.enums; + +/** + * 学生日志类型 + * @author :zhangbaoyu + * @date :Created in 2020/12/19 10:15 + */ +public enum LogTypeEnum { + + PAY_FEE("1","缴费"), + ATTEND_CLA("2","上课"), + DELETE_ATTEND_CLA("3","删除上课记录"), + INVALID_ORDER("4","作废订单"), + OUT_CLA("5","退出班级"), + IN_CLA("6","进入班级"), + ; + + private final String logType; + + private final String logTypeName; + + LogTypeEnum(String logType, String logTypeName) { + this.logType = logType; + this.logTypeName = logTypeName; + } + + public String getLogType() { + return logType; + } + + public String getLogTypeName() { + return logTypeName; + } +} diff --git a/ruoyi-system/src/main/java/com/ruoyi/course/domain/req/ReqClaTimeAttend.java b/ruoyi-system/src/main/java/com/ruoyi/course/domain/req/ReqClaTimeAttend.java new file mode 100644 index 0000000..92de3ba --- /dev/null +++ b/ruoyi-system/src/main/java/com/ruoyi/course/domain/req/ReqClaTimeAttend.java @@ -0,0 +1,106 @@ +package com.ruoyi.course.domain.req; + +import com.fasterxml.jackson.databind.annotation.JsonSerialize; +import com.fasterxml.jackson.databind.ser.std.ToStringSerializer; +import lombok.Data; +import org.apache.commons.lang3.StringUtils; + +import java.util.List; + +/** + * 记上课请求参数 + * 修改上课记录请求参数 + */ +@Data +public class ReqClaTimeAttend { + + // 上课方式 排课记上课rule、自定义上课custom + private String attendType; + + // 排课编号 + @JsonSerialize(using = ToStringSerializer.class) + private Long courseTimeId; + + private Long claId; + + private Long teacherId; + + private Long roomId; + + private String claDate; + + private String startTime; + + private String endTime; + + private String classTheme; + + private String memo; + + List studentAttendList; + + /** + * 参数校验 + * @return + */ +// public APIResponse checkParam() { +// if(null == studentAttendList || studentAttendList.size() ==0) { +// return APIResponse.toExceptionResponse("排课记上课,请选择上课学生"); +// } +// for (ReqClaTimeAttendItem attendItem : studentAttendList) { +// if(StringUtils.isAnyEmpty(attendItem.getAttendStatus())) { +// return APIResponse.toExceptionResponse("请选择学员到课状态"); +// } else if(null == attendItem.getStudentCourseId()) { +// return APIResponse.toExceptionResponse("请选择学员"); +// } else if(null == attendItem.getStuLoseHour()) { +// return APIResponse.toExceptionResponse("请选择扣减课时"); +// } +// } +// if("rule".equals(attendType)) { +// // 排课记上课 +// if(null == courseTimeId) { +// return APIResponse.toExceptionResponse("排课记上课,未选择上课日期!"); +// } else if(StringUtils.isAnyEmpty(startTime,endTime)) { +// return APIResponse.toExceptionResponse("排课记上课,未选择上下课时间!"); +// } +// +// } else if ("custom".equals(attendType)) { +// // 自定义记上课 +// if(StringUtils.isAnyEmpty(claDate,startTime,endTime)) { +// return APIResponse.toExceptionResponse("自定义记上课,未选择上课日期,上下课时间!"); +// } else if( null == teacherId) { +// return APIResponse.toExceptionResponse("自定义记上课,请选择上课教师!"); +// } +// } +// return APIResponse.toOkResponse(); +// } + + /** + * 已上课修改 + * 参数校验 + * @return + */ +// public APIResponse checkParamForUpdateHadClaTime() { +// if(null == studentAttendList || studentAttendList.size() ==0) { +// return APIResponse.toExceptionResponse("排课记上课,请选择上课学生"); +// } +// for (ReqClaTimeAttendItem attendItem : studentAttendList) { +// if(StringUtils.isAnyEmpty(attendItem.getAttendStatus())) { +// return APIResponse.toExceptionResponse("请选择学员到课状态"); +// } else if(null == attendItem.getStudentCourseId()) { +// return APIResponse.toExceptionResponse("请选择学员"); +// } else if(null == attendItem.getStuLoseHour()) { +// return APIResponse.toExceptionResponse("请选择扣减课时"); +// } +// } +// +// // 自定义记上课 +// if(StringUtils.isAnyEmpty(claDate,startTime,endTime)) { +// return APIResponse.toExceptionResponse("自定义记上课,未选择上课日期,上下课时间!"); +// } else if( null == teacherId) { +// return APIResponse.toExceptionResponse("自定义记上课,请选择上课教师!"); +// } +// return APIResponse.toOkResponse(); +// } + +} diff --git a/ruoyi-system/src/main/java/com/ruoyi/course/domain/req/ReqClaTimeAttendItem.java b/ruoyi-system/src/main/java/com/ruoyi/course/domain/req/ReqClaTimeAttendItem.java new file mode 100644 index 0000000..7cd8b29 --- /dev/null +++ b/ruoyi-system/src/main/java/com/ruoyi/course/domain/req/ReqClaTimeAttendItem.java @@ -0,0 +1,26 @@ +package com.ruoyi.course.domain.req; + +import lombok.Data; + +import java.math.BigDecimal; + +/** + * @author :zhangbaoyu + * @date :Created in 2020/10/1 19:47 + */ +@Data +public class ReqClaTimeAttendItem { + + // 学生 + private Long studentCourseId; + + // 1:到课 2:请假 3:缺勤 + private String attendStatus; + + // 备注 + private String memo; + + // 学生消耗课时 + private BigDecimal stuLoseHour; + +} diff --git a/ruoyi-system/src/main/java/com/ruoyi/course/domain/ReqClaTimeCount.java b/ruoyi-system/src/main/java/com/ruoyi/course/domain/req/ReqClaTimeCount.java similarity index 90% rename from ruoyi-system/src/main/java/com/ruoyi/course/domain/ReqClaTimeCount.java rename to ruoyi-system/src/main/java/com/ruoyi/course/domain/req/ReqClaTimeCount.java index bdc700c..a6f68a2 100644 --- a/ruoyi-system/src/main/java/com/ruoyi/course/domain/ReqClaTimeCount.java +++ b/ruoyi-system/src/main/java/com/ruoyi/course/domain/req/ReqClaTimeCount.java @@ -1,4 +1,4 @@ -package com.ruoyi.course.domain; +package com.ruoyi.course.domain.req; import com.ruoyi.course.domain.page.ReqDeptCondition; diff --git a/ruoyi-system/src/main/java/com/ruoyi/course/domain/ReqSearchClaTime.java b/ruoyi-system/src/main/java/com/ruoyi/course/domain/req/ReqSearchClaTime.java similarity index 57% rename from ruoyi-system/src/main/java/com/ruoyi/course/domain/ReqSearchClaTime.java rename to ruoyi-system/src/main/java/com/ruoyi/course/domain/req/ReqSearchClaTime.java index 5c4b74e..d844a98 100644 --- a/ruoyi-system/src/main/java/com/ruoyi/course/domain/ReqSearchClaTime.java +++ b/ruoyi-system/src/main/java/com/ruoyi/course/domain/req/ReqSearchClaTime.java @@ -1,19 +1,24 @@ -package com.ruoyi.course.domain; +package com.ruoyi.course.domain.req; +import com.fasterxml.jackson.databind.annotation.JsonSerialize; +import com.fasterxml.jackson.databind.ser.std.ToStringSerializer; import com.ruoyi.course.domain.page.ReqPageBase; import lombok.Data; +import org.joda.time.DateTime; import java.io.Serializable; +import java.util.HashSet; /** * @author :zhangbaoyu * @date :Created in 2020/9/18 14:45 */ @Data -public class ReqSearchClaTime extends ReqPageBase implements Serializable { +public class ReqSearchClaTime implements Serializable { // 排课 编号 + @JsonSerialize(using = ToStringSerializer.class) private Long courseTimeId; // 课程 @@ -58,12 +63,13 @@ public class ReqSearchClaTime extends ReqPageBase implements Serializable { */ private String orderByType; -// public void setDiffNowDay(Integer diffNowDay) { -// this.diffNowDay = diffNowDay; -// if(null != diffNowDay) { -// DateTime now = DateTime.now(); -// this.beginDate = now.minusDays(diffNowDay).toString("yyyy-MM-dd"); -// this.endDate = now.plusDays(diffNowDay).toString("yyyy-MM-dd"); -// } -// } + + public void setDiffNowDay(Integer diffNowDay) { + this.diffNowDay = diffNowDay; + if(null != diffNowDay) { + DateTime now = DateTime.now(); + this.beginDate = now.minusDays(diffNowDay).toString("yyyy-MM-dd"); + this.endDate = now.plusDays(diffNowDay).toString("yyyy-MM-dd"); + } + } } diff --git a/ruoyi-system/src/main/java/com/ruoyi/course/domain/req/ReqSearchStuCourseSignUp.java b/ruoyi-system/src/main/java/com/ruoyi/course/domain/req/ReqSearchStuCourseSignUp.java new file mode 100644 index 0000000..0922968 --- /dev/null +++ b/ruoyi-system/src/main/java/com/ruoyi/course/domain/req/ReqSearchStuCourseSignUp.java @@ -0,0 +1,28 @@ +package com.ruoyi.course.domain.req; + +import lombok.Data; + +import java.io.Serializable; + +/** + * 报读列表 请求参数 + * @author :zhangbaoyu + * @date :Created in 2020/12/21 20:28 + */ +@Data +public class ReqSearchStuCourseSignUp implements Serializable { + + private Long claId; + + // 所属校区 + private Long departId; + + // 所属课程 + private Long courseId; + + // 剩余最大天数 + private Integer minBalanceDay; + + // 剩余最大课时 + private Integer minBalanceHour; +} diff --git a/ruoyi-system/src/main/java/com/ruoyi/course/domain/req/ReqSearchStudentCourse.java b/ruoyi-system/src/main/java/com/ruoyi/course/domain/req/ReqSearchStudentCourse.java new file mode 100644 index 0000000..74102e8 --- /dev/null +++ b/ruoyi-system/src/main/java/com/ruoyi/course/domain/req/ReqSearchStudentCourse.java @@ -0,0 +1,15 @@ +package com.ruoyi.course.domain.req; + +import lombok.Data; + +/** + * 查询学生报读的课程信息 + * @author :zhangbaoyu + * @date :Created in 2020/10/8 22:03 + */ +@Data +public class ReqSearchStudentCourse { + + private Long studentId; + +} diff --git a/ruoyi-system/src/main/java/com/ruoyi/course/domain/req/ReqSearchStudentCourseCla.java b/ruoyi-system/src/main/java/com/ruoyi/course/domain/req/ReqSearchStudentCourseCla.java new file mode 100644 index 0000000..ae634ae --- /dev/null +++ b/ruoyi-system/src/main/java/com/ruoyi/course/domain/req/ReqSearchStudentCourseCla.java @@ -0,0 +1,27 @@ +package com.ruoyi.course.domain.req; + +import lombok.Data; + +import java.io.Serializable; + +/** + * 查询学生课程、班级 + * @author :zhangbaoyu + * @date :Created in 2020-06-20 12:30 + */ +@Data +public class ReqSearchStudentCourseCla implements Serializable { + + private Long claId; + + // 所属校区 + private Long departId; + + // 所属课程 + private Long courseId; + + private Boolean unChooseCla; + + // 是否生效 + private Boolean effect; +} diff --git a/ruoyi-system/src/main/java/com/ruoyi/course/domain/res/RespBook.java b/ruoyi-system/src/main/java/com/ruoyi/course/domain/res/RespBook.java new file mode 100644 index 0000000..9933cb5 --- /dev/null +++ b/ruoyi-system/src/main/java/com/ruoyi/course/domain/res/RespBook.java @@ -0,0 +1,41 @@ +package com.ruoyi.course.domain.res; + +import lombok.Data; + +import java.util.Date; + +/** + * 预约学员信息 + */ +@Data +public class RespBook { + + private Long bookId; + private String courseName; + private String claName; + private String roomName; + private String teacherName; + private String claDate; + private String startTime; + /** + * 状态 1:待上课 2:已上课 + */ + private String status; + // 预约 + private Integer bookAttendCnt; + //最多 + private Integer atClassCnt; + //最少 + private Integer lessCnt; + private int bookStatus; + + private Date createTime; + + private Long studentId; + private String studentName; + +// 性别:0->未知;1->女;2->男 + private String sex; + private String phone; + +} diff --git a/ruoyi-system/src/main/java/com/ruoyi/course/domain/RespClaTime.java b/ruoyi-system/src/main/java/com/ruoyi/course/domain/res/RespClaTime.java similarity index 72% rename from ruoyi-system/src/main/java/com/ruoyi/course/domain/RespClaTime.java rename to ruoyi-system/src/main/java/com/ruoyi/course/domain/res/RespClaTime.java index d856ca4..a72c01e 100644 --- a/ruoyi-system/src/main/java/com/ruoyi/course/domain/RespClaTime.java +++ b/ruoyi-system/src/main/java/com/ruoyi/course/domain/res/RespClaTime.java @@ -1,5 +1,8 @@ -package com.ruoyi.course.domain; +package com.ruoyi.course.domain.res; +import com.fasterxml.jackson.annotation.JsonFormat; +import com.fasterxml.jackson.databind.annotation.JsonSerialize; +import com.fasterxml.jackson.databind.ser.std.ToStringSerializer; import lombok.Data; import java.math.BigDecimal; @@ -13,6 +16,7 @@ import java.util.Date; @Data public class RespClaTime { + @JsonSerialize(using = ToStringSerializer.class) private Long courseTimeId; private Long claId; @@ -44,13 +48,12 @@ public class RespClaTime { private String realEndTime; - // 应到 - private Integer needAttendCnt; + // 预约 + private Integer bookAttendCnt; // 实到 private Integer realAttendCnt; - private Integer leaveCnt; private Integer outCnt; @@ -67,6 +70,7 @@ public class RespClaTime { private String memo; // 最后变更时间 记录上课时间 + @JsonFormat(shape = JsonFormat.Shape.STRING, pattern="yyyy-MM-dd HH:mm:ss",timezone = "GMT+8") private Date lastUpdateTime; // 记录人 private String lastUpdateUserName; diff --git a/ruoyi-system/src/main/java/com/ruoyi/course/domain/RespClaTimeCalendar.java b/ruoyi-system/src/main/java/com/ruoyi/course/domain/res/RespClaTimeCalendar.java similarity index 77% rename from ruoyi-system/src/main/java/com/ruoyi/course/domain/RespClaTimeCalendar.java rename to ruoyi-system/src/main/java/com/ruoyi/course/domain/res/RespClaTimeCalendar.java index c6ea51e..e4b7b4c 100644 --- a/ruoyi-system/src/main/java/com/ruoyi/course/domain/RespClaTimeCalendar.java +++ b/ruoyi-system/src/main/java/com/ruoyi/course/domain/res/RespClaTimeCalendar.java @@ -1,5 +1,6 @@ -package com.ruoyi.course.domain; +package com.ruoyi.course.domain.res; +import com.ruoyi.course.domain.ScClaTime; import lombok.Data; /** @@ -11,6 +12,7 @@ import lombok.Data; public class RespClaTimeCalendar extends ScClaTime { private String claColor; + private String pic; private String staffName; @@ -20,7 +22,7 @@ public class RespClaTimeCalendar extends ScClaTime { // 上课 开始小时 private Integer startHour; - private Integer studentCount; + diff --git a/ruoyi-system/src/main/java/com/ruoyi/course/domain/res/RespCourseClaStudent.java b/ruoyi-system/src/main/java/com/ruoyi/course/domain/res/RespCourseClaStudent.java new file mode 100644 index 0000000..fa694e3 --- /dev/null +++ b/ruoyi-system/src/main/java/com/ruoyi/course/domain/res/RespCourseClaStudent.java @@ -0,0 +1,115 @@ +package com.ruoyi.course.domain.res; + +import com.fasterxml.jackson.annotation.JsonFormat; +import com.ruoyi.course.domain.enums.CourseChargeTypeEnum; +import lombok.Data; +import org.joda.time.DateTime; +import org.joda.time.Period; +import org.joda.time.PeriodType; + +import java.math.BigDecimal; +import java.util.Date; + +/** + * 班级学员 + * 用于 班级下学生列表 + * @author :zhangbaoyu + * @date :Created in 2020/9/28 16:51 + */ +@Data +public class RespCourseClaStudent { + + private Long studentCourseId; + + private Long claId; + + private Long courseId; + + // 报读校区 + private String deptName; + + private Long studentId; + + private String studentName; + + private String sex; + + private String phone; + + // 联系人信息 + private String contactInfo; + + private String chargeType; + + private BigDecimal totalDay; + private BigDecimal totalHour; + private BigDecimal balanceHour; + // 过期课时 + private BigDecimal expireHour; + + // 即将生效的 总天数 + private BigDecimal comingEffectDay; + + /** + * 按时间收费 当期 到期时间 + * 当前生效周期到期时间 + */ + @JsonFormat(shape = JsonFormat.Shape.STRING, pattern="yyyy-MM-dd HH:mm:ss",timezone = "GMT+8") + private Date endDate; + + // 状态 + private String status; + + // 首次报名时间 + private Date firstSignTime; + + // 最后一次续费时间 + private Date lastSignTime; + + /** + * 获取剩余天数 + * @return + */ + public BigDecimal getBalanceDays() { + try { + if(CourseChargeTypeEnum.DATE.getChargeType().equals(chargeType)) { + if(null == this.endDate) { + // 无生效周期 + return comingEffectDay; + } else { + // 有生效周期 + Period period = new Period(DateTime.now(), new DateTime(this.endDate), PeriodType.days()); + return new BigDecimal(period.getDays() + 1).add(comingEffectDay); + } + } else { + return BigDecimal.ZERO; + } + } catch (Exception e) { + e.printStackTrace(); + return BigDecimal.ZERO; + } + } + + /** + * 按时间收费 当前时间 是否在缴费周期内(是否有效) + * @return + */ + public boolean isEffect() { + try{ + if(CourseChargeTypeEnum.DATE.getChargeType().equals(chargeType)) { + if(null == this.endDate) { + // 未生效 + return false; + } else { + return true; + } + } else { + return true; + } + } catch (Exception e) { + e.printStackTrace(); + return false; + } + } + +} diff --git a/ruoyi-system/src/main/java/com/ruoyi/course/domain/res/RespMemberTypeCourses.java b/ruoyi-system/src/main/java/com/ruoyi/course/domain/res/RespMemberTypeCourses.java new file mode 100644 index 0000000..238890e --- /dev/null +++ b/ruoyi-system/src/main/java/com/ruoyi/course/domain/res/RespMemberTypeCourses.java @@ -0,0 +1,76 @@ +package com.ruoyi.course.domain.res; + +import lombok.Data; + +import java.math.BigDecimal; +import java.time.LocalDate; +import java.util.Date; + +/** + * 会员卡项-课程 内容信息 + */ +@Data +public class RespMemberTypeCourses { + + + + private Long memberCardId; + + private String cardNo; + + private BigDecimal remainingTotalFee; + + private LocalDate expiryDate; + + private BigDecimal remainingCount; + + private String chargeType; + + /** + * 卡类型ID + */ + private Long cardTypeId; + + /** + * 卡类型名称 + */ + private String cardName; + + /** + * 课程类型ID + */ + private Long courseTypeId; + + /** + * 课程类型名称 + */ + private String courseType; + + /** + * 课程ID + */ + private Long courseId; + + /** + * 课程名称 + */ + private String courseName; + + + /** + * 划扣次数 + */ + private BigDecimal deductCnt; + + /** + * 划扣金额 + */ + private BigDecimal deductFee; + private BigDecimal tuitionFee; + + //限制约课次数 1不限次数 2限制约课次数 + private String restrictedNum; + private String bookTime;//限制约课时间范围 每天 每周 每月 + private Integer bookNum; + +} diff --git a/ruoyi-system/src/main/java/com/ruoyi/course/domain/res/RespOrderForApp.java b/ruoyi-system/src/main/java/com/ruoyi/course/domain/res/RespOrderForApp.java new file mode 100644 index 0000000..1a51a3f --- /dev/null +++ b/ruoyi-system/src/main/java/com/ruoyi/course/domain/res/RespOrderForApp.java @@ -0,0 +1,29 @@ +package com.ruoyi.course.domain.res; + +import com.fasterxml.jackson.annotation.JsonFormat; +import lombok.Data; + +import java.math.BigDecimal; +import java.util.Date; + +/** + * + */ +@Data +public class RespOrderForApp { + + private String saleStaffName; + private String studentName; + private BigDecimal receiptFee;//实际支付 + private Long commissionPlansId;//佣金方案 + private String courseName; + private String detailTag;//类型 1新报 2续报 + private String dateUnit;//时间周期 天/月/季/年 + private BigDecimal buyCount;//购买数量 + @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss") + private Date createTime; + + + + +} diff --git a/ruoyi-system/src/main/java/com/ruoyi/course/domain/res/RespStuBook.java b/ruoyi-system/src/main/java/com/ruoyi/course/domain/res/RespStuBook.java new file mode 100644 index 0000000..bff138b --- /dev/null +++ b/ruoyi-system/src/main/java/com/ruoyi/course/domain/res/RespStuBook.java @@ -0,0 +1,29 @@ +package com.ruoyi.course.domain.res; + +import lombok.Data; + +import java.math.BigDecimal; +import java.util.Date; + +/** + * 预约学员信息 + */ +@Data +public class RespStuBook { + + private Long studentId; + private Long bookId; + + private String studentName; + +// 性别:0->未知;1->女;2->男 + private String sex; + private String phone; + private int bookStatus; + private Date createTime; + private int checkIn; + private Date checkInTime; + + + +} diff --git a/ruoyi-system/src/main/java/com/ruoyi/course/domain/res/RespStuCourseSignUpStudent.java b/ruoyi-system/src/main/java/com/ruoyi/course/domain/res/RespStuCourseSignUpStudent.java new file mode 100644 index 0000000..2460166 --- /dev/null +++ b/ruoyi-system/src/main/java/com/ruoyi/course/domain/res/RespStuCourseSignUpStudent.java @@ -0,0 +1,122 @@ +package com.ruoyi.course.domain.res; + +import com.fasterxml.jackson.annotation.JsonFormat; +import com.ruoyi.course.domain.enums.CourseChargeTypeEnum; +import lombok.Data; +import org.joda.time.DateTime; +import org.joda.time.Period; +import org.joda.time.PeriodType; + +import java.math.BigDecimal; +import java.util.Date; + +/** + * 学员报读列表 + * @author :zhangbaoyu + * @date :Created in 2020/12/21 20:28 + */ +@Data +public class RespStuCourseSignUpStudent { + + private Long studentCourseId; + + private Long claId; + + private String claName; + + private Long courseId; + + private String courseName; + + // 报读校区 + private String deptName; + + private Long studentId; + + private String studentName; + + private String sex; + + private String phone; + + // 联系人信息 + private String contactInfo; + + private String chargeType; + + private BigDecimal totalHour; + private BigDecimal balanceHour; + // 过期课时 + private BigDecimal expireHour; + + // 总学费 + private BigDecimal totalFee; + // 剩余学费 + private BigDecimal balanceFee; + // 过期学费 + private BigDecimal expireFee; + + private BigDecimal totalDay; + + private String orderDetail; + + // 即将生效的 总天数 + private BigDecimal comingEffectDay; + + /** + * 按时间收费 当期 到期时间 + * 当前生效周期到期时间 + */ + @JsonFormat(shape = JsonFormat.Shape.STRING, pattern="yyyy-MM-dd HH:mm:ss",timezone = "GMT+8") + private Date endDate; + + // 状态 + private String status; + + /** + * 获取剩余天数 + * @return + */ + public BigDecimal getBalanceDays() { + try { + if(CourseChargeTypeEnum.DATE.getChargeType().equals(chargeType)) { + if(null == this.endDate) { + // 无生效周期 + return comingEffectDay; + } else { + // 有生效周期 + Period period = new Period(DateTime.now(), new DateTime(this.endDate), PeriodType.days()); + return new BigDecimal(period.getDays() + 1).add(comingEffectDay); + } + } else { + return BigDecimal.ZERO; + } + } catch (Exception e) { + e.printStackTrace(); + return BigDecimal.ZERO; + } + } + + /** + * 按时间收费 当前时间 是否在缴费周期内(是否有效) + * @return + */ + public boolean isEffect() { + try{ + if(CourseChargeTypeEnum.DATE.getChargeType().equals(chargeType)) { + if(null == this.endDate) { + // 未生效 + return false; + } else { + return true; + } + } else { + return true; + } + } catch (Exception e) { + e.printStackTrace(); + return false; + } + } + +} diff --git a/ruoyi-system/src/main/java/com/ruoyi/course/domain/res/RespStudentCourse.java b/ruoyi-system/src/main/java/com/ruoyi/course/domain/res/RespStudentCourse.java new file mode 100644 index 0000000..4bdf95c --- /dev/null +++ b/ruoyi-system/src/main/java/com/ruoyi/course/domain/res/RespStudentCourse.java @@ -0,0 +1,103 @@ +package com.ruoyi.course.domain.res; + +import com.ruoyi.course.domain.enums.CourseChargeTypeEnum; +import lombok.Data; +import org.joda.time.DateTime; +import org.joda.time.Period; +import org.joda.time.PeriodType; + +import java.math.BigDecimal; + +/** + * 学生 报读 课程列表 + * @author :zhangbaoyu + * @date :Created in 2020/10/8 22:02 + */ +@Data +public class RespStudentCourse { + + private Long studentCourseId; + + private String courseName; + + private String chargeType; + + private BigDecimal totalDay; + + private BigDecimal totalHour; + + private BigDecimal balanceHour; + + // 过期课时 + private BigDecimal expireHour; + + private BigDecimal totalFee; + + private String status; + + private Long studentId; + + private String studentName; + + private String deptName; + + private String claName; + + private String orderDetail; + + // 即将生效的 总天数 + private BigDecimal comingEffectDay; + + /** + * 按时间收费 当期 到期时间 + * 当前生效周期到期时间 + */ + private String endDate; + + /** + * 获取剩余天数 + * @return + */ + public BigDecimal getBalanceDays() { + try { + if(CourseChargeTypeEnum.DATE.getChargeType().equals(chargeType)) { + if(null == this.endDate) { + // 无生效周期 + return comingEffectDay; + } else { + // 有生效周期 + Period period = new Period(DateTime.now(), new DateTime(this.endDate), PeriodType.days()); + return new BigDecimal(period.getDays() + 1).add(comingEffectDay); + } + } else { + return BigDecimal.ZERO; + } + } catch (Exception e) { + e.printStackTrace(); + return BigDecimal.ZERO; + } + } + + /** + * 按时间收费 当前时间 是否在缴费周期内(是否有效) + * @return + */ + public boolean isEffect() { + try{ + if(CourseChargeTypeEnum.DATE.getChargeType().equals(chargeType)) { + if(null == this.endDate) { + // 未生效 + return false; + } else { + return true; + } + } else { + return true; + } + } catch (Exception e) { + e.printStackTrace(); + return false; + } + } + +} diff --git a/ruoyi-system/src/main/java/com/ruoyi/course/domain/time/ClaTimeBookItem.java b/ruoyi-system/src/main/java/com/ruoyi/course/domain/time/ClaTimeBookItem.java new file mode 100644 index 0000000..b5a9e79 --- /dev/null +++ b/ruoyi-system/src/main/java/com/ruoyi/course/domain/time/ClaTimeBookItem.java @@ -0,0 +1,71 @@ +package com.ruoyi.course.domain.time; + + +import com.baomidou.mybatisplus.annotation.TableField; +import com.fasterxml.jackson.annotation.JsonFormat; +import com.fasterxml.jackson.databind.annotation.JsonSerialize; +import com.fasterxml.jackson.databind.ser.std.ToStringSerializer; +import com.ruoyi.common.constant.Constants; +import com.ruoyi.course.domain.res.RespClaTimeCalendar; +import lombok.Data; +import springfox.documentation.spring.web.json.Json; + +import java.util.Date; +import java.util.List; +import java.util.Map; + +/** + * 预约排课信息 + */ +@Data +public class ClaTimeBookItem { + + @JsonSerialize(using = ToStringSerializer.class) + private Long courseTimeId; + private Long bookId; + + private String claName; + + private String storeName; + + private String pic; + + // 日期 + private String claDate; + + // 星期 + private String weekDay; + + private String startTime; + + private String endTime; + + // 教室 + private String roomName; + + private String claColor; + + // 上课状态 1:待上课 2:已上课 + private String claTimeStatus; + //预约状态:0->预约中;1->教练确认;2->店长确认/预约成功/待上课 3->已取消;4- >已完成/待评价; + private int bookStatus; + + //预约时间 + @JsonFormat(shape = JsonFormat.Shape.STRING, pattern="yyyy-MM-dd HH:mm:ss",timezone = "GMT+8") + private Date createTime; + + private String code; + private String qrCode; + + private String courseName; + + //老师信息 + private Long teacherId; + private String teacherName; + + //*0未签到 1签到 + private int checkIn; + + //{status:1,time:2025-08-05 12:00:00} + private List statusTime; +} diff --git a/ruoyi-system/src/main/java/com/ruoyi/course/domain/time/ClaTimeCalendarItem.java b/ruoyi-system/src/main/java/com/ruoyi/course/domain/time/ClaTimeCalendarItem.java index a8743ad..7b09294 100644 --- a/ruoyi-system/src/main/java/com/ruoyi/course/domain/time/ClaTimeCalendarItem.java +++ b/ruoyi-system/src/main/java/com/ruoyi/course/domain/time/ClaTimeCalendarItem.java @@ -1,24 +1,30 @@ package com.ruoyi.course.domain.time; +import com.baomidou.mybatisplus.annotation.TableField; +import com.fasterxml.jackson.databind.annotation.JsonSerialize; +import com.fasterxml.jackson.databind.ser.std.ToStringSerializer; import com.ruoyi.common.constant.Constants; -import com.ruoyi.course.domain.RespClaTimeCalendar; +import com.ruoyi.course.domain.res.RespClaTimeCalendar; import lombok.Data; /** * 单节排课信息 - * @author :zhangbaoyu - * @date :Created in 2020/9/23 18:54 */ @Data public class ClaTimeCalendarItem { + @JsonSerialize(using = ToStringSerializer.class) private Long courseTimeId; private String claName; private String courseName; + private String storeName; + + private String pic; + // 日期 private String claDate; @@ -41,16 +47,32 @@ public class ClaTimeCalendarItem { // 上课状态 private String claTimeStatus; + /** + * 预约人数 + */ + private Integer bookAttendCnt; + + /** + * 限制最高人数 + */ + private Integer atClassCnt; + + /** + * 最低开课人数 + */ + private Integer lessCnt; + public ClaTimeCalendarItem transfer(RespClaTimeCalendar respClaTime) { this.courseTimeId = respClaTime.getCourseTimeId(); this.claName = respClaTime.getClaName(); this.courseName = respClaTime.getCourseName(); + this.pic = respClaTime.getPic(); this.claDate = respClaTime.getClaDate(); this.weekDay = Constants.WEEK_DAY_MAP.get(respClaTime.getWeekDay()); this.startTime = respClaTime.getStartTime().substring(0,5); this.endTime = respClaTime.getEndTime().substring(0,5); this.staffName = respClaTime.getStaffName(); - this.studentCount = respClaTime.getStudentCount(); +// this.studentCount = respClaTime.getStudentCount(); this.roomName = respClaTime.getRoomName(); this.claColor = respClaTime.getClaColor(); this.claTimeStatus = respClaTime.getStatus(); diff --git a/ruoyi-system/src/main/java/com/ruoyi/course/domain/time/ClaTimeColumnTitle.java b/ruoyi-system/src/main/java/com/ruoyi/course/domain/time/ClaTimeColumnTitle.java index 2cda15e..31649a1 100644 --- a/ruoyi-system/src/main/java/com/ruoyi/course/domain/time/ClaTimeColumnTitle.java +++ b/ruoyi-system/src/main/java/com/ruoyi/course/domain/time/ClaTimeColumnTitle.java @@ -4,8 +4,6 @@ import lombok.Data; /** * 按时间 课表 title - * @author :zhangbaoyu - * @date :Created in 2020/9/23 17:16 */ @Data public class ClaTimeColumnTitle { diff --git a/ruoyi-system/src/main/java/com/ruoyi/course/domain/time/ClaTimeContainer.java b/ruoyi-system/src/main/java/com/ruoyi/course/domain/time/ClaTimeContainer.java index 4650e82..e8847c2 100644 --- a/ruoyi-system/src/main/java/com/ruoyi/course/domain/time/ClaTimeContainer.java +++ b/ruoyi-system/src/main/java/com/ruoyi/course/domain/time/ClaTimeContainer.java @@ -8,8 +8,6 @@ import java.util.Map; /** * 具体排课数据 * table 单行 - * @author :zhangbaoyu - * @date :Created in 2020/9/23 18:59 */ @Data public class ClaTimeContainer { diff --git a/ruoyi-system/src/main/java/com/ruoyi/course/domain/time/ClaTimeItem.java b/ruoyi-system/src/main/java/com/ruoyi/course/domain/time/ClaTimeItem.java new file mode 100644 index 0000000..56a88ff --- /dev/null +++ b/ruoyi-system/src/main/java/com/ruoyi/course/domain/time/ClaTimeItem.java @@ -0,0 +1,39 @@ +package com.ruoyi.course.domain.time; + + +import com.fasterxml.jackson.annotation.JsonFormat; +import lombok.Data; + +import java.math.BigDecimal; +import java.util.Date; +import java.util.List; +import java.util.Map; + +/** + * 已上课信息 + */ +@Data +public class ClaTimeItem { + + + //老师信息 + private String teacherName; + + private String claName; + private String roomName; + + private String realClaDate; + private String realStartTime; + private String realEndTime; + private Double roomUsageTime; + + + //预约时间 + private Integer realAttendCnt; + + private BigDecimal teacherFee; + private BigDecimal venueFee; + + + +} diff --git a/ruoyi-system/src/main/java/com/ruoyi/course/domain/time/RespBusinessClaTimeCalendar.java b/ruoyi-system/src/main/java/com/ruoyi/course/domain/time/RespBusinessClaTimeCalendar.java index 440dd85..da552e6 100644 --- a/ruoyi-system/src/main/java/com/ruoyi/course/domain/time/RespBusinessClaTimeCalendar.java +++ b/ruoyi-system/src/main/java/com/ruoyi/course/domain/time/RespBusinessClaTimeCalendar.java @@ -6,8 +6,6 @@ import java.util.List; /** * 按时间 课表 - * @author :zhangbaoyu - * @date :Created in 2020/9/23 17:15 */ @Data public class RespBusinessClaTimeCalendar { diff --git a/ruoyi-system/src/main/java/com/ruoyi/course/domain/time/StudentOrderItem.java b/ruoyi-system/src/main/java/com/ruoyi/course/domain/time/StudentOrderItem.java new file mode 100644 index 0000000..113dcf5 --- /dev/null +++ b/ruoyi-system/src/main/java/com/ruoyi/course/domain/time/StudentOrderItem.java @@ -0,0 +1,35 @@ +package com.ruoyi.course.domain.time; + + +import lombok.Data; + +import java.math.BigDecimal; + +/** + * 已成交学员信息 + */ +@Data +public class StudentOrderItem { + + + //学员信息 + private String studentName; + private String birthDay; + private Integer age; + //性别:0->未知;1->女;2->男 + private Integer sex; + private String phone; + private String courseName; + //收费模式 hour:课时 date:时间 cycle:期 + private String chargeType; + //开始时间 + private String beginDate; + //过期时间 + private String expireDate; + //收款金额 + private BigDecimal receiptFee; + + + + +} diff --git a/ruoyi-system/src/main/java/com/ruoyi/course/mapper/ContextMapper.java b/ruoyi-system/src/main/java/com/ruoyi/course/mapper/ContextMapper.java deleted file mode 100644 index 0e270b9..0000000 --- a/ruoyi-system/src/main/java/com/ruoyi/course/mapper/ContextMapper.java +++ /dev/null @@ -1,12 +0,0 @@ -package com.ruoyi.course.mapper; - -import com.baomidou.mybatisplus.core.mapper.BaseMapper; -import com.ruoyi.course.domain.Context; - -import java.util.List; -import java.util.Map; - -public interface ContextMapper extends BaseMapper { - Context getOne(Map map); - List findList(Map map); -} diff --git a/ruoyi-system/src/main/java/com/ruoyi/course/mapper/ScBookCourseLogMapper.java b/ruoyi-system/src/main/java/com/ruoyi/course/mapper/ScBookCourseLogMapper.java new file mode 100644 index 0000000..6641567 --- /dev/null +++ b/ruoyi-system/src/main/java/com/ruoyi/course/mapper/ScBookCourseLogMapper.java @@ -0,0 +1,18 @@ +package com.ruoyi.course.mapper; + +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import com.ruoyi.course.domain.ScBookCourse; +import com.ruoyi.course.domain.ScBookCourseLog; + +/** + *

+ * 排课信息 Mapper 接口 + *

+ * + * + * + */ +public interface ScBookCourseLogMapper extends BaseMapper { + + +} diff --git a/ruoyi-system/src/main/java/com/ruoyi/course/mapper/ScBookCourseMapper.java b/ruoyi-system/src/main/java/com/ruoyi/course/mapper/ScBookCourseMapper.java new file mode 100644 index 0000000..0f318b7 --- /dev/null +++ b/ruoyi-system/src/main/java/com/ruoyi/course/mapper/ScBookCourseMapper.java @@ -0,0 +1,29 @@ +package com.ruoyi.course.mapper; + +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import com.ruoyi.course.domain.ScBookCourse; +import com.ruoyi.course.domain.ScClaTime; +import com.ruoyi.course.domain.req.ReqClaTimeCount; +import com.ruoyi.course.domain.req.ReqSearchClaTime; +import com.ruoyi.course.domain.res.RespClaTime; +import com.ruoyi.course.domain.res.RespClaTimeCalendar; +import com.ruoyi.course.domain.time.ClaTimeBookItem; +import org.apache.ibatis.annotations.Param; + +import java.util.List; + +/** + *

+ * 排课信息 Mapper 接口 + *

+ * + * + * + */ +public interface ScBookCourseMapper extends BaseMapper { + + + List getListByStudent(Long studentId); + ClaTimeBookItem getDetail(Long bookId); +} diff --git a/ruoyi-system/src/main/java/com/ruoyi/course/mapper/ScClaTimeAttendMapper.java b/ruoyi-system/src/main/java/com/ruoyi/course/mapper/ScClaTimeAttendMapper.java new file mode 100644 index 0000000..0eac7e9 --- /dev/null +++ b/ruoyi-system/src/main/java/com/ruoyi/course/mapper/ScClaTimeAttendMapper.java @@ -0,0 +1,29 @@ +package com.ruoyi.course.mapper; + +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import com.ruoyi.course.domain.ScClaTimeAttend; +import com.ruoyi.course.domain.req.ReqClaTimeCount; +import org.apache.ibatis.annotations.Param; + +import java.math.BigDecimal; +import java.util.List; + +/** + *

+ * 上课出勤表 Mapper 接口 + *

+ * + * + * @since 2020-09-30 02:33:26 + */ +public interface ScClaTimeAttendMapper extends com.baomidou.mybatisplus.core.mapper.BaseMapper { + + /** + * 教师 指定日期范围内 累计获得课时 + * 只统计 课时,不统计按时间缴费的 + * + * @param reqClaTimeCount + * @return + */ + BigDecimal selectTeacherSumGetHour(ReqClaTimeCount reqClaTimeCount); +} diff --git a/ruoyi-system/src/main/java/com/ruoyi/course/mapper/ScClaTimeMapper.java b/ruoyi-system/src/main/java/com/ruoyi/course/mapper/ScClaTimeMapper.java index b0c269e..5a228de 100644 --- a/ruoyi-system/src/main/java/com/ruoyi/course/mapper/ScClaTimeMapper.java +++ b/ruoyi-system/src/main/java/com/ruoyi/course/mapper/ScClaTimeMapper.java @@ -3,8 +3,15 @@ package com.ruoyi.course.mapper; import com.baomidou.mybatisplus.core.mapper.BaseMapper; import com.baomidou.mybatisplus.extension.plugins.pagination.Page; import com.ruoyi.course.domain.*; +import com.ruoyi.course.domain.req.ReqClaTimeCount; +import com.ruoyi.course.domain.req.ReqSearchClaTime; +import com.ruoyi.course.domain.res.*; +import com.ruoyi.course.domain.time.ClaTimeCalendarItem; +import com.ruoyi.course.domain.time.ClaTimeItem; +import com.ruoyi.course.domain.time.StudentOrderItem; import org.apache.ibatis.annotations.Param; +import java.util.Date; import java.util.List; /** @@ -12,8 +19,8 @@ import java.util.List; * 排课信息 Mapper 接口 *

* - * @author zhangby - * @since 2020-09-16 + * + * */ public interface ScClaTimeMapper extends BaseMapper { @@ -25,20 +32,25 @@ public interface ScClaTimeMapper extends BaseMapper { */ List selectListForCalendar(ReqSearchClaTime searchClaTime); - /** - * 获取上课记录 - * - * @param searchClaTime - * @return - */ - List selectListForAttend(@Param("searchClaTime") ReqSearchClaTime searchClaTime, @Param("page") Page page); - /** - * 数量 - * - * @param reqClaTimeCount - * @return - */ - Integer selectClaTimeCount(ReqClaTimeCount reqClaTimeCount); -} + List getCourseList(@Param("date")String date, + @Param("courseTimeId")Long courseTimeId, + @Param("deptId")Long deptId + ); + + + List getCourseBookStudent(Long courseTimeId); + + List getCourseCountByStoreManager(@Param("staffId")Long staffId, @Param("beginTime")String beginTime, @Param("endTime")String endTime); + List getStudentsBySaleStaff(Long staffId); + List myDealOrder(@Param("staffId")Long staffId, @Param("beginTime")String beginTime, @Param("endTime")String endTime); + List getOrdersForStore(@Param("deptId")Long deptId, @Param("beginTime")String beginTime, @Param("endTime")String endTime); + + List getBookListForTeacher(@Param("teacherId")Long teacherId, + @Param("beginTime")String beginTime, + @Param("endTime")String endTime); + List getBookListForManager(@Param("deptId")Long deptId, + @Param("beginTime")String beginTime, + @Param("endTime")String endTime); + } diff --git a/ruoyi-system/src/main/java/com/ruoyi/course/mapper/ScCommissionPlansMapper.java b/ruoyi-system/src/main/java/com/ruoyi/course/mapper/ScCommissionPlansMapper.java new file mode 100644 index 0000000..782a58f --- /dev/null +++ b/ruoyi-system/src/main/java/com/ruoyi/course/mapper/ScCommissionPlansMapper.java @@ -0,0 +1,17 @@ +package com.ruoyi.course.mapper; + +import com.ruoyi.course.domain.ScCommissionPlans; +import com.ruoyi.course.domain.ScStudent; + +/** + *

+ * 佣金方案 Mapper 接口 + *

+ * + * + * @since 2020-04-27 07:13:40 + */ +public interface ScCommissionPlansMapper extends com.baomidou.mybatisplus.core.mapper.BaseMapper { + + +} diff --git a/ruoyi-system/src/main/java/com/ruoyi/course/mapper/ScCourseClaMapper.java b/ruoyi-system/src/main/java/com/ruoyi/course/mapper/ScCourseClaMapper.java new file mode 100644 index 0000000..8f4b1d1 --- /dev/null +++ b/ruoyi-system/src/main/java/com/ruoyi/course/mapper/ScCourseClaMapper.java @@ -0,0 +1,56 @@ +package com.ruoyi.course.mapper; + +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import com.ruoyi.course.domain.ScCourseCla; +import org.apache.ibatis.annotations.Param; + +import java.util.List; + +/** + *

+ * 课程班级信息 Mapper 接口 + *

+ * + * + * @since 2020-03-17 01:11:06 + */ +public interface ScCourseClaMapper extends BaseMapper { + +// /** +// * 班级列表 +// * +// * @param reqSearchScCourseCla +// * @param page +// * @return +// */ +// List selectClaList(@Param("reqSearchScCourseCla")ReqSearchScCourseCla reqSearchScCourseCla, @Param("page")RespPage page); +// +// /** +// * 班级select +// * @param courseClaSelect +// * @return +// */ +// List selectForSelect(ReqCourseClaSelect courseClaSelect); +// +// /** +// * 班级数量 +// * @param reqClaCount +// * @return +// */ +// Integer selectClaCount(ReqClaCount reqClaCount); +// +// /** +// * 班级数量 +// * @param tenantId +// * @return +// */ +// @SqlParser(filter = true) +// Integer selectTenantClaCount(String tenantId); +// +// /** +// * 班级在读学员数量 +// * @param claId +// * @return +// */ +// Integer selectStudentCnt(Long claId); +} diff --git a/ruoyi-system/src/main/java/com/ruoyi/course/mapper/ScCourseMapper.java b/ruoyi-system/src/main/java/com/ruoyi/course/mapper/ScCourseMapper.java new file mode 100644 index 0000000..0bad02a --- /dev/null +++ b/ruoyi-system/src/main/java/com/ruoyi/course/mapper/ScCourseMapper.java @@ -0,0 +1,57 @@ +package com.ruoyi.course.mapper; + +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import com.ruoyi.course.domain.ScCourse; +import org.apache.ibatis.annotations.Param; + +import java.util.List; + +/** + *

+ * 课程信息 Mapper 接口 + *

+ * + + */ +public interface ScCourseMapper extends BaseMapper { + +// /** +// * 获取课程列表 +// * @param reqSearchScCourse +// * @param page +// * @return +// */ +// List selectCourseList(@Param("reqSearchScCourse") ReqSearchScCourse reqSearchScCourse, @Param("page") RespPage page); +// +// /** +// * 获取课程列表 +// * 包含学生当前课程状态 +// * @param reqSearchScCourse +// * @param page +// * @return +// */ +// List selectCourseListWithStudentCourse(@Param("reqSearchScCourse") ReqSearchScCourse reqSearchScCourse, @Param("page") RespPage page); +// +// /** +// * 导出课程 +// * @param reqSearchScCourse +// * @return +// */ +// List selectCourseForExport(@Param("reqSearchScCourse") ReqSearchScCourse reqSearchScCourse); +// +// /** +// * 课程数量 +// * @param reqDeptCondition +// * @return +// */ +// Integer selectCourseCount(ReqDeptCondition reqDeptCondition); +// +// /** +// * 租户下课程数量 +// * @param tenantId +// * @return +// */ +// @SqlParser(filter = true) +// Integer selectTenantCourseCount(String tenantId); + +} diff --git a/ruoyi-system/src/main/java/com/ruoyi/course/mapper/ScMemberCardsMapper.java b/ruoyi-system/src/main/java/com/ruoyi/course/mapper/ScMemberCardsMapper.java new file mode 100644 index 0000000..d710313 --- /dev/null +++ b/ruoyi-system/src/main/java/com/ruoyi/course/mapper/ScMemberCardsMapper.java @@ -0,0 +1,26 @@ +package com.ruoyi.course.mapper; + +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import com.ruoyi.course.domain.ScMemberCard; +import com.ruoyi.course.domain.res.RespMemberTypeCourses; +import org.apache.ibatis.annotations.Param; + +import java.util.List; + +/** + *

+ * 排课信息 Mapper 接口 + *

+ * + * + * + */ +public interface ScMemberCardsMapper extends BaseMapper { + + List getByMemberId(@Param("memberId") Long memberId, @Param("tenantId") String tenantId,@Param("claDate") String claDate); + List getCourseDetail(@Param("courseId") Long courseId,@Param("teacherId") Long teacherId, @Param("cards") List cards); + RespMemberTypeCourses getMemberTypeById(@Param("typeId") Long typeId); + + + +} diff --git a/ruoyi-system/src/main/java/com/ruoyi/course/mapper/ScRoomMapper.java b/ruoyi-system/src/main/java/com/ruoyi/course/mapper/ScRoomMapper.java new file mode 100644 index 0000000..95bc599 --- /dev/null +++ b/ruoyi-system/src/main/java/com/ruoyi/course/mapper/ScRoomMapper.java @@ -0,0 +1,15 @@ +package com.ruoyi.course.mapper; + +import com.ruoyi.course.domain.ScRoom; +import com.ruoyi.course.domain.ScStudent; + +/** + *

+ * 教室信息 Mapper 接口 + *

+ * + */ +public interface ScRoomMapper extends com.baomidou.mybatisplus.core.mapper.BaseMapper { + + +} diff --git a/ruoyi-system/src/main/java/com/ruoyi/course/mapper/ScStudentCourseLogMapper.java b/ruoyi-system/src/main/java/com/ruoyi/course/mapper/ScStudentCourseLogMapper.java new file mode 100644 index 0000000..835957f --- /dev/null +++ b/ruoyi-system/src/main/java/com/ruoyi/course/mapper/ScStudentCourseLogMapper.java @@ -0,0 +1,20 @@ +package com.ruoyi.course.mapper; + +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import com.ruoyi.course.domain.ScStudentCourseLog; +import org.apache.ibatis.annotations.Param; + +import java.util.List; + +/** + *

+ * 课程缴费扣费记录 Mapper 接口 + *

+ * + * + * @since 2020-12-17 + */ +public interface ScStudentCourseLogMapper extends BaseMapper { + + } diff --git a/ruoyi-system/src/main/java/com/ruoyi/course/mapper/ScStudentCourseMapper.java b/ruoyi-system/src/main/java/com/ruoyi/course/mapper/ScStudentCourseMapper.java new file mode 100644 index 0000000..46730f9 --- /dev/null +++ b/ruoyi-system/src/main/java/com/ruoyi/course/mapper/ScStudentCourseMapper.java @@ -0,0 +1,101 @@ +package com.ruoyi.course.mapper; + +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import com.ruoyi.course.domain.ScStudentCourse; +import com.ruoyi.course.domain.req.ReqSearchStuCourseSignUp; +import com.ruoyi.course.domain.req.ReqSearchStudentCourse; +import com.ruoyi.course.domain.req.ReqSearchStudentCourseCla; +import com.ruoyi.course.domain.res.RespCourseClaStudent; +import com.ruoyi.course.domain.res.RespStuCourseSignUpStudent; +import com.ruoyi.course.domain.res.RespStudentCourse; +import org.apache.ibatis.annotations.Param; + +import java.util.List; + +/** + *

+ * 学生课程 Mapper 接口 + *

+ * + * + * + */ +public interface ScStudentCourseMapper extends BaseMapper { + + /** + * 学生在读课程名称 + * @param studentId + * @return + */ + List selectStudentCourseNameList(Long studentId); + + /** + * 学生报读校区 + * @param studentId + * @return + */ + List selectStudentDeptNameList(Long studentId); + + /** + * 课程、班级 学生列表 + * + * @param reqSearchStudentCourseCla + * @param page + * @return + */ + List selectStudentList(@Param("reqSearchStudentCourseCla") ReqSearchStudentCourseCla reqSearchStudentCourseCla, @Param("page")Page page); + + /** + * 应到人数 + * @param claId + * @return + */ + int selectClaNeedAttendCnt(Long claId); + + /** + * 学生报读课程列表 + * @param searchStudentCourse + * @return + */ + List selectStudentCourseList(ReqSearchStudentCourse searchStudentCourse); + + /** + * 当报读课程总课时、总费用 为0时,删除报读 + * @param studentCourseId + * @return + */ + int deleteWhenTotalHourZeroForInvalid(Long studentCourseId); + + /** + * 当报读课程总天数、总费用 为0时,删除报读 + * @param studentCourseId + * @return + */ + int deleteWhenTotalDayZeroForInvalid(Long studentCourseId); + + /** + * 在读学生 剩余天数 小于 minBalanceDay 的数量 + * 未生效天数 + 生效剩余天数 < minBalanceDay + * @param minBalanceDay 最小剩余天数 + * @return + */ + Integer selectWillExpireDateCount(Integer minBalanceDay); + + /** + * 在读学生 剩余课时 小于 minBalanceHour 的数量 + * 剩余课时 - 过期课时 < minBalanceHour + * @param minBalanceHour 最小剩余课时数 + * @return + */ + Integer selectWillExpireHourCount(Integer minBalanceHour); + + /** + * 学生报读列表 + * + * @param reqSearchStuCourseSignUp + * @param page + * @return + */ + List selectStudentSignUpList(@Param("reqSearchStuCourseSignUp") ReqSearchStuCourseSignUp reqSearchStuCourseSignUp, @Param("page")Page page); +} diff --git a/ruoyi-system/src/main/java/com/ruoyi/course/mapper/ScStudentCourseOrderMapper.java b/ruoyi-system/src/main/java/com/ruoyi/course/mapper/ScStudentCourseOrderMapper.java new file mode 100644 index 0000000..df349ab --- /dev/null +++ b/ruoyi-system/src/main/java/com/ruoyi/course/mapper/ScStudentCourseOrderMapper.java @@ -0,0 +1,72 @@ +package com.ruoyi.course.mapper; + +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import com.ruoyi.course.domain.ScStudentCourseOrder; +import org.apache.ibatis.annotations.Param; + +import java.math.BigDecimal; +import java.util.List; + +/** + *

+ * 学生课程关联订单 Mapper 接口 + *

+ * + * + * + */ +public interface ScStudentCourseOrderMapper extends BaseMapper { + + + + /** + * 校验按时间收费 收费日期是否存在覆盖 + * + * @param studentId + * @param courseId + * @param beginDate + * @param endDate + * @return + */ + int checkDateCover(@Param("studentId") Long studentId, @Param("courseId") Long courseId, + @Param("beginDate") String beginDate, @Param("endDate") String endDate); + + /** + * 获取需扣减课时的订单 + * @param studentCourseId + * @return + */ + ScStudentCourseOrder selectSubtractHourOrder(Long studentCourseId); + + /** + * 当前生效 按时间 缴费订单 + * @param studentCourseId + * @return + */ + ScStudentCourseOrder selectNowValidDateOrder(Long studentCourseId); + + /** + * 获取可扣减课时的订单列表 + * @param studentCourseId + * @return + */ + List selectSubtractHourOrderList(Long studentCourseId); + + /** + * 按课时收费 订单列表,按时间倒叙 + * @param studentCourseId + * @return + */ + List selectRecoverHourOrderList(Long studentCourseId); + + /** + * 扣减课时 + * @param courseOrderId + * @param newHour + * @param oldHour + * @return + */ + int updateSubtractHour(@Param("courseOrderId") Long courseOrderId, + @Param("newHour") BigDecimal newHour, + @Param("oldHour") BigDecimal oldHour); +} diff --git a/ruoyi-system/src/main/java/com/ruoyi/course/mapper/ScStudentMapper.java b/ruoyi-system/src/main/java/com/ruoyi/course/mapper/ScStudentMapper.java new file mode 100644 index 0000000..efd290a --- /dev/null +++ b/ruoyi-system/src/main/java/com/ruoyi/course/mapper/ScStudentMapper.java @@ -0,0 +1,20 @@ +package com.ruoyi.course.mapper; + +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import com.ruoyi.course.domain.ScStudent; +import org.apache.ibatis.annotations.Param; + +import java.util.List; + +/** + *

+ * 学生基本信息 Mapper 接口 + *

+ * + * + * @since 2020-04-27 07:13:40 + */ +public interface ScStudentMapper extends com.baomidou.mybatisplus.core.mapper.BaseMapper { + + +} diff --git a/ruoyi-system/src/main/java/com/ruoyi/course/service/IScCourseClaService.java b/ruoyi-system/src/main/java/com/ruoyi/course/service/IScCourseClaService.java new file mode 100644 index 0000000..30eac8a --- /dev/null +++ b/ruoyi-system/src/main/java/com/ruoyi/course/service/IScCourseClaService.java @@ -0,0 +1,18 @@ +package com.ruoyi.course.service; + +import com.baomidou.mybatisplus.extension.service.IService; +import com.ruoyi.course.domain.ScCourseCla; + +/** + *

+ * 课程班级信息 服务类 + *

+ * + * + * @since 2020-03-17 01:11:06 + */ +public interface IScCourseClaService extends IService { + + + +} diff --git a/ruoyi-system/src/main/java/com/ruoyi/course/service/IScCourseService.java b/ruoyi-system/src/main/java/com/ruoyi/course/service/IScCourseService.java new file mode 100644 index 0000000..939537c --- /dev/null +++ b/ruoyi-system/src/main/java/com/ruoyi/course/service/IScCourseService.java @@ -0,0 +1,15 @@ +package com.ruoyi.course.service; + +import com.baomidou.mybatisplus.extension.service.IService; +import com.ruoyi.course.domain.ScCourse; + +/** + *

+ * 课程信息 服务类 + *

+ * + + */ +public interface IScCourseService extends IService { + +} diff --git a/ruoyi-system/src/main/java/com/ruoyi/course/service/IScStudentCourseOrderService.java b/ruoyi-system/src/main/java/com/ruoyi/course/service/IScStudentCourseOrderService.java new file mode 100644 index 0000000..00e6238 --- /dev/null +++ b/ruoyi-system/src/main/java/com/ruoyi/course/service/IScStudentCourseOrderService.java @@ -0,0 +1,68 @@ +package com.ruoyi.course.service; + +import com.baomidou.mybatisplus.extension.service.IService; +import com.ruoyi.course.domain.ScStudentCourseOrder; + +import java.math.BigDecimal; + +/** + *

+ * 学生课程关联订单 服务类 + *

+ * + */ +public interface IScStudentCourseOrderService extends IService { + /** + * 校验按时间收费 收费日期是否存在覆盖 + * + * @param studentId + * @param courseId + * @param beginDate + * @param endDate + * @return + */ + boolean checkDateCover(Long studentId, Long courseId, + String beginDate, String endDate); + + /** + * 获取应扣课时订单信息 + * @param studentCourseId + * @return + */ + ScStudentCourseOrder getSubtractHourOrder(Long studentCourseId); + + /** + * 当前生效 按时间 缴费订单 + * @param studentCourseId + * @return + */ + ScStudentCourseOrder getNowValidDateOrder(Long studentCourseId); + + + /** + * 课程订单扣减课时 + * @param studentCourseId + * @param loseHour + * @return 扣减总课时费用 + */ + BigDecimal subtractCourseOrderBalanceHour(Long studentCourseId, BigDecimal loseHour); + + /** + * 课程订单 恢复课时 + * 当删除上课记录时调用 + * @param studentCourseId + * @param recoverHour 恢复课时数量 + * @return + */ + void recoverOrderLoseHour(Long studentCourseId, BigDecimal recoverHour); + + /** + * 更新订单 剩余课时 + * @param courseOrderId + * @param newBalanceHour + * @param oldBalanceHour + */ + void updateBalanceHour(Long courseOrderId, BigDecimal newBalanceHour, BigDecimal oldBalanceHour); + + +} diff --git a/ruoyi-system/src/main/java/com/ruoyi/course/service/IScStudentService.java b/ruoyi-system/src/main/java/com/ruoyi/course/service/IScStudentService.java new file mode 100644 index 0000000..46c3301 --- /dev/null +++ b/ruoyi-system/src/main/java/com/ruoyi/course/service/IScStudentService.java @@ -0,0 +1,20 @@ +package com.ruoyi.course.service; + +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import com.baomidou.mybatisplus.extension.service.IService; +import com.ruoyi.course.domain.ScStudent; + +import java.util.List; + +/** + *

+ * 学生基本信息 服务类 + *

+ * + * + * @since 2020-04-27 07:13:40 + */ +public interface IScStudentService extends IService { + + Long getStudentByAppUserId(Long appUserId); +} diff --git a/ruoyi-system/src/main/java/com/ruoyi/course/service/ScClaTimeAttendService.java b/ruoyi-system/src/main/java/com/ruoyi/course/service/ScClaTimeAttendService.java new file mode 100644 index 0000000..7dfea12 --- /dev/null +++ b/ruoyi-system/src/main/java/com/ruoyi/course/service/ScClaTimeAttendService.java @@ -0,0 +1,20 @@ +package com.ruoyi.course.service; + + +import com.ruoyi.course.domain.ScClaTimeAttend; +import com.ruoyi.course.domain.req.ReqClaTimeCount; + +import java.math.BigDecimal; +import java.util.List; + +/** + *

+ * 上课出勤表 服务类 + *

+ * + * + * @since 2020-09-30 02:33:26 + */ +public interface ScClaTimeAttendService extends com.baomidou.mybatisplus.extension.service.IService { + +} diff --git a/ruoyi-system/src/main/java/com/ruoyi/course/service/ScClaTimeService.java b/ruoyi-system/src/main/java/com/ruoyi/course/service/ScClaTimeService.java index 95efed5..a973c84 100644 --- a/ruoyi-system/src/main/java/com/ruoyi/course/service/ScClaTimeService.java +++ b/ruoyi-system/src/main/java/com/ruoyi/course/service/ScClaTimeService.java @@ -1,11 +1,44 @@ package com.ruoyi.course.service; import com.baomidou.mybatisplus.extension.service.IService; -import com.ruoyi.course.domain.ReqSearchClaTime; +import com.ruoyi.RestResponse; +import com.ruoyi.course.domain.req.ReqSearchClaTime; import com.ruoyi.course.domain.ScClaTime; +import com.ruoyi.course.domain.time.ClaTimeBookItem; +import com.ruoyi.course.domain.time.ClaTimeCalendarItem; import com.ruoyi.course.domain.time.RespBusinessClaTimeCalendar; -import com.ruoyi.mall.domain.ProductCategory; +import org.springframework.web.bind.annotation.RequestBody; + +import java.util.Date; +import java.util.List; +import java.util.Map; public interface ScClaTimeService extends IService { RespBusinessClaTimeCalendar searchListForCalendar(ReqSearchClaTime reqSearchClaTime); + + RestResponse getCourseListByDate(String date); + + RestResponse bookCourse(@RequestBody ReqSearchClaTime searchClaTime); + + Map> bookCourseList(); + + RestResponse bookCourseDetail(Long bookId); + + RestResponse cancelCourse(Long courseTimeId); + + RestResponse courseTimeDetail(Long courseTimeId); + RestResponse appointmentListForTeacher(); + RestResponse appointmentListForManager(); + RestResponse checkAppointment(Long courseTimeId,int bookStatus); + + RestResponse confirmClass(Long courseTimeId,String startTime,String endTime); + + RestResponse checkIn(Map map); + + RestResponse teacherClaTotal(String time); + RestResponse teacherFeeTotal(String time); + RestResponse commissionTotal(String time); + RestResponse salesInformation(String time); + RestResponse claRoomFee(String time); + RestResponse myClient(); } diff --git a/ruoyi-system/src/main/java/com/ruoyi/course/service/ScStudentCourseService.java b/ruoyi-system/src/main/java/com/ruoyi/course/service/ScStudentCourseService.java new file mode 100644 index 0000000..16bf4e2 --- /dev/null +++ b/ruoyi-system/src/main/java/com/ruoyi/course/service/ScStudentCourseService.java @@ -0,0 +1,20 @@ +package com.ruoyi.course.service; + +import com.baomidou.mybatisplus.extension.service.IService; +import com.ruoyi.RestResponse; +import com.ruoyi.course.domain.ScClaTime; +import com.ruoyi.course.domain.ScStudentCourse; +import com.ruoyi.course.domain.req.ReqClaTimeAttend; +import com.ruoyi.course.domain.req.ReqSearchClaTime; +import com.ruoyi.course.domain.time.ClaTimeBookItem; +import com.ruoyi.course.domain.time.ClaTimeCalendarItem; +import com.ruoyi.course.domain.time.RespBusinessClaTimeCalendar; +import org.springframework.web.bind.annotation.RequestBody; + +import java.util.Date; +import java.util.List; +import java.util.Map; + +public interface ScStudentCourseService extends IService { + RestResponse claTimeAttend(ReqClaTimeAttend reqClaTimeAttend); +} diff --git a/ruoyi-system/src/main/java/com/ruoyi/course/service/impl/ContextServicelmpl.java b/ruoyi-system/src/main/java/com/ruoyi/course/service/impl/ContextServicelmpl.java deleted file mode 100644 index 7b0248e..0000000 --- a/ruoyi-system/src/main/java/com/ruoyi/course/service/impl/ContextServicelmpl.java +++ /dev/null @@ -1,41 +0,0 @@ -package com.ruoyi.course.service.impl; - -import cn.hutool.core.date.DateField; -import cn.hutool.core.date.DateTime; -import cn.hutool.core.date.DateUtil; -import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; -import com.ruoyi.common.constant.Constants; -import com.ruoyi.course.domain.Context; -import com.ruoyi.course.domain.ReqSearchClaTime; -import com.ruoyi.course.domain.RespClaTimeCalendar; -import com.ruoyi.course.domain.time.ClaTimeCalendarItem; -import com.ruoyi.course.domain.time.ClaTimeColumnTitle; -import com.ruoyi.course.domain.time.ClaTimeContainer; -import com.ruoyi.course.domain.time.RespBusinessClaTimeCalendar; -import com.ruoyi.course.mapper.ContextMapper; -import com.ruoyi.course.mapper.ScClaTimeMapper; -import org.apache.commons.compress.utils.Lists; -import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.stereotype.Service; - -import java.util.*; -import java.util.stream.Collectors; - -@Service -public class ContextServicelmpl extends ServiceImpl { - - - - public List getList(Map map){ - List list = baseMapper.findList(map); - return list; - } - - public Context getOne(Map map){ - Context context = baseMapper.getOne(map); - return context; - } - - - -} diff --git a/ruoyi-system/src/main/java/com/ruoyi/course/service/impl/IScCourseClaServiceImpl.java b/ruoyi-system/src/main/java/com/ruoyi/course/service/impl/IScCourseClaServiceImpl.java new file mode 100644 index 0000000..ee0249f --- /dev/null +++ b/ruoyi-system/src/main/java/com/ruoyi/course/service/impl/IScCourseClaServiceImpl.java @@ -0,0 +1,17 @@ +package com.ruoyi.course.service.impl; + + +import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; +import com.ruoyi.course.domain.ScClaTimeAttend; +import com.ruoyi.course.domain.ScCourseCla; +import com.ruoyi.course.mapper.ScClaTimeAttendMapper; +import com.ruoyi.course.mapper.ScCourseClaMapper; +import com.ruoyi.course.service.IScCourseClaService; +import com.ruoyi.course.service.ScClaTimeAttendService; +import org.springframework.stereotype.Service; + + +@Service +public class IScCourseClaServiceImpl extends ServiceImpl implements IScCourseClaService { + +} diff --git a/ruoyi-system/src/main/java/com/ruoyi/course/service/impl/IScCourseServiceImpl.java b/ruoyi-system/src/main/java/com/ruoyi/course/service/impl/IScCourseServiceImpl.java new file mode 100644 index 0000000..3cc440e --- /dev/null +++ b/ruoyi-system/src/main/java/com/ruoyi/course/service/impl/IScCourseServiceImpl.java @@ -0,0 +1,17 @@ +package com.ruoyi.course.service.impl; + + +import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; +import com.ruoyi.course.domain.ScCourse; +import com.ruoyi.course.domain.ScCourseCla; +import com.ruoyi.course.mapper.ScCourseClaMapper; +import com.ruoyi.course.mapper.ScCourseMapper; +import com.ruoyi.course.service.IScCourseClaService; +import com.ruoyi.course.service.IScCourseService; +import org.springframework.stereotype.Service; + + +@Service +public class IScCourseServiceImpl extends ServiceImpl implements IScCourseService { + +} diff --git a/ruoyi-system/src/main/java/com/ruoyi/course/service/impl/ScClaTimeAttendServiceImpl.java b/ruoyi-system/src/main/java/com/ruoyi/course/service/impl/ScClaTimeAttendServiceImpl.java new file mode 100644 index 0000000..d899277 --- /dev/null +++ b/ruoyi-system/src/main/java/com/ruoyi/course/service/impl/ScClaTimeAttendServiceImpl.java @@ -0,0 +1,24 @@ +package com.ruoyi.course.service.impl; + + +import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; +import com.ruoyi.course.domain.ScClaTime; +import com.ruoyi.course.domain.ScClaTimeAttend; +import com.ruoyi.course.mapper.ScClaTimeAttendMapper; +import com.ruoyi.course.mapper.ScClaTimeMapper; +import com.ruoyi.course.service.ScClaTimeAttendService; +import com.ruoyi.course.service.ScClaTimeService; +import org.springframework.stereotype.Service; + +/** + *

+ * 上课出勤表 服务类 + *

+ * + * + * @since 2020-09-30 02:33:26 + */ +@Service +public class ScClaTimeAttendServiceImpl extends ServiceImpl implements ScClaTimeAttendService { + +} diff --git a/ruoyi-system/src/main/java/com/ruoyi/course/service/impl/ScClaTimeServiceImpl.java b/ruoyi-system/src/main/java/com/ruoyi/course/service/impl/ScClaTimeServiceImpl.java index de1668b..e13c677 100644 --- a/ruoyi-system/src/main/java/com/ruoyi/course/service/impl/ScClaTimeServiceImpl.java +++ b/ruoyi-system/src/main/java/com/ruoyi/course/service/impl/ScClaTimeServiceImpl.java @@ -2,25 +2,49 @@ package com.ruoyi.course.service.impl; import cn.hutool.core.date.DateField; import cn.hutool.core.date.DateTime; +import cn.hutool.core.date.DateUnit; import cn.hutool.core.date.DateUtil; +import cn.hutool.core.util.ArrayUtil; +import cn.hutool.core.util.ObjectUtil; +import cn.hutool.core.util.StrUtil; +import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; +import com.baomidou.mybatisplus.core.conditions.update.UpdateWrapper; import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; +import com.ruoyi.RestResponse; +import com.ruoyi.basic.service.YjAppUserService; import com.ruoyi.common.constant.Constants; -import com.ruoyi.course.domain.ReqSearchClaTime; -import com.ruoyi.course.domain.RespClaTimeCalendar; -import com.ruoyi.course.domain.ScClaTime; -import com.ruoyi.course.domain.time.ClaTimeCalendarItem; -import com.ruoyi.course.domain.time.ClaTimeColumnTitle; -import com.ruoyi.course.domain.time.ClaTimeContainer; -import com.ruoyi.course.domain.time.RespBusinessClaTimeCalendar; -import com.ruoyi.course.mapper.ScClaTimeMapper; +import com.ruoyi.common.core.domain.entity.AppUser; +import com.ruoyi.common.core.domain.entity.SysDept; +import com.ruoyi.common.core.domain.entity.SysUser; +import com.ruoyi.common.core.domain.model.AppLoginUser; +import com.ruoyi.common.utils.*; +import com.ruoyi.common.utils.sign.Base64; +import com.ruoyi.course.domain.*; +import com.ruoyi.course.domain.enums.ClaTimeAttendStatusEnums; +import com.ruoyi.course.domain.enums.ClaTimeStatusEnums; +import com.ruoyi.course.domain.enums.CourseChargeTypeEnum; +import com.ruoyi.course.domain.enums.LogTypeEnum; +import com.ruoyi.course.domain.req.ReqSearchClaTime; +import com.ruoyi.course.domain.res.*; +import com.ruoyi.course.domain.time.*; +import com.ruoyi.course.mapper.*; +import com.ruoyi.course.service.IScStudentCourseOrderService; +import com.ruoyi.course.service.ScClaTimeAttendService; import com.ruoyi.course.service.ScClaTimeService; -import com.ruoyi.mall.domain.ProductCategory; -import com.ruoyi.mall.mapper.ProductCategoryMapper; -import com.ruoyi.mall.service.ProductCategoryService; +import com.ruoyi.im.domain.Friend; +import com.ruoyi.system.domain.SysTeacher; +import com.ruoyi.system.service.ISysDeptService; +import com.ruoyi.system.service.SysTeacherService; +import com.ruoyi.system.service.impl.SysUserServiceImpl; import org.apache.commons.compress.utils.Lists; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; +import org.springframework.transaction.annotation.Transactional; +import org.springframework.web.bind.annotation.RequestBody; +import java.math.BigDecimal; +import java.math.RoundingMode; +import java.time.LocalDate; import java.util.*; import java.util.stream.Collectors; @Service @@ -28,6 +52,51 @@ public class ScClaTimeServiceImpl extends ServiceImpl dateList=DateUtil.rangeToList(cycleBegin , cycleEnd , DateField.DAY_OF_YEAR); - //todo 表頭list - // time 07-17l // // 日历数据 格式为:时间->星期->课程 Map>> claTimeCalendarMap = new HashMap(); Constants.CLA_TIME_MAP.forEach((claTimeKey, claTimeValue) -> { - Map> weekDayMap = new HashMap(); + Map> halfMonthDayMap = new HashMap(); for (int i = 0; i < dateList.size(); i++) { List claTimeArrayList = Lists.newArrayList(); - weekDayMap.put(i+1, claTimeArrayList); + halfMonthDayMap.put(i+1, claTimeArrayList); } - claTimeCalendarMap.put(claTimeKey, weekDayMap); + claTimeCalendarMap.put(claTimeKey, halfMonthDayMap); }); - + reqSearchClaTime.setBeginDate(DateUtil.format(cycleBegin,"yyyy-MM-dd")); + reqSearchClaTime.setEndDate(DateUtil.format(cycleEnd,"yyyy-MM-dd")); // 获取排课信息 List respClaTimeList = claTimeMapper.selectListForCalendar(reqSearchClaTime); // 将排课信息 入到 claTimeCalendarMap respClaTimeList.forEach(item -> { - Integer weekDay = item.getWeekDay(); + DateTime day=new DateTime(item.getClaDate()); + Integer halfMonthDay=dateList.indexOf(day)+1; Integer startHour = item.getStartHour(); if (claTimeCalendarMap.containsKey(startHour)) { - claTimeCalendarMap.get(startHour).get(weekDay).add(item); + claTimeCalendarMap.get(startHour).get(halfMonthDay).add(item); } else if (claTimeCalendarMap.containsKey(startHour - 1)) { // 每两个小时 一个上课时段,所以-1 - claTimeCalendarMap.get(startHour - 1).get(weekDay).add(item); + claTimeCalendarMap.get(startHour - 1).get(halfMonthDay).add(item); } }); @@ -87,7 +163,7 @@ public class ScClaTimeServiceImpl extends ServiceImpl> claTimeWeekDayMap = new HashMap(); claTimeMap.forEach((weekDayKey, list) -> { - // 排课数量 + if (columnTitleTimeCountMap.containsKey(weekDayKey)) { columnTitleTimeCountMap.put(weekDayKey, columnTitleTimeCountMap.get(weekDayKey) + list.size()); } else { @@ -120,13 +196,17 @@ public class ScClaTimeServiceImpl extends ServiceImpl columnTitles = Lists.newArrayList(); + int i=1; while (cycleBegin.before(cycleEnd)) { int dayOfWeek = DateUtil.dayOfWeek(cycleBegin); +// Date new DateTime(DateUtil.format(cycleBegin,"yyyy-MM-dd")); + int dayOfcycle = dateList.indexOf(cycleBegin)+1; + ClaTimeColumnTitle claTimeColumnTitle = new ClaTimeColumnTitle(); claTimeColumnTitle.setWeekName(Constants.WEEK_DAY_MAP.get(dayOfWeek)); - claTimeColumnTitle.setDay(DateUtil.format(cycleBegin,"MM-dd")); - claTimeColumnTitle.setCount(columnTitleTimeCountMap.get(dayOfWeek)); + claTimeColumnTitle.setDay(DateUtil.format(cycleBegin,"yyyy-MM-dd")); + claTimeColumnTitle.setCount(columnTitleTimeCountMap.get(dayOfcycle)); columnTitles.add(claTimeColumnTitle); cycleBegin = DateUtil.offsetDay(cycleBegin,1); @@ -135,4 +215,956 @@ public class ScClaTimeServiceImpl extends ServiceImpl list=claTimeMapper.getCourseList(date,null,appUser.getVisitStore()); + return new RestResponse().setData(list); + } + + /** + * 预约课程 + * @param searchClaTime + * @return + */ + @Override + @Transactional + public RestResponse bookCourse(@RequestBody ReqSearchClaTime searchClaTime){ + Long studentId=SecurityUtils.getAppLoginUser().getStudentId(); + Long courseTimeId=searchClaTime.getCourseTimeId();//某节课的编号 + ScClaTime claTim=claTimeMapper.selectById(courseTimeId); + + if (ObjectUtil.isEmpty(claTim)){ + return new RestResponse().setSuccess(false).setMessage("课程编号有误,无法预约"); + } + + if (claTim.getBookAttendCnt().equals(claTim.getAtClassCnt())){ + return new RestResponse().setSuccess(false).setMessage("课程预约已满,无法预约"); + } + + //状态 1:待上课 2:已上课 + if (claTim.getStatus().equals(2)){ + return new RestResponse().setSuccess(false).setMessage("课程已开始上课,无法预约!"); + } + + ScCourseCla courseCla= claMapper.selectById(claTim.getClaId()); + + //获取当前用户 在租户所拥有的会员卡 + List cardList=memberCardsMapper.getByMemberId(studentId,courseCla.getTenantId(),claTim.getClaDate()); + + + if (cardList.size()==0){ + return new RestResponse().setSuccess(false).setMessage("会员卡失效 或 未在本机构开通会员卡,请联系教练预约!"); + } + + + List cardIds=cardList.stream().map(it -> it.getId()).collect(Collectors.toList()); + List course= memberCardsMapper.getCourseDetail(courseCla.getCourseId(),claTim.getTeacherId(),cardIds); + + //改: + // 1.会员卡排序 按天 -> 按课时 -> 按储值 + // 2.判断是否含有本课程类型+教练 sql + // 3.判断约课次数 + // 4.限制课程 sql + + + + + + if (course.size()==0){ + return new RestResponse().setSuccess(false).setMessage("会员卡不包含本次课程,请联系教练预约!"); + } + + // 校验预约次数 预约教师 + + //消费优先级 : 时间卡 > 次数卡 > 储值卡 + Map> courseMap = course.stream().collect(Collectors.groupingBy(RespMemberTypeCourses::getChargeType)); + int flag=0;//1次数卡次数不够用 2储值卡余额不够 3 两个卡都不够 + RespMemberTypeCourses selected=new RespMemberTypeCourses(); + + if (ObjectUtil.isNotEmpty(courseMap.get("days")) + && courseMap.get("days").size()>0 + && checkBookNum(courseMap.get("days").get(0).getCardTypeId(),courseMap.get("days").get(0).getCardNo()) + ){ + selected= courseMap.get("days").get(0); + + }else { + if (ObjectUtil.isNotEmpty(courseMap.get("count")) + && courseMap.get("count").size()>0 + && checkBookNum(courseMap.get("count").get(0).getCardTypeId(),courseMap.get("count").get(0).getCardNo()) + ){ + RespMemberTypeCourses chargeCount= courseMap.get("count").get(0); + if (chargeCount.getRemainingCount().compareTo(chargeCount.getDeductCnt())>-1){ + selected=chargeCount; + }else { + flag=1; + //储值卡 + if (ObjectUtil.isNotEmpty(courseMap.get("total_fee")) + && courseMap.get("total_fee").size()>0 + && checkBookNum(courseMap.get("total_fee").get(0).getCardTypeId(),courseMap.get("total_fee").get(0).getCardNo()) + ){ + RespMemberTypeCourses chargeFee= courseMap.get("total_fee").get(0); + //划扣费用,如果未设置,则使用课程 价值 + BigDecimal deductFee=chargeFee.getRemainingTotalFee().equals(BigDecimal.ZERO)?chargeFee.getTuitionFee():chargeFee.getRemainingTotalFee(); + if (chargeFee.getRemainingTotalFee().compareTo(deductFee)>-1){ + selected=chargeFee; + }else { + flag=3; + } + } + } + }else { + //储值卡 + if (ObjectUtil.isNotEmpty(courseMap.get("total_fee")) + && courseMap.get("total_fee").size()>0 + && checkBookNum(courseMap.get("total_fee").get(0).getCardTypeId(),courseMap.get("total_fee").get(0).getCardNo()) + ){ + RespMemberTypeCourses chargeFee= courseMap.get("total_fee").get(0); + //划扣费用,如果未设置,则使用课程 价值 + BigDecimal deductFee=chargeFee.getRemainingTotalFee().equals(BigDecimal.ZERO)?chargeFee.getTuitionFee():chargeFee.getRemainingTotalFee(); + if (chargeFee.getRemainingTotalFee().compareTo(deductFee)>-1){ + selected=chargeFee; + + }else { + flag=2; + } + } + } + } + + if (ObjectUtil.isEmpty(selected)){ + + if (flag==0){ + return new RestResponse().setSuccess(false).setMessage("没有满足预约条件的会员卡,请联系教练预约!"); + } + + if (flag==1){ + return new RestResponse().setSuccess(false).setMessage("会员卡剩余次数不足,请联系教练预约!"); + } + + if (flag==2){ + return new RestResponse().setSuccess(false).setMessage("会员卡剩余金额不足,请联系教练预约!"); + } + + if (flag==3){ + return new RestResponse().setSuccess(false).setMessage("会员卡额度不足,请联系教练预约!"); + } + } + + //预约 + ScBookCourse bookCourse= bookCourseMapper.selectOne(new QueryWrapper() + .eq("course_time_id",courseTimeId) + .eq("student_id",studentId) + .eq("card_no",selected.getCardNo()) + ); + + + + if (ObjectUtil.isNotEmpty(bookCourse)){ + //预约状态:0->预约中;1->教练确认;2->店长确认/预约成功/待上课 3->已取消;4- >已完成/待评价;5- >预约失败; + int[] a= {0,1,2,4}; + if (ArrayUtil.contains(a,bookCourse.getBookStatus())){ + return new RestResponse().setSuccess(false).setMessage("课程预约中,请勿重复预约!"); + } + + if (bookCourse.getBookStatus()==3){ + bookCourse.setBookStatus(0); + bookCourseMapper.updateById(bookCourse); + addBookLogFromApp(0,bookCourse.getId()); + } + }else { + //预约表 + ScBookCourse book=new ScBookCourse(); + book.setBookStatus(0); + book.setCourseTimeId(courseTimeId); + book.setCreateTime(new Date()); + book.setStudentId(studentId); + book.setCardNo(selected.getCardNo()); + book.setChargeType(selected.getChargeType()); + book.setDeductCnt(selected.getDeductCnt()); + book.setDeductFee(selected.getDeductFee()); + book.setTenantId(courseCla.getTenantId()); + book.setCourseId(courseCla.getCourseId()); + book.setClaId(courseCla.getClaId()); + book.setDepartId(courseCla.getDepartId()); + //生成一个code 用于消课 + Long code = IDGenerator.generateId(); + bookCourseMapper.insert(book); + try { + byte[] qrCode= CodeUtil.generateQrCodeBytes(book.getId().toString()); + book.setQrCode(Base64.encode(qrCode)); + }catch (Exception e){ + + } + book.setCode(book.getId()); + bookCourseMapper.updateById(book); + //预约记录 + addBookLogFromApp(0,book.getId()); + + //预约成功 后 首次预约激活 + Map> cardMap =cardList.stream().collect(Collectors.groupingBy(ScMemberCard::getCardNo)); + ScMemberCard card=cardMap.get(selected.getCardNo()).get(0); + if (card.getHaveActivationDate().equals("2") + && card.getStatus().equals("INACTIVE")){ + ScMemberCard edtiCard=new ScMemberCard(); + edtiCard.setActivationDate(LocalDate.now()); + edtiCard.setStatus("ACTIVE"); + edtiCard.setId(card.getId()); + memberCardsMapper.updateById(edtiCard); + } + } + + //本节课 + claTim.setBookAttendCnt(claTim.getBookAttendCnt()+1); + claTimeMapper.updateById(claTim); + return new RestResponse().setSuccess(true).setMessage("预约成功"); + } + + //约课次数 + public Boolean checkBookNum(Long cardTypeId,String cardNo){ + RespMemberTypeCourses type= memberCardsMapper.getMemberTypeById(cardTypeId); + if(type.getRestrictedNum().equals("2")&&StrUtil.isNotEmpty(type.getBookTime())){ + //限制约课时间范围 每天、每周、半月、每月 + TimeCycleUtil.TimeRange range= TimeCycleUtil.getCycleTimeRange(type.getBookTime()); + String startTime=range.getStartTime(); + String endTime=range.getEndTime(); + + Long count= bookCourseMapper.selectCount(new QueryWrapper() + .eq("card_no",cardNo) + .between("create_time",startTime,endTime) + .in("book_status","0,1,2,4") + ); + if (count.intValue()>type.getBookNum().intValue()){ + return false; + } + } + return true; + } + + /** + * 我的预约列表 + * @return + */ + @Override + public Map> bookCourseList(){ + Long studentId=SecurityUtils.getAppLoginUser().getStudentId(); + List list=bookCourseMapper.getListByStudent(studentId); + + Map> map=new HashMap<>(); + map.put("all",list); + + List booking=new ArrayList<>(); + List waitingForClass=new ArrayList<>(); + List canceled=new ArrayList<>(); + List completed=new ArrayList<>(); + //预约状态:0->预约中;1->教练确认;2->店长确认/预约成功/待上课 3->已取消;4- >已完成/待评价; + for (ClaTimeBookItem b : list) { + if (b.getBookStatus()==0){ + booking.add(b); + } + if (b.getBookStatus()==2){ + waitingForClass.add(b); + } + if (b.getBookStatus()==3){ + canceled.add(b); + } + if (b.getBookStatus()==4){ + completed.add(b); + } + } + map.put("booking",booking);//预约中 + map.put("waitingForClass",waitingForClass);//待上课 + map.put("canceled",canceled);//已取消 + map.put("completed",completed);//已完成 + return map; + } + + /** + * 预约详情 + * @return + */ + @Override + public RestResponse bookCourseDetail(Long bookId){ + ClaTimeBookItem bookItem=bookCourseMapper.getDetail(bookId); + List logs=bookCourseLogMapper.selectList(new QueryWrapper() + .eq("book_id",bookId).orderByAsc("update_time")); + + List list=new ArrayList<>(); + for (ScBookCourseLog l : logs) { + Map map=new HashMap<>(); + map.put("status",l.getBookStatus()); + map.put("time",DateUtil.format(l.getUpdateTime(),"yyyy-MM-dd HH:mm:ss")); + list.add(map); + } + + bookItem.setStatusTime(list); + + return new RestResponse().setData(bookItem); + } + + /** + * 取消预约 + * @return + */ + @Override + @Transactional + public RestResponse cancelCourse(Long courseTimeId){ + Long studentId=SecurityUtils.getAppLoginUser().getStudentId(); + ScClaTime claTim=claTimeMapper.selectById(courseTimeId); + + //状态 1:待上课 2:已上课 + if (claTim.getStatus().equals(2)){ + return new RestResponse().setSuccess(false).setMessage("课程已开始上课,无法取消!"); + } + + //预约 + ScBookCourse bookCourse= bookCourseMapper.selectOne(new QueryWrapper() + .eq("course_time_id",courseTimeId) + .eq("student_id",studentId) + ); + if (bookCourse.getCheckIn()==1){ + return new RestResponse().setSuccess(false).setMessage("已签到,无法取消!"); + } + + if (StrUtil.containsAny("0,1,2",bookCourse.getBookStatus()+"")){ + bookCourse.setBookStatus(3); + bookCourseMapper.updateById(bookCourse); + addBookLogFromApp(3,bookCourse.getId()); + return new RestResponse().setSuccess(true).setMessage("取消成功"); + + }else { + return new RestResponse().setSuccess(false).setMessage("取消失败"); + } + + } + + /** + * 预约详情 + * @param courseTimeId + * @return + */ + @Override + public RestResponse courseTimeDetail(Long courseTimeId){ + //课程信息 + ClaTimeCalendarItem claTimeCalendarItem=claTimeMapper.getCourseList(null,courseTimeId,null).get(0); + //预约学员信息 姓名 性别 电话 + List students=claTimeMapper.getCourseBookStudent(courseTimeId); + + Map map=new HashMap(); + map.put("courseDetail",claTimeCalendarItem); + map.put("studentList",students); + + return new RestResponse().setSuccess(true).setData(map); + } + + @Override + public RestResponse appointmentListForTeacher(){ + Long[] roleId=SecurityUtils.getAppLoginUser().getRoles(); + //104 教师 105店长 103 会籍顾问 + if (!ArrayUtil.containsAny(roleId,104L)){ + return new RestResponse().setSuccess(false).setMessage("当前登录人无权限!"); + } + Long userId= SecurityUtils.getAppLoginUser().getManageAccountId(); + Date beginTime = new Date();//开始时间 + Date endTime = DateUtil.offsetDay(beginTime,14);//结束时间 + //按教师id 查 近15日课程 (sc_cla_time) 预约(sc_book_course) + List listForTeacher=claTimeMapper.getBookListForTeacher(userId,beginTime.toString(),endTime.toString()); + + + return new RestResponse().setData(listForTeacher); + } + @Override + public RestResponse appointmentListForManager(){ + Long[] roleId=SecurityUtils.getAppLoginUser().getRoles(); + //104 教师 105店长 103 会籍顾问 + if (!ArrayUtil.containsAny(roleId,105L)){ + return new RestResponse().setSuccess(false).setMessage("当前登录人无权限!"); + } + + Long userId= SecurityUtils.getAppLoginUser().getManageAccountId(); + SysDept dept=new SysDept(); + dept.setLeaderId(userId); + List list=deptService.selectDeptList(dept); + Long deptId= list .get(0).getDeptId(); + + Date beginTime = new Date();//开始时间 + Date endTime = DateUtil.offsetDay(beginTime,14);//结束时间 + List listForManager=claTimeMapper.getBookListForManager(deptId,beginTime.toString(),endTime.toString()); + + return new RestResponse().setData(listForManager); + } + + + //确认预约or拒接预约(教师/店长) + @Override + @Transactional + public RestResponse checkAppointment(Long bookId,int bookStatus){ + Long[] roleId=SecurityUtils.getAppLoginUser().getRoles(); + //104 教师 105店长 103 会籍顾问 + if (!ArrayUtil.containsAny(roleId,105L, 104L)){ + return new RestResponse().setSuccess(false).setMessage("当前登录人无权限!"); + } + //0->预约中;1->教练确认;2->店长确认/预约成功/待上课 3->已取消;4- >已完成/待评价;5- >预约失败; + //当前课程状态 + ScBookCourse bookCourse= bookCourseMapper.selectById(bookId); + Integer dbBookStatus= new Integer(bookCourse.getBookStatus()); + Integer[] status={3,4,5}; + + if (ArrayUtil.containsAny(status,dbBookStatus)){ + return new RestResponse().setSuccess(false).setMessage("请刷新预约状态!"); + } + + + ScBookCourse updateBook=new ScBookCourse(); + updateBook.setId(bookId); + int f=0; + if (bookStatus==5){ + updateBook.setBookStatus(5); + f=bookCourseMapper.updateById(updateBook); + addBookLogFromApp(5,bookId); + } + + if (ArrayUtil.containsAny(roleId, 104L)&& dbBookStatus==0){ + updateBook.setBookStatus(1); + f=bookCourseMapper.updateById(updateBook); + addBookLogFromApp(1,bookId); + } + + if (ArrayUtil.containsAny(roleId, 105L)&& dbBookStatus==1){ + updateBook.setBookStatus(2); + f=bookCourseMapper.updateById(updateBook); + addBookLogFromApp(2,bookId); + } + + if (f>0){ + return new RestResponse().setSuccess(true).setMessage("成功!"); + }else { + return new RestResponse().setSuccess(false).setMessage("请刷新预约状态!"); + } + + } + + void addBookLogFromApp(int bookStatus,Long bookId){ + ScBookCourseLog log=new ScBookCourseLog(); + log.setBookStatus(bookStatus); + log.setUpdateTime(new Date()); + log.setUpdateUser(SecurityUtils.getAppLoginUser().getManageAccountId());//后台sys_user id + log.setBookId(bookId); + bookCourseLogMapper.insert(log); + } + + /** + * 确认上课 + * @param courseTimeId + * @return + */ + @Override + @Transactional + public RestResponse confirmClass(Long courseTimeId,String startTime,String endTime){ + Long[] roleId=SecurityUtils.getAppLoginUser().getRoles(); + //104 教师 105店长 103 会籍顾问 + if (!ArrayUtil.containsAny(roleId,104l)){ + return new RestResponse().setSuccess(false).setMessage("当前登录人无权限!"); + } + AppLoginUser loginUser=SecurityUtils.getAppLoginUser(); + //本节课的预约 + List bookCourses=bookCourseMapper.selectList(new QueryWrapper() + .in("book_status",0,1,2) + .eq("course_time_id",courseTimeId) + ); + if (bookCourses.size()<1)throw new RuntimeException("无学员预约!"); + //判断预约状态(未确认) +// Long needCheck= bookCourses.stream() +// .filter(l-> StrUtil.containsAny("0,1",l.getBookStatus()+"")).count(); +// if (needCheck>0){ +// return new RestResponse().setSuccess(false).setMessage("请检查学员预约状态!"); +// } + + //判断是否有学员未签到 + Long notCheckIn=bookCourses.stream().filter(l->l.getCheckIn()==0).count(); + if (notCheckIn>0){ + return new RestResponse().setSuccess(false).setMessage("请确认学员签到情况,如无法到课请联系学员取消预约!"); + } + //签到学员 + List checkIn=bookCourses.stream().filter(l->l.getCheckIn()==1).collect(Collectors.toList()); + + ScClaTime claTime=claTimeMapper.selectById(courseTimeId); + //签到数量是否少于开课人数 + if (claTime.getLessCnt()>checkIn.size()){ + return new RestResponse().setSuccess(false).setMessage("学员数量到不到开课标准!"); + } + + //教室使用时间及费用 + Date startTimeDate= DateUtil.parseTime(startTime); + Date endTimeDate= DateUtil.parseTime(endTime); + + BigDecimal venueFee=new BigDecimal( 0); + double roomUsageTime=0.0; + + if (ObjectUtil.isNotEmpty(claTime.getRoomId())){ + ScRoom room= roomMapper.selectById(claTime.getRoomId()); + //上课时间段 >0.5小时,按1小时计 + roomUsageTime=DateUtil.between(startTimeDate, endTimeDate, DateUnit.MINUTE)/ 60.0; + int c=(int)roomUsageTime; + double d=roomUsageTime-c; + if (d > 0.5) { + roomUsageTime= c + 1.0; + } else if (d > 0) { + roomUsageTime= c + 0.5; + } + venueFee= room.getVenueFee().add(new BigDecimal(roomUsageTime)); + } + + //更改预约状态 + bookCourseMapper.update(null,new UpdateWrapper() + .eq("course_time_id",courseTimeId) + .eq("check_in","1") + .eq("book_status",2) + .set("book_status","4")); + //添加预约状态记录 + for (ScBookCourse bookCours : checkIn) { + addBookLogFromApp(4,bookCours.getId()); + } + claTime.setRealClaDate(DateUtil.format(new Date(),"yyyy-MM-dd")); + claTime.setRealStartTime(startTime); + claTime.setRealEndTime(endTime); + claTime.setVenueFee(venueFee); + claTime.setRoomUsageTime(roomUsageTime); + claTime.setStatus("2"); + claTime.setLastUpdateTime(new Date()); + claTimeMapper.updateById(claTime); + + return new RestResponse().setSuccess(true).setMessage("开始上课!"); + } + + + /** + * 签到 + * + * @param + * @return + */ + @Override + @Transactional + public RestResponse checkIn(Map map) { + + Long[] roleId=SecurityUtils.getAppLoginUser().getRoles(); + //104 教师 105店长 103 会籍顾问 + if (!ArrayUtil.containsAny(roleId,104l,105l,103l)){ + return new RestResponse().setSuccess(false).setMessage("当前登录人无权限!"); + } + //预约id/code + String code= map.get("code").toString(); + Long bookId=Long.parseLong(map.get("bookId").toString()); + //预约 + ScBookCourse bookCourse= bookCourseMapper.selectOne(new QueryWrapper() + .eq("code",code)); + + //判断预约状态 + //预约状态:0->预约中;1->教练确认;2->店长确认/预约成功/待上课 3->已取消;4- >已完成/待评价;5- >预约失败; +// if (StrUtil.containsAny("3,4,5",bookCourse.getBookStatus()+"")){ + if (bookCourse.getBookStatus()!=2){ + return new RestResponse().setSuccess(false).setMessage("请检查学员预约状态!"); + } + + AppLoginUser loginUser = SecurityUtils.getAppLoginUser(); + Long courseTimeId = bookCourse.getCourseTimeId(); + + ScMemberCard memberCard=memberCardsMapper.selectOne(new QueryWrapper() + .eq("card_no",bookCourse.getCardNo()) + .eq("charge_type",bookCourse.getChargeType()) + .eq("is_deleted",0) + .last(" and expiry_date > CURDATE() ") + + ); + if (ObjectUtil.isEmpty(memberCard)){ + return new RestResponse().setSuccess(false).setMessage("会员卡状态异常,请与教练核实!"); + } + + // 排课信息 + ScClaTime claTime= claTimeMapper.selectById(courseTimeId); + Long teacherId = claTime.getTeacherId(); + if (!ClaTimeStatusEnums.WAIT_CLASS.getStatus().equals(claTime.getStatus())) { + return new RestResponse().setSuccess(false).setMessage("非待上课状态,无法重复上课!"); + } + //班级信息 + Long claId = claTime.getClaId(); + ScCourseCla dbCla = claMapper.selectById(claId); + if (null == dbCla) { + return new RestResponse().setSuccess(false).setMessage("无法获取班级信息,请稍后重试"); + } + //课程信息 + Long courseId = dbCla.getCourseId(); + ScCourse scCourse = courseMapper.selectById(courseId); + if (null == scCourse) { + return new RestResponse().setSuccess(false).setMessage("无法获取课程信息,请稍后重试"); + } + Long departId = dbCla.getDepartId(); + SysDept sysDept = deptService.getById(departId); + if (null == sysDept) { + return new RestResponse().setSuccess(false).setMessage("无法获取校区信息,请稍后重试"); + } + String chargeType=memberCard.getChargeType(); + + // 上课记出勤表 + ScClaTimeAttend addClaTimeAttend = new ScClaTimeAttend(); + + if (chargeType.equals("count")){ + if (memberCard.getRemainingCount().compareTo(bookCourse.getDeductCnt())>-1){ + addClaTimeAttend.setPayHour(bookCourse.getDeductCnt()); + addClaTimeAttend.setCountBefore(memberCard.getRemainingCount()); + addClaTimeAttend.setPayFee(memberCard.getCountFee().multiply(bookCourse.getDeductCnt())); + + BigDecimal countAfter= memberCard.getRemainingCount().subtract(bookCourse.getDeductCnt()); + addClaTimeAttend.setCountAfter(countAfter); + memberCard.setRemainingCount(countAfter); + }else { + return new RestResponse().setSuccess(false).setMessage("会员卡剩余次数不足,请充值后重新预约!"); + } + } + + if (chargeType.equals("total_fee")){ + if (memberCard.getRemainingTotalFee().compareTo(bookCourse.getDeductFee())>-1){ + addClaTimeAttend.setPayFee(bookCourse.getDeductFee()); + addClaTimeAttend.setFeeBefore(memberCard.getRemainingTotalFee()); + + BigDecimal feeAfter=memberCard.getRemainingTotalFee().subtract(bookCourse.getDeductFee()); + addClaTimeAttend.setFeeAfter(feeAfter); + memberCard.setRemainingTotalFee(feeAfter); + }else { + return new RestResponse().setSuccess(false).setMessage("会员卡剩余金额不足,请充值后重新预约!"); + } + } + bookCourse.setUserId(SecurityUtils.getAppLoginUser().getManageAccountId()); + bookCourse.setCheckIn(1); + bookCourse.setCheckInTime(new Date()); + bookCourseMapper.updateById(bookCourse); + //会员卡余额变更 + memberCardsMapper.updateById(memberCard); + + //本节课 到课人数变更 + claTime.setRealAttendCnt(claTime.getRealAttendCnt()+1); + claTimeMapper.updateById(claTime); + + SysTeacher sysStaff=staffService.getById(teacherId); + + addClaTimeAttend.setBookId(bookCourse.getId()); + addClaTimeAttend.setMemberCardId(memberCard.getId()); + addClaTimeAttend.setCourseTimeId(courseTimeId); + addClaTimeAttend.setStudentId(bookCourse.getStudentId()); + addClaTimeAttend.setClaId(claTime.getClaId()); + addClaTimeAttend.setCourseId(scCourse.getCourseId()); + addClaTimeAttend.setTeacherId(teacherId); + addClaTimeAttend.setTeacherName(sysStaff.getUserName()); + addClaTimeAttend.setChargeType(chargeType); + addClaTimeAttend.setTenantId(claTime.getTenantId()); + addClaTimeAttend.setAttendStatus("1"); + addClaTimeAttend.setCreateUser(loginUser.getManageAccountId()); + + // 保存上课记录 + attendService.save(addClaTimeAttend); + + // 上课日志 +// StringBuffer sb = new StringBuffer(""); +// sb.append("上课[").append(ClaTimeAttendStatusEnums.getNameByStatus("1")).append("],上课时间") +// .append(DateUtil.now()).append(","); +// ScStudentCourseLog studentCourseLog = ScStudentCourseLog.builder() +// .studentId(bookCourse.getStudentId()) +// .logType(LogTypeEnum.ATTEND_CLA.getLogType()) +// .courseId(scCourse.getCourseId()) +// .courseName(scCourse.getCourseName()) +// .claId(dbCla.getClaId()) +// .claName(dbCla.getClaName()) +// .deptName(sysDept.getDeptName()) +// .createUser(loginUser.getAppUserId()) +// .createUserType("app") +// .createUserName(loginUser.getAppUser().getUserName()) +// .createTime(new Date()) +// .build(); +// //count:课时 days:时间 total_fee:储值 +// if (chargeType.equals("count")) { +// studentCourseLog.setChangeHour(addClaTimeAttend.getPayHour()); +// studentCourseLog.setAfterBalanceHour(addClaTimeAttend.getCountAfter()); +// sb.append("扣减").append(addClaTimeAttend.getPayHour()).append("课时;"); +// } +// if (chargeType.equals("total_fee")) { +// studentCourseLog.setChangeFee(addClaTimeAttend.getPayFee()); +// studentCourseLog.setAfterBalanceHour(addClaTimeAttend.getFeeAfter()); +// sb.append("扣减").append(addClaTimeAttend.getPayHour()).append("元;"); +// } +// studentCourseLog.setMemo(sb.toString()); +// } + + // 保存学生日志 +// studentCourseLogMapper.insert(studentCourseLog); + + return new RestResponse().setSuccess(true).setMessage("签到成功!"); + } + + /** + * 教练课时统计 + * @return + */ + @Override + public RestResponse teacherClaTotal(String time) { + Long[] roleId=SecurityUtils.getAppLoginUser().getRoles(); + //104 教师 105店长 + if (!ArrayUtil.containsAny(roleId,104l)){ + return new RestResponse().setSuccess(false).setMessage("当前登录人无权限!"); + } + + Long teacherId= SecurityUtils.getAppLoginUser().getManageAccountId(); + + QueryWrapper queryWrapper= new QueryWrapper(); + queryWrapper.eq("teacher_id",teacherId); + + switch (time) { + case "today" : + queryWrapper.eq("real_cla_date",DateUtil.format(DateUtil.date(),"yyyy-MM-dd")); + break; + case "yesterday" : + queryWrapper.eq("real_cla_date",DateUtil.format(DateUtil.yesterday(),"yyyy-MM-dd")); + break; + case "thisMonth" : + queryWrapper.eq("substr(real_cla_date,1,7)", + DateUtil.format(DateUtil.date(),"yyyy-MM") + ); + break; + case "lastMonth" : + queryWrapper.eq("substr(real_cla_date,1,7)", + DateUtil.format(DateUtil.lastMonth(),"yyyy-MM") + ); + break; + } + + List claTimeList=claTimeMapper.selectList(queryWrapper); + + //上课节数 + int claCount=claTimeList.size(); + + BigDecimal totalFee = claTimeList.stream() + // 将user对象的age取出来map为Bigdecimal + .map(ScClaTime::getTeacherFee) + // 使用reduce()聚合函数,实现累加器 + .reduce(BigDecimal.ZERO,BigDecimal::add); + claTimeList.forEach(l->{ + String courseName= claTimeMapper.getCourseList(null,l.getCourseTimeId(),null).get(0).getCourseName(); + l.setCourseName(courseName); + }); + Map map=new HashMap<>(); + map.put("claCount",claCount); + map.put("totalFee",totalFee); + map.put("claTimeList",claTimeList); + + return new RestResponse().setSuccess(true).setData(map); + } + + private String beginTime; + private String endTime; + + + /** + * 教练费用统计(店长) + * @return + */ + @Override + public RestResponse teacherFeeTotal(String time) { + Long[] roleId=SecurityUtils.getAppLoginUser().getRoles(); + //104 教师 105店长 + if (!ArrayUtil.containsAny(roleId,105l)){ + return new RestResponse().setSuccess(false).setMessage("当前登录人无权限!"); + } + + Long staffId= SecurityUtils.getAppLoginUser().getManageAccountId(); + + getTime(time); + + List claTimeList=claTimeMapper.getCourseCountByStoreManager(staffId,this.beginTime,this.endTime); + + //上课节数 + int claCount=claTimeList.size(); + //课时费 + BigDecimal totalFee = claTimeList.stream() + // 将user对象的age取出来map为Bigdecimal + .map(ClaTimeItem::getTeacherFee) + // 使用reduce()聚合函数,实现累加器 + .reduce(BigDecimal.ZERO,BigDecimal::add); + + Map map=new HashMap<>(); + map.put("claCount",claCount); + map.put("totalFee",totalFee); + map.put("claTimeList",claTimeList); + + return new RestResponse().setSuccess(true).setData(map); + } + + + /** + * 我的客户 + * @return + */ + @Override + public RestResponse myClient(){ + Long[] roleId=SecurityUtils.getAppLoginUser().getRoles(); + //104 教师 105店长 103 会籍顾问 + if (!ArrayUtil.containsAny(roleId,103l)){ + return new RestResponse().setSuccess(false).setMessage("当前登录人无权限!"); + } + Long staffId= SecurityUtils.getAppLoginUser().getManageAccountId(); + List students= claTimeMapper.getStudentsBySaleStaff(staffId); + return new RestResponse().setSuccess(true).setData(students); + } + + /** + * 我的提成 + * @param time + * @return + */ + @Override + public RestResponse commissionTotal(String time){ + Long[] roleId=SecurityUtils.getAppLoginUser().getRoles(); + //104 教师 105店长 103 会籍顾问 + if (!ArrayUtil.containsAny(roleId,103l)){ + return new RestResponse().setSuccess(false).setMessage("当前登录人无权限!"); + } + Long staffId= SecurityUtils.getAppLoginUser().getManageAccountId(); + getTime(time); + //获取成交的订单信息 + List orderLost=claTimeMapper.myDealOrder(staffId,beginTime,endTime); + //佣金方案 + Map> orderMap = + orderLost.stream().collect(Collectors.groupingBy(RespOrderForApp::getCommissionPlansId)); + + BigDecimal totalFee=new BigDecimal(0); + //佣金策略(多个) + for (Long aLong : orderMap.keySet()) { + ScCommissionPlans plans= commissionMapper.selectById(aLong); + BigDecimal commissionFee = orderMap.get(aLong).stream() + // 将user对象的age取出来map为Bigdecimal + .map(RespOrderForApp::getReceiptFee) + // 使用reduce()聚合函数,实现累加器 + .reduce(BigDecimal.ZERO,BigDecimal::add); + + BigDecimal fee=new BigDecimal(0); + //小于 第一阶梯阈值 + if (plans.getTier1Threshold().compareTo(totalFee)>0){ + fee=commissionFee.multiply(plans.getTier1Rate()); + } + //第二阶梯 + if (totalFee.compareTo(plans.getTier1Threshold())>0 + &&plans.getTier2Threshold().compareTo(totalFee)>0){ + fee=commissionFee.multiply(plans.getTier2Rate()); + } + //第三阶梯 + if (totalFee.compareTo(plans.getTier2Threshold())>0 + &&plans.getTier3Threshold().compareTo(totalFee)>0){ + fee=commissionFee.multiply(plans.getTier3Rate()); + } + //第4阶梯 + if (totalFee.compareTo(plans.getTier3Threshold())>0){ + fee=commissionFee.multiply(plans.getTier4Rate()); + } + + totalFee=totalFee.add(fee); + } + //todo 转介绍佣金... + + Map map=new HashMap(); + map.put("commission",totalFee); + map.put("orderCount",orderLost.size()); + map.put("orderList",orderLost); + + return new RestResponse().setSuccess(true).setData(map); + } + + //销售信息(店长) + @Override + public RestResponse salesInformation(String time){ + Long[] roleId=SecurityUtils.getAppLoginUser().getRoles(); + //104 教师 105店长 103 会籍顾问 + if (!ArrayUtil.containsAny(roleId,105l)){ + return new RestResponse().setSuccess(false).setMessage("当前登录人无权限!"); + } + Long staffId= SecurityUtils.getAppLoginUser().getManageAccountId(); + SysUser sysUser=sysUserService.selectUserById(staffId); + getTime(time); + //获取成交的订单信息 + List orderLost=claTimeMapper.getOrdersForStore(sysUser.getDeptId(),beginTime,endTime); + BigDecimal totalAmount = orderLost.stream() + // 将user对象的age取出来map为Bigdecimal + .map(RespOrderForApp::getReceiptFee) + // 使用reduce()聚合函数,实现累加器 + .reduce(BigDecimal.ZERO,BigDecimal::add); + + Map map=new HashMap(); + map.put("totalAmount",totalAmount); + map.put("orderCount",orderLost.size()); + map.put("orderList",orderLost); + + return new RestResponse().setSuccess(true).setData(map); + } + + //教室费用 + @Override + public RestResponse claRoomFee(String time){ + Long[] roleId=SecurityUtils.getAppLoginUser().getRoles(); + //104 教师 105店长 103 会籍顾问 + if (!ArrayUtil.containsAny(roleId,105l)){ + return new RestResponse().setSuccess(false).setMessage("当前登录人无权限!"); + } + Long staffId= SecurityUtils.getAppLoginUser().getManageAccountId(); + + getTime(time); + //获取门店上课信息 + List claTimeList=claTimeMapper.getCourseCountByStoreManager(staffId,beginTime,endTime); + //教室使用费用 + BigDecimal venueFee = claTimeList.stream() + // 将user对象的age取出来map为Bigdecimal + .map(ClaTimeItem::getVenueFee) + // 使用reduce()聚合函数,实现累加器 + .reduce(BigDecimal.ZERO,BigDecimal::add); + + Map map=new HashMap<>(); + map.put("venueFee",venueFee); + map.put("claTimeList",claTimeList); + + return new RestResponse().setSuccess(true).setData(map); + } + + private void getTime( String time){ +// String beginTime,String endTime, + switch (time) { + case "today" : + beginTime=DateUtil.format(DateUtil.date(),"yyyy-MM-dd 00:00:00"); + endTime=DateUtil.format(DateUtil.date(),"yyyy-MM-dd 23:59:59");; + break; + case "yesterday" : + beginTime=DateUtil.format(DateUtil.yesterday(),"yyyy-MM-dd 00:00:00"); + endTime=DateUtil.format(DateUtil.yesterday(),"yyyy-MM-dd 23:59:59"); + break; + case "thisMonth" : + beginTime=DateUtil.format(DateUtil.date(),"yyyy-MM-01 00:00:00"); + endTime=DateUtil.format(DateUtil.date(),"yyyy-MM-dd 23:59:59"); + break; + case "lastMonth" : + DateTime lastMonth=DateUtil.lastMonth(); + beginTime=DateUtil.format(lastMonth,"yyyy-MM-01 00:00:00"); + endTime=DateUtil.format(DateUtil.endOfMonth(lastMonth),"yyyy-MM-dd 23:59:59"); + break; + default: + throw new RuntimeException("请选择查询时间范围"); + } + } } diff --git a/ruoyi-system/src/main/java/com/ruoyi/course/service/impl/ScStudentCourseOrderServiceImpl.java b/ruoyi-system/src/main/java/com/ruoyi/course/service/impl/ScStudentCourseOrderServiceImpl.java new file mode 100644 index 0000000..f553b8f --- /dev/null +++ b/ruoyi-system/src/main/java/com/ruoyi/course/service/impl/ScStudentCourseOrderServiceImpl.java @@ -0,0 +1,153 @@ +package com.ruoyi.course.service.impl; + +import com.baomidou.mybatisplus.core.conditions.update.UpdateWrapper; +import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; +import com.ruoyi.course.domain.ScStudent; +import com.ruoyi.course.domain.ScStudentCourse; +import com.ruoyi.course.domain.ScStudentCourseOrder; +import com.ruoyi.course.mapper.ScStudentCourseMapper; +import com.ruoyi.course.mapper.ScStudentCourseOrderMapper; +import com.ruoyi.course.mapper.ScStudentMapper; +import com.ruoyi.course.service.IScStudentCourseOrderService; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Service; + +import java.math.BigDecimal; +import java.util.List; + +/** + *

+ * 学生课程关联订单 服务实现类 + *

+ * + */ +@Service +public class ScStudentCourseOrderServiceImpl extends ServiceImpl implements IScStudentCourseOrderService { + + + @Autowired + private ScStudentCourseMapper studentCourseMapper; + @Autowired + private ScStudentMapper studentMapper; + + @Override + public boolean checkDateCover(Long studentId, Long courseId, String beginDate, String endDate) { + int checkDateCover = baseMapper.checkDateCover(studentId, courseId, beginDate, endDate); + if (checkDateCover == 0) { + return false; + } else { + return true; + } + } + + @Override + public ScStudentCourseOrder getSubtractHourOrder(Long studentCourseId) { + return baseMapper.selectSubtractHourOrder(studentCourseId); + } + + @Override + public ScStudentCourseOrder getNowValidDateOrder(Long studentCourseId) { + return baseMapper.selectNowValidDateOrder(studentCourseId); + } + + @Override + public BigDecimal subtractCourseOrderBalanceHour(Long studentCourseId, BigDecimal loseHour) { + List studentCourseOrderList = baseMapper.selectSubtractHourOrderList(studentCourseId); + BigDecimal payFee = BigDecimal.ZERO; + for (ScStudentCourseOrder courseOrder : studentCourseOrderList) { + if (loseHour.compareTo(BigDecimal.ZERO) == 0) { + break; + } + BigDecimal balanceHour = courseOrder.getBalanceHour(); + + // 订单剩余课时不足扣减 + if (balanceHour.compareTo(loseHour) < 0) { + payFee = payFee.add(balanceHour.multiply(courseOrder.getUnitFee())); + + // 剩余课时不足扣减, 将剩余课时扣减完毕 + int updateSubtractHour = baseMapper.updateSubtractHour(courseOrder.getCourseOrderId(), BigDecimal.ZERO, balanceHour); + if (updateSubtractHour == 0) { + throw new RuntimeException("订单扣减课时失败,请重试!"); + } + + loseHour = loseHour.subtract(balanceHour); + + } else { + payFee = payFee.add(loseHour.multiply(courseOrder.getUnitFee())); + + // 直接扣减课时 + BigDecimal newHour = balanceHour.subtract(loseHour); + int updateSubtractHour = baseMapper.updateSubtractHour(courseOrder.getCourseOrderId(), newHour, balanceHour); + if (updateSubtractHour == 0) { + throw new RuntimeException("订单扣减课时失败,请重试!"); + } + } + } + return payFee; + } + + @Override + public void recoverOrderLoseHour(Long studentCourseId, BigDecimal recoverHour) { + if(recoverHour.compareTo(BigDecimal.ZERO) == 0) { + return; + } + List recoverHourOrderList = baseMapper.selectRecoverHourOrderList(studentCourseId); + if (recoverHourOrderList.size() == 0) { + ScStudentCourse studentCourse = studentCourseMapper.selectById(studentCourseId); + ScStudent student = studentMapper.selectById(studentCourse.getStudentId()); + throw new RuntimeException("学员:" + student.getStudentName() + ",无生效订单,无法恢复课时!"); + } + + for (int i = 0; i < recoverHourOrderList.size(); i++) { + + if(recoverHour.compareTo(BigDecimal.ZERO) == 0) { + return; + } + + // 是否为最后一条记录 + boolean lastRecord = (i == (recoverHourOrderList.size() - 1)); + ScStudentCourseOrder studentCourseOrder = recoverHourOrderList.get(i); + BigDecimal balanceHour = studentCourseOrder.getBalanceHour(); + BigDecimal totalHour = studentCourseOrder.getTotalHour(); + if(lastRecord) { + BigDecimal newBalanceHour = studentCourseOrder.getBalanceHour().add(recoverHour); + this.updateBalanceHour(studentCourseOrder.getCourseOrderId(), newBalanceHour, balanceHour); + break; + } else { + if(balanceHour.compareTo(totalHour) < 0) { + // 可恢复课时数量 + BigDecimal canRecoverHour = totalHour.subtract(balanceHour); + + if(canRecoverHour.compareTo(recoverHour) > 0) { + // 订单可恢复课时数量canRecoverHour > 需要恢复的课时数量recoverHour,直接全部恢复 + + BigDecimal newBalanceHour = studentCourseOrder.getBalanceHour().add(recoverHour); + this.updateBalanceHour(studentCourseOrder.getCourseOrderId(), newBalanceHour, balanceHour); + recoverHour = BigDecimal.ZERO; + } else { + // 订单可恢复课时数量canRecoverHour <= 需要恢复的课时数量recoverHour + + BigDecimal newBalanceHour = studentCourseOrder.getBalanceHour().add(canRecoverHour); + this.updateBalanceHour(studentCourseOrder.getCourseOrderId(), newBalanceHour, balanceHour); + + // 剩余需恢复课时 + recoverHour = recoverHour.subtract(canRecoverHour); + } + } + } + } + } + + @Override + public void updateBalanceHour(Long courseOrderId, BigDecimal newBalanceHour, BigDecimal oldBalanceHour) { + UpdateWrapper uw = new UpdateWrapper<>(); + uw.eq("course_order_id", courseOrderId); + uw.eq("balance_hour", oldBalanceHour); + uw.set("balance_hour", newBalanceHour); + boolean update = this.update(uw); + if (!update) { + throw new RuntimeException("订单恢复课时失败,请重试!"); + } + } + +} diff --git a/ruoyi-system/src/main/java/com/ruoyi/course/service/impl/ScStudentServiceImpl.java b/ruoyi-system/src/main/java/com/ruoyi/course/service/impl/ScStudentServiceImpl.java new file mode 100644 index 0000000..43ecb78 --- /dev/null +++ b/ruoyi-system/src/main/java/com/ruoyi/course/service/impl/ScStudentServiceImpl.java @@ -0,0 +1,32 @@ +package com.ruoyi.course.service.impl; + +import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; +import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; +import com.ruoyi.course.domain.ScStudent; +import com.ruoyi.course.mapper.ScStudentMapper; +import com.ruoyi.course.service.IScStudentService; +import org.springframework.stereotype.Service; + +/** + *

+ * 学生基本信息 服务实现类 + *

+ * + * + * @since 2020-04-27 07:13:40 + */ +@Service +public class ScStudentServiceImpl extends ServiceImpl implements IScStudentService { + + + @Override + public Long getStudentByAppUserId(Long appUserId){ + QueryWrapper qw = new QueryWrapper<>(); + qw.eq("app_user_id", appUserId); + ScStudent student = this.getOne(qw); + if (null != student) { + return student.getStudentId(); + } + return null; + } +} diff --git a/ruoyi-system/src/main/java/com/ruoyi/course/service/impl/StudentCourseServiceImpl.java b/ruoyi-system/src/main/java/com/ruoyi/course/service/impl/StudentCourseServiceImpl.java new file mode 100644 index 0000000..edc632e --- /dev/null +++ b/ruoyi-system/src/main/java/com/ruoyi/course/service/impl/StudentCourseServiceImpl.java @@ -0,0 +1,327 @@ +package com.ruoyi.course.service.impl; + +import com.baomidou.mybatisplus.core.conditions.update.UpdateWrapper; +import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; +import com.ruoyi.RestResponse; +import com.ruoyi.common.core.domain.entity.SysDept; +import com.ruoyi.common.core.domain.model.AppLoginUser; +import com.ruoyi.common.core.domain.model.LoginUser; +import com.ruoyi.common.utils.SecurityUtils; +import com.ruoyi.course.domain.*; +import com.ruoyi.course.domain.enums.ClaTimeAttendStatusEnums; +import com.ruoyi.course.domain.enums.ClaTimeStatusEnums; +import com.ruoyi.course.domain.enums.CourseChargeTypeEnum; +import com.ruoyi.course.domain.enums.LogTypeEnum; +import com.ruoyi.course.domain.req.ReqClaTimeAttend; +import com.ruoyi.course.domain.req.ReqClaTimeAttendItem; +import com.ruoyi.course.mapper.ScClaTimeMapper; +import com.ruoyi.course.mapper.ScStudentCourseMapper; +import com.ruoyi.course.service.IScCourseClaService; +import com.ruoyi.course.service.IScCourseService; +import com.ruoyi.course.service.ScClaTimeService; +import com.ruoyi.course.service.ScStudentCourseService; +import com.ruoyi.system.service.ISysDeptService; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Service; + +import java.math.BigDecimal; +import java.util.Date; +import java.util.List; + +@Service +public class StudentCourseServiceImpl extends ServiceImpl implements ScStudentCourseService { + + + + + @Autowired + private IScCourseClaService claService; + + @Autowired + private ISysDeptService deptService; + + @Autowired + private IScCourseService courseService; + + @Autowired + private ScStudentCourseMapper studentCourseMapper; + + @Autowired + private ScClaTimeService claTimeService; + + /** + * 记上课 + * + * @param reqClaTimeAttend + * @return + */ + @Override + public RestResponse claTimeAttend(ReqClaTimeAttend reqClaTimeAttend) { +// APIResponse checkParam = reqClaTimeAttend.checkParam(); +// if (!checkParam.isSuccess()) { +// return checkParam; +// } +// AppLoginUser loginUser = SecurityUtils.getAppLoginUser(); +// String attendType = reqClaTimeAttend.getAttendType(); +// String startTime = reqClaTimeAttend.getStartTime(); +// String endTime = reqClaTimeAttend.getEndTime(); +// Long teacherId = reqClaTimeAttend.getTeacherId(); +// Long courseTimeId = reqClaTimeAttend.getCourseTimeId(); +// Long claId = reqClaTimeAttend.getClaId(); +// ScCourseCla dbCla = claService.getById(claId); +// if (null == dbCla) { +// return new RestResponse().setSuccess(false).setMessage("无法获取班级信息,请稍后重试"); +// } +// Long courseId = dbCla.getCourseId(); +// ScCourse scCourse = courseService.getById(courseId); +// if (null == scCourse) { +// return new RestResponse().setSuccess(false).setMessage("无法获取班级信息,请稍后重试"); +// } +// +// Long departId = dbCla.getDepartId(); +// SysDept sysDept = deptService.getById(departId); +// if (null == sysDept) { +// return new RestResponse().setSuccess(false).setMessage("无法获取校区信息,请稍后重试"); +// } +// +// List studentAttendList = reqClaTimeAttend.getStudentAttendList(); +// +// // 总消耗课时金额 +// BigDecimal totalPayFee = BigDecimal.ZERO; +// // 可课时消耗 +// BigDecimal totalPayHour = BigDecimal.ZERO; +// // 实到人数 +// Long realAttendCnt = studentAttendList.stream().filter(item -> item.getAttendStatus().equals(ClaTimeAttendStatusEnums.AT_CLASS.getAttendStatus())).count(); +// // 请假人数 +// Long leaveCnt = studentAttendList.stream().filter(item -> item.getAttendStatus().equals(ClaTimeAttendStatusEnums.LEAVE_CLASS.getAttendStatus())).count(); +// // 旷课人数 +// Long outCnt = studentAttendList.stream().filter(item -> item.getAttendStatus().equals(ClaTimeAttendStatusEnums.OUT_CLASS.getAttendStatus())).count(); +// // 应到人数 +// int needAttendCnt = studentCourseMapper.selectClaNeedAttendCnt(dbCla.getClaId()); +// +// +// if ("rule".equals(attendType)) { +// // 排课记上课 +// +// ScClaTime claTime = claTimeService.getById(courseTimeId); +// if (!ClaTimeStatusEnums.WAIT_CLASS.getStatus().equals(claTime.getStatus())) { +// return new RestResponse().setSuccess(false).setMessage("选择计划上课日期,非待上课状态,无法重复上课!"); +// } +// teacherId = claTime.getTeacherId(); +// // 变更状态为已上课 +// ScClaTime updateClaTime = new ScClaTime(); +// updateClaTime.setCourseTimeId(courseTimeId); +// updateClaTime.setRealClaDate(claTime.getClaDate()); +// updateClaTime.setRealStartTime(startTime); +// updateClaTime.setRealEndTime(endTime); +// updateClaTime.setStatus(ClaTimeStatusEnums.HAD_CLASS.getStatus()); +//// updateClaTime.setNeedAttendCnt(needAttendCnt); +// updateClaTime.setRealAttendCnt(realAttendCnt.intValue()); +// updateClaTime.setMemo(reqClaTimeAttend.getMemo()); +// updateClaTime.setLastUpdateUser(loginUser.getAppUserId()); +// updateClaTime.setLastUpdateTime(new Date()); +// claTimeService.updateById(updateClaTime); +// } else if ("change".equals(attendType)) { +// // 变更上课记录 +// +// ScClaTime claTime = claTimeService.getById(courseTimeId); +// if (!ClaTimeStatusEnums.WAIT_CLASS.getStatus().equals(claTime.getStatus())) { +// return APIResponse.toExceptionResponse("选择计划上课日期,非待上课状态,无法重复上课!"); +// } +// // 变更状态为已上课 +// ScClaTime updateClaTime = new ScClaTime(); +// updateClaTime.setCourseTimeId(courseTimeId); +// updateClaTime.setRealClaDate(reqClaTimeAttend.getClaDate()); +// updateClaTime.setTeacherId(reqClaTimeAttend.getTeacherId()); +// updateClaTime.setClassTheme(reqClaTimeAttend.getClassTheme()); +// updateClaTime.setRealStartTime(startTime); +// updateClaTime.setRealEndTime(endTime); +// updateClaTime.setStatus(ClaTimeStatusEnums.HAD_CLASS.getStatus()); +//// updateClaTime.setNeedAttendCnt(needAttendCnt); +// updateClaTime.setRealAttendCnt(realAttendCnt.intValue()); +// updateClaTime.setMemo(reqClaTimeAttend.getMemo()); +// updateClaTime.setLastUpdateUser(loginUser.getAppUserId()); +// updateClaTime.setLastUpdateTime(new Date()); +// claTimeService.updateById(updateClaTime); +// } else if ("custom".equals(attendType)) { +// // 记录自定义上课信息 +// +// ScClaTime addClaTime = new ScClaTime(); +// addClaTime.setClaId(reqClaTimeAttend.getClaId()); +// addClaTime.setClaDate(reqClaTimeAttend.getClaDate()); +// addClaTime.setTeacherId(reqClaTimeAttend.getTeacherId()); +// addClaTime.setClassTheme(reqClaTimeAttend.getClassTheme()); +// addClaTime.setStartTime(reqClaTimeAttend.getStartTime()); +// addClaTime.setEndTime(reqClaTimeAttend.getEndTime()); +// addClaTime.setRealClaDate(reqClaTimeAttend.getClaDate()); +// addClaTime.setRealStartTime(reqClaTimeAttend.getStartTime()); +// addClaTime.setRealEndTime(reqClaTimeAttend.getEndTime()); +// addClaTime.setSource(ClaTimeSourceEnums.UN_PLAN_CLA_TIME.getSource()); +// addClaTime.setStatus(ClaTimeStatusEnums.HAD_CLASS.getStatus()); +// addClaTime.setPayHour(dbCla.getEveryStuLoseHour()); +// addClaTime.setNeedAttendCnt(needAttendCnt); +// addClaTime.setRealAttendCnt(realAttendCnt.intValue()); +// addClaTime.setMemo(reqClaTimeAttend.getMemo()); +// addClaTime.setCreateUser(loginUser.getUserId()); +// addClaTime.setCreateTime(new Date()); +// addClaTime.setLastUpdateUser(loginUser.getUserId()); +// addClaTime.setLastUpdateTime(new Date()); +// +// // 教室不为空 设置教室 +// if (null != reqClaTimeAttend.getRoomId()) { +// ScRoom room = roomService.getById(reqClaTimeAttend.getRoomId()); +// addClaTime.setRoomId(reqClaTimeAttend.getRoomId()); +// addClaTime.setRoomName(room.getRoomName()); +// } +// +// claTimeService.save(addClaTime); +// courseTimeId = addClaTime.getCourseTimeId(); +// } +// +// // 教师信息 +// SysStaff sysStaff = staffService.getById(teacherId); +// +// // 保存上课记录 +// List saveAttendList = com.google.common.collect.Lists.newArrayList(); +// // 保存学生日志 +// List studentCourseLogList = com.google.common.collect.Lists.newArrayList(); +// +// for (ReqClaTimeAttendItem attendItem : studentAttendList) { +// Long studentCourseId = attendItem.getStudentCourseId(); +// String attendStatus = attendItem.getAttendStatus(); +// String memo = attendItem.getMemo(); +// BigDecimal stuLoseHour = attendItem.getStuLoseHour(); +// +// // 如果是请假,消耗课时0 +// if (ClaTimeAttendStatusEnums.LEAVE_CLASS.getAttendStatus().equals(attendStatus)) { +// stuLoseHour = BigDecimal.ZERO; +// } +// +// // 获取学生报读班级信息 +// ScStudentCourse studentCourse = studentCourseService.getById(studentCourseId); +// String studentDbChargeType = studentCourse.getChargeType(); +// +// // 消耗金额 +// BigDecimal payFee; +// // 上课后剩余课时 +// BigDecimal changeAfterBalanceHour = null; +// // 本次上课对应的订单 +// Long courseOrderId = null; +// +// if (CourseChargeTypeEnum.DATE.getChargeType().equals(studentDbChargeType)) { +// // 按时间上课,不扣减课时 +// +// // 获取 消耗金额 +// ScStudentCourseOrder courseOrder = courseOrderService.getNowValidDateOrder(studentCourseId); +// payFee = courseOrder.getUnitFee(); +// courseOrderId = courseOrder.getCourseOrderId(); +// +// } else { +// // 本次上课对应的订单 +// ScStudentCourseOrder courseOrder = courseOrderService.getSubtractHourOrder(studentCourseId); +// if (null == courseOrder) { +// throw new BusinessException("无法获取对应课时订单,无法扣减课时,id=" + studentCourseId); +// } +// courseOrderId = courseOrder.getCourseOrderId(); +// +// BigDecimal balanceHour = studentCourse.getBalanceHour(); +// balanceHour = balanceHour.subtract(stuLoseHour); +// +// changeAfterBalanceHour = balanceHour; +// +// // 课时不足 不允许上课 +// if (balanceHour.compareTo(BigDecimal.ZERO) < 0) { +// throw new BusinessException("学员课时不足,不允许上课!"); +// } +// +// // 更新剩余课时 cas +// UpdateWrapper uwStudentCourse = new UpdateWrapper<>(); +// uwStudentCourse +// .eq("student_course_id", studentCourseId) +// .eq("balance_hour", studentCourse.getBalanceHour()) +// .set("balance_hour", balanceHour) +// .set("last_update_user", loginUser.getUserId()) +// .set("last_update_time", new Date()); +// boolean update = studentCourseService.update(uwStudentCourse); +// if (!update) { +// throw new BusinessException("学员课时余额扣减失败,请重试!"); +// } +// +// // 订单扣减课时,获取 消耗金额 +// payFee = courseOrderService.subtractCourseOrderBalanceHour(studentCourseId, stuLoseHour); +// } +// +// // 消耗总金额 +// totalPayFee = totalPayFee.add(payFee); +// +// // 每个上课记录 +// ScClaTimeAttend addClaTimeAttend = new ScClaTimeAttend(); +// addClaTimeAttend.setStudentCourseId(studentCourseId); +// addClaTimeAttend.setCourseOrderId(courseOrderId); +// addClaTimeAttend.setCourseTimeId(courseTimeId); +// addClaTimeAttend.setStudentId(studentCourse.getStudentId()); +// addClaTimeAttend.setClaId(studentCourse.getClaId()); +// addClaTimeAttend.setCourseId(studentCourse.getCourseId()); +// addClaTimeAttend.setTeacherId(teacherId); +// addClaTimeAttend.setTeacherName(sysStaff.getStaffName()); +// addClaTimeAttend.setChargeType(studentDbChargeType); +// if (CourseChargeTypeEnum.DATE.getChargeType().equals(studentDbChargeType)) { +// addClaTimeAttend.setTeacherGetHour(null); +// addClaTimeAttend.setPayHour(null); +// } else { +// addClaTimeAttend.setTeacherGetHour(stuLoseHour); +// addClaTimeAttend.setPayHour(stuLoseHour); +// totalPayHour = totalPayHour.add(stuLoseHour); +// } +// addClaTimeAttend.setAttendStatus(attendStatus); +// addClaTimeAttend.setMemo(memo); +// addClaTimeAttend.setCreateUser(loginUser.getUserId()); +// addClaTimeAttend.setPayFee(payFee); +// saveAttendList.add(addClaTimeAttend); +// +// // 上课日志 +// StringBuffer sb = new StringBuffer(""); +// sb.append("上课[").append(ClaTimeAttendStatusEnums.getNameByStatus(attendStatus)).append("],上课时间").append(reqClaTimeAttend.getClaDate()).append(" ") +// .append(reqClaTimeAttend.getStartTime()).append("~").append(reqClaTimeAttend.getEndTime()).append(","); +// ScStudentCourseLog studentCourseLog = ScStudentCourseLog.builder() +// .studentId(studentCourse.getStudentId()) +// .logType(LogTypeEnum.ATTEND_CLA.getLogType()) +// .courseId(scCourse.getCourseId()) +// .courseName(scCourse.getCourseName()) +// .claId(dbCla.getClaId()) +// .claName(dbCla.getClaName()) +// .deptName(sysDept.getDeptName()) +// .changeFee(payFee.negate()) +// .createUser(loginUser.getUserId()) +// .createUserName(loginUser.getName()) +// .createTime(new Date()) +// .build(); +// if (!CourseChargeTypeEnum.DATE.getChargeType().equals(studentDbChargeType)) { +// studentCourseLog.setChangeHour(stuLoseHour.negate()); +// studentCourseLog.setAfterBalanceHour(changeAfterBalanceHour); +// sb.append("扣减").append(stuLoseHour.toString()).append("课时,"); +// sb.append("消耗").append(payFee).append("元."); +// } +// studentCourseLog.setMemo(sb.toString()); +// studentCourseLogList.add(studentCourseLog); +// } +// // 保存上课记录 +// attendService.saveBatch(saveAttendList); +// // 保存学生日志 +// scStudentCourseLogService.saveBatch(studentCourseLogList); +// +// // 更新上课总课时 人数信息 +// ScClaTime updateClaTime = new ScClaTime(); +// updateClaTime.setCourseTimeId(courseTimeId); +// updateClaTime.setPayTotalHour(totalPayHour); +// updateClaTime.setPayTotalFee(totalPayFee); +// updateClaTime.setAtClassCnt(realAttendCnt.intValue()); +// updateClaTime.setLeaveCnt(leaveCnt.intValue()); +// updateClaTime.setOutCnt(outCnt.intValue()); +// claTimeService.updateById(updateClaTime); +// +// return APIResponse.toOkResponse(); + return new RestResponse(); + } + +} diff --git a/ruoyi-system/src/main/java/com/ruoyi/im/domain/Friend.java b/ruoyi-system/src/main/java/com/ruoyi/im/domain/Friend.java index 2ab6d56..7f939b4 100644 --- a/ruoyi-system/src/main/java/com/ruoyi/im/domain/Friend.java +++ b/ruoyi-system/src/main/java/com/ruoyi/im/domain/Friend.java @@ -1,5 +1,6 @@ package com.ruoyi.im.domain; +import com.baomidou.mybatisplus.annotation.TableField; import com.baomidou.mybatisplus.annotation.TableId; import com.baomidou.mybatisplus.annotation.TableName; import lombok.Data; @@ -43,7 +44,12 @@ public class Friend { /** * 用户头像 */ + @TableField(exist = false) private String friendHeadImage; + @TableField(exist = false) + private Long roleId; + @TableField(exist = false) + private Long storeId; /** * 是否已删除 diff --git a/ruoyi-system/src/main/java/com/ruoyi/im/domain/Group.java b/ruoyi-system/src/main/java/com/ruoyi/im/domain/Group.java new file mode 100644 index 0000000..1882aa2 --- /dev/null +++ b/ruoyi-system/src/main/java/com/ruoyi/im/domain/Group.java @@ -0,0 +1,74 @@ +package com.ruoyi.im.domain; + +import com.baomidou.mybatisplus.annotation.TableId; +import com.baomidou.mybatisplus.annotation.TableName; +import lombok.Data; + +import java.io.Serializable; +import java.util.Date; + +/** + * 群 + * + * @author blue + * @since 2022-10-31 + */ +@Data +@TableName("im_group") +public class Group implements Serializable { + private static final long serialVersionUID = 1L; + + /** + * id + */ + @TableId + private Long id; + + /** + * 群名字 + */ + private String name; + + /** + * 群主id + */ + private Long ownerId; + + /** + * 群头像 + */ + private String headImage; + + /** + * 群头像缩略图 + */ + private String headImageThumb; + + /** + * 群公告 + */ + private String notice; + + /** + * 是否被封禁 + */ + private Boolean isBanned; + + /** + * 被封禁原因 + */ + private String reason; + + /** + * 创建时间 + */ + private Date createdTime; + + /** + * 是否已删除 + */ + private Boolean dissolve; + + + +} diff --git a/ruoyi-system/src/main/java/com/ruoyi/im/domain/GroupMember.java b/ruoyi-system/src/main/java/com/ruoyi/im/domain/GroupMember.java new file mode 100644 index 0000000..9ab00b3 --- /dev/null +++ b/ruoyi-system/src/main/java/com/ruoyi/im/domain/GroupMember.java @@ -0,0 +1,80 @@ +package com.ruoyi.im.domain; + +import cn.hutool.core.util.StrUtil; +import com.baomidou.mybatisplus.annotation.TableId; +import com.baomidou.mybatisplus.annotation.TableName; +import com.baomidou.mybatisplus.extension.activerecord.Model; +import lombok.Data; +import lombok.EqualsAndHashCode; + +import java.util.Date; + +/** + *

+ * 群成员 + *

+ * + * @author blue + * @since 2022-10-31 + */ +@Data +@EqualsAndHashCode(callSuper = false) +@TableName("im_group_member") +public class GroupMember extends Model { + + /** + * id + */ + @TableId + private Long id; + + /** + * 群id + */ + private Long groupId; + + /** + * 用户id + */ + private Long userId; + + /** + * 用户昵称 + */ + private String userNickName; + + /** + * 显示昵称备注 + */ + private String remarkNickName; + + /** + * 用户头像 + */ + private String headImage; + + /** + * 显示群名备注 + */ + private String remarkGroupName; + + /** + * 是否已退出 + */ + private Boolean quit; + + /** + * 创建时间 + */ + private Date createdTime; + + /** + * 退出时间 + */ + private Date quitTime; + + public String getShowNickName() { + return StrUtil.blankToDefault(remarkNickName, userNickName); + } + +} diff --git a/ruoyi-system/src/main/java/com/ruoyi/im/domain/GroupMessage.java b/ruoyi-system/src/main/java/com/ruoyi/im/domain/GroupMessage.java new file mode 100644 index 0000000..43d4385 --- /dev/null +++ b/ruoyi-system/src/main/java/com/ruoyi/im/domain/GroupMessage.java @@ -0,0 +1,82 @@ +package com.ruoyi.im.domain; + +import com.baomidou.mybatisplus.annotation.TableId; +import com.baomidou.mybatisplus.annotation.TableName; +import lombok.Data; + +import java.util.Date; + +/** + *

+ * 群消息 + *

+ * + * @author blue + * @since 2022-10-31 + */ +@Data + +@TableName("im_group_message") +public class GroupMessage { + + /** + * id + */ + @TableId + private Long id; + + /** + * 群id + */ + private Long groupId; + + /** + * 发送用户id + */ + private Long sendId; + + /** + * 发送用户昵称 + */ + private String sendNickName; + + /** + * 接受用户id,为空表示全体发送 + */ + private String recvIds; + + /** + * @用户列表 + */ + private String atUserIds; + /** + * 发送内容 + */ + private String content; + + /** + * 消息类型 MessageType + */ + private Integer type; + + /** + * 是否回执消息 + */ + private Boolean receipt; + + /** + * 回执消息是否完成 + */ + private Boolean receiptOk; + + /** + * 状态 MessageStatus + */ + private Integer status; + + /** + * 发送时间 + */ + private Date sendTime; + +} diff --git a/ruoyi-system/src/main/java/com/ruoyi/im/domain/dto/GroupInviteDTO.java b/ruoyi-system/src/main/java/com/ruoyi/im/domain/dto/GroupInviteDTO.java new file mode 100644 index 0000000..88e0250 --- /dev/null +++ b/ruoyi-system/src/main/java/com/ruoyi/im/domain/dto/GroupInviteDTO.java @@ -0,0 +1,23 @@ +package com.ruoyi.im.domain.dto; + +import io.swagger.v3.oas.annotations.media.Schema; +import lombok.Data; + +import javax.validation.constraints.NotEmpty; +import javax.validation.constraints.NotNull; +import javax.validation.constraints.Size; +import java.util.List; + +@Data +@Schema(description = "邀请好友进群请求DTO") +public class GroupInviteDTO { + + @NotNull(message = "群id不可为空") + @Schema(description = "群id") + private Long groupId; + + @Size(max = 50, message = "一次最多只能邀请50位用户") + @NotEmpty(message = "群id不可为空") + @Schema(description = "好友id列表不可为空") + private List friendIds; +} diff --git a/ruoyi-system/src/main/java/com/ruoyi/im/domain/dto/GroupMemberRemoveDTO.java b/ruoyi-system/src/main/java/com/ruoyi/im/domain/dto/GroupMemberRemoveDTO.java new file mode 100644 index 0000000..079c33d --- /dev/null +++ b/ruoyi-system/src/main/java/com/ruoyi/im/domain/dto/GroupMemberRemoveDTO.java @@ -0,0 +1,28 @@ +package com.ruoyi.im.domain.dto; + +import io.swagger.v3.oas.annotations.media.Schema; +import lombok.Data; + +import javax.validation.constraints.NotEmpty; +import javax.validation.constraints.NotNull; +import javax.validation.constraints.Size; +import java.util.List; + +/** + * @author Blue + * @version 1.0 + * @date 2025-02-23 + */ +@Data +@Schema(description = "移除群聊成员") +public class GroupMemberRemoveDTO { + + @NotNull(message = "群id不可为空") + @Schema(description = "群组id") + private Long groupId; + + @Size(max = 50, message = "一次最多只能选择50位用户") + @NotEmpty(message = "成员用户id不可为空") + @Schema(description = "成员用户id") + private List userIds; +} diff --git a/ruoyi-system/src/main/java/com/ruoyi/im/domain/dto/GroupMessageDTO.java b/ruoyi-system/src/main/java/com/ruoyi/im/domain/dto/GroupMessageDTO.java new file mode 100644 index 0000000..a2bd8e8 --- /dev/null +++ b/ruoyi-system/src/main/java/com/ruoyi/im/domain/dto/GroupMessageDTO.java @@ -0,0 +1,35 @@ +package com.ruoyi.im.domain.dto; + +import io.swagger.v3.oas.annotations.media.Schema; +import lombok.Data; +import org.hibernate.validator.constraints.Length; + +import javax.validation.constraints.NotEmpty; +import javax.validation.constraints.NotNull; +import javax.validation.constraints.Size; +import java.util.List; + +@Data +@Schema(description = "群聊消息DTO") +public class GroupMessageDTO { + + @NotNull(message = "群聊id不可为空") + @Schema(description = "群聊id") + private Long groupId; + + @Length(max = 1024, message = "发送内容长度不得大于1024") + @NotEmpty(message = "发送内容不可为空") + @Schema(description = "发送内容") + private String content; + + @NotNull(message = "消息类型不可为空") + @Schema(description = "消息类型 0:文字 1:图片 2:文件 3:语音 4:视频") + private Integer type; + + @Schema(description = "是否回执消息") + private Boolean receipt = false; + + @Size(max = 20, message = "一次最多只能@20个小伙伴哦") + @Schema(description = "被@用户列表") + private List atUserIds; +} diff --git a/ruoyi-system/src/main/java/com/ruoyi/im/domain/vo/GroupMemberVO.java b/ruoyi-system/src/main/java/com/ruoyi/im/domain/vo/GroupMemberVO.java new file mode 100644 index 0000000..d7edf6d --- /dev/null +++ b/ruoyi-system/src/main/java/com/ruoyi/im/domain/vo/GroupMemberVO.java @@ -0,0 +1,34 @@ +package com.ruoyi.im.domain.vo; + +import io.swagger.v3.oas.annotations.media.Schema; +import lombok.Data; + +@Data +@Schema(description = "群成员信息VO") +public class GroupMemberVO { + + @Schema(description = "用户id") + private Long userId; + + @Schema(description = "群内显示名称") + private String showNickName; + + @Schema(description = "群内昵称备注") + private String remarkNickName; + + @Schema(description = "头像") + private String headImage; + + @Schema(description = "是否已退出") + private Boolean quit; + + @Schema(description = "是否在线") + private Boolean online; + + @Schema(description = "群名显示名称") + private String showGroupName; + + @Schema(description = "群名备注") + private String remarkGroupName; + +} diff --git a/ruoyi-system/src/main/java/com/ruoyi/im/domain/vo/GroupMessageVO.java b/ruoyi-system/src/main/java/com/ruoyi/im/domain/vo/GroupMessageVO.java new file mode 100644 index 0000000..11ece7d --- /dev/null +++ b/ruoyi-system/src/main/java/com/ruoyi/im/domain/vo/GroupMessageVO.java @@ -0,0 +1,50 @@ +package com.ruoyi.im.domain.vo; + +import com.fasterxml.jackson.databind.annotation.JsonSerialize; +import com.ruoyi.common.serializer.DateToLongSerializer; +import io.swagger.v3.oas.annotations.media.Schema; +import lombok.Data; + +import java.util.Date; +import java.util.List; + +@Data +public class GroupMessageVO { + + @Schema(description = "消息id") + private Long id; + + @Schema(description = "群聊id") + private Long groupId; + + @Schema(description = " 发送者id") + private Long sendId; + + @Schema(description = " 发送者昵称") + private String sendNickName; + + @Schema(description = "消息内容") + private String content; + + @Schema(description = "消息内容类型 具体枚举值由应用层定义") + private Integer type; + + @Schema(description = "是否回执消息") + private Boolean receipt; + + @Schema(description = "回执消息是否完成") + private Boolean receiptOk; + + @Schema(description = "已读消息数量") + private Integer readedCount = 0; + + @Schema(description = "@用户列表") + private List atUserIds; + + @Schema(description = " 状态") + private Integer status; + + @Schema(description = "发送时间") + @JsonSerialize(using = DateToLongSerializer.class) + private Date sendTime; +} diff --git a/ruoyi-system/src/main/java/com/ruoyi/im/domain/vo/GroupVO.java b/ruoyi-system/src/main/java/com/ruoyi/im/domain/vo/GroupVO.java new file mode 100644 index 0000000..a1b8e28 --- /dev/null +++ b/ruoyi-system/src/main/java/com/ruoyi/im/domain/vo/GroupVO.java @@ -0,0 +1,69 @@ +package com.ruoyi.im.domain.vo; + +import io.swagger.v3.oas.annotations.media.Schema; +import lombok.Data; +import org.hibernate.validator.constraints.Length; + +@Data +@Schema(description = "群信息VO") +public class GroupVO { + + @Schema(description = "群id") + private Long id; + + @Length(max = 20, message = "群名称长度不能大于20") + @Schema(description = "群名称") + private String name; + + @Schema(description = "群主id") + private Long ownerId; + + @Schema(description = "头像") + private String headImage; + + @Schema(description = "头像缩略图") + private String headImageThumb; + + @Length(max = 1024, message = "群聊显示长度不能大于1024") + @Schema(description = "群公告") + private String notice; + + @Length(max = 20, message = "显示昵称长度不能大于20") + @Schema(description = "用户在群显示昵称") + private String remarkNickName; + + @Schema(description = "群内显示名称") + private String showNickName; + + @Schema(description = "群名显示名称") + private String showGroupName; + + @Length(max = 20, message = "群备注长度不能大于20") + @Schema(description = "群名备注") + private String remarkGroupName; + + @Schema(description = "是否已解散") + private Boolean dissolve; + + @Schema(description = "是否已退出") + private Boolean quit; + + @Schema(description = "账号是否被封禁") + private Boolean isBanned; + + @Schema(description = "被封禁原因") + private String reason; + + /** + * 客服id + */ + private Long customerService; + /** + * 教练id + */ + private Long instructor; + private Long productId; + + private String productName; + +} diff --git a/ruoyi-system/src/main/java/com/ruoyi/im/listener/PrivateMessageListener.java b/ruoyi-system/src/main/java/com/ruoyi/im/listener/PrivateMessageListener.java new file mode 100644 index 0000000..655f72c --- /dev/null +++ b/ruoyi-system/src/main/java/com/ruoyi/im/listener/PrivateMessageListener.java @@ -0,0 +1,49 @@ +package com.ruoyi.im.listener; + +import cn.hutool.core.collection.CollUtil; +import com.baomidou.mybatisplus.core.conditions.update.UpdateWrapper; +import com.ruoyi.common.im.enums.IMListenerType; +import com.ruoyi.common.im.enums.IMSendCode; +import com.ruoyi.common.im.enums.MessageStatus; +import com.ruoyi.common.im.model.IMSendResult; +import com.ruoyi.im.domain.PrivateMessage; +import com.ruoyi.im.domain.vo.PrivateMessageVO; +import com.ruoyi.im.service.PrivateMessageService; +import com.ruoyi.imclient.annotation.IMListener; +import com.ruoyi.imclient.listener.MessageListener; +import lombok.extern.slf4j.Slf4j; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.context.annotation.Lazy; + +import java.util.HashSet; +import java.util.List; +import java.util.Objects; +import java.util.Set; + +@Slf4j +@IMListener(type = IMListenerType.PRIVATE_MESSAGE) +public class PrivateMessageListener implements MessageListener { + @Lazy + @Autowired + private PrivateMessageService privateMessageService; + @Override + public void process(List> results) { + Set messageIds = new HashSet<>(); + for(IMSendResult result : results){ + PrivateMessageVO messageInfo = result.getData(); + // 更新消息状态,这里只处理成功消息,失败的消息继续保持未读状态 + if (result.getCode().equals(IMSendCode.SUCCESS.code()) && !Objects.isNull(messageInfo.getId())) { + messageIds.add(messageInfo.getId()); + log.info("消息送达,消息id:{},发送者:{},接收者:{},终端:{}", messageInfo.getId(), result.getSender().getId(), result.getReceiver().getId(), result.getReceiver().getTerminal()); + } + } + // 批量修改状态 + if(CollUtil.isNotEmpty(messageIds)){ + UpdateWrapper updateWrapper = new UpdateWrapper<>(); + updateWrapper.lambda().in(PrivateMessage::getId, messageIds) + .eq(PrivateMessage::getStatus, MessageStatus.UNSEND.code()) + .set(PrivateMessage::getStatus, MessageStatus.SENDED.code()); + privateMessageService.update(updateWrapper); + } + } +} diff --git a/ruoyi-system/src/main/java/com/ruoyi/im/mapper/FriendMapper.java b/ruoyi-system/src/main/java/com/ruoyi/im/mapper/FriendMapper.java index ebef85e..2ba5c6b 100644 --- a/ruoyi-system/src/main/java/com/ruoyi/im/mapper/FriendMapper.java +++ b/ruoyi-system/src/main/java/com/ruoyi/im/mapper/FriendMapper.java @@ -3,6 +3,11 @@ package com.ruoyi.im.mapper; import com.baomidou.mybatisplus.core.mapper.BaseMapper; import com.ruoyi.im.domain.Friend; +import java.util.List; + public interface FriendMapper extends BaseMapper { + List getFriendListForConsumer(Long userId); + List getFriendListForManage(Long userId); + } diff --git a/ruoyi-system/src/main/java/com/ruoyi/im/mapper/GroupMapper.java b/ruoyi-system/src/main/java/com/ruoyi/im/mapper/GroupMapper.java new file mode 100644 index 0000000..8951e0c --- /dev/null +++ b/ruoyi-system/src/main/java/com/ruoyi/im/mapper/GroupMapper.java @@ -0,0 +1,14 @@ +package com.ruoyi.im.mapper; + +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import com.ruoyi.im.domain.Group; +import org.apache.ibatis.annotations.Param; + +import java.util.List; + +public interface GroupMapper extends BaseMapper { + + Long groupExist(@Param("userId") Long userId, + @Param("customer") Long customer, + @Param("instructor") Long instructor); +} diff --git a/ruoyi-system/src/main/java/com/ruoyi/im/mapper/GroupMemberMapper.java b/ruoyi-system/src/main/java/com/ruoyi/im/mapper/GroupMemberMapper.java new file mode 100644 index 0000000..cfd9af2 --- /dev/null +++ b/ruoyi-system/src/main/java/com/ruoyi/im/mapper/GroupMemberMapper.java @@ -0,0 +1,8 @@ +package com.ruoyi.im.mapper; + +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import com.ruoyi.im.domain.GroupMember; + +public interface GroupMemberMapper extends BaseMapper { + +} diff --git a/ruoyi-system/src/main/java/com/ruoyi/im/mapper/GroupMessageMapper.java b/ruoyi-system/src/main/java/com/ruoyi/im/mapper/GroupMessageMapper.java new file mode 100644 index 0000000..93531e8 --- /dev/null +++ b/ruoyi-system/src/main/java/com/ruoyi/im/mapper/GroupMessageMapper.java @@ -0,0 +1,8 @@ +package com.ruoyi.im.mapper; + +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import com.ruoyi.im.domain.GroupMessage; + +public interface GroupMessageMapper extends BaseMapper { + +} diff --git a/ruoyi-system/src/main/java/com/ruoyi/im/minioConfig/MinIoClientConfig.java b/ruoyi-system/src/main/java/com/ruoyi/im/minioConfig/MinIoClientConfig.java index 7d82a4e..b23024d 100644 --- a/ruoyi-system/src/main/java/com/ruoyi/im/minioConfig/MinIoClientConfig.java +++ b/ruoyi-system/src/main/java/com/ruoyi/im/minioConfig/MinIoClientConfig.java @@ -19,4 +19,4 @@ public class MinIoClientConfig { .credentials(minioProps.getAccessKey(), minioProps.getSecretKey()) .build(); } -} \ No newline at end of file +} diff --git a/ruoyi-system/src/main/java/com/ruoyi/im/service/FileService.java b/ruoyi-system/src/main/java/com/ruoyi/im/service/FileService.java index 1e24562..516d95e 100644 --- a/ruoyi-system/src/main/java/com/ruoyi/im/service/FileService.java +++ b/ruoyi-system/src/main/java/com/ruoyi/im/service/FileService.java @@ -10,7 +10,7 @@ public interface FileService extends IService { String uploadFile(MultipartFile file); - UploadImageVO uploadImage(MultipartFile file, Boolean isPermanent); + UploadImageVO uploadImage(MultipartFile file,String tip, Boolean isPermanent); } diff --git a/ruoyi-system/src/main/java/com/ruoyi/im/service/FriendService.java b/ruoyi-system/src/main/java/com/ruoyi/im/service/FriendService.java index e1fb77b..4f9802e 100644 --- a/ruoyi-system/src/main/java/com/ruoyi/im/service/FriendService.java +++ b/ruoyi-system/src/main/java/com/ruoyi/im/service/FriendService.java @@ -3,8 +3,10 @@ package com.ruoyi.im.service; import com.baomidou.mybatisplus.extension.service.IService; import com.ruoyi.im.domain.Friend; import com.ruoyi.im.domain.vo.FriendVO; +import com.sun.javafx.collections.MappingChange; import java.util.List; +import java.util.Map; public interface FriendService extends IService { @@ -18,11 +20,11 @@ public interface FriendService extends IService { Boolean isFriend(Long userId1, Long userId2); /** - * 查询用户的所有好友,包括已删除的 + * 查询用户的所有好友 * * @return 好友列表 */ - List findAllFriends(); + Map findAllFriends(); /** * 查询用户的所有好友 @@ -32,12 +34,7 @@ public interface FriendService extends IService { */ List findByFriendIds(List friendIds); - /** - * 查询当前用户的所有好友 - * - * @return 好友列表 - */ - List findFriends(); + /** * 添加好友,互相建立好友关系 @@ -71,4 +68,4 @@ public interface FriendService extends IService { void bindFriend(Long userId, Long friendId); -} \ No newline at end of file +} diff --git a/ruoyi-system/src/main/java/com/ruoyi/im/service/GroupMemberService.java b/ruoyi-system/src/main/java/com/ruoyi/im/service/GroupMemberService.java new file mode 100644 index 0000000..fae9a11 --- /dev/null +++ b/ruoyi-system/src/main/java/com/ruoyi/im/service/GroupMemberService.java @@ -0,0 +1,93 @@ +package com.ruoyi.im.service; + +import com.baomidou.mybatisplus.extension.service.IService; +import com.ruoyi.im.domain.GroupMember; + +import java.util.List; + +public interface GroupMemberService extends IService { + + /** + * 根据群聊id和用户id查询群聊成员 + * + * @param groupId 群聊id + * @param userId 用户id + * @return 群聊成员信息 + */ + GroupMember findByGroupAndUserId(Long groupId, Long userId); + + + /** + * 根据用户id查询群聊成员 + * + * @param userId 用户id + * @return 成员列表 + */ + List findByUserId(Long userId); + + /** + * 根据用户id查询一个月内退的群 + * + * @param userId 用户id + * @return 成员列表 + */ + List findQuitInMonth(Long userId); + + /** + * 根据群聊id查询群聊成员(包括已退出) + * + * @param groupId 群聊id + * @return 群聊成员列表 + */ + List findByGroupId(Long groupId); + + + + /** + * 根据群聊id查询没有退出的群聊成员id + * + * @param groupId 群聊id + * @return 群聊成员id列表 + */ + List findUserIdsByGroupId(Long groupId); + + /** + * 批量添加成员 + * + * @param groupId 群聊id + * @param members 成员列表 + * @return 成功或失败 + */ + boolean saveOrUpdateBatch(Long groupId, List members); + + /** + * 根据群聊id删除移除成员 + * + * @param groupId 群聊id + */ + void removeByGroupId(Long groupId); + + /** + * 根据群聊id和用户id移除成员 + * + * @param groupId 群聊id + * @param userId 用户id + */ + void removeByGroupAndUserId(Long groupId, Long userId); + + /** + * 根据群聊id和用户id移除成员 + * + * @param groupId 群聊id + * @param userIds 用户id + */ + void removeByGroupAndUserIds(Long groupId, List userIds); + + /** + * 用户用户是否在群中 + * + * @param groupId 群聊id + * @param userIds 用户id + */ + Boolean isInGroup(Long groupId,List userIds); +} diff --git a/ruoyi-system/src/main/java/com/ruoyi/im/service/GroupMessageService.java b/ruoyi-system/src/main/java/com/ruoyi/im/service/GroupMessageService.java new file mode 100644 index 0000000..b1f3333 --- /dev/null +++ b/ruoyi-system/src/main/java/com/ruoyi/im/service/GroupMessageService.java @@ -0,0 +1,64 @@ +package com.ruoyi.im.service; + +import com.baomidou.mybatisplus.extension.service.IService; +import com.ruoyi.im.domain.GroupMessage; +import com.ruoyi.im.domain.dto.GroupMessageDTO; +import com.ruoyi.im.domain.vo.GroupMessageVO; + +import java.util.List; + +public interface GroupMessageService extends IService { + + /** + * 发送群聊消息(高并发接口,查询mysql接口都要进行缓存) + * + * @param dto 群聊消息 + * @return 群聊id + */ + GroupMessageVO sendMessage(GroupMessageDTO dto); + + /** + * 撤回消息 + * + * @param id 消息id + */ + GroupMessageVO recallMessage(Long id); + + /** + * 拉取离线消息,只能拉取最近1个月的消息,最多拉取1000条 + * + * @param minId 消息起始id + */ + void pullOfflineMessage(Long minId); + + /** + * 消息已读,同步其他终端,清空未读数量 + * + * @param groupId 群聊 + */ + void readedMessage(Long groupId); + + /** + * 查询群里消息已读用户id列表 + * @param groupId 群里id + * @param messageId 消息id + * @return 已读用户id集合 + */ + List findReadedUsers(Long groupId,Long messageId); + /** + * 拉取历史聊天记录 + * + * @param groupId 群聊id + * @param page 页码 + * @param size 页码大小 + * @return 聊天记录列表 + */ + List findHistoryMessage(Long groupId, Long page, Long size); + + /** + * 获取某个会话中已读消息的最大id + * + * @param groupId 群id + */ + String getMaxReadedId(Long groupId); +} diff --git a/ruoyi-system/src/main/java/com/ruoyi/im/service/GroupService.java b/ruoyi-system/src/main/java/com/ruoyi/im/service/GroupService.java new file mode 100644 index 0000000..7cbb487 --- /dev/null +++ b/ruoyi-system/src/main/java/com/ruoyi/im/service/GroupService.java @@ -0,0 +1,46 @@ +package com.ruoyi.im.service; + +import com.baomidou.mybatisplus.extension.service.IService; +import com.ruoyi.im.domain.Group; +import com.ruoyi.im.domain.dto.GroupInviteDTO; +import com.ruoyi.im.domain.vo.GroupVO; + +import java.util.List; + +public interface GroupService extends IService { + + /** + * 创建新群聊 + * + * @param vo 群聊信息 + * @return 群聊信息 + **/ + GroupVO createGroup(GroupVO vo); + + + /** + * 根据id查找群聊 + * + * @param groupId 群聊id + * @return 群聊vo + */ + GroupVO findById(Long groupId); + + + /** + * 查询当前用户的所有群聊 + * + * @return 群聊信息列表 + **/ + List findGroups(); + + /** + * 根据id查找群聊,并进行缓存 + * + * @param groupId 群聊id + * @return 群聊实体 + */ + Group getAndCheckById(Long groupId); + + +} diff --git a/ruoyi-system/src/main/java/com/ruoyi/im/service/PrivateMessageService.java b/ruoyi-system/src/main/java/com/ruoyi/im/service/PrivateMessageService.java index 0397a84..39f155d 100644 --- a/ruoyi-system/src/main/java/com/ruoyi/im/service/PrivateMessageService.java +++ b/ruoyi-system/src/main/java/com/ruoyi/im/service/PrivateMessageService.java @@ -7,6 +7,7 @@ import com.ruoyi.im.domain.dto.PrivateMessageDTO; import com.ruoyi.im.domain.vo.PrivateMessageVO; import java.util.List; +import java.util.Map; public interface PrivateMessageService extends IService { @@ -59,4 +60,5 @@ public interface PrivateMessageService extends IService { */ Long getMaxReadedId(Long friendId); + Map getConsultProduct(Long storeId); } diff --git a/ruoyi-system/src/main/java/com/ruoyi/im/service/impl/FileServiceImpl.java b/ruoyi-system/src/main/java/com/ruoyi/im/service/impl/FileServiceImpl.java index 1fe0543..e0a002a 100644 --- a/ruoyi-system/src/main/java/com/ruoyi/im/service/impl/FileServiceImpl.java +++ b/ruoyi-system/src/main/java/com/ruoyi/im/service/impl/FileServiceImpl.java @@ -57,7 +57,7 @@ public class FileServiceImpl extends ServiceImpl imple @Override public String uploadFile(MultipartFile file) { try { - Long userId = SecurityUtils.getUserId(); + Long userId = SecurityUtils.getAppLoginUser().getAppUserId(); // 大小校验 if (file.getSize() > Constant_im.MAX_FILE_SIZE) { throw new GlobalException(ResultCode.PROGRAM_ERROR, "文件大小不能超过20M"); @@ -77,7 +77,7 @@ public class FileServiceImpl extends ServiceImpl imple if (StringUtils.isEmpty(fileName)) { throw new GlobalException(ResultCode.PROGRAM_ERROR, "文件上传失败"); } - String url = generUrl(FileType.FILE, fileName); + String url = generUrl(FileType.FILE, fileName,"im"); // 保存文件 saveFileInfo(file, md5, url); log.info("文件文件成功,用户id:{},url:{}", userId, url); @@ -88,11 +88,18 @@ public class FileServiceImpl extends ServiceImpl imple } } + /** + * + * @param file + * @param tip "im" + * @param isPermanent + * @return + */ @Transactional @Override - public UploadImageVO uploadImage(MultipartFile file, Boolean isPermanent) { + public UploadImageVO uploadImage(MultipartFile file,String tip, Boolean isPermanent) { try { - Long userId = SecurityUtils.getUserId(); + Long userId = SecurityUtils.getAppLoginUser().getAppUserId(); // 大小校验 if (file.getSize() > Constant_im.MAX_IMAGE_SIZE) { throw new GlobalException(ResultCode.PROGRAM_ERROR, "图片大小不能超过20M"); @@ -116,25 +123,41 @@ public class FileServiceImpl extends ServiceImpl imple return vo; } // 上传原图 - String fileName = minioSerivce.upload(minioProps.getBucketName(), minioProps.getImagePath(), file); + String fileName =""; + if (tip.equals("im")){ + fileName=minioSerivce.upload(minioProps.getBucketName(), minioProps.getImagePath(), file); + } + if (tip.equals("app_avatar")){ + fileName=minioSerivce.upload("yoga-im", "app-avatar", file); + } + + if (StringUtils.isEmpty(fileName)) { throw new GlobalException(ResultCode.PROGRAM_ERROR, "图片上传失败"); } - vo.setOriginUrl(generUrl(FileType.IMAGE, fileName)); + vo.setOriginUrl(generUrl(FileType.IMAGE, fileName,tip)); if (file.getSize() > 50 * 1024) { // 大于50K的文件需上传缩略图 byte[] imageByte = ImageUtil.compressForScale(file.getBytes(), 30); - String thumbFileName = minioSerivce.upload(minioProps.getBucketName(), minioProps.getImagePath(), - file.getOriginalFilename(), imageByte, file.getContentType()); + String thumbFileName =""; + if (tip.equals("im")){ + thumbFileName= minioSerivce.upload(minioProps.getBucketName(), minioProps.getImagePath(), + file.getOriginalFilename(), imageByte, file.getContentType()); + } + if (tip.equals("app_avatar")){ + thumbFileName= minioSerivce.upload("yoga-im", "app-avatar", + file.getOriginalFilename(), imageByte, file.getContentType()); + } + if (StringUtils.isEmpty(thumbFileName)) { throw new GlobalException(ResultCode.PROGRAM_ERROR, "图片上传失败"); } - vo.setThumbUrl(generUrl(FileType.IMAGE, thumbFileName)); + vo.setThumbUrl(generUrl(FileType.IMAGE, thumbFileName,tip)); // 保存文件信息 saveImageFileInfo(file, md5, vo.getOriginUrl(), vo.getThumbUrl(), isPermanent); }else{ // 小于50k,用原图充当缩略图 - vo.setThumbUrl(generUrl(FileType.IMAGE, fileName)); + vo.setThumbUrl(generUrl(FileType.IMAGE, fileName,tip)); // 保存文件信息,由于缩略图不允许删除,此时原图也不允许删除 saveImageFileInfo(file, md5, vo.getOriginUrl(), vo.getThumbUrl(), true); } @@ -146,8 +169,15 @@ public class FileServiceImpl extends ServiceImpl imple } } - private String generUrl(FileType fileType, String fileName) { - return StrUtil.join("/", minioProps.getDomain(), minioProps.getBucketName(), getBucketPath(fileType), fileName); + private String generUrl(FileType fileType, String fileName,String tip) { +// return StrUtil.join("/", minioProps.getDomain(), minioProps.getBucketName(), getBucketPath(fileType), fileName); + if (tip.equals("im")){ + return StrUtil.join("/",minioProps.getEndpoint(), minioProps.getBucketName(), getBucketPath(fileType), fileName); + } + if (tip.equals("app_avatar")){ + return StrUtil.join("/",minioProps.getEndpoint(), "yoga-im", "app-avatar", fileName); + } + return ""; } private String getBucketPath(FileType fileType) { diff --git a/ruoyi-system/src/main/java/com/ruoyi/im/service/impl/FriendServiceImpl.java b/ruoyi-system/src/main/java/com/ruoyi/im/service/impl/FriendServiceImpl.java index 3d1659f..2696176 100644 --- a/ruoyi-system/src/main/java/com/ruoyi/im/service/impl/FriendServiceImpl.java +++ b/ruoyi-system/src/main/java/com/ruoyi/im/service/impl/FriendServiceImpl.java @@ -1,6 +1,7 @@ package com.ruoyi.im.service.impl; +import cn.hutool.core.util.ObjectUtil; import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; import com.baomidou.mybatisplus.core.conditions.update.LambdaUpdateWrapper; import com.baomidou.mybatisplus.core.toolkit.Wrappers; @@ -11,9 +12,7 @@ import com.ruoyi.common.utils.SecurityUtils; import com.ruoyi.im.domain.Friend; import com.ruoyi.im.domain.vo.FriendVO; import com.ruoyi.im.service.FriendService; -import com.ruoyi.im.mapper.PrivateMessageMapper; import com.ruoyi.im.mapper.FriendMapper; -import com.ruoyi.imclient.IMClient; import lombok.RequiredArgsConstructor; import lombok.extern.slf4j.Slf4j; import org.springframework.aop.framework.AopContext; @@ -23,7 +22,9 @@ import org.springframework.cache.annotation.Cacheable; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; +import java.util.HashMap; import java.util.List; +import java.util.Map; import java.util.Objects; import java.util.stream.Collectors; @@ -32,18 +33,32 @@ import java.util.stream.Collectors; @RequiredArgsConstructor @CacheConfig(cacheNames = RedisKey.IM_CACHE_FRIEND) public class FriendServiceImpl extends ServiceImpl implements FriendService { - private final PrivateMessageMapper privateMessageMapper; -// private final UserMapper userMapper; - private final IMClient imClient; + @Override - public List findAllFriends() { + public Map findAllFriends() { Long userId= SecurityUtils.getAppLoginUser().getAppUser().getId(); - LambdaQueryWrapper wrapper = Wrappers.lambdaQuery(); - wrapper.eq(Friend::getUserId, userId); - return this.list(wrapper); + Map> map=new HashMap<>(); + Long manageId= SecurityUtils.getAppLoginUser().getAppUser().getManageAccountId(); + if (ObjectUtil.isNotEmpty(manageId)){ + List list=baseMapper.getFriendListForManage(userId); + map.put("consumer",list); + return map; + } + + List list=baseMapper.getFriendListForConsumer(userId); + Map> friendMap = list.stream().collect(Collectors.groupingBy(Friend::getRoleId)); + + map.put("storeManager",friendMap.get(105l)); + map.put("coach",friendMap.get(104l)); + map.put("adviser",friendMap.get(103l)); + map.put("customerService",friendMap.get(108l)); + + return map; + } + @Override public List findByFriendIds(List friendIds) { Long userId= SecurityUtils.getAppLoginUser().getAppUser().getId(); @@ -54,11 +69,7 @@ public class FriendServiceImpl extends ServiceImpl impleme return this.list(wrapper); } - @Override - public List findFriends() { - List friends = this.findAllFriends(); - return friends.stream().map(this::conver).collect(Collectors.toList()); - } + @Transactional(rollbackFor = Exception.class) @Override @@ -151,7 +162,8 @@ public class FriendServiceImpl extends ServiceImpl impleme wrapper.eq(Friend::getFriendId, friendId); Friend friend = this.getOne(wrapper); if (Objects.isNull(friend)) { - throw new GlobalException("对方不是您的好友"); + addFriend(friendId); +// throw new GlobalException("对方不是您的好友"); } return conver(friend); } diff --git a/ruoyi-system/src/main/java/com/ruoyi/im/service/impl/GroupMemberServiceImpl.java b/ruoyi-system/src/main/java/com/ruoyi/im/service/impl/GroupMemberServiceImpl.java new file mode 100644 index 0000000..3156c3d --- /dev/null +++ b/ruoyi-system/src/main/java/com/ruoyi/im/service/impl/GroupMemberServiceImpl.java @@ -0,0 +1,123 @@ +package com.ruoyi.im.service.impl; + +import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; +import com.baomidou.mybatisplus.core.conditions.update.LambdaUpdateWrapper; +import com.baomidou.mybatisplus.core.toolkit.CollectionUtils; +import com.baomidou.mybatisplus.core.toolkit.Wrappers; +import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; +import com.ruoyi.common.im.constant.RedisKey; +import com.ruoyi.im.domain.GroupMember; +import com.ruoyi.im.mapper.GroupMemberMapper; +import com.ruoyi.im.service.GroupMemberService; +import com.ruoyi.im.util.DateTimeUtils; +import org.springframework.cache.annotation.CacheConfig; +import org.springframework.cache.annotation.CacheEvict; +import org.springframework.cache.annotation.Cacheable; +import org.springframework.stereotype.Service; + +import java.util.Date; +import java.util.List; +import java.util.stream.Collectors; + +@Service +@CacheConfig(cacheNames = RedisKey.IM_CACHE_GROUP_MEMBER_ID) +public class GroupMemberServiceImpl extends ServiceImpl implements GroupMemberService { + @CacheEvict(key = "#member.getGroupId()") + @Override + public boolean save(GroupMember member) { + return super.save(member); + } + + @CacheEvict(key = "#groupId") + @Override + public boolean saveOrUpdateBatch(Long groupId, List members) { + return super.saveOrUpdateBatch(members); + } + + @Override + public GroupMember findByGroupAndUserId(Long groupId, Long userId) { + LambdaQueryWrapper wrapper = Wrappers.lambdaQuery(); + wrapper.eq(GroupMember::getGroupId, groupId); + wrapper.eq(GroupMember::getUserId, userId); + return this.getOne(wrapper); + } + + + @Override + public List findByUserId(Long userId) { + LambdaQueryWrapper memberWrapper = Wrappers.lambdaQuery(); + memberWrapper.eq(GroupMember::getUserId, userId).eq(GroupMember::getQuit, false); + return this.list(memberWrapper); + } + + @Override + public List findQuitInMonth(Long userId) { + Date monthTime = DateTimeUtils.addMonths(new Date(), -1); + LambdaQueryWrapper memberWrapper = Wrappers.lambdaQuery(); + memberWrapper.eq(GroupMember::getUserId, userId).eq(GroupMember::getQuit, true) + .ge(GroupMember::getQuitTime, monthTime); + return this.list(memberWrapper); + } + + @Override + public List findByGroupId(Long groupId) { + LambdaQueryWrapper memberWrapper = Wrappers.lambdaQuery(); + memberWrapper.eq(GroupMember::getGroupId, groupId); + return this.list(memberWrapper); + } + + @Cacheable(key = "#groupId") + @Override + public List findUserIdsByGroupId(Long groupId) { + LambdaQueryWrapper memberWrapper = Wrappers.lambdaQuery(); + memberWrapper.eq(GroupMember::getGroupId, groupId).eq(GroupMember::getQuit, false) + .select(GroupMember::getUserId); + List members = this.list(memberWrapper); + return members.stream().map(GroupMember::getUserId).collect(Collectors.toList()); + } + + @CacheEvict(key = "#groupId") + @Override + public void removeByGroupId(Long groupId) { + LambdaUpdateWrapper wrapper = Wrappers.lambdaUpdate(); + wrapper.eq(GroupMember::getGroupId, groupId).set(GroupMember::getQuit, true) + .set(GroupMember::getQuitTime, new Date()); + this.update(wrapper); + } + + @CacheEvict(key = "#groupId") + @Override + public void removeByGroupAndUserId(Long groupId, Long userId) { + LambdaUpdateWrapper wrapper = Wrappers.lambdaUpdate(); + wrapper.eq(GroupMember::getGroupId, groupId); + wrapper.eq(GroupMember::getUserId, userId); + wrapper.set(GroupMember::getQuit, true); + wrapper.set(GroupMember::getQuitTime, new Date()); + this.update(wrapper); + } + + @CacheEvict(key = "#groupId") + @Override + public void removeByGroupAndUserIds(Long groupId, List userId) { + LambdaUpdateWrapper wrapper = Wrappers.lambdaUpdate(); + wrapper.eq(GroupMember::getGroupId, groupId); + wrapper.in(GroupMember::getUserId, userId); + wrapper.set(GroupMember::getQuit, true); + wrapper.set(GroupMember::getQuitTime, new Date()); + this.update(wrapper); + } + + + @Override + public Boolean isInGroup(Long groupId, List userIds) { + if (CollectionUtils.isEmpty(userIds)) { + return true; + } + LambdaQueryWrapper wrapper = Wrappers.lambdaQuery(); + wrapper.eq(GroupMember::getGroupId, groupId); + wrapper.eq(GroupMember::getQuit, false); + wrapper.in(GroupMember::getUserId, userIds); + return userIds.size() == this.count(wrapper); + } + +} diff --git a/ruoyi-system/src/main/java/com/ruoyi/im/service/impl/GroupMessageServiceImpl.java b/ruoyi-system/src/main/java/com/ruoyi/im/service/impl/GroupMessageServiceImpl.java new file mode 100644 index 0000000..014ae9d --- /dev/null +++ b/ruoyi-system/src/main/java/com/ruoyi/im/service/impl/GroupMessageServiceImpl.java @@ -0,0 +1,394 @@ +package com.ruoyi.im.service.impl; + +import cn.hutool.core.collection.CollStreamUtil; +import cn.hutool.core.collection.CollectionUtil; +import cn.hutool.core.date.DateUtil; +import cn.hutool.core.util.StrUtil; +import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; +import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; +import com.baomidou.mybatisplus.core.toolkit.Wrappers; +import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; +import com.ruoyi.common.core.domain.entity.AppUser; +import com.ruoyi.common.exception.GlobalException; +import com.ruoyi.common.im.constant.IMConstant; +import com.ruoyi.common.im.constant.RedisKey; +import com.ruoyi.common.im.enums.IMTerminalType; +import com.ruoyi.common.im.enums.MessageStatus; +import com.ruoyi.common.im.enums.MessageType; +import com.ruoyi.common.im.model.IMGroupMessage; +import com.ruoyi.common.im.model.IMUserInfo; +import com.ruoyi.common.im.util.BeanUtils; +import com.ruoyi.common.im.util.CommaTextUtils; +import com.ruoyi.common.im.util.ThreadPoolExecutorFactory; +import com.ruoyi.common.utils.SecurityUtils; +import com.ruoyi.im.domain.Group; +import com.ruoyi.im.domain.GroupMember; +import com.ruoyi.im.domain.GroupMessage; +import com.ruoyi.im.domain.PrivateMessage; +import com.ruoyi.im.domain.dto.GroupMessageDTO; +import com.ruoyi.im.domain.vo.GroupMessageVO; +import com.ruoyi.im.mapper.GroupMessageMapper; +import com.ruoyi.im.service.GroupMemberService; +import com.ruoyi.im.service.GroupMessageService; +import com.ruoyi.im.service.GroupService; +import com.ruoyi.im.util.SensitiveFilterUtil; +import com.ruoyi.imclient.IMClient; +import lombok.RequiredArgsConstructor; +import lombok.extern.slf4j.Slf4j; +import org.apache.commons.lang3.time.DateUtils; +import org.springframework.data.redis.core.RedisTemplate; +import org.springframework.stereotype.Service; +import org.springframework.transaction.annotation.Transactional; + +import java.util.*; +import java.util.concurrent.ScheduledThreadPoolExecutor; +import java.util.concurrent.atomic.AtomicInteger; +import java.util.stream.Collectors; + +@Slf4j +@Service +@RequiredArgsConstructor +public class GroupMessageServiceImpl extends ServiceImpl + implements GroupMessageService { + private final GroupService groupService; + private final GroupMemberService groupMemberService; + private final RedisTemplate redisTemplate; + private final IMClient imClient; + private final SensitiveFilterUtil sensitiveFilterUtil; + private static final ScheduledThreadPoolExecutor EXECUTOR = ThreadPoolExecutorFactory.getThreadPoolExecutor(); + + @Override + public GroupMessageVO sendMessage(GroupMessageDTO dto) { + AppUser session = SecurityUtils.getAppLoginUser().getAppUser(); + Group group = groupService.getAndCheckById(dto.getGroupId()); + // 是否在群聊里面 + GroupMember member = groupMemberService.findByGroupAndUserId(dto.getGroupId(), session.getId()); + if (Objects.isNull(member) || member.getQuit()) { + throw new GlobalException("您已不在群聊里面,无法发送消息"); + } + // 群聊成员列表 + List userIds = groupMemberService.findUserIdsByGroupId(group.getId()); + if (dto.getReceipt() && userIds.size() > 10L) { + // 大群的回执消息过于消耗资源,不允许发送 + throw new GlobalException( + String.format("当前群聊大于%s人,不支持发送回执消息", 10L)); + } + // 不用发给自己 + userIds = userIds.stream().filter(id -> !session.getId().equals(id)).collect(Collectors.toList()); + // 保存消息 + GroupMessage msg = BeanUtils.copyProperties(dto, GroupMessage.class); + msg.setSendId(session.getId()); + msg.setSendTime(new Date()); + msg.setSendNickName(member.getShowNickName()); + msg.setAtUserIds(CommaTextUtils.asText(dto.getAtUserIds())); + // 过滤内容中的敏感词 + if (MessageType.TEXT.code().equals(dto.getType())) { + msg.setContent(sensitiveFilterUtil.filter(dto.getContent())); + } + this.save(msg); + // 群发 + GroupMessageVO msgInfo = BeanUtils.copyProperties(msg, GroupMessageVO.class); + msgInfo.setAtUserIds(dto.getAtUserIds()); + IMGroupMessage sendMessage = new IMGroupMessage<>(); + sendMessage.setSender(new IMUserInfo(session.getId(), 1)); + sendMessage.setRecvIds(userIds); + sendMessage.setSendResult(false); + sendMessage.setData(msgInfo); + imClient.sendGroupMessage(sendMessage); + log.info("发送群聊消息,发送id:{},群聊id:{},内容:{}", session.getId(), dto.getGroupId(), dto.getContent()); + return msgInfo; + } + + @Transactional + @Override + public GroupMessageVO recallMessage(Long id) { + GroupMessage msg = this.getById(id); + if (Objects.isNull(msg)) { + throw new GlobalException("消息不存在"); + } + if (!msg.getSendId().equals(SecurityUtils.getAppLoginUser().getAppUserId())) { + throw new GlobalException("这条消息不是由您发送,无法撤回"); + } + if (System.currentTimeMillis() - msg.getSendTime().getTime() > IMConstant.ALLOW_RECALL_SECOND * 1000) { + throw new GlobalException("消息已发送超过5分钟,无法撤回"); + } + // 判断是否在群里 + GroupMember member = groupMemberService.findByGroupAndUserId(msg.getGroupId(), SecurityUtils.getAppLoginUser().getAppUserId()); + if (Objects.isNull(member) || Boolean.TRUE.equals(member.getQuit())) { + throw new GlobalException("您已不在群聊里面,无法撤回消息"); + } + // 修改数据库 + msg.setStatus(MessageStatus.RECALL.code()); + this.updateById(msg); + // 生成一条撤回消息 + GroupMessage recallMsg = new GroupMessage(); + recallMsg.setStatus(MessageStatus.UNSEND.code()); + recallMsg.setType(MessageType.RECALL.code()); + recallMsg.setGroupId(msg.getGroupId()); + recallMsg.setSendId(SecurityUtils.getAppLoginUser().getAppUserId()); + recallMsg.setSendNickName(member.getShowNickName()); + recallMsg.setContent(id.toString()); + recallMsg.setSendTime(new Date()); + this.save(recallMsg); + // 群发 + List userIds = groupMemberService.findUserIdsByGroupId(msg.getGroupId()); + GroupMessageVO msgInfo = BeanUtils.copyProperties(recallMsg, GroupMessageVO.class); + IMGroupMessage sendMessage = new IMGroupMessage<>(); + sendMessage.setSender(new IMUserInfo(SecurityUtils.getAppLoginUser().getAppUserId(), 1)); + sendMessage.setRecvIds(userIds); + sendMessage.setData(msgInfo); + imClient.sendGroupMessage(sendMessage); + log.info("撤回群聊消息,发送id:{},群聊id:{},内容:{}", SecurityUtils.getAppLoginUser().getAppUserId(), msg.getGroupId(), msg.getContent()); + return msgInfo; + } + + @Override + public void pullOfflineMessage(Long minId) { + if (!imClient.isOnline(SecurityUtils.getAppLoginUser().getAppUserId())) { + throw new GlobalException("网络连接失败,无法拉取离线消息"); + } + // 查询用户加入的群组 + List members = groupMemberService.findByUserId(SecurityUtils.getAppLoginUser().getAppUserId()); + Map groupMemberMap = CollStreamUtil.toIdentityMap(members, GroupMember::getGroupId); + Set groupIds = groupMemberMap.keySet(); + if (CollectionUtil.isEmpty(groupIds)) { + // 关闭加载中标志 + this.sendLoadingMessage(false); + return; + } + + // 只能拉取最近3个月的,移动端只拉最近一个月 + int months = new Integer(1).equals(IMTerminalType.APP.code()) ? 1 : 3; + Date minDate = DateUtils.addMonths(new Date(), -months); + LambdaQueryWrapper wrapper = Wrappers.lambdaQuery(); + wrapper.gt(GroupMessage::getId, minId) + .gt(GroupMessage::getSendTime, minDate) + .in(GroupMessage::getGroupId, groupIds) + .orderByAsc(GroupMessage::getId); + List messages = this.list(wrapper); + // 通过群聊对消息进行分组 + Map> messageGroupMap = + messages.stream().collect(Collectors.groupingBy(GroupMessage::getGroupId)); + // 退群前的消息 + List quitMembers = groupMemberService.findQuitInMonth(SecurityUtils.getAppLoginUser().getAppUserId()); + for (GroupMember quitMember : quitMembers) { + wrapper = Wrappers.lambdaQuery(); + wrapper.gt(GroupMessage::getId, minId).between(GroupMessage::getSendTime, minDate, quitMember.getQuitTime()) + .eq(GroupMessage::getGroupId, quitMember.getGroupId()) + .ne(GroupMessage::getStatus, MessageStatus.RECALL.code()).orderByAsc(GroupMessage::getId); + List groupMessages = this.list(wrapper); + messageGroupMap.put(quitMember.getGroupId(), groupMessages); + groupMemberMap.put(quitMember.getGroupId(), quitMember); + } + EXECUTOR.execute(() -> { + // 开启加载中标志 + this.sendLoadingMessage(true); + // 推送消息 + AtomicInteger sendCount = new AtomicInteger(); + messageGroupMap.forEach((groupId, groupMessages) -> { + // 第一次拉取时,一个群最多推送1w条消息,防止前端接收能力溢出导致卡顿 + List sendMessages = groupMessages; + if (minId <= 0 && groupMessages.size() > 10000) { + sendMessages = groupMessages.subList(groupMessages.size() - 10000, groupMessages.size()); + } + // 填充消息状态 + String key = StrUtil.join(":", RedisKey.IM_GROUP_READED_POSITION, groupId); + Object o = redisTemplate.opsForHash().get(key, SecurityUtils.getAppLoginUser().getAppUserId().toString()); + long readedMaxId = Objects.isNull(o) ? -1 : Long.parseLong(o.toString()); + Map maxIdMap = null; + for (GroupMessage m : sendMessages) { + // 排除加群之前的消息 + GroupMember member = groupMemberMap.get(m.getGroupId()); + if (DateUtil.compare(member.getCreatedTime(), m.getSendTime()) > 0) { + continue; + } + // 排除不需要接收的消息 + List recvIds = CommaTextUtils.asList(m.getRecvIds()); + if (!recvIds.isEmpty() && !recvIds.contains(SecurityUtils.getAppLoginUser().getAppUserId().toString())) { + continue; + } + // 组装vo + GroupMessageVO vo = BeanUtils.copyProperties(m, GroupMessageVO.class); + // 被@用户列表 + List atIds = CommaTextUtils.asList(m.getAtUserIds()); + vo.setAtUserIds(atIds.stream().map(Long::parseLong).collect(Collectors.toList())); + // 填充状态 + vo.setStatus(readedMaxId >= m.getId() ? MessageStatus.READED.code() : MessageStatus.UNSEND.code()); + // 针对回执消息填充已读人数 + if (m.getReceipt()) { + if (Objects.isNull(maxIdMap)) { + maxIdMap = redisTemplate.opsForHash().entries(key); + } + int count = getReadedUserIds(maxIdMap, m.getId(), m.getSendId()).size(); + vo.setReadedCount(count); + } + // 推送 + IMGroupMessage sendMessage = new IMGroupMessage<>(); + sendMessage.setSender(new IMUserInfo(m.getSendId(), IMTerminalType.WEB.code())); + sendMessage.setRecvIds(Arrays.asList(SecurityUtils.getAppLoginUser().getAppUserId())); + sendMessage.setRecvTerminals(Arrays.asList(1)); + sendMessage.setSendResult(false); + sendMessage.setSendToSelf(false); + sendMessage.setData(vo); + imClient.sendGroupMessage(sendMessage); + sendCount.getAndIncrement(); + } + }); + // 关闭加载中标志 + this.sendLoadingMessage(false); + log.info("拉取离线群聊消息,用户id:{},数量:{}",SecurityUtils.getAppLoginUser().getAppUserId(), sendCount.get()); + }); + } + + @Override + public void readedMessage(Long groupId) { + // 取出最后的消息id + LambdaQueryWrapper wrapper = Wrappers.lambdaQuery(); + wrapper.eq(GroupMessage::getGroupId, groupId).orderByDesc(GroupMessage::getId).last("limit 1") + .select(GroupMessage::getId); + GroupMessage message = this.getOne(wrapper); + if (Objects.isNull(message)) { + return; + } + // 推送消息给自己的其他终端,同步清空会话列表中的未读数量 + GroupMessageVO msgInfo = new GroupMessageVO(); + msgInfo.setType(MessageType.READED.code()); + msgInfo.setSendTime(new Date()); + msgInfo.setSendId(SecurityUtils.getAppLoginUser().getAppUserId()); + msgInfo.setGroupId(groupId); + IMGroupMessage sendMessage = new IMGroupMessage<>(); + sendMessage.setSender(new IMUserInfo(SecurityUtils.getAppLoginUser().getAppUserId(), 1)); + sendMessage.setSendToSelf(true); + sendMessage.setData(msgInfo); + sendMessage.setSendResult(true); + imClient.sendGroupMessage(sendMessage); + // 已读消息key + String key = StrUtil.join(":", RedisKey.IM_GROUP_READED_POSITION, groupId); + // 原来的已读消息位置 + Object maxReadedId = redisTemplate.opsForHash().get(key,SecurityUtils.getAppLoginUser().getAppUserId().toString()); + // 记录已读消息位置 + redisTemplate.opsForHash().put(key, SecurityUtils.getAppLoginUser().getAppUserId().toString(), message.getId()); + // 推送消息回执,刷新已读人数显示 + wrapper = Wrappers.lambdaQuery(); + wrapper.eq(GroupMessage::getGroupId, groupId); + wrapper.gt(!Objects.isNull(maxReadedId), GroupMessage::getId, maxReadedId); + wrapper.le(!Objects.isNull(maxReadedId), GroupMessage::getId, message.getId()); + wrapper.ne(GroupMessage::getStatus, MessageStatus.RECALL.code()); + wrapper.eq(GroupMessage::getReceipt, true); + List receiptMessages = this.list(wrapper); + if (CollectionUtil.isNotEmpty(receiptMessages)) { + List userIds = groupMemberService.findUserIdsByGroupId(groupId); + Map maxIdMap = redisTemplate.opsForHash().entries(key); + for (GroupMessage receiptMessage : receiptMessages) { + Integer readedCount = + getReadedUserIds(maxIdMap, receiptMessage.getId(), receiptMessage.getSendId()).size(); + // 如果所有人都已读,记录回执消息完成标记 + if (readedCount >= userIds.size() - 1) { + receiptMessage.setReceiptOk(true); + this.updateById(receiptMessage); + } + msgInfo = new GroupMessageVO(); + msgInfo.setId(receiptMessage.getId()); + msgInfo.setGroupId(groupId); + msgInfo.setReadedCount(readedCount); + msgInfo.setReceiptOk(receiptMessage.getReceiptOk()); + msgInfo.setType(MessageType.RECEIPT.code()); + sendMessage = new IMGroupMessage<>(); + sendMessage.setSender(new IMUserInfo(SecurityUtils.getAppLoginUser().getAppUserId(), 1)); + sendMessage.setRecvIds(userIds); + sendMessage.setData(msgInfo); + sendMessage.setSendToSelf(false); + sendMessage.setSendResult(false); + imClient.sendGroupMessage(sendMessage); + } + } + } + + @Override + public List findReadedUsers(Long groupId, Long messageId) { + GroupMessage message = this.getById(messageId); + if (Objects.isNull(message)) { + throw new GlobalException("消息不存在"); + } + // 是否在群聊里面 + GroupMember member = groupMemberService.findByGroupAndUserId(groupId, SecurityUtils.getAppLoginUser().getAppUserId()); + if (Objects.isNull(member) || member.getQuit()) { + throw new GlobalException("您已不在群聊里面"); + } + // 已读位置key + String key = StrUtil.join(":", RedisKey.IM_GROUP_READED_POSITION, groupId); + // 一次获取所有用户的已读位置 + Map maxIdMap = redisTemplate.opsForHash().entries(key); + // 返回已读用户的id集合 + return getReadedUserIds(maxIdMap, message.getId(), message.getSendId()); + } + + @Override + public List findHistoryMessage(Long groupId, Long page, Long size) { + page = page > 0 ? page : 1; + size = size > 0 ? size : 10; + Long userId = SecurityUtils.getAppLoginUser().getAppUserId(); + long stIdx = (page - 1) * size; + // 群聊成员信息 + GroupMember member = groupMemberService.findByGroupAndUserId(groupId, userId); + if (Objects.isNull(member) || member.getQuit()) { + throw new GlobalException("您已不在群聊中"); + } + // 查询聊天记录,只查询加入群聊时间之后的消息 + QueryWrapper wrapper = new QueryWrapper<>(); + wrapper.lambda().eq(GroupMessage::getGroupId, groupId).gt(GroupMessage::getSendTime, member.getCreatedTime()) + .ne(GroupMessage::getStatus, MessageStatus.RECALL.code()).orderByDesc(GroupMessage::getId) + .last("limit " + stIdx + "," + size); + List messages = this.list(wrapper); + List messageInfos = + messages.stream().map(m -> BeanUtils.copyProperties(m, GroupMessageVO.class)).collect(Collectors.toList()); + log.info("拉取群聊记录,用户id:{},群聊id:{},数量:{}", userId, groupId, messageInfos.size()); + return messageInfos; + } + + private List getReadedUserIds(Map maxIdMap, Long messageId, Long sendId) { + List userIds = new LinkedList<>(); + maxIdMap.forEach((k, v) -> { + Long userId = Long.valueOf(k.toString()); + long maxId = Long.parseLong(v.toString()); + // 发送者不计入已读人数 + if (!sendId.equals(userId) && maxId >= messageId) { + userIds.add(userId); + } + }); + return userIds; + } + + private void sendLoadingMessage(Boolean isLoadding) { + GroupMessageVO msgInfo = new GroupMessageVO(); + msgInfo.setType(MessageType.LOADING.code()); + msgInfo.setContent(isLoadding.toString()); + IMGroupMessage sendMessage = new IMGroupMessage<>(); + sendMessage.setSender(new IMUserInfo(SecurityUtils.getAppLoginUser().getAppUserId(), 1)); + sendMessage.setRecvIds(Arrays.asList(SecurityUtils.getAppLoginUser().getAppUserId())); + sendMessage.setRecvTerminals(Arrays.asList(1)); + sendMessage.setData(msgInfo); + sendMessage.setSendToSelf(false); + sendMessage.setSendResult(false); + imClient.sendGroupMessage(sendMessage); + } + + @Override + public String getMaxReadedId(Long groupId) { + // 已读消息key + String key = StrUtil.join(":", RedisKey.IM_GROUP_READED_POSITION, groupId); + // 原来的已读消息位置 + Object maxReadedId = redisTemplate.opsForHash().get(key,SecurityUtils.getAppLoginUser().getAppUserId().toString()); +// LambdaQueryWrapper wrapper = Wrappers.lambdaQuery(); +// wrapper +//// .eq(GroupMessage::getRecvId, session.getId()) +// .eq(GroupMessage::getGroupId, groupId) +// .eq(GroupMessage::getStatus, MessageStatus.READED.code()).orderByDesc(GroupMessage::getId) +// .select(GroupMessage::getId).last("limit 1"); +// GroupMessage message = this.getOne(wrapper); +// if (Objects.isNull(message)) { +// return -1L; +// } + return maxReadedId.toString(); + } +} diff --git a/ruoyi-system/src/main/java/com/ruoyi/im/service/impl/GroupServiceImpl.java b/ruoyi-system/src/main/java/com/ruoyi/im/service/impl/GroupServiceImpl.java new file mode 100644 index 0000000..452ca76 --- /dev/null +++ b/ruoyi-system/src/main/java/com/ruoyi/im/service/impl/GroupServiceImpl.java @@ -0,0 +1,228 @@ +package com.ruoyi.im.service.impl; + +import cn.hutool.core.collection.CollUtil; +import cn.hutool.core.util.ObjectUtil; +import cn.hutool.core.util.StrUtil; +import com.alibaba.fastjson2.JSON; +import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; +import com.baomidou.mybatisplus.core.toolkit.Wrappers; +import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; +import com.ruoyi.basic.service.YjAppUserService; +import com.ruoyi.common.core.domain.entity.AppUser; +import com.ruoyi.common.exception.GlobalException; +import com.ruoyi.common.im.constant.RedisKey; +import com.ruoyi.common.im.enums.MessageStatus; +import com.ruoyi.common.im.enums.MessageType; +import com.ruoyi.common.im.model.IMGroupMessage; +import com.ruoyi.common.im.model.IMUserInfo; +import com.ruoyi.common.im.util.BeanUtils; +import com.ruoyi.common.im.util.CommaTextUtils; +import com.ruoyi.common.utils.SecurityUtils; +import com.ruoyi.im.domain.Friend; +import com.ruoyi.im.domain.Group; +import com.ruoyi.im.domain.GroupMember; +import com.ruoyi.im.domain.GroupMessage; +import com.ruoyi.im.domain.dto.GroupInviteDTO; +import com.ruoyi.im.domain.vo.GroupMessageVO; +import com.ruoyi.im.domain.vo.GroupVO; +import com.ruoyi.im.mapper.GroupMapper; +import com.ruoyi.im.mapper.GroupMessageMapper; +import com.ruoyi.im.service.FriendService; +import com.ruoyi.im.service.GroupMemberService; +import com.ruoyi.im.service.GroupService; +import com.ruoyi.imclient.IMClient; +import lombok.RequiredArgsConstructor; +import lombok.extern.slf4j.Slf4j; +import org.apache.commons.compress.utils.Lists; +import org.springframework.cache.annotation.CacheConfig; +import org.springframework.cache.annotation.CacheEvict; +import org.springframework.cache.annotation.Cacheable; +import org.springframework.data.redis.core.RedisTemplate; +import org.springframework.stereotype.Service; +import org.springframework.transaction.annotation.Transactional; + +import java.util.*; +import java.util.stream.Collectors; + +@Slf4j +@Service +@RequiredArgsConstructor +@CacheConfig(cacheNames = RedisKey.IM_CACHE_GROUP) +public class GroupServiceImpl extends ServiceImpl implements GroupService { + private final YjAppUserService userService; + private final GroupMemberService groupMemberService; + private final GroupMessageMapper groupMessageMapper; + private final IMClient imClient; + + @Override + @Transactional + public GroupVO createGroup(GroupVO vo) { + AppUser user = SecurityUtils.getAppLoginUser().getAppUser(); + //沟通群是否存在 + Long groupId= this.baseMapper.groupExist(user.getId(),vo.getCustomerService(),vo.getInstructor()); + if (ObjectUtil.isNotEmpty(groupId)){ + return findById(groupId); + } + + //建群 + AppUser customer=userService.getById(vo.getCustomerService()) ; + if (ObjectUtil.isEmpty(customer)){ + throw new GlobalException("客服信息失效,跳转失败"); + } + AppUser instructor=userService.getById(vo.getInstructor()) ; + if (ObjectUtil.isEmpty(instructor)){ + throw new GlobalException("教练信息失效,跳转失败"); + } + + // 保存群组数据 + Group group = BeanUtils.copyProperties(vo, Group.class); + group.setName(vo.getProductName()+" - "+user.getNickName()+"群"); + group.setOwnerId(user.getId()); + this.save(group); + + // 把群主加入群 + addMember(group.getId(),user); + + //课程顾问 + addMember(group.getId(),customer); + + //教练 + addMember(group.getId(),instructor); + + + GroupVO groupVo = findById(group.getId()); + // 推送同步消息给自己的其他终端 + // sendAddGroupMessage(groupVo, Lists.newArrayList(), true); + // 推送进入群聊消息 + List userIds = groupMemberService.findUserIdsByGroupId(group.getId()); + String content = String.format("'%s'邀请'%s'加入了群聊" + , user.getNickName() + , customer.getNickName()+","+instructor.getNickName()); + this.sendTipMessage(group.getId(), userIds, content, true); + // 返回 + log.info("创建群聊,群聊id:{},群聊名称:{}", group.getId(), group.getName()); + return groupVo; + } + + void addMember(Long groupId,AppUser user){ + GroupMember member = new GroupMember(); + member.setGroupId(groupId); + member.setUserId(user.getId()); + member.setHeadImage(user.getAvatar()); + member.setUserNickName(user.getNickName()); + member.setRemarkNickName(user.getNickName()); + member.setRemarkGroupName(user.getNickName()); + member.setCreatedTime(new Date()); + member.setQuit(false); + groupMemberService.save(member); + } + + + @Override + public GroupVO findById(Long groupId) { + Group group = super.getById(groupId); + if (Objects.isNull(group)) { + throw new GlobalException("群组不存在"); + } + GroupMember member = groupMemberService.findByGroupAndUserId(groupId, SecurityUtils.getAppLoginUser().getAppUserId()); + if (Objects.isNull(member)) { + throw new GlobalException("您未加入群聊"); + } + return convert(group, member); + } + + + @Override + public List findGroups() { + // 查询当前用户的群id列表 + List groupMembers = groupMemberService.findByUserId(SecurityUtils.getAppLoginUser().getAppUserId()); + // 一个月内退的群可能存在退群前的离线消息,一并返回作为前端缓存 + groupMembers.addAll(groupMemberService.findQuitInMonth(SecurityUtils.getAppLoginUser().getAppUserId())); + if (groupMembers.isEmpty()) { + return new LinkedList<>(); + } + // 拉取群列表 + List ids = groupMembers.stream().map((GroupMember::getGroupId)).collect(Collectors.toList()); + LambdaQueryWrapper groupWrapper = Wrappers.lambdaQuery(); + groupWrapper.in(Group::getId, ids); + List groups = this.list(groupWrapper); + // 转vo + return groups.stream().map(group -> { + GroupMember member = + groupMembers.stream().filter(m -> group.getId().equals(m.getGroupId())).findFirst().get(); + return convert(group, member); + }).collect(Collectors.toList()); + } + @Cacheable(key = "#groupId") + @Override + public Group getAndCheckById(Long groupId) { + Group group = super.getById(groupId); + if (Objects.isNull(group)) { + throw new GlobalException("群组不存在"); + } + if (group.getDissolve()) { + throw new GlobalException("群组'" + group.getName() + "'已解散"); + } + if (group.getIsBanned()) { + throw new GlobalException("群组'" + group.getName() + "'已被封禁,原因:" + group.getReason()); + } + return group; + } + + private void sendTipMessage(Long groupId, List recvIds, String content, Boolean sendToAll) { + AppUser session = SecurityUtils.getAppLoginUser().getAppUser(); + // 消息入库 + GroupMessage message = new GroupMessage(); + message.setContent(content); + message.setType(MessageType.TIP_TEXT.code()); + message.setStatus(MessageStatus.UNSEND.code()); + message.setSendTime(new Date()); + message.setSendNickName(session.getNickName()); + message.setGroupId(groupId); + message.setSendId(session.getId()); + message.setRecvIds(sendToAll ? "" : CommaTextUtils.asText(recvIds)); + groupMessageMapper.insert(message); + // 推送 + GroupMessageVO msgInfo = BeanUtils.copyProperties(message, GroupMessageVO.class); + IMGroupMessage sendMessage = new IMGroupMessage<>(); + sendMessage.setSender(new IMUserInfo(session.getId(), 1)); + if (CollUtil.isEmpty(recvIds)) { + // 为空表示向全体发送 + List userIds = groupMemberService.findUserIdsByGroupId(groupId); + sendMessage.setRecvIds(userIds); + } else { + sendMessage.setRecvIds(recvIds); + } + sendMessage.setData(msgInfo); + sendMessage.setSendResult(false); + sendMessage.setSendToSelf(false); + imClient.sendGroupMessage(sendMessage); + } + + private GroupVO convert(Group group, GroupMember member) { + GroupVO vo = BeanUtils.copyProperties(group, GroupVO.class); + vo.setRemarkGroupName(member.getRemarkGroupName()); + vo.setRemarkNickName(member.getRemarkNickName()); + vo.setShowNickName(member.getShowNickName()); + vo.setShowGroupName(StrUtil.blankToDefault(member.getRemarkGroupName(), group.getName())); + vo.setQuit(member.getQuit()); + return vo; + } + + private void sendAddGroupMessage(GroupVO group, List recvIds, Boolean sendToSelf) { + GroupMessageVO msgInfo = new GroupMessageVO(); + msgInfo.setContent(JSON.toJSONString(group)); + msgInfo.setType(MessageType.GROUP_NEW.code()); + msgInfo.setSendTime(new Date()); + msgInfo.setGroupId(group.getId()); + msgInfo.setSendId(SecurityUtils.getAppLoginUser().getAppUserId()); + IMGroupMessage sendMessage = new IMGroupMessage<>(); + sendMessage.setSender(new IMUserInfo(SecurityUtils.getAppLoginUser().getAppUserId(), 1)); + sendMessage.setRecvIds(recvIds); + sendMessage.setData(msgInfo); + sendMessage.setSendResult(false); + sendMessage.setSendToSelf(sendToSelf); + imClient.sendGroupMessage(sendMessage); + } + +} diff --git a/ruoyi-system/src/main/java/com/ruoyi/im/service/impl/PrivateMessageServiceImpl.java b/ruoyi-system/src/main/java/com/ruoyi/im/service/impl/PrivateMessageServiceImpl.java index 17e7b91..8392a26 100644 --- a/ruoyi-system/src/main/java/com/ruoyi/im/service/impl/PrivateMessageServiceImpl.java +++ b/ruoyi-system/src/main/java/com/ruoyi/im/service/impl/PrivateMessageServiceImpl.java @@ -26,15 +26,27 @@ import com.ruoyi.im.service.FriendService; import com.ruoyi.im.service.PrivateMessageService; import com.ruoyi.im.util.SensitiveFilterUtil; import com.ruoyi.imclient.IMClient; +import com.ruoyi.mall.domain.MemberCart; +import com.ruoyi.mall.domain.Product; +import com.ruoyi.mall.domain.UserFavorite; +import com.ruoyi.mall.domain.order.OrderItem; +import com.ruoyi.mall.domain.vo.AppOrderVO; +import com.ruoyi.mall.domain.vo.MemberCartVO; +import com.ruoyi.mall.mapper.MemberCartMapper; +import com.ruoyi.mall.mapper.OrderItemMapper; +import com.ruoyi.mall.mapper.UserFavoriteMapper; +import com.ruoyi.mall.service.UserFavoriteService; +import com.ruoyi.mall.service.impl.MemberCartService; +import com.ruoyi.mall.service.impl.OrderItemService; +import com.ruoyi.mall.service.impl.OrderService; import lombok.RequiredArgsConstructor; import lombok.extern.slf4j.Slf4j; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.data.domain.PageImpl; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; -import java.util.ArrayList; -import java.util.Date; -import java.util.List; -import java.util.Objects; +import java.util.*; import java.util.concurrent.ScheduledThreadPoolExecutor; import java.util.stream.Collectors; @@ -52,9 +64,11 @@ public class PrivateMessageServiceImpl extends ServiceImpl wp.eq(PrivateMessage::getSendId, session.getId()).or() .eq(PrivateMessage::getRecvId, session.getId())); wrapper.orderByAsc(PrivateMessage::getId); @@ -180,31 +195,32 @@ public class PrivateMessageServiceImpl extends ServiceImpl sendMessage = new IMPrivateMessage<>(); sendMessage.setData(msgInfo); - sendMessage.setSender(new IMUserInfo(session.getId(), 1)); + sendMessage.setSender(new IMUserInfo(friendId, 1)); sendMessage.setSendToSelf(true); sendMessage.setSendResult(false); imClient.sendPrivateMessage(sendMessage); // 推送回执消息给对方,更新已读状态 msgInfo = new PrivateMessageVO(); msgInfo.setType(MessageType.RECEIPT.code()); - msgInfo.setSendId(session.getId()); - msgInfo.setRecvId(friendId); + msgInfo.setSendId(friendId); + msgInfo.setRecvId(session.getId()); sendMessage = new IMPrivateMessage<>(); - sendMessage.setSender(new IMUserInfo(session.getId(), 1)); - sendMessage.setRecvId(friendId); + sendMessage.setSender(new IMUserInfo(friendId, 1)); + sendMessage.setRecvId(session.getId()); sendMessage.setSendToSelf(false); sendMessage.setSendResult(false); sendMessage.setData(msgInfo); imClient.sendPrivateMessage(sendMessage); // 修改消息状态为已读 LambdaUpdateWrapper updateWrapper = Wrappers.lambdaUpdate(); - updateWrapper.eq(PrivateMessage::getSendId, friendId).eq(PrivateMessage::getRecvId, session.getId()) - .eq(PrivateMessage::getStatus, MessageStatus.SENDED.code()) - .set(PrivateMessage::getStatus, MessageStatus.READED.code()); + updateWrapper.eq(PrivateMessage::getSendId,friendId) + .eq(PrivateMessage::getRecvId, session.getId()) + .eq(PrivateMessage::getStatus, MessageStatus.SENDED.code()) + .set(PrivateMessage::getStatus, MessageStatus.READED.code()); this.update(updateWrapper); log.info("消息已读,接收方id:{},发送方id:{}", session.getId(), friendId); } @@ -213,8 +229,11 @@ public class PrivateMessageServiceImpl extends ServiceImpl wrapper = Wrappers.lambdaQuery(); - wrapper.eq(PrivateMessage::getSendId, session.getId()).eq(PrivateMessage::getRecvId, friendId) - .eq(PrivateMessage::getStatus, MessageStatus.READED.code()).orderByDesc(PrivateMessage::getId) + wrapper + .eq(PrivateMessage::getSendId, friendId) + .eq(PrivateMessage::getRecvId, session.getId()) + .eq(PrivateMessage::getStatus, MessageStatus.READED.code()) + .orderByDesc(PrivateMessage::getId) .select(PrivateMessage::getId).last("limit 1"); PrivateMessage message = this.getOne(wrapper); if (Objects.isNull(message)) { @@ -222,6 +241,31 @@ public class PrivateMessageServiceImpl extends ServiceImpl(); + //订单 + List orderItems= orderItemMapper.getList(storeId,userId); + // /购物车 + List cartList=cartMapper.getList(userId,storeId); + + // /收藏 + List favorites=favoriteMapper.getFavoriteList(userId,storeId); + map.put("order",orderItems); + map.put("cartList",cartList); + map.put("favorites",favorites); + + return map; + } private void sendLoadingMessage(Boolean isLoadding, AppUser session) { PrivateMessageVO msgInfo = new PrivateMessageVO(); diff --git a/ruoyi-system/src/main/java/com/ruoyi/mall/domain/MemberAddress.java b/ruoyi-system/src/main/java/com/ruoyi/mall/domain/MemberAddress.java index b9d7a28..3ec7fc5 100644 --- a/ruoyi-system/src/main/java/com/ruoyi/mall/domain/MemberAddress.java +++ b/ruoyi-system/src/main/java/com/ruoyi/mall/domain/MemberAddress.java @@ -4,6 +4,8 @@ import com.baomidou.mybatisplus.annotation.IdType; import com.baomidou.mybatisplus.annotation.TableId; import com.baomidou.mybatisplus.annotation.TableName; import com.fasterxml.jackson.annotation.JsonFormat; +import com.fasterxml.jackson.databind.annotation.JsonSerialize; +import com.fasterxml.jackson.databind.ser.std.ToStringSerializer; import com.ruoyi.basic.domain.model.BaseAudit; import com.ruoyi.common.annotation.Excel; import io.swagger.annotations.ApiModelProperty; @@ -29,6 +31,7 @@ public class MemberAddress extends BaseAudit implements Serializable { private static final long serialVersionUID=1L; @TableId(value = "id", type = IdType.ASSIGN_ID) + @JsonSerialize(using = ToStringSerializer.class) private Long id; /** diff --git a/ruoyi-system/src/main/java/com/ruoyi/mall/domain/MemberCart.java b/ruoyi-system/src/main/java/com/ruoyi/mall/domain/MemberCart.java index b47e709..26cbf62 100644 --- a/ruoyi-system/src/main/java/com/ruoyi/mall/domain/MemberCart.java +++ b/ruoyi-system/src/main/java/com/ruoyi/mall/domain/MemberCart.java @@ -15,7 +15,7 @@ import lombok.Data; @ApiModel(description="购物车对象") @Data @TableName("mall_member_cart") -public class MemberCart extends BaseAudit { +public class MemberCart extends BaseAudit { private static final long serialVersionUID = 1L; @ApiModelProperty("购物车表ID") @@ -52,8 +52,12 @@ public class MemberCart extends BaseAudit { @ApiModelProperty("商品数量") @Excel(name = "商品数量") private Integer quantity; +// +// // 商品单位 +// private String unit; +// - // 0->商品;1->课程 - private Integer isCourse; + + private Long storeId; } diff --git a/ruoyi-system/src/main/java/com/ruoyi/mall/domain/Product.java b/ruoyi-system/src/main/java/com/ruoyi/mall/domain/Product.java index b9a8858..87c0cf5 100644 --- a/ruoyi-system/src/main/java/com/ruoyi/mall/domain/Product.java +++ b/ruoyi-system/src/main/java/com/ruoyi/mall/domain/Product.java @@ -1,5 +1,6 @@ package com.ruoyi.mall.domain; +import com.baomidou.mybatisplus.annotation.TableField; import com.baomidou.mybatisplus.annotation.TableName; import com.ruoyi.basic.domain.model.BaseAudit; import com.ruoyi.common.annotation.Excel; @@ -75,5 +76,17 @@ public class Product extends BaseAudit { private Integer isCourse; private Long courseId; + /** + * 客服id + */ + private Long customerService; + /** + * 教练id + */ + private Long instructor; + private Long storeId; + + @TableField(exist = false) + private String storeName; } diff --git a/ruoyi-system/src/main/java/com/ruoyi/mall/domain/ProductAssociation.java b/ruoyi-system/src/main/java/com/ruoyi/mall/domain/ProductAssociation.java new file mode 100644 index 0000000..474e2ad --- /dev/null +++ b/ruoyi-system/src/main/java/com/ruoyi/mall/domain/ProductAssociation.java @@ -0,0 +1,20 @@ +package com.ruoyi.mall.domain; + +import com.baomidou.mybatisplus.annotation.IdType; +import com.baomidou.mybatisplus.annotation.TableId; +import com.baomidou.mybatisplus.annotation.TableName; +import lombok.Data; + +/** + * 商品关联 + */ +@Data +@TableName("product_ssociation") +public class ProductAssociation { + @TableId(value = "id", type = IdType.ASSIGN_ID) + private Long id; + private Long sourceProductId; + private Long targetProductId; + private Double score; // 关联强度分数 + private String associationType; // 关联类型 +} diff --git a/ruoyi-system/src/main/java/com/ruoyi/mall/domain/Sku.java b/ruoyi-system/src/main/java/com/ruoyi/mall/domain/Sku.java index c54f5df..bd92379 100644 --- a/ruoyi-system/src/main/java/com/ruoyi/mall/domain/Sku.java +++ b/ruoyi-system/src/main/java/com/ruoyi/mall/domain/Sku.java @@ -40,5 +40,7 @@ public class Sku extends BaseAudit { @ApiModelProperty("库存数") private Integer stock; + private String unit; + } diff --git a/ruoyi-system/src/main/java/com/ruoyi/mall/domain/UserBehavior.java b/ruoyi-system/src/main/java/com/ruoyi/mall/domain/UserBehavior.java new file mode 100644 index 0000000..a96e010 --- /dev/null +++ b/ruoyi-system/src/main/java/com/ruoyi/mall/domain/UserBehavior.java @@ -0,0 +1,22 @@ +package com.ruoyi.mall.domain; + +import com.baomidou.mybatisplus.annotation.IdType; +import com.baomidou.mybatisplus.annotation.TableId; +import com.baomidou.mybatisplus.annotation.TableName; +import lombok.Data; + +import java.time.LocalDateTime; + +/** + * 用户行为(关联搜索及推荐商品用) + */ +@Data +@TableName("User_behavior") +public class UserBehavior { + @TableId(value = "id", type = IdType.ASSIGN_ID) + private Long id; + private Long userId; + private Long productId; + private String behaviorType; // 1.浏览、2.购买、3.收藏等 + private LocalDateTime timestamp; +} diff --git a/ruoyi-system/src/main/java/com/ruoyi/mall/domain/UserFavorite.java b/ruoyi-system/src/main/java/com/ruoyi/mall/domain/UserFavorite.java new file mode 100644 index 0000000..0541967 --- /dev/null +++ b/ruoyi-system/src/main/java/com/ruoyi/mall/domain/UserFavorite.java @@ -0,0 +1,35 @@ +package com.ruoyi.mall.domain; + +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 lombok.Data; +import org.apache.ibatis.mapping.FetchType; + +import java.time.LocalDateTime; + +@Data +@TableName("mall_user_favorite") +public class UserFavorite { + private static final long serialVersionUID = 1L; + @TableId(value = "id", type = IdType.ASSIGN_ID) + private Long id; + + @TableField("user_id") + private Long userId; + + @TableField("product_id") + private Long productId; + + @TableField("created_at") + private LocalDateTime createdAt; + + @TableField("updated_at") + private LocalDateTime updatedAt; + + // 关联商品信息(可选) + @TableField(exist = false) + private Product product; + +} diff --git a/ruoyi-system/src/main/java/com/ruoyi/mall/domain/dto/PayNotifyMessageDTO.java b/ruoyi-system/src/main/java/com/ruoyi/mall/domain/dto/PayNotifyMessageDTO.java index 23bc161..299573e 100644 --- a/ruoyi-system/src/main/java/com/ruoyi/mall/domain/dto/PayNotifyMessageDTO.java +++ b/ruoyi-system/src/main/java/com/ruoyi/mall/domain/dto/PayNotifyMessageDTO.java @@ -24,7 +24,7 @@ public class PayNotifyMessageDTO { * USERPAYING:用户支付中(仅付款码支付会返回) * PAYERROR:支付失败(仅付款码支付会返回) */ - private Transaction.TradeStateEnum tradeStatus; + private String tradeStatus; /**支付时间**/ private Date payTime; diff --git a/ruoyi-system/src/main/java/com/ruoyi/mall/domain/order/AftersaleItem.java b/ruoyi-system/src/main/java/com/ruoyi/mall/domain/order/AftersaleItem.java index fd2cac2..5a283fa 100644 --- a/ruoyi-system/src/main/java/com/ruoyi/mall/domain/order/AftersaleItem.java +++ b/ruoyi-system/src/main/java/com/ruoyi/mall/domain/order/AftersaleItem.java @@ -46,4 +46,5 @@ public class AftersaleItem extends BaseAudit { @Excel(name = "退货数量") private Integer quantity; + private Long storeId; } diff --git a/ruoyi-system/src/main/java/com/ruoyi/mall/domain/order/Order.java b/ruoyi-system/src/main/java/com/ruoyi/mall/domain/order/Order.java index 0dbe434..8bfa3ae 100644 --- a/ruoyi-system/src/main/java/com/ruoyi/mall/domain/order/Order.java +++ b/ruoyi-system/src/main/java/com/ruoyi/mall/domain/order/Order.java @@ -50,7 +50,7 @@ public class Order extends BaseAudit { private BigDecimal purchasePrice; @ApiModelProperty("应付金额(实际支付金额)") - @Excel(name = "应付金额", readConverterExp = "实=际支付金额") + @Excel(name = "应付金额", readConverterExp = "实际支付金额") private BigDecimal payAmount; @ApiModelProperty("运费金额") diff --git a/ruoyi-system/src/main/java/com/ruoyi/mall/domain/order/OrderItem.java b/ruoyi-system/src/main/java/com/ruoyi/mall/domain/order/OrderItem.java index 68f1902..5afa5d4 100644 --- a/ruoyi-system/src/main/java/com/ruoyi/mall/domain/order/OrderItem.java +++ b/ruoyi-system/src/main/java/com/ruoyi/mall/domain/order/OrderItem.java @@ -81,4 +81,5 @@ public class OrderItem extends BaseAudit { @Excel(name = "商品sku属性:[{\"key\":\"颜色\",\"value\":\"颜色\"},{\"key\":\"容量\",\"value\":\"4G\"}]") private String spData; + private Long storeId; } diff --git a/ruoyi-system/src/main/java/com/ruoyi/mall/domain/vo/AppOrderVO.java b/ruoyi-system/src/main/java/com/ruoyi/mall/domain/vo/AppOrderVO.java index f05dc76..2dd67f0 100644 --- a/ruoyi-system/src/main/java/com/ruoyi/mall/domain/vo/AppOrderVO.java +++ b/ruoyi-system/src/main/java/com/ruoyi/mall/domain/vo/AppOrderVO.java @@ -12,6 +12,8 @@ import java.util.List; @Data public class AppOrderVO { + private Long storeId; + private String storeName; @ApiModelProperty("订单id") private Long orderId; @@ -75,4 +77,6 @@ public class AppOrderVO { @ApiModelProperty("支付倒计时") private Long timeToPay; + + } diff --git a/ruoyi-system/src/main/java/com/ruoyi/mall/domain/vo/AppProductVO.java b/ruoyi-system/src/main/java/com/ruoyi/mall/domain/vo/AppProductVO.java index 76302b9..e14d4bb 100644 --- a/ruoyi-system/src/main/java/com/ruoyi/mall/domain/vo/AppProductVO.java +++ b/ruoyi-system/src/main/java/com/ruoyi/mall/domain/vo/AppProductVO.java @@ -10,4 +10,6 @@ public class AppProductVO { private String pic; private String name; private BigDecimal price; + private Integer isCourse; + private String unit; } diff --git a/ruoyi-system/src/main/java/com/ruoyi/mall/domain/vo/MemberCartVO.java b/ruoyi-system/src/main/java/com/ruoyi/mall/domain/vo/MemberCartVO.java index d5b1e70..d3c0b86 100644 --- a/ruoyi-system/src/main/java/com/ruoyi/mall/domain/vo/MemberCartVO.java +++ b/ruoyi-system/src/main/java/com/ruoyi/mall/domain/vo/MemberCartVO.java @@ -6,6 +6,7 @@ import lombok.Data; import java.math.BigDecimal; import java.time.LocalDateTime; +import java.util.List; /** * 购物车 数据视图对象 @@ -14,40 +15,53 @@ import java.time.LocalDateTime; */ @Data public class MemberCartVO extends BaseAudit { - /** 购物车表ID */ - private Long id; - /** 0->失效;1->有效 */ - @Excel(name = "0->失效;1->有效") - private Integer status; - /** 用户ID */ + private String storeId; + + /** 用户ID */ @Excel(name = "用户ID") private Long memberId; private String nickname; - private String mark; - /** 商品ID */ + /** 隐藏四位的手机号 */ + private String phoneHidden; + + private Long id; + /** 0->失效;1->有效 */ + @Excel(name = "0->失效;1->有效") + private Integer status; + + /** 商品ID */ @Excel(name = "商品ID") private Long productId; - /** 展示图片 */ + /** PRODUCT_NAME */ + @Excel(name = "PRODUCT_NAME") + private String productName; + /** 展示图片 */ @Excel(name = "展示图片") private String pic; - /** SKU ID */ + + /** SKU ID */ @Excel(name = "SKU ID") private Long skuId; - /** PRODUCT_NAME */ - @Excel(name = "PRODUCT_NAME") - private String productName; - /** 商品属性 */ + + /** 商品属性 */ @Excel(name = "商品属性") private String spData; - /** 商品数量 */ + /** 商品数量 */ @Excel(name = "商品数量") private Integer quantity; - /** 加入时间 */ - private LocalDateTime createTime; + + // 商品单位 + private String unit; + private Boolean check; + //商品最大购买量 + private int stock; /** sku价格 */ private BigDecimal price; /** sku是否存在 */ private Integer skuIfExist; - /** 隐藏四位的手机号 */ - private String phoneHidden; + + // // 0->商品;1->课程 + private Integer isCourse; + } + diff --git a/ruoyi-system/src/main/java/com/ruoyi/mall/mapper/AftersaleItemMapper.java b/ruoyi-system/src/main/java/com/ruoyi/mall/mapper/AftersaleItemMapper.java index af9485a..ff06940 100644 --- a/ruoyi-system/src/main/java/com/ruoyi/mall/mapper/AftersaleItemMapper.java +++ b/ruoyi-system/src/main/java/com/ruoyi/mall/mapper/AftersaleItemMapper.java @@ -18,8 +18,8 @@ public interface AftersaleItemMapper extends BaseMapper { * @param aftersaleItem 订单售后 * @return 订单售后集合 */ - List selectByEntity(AftersaleItem aftersaleItem); +// List selectByEntity(AftersaleItem aftersaleItem); - Integer insertBatch(@Param("list") List list); +// Integer insertBatch(@Param("list") List list); } diff --git a/ruoyi-system/src/main/java/com/ruoyi/mall/mapper/MemberCartMapper.java b/ruoyi-system/src/main/java/com/ruoyi/mall/mapper/MemberCartMapper.java index 169f481..bc1767d 100644 --- a/ruoyi-system/src/main/java/com/ruoyi/mall/mapper/MemberCartMapper.java +++ b/ruoyi-system/src/main/java/com/ruoyi/mall/mapper/MemberCartMapper.java @@ -27,6 +27,7 @@ public interface MemberCartMapper extends BaseMapper { * */ List selectByPage(MemberCartQuery query); + List getList(@Param("userId") Long userId,@Param("storeId") Long storeId); int statAddCount(@Param("startTime") LocalDateTime startTime, @Param("endTime") LocalDateTime endTime); } diff --git a/ruoyi-system/src/main/java/com/ruoyi/mall/mapper/OrderItemMapper.java b/ruoyi-system/src/main/java/com/ruoyi/mall/mapper/OrderItemMapper.java index f07cdc5..b2e2b29 100644 --- a/ruoyi-system/src/main/java/com/ruoyi/mall/mapper/OrderItemMapper.java +++ b/ruoyi-system/src/main/java/com/ruoyi/mall/mapper/OrderItemMapper.java @@ -2,6 +2,7 @@ package com.ruoyi.mall.mapper; import com.baomidou.mybatisplus.core.mapper.BaseMapper; import com.ruoyi.mall.domain.order.OrderItem; +import org.apache.ibatis.annotations.Param; import java.util.List; @@ -18,4 +19,6 @@ public interface OrderItemMapper extends BaseMapper { * @return 订单中所包含的商品集合 */ List selectByEntity(OrderItem orderItem); + List getList(@Param("storeId") Long storeId ,@Param("userId") Long userId); + } diff --git a/ruoyi-system/src/main/java/com/ruoyi/mall/mapper/ProductMapper.java b/ruoyi-system/src/main/java/com/ruoyi/mall/mapper/ProductMapper.java index bd03d9d..3f78c5a 100644 --- a/ruoyi-system/src/main/java/com/ruoyi/mall/mapper/ProductMapper.java +++ b/ruoyi-system/src/main/java/com/ruoyi/mall/mapper/ProductMapper.java @@ -18,4 +18,5 @@ public interface ProductMapper extends BaseMapper { * @return 商品信息集合 */ List selectByEntity(Product product); + List selectByGoodStuff(Long selectByGoodStuff); } diff --git a/ruoyi-system/src/main/java/com/ruoyi/mall/mapper/UserFavoriteMapper.java b/ruoyi-system/src/main/java/com/ruoyi/mall/mapper/UserFavoriteMapper.java new file mode 100644 index 0000000..14e52c2 --- /dev/null +++ b/ruoyi-system/src/main/java/com/ruoyi/mall/mapper/UserFavoriteMapper.java @@ -0,0 +1,16 @@ +package com.ruoyi.mall.mapper; + + +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import com.ruoyi.mall.domain.Address; +import com.ruoyi.mall.domain.Product; +import com.ruoyi.mall.domain.UserFavorite; +import org.apache.ibatis.annotations.Param; + +import java.util.List; + + +public interface UserFavoriteMapper extends BaseMapper { + + List getFavoriteList(@Param("userId") Long userId,@Param("storeId") Long storeId ); +} diff --git a/ruoyi-system/src/main/java/com/ruoyi/mall/service/ProductService.java b/ruoyi-system/src/main/java/com/ruoyi/mall/service/ProductService.java new file mode 100644 index 0000000..a47b6d3 --- /dev/null +++ b/ruoyi-system/src/main/java/com/ruoyi/mall/service/ProductService.java @@ -0,0 +1,9 @@ +package com.ruoyi.mall.service; + +import com.baomidou.mybatisplus.extension.service.IService; +import com.ruoyi.mall.domain.Product; + +public interface ProductService extends IService { + + +} diff --git a/ruoyi-system/src/main/java/com/ruoyi/mall/service/UserFavoriteService.java b/ruoyi-system/src/main/java/com/ruoyi/mall/service/UserFavoriteService.java new file mode 100644 index 0000000..0a9a4c3 --- /dev/null +++ b/ruoyi-system/src/main/java/com/ruoyi/mall/service/UserFavoriteService.java @@ -0,0 +1,19 @@ +package com.ruoyi.mall.service; + +import com.baomidou.mybatisplus.extension.service.IService; +import com.ruoyi.mall.domain.Product; +import com.ruoyi.mall.domain.ProductCategory; +import com.ruoyi.mall.domain.UserFavorite; + +import java.util.List; +import java.util.Map; + +public interface UserFavoriteService extends IService { + + Boolean addFavorite(Long productId); + boolean existsByUserIdAndProductId(Long userId, Long productId); + boolean removeFavorite(Long userId, Long productId); + List getUserFavorites(); + long getUserFavoriteCount(); + +} diff --git a/ruoyi-system/src/main/java/com/ruoyi/mall/service/impl/AftersaleItemService.java b/ruoyi-system/src/main/java/com/ruoyi/mall/service/impl/AftersaleItemService.java new file mode 100644 index 0000000..774a72f --- /dev/null +++ b/ruoyi-system/src/main/java/com/ruoyi/mall/service/impl/AftersaleItemService.java @@ -0,0 +1,40 @@ +package com.ruoyi.mall.service.impl; + +import cn.hutool.core.util.StrUtil; +import com.alibaba.fastjson2.JSON; +import com.alibaba.fastjson2.JSONObject; +import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; +import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; +import com.baomidou.mybatisplus.core.conditions.update.UpdateWrapper; +import com.baomidou.mybatisplus.core.toolkit.Wrappers; +import com.baomidou.mybatisplus.extension.service.IService; +import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; +import com.ruoyi.common.constant.Constants; +import com.ruoyi.common.enums.AftersaleStatus; +import com.ruoyi.common.enums.OrderRefundStatus; +import com.ruoyi.mall.MemberWechat; +import com.ruoyi.mall.domain.form.DealWithAftersaleForm; +import com.ruoyi.mall.domain.order.*; +import com.ruoyi.mall.mapper.*; +import com.wechat.pay.java.service.refund.model.Refund; +import com.wechat.pay.java.service.refund.model.RefundNotification; +import lombok.extern.slf4j.Slf4j; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Service; +import org.springframework.transaction.annotation.Transactional; + +import java.math.BigDecimal; +import java.time.LocalDateTime; +import java.util.Arrays; +import java.util.Objects; + +/** + * 订单售后Service业务层处理 + * + * @author zcc + */ +@Service +@Slf4j +public class AftersaleItemService extends ServiceImpl implements IService { + +} diff --git a/ruoyi-system/src/main/java/com/ruoyi/mall/service/impl/AftersaleService.java b/ruoyi-system/src/main/java/com/ruoyi/mall/service/impl/AftersaleService.java index 21b04cb..9a0f311 100644 --- a/ruoyi-system/src/main/java/com/ruoyi/mall/service/impl/AftersaleService.java +++ b/ruoyi-system/src/main/java/com/ruoyi/mall/service/impl/AftersaleService.java @@ -8,6 +8,8 @@ import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; import com.baomidou.mybatisplus.core.conditions.update.UpdateWrapper; import com.baomidou.mybatisplus.core.toolkit.Wrappers; +import com.baomidou.mybatisplus.extension.service.IService; +import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; import com.github.pagehelper.PageHelper; import com.ruoyi.common.constant.Constants; import com.ruoyi.common.enums.AftersaleStatus; @@ -36,7 +38,7 @@ import java.util.stream.Collectors; */ @Service @Slf4j -public class AftersaleService { +public class AftersaleService extends ServiceImpl implements IService { @Autowired private AftersaleMapper aftersaleMapper; @@ -54,8 +56,6 @@ public class AftersaleService { @Autowired private WechatPaymentHistoryMapper wechatPaymentHistoryMapper; - @Autowired - private MemberWechatMapper memberWechatMapper; @Autowired(required = false) private WechatPayService wechatPayService; @Autowired diff --git a/ruoyi-system/src/main/java/com/ruoyi/mall/service/impl/MemberCartService.java b/ruoyi-system/src/main/java/com/ruoyi/mall/service/impl/MemberCartService.java index 0a0376b..49f4bea 100644 --- a/ruoyi-system/src/main/java/com/ruoyi/mall/service/impl/MemberCartService.java +++ b/ruoyi-system/src/main/java/com/ruoyi/mall/service/impl/MemberCartService.java @@ -3,17 +3,23 @@ package com.ruoyi.mall.service.impl; import cn.hutool.core.collection.CollectionUtil; import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; +import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; import com.github.pagehelper.PageHelper; +import com.ruoyi.basic.domain.YjStore; +import com.ruoyi.basic.mapper.YjStoreMapper; import com.ruoyi.common.constant.Constants; +import com.ruoyi.common.core.domain.entity.SysDictData; import com.ruoyi.common.exception.base.BaseException; import com.ruoyi.common.utils.SecurityUtils; import com.ruoyi.common.utils.SortUtil; import com.ruoyi.mall.domain.MemberCart; import com.ruoyi.mall.domain.Sku; import com.ruoyi.mall.domain.form.UpdateMemberCartForm; +import com.ruoyi.mall.domain.order.OrderItem; import com.ruoyi.mall.domain.query.MemberCartQuery; import com.ruoyi.mall.domain.vo.MemberCartVO; import com.ruoyi.mall.mapper.MemberCartMapper; +import com.ruoyi.mall.mapper.OrderItemMapper; import com.ruoyi.mall.mapper.ProductMapper; import com.ruoyi.mall.mapper.SkuMapper; import org.springframework.beans.BeanUtils; @@ -32,12 +38,14 @@ import java.util.stream.Collectors; * @author zcc */ @Service -public class MemberCartService { +public class MemberCartService extends ServiceImpl { @Autowired private MemberCartMapper memberCartMapper; @Autowired private SkuMapper skuMapper; @Autowired + private YjStoreMapper storeMapper; + @Autowired private ProductMapper productMapper; @@ -58,7 +66,7 @@ public class MemberCartService { * @param page 分页条件 * @return 购物车 */ - public List selectList(MemberCartQuery query, Pageable page) { + public List selectList(MemberCartQuery query, Pageable page) { if (page != null) { PageHelper.startPage(page.getPageNumber() + 1, page.getPageSize(), SortUtil.sort2string(page.getSort(),"id desc")); } @@ -75,19 +83,45 @@ public class MemberCartService { QueryWrapper skuQw = new QueryWrapper<>(); skuQw.in("id", skuIdList); Map skuMap = skuMapper.selectList(skuQw).stream().collect(Collectors.toMap(Sku::getId, it -> it)); - List resList = new ArrayList<>(); - memberCartList.forEach(item -> { - MemberCartVO memberCartVO = new MemberCartVO(); - BeanUtils.copyProperties(item, memberCartVO); - if (!skuMap.containsKey(item.getSkuId())){ - memberCartVO.setStatus(0); - memberCartVO.setSkuIfExist(0); - }else { - Sku sku = skuMap.get(item.getSkuId()); - memberCartVO.setPrice(sku.getPrice()); - memberCartVO.setSkuIfExist(1); - } - resList.add(memberCartVO); + + //查门店 + List storeIdList = memberCartList.stream().map(MemberCart::getStoreId).collect(Collectors.toList()); + QueryWrapper storeQw = new QueryWrapper<>(); + storeQw.in("dept_id", storeIdList); + Map storeMap = storeMapper.selectList(storeQw).stream().collect(Collectors.toMap(YjStore::getId, it -> it)); + Set keys= storeMap.keySet(); + for (Long key : keys) { + System.out.println(key); + YjStore y= storeMap.get(key); + System.out.println(y.getStoreName()); + } + Map> storeCartMap = memberCartList.stream().collect(Collectors.groupingBy(MemberCart::getStoreId)); + + List resList = new ArrayList<>(); + storeCartMap.forEach((storeId,cartList)->{ + Map resMap = new HashMap<>(); + List list = new ArrayList<>(); + resMap.put("storeName",storeMap.get(storeId).getStoreName()); + + for (MemberCart item:cartList){ + MemberCartVO memberCartVO = new MemberCartVO(); + BeanUtils.copyProperties(item, memberCartVO); + + //sku是否失效 + if (!skuMap.containsKey(item.getSkuId())){ + memberCartVO.setStatus(0); + memberCartVO.setSkuIfExist(0); + }else { + Sku sku = skuMap.get(item.getSkuId()); + memberCartVO.setStock(sku.getStock()); + memberCartVO.setPrice(sku.getPrice()); + memberCartVO.setUnit(sku.getUnit()); + memberCartVO.setSkuIfExist(1); + } + list.add(memberCartVO); + } + resMap.put("cartList",list); + resList.add(resMap); }); return resList; } @@ -127,9 +161,13 @@ public class MemberCartService { */ public int update(MemberCart memberCart) { MemberCart cart = memberCartMapper.selectById(memberCart.getId()); + Sku sku = skuMapper.selectById(cart.getSkuId()); if (cart == null){ return 0; } + if (cart.getQuantity()>sku.getStock()){ + throw new RuntimeException("库存数量:"+sku.getStock()); + } cart.setQuantity(memberCart.getQuantity()); cart.setUpdateTime(LocalDateTime.now()); cart.setUpdateBy(SecurityUtils.getAppLoginUser().getAppUserId()); diff --git a/ruoyi-system/src/main/java/com/ruoyi/mall/service/impl/OrderItemService.java b/ruoyi-system/src/main/java/com/ruoyi/mall/service/impl/OrderItemService.java index 10ff99a..efa7b6e 100644 --- a/ruoyi-system/src/main/java/com/ruoyi/mall/service/impl/OrderItemService.java +++ b/ruoyi-system/src/main/java/com/ruoyi/mall/service/impl/OrderItemService.java @@ -52,6 +52,7 @@ public class OrderItemService extends ServiceImpl { orderItem.setSpData(item.getSku().getSpData()); orderItem.setCreateBy(member.getId()); orderItem.setCreateTime(optTime); + orderItem.setStoreId(item.getProduct().getStoreId()); addOrderItemList.add(orderItem); }); boolean flag = saveBatch(addOrderItemList); diff --git a/ruoyi-system/src/main/java/com/ruoyi/mall/service/impl/OrderService.java b/ruoyi-system/src/main/java/com/ruoyi/mall/service/impl/OrderService.java index b784df7..f384250 100644 --- a/ruoyi-system/src/main/java/com/ruoyi/mall/service/impl/OrderService.java +++ b/ruoyi-system/src/main/java/com/ruoyi/mall/service/impl/OrderService.java @@ -8,7 +8,9 @@ import com.baomidou.mybatisplus.core.conditions.update.LambdaUpdateWrapper; import com.baomidou.mybatisplus.core.conditions.update.UpdateWrapper; import com.baomidou.mybatisplus.core.toolkit.Wrappers; +import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; import com.github.pagehelper.PageHelper; +import com.ruoyi.basic.service.YjStoreService; import com.ruoyi.common.constant.Constants; import com.ruoyi.common.core.domain.entity.AppUser; import com.ruoyi.common.core.domain.entity.SysUser; @@ -34,6 +36,7 @@ import com.ruoyi.mall.util.AppPrepay; import com.ruoyi.mall.util.PayConstants; import com.ruoyi.mall.util.WechatPayUtil; import lombok.extern.slf4j.Slf4j; +import org.joda.time.DateTime; import org.springframework.beans.BeanUtils; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.data.domain.PageImpl; @@ -44,6 +47,7 @@ import org.springframework.transaction.annotation.Transactional; import org.springframework.util.CollectionUtils; import java.math.BigDecimal; +import java.text.SimpleDateFormat; import java.time.LocalDateTime; import java.time.ZoneId; import java.time.format.DateTimeFormatter; @@ -54,7 +58,7 @@ import java.util.stream.Stream; @Service @Slf4j -public class OrderService { +public class OrderService extends ServiceImpl { @Autowired private MemberAddressMapper memberAddressMapper; @@ -85,13 +89,15 @@ public class OrderService { @Autowired private AftersaleMapper aftersaleMapper; @Autowired - private AftersaleItemMapper aftersaleItemMapper; + private AftersaleItemService aftersaleItemService; + @Autowired + private YjStoreService storeService; @Autowired private RedisService redisService; @Transactional - public Long submit(OrderSubmitForm form) { + public Map submit(OrderSubmitForm form) { AppUser member = SecurityUtils.getAppLoginUser().getAppUser(); //只支持快递 Long addressId = form.getAddressId(); @@ -154,15 +160,20 @@ public class OrderService { // order.setPayType(Constants.PayType.WECHAT); // order.setMemberCouponId(form.getMemberCouponId()); order.setTotalAmount(orderTotalAmount); + + //todo 采购价 优惠价 为空 order.setPurchasePrice(BigDecimal.ZERO); order.setFreightAmount(BigDecimal.ZERO); + order.setPayAmount(orderTotalAmount.compareTo(BigDecimal.ZERO) > 0 ? orderTotalAmount : BigDecimal.ZERO); + if (order.getPayAmount().compareTo(BigDecimal.ZERO) == 0) { - order.setStatus(Constants.OrderStatus.SEND); + order.setStatus(Constants.OrderStatus.SEND);//待发货 } else { - order.setStatus(Constants.OrderStatus.NOTPAID); + order.setStatus(Constants.OrderStatus.NOTPAID);//待付款 } order.setAftersaleStatus(1); + //收货地址 order.setReceiverName(memberAddress.getName()); order.setReceiverPostCode(memberAddress.getPostCode()); order.setReceiverProvince(memberAddress.getProvince()); @@ -170,10 +181,11 @@ public class OrderService { order.setReceiverDistrict(memberAddress.getDistrict()); order.setReceiverPhone(memberAddress.getPhone()); order.setReceiverDetailAddress(memberAddress.getAddress()); + order.setNote(form.getNote()); order.setConfirmStatus(0); order.setDeleteStatus(0); -// order.setPaymentTime(optTime); +// order.setPaymentTime(optTime);//支付时间 order.setCreateTime(optTime); order.setCreateBy(member.getId()); int rows = orderMapper.insert(order); @@ -182,15 +194,17 @@ public class OrderService { } // 保存orderItem orderItemService.saveOrderItem(member, optTime, orderId, skuList); + + //减少sku的库存 skuList.forEach(item -> { - //减少sku的库存 skuMapper.updateStockById(item.getSkuId(), LocalDateTime.now(), item.getQuantity()); }); + // 保存订单操作记录 OrderOperateHistory orderOperateHistory = new OrderOperateHistory(); orderOperateHistory.setOrderId(orderId); orderOperateHistory.setOrderSn(order.getOrderSn()); - orderOperateHistory.setOperateMan(member.getNickName()); + orderOperateHistory.setOperateMan("用户"); orderOperateHistory.setOrderStatus(Constants.OrderStatus.NOTPAID); orderOperateHistory.setCreateTime(optTime); orderOperateHistory.setCreateBy(member.getId()); @@ -198,6 +212,7 @@ public class OrderService { if (rows < 1) { throw new RuntimeException("保存订单操作记录失败"); } + //若来源为购物车,删除购物车 if (Constants.OrderFrom.CART.equals(form.getFrom())) { List skuIdList = skuList.stream().map(OrderProductListDTO::getSkuId).collect(Collectors.toList()); @@ -210,7 +225,10 @@ public class OrderService { } } //当前订单id,接入支付后可返回payId - return payId; + Map map=new HashMap<>(); + map.put("payId",payId.toString()); + map.put("orderId",orderId.toString()); + return map; } private String getOrderIdPrefix() { @@ -222,15 +240,19 @@ public class OrderService { OrderCalcVO res = new OrderCalcVO(); List skuList = new ArrayList<>(); List list = orderCreateForm.getSkuList(); + if (CollectionUtil.isEmpty(list)) { throw new RuntimeException("商品SKU信息不能为空"); } + //将购买的sku信息转化为key:skuId value:数量 Map quantityMap = list.stream(). collect(Collectors.toMap(OrderProductListDTO::getSkuId, OrderProductListDTO::getQuantity, (v1, v2) -> v2)); + //查询所有sku信息 Set collect = list.stream().map(OrderProductListDTO::getSkuId).collect(Collectors.toSet()); Map querySkuMap = skuMapper.selectBatchIds(collect).stream().collect(Collectors.toMap(Sku::getId, it -> it)); + //计算商品总金额、订单总金额 BigDecimal productTotalAmount = BigDecimal.ZERO; BigDecimal orderTotalAmount = BigDecimal.ZERO; @@ -251,7 +273,7 @@ public class OrderService { throw new RuntimeException("库存不足"); } BigDecimal addAmount = sku.getPrice().multiply(BigDecimal.valueOf(dto.getQuantity())); - //由于目前没有运费等数据,暂时订单总金额=商品总金额了 + //todo 由于目前没有优惠券 、运费等数据,暂时订单总金额=商品总金额了 productTotalAmount = productTotalAmount.add(addAmount); orderTotalAmount = orderTotalAmount.add(addAmount); //封装sku信息 @@ -268,23 +290,7 @@ public class OrderService { res.setSkuList(skuList); res.setOrderTotalAmount(orderTotalAmount); res.setProductTotalAmount(productTotalAmount); - //获取能使用的优惠券列表 - Map products = new HashMap<>(); - querySkuMap.forEach((k, v) -> { - Integer count = quantityMap.get(k); - Long productId = v.getProductId(); - Product product; - BigDecimal amount = v.getPrice().multiply(BigDecimal.valueOf(count)); - if (products.containsKey(k)) { - product = products.get(k); - product.setPrice(amount.add(product.getPrice())); - } else { - product = new Product(); - product.setId(productId); - product.setPrice(amount); - } - products.put(k, product); - }); + return res; } @@ -309,6 +315,7 @@ public class OrderService { PageHelper.startPage(pageable.getPageNumber() + 1, pageable.getPageSize()); } List orderList = orderMapper.orderPage(status, memberId); + long total = ((com.github.pagehelper.Page) orderList).getTotal(); // 两个list都没数据那肯定返回空了 if (CollectionUtil.isEmpty(unpaidOrderList) && CollectionUtil.isEmpty(orderList)) { @@ -317,21 +324,40 @@ public class OrderService { // 开始组装item了 // 拿出所有orderId,查item,然后分组 by orderId List idList = new ArrayList<>(); - if (CollectionUtil.isNotEmpty(unpaidOrderList)) { - idList.addAll(unpaidOrderList.stream().map(AppOrderVO::getOrderId).collect(Collectors.toList())); - } if (CollectionUtil.isNotEmpty(orderList)) { idList.addAll(orderList.stream().map(AppOrderVO::getOrderId).collect(Collectors.toList())); } + if (CollectionUtil.isNotEmpty(unpaidOrderList)) { + idList.addAll(unpaidOrderList.stream().map(AppOrderVO::getOrderId).collect(Collectors.toList())); + } + QueryWrapper orderItemQw = new QueryWrapper<>(); orderItemQw.in("order_id", idList); - Map> orderItemMap = - orderItemMapper.selectList(orderItemQw).stream().collect(Collectors.groupingBy(OrderItem::getOrderId)); + List items=orderItemMapper.selectList(orderItemQw); + Map> orderItemMap = + items.stream().collect(Collectors.groupingBy(l->l.getStoreId()+""+l.getOrderId())); + +// Map> orderItemMap = +// orderItemMapper.selectList(orderItemQw).stream().collect(Collectors.groupingBy(OrderItem::getOrderId)); orderList.addAll(0, unpaidOrderList); - orderList.forEach(item -> { - item.setOrderItemList(orderItemMap.get(item.getOrderId())); - }); - return new PageImpl<>(orderList, pageable, total); + //根据店铺名 拆分订单 + Map orderVOMap=orderList.stream().collect(Collectors.toMap(AppOrderVO::getOrderId,it->it)); +// orderList.forEach(item -> { +// item.setOrderItemList(orderItemMap.get(item.getOrderId())); +// }); + + List orderListVo =new ArrayList<>(); + for (String s : orderItemMap.keySet()) { + List items1=orderItemMap.get(s); + AppOrderVO vo=orderVOMap.get(items1.get(0).getOrderId()); + Long storeId=items1.get(0).getStoreId(); + vo.setOrderItemList(items1); + vo.setStoreId(storeId); + vo.setStoreName(storeService.getOne(storeId).getStoreName()); + orderListVo.add(vo); + } + + return new PageImpl<>(orderListVo, pageable, total); } public AppOrderVO orderDetail(Long orderId) { @@ -405,7 +431,7 @@ public class OrderService { OrderOperateHistory optHistory = new OrderOperateHistory(); optHistory.setOrderId(order.getId()); optHistory.setOrderSn(order.getOrderSn()); - optHistory.setOperateMan("" + order.getMemberId()); + optHistory.setOperateMan("用户"); optHistory.setOrderStatus(Constants.AppOrderStatus.COMPLETED); optHistory.setCreateTime(optDate); optHistory.setCreateBy(order.getMemberId()); @@ -448,6 +474,7 @@ public class OrderService { if (count > 0) { throw new RuntimeException("订单状态已更新,请刷新页面"); } + List addHistoryList = new ArrayList<>(); orderList.forEach(item -> { item.setStatus(Constants.AppOrderStatus.CLOSED); @@ -456,7 +483,7 @@ public class OrderService { OrderOperateHistory history = new OrderOperateHistory(); history.setOrderId(item.getId()); history.setOrderSn(item.getOrderSn()); - history.setOperateMan(userId == null ? "后台管理员" : "" + item.getMemberId()); + history.setOperateMan("用户"); history.setOrderStatus(Constants.AppOrderStatus.CLOSED); history.setCreateTime(optDate); history.setCreateBy(userId); @@ -516,14 +543,17 @@ public class OrderService { if (req.getWechatType() == 1) { appId = PayConstants.APP_ID; } + //小程序支付 if (req.getWechatType() == 2) { - openId="";//TODO + openId="123";//TODO appId = PayConstants.MINI_APP_ID; } QueryWrapper orderItemQw = new QueryWrapper<>(); orderItemQw.eq("order_id", orderList.get(0).getId()); List orderItemList = orderItemMapper.selectList(orderItemQw); + String orderDesc = orderItemList.get(0).getProductName().substring(0, Math.min(40, orderItemList.get(0).getProductName().length())); + //保存微信支付历史 LocalDateTime optDate = LocalDateTime.now(); QueryWrapper wxPaymentQw = new QueryWrapper<>(); @@ -548,31 +578,49 @@ public class OrderService { wechatPaymentHistory.setMoney(orderList.get(0).getPayAmount()); wechatPaymentHistoryMapper.updateById(wechatPaymentHistory); } - //调用wx的AppPrepay拿prepayId,返回签名等信息 - String prepayId = AppPrepay.creatOrder( - orderDesc,String.valueOf(req.getPayId()),Long.valueOf(orderList.stream().map(Order::getPayAmount). - reduce(BigDecimal.ZERO, BigDecimal::add).multiply(new BigDecimal(100)).stripTrailingZeros().toPlainString()) - ).prepayId; + //调用wx的AppPrepay拿prepayId,返回签名等信息 +// String prepayId = AppPrepay.creatOrder( +// orderDesc,String.valueOf(req.getPayId()),Long.valueOf(orderList.stream().map(Order::getPayAmount). +// reduce(BigDecimal.ZERO, BigDecimal::add).multiply(new BigDecimal(100)).stripTrailingZeros().toPlainString()) +// ).prepayId; +// OrderPayVO response = new OrderPayVO(); - response.setPayType(2);//1 支付宝 2 微信 - String nonceStr = WechatPayUtil.generateNonceStr(); - long timeStamp = WechatPayUtil.getCurrentTimestamp(); - String paySign = null; - String signatureStr = Stream.of(appId, String.valueOf(timeStamp), nonceStr, prepayId) - .collect(Collectors.joining("\n", "", "\n")); - try { - paySign = WechatPayUtil.getSign(signatureStr, PayConstants.PRIVATE_KEY_FILE_PATH); - } catch (Exception e) { - throw new RuntimeException("支付失败"); - } +// response.setPayType(2);//1 支付宝 2 微信 +// String nonceStr = WechatPayUtil.generateNonceStr(); +// long timeStamp = WechatPayUtil.getCurrentTimestamp(); +// String paySign = null; +// String signatureStr = Stream.of(appId, String.valueOf(timeStamp), nonceStr, prepayId) +// .collect(Collectors.joining("\n", "", "\n")); +// try { +// paySign = WechatPayUtil.getSign(signatureStr, PayConstants.PRIVATE_KEY_FILE_PATH); +// } catch (Exception e) { +// throw new RuntimeException("支付失败"); +// } +// response.setAppId(appId); +// response.setPartnerId(PayConstants.MCH_ID); +// response.setPrepayId(prepayId); +// response.setPackageValue(PayConstants.PACKAGE); +// response.setNonceStr(nonceStr); +// response.setTimeStamp(String.valueOf(timeStamp)); +// response.setSign(paySign); + response.setAppId(appId); response.setPartnerId(PayConstants.MCH_ID); - response.setPrepayId(prepayId); + response.setPrepayId("prepayId"); response.setPackageValue(PayConstants.PACKAGE); - response.setNonceStr(nonceStr); - response.setTimeStamp(String.valueOf(timeStamp)); - response.setSign(paySign); + response.setNonceStr("nonceStr"); + response.setTimeStamp(""); + response.setSign("paySign"); + + + PayNotifyMessageDTO message = new PayNotifyMessageDTO(); + message.setOutTradeNo( orderList.get(0).getPayId()); + message.setMemberId(SecurityUtils.getAppLoginUser().getAppUserId()); + message.setTradeStatus("SUCCESS"); + message.setPayTime(new Date()); + message.setTradeNo(orderList.get(0).getId().toString()); + payCallBack(message); return response; } @@ -588,65 +636,65 @@ public class OrderService { * @return */ // @Transactional -// public ResponseEntity payCallBack(PayNotifyMessageDTO messageDTO) { -//// log.info("【订单支付回调】" + JSONObject.toJSON(messageDTO)); -// String redisKey = "app_oms_order_pay_notify_" + messageDTO.getOutTradeNo(); -// String redisValue = messageDTO.getOutTradeNo() + "_" + System.currentTimeMillis(); -// LocalDateTime optDate = LocalDateTime.now(); -// try { -// redisService.lock(redisKey, redisValue, 60); -// //先判断回信回调的是否未success -// if (!Transaction.TradeStateEnum.SUCCESS.equals(messageDTO.getTradeStatus())) { -// log.error("【订单支付回调】订单状态不是支付成功状态" + messageDTO.getTradeStatus()); -// throw new RuntimeException(); -// } -// QueryWrapper paymentWrapper = new QueryWrapper<>(); -// paymentWrapper.eq("order_id", messageDTO.getOutTradeNo()); -// paymentWrapper.eq("op_type", Constants.PaymentOpType.PAY); -// WechatPaymentHistory paymentHistory = wechatPaymentHistoryMapper.selectOne(paymentWrapper); -// if (paymentHistory.getPaymentStatus() != Constants.PaymentStatus.INCOMPLETE) { -// log.info("【订单支付回调】支付订单不是未支付状态,不再处理" + "orderId" + paymentHistory.getOrderId() + "status" + paymentHistory.getPaymentStatus()); -// throw new RuntimeException(); -// } -// QueryWrapper orderQw = new QueryWrapper<>(); -// orderQw.eq("pay_id", messageDTO.getOutTradeNo()); -// orderQw.eq("status", OrderStatus.UN_PAY.getType()); -// List orderList = orderMapper.selectList(orderQw); -// orderList.forEach(order -> { -// order.setPaymentTime(messageDTO.getPayTime().toInstant().atZone(ZoneId.systemDefault()).toLocalDateTime()); -// order.setStatus(OrderStatus.NOT_DELIVERED.getType()); -// orderMapper.updateById(order); -// -// OrderOperateHistory optHistory = new OrderOperateHistory(); -// optHistory.setOrderId(order.getId()); -// optHistory.setOrderSn(order.getOrderSn()); -// optHistory.setOperateMan("" + order.getMemberId()); -// optHistory.setOrderStatus(OrderStatus.NOT_DELIVERED.getType()); -// optHistory.setCreateTime(optDate); -// optHistory.setCreateBy(order.getMemberId()); -// optHistory.setUpdateBy(order.getMemberId()); -// optHistory.setUpdateTime(optDate); -// orderOperateHistoryMapper.insert(optHistory); -// -// //处理积分 -//// integralHistoryService.handleIntegral(order.getId(), order.getPayAmount(), order.getMemberId()); -// }); -// UpdateWrapper paymentHistoryUpdateWrapper = new UpdateWrapper<>(); -// paymentHistoryUpdateWrapper.eq("order_id", messageDTO.getOutTradeNo()).set("payment_id", messageDTO.getTradeNo()) -// .set("payment_status", Constants.PaymentStatus.COMPLETE).set("update_time", optDate); -// wechatPaymentHistoryMapper.update(null, paymentHistoryUpdateWrapper); -// } catch (Exception e) { -// log.error("订单支付回调异常", e); -// throw new RuntimeException("订单支付回调异常"); -// } finally { -// try { -// redisService.unLock(redisKey, redisValue); -// } catch (Exception e) { -// log.error("", e); -// } -// } -// return ResponseEntity.ok("订单支付回调成功"); -// } + public ResponseEntity payCallBack(PayNotifyMessageDTO messageDTO) { +// log.info("【订单支付回调】" + JSONObject.toJSON(messageDTO)); + String redisKey = "app_oms_order_pay_notify_" + messageDTO.getOutTradeNo(); + String redisValue = messageDTO.getOutTradeNo() + "_" + System.currentTimeMillis(); + LocalDateTime optDate = LocalDateTime.now(); + try { + redisService.lock(redisKey, redisValue, 60); + //先判断回信回调的是否未success + if (!messageDTO.getTradeStatus().equals("SUCCESS")) { + log.error("【订单支付回调】订单状态不是支付成功状态" + messageDTO.getTradeStatus()); + throw new RuntimeException(); + } + QueryWrapper paymentWrapper = new QueryWrapper<>(); + paymentWrapper.eq("order_id", messageDTO.getOutTradeNo()); + paymentWrapper.eq("op_type", Constants.PaymentOpType.PAY); + WechatPaymentHistory paymentHistory = wechatPaymentHistoryMapper.selectOne(paymentWrapper); + if (paymentHistory.getPaymentStatus() != Constants.PaymentStatus.INCOMPLETE) { + log.info("【订单支付回调】支付订单不是未支付状态,不再处理" + "orderId" + paymentHistory.getOrderId() + "status" + paymentHistory.getPaymentStatus()); + throw new RuntimeException(); + } + QueryWrapper orderQw = new QueryWrapper<>(); + orderQw.eq("pay_id", messageDTO.getOutTradeNo()); + orderQw.eq("status", OrderStatus.UN_PAY.getType()); + List orderList = orderMapper.selectList(orderQw); + orderList.forEach(order -> { + order.setPaymentTime(messageDTO.getPayTime().toInstant().atZone(ZoneId.systemDefault()).toLocalDateTime()); + order.setStatus(OrderStatus.NOT_DELIVERED.getType()); + orderMapper.updateById(order); + + OrderOperateHistory optHistory = new OrderOperateHistory(); + optHistory.setOrderId(order.getId()); + optHistory.setOrderSn(order.getOrderSn()); + optHistory.setOperateMan("用户"); + optHistory.setOrderStatus(OrderStatus.NOT_DELIVERED.getType()); + optHistory.setCreateTime(optDate); + optHistory.setCreateBy(order.getMemberId()); + optHistory.setUpdateBy(order.getMemberId()); + optHistory.setUpdateTime(optDate); + orderOperateHistoryMapper.insert(optHistory); + + //处理积分 +// integralHistoryService.handleIntegral(order.getId(), order.getPayAmount(), order.getMemberId()); + }); + UpdateWrapper paymentHistoryUpdateWrapper = new UpdateWrapper<>(); + paymentHistoryUpdateWrapper.eq("order_id", messageDTO.getOutTradeNo()).set("payment_id", messageDTO.getTradeNo()) + .set("payment_status", Constants.PaymentStatus.COMPLETE).set("update_time", optDate); + wechatPaymentHistoryMapper.update(null, paymentHistoryUpdateWrapper); + } catch (Exception e) { + log.error("订单支付回调异常", e); + throw new RuntimeException("订单支付回调异常"); + } finally { + try { + redisService.unLock(redisKey, redisValue); + } catch (Exception e) { + log.error("", e); + } + } + return ResponseEntity.ok("订单支付回调成功"); + } /** * 申请售后 @@ -699,10 +747,11 @@ public class OrderService { aftersaleItem.setCreateBy(memberId); aftersaleItem.setUpdateTime(optDate); aftersaleItem.setUpdateBy(memberId); + aftersaleItem.setStoreId(orderItem.getStoreId()); addAftersaleItemList.add(aftersaleItem); }); - rows = aftersaleItemMapper.insertBatch(addAftersaleItemList); - if (rows < 1) { + + if (!aftersaleItemService.saveBatch(addAftersaleItemList)) { throw new RuntimeException("创建售后订单item失败"); } //更新订单 @@ -718,7 +767,7 @@ public class OrderService { OrderOperateHistory optHistory = new OrderOperateHistory(); optHistory.setOrderId(order.getId()); optHistory.setOrderSn(order.getOrderSn()); - optHistory.setOperateMan("" + memberId); + optHistory.setOperateMan("用户"); optHistory.setOrderStatus(11); optHistory.setCreateTime(optDate); optHistory.setCreateBy(memberId); @@ -822,7 +871,7 @@ public class OrderService { //查一下售后订单item QueryWrapper aftersaleItemQw = new QueryWrapper<>(); aftersaleItemQw.eq("aftersale_id", aftersale.getId()); - List aftersaleItemList = aftersaleItemMapper.selectList(aftersaleItemQw); + List aftersaleItemList = aftersaleItemService.list(aftersaleItemQw); List orderItemIdList = aftersaleItemList.stream().map(AftersaleItem::getOrderItemId).collect(Collectors.toList()); //再去查orderItem QueryWrapper orderItemQw = new QueryWrapper<>(); diff --git a/ruoyi-system/src/main/java/com/ruoyi/mall/service/impl/ProductCategoryServiceImpl.java b/ruoyi-system/src/main/java/com/ruoyi/mall/service/impl/ProductCategoryServiceImpl.java index b11b4b1..0539f54 100644 --- a/ruoyi-system/src/main/java/com/ruoyi/mall/service/impl/ProductCategoryServiceImpl.java +++ b/ruoyi-system/src/main/java/com/ruoyi/mall/service/impl/ProductCategoryServiceImpl.java @@ -41,7 +41,7 @@ public class ProductCategoryServiceImpl extends ServiceImpl getProductCategorys(Map params){ QueryWrapper qw = new QueryWrapper<>(); - qw.select("id", "parent_id", "name", "level", "sort", "icon"); + qw.select("id", "parent_id", "type_name", "level", "sort", "icon"); qw.eq("show_status", 1);//展示 qw.eq("store_id", params.get("storeId"));//门店id // qw.le("level", 2); diff --git a/ruoyi-system/src/main/java/com/ruoyi/mall/service/impl/ProductService.java b/ruoyi-system/src/main/java/com/ruoyi/mall/service/impl/ProductServiceImpl.java similarity index 62% rename from ruoyi-system/src/main/java/com/ruoyi/mall/service/impl/ProductService.java rename to ruoyi-system/src/main/java/com/ruoyi/mall/service/impl/ProductServiceImpl.java index 0b5195b..3c3ab28 100644 --- a/ruoyi-system/src/main/java/com/ruoyi/mall/service/impl/ProductService.java +++ b/ruoyi-system/src/main/java/com/ruoyi/mall/service/impl/ProductServiceImpl.java @@ -1,34 +1,35 @@ package com.ruoyi.mall.service.impl; import cn.hutool.core.bean.BeanUtil; -import cn.hutool.core.collection.CollectionUtil; -import cn.hutool.json.JSONUtil; +import cn.hutool.core.util.ObjectUtil; import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; +import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; import com.github.pagehelper.PageHelper; -import com.ruoyi.common.utils.SecurityUtils; -import com.ruoyi.course.domain.ReqSearchClaTime; +import com.ruoyi.course.domain.req.ReqSearchClaTime; import com.ruoyi.course.service.ScClaTimeService; import com.ruoyi.mall.domain.Product; import com.ruoyi.mall.domain.Sku; +import com.ruoyi.mall.domain.UserFavorite; import com.ruoyi.mall.domain.query.ProductQuery; import com.ruoyi.mall.domain.vo.ProductDetailVO; import com.ruoyi.mall.domain.vo.ProductVO; import com.ruoyi.mall.mapper.BrandMapper; import com.ruoyi.mall.mapper.ProductMapper; import com.ruoyi.mall.mapper.SkuMapper; +import com.ruoyi.mall.mapper.UserFavoriteMapper; +import com.ruoyi.mall.service.ProductService; +import com.ruoyi.mall.service.UserFavoriteService; import lombok.extern.slf4j.Slf4j; import org.apache.commons.lang3.StringUtils; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.data.domain.Pageable; import org.springframework.stereotype.Service; -import org.springframework.transaction.annotation.Transactional; -import java.time.LocalDateTime; +import java.util.ArrayList; import java.util.HashMap; import java.util.List; import java.util.Map; -import java.util.stream.Collectors; /** * 商品信息Service业务层处理 @@ -38,7 +39,7 @@ import java.util.stream.Collectors; */ @Service @Slf4j -public class ProductService { +public class ProductServiceImpl extends ServiceImpl implements ProductService { @Autowired private ProductMapper productMapper; @Autowired @@ -100,11 +101,41 @@ public class ProductService { if (d.getBrandId() != null) { res.setBrand(brandMapper.selectById(d.getBrandId())); } - if(d.getIsCourse()==1){ - ReqSearchClaTime r=new ReqSearchClaTime(); - r.setCourseId(d.getCourseId()); - res.setClaTimeCalendar( scClaTimeService.searchListForCalendar(r)); - } +// if(d.getIsCourse()==1 && ObjectUtil.isNotEmpty(d.getCourseId())){ +// ReqSearchClaTime r=new ReqSearchClaTime(); +// r.setCourseId(d.getCourseId()); +// res.setClaTimeCalendar( scClaTimeService.searchListForCalendar(r)); +// } return res; } + public Map selectByGoodStuff(String storeId) { + Map> map=new HashMap<>(); + List courses=productMapper.selectList(new QueryWrapper() + .eq("store_id", storeId) + .eq("is_course",1) + .orderByAsc("sort") + .last("limit 2") + ); + List goods=productMapper.selectList(new QueryWrapper() + .eq("store_id", storeId) + .eq("is_course",0) + .orderByAsc("sort") + .last("limit 2") + ); +// List productList=productMapper.selectByGoodStuff(Long.parseLong(storeId)); +// List goods=new ArrayList<>(); +// List courses=new ArrayList<>(); +// for (Product product : productList) { +// if (product.getIsCourse()==1){ +// courses.add(product); +// }else { +// goods.add(product); +// } +// } + map.put("goods",goods); + map.put("courses",courses); + return map; + + } + } diff --git a/ruoyi-system/src/main/java/com/ruoyi/mall/service/impl/UserFavoriteServiceImpl.java b/ruoyi-system/src/main/java/com/ruoyi/mall/service/impl/UserFavoriteServiceImpl.java new file mode 100644 index 0000000..6fe976d --- /dev/null +++ b/ruoyi-system/src/main/java/com/ruoyi/mall/service/impl/UserFavoriteServiceImpl.java @@ -0,0 +1,95 @@ +package com.ruoyi.mall.service.impl; + +import cn.hutool.core.util.ObjectUtil; +import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; +import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; +import com.ruoyi.common.utils.SecurityUtils; +import com.ruoyi.mall.domain.Product; +import com.ruoyi.mall.domain.UserFavorite; +import com.ruoyi.mall.mapper.*; +import com.ruoyi.mall.service.UserFavoriteService; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.data.domain.PageRequest; +import org.springframework.data.domain.Pageable; +import org.springframework.data.domain.Sort; +import org.springframework.stereotype.Service; + +import java.util.*; + + +@Service +public class UserFavoriteServiceImpl extends ServiceImpl implements UserFavoriteService { + + + + @Autowired + private ProductServiceImpl productService; + + /** + * 收藏商品 + */ + @Override + public Boolean addFavorite(Long productId) { + Long userId= SecurityUtils.getAppLoginUser().getAppUserId(); + // 检查商品是否存在 + if (ObjectUtil.isEmpty(productService.selectById(productId))) { + throw new RuntimeException("商品不存在: " + productId); + } + + // 检查是否已收藏 + if (existsByUserIdAndProductId(userId, productId)) { + throw new RuntimeException("您已收藏该商品"); + } + + // 创建收藏记录 + UserFavorite favorite = new UserFavorite(); + favorite.setUserId(userId); + favorite.setProductId(productId); + this.save(favorite); + return true; + } + + + /** + * 检查用户是否收藏了某商品 + */ + @Override + public boolean existsByUserIdAndProductId(Long userId, Long productId){ + UserFavorite userFavorite= this.getOne(new QueryWrapper().eq("user_id",userId).eq("product_id",productId)); + return ObjectUtil.isNotEmpty(userFavorite); + } + /** + * 取消收藏 + */ + @Override + public boolean removeFavorite(Long userId, Long productId) { + // 检查收藏记录是否存在 + if (!existsByUserIdAndProductId(userId, productId)) { + throw new RuntimeException("收藏记录不存在"); + } + + // 删除收藏记录 + return this.remove(new QueryWrapper().eq("user_id",userId).eq("product_id",productId)); + } + + + /** + * 获取用户的收藏列表 + */ + @Override + public List getUserFavorites() { + Long userId= SecurityUtils.getAppLoginUser().getAppUserId();; + List list= baseMapper.getFavoriteList(userId,null); + return list; + } + + + /** + * 获取用户的收藏数量 + */ + @Override + public long getUserFavoriteCount() { + Long userId= SecurityUtils.getAppLoginUser().getAppUserId();; + return this.count(new QueryWrapper().eq("user_id",userId)); + } +} diff --git a/ruoyi-system/src/main/java/com/ruoyi/system/domain/SysNotice.java b/ruoyi-system/src/main/java/com/ruoyi/system/domain/SysNotice.java index 8c07a54..572bca4 100644 --- a/ruoyi-system/src/main/java/com/ruoyi/system/domain/SysNotice.java +++ b/ruoyi-system/src/main/java/com/ruoyi/system/domain/SysNotice.java @@ -9,10 +9,10 @@ import com.ruoyi.common.xss.Xss; /** * 通知公告表 sys_notice - * + * * @author ruoyi */ -public class SysNotice extends BaseEntity +public class SysNotice { private static final long serialVersionUID = 1L; @@ -92,11 +92,6 @@ public class SysNotice extends BaseEntity .append("noticeType", getNoticeType()) .append("noticeContent", getNoticeContent()) .append("status", getStatus()) - .append("createBy", getCreateBy()) - .append("createTime", getCreateTime()) - .append("updateBy", getUpdateBy()) - .append("updateTime", getUpdateTime()) - .append("remark", getRemark()) .toString(); } } diff --git a/ruoyi-system/src/main/java/com/ruoyi/system/domain/SysOperLog.java b/ruoyi-system/src/main/java/com/ruoyi/system/domain/SysOperLog.java index 175ee03..5634beb 100644 --- a/ruoyi-system/src/main/java/com/ruoyi/system/domain/SysOperLog.java +++ b/ruoyi-system/src/main/java/com/ruoyi/system/domain/SysOperLog.java @@ -8,10 +8,10 @@ import com.ruoyi.common.core.domain.BaseEntity; /** * 操作日志记录表 oper_log - * + * * @author ruoyi */ -public class SysOperLog extends BaseEntity +public class SysOperLog { private static final long serialVersionUID = 1L; diff --git a/ruoyi-system/src/main/java/com/ruoyi/system/domain/SysPost.java b/ruoyi-system/src/main/java/com/ruoyi/system/domain/SysPost.java index 8e60f3f..b9e9394 100644 --- a/ruoyi-system/src/main/java/com/ruoyi/system/domain/SysPost.java +++ b/ruoyi-system/src/main/java/com/ruoyi/system/domain/SysPost.java @@ -11,10 +11,10 @@ import javax.validation.constraints.Size; /** * 岗位表 sys_post - * + * * @author ruoyi */ -public class SysPost extends BaseEntity +public class SysPost { private static final long serialVersionUID = 1L; @@ -116,7 +116,7 @@ public class SysPost extends BaseEntity { this.flag = flag; } - + @Override public String toString() { return new ToStringBuilder(this,ToStringStyle.MULTI_LINE_STYLE) @@ -125,11 +125,6 @@ public class SysPost extends BaseEntity .append("postName", getPostName()) .append("postSort", getPostSort()) .append("status", getStatus()) - .append("createBy", getCreateBy()) - .append("createTime", getCreateTime()) - .append("updateBy", getUpdateBy()) - .append("updateTime", getUpdateTime()) - .append("remark", getRemark()) .toString(); } } diff --git a/ruoyi-system/src/main/java/com/ruoyi/system/domain/SysTeacher.java b/ruoyi-system/src/main/java/com/ruoyi/system/domain/SysTeacher.java new file mode 100644 index 0000000..8cae50c --- /dev/null +++ b/ruoyi-system/src/main/java/com/ruoyi/system/domain/SysTeacher.java @@ -0,0 +1,104 @@ +package com.ruoyi.system.domain; + +import com.baomidou.mybatisplus.annotation.TableField; +import com.baomidou.mybatisplus.annotation.TableId; +import com.baomidou.mybatisplus.annotation.TableName; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; +import lombok.EqualsAndHashCode; +import lombok.experimental.Accessors; + +import java.io.Serializable; +import java.util.Date; + +/** + *

+ * 员工信息 + *

+ * + * + * @since 2020-03-17 11:27:37 + */ +@Data +@EqualsAndHashCode(callSuper = false) +@Accessors(chain = true) +@TableName("sys_teacher") +public class SysTeacher implements Serializable { + + + /** + * 教师id + */ + @TableId(value = "user_id") + private Long userId; + + + /** + * 员工姓名 + */ + @TableField("teacher_name") + private String userName; + + + + + /** + * 性别 0 未知 1女 2男 + */ + @TableField(exist = false) + private String sex; + + /** + * 头像 + */ + @TableField("avatar_img") + private String avatar; + + @ApiModelProperty(value = "个人介绍") + private String context; + // 发布 + private Boolean releases; + //相册 + @ApiModelProperty(value = "图片") + private String url; + //简短介绍 + @ApiModelProperty(value = "简介") + private String intro; + + /** + * 部门编号 + */ + @TableField(exist = false) + private Long deptId; + + /** + * 联系电话 + */ + @TableField(exist = false) + private String phonenumber; + + + /** + * 创建者 + */ + @TableField("create_by") + private Long createBy; + + /** + * 创建时间 + */ + @TableField("create_time") + private Date createTime; + + /** + * 更新者 + */ + @TableField("update_by") + private Long updateBy; + + /** + * 更新时间 + */ + @TableField("update_time") + private Date updateTime; +} diff --git a/ruoyi-system/src/main/java/com/ruoyi/system/domain/enums/RoleEnum.java b/ruoyi-system/src/main/java/com/ruoyi/system/domain/enums/RoleEnum.java new file mode 100644 index 0000000..2eda86b --- /dev/null +++ b/ruoyi-system/src/main/java/com/ruoyi/system/domain/enums/RoleEnum.java @@ -0,0 +1,31 @@ +package com.ruoyi.system.domain.enums; + +/** + * 角色枚举 + * @author :zhangbaoyu + * @date :Created in 2020/10/17 12:09 + */ +public enum RoleEnum { + + ADMIN("admin","系统管理员"), + TENANT_MANAGER("tenantManager","租户管理"), + TEACHER("teacher","教师") + ; + + private String roleCode; + + private String roleName; + + RoleEnum(String roleCode, String roleName) { + this.roleCode = roleCode; + this.roleName = roleName; + } + + public String getRoleCode() { + return roleCode; + } + + public String getRoleName() { + return roleName; + } +} diff --git a/ruoyi-system/src/main/java/com/ruoyi/system/domain/vo/ReqSearchStaff.java b/ruoyi-system/src/main/java/com/ruoyi/system/domain/vo/ReqSearchStaff.java new file mode 100644 index 0000000..2fb0843 --- /dev/null +++ b/ruoyi-system/src/main/java/com/ruoyi/system/domain/vo/ReqSearchStaff.java @@ -0,0 +1,19 @@ +package com.ruoyi.system.domain.vo; + +import com.ruoyi.course.domain.page.ReqPageBase; +import lombok.Data; + +import java.io.Serializable; + +/** + * @author :zhangbaoyu + * @date :Created in 2020-01-14 17:30 + */ +@Data +public class ReqSearchStaff extends ReqPageBase implements Serializable { + private String staffName; + private String sex; + private String personnelStatus; + private Integer teacher; + private Long deptId; +} diff --git a/ruoyi-system/src/main/java/com/ruoyi/system/domain/vo/RespTeacherInfo.java b/ruoyi-system/src/main/java/com/ruoyi/system/domain/vo/RespTeacherInfo.java new file mode 100644 index 0000000..16ff996 --- /dev/null +++ b/ruoyi-system/src/main/java/com/ruoyi/system/domain/vo/RespTeacherInfo.java @@ -0,0 +1,19 @@ +package com.ruoyi.system.domain.vo; + +import com.ruoyi.system.domain.SysTeacher; +import lombok.Data; + +/** + * 员工信息 + */ +@Data +public class RespTeacherInfo extends SysTeacher { + + private String username; + + private String locked; + + private String personnelStatusName; + + private String deptName; +} diff --git a/ruoyi-system/src/main/java/com/ruoyi/system/mapper/SysDeptMapper.java b/ruoyi-system/src/main/java/com/ruoyi/system/mapper/SysDeptMapper.java index 99d0bf1..31030de 100644 --- a/ruoyi-system/src/main/java/com/ruoyi/system/mapper/SysDeptMapper.java +++ b/ruoyi-system/src/main/java/com/ruoyi/system/mapper/SysDeptMapper.java @@ -1,5 +1,6 @@ package com.ruoyi.system.mapper; +import com.baomidou.mybatisplus.core.mapper.BaseMapper; import com.ruoyi.common.core.domain.entity.SysDept; import com.ruoyi.basic.domain.dto.YjVenueDto; import org.apache.ibatis.annotations.Param; @@ -11,7 +12,7 @@ import java.util.List; * * @author ruoyi */ -public interface SysDeptMapper +public interface SysDeptMapper extends BaseMapper { List selectForVenue(SysDept dept); diff --git a/ruoyi-system/src/main/java/com/ruoyi/system/mapper/SysDictDataMapper.java b/ruoyi-system/src/main/java/com/ruoyi/system/mapper/SysDictDataMapper.java index c45f41f..fe60a4d 100644 --- a/ruoyi-system/src/main/java/com/ruoyi/system/mapper/SysDictDataMapper.java +++ b/ruoyi-system/src/main/java/com/ruoyi/system/mapper/SysDictDataMapper.java @@ -98,5 +98,5 @@ public interface SysDictDataMapper * @param newDictType 新旧字典类型 * @return 结果 */ - public int updateDictDataType(@Param("oldDictType") String oldDictType, @Param("newDictType") String newDictType, @Param("merchanId") String merchanId); + public int updateDictDataType(@Param("oldDictType") String oldDictType, @Param("newDictType") String newDictType, @Param("tenantId") String tenantId); } diff --git a/ruoyi-system/src/main/java/com/ruoyi/system/mapper/SysPostMapper.java b/ruoyi-system/src/main/java/com/ruoyi/system/mapper/SysPostMapper.java index 6e44c23..a1698e1 100644 --- a/ruoyi-system/src/main/java/com/ruoyi/system/mapper/SysPostMapper.java +++ b/ruoyi-system/src/main/java/com/ruoyi/system/mapper/SysPostMapper.java @@ -6,14 +6,14 @@ import java.util.List; /** * 岗位信息 数据层 - * + * * @author ruoyi */ public interface SysPostMapper { /** * 查询岗位数据集合 - * + * * @param post 岗位信息 * @return 岗位数据集合 */ @@ -21,14 +21,14 @@ public interface SysPostMapper /** * 查询所有岗位//修改 + 商户id - * + * * @return 岗位列表 */ - public List selectPostAll(String merchanId); + public List selectPostAll(String TenantId); /** * 通过岗位ID查询岗位信息 - * + * * @param postId 岗位ID * @return 角色对象信息 */ @@ -36,7 +36,7 @@ public interface SysPostMapper /** * 根据用户ID获取岗位选择框列表 - * + * * @param userId 用户ID * @return 选中岗位ID列表 */ @@ -44,7 +44,7 @@ public interface SysPostMapper /** * 查询用户所属岗位组 - * + * * @param userName 用户名 * @return 结果 */ @@ -52,7 +52,7 @@ public interface SysPostMapper /** * 删除岗位信息 - * + * * @param postId 岗位ID * @return 结果 */ @@ -60,7 +60,7 @@ public interface SysPostMapper /** * 批量删除岗位信息 - * + * * @param postIds 需要删除的岗位ID * @return 结果 */ @@ -68,7 +68,7 @@ public interface SysPostMapper /** * 修改岗位信息 - * + * * @param post 岗位信息 * @return 结果 */ @@ -76,7 +76,7 @@ public interface SysPostMapper /** * 新增岗位信息 - * + * * @param post 岗位信息 * @return 结果 */ @@ -84,7 +84,7 @@ public interface SysPostMapper /** * 校验岗位名称 - * + * * @param postName 岗位名称 * @return 结果 */ @@ -92,7 +92,7 @@ public interface SysPostMapper /** * 校验岗位编码 - * + * * @param postCode 岗位编码 * @return 结果 */ diff --git a/ruoyi-system/src/main/java/com/ruoyi/system/mapper/SysTeacherMapper.java b/ruoyi-system/src/main/java/com/ruoyi/system/mapper/SysTeacherMapper.java new file mode 100644 index 0000000..464fb93 --- /dev/null +++ b/ruoyi-system/src/main/java/com/ruoyi/system/mapper/SysTeacherMapper.java @@ -0,0 +1,25 @@ +package com.ruoyi.system.mapper; + +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import com.ruoyi.course.domain.Context; +import com.ruoyi.system.domain.SysTeacher; +import com.ruoyi.system.domain.vo.ReqSearchStaff; +import com.ruoyi.system.domain.vo.RespTeacherInfo; +import org.apache.ibatis.annotations.Param; + +import java.util.List; +import java.util.Map; + +/** + *

+ * 教师信息 Mapper 接口 + *

+ * + * + * @since 2020-03-17 11:27:37 + */ +public interface SysTeacherMapper extends BaseMapper { + SysTeacher getOne(String userId); + List findList(Long visitStore); + +} diff --git a/ruoyi-system/src/main/java/com/ruoyi/system/mapper/SysUserMapper.java b/ruoyi-system/src/main/java/com/ruoyi/system/mapper/SysUserMapper.java index defe927..1fdc565 100644 --- a/ruoyi-system/src/main/java/com/ruoyi/system/mapper/SysUserMapper.java +++ b/ruoyi-system/src/main/java/com/ruoyi/system/mapper/SysUserMapper.java @@ -14,30 +14,6 @@ import java.util.List; public interface SysUserMapper { - int updateForContext(Context context); - /** - * 根据条件分页查询用户列表 - * - * @param sysUser 用户信息 - * @return 用户信息集合信息 - */ - public List selectUserList(SysUser sysUser); - - /** - * 根据条件分页查询已配用户角色列表 - * - * @param user 用户信息 - * @return 用户信息集合信息 - */ - public List selectAllocatedList(SysUser user); - - /** - * 根据条件分页查询未分配用户角色列表 - * - * @param user 用户信息 - * @return 用户信息集合信息 - */ - public List selectUnallocatedList(SysUser user); /** * 通过用户名查询用户 @@ -46,10 +22,7 @@ public interface SysUserMapper * @return 用户对象信息 */ public SysUser selectUserByUserName(String userName); - public SysUser selectUserByPhonenumber(String phonenumber); - public SysUser selectUserforM(String userName); - public int updateM(SysUser user); /** * 通过用户ID查询用户 @@ -59,80 +32,6 @@ public interface SysUserMapper */ public SysUser selectUserById(Long userId); - /** - * 新增用户信息 - * - * @param user 用户信息 - * @return 结果 - */ - public int insertUser(SysUser user); - - /** - * 修改用户信息 - * - * @param user 用户信息 - * @return 结果 - */ - public int updateUser(SysUser user); - - /** - * 修改用户头像 - * - * @param userName 用户名 - * @param avatar 头像地址 - * @return 结果 - */ - public int updateUserAvatar(@Param("userName") String userName, @Param("avatar") String avatar); - - /** - * 重置用户密码 - * - * @param userName 用户名 - * @param password 密码 - * @return 结果 - */ - public int resetUserPwd(@Param("userName") String userName, @Param("password") String password); - - /** - * 通过用户ID删除用户 - * - * @param userId 用户ID - * @return 结果 - */ - public int deleteUserById(Long userId); - - /** - * 批量删除用户信息 - * - * @param userIds 需要删除的用户ID - * @return 结果 - */ - public int deleteUserByIds(Long[] userIds); - - /** - * 校验用户名称是否唯一 - * - * @param userName 用户名称 - * @return 结果 - */ - public int checkUserNameUnique(String userName); - - /** - * 校验手机号码是否唯一 - * - * @param phonenumber 手机号码 - * @return 结果 - */ - public SysUser checkPhoneUnique(String phonenumber); - - /** - * 校验email是否唯一 - * - * @param email 用户邮箱 - * @return 结果 - */ - public SysUser checkEmailUnique(String email); - } diff --git a/ruoyi-system/src/main/java/com/ruoyi/system/service/ISysDeptService.java b/ruoyi-system/src/main/java/com/ruoyi/system/service/ISysDeptService.java index 166ba16..c4e68eb 100644 --- a/ruoyi-system/src/main/java/com/ruoyi/system/service/ISysDeptService.java +++ b/ruoyi-system/src/main/java/com/ruoyi/system/service/ISysDeptService.java @@ -1,19 +1,21 @@ package com.ruoyi.system.service; import java.util.List; + +import com.baomidou.mybatisplus.extension.service.IService; import com.ruoyi.common.core.domain.TreeSelect; import com.ruoyi.common.core.domain.entity.SysDept; /** * 部门管理 服务层 - * + * * @author ruoyi */ -public interface ISysDeptService +public interface ISysDeptService extends IService { /** * 查询部门管理数据 - * + * * @param dept 部门信息 * @return 部门信息集合 */ @@ -21,7 +23,7 @@ public interface ISysDeptService /** * 查询部门树结构信息 - * + * * @param dept 部门信息 * @return 部门树信息集合 */ @@ -29,7 +31,7 @@ public interface ISysDeptService /** * 构建前端所需要树结构 - * + * * @param depts 部门列表 * @return 树结构列表 */ @@ -37,7 +39,7 @@ public interface ISysDeptService /** * 构建前端所需要下拉树结构 - * + * * @param depts 部门列表 * @return 下拉树结构列表 */ @@ -45,7 +47,7 @@ public interface ISysDeptService /** * 根据角色ID查询部门树信息 - * + * * @param roleId 角色ID * @return 选中部门列表 */ @@ -53,7 +55,7 @@ public interface ISysDeptService /** * 根据部门ID查询信息 - * + * * @param deptId 部门ID * @return 部门信息 */ @@ -61,7 +63,7 @@ public interface ISysDeptService /** * 根据ID查询所有子部门(正常状态) - * + * * @param deptId 部门ID * @return 子部门数 */ @@ -69,7 +71,7 @@ public interface ISysDeptService /** * 是否存在部门子节点 - * + * * @param deptId 部门ID * @return 结果 */ @@ -77,7 +79,7 @@ public interface ISysDeptService /** * 查询部门是否存在用户 - * + * * @param deptId 部门ID * @return 结果 true 存在 false 不存在 */ @@ -85,7 +87,7 @@ public interface ISysDeptService /** * 校验部门名称是否唯一 - * + * * @param dept 部门信息 * @return 结果 */ @@ -93,14 +95,14 @@ public interface ISysDeptService /** * 校验部门是否有数据权限 - * + * * @param deptId 部门id */ public void checkDeptDataScope(Long deptId); /** * 新增保存部门信息 - * + * * @param dept 部门信息 * @return 结果 */ @@ -108,7 +110,7 @@ public interface ISysDeptService /** * 修改保存部门信息 - * + * * @param dept 部门信息 * @return 结果 */ @@ -116,7 +118,7 @@ public interface ISysDeptService /** * 删除部门管理信息 - * + * * @param deptId 部门ID * @return 结果 */ diff --git a/ruoyi-system/src/main/java/com/ruoyi/system/service/ISysPostService.java b/ruoyi-system/src/main/java/com/ruoyi/system/service/ISysPostService.java index 722f98f..fbf2ea3 100644 --- a/ruoyi-system/src/main/java/com/ruoyi/system/service/ISysPostService.java +++ b/ruoyi-system/src/main/java/com/ruoyi/system/service/ISysPostService.java @@ -24,7 +24,7 @@ public interface ISysPostService * * @return 岗位列表 */ - public List selectPostAll(String merchanId); + public List selectPostAll(String tenantId); /** * 通过岗位ID查询岗位信息 diff --git a/ruoyi-system/src/main/java/com/ruoyi/system/service/ISysUserService.java b/ruoyi-system/src/main/java/com/ruoyi/system/service/ISysUserService.java index bfd62a9..53c0721 100644 --- a/ruoyi-system/src/main/java/com/ruoyi/system/service/ISysUserService.java +++ b/ruoyi-system/src/main/java/com/ruoyi/system/service/ISysUserService.java @@ -6,203 +6,28 @@ import java.util.List; /** * 用户 业务层 - * + * * @author ruoyi */ public interface ISysUserService { - /** - * 根据条件分页查询用户列表 - * - * @param user 用户信息 - * @return 用户信息集合信息 - */ - public List selectUserList(SysUser user); - - /** - * 根据条件分页查询已分配用户角色列表 - * - * @param user 用户信息 - * @return 用户信息集合信息 - */ - public List selectAllocatedList(SysUser user); - - /** - * 根据条件分页查询未分配用户角色列表 - * - * @param user 用户信息 - * @return 用户信息集合信息 - */ - public List selectUnallocatedList(SysUser user); /** * 通过用户名查询用户 - * + * * @param userName 用户名 * @return 用户对象信息 */ public SysUser selectUserByUserName(String userName); - public SysUser selectUserByPhonenumber(String phonenumber); /** * 通过用户ID查询用户 - * + * * @param userId 用户ID * @return 用户对象信息 */ public SysUser selectUserById(Long userId); - /** - * 根据用户ID查询用户所属角色组 - * - * @param userName 用户名 - * @return 结果 - */ - public String selectUserRoleGroup(String userName); - - /** - * 根据用户ID查询用户所属岗位组 - * - * @param userName 用户名 - * @return 结果 - */ - public String selectUserPostGroup(String userName); - - /** - * 校验用户名称是否唯一 - * - * @param userName 用户名称 - * @return 结果 - */ - public String checkUserNameUnique(String userName); - - /** - * 校验手机号码是否唯一 - * - * @param user 用户信息 - * @return 结果 - */ - public String checkPhoneUnique(SysUser user); - - /** - * 校验email是否唯一 - * - * @param user 用户信息 - * @return 结果 - */ - public String checkEmailUnique(SysUser user); - - /** - * 校验用户是否允许操作 - * - * @param user 用户信息 - */ - public void checkUserAllowed(SysUser user); - - /** - * 校验用户是否有数据权限 - * - * @param userId 用户id - */ - public void checkUserDataScope(Long userId); - - /** - * 新增用户信息 - * - * @param user 用户信息 - * @return 结果 - */ - public int insertUser(SysUser user); - - /** - * 注册用户信息 - * - * @param user 用户信息 - * @return 结果 - */ - public boolean registerUser(SysUser user); - - /** - * 修改用户信息 - * - * @param user 用户信息 - * @return 结果 - */ - public int updateUser(SysUser user); - - /** - * 用户授权角色 - * - * @param userId 用户ID - * @param roleIds 角色组 - */ - public void insertUserAuth(Long userId, Long[] roleIds); - - /** - * 修改用户状态 - * - * @param user 用户信息 - * @return 结果 - */ - public int updateUserStatus(SysUser user); - - /** - * 修改用户基本信息 - * - * @param user 用户信息 - * @return 结果 - */ - public int updateUserProfile(SysUser user); - - /** - * 修改用户头像 - * - * @param userName 用户名 - * @param avatar 头像地址 - * @return 结果 - */ - public boolean updateUserAvatar(String userName, String avatar); - - /** - * 重置用户密码 - * - * @param user 用户信息 - * @return 结果 - */ - public int resetPwd(SysUser user); - - /** - * 重置用户密码 - * - * @param userName 用户名 - * @param password 密码 - * @return 结果 - */ - public int resetUserPwd(String userName, String password); - /** - * 通过用户ID删除用户 - * - * @param userId 用户ID - * @return 结果 - */ - public int deleteUserById(Long userId); - /** - * 批量删除用户信息 - * - * @param userIds 需要删除的用户ID - * @return 结果 - */ - public int deleteUserByIds(Long[] userIds); - - /** - * 导入用户数据 - * - * @param userList 用户数据列表 - * @param isUpdateSupport 是否更新支持,如果已存在,则进行更新数据 - * @param operName 操作用户 - * @return 结果 - */ - public String importUser(List userList, Boolean isUpdateSupport, String operName); } diff --git a/ruoyi-system/src/main/java/com/ruoyi/system/service/SysTeacherService.java b/ruoyi-system/src/main/java/com/ruoyi/system/service/SysTeacherService.java new file mode 100644 index 0000000..7f3ca82 --- /dev/null +++ b/ruoyi-system/src/main/java/com/ruoyi/system/service/SysTeacherService.java @@ -0,0 +1,24 @@ +package com.ruoyi.system.service; + +import com.baomidou.mybatisplus.extension.service.IService; +import com.ruoyi.system.domain.SysTeacher; + +import java.util.List; +import java.util.Map; + +/** + *

+ * 教师信息 服务类 + *

+ * + * + * @since 2020-03-17 11:27:37 + */ +public interface SysTeacherService extends IService { + + + + + List getList(Long visitStore); + SysTeacher getByUserId(String userId); +} diff --git a/ruoyi-system/src/main/java/com/ruoyi/system/service/impl/SysDeptServiceImpl.java b/ruoyi-system/src/main/java/com/ruoyi/system/service/impl/SysDeptServiceImpl.java index 98a10ee..1f3b88a 100644 --- a/ruoyi-system/src/main/java/com/ruoyi/system/service/impl/SysDeptServiceImpl.java +++ b/ruoyi-system/src/main/java/com/ruoyi/system/service/impl/SysDeptServiceImpl.java @@ -1,5 +1,6 @@ package com.ruoyi.system.service.impl; +import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; import com.ruoyi.common.annotation.DataScope; import com.ruoyi.common.constant.UserConstants; import com.ruoyi.common.core.domain.TreeSelect; @@ -29,7 +30,7 @@ import java.util.stream.Collectors; * @author ruoyi */ @Service -public class SysDeptServiceImpl implements ISysDeptService +public class SysDeptServiceImpl extends ServiceImpl implements ISysDeptService { @Autowired private SysDeptMapper deptMapper; @@ -54,7 +55,7 @@ public class SysDeptServiceImpl implements ISysDeptService * @return 部门信息集合 */ @Override - @DataScope(deptAlias = "d") +// @DataScope(deptAlias = "d") public List selectDeptList(SysDept dept) { return deptMapper.selectDeptList(dept); diff --git a/ruoyi-system/src/main/java/com/ruoyi/system/service/impl/SysDictDataServiceImpl.java b/ruoyi-system/src/main/java/com/ruoyi/system/service/impl/SysDictDataServiceImpl.java index 5a0c7a7..abf29a3 100644 --- a/ruoyi-system/src/main/java/com/ruoyi/system/service/impl/SysDictDataServiceImpl.java +++ b/ruoyi-system/src/main/java/com/ruoyi/system/service/impl/SysDictDataServiceImpl.java @@ -12,7 +12,7 @@ import java.util.List; /** * 字典 业务层处理 - * + * * @author ruoyi */ @Service @@ -23,7 +23,7 @@ public class SysDictDataServiceImpl implements ISysDictDataService /** * 根据条件分页查询字典数据 - * + * * @param dictData 字典数据信息 * @return 字典数据集合信息 */ @@ -35,7 +35,7 @@ public class SysDictDataServiceImpl implements ISysDictDataService /** * 根据字典类型和字典键值查询字典数据信息 - * + * * @param dictType 字典类型 * @param dictValue 字典键值 * @return 字典标签 @@ -46,13 +46,13 @@ public class SysDictDataServiceImpl implements ISysDictDataService SysDictData dictData=new SysDictData(); dictData.setDictValue(dictValue); dictData.setDictType(dictType); - dictData.setMerchantId(SecurityUtils.getMerchanId()); + dictData.setTenantId(SecurityUtils.getTenantId()); return dictDataMapper.selectDictLabel(dictData); } /** * 根据字典数据ID查询信息 - * + * * @param dictCode 字典数据ID * @return 字典数据 */ @@ -64,7 +64,7 @@ public class SysDictDataServiceImpl implements ISysDictDataService /** * 批量删除字典数据信息 - * + * * @param dictCodes 需要删除的字典数据ID */ @Override @@ -73,7 +73,7 @@ public class SysDictDataServiceImpl implements ISysDictDataService for (Long dictCode : dictCodes) { SysDictData data = selectDictDataById(dictCode); - data.setMerchantId(SecurityUtils.getMerchanId()); + data.setTenantId(SecurityUtils.getTenantId()); dictDataMapper.deleteDictDataById(dictCode); List dictDatas = dictDataMapper.selectDictDataByType(data); DictUtils.setDictCache(data.getDictType(), dictDatas); @@ -82,7 +82,7 @@ public class SysDictDataServiceImpl implements ISysDictDataService /** * 新增保存字典数据信息 - * + * * @param data 字典数据信息 * @return 结果 */ @@ -92,7 +92,7 @@ public class SysDictDataServiceImpl implements ISysDictDataService int row = dictDataMapper.insertDictData(data); if (row > 0) { - data.setMerchantId(SecurityUtils.getMerchanId()); + data.setTenantId(SecurityUtils.getTenantId()); List dictDatas = dictDataMapper.selectDictDataByType(data); DictUtils.setDictCache(data.getDictType(), dictDatas); } @@ -101,7 +101,7 @@ public class SysDictDataServiceImpl implements ISysDictDataService /** * 修改保存字典数据信息 - * + * * @param data 字典数据信息 * @return 结果 */ @@ -111,7 +111,7 @@ public class SysDictDataServiceImpl implements ISysDictDataService int row = dictDataMapper.updateDictData(data); if (row > 0) { - data.setMerchantId(SecurityUtils.getMerchanId()); + data.setTenantId(SecurityUtils.getTenantId()); List dictDatas = dictDataMapper.selectDictDataByType(data); DictUtils.setDictCache(data.getDictType(), dictDatas); } diff --git a/ruoyi-system/src/main/java/com/ruoyi/system/service/impl/SysDictTypeServiceImpl.java b/ruoyi-system/src/main/java/com/ruoyi/system/service/impl/SysDictTypeServiceImpl.java index dd7f7d5..82d3ee7 100644 --- a/ruoyi-system/src/main/java/com/ruoyi/system/service/impl/SysDictTypeServiceImpl.java +++ b/ruoyi-system/src/main/java/com/ruoyi/system/service/impl/SysDictTypeServiceImpl.java @@ -21,7 +21,7 @@ import java.util.stream.Collectors; /** * 字典 业务层处理 - * + * * @author ruoyi */ @Service @@ -44,7 +44,7 @@ public class SysDictTypeServiceImpl implements ISysDictTypeService /** * 根据条件分页查询字典类型 - * + * * @param dictType 字典类型信息 * @return 字典类型集合信息 */ @@ -56,7 +56,7 @@ public class SysDictTypeServiceImpl implements ISysDictTypeService /** * 根据所有字典类型 - * + * * @return 字典类型集合信息 */ @Override @@ -67,7 +67,7 @@ public class SysDictTypeServiceImpl implements ISysDictTypeService /** * 根据字典类型查询字典数据 - * + * * @param dictType 字典类型 * @return 字典数据集合信息 */ @@ -80,7 +80,7 @@ public class SysDictTypeServiceImpl implements ISysDictTypeService return dictDatas; } SysDictData dictData=new SysDictData(); - dictData.setMerchantId(SecurityUtils.getMerchanId()); + dictData.setTenantId(SecurityUtils.getTenantId()); dictData.setDictType(dictType); dictDatas = dictDataMapper.selectDictDataByType(dictData); if (StringUtils.isNotEmpty(dictDatas)) @@ -93,7 +93,7 @@ public class SysDictTypeServiceImpl implements ISysDictTypeService /** * 根据字典类型ID查询信息 - * + * * @param dictId 字典类型ID * @return 字典类型 */ @@ -105,7 +105,7 @@ public class SysDictTypeServiceImpl implements ISysDictTypeService /** * 根据字典类型查询信息 - * + * * @param dictType 字典类型 * @return 字典类型 */ @@ -117,7 +117,7 @@ public class SysDictTypeServiceImpl implements ISysDictTypeService /** * 批量删除字典类型信息 - * + * * @param dictIds 需要删除的字典ID */ @Override @@ -127,7 +127,7 @@ public class SysDictTypeServiceImpl implements ISysDictTypeService { SysDictType dictType = selectDictTypeById(dictId); SysDictData dictData=new SysDictData(); - dictData.setMerchantId(SecurityUtils.getMerchanId()); + dictData.setTenantId(SecurityUtils.getTenantId()); dictData.setDictType(dictType.getDictType()); if (dictDataMapper.countDictDataByType(dictData) > 0) { @@ -146,7 +146,7 @@ public class SysDictTypeServiceImpl implements ISysDictTypeService { SysDictData dictData = new SysDictData(); dictData.setStatus("0"); - dictData.setMerchantId(SecurityUtils.getMerchanId()); + dictData.setTenantId(SecurityUtils.getTenantId()); Map> dictDataMap = dictDataMapper.selectDictDataList(dictData).stream().collect(Collectors.groupingBy(SysDictData::getDictType)); for (Map.Entry> entry : dictDataMap.entrySet()) { @@ -175,7 +175,7 @@ public class SysDictTypeServiceImpl implements ISysDictTypeService /** * 新增保存字典类型信息 - * + * * @param dict 字典类型信息 * @return 结果 */ @@ -192,7 +192,7 @@ public class SysDictTypeServiceImpl implements ISysDictTypeService /** * 修改保存字典类型信息 - * + * * @param dict 字典类型信息 * @return 结果 */ @@ -201,12 +201,12 @@ public class SysDictTypeServiceImpl implements ISysDictTypeService public int updateDictType(SysDictType dict) { SysDictType oldDict = dictTypeMapper.selectDictTypeById(dict.getDictId()); - dictDataMapper.updateDictDataType(oldDict.getDictType(), dict.getDictType(),SecurityUtils.getMerchanId()); + dictDataMapper.updateDictDataType(oldDict.getDictType(), dict.getDictType(),SecurityUtils.getTenantId()); int row = dictTypeMapper.updateDictType(dict); if (row > 0) { SysDictData dictData=new SysDictData(); - dictData.setMerchantId(SecurityUtils.getMerchanId()); + dictData.setTenantId(SecurityUtils.getTenantId()); dictData.setDictType(dict.getDictType()); List dictDatas = dictDataMapper.selectDictDataByType(dictData); DictUtils.setDictCache(dict.getDictType(), dictDatas); @@ -216,7 +216,7 @@ public class SysDictTypeServiceImpl implements ISysDictTypeService /** * 校验字典类型称是否唯一 - * + * * @param dict 字典类型 * @return 结果 */ diff --git a/ruoyi-system/src/main/java/com/ruoyi/system/service/impl/SysPostServiceImpl.java b/ruoyi-system/src/main/java/com/ruoyi/system/service/impl/SysPostServiceImpl.java index fd3afc1..682fbd7 100644 --- a/ruoyi-system/src/main/java/com/ruoyi/system/service/impl/SysPostServiceImpl.java +++ b/ruoyi-system/src/main/java/com/ruoyi/system/service/impl/SysPostServiceImpl.java @@ -43,9 +43,9 @@ public class SysPostServiceImpl implements ISysPostService * @return 岗位列表 */ @Override - public List selectPostAll(String merchanId) + public List selectPostAll(String tenantId) { - return postMapper.selectPostAll( merchanId); + return postMapper.selectPostAll( tenantId); } /** diff --git a/ruoyi-system/src/main/java/com/ruoyi/system/service/impl/SysTeacherServiceImpl.java b/ruoyi-system/src/main/java/com/ruoyi/system/service/impl/SysTeacherServiceImpl.java new file mode 100644 index 0000000..034faf1 --- /dev/null +++ b/ruoyi-system/src/main/java/com/ruoyi/system/service/impl/SysTeacherServiceImpl.java @@ -0,0 +1,40 @@ +package com.ruoyi.system.service.impl; + +import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; +import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; +import com.ruoyi.course.domain.Context; +import com.ruoyi.system.domain.SysTeacher; +import com.ruoyi.system.domain.vo.ReqSearchStaff; +import com.ruoyi.system.domain.vo.RespTeacherInfo; +import com.ruoyi.system.mapper.SysTeacherMapper; +import com.ruoyi.system.service.SysTeacherService; +import org.apache.commons.lang3.StringUtils; +import org.springframework.stereotype.Service; + +import java.util.List; +import java.util.Map; + +/** + *

+ * 教师信息 服务实现类 + *

+ * + * + * @since 2020-03-17 11:27:37 + */ +@Service +public class SysTeacherServiceImpl extends ServiceImpl implements SysTeacherService { + + @Override + public List getList(Long visitStore){ + List list = baseMapper.findList(visitStore); + return list; + } + + @Override + public SysTeacher getByUserId(String userId){ + SysTeacher context = baseMapper.getOne(userId); + return context; + } + +} diff --git a/ruoyi-system/src/main/java/com/ruoyi/system/service/impl/SysUserServiceImpl.java b/ruoyi-system/src/main/java/com/ruoyi/system/service/impl/SysUserServiceImpl.java index 643f13e..1ee9983 100644 --- a/ruoyi-system/src/main/java/com/ruoyi/system/service/impl/SysUserServiceImpl.java +++ b/ruoyi-system/src/main/java/com/ruoyi/system/service/impl/SysUserServiceImpl.java @@ -42,65 +42,16 @@ public class SysUserServiceImpl implements ISysUserService @Autowired private SysUserMapper userMapper; - @Autowired - private SysRoleMapper roleMapper; - - @Autowired - private SysPostMapper postMapper; @Autowired private SysUserRoleMapper userRoleMapper; - @Autowired - private SysUserPostMapper userPostMapper; - @Autowired - private ISysConfigService configService; @Autowired protected Validator validator; - - /** - * 根据条件分页查询用户列表 - * - * @param user 用户信息 - * @return 用户信息集合信息 - */ - @Override - @DataScope(deptAlias = "d", userAlias = "u") - public List selectUserList(SysUser user) - { - return userMapper.selectUserList(user); - } - - /** - * 根据条件分页查询已分配用户角色列表 - * - * @param user 用户信息 - * @return 用户信息集合信息 - */ - @Override - @DataScope(deptAlias = "d", userAlias = "u") - public List selectAllocatedList(SysUser user) - { - return userMapper.selectAllocatedList(user); - } - - /** - * 根据条件分页查询未分配用户角色列表 - * - * @param user 用户信息 - * @return 用户信息集合信息 - */ - @Override - @DataScope(deptAlias = "d", userAlias = "u") - public List selectUnallocatedList(SysUser user) - { - return userMapper.selectUnallocatedList(user); - } - /** * 通过用户名查询用户 * @@ -113,9 +64,6 @@ public class SysUserServiceImpl implements ISysUserService return userMapper.selectUserByUserName(userName); } - public SysUser selectUserByPhonenumber(String phonenumber){ - return userMapper.selectUserByPhonenumber(phonenumber); - } /** * 通过用户ID查询用户 * @@ -128,437 +76,9 @@ public class SysUserServiceImpl implements ISysUserService return userMapper.selectUserById(userId); } - /** - * 查询用户所属角色组 - * - * @param userName 用户名 - * @return 结果 - */ - @Override - public String selectUserRoleGroup(String userName) - { - List list = roleMapper.selectRolesByUserName(userName); - if (CollectionUtils.isEmpty(list)) - { - return StringUtils.EMPTY; - } - return list.stream().map(SysRole::getRoleName).collect(Collectors.joining(",")); - } - - /** - * 查询用户所属岗位组 - * - * @param userName 用户名 - * @return 结果 - */ - @Override - public String selectUserPostGroup(String userName) - { - List list = postMapper.selectPostsByUserName(userName); - if (CollectionUtils.isEmpty(list)) - { - return StringUtils.EMPTY; - } - return list.stream().map(SysPost::getPostName).collect(Collectors.joining(",")); - } - - /** - * 校验用户名称是否唯一 - * - * @param userName 用户名称 - * @return 结果 - */ - @Override - public String checkUserNameUnique(String userName) - { - int count = userMapper.checkUserNameUnique(userName); - if (count > 0) - { - return UserConstants.NOT_UNIQUE; - } - return UserConstants.UNIQUE; - } - - /** - * 校验手机号码是否唯一 - * - * @param user 用户信息 - * @return - */ - @Override - public String checkPhoneUnique(SysUser user) - { - Long userId = StringUtils.isNull(user.getUserId()) ? -1L : user.getUserId(); - SysUser info = userMapper.checkPhoneUnique(user.getPhonenumber()); - if (StringUtils.isNotNull(info) && info.getUserId().longValue() != userId.longValue()) - { - return UserConstants.NOT_UNIQUE; - } - return UserConstants.UNIQUE; - } - /** - * 校验email是否唯一 - * - * @param user 用户信息 - * @return - */ - @Override - public String checkEmailUnique(SysUser user) - { - Long userId = StringUtils.isNull(user.getUserId()) ? -1L : user.getUserId(); - SysUser info = userMapper.checkEmailUnique(user.getEmail()); - if (StringUtils.isNotNull(info) && info.getUserId().longValue() != userId.longValue()) - { - return UserConstants.NOT_UNIQUE; - } - return UserConstants.UNIQUE; - } - /** - * 校验用户是否允许操作 - * - * @param user 用户信息 - */ - @Override - public void checkUserAllowed(SysUser user) - { - if (StringUtils.isNotNull(user.getUserId()) && user.isAdmin()) - { - throw new ServiceException("不允许操作超级管理员用户"); - } - } - /** - * 校验用户是否有数据权限 - * - * @param userId 用户id - */ - @Override - public void checkUserDataScope(Long userId) - { - if (!SysUser.isAdmin(SecurityUtils.getUserId())) - { - SysUser user = new SysUser(); - user.setUserId(userId); - List users = SpringUtils.getAopProxy(this).selectUserList(user); - if (StringUtils.isEmpty(users)) - { - throw new ServiceException("没有权限访问用户数据!"); - } - } - } - /** - * 新增保存用户信息 - * - * @param user 用户信息 - * @return 结果 - */ - @Override - @Transactional - public int insertUser(SysUser user) - { -// Long[] roleIds= user.getRoleIds(); -// if (roleIds.length>0){ -// for (Long l:roleIds){ -// if (l==100l){//原商家(租户) - if (StringUtils.isNotNull(user.getRoleId())&&user.getRoleId()==107l){//app注册的用户 - user.setMerchantId("-1"); - } -// } -// } - // 新增用户信息 - int rows = userMapper.insertUser(user); - // 新增用户岗位关联 - insertUserPost(user); - // 新增用户与角色管理 - insertUserRole(user); - return rows; - } - /** - * 注册用户信息 - * - * @param user 用户信息 - * @return 结果 - */ - @Override - public boolean registerUser(SysUser user) - { - return userMapper.insertUser(user) > 0; - } - - /** - * 修改保存用户信息 - * - * @param user 用户信息 - * @return 结果 - */ - @Override - @Transactional - public int updateUser(SysUser user) - { - Long userId = user.getUserId(); - // 删除用户与角色关联 - userRoleMapper.deleteUserRoleByUserId(userId); - // 新增用户与角色管理 - insertUserRole(user); - // 删除用户与岗位关联 - userPostMapper.deleteUserPostByUserId(userId); - // 新增用户与岗位管理 - insertUserPost(user); - return userMapper.updateUser(user); - } - - /** - * 用户授权角色 - * - * @param userId 用户ID - * @param roleIds 角色组 - */ - @Override - @Transactional - public void insertUserAuth(Long userId, Long[] roleIds) - { - userRoleMapper.deleteUserRoleByUserId(userId); - insertUserRole(userId, roleIds); - } - - /** - * 修改用户状态 - * - * @param user 用户信息 - * @return 结果 - */ - @Override - public int updateUserStatus(SysUser user) - { - return userMapper.updateUser(user); - } - - /** - * 修改用户基本信息 - * - * @param user 用户信息 - * @return 结果 - */ - @Override - public int updateUserProfile(SysUser user) - { - return userMapper.updateUser(user); - } - - /** - * 修改用户头像 - * - * @param userName 用户名 - * @param avatar 头像地址 - * @return 结果 - */ - @Override - public boolean updateUserAvatar(String userName, String avatar) - { - return userMapper.updateUserAvatar(userName, avatar) > 0; - } - - /** - * 重置用户密码 - * - * @param user 用户信息 - * @return 结果 - */ - @Override - public int resetPwd(SysUser user) - { - return userMapper.updateUser(user); - } - - /** - * 重置用户密码 - * - * @param userName 用户名 - * @param password 密码 - * @return 结果 - */ - @Override - public int resetUserPwd(String userName, String password) - { - return userMapper.resetUserPwd(userName, password); - } - - /** - * 新增用户角色信息 - * - * @param user 用户对象 - */ - public void insertUserRole(SysUser user) - { - this.insertUserRole(user.getUserId(), user.getRoleIds()); - } - - /** - * 新增用户岗位信息 - * - * @param user 用户对象 - */ - public void insertUserPost(SysUser user) - { - Long[] posts = user.getPostIds(); - if (StringUtils.isNotEmpty(posts)) - { - // 新增用户与岗位管理 - List list = new ArrayList(posts.length); - for (Long postId : posts) - { - SysUserPost up = new SysUserPost(); - up.setUserId(user.getUserId()); - up.setPostId(postId); - list.add(up); - } - userPostMapper.batchUserPost(list); - } - } - - /** - * 新增用户角色信息 - * - * @param userId 用户ID - * @param roleIds 角色组 - */ - public void insertUserRole(Long userId, Long[] roleIds) - { - if (StringUtils.isNotEmpty(roleIds)) - { - // 新增用户与角色管理 - List list = new ArrayList(roleIds.length); - for (Long roleId : roleIds) - { - SysUserRole ur = new SysUserRole(); - ur.setUserId(userId); - ur.setRoleId(roleId); - list.add(ur); - } - userRoleMapper.batchUserRole(list); - } - } - - /** - * 通过用户ID删除用户 - * - * @param userId 用户ID - * @return 结果 - */ - @Override - @Transactional - public int deleteUserById(Long userId) - { - // 删除用户与角色关联 - userRoleMapper.deleteUserRoleByUserId(userId); - // 删除用户与岗位表 - userPostMapper.deleteUserPostByUserId(userId); - return userMapper.deleteUserById(userId); - } - - /** - * 批量删除用户信息 - * - * @param userIds 需要删除的用户ID - * @return 结果 - */ - @Override - @Transactional - public int deleteUserByIds(Long[] userIds) - { - for (Long userId : userIds) - { - checkUserAllowed(new SysUser(userId)); - checkUserDataScope(userId); - } - // 删除用户与角色关联 - userRoleMapper.deleteUserRole(userIds); - // 删除用户与岗位关联 - userPostMapper.deleteUserPost(userIds); - return userMapper.deleteUserByIds(userIds); - } - - /** - * 导入用户数据 - * - * @param userList 用户数据列表 - * @param isUpdateSupport 是否更新支持,如果已存在,则进行更新数据 - * @param operName 操作用户 - * @return 结果 - */ - @Override - public String importUser(List userList, Boolean isUpdateSupport, String operName) - { - if (StringUtils.isNull(userList) || userList.size() == 0) - { - throw new ServiceException("导入用户数据不能为空!"); - } - int successNum = 0; - int failureNum = 0; - StringBuilder successMsg = new StringBuilder(); - StringBuilder failureMsg = new StringBuilder(); - String password = configService.selectConfigByKey("sys.user.initPassword"); - for (SysUser user : userList) - { - try - { - // 验证是否存在这个用户 - SysUser u = userMapper.selectUserByUserName(user.getUserName()); - if (StringUtils.isNull(u)) - { - BeanValidators.validateWithException(validator, user); - user.setPassword(SecurityUtils.encryptPassword(password)); - user.setCreateBy(operName); - this.insertUser(user); - successNum++; - successMsg.append("
" + successNum + "、账号 " + user.getUserName() + " 导入成功"); - } - else if (isUpdateSupport) - { - BeanValidators.validateWithException(validator, user); - user.setUpdateBy(operName); - this.updateUser(user); - successNum++; - successMsg.append("
" + successNum + "、账号 " + user.getUserName() + " 更新成功"); - } - else - { - failureNum++; - failureMsg.append("
" + failureNum + "、账号 " + user.getUserName() + " 已存在"); - } - } - catch (Exception e) - { - failureNum++; - String msg = "
" + failureNum + "、账号 " + user.getUserName() + " 导入失败:"; - failureMsg.append(msg + e.getMessage()); - log.error(msg, e); - } - } - if (failureNum > 0) - { - failureMsg.insert(0, "很抱歉,导入失败!共 " + failureNum + " 条数据格式不正确,错误如下:"); - throw new ServiceException(failureMsg.toString()); - } - else - { - successMsg.insert(0, "恭喜您,数据已全部导入成功!共 " + successNum + " 条,数据如下:"); - } - return successMsg.toString(); - } - - public void updateById(Context context) { - userMapper.updateForContext(context); - } - - - public List getList(Map params) { - - - return null; - } } diff --git a/ruoyi-system/src/main/resources/mapper/basic/YjStoreMapper.xml b/ruoyi-system/src/main/resources/mapper/basic/YjStoreMapper.xml index f373021..37deaa3 100644 --- a/ruoyi-system/src/main/resources/mapper/basic/YjStoreMapper.xml +++ b/ruoyi-system/src/main/resources/mapper/basic/YjStoreMapper.xml @@ -2,19 +2,49 @@ - - - - - - + + + - + SELECT b.dept_id as id,a.store_name,b.parent_id,a.address,a.phone + from yj_store a,sys_dept b,sys_tenant c + WHERE a.dept_id=b.dept_id and b.tenant_id=c.tenant_id + and c.super_tenant != 1 + and b.parent_id='0' + and a.display=1 + and c.in_use='0' + and c.delete_flag='0' + and now() between c.begin_time and c.end_time - + SELECT b.dept_id as id,a.store_name,b.parent_id,a.address,a.phone + from yj_store a,sys_dept b + WHERE a.dept_id=b.dept_id + and b.parent_id=#{id} and a.display=1 diff --git a/ruoyi-system/src/main/resources/mapper/cource/ContextMapper.xml b/ruoyi-system/src/main/resources/mapper/cource/ContextMapper.xml deleted file mode 100644 index bd934d6..0000000 --- a/ruoyi-system/src/main/resources/mapper/cource/ContextMapper.xml +++ /dev/null @@ -1,33 +0,0 @@ - - - - - - - - - - - - - - - - - - - user_id, user_name, sex, phonenumber, avatar,context,releases,url,intro - - - - - - diff --git a/ruoyi-system/src/main/resources/mapper/cource/ScBookCourseLogMapper.xml b/ruoyi-system/src/main/resources/mapper/cource/ScBookCourseLogMapper.xml new file mode 100644 index 0000000..d4c63a9 --- /dev/null +++ b/ruoyi-system/src/main/resources/mapper/cource/ScBookCourseLogMapper.xml @@ -0,0 +1,7 @@ + + + + + + + diff --git a/ruoyi-system/src/main/resources/mapper/cource/ScBookCourseMapper.xml b/ruoyi-system/src/main/resources/mapper/cource/ScBookCourseMapper.xml new file mode 100644 index 0000000..9a986b9 --- /dev/null +++ b/ruoyi-system/src/main/resources/mapper/cource/ScBookCourseMapper.xml @@ -0,0 +1,66 @@ + + + + + + + + + diff --git a/ruoyi-system/src/main/resources/mapper/cource/ScClaTimeAttendMapper.xml b/ruoyi-system/src/main/resources/mapper/cource/ScClaTimeAttendMapper.xml new file mode 100644 index 0000000..78948c7 --- /dev/null +++ b/ruoyi-system/src/main/resources/mapper/cource/ScClaTimeAttendMapper.xml @@ -0,0 +1,19 @@ + + + + + + diff --git a/ruoyi-system/src/main/resources/mapper/cource/ScClaTimeMapper.xml b/ruoyi-system/src/main/resources/mapper/cource/ScClaTimeMapper.xml index eaa02b8..9ea7773 100644 --- a/ruoyi-system/src/main/resources/mapper/cource/ScClaTimeMapper.xml +++ b/ruoyi-system/src/main/resources/mapper/cource/ScClaTimeMapper.xml @@ -2,19 +2,69 @@ - + select b.course_time_id, + b.cla_id, + b.cla_date, + WEEKDAY(b.cla_date) + 1 as week_day, + hour(b.start_time) as start_hour,b.start_time, + b.end_time, + b.source, + b.status, + b.memo, + b.class_theme, + a.cla_name, + a.cla_color, + course.course_name, + s.user_id as teacher_id, + s.teacher_name as staff_name, + r.room_id, + r.room_name + from sc_course_cla a + left join sc_course course on a.course_id=course.course_id + ,sc_cla_time b + left join sys_teacher s on b.teacher_id = s.user_id + left join sc_room r on b.room_id = r.room_id + where a.cla_id=b.cla_id + + and b.course_time_id=#{courseTimeId} + + + and b.cla_date between #{beginDate} and #{endDate} + + + and a.cla_id=#{claId} + + + and a.depart_id=#{deptId} + + + and b.teacher_id=#{teacherId} + + + and a.course_id = #{courseId} + + + and b.status = '1' + + + and b.status = '2' + + order by b.cla_date,b.status,b.start_time + + - - + SELECT + c.course_time_id, + a.course_name, + c.room_name, + d.teacher_name as staff_Name, + b.cla_name, + b.cla_color, + b.cla_pic, + c.cla_date, + c.start_time, + c.end_time, + c.book_attend_cnt, + c.at_class_cnt, + c.status as cla_time_status, + c.room_name, + c.book_attend_cnt, + c.at_class_cnt, + c.less_cnt, + e.store_name + + from + sc_course a, + sc_course_cla b, + sc_cla_time c, + sys_teacher d, + yj_store e + + WHERE a.course_id=b.course_id + and b.cla_id=c.cla_id + and c.teacher_id=d.user_id + and b.depart_id=e.dept_id + + and c.cla_date =#{date} - - and b.depart_id=#{deptId} + + and c.course_time_id =#{courseTimeId} - - and exists(select 1 from sys_user_dept ud - where ud.user_id=#{userId} - and (ud.dept_id=b.depart_id or ud.dept_id=-1)) + + and e.dept_id =#{deptId} + + + + + + + + + + + + + + diff --git a/ruoyi-system/src/main/resources/mapper/cource/ScCourseClaMapper.xml b/ruoyi-system/src/main/resources/mapper/cource/ScCourseClaMapper.xml new file mode 100644 index 0000000..89cb73d --- /dev/null +++ b/ruoyi-system/src/main/resources/mapper/cource/ScCourseClaMapper.xml @@ -0,0 +1,86 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/ruoyi-system/src/main/resources/mapper/cource/ScCourseMapper.xml b/ruoyi-system/src/main/resources/mapper/cource/ScCourseMapper.xml new file mode 100644 index 0000000..bdfef09 --- /dev/null +++ b/ruoyi-system/src/main/resources/mapper/cource/ScCourseMapper.xml @@ -0,0 +1,126 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/ruoyi-system/src/main/resources/mapper/cource/ScMemberCardMapper.xml b/ruoyi-system/src/main/resources/mapper/cource/ScMemberCardMapper.xml new file mode 100644 index 0000000..9ad1596 --- /dev/null +++ b/ruoyi-system/src/main/resources/mapper/cource/ScMemberCardMapper.xml @@ -0,0 +1,127 @@ + + + + + + + + + + + + diff --git a/ruoyi-system/src/main/resources/mapper/cource/ScRoomMapper.xml b/ruoyi-system/src/main/resources/mapper/cource/ScRoomMapper.xml new file mode 100644 index 0000000..06d5c76 --- /dev/null +++ b/ruoyi-system/src/main/resources/mapper/cource/ScRoomMapper.xml @@ -0,0 +1,6 @@ + + + + + + diff --git a/ruoyi-system/src/main/resources/mapper/cource/ScStudentCourseLogMapper.xml b/ruoyi-system/src/main/resources/mapper/cource/ScStudentCourseLogMapper.xml new file mode 100644 index 0000000..d16ee8d --- /dev/null +++ b/ruoyi-system/src/main/resources/mapper/cource/ScStudentCourseLogMapper.xml @@ -0,0 +1,5 @@ + + + + + diff --git a/ruoyi-system/src/main/resources/mapper/cource/ScStudentCourseMapper.xml b/ruoyi-system/src/main/resources/mapper/cource/ScStudentCourseMapper.xml new file mode 100644 index 0000000..a4bf5f6 --- /dev/null +++ b/ruoyi-system/src/main/resources/mapper/cource/ScStudentCourseMapper.xml @@ -0,0 +1,194 @@ + + + + + + + + + + + delete from sc_student_course where student_course_id=#{studentCourseId} and charge_type ]]> 'date' and total_hour=0 and total_fee=0 + + + delete from sc_student_course where student_course_id=#{studentCourseId} and charge_type = 'date' and total_day=0 and total_fee=0 + + + + + diff --git a/ruoyi-system/src/main/resources/mapper/cource/ScStudentCourseOrderMapper.xml b/ruoyi-system/src/main/resources/mapper/cource/ScStudentCourseOrderMapper.xml new file mode 100644 index 0000000..89e61e0 --- /dev/null +++ b/ruoyi-system/src/main/resources/mapper/cource/ScStudentCourseOrderMapper.xml @@ -0,0 +1,52 @@ + + + + + + + + + + + update sc_student_course_order set balance_hour = #{newHour} where course_order_id=#{courseOrderId} and balance_hour = #{oldHour} + + diff --git a/ruoyi-system/src/main/resources/mapper/cource/ScStudentMapper.xml b/ruoyi-system/src/main/resources/mapper/cource/ScStudentMapper.xml new file mode 100644 index 0000000..70812fc --- /dev/null +++ b/ruoyi-system/src/main/resources/mapper/cource/ScStudentMapper.xml @@ -0,0 +1,6 @@ + + + + + + diff --git a/ruoyi-system/src/main/resources/mapper/im/FriendMapper.xml b/ruoyi-system/src/main/resources/mapper/im/FriendMapper.xml index 219dd2b..803a36c 100644 --- a/ruoyi-system/src/main/resources/mapper/im/FriendMapper.xml +++ b/ruoyi-system/src/main/resources/mapper/im/FriendMapper.xml @@ -2,5 +2,36 @@ + + + diff --git a/ruoyi-system/src/main/resources/mapper/im/GroupMapper.xml b/ruoyi-system/src/main/resources/mapper/im/GroupMapper.xml new file mode 100644 index 0000000..5954fe4 --- /dev/null +++ b/ruoyi-system/src/main/resources/mapper/im/GroupMapper.xml @@ -0,0 +1,18 @@ + + + + + + + + diff --git a/ruoyi-system/src/main/resources/mapper/mall/AftersaleItemMapper.xml b/ruoyi-system/src/main/resources/mapper/mall/AftersaleItemMapper.xml index 4064774..b66e592 100644 --- a/ruoyi-system/src/main/resources/mapper/mall/AftersaleItemMapper.xml +++ b/ruoyi-system/src/main/resources/mapper/mall/AftersaleItemMapper.xml @@ -25,34 +25,34 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" select id, member_id, order_id, order_item_id, return_amount, quantity, create_by, create_time, update_by, update_time from oms_aftersale_item - - insert into oms_aftersale_item - (member_id,order_id,aftersale_id,order_item_id,return_amount,quantity,create_by,create_time,update_by,update_time) - values - - - #{item.memberId,jdbcType=BIGINT}, - #{item.orderId,jdbcType=BIGINT}, - #{item.aftersaleId,jdbcType=BIGINT}, - #{item.orderItemId,jdbcType=BIGINT}, - #{item.returnAmount,jdbcType=DECIMAL}, - #{item.quantity,jdbcType=BIGINT}, - #{item.createBy,jdbcType=BIGINT}, - #{item.createTime,jdbcType=DATE}, - #{item.updateBy,jdbcType=BIGINT}, - #{item.updateTime,jdbcType=DATE} - - - + + + + + + + + + + + + + + + + + + + - + + + + + + + + + + diff --git a/ruoyi-system/src/main/resources/mapper/mall/MemberCartMapper.xml b/ruoyi-system/src/main/resources/mapper/mall/MemberCartMapper.xml index 46aebc4..065c4a1 100644 --- a/ruoyi-system/src/main/resources/mapper/mall/MemberCartMapper.xml +++ b/ruoyi-system/src/main/resources/mapper/mall/MemberCartMapper.xml @@ -73,4 +73,9 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" from ums_member_cart where create_time between #{startTime} and #{endTime} + diff --git a/ruoyi-system/src/main/resources/mapper/mall/OrderItemMapper.xml b/ruoyi-system/src/main/resources/mapper/mall/OrderItemMapper.xml index 221aec8..3d8e2a1 100644 --- a/ruoyi-system/src/main/resources/mapper/mall/OrderItemMapper.xml +++ b/ruoyi-system/src/main/resources/mapper/mall/OrderItemMapper.xml @@ -53,4 +53,12 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" and sp_data = #{spData} + + diff --git a/ruoyi-system/src/main/resources/mapper/mall/OrderMapper.xml b/ruoyi-system/src/main/resources/mapper/mall/OrderMapper.xml index 6d13cdc..3b27c7f 100644 --- a/ruoyi-system/src/main/resources/mapper/mall/OrderMapper.xml +++ b/ruoyi-system/src/main/resources/mapper/mall/OrderMapper.xml @@ -155,7 +155,7 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" delete_status=0 and id=#{orderId} - select IFNULL(sum(case when status=0 and aftersale_status=1 then 1 else 0 end),0) unpaid, IFNULL(sum(case when status=1 and aftersale_status=1 then 1 else 0 end),0) nosend, @@ -173,5 +173,41 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" from oms_order where status in (1,2,3) and create_time between #{startTime} and #{endTime} - + diff --git a/ruoyi-system/src/main/resources/mapper/mall/ProductMapper.xml b/ruoyi-system/src/main/resources/mapper/mall/ProductMapper.xml index 39c2dcd..b03b62d 100644 --- a/ruoyi-system/src/main/resources/mapper/mall/ProductMapper.xml +++ b/ruoyi-system/src/main/resources/mapper/mall/ProductMapper.xml @@ -55,4 +55,11 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" and product_category_name like concat('%', #{productCategoryName}, '%') + + diff --git a/ruoyi-system/src/main/resources/mapper/mall/UserFavoriteMapper.xml b/ruoyi-system/src/main/resources/mapper/mall/UserFavoriteMapper.xml new file mode 100644 index 0000000..2ee9b9a --- /dev/null +++ b/ruoyi-system/src/main/resources/mapper/mall/UserFavoriteMapper.xml @@ -0,0 +1,24 @@ + + + + + + diff --git a/ruoyi-system/src/main/resources/mapper/system/SysDeptMapper.xml b/ruoyi-system/src/main/resources/mapper/system/SysDeptMapper.xml index e00dc4a..ad19b38 100644 --- a/ruoyi-system/src/main/resources/mapper/system/SysDeptMapper.xml +++ b/ruoyi-system/src/main/resources/mapper/system/SysDeptMapper.xml @@ -14,7 +14,7 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" - + @@ -23,7 +23,7 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" - select d.dept_id, d.parent_id, d.ancestors, d.dept_name, d.order_num, d.leader, d.phone, d.email, d.status, d.del_flag, d.create_by, d.create_time + select d.dept_id, d.parent_id, d.ancestors, d.dept_name, d.order_num, d.leader, d.phone, d.email, d.status, d.delete_flag, d.create_by, d.create_time from sys_dept d @@ -32,7 +32,6 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" select * from sys_dept where del_flag = '0' AND parent_id ]]> 0 - AND merchan_id = #{merchanId} AND status = '0' AND display= #{display} @@ -64,13 +63,10 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" @@ -136,7 +133,7 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" email, status, create_by, - merchan_id, + create_time )values( #{deptId}, @@ -149,7 +146,7 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" #{email}, #{status}, #{createBy}, - #{merchanId}, + sysdate() ) diff --git a/ruoyi-system/src/main/resources/mapper/system/SysTeacherMapper.xml b/ruoyi-system/src/main/resources/mapper/system/SysTeacherMapper.xml new file mode 100644 index 0000000..976e02a --- /dev/null +++ b/ruoyi-system/src/main/resources/mapper/system/SysTeacherMapper.xml @@ -0,0 +1,52 @@ + + + + + + + + + + + + + + + + + + user_id, user_name, sex, phonenumber, avatar,context,releases,url,intro + + + + + diff --git a/ruoyi-system/src/main/resources/mapper/system/SysUserMapper.xml b/ruoyi-system/src/main/resources/mapper/system/SysUserMapper.xml index fcade54..5b7340d 100644 --- a/ruoyi-system/src/main/resources/mapper/system/SysUserMapper.xml +++ b/ruoyi-system/src/main/resources/mapper/system/SysUserMapper.xml @@ -4,21 +4,6 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd"> - - update sys_user - - user_name = #{userName}, - phonenumber = #{phonenumber}, - sex = #{sex}, - avatar = #{avatar}, - context = #{context}, - releases = #{releases}, - url = #{url}, - intro = #{intro}, - update_time = sysdate() - - where user_id = #{userId} - @@ -30,17 +15,9 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" - + - - - - - - - - @@ -50,8 +27,7 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" - - + @@ -64,208 +40,33 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" - - - - update sys_user set merchant_id = #{merchantId} , dept_id=#{deptId} where user_id = #{userId} - - select u.user_id, u.dept_id, u.user_name, u.nick_name, u.email, u.avatar, u.phonenumber, u.password, u.sex, u.status, u.del_flag, u.login_ip, u.login_date, u.create_by, u.create_time, u.remark, u.ven_id,u.visit_store, - d.dept_id, d.parent_id, d.ancestors, d.dept_name, d.order_num, d.leader, d.status as dept_status, + select u.user_id, u.dept_id, u.user_name, u.nick_name, u.email, u.avatar, u.phonenumber, u.password, u.sex, u.status, u.delete_flag, u.login_ip, u.login_date, u.create_by, u.create_time, u.remark, + d.dept_id, d.parent_id, d.ancestors, d.dept_name,d.order_num , d.leader_id, d.status as dept_status, r.role_id, r.role_name, r.role_key, r.role_sort, r.data_scope, r.status as role_status from sys_user u left join sys_dept d on u.dept_id = d.dept_id left join sys_user_role ur on u.user_id = ur.user_id left join sys_role r on r.role_id = ur.role_id + left join sys_tenant t on u.tenant_id=t.tenant_id - - - - - - - - - - - - - - - - - insert into sys_user( - user_id, - dept_id, - user_name, - nick_name, - email, - avatar, - phonenumber, - sex, - password, - status, - create_by, - remark, - ven_id, - merchant_id, - create_time - )values( - #{userId}, - #{deptId}, - #{userName}, - #{nickName}, - #{email}, - #{avatar}, - #{phonenumber}, - #{sex}, - #{password}, - #{status}, - #{createBy}, - #{remark}, - #{ven_id}, - #{merchantId}, - sysdate() - ) - - - - update sys_user - - dept_id = #{deptId}, - user_name = #{userName}, - nick_name = #{nickName}, - email = #{email}, - phonenumber = #{phonenumber}, - sex = #{sex}, - avatar = #{avatar}, - password = #{password}, - status = #{status}, - login_ip = #{loginIp}, - login_date = #{loginDate}, - update_by = #{updateBy}, - remark = #{remark}, - visit_store = #{visitStore}, - register_id = #{registerId}, - update_time = sysdate() - - where user_id = #{userId} - - - - update sys_user set status = #{status} where user_id = #{userId} - - - - update sys_user set avatar = #{avatar} where user_name = #{userName} - - - - update sys_user set password = #{password} where user_name = #{userName} - - - - update sys_user set del_flag = '2' where user_id = #{userId} - - - - update sys_user set del_flag = '2' where user_id in - - #{userId} - -