Просмотр исходного кода

景聚庭-添加菜单管理功能

huangguoce 2 дней назад
Родитель
Сommit
c92db78a6f

+ 110 - 0
jeeplus-modules/jeeplus-psi-management/src/main/java/com/jeeplus/psimanage/dishManage/controller/PsiDishMenuController.java

@@ -0,0 +1,110 @@
+package com.jeeplus.psimanage.dishManage.controller;
+
+import com.baomidou.mybatisplus.core.metadata.IPage;
+import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
+import com.jeeplus.logging.annotation.ApiLog;
+import com.jeeplus.logging.constant.enums.LogTypeEnum;
+import com.jeeplus.psimanage.dishManage.domain.PsiDishLibrary;
+import com.jeeplus.psimanage.dishManage.domain.PsiDishMenu;
+import com.jeeplus.psimanage.dishManage.domain.PsiDishMenuDish;
+import com.jeeplus.psimanage.dishManage.domain.PsiDishType;
+import com.jeeplus.psimanage.dishManage.service.PsiDishMenuService;
+import io.swagger.annotations.Api;
+import io.swagger.annotations.ApiOperation;
+import org.springframework.http.ResponseEntity;
+import org.springframework.web.bind.annotation.DeleteMapping;
+import org.springframework.web.bind.annotation.GetMapping;
+import org.springframework.web.bind.annotation.PostMapping;
+import org.springframework.web.bind.annotation.RequestBody;
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.RequestParam;
+import org.springframework.web.bind.annotation.RestController;
+
+import javax.annotation.Resource;
+import java.util.List;
+
+/**
+ * 菜单管理
+ */
+@RestController
+@Api(tags = "菜单管理")
+@RequestMapping(value = "/psi/dishMenu")
+public class PsiDishMenuController {
+
+    @Resource
+    private PsiDishMenuService service;
+
+    @ApiOperation(value = "当前菜单菜品列表")
+    @GetMapping("/list")
+    public ResponseEntity<IPage<PsiDishMenuDish>> list(Page<PsiDishMenuDish> page, PsiDishMenuDish info) {
+        return ResponseEntity.ok(service.list(page, info));
+    }
+
+    @ApiOperation(value = "历史菜单菜品列表")
+    @GetMapping("/historyList")
+    public ResponseEntity<IPage<PsiDishMenu>> historyList(Page<PsiDishMenu> page) {
+        return ResponseEntity.ok(service.historyList(page));
+    }
+
+    @ApiOperation(value = "历史菜单菜品列表")
+    @GetMapping("/historyDetailList")
+    public ResponseEntity<IPage<PsiDishMenuDish>> historyDetailList(Page<PsiDishMenuDish> page,
+                                                                    @RequestParam String menuId,
+                                                                    PsiDishMenuDish info) {
+        return ResponseEntity.ok(service.historyDetailList(page, menuId, info));
+    }
+
+    @ApiOperation(value = "可添加菜品列表")
+    @GetMapping("/availableDishList")
+    public ResponseEntity<IPage<PsiDishLibrary>> availableDishList(Page<PsiDishLibrary> page, PsiDishLibrary info) {
+        return ResponseEntity.ok(service.availableDishList(page, info));
+    }
+
+    @ApiOperation(value = "点单菜品列表")
+    @GetMapping("/orderDishList")
+    public ResponseEntity<List<PsiDishLibrary>> orderDishList(@RequestParam(required = false) String typeId,
+                                                              @RequestParam(required = false) String dishName) {
+        return ResponseEntity.ok(service.orderDishList(typeId, dishName));
+    }
+
+    @ApiOperation(value = "点单分类列表")
+    @GetMapping("/orderTypeList")
+    public ResponseEntity<List<PsiDishType>> orderTypeList() {
+        return ResponseEntity.ok(service.orderTypeList());
+    }
+
+    @ApiLog(value = "添加菜单菜品", type = LogTypeEnum.SAVE)
+    @ApiOperation(value = "添加菜单菜品")
+    @PostMapping("/addDishes")
+    public ResponseEntity<String> addDishes(@RequestBody List<String> dishIds) {
+        return ResponseEntity.ok(service.addDishes(dishIds));
+    }
+
+    @ApiLog(value = "保存菜单菜品", type = LogTypeEnum.SAVE)
+    @ApiOperation(value = "保存菜单菜品")
+    @PostMapping("/saveDishes")
+    public ResponseEntity<String> saveDishes(@RequestBody List<String> dishIds) {
+        return ResponseEntity.ok(service.saveDishes(dishIds));
+    }
+
+    @ApiLog(value = "调整菜单价格", type = LogTypeEnum.SAVE)
+    @ApiOperation(value = "调整菜单价格")
+    @PostMapping("/updatePrice")
+    public ResponseEntity<String> updatePrice(@RequestBody PsiDishMenuDish info) {
+        return ResponseEntity.ok(service.updatePrice(info));
+    }
+
+    @ApiLog(value = "删除菜单菜品", type = LogTypeEnum.SAVE)
+    @ApiOperation(value = "删除菜单菜品")
+    @DeleteMapping("/delete")
+    public ResponseEntity<String> delete(@RequestParam String ids) {
+        return ResponseEntity.ok(service.deleteByIds(ids));
+    }
+
+    @ApiLog(value = "更新菜单", type = LogTypeEnum.SAVE)
+    @ApiOperation(value = "更新菜单")
+    @PostMapping("/updateMenu")
+    public ResponseEntity<String> updateMenu(@RequestBody List<String> dishIds) {
+        return ResponseEntity.ok(service.updateMenu(dishIds));
+    }
+}

+ 36 - 0
jeeplus-modules/jeeplus-psi-management/src/main/java/com/jeeplus/psimanage/dishManage/domain/PsiDishMenu.java

