diff --git a/stdiet-custom/src/main/java/com/stdiet/custom/domain/SysOrder.java b/stdiet-custom/src/main/java/com/stdiet/custom/domain/SysOrder.java index f94695c39..60d8a6da3 100644 --- a/stdiet-custom/src/main/java/com/stdiet/custom/domain/SysOrder.java +++ b/stdiet-custom/src/main/java/com/stdiet/custom/domain/SysOrder.java @@ -6,8 +6,6 @@ import java.util.List; import com.fasterxml.jackson.annotation.JsonFormat; import lombok.Data; -import org.apache.commons.lang3.builder.ToStringBuilder; -import org.apache.commons.lang3.builder.ToStringStyle; import com.stdiet.common.annotation.Excel; import com.stdiet.common.core.domain.BaseEntity; @@ -51,6 +49,7 @@ public class SysOrder extends BaseEntity { private String status; + @JsonFormat(pattern = "yyyy-MM-dd") private Date startTime; private Date pauseTime; @@ -77,6 +76,10 @@ public class SysOrder extends BaseEntity { @Excel(name = "售前") private String preSale; + /** 售中ID */ + @Excel(name = "售中ID") + private Long onSaleId; + /** * 售后 */ @@ -93,9 +96,6 @@ public class SysOrder extends BaseEntity { */ private Long nutritionistId; - //营养师数组,比例拆分单时需要两个营养师,非持久化字段 - private Long[] nutritionistIdList; - /** * 营养师 */ @@ -223,7 +223,7 @@ public class SysOrder extends BaseEntity { /** * 服务天数 */ - @Excel(name = "服务结束时间", width = 30) + @Excel(name = "服务天数", width = 30) private Integer serverDay; /** @@ -234,33 +234,41 @@ public class SysOrder extends BaseEntity { //查询参数 private Integer amountFlag; - /** - * 订单类型 0普通单 1比例拆分单 2售后二开提成单 - */ + /** 订单类型 0普通单 1比例拆分单 2体验单 */ + @Excel(name = "订单类型 0普通单 1比例拆分单 2体验单") private String orderType; - /** - * 订单次数类型 0一开单 1二开单 - */ + /** 订单次数类型 0一开单 1二开单 */ + @Excel(name = "订单次数类型 0一开单 1二开单") private String orderCountType; - /** - * 订单金额类型 0全款单 1定金单 2尾款单 - */ + /** 订单金额类型 0全款单 1定金单 2尾款单 */ + @Excel(name = "订单金额类型 0全款单 1定金单 2尾款单") private String orderMoneyType; - /** - * 拆分订单中的主订单id,非拆分订单时,该id都为0 - */ + /** 拆分订单中的主订单id,非拆分订单时,该id都为0 */ + @Excel(name = "拆分订单中的主订单id,非拆分订单时,该id都为0") private Long mainOrderId; - //订单类型数组,用于接收订单类型、订单次数类型、订单金额类型,非持久化字段 - private Long[] orderTypeList; + /** 售后二开提成单, 0非提成单 1提成单 */ + @Excel(name = "售后二开提成单, 0非提成单 1提成单") + private Integer afterSaleCommissOrder; - //是否自动创建售后二开提成单,非持久化字段 + /** 删除标记 */ + private Integer delFlag; + + //订单类型数组,用于接收订单类型、订单次数类型、订单金额类型,非持久化字段 + private Integer[] orderTypeList; + + //是否自动创建售后二开提成单,0否 1是,非持久化字段 private Integer secondAfterSaleFlag; + //营养师数组,比例拆分单时需要两个营养师,非持久化字段 + private Long[] nutritionistIdList; + //拆分比例,如:1,9就是按照比例10%、90%拆分,非持久化字段 - private Integer[] nutritionistRate; + private String nutritionistRate; + + } \ No newline at end of file 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 c67a8fc8e..4892c8d31 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 @@ -29,7 +29,11 @@ public class SysRecipesPlan extends BaseEntity private Long cusId; //客户ID - private Long customerId; +// private Long customerId; + + private Integer startNumDay; + + private Integer endNumDay; //非持久化字段,客户姓名 @Excel(name = "客户姓名") diff --git a/stdiet-custom/src/main/java/com/stdiet/custom/service/impl/AsyncCommonServiceImpl.java b/stdiet-custom/src/main/java/com/stdiet/custom/service/impl/AsyncCommonServiceImpl.java index b4a99b1d1..b0dc6b824 100644 --- a/stdiet-custom/src/main/java/com/stdiet/custom/service/impl/AsyncCommonServiceImpl.java +++ b/stdiet-custom/src/main/java/com/stdiet/custom/service/impl/AsyncCommonServiceImpl.java @@ -27,6 +27,7 @@ public class AsyncCommonServiceImpl implements AsyncCommonService { @Autowired private SysFoodHeatStatisticsMapper sysFoodHeatStatisticsMapper; + public static final long sleepTime = 5000; //异步线程睡眠时间,毫秒 /** * 异步更新每个食材对应的蛋白质、脂肪、碳水的质量 @@ -34,6 +35,11 @@ public class AsyncCommonServiceImpl implements AsyncCommonService { @Override @Async public void updateFoodNutritionalQualityAndHeat(Long customerHeatId){ + try { + Thread.sleep(sleepTime); + }catch (Exception e){ + e.printStackTrace(); + } SysCustomerHeatStatistics sysCustomerHeatStatistics = sysCustomerHeatStatisticsMapper.selectSysCustomerHeatStatisticsById(customerHeatId); if(sysCustomerHeatStatistics != null && sysCustomerHeatStatistics.getFoodHeatStatisticsList() != null && sysCustomerHeatStatistics.getFoodHeatStatisticsList().size() > 0){ diff --git a/stdiet-custom/src/main/java/com/stdiet/custom/service/impl/SysCommissionDayServiceImpl.java b/stdiet-custom/src/main/java/com/stdiet/custom/service/impl/SysCommissionDayServiceImpl.java index 25f6520f3..471ba092f 100644 --- a/stdiet-custom/src/main/java/com/stdiet/custom/service/impl/SysCommissionDayServiceImpl.java +++ b/stdiet-custom/src/main/java/com/stdiet/custom/service/impl/SysCommissionDayServiceImpl.java @@ -76,10 +76,12 @@ public class SysCommissionDayServiceImpl implements ISysCommissionDayService { LocalDate serverStartDate = DateUtils.dateToLocalDate(sysOrder.getStartTime()); //订单总服务月数 int serverMonth = sysOrder.getServeTimeId() != null ? sysOrder.getServeTimeId().intValue()/30 : 0; + //服务天数(不满一个月的零头) + int serverSmallDay = sysOrder.getServeTimeId().intValue()%30 - (serverMonth > 0 ? 0 : 1); //赠送时长 int giveDay = sysOrder.getGiveServeDay() != null ? sysOrder.getGiveServeDay().intValue() : 0; //服务到期时间(加赠送时间,不加暂停时间) - serverEndDate = serverStartDate.plusMonths(serverMonth).plusDays(giveDay); + serverEndDate = serverStartDate.plusMonths(serverMonth).plusDays(giveDay+serverSmallDay); List pausesList = sysOrder.getOrderPauseList(); if(pausesList == null){ if(sysOrder.getOrderId() != null){ @@ -90,12 +92,10 @@ public class SysCommissionDayServiceImpl implements ISysCommissionDayService { pausesList = new ArrayList<>(); } } - //System.out.println("结束时间:"+serverEndDate); //每年每月暂停天数,key为年份加月份,如:2021年1月=20211 Map everyYearMonthPauseDay = getEveryYearMonthPauseDay(pausesList, serverStartDate, serverEndDate); //该笔订单暂停总天数 int pauseTotalDay = getTotalByMap(everyYearMonthPauseDay); - //System.out.println("暂停天数:"+pauseTotalDay); //服务到期时间加上暂停时间 serverEndDate = serverEndDate.plusDays(pauseTotalDay); } @@ -278,10 +278,12 @@ public class SysCommissionDayServiceImpl implements ISysCommissionDayService { LocalDate serverStartDate = DateUtils.dateToLocalDate(sysOrder.getStartTime()); //订单总服务月数 int serverMonth = sysOrder.getServeTimeId().intValue()/30; + //服务天数(不满一个月的零头) + int serverSmallDay = sysOrder.getServeTimeId().intValue()%30 - (serverMonth > 0 ? 0 : 1); //赠送时长 int giveDay = sysOrder.getGiveServeDay().intValue(); //服务到期时间(加赠送时间,不加暂停时间) - LocalDate serverEndDate = serverStartDate.plusMonths(serverMonth).plusDays(giveDay); + LocalDate serverEndDate = serverStartDate.plusMonths(serverMonth).plusDays(giveDay+serverSmallDay); //订单金额 BigDecimal orderAmount = sysOrder.getAmount(); //每年每月暂停天数,key为年份加月份,如:2021年1月=20211 @@ -355,9 +357,6 @@ public class SysCommissionDayServiceImpl implements ISysCommissionDayService { //服务到期时间刷新 serverEndDate = serverEndDate.plusDays(totalDay); } - /*for(String key : pauseMap.keySet()){ - System.out.println(key+":"+pauseMap.get(key).intValue()); - }*/ return pauseMap; } diff --git a/stdiet-custom/src/main/java/com/stdiet/custom/service/impl/SysOrderServiceImpl.java b/stdiet-custom/src/main/java/com/stdiet/custom/service/impl/SysOrderServiceImpl.java index 2101510b2..acffc2f49 100644 --- a/stdiet-custom/src/main/java/com/stdiet/custom/service/impl/SysOrderServiceImpl.java +++ b/stdiet-custom/src/main/java/com/stdiet/custom/service/impl/SysOrderServiceImpl.java @@ -1,6 +1,9 @@ package com.stdiet.custom.service.impl; +import com.stdiet.common.annotation.Excel; import com.stdiet.common.utils.DateUtils; +import com.stdiet.common.utils.SecurityUtils; +import com.stdiet.common.utils.StringUtils; import com.stdiet.custom.domain.SysOrder; import com.stdiet.custom.mapper.SysOrderMapper; import com.stdiet.custom.service.ISysCommissionDayService; @@ -70,18 +73,106 @@ public class SysOrderServiceImpl implements ISysOrderService { public int insertSysOrder(SysOrder sysOrder) { Date orderTime = DateUtils.getNowDate(); sysOrder.setCreateTime(orderTime); + sysOrder.setCreateBy(SecurityUtils.getUsername()); //sysOrder.setOrderTime(orderTime); //计算服务到期时间 setOrderServerEndDate(sysOrder); sysOrder.setOrderId(Long.parseLong(DateUtils.parseDateToStr(DateUtils.YYYYMMDDHHMMSS, orderTime))); - int row = sysOrderMapper.insertSysOrder(sysOrder); -// if (row > 0) { -// //异步生成食谱计划 -// sysRecipesPlanService.regenerateRecipesPlan(sysOrder.getOrderId()); -// } + //获取订单类型 + Integer[] orderType = sysOrder.getOrderTypeList(); + if(orderType == null || orderType.length != 3){ + return 0; + } + sysOrder.setOrderType(String.valueOf(orderType[0])); + sysOrder.setOrderCountType(String.valueOf(orderType[1])); + sysOrder.setOrderMoneyType(String.valueOf(orderType[2])); + int row = 0; + //普通单 + if("0".equals(sysOrder.getOrderType())){ + sysOrder.setNutritionistId((sysOrder.getNutritionistIdList() != null && sysOrder.getNutritionistIdList().length > 0) ? sysOrder.getNutritionistIdList()[0] : null); + sysOrder.setMainOrderId(0L); + sysOrder.setAfterSaleCommissOrder(0); + sysOrder.setOnSaleId(null); + //二开单 + if("1".equals(sysOrder.getOrderCountType())){ + row = sysOrderMapper.insertSysOrder(sysOrder); + //需要自动创建售后二开提成单 + if(row > 0 && sysOrder.getSecondAfterSaleFlag() != null && sysOrder.getSecondAfterSaleFlag().intValue() == 1){ + autoCreateSecondAfterSaleOrder(sysOrder); + } + }else{ + row = sysOrderMapper.insertSysOrder(sysOrder); + } + } + //比例拆分单 + else if("1".equals(sysOrder.getOrderType())){ + sysOrder.setAfterSaleCommissOrder(0); + sysOrder.setOnSaleId(null); + String rate = sysOrder.getNutritionistRate(); + if(StringUtils.isEmpty(rate) || rate.indexOf(",") == -1 || "0,10".equals(rate) || sysOrder.getNutritionistIdList().length != 2){ + return 0; + } + String[] rateArray = rate.split(","); + if(Integer.parseInt(rateArray[0]) + Integer.parseInt(rateArray[1]) != 10){ + return 0; + } + BigDecimal amount = sysOrder.getAmount(); + //获取主单的数组下标 + int mainIndex = 0; + if(Integer.parseInt(rateArray[1]) > Integer.parseInt(rateArray[0])){ + mainIndex = 1; + } + //添加主单 + sysOrder.setNutritionistId(sysOrder.getNutritionistIdList()[mainIndex]); + sysOrder.setAmount(BigDecimal.valueOf(amount.doubleValue()*Integer.parseInt(rateArray[mainIndex])/10)); + sysOrder.setMainOrderId(0L); + row = sysOrderMapper.insertSysOrder(sysOrder); + //添加副单 + sysOrder.setMainOrderId(sysOrder.getOrderId()); + sysOrder.setOrderId(sysOrder.getOrderId()+1); + sysOrder.setNutritionistId(sysOrder.getNutritionistIdList()[1-mainIndex]); + sysOrder.setAmount(BigDecimal.valueOf(amount.doubleValue()*Integer.parseInt(rateArray[1-mainIndex])/10)); + row = sysOrderMapper.insertSysOrder(sysOrder); + //二开,是否需要自动创建售后二开提成单 + if(row > 0 && "1".equals(sysOrder.getOrderCountType()) && sysOrder.getSecondAfterSaleFlag() != null && sysOrder.getSecondAfterSaleFlag().intValue() == 1){ + sysOrder.setAmount(amount); + autoCreateSecondAfterSaleOrder(sysOrder); + } + } + //体验单 + else if("2".equals(sysOrder.getOrderType())){ + sysOrder.setMainOrderId(0L); + sysOrder.setAfterSaleCommissOrder(0); + sysOrder.setAfterSaleId(null); + sysOrder.setNutritionistId(null); + sysOrder.setNutriAssisId(null); + row = sysOrderMapper.insertSysOrder(sysOrder); + } return row; } + /** + * 创建售后二开提成订单 + * @param sysOrder + * @return + */ + private int autoCreateSecondAfterSaleOrder(SysOrder sysOrder){ + if(sysOrder != null){ + sysOrder.setPreSaleId(sysOrder.getAfterSaleId()); + sysOrder.setAfterSaleId(null); + sysOrder.setNutritionistId(null); + sysOrder.setNutriAssisId(null); + sysOrder.setPlannerId(null); + sysOrder.setPlannerAssisId(null); + sysOrder.setOperatorId(null); + sysOrder.setOperatorAssisId(null); + sysOrder.setAfterSaleCommissOrder(1); + sysOrder.setOrderId(sysOrder.getOrderId()+1); + return sysOrderMapper.insertSysOrder(sysOrder); + } + return 0; + } + /** * 修改销售订单 * @@ -94,6 +185,7 @@ public class SysOrderServiceImpl implements ISysOrderService { SysOrder oldSysOrder = sysOrderMapper.selectSysOrderById(sysOrder.getOrderId()); //计算服务到期时间 setOrderServerEndDate(sysOrder); + sysOrder.setUpdateBy(SecurityUtils.getUsername()); sysOrder.setUpdateTime(DateUtils.getNowDate()); //更新订单 int row = sysOrderMapper.updateSysOrder(sysOrder); diff --git a/stdiet-custom/src/main/java/com/stdiet/custom/service/impl/SysRecipesServiceImpl.java b/stdiet-custom/src/main/java/com/stdiet/custom/service/impl/SysRecipesServiceImpl.java index 3ceaae40d..5b583ff03 100644 --- a/stdiet-custom/src/main/java/com/stdiet/custom/service/impl/SysRecipesServiceImpl.java +++ b/stdiet-custom/src/main/java/com/stdiet/custom/service/impl/SysRecipesServiceImpl.java @@ -30,7 +30,6 @@ public class SysRecipesServiceImpl implements ISysRecipesService { public int addRecipes(SysRecipes sysRecipes) { int rows = sysRecipesMapper.addRecipes(sysRecipes); if (rows > 0) { - int count = sysRecipesMapper.getNumDayByCusId(sysRecipes.getCusId()); List menus = sysRecipes.getMenus(); List dishes = new ArrayList<>(); int size = menus.size(); @@ -41,8 +40,6 @@ public class SysRecipesServiceImpl implements ISysRecipesService { tarMenu.setId(dailyId); // 插入recipiesId tarMenu.setRecipesId(sysRecipes.getId()); - // 插入numDay - tarMenu.setNumDay(count + i + 1); for (SysRecipesDailyDishes tmpDishes : tarMenu.getDishes()) { // 让菜品插入menuId tmpDishes.setMenuId(dailyId); diff --git a/stdiet-custom/src/main/resources/mapper/custom/SysOrderMapper.xml b/stdiet-custom/src/main/resources/mapper/custom/SysOrderMapper.xml index 20c43cceb..c4c2cef2c 100644 --- a/stdiet-custom/src/main/resources/mapper/custom/SysOrderMapper.xml +++ b/stdiet-custom/src/main/resources/mapper/custom/SysOrderMapper.xml @@ -40,6 +40,15 @@ + + + + + + + + + @@ -47,10 +56,12 @@ - select o.order_id, o.review_status, o.cus_id, o.customer, o.phone, o.amount, o.start_time, o.pause_time, o.status, o.weight, ser.dict_label as serve_time, + select o.order_id, o.review_status, o.cus_id, sc.name as customer, sc.phone, o.amount, o.start_time, o.pause_time, o.status, o.weight, ser.dict_label as serve_time, o.serve_time_id, o.pay_type_id, pay.dict_label as pay_type, o.pre_sale_id, o.create_by, o.create_time, o.after_sale_id, o.update_by, o.update_time, o.nutritionist_id, o.remark, o.nutri_assis_id, o.account_id, acc.dict_label as account, o.planner_id, o.planner_assis_id, o.operator_id, o.operator_assis_id, - o.recommender, o.order_time,o.give_serve_day,o.conditioning_project_id,cp.dict_label as conditioning_project,o.server_end_time,o.become_fan_time from sys_order o + o.recommender, o.order_time,o.give_serve_day,o.conditioning_project_id,cp.dict_label as conditioning_project,o.server_end_time,o.become_fan_time + from sys_order o + LEFT JOIN sys_customer sc ON sc.id = o.cus_id LEFT JOIN (SELECT dict_label, dict_value FROM sys_dict_data WHERE dict_type = 'cus_pay_type') AS pay ON pay.dict_value = o.pay_type_id LEFT JOIN (SELECT dict_label, dict_value FROM sys_dict_data WHERE dict_type = 'cus_account') AS acc ON acc.dict_value = o.account_id LEFT JOIN (SELECT dict_label, dict_value FROM sys_dict_data WHERE dict_type = 'cus_serve_time') AS ser ON ser.dict_value = o.serve_time_id @@ -99,7 +110,7 @@ and order_id = #{orderId} - and (customer like concat('%',#{customer},'%') or phone like concat('%',#{customer},'%')) + and (sc.name like concat('%',#{customer},'%') or sc.phone like concat('%',#{customer},'%')) and cus_id = #{cusId} @@ -127,85 +138,97 @@ and 0 > amount - and del_flag = 0 + and o.del_flag = 0 order by order_time desc insert into sys_order - order_id, customer, cus_id, phone, - amount, - status, - pause_time, - start_time, - weight, pay_type_id, + review_status, pre_sale_id, - create_by, - create_time, + status, + weight, after_sale_id, - update_by, - update_time, + start_time, + pause_time, nutritionist_id, - remark, nutri_assis_id, + on_sale_id, account_id, planner_id, planner_assis_id, - operator_id, operator_assis_id, - recommender, - order_time, + operator_id, serve_time_id, - review_status, + recommender, + amount, + order_time, + create_by, + create_time, + update_by, + update_time, + remark, give_serve_day, conditioning_project_id, server_end_time, become_fan_time, + order_type, + order_count_type, + order_money_type, + main_order_id, + after_sale_commiss_order, + del_flag, - #{orderId}, #{customer}, #{cusId}, #{phone}, - #{amount}, - #{status}, - #{pauseTime}, - #{startTime}, - #{weight}, #{payTypeId}, + #{reviewStatus}, #{preSaleId}, - #{createBy}, - #{createTime}, + #{status}, + #{weight}, #{afterSaleId}, - #{updateBy}, - #{updateTime}, + #{startTime}, + #{pauseTime}, #{nutritionistId}, - #{remark}, #{nutriAssisId}, + #{onSaleId}, #{accountId}, #{plannerId}, #{plannerAssisId}, - #{operatorId}, #{operatorAssisId}, - #{recommender}, - #{orderTime}, + #{operatorId}, #{serveTimeId}, - #{reviewStatus}, + #{recommender}, + #{amount}, + #{orderTime}, + #{createBy}, + #{createTime}, + #{updateBy}, + #{updateTime}, + #{remark}, #{giveServeDay}, #{conditioningProjectId}, #{serverEndTime}, #{becomeFanTime}, + #{orderType}, + #{orderCountType}, + #{orderMoneyType}, + #{mainOrderId}, + #{afterSaleCommissOrder}, + #{delFlag}, @@ -215,34 +238,41 @@ customer = #{customer}, cus_id = #{cusId}, phone = #{phone}, - amount = #{amount}, - weight = #{weight}, - status = #{status}, - pause_time = #{pauseTime}, - start_time = #{startTime}, pay_type_id = #{payTypeId}, + review_status = #{reviewStatus}, pre_sale_id = #{preSaleId}, - create_by = #{createBy}, - create_time = #{createTime}, + status = #{status}, + weight = #{weight}, after_sale_id = #{afterSaleId}, - update_by = #{updateBy}, - update_time = #{updateTime}, + start_time = #{startTime}, + pause_time = #{pauseTime}, nutritionist_id = #{nutritionistId}, - remark = #{remark}, nutri_assis_id = #{nutriAssisId}, + on_sale_id = #{onSaleId}, account_id = #{accountId}, planner_id = #{plannerId}, planner_assis_id = #{plannerAssisId}, - operator_id = #{operatorId}, operator_assis_id = #{operatorAssisId}, - recommender = #{recommender}, - order_time = #{orderTime}, + operator_id = #{operatorId}, serve_time_id = #{serveTimeId}, - review_status = #{reviewStatus}, + recommender = #{recommender}, + amount = #{amount}, + order_time = #{orderTime}, + create_by = #{createBy}, + create_time = #{createTime}, + update_by = #{updateBy}, + update_time = #{updateTime}, + remark = #{remark}, give_serve_day = #{giveServeDay}, conditioning_project_id = #{conditioningProjectId}, server_end_time = #{serverEndTime}, become_fan_time = #{becomeFanTime}, + order_type = #{orderType}, + order_count_type = #{orderCountType}, + order_money_type = #{orderMoneyType}, + main_order_id = #{mainOrderId}, + after_sale_commiss_order = #{afterSaleCommissOrder}, + del_flag = #{delFlag}, where order_id = #{orderId} @@ -294,6 +324,15 @@ + + + + + + + + + @@ -325,7 +364,7 @@ from sys_order o left join sys_user su_sale on su_sale.user_id = o.after_sale_id and su_sale.del_flag = 0 left join sys_user su_nutritionist on su_nutritionist.user_id = o.nutritionist_id and su_nutritionist.del_flag = 0 - where review_status = 'yes' and o.order_time >= '2021-01-01' and del_flag = 0 + where review_status = 'yes' and o.order_time >= '2021-01-01' and o.del_flag = 0 and (su_sale.user_id = #{userId} or su_nutritionist.user_id = #{userId}) diff --git a/stdiet-custom/src/main/resources/mapper/custom/SysRecipesMapper.xml b/stdiet-custom/src/main/resources/mapper/custom/SysRecipesMapper.xml index d29b1f7df..3e15a55d7 100644 --- a/stdiet-custom/src/main/resources/mapper/custom/SysRecipesMapper.xml +++ b/stdiet-custom/src/main/resources/mapper/custom/SysRecipesMapper.xml @@ -127,9 +127,9 @@ - insert into sys_customer_daily_menu (id, num_day, date, recipes_id, cus_id) values + insert into sys_customer_daily_menu (id, num_day, recipes_id, cus_id) values - (#{item.id}, #{item.numDay}, #{item.date}, #{item.recipesId}, #{item.cusId}) + (#{item.id}, #{item.numDay}, #{item.recipesId}, #{item.cusId}) diff --git a/stdiet-custom/src/main/resources/mapper/custom/SysRecipesPlanMapper.xml b/stdiet-custom/src/main/resources/mapper/custom/SysRecipesPlanMapper.xml index 619537d9e..05904355f 100644 --- a/stdiet-custom/src/main/resources/mapper/custom/SysRecipesPlanMapper.xml +++ b/stdiet-custom/src/main/resources/mapper/custom/SysRecipesPlanMapper.xml @@ -9,6 +9,8 @@ + + @@ -19,7 +21,7 @@ - + @@ -31,7 +33,7 @@ - select id, order_id, cus_id, start_date, end_date, recipes_id, send_flag, send_time, create_time, create_by, update_time, update_by, del_flag 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, create_time, create_by, update_time, update_by, del_flag from sys_recipes_plan - SELECT srp.id,srp.order_id,srp.recipes_id,sr.customer,sr.cus_id,sr.phone,su_nutritionist.nick_name nutritionist,su_nutritionist_assis.nick_name AS nutritionist_assis,sr.start_time,sr.server_end_time, srp.start_date,srp.end_date,srp.send_flag,srp.send_time + SELECT srp.id,srp.order_id,srp.recipes_id,srp.start_num_day,srp.end_num_day,srp.cus_id,sc.phone, + su_nutritionist.nick_name nutritionist,su_nutritionist_assis.nick_name AS nutritionist_assis, + srp.start_date,srp.end_date,srp.send_flag,srp.send_time, sc.name as customer FROM sys_recipes_plan srp LEFT JOIN sys_order sr ON sr.order_id = srp.order_id + LEFT JOIN sys_customer sc ON sc.id = srp.cus_id LEFT JOIN sys_user su_nutritionist ON su_nutritionist.user_id = sr.nutritionist_id AND su_nutritionist.del_flag = 0 LEFT JOIN sys_user su_nutritionist_assis ON su_nutritionist_assis.user_id = sr.nutri_assis_id AND su_nutritionist_assis.del_flag = 0 - WHERE srp.del_flag = 0 + WHERE srp.del_flag = 0 and sr.del_flag = 0 AND srp.order_id = #{orderId} AND srp.send_flag = #{sendFlag} - AND (sr.customer like concat('%',#{customer},'%') OR sr.phone like concat('%',#{customer},'%')) + AND (sc.name like concat('%',#{customer},'%') OR sc.phone like concat('%',#{customer},'%')) AND su_nutritionist.user_id = #{nutritionistId} AND su_nutritionist_assis.user_id = #{nutritionistAssisId} AND srp.start_date BETWEEN date_format(#{startDate},'%y%m%d') AND date_format(#{endDate},'%y%m%d') @@ -169,7 +182,7 @@ SELECT srp.id,srp.order_id,sr.customer,sr.phone, srp.start_date,srp.end_date,srp.send_flag,srp.send_time FROM sys_recipes_plan srp LEFT JOIN sys_order sr ON sr.order_id = srp.order_id - WHERE srp.del_flag = 0 AND srp.order_id = #{orderId} + WHERE srp.del_flag = 0 AND sr.del_flag = 0 AND srp.order_id = #{orderId} AND srp.send_flag = #{sendFlag} ORDER BY srp.id ASC diff --git a/stdiet-ui/package.json b/stdiet-ui/package.json index f69302144..e9357aaf0 100644 --- a/stdiet-ui/package.json +++ b/stdiet-ui/package.json @@ -65,6 +65,7 @@ "vue-count-to": "1.0.13", "vue-cropper": "0.4.9", "vue-router": "3.0.2", + "vue-scrollto": "^2.20.0", "vue-splitpane": "1.0.4", "vuedraggable": "2.20.0", "vuex": "3.1.0" diff --git a/stdiet-ui/src/components/ContractDrawer/index.vue b/stdiet-ui/src/components/ContractDrawer/index.vue index 4085e88b2..2facf1ccf 100644 --- a/stdiet-ui/src/components/ContractDrawer/index.vue +++ b/stdiet-ui/src/components/ContractDrawer/index.vue @@ -4,7 +4,6 @@ :title="title" :close-on-press-escape="false" :visible.sync="visible" - :wrapperClosable="false" @closed="handleOnClosed" size="40%" > diff --git a/stdiet-ui/src/components/OrderAdd/index.vue b/stdiet-ui/src/components/OrderAdd/index.vue index 5ed395174..91b3af742 100644 --- a/stdiet-ui/src/components/OrderAdd/index.vue +++ b/stdiet-ui/src/components/OrderAdd/index.vue @@ -10,16 +10,16 @@ - + - + @@ -116,7 +115,18 @@ - + + + + + + + + - + - + - + - + + @@ -103,7 +102,7 @@ - + @@ -113,7 +112,7 @@ + diff --git a/stdiet-ui/src/main.js b/stdiet-ui/src/main.js index 2f6f7e638..b270a0d4b 100644 --- a/stdiet-ui/src/main.js +++ b/stdiet-ui/src/main.js @@ -1,22 +1,24 @@ -import Vue from 'vue' +import Vue from "vue"; -import Cookies from 'js-cookie' +import Cookies from "js-cookie"; -import 'normalize.css/normalize.css' // a modern alternative to CSS resets -import Element from 'element-ui' -import './assets/styles/element-variables.scss' +import "normalize.css/normalize.css"; // a modern alternative to CSS resets +import Element from "element-ui"; +import "./assets/styles/element-variables.scss"; -import '@/assets/styles/index.scss' // global css -import '@/assets/styles/ruoyi.scss' // ruoyi css -import App from './App' -import store from './store' -import router from './router' -import permission from './directive/permission' +import "@/assets/styles/index.scss"; // global css +import "@/assets/styles/ruoyi.scss"; // ruoyi css +import App from "./App"; +import store from "./store"; +import router from "./router"; +import permission from "./directive/permission"; + +import "./assets/icons"; // icon +import "./permission"; // permission control +import { getDicts } from "@/api/system/dict/data"; +import { getConfigKey } from "@/api/system/config"; +import VueScrollTo from "vue-scrollto"; -import './assets/icons' // icon -import './permission' // permission control -import {getDicts} from "@/api/system/dict/data"; -import {getConfigKey} from "@/api/system/config"; import { addDateRange, download, @@ -32,40 +34,40 @@ import { } from "@/utils/ruoyi"; import Pagination from "@/components/Pagination"; //自定义表格工具扩展 -import RightToolbar from "@/components/RightToolbar" +import RightToolbar from "@/components/RightToolbar"; // 全局方法挂载 -Vue.prototype.getDicts = getDicts -Vue.prototype.getConfigKey = getConfigKey -Vue.prototype.parseTime = parseTime -Vue.prototype.resetForm = resetForm -Vue.prototype.addDateRange = addDateRange -Vue.prototype.selectDictLabel = selectDictLabel -Vue.prototype.selectDictLabels = selectDictLabels -Vue.prototype.download = download -Vue.prototype.downloadResource = downloadResource -Vue.prototype.handleTree = handleTree -Vue.prototype.toThousands = toThousands -Vue.prototype.digitUppercase = digitUppercase -Vue.prototype.validatorIDCard = validatorIDCard +Vue.prototype.getDicts = getDicts; +Vue.prototype.getConfigKey = getConfigKey; +Vue.prototype.parseTime = parseTime; +Vue.prototype.resetForm = resetForm; +Vue.prototype.addDateRange = addDateRange; +Vue.prototype.selectDictLabel = selectDictLabel; +Vue.prototype.selectDictLabels = selectDictLabels; +Vue.prototype.download = download; +Vue.prototype.downloadResource = downloadResource; +Vue.prototype.handleTree = handleTree; +Vue.prototype.toThousands = toThousands; +Vue.prototype.digitUppercase = digitUppercase; +Vue.prototype.validatorIDCard = validatorIDCard; -Vue.prototype.msgSuccess = function (msg) { - this.$message({showClose: true, message: msg, type: "success"}); -} +Vue.prototype.msgSuccess = function(msg) { + this.$message({ showClose: true, message: msg, type: "success" }); +}; -Vue.prototype.msgError = function (msg) { - this.$message({showClose: true, message: msg, type: "error"}); -} +Vue.prototype.msgError = function(msg) { + this.$message({ showClose: true, message: msg, type: "error" }); +}; -Vue.prototype.msgInfo = function (msg) { +Vue.prototype.msgInfo = function(msg) { this.$message.info(msg); -} +}; // 全局组件挂载 -Vue.component('Pagination', Pagination) -Vue.component('RightToolbar', RightToolbar) +Vue.component("Pagination", Pagination); +Vue.component("RightToolbar", RightToolbar); -Vue.use(permission) +Vue.use(permission); /** * If you don't want to use mock-server @@ -77,14 +79,34 @@ Vue.use(permission) */ Vue.use(Element, { - size: Cookies.get('size') || 'medium' // set element-ui default size -}) + size: Cookies.get("size") || "medium" // set element-ui default size +}); -Vue.config.productionTip = false +Vue.config.productionTip = false; + +Vue.directive("title", { + inserted: function(el, binding) { + document.title = el.dataset.title; + } +}); + +Vue.use(VueScrollTo, { + container: "body", + duration: 500, + easing: "ease", + offset: 0, + force: true, + cancelable: true, + onStart: false, + onDone: false, + onCancel: false, + x: false, + y: true +}); new Vue({ - el: '#app', + el: "#app", router, store, render: h => h(App) -}) +}); diff --git a/stdiet-ui/src/router/index.js b/stdiet-ui/src/router/index.js index 723eb3a82..fea245cae 100644 --- a/stdiet-ui/src/router/index.js +++ b/stdiet-ui/src/router/index.js @@ -140,19 +140,11 @@ export const constantRoutes = [ ] }, { - path: "/recipes", - component: Layout, - hidden: true, - children: [ - { - path: "build", - component: resolve => - require(["@/views/custom/recipesBuild"], resolve), - name: "RecipiesBuild", - props: true, - meta: { title: "食谱制作" } - } - ] + path: "/recipes/build", + component: resolve => require(["@/views/custom/recipesBuild"], resolve), + name: "RecipiesBuild", + meta: { title: "食谱制作" }, + hidden: true }, { path: "/f/contract/:id(\\d+)", @@ -174,14 +166,13 @@ export const constantRoutes = [ hidden: true, meta: { title: "胜唐体控健康评估表" } }, -{ + { path: "/foodHeatCalculator/:id", component: resolve => - require(["@/views/custom/foodHeatStatistics/investigate"], resolve), + require(["@/views/custom/foodHeatStatistics/investigate"], resolve), hidden: true, meta: { title: "外食计算器" } -}, - + } ]; export default new Router({ diff --git a/stdiet-ui/src/store/modules/recipes.js b/stdiet-ui/src/store/modules/recipes.js index dd626ff4f..4311492bd 100644 --- a/stdiet-ui/src/store/modules/recipes.js +++ b/stdiet-ui/src/store/modules/recipes.js @@ -8,7 +8,6 @@ import { addRecipesApi } from "@/api/custom/recipes"; import { getDicts } from "@/api/system/dict/data"; -import dayjs from "dayjs"; const oriState = { cusId: undefined, @@ -24,8 +23,8 @@ const oriState = { dishesTypeOptions: [], typeOptions: [], currentDay: -1, - startDate: "", - endDate: "" + startNum: 0, + endNum: 0 }; const mutations = { @@ -36,9 +35,9 @@ const mutations = { if (tarDishes) { const tarIgd = tarDishes.igdList.find(obj => obj.id === payload.igdId); if (tarIgd) { - Object.keys(payload).forEach(key => { - tarIgd[key] = payload[key]; - }); + payload.weight && (tarIgd.weight = payload.weight); + payload.cusWeight && (tarIgd.cusWeight = payload.cusWeight); + payload.cusUnit && (tarIgd.cusUnit = payload.cusUnit); } } }, @@ -125,63 +124,73 @@ const actions = { healthyData }); }, - async getRecipesInfo({ commit }, payload) { + async getRecipesInfo({ commit, state }, payload) { commit("updateStateData", { recipesDataLoading: true }); const recipesDataResult = await getRecipesApi(payload.recipesId); - let recipesData = undefined; + let recipesData = []; if (recipesDataResult.code === 200) { - recipesData = recipesDataResult.data.map(dayData => { - return { - id: dayData.id, - numDay: dayData.numDay, - dishes: dayData.dishes.reduce((arr, cur) => { - if ( - cur.dishesId > -1 && - cur.name && - cur.igdList.length > 0 && - cur.type !== "0" - ) { - arr.push({ - id: cur.id, - dishesId: cur.dishesId, - name: cur.name, - menuId: cur.menuId, - methods: cur.methods, - type: cur.type, - isMain: cur.isMain, - igdList: cur.igdList.reduce((igdArr, igdData) => { - if (igdData.id > 0) { - const tarDetail = cur.detail.find( - obj => obj.id === igdData.id - ); - igdArr.push({ - id: igdData.id, - name: igdData.name, - carbonRatio: igdData.carbonRatio, - fatRatio: igdData.fatRatio, - proteinRatio: igdData.proteinRatio, - cusUnit: tarDetail ? tarDetail.cus_unit : igdData.cusUnit, - cusWeight: tarDetail - ? parseFloat(tarDetail.cus_weight) - : igdData.cusWeight, - weight: tarDetail - ? parseFloat(tarDetail.weight) - : igdData.weight, - notRec: igdData.notRec, - rec: igdData.rec, - type: igdData.type - }); - } - return igdArr; - }, []) - }); - } - return arr; - }, []) - }; - }); + const { endNum, startNum } = state; + let length = null; + if (endNum && startNum) { + length = endNum - startNum; + } + recipesData = recipesDataResult.data.reduce((outArr, dayData, idx) => { + if (!length || (length && length >= idx)) { + outArr.push({ + id: dayData.id, + numDay: startNum ? startNum + idx : dayData.numDay, + dishes: dayData.dishes.reduce((arr, cur) => { + if ( + cur.dishesId > -1 && + cur.name && + cur.igdList.length > 0 && + cur.type !== "0" + ) { + arr.push({ + id: cur.id, + dishesId: cur.dishesId, + name: cur.name, + menuId: cur.menuId, + methods: cur.methods, + type: cur.type, + isMain: cur.isMain, + igdList: cur.igdList.reduce((igdArr, igdData) => { + if (igdData.id > 0) { + const tarDetail = cur.detail.find( + obj => obj.id === igdData.id + ); + igdArr.push({ + id: igdData.id, + name: igdData.name, + carbonRatio: igdData.carbonRatio, + fatRatio: igdData.fatRatio, + proteinRatio: igdData.proteinRatio, + cusUnit: tarDetail + ? tarDetail.cus_unit + : igdData.cusUnit, + cusWeight: tarDetail + ? parseFloat(tarDetail.cus_weight) + : igdData.cusWeight, + weight: tarDetail + ? parseFloat(tarDetail.weight) + : igdData.weight, + notRec: igdData.notRec, + rec: igdData.rec, + type: igdData.type + }); + } + return igdArr; + }, []) + }); + } + return arr; + }, []) + }); + } + return outArr; + }, []); } else { throw new Error(recipesDataResult.msg); } @@ -193,9 +202,7 @@ const actions = { cusId, planId, menus: recipesData.map((menu, idx) => ({ - date: dayjs(state.startDate) - .add(idx, "day") - .format("YYYY-MM-DD"), + numDay: menu.numDay, cusId, dishes: menu.dishes.map(dObj => ({ dishesId: dObj.dishesId, @@ -209,11 +216,19 @@ const actions = { })) })) }; + const result = await addRecipesApi(params); if (result.code === 200) { const recipesId = result.data; commit("updateStateData", { recipesId }); dispatch("getRecipesInfo", { recipesId }); + payload.callback && + payload.callback({ + recipesId: result.data, + name: state.healthyData.name, + cusId: state.cusId, + planId: state.planId + }); } // console.log(params); }, @@ -247,6 +262,7 @@ const actions = { } }, async updateDishes({ commit, state }, payload) { + // console.log(payload); if (state.recipesId) { const tarDishes = state.recipesData[payload.num].dishes.find( obj => obj.dishesId === payload.dishesId @@ -273,9 +289,9 @@ const actions = { commit("updateRecipesDishesDetail", payload); } } - } else { - commit("updateRecipesDishesDetail", payload); } + } else { + commit("updateRecipesDishesDetail", payload); } }, async deleteDishes({ commit, state }, payload) { diff --git a/stdiet-ui/src/utils/orderType.js b/stdiet-ui/src/utils/orderType.js index 8d3f7dcc6..0265c859f 100644 --- a/stdiet-ui/src/utils/orderType.js +++ b/stdiet-ui/src/utils/orderType.js @@ -35,6 +35,18 @@ export const orderTypeArray = [ value: 1, label: "比例拆分单", children: orderCountTypeArray + }, + { + value: 2, + label: "体验单", + children:[{ + value: 0, + label: "一开单", + children: [{ + value: 0, + label: "全款单" + }] + }] } ] @@ -43,7 +55,7 @@ export const orderRateArray = [ { dictValue: "0,10", dictLabel: "不拆分", - remark: "" + remark: "default" }, { dictValue: "1,9", @@ -52,7 +64,7 @@ export const orderRateArray = [ },{ dictValue: "2,8", dictLabel: "2-8开", - remark: "default" + remark: "" }, { dictValue: "3,7", diff --git a/stdiet-ui/src/views/custom/customer/index.vue b/stdiet-ui/src/views/custom/customer/index.vue index c28605b41..9d05de70d 100644 --- a/stdiet-ui/src/views/custom/customer/index.vue +++ b/stdiet-ui/src/views/custom/customer/index.vue @@ -346,6 +346,7 @@ + @@ -364,6 +365,7 @@ import OrderDrawer from "@/components/OrderDrawer"; import PhysicalSignsDialog from "@/components/PhysicalSignsDialog"; import ContractDrawer from "@/components/ContractDrawer"; import HeatStatisticsDrawer from "@/components/HeatStatisticsDrawer"; +import RecipesPlanDrawer from '@/components/RecipesPlanDrawer' import { mapGetters } from "vuex"; export default { @@ -373,6 +375,7 @@ export default { "physical-signs-dialog": PhysicalSignsDialog, "contract-drawer": ContractDrawer, heatStatisticsDrawer: HeatStatisticsDrawer, + RecipesPlanDrawer }, data() { const userId = store.getters && store.getters.userId; @@ -392,14 +395,6 @@ export default { total: 0, // 客户档案表格数据 customerCenterList: [], - // 售前字典 - // preSaleIdOptions: [], - // 售后字典 - // afterSaleIdOptions: [], - // 主营养师字典 - // nutritionistIdOptions: [], - // 助理营养师字典 - // nutriAssisIdOptions: [], // 弹出层标题 title: "", // 是否显示弹出层 @@ -459,9 +454,13 @@ export default { }, computed: { ...mapGetters([ + // 售前字典 "preSaleIdOptions", + // 售后字典 "afterSaleIdOptions", + // 主营养师字典 "nutritionistIdOptions", + // 助理营养师字典 "nutriAssisIdOptions", ]), }, @@ -511,6 +510,7 @@ export default { }, handleOnMenuClick(row) { // console.log(row); + this.$refs['recipesPlanDrawerRef'].showDrawer(row); }, handleClickHeatStatistics(row) { this.$refs["heatStatisticsRef"].showDrawer(row); diff --git a/stdiet-ui/src/views/custom/order/index.vue b/stdiet-ui/src/views/custom/order/index.vue index 2f6326317..d14535a64 100644 --- a/stdiet-ui/src/views/custom/order/index.vue +++ b/stdiet-ui/src/views/custom/order/index.vue @@ -335,7 +335,7 @@ - + - + @@ -80,7 +76,7 @@ export default { name: "ConfigDishes", data() { return { - nType: this.type, + mType: this.type, }; }, props: { @@ -113,14 +109,19 @@ export default { EditableText, EditableUnit, }, + watch: { + type(val) { + this.mType = val; + }, + }, computed: {}, methods: { handleOnTypeChange(type) { - this.$emit("onChane", { type }); + this.$emit("onChange", { type }); }, handleOnWeightChange(data, val) { // console.log({ data, val }); - this.$emit("onChane", { + this.$emit("onChange", { igdList: produce(this.igdList, (draftState) => { const tarIgd = draftState.find((obj) => obj.id === data.id); if (tarIgd) { @@ -131,7 +132,7 @@ export default { }, handleOnCustomUnitChange(data, val) { // console.log({ data, val }); - this.$emit("onChane", { + this.$emit("onChange", { igdList: produce(this.igdList, (draftState) => { const tarIgd = draftState.find((obj) => obj.id === data.id); if (tarIgd) { diff --git a/stdiet-ui/src/views/custom/recipesBuild/RecipesView/RecipesCom/index.vue b/stdiet-ui/src/views/custom/recipesBuild/RecipesView/RecipesCom/index.vue index eb392b293..79e5821ad 100644 --- a/stdiet-ui/src/views/custom/recipesBuild/RecipesView/RecipesCom/index.vue +++ b/stdiet-ui/src/views/custom/recipesBuild/RecipesView/RecipesCom/index.vue @@ -7,15 +7,14 @@ :cell-style="{ padding: '2px 0' }" :header-cell-style="{ padding: '4px 0', height: 'unset' }" size="mini" - :style="`outline: ${ - currentDay + 1 === num ? '1px solid #d96969' : 'none' - }`" + :style="`outline: ${currentDay === num ? '1px solid #d96969' : 'none'}`" > - + - +