diff --git a/stdiet-admin/src/main/java/com/stdiet/web/controller/custom/SysCustomerController.java b/stdiet-admin/src/main/java/com/stdiet/web/controller/custom/SysCustomerController.java index e97616b3e..7accfb8b6 100644 --- a/stdiet-admin/src/main/java/com/stdiet/web/controller/custom/SysCustomerController.java +++ b/stdiet-admin/src/main/java/com/stdiet/web/controller/custom/SysCustomerController.java @@ -9,19 +9,15 @@ import com.stdiet.common.utils.StringUtils; import com.stdiet.common.utils.poi.ExcelUtil; import com.stdiet.common.utils.sign.AesUtils; import com.stdiet.custom.domain.SysCustomer; -import com.stdiet.custom.domain.SysCustomerHealthy; import com.stdiet.custom.domain.SysCustomerPhysicalSigns; import com.stdiet.custom.service.ISysCustomerHealthyService; import com.stdiet.custom.service.ISysCustomerPhysicalSignsService; import com.stdiet.custom.service.ISysCustomerService; -import com.stdiet.framework.web.domain.server.Sys; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.security.access.prepost.PreAuthorize; import org.springframework.web.bind.annotation.*; -import java.util.HashMap; import java.util.List; -import java.util.Map; /** * 客户体征信息Controller @@ -53,7 +49,7 @@ public class SysCustomerController extends BaseController { for (SysCustomer sysCus : list) { if (StringUtils.isNotEmpty(sysCus.getPhone())) { sysCus.setPhone(StringUtils.hiddenPhoneNumber(sysCus.getPhone())); - sysCus.setEncId(sysCus.getId() != null ? AesUtils.encrypt(sysCus.getId()+"", null) : ""); + sysCus.setEncId(sysCus.getId() != null ? AesUtils.encrypt(sysCus.getId() + "", null) : ""); } } } @@ -88,7 +84,7 @@ public class SysCustomerController extends BaseController { @Log(title = "客户档案", businessType = BusinessType.INSERT) @PostMapping public AjaxResult add(@RequestBody SysCustomer sysCustomer) throws Exception { - if(!sysCustomerService.isCustomerExistByPhone(sysCustomer)){ + if (!sysCustomerService.isCustomerExistByPhone(sysCustomer)) { return toAjax(sysCustomerService.insertSysCustomer(sysCustomer)); } return AjaxResult.error("该手机号客户已存在"); @@ -101,7 +97,7 @@ public class SysCustomerController extends BaseController { @Log(title = "客户档案", businessType = BusinessType.UPDATE) @PutMapping public AjaxResult edit(@RequestBody SysCustomer sysCustomer) throws Exception { - if(!sysCustomerService.isCustomerExistByPhone(sysCustomer)){ + if (!sysCustomerService.isCustomerExistByPhone(sysCustomer)) { return toAjax(sysCustomerService.updateSysCustomer(sysCustomer)); } return AjaxResult.error("该手机号客户已存在"); @@ -122,51 +118,29 @@ public class SysCustomerController extends BaseController { */ @GetMapping("/getCustomerAndSignByPhone") @PreAuthorize("@ss.hasPermi('custom:customer:query')") - public AjaxResult getCustomerAndSignByPhone(@RequestParam("phone")String phone) - { + public AjaxResult getCustomerAndSignByPhone(@RequestParam("phone") String phone) { SysCustomerPhysicalSigns sysCustomer = null; - if(StringUtils.isNotEmpty(phone)){ - sysCustomer = sysCustomerPhysicalSignsService.selectSysCustomerAndSignByPhone(phone); + if (StringUtils.isNotEmpty(phone)) { + sysCustomer = sysCustomerPhysicalSignsService.selectSysCustomerAndSignByPhone(phone); } return AjaxResult.success(sysCustomer); } /** * 根据客户ID获取体征或健康评估信息,优先健康评估信息 + * * @param id 客户ID * @return */ @GetMapping("/physicalSigns/{id}") public AjaxResult getPhysicalSignsById(@PathVariable("id") Long id) { - Map<String, Object> result = new HashMap<>(); - String key = "customerHealthy"; - result.put("type", 0); - //查询健康评估信息 - SysCustomerHealthy sysCustomerHealthy = sysCustomerHealthyService.selectSysCustomerHealthyByCustomerId(id); - if(sysCustomerHealthy != null){ - /* if (StringUtils.isNotEmpty(sysCustomerHealthy.getPhone())) { - sysCustomerHealthy.setPhone(StringUtils.hiddenPhoneNumber(sysCustomerHealthy.getPhone())); - }*/ - result.put(key, sysCustomerHealthy); - }else{ - //查询体征信息 - SysCustomerPhysicalSigns sysCustomerPhysicalSigns = sysCustomerPhysicalSignsService.selectSysCustomerPhysicalSignsByCusId(id); - if(sysCustomerPhysicalSigns != null){ - /* if (StringUtils.isNotEmpty(sysCustomerPhysicalSigns.getPhone())) { - sysCustomerPhysicalSigns.setPhone(StringUtils.hiddenPhoneNumber(sysCustomerPhysicalSigns.getPhone())); - }*/ - result.put("type", 1); - } - result.put(key, sysCustomerPhysicalSigns); - } - //对ID进行加密 - result.put("enc_id", id != null ? AesUtils.encrypt(id+"", null) : ""); - return AjaxResult.success(result); + return AjaxResult.success(sysCustomerService.getPhysicalSignsById(id)); } /** * 根据客户ID删除对应体征信息或健康评估信息 - * @param id 客户ID + * + * @param customerId 客户ID * @return */ @GetMapping("/delCustomerHealthy/{id}") diff --git a/stdiet-admin/src/main/java/com/stdiet/web/controller/custom/SysRecipesController.java b/stdiet-admin/src/main/java/com/stdiet/web/controller/custom/SysRecipesController.java index 950b7c1cc..e27b04217 100644 --- a/stdiet-admin/src/main/java/com/stdiet/web/controller/custom/SysRecipesController.java +++ b/stdiet-admin/src/main/java/com/stdiet/web/controller/custom/SysRecipesController.java @@ -79,4 +79,5 @@ public class SysRecipesController extends BaseController { public AjaxResult delete(@PathVariable Long id) { return toAjax(sysRecipesService.deleteDishes(id)); } + } diff --git a/stdiet-admin/src/main/java/com/stdiet/web/controller/custom/SysWapController.java b/stdiet-admin/src/main/java/com/stdiet/web/controller/custom/SysWapController.java new file mode 100644 index 000000000..45cb7f108 --- /dev/null +++ b/stdiet-admin/src/main/java/com/stdiet/web/controller/custom/SysWapController.java @@ -0,0 +1,51 @@ +package com.stdiet.web.controller.custom; + +import com.stdiet.common.core.controller.BaseController; +import com.stdiet.common.core.domain.AjaxResult; +import com.stdiet.custom.service.ISysRecipesService; +import com.stdiet.custom.service.ISysWapServices; +import com.stdiet.system.service.ISysDictTypeService; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.bind.annotation.PathVariable; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RestController; + +@RestController +@RequestMapping("/wap") +public class SysWapController extends BaseController { + @Autowired + ISysWapServices iSysWapServices; + + @Autowired + ISysRecipesService iSysRecipesService; + + @Autowired + ISysDictTypeService iSysDictTypeService; + + /** + * 客户食谱详情 + * + * @param outId + * @return + */ + @GetMapping(value = "/recipes/plans/{outId}") + public AjaxResult detail(@PathVariable String outId) { + return AjaxResult.success(iSysWapServices.getRecipesPlanListInfo(outId)); + } + + @GetMapping(value = "/healthyInfo/{outId}") + public AjaxResult healthy(@PathVariable String outId) { + return AjaxResult.success(iSysWapServices.getHealthyDataByOutId(outId)); + } + + @GetMapping(value = "/recipes/menu/{id}") + public AjaxResult dayilyMenu(@PathVariable Long id) { + return AjaxResult.success(iSysRecipesService.selectDishesByMenuId(id)); + } + + @GetMapping(value = "/dict/{dictType}") + public AjaxResult sysDict(@PathVariable String dictType) { + return AjaxResult.success(iSysDictTypeService.selectDictDataByType(dictType)); + } +} diff --git a/stdiet-custom/src/main/java/com/stdiet/custom/domain/SysRecipesDetail.java b/stdiet-custom/src/main/java/com/stdiet/custom/domain/SysRecipesDetail.java new file mode 100644 index 000000000..b640c807a --- /dev/null +++ b/stdiet-custom/src/main/java/com/stdiet/custom/domain/SysRecipesDetail.java @@ -0,0 +1,12 @@ +package com.stdiet.custom.domain; + +import lombok.Data; + +import java.util.List; + +@Data +public class SysRecipesDetail { + + private List<SysRecipesPlan> plans; + +} 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 4892c8d31..3251d3bc7 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 @@ -1,12 +1,10 @@ package com.stdiet.custom.domain; -import java.util.Date; 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; +import lombok.Data; + +import java.util.Date; /** * 食谱计划对象 sys_recipes_plan @@ -15,14 +13,16 @@ import com.stdiet.common.core.domain.BaseEntity; * @date 2021-01-15 */ @Data -public class SysRecipesPlan extends BaseEntity -{ - private static final long serialVersionUID = 1L; +public class SysRecipesPlan { - /** $column.columnComment */ + /** + * $column.columnComment + */ private Long id; - /** 订单ID */ + /** + * 订单ID + */ //@Excel(name = "订单ID") private Long orderId; @@ -46,12 +46,16 @@ public class SysRecipesPlan extends BaseEntity //处理过的客户手机号 private String hidePhone; - /** 食谱开始日期 */ + /** + * 食谱开始日期 + */ @JsonFormat(pattern = "yyyy-MM-dd") @Excel(name = "食谱开始日期", width = 30, dateFormat = "yyyy-MM-dd") private Date startDate; - /** 食谱结束日期 */ + /** + * 食谱结束日期 + */ @JsonFormat(pattern = "yyyy-MM-dd") @Excel(name = "食谱结束日期", width = 30, dateFormat = "yyyy-MM-dd") private Date endDate; @@ -78,19 +82,54 @@ public class SysRecipesPlan extends BaseEntity @Excel(name = "营养师助理") private String nutritionistAssis; - /** 食谱ID */ + /** + * 食谱ID + */ //@Excel(name = "食谱ID") private Long recipesId; - /** 食谱是否发送,0未发送 1已发送 */ - @Excel(name = "食谱是否发送", readConverterExp="0=未发送,1=已发送") + /** + * 食谱是否发送,0未发送 1已发送 + */ + @Excel(name = "食谱是否发送", readConverterExp = "0=未发送,1=已发送") private Integer sendFlag; - /** 食谱发送时间 */ + /** + * 食谱发送时间 + */ @JsonFormat(pattern = "yyyy-MM-dd") @Excel(name = "食谱发送时间", width = 30, dateFormat = "yyyy-MM-dd") private Date sendTime; - /** 删除标识 0未删除 1已删除 默认0 */ + /** + * 删除标识 0未删除 1已删除 默认0 + */ private Integer delFlag; + + /** + * 审核标识 0未审核 1已审核 默认0 + */ + private Integer reviewStatus; + + /** + * 创建者 + */ + private String createBy; + + /** + * 创建时间 + */ + @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss") + private Date createTime; + + /** + * 更新者 + */ + private String updateBy; + + /** + * 更新时间 + */ + @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss") + private Date updateTime; } \ No newline at end of file diff --git a/stdiet-custom/src/main/java/com/stdiet/custom/domain/SysRecipesPlanListInfo.java b/stdiet-custom/src/main/java/com/stdiet/custom/domain/SysRecipesPlanListInfo.java new file mode 100644 index 000000000..f82fd751b --- /dev/null +++ b/stdiet-custom/src/main/java/com/stdiet/custom/domain/SysRecipesPlanListInfo.java @@ -0,0 +1,26 @@ +package com.stdiet.custom.domain; + +import com.fasterxml.jackson.annotation.JsonFormat; +import lombok.Data; + +import java.util.Date; +import java.util.List; + +@Data +public class SysRecipesPlanListInfo { + + private Long id; + + @JsonFormat(pattern = "yyyy-MM-dd") + private Date startDate; + + @JsonFormat(pattern = "yyyy-MM-dd") + private Date endDate; + + private Integer startNumDay; + + private Integer endNumDay; + + private List<SysRecipesPlan> menus; + +} diff --git a/stdiet-custom/src/main/java/com/stdiet/custom/mapper/SysRecipesMapper.java b/stdiet-custom/src/main/java/com/stdiet/custom/mapper/SysRecipesMapper.java index b97792625..da961cc3e 100644 --- a/stdiet-custom/src/main/java/com/stdiet/custom/mapper/SysRecipesMapper.java +++ b/stdiet-custom/src/main/java/com/stdiet/custom/mapper/SysRecipesMapper.java @@ -25,4 +25,6 @@ public interface SysRecipesMapper { public int addDishes(SysRecipesDailyDishes sysRecipesDaily); public int deleteDishes(Long id); + + public List<SysRecipesDailyDishes> selectDishesByMenuId(Long id); } diff --git a/stdiet-custom/src/main/java/com/stdiet/custom/mapper/SysRecipesPlanMapper.java b/stdiet-custom/src/main/java/com/stdiet/custom/mapper/SysRecipesPlanMapper.java index 97290f477..9cdcd751f 100644 --- a/stdiet-custom/src/main/java/com/stdiet/custom/mapper/SysRecipesPlanMapper.java +++ b/stdiet-custom/src/main/java/com/stdiet/custom/mapper/SysRecipesPlanMapper.java @@ -2,6 +2,7 @@ package com.stdiet.custom.mapper; import java.util.List; import com.stdiet.custom.domain.SysRecipesPlan; +import com.stdiet.custom.domain.SysRecipesPlanListInfo; /** * 食谱计划Mapper接口 @@ -86,4 +87,10 @@ public interface SysRecipesPlanMapper * @return */ List<SysRecipesPlan> selectPlanListByOrderId(SysRecipesPlan sysRecipesPlan); + + List<SysRecipesPlan> selectPlanListByOutId(String outId); + + Long getCusIdByOutId(String outId); + + List<SysRecipesPlanListInfo> selectRecipesPlanListInfo(String outId); } \ No newline at end of file diff --git a/stdiet-custom/src/main/java/com/stdiet/custom/service/ISysCustomerService.java b/stdiet-custom/src/main/java/com/stdiet/custom/service/ISysCustomerService.java index fae82ddcd..c88766acf 100644 --- a/stdiet-custom/src/main/java/com/stdiet/custom/service/ISysCustomerService.java +++ b/stdiet-custom/src/main/java/com/stdiet/custom/service/ISysCustomerService.java @@ -1,6 +1,8 @@ package com.stdiet.custom.service; import java.util.List; +import java.util.Map; + import com.stdiet.custom.domain.SysCustomer; import com.stdiet.custom.dto.request.CustomerInvestigateRequest; @@ -74,4 +76,9 @@ public interface ISysCustomerService * @return */ boolean isCustomerExistByPhone(SysCustomer sysCustomer); + + Map<String,Object> getPhysicalSignsById(Long id); + + Map<String,Object> getPhysicalSignsByOutId(String id); + } \ No newline at end of file diff --git a/stdiet-custom/src/main/java/com/stdiet/custom/service/ISysRecipesPlanService.java b/stdiet-custom/src/main/java/com/stdiet/custom/service/ISysRecipesPlanService.java index c0b66280b..0f333c918 100644 --- a/stdiet-custom/src/main/java/com/stdiet/custom/service/ISysRecipesPlanService.java +++ b/stdiet-custom/src/main/java/com/stdiet/custom/service/ISysRecipesPlanService.java @@ -4,6 +4,7 @@ import java.util.List; import com.stdiet.custom.domain.SysOrder; import com.stdiet.custom.domain.SysRecipesPlan; +import com.stdiet.custom.domain.SysRecipesPlanListInfo; import org.springframework.core.annotation.Order; /** @@ -90,5 +91,10 @@ public interface ISysRecipesPlanService */ List<SysRecipesPlan> selectPlanListByOrderId(SysRecipesPlan sysRecipesPlan); - public void myGenerateRecipesPlan(SysOrder sysOrder); + List<SysRecipesPlan> selectPlanListByOutId(String outId); + + Long getCusIdByOutId(String outId); + + List<SysRecipesPlanListInfo> selectRecipesPlanListInfo(String outId); + } \ No newline at end of file diff --git a/stdiet-custom/src/main/java/com/stdiet/custom/service/ISysRecipesService.java b/stdiet-custom/src/main/java/com/stdiet/custom/service/ISysRecipesService.java index b23c9b81c..54b7805a2 100644 --- a/stdiet-custom/src/main/java/com/stdiet/custom/service/ISysRecipesService.java +++ b/stdiet-custom/src/main/java/com/stdiet/custom/service/ISysRecipesService.java @@ -12,9 +12,12 @@ public interface ISysRecipesService { public List<SysRecipes> selectSysRecipesByRecipesId(Long id); + public List<SysRecipesDailyDishes> selectDishesByMenuId(Long id); + public int updateDishesDetail(SysRecipesDailyDishes sysRecipesDaily); public int addDishes(SysRecipesDailyDishes sysRecipesDaily); public int deleteDishes(Long id); + } diff --git a/stdiet-custom/src/main/java/com/stdiet/custom/service/ISysWapServices.java b/stdiet-custom/src/main/java/com/stdiet/custom/service/ISysWapServices.java new file mode 100644 index 000000000..2d680229c --- /dev/null +++ b/stdiet-custom/src/main/java/com/stdiet/custom/service/ISysWapServices.java @@ -0,0 +1,13 @@ +package com.stdiet.custom.service; + +import com.stdiet.custom.domain.SysRecipesPlanListInfo; + +import java.util.List; +import java.util.Map; + +public interface ISysWapServices { + + List<SysRecipesPlanListInfo> getRecipesPlanListInfo(String outId); + + Map<String, Object> getHealthyDataByOutId(String outId); +} diff --git a/stdiet-custom/src/main/java/com/stdiet/custom/service/impl/SysCustomerServiceImpl.java b/stdiet-custom/src/main/java/com/stdiet/custom/service/impl/SysCustomerServiceImpl.java index a3e7c2694..d4e9a85e6 100644 --- a/stdiet-custom/src/main/java/com/stdiet/custom/service/impl/SysCustomerServiceImpl.java +++ b/stdiet-custom/src/main/java/com/stdiet/custom/service/impl/SysCustomerServiceImpl.java @@ -1,22 +1,22 @@ package com.stdiet.custom.service.impl; -import java.util.List; - -import com.stdiet.common.core.domain.model.LoginUser; import com.stdiet.common.utils.DateUtils; -import com.stdiet.common.utils.SecurityUtils; import com.stdiet.common.utils.StringUtils; -import com.stdiet.common.utils.bean.ObjectUtils; +import com.stdiet.common.utils.sign.AesUtils; +import com.stdiet.custom.domain.SysCustomer; +import com.stdiet.custom.domain.SysCustomerHealthy; import com.stdiet.custom.domain.SysCustomerPhysicalSigns; -import com.stdiet.custom.dto.request.CustomerInvestigateRequest; +import com.stdiet.custom.mapper.SysCustomerMapper; import com.stdiet.custom.mapper.SysCustomerPhysicalSignsMapper; +import com.stdiet.custom.service.ISysCustomerService; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; -import com.stdiet.custom.mapper.SysCustomerMapper; -import com.stdiet.custom.domain.SysCustomer; -import com.stdiet.custom.service.ISysCustomerService; import org.springframework.transaction.annotation.Transactional; +import java.util.HashMap; +import java.util.List; +import java.util.Map; + /** * 客户信息Service业务层处理 * @@ -25,14 +25,19 @@ import org.springframework.transaction.annotation.Transactional; */ @Service @Transactional -public class SysCustomerServiceImpl implements ISysCustomerService -{ +public class SysCustomerServiceImpl implements ISysCustomerService { @Autowired private SysCustomerMapper sysCustomerMapper; @Autowired private SysCustomerPhysicalSignsMapper sysCustomerPhysicalSignsMapper; + @Autowired + private SysCustomerHealthyServiceImpl sysCustomerHealthyService; + + @Autowired + private SysCustomerPhysicalSignsServiceImpl sysCustomerPhysicalSignsService; + /** * 查询客户信息 * @@ -40,8 +45,7 @@ public class SysCustomerServiceImpl implements ISysCustomerService * @return 客户信息 */ @Override - public SysCustomer selectSysCustomerById(Long id) - { + public SysCustomer selectSysCustomerById(Long id) { return sysCustomerMapper.selectSysCustomerById(id); } @@ -52,8 +56,7 @@ public class SysCustomerServiceImpl implements ISysCustomerService * @return 客户信息 */ @Override - public List<SysCustomer> selectSysCustomerList(SysCustomer sysCustomer) - { + public List<SysCustomer> selectSysCustomerList(SysCustomer sysCustomer) { return sysCustomerMapper.selectSysCustomerList(sysCustomer); } @@ -64,8 +67,7 @@ public class SysCustomerServiceImpl implements ISysCustomerService * @return 结果 */ @Override - public int insertSysCustomer(SysCustomer sysCustomer) - { + public int insertSysCustomer(SysCustomer sysCustomer) { sysCustomer.setCreateTime(DateUtils.getNowDate()); return sysCustomerMapper.insertSysCustomer(sysCustomer); } @@ -77,8 +79,7 @@ public class SysCustomerServiceImpl implements ISysCustomerService * @return 结果 */ @Override - public int updateSysCustomer(SysCustomer sysCustomer) - { + public int updateSysCustomer(SysCustomer sysCustomer) { sysCustomer.setUpdateTime(DateUtils.getNowDate()); return sysCustomerMapper.updateSysCustomer(sysCustomer); } @@ -90,8 +91,7 @@ public class SysCustomerServiceImpl implements ISysCustomerService * @return 结果 */ @Override - public int deleteSysCustomerByIds(Long[] ids) - { + public int deleteSysCustomerByIds(Long[] ids) { return sysCustomerMapper.deleteSysCustomerByIds(ids); } @@ -102,8 +102,7 @@ public class SysCustomerServiceImpl implements ISysCustomerService * @return 结果 */ @Override - public int deleteSysCustomerById(Long id) - { + public int deleteSysCustomerById(Long id) { return sysCustomerMapper.deleteSysCustomerById(id); } @@ -113,26 +112,60 @@ public class SysCustomerServiceImpl implements ISysCustomerService * @param phone 手机号 * @return 结果 */ - public SysCustomer getCustomerByPhone(String phone){ + public SysCustomer getCustomerByPhone(String phone) { return sysCustomerMapper.getCustomerByPhone(phone); } /** * 判断客户手机号是否已存在 + * * @param sysCustomer * @return */ - public boolean isCustomerExistByPhone(SysCustomer sysCustomer){ - if(sysCustomer.getId() != null){ - if(StringUtils.isNotEmpty(sysCustomer.getPhone())){ + public boolean isCustomerExistByPhone(SysCustomer sysCustomer) { + if (sysCustomer.getId() != null) { + if (StringUtils.isNotEmpty(sysCustomer.getPhone())) { SysCustomer phoneCustomer = getCustomerByPhone(sysCustomer.getPhone()); return phoneCustomer != null && phoneCustomer.getId().intValue() != sysCustomer.getId().intValue(); } - }else{ - if(StringUtils.isNotEmpty(sysCustomer.getPhone())){ + } else { + if (StringUtils.isNotEmpty(sysCustomer.getPhone())) { return getCustomerByPhone(sysCustomer.getPhone()) != null; } } return false; } + + @Override + public Map<String, Object> getPhysicalSignsById(Long id) { + Map<String, Object> result = new HashMap<>(); + String key = "customerHealthy"; + result.put("type", 0); + //查询健康评估信息 + SysCustomerHealthy sysCustomerHealthy = sysCustomerHealthyService.selectSysCustomerHealthyByCustomerId(id); + if (sysCustomerHealthy != null) { + /* if (StringUtils.isNotEmpty(sysCustomerHealthy.getPhone())) { + sysCustomerHealthy.setPhone(StringUtils.hiddenPhoneNumber(sysCustomerHealthy.getPhone())); + }*/ + result.put(key, sysCustomerHealthy); + } else { + //查询体征信息 + SysCustomerPhysicalSigns sysCustomerPhysicalSigns = sysCustomerPhysicalSignsService.selectSysCustomerPhysicalSignsByCusId(id); + if (sysCustomerPhysicalSigns != null) { + /* if (StringUtils.isNotEmpty(sysCustomerPhysicalSigns.getPhone())) { + sysCustomerPhysicalSigns.setPhone(StringUtils.hiddenPhoneNumber(sysCustomerPhysicalSigns.getPhone())); + }*/ + result.put("type", 1); + } + result.put(key, sysCustomerPhysicalSigns); + } + //对ID进行加密 + result.put("enc_id", id != null ? AesUtils.encrypt(id + "", null) : ""); + return result; + } + + @Override + public Map<String, Object> getPhysicalSignsByOutId(String id) { + return null; + } } \ No newline at end of file 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 fbdf3ffff..7bc53b1c0 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 @@ -5,6 +5,7 @@ import com.stdiet.common.utils.SynchrolockUtil; import com.stdiet.custom.domain.SysOrder; import com.stdiet.custom.domain.SysOrderPause; import com.stdiet.custom.domain.SysRecipesPlan; +import com.stdiet.custom.domain.SysRecipesPlanListInfo; import com.stdiet.custom.mapper.SysRecipesPlanMapper; import com.stdiet.custom.service.ISysOrderPauseService; import com.stdiet.custom.service.ISysOrderService; @@ -286,7 +287,18 @@ public class SysRecipesPlanServiceImpl implements ISysRecipesPlanService { } @Override - public void myGenerateRecipesPlan(SysOrder sysOrder) { - + public List<SysRecipesPlan> selectPlanListByOutId(String outId) { + return sysRecipesPlanMapper.selectPlanListByOutId(outId); } + + @Override + public Long getCusIdByOutId(String outId) { + return sysRecipesPlanMapper.getCusIdByOutId(outId); + } + + @Override + public List<SysRecipesPlanListInfo> selectRecipesPlanListInfo(String outId) { + return sysRecipesPlanMapper.selectRecipesPlanListInfo(outId); + } + } \ No newline at end of file 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 5b583ff03..34e0ddb24 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 @@ -65,6 +65,11 @@ public class SysRecipesServiceImpl implements ISysRecipesService { return sysRecipesMapper.selectSysRecipesByRecipesId(id); } + @Override + public List<SysRecipesDailyDishes> selectDishesByMenuId(Long id) { + return sysRecipesMapper.selectDishesByMenuId(id); + } + @Override public int updateDishesDetail(SysRecipesDailyDishes sysRecipesDailyDishes) { return sysRecipesMapper.updateDishesDetail(sysRecipesDailyDishes); diff --git a/stdiet-custom/src/main/java/com/stdiet/custom/service/impl/SysWapServicesImp.java b/stdiet-custom/src/main/java/com/stdiet/custom/service/impl/SysWapServicesImp.java new file mode 100644 index 000000000..785d57615 --- /dev/null +++ b/stdiet-custom/src/main/java/com/stdiet/custom/service/impl/SysWapServicesImp.java @@ -0,0 +1,39 @@ +package com.stdiet.custom.service.impl; + +import com.stdiet.common.utils.StringUtils; +import com.stdiet.custom.domain.SysRecipesPlan; +import com.stdiet.custom.domain.SysRecipesPlanListInfo; +import com.stdiet.custom.service.ISysCustomerService; +import com.stdiet.custom.service.ISysRecipesPlanService; +import com.stdiet.custom.service.ISysWapServices; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Service; +import org.springframework.transaction.annotation.Transactional; + +import java.util.List; +import java.util.Map; + +@Service +@Transactional +public class SysWapServicesImp implements ISysWapServices { + + @Autowired + ISysCustomerService iSysCustomerService; + + @Autowired + ISysRecipesPlanService iSysRecipesPlanService; + + @Override + public List<SysRecipesPlanListInfo> getRecipesPlanListInfo(String outId) { + return iSysRecipesPlanService.selectRecipesPlanListInfo(outId); + } + + @Override + public Map<String, Object> getHealthyDataByOutId(String outId) { + Long cusId = iSysRecipesPlanService.getCusIdByOutId(outId); + if(cusId > 0) { + return iSysCustomerService.getPhysicalSignsById(cusId); + } + return null; + } +} diff --git a/stdiet-custom/src/main/resources/mapper/custom/SysRecipesPlanMapper.xml b/stdiet-custom/src/main/resources/mapper/custom/SysRecipesPlanMapper.xml index 05904355f..ce4ece5b7 100644 --- a/stdiet-custom/src/main/resources/mapper/custom/SysRecipesPlanMapper.xml +++ b/stdiet-custom/src/main/resources/mapper/custom/SysRecipesPlanMapper.xml @@ -24,6 +24,7 @@ <!-- <result property="customerId" column="cus_id"></result><!– 客户ID –>--> <result property="customer" column="customer" /><!-- 客户姓名 --> <result property="phone" column="phone" /> + <result property="reviewStatus" column="review_status" /> <result property="orderStartDate" column="order_start_date" /> <result property="orderEndDate" column="order_end_date" /> <result property="nutritionistId" column="nutritionist_id" /> @@ -32,8 +33,10 @@ <result property="nutritionistAssis" column="nutritionist_assis" /> </resultMap> + + <sql id="selectSysRecipesPlanVo"> - 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 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 </sql> <select id="selectSysRecipesPlanList" parameterType="SysRecipesPlan" resultMap="SysRecipesPlanResult"> @@ -47,6 +50,7 @@ <if test="recipesId != null "> and recipes_id = #{recipesId}</if> <if test="sendFlag != null "> and send_flag = #{sendFlag}</if> <if test="sendTime != null "> and send_time = #{sendTime}</if> + <if test="reviewStatus != null "> and review_status = #{reviewStatus}</if> </select> <select id="selectSysRecipesPlanById" parameterType="Long" resultMap="SysRecipesPlanResult"> @@ -71,6 +75,7 @@ <if test="updateTime != null">update_time,</if> <if test="updateBy != null">update_by,</if> <if test="delFlag != null">del_flag,</if> + <if test="reviewStatus != null">review_status,</if> </trim> <trim prefix="values (" suffix=")" suffixOverrides=","> <if test="orderId != null">#{orderId},</if> @@ -87,6 +92,7 @@ <if test="updateTime != null">#{updateTime},</if> <if test="updateBy != null">#{updateBy},</if> <if test="delFlag != null">#{delFlag},</if> + <if test="reviewStatus != null">#{reviewStatus},</if> </trim> </insert> @@ -107,6 +113,7 @@ <if test="updateTime != null">update_time = #{updateTime},</if> <if test="updateBy != null">update_by = #{updateBy},</if> <if test="delFlag != null">del_flag = #{delFlag},</if> + <if test="reviewStatus != null">review_status = #{reviewStatus},</if> </trim> where id = #{id} and del_flag = 0 </update> @@ -186,4 +193,35 @@ <if test="sendFlag != null">AND srp.send_flag = #{sendFlag}</if> ORDER BY srp.id ASC </select> + + <!-- 根据outId查询食谱计划--> + <select id="selectPlanListByOutId" parameterType="String" resultMap="SysRecipesPlanResult"> + select cus_id, recipes_id, start_num_day, end_num_day from sys_recipes_plan where out_id=#{outId} order by create_time desc + </select> + + <select id="getCusIdByOutId" parameterType="String" resultType="Long"> + select cus_id from sys_recipes_plan where out_id=#{outId} limit 1 + </select> + + <resultMap id="SysRecipesPlanListInfoResult" type="SysRecipesPlanListInfo"> + <result property="id" column="id" /> + <result property="startDate" column="start_date" /> + <result property="endDate" column="end_date" /> + <result property="startNumDay" column="start_num_day" /> + <result property="endNumDay" column="end_num_day" /> + <association property="menus" column="recipes_id" select="selectMenuIds"/> + </resultMap> + + <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> + + <resultMap type="SysRecipesDaily" id="SysRecipesResult"> + <result property="id" column="id"/> + <result property="numDay" column="num_day"/> + </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> </mapper> \ No newline at end of file diff --git a/stdiet-framework/src/main/java/com/stdiet/framework/config/SecurityConfig.java b/stdiet-framework/src/main/java/com/stdiet/framework/config/SecurityConfig.java index 32f8b94bd..603828f51 100644 --- a/stdiet-framework/src/main/java/com/stdiet/framework/config/SecurityConfig.java +++ b/stdiet-framework/src/main/java/com/stdiet/framework/config/SecurityConfig.java @@ -102,6 +102,7 @@ public class SecurityConfig extends WebSecurityConfigurerAdapter { "/custom/wxUserInfo/wx/**", "/custom/wxUserLog/wx/**", "/wx/**", + "/wap/**", "/investigate/**", "/common/customerUploadFile" ).anonymous() diff --git a/stdiet-ui/src/api/custom/contract.js b/stdiet-ui/src/api/custom/contract.js index 31881d27c..d07cde417 100644 --- a/stdiet-ui/src/api/custom/contract.js +++ b/stdiet-ui/src/api/custom/contract.js @@ -1,68 +1,74 @@ -import request from '@/utils/request' +import request from "@/utils/request"; // 查询合同列表 export function listContract(query) { return request({ - url: '/custom/contract/list', - method: 'get', + url: "/custom/contract/list", + method: "get", params: query - }) + }); } // 查询合同详细 export function getContract(id) { return request({ - url: '/custom/contract/' + id, - method: 'get' - }) + url: "/custom/contract/" + id, + method: "get" + }); } // 新增合同 export function addContract(data) { return request({ - url: '/custom/contract', - method: 'post', + url: "/custom/contract", + method: "post", data: data - }) + }); } // 修改合同 export function updateContract(data) { return request({ - url: '/custom/contract', - method: 'put', + url: "/custom/contract", + method: "put", data: data - }) + }); } // 删除合同 export function delContract(id) { return request({ - url: '/custom/contract/' + id, - method: 'delete' - }) + url: "/custom/contract/" + id, + method: "delete" + }); } // 导出合同 export function exportContract(query) { return request({ - url: '/custom/contract/export', - method: 'get', + url: "/custom/contract/export", + method: "get", params: query - }) + }); } export function getFile(id) { return request({ - url: '/custom/contract/file/' + id, - method: 'get', - }) + url: "/custom/contract/file/" + id, + method: "get", + headers: { + isToken: false + } + }); } export function signContract(data) { return request({ - url: '/custom/contract/sign', - method: 'post', - data: data - }) + url: "/custom/contract/sign", + method: "post", + data: data, + headers: { + isToken: false + } + }); } diff --git a/stdiet-ui/src/api/custom/recipesShow.js b/stdiet-ui/src/api/custom/recipesShow.js new file mode 100644 index 000000000..de4d58dc7 --- /dev/null +++ b/stdiet-ui/src/api/custom/recipesShow.js @@ -0,0 +1,41 @@ +import request from "@/utils/request"; + +export function getRecipesPlans(id) { + return request({ + url: "/wap/recipes/plans/" + id, + method: "get", + headers: { + isToken: false + } + }); +} + +export function getHealthyInfo(id) { + return request({ + url: "/wap/healthyInfo/" + id, + method: "get", + headers: { + isToken: false + } + }); +} + +export function getRecipesMenuInfoApi(id) { + return request({ + url: "/wap/recipes/menu/" + id, + method: "get", + headers: { + isToken: false + } + }); +} + +export function getDicts(id) { + return request({ + url: "/wap/dict/" + id, + method: "get", + headers: { + isToken: false + } + }); +} diff --git a/stdiet-ui/src/api/system/dict/data.js b/stdiet-ui/src/api/system/dict/data.js index d7aca8923..bd4d851b8 100644 --- a/stdiet-ui/src/api/system/dict/data.js +++ b/stdiet-ui/src/api/system/dict/data.js @@ -1,61 +1,61 @@ -import request from '@/utils/request' +import request from "@/utils/request"; // 查询字典数据列表 export function listData(query) { return request({ - url: '/system/dict/data/list', - method: 'get', + url: "/system/dict/data/list", + method: "get", params: query - }) + }); } // 查询字典数据详细 export function getData(dictCode) { return request({ - url: '/system/dict/data/' + dictCode, - method: 'get' - }) + url: "/system/dict/data/" + dictCode, + method: "get" + }); } // 根据字典类型查询字典数据信息 export function getDicts(dictType) { return request({ - url: '/system/dict/data/type/' + dictType, - method: 'get' - }) + url: "/system/dict/data/type/" + dictType, + method: "get" + }); } // 新增字典数据 export function addData(data) { return request({ - url: '/system/dict/data', - method: 'post', + url: "/system/dict/data", + method: "post", data: data - }) + }); } // 修改字典数据 export function updateData(data) { return request({ - url: '/system/dict/data', - method: 'put', + url: "/system/dict/data", + method: "put", data: data - }) + }); } // 删除字典数据 export function delData(dictCode) { return request({ - url: '/system/dict/data/' + dictCode, - method: 'delete' - }) + url: "/system/dict/data/" + dictCode, + method: "delete" + }); } // 导出字典数据 export function exportData(query) { return request({ - url: '/system/dict/data/export', - method: 'get', + url: "/system/dict/data/export", + method: "get", params: query - }) -} \ No newline at end of file + }); +} diff --git a/stdiet-ui/src/views/custom/recipesBuild/BodySignView.vue b/stdiet-ui/src/components/BodySignView/index.vue similarity index 100% rename from stdiet-ui/src/views/custom/recipesBuild/BodySignView.vue rename to stdiet-ui/src/components/BodySignView/index.vue diff --git a/stdiet-ui/src/views/custom/recipesBuild/HealthyView.vue b/stdiet-ui/src/components/HealthyView/index.vue similarity index 100% rename from stdiet-ui/src/views/custom/recipesBuild/HealthyView.vue rename to stdiet-ui/src/components/HealthyView/index.vue diff --git a/stdiet-ui/src/permission.js b/stdiet-ui/src/permission.js index c1c9875bb..41a8e5ba6 100644 --- a/stdiet-ui/src/permission.js +++ b/stdiet-ui/src/permission.js @@ -1,43 +1,52 @@ -import router from './router' -import store from './store' -import {Message} from 'element-ui' -import NProgress from 'nprogress' -import 'nprogress/nprogress.css' -import {getToken} from '@/utils/auth' +import router from "./router"; +import store from "./store"; +import { Message } from "element-ui"; +import NProgress from "nprogress"; +import "nprogress/nprogress.css"; +import { getToken } from "@/utils/auth"; -NProgress.configure({showSpinner: false}) +NProgress.configure({ showSpinner: false }); -const whiteList = ['/login', '/auth-redirect', '/bind', '/register', '/question', '/subhealthyInvestigation'] +const whiteList = [ + "/login", + "/auth-redirect", + "/bind", + "/register", + "/question", + "/subhealthyInvestigation" +]; router.beforeEach((to, from, next) => { - NProgress.start() + NProgress.start(); if (getToken()) { /* has token*/ - if (to.path === '/login') { - next({path: '/'}) - NProgress.done() + if (to.path === "/login") { + next({ path: "/" }); + NProgress.done(); } else { if (store.getters.roles.length === 0) { // 判断当前用户是否已拉取完user_info信息 - store.dispatch('GetInfo').then(res => { - // 拉取user_info - const roles = res.roles - store.dispatch('GenerateRoutes', {roles}).then(accessRoutes => { - // 测试 默认静态页面 - // store.dispatch('permission/generateRoutes', { roles }).then(accessRoutes => { - // 根据roles权限生成可访问的路由表 - router.addRoutes(accessRoutes) // 动态添加可访问路由表 - next({...to, replace: true}) // hack方法 确保addRoutes已完成 + store + .dispatch("GetInfo") + .then(res => { + // 拉取user_info + const roles = res.roles; + store.dispatch("GenerateRoutes", { roles }).then(accessRoutes => { + // 测试 默认静态页面 + // store.dispatch('permission/generateRoutes', { roles }).then(accessRoutes => { + // 根据roles权限生成可访问的路由表 + router.addRoutes(accessRoutes); // 动态添加可访问路由表 + next({ ...to, replace: true }); // hack方法 确保addRoutes已完成 + }); }) - }) .catch(err => { - store.dispatch('FedLogOut').then(() => { - Message.error(err) - next({path: '/'}) - }) - }) + store.dispatch("FedLogOut").then(() => { + Message.error(err); + next({ path: "/" }); + }); + }); } else { - next() + next(); // 没有动态改变权限的需求可直接next() 删除下方权限判断 ↓ // if (hasPermission(store.getters.roles, to.meta.roles)) { // next() @@ -49,17 +58,22 @@ router.beforeEach((to, from, next) => { } } else { // 没有token - if (whiteList.indexOf(to.path) !== -1 || to.path.startsWith('/f/contract/') || to.path.startsWith('/subhealthyInvestigation/') - || to.path.startsWith('/foodHeatCalculator/')) { + if ( + whiteList.indexOf(to.path) !== -1 || + to.path.startsWith("/f/contract/") || + to.path.startsWith("/recipes/detail/") || + to.path.startsWith("/subhealthyInvestigation/") || + to.path.startsWith("/foodHeatCalculator/") + ) { // 在免登录白名单,直接进入 - next() + next(); } else { - next(`/login?redirect=${to.fullPath}`) // 否则全部重定向到登录页 - NProgress.done() + next(`/login?redirect=${to.fullPath}`); // 否则全部重定向到登录页 + NProgress.done(); } } -}) +}); router.afterEach(() => { - NProgress.done() -}) + NProgress.done(); +}); diff --git a/stdiet-ui/src/router/index.js b/stdiet-ui/src/router/index.js index fea245cae..3437271be 100644 --- a/stdiet-ui/src/router/index.js +++ b/stdiet-ui/src/router/index.js @@ -146,6 +146,13 @@ export const constantRoutes = [ meta: { title: "食谱制作" }, hidden: true }, + { + path: "/recipes/detail/:id", + component: resolve => require(["@/views/custom/recipesShow"], resolve), + props: true, + meta: { title: "健康食谱" }, + hidden: true + }, { path: "/f/contract/:id(\\d+)", hidden: true, diff --git a/stdiet-ui/src/store/modules/recipes.js b/stdiet-ui/src/store/modules/recipes.js index 4311492bd..f8804023e 100644 --- a/stdiet-ui/src/store/modules/recipes.js +++ b/stdiet-ui/src/store/modules/recipes.js @@ -20,7 +20,6 @@ const oriState = { recipesDataLoading: false, cusUnitOptions: [], cusWeightOptions: [], - dishesTypeOptions: [], typeOptions: [], currentDay: -1, startNum: 0, @@ -87,9 +86,6 @@ const actions = { getDicts("cus_dishes_type").then(response => { commit("updateStateData", { typeOptions: response.data }); }); - getDicts("cus_dishes_type").then(response => { - commit("updateStateData", { dishesTypeOptions: response.data }); - }); // 健康数据 if (payload.cusId) { diff --git a/stdiet-ui/src/utils/request.js b/stdiet-ui/src/utils/request.js index 112d453da..f6261ff03 100644 --- a/stdiet-ui/src/utils/request.js +++ b/stdiet-ui/src/utils/request.js @@ -29,9 +29,11 @@ service.interceptors.request.use(config => { service.interceptors.response.use(res => { // 未设置状态码则默认成功状态 const code = res.data.code || 200; + console.log(res) // 获取错误信息 const msg = errorCode[code] || res.data.msg || errorCode['default'] if (code === 401) { + console.log(code) MessageBox.confirm('登录状态已过期,您可以继续留在该页面,或者重新登录', '系统提示', { confirmButtonText: '重新登录', cancelButtonText: '取消', diff --git a/stdiet-ui/src/views/custom/dishes/index.vue b/stdiet-ui/src/views/custom/dishes/index.vue index e7121530b..20b2ea3a7 100644 --- a/stdiet-ui/src/views/custom/dishes/index.vue +++ b/stdiet-ui/src/views/custom/dishes/index.vue @@ -290,14 +290,14 @@ /> </template> </el-table-column> - <el-table-column prop="proteinRatio" label="P/100g"> + <el-table-column prop="proteinRatio" label="蛋白质/100g"> </el-table-column> - <el-table-column prop="fatRatio" label="F/100g"> + <el-table-column prop="fatRatio" label="脂肪/100g"> </el-table-column> - <el-table-column prop="carbonRatio" label="C/100g"> - </el-table-column> - <el-table-column prop="remark" label="备注"> + <el-table-column prop="carbonRatio" label="碳水/100g"> </el-table-column> + <!-- <el-table-column prop="remark" label="备注"> + </el-table-column> --> </el-table> </el-form-item> </el-col> diff --git a/stdiet-ui/src/views/custom/recipesBuild/RecipesView/RecipesAspectCom/BarChart.vue b/stdiet-ui/src/views/custom/recipesBuild/RecipesView/RecipesAspectCom/BarChart.vue index 32bb1b6b3..91fd440ad 100644 --- a/stdiet-ui/src/views/custom/recipesBuild/RecipesView/RecipesAspectCom/BarChart.vue +++ b/stdiet-ui/src/views/custom/recipesBuild/RecipesView/RecipesAspectCom/BarChart.vue @@ -87,7 +87,7 @@ export default { `${seriesName.substring(0, 1)}Weight` ].toFixed(1); arr.push( - `${cur.marker} ${nutriName}:${heatVal}千卡(${weightVal}克)` + `${cur.marker} ${nutriName}:${weightVal}克(${heatVal}千卡)` ); return arr; }, @@ -110,7 +110,7 @@ export default { source, }, grid: { - top: 40, + top: 55, left: 20, right: 20, bottom: 10, @@ -121,6 +121,10 @@ export default { }, yAxis: { type: "value", + name: "热量(千卡)", + nameTextStyle: { + color: "#262626", + }, }, series: ["pHeat", "fHeat", "cHeat"].map((dim, idx) => ({ name: dim, diff --git a/stdiet-ui/src/views/custom/recipesBuild/RecipesView/RecipesAspectCom/PieChart.vue b/stdiet-ui/src/views/custom/recipesBuild/RecipesView/RecipesAspectCom/PieChart.vue index ae5739f8e..b2dceb9ca 100644 --- a/stdiet-ui/src/views/custom/recipesBuild/RecipesView/RecipesAspectCom/PieChart.vue +++ b/stdiet-ui/src/views/custom/recipesBuild/RecipesView/RecipesAspectCom/PieChart.vue @@ -14,25 +14,14 @@ class="small_table" > <el-table-column label="营养" prop="type" align="center" width="60" /> - <el-table-column - label="重量(g)" - prop="weight" - align="center" - width="80" - /> - <el-table-column - label="热量(Kcal)" - prop="heat" - align="center" - width="90" - /> - <el-table-column - label="热量占比" - prop="heatRate" - align="center" - width="80" - /> + <el-table-column label="蛋白质" prop="p" align="center" width="80" /> + <el-table-column label="脂肪" prop="f" align="center" width="80" /> + <el-table-column label="碳水" prop="c" align="center" width="80" /> </el-table> + <div class="summary"> + <div style="font-size: 12px; color: #606266;">总热量约等于</div> + <div style="color: #515a6e; font-weight: bold">{{ totalHeat.toFixed(1) }}千卡</div> + </div> </div> </div> </template> @@ -69,35 +58,37 @@ export default { data() { return { chart: null, + totalHeat: 0, nameDict: { p: "蛋白质", f: "脂肪", c: "碳水", }, + typeDict: { + Weight: "摄入量", + Rate: "供能比", + }, }; }, computed: { mData() { const [data] = this.data; - let totalHeat = 0; - return data - ? ["p", "f", "c"].map((type) => { - if (totalHeat === 0) { - totalHeat = ["p", "f", "c"].reduce((heat, cur) => { - heat += data[`${cur}Heat`]; - return heat; - }, 0); - } - return { - type: this.nameDict[type], - weight: data[`${type}Weight`].toFixed(1), - heat: data[`${type}Heat`].toFixed(1), - heatRate: `${((data[`${type}Heat`] / totalHeat) * 100).toFixed( - 2 - )}%`, - }; - }) - : []; + if (!data) { + this.totalHeat = 0; + return []; + } + this.totalHeat = data.cHeat + data.fHeat + data.pHeat; + const mData = ["Weight", "Rate"].map((t, idx) => ({ + type: this.typeDict[t], + ...["p", "f", "c"].reduce((obj, cur) => { + obj[cur] = idx + ? `${((data[`${cur}Heat`] / this.totalHeat) * 100).toFixed(2)}%` + : `${data[`${cur}Weight`].toFixed(1)}克`; + return obj; + }, {}), + })); + console.log(mData); + return mData; }, }, mounted() { @@ -121,10 +112,10 @@ export default { this.chart.clear(); this.chart.setOption({ title: { - text: `${data.name}营养统计`, + text: `${data.name}营养分析`, }, tooltip: { - position: 'right', + position: "right", trigger: "item", appendToBody: true, formatter: (params) => { @@ -136,9 +127,9 @@ export default { } = params; return [ `${marker} ${name}`, - `含量:${oriData[`${dim}Weight`].toFixed(1)}克`, - `热量:${value.toFixed(1)}千卡`, - `热量占比:${percent}%`, + `摄入量:${oriData[`${dim}Weight`].toFixed(1)}克`, + `摄入热量:${value.toFixed(1)}千卡`, + `供能比:${percent}%`, ].join("</br>"); }, }, @@ -199,5 +190,17 @@ export default { } } // } + + .summary { + padding: 2px; + border-bottom: 1px solid #dfe6ec; + border-left: 1px solid #dfe6ec; + border-right: 1px solid #dfe6ec; + + & > div { + padding: 3px; + text-align: center; + } + } } </style> diff --git a/stdiet-ui/src/views/custom/recipesBuild/RecipesView/RecipesCom/AddDishesDrawer/index.vue b/stdiet-ui/src/views/custom/recipesBuild/RecipesView/RecipesCom/AddDishesDrawer/index.vue index 67d4885d9..284353565 100644 --- a/stdiet-ui/src/views/custom/recipesBuild/RecipesView/RecipesCom/AddDishesDrawer/index.vue +++ b/stdiet-ui/src/views/custom/recipesBuild/RecipesView/RecipesCom/AddDishesDrawer/index.vue @@ -24,7 +24,7 @@ <ConfigDishes v-show="active === 1" v-bind="selDishes" - :typeOptions="typeOptions" + :typeOptions="dishesTypeOptions" @onChange="handleOnConfigChange" /> </div> @@ -65,7 +65,7 @@ export default { return { visible: false, active: 0, - typeOptions: [], + dishesTypeOptions: [], selDishes: { name: "", type: "", @@ -76,7 +76,7 @@ export default { }; }, computed: { - ...mapState(["dishesTypeOptions"]), + ...mapState(["typeOptions"]), }, methods: { showDrawer() { @@ -95,11 +95,11 @@ export default { // console.log(data); this.selDishes = data; this.active = 1; - this.typeOptions = data.type.split(",").reduce((arr, cur, idx) => { + this.dishesTypeOptions = data.type.split(",").reduce((arr, cur, idx) => { if (idx === 0) { this.selDishes.type = cur; } - const tarOpt = this.dishesTypeOptions.find( + const tarOpt = this.typeOptions.find( (obj) => obj.dictValue === cur ); if (tarOpt) { diff --git a/stdiet-ui/src/views/custom/recipesBuild/index.vue b/stdiet-ui/src/views/custom/recipesBuild/index.vue index d2184f2b4..9a557b1e3 100644 --- a/stdiet-ui/src/views/custom/recipesBuild/index.vue +++ b/stdiet-ui/src/views/custom/recipesBuild/index.vue @@ -24,8 +24,8 @@ const { mapGetters, } = createNamespacedHelpers("recipes"); -import HealthyView from "./HealthyView"; -import BodySignView from "./BodySignView"; +import HealthyView from "@/components/HealthyView"; +import BodySignView from "@/components/BodySignView"; import RecipesView from "./RecipesView/index"; import RecommondView from "./RecommondView"; diff --git a/stdiet-ui/src/views/custom/recipesShow/MenuDetail/DishesDetailDialog/index.vue b/stdiet-ui/src/views/custom/recipesShow/MenuDetail/DishesDetailDialog/index.vue new file mode 100644 index 000000000..eb955493e --- /dev/null +++ b/stdiet-ui/src/views/custom/recipesShow/MenuDetail/DishesDetailDialog/index.vue @@ -0,0 +1,87 @@ +<template> + <el-dialog + :visible.sync="visible" + :title="title" + width="80%" + top="30%" + :close-on-click-modal="false" + class="dishes_detail_dialog_wrapper" + > + <section class="section_zone"> + <div class="section_title"> + 食材<em class="el-icon-shopping-cart-1" style="margin-left: 8px" /> + </div> + <div v-for="igd in data.igdList" :key="igd.id" class="igd_item"> + <span>{{ igd.name }}</span> + <span class="cusstr_style"> + <span>{{ igd.cusStr }}</span> + <span>{{ igd.weight }}克</span> + </span> + </div> + </section> + <section class="section_zone"> + <div class="section_title"> + 做法<em class="el-icon-dish" style="margin-left: 8px" /> + </div> + <div class="methods">{{ data.methods }}</div> + </section> + </el-dialog> +</template> +<script> +export default { + name: "dishesDetailDialog", + data() { + return { + visible: false, + data: {}, + title: "", + }; + }, + methods: { + showDialog(data) { + if (!data || !data.igdList.length) { + return; + } + this.data = data; + this.visible = true; + this.title = `${data.name}`; + }, + }, +}; +</script> +<style lang="scss" scoped> +.dishes_detail_dialog_wrapper { + .section_zone { + margin-bottom: 16px; + .section_title { + color: #262626; + margin-bottom: 8px; + } + } + .igd_item { + height: 32px; + padding: 0 8px; + display: flex; + justify-content: space-between; + align-items: center; + border-bottom: 1px solid #dfe6ec; + + .cusstr_style { + width: 40%; + display: flex; + justify-content: space-between; + align-items: center; + } + } + + .methods { + padding: 0 8px; + margin-top: 14px; + } +} +</style> +<style lang="scss"> +.el-dialog__body { + padding: 12px 18px; +} +</style> diff --git a/stdiet-ui/src/views/custom/recipesShow/MenuDetail/NutriComputeCom/index.vue b/stdiet-ui/src/views/custom/recipesShow/MenuDetail/NutriComputeCom/index.vue new file mode 100644 index 000000000..cff52f37c --- /dev/null +++ b/stdiet-ui/src/views/custom/recipesShow/MenuDetail/NutriComputeCom/index.vue @@ -0,0 +1,159 @@ +<template> + <div class="nutri_compute_com_wrapper"> + <div class="header">{{ date }}</div> + <div class="content"> + <section class="left"> + <div style="font-size: 18px">营养分析</div> + <div class="total"> + <div>总热量约等于</div> + <div>{{ totalHeat }}千卡</div> + </div> + </section> + <section class="right"> + <table class="my_table" border="1"> + <thead> + <tr> + <th></th> + <th>蛋白质</th> + <th>脂肪</th> + <th>碳水</th> + </tr> + </thead> + <tbody> + <tr> + <td style="font-size: 12px">摄入量</td> + <td>{{ pWeight }}</td> + <td>{{ fWeight }}</td> + <td>{{ cWeight }}</td> + </tr> + <tr> + <td style="font-size: 12px">供能比</td> + <td>{{ pRate }}</td> + <td>{{ fRate }}</td> + <td>{{ cRate }}</td> + </tr> + </tbody> + </table> + <div class="mask" /> + </section> + </div> + </div> +</template> +<script> +export default { + name: "nutriComputeCom", + props: ["date", "value"], + data() { + return { + totalHeat: 0, + pWeight: "0克", + fWeight: "0克", + cWeight: "0克", + pRate: "0%", + fRate: "0%", + cRate: "0%", + }; + }, + watch: { + value(val) { + if (!val || !val.length) { + return; + } + let pWeight = 0, + fWeight = 0, + cWeight = 0; + + val.forEach((dishes) => { + dishes.igdList.forEach((igd) => { + pWeight += (igd.proteinRatio * igd.weight) / 100; + fWeight += (igd.fatRatio * igd.weight) / 100; + cWeight += (igd.carbonRatio * igd.weight) / 100; + }); + }); + this.totalHeat = (pWeight * 4 + fWeight * 9 + cWeight * 4).toFixed(1); + this.pWeight = pWeight.toFixed(1) + "克"; + this.fWeight = fWeight.toFixed(1) + "克"; + this.cWeight = cWeight.toFixed(1) + "克"; + this.pRate = (((pWeight * 4) / this.totalHeat) * 100).toFixed(2) + "%"; + this.fRate = (((fWeight * 9) / this.totalHeat) * 100).toFixed(2) + "%"; + this.cRate = (((cWeight * 4) / this.totalHeat) * 100).toFixed(2) + "%"; + }, + }, +}; +</script> +<style lang="scss" scoped> +.nutri_compute_com_wrapper { + padding: 10px 14px; + background: #409eff; + border-radius: 4px; + color: white; + .header { + text-align: center; + font-weight: bold; + } + + .content { + display: flex; + margin-top: 12px; + + .left { + padding-top: 10px; + & > div:nth-child(1) { + text-align: center; + flex: 1; + } + + .total { + text-align: center; + margin-top: 16px; + border: 1px solid white; + padding: 8px 16px; + + & > div:nth-child(1) { + font-size: 12px; + margin-bottom: 8px; + } + } + } + .right { + flex: 2; + border: 1px solid white; + margin-left: 10px; + padding: 4px; + position: relative; + display: flex; + justify-content: center; + align-items: center; + + .my_table { + width: 100%; + height: 100%; + border-spacing: 0; + border: 1px solid white; + border-collapse: collapse; + table-layout: fixed; + + th { + font-size: 12px; + text-align: center; + height: 30px; + } + + td { + font-size: 10px; + text-align: center; + height: 30px; + } + } + + .mask { + position: absolute; + width: calc(100% - 8px); + height: calc(100% - 8px); + top: 4px; + border: 1px solid #409eff; + } + } + } +} +</style> diff --git a/stdiet-ui/src/views/custom/recipesShow/MenuDetail/index.vue b/stdiet-ui/src/views/custom/recipesShow/MenuDetail/index.vue new file mode 100644 index 000000000..5f3b87964 --- /dev/null +++ b/stdiet-ui/src/views/custom/recipesShow/MenuDetail/index.vue @@ -0,0 +1,142 @@ +<template> + <div class="menu_detail_wrapper"> + <!-- 营养分析 --> + <NutriComputeCom :date="date" :value="value" /> + <!-- 食谱详细 --> + <el-card v-for="obj in menus" :key="obj.type" style="margin-top: 12px"> + <div slot="header"> + <span>{{ obj.typeName }}</span> + </div> + <div v-for="mObj in obj.values" :key="mObj.id"> + <div class="dishes_item"> + <div v-if="!mObj.methods" class="simple_dishes"> + <span>{{ mObj.name }}</span> + <span class="weight_style"> + <span style="margin-right: 20px">{{ mObj.cusStr }}</span> + <span>{{ mObj.weight }}克</span> + </span> + </div> + <div v-else class="complex_dishes" @click="handleOnDetailClick(mObj)"> + <span>{{ mObj.name }}</span> + <em class="el-icon-arrow-right" /> + </div> + </div> + </div> + </el-card> + <!-- 复杂菜品展示 --> + <DishesDetailDialog ref="detailDialogRef" /> + </div> +</template> +<script> +import NutriComputeCom from "./NutriComputeCom"; +import DishesDetailDialog from "./DishesDetailDialog"; +import { getDicts } from "@/api/custom/recipesShow"; +export default { + name: "menuDetail", + props: ["value", "date"], + components: { + NutriComputeCom, + DishesDetailDialog, + }, + created() { + getDicts("cus_cus_unit").then((response) => { + this.curUnitDict = response.data.reduce((obj, cur) => { + obj[cur.dictValue] = cur.dictLabel; + return obj; + }, {}); + }); + getDicts("cus_cus_weight").then((response) => { + this.cusWeightDict = response.data.reduce((obj, cur) => { + obj[cur.dictValue] = cur.dictLabel; + return obj; + }, {}); + }); + getDicts("cus_dishes_type").then((response) => { + this.menuTypeDict = response.data.reduce((obj, cur) => { + obj[cur.dictValue] = cur.dictLabel; + return obj; + }, {}); + }); + }, + data() { + return { + menuTypeDict: {}, + curUnitDict: {}, + cusWeightDict: {}, + }; + }, + computed: { + menus() { + const mData = this.value.reduce((obj, cur) => { + if (!obj[cur.type]) { + obj[cur.type] = []; + } + let tarMenu = cur; + if (!tarMenu.methods && tarMenu.igdList.length === 1) { + tarMenu = tarMenu.igdList[0]; + tarMenu.cusStr = `${this.cusWeightDict[tarMenu.cusWeight] || ""}${ + this.curUnitDict[tarMenu.cusUnit] || "" + }`; + } else { + tarMenu.igdList.forEach((igd) => { + igd.cusStr = `${this.cusWeightDict[igd.cusWeight] || ""}${ + this.curUnitDict[igd.cusUnit] || "" + }`; + }); + } + obj[cur.type].push(tarMenu); + return obj; + }, {}); + const mMenus = Object.keys(mData).map((type) => ({ + type, + typeName: this.menuTypeDict[type], + values: mData[type], + })); + // console.log(mMenus); + return mMenus; + }, + }, + methods: { + handleOnDetailClick(data) { + this.$refs["detailDialogRef"].showDialog(data); + }, + }, +}; +</script> +<style lang="scss" scoped> +.menu_detail_wrapper { + padding: 0 12px 12px 12px; + + .dishes_item { + height: 38px; + padding: 0 8px; + border-bottom: 1px solid #dfe6ec; + + &:active { + background: #409eff; + color: white; + } + + .simple_dishes { + display: flex; + height: 100%; + align-items: center; + justify-content: space-between; + + .weight_style { + width: 40%; + display: flex; + align-items: center; + justify-content: space-between; + } + } + + .complex_dishes { + display: flex; + height: 100%; + align-items: center; + justify-content: space-between; + } + } +} +</style> diff --git a/stdiet-ui/src/views/custom/recipesShow/PlanDrawer/index.vue b/stdiet-ui/src/views/custom/recipesShow/PlanDrawer/index.vue new file mode 100644 index 000000000..1a6cf3d92 --- /dev/null +++ b/stdiet-ui/src/views/custom/recipesShow/PlanDrawer/index.vue @@ -0,0 +1,120 @@ +<template> + <el-drawer + :visible.sync="visible" + :with-header="false" + direction="ltr" + size="60%" + class="plan_drawer_wrapper" + > + <div class="header"> + <span>食谱列表</span> + </div> + <div class="content"> + <el-collapse v-model="curPlanId" accordion> + <el-collapse-item + v-for="plan in data" + :key="plan.id" + :title="plan.label" + :name="plan.id" + :class="plan.id === hitPlanId ? 'collapse_item_hit' : ''" + > + <div + v-for="menu in plan.menus" + :class="`item ${menu.id === curMenuId ? 'sel_item' : ''}`" + :key="menu.id" + @click="handleOnCurrentChange(plan.id, menu)" + > + <div class="item_content"> + {{ menu.date }} + <em class="el-icon-arrow-right" style="font-weight: bold" /> + </div> + </div> + </el-collapse-item> + </el-collapse> + </div> + </el-drawer> +</template> +<script> +export default { + name: "planDrawer", + data() { + return { + visible: false, + curPlanId: 0, + curMenuId: 0, + hitPlanId: 0, + }; + }, + props: ["data", "planId", "menuId"], + methods: { + showDrawer() { + this.visible = true; + }, + handleOnCurrentChange(planId, menu) { + // console.log({ planId, menuId }); + this.hitPlanId = planId; + this.visible = false; + this.curMenuId = menu.id; + this.curPlanId = planId; + + this.$emit("plan-change", menu); + }, + }, + computed: { + }, + watch: { + planId(val) { + this.curPlanId = val; + this.hitPlanId = val; + }, + menuId(val) { + this.curMenuId = val; + }, + }, +}; +</script> +<style lang="scss" scoped> +.plan_drawer_wrapper { + .header { + padding: 2px 6px; + display: flex; + justify-content: center; + align-items: center; + height: 44px; + } + + .content { + height: calc(100vh - 44px); + padding: 12px; + overflow: auto; + + .item { + font-size: 14px; + height: 36px; + cursor: pointer; + } + + .item_content { + display: flex; + padding: 2px 8px 2px 24px; + align-items: center; + height: 100%; + justify-content: space-between; + } + + .sel_item { + background: #409eff; + color: white; + } + } +} +</style> + +<style lang="scss"> +.collapse_item_hit .el-collapse-item__header { + color: #409eff; +} +.el-collapse-item__header.focusing { + color: unset !important; +} +</style> diff --git a/stdiet-ui/src/views/custom/recipesShow/UserInfoDrawer/index.vue b/stdiet-ui/src/views/custom/recipesShow/UserInfoDrawer/index.vue new file mode 100644 index 000000000..bc8e392b1 --- /dev/null +++ b/stdiet-ui/src/views/custom/recipesShow/UserInfoDrawer/index.vue @@ -0,0 +1,84 @@ +<template> + <el-drawer + :visible.sync="visible" + :with-header="false" + size="100%" + class="user_info_drawer_wrapper" + > + <div class="header"> + <el-button + type="text" + icon="el-icon-back" + @click="handleOnBackClick" + class="icon_btn" + /> + <span>个人信息</span> + <span class="hold" /> + </div> + <div class="content"> + <HealthView v-if="healthyData.type === 0" :data="healthyData.data" /> + <BodySignView v-else :data="healthyData.data" /> + </div> + </el-drawer> +</template> +<script> +import HealthView from "@/components/HealthyView"; +import BodySignView from "@/components/BodySignView"; +export default { + name: "UserInfoDrawer", + props: { + healthyData: { + type: Object, + default: { + type: 0, + data: {}, + }, + }, + }, + components: { + BodySignView, + HealthView, + }, + data() { + return { + visible: false, + }; + }, + methods: { + showDrawer() { + this.visible = true; + }, + handleOnBackClick() { + this.visible = false; + }, + }, +}; +</script> +<style lang="scss" scoped> +.user_info_drawer_wrapper { + .header { + padding: 2px 6px; + display: flex; + justify-content: space-between; + align-items: center; + height: 44px; + + .icon_btn { + font-size: 24px; + padding: 6px; + color: #696969; + } + + .hold { + display: block; + width: 39px; + } + } + + .content { + padding: 20px; + height: calc(100vh - 44px); + overflow: auto; + } +} +</style> diff --git a/stdiet-ui/src/views/custom/recipesShow/index.vue b/stdiet-ui/src/views/custom/recipesShow/index.vue new file mode 100644 index 000000000..59d32f770 --- /dev/null +++ b/stdiet-ui/src/views/custom/recipesShow/index.vue @@ -0,0 +1,161 @@ +<template> + <div class="recipes_show_wrapper"> + <div class="header"> + <el-button + icon="el-icon-date" + type="text" + class="icon_btn" + @click="handleOnPlanClick" + /> + <img :src="logo" style="width: auto; height: 32px" alt="logo" /> + <el-button + icon="el-icon-user" + type="text" + class="icon_btn" + @click="handleUserInfoClick" + /> + </div> + <div class="content" v-loading="loading"> + <MenuDetail :value="menuData" :date="curDate" /> + </div> + + <!-- 食谱计划 --> + <PlanDrawer + ref="planRef" + :data="planList" + :planId="curPlanId" + :menuId="curMenuId" + @plan-change="handleOnPlanChange" + /> + <!-- 用户信息 --> + <UserInfoDrawer ref="userInfoRef" :healthyData="healthyData" /> + </div> +</template> +<script> +import { + getRecipesPlans, + getHealthyInfo, + getRecipesMenuInfoApi, +} from "@/api/custom/recipesShow"; +import { dealHealthy } from "@/utils/healthyData"; +import UserInfoDrawer from "./UserInfoDrawer"; +import PlanDrawer from "./PlanDrawer"; +import MenuDetail from "./MenuDetail"; +import dayjs from "dayjs"; +import { getProcessMenuData } from "./utils"; +export default { + name: "recipesShow", + components: { + UserInfoDrawer, + PlanDrawer, + MenuDetail, + }, + props: ["id"], + data() { + return { + logo: require("@/assets/logo/st_logo.png"), + planList: [], + curPlanId: 0, + curMenuId: 0, + curDate: "", + loading: false, + healthyData: { + type: 0, + data: {}, + }, + menuData: [], + }; + }, + created() { + getRecipesPlans(this.id).then((response) => { + if (response.code === 200) { + let curPlanId, curMenuId, curDate; + const toDay = dayjs().format("YYYY-MM-DD"); + this.planList = response.data.map((plan) => ({ + menus: plan.menus.map((menu, idx) => { + const date = dayjs(plan.startDate) + .add(idx, "day") + .format("YYYY-MM-DD"); + if (toDay === date) { + curPlanId = plan.id; + curMenuId = menu.id; + curDate = date; + } + return { + date, + id: menu.id, + }; + }), + label: `第${plan.startNumDay} 至 ${plan.endNumDay}天`, + id: plan.id, + })); + if (!curMenuId) { + curMenuId = this.planList[0].menus[0].id; + curPlanId = this.planList[0].id; + curDate = this.planList[0].menus[0].date; + } + this.curMenuId = curMenuId; + this.curPlanId = curPlanId; + this.curDate = curDate; + + this.fetchRecipesInfo(this.curMenuId); + } + }); + getHealthyInfo(this.id).then((response) => { + if (response.code === 200) { + this.healthyData = { + type: response.data.type, + data: dealHealthy(response.data.customerHealthy), + }; + } + }); + }, + methods: { + handleOnPlanClick() { + this.$refs["planRef"].showDrawer(); + }, + handleUserInfoClick() { + this.$refs["userInfoRef"].showDrawer(); + }, + fetchRecipesInfo(id) { + this.loading = true; + getRecipesMenuInfoApi(id).then((response) => { + if (response.code === 200) { + this.loading = false; + this.menuData = getProcessMenuData(response.data); + // console.log(this.menuData); + } + }); + }, + handleOnPlanChange({ date, id }) { + this.curDate = date; + this.fetchRecipesInfo(id); + }, + }, + watch: {}, +}; +</script> +<style lang="scss" scoped> +.recipes_show_wrapper { + height: 100vh; + + .header { + padding: 2px 6px; + display: flex; + justify-content: space-between; + align-items: center; + height: 44px; + + .icon_btn { + font-size: 24px; + padding: 6px; + color: #696969; + } + } + + .content { + height: calc(100vh - 44px); + overflow: auto; + } +} +</style> diff --git a/stdiet-ui/src/views/custom/recipesShow/utils.js b/stdiet-ui/src/views/custom/recipesShow/utils.js new file mode 100644 index 000000000..14c1e5943 --- /dev/null +++ b/stdiet-ui/src/views/custom/recipesShow/utils.js @@ -0,0 +1,42 @@ +export function getProcessMenuData(menuData) { + return menuData.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; + }, []); +} diff --git a/stdiet-ui/src/views/custom/subhealthy/investigation/index.vue b/stdiet-ui/src/views/custom/subhealthy/investigation/index.vue index 3e1455941..4798dfc6f 100644 --- a/stdiet-ui/src/views/custom/subhealthy/investigation/index.vue +++ b/stdiet-ui/src/views/custom/subhealthy/investigation/index.vue @@ -1,33 +1,71 @@ <template> <section> <div style="padding: 5px; text-align: center"> - <img :src="logo" style="width: 150px; height: 35px" alt="logo" /> + <img :src="logo" style="width: auto; height: 35px" alt="logo" /> </div> - <div style="margin: 10px 15px 10px 15px;" > + <div style="margin: 10px 15px 10px 15px"> <el-steps :active="stepActive" finish-status="success"> - <el-step v-for="(item,index) in stepArray" title=""></el-step> + <el-step + v-for="(item, index) in stepArray" + :key="index" + title="" + ></el-step> </el-steps> </div> - <el-form ref="form" label-position="top" :model="form" :rules="rules" label-width="100px" style="padding: 16px"> - <healthy-form1 v-show="stepArray[0]" :form.sync="form"></healthy-form1> - <healthy-form2 v-show="stepArray[1]" :form.sync="form"></healthy-form2> - <healthy-form3 v-show="stepArray[2]" :form.sync="form"></healthy-form3> - <healthy-form4 v-show="stepArray[3]" :form.sync="form"></healthy-form4> - <healthy-form5 v-show="stepArray[4]" :form.sync="form"></healthy-form5> - <healthy-form6 v-show="stepArray[5]" :form.sync="form"></healthy-form6> - <healthy-form7 v-show="stepArray[6]" :form.sync="form"></healthy-form7> - <healthy-form8 v-show="stepArray[7]" :form.sync="form"></healthy-form8> - <healthy-form9 v-show="stepArray[8]" ref="fileForm" @addOrEditHealthy="addCustomerHealthy()" :form.sync="form"></healthy-form9> - <el-form-item style="text-align: center; margin: 30px auto" > - <el-button @click="nextStep(-1)" style="margin-right: 10px;width: 40%" v-show="stepActive != 0">上一步</el-button> - <el-button type="primary" @click="nextStep(1)" style="width: 40%" v-show="stepActive != stepArray.length-1">下一步</el-button> - <el-button type="primary" @click="submit()" style="width: 40%" v-show="stepActive == stepArray.length-1">提交数据</el-button> - </el-form-item> + <el-form + ref="form" + label-position="top" + :model="form" + :rules="rules" + label-width="100px" + style="padding: 16px" + > + <healthy-form1 v-show="stepArray[0]" :form.sync="form"></healthy-form1> + <healthy-form2 v-show="stepArray[1]" :form.sync="form"></healthy-form2> + <healthy-form3 v-show="stepArray[2]" :form.sync="form"></healthy-form3> + <healthy-form4 v-show="stepArray[3]" :form.sync="form"></healthy-form4> + <healthy-form5 v-show="stepArray[4]" :form.sync="form"></healthy-form5> + <healthy-form6 v-show="stepArray[5]" :form.sync="form"></healthy-form6> + <healthy-form7 v-show="stepArray[6]" :form.sync="form"></healthy-form7> + <healthy-form8 v-show="stepArray[7]" :form.sync="form"></healthy-form8> + <healthy-form9 + v-show="stepArray[8]" + ref="fileForm" + @addOrEditHealthy="addCustomerHealthy()" + :form.sync="form" + ></healthy-form9> + <el-form-item style="text-align: center; margin: 30px auto"> + <el-button + @click="nextStep(-1)" + style="margin-right: 10px; width: 40%" + v-show="stepActive != 0" + >上一步</el-button + > + <el-button + type="primary" + @click="nextStep(1)" + style="width: 40%" + v-show="stepActive != stepArray.length - 1" + >下一步</el-button + > + <el-button + type="primary" + @click="submit()" + style="width: 40%" + v-show="stepActive == stepArray.length - 1" + >提交数据</el-button + > + </el-form-item> </el-form> </section> </template> <script> -import { getDictData,addCustomerHealthy,physicalSignsList,getCustomerBaseMessage } from "@/api/custom/customerInvestigation"; +import { + getDictData, + addCustomerHealthy, + physicalSignsList, + getCustomerBaseMessage, +} from "@/api/custom/customerInvestigation"; import * as healthyData from "@/utils/healthyData"; const logo = require("@/assets/logo/st_logo.png"); import Form1 from "@/components/HealthyForm/Form1"; @@ -44,11 +82,11 @@ export default { data() { return { //客户是否存在标识 - customerExistFlag:false, - healthyData:healthyData, + customerExistFlag: false, + healthyData: healthyData, logo, submitFlag: false, - stepArray: [true,false,false,false,false,false,false,false,false], + stepArray: [true, false, false, false, false, false, false, false, false], stepActive: 0, form: { customerEncId: null, @@ -59,23 +97,23 @@ export default { age: null, tall: null, weight: null, - condiment:["1","2","3"], - otherCondiment:null, - cookingStyle: ["8","9","4","11"], - cookingStyleRate:[1,1,1,1,1,1], - washVegetablesStyle:["2"], + condiment: ["1", "2", "3"], + otherCondiment: null, + cookingStyle: ["8", "9", "4", "11"], + cookingStyleRate: [1, 1, 1, 1, 1, 1], + washVegetablesStyle: ["2"], otherWashVegetablesStyle: null, - breakfastType:"2", + breakfastType: "2", breakfastFood: null, - lunchType:["3"], - dinner:["2"], + lunchType: ["3"], + dinner: ["2"], vegetableRate: 5, commonMeat: null, dinnerTime: "19:00", - supperNum:1, - supperFood:null, + supperNum: 1, + supperFood: null, dietHotAndCold: "3", - dietFlavor: ["1","2"], + dietFlavor: ["1", "2"], vegetablesNum: 1, vegetablesRateType: "3", fruitsNum: 1, @@ -85,28 +123,28 @@ export default { riceFull: 8, eatingSpeed: "3", snacks: ["1"], - otherSnacks:null, + otherSnacks: null, healthProductsFlag: 0, - healthProductsBrand:null, + healthProductsBrand: null, healthProductsName: null, - healthProductsWeekRate:0, - healthProductsDayRate:0, + healthProductsWeekRate: 0, + healthProductsDayRate: 0, waterNum: 1500, waterType: ["3"], waterHabit: ["5"], - drinksNum:[0,0,0,0,0,0,0,0], + drinksNum: [0, 0, 0, 0, 0, 0, 0, 0], drinkWineFlag: "3", - drinkWineClassify:["3"], + drinkWineClassify: ["3"], otherWineClassify: null, - drinkWineAmount:[0,0,0], + drinkWineAmount: [0, 0, 0], smokeFlag: 0, - smokeRate:[0,0,0], + smokeRate: [0, 0, 0], secondSmoke: 0, workIndustry: null, - workType:["2"], + workType: ["2"], defecationNum: 1, - otherDefecationNum:0, + otherDefecationNum: 0, defecationTime: ["1"], defecationShape: null, defecationSmell: null, @@ -117,46 +155,46 @@ export default { motionDuration: 40, motionTime: "08:00", //motionMode:"有氧", - aerobicMotionClassify:["2"], - anaerobicMotionClassify:[], - anaerobicAerobicMotionClassify:[], + aerobicMotionClassify: ["2"], + anaerobicMotionClassify: [], + anaerobicAerobicMotionClassify: [], otherMotionClassify: null, - motionField:["1"], - otherMotionField:null, + motionField: ["1"], + otherMotionField: null, sleepTime: "23:00", - sleepQuality:["2"], + sleepQuality: ["2"], sleepDrugFlag: 0, sleepDrug: null, stayupLateFlag: 0, stayupLateWeekNum: 0, - physicalSignsId:[], + physicalSignsId: [], otherPhysicalSigns: null, - bloodData:[], - moistureDate:[], - familyIllnessHistory:[], - otherFamilyIllnessHistory:null, - operationHistory:[], - otherOperationHistory:null, - nearOperationFlag:0, - recoveryeSituation:null, - longEatDrugFlag:0, - longEatDrugClassify:[], - otherLongEatDrugClassify:null, + bloodData: [], + moistureDate: [], + familyIllnessHistory: [], + otherFamilyIllnessHistory: null, + operationHistory: [], + otherOperationHistory: null, + nearOperationFlag: 0, + recoveryeSituation: null, + longEatDrugFlag: 0, + longEatDrugClassify: [], + otherLongEatDrugClassify: null, allergyFlag: 0, allergySituation: null, - allergen:[], - otherAllergen:null, - medicalReport:[], - medicalReportName:[], - position:0, + allergen: [], + otherAllergen: null, + medicalReport: [], + medicalReportName: [], + position: 0, experience: null, rebound: 1, - difficulty:null, - crux:1, - dishesIngredient:null, - makeFoodType:3 + difficulty: null, + crux: 1, + dishesIngredient: null, + makeFoodType: 3, }, timer: null, rules: { @@ -188,57 +226,59 @@ export default { message: "体重格式不正确", }, ], - conditioningProjectId:[ - { required: true, trigger: "blur", message: "请选择调理项目" } - ], - position:[ - { required: true, trigger: "blur", message: "请选择地理位置" } - ] - } + conditioningProjectId: [ + { required: true, trigger: "blur", message: "请选择调理项目" }, + ], + position: [ + { required: true, trigger: "blur", message: "请选择地理位置" }, + ], + }, }; }, components: { - 'healthy-form1': Form1, - 'healthy-form2': Form2, - 'healthy-form3': Form3, - 'healthy-form4': Form4, - 'healthy-form5': Form5, - 'healthy-form6': Form6, - 'healthy-form7': Form7, - 'healthy-form8': Form8, - 'healthy-form9': Form9, + "healthy-form1": Form1, + "healthy-form2": Form2, + "healthy-form3": Form3, + "healthy-form4": Form4, + "healthy-form5": Form5, + "healthy-form6": Form6, + "healthy-form7": Form7, + "healthy-form8": Form8, + "healthy-form9": Form9, }, methods: { //根据用户ID获取用户基本信息(手机号、姓名) - getCustomerBase(id){ - if(id == null || id == undefined){ - return; - } - getCustomerBaseMessage(id).then((response) => { + getCustomerBase(id) { + if (id == null || id == undefined) { + return; + } + getCustomerBaseMessage(id) + .then((response) => { if (response.code === 200) { - if(response.data){ - this.customerExistFlag = true; - this.form.name = response.data.name; - this.form.phone = response.data.phone; - } + if (response.data) { + this.customerExistFlag = true; + this.form.name = response.data.name; + this.form.phone = response.data.phone; + } } - }).catch(function() { + }) + .catch(function () { console.log("error"); - }); + }); }, - submit(){ - if (this.submitFlag) { - this.$message({ - message: "请勿重复提交,1分钟后重试", - type: "warning", - }); - return; - } + submit() { + if (this.submitFlag) { + this.$message({ + message: "请勿重复提交,1分钟后重试", + type: "warning", + }); + return; + } this.$refs.form.validate((valid) => { if (valid) { - this.submitFlag = true; - this.timer = setTimeout(this.fail,1000*60); - this.$refs.fileForm.uploadFile(); + this.submitFlag = true; + this.timer = setTimeout(this.fail, 1000 * 60); + this.$refs.fileForm.uploadFile(); } else { this.$message({ message: "数据未填写完整", @@ -247,51 +287,53 @@ export default { } }); }, - addCustomerHealthy(){ - //数据处理 - let cusMessage = Object.assign({}, this.form); - this.healthyData['arrayName'].forEach(function (item, index) { - cusMessage[item] = cusMessage[item] != null ? cusMessage[item].join(",") : null; - }); - addCustomerHealthy(cusMessage).then((response) => { - if (response.code === 200) { - this.$notify({ - title: "提交成功", - message: "", - type: "success", - }); - } - }).catch(function() { - console.log("error"); + addCustomerHealthy() { + //数据处理 + let cusMessage = Object.assign({}, this.form); + this.healthyData["arrayName"].forEach(function (item, index) { + cusMessage[item] = + cusMessage[item] != null ? cusMessage[item].join(",") : null; + }); + addCustomerHealthy(cusMessage) + .then((response) => { + if (response.code === 200) { + this.$notify({ + title: "提交成功", + message: "", + type: "success", + }); + } + }) + .catch(function () { + console.log("error"); }); }, - fail(){ + fail() { // console.log("定时--------"); this.submitFlag = false; }, - nextStep(step){ - if(!this.customerExistFlag){ - this.$message.error('客户不存在'); + nextStep(step) { + if (!this.customerExistFlag) { + this.$message.error("客户不存在"); return; } this.$refs.form.validate((valid) => { - if(valid || step < 0){ + if (valid || step < 0) { this.stepArray[this.stepActive] = false; this.stepActive = this.stepActive + step; this.stepArray[this.stepActive] = true; this.goTop(); - }else{ + } else { this.$message({ message: "数据未填写完整", type: "warning", }); } - }); + }); }, - goTop (){ + goTop() { window.scroll(0, 0); }, - }, created() { this.form.customerEncId = this.$route.params.id; @@ -304,45 +346,42 @@ export default { </script> <style scoped> +.el-form-item { + margin-bottom: 8px; +} - .el-form-item { - margin-bottom: 8px; - } - - .p_title_1{ - font-size: 18px; - font-weight: bold; - margin-top: 30px; - } - .p_title_2{ - font-size: 16px; - font-weight: bold; - margin-top: 30px; - } - .p_title_3{ - font-size: 14px; - font-weight: bold; - margin-top: 30px; - } - .margin-left{ - margin-left: 14px; - } - .el-input__inner{ - width: 30%; - } - .margin-top-10{ - margin-top: 10px; - } - .width-50-left-8-right-5{ - width:50%; - margin-left: 8px; - margin-right: 5px; - } - .width-70-left-8-right-5{ - width:70%; - margin-left: 8px; - margin-right: 5px; - } - - +.p_title_1 { + font-size: 18px; + font-weight: bold; + margin-top: 30px; +} +.p_title_2 { + font-size: 16px; + font-weight: bold; + margin-top: 30px; +} +.p_title_3 { + font-size: 14px; + font-weight: bold; + margin-top: 30px; +} +.margin-left { + margin-left: 14px; +} +.el-input__inner { + width: 30%; +} +.margin-top-10 { + margin-top: 10px; +} +.width-50-left-8-right-5 { + width: 50%; + margin-left: 8px; + margin-right: 5px; +} +.width-70-left-8-right-5 { + width: 70%; + margin-left: 8px; + margin-right: 5px; +} </style> diff --git a/stdiet-ui/src/views/system/user/index.vue b/stdiet-ui/src/views/system/user/index.vue index a37c61e51..2a2bc304a 100644 --- a/stdiet-ui/src/views/system/user/index.vue +++ b/stdiet-ui/src/views/system/user/index.vue @@ -323,7 +323,7 @@ </el-form-item> </el-col> <el-col :span="12"> - <el-form-item label="角色" prop="roleIds"> + <el-form-item label="角色" prop="roleId"> <el-select v-model="form.roleId" placeholder="请选择"> <el-option v-for="item in roleOptions" @@ -500,7 +500,7 @@ export default { postIds: [ { required: true, message: "用户岗位不能为空", trigger: "blur" }, ], - roleIds: [ + roleId: [ { required: true, message: "用户角色不能为空", trigger: "blur" }, ], email: [