获取菜品原料反算接口

This commit is contained in:
sxu 2025-07-16 10:36:52 +08:00
parent 6ea3015204
commit 8a53fee0aa
10 changed files with 185 additions and 1 deletions

View File

@ -4,12 +4,13 @@ import java.util.List;
import javax.servlet.http.HttpServletResponse;
import javax.validation.Valid;
import com.bonus.canteen.core.cook.dto.DishesConvertDTO;
import com.bonus.canteen.core.cook.dto.MenuDishesImportDTO;
import com.bonus.canteen.core.cook.vo.DishesConvertVO;
import com.bonus.common.log.enums.OperaType;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiOperation;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.transaction.annotation.Transactional;
import org.springframework.web.bind.annotation.*;
import com.bonus.common.log.annotation.SysLog;
import com.bonus.canteen.core.cook.domain.CookDishes;
@ -120,4 +121,10 @@ public class CookDishesController extends BaseController {
}
return AjaxResult.success();
}
@PostMapping({"/dishes/convert"})
@ApiOperation("获取菜品原料反算接口")
public List<DishesConvertVO> dishesConvert(@RequestBody @Valid List<DishesConvertDTO> list) {
return this.cookDishesService.dishesConvert(list);
}
}

View File

@ -0,0 +1,29 @@
package com.bonus.canteen.core.cook.domain;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
import java.math.BigDecimal;
@Data
public class CookDishesMaterialModel {
@ApiModelProperty("菜品id")
private Long dishesId;
@ApiModelProperty("菜品id")
private Long baseDishesId;
@ApiModelProperty("菜品")
private String dishesName;
@ApiModelProperty("原料id")
private Long materialId;
@ApiModelProperty("原料")
private String materialName;
@ApiModelProperty("原重量(g)")
private BigDecimal weight;
@ApiModelProperty("可食部分%")
private BigDecimal edible;
@ApiModelProperty("计算后重量(g)")
private BigDecimal calWeight;
@ApiModelProperty("预留比例(0-100)")
private Integer reserveRate;
@ApiModelProperty("规格")
private String size;
}

View File

@ -0,0 +1,20 @@
package com.bonus.canteen.core.cook.dto;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
import javax.validation.constraints.Min;
import javax.validation.constraints.NotNull;
@Data
public class DishesConvertDTO {
@ApiModelProperty("菜品id")
private @NotNull(message = "请选择菜品")
Long dishesId;
@ApiModelProperty("菜品数量")
private @Min(value = 1L, message = "菜品份数不能小于1") @NotNull(message = "请填写菜品数量")
Integer dishesNum;
@ApiModelProperty("规格")
private Long sizeType;
}

View File

@ -166,4 +166,6 @@ public interface CookDishesMapper {
AppletDishesDetailVO selectDishesDetailByDishesId(AppletDishesDetailDTO dishesDetailDTO);
List<CookMaterialBasVO> getCookMaterialById(Long dishesId);
List<CookDishesMaterialModel> listDishesMaterial(@Param("dishesIdList") List<Long> dishesIdList);
}

View File

@ -3,9 +3,11 @@ package com.bonus.canteen.core.cook.service;
import java.util.List;
import com.bonus.canteen.core.cook.domain.CookDishes;
import com.bonus.canteen.core.cook.dto.AppletDishesDetailDTO;
import com.bonus.canteen.core.cook.dto.DishesConvertDTO;
import com.bonus.canteen.core.cook.dto.DishesImportCheckResult;
import com.bonus.canteen.core.cook.dto.MenuDishesImportDTO;
import com.bonus.canteen.core.cook.vo.AppletDishesDetailVO;
import com.bonus.canteen.core.cook.vo.DishesConvertVO;
import com.bonus.common.core.web.domain.AjaxResult;
import org.springframework.web.multipart.MultipartFile;
@ -81,4 +83,6 @@ public interface ICookDishesService {
AjaxResult newImportDishes(List<MenuDishesImportDTO> request);
public AppletDishesDetailVO getDishesDetailByDishesId(AppletDishesDetailDTO dishesDetailDTO);
public List<DishesConvertVO> dishesConvert(List<DishesConvertDTO> content);
}

View File

