Browse Source

景聚庭-点餐代码提交

huangguoce 8 hours ago
parent
commit
9ad19d1a34
31 changed files with 2637 additions and 2 deletions
  1. 3 0
      jeeplus-modules/jeeplus-flowable/src/main/java/com/jeeplus/flowable/controller/FlowableTaskController.java
  2. 3 2
      jeeplus-modules/jeeplus-flowable/src/main/java/com/jeeplus/flowable/service/FlowTaskService.java
  3. 69 0
      jeeplus-modules/jeeplus-psi-management/src/main/java/com/jeeplus/psimanage/dishManage/controller/PsiCreditCustomerController.java
  4. 69 0
      jeeplus-modules/jeeplus-psi-management/src/main/java/com/jeeplus/psimanage/dishManage/controller/PsiDishLibraryController.java
  5. 207 0
      jeeplus-modules/jeeplus-psi-management/src/main/java/com/jeeplus/psimanage/dishManage/controller/PsiDishOrderController.java
  6. 64 0
      jeeplus-modules/jeeplus-psi-management/src/main/java/com/jeeplus/psimanage/dishManage/controller/PsiDishRoomController.java
  7. 73 0
      jeeplus-modules/jeeplus-psi-management/src/main/java/com/jeeplus/psimanage/dishManage/controller/PsiDishTypeController.java
  8. 76 0
      jeeplus-modules/jeeplus-psi-management/src/main/java/com/jeeplus/psimanage/dishManage/domain/PsiCreditCustomer.java
  9. 88 0
      jeeplus-modules/jeeplus-psi-management/src/main/java/com/jeeplus/psimanage/dishManage/domain/PsiDishLibrary.java
  10. 71 0
      jeeplus-modules/jeeplus-psi-management/src/main/java/com/jeeplus/psimanage/dishManage/domain/PsiDishOrder.java
  11. 57 0
      jeeplus-modules/jeeplus-psi-management/src/main/java/com/jeeplus/psimanage/dishManage/domain/PsiDishOrderDetail.java
  12. 61 0
      jeeplus-modules/jeeplus-psi-management/src/main/java/com/jeeplus/psimanage/dishManage/domain/PsiDishRoom.java
  13. 82 0
      jeeplus-modules/jeeplus-psi-management/src/main/java/com/jeeplus/psimanage/dishManage/domain/PsiDishType.java
  14. 20 0
      jeeplus-modules/jeeplus-psi-management/src/main/java/com/jeeplus/psimanage/dishManage/mapper/PsiCreditCustomerMapper.java
  15. 29 0
      jeeplus-modules/jeeplus-psi-management/src/main/java/com/jeeplus/psimanage/dishManage/mapper/PsiDishLibraryMapper.java
  16. 23 0
      jeeplus-modules/jeeplus-psi-management/src/main/java/com/jeeplus/psimanage/dishManage/mapper/PsiDishOrderDetailMapper.java
  17. 19 0
      jeeplus-modules/jeeplus-psi-management/src/main/java/com/jeeplus/psimanage/dishManage/mapper/PsiDishOrderMapper.java
  18. 25 0
      jeeplus-modules/jeeplus-psi-management/src/main/java/com/jeeplus/psimanage/dishManage/mapper/PsiDishRoomMapper.java
  19. 30 0
      jeeplus-modules/jeeplus-psi-management/src/main/java/com/jeeplus/psimanage/dishManage/mapper/PsiDishTypeMapper.java
  20. 73 0
      jeeplus-modules/jeeplus-psi-management/src/main/java/com/jeeplus/psimanage/dishManage/mapper/xml/PsiCreditCustomerMapper.xml
  21. 118 0
      jeeplus-modules/jeeplus-psi-management/src/main/java/com/jeeplus/psimanage/dishManage/mapper/xml/PsiDishLibraryMapper.xml
  22. 130 0
      jeeplus-modules/jeeplus-psi-management/src/main/java/com/jeeplus/psimanage/dishManage/mapper/xml/PsiDishOrderDetailMapper.xml
  23. 68 0
      jeeplus-modules/jeeplus-psi-management/src/main/java/com/jeeplus/psimanage/dishManage/mapper/xml/PsiDishOrderMapper.xml
  24. 83 0
      jeeplus-modules/jeeplus-psi-management/src/main/java/com/jeeplus/psimanage/dishManage/mapper/xml/PsiDishRoomMapper.xml
  25. 77 0
      jeeplus-modules/jeeplus-psi-management/src/main/java/com/jeeplus/psimanage/dishManage/mapper/xml/PsiDishTypeMapper.xml
  26. 111 0
      jeeplus-modules/jeeplus-psi-management/src/main/java/com/jeeplus/psimanage/dishManage/service/PsiCreditCustomerService.java
  27. 122 0
      jeeplus-modules/jeeplus-psi-management/src/main/java/com/jeeplus/psimanage/dishManage/service/PsiDishLibraryService.java
  28. 461 0
      jeeplus-modules/jeeplus-psi-management/src/main/java/com/jeeplus/psimanage/dishManage/service/PsiDishOrderService.java
  29. 107 0
      jeeplus-modules/jeeplus-psi-management/src/main/java/com/jeeplus/psimanage/dishManage/service/PsiDishRoomService.java
  30. 167 0
      jeeplus-modules/jeeplus-psi-management/src/main/java/com/jeeplus/psimanage/dishManage/service/PsiDishTypeService.java
  31. 51 0
      jeeplus-modules/jeeplus-psi-management/src/main/java/com/jeeplus/psimanage/dishManage/service/dto/PsiDishOrderExportDto.java

+ 3 - 0
jeeplus-modules/jeeplus-flowable/src/main/java/com/jeeplus/flowable/controller/FlowableTaskController.java

@@ -508,6 +508,9 @@ public class FlowableTaskController {
             } else if (key.equals("员工信息审批")) {
                 String procInsId = getProcInsId(entry);
                 map1.put("员工信息审批", procInsId);
+            }else if (key.equals("折扣结账")) {
+                String procInsId = getProcInsId(entry);
+                map1.put("折扣结账", procInsId);
             }
         }
         return map1;

+ 3 - 2
jeeplus-modules/jeeplus-flowable/src/main/java/com/jeeplus/flowable/service/FlowTaskService.java

@@ -454,7 +454,8 @@ public class FlowTaskService {
                 processName.equals("进销存-采购申请")||
                 processName.equals("进销存-入库修改")||
                 processName.equals("进销存-报损申请")||
-                processName.equals("进销存-领用申请");
+                processName.equals("进销存-领用申请")||
+                processName.equals("景聚庭-折扣结账");
     }
 
     /**
@@ -699,7 +700,7 @@ public class FlowTaskService {
         if (StringUtils.isNotBlank(type)) {
             if (type.equals("ydd")) {
                 // 创建一个包含需要保留的流程定义名称的集合
-                List<String> requiredNames = Arrays.asList("物资管理-领用申请", "物资管理-采购申请", "日常办公-请假申请", "离职申请", "离职交接申请", "会计-报销审批", "会计-报销审批-电子发票", "会计-发票申请", "报销申请","发票申请","会议室预约","进销存-领用申请");
+                List<String> requiredNames = Arrays.asList("物资管理-领用申请", "物资管理-采购申请", "日常办公-请假申请", "离职申请", "离职交接申请", "会计-报销审批", "会计-报销审批-电子发票", "会计-发票申请", "报销申请","发票申请","会议室预约","进销存-领用申请","景聚庭-折扣结账");
                 /**
                  * 移动端工作台数据处理
                  */

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

@@ -0,0 +1,69 @@
+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.PsiCreditCustomer;
+import com.jeeplus.psimanage.dishManage.service.PsiCreditCustomerService;
+import io.swagger.annotations.Api;
+import io.swagger.annotations.ApiOperation;
+import org.springframework.http.ResponseEntity;
+import org.springframework.security.access.prepost.PreAuthorize;
+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;
+
+/**
+ * 挂账人信息登记
+ */
+@RestController
+@Api(tags = "挂账人信息登记")
+@RequestMapping(value = "/psi/creditCustomer")
+public class PsiCreditCustomerController {
+
+    @Resource
+    private PsiCreditCustomerService service;
+
+    @ApiOperation(value = "列表查询")
+    @GetMapping("/list")
+    public ResponseEntity<IPage<PsiCreditCustomer>> list(Page<PsiCreditCustomer> page, PsiCreditCustomer info) {
+        return ResponseEntity.ok(service.list(page, info));
+    }
+
+    @ApiOperation(value = "查询详情")
+    @GetMapping("/findById")
+    public ResponseEntity<PsiCreditCustomer> findById(@RequestParam String id) {
+        return ResponseEntity.ok(service.findById(id));
+    }
+
+    @ApiLog(value = "保存挂账人", type = LogTypeEnum.SAVE)
+    @ApiOperation(value = "新增/修改")
+    @PreAuthorize("hasAnyAuthority('psi:creditCustomer:add','psi:creditCustomer:edit')")
+    @PostMapping("/save")
+    public ResponseEntity<String> save(@RequestBody PsiCreditCustomer info) {
+        return ResponseEntity.ok(service.saveCreditCustomer(info));
+    }
+
+    @ApiLog(value = "删除挂账人", type = LogTypeEnum.SAVE)
+    @ApiOperation(value = "删除")
+    @PreAuthorize("hasAuthority('psi:creditCustomer:del')")
+    @DeleteMapping("/delete")
+    public ResponseEntity<String> delete(@RequestParam String ids) {
+        return ResponseEntity.ok(service.deleteByIds(ids));
+    }
+
+    @ApiLog(value = "修改挂账状态", type = LogTypeEnum.SAVE)
+    @ApiOperation(value = "修改挂账状态")
+    @PreAuthorize("hasAuthority('psi:creditCustomer:edit')")
+    @GetMapping("/changeStatus")
+    public ResponseEntity<String> changeStatus(@RequestParam String id, @RequestParam String creditStatus) {
+        return ResponseEntity.ok(service.changeStatus(id, creditStatus));
+    }
+}

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

@@ -0,0 +1,69 @@
+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.service.PsiDishLibraryService;
+import io.swagger.annotations.Api;
+import io.swagger.annotations.ApiOperation;
+import org.springframework.http.ResponseEntity;
+import org.springframework.security.access.prepost.PreAuthorize;
+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;
+
+/**
+ * 菜品库管理
+ */
+@RestController
+@Api(tags = "菜品库管理")
+@RequestMapping(value = "/psi/dish")
+public class PsiDishLibraryController {
+
+    @Resource
+    private PsiDishLibraryService service;
+
+    @ApiOperation(value = "列表查询")
+    @GetMapping("/list")
+    public ResponseEntity<IPage<PsiDishLibrary>> list(Page<PsiDishLibrary> page, PsiDishLibrary info) {
+        return ResponseEntity.ok(service.list(page, info));
+    }
+
+    @ApiLog(value = "保存菜品", type = LogTypeEnum.SAVE)
+    @ApiOperation(value = "新增/修改")
+    @PreAuthorize("hasAnyAuthority('psi:dish:add','psi:dish:edit')")
+    @PostMapping("/save")
+    public ResponseEntity<String> save(@RequestBody PsiDishLibrary info) {
+        return ResponseEntity.ok(service.saveDish(info));
+    }
+
+    @ApiOperation(value = "查询详情")
+    @GetMapping("/findById")
+    public ResponseEntity<PsiDishLibrary> findById(@RequestParam String id) {
+        return ResponseEntity.ok(service.findById(id));
+    }
+
+    @ApiLog(value = "删除菜品", type = LogTypeEnum.SAVE)
+    @ApiOperation(value = "删除")
+    @PreAuthorize("hasAuthority('psi:dish:del')")
+    @DeleteMapping("/delete")
+    public ResponseEntity<String> delete(@RequestParam String ids) {
+        return ResponseEntity.ok(service.deleteByIds(ids));
+    }
+
+    @ApiLog(value = "修改菜品状态", type = LogTypeEnum.SAVE)
+    @ApiOperation(value = "启用/停用")
+    @PreAuthorize("hasAuthority('psi:dish:edit')")
+    @GetMapping("/changeStatus")
+    public ResponseEntity<String> changeStatus(@RequestParam String id, @RequestParam String status) {
+        return ResponseEntity.ok(service.changeStatus(id, status));
+    }
+}

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

