From c8d2bd1df0088d6bf74d3f857283782961d7d441 Mon Sep 17 00:00:00 2001 From: Cxx0822 <1556464090@qq.com> Date: Thu, 30 Oct 2025 15:00:00 +0800 Subject: [PATCH] =?UTF-8?q?feat:=E5=A2=9E=E5=8A=A0=E6=9C=88=E7=BB=8F?= =?UTF-8?q?=E6=97=A5=E6=9C=9F=E7=BB=9F=E8=AE=A1?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../cxx/home/controller/PeriodController.java | 7 +++ .../cxx/home/converter/JournalConverter.java | 18 +++++++ .../com/cxx/home/converter/KpiConverter.java | 18 +++++++ .../cxx/home/converter/ProductConverter.java | 18 +++++++ .../main/java/com/cxx/home/dao/KpiDao.java | 13 ----- .../java/com/cxx/home/dao/ProductDao.java | 4 -- .../home/dto/period/MenstrualPeriodDto.java | 13 +++++ .../com/cxx/home/dto/period/PeriodDayDto.java | 4 +- .../java/com/cxx/home/entity/PeriodDay.java | 4 +- .../com/cxx/home/service/PeriodService.java | 3 ++ .../home/service/impl/FoodServiceImpl.java | 2 +- .../home/service/impl/JournalServiceImpl.java | 16 +++++- .../cxx/home/service/impl/KpiServiceImpl.java | 19 +++++-- .../service/impl/PasswordServiceImpl.java | 23 ++++---- .../home/service/impl/PeriodServiceImpl.java | 52 +++++++++++++++++-- .../home/service/impl/ProductServiceImpl.java | 12 ++++- .../java/com/cxx/home/util/CommonUtils.java | 13 +++++ .../src/main/resources/mapper/KpiMapper.xml | 15 ------ .../main/resources/mapper/PasswordMapper.xml | 18 +++---- .../main/resources/mapper/ProductMapper.xml | 45 +++++----------- 20 files changed, 213 insertions(+), 104 deletions(-) create mode 100644 home-service/src/main/java/com/cxx/home/converter/JournalConverter.java create mode 100644 home-service/src/main/java/com/cxx/home/converter/KpiConverter.java create mode 100644 home-service/src/main/java/com/cxx/home/converter/ProductConverter.java delete mode 100644 home-service/src/main/java/com/cxx/home/dao/KpiDao.java create mode 100644 home-service/src/main/java/com/cxx/home/dto/period/MenstrualPeriodDto.java create mode 100644 home-service/src/main/java/com/cxx/home/util/CommonUtils.java delete mode 100644 home-service/src/main/resources/mapper/KpiMapper.xml diff --git a/home-service/src/main/java/com/cxx/home/controller/PeriodController.java b/home-service/src/main/java/com/cxx/home/controller/PeriodController.java index 62ec578..2ff69be 100644 --- a/home-service/src/main/java/com/cxx/home/controller/PeriodController.java +++ b/home-service/src/main/java/com/cxx/home/controller/PeriodController.java @@ -2,6 +2,7 @@ package com.cxx.home.controller; import com.cxx.common.ReadView; import com.cxx.common.WriteView; +import com.cxx.home.dto.period.MenstrualPeriodDto; import com.cxx.home.dto.period.PeriodDayDto; import com.cxx.home.dto.period.PeriodSettingDto; import com.cxx.home.service.PeriodService; @@ -39,6 +40,12 @@ public class PeriodController { return periodService.getMenstruateFirstDate(month); } + @Operation(summary = "获取月经周期天数") + @GetMapping("/menstruate/days") + public List getMenstrualPeriod() { + return periodService.getMenstrualPeriod(); + } + @Operation(summary = "查询月经设置") @GetMapping("/setting") public @JsonView(ReadView.class) PeriodSettingDto queryPeriodSetting() { diff --git a/home-service/src/main/java/com/cxx/home/converter/JournalConverter.java b/home-service/src/main/java/com/cxx/home/converter/JournalConverter.java new file mode 100644 index 0000000..7bdc7a5 --- /dev/null +++ b/home-service/src/main/java/com/cxx/home/converter/JournalConverter.java @@ -0,0 +1,18 @@ +package com.cxx.home.converter; + +import com.cxx.home.dto.journal.JournalDto; +import com.cxx.home.entity.Journal; +import org.mapstruct.Mapper; + +import java.util.List; + +@Mapper(componentModel = "spring") +public interface JournalConverter { + Journal toEntity(JournalDto dto); + + List toEntities(List dto); + + JournalDto toDto(Journal entities); + + List toDtos(List entities); +} diff --git a/home-service/src/main/java/com/cxx/home/converter/KpiConverter.java b/home-service/src/main/java/com/cxx/home/converter/KpiConverter.java new file mode 100644 index 0000000..538cd07 --- /dev/null +++ b/home-service/src/main/java/com/cxx/home/converter/KpiConverter.java @@ -0,0 +1,18 @@ +package com.cxx.home.converter; + +import com.cxx.home.dto.kpi.KpiDto; +import com.cxx.home.entity.Kpi; +import org.mapstruct.Mapper; + +import java.util.List; + +@Mapper(componentModel = "spring") +public interface KpiConverter { + Kpi toEntity(KpiDto dto); + + List toEntities(List dto); + + KpiDto toDto(Kpi entities); + + List toDtos(List entities); +} diff --git a/home-service/src/main/java/com/cxx/home/converter/ProductConverter.java b/home-service/src/main/java/com/cxx/home/converter/ProductConverter.java new file mode 100644 index 0000000..13f7866 --- /dev/null +++ b/home-service/src/main/java/com/cxx/home/converter/ProductConverter.java @@ -0,0 +1,18 @@ +package com.cxx.home.converter; + +import com.cxx.home.dto.product.ProductDto; +import com.cxx.home.entity.Product; +import org.mapstruct.Mapper; + +import java.util.List; + +@Mapper(componentModel = "spring") +public interface ProductConverter { + Product toEntity(ProductDto dto); + + List toEntities(List dto); + + ProductDto toDto(Product entities); + + List toDtos(List entities); +} diff --git a/home-service/src/main/java/com/cxx/home/dao/KpiDao.java b/home-service/src/main/java/com/cxx/home/dao/KpiDao.java deleted file mode 100644 index 9190241..0000000 --- a/home-service/src/main/java/com/cxx/home/dao/KpiDao.java +++ /dev/null @@ -1,13 +0,0 @@ -package com.cxx.home.dao; - -import com.cxx.home.dto.kpi.KpiDto; -import com.cxx.home.vo.KpiQueryVo; -import org.apache.ibatis.annotations.Mapper; -import org.apache.ibatis.annotations.Param; - -import java.util.List; - -@Mapper -public interface KpiDao { - List queryKpi(@Param("query") KpiQueryVo queryVo); -} diff --git a/home-service/src/main/java/com/cxx/home/dao/ProductDao.java b/home-service/src/main/java/com/cxx/home/dao/ProductDao.java index 8a6747b..46079d1 100644 --- a/home-service/src/main/java/com/cxx/home/dao/ProductDao.java +++ b/home-service/src/main/java/com/cxx/home/dao/ProductDao.java @@ -9,9 +9,5 @@ import java.util.List; @Mapper public interface ProductDao { - ProductDto queryProduct(@Param("id") Long id); - List queryProductList(@Param("query") ProductQueryVo queryVo); - - List queryProductCategory(); } diff --git a/home-service/src/main/java/com/cxx/home/dto/period/MenstrualPeriodDto.java b/home-service/src/main/java/com/cxx/home/dto/period/MenstrualPeriodDto.java new file mode 100644 index 0000000..a37a715 --- /dev/null +++ b/home-service/src/main/java/com/cxx/home/dto/period/MenstrualPeriodDto.java @@ -0,0 +1,13 @@ +package com.cxx.home.dto.period; + +import lombok.AllArgsConstructor; +import lombok.Data; + +import java.time.LocalDate; + +@Data +@AllArgsConstructor +public class MenstrualPeriodDto { + private LocalDate startDate; + private LocalDate endDate; +} diff --git a/home-service/src/main/java/com/cxx/home/dto/period/PeriodDayDto.java b/home-service/src/main/java/com/cxx/home/dto/period/PeriodDayDto.java index 301a871..db5d02f 100644 --- a/home-service/src/main/java/com/cxx/home/dto/period/PeriodDayDto.java +++ b/home-service/src/main/java/com/cxx/home/dto/period/PeriodDayDto.java @@ -8,7 +8,7 @@ import io.swagger.v3.oas.annotations.media.Schema; import lombok.Getter; import lombok.Setter; -import java.util.Date; +import java.time.LocalDate; @Getter @Setter @@ -20,7 +20,7 @@ public class PeriodDayDto { @Schema(description = "日期") @JsonFormat(pattern = "yyyy-MM-dd", timezone = "GMT+8") - private Date date; + private LocalDate date; @Schema(description = "是否吃药") private Boolean isDrug; diff --git a/home-service/src/main/java/com/cxx/home/entity/PeriodDay.java b/home-service/src/main/java/com/cxx/home/entity/PeriodDay.java index 82e0cf1..65eea79 100644 --- a/home-service/src/main/java/com/cxx/home/entity/PeriodDay.java +++ b/home-service/src/main/java/com/cxx/home/entity/PeriodDay.java @@ -6,14 +6,14 @@ import com.cxx.framework.data.AbstractEntity; import lombok.Data; import lombok.EqualsAndHashCode; -import java.util.Date; +import java.time.LocalDate; @Data @EqualsAndHashCode(callSuper = true) @TableName("period_day") public class PeriodDay extends AbstractEntity { @TableField("date") - private Date date; + private LocalDate date; @TableField("is_drug") private Integer isDrug; diff --git a/home-service/src/main/java/com/cxx/home/service/PeriodService.java b/home-service/src/main/java/com/cxx/home/service/PeriodService.java index ad6d6ea..2021a9e 100644 --- a/home-service/src/main/java/com/cxx/home/service/PeriodService.java +++ b/home-service/src/main/java/com/cxx/home/service/PeriodService.java @@ -1,5 +1,6 @@ package com.cxx.home.service; +import com.cxx.home.dto.period.MenstrualPeriodDto; import com.cxx.home.dto.period.PeriodDayDto; import com.cxx.home.dto.period.PeriodSettingDto; @@ -15,4 +16,6 @@ public interface PeriodService { Boolean updatePeriodSetting(Long id, PeriodSettingDto periodSettingDto); PeriodSettingDto queryPeriodSetting(); + + List getMenstrualPeriod(); } diff --git a/home-service/src/main/java/com/cxx/home/service/impl/FoodServiceImpl.java b/home-service/src/main/java/com/cxx/home/service/impl/FoodServiceImpl.java index 4b67a04..2cbd97e 100644 --- a/home-service/src/main/java/com/cxx/home/service/impl/FoodServiceImpl.java +++ b/home-service/src/main/java/com/cxx/home/service/impl/FoodServiceImpl.java @@ -184,7 +184,7 @@ public class FoodServiceImpl implements FoodService { @Override public List queryFoodName() { - return foodRecipeMapper.selectList(null) + return foodRecipeMapper.selectList(Wrappers.emptyWrapper()) .stream().map(FoodRecipe::getName).collect(Collectors.toList()); } diff --git a/home-service/src/main/java/com/cxx/home/service/impl/JournalServiceImpl.java b/home-service/src/main/java/com/cxx/home/service/impl/JournalServiceImpl.java index cc1c4ea..f68e2fe 100644 --- a/home-service/src/main/java/com/cxx/home/service/impl/JournalServiceImpl.java +++ b/home-service/src/main/java/com/cxx/home/service/impl/JournalServiceImpl.java @@ -1,6 +1,8 @@ package com.cxx.home.service.impl; +import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; import com.cxx.framework.web.CustomException; +import com.cxx.home.converter.JournalConverter; import com.cxx.home.dao.JournalDao; import com.cxx.home.dto.journal.JournalDto; import com.cxx.home.entity.Journal; @@ -11,6 +13,7 @@ import jakarta.annotation.Resource; import org.springframework.beans.BeanUtils; import org.springframework.stereotype.Service; +import java.time.LocalDate; import java.util.List; @Service @@ -21,6 +24,9 @@ public class JournalServiceImpl implements JournalService { @Resource private JournalMapper journalMapper; + @Resource + private JournalConverter journalConverter; + @Override public Boolean addJournal(JournalDto journalDto) { Journal journal = new Journal(); @@ -52,6 +58,14 @@ public class JournalServiceImpl implements JournalService { @Override public List queryJournal(JournalQueryVo queryVo) { - return journalDao.queryJournal(queryVo); + LocalDate startDate = LocalDate.parse(queryVo.getStartDate()); + LocalDate endDate = LocalDate.parse(queryVo.getEndDate()); + + LambdaQueryWrapper queryWrapper = new LambdaQueryWrapper<>(); + queryWrapper.ge(Journal::getDate, startDate) + .le(Journal::getDate, endDate) + .orderByDesc(Journal::getDate); + + return journalConverter.toDtos(journalMapper.selectList(queryWrapper)); } } diff --git a/home-service/src/main/java/com/cxx/home/service/impl/KpiServiceImpl.java b/home-service/src/main/java/com/cxx/home/service/impl/KpiServiceImpl.java index 584461d..e12e0da 100644 --- a/home-service/src/main/java/com/cxx/home/service/impl/KpiServiceImpl.java +++ b/home-service/src/main/java/com/cxx/home/service/impl/KpiServiceImpl.java @@ -1,7 +1,8 @@ package com.cxx.home.service.impl; +import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; import com.cxx.framework.web.CustomException; -import com.cxx.home.dao.KpiDao; +import com.cxx.home.converter.KpiConverter; import com.cxx.home.dto.kpi.KpiDto; import com.cxx.home.entity.Kpi; import com.cxx.home.mapper.KpiMapper; @@ -11,16 +12,16 @@ import jakarta.annotation.Resource; import org.springframework.beans.BeanUtils; import org.springframework.stereotype.Service; +import java.time.LocalDate; import java.util.List; @Service public class KpiServiceImpl implements KpiService { - @Resource - private KpiDao kpiDao; - @Resource private KpiMapper kpiMapper; + @Resource + private KpiConverter kpiConverter; @Override public Boolean addKpi(KpiDto kpiDto) { @@ -53,6 +54,14 @@ public class KpiServiceImpl implements KpiService { @Override public List queryKpi(KpiQueryVo queryVo) { - return kpiDao.queryKpi(queryVo); + LocalDate startDate = LocalDate.parse(queryVo.getStartDate()); + LocalDate endDate = LocalDate.parse(queryVo.getEndDate()); + + LambdaQueryWrapper queryWrapper = new LambdaQueryWrapper<>(); + queryWrapper.ge(Kpi::getDate, startDate) + .le(Kpi::getDate, endDate) + .orderByDesc(Kpi::getDate); + + return kpiConverter.toDtos(kpiMapper.selectList(queryWrapper)); } } diff --git a/home-service/src/main/java/com/cxx/home/service/impl/PasswordServiceImpl.java b/home-service/src/main/java/com/cxx/home/service/impl/PasswordServiceImpl.java index 4248dbb..1d3b2ac 100644 --- a/home-service/src/main/java/com/cxx/home/service/impl/PasswordServiceImpl.java +++ b/home-service/src/main/java/com/cxx/home/service/impl/PasswordServiceImpl.java @@ -1,12 +1,13 @@ package com.cxx.home.service.impl; -import cn.hutool.crypto.SecureUtil; +import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; import com.cxx.framework.web.CustomException; import com.cxx.home.dao.PasswordDao; import com.cxx.home.dto.password.PasswordDto; import com.cxx.home.entity.Password; import com.cxx.home.mapper.PasswordMapper; import com.cxx.home.service.PasswordService; +import com.cxx.home.util.CommonUtils; import com.cxx.home.vo.PasswordQueryVo; import jakarta.annotation.Resource; import org.springframework.beans.BeanUtils; @@ -14,6 +15,7 @@ import org.springframework.beans.factory.annotation.Value; import org.springframework.stereotype.Service; import java.util.List; +import java.util.stream.Collectors; @Service public class PasswordServiceImpl implements PasswordService { @@ -30,7 +32,7 @@ public class PasswordServiceImpl implements PasswordService { public Boolean add(PasswordDto passwordDto) { Password password = new Password(); BeanUtils.copyProperties(passwordDto, password); - password.setPassword(encryptPassword(passwordDto.getPassword())); + password.setPassword(CommonUtils.encryptPassword(secretKey, passwordDto.getPassword())); return passwordMapper.insert(password) == 1; } @@ -44,7 +46,7 @@ public class PasswordServiceImpl implements PasswordService { Password password = new Password(); BeanUtils.copyProperties(passwordDto, password); password.setId(id); - password.setPassword(encryptPassword(passwordDto.getPassword())); + password.setPassword(CommonUtils.encryptPassword(secretKey, passwordDto.getPassword())); return passwordMapper.updateById(password) == 1; } @@ -61,20 +63,15 @@ public class PasswordServiceImpl implements PasswordService { public List query(PasswordQueryVo query) { List passwordList = passwordDao.query(query); - passwordList.forEach(item -> item.setPassword(decryptStr(item.getPassword()))); + passwordList.forEach(item -> item.setPassword(CommonUtils.decryptStr(secretKey, item.getPassword()))); return passwordList; } @Override - public List queryCategory() { - return passwordDao.queryCategory(); - } + public List queryCategory() { + LambdaQueryWrapper queryWrapper = new LambdaQueryWrapper<>(); + List categories = passwordMapper.selectObjs(queryWrapper.select(Password::getCategory)); - private String encryptPassword(String password) { - return SecureUtil.aes(secretKey.getBytes()).encryptBase64(password); - } - - private String decryptStr(String password) { - return SecureUtil.aes(secretKey.getBytes()).decryptStr(password); + return categories.stream().map(Object::toString).distinct().collect(Collectors.toList()); } } diff --git a/home-service/src/main/java/com/cxx/home/service/impl/PeriodServiceImpl.java b/home-service/src/main/java/com/cxx/home/service/impl/PeriodServiceImpl.java index 9d32b9e..bc6abef 100644 --- a/home-service/src/main/java/com/cxx/home/service/impl/PeriodServiceImpl.java +++ b/home-service/src/main/java/com/cxx/home/service/impl/PeriodServiceImpl.java @@ -1,6 +1,8 @@ package com.cxx.home.service.impl; +import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; import com.cxx.home.dao.PeriodDao; +import com.cxx.home.dto.period.MenstrualPeriodDto; import com.cxx.home.dto.period.PeriodDayDto; import com.cxx.home.dto.period.PeriodSettingDto; import com.cxx.home.entity.PeriodDay; @@ -13,6 +15,9 @@ import org.springframework.beans.BeanUtils; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; +import java.time.LocalDate; +import java.util.ArrayList; +import java.util.Collections; import java.util.List; @Service @@ -89,16 +94,55 @@ public class PeriodServiceImpl implements PeriodService { List periodSettingList = periodSettingMapper.selectList(null); PeriodSettingDto periodSettingDto = new PeriodSettingDto(); - if (periodSettingList.size() > 0) { - BeanUtils.copyProperties(periodSettingList.get(0), periodSettingDto); - periodSettingDto.setIsCalculate(periodSettingList.get(0).getIsCalculate() == 1); - } else { + if (periodSettingList.isEmpty()) { periodSettingDto.setId(0L); periodSettingDto.setCycleLength(0); periodSettingDto.setDuration(0); periodSettingDto.setIsCalculate(false); + } else { + BeanUtils.copyProperties(periodSettingList.get(0), periodSettingDto); + periodSettingDto.setIsCalculate(periodSettingList.get(0).getIsCalculate() == 1); } return periodSettingDto; } + + @Override + public List getMenstrualPeriod() { + LambdaQueryWrapper queryWrapper = new LambdaQueryWrapper<>(); + queryWrapper.eq(PeriodDay::getIsMenstruate, 1).select(PeriodDay::getDate).orderByAsc(PeriodDay::getDate); + + List dates = periodDayMapper.selectList(queryWrapper) + .stream().map(PeriodDay::getDate).toList(); + + if (dates.isEmpty()) { + return Collections.emptyList(); + } + + List result = new ArrayList<>(); + LocalDate start = dates.get(0); + LocalDate end = dates.get(0); + + for (int i = 1; i < dates.size(); i++) { + LocalDate current = dates.get(i); + + // 如果当前日期与前一天连续,继续当前周期 + if (current.equals(end.plusDays(1))) { + end = current; + } else { + // 日期不连续,保存当前周期,开始新周期 + result.add(new MenstrualPeriodDto(start, end)); + // 重新开始新的周期 + start = current; + end = current; + } + } + + // 添加最后一个周期 + result.add(new MenstrualPeriodDto(start, end)); + + Collections.reverse(result); + + return result; + } } diff --git a/home-service/src/main/java/com/cxx/home/service/impl/ProductServiceImpl.java b/home-service/src/main/java/com/cxx/home/service/impl/ProductServiceImpl.java index cb6c567..90e7529 100644 --- a/home-service/src/main/java/com/cxx/home/service/impl/ProductServiceImpl.java +++ b/home-service/src/main/java/com/cxx/home/service/impl/ProductServiceImpl.java @@ -2,6 +2,7 @@ package com.cxx.home.service.impl; import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; import com.cxx.framework.web.CustomException; +import com.cxx.home.converter.ProductConverter; import com.cxx.home.dao.ProductDao; import com.cxx.home.dto.product.ProductDto; import com.cxx.home.entity.*; @@ -14,6 +15,7 @@ import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; import java.util.List; +import java.util.stream.Collectors; @Service public class ProductServiceImpl implements ProductService { @@ -23,6 +25,9 @@ public class ProductServiceImpl implements ProductService { @Resource private ProductMapper productMapper; + @Resource + private ProductConverter productConverter; + @Override @Transactional public Boolean addProduct(ProductDto productDto) { @@ -61,7 +66,7 @@ public class ProductServiceImpl implements ProductService { throw new CustomException("该商品不存在"); } - return productDao.queryProduct(id); + return productConverter.toDto(productMapper.selectById(id)); } @Override @@ -71,6 +76,9 @@ public class ProductServiceImpl implements ProductService { @Override public List queryProductCategory() { - return productDao.queryProductCategory(); + LambdaQueryWrapper queryWrapper = new LambdaQueryWrapper<>(); + List categories = productMapper.selectObjs(queryWrapper.select(Product::getCategory)); + + return categories.stream().map(Object::toString).distinct().collect(Collectors.toList()); } } diff --git a/home-service/src/main/java/com/cxx/home/util/CommonUtils.java b/home-service/src/main/java/com/cxx/home/util/CommonUtils.java new file mode 100644 index 0000000..75741c5 --- /dev/null +++ b/home-service/src/main/java/com/cxx/home/util/CommonUtils.java @@ -0,0 +1,13 @@ +package com.cxx.home.util; + +import cn.hutool.crypto.SecureUtil; + +public class CommonUtils { + public static String encryptPassword(String secretKey, String password) { + return SecureUtil.aes(secretKey.getBytes()).encryptBase64(password); + } + + public static String decryptStr(String secretKey, String password) { + return SecureUtil.aes(secretKey.getBytes()).decryptStr(password); + } +} diff --git a/home-service/src/main/resources/mapper/KpiMapper.xml b/home-service/src/main/resources/mapper/KpiMapper.xml deleted file mode 100644 index 8c40553..0000000 --- a/home-service/src/main/resources/mapper/KpiMapper.xml +++ /dev/null @@ -1,15 +0,0 @@ - - - - - diff --git a/home-service/src/main/resources/mapper/PasswordMapper.xml b/home-service/src/main/resources/mapper/PasswordMapper.xml index bfa27e0..f2d1233 100644 --- a/home-service/src/main/resources/mapper/PasswordMapper.xml +++ b/home-service/src/main/resources/mapper/PasswordMapper.xml @@ -3,16 +3,16 @@ - SELECT id AS id, - name AS name, - purchase_date AS purchaseDate, - expiry_date AS expiryDate, - price AS price, - category AS category, - purchaser AS purchaser, - channel AS channel, - image_url As imageUrl - FROM product - WHERE id = #{id} - ORDER BY purchase_date DESC - - - -