diff --git a/stdiet-admin/src/main/java/com/stdiet/web/controller/custom/SysDishesController.java b/stdiet-admin/src/main/java/com/stdiet/web/controller/custom/SysDishesController.java
index 6366a249c..f4254c312 100644
--- a/stdiet-admin/src/main/java/com/stdiet/web/controller/custom/SysDishesController.java
+++ b/stdiet-admin/src/main/java/com/stdiet/web/controller/custom/SysDishesController.java
@@ -1,35 +1,33 @@
 package com.stdiet.web.controller.custom;
 
-import java.util.List;
-import org.springframework.security.access.prepost.PreAuthorize;
-import org.springframework.beans.factory.annotation.Autowired;
-import org.springframework.web.bind.annotation.GetMapping;
-import org.springframework.web.bind.annotation.PostMapping;
-import org.springframework.web.bind.annotation.PutMapping;
-import org.springframework.web.bind.annotation.DeleteMapping;
-import org.springframework.web.bind.annotation.PathVariable;
-import org.springframework.web.bind.annotation.RequestBody;
-import org.springframework.web.bind.annotation.RequestMapping;
-import org.springframework.web.bind.annotation.RestController;
 import com.stdiet.common.annotation.Log;
 import com.stdiet.common.core.controller.BaseController;
 import com.stdiet.common.core.domain.AjaxResult;
-import com.stdiet.common.enums.BusinessType;
-import com.stdiet.custom.domain.SysDishes;
-import com.stdiet.custom.service.ISysDishesService;
-import com.stdiet.common.utils.poi.ExcelUtil;
 import com.stdiet.common.core.page.TableDataInfo;
+import com.stdiet.common.enums.BusinessType;
+import com.stdiet.common.utils.StringUtils;
+import com.stdiet.common.utils.poi.ExcelUtil;
+import com.stdiet.custom.domain.SysDishes;
+import com.stdiet.custom.domain.SysDishesIngredient;
+import com.stdiet.custom.domain.SysIngredient;
+import com.stdiet.custom.service.ISysDishesService;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.security.access.prepost.PreAuthorize;
+import org.springframework.web.bind.annotation.*;
+
+import java.lang.reflect.Array;
+import java.util.ArrayList;
+import java.util.List;
 
 /**
  * 菜品Controller
- * 
+ *
  * @author wonder
  * @date 2020-12-28
  */
 @RestController
 @RequestMapping("/custom/dishes")
