食谱计划生成优化
This commit is contained in:
		| @@ -73,4 +73,11 @@ public interface SysOrderPauseMapper | ||||
|      * @return | ||||
|      */ | ||||
|     int deletePauseByOrderId(Long[] orderIds); | ||||
|  | ||||
|     /** | ||||
|      * 根据订单ID获取暂停计划 | ||||
|      * @param orderId | ||||
|      * @return | ||||
|      */ | ||||
|     List<SysOrderPause> getPauseListByOrderId(@Param("orderId")Long orderId); | ||||
| } | ||||
| @@ -72,4 +72,11 @@ public interface ISysOrderPauseService | ||||
|      * @return | ||||
|      */ | ||||
|     int deletePauseByOrderId(Long[] orderIds); | ||||
|  | ||||
|     /** | ||||
|      * 根据订单ID获取暂停记录 | ||||
|      * @param orderId | ||||
|      * @return | ||||
|      */ | ||||
|     List<SysOrderPause> getPauseListByOrderId(Long orderId); | ||||
| } | ||||
| @@ -139,4 +139,14 @@ public class SysOrderPauseServiceImpl implements ISysOrderPauseService | ||||
|     public int deletePauseByOrderId(Long[] orderIds){ | ||||
|         return sysOrderPauseMapper.deletePauseByOrderId(orderIds); | ||||
|     } | ||||
|  | ||||
|     /** | ||||
|      * 根据订单ID获取暂停计划 | ||||
|      * @param orderId | ||||
|      * @return | ||||
|      */ | ||||
|     @Override | ||||
|     public List<SysOrderPause> getPauseListByOrderId(Long orderId){ | ||||
|         return sysOrderPauseMapper.getPauseListByOrderId(orderId); | ||||
|     } | ||||
| } | ||||
| @@ -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<SysRecipesPlan> oldRecipesPlanList = sysRecipesPlanMapper.selectSysRecipesPlanList(queryParam); | ||||
|                 SysOrderPause pauseParam = new SysOrderPause(); | ||||
|                 pauseParam.setOrderId(sysOrder.getOrderId()); | ||||
|                 //暂停记录列表 | ||||
|                 List<SysOrderPause> pauseList = sysOrderPauseService.selectSysOrderPauseList(pauseParam); | ||||
|                 //暂停记录列表,按暂停开始时间顺序 | ||||
|                 List<SysOrderPause> pauseList = sysOrderPauseService.getPauseListByOrderId(sysOrder.getOrderId()); | ||||
|                 List<SysRecipesPlan> 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,12 @@ public class SysRecipesPlanServiceImpl implements ISysRecipesPlanService { | ||||
|         List<Long> 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()); | ||||
|                     updateList.add(plan); | ||||
|                 } | ||||
|             }else{ | ||||
|                 delList.add(plan.getId()); | ||||
|             } | ||||
| @@ -197,6 +197,7 @@ public class SysRecipesPlanServiceImpl implements ISysRecipesPlanService { | ||||
|         } | ||||
|         //更新 | ||||
|         if(updateList.size() > 0){ | ||||
|             System.out.println("更新数量:"+updateList.size()); | ||||
|             for (SysRecipesPlan plan : updateList) { | ||||
|                 sysRecipesPlanMapper.updateSysRecipesPlan(plan); | ||||
|             } | ||||
| @@ -230,19 +231,26 @@ public class SysRecipesPlanServiceImpl implements ISysRecipesPlanService { | ||||
|             oldStartNumDay =  oldRecipesPlanList.get(0).getStartNumDay() - 1; | ||||
|         } | ||||
|         List<SysRecipesPlan> 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 +260,27 @@ public class SysRecipesPlanServiceImpl implements ISysRecipesPlanService { | ||||
|             sysRecipesPlan.setStartNumDay(oldStartNumDay); | ||||
|             oldStartNumDay += 6; | ||||
|             sysRecipesPlan.setEndNumDay(oldStartNumDay); | ||||
|             //添加暂停范围内的日期 | ||||
|             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<SysOrderPause> pauseList) { | ||||
|     private String[] dealPlanPause(LocalDate planStartDate, LocalDate planEndDate, List<SysOrderPause> pauseList) { | ||||
|         //分别为计划开始时间、计划结束时间,范围内暂停天数,具体暂停日期,使用|隔开 | ||||
|         String[] result = {"","","0",""}; | ||||
|         long pauseDay = 0; | ||||
|         Set<String> 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 +293,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<String> getPauseDateString(LocalDate pauseStartDate, LocalDate pauseEndDate){ | ||||
|         Set<String> 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<String>{ | ||||
|  | ||||
|         @Override | ||||
|         public int compare(String o1, String o2) { | ||||
|             return Integer.parseInt(o1) - Integer.parseInt(o2); | ||||
|         } | ||||
|     } | ||||
|  | ||||
|     /** | ||||
|   | ||||
| @@ -120,4 +120,10 @@ | ||||
|         </foreach> | ||||
|     </update> | ||||
|  | ||||
|     <!-- 根据订单ID获取暂停记录,根据暂停开始时间排序,用于生成食谱计划,不能随意修改排序方式 --> | ||||
|     <select id="getPauseListByOrderId" parameterType="Long" resultMap="SysOrderPauseResult"> | ||||
|         <include refid="selectSysOrderPauseVo"></include> | ||||
|         where sop.del_flag = 0 and sop.order_id = #{orderId} order by sop.pause_start_date asc | ||||
|     </select> | ||||
|  | ||||
| </mapper> | ||||
| @@ -132,16 +132,16 @@ | ||||
|         where id = #{id} and del_flag = 0 | ||||
|     </update> | ||||
|  | ||||
|     <delete id="deleteSysRecipesPlanById" parameterType="Long"> | ||||
|         delete from sys_recipes_plan where id = #{id} | ||||
|     </delete> | ||||
|     <update id="deleteSysRecipesPlanById" parameterType="Long"> | ||||
|         update sys_recipes_plan set del_flag = 1 where id = #{id} | ||||
|     </update> | ||||
|  | ||||
|     <delete id="deleteSysRecipesPlanByIds" parameterType="String"> | ||||
|         delete from sys_recipes_plan where id in | ||||
|     <update id="deleteSysRecipesPlanByIds" parameterType="String"> | ||||
|         update sys_recipes_plan set del_flag = 1 where id in | ||||
|         <foreach item="id" collection="array" open="(" separator="," close=")"> | ||||
|             #{id} | ||||
|         </foreach> | ||||
|     </delete> | ||||
|     </update> | ||||
|  | ||||
|     <!-- 批量插入食谱计划 --> | ||||
|     <insert id="insertBatch"> | ||||
| @@ -156,7 +156,7 @@ | ||||
|  | ||||
|     <!-- 根据订单ID删除对应食谱计划 --> | ||||
|     <update id="delRecipesPlanByOrderId" parameterType="String"> | ||||
|         delete from sys_recipes_plan where order_id in | ||||
|         update sys_recipes_plan set del_flag = 1 where order_id in | ||||
|         <foreach item="orderId" collection="array" open="(" separator="," close=")"> | ||||
|             #{orderId} | ||||
|         </foreach> | ||||
| @@ -217,7 +217,7 @@ | ||||
|     <!--  根据cusId查询食谱计划--> | ||||
|     <select id="selectPlanListByCusId" parameterType="Long" resultMap="SysRecipesPlanResult"> | ||||
|         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 desc | ||||
|         where cus_id=#{cusId} and del_flag = 0 order by id desc | ||||
|     </select> | ||||
|  | ||||
|     <select id="getCusIdByOutId" parameterType="String" resultType="Long"> | ||||
| @@ -235,7 +235,7 @@ | ||||
|  | ||||
|     <!--  通过outId查询食谱计划简要--> | ||||
|     <select id="selectRecipesPlanListInfo" resultMap="SysRecipesPlanListInfoResult"> | ||||
|         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 | ||||
|     </select> | ||||
|  | ||||
|     <resultMap type="SysRecipesDaily" id="SysRecipesResult"> | ||||
| @@ -244,7 +244,7 @@ | ||||
|     </resultMap> | ||||
|  | ||||
|     <select id="selectMenuIds" parameterType="Long" resultMap="SysRecipesResult"> | ||||
|         select id, num_day from sys_customer_daily_menu where recipes_id=#{recipes_id} order by num_day asc | ||||
|         select id, num_day from sys_customer_daily_menu where recipes_id=#{recipes_id} and del_flag = 0 order by num_day asc | ||||
|     </select> | ||||
|  | ||||
|     <!-- 批量修改食谱计划 --> | ||||
|   | ||||
		Reference in New Issue
	
	Block a user