@ -2,18 +2,25 @@ package com.bonus.canteen.core.cook.service.impl;
import java.lang.reflect.Field;
import java.math.BigDecimal;
import java.math.RoundingMode;
import java.util.*;
import java.util.function.Function;
import java.util.stream.Collectors;
import java.util.stream.Stream;
import cn.hutool.core.bean.BeanUtil;
import cn.hutool.core.text.CharSequenceUtil;
import cn.hutool.core.util.NumberUtil;
import cn.hutool.core.util.ObjectUtil;
import cn.hutool.db.handler.StringHandler;
import com.baomidou.mybatisplus.core.conditions.Wrapper;
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.baomidou.mybatisplus.core.toolkit.Wrappers;
import com.bonus.canteen.core.common.utils.EasyExcelUtil;
import com.bonus.canteen.core.common.utils.LogUtil;
import com.bonus.canteen.core.cook.domain.*;
import com.bonus.canteen.core.cook.dto.AppletDishesDetailDTO;
import com.bonus.canteen.core.cook.dto.DishesConvertDTO;
import com.bonus.canteen.core.cook.dto.DishesImportCheckResult;
import com.bonus.canteen.core.cook.dto.MenuDishesImportDTO;
import com.bonus.canteen.core.cook.enums.CookMealTypeEnum;
@ -23,6 +30,9 @@ import com.bonus.canteen.core.cook.mapper.CookCollectionDishesMapper;
import com.bonus.canteen.core.cook.mapper.CookNutritionMapper;
import com.bonus.canteen.core.cook.vo.AppletDishesDetailVO;
import com.bonus.canteen.core.cook.vo.AppletDishesSizeV2VO;
import com.bonus.canteen.core.cook.vo.DishesConvertVO;
import com.bonus.canteen.core.ims.domain.ImsUnit;
import com.bonus.canteen.core.ims.mapper.ImsUnitMapper;
import com.bonus.canteen.core.utils.Arith;
import com.bonus.canteen.core.utils.NutritionEntity;
import com.bonus.canteen.core.utils.NutritionEntityUtil;
@ -63,6 +73,8 @@ public class CookDishesServiceImpl implements ICookDishesService {
private CookNutritionMapper cookNutritionMapper;
@Autowired
private CookCollectionDishesMapper cookCollectionDishesMapper;
@Autowired
private ImsUnitMapper imsUnitMapper;
@Lazy
@Resource(
name = "smartCanteenTaskExecutor"
@ -629,4 +641,53 @@ public class CookDishesServiceImpl implements ICookDishesService {
}
}
public List<DishesConvertVO> dishesConvert(List<DishesConvertDTO> content) {
if (CollectionUtils.isEmpty(content)) {
throw new ServiceException("菜品列表不能为空");
}
List<Long> dishesIdList = content.stream().map(DishesConvertDTO::getDishesId).collect(Collectors.toList());
if (CollectionUtils.isEmpty(dishesIdList)) {
throw new ServiceException("菜品ID列表不能为空");
}
List<CookDishesMaterialModel> cookDishesMaterialModelList = this.cookDishesMapper.listDishesMaterial(dishesIdList);
if (CollectionUtils.isEmpty(cookDishesMaterialModelList)) {
throw new ServiceException("原料列表不能为空");
}
Iterator var21 = cookDishesMaterialModelList.iterator();
while(true) {
while (var21.hasNext()) {
CookDishesMaterialModel menuDishesMaterialModel = (CookDishesMaterialModel) var21.next();
Iterator var26 = content.iterator();
while (var26.hasNext()) {
DishesConvertDTO drpDishesConvertDTO = (DishesConvertDTO) var26.next();
Long dishesId = drpDishesConvertDTO.getDishesId();
if (ObjectUtil.equal(menuDishesMaterialModel.getDishesId(), dishesId)) {
menuDishesMaterialModel.setCalWeight(menuDishesMaterialModel.getWeight().multiply(new BigDecimal(drpDishesConvertDTO.getDishesNum())));
menuDishesMaterialModel.setCalWeight(menuDishesMaterialModel.getCalWeight().divide(menuDishesMaterialModel.getEdible().divide(new BigDecimal(100), 2, RoundingMode.HALF_UP), 0, RoundingMode.HALF_UP));
break;
}
}
}
Map<Long, BigDecimal> materialTotalWeightMap = (Map) cookDishesMaterialModelList.stream().collect(Collectors.groupingBy(CookDishesMaterialModel::getMaterialId, Collectors.reducing(BigDecimal.ZERO, CookDishesMaterialModel::getCalWeight, BigDecimal::add)));
ImsUnit drpUnit = this.imsUnitMapper.selectImsUnitByUnitName("公斤");
if (ObjectUtil.isEmpty(drpUnit)) {
throw new ServiceException("公斤列表为空");
}
Map<Long, CookDishesMaterialModel> collect = (Map) cookDishesMaterialModelList.stream().collect(Collectors.toMap(CookDishesMaterialModel::getMaterialId, Function.identity(), (k1, k2) -> {
return k1;
}));
List<DishesConvertVO> resultList = new ArrayList();
Iterator var29 = collect.values().iterator();
while (var29.hasNext()) {
CookDishesMaterialModel menuDishesMaterialModel = (CookDishesMaterialModel) var29.next();
DishesConvertVO drpDishesConvertVO = new DishesConvertVO();
BeanUtil.copyProperties(menuDishesMaterialModel, drpDishesConvertVO, new String[0]);
drpDishesConvertVO.setUnitId(drpUnit.getUnitId());
drpDishesConvertVO.setUnitName(drpUnit.getUnitName());
drpDishesConvertVO.setTotalConvertWeight(((BigDecimal) materialTotalWeightMap.get(menuDishesMaterialModel.getMaterialId())).divide(drpUnit.getRate(), 3, RoundingMode.HALF_UP));
resultList.add(drpDishesConvertVO);
}
return resultList;
}
}
}