@@ -0,0 +1,36 @@
+package com.jeeplus.psimanage.dishManage.domain;
+
+import com.baomidou.mybatisplus.annotation.TableName;
+import com.baomidou.mybatisplus.annotation.TableField;
+import com.jeeplus.core.domain.BaseEntity;
+import lombok.Data;
+
+import java.util.Date;
+
+/**
+ * 菜单主表
+ */
+@Data
+@TableName("psi_dish_menu")
+public class PsiDishMenu extends BaseEntity {
+
+    private static final long serialVersionUID = 1L;
+
+    /**
+     * 是否历史菜单:0否,1是
+     */
+    private String isHistory;
+
+    /**
+     * 成为历史菜单的时间
+     */
+    private Date historyTime;
+
+    private String remarks;
+
+    @TableField(exist = false)
+    private String createName;
+
+    @TableField(exist = false)
+    private Integer dishCount;
+}

+ 75 - 0
jeeplus-modules/jeeplus-psi-management/src/main/java/com/jeeplus/psimanage/dishManage/domain/PsiDishMenuDish.java

@@ -0,0 +1,75 @@
+package com.jeeplus.psimanage.dishManage.domain;
+
+import com.baomidou.mybatisplus.annotation.TableField;
+import com.baomidou.mybatisplus.annotation.TableName;
+import com.jeeplus.core.domain.BaseEntity;
+import lombok.Data;
+
+import java.math.BigDecimal;
+import java.util.Date;
+
+/**
+ * 菜单菜品
+ */
+@Data
+@TableName("psi_dish_menu_dish")
+public class PsiDishMenuDish extends BaseEntity {
+
+    private static final long serialVersionUID = 1L;
+
+    /**
+     * 菜单销售价,不影响菜品库价格
+     */
+    private BigDecimal salePrice;
+
+    private Integer sort;
+
+    private String remarks;
+
+    /**
+     * 是否历史菜单:0否,1是
+     */
+    private String isHistory;
+
+    /**
+     * 成为历史菜单的时间
+     */
+    private Date historyTime;
+
+    private String menuId;
+
+    private String dishId;
+
+    @TableField(exist = false)
+    private String dishCode;
+
+    @TableField(exist = false)
+    private String dishName;
+
+    @TableField(exist = false)
+    private String typeId;
+
+    @TableField(exist = false)
+    private String typeName;
+
+    @TableField(exist = false)
+    private String imageUrl;
+
+    @TableField(exist = false)
+    private String unit;
+
+    @TableField(exist = false)
+    private String spec;
+
+    @TableField(exist = false)
+    private String taste;
+
+    @TableField(exist = false)
+    private String status;
+
+    @TableField(exist = false)
+    private BigDecimal librarySalePrice;
+
+    @TableField(exist = false)
+    private String createName;
+}

+ 37 - 0
jeeplus-modules/jeeplus-psi-management/src/main/java/com/jeeplus/psimanage/dishManage/mapper/PsiDishMenuDishMapper.java

@@ -0,0 +1,37 @@
+package com.jeeplus.psimanage.dishManage.mapper;
+
+import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+import com.baomidou.mybatisplus.core.metadata.IPage;
+import com.baomidou.mybatisplus.core.toolkit.Constants;
+import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
+import com.jeeplus.psimanage.dishManage.domain.PsiDishLibrary;
+import com.jeeplus.psimanage.dishManage.domain.PsiDishMenuDish;
+import com.jeeplus.psimanage.dishManage.domain.PsiDishType;
+import org.apache.ibatis.annotations.Param;
+
+import java.util.List;
+
+/**
+ * 菜单菜品
+ */
+public interface PsiDishMenuDishMapper extends BaseMapper<PsiDishMenuDish> {
+
+    IPage<PsiDishMenuDish> findCurrentDishList(Page<PsiDishMenuDish> page,
+                                               @Param(Constants.WRAPPER) QueryWrapper<PsiDishMenuDish> queryWrapper);
+
+    IPage<PsiDishMenuDish> findHistoryDishList(Page<PsiDishMenuDish> page,
+                                               @Param(Constants.WRAPPER) QueryWrapper<PsiDishMenuDish> queryWrapper);
+
+    IPage<PsiDishLibrary> findAvailableDishList(Page<PsiDishLibrary> page,
+                                                @Param(Constants.WRAPPER) QueryWrapper<PsiDishLibrary> queryWrapper,
+                                                @Param("menuId") String menuId);
+
+    List<PsiDishLibrary> findOrderDishList(@Param("typeId") String typeId, @Param("dishName") String dishName);
+
+    List<PsiDishType> findOrderTypeList();
+
+    PsiDishMenuDish findCurrentByDishId(@Param("dishId") String dishId);
+
+    Integer getMaxSort(@Param("menuId") String menuId);
+}

+ 18 - 0
jeeplus-modules/jeeplus-psi-management/src/main/java/com/jeeplus/psimanage/dishManage/mapper/PsiDishMenuMapper.java

@@ -0,0 +1,18 @@
+package com.jeeplus.psimanage.dishManage.mapper;
+
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
+import com.baomidou.mybatisplus.core.metadata.IPage;
+import com.baomidou.mybatisplus.core.toolkit.Constants;
+import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
+import com.jeeplus.psimanage.dishManage.domain.PsiDishMenu;
+import org.apache.ibatis.annotations.Param;
+
+/**
+ * 菜单主表
+ */
+public interface PsiDishMenuMapper extends BaseMapper<PsiDishMenu> {
+
+    IPage<PsiDishMenu> findHistoryMenuList(Page<PsiDishMenu> page,
+                                           @Param(Constants.WRAPPER) QueryWrapper<PsiDishMenu> queryWrapper);
+}