-public class SysDishesController extends BaseController
-{
+public class SysDishesController extends BaseController {
     @Autowired
     private ISysDishesService sysDishesService;
 
@@ -38,10 +36,17 @@ public class SysDishesController extends BaseController
      */
     @PreAuthorize("@ss.hasPermi('custom:dishes:list')")
     @GetMapping("/list")
-    public TableDataInfo list(SysDishes sysDishes)
-    {
+    public TableDataInfo list(SysDishes sysDishes) {
         startPage();
         List<SysDishes> list = sysDishesService.selectSysDishesList(sysDishes);
+        for (SysDishes dishes : list) {
+            List<SysDishesIngredient> ingredients = sysDishesService.selectSysIngreditentsById(dishes.getId());
+            if (StringUtils.isNull(ingredients)) {
+                dishes.setIgdList(new ArrayList<>());
+            } else {
+                dishes.setIgdList(ingredients);
+            }
+        }
         return getDataTable(list);
     }
 
@@ -51,8 +56,7 @@ public class SysDishesController extends BaseController
     @PreAuthorize("@ss.hasPermi('custom:dishes:export')")
     @Log(title = "菜品", businessType = BusinessType.EXPORT)
     @GetMapping("/export")
-    public AjaxResult export(SysDishes sysDishes)
-    {
+    public AjaxResult export(SysDishes sysDishes) {
         List<SysDishes> list = sysDishesService.selectSysDishesList(sysDishes);
         ExcelUtil<SysDishes> util = new ExcelUtil<SysDishes>(SysDishes.class);
         return util.exportExcel(list, "dishes");
@@ -63,8 +67,7 @@ public class SysDishesController extends BaseController
      */
     @PreAuthorize("@ss.hasPermi('custom:dishes:query')")
     @GetMapping(value = "/{id}")
-    public AjaxResult getInfo(@PathVariable("id") Long id)
-    {
+    public AjaxResult getInfo(@PathVariable("id") Long id) {
         return AjaxResult.success(sysDishesService.selectSysDishesById(id));
     }
 
@@ -74,8 +77,7 @@ public class SysDishesController extends BaseController
     @PreAuthorize("@ss.hasPermi('custom:dishes:add')")
     @Log(title = "菜品", businessType = BusinessType.INSERT)
     @PostMapping
-    public AjaxResult add(@RequestBody SysDishes sysDishes)
-    {
+    public AjaxResult add(@RequestBody SysDishes sysDishes) {
         return toAjax(sysDishesService.insertSysDishes(sysDishes));
     }
 
@@ -85,8 +87,7 @@ public class SysDishesController extends BaseController
     @PreAuthorize("@ss.hasPermi('custom:dishes:edit')")
     @Log(title = "菜品", businessType = BusinessType.UPDATE)
     @PutMapping
-    public AjaxResult edit(@RequestBody SysDishes sysDishes)
-    {
+    public AjaxResult edit(@RequestBody SysDishes sysDishes) {
         return toAjax(sysDishesService.updateSysDishes(sysDishes));
     }
 
@@ -95,9 +96,8 @@ public class SysDishesController extends BaseController
      */
     @PreAuthorize("@ss.hasPermi('custom:dishes:remove')")
     @Log(title = "菜品", businessType = BusinessType.DELETE)
-	@DeleteMapping("/{ids}")
-    public AjaxResult remove(@PathVariable Long[] ids)
-    {
+    @DeleteMapping("/{ids}")
+    public AjaxResult remove(@PathVariable Long[] ids) {
         return toAjax(sysDishesService.deleteSysDishesByIds(ids));
     }
 }
\ No newline at end of file
diff --git a/stdiet-admin/src/main/java/com/stdiet/web/controller/custom/SysIngredientController.java b/stdiet-admin/src/main/java/com/stdiet/web/controller/custom/SysIngredientController.java
index a4ec6ab63..f8100f17f 100644
--- a/stdiet-admin/src/main/java/com/stdiet/web/controller/custom/SysIngredientController.java
+++ b/stdiet-admin/src/main/java/com/stdiet/web/controller/custom/SysIngredientController.java
@@ -45,6 +45,14 @@ public class SysIngredientController extends BaseController
         return getDataTable(list);
     }
 
+    @PreAuthorize("@ss.hasPermi('custom:ingredient:list')")
+    @PostMapping("/listAll")
+    public TableDataInfo listAll(@RequestBody SysIngredient sysIngredient)
+    {
+        List<SysIngredient> list = sysIngredientService.selectSysIngredientList(sysIngredient);
+        return getDataTable(list);
+    }
+
     /**
      * 导出食材列表
      */
diff --git a/stdiet-custom/src/main/java/com/stdiet/custom/domain/SysDishes.java b/stdiet-custom/src/main/java/com/stdiet/custom/domain/SysDishes.java
index cd23e764a..f4b9f2b81 100644
--- a/stdiet-custom/src/main/java/com/stdiet/custom/domain/SysDishes.java
+++ b/stdiet-custom/src/main/java/com/stdiet/custom/domain/SysDishes.java
@@ -5,6 +5,8 @@ import org.apache.commons.lang3.builder.ToStringStyle;
 import com.stdiet.common.annotation.Excel;
 import com.stdiet.common.core.domain.BaseEntity;
 
+import java.util.List;
+
 /**
  * 菜品对象 sys_dishes
  * 
@@ -30,6 +32,8 @@ public class SysDishes extends BaseEntity
     @Excel(name = "做法")
     private String methods;
 
+    private List<SysDishesIngredient> igdList;
+
     public void setId(Long id) 
     {
         this.id = id;
@@ -67,6 +71,14 @@ public class SysDishes extends BaseEntity
         return methods;
     }
 
+    public void setIgdList(List<SysDishesIngredient> ingredientList) {
+        this.igdList = ingredientList;
+    }
+
+    public List<SysDishesIngredient> getIgdList() {
+        return igdList;
+    }
+
     @Override
     public String toString() {
         return new ToStringBuilder(this,ToStringStyle.MULTI_LINE_STYLE)
diff --git a/stdiet-custom/src/main/java/com/stdiet/custom/domain/SysDishesIngredient.java b/stdiet-custom/src/main/java/com/stdiet/custom/domain/SysDishesIngredient.java
new file mode 100644
index 000000000..fec0ce9db
--- /dev/null
+++ b/stdiet-custom/src/main/java/com/stdiet/custom/domain/SysDishesIngredient.java
@@ -0,0 +1,76 @@
+package com.stdiet.custom.domain;
+
+import org.apache.commons.lang3.builder.ToStringBuilder;
+import org.apache.commons.lang3.builder.ToStringStyle;
+
+import java.math.BigDecimal;
+
+/**
+ * 菜品对象 sys_dishes
+ *
+ * @author wonder
+ * @date 2020-12-28
+ */
+public class SysDishesIngredient extends SysIngredient {
+
+    private Long ingredientId;
+
+    private Long dishesId;
+
+    private Long cusUnit;
+
+    private BigDecimal cusWeight;
+
+    private BigDecimal weight;
+
+    public Long getIngredientId() {
+        return ingredientId;
+    }
+
+    public void setIngredientId(Long ingredientId) {
+        this.ingredientId = ingredientId;
+    }
+
+    public Long getDishesId() {
+        return dishesId;
+    }
+
+    public void setDishesId(Long dishesId) {
+        this.dishesId = dishesId;
+    }
+
+    public BigDecimal getWeight() {
+        return weight;
+    }
+
+    public void setWeight(BigDecimal weight) {
+        this.weight = weight;
+    }
+
+    public BigDecimal getCusWeight() {
+        return cusWeight;
+    }
+
+    public void setCusWeight(BigDecimal cusWeight) {
+        this.cusWeight = cusWeight;
+    }
+
+    public Long getCusUnit() {
+        return cusUnit;
+    }
+
+    public void setCusUnit(Long cusUnit) {
+        this.cusUnit = cusUnit;
+    }
+
+    @Override
+    public String toString() {
+        return new ToStringBuilder(this, ToStringStyle.MULTI_LINE_STYLE)
+                .append("ingredientId", getIngredientId())
+                .append("dishesId", getDishesId())
+                .append("weight", getWeight())
+                .append("cusWeight", getCusWeight())
+                .append("cusUnit", getCusUnit())
+                .toString();
+    }
+}
\ No newline at end of file
diff --git a/stdiet-custom/src/main/java/com/stdiet/custom/domain/SysIngredient.java b/stdiet-custom/src/main/java/com/stdiet/custom/domain/SysIngredient.java
index e199f4de1..716a7614f 100644
--- a/stdiet-custom/src/main/java/com/stdiet/custom/domain/SysIngredient.java
+++ b/stdiet-custom/src/main/java/com/stdiet/custom/domain/SysIngredient.java
@@ -33,24 +33,6 @@ public class SysIngredient extends BaseEntity {
     @Excel(name = "食材类别")
     private String type;
 
-    /**
-     * 推荐分量估算
-     */
-    @Excel(name = "推荐分量估算")
-    private Long recEstimation;
-
-    /**
-     * 推荐分量估算单位id
-     */
-    @Excel(name = "推荐分量估算单位id")
-    private Long recEstUnit;
-
-    /**
-     * 推荐分量
-     */
-    @Excel(name = "推荐分量")
-    private Long recPortion;
-
     /**
      * 蛋白质比例
      */
@@ -123,30 +105,6 @@ public class SysIngredient extends BaseEntity {
         this.type = type;
     }
 
-    public Long getRecEstimation() {
-        return recEstimation;
-    }
-
-    public void setRecEstimation(Long recEstimation) {
-        this.recEstimation = recEstimation;
-    }
-
-    public Long getRecEstUnit() {
-        return recEstUnit;
-    }
-
-    public void setRecEstUnit(Long recEstUnit) {
-        this.recEstUnit = recEstUnit;
-    }
-
-    public Long getRecPortion() {
-        return recPortion;
-    }
-
-    public void setRecPortion(Long recPortion) {
-        this.recPortion = recPortion;
-    }
-
     public BigDecimal getProteinRatio() {
         return proteinRatio;
     }
@@ -201,9 +159,6 @@ public class SysIngredient extends BaseEntity {
                 .append("id", getId())
                 .append("name", getName())
                 .append("type", getType())
-                .append("recEstimation", getRecEstimation())
-                .append("recEstUnit", getRecEstUnit())
-                .append("recPortion", getRecPortion())
                 .append("proteinRatio", getProteinRatio())
                 .append("fatRatio", getFatRatio())
                 .append("carbonRatio", getCarbonRatio())
diff --git a/stdiet-custom/src/main/java/com/stdiet/custom/mapper/SysDishesMapper.java b/stdiet-custom/src/main/java/com/stdiet/custom/mapper/SysDishesMapper.java
index e24d49a5b..262325752 100644
--- a/stdiet-custom/src/main/java/com/stdiet/custom/mapper/SysDishesMapper.java
+++ b/stdiet-custom/src/main/java/com/stdiet/custom/mapper/SysDishesMapper.java
@@ -1,7 +1,11 @@
 package com.stdiet.custom.mapper;
 
+import java.lang.reflect.Array;
+import java.util.ArrayList;
 import java.util.List;
 import com.stdiet.custom.domain.SysDishes;
+import com.stdiet.custom.domain.SysDishesIngredient;
+import com.stdiet.custom.domain.SysIngredient;
 
 /**
  * 菜品Mapper接口
@@ -19,6 +23,8 @@ public interface SysDishesMapper
      */
     public SysDishes selectSysDishesById(Long id);
 
+    public ArrayList<SysDishesIngredient> selectSysIngreditentsById(Long id);
+
     /**
      * 查询菜品列表
      * 
@@ -58,4 +64,10 @@ public interface SysDishesMapper
      * @return 结果
      */
     public int deleteSysDishesByIds(Long[] ids);
+
+    public int deleteIngredientById(Long id);
+
+    public int deleteIngredientByIds(Long[] ids);
+
+    public int bashInsertDishesIngredent(List<SysDishesIngredient> sysDishesIngredients);
 }
\ No newline at end of file
diff --git a/stdiet-custom/src/main/java/com/stdiet/custom/mapper/SysIngredientMapper.java b/stdiet-custom/src/main/java/com/stdiet/custom/mapper/SysIngredientMapper.java
index 8c8c527f8..bb6c4aa5b 100644
--- a/stdiet-custom/src/main/java/com/stdiet/custom/mapper/SysIngredientMapper.java
+++ b/stdiet-custom/src/main/java/com/stdiet/custom/mapper/SysIngredientMapper.java
@@ -68,4 +68,8 @@ public interface SysIngredientMapper
     public int deleteIngredentRecByIngredientId(Long recId);
 
     public int deleteIngredentNotRecByIngredientId(Long notRecId);
+
+    public int deleteIngredentRecByIngredientIds(Long[] id);
+
+    public int deleteIngredentNotRecByIngredientIds(Long[] id);
 }
\ No newline at end of file
diff --git a/stdiet-custom/src/main/java/com/stdiet/custom/service/ISysDishesService.java b/stdiet-custom/src/main/java/com/stdiet/custom/service/ISysDishesService.java
index c3def4487..e279b2eac 100644
--- a/stdiet-custom/src/main/java/com/stdiet/custom/service/ISysDishesService.java
+++ b/stdiet-custom/src/main/java/com/stdiet/custom/service/ISysDishesService.java
@@ -2,6 +2,8 @@ package com.stdiet.custom.service;
 
 import java.util.List;
 import com.stdiet.custom.domain.SysDishes;
+import com.stdiet.custom.domain.SysDishesIngredient;
+import com.stdiet.custom.domain.SysIngredient;
 
 /**
  * 菜品Service接口
@@ -19,6 +21,8 @@ public interface ISysDishesService
      */
     public SysDishes selectSysDishesById(Long id);
 
+    public List<SysDishesIngredient> selectSysIngreditentsById(Long id);
+
     /**
      * 查询菜品列表
      * 
diff --git a/stdiet-custom/src/main/java/com/stdiet/custom/service/impl/SysDishesServiceImpl.java b/stdiet-custom/src/main/java/com/stdiet/custom/service/impl/SysDishesServiceImpl.java
index bcdcbbd2a..4d6945f3c 100644
--- a/stdiet-custom/src/main/java/com/stdiet/custom/service/impl/SysDishesServiceImpl.java
+++ b/stdiet-custom/src/main/java/com/stdiet/custom/service/impl/SysDishesServiceImpl.java
@@ -1,96 +1,127 @@
 package com.stdiet.custom.service.impl;
 
-import java.util.List;
 import com.stdiet.common.utils.DateUtils;
+import com.stdiet.common.utils.StringUtils;
+import com.stdiet.custom.domain.SysDishes;
+import com.stdiet.custom.domain.SysDishesIngredient;
+import com.stdiet.custom.mapper.SysDishesMapper;
+import com.stdiet.custom.service.ISysDishesService;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.stereotype.Service;
-import com.stdiet.custom.mapper.SysDishesMapper;
-import com.stdiet.custom.domain.SysDishes;
-import com.stdiet.custom.service.ISysDishesService;
+
+import java.util.ArrayList;
+import java.util.List;
 
 /**
  * 菜品Service业务层处理
- * 
+ *
  * @author wonder
  * @date 2020-12-28
  */
 @Service
-public class SysDishesServiceImpl implements ISysDishesService 
-{
+public class SysDishesServiceImpl implements ISysDishesService {
     @Autowired
     private SysDishesMapper sysDishesMapper;
 
     /**
      * 查询菜品
-     * 
+     *
      * @param id 菜品ID
      * @return 菜品
      */
     @Override
-    public SysDishes selectSysDishesById(Long id)
-    {
-        return sysDishesMapper.selectSysDishesById(id);
+    public SysDishes selectSysDishesById(Long id) {
+        SysDishes dishes = sysDishesMapper.selectSysDishesById(id);
+        if (StringUtils.isNotNull(dishes)) {
+            List<SysDishesIngredient> ingredientArray = selectSysIngreditentsById(id);
+            if (StringUtils.isNull(ingredientArray)) {
+                dishes.setIgdList(new ArrayList<>());
+            } else {
+                dishes.setIgdList(ingredientArray);
+            }
+
+        }
+        return dishes;
+    }
+
+    @Override
+    public List<SysDishesIngredient> selectSysIngreditentsById(Long id) {
+        return sysDishesMapper.selectSysIngreditentsById(id);
     }
 
     /**
      * 查询菜品列表
-     * 
+     *
      * @param sysDishes 菜品
      * @return 菜品
      */
     @Override
-    public List<SysDishes> selectSysDishesList(SysDishes sysDishes)
-    {
+    public List<SysDishes> selectSysDishesList(SysDishes sysDishes) {
         return sysDishesMapper.selectSysDishesList(sysDishes);
     }
 
     /**
      * 新增菜品
-     * 
+     *
      * @param sysDishes 菜品
      * @return 结果
      */
     @Override
-    public int insertSysDishes(SysDishes sysDishes)
-    {
+    public int insertSysDishes(SysDishes sysDishes) {
         sysDishes.setCreateTime(DateUtils.getNowDate());
-        return sysDishesMapper.insertSysDishes(sysDishes);
+        int rows = sysDishesMapper.insertSysDishes(sysDishes);
+        //
+        insertDishesIngredient(sysDishes);
+        return rows;
+    }
+
+    public void insertDishesIngredient(SysDishes sysDishes) {
+        if (StringUtils.isNotNull(sysDishes.getIgdList())) {
+            List<SysDishesIngredient> list = sysDishes.getIgdList();
+            for (SysDishesIngredient dishesIngredient : list) {
+                dishesIngredient.setDishesId(sysDishes.getId());
+                dishesIngredient.setIngredientId(dishesIngredient.getId());
+            }
+            sysDishesMapper.bashInsertDishesIngredent(list);
+        }
     }
 
     /**
      * 修改菜品
-     * 
+     *
      * @param sysDishes 菜品
      * @return 结果
      */
     @Override
-    public int updateSysDishes(SysDishes sysDishes)
-    {
+    public int updateSysDishes(SysDishes sysDishes) {
         sysDishes.setUpdateTime(DateUtils.getNowDate());
+        Long dishesId = sysDishes.getId();
+        sysDishesMapper.deleteIngredientById(dishesId);
+        insertDishesIngredient(sysDishes);
         return sysDishesMapper.updateSysDishes(sysDishes);
     }
 
     /**
      * 批量删除菜品
-     * 
+     *
      * @param ids 需要删除的菜品ID
      * @return 结果
      */
     @Override
-    public int deleteSysDishesByIds(Long[] ids)
-    {
+    public int deleteSysDishesByIds(Long[] ids) {
+        sysDishesMapper.deleteIngredientByIds(ids);
         return sysDishesMapper.deleteSysDishesByIds(ids);
     }
 
     /**
      * 删除菜品信息
-     * 
+     *
      * @param id 菜品ID
      * @return 结果
      */
     @Override
-    public int deleteSysDishesById(Long id)
-    {
+    public int deleteSysDishesById(Long id) {
+        sysDishesMapper.deleteIngredientById(id);
         return sysDishesMapper.deleteSysDishesById(id);
     }
 }
\ No newline at end of file
diff --git a/stdiet-custom/src/main/java/com/stdiet/custom/service/impl/SysIngredientServiceImpl.java b/stdiet-custom/src/main/java/com/stdiet/custom/service/impl/SysIngredientServiceImpl.java
index 1838b4128..eff3414a4 100644
--- a/stdiet-custom/src/main/java/com/stdiet/custom/service/impl/SysIngredientServiceImpl.java
+++ b/stdiet-custom/src/main/java/com/stdiet/custom/service/impl/SysIngredientServiceImpl.java
@@ -128,6 +128,8 @@ public class SysIngredientServiceImpl implements ISysIngredientService {
      */
     @Override
     public int deleteSysIngredientByIds(Long[] ids) {
+        sysIngredientMapper.deleteIngredentRecByIngredientIds(ids);
+        sysIngredientMapper.deleteIngredentNotRecByIngredientIds(ids);
         return sysIngredientMapper.deleteSysIngredientByIds(ids);
     }
 
diff --git a/stdiet-custom/src/main/resources/mapper/custom/SysDishesMapper.xml b/stdiet-custom/src/main/resources/mapper/custom/SysDishesMapper.xml
index 32b0dce05..dc144f090 100644
--- a/stdiet-custom/src/main/resources/mapper/custom/SysDishesMapper.xml
+++ b/stdiet-custom/src/main/resources/mapper/custom/SysDishesMapper.xml
@@ -15,6 +15,21 @@
         <result property="updateTime"    column="update_time"    />
     </resultMap>
 
+    <resultMap type="SysDishesIngredient" id="SysDishesIngredientResult">
+        <result property="id"    column="id"    />
+        <result property="name"    column="name"    />
+        <result property="type"    column="type"    />
+        <result property="proteinRatio"    column="protein_ratio"    />
+        <result property="fatRatio"    column="fat_ratio"    />
+        <result property="carbonRatio"    column="carbon_ratio"    />
+        <result property="area"    column="area"    />
+        <result property="rec"    column="rec"    />
+        <result property="notRec"    column="not_rec"    />
+        <result property="cusWeight"    column="cus_weight"    />
+        <result property="cusUnit"    column="cus_unit"    />
+        <result property="weight"    column="weight"    />
+    </resultMap>
+
     <sql id="selectSysDishesVo">
         select id, name, type, methods, create_by, create_time, update_by, update_time from sys_dishes
     </sql>
@@ -27,6 +42,38 @@
         </where>
     </select>
 
+    <sql id="selectSysIngreditentsByIdVo">
+        SELECT * FROM(
+            SELECT ingredient_id AS id, ingredient_weight AS weight, cus_weight, cus_unit
+            FROM sys_dishes_ingredient
+            WHERE dishes_id = #{id}
+        ) dishes
+        LEFT JOIN (
+            SELECT id, name, type, protein_ratio, fat_ratio, carbon_ratio, area, not_rec, rec
+            FROM sys_ingredient igd
+            LEFT JOIN (
+                SELECT ingredient_id as id, GROUP_CONCAT(name SEPARATOR ',') not_rec FROM(
+                    SELECT physical_signs_id as id, ingredient_id
+                    FROM sys_ingredient_not_rec
+                ) notRec JOIN sys_physical_signs phy USING(id)
+                GROUP BY id
+            ) notRecT USING(id)
+            LEFT JOIN (
+                SELECT ingredient_id as id, GROUP_CONCAT(name SEPARATOR ',') rec FROM(
+                    SELECT physical_signs_id as id, ingredient_id
+                    FROM sys_ingredient_rec
+                ) rec JOIN sys_physical_signs phy USING(id)
+                GROUP BY id
+            ) recT USING(id)
+        ) ing USING(id)
+    </sql>
+
+    <select id="selectSysIngreditentsById" parameterType="Long" resultMap="SysDishesIngredientResult">
+        <include refid="selectSysIngreditentsByIdVo" >
+            <property name="id" value="#{id}"/>
+        </include>
+    </select>
+
     <select id="selectSysDishesById" parameterType="Long" resultMap="SysDishesResult">
         <include refid="selectSysDishesVo"/>
         where id = #{id}
@@ -79,4 +126,22 @@
         </foreach>
     </delete>
 
+    <delete id="deleteIngredientById" parameterType="Long">
+        delete from sys_dishes_ingredient where dishes_id = #{id}
+    </delete>
+
+    <delete id="deleteIngredientByIds" parameterType="String">
+        delete from sys_dishes_ingredient where dishes_id in
+        <foreach item="id" collection="array" open="(" separator="," close=")">
+            #{id}
+        </foreach>
+    </delete>
+
+    <insert id="bashInsertDishesIngredent">
+        insert into sys_dishes_ingredient(dishes_id, ingredient_id, ingredient_weight, cus_unit, cus_weight) values
+        <foreach collection="list" separator="," item="item" index="index">
+            (#{item.dishesId}, #{item.ingredientId}, #{item.weight}, #{item.cusUnit}, #{item.cusWeight})
+        </foreach>
+    </insert>
+
 </mapper>
\ No newline at end of file
diff --git a/stdiet-custom/src/main/resources/mapper/custom/SysIngredientMapper.xml b/stdiet-custom/src/main/resources/mapper/custom/SysIngredientMapper.xml
index cd7292331..51c7517c4 100644
--- a/stdiet-custom/src/main/resources/mapper/custom/SysIngredientMapper.xml
+++ b/stdiet-custom/src/main/resources/mapper/custom/SysIngredientMapper.xml
@@ -159,6 +159,20 @@
         delete from sys_ingredient_not_rec where ingredient_id=#{ingredientId}
     </delete>
 
+    <delete id="deleteIngredentRecByIngredientIds" parameterType="Long">
+        delete from sys_ingredient_rec where ingredient_id in
+        <foreach item="id" collection="array" open="(" separator="," close=")">
+            #{id}
+        </foreach>
+    </delete>
+
+    <delete id="deleteIngredentNotRecByIngredientIds" parameterType="String">
+        delete from sys_ingredient_not_rec where ingredient_id in
+        <foreach item="id" collection="array" open="(" separator="," close=")">
+            #{id}
+        </foreach>
+    </delete>
+
     <update id="updateSysIngredient" parameterType="SysIngredient">
         update sys_ingredient
         <trim prefix="SET" suffixOverrides=",">
diff --git a/stdiet-ui/src/api/custom/ingredient.js b/stdiet-ui/src/api/custom/ingredient.js
index 15c1606bc..6643a081e 100644
--- a/stdiet-ui/src/api/custom/ingredient.js
+++ b/stdiet-ui/src/api/custom/ingredient.js
@@ -14,6 +14,19 @@ export function listIngredient(query) {
   })
 }
 
+export function listAllIngredient(query) {
+  const {recIds, notRecIds} = query;
+  return request({
+    url: '/custom/ingredient/listAll',
+    method: 'post',
+    data: {
+      ...query,
+      recIds: recIds && recIds.length ? recIds : null,
+      notRecIds: notRecIds && notRecIds.length ? notRecIds : null,
+    }
+  })
+}
+
 // 查询食材详细
 export function getIngredient(id) {
   return request({
diff --git a/stdiet-ui/src/views/custom/dishes/index.vue b/stdiet-ui/src/views/custom/dishes/index.vue
index 44486ef8a..2fd06a4f0 100644
--- a/stdiet-ui/src/views/custom/dishes/index.vue
+++ b/stdiet-ui/src/views/custom/dishes/index.vue
@@ -34,7 +34,8 @@
           size="mini"
           @click="handleAdd"
           v-hasPermi="['custom:dishes:add']"
-        >新增</el-button>
+        >新增
+        </el-button>
       </el-col>
       <el-col :span="1.5">
         <el-button
@@ -43,17 +44,18 @@
           size="mini"
           @click="handleExport"
           v-hasPermi="['custom:dishes:export']"
-        >导出</el-button>
+        >导出
+        </el-button>
       </el-col>
       <right-toolbar :showSearch.sync="showSearch" @queryTable="getList"></right-toolbar>
     </el-row>
 
     <el-table v-loading="loading" :data="dishesList" @selection-change="handleSelectionChange">
-<!--      <el-table-column type="selection" width="55" align="center" />-->
-<!--      <el-table-column label="id" align="center" prop="id" />-->
-      <el-table-column label="菜品名称" align="center" prop="name" />
-      <el-table-column label="菜品类型" align="center" prop="type" :formatter="typeFormat" />
-      <el-table-column label="做法" align="center" prop="methods" />
+      <!--      <el-table-column type="selection" width="55" align="center" />-->
+      <!--      <el-table-column label="id" align="center" prop="id" />-->
+      <el-table-column label="菜品名称" align="center" prop="name"/>
+      <el-table-column label="菜品类型" align="center" prop="type" :formatter="typeFormat"/>
+      <el-table-column label="做法" align="center" prop="methods"/>
       <el-table-column label="操作" align="center" class-name="small-padding fixed-width">
         <template slot-scope="scope">
           <el-button
@@ -62,14 +64,16 @@
             icon="el-icon-edit"
             @click="handleUpdate(scope.row)"
             v-hasPermi="['custom:dishes:edit']"
-          >修改</el-button>
+          >修改
+          </el-button>
           <el-button
             size="mini"
             type="text"
             icon="el-icon-delete"
             @click="handleDelete(scope.row)"
             v-hasPermi="['custom:dishes:remove']"
-          >删除</el-button>
+          >删除
+          </el-button>
         </template>
       </el-table-column>
     </el-table>
@@ -86,7 +90,7 @@
     <el-dialog :title="title" :visible.sync="open" width="720px" append-to-body>
       <el-form ref="form" :model="form" :rules="rules" label-width="80px">
         <el-form-item label="菜品名称" prop="name">
-          <el-input v-model="form.name" placeholder="请输入菜品名称" />
+          <el-input v-model="form.name" placeholder="请输入菜品名称"/>
         </el-form-item>
         <el-form-item label="菜品类型" prop="type">
           <el-select v-model="form.type" placeholder="请选择菜品类型">
@@ -101,9 +105,9 @@
         <el-form-item label="食材" prop="ingIds">
           <el-transfer
             style="text-align: left; display: inline-block"
-            v-model="form.ingIds"
+            v-model="selIngIds"
+            size="mini"
             filterable
-            :render-content="renderFunc"
             :titles="['备选', '已选']"
             :button-texts="['', '']"
             :format="{
@@ -111,19 +115,59 @@
           hasChecked: '${checked}/${total}',
         }"
             @change="handleChange"
-            :data="data"
+            :data="ingDataList"
           >
-            <el-select class="transfer-footer" slot="left-footer" size="small"
-                       v-model="ingType"
-                       v-for="dict in ingTypeOptions"
-                       :key="dict.dictValue"
-                       :label="dict.dictLabel"
-                       :value="dict.dictValue"/>
-            <div class="transfer-footer" slot="right-footer" size="small" />
+            <el-select
+              class="transfer-footer"
+              slot="left-footer"
+              size="small"
+              filterable
+              v-model="ingType"
+              @change="handleOnTypeChange">
+              <el-option
+                v-for="dict in ingTypeOptions"
+                :key="dict.dictValue"
+                :label="dict.dictLabel"
+                :value="dict.dictValue"/>
+            </el-select>
+            <div class="transfer-footer" slot="right-footer" size="small"/>
           </el-transfer>
         </el-form-item>
+        <el-form-item label="分量" prop="weight">
+          <el-table
+            :data="selTableData"
+            border
+            show-summary
+            size="mini"
+            :summary-method="getSummaries"
+            style="width: 100%">
+            <el-table-column
+              prop="name"
+              label="食材">
+            </el-table-column>
+            <el-table-column
+              prop="weight"
+              label="重量(g)">
+              <template slot-scope="scope">
+                <el-input v-model="scope.row.weight" size="mini" @change="handleInputChange" type="number" step="50"/>
+              </template>
+            </el-table-column>
+            <el-table-column
+              prop="proteinRatio"
+              label="P/100g">
+            </el-table-column>
+            <el-table-column
+              prop="fatRatio"
+              label="F/100g">
+            </el-table-column>
+            <el-table-column
+              prop="carbonRatio"
+              label="C/100g">
+            </el-table-column>
+          </el-table>
+        </el-form-item>
         <el-form-item label="做法" prop="methods">
-          <el-input v-model="form.methods" type="textarea" placeholder="请输入内容" />
+          <el-input v-model="form.methods" type="textarea" placeholder="请输入内容"/>
         </el-form-item>
       </el-form>
       <div slot="footer" class="dialog-footer">
@@ -135,7 +179,8 @@
 </template>
 
 <script>
-  import { listDishes, getDishes, delDishes, addDishes, updateDishes, exportDishes } from "@/api/custom/dishes";
+  import {addDishes, delDishes, exportDishes, getDishes, listDishes, updateDishes} from "@/api/custom/dishes";
+  import {listAllIngredient} from "@/api/custom/ingredient";
 
   export default {
     name: "Dishes",
@@ -159,9 +204,19 @@
         title: "",
         // 是否显示弹出层
         open: false,
-        ingType: 1,
+        ingType: '1',
         // 食材类别字典
         ingTypeOptions: [],
+        // 远程数据缓存,预防新增的食材找不到
+        oriDataList: [],
+        // 备选食材列表
+        ingDataList: [],
+        // 选中的食材列表
+        selIngList: [],
+        // 选中的食材id
+        selIngIds: [],
+        // 选中的食材分量列表
+        selTableData: [],
         // 菜品类别字典
         typeOptions: [],
         // 查询参数
@@ -174,8 +229,7 @@
         // 表单参数
         form: {},
         // 表单校验
-        rules: {
-        }
+        rules: {}
       };
     },
     created() {
@@ -217,8 +271,13 @@
           createTime: null,
           updateBy: null,
           updateTime: null,
-          ingIds: []
+          igdList: []
         };
+        this.selIngIds = [];
+        this.selIngList = [];
+        this.selTableData = [];
+        this.oriDataList = [];
+        this.ingType = '1';
         this.resetForm("form");
       },
       /** 搜索按钮操作 */
@@ -234,14 +293,21 @@
       // 多选框选中数据
       handleSelectionChange(selection) {
         this.ids = selection.map(item => item.id)
-        this.single = selection.length!==1
+        this.single = selection.length !== 1
         this.multiple = !selection.length
       },
       /** 新增按钮操作 */
       handleAdd() {
         this.reset();
-        this.open = true;
-        this.title = "添加菜品";
+        listAllIngredient({type: this.ingType}).then(response => {
+          this.open = true;
+          this.title = "添加菜品";
+          this.oriDataList = response.rows;
+          this.ingDataList = this.oriDataList.map(obj => ({
+            key: obj.id,
+            label: obj.name
+          }))
+        })
       },
       /** 修改按钮操作 */
       handleUpdate(row) {
@@ -249,14 +315,35 @@
         const id = row.id || this.ids
         getDishes(id).then(response => {
           this.form = response.data;
-          this.open = true;
-          this.title = "修改菜品";
+          this.form.igdList.forEach(obj => {
+            this.selIngIds.push(obj.id);
+            this.selIngList.push({
+              key: obj.id,
+              label: obj.name
+            });
+            this.selTableData.push(obj)
+          })
+          listAllIngredient({type: this.ingType}).then(res => {
+            this.open = true;
+            this.title = "修改菜品";
+            this.oriDataList = res.rows;
+            this.ingDataList = this.oriDataList.reduce((arr, cur) => {
+              if (!arr.some(({key}) => key === cur.id)) {
+                arr.push({
+                  key: cur.id,
+                  label: cur.name
+                });
+              }
+              return arr;
+            }, this.selIngList.slice());
+          })
         });
       },
       /** 提交按钮 */
       submitForm() {
         this.$refs["form"].validate(valid => {
           if (valid) {
+            this.form.igdList = this.selTableData;
             if (this.form.id != null) {
               updateDishes(this.form).then(response => {
                 if (response.code === 200) {
@@ -284,12 +371,13 @@
           confirmButtonText: "确定",
           cancelButtonText: "取消",
           type: "warning"
-        }).then(function() {
+        }).then(function () {
           return delDishes(ids);
         }).then(() => {
           this.getList();
           this.msgSuccess("删除成功");
-        }).catch(function() {});
+        }).catch(function () {
+        });
       },
       /** 导出按钮操作 */
       handleExport() {
@@ -298,20 +386,71 @@
           confirmButtonText: "确定",
           cancelButtonText: "取消",
           type: "warning"
-        }).then(function() {
+        }).then(function () {
           return exportDishes(queryParams);
         }).then(response => {
           this.download(response.msg);
-        }).catch(function() {});
+        }).catch(function () {
+        });
       },
-      renderFunc(h, option) {
-        if (this.form.ingIds.includes(option.key)) {
-          return <span>
-              {option.key} - {option.label}
-            </span>
-        }
-        return <span>{option.label}</span>;
+      handleChange(value, direction, movedKeys) {
+        // console.log({oriIgdList: this.oriDataList, selIgdList: this.form.igdList});
+        const newTableData = [];
+        this.selIngList = value.map(id => {
+          // 搜索table中的数据
+          let tmpTableObj = this.selTableData.find(obj => obj.id === id);
+          if (tmpTableObj) {
+            newTableData.push(tmpTableObj);
+          } else {
+            // 搜索请求的缓存数据
+            tmpTableObj = this.oriDataList.find(obj => obj.id === id);
+            if (tmpTableObj) {
+              newTableData.push({...tmpTableObj, weight: 100, cusWeight: 1, cusUnit: 1})
+            }
+          }
+          const tarObj = this.ingDataList.find(({key}) => key === id);
+          return tarObj
+        });
+        this.selTableData = newTableData;
       },
+      handleOnTypeChange(value) {
+        listAllIngredient({type: value}).then(res => {
+          this.ingDataList = res.rows.reduce((arr, cur) => {
+            if (!arr.some(({key}) => key === cur.id)) {
+              arr.push({
+                key: cur.id,
+                label: cur.name
+              });
+            }
+            return arr;
+          }, this.selIngList.slice());
+        })
+      },
+      handleInputChange(val) {
+        console.log({val, table: this.selTableData})
+      },
+      getSummaries(param) {
+        console.log(param)
+        console.log(arguments);
+        const {columns, data} = param;
+        return columns.reduce((arr, cur, idx) => {
+          if (idx) {
+            arr[idx] = data.reduce((acc, dAcc) => {
+              if (idx === 1) {
+                return acc + dAcc.weight;
+              }
+              return acc + dAcc[cur.property] * dAcc.weight / 100;
+            }, 0);
+          }
+          return arr;
+        }, ['合计'])
+      }
     }
   };
 </script>
+
+<style>
+  .el-transfer-panel__filter {
+    margin: 2px;
+  }
+</style>