@@ -0,0 +1,207 @@
+package com.jeeplus.psimanage.dishManage.controller;
+
+import com.alibaba.excel.EasyExcel;
+import com.alibaba.excel.write.builder.ExcelWriterBuilder;
+import com.alibaba.excel.write.handler.SheetWriteHandler;
+import com.alibaba.excel.write.handler.context.SheetWriteHandlerContext;
+import com.alibaba.excel.write.metadata.holder.WriteSheetHolder;
+import com.alibaba.excel.write.metadata.style.WriteCellStyle;
+import com.alibaba.excel.write.metadata.style.WriteFont;
+import com.alibaba.excel.write.style.HorizontalCellStyleStrategy;
+import com.alibaba.excel.write.style.column.LongestMatchColumnWidthStyleStrategy;
+import com.baomidou.mybatisplus.core.metadata.IPage;
+import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
+import com.jeeplus.common.excel.ExcelOptions;
+import com.jeeplus.common.excel.annotation.ExportMode;
+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.PsiDishOrder;
+import com.jeeplus.psimanage.dishManage.domain.PsiDishType;
+import com.jeeplus.psimanage.dishManage.service.PsiDishOrderService;
+import com.jeeplus.psimanage.dishManage.service.dto.PsiDishOrderExportDto;
+import io.swagger.annotations.Api;
+import io.swagger.annotations.ApiOperation;
+import org.springframework.http.ResponseEntity;
+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 javax.servlet.http.HttpServletResponse;
+import java.net.URLEncoder;
+import java.util.Collection;
+import java.util.List;
+import java.util.stream.Collectors;
+
+import org.apache.poi.ss.usermodel.Cell;
+import org.apache.poi.ss.usermodel.CellStyle;
+import org.apache.poi.ss.usermodel.Font;
+import org.apache.poi.ss.usermodel.HorizontalAlignment;
+import org.apache.poi.ss.usermodel.Row;
+import org.apache.poi.ss.usermodel.Sheet;
+import org.apache.poi.ss.usermodel.VerticalAlignment;
+import org.apache.poi.ss.usermodel.Workbook;
+import org.apache.poi.ss.util.CellRangeAddress;
+
+/**
+ * 点菜页面
+ */
+@RestController
+@Api(tags = "点菜页面")
+@RequestMapping(value = "/psi/dishOrder")
+public class PsiDishOrderController {
+
+    private static final String EXPORT_TITLE = "景聚庭订单导出";
+    private static final int EXPORT_COLUMN_COUNT = 13;
+
+    @Resource
+    private PsiDishOrderService service;
+
+    @ApiOperation(value = "查询有菜品的分类")
+    @GetMapping("/typeList")
+    public ResponseEntity<List<PsiDishType>> typeList() {
+        return ResponseEntity.ok(service.typeList());
+    }
+
+    @ApiOperation(value = "查询菜品")
+    @GetMapping("/dishList")
+    public ResponseEntity<List<PsiDishLibrary>> dishList(@RequestParam(required = false) String typeId,
+                                                         @RequestParam(required = false) String dishName) {
+        return ResponseEntity.ok(service.dishList(typeId, dishName));
+    }
+
+    @ApiOperation(value = "订单列表")
+    @GetMapping("/orderList")
+    public ResponseEntity<IPage<PsiDishOrder>> orderList(Page<PsiDishOrder> page, PsiDishOrder info) {
+        return ResponseEntity.ok(service.list(page, info));
+    }
+
+    @ApiLog(value = "导出订单数据", type = LogTypeEnum.EXPORT)
+    @ApiOperation(value = "导出订单数据")
+    @GetMapping("/exportFile")
+    public void exportFile(Page<PsiDishOrder> page, PsiDishOrder info, ExcelOptions options, HttpServletResponse response) throws Exception {
+        String fileName = options.getFilename();
+        String sheetName = options.getSheetName();
+        List<PsiDishOrderExportDto> result;
+        if (ExportMode.current.equals(options.getMode())) {
+            result = service.exportRecordList(page, info);
+        } else if (ExportMode.selected.equals(options.getMode())) {
+            result = service.exportRecordList(page, info).stream().filter(item ->
+                    options.getSelectIds().contains(item.getId())
+            ).collect(Collectors.toList());
+        } else {
+            page.setSize(-1);
+            page.setCurrent(0);
+            result = service.exportRecordList(page, info);
+        }
+        List<String> exportFields = options.getExportFields();
+        exportDishOrderExcel(result, sheetName, fileName,
+                exportFields == null || exportFields.isEmpty() ? null : exportFields, response);
+    }
+
+    private void exportDishOrderExcel(List<PsiDishOrderExportDto> result, String sheetName, String fileName,
+                                      Collection<String> exportFields, HttpServletResponse response) throws Exception {
+        response.setContentType("application/vnd.openxmlformats-officedocument.spreadsheetml.sheet");
+        response.setCharacterEncoding("utf-8");
+        String encodedFileName = URLEncoder.encode(fileName, "UTF-8").replaceAll("\\+", "%20");
+        response.setHeader("Content-disposition", "attachment;filename*=utf-8''" + encodedFileName + ".xlsx");
+
+        int columnCount = exportFields == null ? EXPORT_COLUMN_COUNT : exportFields.size();
+        ExcelWriterBuilder writerBuilder = EasyExcel.write(response.getOutputStream(), PsiDishOrderExportDto.class)
+                .registerWriteHandler(new LongestMatchColumnWidthStyleStrategy())
+                .relativeHeadRowIndex(1)
+                .registerWriteHandler(new HorizontalCellStyleStrategy(buildPlainHeadStyle(), buildPlainContentStyle()))
+                .registerWriteHandler(new DishOrderExportSheetWriteHandler(EXPORT_TITLE, Math.max(columnCount, 1)));
+        if (exportFields != null) {
+            writerBuilder.includeColumnFieldNames(exportFields);
+        }
+        writerBuilder.sheet(sheetName).doWrite(result);
+    }
+
+    private WriteCellStyle buildPlainHeadStyle() {
+        WriteCellStyle headStyle = new WriteCellStyle();
+        headStyle.setHorizontalAlignment(HorizontalAlignment.CENTER);
+        headStyle.setVerticalAlignment(VerticalAlignment.CENTER);
+        WriteFont headFont = new WriteFont();
+        headFont.setBold(false);
+        headStyle.setWriteFont(headFont);
+        return headStyle;
+    }
+
+    private WriteCellStyle buildPlainContentStyle() {
+        WriteCellStyle contentStyle = new WriteCellStyle();
+        contentStyle.setHorizontalAlignment(HorizontalAlignment.CENTER);
+        contentStyle.setVerticalAlignment(VerticalAlignment.CENTER);
+        return contentStyle;
+    }
+
+    private static class DishOrderExportSheetWriteHandler implements SheetWriteHandler {
+
+        private final String title;
+        private final int columnCount;
+
+        DishOrderExportSheetWriteHandler(String title, int columnCount) {
+            this.title = title;
+            this.columnCount = columnCount;
+        }
+
+        @Override
+        public void beforeSheetCreate(SheetWriteHandlerContext context) {
+        }
+
+        @Override
+        public void afterSheetCreate(SheetWriteHandlerContext context) {
+            WriteSheetHolder sheetHolder = context.getWriteSheetHolder();
+            Sheet sheet = sheetHolder.getSheet();
+            Workbook workbook = sheet.getWorkbook();
+            Row titleRow = sheet.createRow(0);
+            titleRow.setHeightInPoints(30F);
+            Cell titleCell = titleRow.createCell(0);
+            titleCell.setCellValue(title);
+            titleCell.setCellStyle(createTitleStyle(workbook));
+            if (columnCount > 1) {
+                sheet.addMergedRegionUnsafe(new CellRangeAddress(0, 0, 0, columnCount - 1));
+            }
+            sheet.createFreezePane(0, 2);
+        }
+
+        private CellStyle createTitleStyle(Workbook workbook) {
+            CellStyle titleStyle = workbook.createCellStyle();
+            titleStyle.setAlignment(HorizontalAlignment.CENTER);
+            titleStyle.setVerticalAlignment(VerticalAlignment.CENTER);
+            Font titleFont = workbook.createFont();
+            titleFont.setBold(true);
+            titleFont.setFontHeightInPoints((short) 16);
+            titleStyle.setFont(titleFont);
+            return titleStyle;
+        }
+    }
+
+    @ApiOperation(value = "订单详情")
+    @GetMapping("/findOrderById")
+    public ResponseEntity<PsiDishOrder> findOrderById(@RequestParam String id) {
+        return ResponseEntity.ok(service.findOrderById(id));
+    }
+
+    @ApiOperation(value = "查询当前包房订单")
+    @GetMapping("/currentOrder")
+    public ResponseEntity<PsiDishOrder> currentOrder(@RequestParam String roomId) {
+        return ResponseEntity.ok(service.currentOrder(roomId));
+    }
+
+    @ApiOperation(value = "取消订单")
+    @GetMapping("/cancelOrder")
+    public ResponseEntity<String> cancelOrder(@RequestParam String id) {
+        return ResponseEntity.ok(service.cancelOrder(id));
+    }
+
+    @ApiOperation(value = "下单")
+    @PostMapping("/submit")
+    public ResponseEntity<String> submit(@RequestBody PsiDishOrder info) {
+        return ResponseEntity.ok(service.submitOrder(info));
+    }
+}

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