+ 205 - 0
jeeplus-modules/jeeplus-psi-management/src/main/java/com/jeeplus/psimanage/dishManage/mapper/xml/PsiDishMenuDishMapper.xml

@@ -0,0 +1,205 @@
+<?xml version="1.0" encoding="UTF-8" ?>
+<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
+<mapper namespace="com.jeeplus.psimanage.dishManage.mapper.PsiDishMenuDishMapper">
+
+    <resultMap id="MenuDishResultMap" type="com.jeeplus.psimanage.dishManage.domain.PsiDishMenuDish">
+        <id property="id" column="id" jdbcType="VARCHAR"/>
+        <result property="createById" column="create_by_id" jdbcType="VARCHAR"/>
+        <result property="createTime" column="create_time" jdbcType="TIMESTAMP"/>
+        <result property="updateById" column="update_by_id" jdbcType="VARCHAR"/>
+        <result property="updateTime" column="update_time" jdbcType="TIMESTAMP"/>
+        <result property="delFlag" column="del_flag" jdbcType="INTEGER"/>
+        <result property="salePrice" column="sale_price" jdbcType="DECIMAL"/>
+        <result property="sort" column="sort" jdbcType="INTEGER"/>
+        <result property="remarks" column="remarks" jdbcType="VARCHAR"/>
+        <result property="tenantId" column="tenant_id" jdbcType="VARCHAR"/>
+        <result property="isHistory" column="is_history" jdbcType="VARCHAR"/>
+        <result property="historyTime" column="history_time" jdbcType="TIMESTAMP"/>
+        <result property="menuId" column="menu_id" jdbcType="VARCHAR"/>
+        <result property="dishId" column="dish_id" jdbcType="VARCHAR"/>
+        <result property="dishCode" column="dish_code" jdbcType="VARCHAR"/>
+        <result property="dishName" column="dish_name" jdbcType="VARCHAR"/>
+        <result property="typeId" column="type_id" jdbcType="VARCHAR"/>
+        <result property="typeName" column="type_name" jdbcType="VARCHAR"/>
+        <result property="imageUrl" column="image_url" jdbcType="VARCHAR"/>
+        <result property="unit" column="unit" jdbcType="VARCHAR"/>
+        <result property="spec" column="spec" jdbcType="VARCHAR"/>
+        <result property="taste" column="taste" jdbcType="VARCHAR"/>
+        <result property="status" column="status" jdbcType="VARCHAR"/>
+        <result property="librarySalePrice" column="library_sale_price" jdbcType="DECIMAL"/>
+        <result property="createName" column="create_name" jdbcType="VARCHAR"/>
+    </resultMap>
+
+    <sql id="Menu_Dish_Column_List">
+        md.id,
+        md.create_by_id,
+        md.create_time,
+        md.update_by_id,
+        md.update_time,
+        md.del_flag,
+        md.sale_price,
+        md.sort,
+        md.remarks,
+        md.tenant_id,
+        md.is_history,
+        md.history_time,
+        md.menu_id,
+        md.dish_id,
+        dl.dish_code,
+        dl.dish_name,
+        dl.type_id,
+        dt.name as type_name,
+        dl.image_url,
+        dl.unit,
+        dl.spec,
+        dl.taste,
+        dl.status,
+        dl.sale_price as library_sale_price,
+        su.name as create_name
+    </sql>
+
+    <select id="findCurrentDishList" resultMap="MenuDishResultMap">
+        select
+            <include refid="Menu_Dish_Column_List"></include>
+        from psi_dish_menu_dish md
+        inner join psi_dish_menu m on m.id = md.menu_id and m.del_flag = '0'
+            and (m.is_history = '0' or m.is_history is null)
+        inner join psi_dish_library dl on dl.id = md.dish_id and dl.del_flag = '0'
+        left join psi_dish_type dt on dt.id = dl.type_id and dt.del_flag = '0'
+        left join sys_user su on su.id = md.create_by_id
+        ${ew.customSqlSegment}
+        order by md.sort asc, md.create_time desc
+    </select>
+
+    <select id="findHistoryDishList" resultMap="MenuDishResultMap">
+        select
+            <include refid="Menu_Dish_Column_List"></include>
+        from psi_dish_menu_dish md
+        inner join psi_dish_menu m on m.id = md.menu_id and m.del_flag = '0' and m.is_history = '1'
+        inner join psi_dish_library dl on dl.id = md.dish_id and dl.del_flag = '0'
+        left join psi_dish_type dt on dt.id = dl.type_id and dt.del_flag = '0'
+        left join sys_user su on su.id = md.create_by_id
+        ${ew.customSqlSegment}
+        order by md.history_time desc, md.sort asc, md.create_time desc
+    </select>
+
+    <select id="findAvailableDishList" resultMap="com.jeeplus.psimanage.dishManage.mapper.PsiDishLibraryMapper.BaseResultMap">
+        select
+            a.id,
+            a.create_by_id,
+            a.create_time,
+            a.update_by_id,
+            a.update_time,
+            a.del_flag,
+            a.dish_code,
+            a.dish_name,
+            a.type_id,
+            a.image_url,
+            a.unit,
+            a.spec,
+            a.sale_price,
+            a.cost_price,
+            a.taste,
+            a.status,
+            a.sort,
+            a.remarks,
+            dt.name as type_name,
+            su.name as create_name
+        from psi_dish_library a
+        left join psi_dish_type dt on dt.id = a.type_id and dt.del_flag = '0'
+        left join sys_user su on su.id = a.create_by_id
+        ${ew.customSqlSegment}
+          and not exists (
+              select 1
+              from psi_dish_menu_dish md
+              where md.del_flag = '0'
+                and (md.is_history = '0' or md.is_history is null)
+                and md.menu_id = #{menuId}
+                and md.dish_id = a.id
+          )
+        order by a.sort asc, a.create_time desc
+    </select>
+
+    <select id="findOrderDishList" resultMap="com.jeeplus.psimanage.dishManage.mapper.PsiDishLibraryMapper.BaseResultMap">
+        select
+            dl.id,
+            dl.create_by_id,
+            dl.create_time,
+            dl.update_by_id,
+            dl.update_time,
+            dl.del_flag,
+            dl.dish_code,
+            dl.dish_name,
+            dl.type_id,
+            dl.image_url,
+            dl.unit,
+            dl.spec,
+            md.sale_price,
+            dl.cost_price,
+            dl.taste,
+            dl.status,
+            md.sort,
+            dl.remarks,
+            dt.name as type_name,
+            su.name as create_name
+        from psi_dish_menu_dish md
+        inner join psi_dish_menu m on m.id = md.menu_id and m.del_flag = '0'
+            and (m.is_history = '0' or m.is_history is null)
+        inner join psi_dish_library dl on dl.id = md.dish_id and dl.del_flag = '0' and dl.status = '0'
+        inner join psi_dish_type dt on dt.id = dl.type_id and dt.del_flag = '0' and dt.status = '0'
+        left join sys_user su on su.id = dl.create_by_id
+        where md.del_flag = '0'
+          and (md.is_history = '0' or md.is_history is null)
+        <if test="typeId != null and typeId != ''">
+          and dl.type_id = #{typeId}
+        </if>
+        <if test="dishName != null and dishName != ''">
+          and dl.dish_name like concat('%', #{dishName}, '%')
+        </if>
+        order by md.sort asc, dl.create_time desc
+    </select>
+
+    <select id="findOrderTypeList" resultType="com.jeeplus.psimanage.dishManage.domain.PsiDishType">
+        select distinct
+            dt.id,
+            dt.name,
+            dt.parent_id,
+            dt.parent_ids,
+            dt.level,
+            dt.sort,
+            dt.status,
+            dt.remarks,
+            dt.del_flag
+        from psi_dish_menu_dish md
+        inner join psi_dish_menu m on m.id = md.menu_id and m.del_flag = '0'
+            and (m.is_history = '0' or m.is_history is null)
+        inner join psi_dish_library dl on dl.id = md.dish_id and dl.del_flag = '0' and dl.status = '0'
+        inner join psi_dish_type dt on dt.id = dl.type_id and dt.del_flag = '0' and dt.status = '0'
+        where md.del_flag = '0'
+          and (md.is_history = '0' or md.is_history is null)
+        order by dt.sort asc
+    </select>
+
+    <select id="findCurrentByDishId" resultMap="MenuDishResultMap">
+        select
+            <include refid="Menu_Dish_Column_List"></include>
+        from psi_dish_menu_dish md
+        inner join psi_dish_menu m on m.id = md.menu_id and m.del_flag = '0'
+            and (m.is_history = '0' or m.is_history is null)
+        inner join psi_dish_library dl on dl.id = md.dish_id and dl.del_flag = '0'
+        left join psi_dish_type dt on dt.id = dl.type_id and dt.del_flag = '0'
+        left join sys_user su on su.id = md.create_by_id
+        where md.del_flag = '0'
+          and (md.is_history = '0' or md.is_history is null)
+          and md.dish_id = #{dishId}
+        limit 1
+    </select>
+
+    <select id="getMaxSort" resultType="java.lang.Integer">
+        select ifnull(max(sort), 0)
+        from psi_dish_menu_dish
+        where del_flag = '0'
+          and (is_history = '0' or is_history is null)
+          and menu_id = #{menuId}
+    </select>
+</mapper>

+ 52 - 0
jeeplus-modules/jeeplus-psi-management/src/main/java/com/jeeplus/psimanage/dishManage/mapper/xml/PsiDishMenuMapper.xml

@@ -0,0 +1,52 @@
+<?xml version="1.0" encoding="UTF-8" ?>
+<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
+<mapper namespace="com.jeeplus.psimanage.dishManage.mapper.PsiDishMenuMapper">
+
+    <resultMap id="BaseResultMap" type="com.jeeplus.psimanage.dishManage.domain.PsiDishMenu">
+        <id property="id" column="id" jdbcType="VARCHAR"/>
+        <result property="createById" column="create_by_id" jdbcType="VARCHAR"/>
+        <result property="createTime" column="create_time" jdbcType="TIMESTAMP"/>
+        <result property="updateById" column="update_by_id" jdbcType="VARCHAR"/>
+        <result property="updateTime" column="update_time" jdbcType="TIMESTAMP"/>
+        <result property="delFlag" column="del_flag" jdbcType="INTEGER"/>
+        <result property="remarks" column="remarks" jdbcType="VARCHAR"/>
+        <result property="tenantId" column="tenant_id" jdbcType="VARCHAR"/>
+        <result property="isHistory" column="is_history" jdbcType="VARCHAR"/>
+        <result property="historyTime" column="history_time" jdbcType="TIMESTAMP"/>
+        <result property="createName" column="create_name" jdbcType="VARCHAR"/>
+        <result property="dishCount" column="dish_count" jdbcType="INTEGER"/>
+    </resultMap>
+
+    <select id="findHistoryMenuList" resultMap="BaseResultMap">
+        select
+            m.id,
+            m.create_by_id,
+            m.create_time,
+            m.update_by_id,
+            m.update_time,
+            m.del_flag,
+            m.remarks,
+            m.tenant_id,
+            m.is_history,
+            m.history_time,
+            su.name as create_name,
+            count(md.id) as dish_count
+        from psi_dish_menu m
+        left join psi_dish_menu_dish md on md.menu_id = m.id and md.del_flag = '0'
+        left join sys_user su on su.id = m.create_by_id
+        ${ew.customSqlSegment}
+        group by
+            m.id,
+            m.create_by_id,
+            m.create_time,
+            m.update_by_id,
+            m.update_time,
+            m.del_flag,
+            m.remarks,
+            m.tenant_id,
+            m.is_history,
+            m.history_time,
+            su.name
+        order by m.history_time desc, m.create_time desc
+    </select>
+</mapper>

+ 368 - 0
jeeplus-modules/jeeplus-psi-management/src/main/java/com/jeeplus/psimanage/dishManage/service/PsiDishMenuService.java

@@ -0,0 +1,368 @@
+package com.jeeplus.psimanage.dishManage.service;
+
+import cn.hutool.extra.spring.SpringUtil;
+import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
+import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
+import com.baomidou.mybatisplus.core.metadata.IPage;
+import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
+import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
+import com.jeeplus.common.TokenProvider;
+import com.jeeplus.psimanage.dishManage.domain.PsiDishLibrary;
+import com.jeeplus.psimanage.dishManage.domain.PsiDishMenu;
+import com.jeeplus.psimanage.dishManage.domain.PsiDishMenuDish;
+import com.jeeplus.psimanage.dishManage.domain.PsiDishType;
+import com.jeeplus.psimanage.dishManage.mapper.PsiDishLibraryMapper;
+import com.jeeplus.psimanage.dishManage.mapper.PsiDishMenuDishMapper;
+import com.jeeplus.psimanage.dishManage.mapper.PsiDishMenuMapper;
+import com.jeeplus.sys.feign.IUserApi;
+import com.jeeplus.sys.service.dto.UserDTO;
+import com.jeeplus.utils.StringUtils;
+import org.springframework.stereotype.Service;
+import org.springframework.transaction.annotation.Transactional;
+
+import javax.annotation.Resource;
+import java.math.BigDecimal;
+import java.util.ArrayList;
+import java.util.Date;
+import java.util.LinkedHashMap;
+import java.util.LinkedHashSet;
+import java.util.List;
+import java.util.Map;
+import java.util.UUID;
+
+/**
+ * 菜单管理
+ */
+@Service
+@Transactional(rollbackFor = Exception.class)
+public class PsiDishMenuService extends ServiceImpl<PsiDishMenuDishMapper, PsiDishMenuDish> {
+
+    @Resource
+    private PsiDishMenuMapper psiDishMenuMapper;
+
+    @Resource
+    private PsiDishMenuDishMapper menuDishMapper;
+
+    @Resource
+    private PsiDishLibraryMapper dishLibraryMapper;
+
+    public IPage<PsiDishMenuDish> list(Page<PsiDishMenuDish> page, PsiDishMenuDish info) {
+        getOrCreateCurrentMenu();
+        QueryWrapper<PsiDishMenuDish> wrapper = buildMenuDishQuery(info);
+        wrapper.eq("md.del_flag", "0");
+        wrapper.and(w -> w.eq("md.is_history", "0").or().isNull("md.is_history"));
+        return menuDishMapper.findCurrentDishList(page, wrapper);
+    }
+
+    public IPage<PsiDishMenu> historyList(Page<PsiDishMenu> page) {
+        QueryWrapper<PsiDishMenu> wrapper = new QueryWrapper<>();
+        wrapper.eq("m.del_flag", "0");
+        wrapper.eq("m.is_history", "1");
+        return psiDishMenuMapper.findHistoryMenuList(page, wrapper);
+    }
+
+    public IPage<PsiDishMenuDish> historyDetailList(Page<PsiDishMenuDish> page, String menuId, PsiDishMenuDish info) {
+        if (StringUtils.isBlank(menuId)) {
+            return page;
+        }
+        QueryWrapper<PsiDishMenuDish> wrapper = buildMenuDishQuery(info);
+        wrapper.eq("md.del_flag", "0");
+        wrapper.eq("md.is_history", "1");
+        wrapper.eq("md.menu_id", menuId);
+        return menuDishMapper.findHistoryDishList(page, wrapper);
+    }
+
+    public IPage<PsiDishLibrary> availableDishList(Page<PsiDishLibrary> page, PsiDishLibrary info) {
+        PsiDishMenu menu = getOrCreateCurrentMenu();
+        QueryWrapper<PsiDishLibrary> wrapper = new QueryWrapper<>();
+        wrapper.eq("a.del_flag", "0");
+        wrapper.eq("a.status", "0");
+        if (StringUtils.isNotBlank(info.getDishName())) {
+            wrapper.like("a.dish_name", info.getDishName());
+        }
+        if (StringUtils.isNotBlank(info.getDishCode())) {
+            wrapper.like("a.dish_code", info.getDishCode());
+        }
+        if (StringUtils.isNotBlank(info.getTypeId())) {
+            wrapper.eq("a.type_id", info.getTypeId());
+        }
+        return menuDishMapper.findAvailableDishList(page, wrapper, menu.getId());
+    }
+
+    public List<PsiDishLibrary> orderDishList(String typeId, String dishName) {
+        return menuDishMapper.findOrderDishList(typeId, dishName);
+    }
+
+    public List<PsiDishType> orderTypeList() {
+        return menuDishMapper.findOrderTypeList();
+    }
+
+    public String addDishes(List<String> dishIds) {
+        if (dishIds == null || dishIds.isEmpty()) {
+            return "请选择要添加的菜品";
+        }
+        PsiDishMenu menu = getOrCreateCurrentMenu();
+        UserDTO userDto = SpringUtil.getBean(IUserApi.class).getByToken(TokenProvider.getCurrentToken());
+        Date now = new Date();
+        int sort = menuDishMapper.getMaxSort(menu.getId()) == null ? 0 : menuDishMapper.getMaxSort(menu.getId());
+        int addCount = 0;
+        for (String dishId : dishIds) {
+            if (StringUtils.isBlank(dishId) || existsCurrentMenuDish(menu.getId(), dishId)) {
+                continue;
+            }
+            PsiDishLibrary dish = dishLibraryMapper.queryById(dishId);
+            if (dish == null || !"0".equals(dish.getStatus())) {
+                continue;
+            }
+            PsiDishMenuDish menuDish = new PsiDishMenuDish();
+            menuDish.setId(UUID.randomUUID().toString().replace("-", ""));
+            menuDish.setMenuId(menu.getId());
+            menuDish.setDishId(dish.getId());
+            menuDish.setSalePrice(dish.getSalePrice() == null ? BigDecimal.ZERO : dish.getSalePrice());
+            menuDish.setSort(++sort);
+            menuDish.setIsHistory("0");
+            menuDish.setCreateById(userDto.getId());
+            menuDish.setCreateTime(now);
+            menuDish.setUpdateById(userDto.getId());
+            menuDish.setUpdateTime(now);
+            menuDish.setDelFlag(0);
+            menuDishMapper.insert(menuDish);
+            addCount++;
+        }
+        return addCount == 0 ? "所选菜品已在当前菜单中" : "添加成功";
+    }
+
+    public String saveDishes(List<String> dishIds) {
+        if (dishIds == null) {
+            dishIds = new ArrayList<>();
+        }
+        PsiDishMenu menu = getOrCreateCurrentMenu();
+        List<PsiDishMenuDish> currentDishList = menuDishMapper.selectList(new LambdaQueryWrapper<PsiDishMenuDish>()
+                .eq(PsiDishMenuDish::getMenuId, menu.getId())
+                .eq(PsiDishMenuDish::getDelFlag, 0)
+                .and(w -> w.eq(PsiDishMenuDish::getIsHistory, "0").or().isNull(PsiDishMenuDish::getIsHistory)));
+        Map<String, PsiDishMenuDish> currentDishMap = new LinkedHashMap<>();
+        for (PsiDishMenuDish currentDish : currentDishList) {
+            currentDishMap.put(currentDish.getDishId(), currentDish);
+        }
+
+        LinkedHashSet<String> selectedDishIds = new LinkedHashSet<>();
+        for (String dishId : dishIds) {
+            if (StringUtils.isBlank(dishId)) {
+                continue;
+            }
+            PsiDishLibrary dish = dishLibraryMapper.queryById(dishId);
+            if (dish != null && ("0".equals(dish.getStatus()) || currentDishMap.containsKey(dishId))) {
+                selectedDishIds.add(dishId);
+            }
+        }
+        if (!dishIds.isEmpty() && selectedDishIds.isEmpty()) {
+            return "所选菜品不存在或已停用";
+        }
+
+        List<String> removeIds = new ArrayList<>();
+        for (PsiDishMenuDish currentDish : currentDishList) {
+            if (!selectedDishIds.contains(currentDish.getDishId())) {
+                removeIds.add(currentDish.getId());
+            }
+        }
+        if (!removeIds.isEmpty()) {
+            menuDishMapper.deleteBatchIds(removeIds);
+        }
+
+        UserDTO userDto = SpringUtil.getBean(IUserApi.class).getByToken(TokenProvider.getCurrentToken());
+        Date now = new Date();
+        int sort = 0;
+        for (String dishId : selectedDishIds) {
+            PsiDishMenuDish currentDish = currentDishMap.get(dishId);
+            if (currentDish != null) {
+                PsiDishMenuDish update = new PsiDishMenuDish();
+                update.setId(currentDish.getId());
+                update.setSort(++sort);
+                update.setUpdateById(userDto.getId());
+                update.setUpdateTime(now);
+                menuDishMapper.updateById(update);
+                continue;
+            }
+            PsiDishLibrary dish = dishLibraryMapper.queryById(dishId);
+            PsiDishMenuDish menuDish = new PsiDishMenuDish();
+            menuDish.setId(UUID.randomUUID().toString().replace("-", ""));
+            menuDish.setMenuId(menu.getId());
+            menuDish.setDishId(dishId);
+            menuDish.setSalePrice(dish.getSalePrice() == null ? BigDecimal.ZERO : dish.getSalePrice());
+            menuDish.setSort(++sort);
+            menuDish.setIsHistory("0");
+            menuDish.setCreateById(userDto.getId());
+            menuDish.setCreateTime(now);
+            menuDish.setUpdateById(userDto.getId());
+            menuDish.setUpdateTime(now);
+            menuDish.setDelFlag(0);
+            menuDishMapper.insert(menuDish);
+        }
+        return "菜单菜品保存成功";
+    }
+
+    public String updatePrice(PsiDishMenuDish info) {
+        if (info == null || StringUtils.isBlank(info.getId())) {
+            return "请选择要调整的菜品";
+        }
+        if (info.getSalePrice() == null || info.getSalePrice().compareTo(BigDecimal.ZERO) < 0) {
+            return "菜单价格不能小于0";
+        }
+        UserDTO userDto = SpringUtil.getBean(IUserApi.class).getByToken(TokenProvider.getCurrentToken());
+        PsiDishMenuDish update = new PsiDishMenuDish();
+        update.setId(info.getId());
+        update.setSalePrice(info.getSalePrice());
+        update.setUpdateById(userDto.getId());
+        update.setUpdateTime(new Date());
+        menuDishMapper.updateById(update);
+        return "价格保存成功";
+    }
+
+    public String deleteByIds(String ids) {
+        if (StringUtils.isBlank(ids)) {
+            return "请选择要删除的菜品";
+        }
+        menuDishMapper.deleteBatchIds(java.util.Arrays.asList(ids.split(",")));
+        return "删除成功";
+    }
+
+    public String updateMenu(List<String> dishIds) {
+        if (dishIds == null || dishIds.isEmpty()) {
+            return "请至少选择一道菜品";
+        }
+        PsiDishMenu currentMenu = getOrCreateCurrentMenu();
+        List<PsiDishMenuDish> currentDishList = menuDishMapper.selectList(new LambdaQueryWrapper<PsiDishMenuDish>()
+                .eq(PsiDishMenuDish::getMenuId, currentMenu.getId())
+                .eq(PsiDishMenuDish::getDelFlag, 0)
+                .and(w -> w.eq(PsiDishMenuDish::getIsHistory, "0").or().isNull(PsiDishMenuDish::getIsHistory)));
+
+        Map<String, PsiDishMenuDish> currentDishMap = new LinkedHashMap<>();
+        for (PsiDishMenuDish currentDish : currentDishList) {
+            currentDishMap.put(currentDish.getDishId(), currentDish);
+        }
+
+        List<PsiDishLibrary> selectedDishList = new ArrayList<>();
+        for (String dishId : new LinkedHashSet<>(dishIds)) {
+            if (StringUtils.isBlank(dishId)) {
+                continue;
+            }
+            PsiDishLibrary dish = dishLibraryMapper.queryById(dishId);
+            if (dish == null || (!"0".equals(dish.getStatus()) && !currentDishMap.containsKey(dishId))) {
+                continue;
+            }
+            selectedDishList.add(dish);
+        }
+        if (selectedDishList.isEmpty()) {
+            return "所选菜品不存在或已停用";
+        }
+
+        UserDTO userDto = SpringUtil.getBean(IUserApi.class).getByToken(TokenProvider.getCurrentToken());
+        Date now = new Date();
+        PsiDishMenu archiveMenu = new PsiDishMenu();
+        archiveMenu.setId(currentMenu.getId());
+        archiveMenu.setIsHistory("1");
+        archiveMenu.setHistoryTime(now);
+        archiveMenu.setUpdateById(userDto.getId());
+        archiveMenu.setUpdateTime(now);
+        psiDishMenuMapper.updateById(archiveMenu);
+
+        PsiDishMenu newCurrentMenu = new PsiDishMenu();
+        newCurrentMenu.setId(UUID.randomUUID().toString().replace("-", ""));
+        newCurrentMenu.setIsHistory("0");
+        newCurrentMenu.setCreateById(userDto.getId());
+        newCurrentMenu.setCreateTime(now);
+        newCurrentMenu.setUpdateById(userDto.getId());
+        newCurrentMenu.setUpdateTime(now);
+        newCurrentMenu.setDelFlag(0);
+        psiDishMenuMapper.insert(newCurrentMenu);
+
+        for (PsiDishMenuDish currentDish : currentDishList) {
+            PsiDishMenuDish archiveDish = new PsiDishMenuDish();
+            archiveDish.setId(currentDish.getId());
+            archiveDish.setIsHistory("1");
+            archiveDish.setHistoryTime(now);
+            archiveDish.setUpdateById(userDto.getId());
+            archiveDish.setUpdateTime(now);
+            menuDishMapper.updateById(archiveDish);
+        }
+
+        int sort = 0;
+        for (PsiDishLibrary selectedDish : selectedDishList) {
+            PsiDishMenuDish currentDish = currentDishMap.get(selectedDish.getId());
+            PsiDishMenuDish newCurrentDish = new PsiDishMenuDish();
+            newCurrentDish.setId(UUID.randomUUID().toString().replace("-", ""));
+            newCurrentDish.setMenuId(newCurrentMenu.getId());
+            newCurrentDish.setDishId(selectedDish.getId());
+            newCurrentDish.setSalePrice(currentDish == null
+                    ? (selectedDish.getSalePrice() == null ? BigDecimal.ZERO : selectedDish.getSalePrice())
+                    : currentDish.getSalePrice());
+            newCurrentDish.setSort(++sort);
+            newCurrentDish.setRemarks(currentDish == null ? null : currentDish.getRemarks());
+            newCurrentDish.setIsHistory("0");
+            newCurrentDish.setCreateById(userDto.getId());
+            newCurrentDish.setCreateTime(now);
+            newCurrentDish.setUpdateById(userDto.getId());
+            newCurrentDish.setUpdateTime(now);
+            newCurrentDish.setDelFlag(0);
+            menuDishMapper.insert(newCurrentDish);
+        }
+        return "菜单更新成功";
+    }
+
+    public PsiDishMenuDish findCurrentByDishId(String dishId) {
+        if (StringUtils.isBlank(dishId)) {
+            return null;
+        }
+        return menuDishMapper.findCurrentByDishId(dishId);
+    }
+
+    private PsiDishMenu getOrCreateCurrentMenu() {
+        PsiDishMenu menu = psiDishMenuMapper.selectOne(new LambdaQueryWrapper<PsiDishMenu>()
+                .eq(PsiDishMenu::getDelFlag, 0)
+                .and(w -> w.eq(PsiDishMenu::getIsHistory, "0").or().isNull(PsiDishMenu::getIsHistory))
+                .orderByDesc(PsiDishMenu::getCreateTime)
+                .last("limit 1"));
+        if (menu != null) {
+            return menu;
+        }
+        UserDTO userDto = SpringUtil.getBean(IUserApi.class).getByToken(TokenProvider.getCurrentToken());
+        Date now = new Date();
+        menu = new PsiDishMenu();
+        menu.setId(UUID.randomUUID().toString().replace("-", ""));
+        menu.setIsHistory("0");
+        menu.setCreateById(userDto.getId());
+        menu.setCreateTime(now);
+        menu.setUpdateById(userDto.getId());
+        menu.setUpdateTime(now);
+        menu.setDelFlag(0);
+        psiDishMenuMapper.insert(menu);
+        return menu;
+    }
+
+    private QueryWrapper<PsiDishMenuDish> buildMenuDishQuery(PsiDishMenuDish info) {
+        QueryWrapper<PsiDishMenuDish> wrapper = new QueryWrapper<>();
+        if (info == null) {
+            return wrapper;
+        }
+        if (StringUtils.isNotBlank(info.getDishName())) {
+            wrapper.like("dl.dish_name", info.getDishName());
+        }
+        if (StringUtils.isNotBlank(info.getTypeId())) {
+            wrapper.eq("dl.type_id", info.getTypeId());
+        }
+        if (StringUtils.isNotBlank(info.getStatus())) {
+            wrapper.eq("dl.status", info.getStatus());
+        }
+        return wrapper;
+    }
+
+    private boolean existsCurrentMenuDish(String menuId, String dishId) {
+        Integer count = menuDishMapper.selectCount(new LambdaQueryWrapper<PsiDishMenuDish>()
+                .eq(PsiDishMenuDish::getMenuId, menuId)
+                .eq(PsiDishMenuDish::getDishId, dishId)
+                .eq(PsiDishMenuDish::getDelFlag, 0)
+                .and(w -> w.eq(PsiDishMenuDish::getIsHistory, "0").or().isNull(PsiDishMenuDish::getIsHistory)));
+        return count != null && count > 0;
+    }
+}

+ 7 - 11
jeeplus-modules/jeeplus-psi-management/src/main/java/com/jeeplus/psimanage/dishManage/service/PsiDishOrderService.java

@@ -8,15 +8,14 @@ import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
 import com.jeeplus.common.TokenProvider;
 import com.jeeplus.flowable.feign.IFlowableApi;
 import com.jeeplus.psimanage.dishManage.domain.PsiDishLibrary;
+import com.jeeplus.psimanage.dishManage.domain.PsiDishMenuDish;
 import com.jeeplus.psimanage.dishManage.domain.PsiDishOrder;
 import com.jeeplus.psimanage.dishManage.domain.PsiDishOrderDetail;
 import com.jeeplus.psimanage.dishManage.domain.PsiDishRoom;
 import com.jeeplus.psimanage.dishManage.domain.PsiDishType;
-import com.jeeplus.psimanage.dishManage.mapper.PsiDishLibraryMapper;
 import com.jeeplus.psimanage.dishManage.mapper.PsiDishOrderDetailMapper;
 import com.jeeplus.psimanage.dishManage.mapper.PsiDishOrderMapper;
 import com.jeeplus.psimanage.dishManage.mapper.PsiDishRoomMapper;
-import com.jeeplus.psimanage.dishManage.mapper.PsiDishTypeMapper;
 import com.jeeplus.psimanage.dishManage.service.dto.PsiDishOrderExportDto;
 import com.jeeplus.sys.feign.IRoleApi;
 import com.jeeplus.sys.feign.IUserApi;
@@ -49,10 +48,7 @@ import java.util.concurrent.Executors;
 public class PsiDishOrderService extends ServiceImpl<PsiDishOrderMapper, PsiDishOrder> {
 
     @Resource
-    private PsiDishTypeMapper dishTypeMapper;
-
-    @Resource
-    private PsiDishLibraryMapper dishLibraryMapper;
+    private PsiDishMenuService dishMenuService;
 
     @Resource
     private PsiDishOrderMapper dishOrderMapper;
@@ -70,11 +66,11 @@ public class PsiDishOrderService extends ServiceImpl<PsiDishOrderMapper, PsiDish
 
 
     public List<PsiDishType> typeList() {
-        return dishTypeMapper.findOrderTypeList();
+        return dishMenuService.orderTypeList();
     }
 
     public List<PsiDishLibrary> dishList(String typeId, String dishName) {
-        return dishLibraryMapper.findOrderDishList(typeId, dishName);
+        return dishMenuService.orderDishList(typeId, dishName);
     }
 
     public IPage<PsiDishOrder> list(Page<PsiDishOrder> page, PsiDishOrder info) {
@@ -243,7 +239,7 @@ public class PsiDishOrderService extends ServiceImpl<PsiDishOrderMapper, PsiDish
             if (currentQuantity + item.getQuantity() < 0) {
                 return item.getDishName() + "减菜数量不能大于已点数量";
             }
-            PsiDishLibrary dish = dishLibraryMapper.queryById(item.getDishId());
+            PsiDishMenuDish dish = dishMenuService.findCurrentByDishId(item.getDishId());
             if (dish == null || !"0".equals(dish.getStatus())) {
                 return "菜品不存在或已停用";
             }
@@ -318,13 +314,13 @@ public class PsiDishOrderService extends ServiceImpl<PsiDishOrderMapper, PsiDish
         return order;
     }
 
-    private PsiDishOrderDetail buildDetail(PsiDishOrder order, PsiDishLibrary dish, Integer quantity, String isAddDish, Integer dishSort, UserDTO userDto, Date now) {
+    private PsiDishOrderDetail buildDetail(PsiDishOrder order, PsiDishMenuDish dish, Integer quantity, String isAddDish, Integer dishSort, UserDTO userDto, Date now) {
         BigDecimal salePrice = dish.getSalePrice() == null ? BigDecimal.ZERO : dish.getSalePrice();
         PsiDishOrderDetail detail = new PsiDishOrderDetail();
         detail.setId(UUID.randomUUID().toString().replace("-", ""));
         detail.setOrderId(order.getId());
         detail.setRoomId(order.getRoomId());
-        detail.setDishId(dish.getId());
+        detail.setDishId(dish.getDishId());
         detail.setDishCode(dish.getDishCode());
         detail.setDishName(dish.getDishName());
         detail.setTypeId(dish.getTypeId());