diff --git a/stdiet-common/src/main/java/com/stdiet/common/utils/DateUtils.java b/stdiet-common/src/main/java/com/stdiet/common/utils/DateUtils.java index b85390db6..642eaff7a 100644 --- a/stdiet-common/src/main/java/com/stdiet/common/utils/DateUtils.java +++ b/stdiet-common/src/main/java/com/stdiet/common/utils/DateUtils.java @@ -7,6 +7,7 @@ import java.time.LocalDate; import java.time.LocalDateTime; import java.time.ZoneId; import java.time.ZonedDateTime; +import java.time.format.DateTimeFormatter; import java.util.Date; import org.apache.commons.lang3.time.DateFormatUtils; @@ -186,4 +187,14 @@ public class DateUtils extends org.apache.commons.lang3.time.DateUtils ZonedDateTime zonedDateTime = localDate.atStartOfDay(ZoneId.systemDefault()); return Date.from(zonedDateTime.toInstant()); } + + public static String localDateToString(LocalDate date, String pattern){ + DateTimeFormatter fmt = DateTimeFormatter.ofPattern(pattern); + return date.format(fmt); + } + + public static LocalDate stringToLocalDate(String date, String pattern){ + DateTimeFormatter fmt = DateTimeFormatter.ofPattern(pattern); + return LocalDate.parse(date, fmt); + } } diff --git a/stdiet-custom/src/main/java/com/stdiet/custom/domain/SysRecipesPlan.java b/stdiet-custom/src/main/java/com/stdiet/custom/domain/SysRecipesPlan.java index d9e435ead..8e5c4bfc5 100644 --- a/stdiet-custom/src/main/java/com/stdiet/custom/domain/SysRecipesPlan.java +++ b/stdiet-custom/src/main/java/com/stdiet/custom/domain/SysRecipesPlan.java @@ -116,6 +116,10 @@ public class SysRecipesPlan { */ private Integer reviewStatus; + /** 该食谱计划中暂停日期,使用 | 隔开 */ + //@Excel(name = "该食谱计划中暂停日期,使用 | 隔开") + private String pauseDate; + /** * 创建者 */ diff --git a/stdiet-custom/src/main/java/com/stdiet/custom/mapper/SysOrderPauseMapper.java b/stdiet-custom/src/main/java/com/stdiet/custom/mapper/SysOrderPauseMapper.java index 5d6d4aad3..8d94a6a27 100644 --- a/stdiet-custom/src/main/java/com/stdiet/custom/mapper/SysOrderPauseMapper.java +++ b/stdiet-custom/src/main/java/com/stdiet/custom/mapper/SysOrderPauseMapper.java @@ -75,4 +75,11 @@ public interface SysOrderPauseMapper int deletePauseByOrderId(Long[] orderIds); long selectNearMainOrderIdByCusId(Long cusId); + + /** + * 根据订单ID获取暂停计划 + * @param orderId + * @return + */ + List getPauseListByOrderId(@Param("orderId")Long orderId); } \ No newline at end of file diff --git a/stdiet-custom/src/main/java/com/stdiet/custom/service/ISysOrderPauseService.java b/stdiet-custom/src/main/java/com/stdiet/custom/service/ISysOrderPauseService.java index 5f1276ad2..8ad61a600 100644 --- a/stdiet-custom/src/main/java/com/stdiet/custom/service/ISysOrderPauseService.java +++ b/stdiet-custom/src/main/java/com/stdiet/custom/service/ISysOrderPauseService.java @@ -73,5 +73,12 @@ public interface ISysOrderPauseService */ int deletePauseByOrderId(Long[] orderIds); + /** + * 根据订单ID获取暂停记录 + * @param orderId + * @return + */ + List getPauseListByOrderId(Long orderId); + long selectNearMainOrderIdByCusId(Long cusId); } \ No newline at end of file diff --git a/stdiet-custom/src/main/java/com/stdiet/custom/service/impl/SysOrderPauseServiceImpl.java b/stdiet-custom/src/main/java/com/stdiet/custom/service/impl/SysOrderPauseServiceImpl.java index 4aa8cd37d..3f957b8fb 100644 --- a/stdiet-custom/src/main/java/com/stdiet/custom/service/impl/SysOrderPauseServiceImpl.java +++ b/stdiet-custom/src/main/java/com/stdiet/custom/service/impl/SysOrderPauseServiceImpl.java @@ -140,6 +140,16 @@ public class SysOrderPauseServiceImpl implements ISysOrderPauseService return sysOrderPauseMapper.deletePauseByOrderId(orderIds); } + /** + * 根据订单ID获取暂停计划 + * @param orderId + * @return + */ + @Override + public List getPauseListByOrderId(Long orderId){ + return sysOrderPauseMapper.getPauseListByOrderId(orderId); + } + @Override public long selectNearMainOrderIdByCusId(Long cusId) { return sysOrderPauseMapper.selectNearMainOrderIdByCusId(cusId); diff --git a/stdiet-custom/src/main/java/com/stdiet/custom/service/impl/SysRecipesPlanServiceImpl.java b/stdiet-custom/src/main/java/com/stdiet/custom/service/impl/SysRecipesPlanServiceImpl.java index 29ba4025d..7f5469544 100644 --- a/stdiet-custom/src/main/java/com/stdiet/custom/service/impl/SysRecipesPlanServiceImpl.java +++ b/stdiet-custom/src/main/java/com/stdiet/custom/service/impl/SysRecipesPlanServiceImpl.java @@ -1,6 +1,7 @@ package com.stdiet.custom.service.impl; import com.stdiet.common.utils.DateUtils; +import com.stdiet.common.utils.StringUtils; import com.stdiet.common.utils.SynchrolockUtil; import com.stdiet.common.utils.sign.Md5Utils; import com.stdiet.custom.domain.SysOrder; @@ -18,9 +19,7 @@ import org.springframework.transaction.annotation.Transactional; import java.time.LocalDate; import java.time.temporal.ChronoUnit; -import java.util.ArrayList; -import java.util.Date; -import java.util.List; +import java.util.*; /** * 食谱计划Service业务层处理 @@ -150,10 +149,8 @@ public class SysRecipesPlanServiceImpl implements ISysRecipesPlanService { SysRecipesPlan queryParam = new SysRecipesPlan(); queryParam.setOrderId(orderId); List oldRecipesPlanList = sysRecipesPlanMapper.selectSysRecipesPlanList(queryParam); - SysOrderPause pauseParam = new SysOrderPause(); - pauseParam.setOrderId(sysOrder.getOrderId()); - //暂停记录列表 - List pauseList = sysOrderPauseService.selectSysOrderPauseList(pauseParam); + //暂停记录列表,按暂停开始时间顺序 + List pauseList = sysOrderPauseService.getPauseListByOrderId(sysOrder.getOrderId()); List planList = generatePlan(sysOrder, oldRecipesPlanList, DateUtils.dateToLocalDate(sysOrder.getStartTime()), DateUtils.dateToLocalDate(sysOrder.getServerEndTime()), pauseList); if(oldRecipesPlanList != null && oldRecipesPlanList.size() > 0){ updateOrAddRecipesPlan(oldRecipesPlanList, planList); @@ -184,9 +181,13 @@ public class SysRecipesPlanServiceImpl implements ISysRecipesPlanService { List delList = new ArrayList<>(); for (SysRecipesPlan plan : oldRecipesPlanList) { if(index < newSize){ - plan.setStartDate(newRecipesPlanList.get(index).getStartDate()); - plan.setEndDate(newRecipesPlanList.get(index).getEndDate()); - updateList.add(plan); + if(plan.getStartDate().compareTo(newRecipesPlanList.get(index).getStartDate()) != 0 + || plan.getEndDate().compareTo(newRecipesPlanList.get(index).getEndDate()) != 0){ + plan.setStartDate(newRecipesPlanList.get(index).getStartDate()); + plan.setEndDate(newRecipesPlanList.get(index).getEndDate()); + plan.setPauseDate(newRecipesPlanList.get(index).getPauseDate()); + updateList.add(plan); + } }else{ delList.add(plan.getId()); } @@ -197,6 +198,7 @@ public class SysRecipesPlanServiceImpl implements ISysRecipesPlanService { } //更新 if(updateList.size() > 0){ + System.out.println("更新数量:"+updateList.size()); for (SysRecipesPlan plan : updateList) { sysRecipesPlanMapper.updateSysRecipesPlan(plan); } @@ -230,19 +232,26 @@ public class SysRecipesPlanServiceImpl implements ISysRecipesPlanService { oldStartNumDay = oldRecipesPlanList.get(0).getStartNumDay() - 1; } List planList = new ArrayList<>(); - boolean breakFlag = false; - LocalDate planStartDate = serverStartDate; - LocalDate planEndDate = planStartDate.plusDays(6); - while (true) { + LocalDate planStartDate = null; + LocalDate planEndDate = serverStartDate.plusDays(-1); + boolean breakFlag = true; + do { SysRecipesPlan sysRecipesPlan = new SysRecipesPlan(); + planStartDate = planEndDate.plusDays(1); + planEndDate = planStartDate.plusDays(6); //判断是否大于服务到期时间 if (ChronoUnit.DAYS.between(planEndDate, serverEndDate) <= 0) { planEndDate = serverEndDate; - breakFlag = true; + breakFlag = false; + } + String[] pauseResult = dealPlanPause(planStartDate, planEndDate, pauseList); + //开始时间变更为暂停结束之后的日期,因为暂停开始时间与食谱计划开始时间相同 + if(StringUtils.isNotEmpty(pauseResult[0])){ + planStartDate = DateUtils.stringToLocalDate(pauseResult[0],"yyyyMMdd"); + planEndDate = DateUtils.stringToLocalDate(pauseResult[1],"yyyyMMdd"); } - long pauseDay = getPauseDayeCount(planStartDate, planEndDate, pauseList); //加上暂停时间 - planEndDate = planEndDate.plusDays(pauseDay); + planEndDate = planEndDate.plusDays(Integer.parseInt(pauseResult[2])); sysRecipesPlan.setStartDate(DateUtils.localDateToDate(planStartDate)); sysRecipesPlan.setEndDate(DateUtils.localDateToDate(planEndDate)); sysRecipesPlan.setOrderId(sysOrder.getOrderId()); @@ -252,30 +261,29 @@ public class SysRecipesPlanServiceImpl implements ISysRecipesPlanService { sysRecipesPlan.setStartNumDay(oldStartNumDay); oldStartNumDay += 6; sysRecipesPlan.setEndNumDay(oldStartNumDay); + //暂停日期 + sysRecipesPlan.setPauseDate(pauseResult[3]); + //添加暂停范围内的日期 planList.add(sysRecipesPlan); - - planStartDate = planEndDate.plusDays(1); - planEndDate = planStartDate.plusDays(6); - - if (breakFlag) { - break; - } - } + }while (breakFlag); return planList; } /** - * 根据食谱开始时间、结束时间、暂停列表获取在食谱计划范围内的暂停天数 - * - * @param planStartDate 计划开始时间 - * @param planEndDate 计划结束时间 - * @param pauseList 暂停列表 + * 根据食谱开始时间、结束时间、暂停列表获取在食谱计划范围内的暂停天数,以及返回调整之后的计划开始、结束时间,以及暂停日期 + * @param planStartDate 原先的计划开始时间 + * @param planEndDate 原先计划结束时间 + * @param pauseList 暂停列表集合 * @return */ - private long getPauseDayeCount(LocalDate planStartDate, LocalDate planEndDate, List pauseList) { + private String[] dealPlanPause(LocalDate planStartDate, LocalDate planEndDate, List pauseList) { + //分别为计划开始时间、计划结束时间,范围内暂停天数,具体暂停日期,使用|隔开 + String[] result = {"","","0",""}; long pauseDay = 0; + Set pauseDateString = new TreeSet<>(new MyComparator()); //判断这个时间内是否存在暂停 if (pauseList != null && pauseList.size() > 0) { + //每条暂停时间的范围不会重叠,在添加暂停时做了限制 for (SysOrderPause sysOrderPause : pauseList) { LocalDate pauseStartDate = DateUtils.dateToLocalDate(sysOrderPause.getPauseStartDate()); LocalDate pauseEndDate = DateUtils.dateToLocalDate(sysOrderPause.getPauseEndDate()); @@ -288,10 +296,48 @@ public class SysRecipesPlanServiceImpl implements ISysRecipesPlanService { if (ChronoUnit.DAYS.between(planEndDate, pauseEndDate) > 0) { pauseEndDate = planEndDate; } - pauseDay += ChronoUnit.DAYS.between(pauseStartDate, pauseEndDate); + //判断暂停记录是否从食谱计划开始时间开始的 + if(ChronoUnit.DAYS.between(pauseStartDate, planStartDate) == 0){ + //记录该条暂停记录结束之后的第一天日期,如果两条记录连着,则取最后暂停结束之后的第一天 + if("".equals(result[0]) || result[0].equals(DateUtils.localDateToString(pauseStartDate,"yyyyMMdd"))){ + planStartDate = pauseEndDate.plusDays(1); + planEndDate = planStartDate.plusDays(6); + result[0] = DateUtils.localDateToString(planStartDate,"yyyyMMdd"); + result[1] = DateUtils.localDateToString(planEndDate,"yyyyMMdd"); + } + }else{ + pauseDay += ChronoUnit.DAYS.between(pauseStartDate, pauseEndDate) + 1; + pauseDateString.addAll(getPauseDateString(pauseStartDate, pauseEndDate)); + } } } - return pauseDay; + result[2] = pauseDay+""; + result[3] = pauseDateString.size() > 0 ? StringUtils.join(pauseDateString,"|") : ""; + return result; + } + + /** + * 根据暂停时间范围获取范围内的日期 + * @return + */ + private Set getPauseDateString(LocalDate pauseStartDate, LocalDate pauseEndDate){ + Set pauseDateList = new HashSet<>(); + long daysBetween = ChronoUnit.DAYS.between(pauseStartDate, pauseEndDate); + for(int i = 0; i <= daysBetween; i++){ + pauseDateList.add(DateUtils.localDateToString(pauseStartDate.plusDays(i),"yyyyMMdd")); + } + return pauseDateList; + } + + /** + * 集合排序key值比较器 + * */ + class MyComparator implements Comparator{ + + @Override + public int compare(String o1, String o2) { + return Integer.parseInt(o1) - Integer.parseInt(o2); + } } /** diff --git a/stdiet-custom/src/main/resources/mapper/custom/SysOrderPauseMapper.xml b/stdiet-custom/src/main/resources/mapper/custom/SysOrderPauseMapper.xml index 858dcabc5..d3c6b0968 100644 --- a/stdiet-custom/src/main/resources/mapper/custom/SysOrderPauseMapper.xml +++ b/stdiet-custom/src/main/resources/mapper/custom/SysOrderPauseMapper.xml @@ -133,4 +133,10 @@ ORDER BY server_end_time ASC LIMIT 1 + + + \ No newline at end of file diff --git a/stdiet-custom/src/main/resources/mapper/custom/SysRecipesPlanMapper.xml b/stdiet-custom/src/main/resources/mapper/custom/SysRecipesPlanMapper.xml index b3d74834b..7dab14631 100644 --- a/stdiet-custom/src/main/resources/mapper/custom/SysRecipesPlanMapper.xml +++ b/stdiet-custom/src/main/resources/mapper/custom/SysRecipesPlanMapper.xml @@ -14,6 +14,7 @@ + @@ -36,7 +37,7 @@ - select id, order_id, cus_id, start_date, end_date, start_num_day, end_num_day, recipes_id, send_flag, send_time, create_time, create_by, update_time, update_by, del_flag, review_status from sys_recipes_plan + select id, order_id, cus_id, start_date, end_date, start_num_day, end_num_day, recipes_id, send_flag, send_time, pause_date, create_time, create_by, update_time, update_by, del_flag, review_status from sys_recipes_plan select id, out_id, start_date, end_date, start_num_day, end_num_day, recipes_id, review_status from sys_recipes_plan - where cus_id=#{cusId} order by id asc + where cus_id=#{cusId} and del_flag = 0 order by id asc - select id, start_date, end_date, start_num_day, end_num_day, recipes_id from sys_recipes_plan where out_id=#{outId} + select id, start_date, end_date, start_num_day, end_num_day, recipes_id from sys_recipes_plan where out_id=#{outId} and del_flag = 0 @@ -244,7 +248,7 @@ @@ -252,6 +256,6 @@ - update sys_recipes_plan set start_date = #{startDate},end_date = #{endDate} where id = #{id} + update sys_recipes_plan set start_date = #{startDate},end_date = #{endDate},pause_date=#{pauseDate} where id = #{id} \ No newline at end of file diff --git a/stdiet-ui/vue.config.js b/stdiet-ui/vue.config.js index 9fec383c7..cc6254a1f 100644 --- a/stdiet-ui/vue.config.js +++ b/stdiet-ui/vue.config.js @@ -34,7 +34,7 @@ module.exports = { proxy: { // detail: https://cli.vuejs.org/config/#devserver-proxy [process.env.VUE_APP_BASE_API]: { - target: `http://localhost:8091`, + target: `http://localhost:8090`, changeOrigin: true, pathRewrite: { ['^' + process.env.VUE_APP_BASE_API]: ''