@@ -0,0 +1,64 @@
+package com.jeeplus.psimanage.dishManage.controller;
+
+import com.jeeplus.logging.annotation.ApiLog;
+import com.jeeplus.logging.constant.enums.LogTypeEnum;
+import com.jeeplus.psimanage.dishManage.domain.PsiDishRoom;
+import com.jeeplus.psimanage.dishManage.service.PsiDishRoomService;
+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/dishRoom")
+public class PsiDishRoomController {
+
+    @Resource
+    private PsiDishRoomService service;
+
+    @ApiOperation(value = "列表查询")
+    @GetMapping("/list")
+    public ResponseEntity<List<PsiDishRoom>> list(PsiDishRoom info) {
+        return ResponseEntity.ok(service.list(info));
+    }
+
+    @ApiOperation(value = "查询详情")
+    @GetMapping("/findById")
+    public ResponseEntity<PsiDishRoom> findById(@RequestParam String id) {
+        return ResponseEntity.ok(service.findById(id));
+    }
+
+    @ApiLog(value = "保存包房", type = LogTypeEnum.SAVE)
+    @ApiOperation(value = "新增/修改")
+    @PostMapping("/save")
+    public ResponseEntity<String> save(@RequestBody PsiDishRoom info) {
+        return ResponseEntity.ok(service.saveRoom(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 = "启用/停用")
+    @GetMapping("/changeStatus")
+    public ResponseEntity<String> changeStatus(@RequestParam String id, @RequestParam String status) {
+        return service.changeStatus(id, status);
+    }
+}

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

@@ -0,0 +1,73 @@
+package com.jeeplus.psimanage.dishManage.controller;
+
+import com.jeeplus.logging.annotation.ApiLog;
+import com.jeeplus.logging.constant.enums.LogTypeEnum;
+import com.jeeplus.psimanage.dishManage.domain.PsiDishType;
+import com.jeeplus.psimanage.dishManage.service.PsiDishTypeService;
+import io.swagger.annotations.Api;
+import io.swagger.annotations.ApiOperation;
+import org.springframework.http.ResponseEntity;
+import org.springframework.security.access.prepost.PreAuthorize;
+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/dishType")
+public class PsiDishTypeController {
+
+    @Resource
+    private PsiDishTypeService service;
+
+    @ApiOperation(value = "列表查询")
+    @GetMapping("/list")
+    public ResponseEntity<List<PsiDishType>> list(PsiDishType info) {
+        return ResponseEntity.ok(service.list(info));
+    }
+
+    @ApiOperation(value = "分类树")
+    @GetMapping("/treeData")
+    public ResponseEntity<List<PsiDishType>> treeData(@RequestParam(required = false) String extId) {
+        return ResponseEntity.ok(service.treeData(extId));
+    }
+
+    @ApiLog(value = "保存菜品分类", type = LogTypeEnum.SAVE)
+    @ApiOperation(value = "新增/修改")
+    @PreAuthorize("hasAnyAuthority('psi:dishType:add','psi:dishType:edit')")
+    @PostMapping("/save")
+    public ResponseEntity<String> save(@RequestBody PsiDishType info) {
+        return ResponseEntity.ok(service.saveDishType(info));
+    }
+
+    @ApiOperation(value = "根据id查询")
+    @GetMapping("/findById")
+    public ResponseEntity<PsiDishType> findById(String id) {
+        return ResponseEntity.ok(service.findById(id));
+    }
+
+    @ApiLog(value = "删除菜品分类", type = LogTypeEnum.SAVE)
+    @ApiOperation(value = "根据id删除")
+    @PreAuthorize("hasAuthority('psi:dishType:del')")
+    @GetMapping("/deleteById")
+    public ResponseEntity<String> deleteById(String id) {
+        return ResponseEntity.ok(service.remove(id));
+    }
+
+    @ApiLog(value = "修改菜品分类状态", type = LogTypeEnum.SAVE)
+    @ApiOperation(value = "启用/停用")
+    @PreAuthorize("hasAuthority('psi:dishType:edit')")
+    @GetMapping("/changeStatus")
+    public ResponseEntity<String> changeStatus(@RequestParam String id, @RequestParam String status) {
+        return ResponseEntity.ok(service.changeStatus(id, status));
+    }
+}

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

@@ -0,0 +1,76 @@
+package com.jeeplus.psimanage.dishManage.domain;
+
+import com.fasterxml.jackson.annotation.JsonFormat;
+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_credit_customer")
+public class PsiCreditCustomer extends BaseEntity {
+
+    private static final long serialVersionUID = 1L;
+
+    private String customerName;
+
+    private String mobile;
+
+    @JsonFormat(pattern = "yyyy-MM-dd", timezone = "GMT+8")
+    private Date birthday;
+
+    private String idCard;
+
+    private Integer age;
+
+    private String occupation;
+
+    private String companyName;
+
+    private String address;
+
+    private String emergencyContact;
+
+    private String emergencyContactPhone;
+
+    private String invoiceTitle;
+
+    private String taxNo;
+
+    private String bankName;
+
+    private String bankAccount;
+
+    private String invoiceAddressPhone;
+
+    /**
+     * 挂账状态:1正常挂账,2暂停挂账,3黑名单
+     */
+    private String creditStatus;
+
+    private BigDecimal totalArrearsAmount;
+
+    private Integer unsettledBillCount;
+
+    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8")
+    private Date firstCreditTime;
+
+    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8")
+    private Date lastConsumeTime;
+
+    private String auditorId;
+
+    private String remarks;
+
+    @TableField(exist = false)
+    private String createName;
+
+    @TableField(exist = false)
+    private String auditorName;
+}

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

@@ -0,0 +1,88 @@
+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 com.jeeplus.core.query.Query;
+import com.jeeplus.core.query.QueryType;
+import lombok.Data;
+
+import java.math.BigDecimal;
+
+/**
+ * 菜品库
+ */
+@Data
+@TableName("psi_dish_library")
+public class PsiDishLibrary extends BaseEntity {
+
+    private static final long serialVersionUID = 1L;
+
+    /**
+     * 菜品编码
+     */
+    @Query(tableColumn = "a.dish_code", type = QueryType.LIKE)
+    private String dishCode;
+
+    /**
+     * 菜品名称
+     */
+    @Query(tableColumn = "a.dish_name", type = QueryType.LIKE)
+    private String dishName;
+
+    /**
+     * 分类ID
+     */
+    private String typeId;
+
+    /**
+     * 菜品图片
+     */
+    private String imageUrl;
+
+    /**
+     * 单位
+     */
+    private String unit;
+
+    /**
+     * 规格
+     */
+    private String spec;
+
+    /**
+     * 销售价
+     */
+    private BigDecimal salePrice;
+
+    /**
+     * 参考成本价
+     */
+    private BigDecimal costPrice;
+
+    /**
+     * 口味
+     */
+    private String taste;
+
+    /**
+     * 状态:0启用,1停用
+     */
+    private String status;
+
+    /**
+     * 排序
+     */
+    private Integer sort;
+
+    /**
+     * 备注
+     */
+    private String remarks;
+
+    @TableField(exist = false)
+    private String typeName;
+
+    @TableField(exist = false)
+    private String createName;
+}

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

@@ -0,0 +1,71 @@
+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;
+import java.util.List;
+
+/**
+ * 点菜订单
+ */
+@Data
+@TableName("psi_dish_order")
+public class PsiDishOrder extends BaseEntity {
+
+    private static final long serialVersionUID = 1L;
+
+    private String orderNo;
+
+    private String roomId;
+
+    private String roomNo;
+
+    private String roomName;
+
+    /**
+     * 订单状态:0用餐中,1已结账,2已取消
+     */
+    private String orderStatus;
+
+    private BigDecimal totalAmount;
+
+    /**
+     * 结账方式:0结账,1折扣结账,2优惠结账
+     */
+    private String settleType;
+
+    private BigDecimal discountRate;
+
+    private BigDecimal discountAmount;
+
+    private BigDecimal payableAmount;
+
+    private Date settleTime;
+
+    private String remarks;
+
+    @TableField(exist = false)
+    private String[] createTimes;
+
+    @TableField(exist = false)
+    private String[] settleTimes;
+
+    @TableField(exist = false)
+    private String createName;
+
+    @TableField(exist = false)
+    private String settleFlag;
+
+    @TableField(exist = false)
+    private List<PsiDishOrderDetail> detailList;
+
+    @TableField(exist = false)
+    private List<PsiDishOrderDetail> addDishList;
+
+    @TableField(exist = false)
+    private List<PsiDishOrderDetail> reduceDishList;
+}

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

@@ -0,0 +1,57 @@
+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;
+
+/**
+ * 点菜订单明细
+ */
+@Data
+@TableName("psi_dish_order_detail")
+public class PsiDishOrderDetail extends BaseEntity {
+
+    private static final long serialVersionUID = 1L;
+
+    private String orderId;
+
+    private String roomId;
+
+    private String dishId;
+
+    private String dishCode;
+
+    private String dishName;
+
+    private String typeId;
+
+    private String typeName;
+
+    private String unit;
+
+    private String spec;
+
+    private BigDecimal salePrice;
+
+    /**
+     * 数量,减菜时允许为负数
+     */
+    private Integer quantity;
+
+    private BigDecimal amount;
+
+    private Integer dishSort;
+
+    /**
+     * 是否加菜:0否,1是
+     */
+    private String isAddDish;
+
+    private String remarks;
+
+    @TableField(exist = false)
+    private Integer currentQuantity;
+}

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

@@ -0,0 +1,61 @@
+package com.jeeplus.psimanage.dishManage.domain;
+
+import com.baomidou.mybatisplus.annotation.TableName;
+import com.jeeplus.core.domain.BaseEntity;
+import com.jeeplus.core.query.Query;
+import com.jeeplus.core.query.QueryType;
+import lombok.Data;
+
+import java.math.BigDecimal;
+
+/**
+ * 包房管理
+ */
+@Data
+@TableName("psi_dish_room")
+public class PsiDishRoom extends BaseEntity {
+
+    private static final long serialVersionUID = 1L;
+
+    /**
+     * 包房编号
+     */
+    @Query(tableColumn = "room_no", type = QueryType.LIKE)
+    private String roomNo;
+
+    /**
+     * 包房名称
+     */
+    @Query(tableColumn = "room_name", type = QueryType.LIKE)
+    private String roomName;
+
+    /**
+     * 容纳人数
+     */
+    private Integer capacity;
+
+    /**
+     * 最低消费
+     */
+    private BigDecimal minConsumption;
+
+    /**
+     * 状态:0启用,1停用
+     */
+    private String status;
+
+    /**
+     * 状态:0空闲中,1使用中
+     */
+    private String useStatus;
+
+    /**
+     * 排序
+     */
+    private Integer sort;
+
+    /**
+     * 备注
+     */
+    private String remarks;
+}

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

@@ -0,0 +1,82 @@
+package com.jeeplus.psimanage.dishManage.domain;
+
+import com.baomidou.mybatisplus.annotation.FieldFill;
+import com.baomidou.mybatisplus.annotation.TableField;
+import com.baomidou.mybatisplus.annotation.TableId;
+import com.baomidou.mybatisplus.annotation.TableLogic;
+import com.baomidou.mybatisplus.annotation.TableName;
+import com.jeeplus.core.domain.TreeEntity;
+import com.jeeplus.core.query.Query;
+import lombok.Data;
+
+import java.util.Date;
+
+/**
+ * 菜品分类
+ */
+@Data
+@TableName("psi_dish_type")
+public class PsiDishType extends TreeEntity<PsiDishType> {
+
+    private static final long serialVersionUID = 1L;
+
+    @TableId
+    private String id;
+
+    @TableField(exist = false)
+    private Date createDate;
+
+    @Query
+    @TableField(exist = false)
+    private String createBy;
+
+    @TableField(exist = false)
+    private Date updateDate;
+
+    @TableField(exist = false)
+    private String updateBy;
+
+    @TableLogic
+    @TableField(fill = FieldFill.INSERT)
+    private Integer delFlag;
+
+    /**
+     * 分类名称
+     */
+    @Query
+    private String name;
+
+    /**
+     * 父级ID
+     */
+    private String parentId;
+
+    /**
+     * 父级链路
+     */
+    private String parentIds;
+
+    /**
+     * 层级
+     */
+    private String level;
+
+    /**
+     * 排序
+     */
+    @Query
+    private Integer sort;
+
+    /**
+     * 状态:0启用,1停用
+     */
+    private String status;
+
+    /**
+     * 备注
+     */
+    private String remarks;
+
+    @TableField(exist = false)
+    private Boolean disabled = false;
+}

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

@@ -0,0 +1,20 @@
+package com.jeeplus.psimanage.dishManage.mapper;
+
+import com.baomidou.mybatisplus.core.conditions.Wrapper;
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+import com.baomidou.mybatisplus.core.metadata.IPage;
+import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
+import com.jeeplus.psimanage.dishManage.domain.PsiCreditCustomer;
+import org.apache.ibatis.annotations.Param;
+
+/**
+ * 挂账人信息登记
+ */
+public interface PsiCreditCustomerMapper extends BaseMapper<PsiCreditCustomer> {
+
+    IPage<PsiCreditCustomer> findList(Page<PsiCreditCustomer> page, @Param("ew") Wrapper<PsiCreditCustomer> wrapper);
+
+    PsiCreditCustomer queryById(@Param("id") String id);
+
+    Integer checkMobileIsExist(@Param("mobile") String mobile, @Param("id") String id);
+}

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

@@ -0,0 +1,29 @@
+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 org.apache.ibatis.annotations.Param;
+
+import java.util.List;
+
+/**
+ * 菜品库
+ */
+public interface PsiDishLibraryMapper extends BaseMapper<PsiDishLibrary> {
+
+    IPage<PsiDishLibrary> findList(Page<PsiDishLibrary> page, @Param(Constants.WRAPPER) QueryWrapper<PsiDishLibrary> queryWrapper);
+
+    PsiDishLibrary queryById(@Param("id") String id);
+
+    Integer checkCodeIsExist(@Param("dishCode") String dishCode, @Param("id") String id);
+
+    Integer checkNameIsExist(@Param("dishName") String dishName, @Param("typeId") String typeId, @Param("id") String id);
+
+    Integer countByTypeId(@Param("typeId") String typeId);
+
+    List<PsiDishLibrary> findOrderDishList(@Param("typeId") String typeId, @Param("dishName") String dishName);
+}

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

@@ -0,0 +1,23 @@
+package com.jeeplus.psimanage.dishManage.mapper;
+
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+import com.jeeplus.psimanage.dishManage.domain.PsiDishOrderDetail;
+import org.apache.ibatis.annotations.Param;
+
+import java.util.Date;
+import java.util.List;
+
+/**
+ * 点菜订单明细
+ */
+public interface PsiDishOrderDetailMapper extends BaseMapper<PsiDishOrderDetail> {
+
+    List<PsiDishOrderDetail> findSummaryByOrderId(@Param("orderId") String orderId);
+
+    List<PsiDishOrderDetail> findAddDishList(@Param("orderId") String orderId);
+
+    List<PsiDishOrderDetail> findReduceDishList(@Param("orderId") String orderId);
+
+    int updateDishSort(@Param("orderId") String orderId, @Param("dishId") String dishId, @Param("dishSort") Integer dishSort,
+                       @Param("updateById") String updateById, @Param("updateTime") Date updateTime);
+}

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

@@ -0,0 +1,19 @@
+package com.jeeplus.psimanage.dishManage.mapper;
+
+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.core.conditions.Wrapper;
+import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
+import com.jeeplus.psimanage.dishManage.domain.PsiDishOrder;
+import org.apache.ibatis.annotations.Param;
+
+/**
+ * 点菜订单
+ */
+public interface PsiDishOrderMapper extends BaseMapper<PsiDishOrder> {
+
+    IPage<PsiDishOrder> findList(Page<PsiDishOrder> page, @Param(Constants.WRAPPER) Wrapper<PsiDishOrder> queryWrapper);
+
+    PsiDishOrder findCurrentByRoomId(@Param("roomId") String roomId);
+}

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

@@ -0,0 +1,25 @@
+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.toolkit.Constants;
+import com.jeeplus.psimanage.dishManage.domain.PsiDishRoom;
+import org.apache.ibatis.annotations.Param;
+
+import java.util.List;
+
+/**
+ * 包房管理
+ */
+public interface PsiDishRoomMapper extends BaseMapper<PsiDishRoom> {
+
+    List<PsiDishRoom> findList(@Param(Constants.WRAPPER) QueryWrapper<PsiDishRoom> queryWrapper);
+
+    PsiDishRoom queryById(@Param("id") String id);
+
+    Integer checkNoIsExist(@Param("roomNo") String roomNo, @Param("id") String id);
+
+    Integer checkNameIsExist(@Param("roomName") String roomName, @Param("id") String id);
+
+    Integer checkUseStatusIsExist( @Param("id") String id);
+}

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

@@ -0,0 +1,30 @@
+package com.jeeplus.psimanage.dishManage.mapper;
+
+import com.baomidou.mybatisplus.core.conditions.Wrapper;
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+import com.baomidou.mybatisplus.core.toolkit.Constants;
+import com.jeeplus.core.domain.TreeMapper;
+import com.jeeplus.psimanage.dishManage.domain.PsiDishType;
+import org.apache.ibatis.annotations.Param;
+
+import java.util.List;
+
+/**
+ * 菜品分类
+ */
+public interface PsiDishTypeMapper extends BaseMapper<PsiDishType>, TreeMapper<PsiDishType> {
+
+    List<PsiDishType> findList(@Param(Constants.WRAPPER) Wrapper<PsiDishType> queryWrapper);
+
+    PsiDishType getById(String id);
+
+    Integer checkNameIsExist(@Param("name") String name, @Param("parentId") String parentId, @Param("id") String id);
+
+    Integer getNo(@Param("parentId") String parentId);
+
+    Integer getLevel(@Param("parentId") String parentId);
+
+    Integer countChildren(@Param("id") String id);
+
+    List<PsiDishType> findOrderTypeList();
+}

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

@@ -0,0 +1,73 @@
+<?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.PsiCreditCustomerMapper">
+
+    <resultMap id="BaseResultMap" type="com.jeeplus.psimanage.dishManage.domain.PsiCreditCustomer">
+        <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="customerName" column="customer_name" jdbcType="VARCHAR"/>
+        <result property="mobile" column="mobile" jdbcType="VARCHAR"/>
+        <result property="birthday" column="birthday" jdbcType="DATE"/>
+        <result property="idCard" column="id_card" jdbcType="VARCHAR"/>
+        <result property="age" column="age" jdbcType="INTEGER"/>
+        <result property="occupation" column="occupation" jdbcType="VARCHAR"/>
+        <result property="companyName" column="company_name" jdbcType="VARCHAR"/>
+        <result property="address" column="address" jdbcType="VARCHAR"/>
+        <result property="emergencyContact" column="emergency_contact" jdbcType="VARCHAR"/>
+        <result property="emergencyContactPhone" column="emergency_contact_phone" jdbcType="VARCHAR"/>
+        <result property="invoiceTitle" column="invoice_title" jdbcType="VARCHAR"/>
+        <result property="taxNo" column="tax_no" jdbcType="VARCHAR"/>
+        <result property="bankName" column="bank_name" jdbcType="VARCHAR"/>
+        <result property="bankAccount" column="bank_account" jdbcType="VARCHAR"/>
+        <result property="invoiceAddressPhone" column="invoice_address_phone" jdbcType="VARCHAR"/>
+        <result property="creditStatus" column="credit_status" jdbcType="VARCHAR"/>
+        <result property="totalArrearsAmount" column="total_arrears_amount" jdbcType="DECIMAL"/>
+        <result property="unsettledBillCount" column="unsettled_bill_count" jdbcType="INTEGER"/>
+        <result property="firstCreditTime" column="first_credit_time" jdbcType="TIMESTAMP"/>
+        <result property="lastConsumeTime" column="last_consume_time" jdbcType="TIMESTAMP"/>
+        <result property="auditorId" column="auditor_id" jdbcType="VARCHAR"/>
+        <result property="remarks" column="remarks" jdbcType="VARCHAR"/>
+        <result property="createName" column="create_name" jdbcType="VARCHAR"/>
+        <result property="auditorName" column="auditor_name" jdbcType="VARCHAR"/>
+    </resultMap>
+
+    <sql id="Base_Column_List">
+        a.id, a.create_by_id, a.create_time, a.update_by_id, a.update_time, a.del_flag,
+        a.customer_name, a.mobile, a.birthday, a.id_card, a.age, a.occupation,
+        a.company_name, a.address, a.emergency_contact, a.emergency_contact_phone,
+        a.invoice_title, a.tax_no, a.bank_name, a.bank_account, a.invoice_address_phone,
+        a.credit_status, a.total_arrears_amount, a.unsettled_bill_count,
+        a.first_credit_time, a.last_consume_time, a.auditor_id, a.remarks
+    </sql>
+
+    <select id="findList" resultMap="BaseResultMap">
+        select <include refid="Base_Column_List"></include>, cu.name as create_name, au.name as auditor_name
+        from psi_credit_customer a
+        left join sys_user cu on cu.id = a.create_by_id
+        left join sys_user au on au.id = a.auditor_id
+        ${ew.customSqlSegment}
+        order by a.create_time desc
+    </select>
+
+    <select id="queryById" resultMap="BaseResultMap">
+        select <include refid="Base_Column_List"></include>, cu.name as create_name, au.name as auditor_name
+        from psi_credit_customer a
+        left join sys_user cu on cu.id = a.create_by_id
+        left join sys_user au on au.id = a.auditor_id
+        where a.del_flag = '0' and a.id = #{id}
+    </select>
+
+    <select id="checkMobileIsExist" resultType="java.lang.Integer">
+        select count(1)
+        from psi_credit_customer
+        where del_flag = '0'
+          and mobile = #{mobile}
+        <if test="id != null and id != ''">
+          and id != #{id}
+        </if>
+    </select>
+</mapper>

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

@@ -0,0 +1,118 @@
+<?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.PsiDishLibraryMapper">
+
+    <resultMap id="BaseResultMap" type="com.jeeplus.psimanage.dishManage.domain.PsiDishLibrary">
+        <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="dishCode" column="dish_code" jdbcType="VARCHAR"/>
+        <result property="dishName" column="dish_name" jdbcType="VARCHAR"/>
+        <result property="typeId" column="type_id" 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="salePrice" column="sale_price" jdbcType="DECIMAL"/>
+        <result property="costPrice" column="cost_price" jdbcType="DECIMAL"/>
+        <result property="taste" column="taste" jdbcType="VARCHAR"/>
+        <result property="status" column="status" jdbcType="VARCHAR"/>
+        <result property="sort" column="sort" jdbcType="INTEGER"/>
+        <result property="remarks" column="remarks" jdbcType="VARCHAR"/>
+        <result property="typeName" column="type_name" jdbcType="VARCHAR"/>
+        <result property="createName" column="create_name" jdbcType="VARCHAR"/>
+    </resultMap>
+
+    <sql id="Base_Column_List">
+        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
+    </sql>
+
+    <select id="findList" resultMap="BaseResultMap">
+        select
+            <include refid="Base_Column_List"></include>,
+            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}
+        order by a.sort asc, a.create_time desc
+    </select>
+
+    <select id="queryById" resultMap="BaseResultMap">
+        select
+            <include refid="Base_Column_List"></include>,
+            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
+        where a.del_flag = '0' and a.id = #{id}
+    </select>
+
+    <select id="checkCodeIsExist" resultType="java.lang.Integer">
+        select count(1)
+        from psi_dish_library
+        where del_flag = '0'
+          and dish_code = #{dishCode}
+        <if test="id != null and id != ''">
+          and id != #{id}
+        </if>
+    </select>
+
+    <select id="checkNameIsExist" resultType="java.lang.Integer">
+        select count(1)
+        from psi_dish_library
+        where del_flag = '0'
+          and dish_name = #{dishName}
+          and type_id = #{typeId}
+        <if test="id != null and id != ''">
+          and id != #{id}
+        </if>
+    </select>
+
+    <select id="countByTypeId" resultType="java.lang.Integer">
+        select count(1)
+        from psi_dish_library
+        where del_flag = '0' and type_id = #{typeId}
+    </select>
+
+    <select id="findOrderDishList" resultMap="BaseResultMap">
+        select
+            <include refid="Base_Column_List"></include>,
+            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
+        where a.del_flag = '0'
+          and a.status = '0'
+          and dt.status = '0'
+        <if test="typeId != null and typeId != ''">
+          and a.type_id = #{typeId}
+        </if>
+        <if test="dishName != null and dishName != ''">
+          and a.dish_name like concat('%', #{dishName}, '%')
+        </if>
+        order by a.sort asc, a.create_time desc
+    </select>
+</mapper>

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

@@ -0,0 +1,130 @@
+<?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.PsiDishOrderDetailMapper">
+
+    <resultMap id="BaseResultMap" type="com.jeeplus.psimanage.dishManage.domain.PsiDishOrderDetail">
+        <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="orderId" column="order_id" jdbcType="VARCHAR"/>
+        <result property="roomId" column="room_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="unit" column="unit" jdbcType="VARCHAR"/>
+        <result property="spec" column="spec" jdbcType="VARCHAR"/>
+        <result property="salePrice" column="sale_price" jdbcType="DECIMAL"/>
+        <result property="quantity" column="quantity" jdbcType="INTEGER"/>
+        <result property="currentQuantity" column="current_quantity" jdbcType="INTEGER"/>
+        <result property="amount" column="amount" jdbcType="DECIMAL"/>
+        <result property="dishSort" column="dish_sort" jdbcType="INTEGER"/>
+        <result property="isAddDish" column="is_add_dish" jdbcType="VARCHAR"/>
+        <result property="remarks" column="remarks" jdbcType="VARCHAR"/>
+        <result property="tenantId" column="tenant_id" jdbcType="VARCHAR"/>
+    </resultMap>
+
+    <select id="findSummaryByOrderId" resultMap="BaseResultMap">
+        select
+            min(a.id) as id,
+            a.order_id,
+            max(a.room_id) as room_id,
+            a.dish_id,
+            max(a.dish_code) as dish_code,
+            max(a.dish_name) as dish_name,
+            max(a.type_id) as type_id,
+            max(a.type_name) as type_name,
+            max(a.unit) as unit,
+            max(a.spec) as spec,
+            max(a.sale_price) as sale_price,
+            sum(a.quantity) as quantity,
+            sum(a.quantity) as current_quantity,
+            sum(a.amount) as amount,
+            min(case when ifnull(a.dish_sort, 0) > 0 then a.dish_sort else 999999 end) as dish_sort,
+            max(a.is_add_dish) as is_add_dish,
+            max(a.create_time) as create_time
+        from psi_dish_order_detail a
+        where a.del_flag = '0'
+          and a.order_id = #{orderId}
+        group by a.order_id, a.dish_id
+        having sum(a.quantity) > 0
+        order by min(case when ifnull(a.dish_sort, 0) > 0 then a.dish_sort else 999999 end) asc, max(a.create_time) asc
+    </select>
+
+    <select id="findAddDishList" resultMap="BaseResultMap">
+        select
+            a.id,
+            a.create_by_id,
+            a.create_time,
+            a.update_by_id,
+            a.update_time,
+            a.del_flag,
+            a.order_id,
+            a.room_id,
+            a.dish_id,
+            a.dish_code,
+            a.dish_name,
+            a.type_id,
+            a.type_name,
+            a.unit,
+            a.spec,
+            a.sale_price,
+            a.quantity,
+            a.quantity as current_quantity,
+            a.amount,
+            a.dish_sort,
+            a.is_add_dish,
+            a.remarks
+        from psi_dish_order_detail a
+        where a.del_flag = '0'
+          and a.order_id = #{orderId}
+          and a.is_add_dish = '1'
+          and a.quantity > 0
+        order by case when ifnull(a.dish_sort, 0) > 0 then a.dish_sort else 999999 end asc, a.create_time asc
+    </select>
+
+    <select id="findReduceDishList" resultMap="BaseResultMap">
+        select
+            a.id,
+            a.create_by_id,
+            a.create_time,
+            a.update_by_id,
+            a.update_time,
+            a.del_flag,
+            a.order_id,
+            a.room_id,
+            a.dish_id,
+            a.dish_code,
+            a.dish_name,
+            a.type_id,
+            a.type_name,
+            a.unit,
+            a.spec,
+            a.sale_price,
+            a.quantity,
+            a.quantity as current_quantity,
+            a.amount,
+            a.dish_sort,
+            a.is_add_dish,
+            a.remarks
+        from psi_dish_order_detail a
+        where a.del_flag = '0'
+          and a.order_id = #{orderId}
+          and a.quantity &lt; 0
+        order by case when ifnull(a.dish_sort, 0) > 0 then a.dish_sort else 999999 end asc, a.create_time asc
+    </select>
+
+    <update id="updateDishSort">
+        update psi_dish_order_detail
+        set dish_sort = #{dishSort},
+            update_by_id = #{updateById},
+            update_time = #{updateTime}
+        where del_flag = '0'
+          and order_id = #{orderId}
+          and dish_id = #{dishId}
+    </update>
+</mapper>

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

@@ -0,0 +1,68 @@
+<?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.PsiDishOrderMapper">
+
+    <resultMap id="BaseResultMap" type="com.jeeplus.psimanage.dishManage.domain.PsiDishOrder">
+        <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="orderNo" column="order_no" jdbcType="VARCHAR"/>
+        <result property="roomId" column="room_id" jdbcType="VARCHAR"/>
+        <result property="roomNo" column="room_no" jdbcType="VARCHAR"/>
+        <result property="roomName" column="room_name" jdbcType="VARCHAR"/>
+        <result property="orderStatus" column="order_status" jdbcType="VARCHAR"/>
+        <result property="totalAmount" column="total_amount" jdbcType="DECIMAL"/>
+        <result property="settleType" column="settle_type" jdbcType="VARCHAR"/>
+        <result property="discountRate" column="discount_rate" jdbcType="DECIMAL"/>
+        <result property="discountAmount" column="discount_amount" jdbcType="DECIMAL"/>
+        <result property="payableAmount" column="payable_amount" jdbcType="DECIMAL"/>
+        <result property="settleTime" column="settle_time" jdbcType="TIMESTAMP"/>
+        <result property="remarks" column="remarks" jdbcType="VARCHAR"/>
+        <result property="createName" column="create_name" jdbcType="VARCHAR"/>
+    </resultMap>
+
+    <sql id="Base_Column_List">
+        a.id,
+        a.create_by_id,
+        a.create_time,
+        a.update_by_id,
+        a.update_time,
+        a.del_flag,
+        a.order_no,
+        a.room_id,
+        a.room_no,
+        a.room_name,
+        a.order_status,
+        a.total_amount,
+        a.settle_type,
+        a.discount_rate,
+        a.discount_amount,
+        a.payable_amount,
+        a.settle_time,
+        a.remarks
+    </sql>
+
+    <select id="findList" resultMap="BaseResultMap">
+        select
+            <include refid="Base_Column_List"></include>,
+            su.name as create_name
+        from psi_dish_order a
+        left join sys_user su on su.id = a.create_by_id
+        ${ew.customSqlSegment}
+        order by a.create_time desc
+    </select>
+
+    <select id="findCurrentByRoomId" resultMap="BaseResultMap">
+        select
+            <include refid="Base_Column_List"></include>
+        from psi_dish_order a
+        where a.del_flag = '0'
+          and a.order_status = '0'
+          and a.room_id = #{roomId}
+        order by a.create_time desc
+        limit 1
+    </select>
+</mapper>

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

@@ -0,0 +1,83 @@
+<?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.PsiDishRoomMapper">
+
+    <resultMap id="BaseResultMap" type="com.jeeplus.psimanage.dishManage.domain.PsiDishRoom">
+        <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="roomNo" column="room_no" jdbcType="VARCHAR"/>
+        <result property="roomName" column="room_name" jdbcType="VARCHAR"/>
+        <result property="capacity" column="capacity" jdbcType="INTEGER"/>
+        <result property="minConsumption" column="min_consumption" jdbcType="DECIMAL"/>
+        <result property="status" column="status" jdbcType="VARCHAR"/>
+        <result property="useStatus" column="use_status" jdbcType="VARCHAR"/>
+        <result property="sort" column="sort" jdbcType="INTEGER"/>
+        <result property="remarks" column="remarks" jdbcType="VARCHAR"/>
+    </resultMap>
+
+    <sql id="Base_Column_List">
+        a.id,
+        a.create_by_id,
+        a.create_time,
+        a.update_by_id,
+        a.update_time,
+        a.del_flag,
+        a.room_no,
+        a.room_name,
+        a.capacity,
+        a.min_consumption,
+        a.status,
+        a.use_status,
+        a.sort,
+        a.remarks
+    </sql>
+
+    <select id="findList" resultMap="BaseResultMap">
+        select
+            <include refid="Base_Column_List"></include>
+        from psi_dish_room a
+        ${ew.customSqlSegment}
+        order by a.sort asc, a.create_time desc
+    </select>
+
+    <select id="queryById" resultMap="BaseResultMap">
+        select
+            <include refid="Base_Column_List"></include>
+        from psi_dish_room a
+        where a.del_flag = '0' and a.id = #{id}
+    </select>
+
+    <select id="checkNoIsExist" resultType="java.lang.Integer">
+        select count(1)
+        from psi_dish_room
+        where del_flag = '0'
+          and room_no = #{roomNo}
+        <if test="id != null and id != ''">
+          and id != #{id}
+        </if>
+    </select>
+
+    <select id="checkNameIsExist" resultType="java.lang.Integer">
+        select count(1)
+        from psi_dish_room
+        where del_flag = '0'
+          and room_name = #{roomName}
+        <if test="id != null and id != ''">
+          and id != #{id}
+        </if>
+    </select>
+
+    <select id="checkUseStatusIsExist" resultType="java.lang.Integer">
+        select count(1)
+        from psi_dish_room
+        where del_flag = '0'
+        and use_status = '1'
+        <if test="id != null and id != ''">
+            and id != #{id}
+        </if>
+    </select>
+</mapper>

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

@@ -0,0 +1,77 @@
+<?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.PsiDishTypeMapper">
+
+    <sql id="Base_Column_List">
+        dt.id,
+        dt.name,
+        dt.parent_id,
+        dt.parent_ids,
+        dt.level,
+        dt.sort,
+        dt.status,
+        dt.remarks,
+        dt.del_flag
+    </sql>
+
+    <select id="findList" resultType="com.jeeplus.psimanage.dishManage.domain.PsiDishType">
+        select
+            <include refid="Base_Column_List"></include>
+        from psi_dish_type dt
+        ${ew.customSqlSegment}
+    </select>
+
+    <select id="getById" resultType="com.jeeplus.psimanage.dishManage.domain.PsiDishType">
+        select
+            <include refid="Base_Column_List"></include>
+        from psi_dish_type dt
+        where dt.del_flag = '0' and dt.id = #{id}
+    </select>
+
+    <select id="checkNameIsExist" resultType="java.lang.Integer">
+        select count(1)
+        from psi_dish_type
+        where del_flag = '0'
+          and name = #{name}
+          and parent_id = #{parentId}
+        <if test="id != null and id != ''">
+          and id != #{id}
+        </if>
+    </select>
+
+    <select id="getNo" resultType="java.lang.Integer">
+        select ifnull(max(sort), 0) + 1
+        from psi_dish_type
+        where del_flag = '0' and parent_id = #{parentId}
+    </select>
+
+    <select id="getLevel" resultType="java.lang.Integer">
+        select ifnull(max(level), 0) + 1
+        from psi_dish_type
+        where del_flag = '0' and parent_id = #{parentId}
+    </select>
+
+    <select id="countChildren" resultType="java.lang.Integer">
+        select count(1)
+        from psi_dish_type
+        where del_flag = '0' and parent_id = #{id}
+    </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_type dt
+        inner join psi_dish_library dl on dl.type_id = dt.id and dl.del_flag = '0' and dl.status = '0'
+        where dt.del_flag = '0'
+          and dt.status = '0'
+        order by dt.sort asc
+    </select>
+</mapper>

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

@@ -0,0 +1,111 @@
+package com.jeeplus.psimanage.dishManage.service;
+
+import cn.hutool.extra.spring.SpringUtil;
+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.PsiCreditCustomer;
+import com.jeeplus.psimanage.dishManage.mapper.PsiCreditCustomerMapper;
+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.Arrays;
+import java.util.Date;
+import java.util.UUID;
+
+/**
+ * 挂账人信息登记
+ */
+@Service
+@Transactional(rollbackFor = Exception.class)
+public class PsiCreditCustomerService extends ServiceImpl<PsiCreditCustomerMapper, PsiCreditCustomer> {
+
+    @Resource
+    private PsiCreditCustomerMapper mapper;
+
+    public IPage<PsiCreditCustomer> list(Page<PsiCreditCustomer> page, PsiCreditCustomer info) {
+        QueryWrapper<PsiCreditCustomer> wrapper = new QueryWrapper<>();
+        wrapper.eq("a.del_flag", "0");
+        if (StringUtils.isNotBlank(info.getCustomerName())) {
+            wrapper.like("a.customer_name", info.getCustomerName());
+        }
+        if (StringUtils.isNotBlank(info.getMobile())) {
+            wrapper.like("a.mobile", info.getMobile());
+        }
+        if (StringUtils.isNotBlank(info.getCreditStatus())) {
+            wrapper.eq("a.credit_status", info.getCreditStatus());
+        }
+        if (StringUtils.isNotBlank(info.getCompanyName())) {
+            wrapper.like("a.company_name", info.getCompanyName());
+        }
+        return mapper.findList(page, wrapper);
+    }
+
+    public PsiCreditCustomer findById(String id) {
+        return mapper.queryById(id);
+    }
+
+    public String saveCreditCustomer(PsiCreditCustomer info) {
+        if (StringUtils.isBlank(info.getCustomerName())) {
+            return "姓名不能为空";
+        }
+        if (StringUtils.isBlank(info.getMobile())) {
+            return "手机号不能为空";
+        }
+        Integer mobileCount = mapper.checkMobileIsExist(info.getMobile(), info.getId());
+        if (mobileCount != null && mobileCount > 0) {
+            return "手机号重复,请重新填写";
+        }
+        UserDTO userDto = SpringUtil.getBean(IUserApi.class).getByToken(TokenProvider.getCurrentToken());
+        if (StringUtils.isNotBlank(info.getId())) {
+            info.setUpdateById(userDto.getId());
+            info.setUpdateTime(new Date());
+            mapper.updateById(info);
+        } else {
+            info.setId(UUID.randomUUID().toString().replace("-", ""));
+            info.setCreateById(userDto.getId());
+            info.setCreateTime(new Date());
+            info.setUpdateById(userDto.getId());
+            info.setUpdateTime(new Date());
+            info.setDelFlag(0);
+            if (StringUtils.isBlank(info.getCreditStatus())) {
+                info.setCreditStatus("1");
+            }
+            if (info.getTotalArrearsAmount() == null) {
+                info.setTotalArrearsAmount(BigDecimal.ZERO);
+            }
+            if (info.getUnsettledBillCount() == null) {
+                info.setUnsettledBillCount(0);
+            }
+            mapper.insert(info);
+        }
+        return "操作完成";
+    }
+
+    public String deleteByIds(String ids) {
+        if (StringUtils.isBlank(ids)) {
+            return "请选择要删除的数据";
+        }
+        mapper.deleteBatchIds(Arrays.asList(ids.split(",")));
+        return "删除成功";
+    }
+
+    public String changeStatus(String id, String creditStatus) {
+        if (StringUtils.isBlank(id)) {
+            return "请选择要操作的数据";
+        }
+        PsiCreditCustomer info = new PsiCreditCustomer();
+        info.setId(id);
+        info.setCreditStatus(creditStatus);
+        info.setUpdateTime(new Date());
+        mapper.updateById(info);
+        return "操作成功";
+    }
+}

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

@@ -0,0 +1,122 @@
+package com.jeeplus.psimanage.dishManage.service;
+
+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.PsiDishType;
+import com.jeeplus.psimanage.dishManage.mapper.PsiDishLibraryMapper;
+import com.jeeplus.psimanage.dishManage.mapper.PsiDishTypeMapper;
+import com.jeeplus.sys.feign.IUserApi;
+import com.jeeplus.sys.service.dto.UserDTO;
+import com.jeeplus.utils.StringUtils;
+import cn.hutool.extra.spring.SpringUtil;
+import org.springframework.stereotype.Service;
+import org.springframework.transaction.annotation.Transactional;
+
+import javax.annotation.Resource;
+import java.text.SimpleDateFormat;
+import java.util.Arrays;
+import java.util.Date;
+import java.util.UUID;
+
+/**
+ * 菜品库
+ */
+@Service
+@Transactional(rollbackFor = Exception.class)
+public class PsiDishLibraryService extends ServiceImpl<PsiDishLibraryMapper, PsiDishLibrary> {
+
+    @Resource
+    private PsiDishLibraryMapper mapper;
+
+    @Resource
+    private PsiDishTypeMapper dishTypeMapper;
+
+    public IPage<PsiDishLibrary> list(Page<PsiDishLibrary> page, PsiDishLibrary info) {
+        QueryWrapper<PsiDishLibrary> wrapper = new QueryWrapper<>();
+        wrapper.eq("a.del_flag", "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());
+        }
+        if (StringUtils.isNotBlank(info.getStatus())) {
+            wrapper.eq("a.status", info.getStatus());
+        }
+        return mapper.findList(page, wrapper);
+    }
+
+    public PsiDishLibrary findById(String id) {
+        return mapper.queryById(id);
+    }
+
+    public String saveDish(PsiDishLibrary info) {
+        if (StringUtils.isNotBlank(info.getTypeId())) {
+            PsiDishType dishType = dishTypeMapper.selectById(info.getTypeId());
+            if (dishType == null || !"0".equals(dishType.getStatus())) {
+                return "请选择启用状态的菜品分类";
+            }
+            Integer childCount = dishTypeMapper.countChildren(info.getTypeId());
+            if (childCount != null && childCount > 0) {
+                return "菜品分类只能选择最子级分类";
+            }
+        }
+        if (StringUtils.isNotBlank(info.getDishCode())) {
+            Integer codeCount = mapper.checkCodeIsExist(info.getDishCode(), info.getId());
+            if (codeCount != null && codeCount > 0) {
+                return "菜品编码重复,请重新填写";
+            }
+        } else {
+            info.setDishCode(genDishCode());
+        }
+        Integer nameCount = mapper.checkNameIsExist(info.getDishName(), info.getTypeId(), info.getId());
+        if (nameCount != null && nameCount > 0) {
+            return "同一分类下菜品名称重复,请重新填写";
+        }
+        UserDTO userDto = SpringUtil.getBean(IUserApi.class).getByToken(TokenProvider.getCurrentToken());
+        if (StringUtils.isNotBlank(info.getId())) {
+            info.setUpdateById(userDto.getId());
+            info.setUpdateTime(new Date());
+            mapper.updateById(info);
+        } else {
+            info.setId(UUID.randomUUID().toString().replace("-", ""));
+            info.setCreateById(userDto.getId());
+            info.setCreateTime(new Date());
+            info.setUpdateById(userDto.getId());
+            info.setUpdateTime(new Date());
+            info.setDelFlag(0);
+            if (StringUtils.isBlank(info.getStatus())) {
+                info.setStatus("0");
+            }
+            mapper.insert(info);
+        }
+        return "操作完成";
+    }
+
+    public String deleteByIds(String ids) {
+        if (StringUtils.isBlank(ids)) {
+            return "请选择要删除的数据";
+        }
+        mapper.deleteBatchIds(Arrays.asList(ids.split(",")));
+        return "删除成功";
+    }
+
+    public String changeStatus(String id, String status) {
+        PsiDishLibrary info = new PsiDishLibrary();
+        info.setId(id);
+        info.setStatus(status);
+        mapper.updateById(info);
+        return "操作成功";
+    }
+
+    private String genDishCode() {
+        return "CP" + new SimpleDateFormat("yyyyMMddHHmmss").format(new Date());
+    }
+}

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

@@ -0,0 +1,461 @@
+package com.jeeplus.psimanage.dishManage.service;
+
+import cn.hutool.extra.spring.SpringUtil;
+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.flowable.feign.IFlowableApi;
+import com.jeeplus.psimanage.dishManage.domain.PsiDishLibrary;
+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;
+import com.jeeplus.sys.service.dto.RoleDTO;
+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.math.RoundingMode;
+import java.text.SimpleDateFormat;
+import java.time.LocalDateTime;
+import java.time.format.DateTimeFormatter;
+import java.util.Date;
+import java.util.ArrayList;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+import java.util.UUID;
+import java.util.concurrent.ExecutorService;
+import java.util.concurrent.Executors;
+
+/**
+ * 点菜页面
+ */
+@Service
+@Transactional(rollbackFor = Exception.class)
+public class PsiDishOrderService extends ServiceImpl<PsiDishOrderMapper, PsiDishOrder> {
+
+    @Resource
+    private PsiDishTypeMapper dishTypeMapper;
+
+    @Resource
+    private PsiDishLibraryMapper dishLibraryMapper;
+
+    @Resource
+    private PsiDishOrderMapper dishOrderMapper;
+
+    @Resource
+    private PsiDishOrderDetailMapper dishOrderDetailMapper;
+
+    @Resource
+    private PsiDishRoomMapper dishRoomMapper;
+
+    private static final ExecutorService ASYNC_POOL = Executors.newFixedThreadPool(5);
+
+
+    public List<PsiDishType> typeList() {
+        return dishTypeMapper.findOrderTypeList();
+    }
+
+    public List<PsiDishLibrary> dishList(String typeId, String dishName) {
+        return dishLibraryMapper.findOrderDishList(typeId, dishName);
+    }
+
+    public IPage<PsiDishOrder> list(Page<PsiDishOrder> page, PsiDishOrder info) {
+        QueryWrapper<PsiDishOrder> wrapper = new QueryWrapper<>();
+        wrapper.eq("a.del_flag", "0");
+        if (StringUtils.isNotBlank(info.getOrderNo())) {
+            wrapper.like("a.order_no", info.getOrderNo());
+        }
+        if (StringUtils.isNotBlank(info.getRoomName())) {
+            wrapper.like("a.room_name", info.getRoomName());
+        }
+        if (StringUtils.isNotBlank(info.getRoomNo())) {
+            wrapper.like("a.room_no", info.getRoomNo());
+        }
+        if (StringUtils.isNotBlank(info.getOrderStatus())) {
+            wrapper.eq("a.order_status", info.getOrderStatus());
+        }
+        if (StringUtils.isNotBlank(info.getSettleType())) {
+            wrapper.eq("a.settle_type", info.getSettleType());
+        }
+        if (info.getCreateTimes() != null && info.getCreateTimes().length == 2) {
+            wrapper.between("a.create_time", info.getCreateTimes()[0], info.getCreateTimes()[1]);
+        }
+        if (info.getSettleTimes() != null && info.getSettleTimes().length == 2) {
+            wrapper.between("a.settle_time", info.getSettleTimes()[0], info.getSettleTimes()[1]);
+        }
+        return dishOrderMapper.findList(page, wrapper);
+    }
+
+    public List<PsiDishOrderExportDto> exportRecordList(Page<PsiDishOrder> page, PsiDishOrder info) {
+        List<PsiDishOrder> orderList = this.list(page, info).getRecords();
+        List<PsiDishOrderExportDto> result = new ArrayList<>();
+        SimpleDateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
+        for (int i = 0; i < orderList.size(); i++) {
+            PsiDishOrder order = orderList.get(i);
+            PsiDishOrderExportDto exportDto = new PsiDishOrderExportDto();
+            exportDto.setId(order.getId());
+            exportDto.setRowNo(i + 1);
+            exportDto.setOrderNo(order.getOrderNo());
+            exportDto.setRoomNo(order.getRoomNo());
+            exportDto.setRoomName(order.getRoomName());
+            exportDto.setCreateTime(order.getCreateTime() == null ? "" : dateFormat.format(order.getCreateTime()));
+            exportDto.setSettleTime(order.getSettleTime() == null ? "" : dateFormat.format(order.getSettleTime()));
+            exportDto.setOrderStatus(orderStatusName(order.getOrderStatus()));
+            exportDto.setSettleType(settleTypeName(order.getSettleType()));
+            exportDto.setTotalAmount(formatMoney(order.getTotalAmount()));
+            exportDto.setDiscountRate("1".equals(order.getSettleType()) ? formatMoney(order.getDiscountRate()) + "%" : "-");
+            exportDto.setDiscountAmount(formatMoney(order.getDiscountAmount()));
+            exportDto.setPayableAmount(formatMoney(order.getPayableAmount()));
+            exportDto.setCreateName(order.getCreateName());
+            result.add(exportDto);
+        }
+        return result;
+    }
+
+    private String orderStatusName(String value) {
+        if ("0".equals(value)) {
+            return "使用中";
+        }
+        if ("1".equals(value)) {
+            return "已结账";
+        }
+        if ("2".equals(value)) {
+            return "已取消";
+        }
+        return "-";
+    }
+
+    private String settleTypeName(String value) {
+        if ("1".equals(value)) {
+            return "折扣结账";
+        }
+        if ("2".equals(value)) {
+            return "优惠结账";
+        }
+        if ("0".equals(value)) {
+            return "结账";
+        }
+        return "-";
+    }
+
+    private String formatMoney(BigDecimal value) {
+        return (value == null ? BigDecimal.ZERO : value).setScale(2, RoundingMode.HALF_UP).toPlainString();
+    }
+
+    public PsiDishOrder findOrderById(String id) {
+        if (StringUtils.isBlank(id)) {
+            return null;
+        }
+        PsiDishOrder order = dishOrderMapper.selectById(id);
+        if (order == null || order.getDelFlag() == null || order.getDelFlag() != 0) {
+            return null;
+        }
+        order.setDetailList(dishOrderDetailMapper.findSummaryByOrderId(order.getId()));
+        order.setAddDishList(dishOrderDetailMapper.findAddDishList(order.getId()));
+        order.setReduceDishList(dishOrderDetailMapper.findReduceDishList(order.getId()));
+        return order;
+    }
+
+    public PsiDishOrder currentOrder(String roomId) {
+        if (StringUtils.isBlank(roomId)) {
+            return null;
+        }
+        PsiDishOrder order = dishOrderMapper.findCurrentByRoomId(roomId);
+        if (order == null) {
+            return null;
+        }
+        order.setDetailList(dishOrderDetailMapper.findSummaryByOrderId(order.getId()));
+        return order;
+    }
+
+    public String submitOrder(PsiDishOrder info) {
+        if (info == null || StringUtils.isBlank(info.getRoomId())) {
+            return "请选择包房";
+        }
+        boolean hasValidDetail = info.getDetailList() != null && info.getDetailList().stream()
+                .anyMatch(item -> StringUtils.isNotBlank(item.getDishId()) && item.getQuantity() != null && item.getQuantity() != 0);
+        boolean hasSortDetail = info.getDetailList() != null && info.getDetailList().stream()
+                .anyMatch(item -> StringUtils.isNotBlank(item.getDishId()) && item.getDishSort() != null);
+        PsiDishRoom room = dishRoomMapper.queryById(info.getRoomId());
+        if (room == null || "1".equals(room.getStatus())) {
+            return "请选择启用状态的包房";
+        }
+        UserDTO userDto = SpringUtil.getBean(IUserApi.class).getByToken(TokenProvider.getCurrentToken());
+        Date now = new Date();
+        PsiDishOrder order = dishOrderMapper.findCurrentByRoomId(info.getRoomId());
+        if (order == null && "1".equals(info.getSettleFlag()) && StringUtils.isNotBlank(info.getId())) {
+            PsiDishOrder orderById = dishOrderMapper.selectById(info.getId());
+            if (orderById != null && orderById.getDelFlag() != null && orderById.getDelFlag() == 0
+                    && "0".equals(orderById.getOrderStatus()) && info.getRoomId().equals(orderById.getRoomId())) {
+                order = orderById;
+            }
+        }
+        if (!hasValidDetail) {
+            if (order != null && hasSortDetail) {
+                saveDishSort(order.getId(), info.getDetailList(), userDto, now);
+            }
+            if ("1".equals(info.getSettleFlag()) && order != null) {
+                info.setRoomName(order.getRoomName());
+                refreshOrderAmount(order.getId(), info, userDto, now);
+                return "结账成功";
+            }
+            if (order != null && hasSortDetail) {
+                return "排序保存成功";
+            }
+            return "请选择菜品";
+        }
+        boolean addDish = order != null;
+        if (order == null) {
+            order = createOrder(room, userDto, now);
+            dishOrderMapper.insert(order);
+            PsiDishRoom updateRoom = new PsiDishRoom();
+            updateRoom.setId(room.getId());
+            updateRoom.setUseStatus("1");
+            updateRoom.setUpdateById(userDto.getId());
+            updateRoom.setUpdateTime(now);
+            dishRoomMapper.updateById(updateRoom);
+        }
+        Map<String, Integer> currentQuantityMap = getCurrentQuantityMap(order.getId());
+        BigDecimal changeAmount = BigDecimal.ZERO;
+        for (PsiDishOrderDetail item : info.getDetailList()) {
+            if (StringUtils.isBlank(item.getDishId()) || item.getQuantity() == null || item.getQuantity() == 0) {
+                continue;
+            }
+            int currentQuantity = currentQuantityMap.getOrDefault(item.getDishId(), 0);
+            if (currentQuantity + item.getQuantity() < 0) {
+                return item.getDishName() + "减菜数量不能大于已点数量";
+            }
+            PsiDishLibrary dish = dishLibraryMapper.queryById(item.getDishId());
+            if (dish == null || !"0".equals(dish.getStatus())) {
+                return "菜品不存在或已停用";
+            }
+            PsiDishOrderDetail detail = buildDetail(order, dish, item.getQuantity(), addDish ? "1" : "0", item.getDishSort(), userDto, now);
+            dishOrderDetailMapper.insert(detail);
+            changeAmount = changeAmount.add(detail.getAmount());
+            currentQuantityMap.put(item.getDishId(), currentQuantity + item.getQuantity());
+        }
+        if (hasSortDetail) {
+            saveDishSort(order.getId(), info.getDetailList(), userDto, now);
+        }
+        info.setRoomName(order.getRoomName());
+        refreshOrderAmount(order.getId(), info, userDto, now);
+        return "1".equals(info.getSettleFlag()) ? "下单并结账成功" : (changeAmount.compareTo(BigDecimal.ZERO) < 0 ? "减菜成功" : "下单成功");
+    }
+
+    public String cancelOrder(String id) {
+        if (StringUtils.isBlank(id)) {
+            return "请选择要取消的订单";
+        }
+        PsiDishOrder order = dishOrderMapper.selectById(id);
+        if (order == null || order.getDelFlag() == null || order.getDelFlag() != 0) {
+            return "订单不存在";
+        }
+        if ("1".equals(order.getOrderStatus())) {
+            return "已结账订单不能取消";
+        }
+        if ("2".equals(order.getOrderStatus())) {
+            return "订单已取消";
+        }
+        if (!"0".equals(order.getOrderStatus())) {
+            return "当前订单状态不能取消";
+        }
+        UserDTO userDto = SpringUtil.getBean(IUserApi.class).getByToken(TokenProvider.getCurrentToken());
+        Date now = new Date();
+        PsiDishOrder update = new PsiDishOrder();
+        update.setId(order.getId());
+        update.setOrderStatus("2");
+        update.setUpdateById(userDto.getId());
+        update.setUpdateTime(now);
+        update.setSettleTime(now);
+        dishOrderMapper.updateById(update);
+
+        if (StringUtils.isNotBlank(order.getRoomId())) {
+            PsiDishRoom room = new PsiDishRoom();
+            room.setId(order.getRoomId());
+            room.setUseStatus("0");
+            room.setUpdateById(userDto.getId());
+            room.setUpdateTime(now);
+            dishRoomMapper.updateById(room);
+        }
+        return "取消成功";
+    }
+
+    private PsiDishOrder createOrder(PsiDishRoom room, UserDTO userDto, Date now) {
+        PsiDishOrder order = new PsiDishOrder();
+        order.setId(UUID.randomUUID().toString().replace("-", ""));
+        order.setOrderNo("DC" + new SimpleDateFormat("yyyyMMddHHmmss").format(now));
+        order.setRoomId(room.getId());
+        order.setRoomNo(room.getRoomNo());
+        order.setRoomName(room.getRoomName());
+        order.setOrderStatus("0");
+        order.setTotalAmount(BigDecimal.ZERO);
+        order.setDiscountRate(new BigDecimal("100"));
+        order.setDiscountAmount(BigDecimal.ZERO);
+        order.setPayableAmount(BigDecimal.ZERO);
+        order.setCreateById(userDto.getId());
+        order.setCreateTime(now);
+        order.setUpdateById(userDto.getId());
+        order.setUpdateTime(now);
+        order.setDelFlag(0);
+        return order;
+    }
+
+    private PsiDishOrderDetail buildDetail(PsiDishOrder order, PsiDishLibrary 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.setDishCode(dish.getDishCode());
+        detail.setDishName(dish.getDishName());
+        detail.setTypeId(dish.getTypeId());
+        detail.setTypeName(dish.getTypeName());
+        detail.setUnit(dish.getUnit());
+        detail.setSpec(dish.getSpec());
+        detail.setSalePrice(salePrice);
+        detail.setQuantity(quantity);
+        detail.setAmount(salePrice.multiply(new BigDecimal(quantity)));
+        detail.setDishSort(dishSort == null ? 0 : dishSort);
+        detail.setIsAddDish(isAddDish);
+        detail.setCreateById(userDto.getId());
+        detail.setCreateTime(now);
+        detail.setUpdateById(userDto.getId());
+        detail.setUpdateTime(now);
+        detail.setDelFlag(0);
+        return detail;
+    }
+
+
+    private void saveDishSort(String orderId, List<PsiDishOrderDetail> detailList, UserDTO userDto, Date now) {
+        if (StringUtils.isBlank(orderId) || detailList == null) {
+            return;
+        }
+        for (PsiDishOrderDetail item : detailList) {
+            if (StringUtils.isBlank(item.getDishId()) || item.getDishSort() == null) {
+                continue;
+            }
+            dishOrderDetailMapper.updateDishSort(orderId, item.getDishId(), item.getDishSort(), userDto.getId(), now);
+        }
+    }
+
+    private Map<String, Integer> getCurrentQuantityMap(String orderId) {
+        Map<String, Integer> map = new HashMap<>();
+        List<PsiDishOrderDetail> details = dishOrderDetailMapper.findSummaryByOrderId(orderId);
+        details.forEach(item -> map.put(item.getDishId(), item.getQuantity() == null ? 0 : item.getQuantity()));
+        return map;
+    }
+
+    private void refreshOrderAmount(String orderId, PsiDishOrder info, UserDTO userDto, Date now) {
+        List<PsiDishOrderDetail> details = dishOrderDetailMapper.findSummaryByOrderId(orderId);
+        BigDecimal totalAmount = BigDecimal.ZERO;
+        for (PsiDishOrderDetail detail : details) {
+            totalAmount = totalAmount.add(detail.getAmount() == null ? BigDecimal.ZERO : detail.getAmount());
+        }
+        PsiDishOrder update = new PsiDishOrder();
+        update.setId(orderId);
+        update.setTotalAmount(totalAmount);
+        update.setUpdateById(userDto.getId());
+        update.setUpdateTime(now);
+        if ("1".equals(info.getSettleFlag())) {
+            fillSettleAmount(update, totalAmount, info);
+            update.setOrderStatus("1");
+            update.setSettleTime(now);
+            PsiDishOrder order = dishOrderMapper.selectById(orderId);
+            if (order != null) {
+                PsiDishRoom room = new PsiDishRoom();
+                room.setId(order.getRoomId());
+                room.setUseStatus("0");
+                room.setUpdateById(userDto.getId());
+                room.setUpdateTime(now);
+                dishRoomMapper.updateById(room);
+            }
+        }
+        if("1".equals(update.getSettleType()) || "2".equals(update.getSettleType())){
+            ASYNC_POOL.execute(() -> {
+                String settleType = "1".equals(update.getSettleType()) ? "折扣结账" : "优惠结账";
+                //发起折扣结账至老板待办
+                Map map = SpringUtil.getBean(IFlowableApi.class).getByNameForFen("景聚庭-折扣结账");
+                String procDefId = map.get("id")+"";
+                String procDefKey = map.get("key")+"";
+                String businessTable = "psi_dish_order";
+                String businessId = update.getId();
+                String nowDateFormat = LocalDateTime.now().format(DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss"));
+                String title =userDto.getName() +" 在 "+nowDateFormat+" 发起了 ["+info.getRoomName()+"] "+settleType;
+                RoleDTO roleDTO = SpringUtil.getBean(IRoleApi.class).getRoleDTOByName2("老板");
+                List<UserDTO> notifiedPartyUsers =SpringUtil.getBean(IUserApi.class).findListByRoleId(roleDTO.getId());
+                UserDTO assigneeDTO = notifiedPartyUsers.get(0);
+                String assignee = assigneeDTO.getId();
+                String recordType = "";
+                Map<String, String> newMap = pingMap(procDefId, procDefKey, businessTable, businessId, title,assignee, recordType,userDto.getId());
+                Map<String ,Map<String,String >>  allMap = new HashMap<>();
+                allMap.put("折扣结账",newMap);
+                SpringUtil.getBean(IFlowableApi.class).startForFenNew(allMap);
+            });
+        }
+        dishOrderMapper.updateById(update);
+    }
+
+    public Map<String, String> pingMap(String procDefId, String procDefKey, String businessTable,
+                                       String businessId, String title, String assignee, String recordType,String userId) {
+        Map<String, String> map = new HashMap();
+        map.put("procDefId", procDefId);
+        map.put("procDefKey", procDefKey);
+        map.put("businessTable", businessTable);
+        map.put("businessId", businessId);
+        map.put("title", title);
+        map.put("assignee", assignee);
+        map.put("recordType", recordType);
+        map.put("userId", userId);
+        return map;
+    }
+
+    private void fillSettleAmount(PsiDishOrder update, BigDecimal totalAmount, PsiDishOrder info) {
+        String settleType = StringUtils.isBlank(info.getSettleType()) ? "0" : info.getSettleType();
+        BigDecimal discountRate = info.getDiscountRate() == null ? new BigDecimal("100") : info.getDiscountRate();
+        BigDecimal discountAmount = info.getDiscountAmount() == null ? BigDecimal.ZERO : info.getDiscountAmount();
+        BigDecimal payableAmount = totalAmount;
+        if ("1".equals(settleType)) {
+            if (discountRate.compareTo(BigDecimal.ZERO) < 0) {
+                discountRate = BigDecimal.ZERO;
+            }
+            if (discountRate.compareTo(new BigDecimal("100")) > 0) {
+                discountRate = new BigDecimal("100");
+            }
+            payableAmount = totalAmount.multiply(discountRate).divide(new BigDecimal("100"), 2, RoundingMode.HALF_UP);
+            discountAmount = totalAmount.subtract(payableAmount);
+        } else if ("2".equals(settleType)) {
+            if (discountAmount.compareTo(BigDecimal.ZERO) < 0) {
+                discountAmount = BigDecimal.ZERO;
+            }
+            if (discountAmount.compareTo(totalAmount) > 0) {
+                discountAmount = totalAmount;
+            }
+            payableAmount = totalAmount.subtract(discountAmount);
+            discountRate = new BigDecimal("100");
+        } else {
+            settleType = "0";
+            discountRate = new BigDecimal("100");
+            discountAmount = BigDecimal.ZERO;
+        }
+        update.setSettleType(settleType);
+        update.setDiscountRate(discountRate);
+        update.setDiscountAmount(discountAmount);
+        update.setPayableAmount(payableAmount);
+    }
+}

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

@@ -0,0 +1,107 @@
+package com.jeeplus.psimanage.dishManage.service;
+
+import cn.hutool.extra.spring.SpringUtil;
+import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
+import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
+import com.jeeplus.common.TokenProvider;
+import com.jeeplus.psimanage.dishManage.domain.PsiDishRoom;
+import com.jeeplus.psimanage.dishManage.mapper.PsiDishRoomMapper;
+import com.jeeplus.sys.feign.IUserApi;
+import com.jeeplus.sys.service.dto.UserDTO;
+import com.jeeplus.utils.StringUtils;
+import org.springframework.http.ResponseEntity;
+import org.springframework.stereotype.Service;
+import org.springframework.transaction.annotation.Transactional;
+
+import javax.annotation.Resource;
+import java.text.SimpleDateFormat;
+import java.util.Arrays;
+import java.util.Date;
+import java.util.List;
+import java.util.UUID;
+
+/**
+ * 包房管理
+ */
+@Service
+@Transactional(rollbackFor = Exception.class)
+public class PsiDishRoomService extends ServiceImpl<PsiDishRoomMapper, PsiDishRoom> {
+
+    @Resource
+    private PsiDishRoomMapper mapper;
+
+    public List<PsiDishRoom> list(PsiDishRoom info) {
+        QueryWrapper<PsiDishRoom> wrapper = new QueryWrapper<>();
+        wrapper.eq("a.del_flag", "0");
+        if (StringUtils.isNotBlank(info.getRoomName())) {
+            wrapper.like("a.room_name", info.getRoomName());
+        }
+        if (StringUtils.isNotBlank(info.getRoomNo())) {
+            wrapper.like("a.room_no", info.getRoomNo());
+        }
+        if (StringUtils.isNotBlank(info.getStatus())) {
+            wrapper.eq("a.status", info.getStatus());
+        }
+        return mapper.findList(wrapper);
+    }
+
+    public PsiDishRoom findById(String id) {
+        return mapper.queryById(id);
+    }
+
+    public String saveRoom(PsiDishRoom info) {
+        if (StringUtils.isBlank(info.getRoomNo())) {
+            info.setRoomNo(genRoomNo());
+        }
+        Integer noCount = mapper.checkNoIsExist(info.getRoomNo(), info.getId());
+        if (noCount != null && noCount > 0) {
+            return "包房编号重复,请重新填写";
+        }
+        Integer nameCount = mapper.checkNameIsExist(info.getRoomName(), info.getId());
+        if (nameCount != null && nameCount > 0) {
+            return "包房名称重复,请重新填写";
+        }
+        UserDTO userDto = SpringUtil.getBean(IUserApi.class).getByToken(TokenProvider.getCurrentToken());
+        if (StringUtils.isNotBlank(info.getId())) {
+            info.setUpdateById(userDto.getId());
+            info.setUpdateTime(new Date());
+            mapper.updateById(info);
+        } else {
+            info.setId(UUID.randomUUID().toString().replace("-", ""));
+            info.setCreateById(userDto.getId());
+            info.setCreateTime(new Date());
+            info.setUpdateById(userDto.getId());
+            info.setUpdateTime(new Date());
+            info.setDelFlag(0);
+            if (StringUtils.isBlank(info.getStatus())) {
+                info.setStatus("0");
+            }
+            mapper.insert(info);
+        }
+        return "操作完成";
+    }
+
+    public String deleteByIds(String ids) {
+        if (StringUtils.isBlank(ids)) {
+            return "请选择要删除的数据";
+        }
+        mapper.deleteBatchIds(Arrays.asList(ids.split(",")));
+        return "删除成功";
+    }
+
+    public ResponseEntity<String> changeStatus(String id, String status) {
+        Integer noCount = mapper.checkUseStatusIsExist(id);
+        if (noCount != null && noCount > 0) {
+            return ResponseEntity.badRequest().body("包房正在使用中,无法停用");
+        }
+        PsiDishRoom info = new PsiDishRoom();
+        info.setId(id);
+        info.setStatus(status);
+        mapper.updateById(info);
+        return ResponseEntity.ok("操作成功");
+    }
+
+    private String genRoomNo() {
+        return "BF" + new SimpleDateFormat("yyyyMMddHHmmss").format(new Date());
+    }
+}

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

@@ -0,0 +1,167 @@
+package com.jeeplus.psimanage.dishManage.service;
+
+import cn.hutool.core.collection.CollectionUtil;
+import cn.hutool.extra.spring.SpringUtil;
+import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
+import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
+import com.jeeplus.common.TokenProvider;
+import com.jeeplus.core.domain.BaseEntity;
+import com.jeeplus.psimanage.dishManage.domain.PsiDishType;
+import com.jeeplus.psimanage.dishManage.mapper.PsiDishLibraryMapper;
+import com.jeeplus.psimanage.dishManage.mapper.PsiDishTypeMapper;
+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.util.ArrayList;
+import java.util.Date;
+import java.util.List;
+import java.util.UUID;
+import java.util.stream.Collectors;
+
+/**
+ * 菜品分类
+ */
+@Service
+@Transactional(rollbackFor = Exception.class)
+public class PsiDishTypeService extends ServiceImpl<PsiDishTypeMapper, PsiDishType> {
+
+    @Resource
+    private PsiDishTypeMapper mapper;
+
+    @Resource
+    private PsiDishLibraryMapper dishLibraryMapper;
+
+    public List<PsiDishType> list(PsiDishType info) {
+        LambdaQueryWrapper<PsiDishType> wrapper = new LambdaQueryWrapper<>();
+        if (StringUtils.isNotBlank(info.getName())) {
+            wrapper.like(PsiDishType::getName, info.getName());
+        }
+        if (StringUtils.isNotBlank(info.getStatus())) {
+            wrapper.eq(PsiDishType::getStatus, info.getStatus());
+        }
+        wrapper.eq(BaseEntity::getDelFlag, 0);
+        wrapper.orderByAsc(PsiDishType::getSort);
+        return mapper.findList(wrapper);
+    }
+
+    public List<PsiDishType> treeData(String extId) {
+        LambdaQueryWrapper<PsiDishType> wrapper = new LambdaQueryWrapper<>();
+        wrapper.eq(BaseEntity::getDelFlag, 0);
+        wrapper.eq(PsiDishType::getStatus, "0");
+        if (StringUtils.isNotBlank(extId)) {
+            wrapper.ne(PsiDishType::getId, extId);
+        }
+        wrapper.orderByAsc(PsiDishType::getSort);
+        List<PsiDishType> list = mapper.findList(wrapper);
+        return buildTree(list);
+    }
+
+    public PsiDishType findById(String id) {
+        return mapper.getById(id);
+    }
+
+    public String saveDishType(PsiDishType info) {
+        if (StringUtils.isBlank(info.getParentId())) {
+            info.setParentId("0");
+        }
+        if (StringUtils.isNotBlank(info.getId())) {
+            return update(info);
+        }
+        return add(info);
+    }
+
+    private String add(PsiDishType info) {
+        Integer exist = mapper.checkNameIsExist(info.getName(), info.getParentId(), null);
+        if (exist != null && exist > 0) {
+            return "分类名称重复,请重新填写";
+        }
+        UserDTO userDto = SpringUtil.getBean(IUserApi.class).getByToken(TokenProvider.getCurrentToken());
+        info.setId(UUID.randomUUID().toString().replace("-", ""));
+        info.setCreateById(userDto.getId());
+        info.setCreateTime(new Date());
+        info.setUpdateById(userDto.getId());
+        info.setUpdateTime(new Date());
+        info.setDelFlag(0);
+        if (StringUtils.isBlank(info.getStatus())) {
+            info.setStatus("0");
+        }
+        getNo(info);
+        mapper.insert(info);
+        return "操作完成";
+    }
+
+    private String update(PsiDishType info) {
+        Integer exist = mapper.checkNameIsExist(info.getName(), info.getParentId(), info.getId());
+        if (exist != null && exist > 0) {
+            return "分类名称重复,请重新填写";
+        }
+        UserDTO userDto = SpringUtil.getBean(IUserApi.class).getByToken(TokenProvider.getCurrentToken());
+        info.setUpdateById(userDto.getId());
+        info.setUpdateTime(new Date());
+        getNo(info);
+        mapper.updateById(info);
+        return "操作完成";
+    }
+
+    private void getNo(PsiDishType info) {
+        PsiDishType parentInfo = null;
+        if (!"0".equals(info.getParentId())) {
+            parentInfo = mapper.getById(info.getParentId());
+        }
+        if (parentInfo != null) {
+            info.setParentIds(StringUtils.isBlank(parentInfo.getParentIds()) ? parentInfo.getId() : parentInfo.getParentIds() + "," + parentInfo.getId());
+            info.setLevel(String.valueOf(Integer.parseInt(parentInfo.getLevel()) + 1));
+        } else {
+            info.setParentIds("0");
+            info.setLevel("1");
+        }
+        if (info.getSort() == null) {
+            Integer no = mapper.getNo(info.getParentId());
+            info.setSort(no == null ? 1 : no);
+        }
+    }
+
+    public String remove(String id) {
+        Integer children = mapper.countChildren(id);
+        if (children != null && children > 0) {
+            return "当前分类存在下级分类,不能删除";
+        }
+        Integer dishCount = dishLibraryMapper.countByTypeId(id);
+        if (dishCount != null && dishCount > 0) {
+            return "当前分类已被菜品使用,不能删除";
+        }
+        mapper.deleteById(id);
+        return "操作成功";
+    }
+
+    public String changeStatus(String id, String status) {
+        PsiDishType info = new PsiDishType();
+        info.setId(id);
+        info.setStatus(status);
+        mapper.updateById(info);
+        return "操作成功";
+    }
+
+    private List<PsiDishType> buildTree(List<PsiDishType> source) {
+        if (CollectionUtil.isEmpty(source)) {
+            return new ArrayList<>();
+        }
+        List<PsiDishType> result = source.stream()
+                .filter(item -> StringUtils.isBlank(item.getParentId()) || "0".equals(item.getParentId()))
+                .collect(Collectors.toList());
+        result.forEach(item -> item.setChildren(getChildren(item.getId(), source)));
+        return result;
+    }
+
+    private List<PsiDishType> getChildren(String parentId, List<PsiDishType> source) {
+        List<PsiDishType> children = source.stream()
+                .filter(item -> parentId.equals(item.getParentId()))
+                .collect(Collectors.toList());
+        children.forEach(item -> item.setChildren(getChildren(item.getId(), source)));
+        return children;
+    }
+}

+ 51 - 0
jeeplus-modules/jeeplus-psi-management/src/main/java/com/jeeplus/psimanage/dishManage/service/dto/PsiDishOrderExportDto.java

@@ -0,0 +1,51 @@
+package com.jeeplus.psimanage.dishManage.service.dto;
+
+import com.alibaba.excel.annotation.ExcelIgnore;
+import com.alibaba.excel.annotation.ExcelProperty;
+import lombok.Data;
+
+@Data
+public class PsiDishOrderExportDto {
+
+    @ExcelIgnore
+    private String id;
+
+    @ExcelProperty("序号")
+    private Integer rowNo;
+
+    @ExcelProperty("订单编号")
+    private String orderNo;
+
+    @ExcelProperty("包房编号")
+    private String roomNo;
+
+    @ExcelProperty("包房名称")
+    private String roomName;
+
+    @ExcelProperty("下单时间")
+    private String createTime;
+
+    @ExcelProperty("结账时间/取消时间")
+    private String settleTime;
+
+    @ExcelProperty("结账方式")
+    private String settleType;
+
+    @ExcelProperty("账单原金额")
+    private String totalAmount;
+
+    @ExcelProperty("折扣比例")
+    private String discountRate;
+
+    @ExcelProperty("优惠金额")
+    private String discountAmount;
+
+    @ExcelProperty("实收金额")
+    private String payableAmount;
+
+    @ExcelProperty("创建人")
+    private String createName;
+
+    @ExcelProperty("订单状态")
+    private String orderStatus;
+}