View File

@ -0,0 +1,34 @@
package com.bonus.canteen.core.cook.vo;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
import java.math.BigDecimal;
@Data
public class DishesConvertVO {
@ApiModelProperty("原料id")
private Long materialId;
@ApiModelProperty("原料名称")
private String materialName;
@ApiModelProperty("单位id")
private Long unitId;
@ApiModelProperty("单位")
private String unitName;
@ApiModelProperty("可食用部分")
private BigDecimal edible;
@ApiModelProperty("系统分解总重量(kg)")
private BigDecimal totalConvertWeight;
@ApiModelProperty("库存数")
private BigDecimal inventoryNum;
@ApiModelProperty("菜品id")
private Long baseDishesId;
@ApiModelProperty("菜品名称")
private String dishesName;
@ApiModelProperty("预留比例(0-100)")
private Integer reserveRate;
@ApiModelProperty("档口id")
private Long stallId;
@ApiModelProperty("规格")
private String size;
}

View File

@ -18,6 +18,8 @@ public interface ImsUnitMapper {
*/
public ImsUnit selectImsUnitByUnitId(Long unitId);
public ImsUnit selectImsUnitByUnitName(String unitName);
/**
* 查询计量单位列表
*

View File

@ -650,4 +650,24 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
LEFT JOIN cook_nutrition cn ON cn.nutrition_id = cm.nutrition_id
WHERE cdm.dishes_id = #{dishesId}
</select>
<select id="listDishesMaterial" resultType="com.bonus.canteen.core.cook.domain.CookDishesMaterialModel">
SELECT a.dishes_id,
a.dishes_name,
b.material_id,
c.material_name,
b.weight,
d.edible,
c.size
FROM cook_dishes a
LEFT JOIN cook_dishes_material b ON b.dishes_id = a.dishes_id
LEFT JOIN cook_material c ON c.material_id = b.material_id
LEFT JOIN cook_nutrition d ON d.nutrition_id = c.nutrition_id
WHERE
b.material_id IS NOT NULL
AND a.dishes_id IN
<foreach collection="dishesIdList" item="dishesId" separator="," open="(" close=")">
#{dishesId}
</foreach>
</select>
</mapper>

View File

@ -32,6 +32,11 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
where unit_id = #{unitId}
</select>
<select id="selectImsUnitByUnitName" parameterType="Long" resultMap="ImsUnitResult">
<include refid="selectImsUnitVo"/>
where unit_name = #{unitName}
</select>
<select id="selectImsUnitByUnitIds" resultMap="ImsUnitResult">
<include refid="selectImsUnitVo"/>
where unit_id in