瀏覽代碼

Merge branch 'master' of http://60.171.161.56:20000/tjf/yuanqu

wangmengwei 3 月之前
父節點
當前提交
cfc0574da1
共有 48 個文件被更改,包括 2633 次插入328 次删除
  1. 4 0
      ruoyi-admin/src/main/java/com/ruoyi/RuoYiApplication.java
  2. 20 33
      ruoyi-admin/src/main/java/com/ruoyi/web/controller/appointment/BomanReservatConfigTimeController.java
  3. 47 35
      ruoyi-admin/src/main/java/com/ruoyi/web/controller/appointment/BomanReservatController.java
  4. 83 1
      ruoyi-admin/src/main/java/com/ruoyi/web/controller/camera/CameraController.java
  5. 104 0
      ruoyi-admin/src/main/java/com/ruoyi/web/controller/clock/ClockHolidaysController.java
  6. 19 0
      ruoyi-admin/src/main/java/com/ruoyi/web/controller/clock/ClockRecordController.java
  7. 11 0
      ruoyi-admin/src/main/java/com/ruoyi/web/controller/clock/ClockUserInfoController.java
  8. 51 0
      ruoyi-admin/src/main/java/com/ruoyi/web/controller/common/SendSmsController.java
  9. 108 0
      ruoyi-admin/src/main/java/com/ruoyi/web/controller/food/MenuBoxController.java
  10. 0 1
      ruoyi-admin/src/main/java/com/ruoyi/web/controller/meeting/RealTimeController.java
  11. 21 42
      ruoyi-admin/src/main/java/com/ruoyi/web/controller/system/SysDeptController.java
  12. 5 1
      ruoyi-admin/src/main/java/com/ruoyi/web/controller/system/SysLoginController.java
  13. 11 0
      ruoyi-admin/src/main/java/com/ruoyi/web/controller/system/SysUserController.java
  14. 2 2
      ruoyi-admin/src/main/resources/application.yml
  15. 27 4
      ruoyi-common/pom.xml
  16. 62 0
      ruoyi-common/src/main/java/com/ruoyi/common/constant/CommonConstants.java
  17. 72 3
      ruoyi-common/src/main/java/com/ruoyi/common/core/domain/TreeSelect.java
  18. 159 0
      ruoyi-common/src/main/java/com/ruoyi/common/core/domain/entity/MenuBox.java
  19. 11 0
      ruoyi-common/src/main/java/com/ruoyi/common/core/domain/entity/SysUser.java
  20. 9 3
      ruoyi-common/src/main/java/com/ruoyi/common/core/domain/entity/SysUserVo.java
  21. 38 9
      ruoyi-common/src/main/java/com/ruoyi/common/utils/DateUtils.java
  22. 133 0
      ruoyi-common/src/main/java/com/ruoyi/common/utils/SendSmsUtils.java
  23. 5 2
      ruoyi-framework/src/main/java/com/ruoyi/framework/config/SecurityConfig.java
  24. 6 0
      ruoyi-system/pom.xml
  25. 84 0
      ruoyi-system/src/main/java/com/ruoyi/system/domain/ClockHolidays.java
  26. 27 1
      ruoyi-system/src/main/java/com/ruoyi/system/domain/EquipmentConfiguration.java
  27. 43 20
      ruoyi-system/src/main/java/com/ruoyi/system/domain/MenuFood.java
  28. 43 20
      ruoyi-system/src/main/java/com/ruoyi/system/domain/MenuFoodRecord.java
  29. 63 0
      ruoyi-system/src/main/java/com/ruoyi/system/mapper/ClockHolidaysMapper.java
  30. 74 0
      ruoyi-system/src/main/java/com/ruoyi/system/mapper/MenuBoxMapper.java
  31. 61 0
      ruoyi-system/src/main/java/com/ruoyi/system/service/IClockHolidaysService.java
  32. 4 0
      ruoyi-system/src/main/java/com/ruoyi/system/service/IClockRecordService.java
  33. 4 0
      ruoyi-system/src/main/java/com/ruoyi/system/service/IClockUserInfoService.java
  34. 90 0
      ruoyi-system/src/main/java/com/ruoyi/system/service/IMenuBoxService.java
  35. 27 1
      ruoyi-system/src/main/java/com/ruoyi/system/service/impl/CameraServiceImpl.java
  36. 96 0
      ruoyi-system/src/main/java/com/ruoyi/system/service/impl/ClockHolidaysServiceImpl.java
  37. 395 134
      ruoyi-system/src/main/java/com/ruoyi/system/service/impl/ClockRecordServiceImpl.java
  38. 31 3
      ruoyi-system/src/main/java/com/ruoyi/system/service/impl/ClockUserInfoServiceImpl.java
  39. 238 0
      ruoyi-system/src/main/java/com/ruoyi/system/service/impl/MenuBoxServiceImpl.java
  40. 18 5
      ruoyi-system/src/main/java/com/ruoyi/system/service/impl/SysUserServiceImpl.java
  41. 59 1
      ruoyi-system/src/main/java/com/ruoyi/system/service/impl/Task.java
  42. 96 0
      ruoyi-system/src/main/resources/mapper/system/ClockHolidaysMapper.xml
  43. 2 0
      ruoyi-system/src/main/resources/mapper/system/ClockUserInfoMapper.xml
  44. 1 0
      ruoyi-system/src/main/resources/mapper/system/DutyScheduleMapper.xml
  45. 128 0
      ruoyi-system/src/main/resources/mapper/system/MenuBoxMapper.xml
  46. 17 2
      ruoyi-system/src/main/resources/mapper/system/MenuFoodMapper.xml
  47. 22 4
      ruoyi-system/src/main/resources/mapper/system/MenuFoodRecordMapper.xml
  48. 2 1
      ruoyi-system/src/main/resources/mapper/system/SysUserMapper.xml

+ 4 - 0
ruoyi-admin/src/main/java/com/ruoyi/RuoYiApplication.java

@@ -3,12 +3,16 @@ package com.ruoyi;
 import org.springframework.boot.SpringApplication;
 import org.springframework.boot.autoconfigure.SpringBootApplication;
 import org.springframework.boot.autoconfigure.jdbc.DataSourceAutoConfiguration;
+import org.springframework.scheduling.annotation.EnableAsync;
+import org.springframework.scheduling.annotation.EnableScheduling;
 
 /**
  * 启动程序
  * 
  * @author ruoyi
  */
+@EnableAsync
+@EnableScheduling
 @SpringBootApplication(exclude = { DataSourceAutoConfiguration.class })
 public class RuoYiApplication
 {

+ 20 - 33
ruoyi-admin/src/main/java/com/ruoyi/web/controller/appointment/BomanReservatConfigTimeController.java

@@ -1,25 +1,19 @@
 package com.ruoyi.web.controller.appointment;
 
-import java.util.List;
-import javax.servlet.http.HttpServletResponse;
-import org.springframework.security.access.prepost.PreAuthorize;
-import org.springframework.beans.factory.annotation.Autowired;
-import org.springframework.web.bind.annotation.GetMapping;
-import org.springframework.web.bind.annotation.PostMapping;
-import org.springframework.web.bind.annotation.PutMapping;
-import org.springframework.web.bind.annotation.DeleteMapping;
-import org.springframework.web.bind.annotation.PathVariable;
-import org.springframework.web.bind.annotation.RequestBody;
-import org.springframework.web.bind.annotation.RequestMapping;
-import org.springframework.web.bind.annotation.RestController;
 import com.ruoyi.common.annotation.Log;
 import com.ruoyi.common.core.controller.BaseController;
 import com.ruoyi.common.core.domain.AjaxResult;
+import com.ruoyi.common.core.page.TableDataInfo;
 import com.ruoyi.common.enums.BusinessType;
+import com.ruoyi.common.utils.poi.ExcelUtil;
 import com.ruoyi.system.domain.BomanReservatConfigTime;
 import com.ruoyi.system.service.IBomanReservatConfigTimeService;
-import com.ruoyi.common.utils.poi.ExcelUtil;
-import com.ruoyi.common.core.page.TableDataInfo;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.security.access.prepost.PreAuthorize;
+import org.springframework.web.bind.annotation.*;
+
+import javax.servlet.http.HttpServletResponse;
+import java.util.List;
 
 /**
  * 预约时段配置Controller
@@ -29,18 +23,16 @@ import com.ruoyi.common.core.page.TableDataInfo;
  */
 @RestController
 @RequestMapping("/reservat/time")
-public class BomanReservatConfigTimeController extends BaseController
-{
+public class BomanReservatConfigTimeController extends BaseController {
     @Autowired
     private IBomanReservatConfigTimeService bomanReservatConfigTimeService;
 
-/**
- * 查询预约时段配置列表
- */
-@PreAuthorize("@ss.hasPermi('system:time:list')")
-@GetMapping("/list")
-    public TableDataInfo list(BomanReservatConfigTime bomanReservatConfigTime)
-    {
+    /**
+     * 查询预约时段配置列表
+     */
+    //@PreAuthorize("@ss.hasPermi('system:time:list')")
+    @GetMapping("/list")
+    public TableDataInfo list(BomanReservatConfigTime bomanReservatConfigTime) {
         startPage();
         List<BomanReservatConfigTime> list = bomanReservatConfigTimeService.selectBomanReservatConfigTimeList(bomanReservatConfigTime);
         return getDataTable(list);
@@ -52,8 +44,7 @@ public class BomanReservatConfigTimeController extends BaseController
     @PreAuthorize("@ss.hasPermi('system:time:export')")
     @Log(title = "预约时段配置", businessType = BusinessType.EXPORT)
     @PostMapping("/export")
-    public void export(HttpServletResponse response, BomanReservatConfigTime bomanReservatConfigTime)
-    {
+    public void export(HttpServletResponse response, BomanReservatConfigTime bomanReservatConfigTime) {
         List<BomanReservatConfigTime> list = bomanReservatConfigTimeService.selectBomanReservatConfigTimeList(bomanReservatConfigTime);
         ExcelUtil<BomanReservatConfigTime> util = new ExcelUtil<BomanReservatConfigTime>(BomanReservatConfigTime.class);
         util.exportExcel(response, list, "预约时段配置数据");
@@ -64,8 +55,7 @@ public class BomanReservatConfigTimeController extends BaseController
      */
     @PreAuthorize("@ss.hasPermi('system:time:query')")
     @GetMapping(value = "/{reservatConfigTimeId}")
-    public AjaxResult getInfo(@PathVariable("reservatConfigTimeId") Long reservatConfigTimeId)
-    {
+    public AjaxResult getInfo(@PathVariable("reservatConfigTimeId") Long reservatConfigTimeId) {
         return success(bomanReservatConfigTimeService.selectBomanReservatConfigTimeByReservatConfigTimeId(reservatConfigTimeId));
     }
 
@@ -75,8 +65,7 @@ public class BomanReservatConfigTimeController extends BaseController
     @PreAuthorize("@ss.hasPermi('system:time:add')")
     @Log(title = "预约时段配置", businessType = BusinessType.INSERT)
     @PostMapping
-    public AjaxResult add(@RequestBody BomanReservatConfigTime bomanReservatConfigTime)
-    {
+    public AjaxResult add(@RequestBody BomanReservatConfigTime bomanReservatConfigTime) {
         return toAjax(bomanReservatConfigTimeService.insertBomanReservatConfigTime(bomanReservatConfigTime));
     }
 
@@ -86,8 +75,7 @@ public class BomanReservatConfigTimeController extends BaseController
     @PreAuthorize("@ss.hasPermi('system:time:edit')")
     @Log(title = "预约时段配置", businessType = BusinessType.UPDATE)
     @PostMapping("/put")
-    public AjaxResult edit(@RequestBody BomanReservatConfigTime bomanReservatConfigTime)
-    {
+    public AjaxResult edit(@RequestBody BomanReservatConfigTime bomanReservatConfigTime) {
         return toAjax(bomanReservatConfigTimeService.updateBomanReservatConfigTime(bomanReservatConfigTime));
     }
 
@@ -97,8 +85,7 @@ public class BomanReservatConfigTimeController extends BaseController
     @PreAuthorize("@ss.hasPermi('system:time:remove')")
     @Log(title = "预约时段配置", businessType = BusinessType.DELETE)
     @GetMapping("/delete/{reservatConfigTimeIds}")
-    public AjaxResult remove(@PathVariable Long[] reservatConfigTimeIds)
-    {
+    public AjaxResult remove(@PathVariable Long[] reservatConfigTimeIds) {
         return toAjax(bomanReservatConfigTimeService.deleteBomanReservatConfigTimeByReservatConfigTimeIds(reservatConfigTimeIds));
     }
 }

+ 47 - 35
ruoyi-admin/src/main/java/com/ruoyi/web/controller/appointment/BomanReservatController.java

@@ -1,25 +1,18 @@
 package com.ruoyi.web.controller.appointment;
 
-import java.util.List;
-import javax.servlet.http.HttpServletResponse;
-import org.springframework.security.access.prepost.PreAuthorize;
-import org.springframework.beans.factory.annotation.Autowired;
-import org.springframework.web.bind.annotation.GetMapping;
-import org.springframework.web.bind.annotation.PostMapping;
-import org.springframework.web.bind.annotation.PutMapping;
-import org.springframework.web.bind.annotation.DeleteMapping;
-import org.springframework.web.bind.annotation.PathVariable;
-import org.springframework.web.bind.annotation.RequestBody;
-import org.springframework.web.bind.annotation.RequestMapping;
-import org.springframework.web.bind.annotation.RestController;
 import com.ruoyi.common.annotation.Log;
 import com.ruoyi.common.core.controller.BaseController;
 import com.ruoyi.common.core.domain.AjaxResult;
+import com.ruoyi.common.core.page.TableDataInfo;
 import com.ruoyi.common.enums.BusinessType;
+import com.ruoyi.common.utils.poi.ExcelUtil;
 import com.ruoyi.system.domain.BomanReservat;
 import com.ruoyi.system.service.IBomanReservatService;
-import com.ruoyi.common.utils.poi.ExcelUtil;
-import com.ruoyi.common.core.page.TableDataInfo;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.security.access.prepost.PreAuthorize;
+import org.springframework.web.bind.annotation.*;
+import javax.servlet.http.HttpServletResponse;
+import java.util.List;
 
 /**
  * 预约Controller
@@ -29,31 +22,54 @@ import com.ruoyi.common.core.page.TableDataInfo;
  */
 @RestController
 @RequestMapping("/system/reservat")
-public class BomanReservatController extends BaseController
-{
+public class BomanReservatController extends BaseController {
     @Autowired
     private IBomanReservatService bomanReservatService;
 
-/**
- * 查询预约列表
- */
-@PreAuthorize("@ss.hasPermi('system:reservat:list')")
-@GetMapping("/list")
-    public TableDataInfo list(BomanReservat bomanReservat)
-    {
+    /**
+     * 查询预约列表
+     */
+    @PreAuthorize("@ss.hasPermi('system:reservat:list')")
+    @GetMapping("/list")
+    public TableDataInfo list(BomanReservat bomanReservat) {
         startPage();
         List<BomanReservat> list = bomanReservatService.selectBomanReservatList(bomanReservat);
         return getDataTable(list);
     }
 
+    /**
+     * 查询预约列表
+     */
+    @GetMapping("/listNoPage")
+    public TableDataInfo listNoPage(BomanReservat bomanReservat) {
+        List<BomanReservat> list = bomanReservatService.selectBomanReservatList(bomanReservat);
+        return getDataTable(list);
+    }
+
+    /**
+     * 获取预约详细信息H5
+     */
+    @GetMapping(value = "/detail/{reservatId}")
+    public AjaxResult getInfoDetail(@PathVariable("reservatId") Long reservatId) {
+        return success(bomanReservatService.selectBomanReservatByReservatId(reservatId));
+    }
+
+    /**
+     * 删除预约H5
+     */
+    @Log(title = "预约", businessType = BusinessType.DELETE)
+    @GetMapping("/remove/{reservatIds}")
+    public AjaxResult removeReservat(@PathVariable Long[] reservatIds) {
+        return toAjax(bomanReservatService.deleteBomanReservatByReservatIds(reservatIds));
+    }
+
     /**
      * 导出预约列表
      */
     @PreAuthorize("@ss.hasPermi('system:reservat:export')")
     @Log(title = "预约", businessType = BusinessType.EXPORT)
     @PostMapping("/export")
-    public void export(HttpServletResponse response, BomanReservat bomanReservat)
-    {
+    public void export(HttpServletResponse response, BomanReservat bomanReservat) {
         List<BomanReservat> list = bomanReservatService.selectBomanReservatList(bomanReservat);
         ExcelUtil<BomanReservat> util = new ExcelUtil<BomanReservat>(BomanReservat.class);
         util.exportExcel(response, list, "预约数据");
@@ -64,19 +80,17 @@ public class BomanReservatController extends BaseController
      */
     @PreAuthorize("@ss.hasPermi('system:reservat:query')")
     @GetMapping(value = "/{reservatId}")
-    public AjaxResult getInfo(@PathVariable("reservatId") Long reservatId)
-    {
+    public AjaxResult getInfo(@PathVariable("reservatId") Long reservatId) {
         return success(bomanReservatService.selectBomanReservatByReservatId(reservatId));
     }
 
     /**
      * 新增预约
      */
-    @PreAuthorize("@ss.hasPermi('system:reservat:add')")
+    //@PreAuthorize("@ss.hasPermi('system:reservat:add')")
     @Log(title = "预约", businessType = BusinessType.INSERT)
-    @PostMapping
-    public AjaxResult add(@RequestBody BomanReservat bomanReservat)
-    {
+    @PostMapping("/add")
+    public AjaxResult add(@RequestBody BomanReservat bomanReservat) {
         return toAjax(bomanReservatService.insertBomanReservat(bomanReservat));
     }
 
@@ -86,8 +100,7 @@ public class BomanReservatController extends BaseController
     @PreAuthorize("@ss.hasPermi('system:reservat:edit')")
     @Log(title = "预约", businessType = BusinessType.UPDATE)
     @PostMapping("/put")
-    public AjaxResult edit(@RequestBody BomanReservat bomanReservat)
-    {
+    public AjaxResult edit(@RequestBody BomanReservat bomanReservat) {
         return toAjax(bomanReservatService.updateBomanReservat(bomanReservat));
     }
 
@@ -97,8 +110,7 @@ public class BomanReservatController extends BaseController
     @PreAuthorize("@ss.hasPermi('system:reservat:remove')")
     @Log(title = "预约", businessType = BusinessType.DELETE)
     @GetMapping("/delete/{reservatIds}")
-    public AjaxResult remove(@PathVariable Long[] reservatIds)
-    {
+    public AjaxResult remove(@PathVariable Long[] reservatIds) {
         return toAjax(bomanReservatService.deleteBomanReservatByReservatIds(reservatIds));
     }
 

+ 83 - 1
ruoyi-admin/src/main/java/com/ruoyi/web/controller/camera/CameraController.java

@@ -6,7 +6,9 @@ import com.ruoyi.common.annotation.Log;
 import com.ruoyi.common.core.controller.BaseController;
 import com.ruoyi.common.core.domain.AjaxResult;
 import com.ruoyi.common.core.page.TableDataInfo;
+import com.ruoyi.common.core.redis.RedisCache;
 import com.ruoyi.common.enums.BusinessType;
+import com.ruoyi.common.exception.ServiceException;
 import com.ruoyi.common.utils.StringUtils;
 import com.ruoyi.common.utils.poi.ExcelUtil;
 import com.ruoyi.hksdk.HCNetSDK;
@@ -27,6 +29,9 @@ import org.springframework.web.bind.annotation.*;
 import javax.servlet.http.HttpServletResponse;
 import java.util.List;
 
+import static com.ruoyi.common.constant.CommonConstants.LOGIN_USER_SMS;
+import static com.ruoyi.common.constant.CommonConstants.OPEN_DOOR;
+
 /**
  * 安防管理Controller
  *
@@ -43,6 +48,8 @@ public class CameraController extends BaseController {
     private IEquipmentConfigurationService equipmentConfigurationService;
     @Autowired
     private IOpeningDoorRecordService openingDoorRecordService;
+    @Autowired
+    private RedisCache redisCache;
 
     /**
      * 查询安防设备列表
@@ -55,7 +62,7 @@ public class CameraController extends BaseController {
 
 
     /**
-     * 获取设备视频地址
+     * 获取设备视频地址(放开)
      */
     @PreAuthorize("@ss.hasPermi('system:camera:video')")
     @GetMapping("/video/{cameraIndexCode}")
@@ -63,6 +70,24 @@ public class CameraController extends BaseController {
         return cameraService.video(cameraIndexCode);
     }
 
+
+    /**
+     * 查询安防设备列表(放开)
+     */
+    @GetMapping("/open/list")
+    public AjaxResult listOpen(CameraInfoVo cameraInfoVo) {
+        return cameraService.selectCameraList(cameraInfoVo);
+    }
+
+
+    /**
+     * 获取设备视频地址(放开)
+     */
+    @GetMapping("/open/video/{cameraIndexCode}")
+    public AjaxResult videoOpen(@PathVariable String cameraIndexCode) {
+        return cameraService.video(cameraIndexCode);
+    }
+
     /**
      * 设备关闭
      */
@@ -166,4 +191,61 @@ public class CameraController extends BaseController {
     }
 
 
+    /**
+     * 设备打开
+     */
+    @GetMapping("/yzm/openDz")
+    public AjaxResult yzmOpenDz(EquipmentConfiguration equipmentConfiguration) {
+        //验证码校验
+        Object cacheObject = redisCache.getCacheObject(OPEN_DOOR + equipmentConfiguration.getPhoneNumber());
+        if(ObjectUtils.isEmpty(cacheObject) || !equipmentConfiguration.getCode().equals(cacheObject)){
+            throw new ServiceException("验证码错误");
+        }
+        redisCache.deleteObject(LOGIN_USER_SMS + equipmentConfiguration.getPhoneNumber());
+        equipmentConfiguration = equipmentConfigurationService.selectEquipmentConfigurationByEquipmentName(equipmentConfiguration.getEquipmentName());
+        if(StringUtils.isEmpty(equipmentConfiguration.getEquipmentName())){
+            return AjaxResult.error("设备列表暂无当前设备");
+        }
+
+        String ip = equipmentConfiguration.getEquipmentIp();
+        short prot = (short) Short.parseShort(equipmentConfiguration.getEquipmentPort());
+        String login = equipmentConfiguration.getLoginName();
+        String pwd = equipmentConfiguration.getLoginPwd();
+
+        int tdh = Alarm.login_V40( ip, prot, login, pwd);;  //登录设备
+        //Alarm.setAlarm();
+        String ret="起竿失败!";
+        try {
+            HCNetSDK.NET_DVR_BARRIERGATE_CFG cfg = new HCNetSDK.NET_DVR_BARRIERGATE_CFG();
+            // cfg.read();
+            cfg.dwChannel=tdh;  //通道号
+            cfg.dwSize=cfg.size(); //结构体大小
+            cfg.byLaneNo=1; //道闸号:0-表示无效值(设备需要做有效值判断),1-道闸1
+            cfg.byBarrierGateCtrl=1; // 控制参数:0-关闭道闸,1-开启道闸,2-停止道闸,3-锁定道闸
+            cfg.byRes[0]=0; //保留,置为0
+            //起竿操作
+            Pointer name = cfg.getPointer();
+            cfg.write();
+            boolean a=Alarm.controlsDz(tdh, 3128,  name, cfg.size());
+            if(a) {
+                ret="起竿成功!";
+            }else {
+                ret="起竿失败!"+Alarm.controlsDzError();
+                //失败重新布防, 可以不布防
+                //new HikVisionService().run();
+            }
+            System.out.println("开闸结果--"+a+"-- 提示内容:"+ret);
+            //保存记录
+            OpeningDoorRecord openingDoorRecord = new OpeningDoorRecord();
+            openingDoorRecord.setEntranceGuardName(equipmentConfiguration.getEquipmentName());
+            openingDoorRecord.setType("1");
+            openingDoorRecordService.insertOpeningDoorRecord(openingDoorRecord);
+            //注销用户
+            boolean b=Alarm.logout(tdh);
+        } catch (Exception e) {
+            e.printStackTrace();
+        }
+        return AjaxResult.success(ret);
+    }
+
 }

+ 104 - 0
ruoyi-admin/src/main/java/com/ruoyi/web/controller/clock/ClockHolidaysController.java

@@ -0,0 +1,104 @@
+package com.ruoyi.web.controller.clock;
+
+import java.util.List;
+import javax.servlet.http.HttpServletResponse;
+import org.springframework.security.access.prepost.PreAuthorize;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.web.bind.annotation.GetMapping;
+import org.springframework.web.bind.annotation.PostMapping;
+import org.springframework.web.bind.annotation.PutMapping;
+import org.springframework.web.bind.annotation.DeleteMapping;
+import org.springframework.web.bind.annotation.PathVariable;
+import org.springframework.web.bind.annotation.RequestBody;
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.RestController;
+import com.ruoyi.common.annotation.Log;
+import com.ruoyi.common.core.controller.BaseController;
+import com.ruoyi.common.core.domain.AjaxResult;
+import com.ruoyi.common.enums.BusinessType;
+import com.ruoyi.system.domain.ClockHolidays;
+import com.ruoyi.system.service.IClockHolidaysService;
+import com.ruoyi.common.utils.poi.ExcelUtil;
+import com.ruoyi.common.core.page.TableDataInfo;
+
+/**
+ * 节假日时间Controller
+ *
+ * @author boman
+ * @date 2024-11-27
+ */
+@RestController
+@RequestMapping("/system/holidays")
+public class ClockHolidaysController extends BaseController
+{
+    @Autowired
+    private IClockHolidaysService clockHolidaysService;
+
+/**
+ * 查询节假日时间列表
+ */
+@PreAuthorize("@ss.hasPermi('system:holidays:list')")
+@GetMapping("/list")
+    public TableDataInfo list(ClockHolidays clockHolidays)
+    {
+        startPage();
+        List<ClockHolidays> list = clockHolidaysService.selectClockHolidaysList(clockHolidays);
+        return getDataTable(list);
+    }
+
+    /**
+     * 导出节假日时间列表
+     */
+    @PreAuthorize("@ss.hasPermi('system:holidays:export')")
+    @Log(title = "节假日时间", businessType = BusinessType.EXPORT)
+    @PostMapping("/export")
+    public void export(HttpServletResponse response, ClockHolidays clockHolidays)
+    {
+        List<ClockHolidays> list = clockHolidaysService.selectClockHolidaysList(clockHolidays);
+        ExcelUtil<ClockHolidays> util = new ExcelUtil<ClockHolidays>(ClockHolidays.class);
+        util.exportExcel(response, list, "节假日时间数据");
+    }
+
+    /**
+     * 获取节假日时间详细信息
+     */
+    @PreAuthorize("@ss.hasPermi('system:holidays:query')")
+    @GetMapping(value = "/{id}")
+    public AjaxResult getInfo(@PathVariable("id") Long id)
+    {
+        return success(clockHolidaysService.selectClockHolidaysById(id));
+    }
+
+    /**
+     * 新增节假日时间
+     */
+    @PreAuthorize("@ss.hasPermi('system:holidays:add')")
+    @Log(title = "节假日时间", businessType = BusinessType.INSERT)
+    @PostMapping
+    public AjaxResult add(@RequestBody ClockHolidays clockHolidays)
+    {
+        return toAjax(clockHolidaysService.insertClockHolidays(clockHolidays));
+    }
+
+    /**
+     * 修改节假日时间
+     */
+    @PreAuthorize("@ss.hasPermi('system:holidays:edit')")
+    @Log(title = "节假日时间", businessType = BusinessType.UPDATE)
+    @PostMapping("/put")
+    public AjaxResult edit(@RequestBody ClockHolidays clockHolidays)
+    {
+        return toAjax(clockHolidaysService.updateClockHolidays(clockHolidays));
+    }
+
+    /**
+     * 删除节假日时间
+     */
+    @PreAuthorize("@ss.hasPermi('system:holidays:remove')")
+    @Log(title = "节假日时间", businessType = BusinessType.DELETE)
+    @GetMapping("/delete/{ids}")
+    public AjaxResult remove(@PathVariable Long[] ids)
+    {
+        return toAjax(clockHolidaysService.deleteClockHolidaysByIds(ids));
+    }
+}

+ 19 - 0
ruoyi-admin/src/main/java/com/ruoyi/web/controller/clock/ClockRecordController.java

@@ -135,4 +135,23 @@ public class ClockRecordController extends BaseController {
         List<Map<String,Object>> listMap = clockRecordService.all(clockUserInfo);
         return getDataTable(listMap);
     }
+
+    /**
+     * 打卡人员异常统计
+     */
+    @PreAuthorize("@ss.hasPermi('system:clock:abnormal')")
+    @GetMapping("/abnormal")
+    public AjaxResult abnormal(ClockRecord clockRecord) {
+        return clockRecordService.abnormal(clockRecord);
+    }
+
+    /**
+     * 个人打卡异常详情(pc用)
+     *
+     */
+    @PreAuthorize("@ss.hasPermi('system:clock:details')")
+    @GetMapping("/pc/details")
+    public AjaxResult details(ClockRecord clockRecord) {
+        return clockRecordService.details(clockRecord);
+    }
 }

+ 11 - 0
ruoyi-admin/src/main/java/com/ruoyi/web/controller/clock/ClockUserInfoController.java

@@ -3,6 +3,7 @@ package com.ruoyi.web.controller.clock;
 import java.util.List;
 import javax.servlet.http.HttpServletResponse;
 
+import com.ruoyi.common.core.domain.entity.SysUser;
 import org.springframework.security.access.prepost.PreAuthorize;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.web.bind.annotation.GetMapping;
@@ -76,6 +77,16 @@ public class ClockUserInfoController extends BaseController {
         return toAjax(clockUserInfoService.insertClockUserInfo(clockUserInfo));
     }
 
+    /**
+     * 新增打卡人员信息(从账号里获取)
+     */
+    @PreAuthorize("@ss.hasPermi('system:info:add:all')")
+    @Log(title = "打卡人员信息", businessType = BusinessType.INSERT)
+    @PostMapping("/add/all")
+    public AjaxResult addAll(@RequestBody List<SysUser> sysUserList) {
+        return toAjax(clockUserInfoService.insertClockUserInfoList(sysUserList));
+    }
+
     /**
      * 修改打卡人员信息
      */

+ 51 - 0
ruoyi-admin/src/main/java/com/ruoyi/web/controller/common/SendSmsController.java

@@ -0,0 +1,51 @@
+package com.ruoyi.web.controller.common;
+
+import com.ruoyi.common.annotation.RepeatSubmit;
+import com.ruoyi.common.core.domain.AjaxResult;
+import com.ruoyi.common.core.domain.entity.SysUser;
+import com.ruoyi.common.core.domain.model.LoginBody;
+import com.ruoyi.common.core.redis.RedisCache;
+import com.ruoyi.common.utils.SendSmsUtils;
+import com.ruoyi.system.service.ISysUserService;
+import org.springframework.beans.factory.annotation.Autowired;
+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.RestController;
+
+import java.util.concurrent.TimeUnit;
+
+import static com.ruoyi.common.constant.CommonConstants.OPEN_DOOR;
+
+
+/**
+ * @Author: tjf
+ * @Date: 2024/03/05 17:15
+ * @Describe:
+ */
+@RestController
+@RequestMapping("/sendSms")
+public class SendSmsController {
+    @Autowired
+    private RedisCache redisCache;
+    @Autowired
+    private ISysUserService sysUserService;
+
+
+    /**
+     * 开门验证码
+     *
+     * @return
+     */
+    @PostMapping("/sendRegisterSms")
+    @RepeatSubmit(interval = 1000, message = "请求过于频繁")
+    public AjaxResult sendRegisterSms(@RequestBody LoginBody user) {
+        String code = SendSmsUtils.getCode(4);
+        //手机号
+        String username = user.getUsername();
+        redisCache.setCacheObject(OPEN_DOOR + username, code, 5, TimeUnit.MINUTES);
+        String msg = SendSmsUtils.sendPassword(code, username);
+        System.out.println(username + "登录短信发送回复:" + msg);
+        return AjaxResult.success(msg);
+    }
+}

+ 108 - 0
ruoyi-admin/src/main/java/com/ruoyi/web/controller/food/MenuBoxController.java

@@ -0,0 +1,108 @@
+package com.ruoyi.web.controller.food;
+
+import com.ruoyi.common.annotation.Log;
+import com.ruoyi.common.core.controller.BaseController;
+import com.ruoyi.common.core.domain.AjaxResult;
+import com.ruoyi.common.enums.BusinessType;
+import com.ruoyi.common.utils.poi.ExcelUtil;
+import com.ruoyi.common.core.domain.entity.MenuBox;
+import com.ruoyi.system.service.IMenuBoxService;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.security.access.prepost.PreAuthorize;
+import org.springframework.web.bind.annotation.*;
+
+import javax.servlet.http.HttpServletResponse;
+import java.util.List;
+
+/**
+ * 包厢菜单Controller
+ *
+ * @author boman
+ * @date 2025-01-22
+ */
+@RestController
+@RequestMapping("/system/box")
+public class MenuBoxController extends BaseController {
+    @Autowired
+    private IMenuBoxService menuBoxService;
+
+    /**
+     * 查询包厢菜单列表
+     */
+    @GetMapping("/list")
+    public AjaxResult list(MenuBox menuBox) {
+        List<MenuBox> list = menuBoxService.selectMenuBoxList(menuBox);
+        return success(list);
+    }
+
+    /**
+     * 导出包厢菜单列表
+     */
+    @PreAuthorize("@ss.hasPermi('system:box:export')")
+    @Log(title = "包厢菜单", businessType = BusinessType.EXPORT)
+    @PostMapping("/export")
+    public void export(HttpServletResponse response, MenuBox menuBox) {
+        List<MenuBox> list = menuBoxService.selectMenuBoxList(menuBox);
+        ExcelUtil<MenuBox> util = new ExcelUtil<MenuBox>(MenuBox.class);
+        util.exportExcel(response, list, "包厢菜单数据");
+    }
+
+    /**
+     * 获取包厢菜单详细信息
+     */
+    @PreAuthorize("@ss.hasPermi('system:box:query')")
+    @GetMapping(value = "/{menuBoxId}")
+    public AjaxResult getInfo(@PathVariable("menuBoxId") Long menuBoxId) {
+        return success(menuBoxService.selectMenuBoxByMenuBoxId(menuBoxId));
+    }
+
+    /**
+     * 新增包厢菜单
+     */
+    @PreAuthorize("@ss.hasPermi('system:box:add')")
+    @Log(title = "包厢菜单", businessType = BusinessType.INSERT)
+    @PostMapping
+    public AjaxResult add(@RequestBody MenuBox menuBox) {
+        if (!menuBoxService.checkMenuBoxNameUnique(menuBox)) {
+            return error("新增菜品'" + menuBox.getFoodName() + "'失败,菜品名称已存在");
+        }
+        menuBox.setCreateBy(getUsername());
+        return toAjax(menuBoxService.insertMenuBox(menuBox));
+    }
+
+    /**
+     * 修改包厢菜单
+     */
+    @PreAuthorize("@ss.hasPermi('system:box:edit')")
+    @Log(title = "包厢菜单", businessType = BusinessType.UPDATE)
+    @PostMapping("/put")
+    public AjaxResult edit(@RequestBody MenuBox menuBox) {
+        Long menuBoxId = menuBox.getMenuBoxId();
+        if (!menuBoxService.checkMenuBoxNameUnique(menuBox)) {
+            return error("修改菜品'" + menuBox.getFoodName() + "'失败,菜品名称已存在");
+        } else if (menuBox.getParentId().equals(menuBoxId)) {
+            return error("修改菜品'" + menuBox.getFoodName() + "'失败,上级菜品不能是自己");
+        }
+        menuBox.setUpdateBy(getUsername());
+        return toAjax(menuBoxService.updateMenuBox(menuBox));
+    }
+
+    /**
+     * 删除包厢菜单
+     */
+    @PreAuthorize("@ss.hasPermi('system:box:remove')")
+    @Log(title = "包厢菜单", businessType = BusinessType.DELETE)
+    @GetMapping("/delete/{menuBoxIds}")
+    public AjaxResult remove(@PathVariable Long[] menuBoxIds) {
+        return toAjax(menuBoxService.deleteMenuBoxByMenuBoxIds(menuBoxIds));
+    }
+
+    /**
+     * 获取菜品树列表
+     */
+    @GetMapping("/deptTree")
+    public AjaxResult deptTree(MenuBox menuBox)
+    {
+        return success(menuBoxService.selectMenuBoxTreeList(menuBox));
+    }
+}

+ 0 - 1
ruoyi-admin/src/main/java/com/ruoyi/web/controller/meeting/RealTimeController.java

@@ -16,7 +16,6 @@ import com.ruoyi.system.service.IMeetingRecordsService;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.web.bind.annotation.*;
 import org.springframework.web.multipart.MultipartFile;
-
 import javax.annotation.Resource;
 import java.io.File;
 import java.io.FileInputStream;

+ 21 - 42
ruoyi-admin/src/main/java/com/ruoyi/web/controller/system/SysDeptController.java

@@ -1,18 +1,5 @@
 package com.ruoyi.web.controller.system;
 
-import java.util.List;
-import org.apache.commons.lang3.ArrayUtils;
-import org.springframework.beans.factory.annotation.Autowired;
-import org.springframework.security.access.prepost.PreAuthorize;
-import org.springframework.validation.annotation.Validated;
-import org.springframework.web.bind.annotation.DeleteMapping;
-import org.springframework.web.bind.annotation.GetMapping;
-import org.springframework.web.bind.annotation.PathVariable;
-import org.springframework.web.bind.annotation.PostMapping;
-import org.springframework.web.bind.annotation.PutMapping;
-import org.springframework.web.bind.annotation.RequestBody;
-import org.springframework.web.bind.annotation.RequestMapping;
-import org.springframework.web.bind.annotation.RestController;
 import com.ruoyi.common.annotation.Log;
 import com.ruoyi.common.constant.UserConstants;
 import com.ruoyi.common.core.controller.BaseController;
@@ -21,16 +8,22 @@ import com.ruoyi.common.core.domain.entity.SysDept;
 import com.ruoyi.common.enums.BusinessType;
 import com.ruoyi.common.utils.StringUtils;
 import com.ruoyi.system.service.ISysDeptService;
+import org.apache.commons.lang3.ArrayUtils;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.security.access.prepost.PreAuthorize;
+import org.springframework.validation.annotation.Validated;
+import org.springframework.web.bind.annotation.*;
+
+import java.util.List;
 
 /**
  * 部门信息
- * 
+ *
  * @author ruoyi
  */
 @RestController
 @RequestMapping("/system/dept")
-public class SysDeptController extends BaseController
-{
+public class SysDeptController extends BaseController {
     @Autowired
     private ISysDeptService deptService;
 
@@ -39,8 +32,7 @@ public class SysDeptController extends BaseController
      */
     @PreAuthorize("@ss.hasPermi('system:dept:list')")
     @GetMapping("/list")
-    public AjaxResult list(SysDept dept)
-    {
+    public AjaxResult list(SysDept dept) {
         List<SysDept> depts = deptService.selectDeptList(dept);
         return success(depts);
     }
@@ -50,8 +42,7 @@ public class SysDeptController extends BaseController
      */
     @PreAuthorize("@ss.hasPermi('system:dept:list')")
     @GetMapping("/list/exclude/{deptId}")
-    public AjaxResult excludeChild(@PathVariable(value = "deptId", required = false) Long deptId)
-    {
+    public AjaxResult excludeChild(@PathVariable(value = "deptId", required = false) Long deptId) {
         List<SysDept> depts = deptService.selectDeptList(new SysDept());
         depts.removeIf(d -> d.getDeptId().intValue() == deptId || ArrayUtils.contains(StringUtils.split(d.getAncestors(), ","), deptId + ""));
         return success(depts);
@@ -62,8 +53,7 @@ public class SysDeptController extends BaseController
      */
     @PreAuthorize("@ss.hasPermi('system:dept:query')")
     @GetMapping(value = "/{deptId}")
-    public AjaxResult getInfo(@PathVariable Long deptId)
-    {
+    public AjaxResult getInfo(@PathVariable Long deptId) {
         deptService.checkDeptDataScope(deptId);
         return success(deptService.selectDeptById(deptId));
     }
@@ -74,10 +64,8 @@ public class SysDeptController extends BaseController
     @PreAuthorize("@ss.hasPermi('system:dept:add')")
     @Log(title = "部门管理", businessType = BusinessType.INSERT)
     @PostMapping
-    public AjaxResult add(@Validated @RequestBody SysDept dept)
-    {
-        if (!deptService.checkDeptNameUnique(dept))
-        {
+    public AjaxResult add(@Validated @RequestBody SysDept dept) {
+        if (!deptService.checkDeptNameUnique(dept)) {
             return error("新增部门'" + dept.getDeptName() + "'失败,部门名称已存在");
         }
         dept.setCreateBy(getUsername());
@@ -90,20 +78,14 @@ public class SysDeptController extends BaseController
     @PreAuthorize("@ss.hasPermi('system:dept:edit')")
     @Log(title = "部门管理", businessType = BusinessType.UPDATE)
     @PostMapping("/put")
-    public AjaxResult edit(@Validated @RequestBody SysDept dept)
-    {
+    public AjaxResult edit(@Validated @RequestBody SysDept dept) {
         Long deptId = dept.getDeptId();
         deptService.checkDeptDataScope(deptId);
-        if (!deptService.checkDeptNameUnique(dept))
-        {
+        if (!deptService.checkDeptNameUnique(dept)) {
             return error("修改部门'" + dept.getDeptName() + "'失败,部门名称已存在");
-        }
-        else if (dept.getParentId().equals(deptId))
-        {
+        } else if (dept.getParentId().equals(deptId)) {
             return error("修改部门'" + dept.getDeptName() + "'失败,上级部门不能是自己");
-        }
-        else if (StringUtils.equals(UserConstants.DEPT_DISABLE, dept.getStatus()) && deptService.selectNormalChildrenDeptById(deptId) > 0)
-        {
+        } else if (StringUtils.equals(UserConstants.DEPT_DISABLE, dept.getStatus()) && deptService.selectNormalChildrenDeptById(deptId) > 0) {
             return error("该部门包含未停用的子部门!");
         }
         dept.setUpdateBy(getUsername());
@@ -116,14 +98,11 @@ public class SysDeptController extends BaseController
     @PreAuthorize("@ss.hasPermi('system:dept:remove')")
     @Log(title = "部门管理", businessType = BusinessType.DELETE)
     @GetMapping("/delete/{deptId}")
-    public AjaxResult remove(@PathVariable Long deptId)
-    {
-        if (deptService.hasChildByDeptId(deptId))
-        {
+    public AjaxResult remove(@PathVariable Long deptId) {
+        if (deptService.hasChildByDeptId(deptId)) {
             return warn("存在下级部门,不允许删除");
         }
-        if (deptService.checkDeptExistUser(deptId))
-        {
+        if (deptService.checkDeptExistUser(deptId)) {
             return warn("部门存在用户,不允许删除");
         }
         deptService.checkDeptDataScope(deptId);

+ 5 - 1
ruoyi-admin/src/main/java/com/ruoyi/web/controller/system/SysLoginController.java

@@ -114,11 +114,15 @@ public class SysLoginController
             String nickName = user.getNickName();
             Long userId = user.getUserId();
             String avatar = user.getAvatar();
-            Map<String,Object> map = new HashMap<>(2);
+            String password = user.getPassword();
+            String phonenumber = user.getPhonenumber();
+            Map<String,Object> map = new HashMap<>(6);
             map.put("userName",userName);
             map.put("nickName",nickName);
             map.put("userId",userId);
             map.put("avatar",avatar);
+            map.put("password",password);
+            map.put("phonenumber",phonenumber);
             return AjaxResult.success(map);
         }
         return AjaxResult.error("获取用户信息异常");

+ 11 - 0
ruoyi-admin/src/main/java/com/ruoyi/web/controller/system/SysUserController.java

@@ -65,6 +65,17 @@ public class SysUserController extends BaseController
         return getDataTable(list);
     }
 
+    /**
+     * 获取用户列表
+     */
+    @PreAuthorize("@ss.hasPermi('system:user:list:noPage')")
+    @GetMapping("/list/noPage")
+    public TableDataInfo listNoPage(SysUser user)
+    {
+        List<SysUser> list = userService.selectUserList(user);
+        return getDataTable(list);
+    }
+
     @Log(title = "用户管理", businessType = BusinessType.EXPORT)
     @PreAuthorize("@ss.hasPermi('system:user:export')")
     @PostMapping("/export")

+ 2 - 2
ruoyi-admin/src/main/resources/application.yml

@@ -19,8 +19,8 @@ spring:
     # 国际化资源文件路径
     basename: i18n/messages
   profiles:
-    active: druid
-#    active: prod
+    #active: druid
+    active: prod
   # 文件上传
   servlet:
     multipart:

+ 27 - 4
ruoyi-common/pom.xml

@@ -16,6 +16,7 @@
     </description>
 
     <dependencies>
+
         <!--讯飞语音识别需要的-->
         <dependency>
             <groupId>cn.hutool</groupId>
@@ -23,10 +24,11 @@
             <version>5.7.21</version>
         </dependency>
         <dependency>
-        <groupId>com.google.code.gson</groupId>
-        <artifactId>gson</artifactId>
-        <version>2.9.0</version>
-    </dependency>
+            <groupId>com.google.code.gson</groupId>
+            <artifactId>gson</artifactId>
+            <version>2.9.0</version>
+        </dependency>
+
         <!-- Spring框架基本的核心工具 -->
         <dependency>
             <groupId>org.springframework</groupId>
@@ -143,6 +145,27 @@
             <version>1.1.3</version>
         </dependency>
 
+        <dependency>
+            <groupId>org.jsoup</groupId>
+            <artifactId>jsoup</artifactId>
+            <version>1.8.3</version>
+        </dependency>
+
+        <dependency>
+            <groupId>com.squareup.okhttp3</groupId>
+            <artifactId>okhttp</artifactId>
+            <version>3.9.0</version>
+        </dependency>
+
+        <!--阿里短信服务-->
+        <dependency>
+            <groupId>com.aliyun</groupId>
+            <artifactId>dysmsapi20170525</artifactId>
+            <version>2.0.24</version>
+        </dependency>
+
+
+
     </dependencies>
 
 </project>

+ 62 - 0
ruoyi-common/src/main/java/com/ruoyi/common/constant/CommonConstants.java

@@ -0,0 +1,62 @@
+package com.ruoyi.common.constant;
+
+/**公共常量
+ * @Author: tjf
+ * @Date: 2023/2/23 15:01
+ * @Describe:
+ */
+public class CommonConstants {
+    //数字常量
+    public static final String ONE = "1";
+    public static final String TWO = "2";
+    public static final String THR = "3";
+    public static final String FOR = "4";
+    public static final String FIV = "5";
+    public static final String SIX = "6";
+    public static final String SEV = "7";
+    public static final String EIG = "8";
+    public static final String NIN = "9";
+    public static final String TEN = "10";
+    public static final String ELE = "11";
+    public static final String TWE = "12";
+    public static final String THI = "13";
+    public static final String FOU = "14";
+    public static final String FIF = "15";
+    public static final String YES = "是";
+    public static final String NO = "否";
+    public static final String FRONT = "front";
+    public static final String BACK = "back";
+    public static final String RZDB = "RZDB";
+    public static final String A = "a";
+    public static final String B = "b";
+    public static final String C = "c";
+    public static final String D = "d";
+    public static final String E = "e";
+    public static final String F = "f";
+    public static final String Y = "Y";
+
+    //角色权限
+    //超级管理员
+    public static final String  ADMIN= "admin";
+    //平台管理员
+    public static final String  MANAGE= "manage";
+
+    /**
+     * 短信登录验证码前缀
+     */
+    public static final String LOGIN_USER_SMS = "login_user_sms:";
+
+    /**
+     * 验证码开门
+     */
+    public static final String OPEN_DOOR = "open_door:";
+    /**
+     * 密码加密16位秘钥
+     */
+    public static final String LOGIN_PASSWORD_AES = "qwertyuiopasdfgh";
+    /**
+     * 百度ACCESS_TOKEN
+     */
+    public static final String BAI_DU_ACCESS_TOKEN = "BAI_DU_ACCESS_TOKEN:";
+
+}

+ 72 - 3
ruoyi-common/src/main/java/com/ruoyi/common/core/domain/TreeSelect.java

@@ -1,12 +1,14 @@
 package com.ruoyi.common.core.domain;
 
-import java.io.Serializable;
-import java.util.List;
-import java.util.stream.Collectors;
 import com.fasterxml.jackson.annotation.JsonInclude;
+import com.ruoyi.common.core.domain.entity.MenuBox;
 import com.ruoyi.common.core.domain.entity.SysDept;
 import com.ruoyi.common.core.domain.entity.SysMenu;
 
+import java.io.Serializable;
+import java.util.List;
+import java.util.stream.Collectors;
+
 /**
  * Treeselect树结构实体类
  * 
@@ -18,9 +20,26 @@ public class TreeSelect implements Serializable
 
     /** 节点ID */
     private Long id;
+    private Long menuBoxId;
 
     /** 节点名称 */
     private String label;
+    /**
+     * 是否推荐(N代表不推荐 Y代表推荐)
+     */
+    private String suggest;
+    /**
+     * 推荐等级
+     */
+    private String suggestLv;
+    /**
+     * 图片
+     */
+    private String foodPhoto;
+    /**
+     * 菜品名称
+     */
+    private String foodName;
 
     /** 子节点 */
     @JsonInclude(JsonInclude.Include.NON_EMPTY)
@@ -45,6 +64,56 @@ public class TreeSelect implements Serializable
         this.children = menu.getChildren().stream().map(TreeSelect::new).collect(Collectors.toList());
     }
 
+    public TreeSelect(MenuBox menuBox)
+    {
+        this.menuBoxId = menuBox.getMenuBoxId();
+        this.foodName = menuBox.getFoodName();
+        this.foodPhoto = menuBox.getFoodPhoto();
+        this.suggest = menuBox.getSuggest();
+        this.suggestLv = menuBox.getSuggestLv();
+        this.children = menuBox.getChildren().stream().map(TreeSelect::new).collect(Collectors.toList());
+    }
+
+    public String getSuggest() {
+        return suggest;
+    }
+
+    public void setSuggest(String suggest) {
+        this.suggest = suggest;
+    }
+
+    public String getSuggestLv() {
+        return suggestLv;
+    }
+
+    public void setSuggestLv(String suggestLv) {
+        this.suggestLv = suggestLv;
+    }
+
+    public String getFoodPhoto() {
+        return foodPhoto;
+    }
+
+    public void setFoodPhoto(String foodPhoto) {
+        this.foodPhoto = foodPhoto;
+    }
+
+    public String getFoodName() {
+        return foodName;
+    }
+
+    public void setFoodName(String foodName) {
+        this.foodName = foodName;
+    }
+
+    public Long getMenuBoxId() {
+        return menuBoxId;
+    }
+
+    public void setMenuBoxId(Long menuBoxId) {
+        this.menuBoxId = menuBoxId;
+    }
+
     public Long getId()
     {
         return id;

+ 159 - 0
ruoyi-common/src/main/java/com/ruoyi/common/core/domain/entity/MenuBox.java

@@ -0,0 +1,159 @@
+package com.ruoyi.common.core.domain.entity;
+
+import com.ruoyi.common.annotation.Excel;
+import com.ruoyi.common.core.domain.BaseEntity;
+import org.apache.commons.lang3.builder.ToStringBuilder;
+import org.apache.commons.lang3.builder.ToStringStyle;
+import java.util.ArrayList;
+import java.util.List;
+
+/**
+ * 包厢菜单对象 menu_box
+ * 
+ * @author boman
+ * @date 2025-01-22
+ */
+public class MenuBox extends BaseEntity
+{
+    private static final long serialVersionUID = 1L;
+
+    /** 包厢菜品id */
+    private Long menuBoxId;
+    /** 父ID */
+    private Long parentId;
+
+    /** 祖级列表 */
+    private String ancestors;
+
+    /** 菜品名称 */
+    @Excel(name = "菜品名称")
+    private String foodName;
+
+    /** 菜品图片 */
+    @Excel(name = "菜品图片")
+    private String foodPhoto;
+
+    /** 是否推荐(N代表不推荐 Y代表推荐) */
+    @Excel(name = "是否推荐", readConverterExp = "N=代表不推荐,Y=代表推荐")
+    private String suggest;
+
+    /** 推荐等级 */
+    @Excel(name = "推荐等级")
+    private String suggestLv;
+
+    /** 删除标志(N代表存在 Y代表删除) */
+    @Excel(name = "删除标志", readConverterExp = "N=代表存在,Y=代表删除")
+    private String isDel;
+    /** 父部门名称 */
+    private String parentName;
+
+    /** 子部门 */
+    private List<MenuBox> children = new ArrayList<MenuBox>();
+
+
+    public Long getParentId() {
+        return parentId;
+    }
+
+    public void setParentId(Long parentId) {
+        this.parentId = parentId;
+    }
+
+    public String getAncestors() {
+        return ancestors;
+    }
+
+    public void setAncestors(String ancestors) {
+        this.ancestors = ancestors;
+    }
+
+    public String getParentName() {
+        return parentName;
+    }
+
+
+    public void setParentName(String parentName) {
+        this.parentName = parentName;
+    }
+
+    public List<MenuBox> getChildren() {
+        return children;
+    }
+
+    public void setChildren(List<MenuBox> children) {
+        this.children = children;
+    }
+
+    public void setMenuBoxId(Long menuBoxId)
+    {
+        this.menuBoxId = menuBoxId;
+    }
+
+    public Long getMenuBoxId() 
+    {
+        return menuBoxId;
+    }
+    public void setFoodName(String foodName) 
+    {
+        this.foodName = foodName;
+    }
+
+    public String getFoodName() 
+    {
+        return foodName;
+    }
+    public void setFoodPhoto(String foodPhoto) 
+    {
+        this.foodPhoto = foodPhoto;
+    }
+
+    public String getFoodPhoto() 
+    {
+        return foodPhoto;
+    }
+    public void setSuggest(String suggest) 
+    {
+        this.suggest = suggest;
+    }
+
+    public String getSuggest() 
+    {
+        return suggest;
+    }
+    public void setSuggestLv(String suggestLv) 
+    {
+        this.suggestLv = suggestLv;
+    }
+
+    public String getSuggestLv() 
+    {
+        return suggestLv;
+    }
+    public void setIsDel(String isDel) 
+    {
+        this.isDel = isDel;
+    }
+
+    public String getIsDel() 
+    {
+        return isDel;
+    }
+
+    @Override
+    public String toString() {
+        return new ToStringBuilder(this,ToStringStyle.MULTI_LINE_STYLE)
+            .append("menuBoxId", getMenuBoxId())
+            .append("parentId", getParentId())
+            .append("ancestors", getAncestors())
+            .append("foodName", getFoodName())
+            .append("foodPhoto", getFoodPhoto())
+            .append("suggest", getSuggest())
+            .append("suggestLv", getSuggestLv())
+            .append("isDel", getIsDel())
+            .append("createBy", getCreateBy())
+            .append("createTime", getCreateTime())
+            .append("updateBy", getUpdateBy())
+            .append("updateTime", getUpdateTime())
+            .toString();
+    }
+}

+ 11 - 0
ruoyi-common/src/main/java/com/ruoyi/common/core/domain/entity/SysUser.java

@@ -90,6 +90,9 @@ public class SysUser extends BaseEntity
     private Long roleId;
     private Long[] userIds;
 
+    /** 是否新增为考勤人员(Y:是,N:否) */
+    private String isclock;
+
     public Long[] getUserIds() {
         return userIds;
     }
@@ -306,6 +309,14 @@ public class SysUser extends BaseEntity
         this.roleId = roleId;
     }
 
+    public String getIsclock() {
+        return isclock;
+    }
+
+    public void setIsclock(String isclock) {
+        this.isclock = isclock;
+    }
+
     @Override
     public String toString() {
         return new ToStringBuilder(this,ToStringStyle.MULTI_LINE_STYLE)

+ 9 - 3
ruoyi-common/src/main/java/com/ruoyi/common/core/domain/entity/SysUserVo.java

@@ -1,9 +1,6 @@
 package com.ruoyi.common.core.domain.entity;
 
-import com.fasterxml.jackson.annotation.JsonIgnore;
 import com.fasterxml.jackson.annotation.JsonInclude;
-import com.ruoyi.common.annotation.Excel;
-import com.ruoyi.common.core.domain.BaseEntity;
 
 /**
  * @Author: tjf
@@ -32,6 +29,15 @@ public class SysUserVo{
      * 头像
      */
     private String avatar;
+    private String password;
+
+    public String getPassword() {
+        return password;
+    }
+
+    public void setPassword(String password) {
+        this.password = password;
+    }
 
     public String getAvatar() {
         return avatar;

+ 38 - 9
ruoyi-common/src/main/java/com/ruoyi/common/utils/DateUtils.java

@@ -59,6 +59,16 @@ public class DateUtils extends org.apache.commons.lang3.time.DateUtils
         return dateTimeNow(YYYY_MM_DD);
     }
 
+    /**
+     * 获取当前日期, 默认格式为yyyy
+     *
+     * @return String
+     */
+    public static String getYear()
+    {
+        return dateTimeNow(YYYY);
+    }
+
     public static final String getTime()
     {
         return dateTimeNow(YYYY_MM_DD_HH_MM_SS);
@@ -143,13 +153,21 @@ public class DateUtils extends org.apache.commons.lang3.time.DateUtils
     }
 
     /**
-     * 计算相差天数
+     * 计算相差天数 转换成正整数
      */
     public static int differentDaysByMillisecond(Date date1, Date date2)
     {
         return Math.abs((int) ((date2.getTime() - date1.getTime()) / (1000 * 3600 * 24)));
     }
 
+    /**
+     * 计算相差天数 小于就返回负数
+     */
+    public static int differentDays(Date date1, Date date2)
+    {
+        return (int) ((date2.getTime() - date1.getTime()) / (1000 * 3600 * 24));
+    }
+
     /**
      * 计算时间差
      *
@@ -269,14 +287,6 @@ public class DateUtils extends org.apache.commons.lang3.time.DateUtils
 
 
 
-
-    public static void main(String[] args) {
-        List<String> strings = weekList();
-        for (String string : strings) {
-            System.out.println(string);
-        }
-    }
-
     /**
      * 增加 Date  ==> LocalDate
      */
@@ -361,4 +371,23 @@ public class DateUtils extends org.apache.commons.lang3.time.DateUtils
         return dates;
     }
 
+    /**
+     * 判断两个日期相差的天数
+     *  str2 - str1
+     * @return
+     */
+    public static int compare(String str1,String str2)
+    {
+        SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");
+        try {
+            Date date1 = sdf.parse(str1);
+            Date date2 = sdf.parse(str2);
+            return differentDays(date1, date2);
+        } catch (ParseException e) {
+            e.printStackTrace();
+            return 0;
+        }
+
+    }
+
 }

+ 133 - 0
ruoyi-common/src/main/java/com/ruoyi/common/utils/SendSmsUtils.java

@@ -0,0 +1,133 @@
+package com.ruoyi.common.utils;
+
+
+import com.aliyun.dysmsapi20170525.models.SendBatchSmsRequest;
+import com.aliyun.dysmsapi20170525.models.SendBatchSmsResponse;
+import com.aliyun.dysmsapi20170525.models.SendSmsResponse;
+import com.aliyun.tea.TeaException;
+
+/**阿里云
+ * @author tjf
+ * @Date: 2021/07/15/10:21
+ */
+public class SendSmsUtils {
+    //阿里云ACCESS_KEY短信参数
+    static final String ACCESS_KEY_ID = "LTAI5tNA2fcBJH6EWRH6Pxr6";
+    static final String ACCESS_KEY_SECRET = "5WdaPEOvC3u9LC7pwy2DQ9pgmJvgUr";
+
+
+    //生成X位验证码
+    public static String getCode(Integer num) {
+        String[] codes = {"1", "2", "3", "4", "5", "6", "7", "8", "9"};
+        StringBuilder code = new StringBuilder();
+        for (int i = 0; i < num; i++) {
+            int j = (int) (Math.random() * 10);
+            if (j <= 0) {
+                j = 1;
+            }
+            code.append(codes[j - 1]);
+
+        }
+        return code.toString();
+    }
+
+    /**
+     * 使用AK&SK初始化账号Client
+     *
+     * @return Client
+     * @throws Exception
+     */
+    public static com.aliyun.dysmsapi20170525.Client createClient() throws Exception {
+        // 工程代码泄露可能会导致 AccessKey 泄露,并威胁账号下所有资源的安全性。以下代码示例仅供参考。
+        // 建议使用更安全的 STS 方式,更多鉴权访问方式请参见:https://help.aliyun.com/document_detail/378657.html。
+        com.aliyun.teaopenapi.models.Config config = new com.aliyun.teaopenapi.models.Config()
+                // 必填,请确保代码运行环境设置了环境变量 ALIBABA_CLOUD_ACCESS_KEY_ID。
+                .setAccessKeyId(ACCESS_KEY_ID)
+                // 必填,请确保代码运行环境设置了环境变量 ALIBABA_CLOUD_ACCESS_KEY_SECRET。
+                .setAccessKeySecret(ACCESS_KEY_SECRET);
+        // Endpoint 请参考 https://api.aliyun.com/product/Dysmsapi
+        config.endpoint = "dysmsapi.aliyuncs.com";
+        return new com.aliyun.dysmsapi20170525.Client(config);
+    }
+
+
+    /**
+     * 发送短信消息
+     *
+     * @return
+     */
+    public static String sendSms(String phone, String templateCode, String smsCode) {
+        String code = "";
+        try {
+            // 工程代码泄露可能会导致AccessKey泄露,并威胁账号下所有资源的安全性。以下代码示例仅供参考,建议使用更安全的 STS 方式,更多鉴权访问方式请参见:https://help.aliyun.com/document_detail/378657.html
+            com.aliyun.dysmsapi20170525.Client client = SendSmsUtils.createClient();
+
+            com.aliyun.dysmsapi20170525.models.SendSmsRequest sendSmsRequest = new com.aliyun.dysmsapi20170525.models.SendSmsRequest()
+                    //手机号码
+                    .setPhoneNumbers(phone)
+                    //短信签名名称。潜山市皖源融资担保
+                    .setSignName("潜山市皖源融资担保")
+                    //短信模板变量对应的实际值{"name": code}
+                    .setTemplateParam(smsCode)
+                    //短信模板CODE
+                    .setTemplateCode(templateCode);
+            // 复制代码运行请自行打印 API 的返回值
+            SendSmsResponse sendSmsResponse = client.sendSmsWithOptions(sendSmsRequest, new com.aliyun.teautil.models.RuntimeOptions());
+            code = sendSmsResponse.getBody().code;
+        } catch (Exception _error) {
+        }
+        return code;
+    }
+
+    /**
+     * 阿里云批量发送 短信接口,一次最多100个手机号码
+     *
+     * @return
+     * @throws
+     */
+    public static SendBatchSmsResponse sendBatchSms(SendBatchSmsRequest sendBatchSmsRequest) {
+        try {
+            com.aliyun.dysmsapi20170525.Client client = SendSmsUtils.createClient();
+            com.aliyun.teautil.models.RuntimeOptions runtime = new com.aliyun.teautil.models.RuntimeOptions();
+            SendBatchSmsResponse sendBatchSmsResponse = client.sendBatchSmsWithOptions(sendBatchSmsRequest, runtime);
+            return sendBatchSmsResponse;
+            // 复制代码运行请自行打印 API 的返回值
+        } catch (TeaException error) {
+            // 如有需要,请打印 error
+            com.aliyun.teautil.Common.assertAsString(error.message);
+        } catch (Exception _error) {
+            TeaException error = new TeaException(_error.getMessage(), _error);
+            // 如有需要,请打印 error
+            com.aliyun.teautil.Common.assertAsString(error.message);
+        }
+        return null;
+    }
+
+    /**
+     * 发送注册的随机密码
+     *
+     * @return
+     */
+    public static String sendPassword(String code, String phone) {
+        try {
+            // 工程代码泄露可能会导致AccessKey泄露,并威胁账号下所有资源的安全性。以下代码示例仅供参考,建议使用更安全的 STS 方式,更多鉴权访问方式请参见:https://help.aliyun.com/document_detail/378657.html
+            com.aliyun.dysmsapi20170525.Client client = SendSmsUtils.createClient();
+            String smsCode = "{\"code\":\"" + code + "\"}";
+            com.aliyun.dysmsapi20170525.models.SendSmsRequest sendSmsRequest = new com.aliyun.dysmsapi20170525.models.SendSmsRequest()
+                    //手机号码
+                    .setPhoneNumbers(phone)
+                    //短信签名名称
+                    .setSignName("中新云")
+                    //短信模板CODE
+                    .setTemplateCode("SMS_219525380")
+                    //短信模板变量对应的实际值{"name": code}
+                    .setTemplateParam(smsCode);
+            // 复制代码运行请自行打印 API 的返回值
+            SendSmsResponse sendSmsResponse = client.sendSmsWithOptions(sendSmsRequest, new com.aliyun.teautil.models.RuntimeOptions());
+            code = sendSmsResponse.getBody().code;
+        } catch (Exception _error) {
+        }
+        return code;
+    }
+}
+

+ 5 - 2
ruoyi-framework/src/main/java/com/ruoyi/framework/config/SecurityConfig.java

@@ -111,11 +111,14 @@ public class SecurityConfig extends WebSecurityConfigurerAdapter
                 // 过滤请求
                 .authorizeRequests()
                 // 对于登录login 注册register 验证码captchaImage 允许匿名访问
-                .antMatchers("/login", "/register", "/captchaImage").permitAll()
+                .antMatchers("/login", "/register", "/captchaImage","/camera/yzm/openDz","/sendSms/sendRegisterSms").permitAll()
+                .antMatchers("/camera/open/video/**","/camera/open/list").permitAll()
                 // 静态资源,可匿名访问
                 .antMatchers(HttpMethod.GET, "/", "/*.html", "/**/*.html", "/**/*.css", "/**/*.js", "/profile/**").permitAll()
                 .antMatchers("/swagger-ui.html", "/swagger-resources/**", "/webjars/**", "/*/api-docs", "/druid/**","/system/app/new").permitAll()
-                .antMatchers("/real/time/getResult/**").permitAll()
+                .antMatchers("/real/time/getResult/**","/reservat/time/list","/system/dict/data/type/**","/system/reservat/add").permitAll()
+                .antMatchers("/system/reservat/detail/**","/system/reservat/listNoPage","/system/reservat/remove/**").permitAll()
+                .antMatchers("/system/box/list","/system/box/deptTree").permitAll()
                 // 除上面外的所有请求全部需要鉴权认证
                 .anyRequest().authenticated()
                 .and()

+ 6 - 0
ruoyi-system/pom.xml

@@ -23,6 +23,12 @@
             <artifactId>ruoyi-common</artifactId>
         </dependency>
 
+        <dependency>
+            <groupId>org.projectlombok</groupId>
+            <artifactId>lombok</artifactId>
+            <optional>true</optional>
+        </dependency>
+
     </dependencies>
 
 </project>

+ 84 - 0
ruoyi-system/src/main/java/com/ruoyi/system/domain/ClockHolidays.java

@@ -0,0 +1,84 @@
+package com.ruoyi.system.domain;
+
+import org.apache.commons.lang3.builder.ToStringBuilder;
+import org.apache.commons.lang3.builder.ToStringStyle;
+import com.ruoyi.common.annotation.Excel;
+import com.ruoyi.common.core.domain.BaseEntity;
+
+/**
+ * 节假日时间对象 clock_holidays
+ * 
+ * @author boman
+ * @date 2024-11-27
+ */
+public class ClockHolidays extends BaseEntity
+{
+    private static final long serialVersionUID = 1L;
+
+    /** id */
+    private Long id;
+
+    /** 年份 */
+    @Excel(name = "年份")
+    private String year;
+
+    /** 日期(yyyy-mm-dd) */
+    @Excel(name = "日期", readConverterExp = "y=yyy-mm-dd")
+    private String holidayDate;
+
+    /** 是否补班 YES:补班,NO:放假 */
+    @Excel(name = "是否补班 YES:补班,NO:放假")
+    private String type;
+
+    public void setId(Long id) 
+    {
+        this.id = id;
+    }
+
+    public Long getId() 
+    {
+        return id;
+    }
+    public void setYear(String year) 
+    {
+        this.year = year;
+    }
+
+    public String getYear() 
+    {
+        return year;
+    }
+    public void setHolidayDate(String holidayDate) 
+    {
+        this.holidayDate = holidayDate;
+    }
+
+    public String getHolidayDate() 
+    {
+        return holidayDate;
+    }
+    public void setType(String type) 
+    {
+        this.type = type;
+    }
+
+    public String getType() 
+    {
+        return type;
+    }
+
+    @Override
+    public String toString() {
+        return new ToStringBuilder(this,ToStringStyle.MULTI_LINE_STYLE)
+            .append("id", getId())
+            .append("year", getYear())
+            .append("holidayDate", getHolidayDate())
+            .append("type", getType())
+            .append("createBy", getCreateBy())
+            .append("createTime", getCreateTime())
+            .append("updateBy", getUpdateBy())
+            .append("updateTime", getUpdateTime())
+            .append("remark", getRemark())
+            .toString();
+    }
+}

+ 27 - 1
ruoyi-system/src/main/java/com/ruoyi/system/domain/EquipmentConfiguration.java

@@ -38,7 +38,33 @@ public class EquipmentConfiguration extends BaseEntity
     @Excel(name = "设备ip", readConverterExp = "映=射的外网ip")
     private String equipmentIp;
 
-    public void setEquipmentId(Long equipmentId) 
+    /**
+     * 验证码
+     */
+    private String code;
+
+    /**
+     * 手机号
+     */
+    private String phoneNumber;
+
+    public String getCode() {
+        return code;
+    }
+
+    public void setCode(String code) {
+        this.code = code;
+    }
+
+    public String getPhoneNumber() {
+        return phoneNumber;
+    }
+
+    public void setPhoneNumber(String phoneNumber) {
+        this.phoneNumber = phoneNumber;
+    }
+
+    public void setEquipmentId(Long equipmentId)
     {
         this.equipmentId = equipmentId;
     }

+ 43 - 20
ruoyi-system/src/main/java/com/ruoyi/system/domain/MenuFood.java

@@ -1,7 +1,5 @@
 package com.ruoyi.system.domain;
 
-import org.apache.commons.lang3.builder.ToStringBuilder;
-import org.apache.commons.lang3.builder.ToStringStyle;
 import com.ruoyi.common.annotation.Excel;
 import com.ruoyi.common.core.domain.BaseEntity;
 
@@ -29,14 +27,17 @@ public class MenuFood extends BaseEntity
     /** 食谱早餐详情 */
     @Excel(name = "食谱早餐详情")
     private String menuFoodDetailBk;
+    private String menuFoodDetailBkPhoto;
 
     /** 食谱中餐详情 */
     @Excel(name = "食谱中餐详情")
     private String menuFoodDetailLu;
+    private String menuFoodDetailLuPhoto;
 
     /** 食谱晚餐详情 */
     @Excel(name = "食谱晚餐详情")
     private String menuFoodDetailDi;
+    private String menuFoodDetailDiPhoto;
 
     /** 食堂名称 */
     @Excel(name = "食堂名称")
@@ -53,7 +54,31 @@ public class MenuFood extends BaseEntity
     /** 创建部门 */
     private Long createDept;
 
-    public void setMenuFoodId(Long menuFoodId) 
+    public String getMenuFoodDetailBkPhoto() {
+        return menuFoodDetailBkPhoto;
+    }
+
+    public void setMenuFoodDetailBkPhoto(String menuFoodDetailBkPhoto) {
+        this.menuFoodDetailBkPhoto = menuFoodDetailBkPhoto;
+    }
+
+    public String getMenuFoodDetailLuPhoto() {
+        return menuFoodDetailLuPhoto;
+    }
+
+    public void setMenuFoodDetailLuPhoto(String menuFoodDetailLuPhoto) {
+        this.menuFoodDetailLuPhoto = menuFoodDetailLuPhoto;
+    }
+
+    public String getMenuFoodDetailDiPhoto() {
+        return menuFoodDetailDiPhoto;
+    }
+
+    public void setMenuFoodDetailDiPhoto(String menuFoodDetailDiPhoto) {
+        this.menuFoodDetailDiPhoto = menuFoodDetailDiPhoto;
+    }
+
+    public void setMenuFoodId(Long menuFoodId)
     {
         this.menuFoodId = menuFoodId;
     }
@@ -146,22 +171,20 @@ public class MenuFood extends BaseEntity
 
     @Override
     public String toString() {
-        return new ToStringBuilder(this,ToStringStyle.MULTI_LINE_STYLE)
-            .append("menuFoodId", getMenuFoodId())
-            .append("menuFoodTime", getMenuFoodTime())
-            .append("menuFoodType", getMenuFoodType())
-            .append("menuFoodDetailBk", getMenuFoodDetailBk())
-            .append("menuFoodDetailLu", getMenuFoodDetailLu())
-            .append("menuFoodDetailDi", getMenuFoodDetailDi())
-            .append("canteenName", getCanteenName())
-            .append("canteenId", getCanteenId())
-            .append("isUse", getIsUse())
-            .append("createDept", getCreateDept())
-            .append("createBy", getCreateBy())
-            .append("createTime", getCreateTime())
-            .append("updateBy", getUpdateBy())
-            .append("updateTime", getUpdateTime())
-            .append("remark", getRemark())
-            .toString();
+        return "MenuFood{" +
+                "menuFoodId=" + menuFoodId +
+                ", menuFoodTime='" + menuFoodTime + '\'' +
+                ", menuFoodType='" + menuFoodType + '\'' +
+                ", menuFoodDetailBk='" + menuFoodDetailBk + '\'' +
+                ", menuFoodDetailBkPhoto='" + menuFoodDetailBkPhoto + '\'' +
+                ", menuFoodDetailLu='" + menuFoodDetailLu + '\'' +
+                ", menuFoodDetailLuPhoto='" + menuFoodDetailLuPhoto + '\'' +
+                ", menuFoodDetailDi='" + menuFoodDetailDi + '\'' +
+                ", menuFoodDetailDiPhoto='" + menuFoodDetailDiPhoto + '\'' +
+                ", canteenName='" + canteenName + '\'' +
+                ", canteenId=" + canteenId +
+                ", isUse='" + isUse + '\'' +
+                ", createDept=" + createDept +
+                '}';
     }
 }

+ 43 - 20
ruoyi-system/src/main/java/com/ruoyi/system/domain/MenuFoodRecord.java

@@ -3,8 +3,6 @@ package com.ruoyi.system.domain;
 import com.fasterxml.jackson.annotation.JsonFormat;
 import com.ruoyi.common.annotation.Excel;
 import com.ruoyi.common.core.domain.BaseEntity;
-import org.apache.commons.lang3.builder.ToStringBuilder;
-import org.apache.commons.lang3.builder.ToStringStyle;
 
 import java.util.Date;
 
@@ -32,14 +30,17 @@ public class MenuFoodRecord extends BaseEntity
     /** 食谱早餐详情 */
     @Excel(name = "食谱早餐详情")
     private String menuFoodDetailBk;
+    private String menuFoodDetailBkPhoto;
 
     /** 食谱中餐详情 */
     @Excel(name = "食谱中餐详情")
     private String menuFoodDetailLu;
+    private String menuFoodDetailLuPhoto;
 
     /** 食谱午餐详情 */
     @Excel(name = "食谱午餐详情")
     private String menuFoodDetailDi;
+    private String menuFoodDetailDiPhoto;
 
     /** 食堂名称 */
     @Excel(name = "食堂名称")
@@ -57,7 +58,31 @@ public class MenuFoodRecord extends BaseEntity
     /** 创建部门 */
     private Long createDept;
 
-    public void setMenuFoodRecordId(Long menuFoodRecordId) 
+    public String getMenuFoodDetailBkPhoto() {
+        return menuFoodDetailBkPhoto;
+    }
+
+    public void setMenuFoodDetailBkPhoto(String menuFoodDetailBkPhoto) {
+        this.menuFoodDetailBkPhoto = menuFoodDetailBkPhoto;
+    }
+
+    public String getMenuFoodDetailLuPhoto() {
+        return menuFoodDetailLuPhoto;
+    }
+
+    public void setMenuFoodDetailLuPhoto(String menuFoodDetailLuPhoto) {
+        this.menuFoodDetailLuPhoto = menuFoodDetailLuPhoto;
+    }
+
+    public String getMenuFoodDetailDiPhoto() {
+        return menuFoodDetailDiPhoto;
+    }
+
+    public void setMenuFoodDetailDiPhoto(String menuFoodDetailDiPhoto) {
+        this.menuFoodDetailDiPhoto = menuFoodDetailDiPhoto;
+    }
+
+    public void setMenuFoodRecordId(Long menuFoodRecordId)
     {
         this.menuFoodRecordId = menuFoodRecordId;
     }
@@ -150,22 +175,20 @@ public class MenuFoodRecord extends BaseEntity
 
     @Override
     public String toString() {
-        return new ToStringBuilder(this,ToStringStyle.MULTI_LINE_STYLE)
-            .append("menuFoodRecordId", getMenuFoodRecordId())
-            .append("menuFoodTime", getMenuFoodTime())
-            .append("menuFoodType", getMenuFoodType())
-            .append("menuFoodDetailBk", getMenuFoodDetailBk())
-            .append("menuFoodDetailLu", getMenuFoodDetailLu())
-            .append("menuFoodDetailDi", getMenuFoodDetailDi())
-            .append("canteenName", getCanteenName())
-            .append("canteenId", getCanteenId())
-            .append("recordTime", getRecordTime())
-            .append("createDept", getCreateDept())
-            .append("createBy", getCreateBy())
-            .append("createTime", getCreateTime())
-            .append("updateBy", getUpdateBy())
-            .append("updateTime", getUpdateTime())
-            .append("remark", getRemark())
-            .toString();
+        return "MenuFoodRecord{" +
+                "menuFoodRecordId=" + menuFoodRecordId +
+                ", menuFoodTime='" + menuFoodTime + '\'' +
+                ", menuFoodType='" + menuFoodType + '\'' +
+                ", menuFoodDetailBk='" + menuFoodDetailBk + '\'' +
+                ", menuFoodDetailBkPhoto='" + menuFoodDetailBkPhoto + '\'' +
+                ", menuFoodDetailLu='" + menuFoodDetailLu + '\'' +
+                ", menuFoodDetailLuPhoto='" + menuFoodDetailLuPhoto + '\'' +
+                ", menuFoodDetailDi='" + menuFoodDetailDi + '\'' +
+                ", menuFoodDetailDiPhoto='" + menuFoodDetailDiPhoto + '\'' +
+                ", canteenName='" + canteenName + '\'' +
+                ", canteenId=" + canteenId +
+                ", recordTime=" + recordTime +
+                ", createDept=" + createDept +
+                '}';
     }
 }

+ 63 - 0
ruoyi-system/src/main/java/com/ruoyi/system/mapper/ClockHolidaysMapper.java

@@ -0,0 +1,63 @@
+package com.ruoyi.system.mapper;
+
+import java.util.List;
+import com.ruoyi.system.domain.ClockHolidays;
+
+/**
+ * 节假日时间Mapper接口
+ * 
+ * @author boman
+ * @date 2024-11-27
+ */
+public interface ClockHolidaysMapper 
+{
+    /**
+     * 查询节假日时间
+     * 
+     * @param id 节假日时间主键
+     * @return 节假日时间
+     */
+    public ClockHolidays selectClockHolidaysById(Long id);
+
+    /**
+     * 查询节假日时间列表
+     * 
+     * @param clockHolidays 节假日时间
+     * @return 节假日时间集合
+     */
+    public List<ClockHolidays> selectClockHolidaysList(ClockHolidays clockHolidays);
+
+    /**
+     * 新增节假日时间
+     * 
+     * @param clockHolidays 节假日时间
+     * @return 结果
+     */
+    public int insertClockHolidays(ClockHolidays clockHolidays);
+
+    /**
+     * 修改节假日时间
+     * 
+     * @param clockHolidays 节假日时间
+     * @return 结果
+     */
+    public int updateClockHolidays(ClockHolidays clockHolidays);
+
+    /**
+     * 删除节假日时间
+     * 
+     * @param id 节假日时间主键
+     * @return 结果
+     */
+    public int deleteClockHolidaysById(Long id);
+
+    /**
+     * 批量删除节假日时间
+     * 
+     * @param ids 需要删除的数据主键集合
+     * @return 结果
+     */
+    public int deleteClockHolidaysByIds(Long[] ids);
+
+    List<ClockHolidays> selectClockHolidaysMonthList(ClockHolidays clockHoliday);
+}

+ 74 - 0
ruoyi-system/src/main/java/com/ruoyi/system/mapper/MenuBoxMapper.java

@@ -0,0 +1,74 @@
+package com.ruoyi.system.mapper;
+
+import com.ruoyi.common.core.domain.entity.MenuBox;
+import org.apache.ibatis.annotations.Param;
+
+import java.util.List;
+
+/**
+ * 包厢菜单Mapper接口
+ * 
+ * @author boman
+ * @date 2025-01-22
+ */
+public interface MenuBoxMapper 
+{
+    /**
+     * 查询包厢菜单
+     * 
+     * @param menuBoxId 包厢菜单主键
+     * @return 包厢菜单
+     */
+    public MenuBox selectMenuBoxByMenuBoxId(Long menuBoxId);
+    public MenuBox selectMenuBoxById(Long menuBoxId);
+    /**
+     * 根据ID查询所有子菜品
+     *
+     * @param menuBoxId 菜品ID
+     * @return 菜品列表
+     */
+    public List<MenuBox> selectChildrenMenuBoxById(Long menuBoxId);
+
+    public  int updateMenuBoxChildren(@Param("menuBoxs") List<MenuBox> menuBoxs);
+    /**
+     * 查询包厢菜单列表
+     * 
+     * @param menuBox 包厢菜单
+     * @return 包厢菜单集合
+     */
+    public List<MenuBox> selectMenuBoxList(MenuBox menuBox);
+
+    /**
+     * 新增包厢菜单
+     * 
+     * @param menuBox 包厢菜单
+     * @return 结果
+     */
+    public int insertMenuBox(MenuBox menuBox);
+
+    /**
+     * 修改包厢菜单
+     * 
+     * @param menuBox 包厢菜单
+     * @return 结果
+     */
+    public int updateMenuBox(MenuBox menuBox);
+
+    /**
+     * 删除包厢菜单
+     * 
+     * @param menuBoxId 包厢菜单主键
+     * @return 结果
+     */
+    public int deleteMenuBoxByMenuBoxId(Long menuBoxId);
+
+    /**
+     * 批量删除包厢菜单
+     * 
+     * @param menuBoxIds 需要删除的数据主键集合
+     * @return 结果
+     */
+    public int deleteMenuBoxByMenuBoxIds(Long[] menuBoxIds);
+
+    public MenuBox checkMenuBoxNameUnique(@Param("foodName") String foodName, @Param("parentId") Long parentId);
+}

+ 61 - 0
ruoyi-system/src/main/java/com/ruoyi/system/service/IClockHolidaysService.java

@@ -0,0 +1,61 @@
+package com.ruoyi.system.service;
+
+import java.util.List;
+import com.ruoyi.system.domain.ClockHolidays;
+
+/**
+ * 节假日时间Service接口
+ * 
+ * @author boman
+ * @date 2024-11-27
+ */
+public interface IClockHolidaysService 
+{
+    /**
+     * 查询节假日时间
+     * 
+     * @param id 节假日时间主键
+     * @return 节假日时间
+     */
+    public ClockHolidays selectClockHolidaysById(Long id);
+
+    /**
+     * 查询节假日时间列表
+     * 
+     * @param clockHolidays 节假日时间
+     * @return 节假日时间集合
+     */
+    public List<ClockHolidays> selectClockHolidaysList(ClockHolidays clockHolidays);
+
+    /**
+     * 新增节假日时间
+     * 
+     * @param clockHolidays 节假日时间
+     * @return 结果
+     */
+    public int insertClockHolidays(ClockHolidays clockHolidays);
+
+    /**
+     * 修改节假日时间
+     * 
+     * @param clockHolidays 节假日时间
+     * @return 结果
+     */
+    public int updateClockHolidays(ClockHolidays clockHolidays);
+
+    /**
+     * 批量删除节假日时间
+     * 
+     * @param ids 需要删除的节假日时间主键集合
+     * @return 结果
+     */
+    public int deleteClockHolidaysByIds(Long[] ids);
+
+    /**
+     * 删除节假日时间信息
+     * 
+     * @param id 节假日时间主键
+     * @return 结果
+     */
+    public int deleteClockHolidaysById(Long id);
+}

+ 4 - 0
ruoyi-system/src/main/java/com/ruoyi/system/service/IClockRecordService.java

@@ -72,4 +72,8 @@ public interface IClockRecordService
     AjaxResult personage(ClockRecord clockRecord);
 
     List<Map<String,Object>> all(ClockUserInfo clockUserInfo);
+
+    AjaxResult abnormal(ClockRecord clockRecord);
+
+    AjaxResult details(ClockRecord clockRecord);
 }

+ 4 - 0
ruoyi-system/src/main/java/com/ruoyi/system/service/IClockUserInfoService.java

@@ -1,6 +1,8 @@
 package com.ruoyi.system.service;
 
 import java.util.List;
+
+import com.ruoyi.common.core.domain.entity.SysUser;
 import com.ruoyi.system.domain.ClockUserInfo;
 
 /**
@@ -60,4 +62,6 @@ public interface IClockUserInfoService
     public int deleteClockUserInfoByUserId(Long userId);
 
     List<ClockUserInfo> selectClockUserInfoRecordList(ClockUserInfo clockUserInfo);
+
+    int insertClockUserInfoList(List<SysUser> sysUserList);
 }

+ 90 - 0
ruoyi-system/src/main/java/com/ruoyi/system/service/IMenuBoxService.java

@@ -0,0 +1,90 @@
+package com.ruoyi.system.service;
+
+import com.ruoyi.common.core.domain.TreeSelect;
+import com.ruoyi.common.core.domain.entity.MenuBox;
+
+import java.util.List;
+
+/**
+ * 包厢菜单Service接口
+ * 
+ * @author boman
+ * @date 2025-01-22
+ */
+public interface IMenuBoxService 
+{
+    /**
+     * 查询包厢菜单
+     * 
+     * @param menuBoxId 包厢菜单主键
+     * @return 包厢菜单
+     */
+    public MenuBox selectMenuBoxByMenuBoxId(Long menuBoxId);
+
+    /**
+     * 查询包厢菜单列表
+     * 
+     * @param menuBox 包厢菜单
+     * @return 包厢菜单集合
+     */
+    public List<MenuBox> selectMenuBoxList(MenuBox menuBox);
+
+    /**
+     * 查询菜品树结构信息
+     *
+     * @param menuBox 菜品信息
+     * @return 菜品树信息集合
+     */
+    public List<TreeSelect> selectMenuBoxTreeList(MenuBox menuBox);
+
+    /**
+     * 构建前端所需要下拉树结构
+     *
+     * @param menuBoxs 菜品列表
+     * @return 下拉树结构列表
+     */
+    public List<TreeSelect> buildMenuBoxTreeSelect(List<MenuBox> menuBoxs);
+
+    /**
+     * 构建前端所需要树结构
+     *
+     * @param menuBoxs 菜品列表
+     * @return 树结构列表
+     */
+    public List<MenuBox> buildMenuBoxTree(List<MenuBox> menuBoxs);
+
+    /**
+     * 新增包厢菜单
+     * 
+     * @param menuBox 包厢菜单
+     * @return 结果
+     */
+    public int insertMenuBox(MenuBox menuBox);
+
+    /**
+     * 修改包厢菜单
+     * 
+     * @param menuBox 包厢菜单
+     * @return 结果
+     */
+    public int updateMenuBox(MenuBox menuBox);
+
+    /**
+     * 批量删除包厢菜单
+     * 
+     * @param menuBoxIds 需要删除的包厢菜单主键集合
+     * @return 结果
+     */
+    public int deleteMenuBoxByMenuBoxIds(Long[] menuBoxIds);
+
+    /**
+     * 删除包厢菜单信息
+     * 
+     * @param menuBoxId 包厢菜单主键
+     * @return 结果
+     */
+    public int deleteMenuBoxByMenuBoxId(Long menuBoxId);
+    public boolean checkMenuBoxNameUnique(MenuBox menuBox);
+
+
+}

+ 27 - 1
ruoyi-system/src/main/java/com/ruoyi/system/service/impl/CameraServiceImpl.java

@@ -3,17 +3,21 @@ package com.ruoyi.system.service.impl;
 import com.alibaba.fastjson2.JSON;
 import com.alibaba.fastjson2.JSONArray;
 import com.alibaba.fastjson2.JSONObject;
+import com.alibaba.fastjson2.TypeReference;
 import com.ruoyi.common.core.domain.AjaxResult;
 import com.ruoyi.common.exception.ServiceException;
 import com.ruoyi.common.utils.SecurityUtils;
 import com.ruoyi.common.utils.StringUtils;
 import com.ruoyi.common.utils.hkws.GetCameraPreviewURL;
+import com.ruoyi.system.domain.EquipmentConfiguration;
 import com.ruoyi.system.domain.vo.CameraInfoVo;
+import com.ruoyi.system.mapper.EquipmentConfigurationMapper;
 import com.ruoyi.system.service.CameraService;
 import org.apache.poi.ss.usermodel.DateUtil;
+import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.stereotype.Service;
 
-import java.util.Date;
+import java.util.*;
 
 
 /**
@@ -24,8 +28,13 @@ import java.util.Date;
  */
 @Service
 public class CameraServiceImpl implements CameraService {
+
+    @Autowired
+    private EquipmentConfigurationMapper equipmentConfigurationMapper;
+
     @Override
     public AjaxResult selectCameraList(CameraInfoVo cameraInfoVo) {
+        //Map<String,JSONObject> map = new HashMap<>();
         /**
          * STEP3:设置接口的URI地址
          */
@@ -47,6 +56,23 @@ public class CameraServiceImpl implements CameraService {
 
         String result = GetCameraPreviewURL.GetCameraPreviewURL(url,body);
         JSONObject jsonObject = JSON.parseObject(result);
+        //将门禁设备单独列出
+        //Map<String, Object> map = jsonObject.to(new TypeReference<Map<String, Object>>() {});
+        JSONObject data = (JSONObject) jsonObject.get("data");
+        JSONArray itemsArray = data.getJSONArray("list");
+        List<JSONObject> itemsList = itemsArray.toJavaList(JSONObject.class);
+        List<JSONObject> accessList = new ArrayList<>();
+        //查询门禁设备名字
+        List<EquipmentConfiguration> equipmentList = equipmentConfigurationMapper.selectEquipmentConfigurationList(new EquipmentConfiguration());
+        for (JSONObject object : itemsList) {
+            for (EquipmentConfiguration equipmentConfiguration : equipmentList) {
+                if(object.get("name").equals(equipmentConfiguration.getEquipmentName())){
+                    accessList.add(object);
+                }
+            }
+        }
+        data.put("access",accessList);
+
         return AjaxResult.success(jsonObject);
     }
 

+ 96 - 0
ruoyi-system/src/main/java/com/ruoyi/system/service/impl/ClockHolidaysServiceImpl.java

@@ -0,0 +1,96 @@
+package com.ruoyi.system.service.impl;
+
+import java.util.List;
+import com.ruoyi.common.utils.DateUtils;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Service;
+import com.ruoyi.system.mapper.ClockHolidaysMapper;
+import com.ruoyi.system.domain.ClockHolidays;
+import com.ruoyi.system.service.IClockHolidaysService;
+
+/**
+ * 节假日时间Service业务层处理
+ * 
+ * @author boman
+ * @date 2024-11-27
+ */
+@Service
+public class ClockHolidaysServiceImpl implements IClockHolidaysService 
+{
+    @Autowired
+    private ClockHolidaysMapper clockHolidaysMapper;
+
+    /**
+     * 查询节假日时间
+     * 
+     * @param id 节假日时间主键
+     * @return 节假日时间
+     */
+    @Override
+    public ClockHolidays selectClockHolidaysById(Long id)
+    {
+        return clockHolidaysMapper.selectClockHolidaysById(id);
+    }
+
+    /**
+     * 查询节假日时间列表
+     * 
+     * @param clockHolidays 节假日时间
+     * @return 节假日时间
+     */
+    @Override
+    public List<ClockHolidays> selectClockHolidaysList(ClockHolidays clockHolidays)
+    {
+        return clockHolidaysMapper.selectClockHolidaysList(clockHolidays);
+    }
+
+    /**
+     * 新增节假日时间
+     * 
+     * @param clockHolidays 节假日时间
+     * @return 结果
+     */
+    @Override
+    public int insertClockHolidays(ClockHolidays clockHolidays)
+    {
+        clockHolidays.setCreateTime(DateUtils.getNowDate());
+        return clockHolidaysMapper.insertClockHolidays(clockHolidays);
+    }
+
+    /**
+     * 修改节假日时间
+     * 
+     * @param clockHolidays 节假日时间
+     * @return 结果
+     */
+    @Override
+    public int updateClockHolidays(ClockHolidays clockHolidays)
+    {
+        clockHolidays.setUpdateTime(DateUtils.getNowDate());
+        return clockHolidaysMapper.updateClockHolidays(clockHolidays);
+    }
+
+    /**
+     * 批量删除节假日时间
+     * 
+     * @param ids 需要删除的节假日时间主键
+     * @return 结果
+     */
+    @Override
+    public int deleteClockHolidaysByIds(Long[] ids)
+    {
+        return clockHolidaysMapper.deleteClockHolidaysByIds(ids);
+    }
+
+    /**
+     * 删除节假日时间信息
+     * 
+     * @param id 节假日时间主键
+     * @return 结果
+     */
+    @Override
+    public int deleteClockHolidaysById(Long id)
+    {
+        return clockHolidaysMapper.deleteClockHolidaysById(id);
+    }
+}

+ 395 - 134
ruoyi-system/src/main/java/com/ruoyi/system/service/impl/ClockRecordServiceImpl.java

@@ -7,31 +7,26 @@ import java.util.stream.Collectors;
 import com.ruoyi.common.core.domain.AjaxResult;
 import com.ruoyi.common.core.domain.entity.SysRole;
 import com.ruoyi.common.core.domain.entity.SysUser;
+import com.ruoyi.common.exception.ServiceException;
 import com.ruoyi.common.utils.DateUtils;
 import com.ruoyi.common.utils.PageUtils;
 import com.ruoyi.common.utils.SecurityUtils;
 import com.ruoyi.common.utils.StringUtils;
-import com.ruoyi.system.domain.ClockUserInfo;
-import com.ruoyi.system.domain.DutySchedule;
-import com.ruoyi.system.domain.OrderFood;
-import com.ruoyi.system.mapper.ClockUserInfoMapper;
-import com.ruoyi.system.mapper.DutyScheduleMapper;
-import com.ruoyi.system.mapper.OrderFoodMapper;
+import com.ruoyi.system.domain.*;
+import com.ruoyi.system.mapper.*;
+import lombok.SneakyThrows;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.stereotype.Service;
-import com.ruoyi.system.mapper.ClockRecordMapper;
-import com.ruoyi.system.domain.ClockRecord;
 import com.ruoyi.system.service.IClockRecordService;
 
 /**
  * 打卡记录Service业务层处理
- * 
+ *
  * @author ruoyi
  * @date 2024-08-06
  */
 @Service
-public class ClockRecordServiceImpl implements IClockRecordService 
-{
+public class ClockRecordServiceImpl implements IClockRecordService {
     @Autowired
     private ClockRecordMapper clockRecordMapper;
     @Autowired
@@ -40,37 +35,37 @@ public class ClockRecordServiceImpl implements IClockRecordService
     private OrderFoodMapper orderFoodMapper;
     @Autowired
     private DutyScheduleMapper dutyScheduleMapper;
+    @Autowired
+    private ClockHolidaysMapper clockHolidaysMapper;
 
     /**
      * 查询打卡记录
-     * 
+     *
      * @param clockId 打卡记录主键
      * @return 打卡记录
      */
     @Override
-    public ClockRecord selectClockRecordByClockId(Long clockId)
-    {
+    public ClockRecord selectClockRecordByClockId(Long clockId) {
         return clockRecordMapper.selectClockRecordByClockId(clockId);
     }
 
     /**
      * 查询打卡记录列表
-     * 
+     *
      * @param clockRecord 打卡记录
      * @return 打卡记录
      */
     @Override
-    public List<ClockRecord> selectClockRecordList(ClockRecord clockRecord)
-    {
+    public List<ClockRecord> selectClockRecordList(ClockRecord clockRecord) {
         SysUser user = SecurityUtils.getLoginUser().getUser();
         List<SysRole> roles = user.getRoles();
         boolean bl = true;
         for (SysRole role : roles) {
-            if("admin".equals(role.getRoleKey()) || "administrators".equals(role.getRoleKey())){
+            if ("admin".equals(role.getRoleKey()) || "administrators".equals(role.getRoleKey())) {
                 bl = false;
             }
         }
-        if(bl){
+        if (bl) {
             clockRecord.setUserId(user.getUserId());
         }
         return clockRecordMapper.selectClockRecordList(clockRecord);
@@ -78,14 +73,18 @@ public class ClockRecordServiceImpl implements IClockRecordService
 
     /**
      * 新增打卡记录
-     * 
+     *
      * @param clockRecord 打卡记录
      * @return 结果
      */
     @Override
-    public int insertClockRecord(ClockRecord clockRecord)
-    {
+    public int insertClockRecord(ClockRecord clockRecord) {
         SysUser user = SecurityUtils.getLoginUser().getUser();
+        //判断当前人员是否能考勤
+        ClockUserInfo clockUserInfo = clockUserInfoMapper.selectClockUserInfoByUserId(user.getUserId());
+        if (clockUserInfo == null) {
+            throw new ServiceException("当前账号无法打卡");
+        }
         clockRecord.setUserId(user.getUserId());
         clockRecord.setUserName(user.getNickName());
         clockRecord.setPhonenumber(user.getPhonenumber());
@@ -105,38 +104,35 @@ public class ClockRecordServiceImpl implements IClockRecordService
 
     /**
      * 修改打卡记录
-     * 
+     *
      * @param clockRecord 打卡记录
      * @return 结果
      */
     @Override
-    public int updateClockRecord(ClockRecord clockRecord)
-    {
+    public int updateClockRecord(ClockRecord clockRecord) {
         clockRecord.setUpdateTime(DateUtils.getNowDate());
         return clockRecordMapper.updateClockRecord(clockRecord);
     }
 
     /**
      * 批量删除打卡记录
-     * 
+     *
      * @param clockIds 需要删除的打卡记录主键
      * @return 结果
      */
     @Override
-    public int deleteClockRecordByClockIds(Long[] clockIds)
-    {
+    public int deleteClockRecordByClockIds(Long[] clockIds) {
         return clockRecordMapper.deleteClockRecordByClockIds(clockIds);
     }
 
     /**
      * 删除打卡记录信息
-     * 
+     *
      * @param clockId 打卡记录主键
      * @return 结果
      */
     @Override
-    public int deleteClockRecordByClockId(Long clockId)
-    {
+    public int deleteClockRecordByClockId(Long clockId) {
         return clockRecordMapper.deleteClockRecordByClockId(clockId);
     }
 
@@ -145,57 +141,60 @@ public class ClockRecordServiceImpl implements IClockRecordService
         Map<String, Object> resultMap = new HashMap<>();
         //查询人员数据
         ClockUserInfo clockUserInfo = clockUserInfoMapper.selectClockUserInfoByUserId(clockRecord.getUserId());
-        resultMap.put("name",clockUserInfo.getUserName());
+        resultMap.put("name", clockUserInfo.getUserName());
         //查询最新打卡数据
         ClockRecord clockRecordNew = clockRecordMapper.selectClockRecordNew(clockRecord);
-        resultMap.put("time",clockRecordNew.getRecordDate());
+        resultMap.put("time", "");
+        if (clockRecordNew != null) {
+            resultMap.put("time", clockRecordNew.getRecordDate());
+        }
         //todo 上下班时间
         DutySchedule dutySchedule = dutyScheduleMapper.selectDutyScheduleByDutyNew();
-        resultMap.put("workTime",dutySchedule.getStartWorkTime()+" - "+dutySchedule.getEndWorkTime());
+        resultMap.put("workTime", dutySchedule.getStartWorkTime() + " - " + dutySchedule.getEndWorkTime());
         //查询查询月打卡数据
         List<ClockRecord> clockRecords = clockRecordMapper.selectOrderFoodListRl(clockRecord);
         //按日期分类
         Map<String, List<ClockRecord>> clockTime = new HashMap<>();
-        if (clockRecords != null && clockRecords.size() > 0){
+        if (clockRecords != null && clockRecords.size() > 0) {
             clockTime = clockRecords.stream().collect(Collectors.groupingBy(ClockRecord::getRecordDate));
         }
         //查询传入月所有日期
         List<String> dayList = DateUtils.getDay(DateUtils.parseDate(clockRecord.getRecordDate()));
         //写入数据
         List<Map> mapList = new ArrayList<>();
-        if (dayList.size()> 0){
+        if (dayList.size() > 0) {
             for (String day : dayList) {
-                Map<String,Object> map = new HashMap<>(5);
-                map.put("date",day);
-                map.put("am","未打卡");
+                Map<String, Object> map = new HashMap<>(5);
+                map.put("date", day);
+                map.put("am", "未打卡");
                 //上午打卡标识 1:正常打卡,2:外勤打卡,3:迟到,4:早退,5:未打卡
-                map.put("amex","5");
-                map.put("pm","未打卡");
+                map.put("amex", "5");
+                map.put("pm", "未打卡");
                 //下午打卡标识 1:正常打卡,2:外勤打卡,3:迟到,4:早退,5:未打卡
-                map.put("pmex","5");
-                if (clockTime.size() > 0){
+                map.put("pmex", "5");
+                if (clockTime.size() > 0) {
                     List<ClockRecord> clockRecordList = clockTime.get(day);
-                    if (clockRecordList != null && clockRecordList.size() > 0){
+                    if (clockRecordList != null && clockRecordList.size() > 0) {
                         clockRecordList = clockRecordList.stream().sorted(Comparator.comparing(ClockRecord::getRecordTime).reversed()).collect(Collectors.toList());
-                        if("1".equals(clockRecordList.get(clockRecordList.size()-1).getType())){
-                            map.put("am",clockRecordList.get(clockRecordList.size()-1).getRecordTime());
+                        if ("1".equals(clockRecordList.get(clockRecordList.size() - 1).getType())) {
+                            map.put("am", clockRecordList.get(clockRecordList.size() - 1).getRecordTime());
                             //上午打卡表示  1:正常打卡,2:外勤打卡,3:迟到,4:早退,5:未打卡
-                            map.put("amex",clockRecordList.get(clockRecordList.size()-1).getIsOutwork());
+                            map.put("amex", clockRecordList.get(clockRecordList.size() - 1).getIsOutwork());
                         }
-                        if("2".equals(clockRecordList.get(clockRecordList.size()-1).getType())){
-                            map.put("pm",clockRecordList.get(clockRecordList.size()-1).getRecordTime());
+                        if ("2".equals(clockRecordList.get(clockRecordList.size() - 1).getType())) {
+                            map.put("pm", clockRecordList.get(clockRecordList.size() - 1).getRecordTime());
                             //下午打卡表示  1:正常打卡,2:外勤打卡,3:迟到,4:早退,5:未打卡
-                            map.put("pmex",clockRecordList.get(clockRecordList.size()-1).getIsOutwork());
+                            map.put("pmex", clockRecordList.get(clockRecordList.size() - 1).getIsOutwork());
                         }
-                        if("1".equals(clockRecordList.get(0).getType())){
-                            map.put("am",clockRecordList.get(0).getRecordTime());
+                        if ("1".equals(clockRecordList.get(0).getType())) {
+                            map.put("am", clockRecordList.get(0).getRecordTime());
                             //上午打卡表示  1:正常打卡,2:外勤打卡,3:迟到,4:早退,5:未打卡
-                            map.put("amex",clockRecordList.get(0).getIsOutwork());
+                            map.put("amex", clockRecordList.get(0).getIsOutwork());
                         }
-                        if("2".equals(clockRecordList.get(0).getType())){
-                            map.put("pm",clockRecordList.get(0).getRecordTime());
+                        if ("2".equals(clockRecordList.get(0).getType())) {
+                            map.put("pm", clockRecordList.get(0).getRecordTime());
                             //下午打卡表示  1:正常打卡,2:外勤打卡,3:迟到,4:早退,5:未打卡
-                            map.put("pmex",clockRecordList.get(0).getIsOutwork());
+                            map.put("pmex", clockRecordList.get(0).getIsOutwork());
                         }
 
                     }
@@ -204,7 +203,18 @@ public class ClockRecordServiceImpl implements IClockRecordService
             }
         }
         //日历数据
-        resultMap.put("rlData",mapList);
+        resultMap.put("rlData", mapList);
+        //补班时间
+        //查询是否存在当前年数据
+        ClockHolidays clockHoliday = new ClockHolidays();
+        clockHoliday.setYear(DateUtils.getYear());
+        clockHoliday.setHolidayDate(clockRecord.getRecordDate());
+        List<ClockHolidays> clockHolidaysList = clockHolidaysMapper.selectClockHolidaysMonthList(clockHoliday);
+        if (clockHolidaysList == null || clockHolidaysList.size() < 0) {
+            clockHolidaysList = new ArrayList<>();
+        }
+        //放假数据
+        resultMap.put("holidays", clockHolidaysList);
         return AjaxResult.success(resultMap);
     }
 
@@ -223,15 +233,18 @@ public class ClockRecordServiceImpl implements IClockRecordService
         ClockUserInfo clockUserInfo = new ClockUserInfo();
         clockUserInfo.setDelFlag("0");
         List<ClockUserInfo> clockUserInfoList = clockUserInfoMapper.selectClockUserInfoList(clockUserInfo);
+        if(clockUserInfoList!=null && clockUserInfoList.size()>0){
+            dkzs = clockUserInfoList.size();
+        }
         //已打卡人数
         int ydk = 0;
         //未打卡人数
         int wdk = 0;
-        if(clockUserId!=null && clockUserId.size()>0){
+        if (clockUserId != null && clockUserId.size() > 0) {
             ydk = clockUserId.size();
         }
-        if(clockUserInfoList!=null && clockUserInfoList.size()>0){
-            wdk = clockUserInfoList.size()-clockUserId.size();
+        if (clockUserInfoList != null && clockUserInfoList.size() > 0) {
+            wdk = clockUserInfoList.size() - clockUserId.size();
         }
 
         //订餐统计
@@ -244,23 +257,23 @@ public class ClockRecordServiceImpl implements IClockRecordService
         int dcwc = 0;
         //订餐晚餐人数
         int dcDinner = 0;
-        if(orderFoods!=null && orderFoods.size()>0){
+        if (orderFoods != null && orderFoods.size() > 0) {
             dczs = orderFoods.size();
             for (OrderFood food : orderFoods) {
-                if("1".equals(food.getOrderFoodType())){
+                if ("1".equals(food.getOrderFoodType())) {
                     dcwc++;
                 }
-                if("2".equals(food.getOrderFoodType())){
+                if ("2".equals(food.getOrderFoodType())) {
                     dcDinner++;
                 }
             }
         }
-        resultMap.put("dkzs",dkzs);
-        resultMap.put("ydk",ydk);
-        resultMap.put("wdk",wdk);
-        resultMap.put("dczs",dczs);
-        resultMap.put("dcwc",dcwc);
-        resultMap.put("dcDinner",dcDinner);
+        resultMap.put("dkzs", dkzs);
+        resultMap.put("ydk", ydk);
+        resultMap.put("wdk", wdk);
+        resultMap.put("dczs", dczs);
+        resultMap.put("dcwc", dcwc);
+        resultMap.put("dcDinner", dcDinner);
         return AjaxResult.success(resultMap);
     }
 
@@ -269,53 +282,53 @@ public class ClockRecordServiceImpl implements IClockRecordService
         Map<String, Object> resultMap = new HashMap<>();
 
         DutySchedule dutySchedule = dutyScheduleMapper.selectDutyScheduleByDutyNew();
-        resultMap.put("workTime",dutySchedule.getStartWorkTime()+" - "+dutySchedule.getEndWorkTime());
+        resultMap.put("workTime", dutySchedule.getStartWorkTime() + " - " + dutySchedule.getEndWorkTime());
 
-        //查询查询打卡数据
+        //查询查询打卡数据
         List<ClockRecord> clockRecords = clockRecordMapper.selectClockRecordList(clockRecord);
         //按日期分类
         Map<String, List<ClockRecord>> clockTime = new HashMap<>();
-        if (clockRecords != null && clockRecords.size() > 0){
+        if (clockRecords != null && clockRecords.size() > 0) {
             clockTime = clockRecords.stream().collect(Collectors.groupingBy(ClockRecord::getRecordDate));
         }
         //查询传入月所有日期
-        List<Date> dayList = DateUtils.getDatesBetween(clockRecord.getStartTime(),clockRecord.getEndTime());
+        List<Date> dayList = DateUtils.getDatesBetween(clockRecord.getStartTime(), clockRecord.getEndTime());
         //写入数据
         List<Map> mapList = new ArrayList<>();
-        if (dayList.size()> 0){
+        if (dayList.size() > 0) {
             for (Date day : dayList) {
-                Map<String,Object> map = new HashMap<>(5);
+                Map<String, Object> map = new HashMap<>(5);
                 SimpleDateFormat format = new SimpleDateFormat("yyyy-MM-dd");
-                map.put("date",format.format(day));
-                map.put("am","未打卡");
+                map.put("date", format.format(day));
+                map.put("am", "未打卡");
                 //上午打卡标识  1:正常打卡,2:外勤打卡,3:迟到,4:早退,5:未打卡
-                map.put("amex","5");
-                map.put("pm","未打卡");
+                map.put("amex", "5");
+                map.put("pm", "未打卡");
                 //下午打卡标识  1:正常打卡,2:外勤打卡,3:迟到,4:早退,5:未打卡
-                map.put("pmex","5");
-                if (clockTime.size() > 0){
+                map.put("pmex", "5");
+                if (clockTime.size() > 0) {
                     List<ClockRecord> clockRecordList = clockTime.get(format.format(day));
-                    if (clockRecordList != null && clockRecordList.size() > 0){
+                    if (clockRecordList != null && clockRecordList.size() > 0) {
                         clockRecordList = clockRecordList.stream().sorted(Comparator.comparing(ClockRecord::getRecordTime).reversed()).collect(Collectors.toList());
-                        if("1".equals(clockRecordList.get(clockRecordList.size()-1).getType())){
-                            map.put("am",clockRecordList.get(clockRecordList.size()-1).getRecordTime());
+                        if ("1".equals(clockRecordList.get(clockRecordList.size() - 1).getType())) {
+                            map.put("am", clockRecordList.get(clockRecordList.size() - 1).getRecordTime());
                             //上午打卡表示  1:正常打卡,2:外勤打卡,3:迟到,4:早退,5:未打卡
-                            map.put("amex",clockRecordList.get(clockRecordList.size()-1).getIsOutwork());
+                            map.put("amex", clockRecordList.get(clockRecordList.size() - 1).getIsOutwork());
                         }
-                        if("2".equals(clockRecordList.get(clockRecordList.size()-1).getType())){
-                            map.put("pm",clockRecordList.get(clockRecordList.size()-1).getRecordTime());
+                        if ("2".equals(clockRecordList.get(clockRecordList.size() - 1).getType())) {
+                            map.put("pm", clockRecordList.get(clockRecordList.size() - 1).getRecordTime());
                             //下午打卡表示  1:正常打卡,2:外勤打卡,3:迟到,4:早退,5:未打卡
-                            map.put("pmex",clockRecordList.get(clockRecordList.size()-1).getIsOutwork());
+                            map.put("pmex", clockRecordList.get(clockRecordList.size() - 1).getIsOutwork());
                         }
-                        if("1".equals(clockRecordList.get(0).getType())){
-                            map.put("am",clockRecordList.get(0).getRecordTime());
+                        if ("1".equals(clockRecordList.get(0).getType())) {
+                            map.put("am", clockRecordList.get(0).getRecordTime());
                             //上午打卡表示  1:正常打卡,2:外勤打卡,3:迟到,4:早退,5:未打卡
-                            map.put("amex",clockRecordList.get(0).getIsOutwork());
+                            map.put("amex", clockRecordList.get(0).getIsOutwork());
                         }
-                        if("2".equals(clockRecordList.get(0).getType())){
-                            map.put("pm",clockRecordList.get(0).getRecordTime());
+                        if ("2".equals(clockRecordList.get(0).getType())) {
+                            map.put("pm", clockRecordList.get(0).getRecordTime());
                             //下午打卡表示  1:正常打卡,2:外勤打卡,3:迟到,4:早退,5:未打卡
-                            map.put("pmex",clockRecordList.get(0).getIsOutwork());
+                            map.put("pmex", clockRecordList.get(0).getIsOutwork());
                         }
 
                     }
@@ -324,35 +337,241 @@ public class ClockRecordServiceImpl implements IClockRecordService
             }
         }
         //日历数据
-        resultMap.put("rlData",mapList);
+        resultMap.put("rlData", mapList);
         return AjaxResult.success(resultMap);
     }
 
     @Override
     public AjaxResult personage(ClockRecord clockRecord) {
-        SysUser user = SecurityUtils.getLoginUser().getUser();
-        clockRecord.setUserId(user.getUserId());
         Map<String, Object> resultMap = statistics(clockRecord);
         return AjaxResult.success(resultMap);
     }
 
     @Override
-    public List<Map<String,Object>> all(ClockUserInfo clockUserInfo) {
-        List<Map<String,Object>> listMap = new ArrayList<>();
+    public List<Map<String, Object>> all(ClockUserInfo clockUserInfo) {
+        List<Map<String, Object>> listMap = new ArrayList<>();
         startPage();
         List<ClockUserInfo> clockUserList = clockUserInfoMapper.selectClockUserInfoList(clockUserInfo);
         clearPage();
         for (ClockUserInfo userInfo : clockUserList) {
             ClockRecord clockRecord = new ClockRecord();
             clockRecord.setUserId(userInfo.getUserId());
-            clockRecord.setRecordDate(clockUserInfo.getRecordDate()+"-01");
+            clockRecord.setRecordDate(clockUserInfo.getRecordDate() + "-01");
             Map<String, Object> resultMap = statistics(clockRecord);
-            resultMap.put("name",userInfo.getUserName());
+            resultMap.put("name", userInfo.getUserName());
+            resultMap.put("userId", userInfo.getUserId());
             listMap.add(resultMap);
         }
         return listMap;
     }
 
+    @SneakyThrows
+    @Override
+    public AjaxResult abnormal(ClockRecord clockRecord) {
+        Map<String, Object> resultMap = new HashMap<>();
+        int wq = 0;
+        int cd = 0;
+        int zt = 0;
+        int wdk = 0;
+        //获取所有打卡人员
+        //查询打卡人员
+        ClockUserInfo clockUserInfo = new ClockUserInfo();
+        clockUserInfo.setDelFlag("0");
+        List<ClockUserInfo> clockUserInfoList = clockUserInfoMapper.selectClockUserInfoList(clockUserInfo);
+        //获取时间段内的所有打卡信息
+        List<ClockRecord> clockRecords = clockRecordMapper.selectClockRecordList(clockRecord);
+
+        //按人员类
+        Map<Long, List<ClockRecord>> clockUser = new HashMap<>();
+        if (clockRecords != null && clockRecords.size() > 0) {
+            clockUser = clockRecords.stream().collect(Collectors.groupingBy(ClockRecord::getUserId));
+        }
+
+        //查询本年度所有节假日时间
+        //查询是否存在当前年数据
+        ClockHolidays clockHoliday = new ClockHolidays();
+        clockHoliday.setYear(DateUtils.getYear());
+        List<ClockHolidays> clockHolidaysList = clockHolidaysMapper.selectClockHolidaysList(clockHoliday);
+        //分成补班和节假日
+        List<String> jjrList = new ArrayList<>();
+        List<String> bbList = new ArrayList<>();
+        for (ClockHolidays clockHolidays : clockHolidaysList) {
+            if ("NO".equals(clockHolidays.getType())) {
+                jjrList.add(clockHolidays.getHolidayDate());
+            } else {
+                bbList.add(clockHolidays.getHolidayDate());
+            }
+        }
+
+
+        //查询传入两个日期的所有日期
+        List<Date> dayList = DateUtils.getDatesBetween(clockRecord.getStartTime(), clockRecord.getEndTime());
+        for (ClockUserInfo userInfo : clockUserInfoList) {
+            List<ClockRecord> clockRecordUser = clockUser.get(userInfo.getUserId());
+            //按日期分类
+            Map<String, List<ClockRecord>> clockTime = new HashMap<>();
+            if (clockRecordUser != null && clockRecordUser.size() > 0) {
+                clockTime = clockRecordUser.stream().collect(Collectors.groupingBy(ClockRecord::getRecordDate));
+            }
+            if (dayList.size() > 0) {
+                for (Date day : dayList) {
+                    SimpleDateFormat format = new SimpleDateFormat("yyyy-MM-dd");
+                    boolean bl = (DateUtils.dayForWeek(format.format(day)) == 6 || DateUtils.dayForWeek(format.format(day)) == 7);
+                    if (jjrList.contains(format.format(day)) || (bl && !bbList.contains(format.format(day)))) {
+                        continue;
+                    }
+                    List<ClockRecord> clockRecordList = clockTime.get(format.format(day));
+                    if (clockRecordList == null || clockRecordList.size() <= 0) {
+                        wdk++;
+                    } else {
+                        boolean sw = false;
+                        boolean xw = false;
+                        boolean bcd = false;
+                        boolean bzt = false;
+                        boolean bwq = false;
+
+                        Map<String, List<ClockRecord>> typMap = clockRecordList.stream().collect(Collectors.groupingBy(ClockRecord::getType));
+                        if (typMap.containsKey("1")) {
+                            //排序,时间倒序
+                            List<ClockRecord> clockRecordTyp = typMap.get("1");
+                            clockRecordTyp = clockRecordTyp.stream().sorted(Comparator.comparing(ClockRecord::getRecordTime).reversed()).collect(Collectors.toList());
+                            //上班卡取最后一条
+                            sw = true;
+                            if ("3".equals(clockRecordTyp.get(clockRecordTyp.size() - 1).getIsOutwork())) {
+                                bcd = true;
+                            }
+                            if ("2".equals(clockRecordTyp.get(clockRecordTyp.size() - 1).getIsOutwork())) {
+                                bwq = true;
+                            }
+                        }
+                        if (typMap.containsKey("2")) {
+                            //排序,时间倒序
+                            List<ClockRecord> clockRecordTyp = typMap.get("2");
+                            clockRecordTyp = clockRecordTyp.stream().sorted(Comparator.comparing(ClockRecord::getRecordTime).reversed()).collect(Collectors.toList());
+                            //下班卡取最第一条
+                            xw = true;
+                            if ("4".equals(clockRecordTyp.get(0).getIsOutwork())) {
+                                bzt = true;
+                            }
+                            if ("2".equals(clockRecordTyp.get(0).getIsOutwork())) {
+                                bwq = true;
+                            }
+
+                        }
+                        if (!sw || !xw) {
+                            wdk++;
+                        }
+                        if (bcd) {
+                            cd++;
+                        }
+                        if (bzt) {
+                            zt++;
+                        }
+                        if (bwq) {
+                            wq++;
+                        }
+                    }
+                }
+            }
+        }
+        resultMap.put("cd", cd);
+        resultMap.put("zt", zt);
+        resultMap.put("wq", wq);
+        resultMap.put("wdk", wdk);
+        return AjaxResult.success(resultMap);
+    }
+
+    @SneakyThrows
+    @Override
+    public AjaxResult details(ClockRecord clockRecord) {
+        List<Map<String, Object>> listMap = new ArrayList<>();
+        //查询人员打卡数据
+        clockRecord.setRecordDate(clockRecord.getRecordDate() + "-01");
+        List<ClockRecord> clockRecords = clockRecordMapper.selectOrderFoodListRl(clockRecord);
+        //按日期分类
+        Map<String, List<ClockRecord>> clockTime = new HashMap<>();
+        if (clockRecords != null && clockRecords.size() > 0) {
+            clockTime = clockRecords.stream().collect(Collectors.groupingBy(ClockRecord::getRecordDate));
+        }
+        //查询传入两个日期的所有日期
+        List<String> dayList = DateUtils.getDay(DateUtils.parseDate(clockRecord.getRecordDate()));
+        //查询本年度所有节假日时间
+        ClockHolidays clockHoliday = new ClockHolidays();
+        clockHoliday.setYear(DateUtils.getYear());
+        List<ClockHolidays> clockHolidaysList = clockHolidaysMapper.selectClockHolidaysList(clockHoliday);
+        //分成补班和节假日
+        List<String> jjrList = new ArrayList<>();
+        List<String> bbList = new ArrayList<>();
+        for (ClockHolidays clockHolidays : clockHolidaysList) {
+            if ("NO".equals(clockHolidays.getType())) {
+                jjrList.add(clockHolidays.getHolidayDate());
+            } else {
+                bbList.add(clockHolidays.getHolidayDate());
+            }
+        }
+        for (String day : dayList) {
+            Map<String, Object> resultMap = new HashMap<>();
+            boolean bl = (DateUtils.dayForWeek(day) == 6 || DateUtils.dayForWeek(day) == 7);
+            if (jjrList.contains(day) || (bl && !bbList.contains(day))) {
+                continue;
+            }
+            List<ClockRecord> clockRecordList = clockTime.get(day);
+            if (clockRecordList == null || clockRecordList.size() <= 0) {
+                resultMap.put("time", day);
+                resultMap.put("details", "全天未打卡");
+                listMap.add(resultMap);
+            } else {
+                resultMap.put("time", day);
+                StringBuilder sb = new StringBuilder();
+
+                Map<String, List<ClockRecord>> typMap = clockRecordList.stream().collect(Collectors.groupingBy(ClockRecord::getType));
+                if (typMap.containsKey("1")) {
+                    //排序,时间倒序
+                    List<ClockRecord> clockRecordTyp = typMap.get("1");
+                    clockRecordTyp = clockRecordTyp.stream().sorted(Comparator.comparing(ClockRecord::getRecordTime).reversed()).collect(Collectors.toList());
+                    //上班卡取最后一条
+                    if ("3".equals(clockRecordTyp.get(clockRecordTyp.size() - 1).getIsOutwork())) {
+                        sb.append("上午:迟到");
+                    }
+                    if ("2".equals(clockRecordTyp.get(clockRecordTyp.size() - 1).getIsOutwork())) {
+                        sb.append("上午:外勤");
+                    }
+                }else{
+                    sb.append("上午:缺卡");
+                }
+
+                if (typMap.containsKey("2")) {
+                    //排序,时间倒序
+                    List<ClockRecord> clockRecordTyp = typMap.get("2");
+                    clockRecordTyp = clockRecordTyp.stream().sorted(Comparator.comparing(ClockRecord::getRecordTime).reversed()).collect(Collectors.toList());
+                    //下班卡取最第一条
+                    if ("4".equals(clockRecordTyp.get(0).getIsOutwork())) {
+                        if(StringUtils.isNotEmpty(sb.toString())){
+                            sb.append(",");
+                        }
+                        sb.append("下午:早退");
+                    }
+                    if ("2".equals(clockRecordTyp.get(0).getIsOutwork())) {
+                        if(StringUtils.isNotEmpty(sb.toString())){
+                            sb.append(",");
+                        }
+                        sb.append("下午:外勤");
+                    }
+
+                }else{
+                    if(StringUtils.isNotEmpty(sb.toString())){
+                        sb.append(",");
+                    }
+                    sb.append("下午:缺卡");
+                }
+
+                resultMap.put("details", sb.toString());
+                listMap.add(resultMap);
+            }
+        }
+        return AjaxResult.success(listMap);
+    }
+
     /**
      * 设置请求分页数据
      */
@@ -367,7 +586,10 @@ public class ClockRecordServiceImpl implements IClockRecordService
         PageUtils.clearPage();
     }
 
+
+    @SneakyThrows
     public Map<String, Object> statistics(ClockRecord clockRecord) {
+        String year = DateUtils.getYear();
         Map<String, Object> resultMap = new HashMap<>();
         //迟到
         int cd = 0;
@@ -375,59 +597,98 @@ public class ClockRecordServiceImpl implements IClockRecordService
         int zt = 0;
         //外勤
         int wq = 0;
+        //未打卡
+        int wdk = 0;
 
-        if(StringUtils.isEmpty(clockRecord.getRecordDate())){
+        if (StringUtils.isEmpty(clockRecord.getRecordDate())) {
             clockRecord.setRecordDate(DateUtils.getDate());
         }
         //查询查询月打卡数据
-        List<ClockRecord> clockRecords = clockRecordMapper.selectClockRecordList(clockRecord);
+        List<ClockRecord> clockRecords = clockRecordMapper.selectOrderFoodListRl(clockRecord);
         //按日期分类
         Map<String, List<ClockRecord>> clockTime = new HashMap<>();
-        if (clockRecords != null && clockRecords.size() > 0){
+        if (clockRecords != null && clockRecords.size() > 0) {
             clockTime = clockRecords.stream().collect(Collectors.groupingBy(ClockRecord::getRecordDate));
         }
-        for (String key : clockTime.keySet()) {
-            List<ClockRecord> clockRecordList = clockTime.get(key);
-            clockRecordList = clockRecordList.stream().sorted(Comparator.comparing(ClockRecord::getRecordTime).reversed()).collect(Collectors.toList());
-            for (ClockRecord record : clockRecordList) {
-                if("1".equals(clockRecordList.get(clockRecordList.size()-1).getType())){
-                    if("3".equals(clockRecordList.get(clockRecordList.size()-1).getIsOutwork())){
+        //查询传入月所有日期
+        List<String> dayList = DateUtils.getDay(DateUtils.parseDate(clockRecord.getRecordDate()));
+        //查询本年度所有节假日时间
+        //查询是否存在当前年数据
+        ClockHolidays clockHoliday = new ClockHolidays();
+        clockHoliday.setYear(year);
+        List<ClockHolidays> clockHolidaysList = clockHolidaysMapper.selectClockHolidaysList(clockHoliday);
+        //分成补班和节假日
+        List<String> jjrList = new ArrayList<>();
+        List<String> bbList = new ArrayList<>();
+        for (ClockHolidays clockHolidays : clockHolidaysList) {
+            if ("NO".equals(clockHolidays.getType())) {
+                jjrList.add(clockHolidays.getHolidayDate());
+            } else {
+                bbList.add(clockHolidays.getHolidayDate());
+            }
+        }
+
+        for (String s : dayList) {
+            if (DateUtils.compare(s, DateUtils.getDate()) < 0) {
+                continue;
+            }
+            //判断当天是否需要上班
+            boolean bl = (DateUtils.dayForWeek(s) == 6 || DateUtils.dayForWeek(s) == 7);
+            if (bbList.contains(s) || (!bl && !jjrList.contains(s))) {
+                //需要要上班(当天不是双休并且不在节假日内,或者需要补班)
+                if (!clockTime.containsKey(s)) {
+                    wdk = wdk + 2;
+                    continue;
+                }
+                List<ClockRecord> clockRecordList = clockTime.get(s);
+                clockRecordList = clockRecordList.stream().sorted(Comparator.comparing(ClockRecord::getRecordTime).reversed()).collect(Collectors.toList());
+                boolean sw = false;
+                boolean xw = false;
+                boolean swwq = false;
+                boolean xwwq = false;
+                Map<String, List<ClockRecord>> typMap = clockRecordList.stream().collect(Collectors.groupingBy(ClockRecord::getType));
+                if (typMap.containsKey("1")) {
+                    //排序,时间倒序
+                    List<ClockRecord> clockRecordTyp = typMap.get("1");
+                    clockRecordTyp = clockRecordTyp.stream().sorted(Comparator.comparing(ClockRecord::getRecordTime).reversed()).collect(Collectors.toList());
+                    //上班卡取最后一条
+                    sw = true;
+                    if ("3".equals(clockRecordTyp.get(clockRecordTyp.size() - 1).getIsOutwork())) {
                         cd++;
                     }
-                    if("2".equals(clockRecordList.get(clockRecordList.size()-1).getIsOutwork())){
-                        wq++;
+                    if ("2".equals(clockRecordTyp.get(clockRecordTyp.size() - 1).getIsOutwork())) {
+                        swwq = true;
                     }
                 }
-                if("2".equals(clockRecordList.get(clockRecordList.size()-1).getType())){
-                    if("4".equals(clockRecordList.get(clockRecordList.size()-1).getIsOutwork())){
+                if (typMap.containsKey("2")) {
+                    //排序,时间倒序
+                    List<ClockRecord> clockRecordTyp = typMap.get("2");
+                    clockRecordTyp = clockRecordTyp.stream().sorted(Comparator.comparing(ClockRecord::getRecordTime).reversed()).collect(Collectors.toList());
+                    //下班卡取最第一条
+                    xw = true;
+                    if ("4".equals(clockRecordTyp.get(0).getIsOutwork())) {
                         zt++;
                     }
-                    if("2".equals(clockRecordList.get(clockRecordList.size()-1).getIsOutwork())){
-                        wq++;
+                    if ("2".equals(clockRecordTyp.get(0).getIsOutwork())) {
+                        xwwq = true;
                     }
+
                 }
-                if("1".equals(clockRecordList.get(0).getType())){
-                    if("3".equals(clockRecordList.get(clockRecordList.size()-1).getIsOutwork())){
-                        cd++;
-                    }
-                    if("2".equals(clockRecordList.get(clockRecordList.size()-1).getIsOutwork())){
-                        wq++;
-                    }
+                if (!sw || !xw) {
+                    wdk++;
                 }
-                if("2".equals(clockRecordList.get(0).getType())){
-                    if("4".equals(clockRecordList.get(clockRecordList.size()-1).getIsOutwork())){
-                        zt++;
-                    }
-                    if("2".equals(clockRecordList.get(clockRecordList.size()-1).getIsOutwork())){
-                        wq++;
-                    }
+                if (swwq) {
+                    wq++;
+                }
+                if (xwwq) {
+                    wq++;
                 }
             }
-
         }
-        resultMap.put("cd",cd);
-        resultMap.put("zt",zt);
-        resultMap.put("wq",wq);
+        resultMap.put("cd", cd);
+        resultMap.put("zt", zt);
+        resultMap.put("wq", wq);
+        resultMap.put("wdk", wdk);
         return resultMap;
     }
 

+ 31 - 3
ruoyi-system/src/main/java/com/ruoyi/system/service/impl/ClockUserInfoServiceImpl.java

@@ -6,7 +6,9 @@ import java.util.List;
 import java.util.Map;
 import java.util.stream.Collectors;
 
+import com.ruoyi.common.core.domain.entity.SysUser;
 import com.ruoyi.common.utils.DateUtils;
+import com.ruoyi.common.utils.StringUtils;
 import com.ruoyi.system.domain.ClockRecord;
 import com.ruoyi.system.mapper.ClockRecordMapper;
 import org.springframework.beans.factory.annotation.Autowired;
@@ -106,10 +108,12 @@ public class ClockUserInfoServiceImpl implements IClockUserInfoService
     @Override
     public List<ClockUserInfo> selectClockUserInfoRecordList(ClockUserInfo clockUserInfo) {
         List<ClockUserInfo> clockUserList = clockUserInfoMapper.selectClockUserInfoList(clockUserInfo);
-        String date = DateUtils.getDate();
+        if(StringUtils.isEmpty(clockUserInfo.getRecordDate())){
+            clockUserInfo.setRecordDate(DateUtils.getDate());
+        }
         for (ClockUserInfo userInfo : clockUserList) {
             Map<String,Object> clockMap = new HashMap<>();
-            clockMap.put("date",date);
+            clockMap.put("date",clockUserInfo.getRecordDate());
             clockMap.put("am","未打卡");
             //上午打卡标识 1:正常打卡,2:外勤打卡,3:迟到,4:早退,5:未打卡
             clockMap.put("amex","5");
@@ -119,7 +123,7 @@ public class ClockUserInfoServiceImpl implements IClockUserInfoService
             //查询当天的所有打卡信息
             ClockRecord clockRecord = new ClockRecord();
             clockRecord.setUserId(userInfo.getUserId());
-            clockRecord.setRecordDate(date);
+            clockRecord.setRecordDate(clockUserInfo.getRecordDate());
             List<ClockRecord> clockRecords = clockRecordMapper.selectClockRecordList(clockRecord);
             if (clockRecords != null && clockRecords.size() > 0){
                 clockRecords = clockRecords.stream().sorted(Comparator.comparing(ClockRecord::getRecordTime).reversed()).collect(Collectors.toList());
@@ -149,4 +153,28 @@ public class ClockUserInfoServiceImpl implements IClockUserInfoService
         }
         return clockUserList;
     }
+
+    @Override
+    public int insertClockUserInfoList(List<SysUser> sysUserList) {
+        int i = 0;
+        if(sysUserList.size()>0){
+            for (SysUser sysUser : sysUserList) {
+                //判断当前人员是否存在
+                ClockUserInfo clockUser = clockUserInfoMapper.selectClockUserInfoByUserId(sysUser.getUserId());
+                if(clockUser!=null){
+                    continue;
+                }
+                ClockUserInfo clockUserInfo = new ClockUserInfo();
+                clockUserInfo.setUserId(sysUser.getUserId());
+                clockUserInfo.setDeptId(sysUser.getDeptId());
+                clockUserInfo.setUserName(sysUser.getNickName());
+                clockUserInfo.setPhonenumber(sysUser.getPhonenumber());
+                clockUserInfo.setDelFlag("0");
+                clockUserInfo.setCreateTime(DateUtils.getNowDate());
+                clockUserInfo.setUpdateTime(DateUtils.getNowDate());
+                i = clockUserInfoMapper.insertClockUserInfo(clockUserInfo);
+            }
+        }
+        return i;
+    }
 }

+ 238 - 0
ruoyi-system/src/main/java/com/ruoyi/system/service/impl/MenuBoxServiceImpl.java

@@ -0,0 +1,238 @@
+package com.ruoyi.system.service.impl;
+
+import com.ruoyi.common.constant.UserConstants;
+import com.ruoyi.common.core.domain.TreeSelect;
+import com.ruoyi.common.core.domain.entity.MenuBox;
+import com.ruoyi.common.exception.ServiceException;
+import com.ruoyi.common.utils.DateUtils;
+import com.ruoyi.common.utils.StringUtils;
+import com.ruoyi.system.mapper.MenuBoxMapper;
+import com.ruoyi.system.service.IMenuBoxService;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Service;
+
+import java.util.ArrayList;
+import java.util.Iterator;
+import java.util.List;
+import java.util.stream.Collectors;
+
+/**
+ * 包厢菜单Service业务层处理
+ *
+ * @author boman
+ * @date 2025-01-22
+ */
+@Service
+public class MenuBoxServiceImpl implements IMenuBoxService {
+    @Autowired
+    private MenuBoxMapper menuBoxMapper;
+
+    /**
+     * 查询包厢菜单
+     *
+     * @param menuBoxId 包厢菜单主键
+     * @return 包厢菜单
+     */
+    @Override
+    public MenuBox selectMenuBoxByMenuBoxId(Long menuBoxId) {
+        return menuBoxMapper.selectMenuBoxByMenuBoxId(menuBoxId);
+    }
+
+    /**
+     * 查询包厢菜单列表
+     *
+     * @param menuBox 包厢菜单
+     * @return 包厢菜单
+     */
+    @Override
+    public List<MenuBox> selectMenuBoxList(MenuBox menuBox) {
+        return menuBoxMapper.selectMenuBoxList(menuBox);
+    }
+
+    /**
+     * 查询菜品树结构信息
+     *
+     * @param menuBox 菜品信息
+     * @return 菜品树信息集合
+     */
+    @Override
+    public List<TreeSelect> selectMenuBoxTreeList(MenuBox menuBox) {
+        List<MenuBox> menuBoxes = selectMenuBoxList(menuBox);
+        return buildMenuBoxTreeSelect(menuBoxes);
+    }
+
+    /**
+     * 构建前端所需要下拉树结构
+     *
+     * @param menuBoxs 菜品列表
+     * @return 下拉树结构列表
+     */
+    @Override
+    public List<TreeSelect> buildMenuBoxTreeSelect(List<MenuBox> menuBoxs) {
+        List<MenuBox> menuBoxTrees = buildMenuBoxTree(menuBoxs);
+        return menuBoxTrees.stream().map(TreeSelect::new).collect(Collectors.toList());
+    }
+
+
+    /**
+     * 构建前端所需要树结构
+     *
+     * @param menuBoxs 菜品列表
+     * @return 树结构列表
+     */
+    @Override
+    public List<MenuBox> buildMenuBoxTree(List<MenuBox> menuBoxs) {
+        List<MenuBox> returnList = new ArrayList<MenuBox>();
+        List<Long> tempList = menuBoxs.stream().map(MenuBox::getMenuBoxId).collect(Collectors.toList());
+        for (MenuBox menuBox : menuBoxs) {
+            // 如果是顶级节点, 遍历该父节点的所有子节点
+            if (!tempList.contains(menuBox.getParentId())) {
+                recursionFn(menuBoxs, menuBox);
+                returnList.add(menuBox);
+            }
+        }
+        if (returnList.isEmpty()) {
+            returnList = menuBoxs;
+        }
+        return returnList;
+    }
+
+    /**
+     * 递归列表
+     */
+    private void recursionFn(List<MenuBox> list, MenuBox t) {
+        // 得到子节点列表
+        List<MenuBox> childList = getChildList(list, t);
+        t.setChildren(childList);
+        for (MenuBox tChild : childList) {
+            if (hasChild(list, tChild)) {
+                recursionFn(list, tChild);
+            }
+        }
+    }
+
+    /**
+     * 得到子节点列表
+     */
+    private List<MenuBox> getChildList(List<MenuBox> list, MenuBox t) {
+        List<MenuBox> tlist = new ArrayList<MenuBox>();
+        Iterator<MenuBox> it = list.iterator();
+        while (it.hasNext()) {
+            MenuBox n = (MenuBox) it.next();
+            if (StringUtils.isNotNull(n.getParentId()) && n.getParentId().longValue() == t.getMenuBoxId().longValue()) {
+                tlist.add(n);
+            }
+        }
+        return tlist;
+    }
+
+    /**
+     * 判断是否有子节点
+     */
+    private boolean hasChild(List<MenuBox> list, MenuBox t) {
+        return getChildList(list, t).size() > 0;
+    }
+
+    /**
+     * 新增包厢菜单
+     *
+     * @param menuBox 包厢菜单
+     * @return 结果
+     */
+    @Override
+    public int insertMenuBox(MenuBox menuBox) {
+        MenuBox info = menuBoxMapper.selectMenuBoxByMenuBoxId(menuBox.getParentId());
+        if (info != null) {
+            // 如果父节点不为正常状态,则不允许新增子节点
+            if (UserConstants.YES.equals(info.getIsDel())) {
+                throw new ServiceException("菜品菜单删除,不允许新增");
+            }
+            menuBox.setAncestors(info.getAncestors() + "," + menuBox.getParentId());
+            menuBox.setCreateTime(DateUtils.getNowDate());
+            return menuBoxMapper.insertMenuBox(menuBox);
+        } else {
+            menuBox.setParentId(0L);
+            menuBox.setAncestors("0");
+            menuBox.setCreateTime(DateUtils.getNowDate());
+            int i = menuBoxMapper.insertMenuBox(menuBox);
+            return i;
+        }
+    }
+
+    /**
+     * 修改包厢菜单
+     *
+     * @param menuBox 包厢菜单
+     * @return 结果
+     */
+    @Override
+    public int updateMenuBox(MenuBox menuBox) {
+        MenuBox newParentMenuBox = menuBoxMapper.selectMenuBoxById(menuBox.getParentId());
+        MenuBox oldMenuBox = menuBoxMapper.selectMenuBoxById(menuBox.getMenuBoxId());
+        if (StringUtils.isNotNull(newParentMenuBox) && StringUtils.isNotNull(oldMenuBox)) {
+            String newAncestors = newParentMenuBox.getAncestors() + "," + newParentMenuBox.getMenuBoxId();
+            String oldAncestors = oldMenuBox.getAncestors();
+            menuBox.setAncestors(newAncestors);
+            updateMenuBoxChildren(menuBox.getMenuBoxId(), newAncestors, oldAncestors);
+        }
+        menuBox.setUpdateTime(DateUtils.getNowDate());
+        return menuBoxMapper.updateMenuBox(menuBox);
+    }
+
+    /**
+     * 修改子元素关系
+     *
+     * @param menuBoxId    被修改的菜品ID
+     * @param newAncestors 新的父ID集合
+     * @param oldAncestors 旧的父ID集合
+     */
+    public void updateMenuBoxChildren(Long menuBoxId, String newAncestors, String oldAncestors) {
+        List<MenuBox> children = menuBoxMapper.selectChildrenMenuBoxById(menuBoxId);
+        for (MenuBox child : children) {
+            child.setAncestors(child.getAncestors().replaceFirst(oldAncestors, newAncestors));
+        }
+        if (children.size() > 0) {
+            menuBoxMapper.updateMenuBoxChildren(children);
+        }
+    }
+
+    /**
+     * 批量删除包厢菜单
+     *
+     * @param menuBoxIds 需要删除的包厢菜单主键
+     * @return 结果
+     */
+    @Override
+    public int deleteMenuBoxByMenuBoxIds(Long[] menuBoxIds) {
+        return menuBoxMapper.deleteMenuBoxByMenuBoxIds(menuBoxIds);
+    }
+
+    /**
+     * 删除包厢菜单信息
+     *
+     * @param menuBoxId 包厢菜单主键
+     * @return 结果
+     */
+    @Override
+    public int deleteMenuBoxByMenuBoxId(Long menuBoxId) {
+        return menuBoxMapper.deleteMenuBoxByMenuBoxId(menuBoxId);
+    }
+
+
+    /**
+     * 校验菜品名称是否唯一
+     *
+     * @param menuBox 菜品信息
+     * @return 结果
+     */
+    @Override
+    public boolean checkMenuBoxNameUnique(MenuBox menuBox) {
+        Long deptId = StringUtils.isNull(menuBox.getMenuBoxId()) ? -1L : menuBox.getMenuBoxId();
+        MenuBox info = menuBoxMapper.checkMenuBoxNameUnique(menuBox.getFoodName(), menuBox.getParentId());
+
+        if (StringUtils.isNotNull(info) && info.getMenuBoxId().longValue() != deptId.longValue()) {
+            return UserConstants.NOT_UNIQUE;
+        }
+        return UserConstants.UNIQUE;
+    }
+}

+ 18 - 5
ruoyi-system/src/main/java/com/ruoyi/system/service/impl/SysUserServiceImpl.java

@@ -6,6 +6,9 @@ import java.util.stream.Collectors;
 import javax.validation.Validator;
 
 import com.ruoyi.common.core.domain.entity.SysUserVo;
+import com.ruoyi.common.utils.DateUtils;
+import com.ruoyi.system.domain.ClockUserInfo;
+import com.ruoyi.system.mapper.*;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 import org.springframework.beans.factory.annotation.Autowired;
@@ -24,11 +27,6 @@ import com.ruoyi.common.utils.spring.SpringUtils;
 import com.ruoyi.system.domain.SysPost;
 import com.ruoyi.system.domain.SysUserPost;
 import com.ruoyi.system.domain.SysUserRole;
-import com.ruoyi.system.mapper.SysPostMapper;
-import com.ruoyi.system.mapper.SysRoleMapper;
-import com.ruoyi.system.mapper.SysUserMapper;
-import com.ruoyi.system.mapper.SysUserPostMapper;
-import com.ruoyi.system.mapper.SysUserRoleMapper;
 import com.ruoyi.system.service.ISysConfigService;
 import com.ruoyi.system.service.ISysUserService;
 
@@ -63,6 +61,9 @@ public class SysUserServiceImpl implements ISysUserService
     @Autowired
     protected Validator validator;
 
+    @Autowired
+    private ClockUserInfoMapper clockUserInfoMapper;
+
     /**
      * 根据条件分页查询用户列表
      * 
@@ -274,6 +275,18 @@ public class SysUserServiceImpl implements ISysUserService
         insertUserPost(user);
         // 新增用户与角色管理
         insertUserRole(user);
+        //是否新增为考勤人员
+        if(StringUtils.isNotEmpty(user.getIsclock()) && "Y".equals(user.getIsclock())){
+            ClockUserInfo clockUserInfo = new ClockUserInfo();
+            clockUserInfo.setUserId(user.getUserId());
+            clockUserInfo.setDeptId(user.getDeptId());
+            clockUserInfo.setUserName(user.getNickName());
+            clockUserInfo.setPhonenumber(user.getPhonenumber());
+            clockUserInfo.setDelFlag("0");
+            clockUserInfo.setCreateTime(DateUtils.getNowDate());
+            clockUserInfo.setUpdateTime(DateUtils.getNowDate());
+            clockUserInfoMapper.insertClockUserInfo(clockUserInfo);
+        }
         return rows;
     }
 

+ 59 - 1
ruoyi-system/src/main/java/com/ruoyi/system/service/impl/Task.java

@@ -1,24 +1,36 @@
 package com.ruoyi.system.service.impl;
 
 
+import com.alibaba.fastjson2.JSON;
+import com.alibaba.fastjson2.JSONObject;
 import com.google.gson.Gson;
 import com.ruoyi.common.utils.DateUtils;
+import com.ruoyi.common.utils.http.HttpUtils;
+import com.ruoyi.system.domain.ClockHolidays;
 import com.ruoyi.system.domain.MenuFood;
 import com.ruoyi.system.domain.MenuFoodRecord;
+import com.ruoyi.system.mapper.ClockHolidaysMapper;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.scheduling.annotation.Async;
+import org.springframework.scheduling.annotation.Scheduled;
 import org.springframework.stereotype.Component;
+import org.springframework.util.ObjectUtils;
 
 import java.time.LocalDate;
 import java.time.format.DateTimeFormatter;
 import java.util.List;
 import java.util.Locale;
+import java.util.Map;
+import java.util.Set;
 
 /**
  * 定时任务
  */
 @Component
 public class Task {
+
+    @Autowired
+    private ClockHolidaysMapper clockHolidaysMapper;
     @Autowired
     private MenuFoodRecordServiceImpl menuFoodRecordService;
     @Autowired
@@ -31,7 +43,7 @@ public class Task {
      * @throws Exception
      */
     @Async
-    //@Scheduled(cron = "0 0 23 * * ? ")
+    @Scheduled(cron = "0 0 23 * * ? ")
     public void popover() throws Exception {
         // 获取当前日期
         LocalDate currentDate = LocalDate.now();
@@ -47,4 +59,50 @@ public class Task {
             menuFoodRecordService.insertMenuFoodRecord(menuFoodRecord);
         }
     }
+
+    /***
+     *获取法定节假日和补班信息
+     * 定时:每个月20号2点
+     * @throws Exception
+     */
+    @Async
+    //@Scheduled(cron = "0 0/2 * * * ? ")
+    //@Scheduled(cron = "0 20 0 * * ? ")
+    //@Scheduled(cron = "0/10 * * * * ? ")
+    @Scheduled(cron = "0 0 2 20 * ? ")
+    public void holidays() {
+        String year = DateUtils.getYear();
+        //查询是否存在当前年数据
+        ClockHolidays clockHoliday = new ClockHolidays();
+        clockHoliday.setYear(year);
+        List<ClockHolidays> clockHolidaysList = clockHolidaysMapper.selectClockHolidaysList(clockHoliday);
+        if(clockHolidaysList!=null && clockHolidaysList.size()>0){
+            year = String.valueOf(Integer.parseInt(year) + 1);
+        }
+        String url = "https://timor.tech/api/holiday/year/"+year;
+        String rspStr = HttpUtils.sendGet(url);
+        JSONObject obj = JSON.parseObject(rspStr);
+        Map<String, Map<String, Object>> holiday = (Map<String, Map<String, Object>>) obj.get("holiday");
+        if(ObjectUtils.isEmpty(holiday)){
+            return;
+        }
+        Set<String> strings = holiday.keySet();
+        for (String str : strings) {
+            Map<String, Object> stringObjectMap = holiday.get(str);
+            boolean bool = (Boolean) stringObjectMap.get("holiday");
+            ClockHolidays clockHolidays = new ClockHolidays();
+            clockHolidays.setYear(year);
+            clockHolidays.setHolidayDate((String) stringObjectMap.get("date"));
+            clockHolidays.setType("NO");
+            if(!bool){
+                clockHolidays.setType("YES");
+            }
+            clockHolidays.setCreateTime(DateUtils.getNowDate());
+            clockHolidays.setUpdateTime(DateUtils.getNowDate());
+            clockHolidaysMapper.insertClockHolidays(clockHolidays);
+        }
+
+        System.out.println("1");
+
+    }
 }

+ 96 - 0
ruoyi-system/src/main/resources/mapper/system/ClockHolidaysMapper.xml

@@ -0,0 +1,96 @@
+<?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.ruoyi.system.mapper.ClockHolidaysMapper">
+    
+    <resultMap type="ClockHolidays" id="ClockHolidaysResult">
+        <result property="id"    column="id"    />
+        <result property="year"    column="year"    />
+        <result property="holidayDate"    column="holiday_date"    />
+        <result property="type"    column="type"    />
+        <result property="createBy"    column="create_by"    />
+        <result property="createTime"    column="create_time"    />
+        <result property="updateBy"    column="update_by"    />
+        <result property="updateTime"    column="update_time"    />
+        <result property="remark"    column="remark"    />
+    </resultMap>
+
+    <sql id="selectClockHolidaysVo">
+        select id, year, holiday_date, type, create_by, create_time, update_by, update_time, remark from clock_holidays
+    </sql>
+
+    <select id="selectClockHolidaysList" parameterType="ClockHolidays" resultMap="ClockHolidaysResult">
+        <include refid="selectClockHolidaysVo"/>
+        <where>  
+            <if test="year != null  and year != ''"> and year = #{year}</if>
+            <if test="holidayDate != null  and holidayDate != ''"> and holiday_date = #{holidayDate}</if>
+            <if test="type != null  and type != ''"> and type = #{type}</if>
+        </where>
+    </select>
+    
+    <select id="selectClockHolidaysById" parameterType="Long" resultMap="ClockHolidaysResult">
+        <include refid="selectClockHolidaysVo"/>
+        where id = #{id}
+    </select>
+    <select id="selectClockHolidaysMonthList" parameterType="ClockHolidays" resultMap="ClockHolidaysResult">
+        <include refid="selectClockHolidaysVo"/>
+        <where>
+            <if test="year != null  and year != ''"> and year = #{year}</if>
+            <if test="holidayDate != null  and holidayDate != ''">
+                and date_format(holiday_date,'%Y%m') = date_format(#{holidayDate},'%Y%m')
+            </if>
+            <if test="type != null  and type != ''"> and type = #{type}</if>
+        </where>
+    </select>
+
+    <insert id="insertClockHolidays" parameterType="ClockHolidays" useGeneratedKeys="true" keyProperty="id">
+        insert into clock_holidays
+        <trim prefix="(" suffix=")" suffixOverrides=",">
+            <if test="year != null and year != ''">year,</if>
+            <if test="holidayDate != null">holiday_date,</if>
+            <if test="type != null and type != ''">type,</if>
+            <if test="createBy != null">create_by,</if>
+            <if test="createTime != null">create_time,</if>
+            <if test="updateBy != null">update_by,</if>
+            <if test="updateTime != null">update_time,</if>
+            <if test="remark != null">remark,</if>
+         </trim>
+        <trim prefix="values (" suffix=")" suffixOverrides=",">
+            <if test="year != null and year != ''">#{year},</if>
+            <if test="holidayDate != null">#{holidayDate},</if>
+            <if test="type != null and type != ''">#{type},</if>
+            <if test="createBy != null">#{createBy},</if>
+            <if test="createTime != null">#{createTime},</if>
+            <if test="updateBy != null">#{updateBy},</if>
+            <if test="updateTime != null">#{updateTime},</if>
+            <if test="remark != null">#{remark},</if>
+         </trim>
+    </insert>
+
+    <update id="updateClockHolidays" parameterType="ClockHolidays">
+        update clock_holidays
+        <trim prefix="SET" suffixOverrides=",">
+            <if test="year != null and year != ''">year = #{year},</if>
+            <if test="holidayDate != null">holiday_date = #{holidayDate},</if>
+            <if test="type != null and type != ''">type = #{type},</if>
+            <if test="createBy != null">create_by = #{createBy},</if>
+            <if test="createTime != null">create_time = #{createTime},</if>
+            <if test="updateBy != null">update_by = #{updateBy},</if>
+            <if test="updateTime != null">update_time = #{updateTime},</if>
+            <if test="remark != null">remark = #{remark},</if>
+        </trim>
+        where id = #{id}
+    </update>
+
+    <delete id="deleteClockHolidaysById" parameterType="Long">
+        delete from clock_holidays where id = #{id}
+    </delete>
+
+    <delete id="deleteClockHolidaysByIds" parameterType="String">
+        delete from clock_holidays where id in 
+        <foreach item="id" collection="array" open="(" separator="," close=")">
+            #{id}
+        </foreach>
+    </delete>
+</mapper>

+ 2 - 0
ruoyi-system/src/main/resources/mapper/system/ClockUserInfoMapper.xml

@@ -43,6 +43,7 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
     <insert id="insertClockUserInfo" parameterType="ClockUserInfo" useGeneratedKeys="true" keyProperty="userId">
         insert into clock_user_info
         <trim prefix="(" suffix=")" suffixOverrides=",">
+            <if test="userId != null">user_id,</if>
             <if test="deptId != null">dept_id,</if>
             <if test="deptName != null">dept_name,</if>
             <if test="userName != null and userName != ''">user_name,</if>
@@ -56,6 +57,7 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
             <if test="remark != null">remark,</if>
          </trim>
         <trim prefix="values (" suffix=")" suffixOverrides=",">
+            <if test="userId != null">#{userId},</if>
             <if test="deptId != null">#{deptId},</if>
             <if test="deptName != null">#{deptName},</if>
             <if test="userName != null and userName != ''">#{userName},</if>

+ 1 - 0
ruoyi-system/src/main/resources/mapper/system/DutyScheduleMapper.xml

@@ -30,6 +30,7 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
             <if test="startWorkTime != null  and startWorkTime != ''"> and start_work_time = #{startWorkTime}</if>
             <if test="endWorkTime != null  and endWorkTime != ''"> and end_work_time = #{endWorkTime}</if>
         </where>
+        order by create_time desc
     </select>
     
     <select id="selectDutyScheduleByDutyId" parameterType="Long" resultMap="DutyScheduleResult">

+ 128 - 0
ruoyi-system/src/main/resources/mapper/system/MenuBoxMapper.xml

@@ -0,0 +1,128 @@
+<?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.ruoyi.system.mapper.MenuBoxMapper">
+    
+    <resultMap type="MenuBox" id="MenuBoxResult">
+        <result property="menuBoxId"    column="menu_box_id"    />
+        <result property="parentId"    column="parent_id"    />
+        <result property="ancestors"    column="ancestors"    />
+        <result property="foodName"    column="food_name"    />
+        <result property="foodPhoto"    column="food_photo"    />
+        <result property="suggest"    column="suggest"    />
+        <result property="suggestLv"    column="suggest_lv"    />
+        <result property="parentName" column="parent_name" />
+        <result property="isDel"    column="is_del"    />
+        <result property="createBy"    column="create_by"    />
+        <result property="createTime"    column="create_time"    />
+        <result property="updateBy"    column="update_by"    />
+        <result property="updateTime"    column="update_time"    />
+    </resultMap>
+
+    <sql id="selectMenuBoxVo">
+        select menu_box_id, parent_id, ancestors, food_name, food_photo, suggest, suggest_lv, is_del, create_by, create_time, update_by, update_time from menu_box
+    </sql>
+
+    <select id="selectMenuBoxList" parameterType="MenuBox" resultMap="MenuBoxResult">
+        <include refid="selectMenuBoxVo"/>
+        <where>  
+            <if test="parentId != null "> and parent_id = #{parentId}</if>
+            <if test="ancestors != null  and ancestors != ''"> and ancestors = #{ancestors}</if>
+            <if test="foodName != null  and foodName != ''"> and food_name like concat('%', #{foodName}, '%')</if>
+            <if test="foodPhoto != null  and foodPhoto != ''"> and food_photo = #{foodPhoto}</if>
+            <if test="suggest != null  and suggest != ''"> and suggest = #{suggest}</if>
+            <if test="suggestLv != null  and suggestLv != ''"> and suggest_lv = #{suggestLv}</if>
+            <if test="isDel != null  and isDel != ''"> and is_del = #{isDel}</if>
+        </where>
+    </select>
+    
+    <select id="selectMenuBoxByMenuBoxId" parameterType="Long" resultMap="MenuBoxResult">
+        <include refid="selectMenuBoxVo"/>
+        where menu_box_id = #{menuBoxId}
+    </select>
+    <select id="checkMenuBoxNameUnique" resultMap="MenuBoxResult">
+        <include refid="selectMenuBoxVo"/>
+        where food_name=#{foodName} and parent_id = #{parentId} and is_del = 'N' limit 1
+    </select>
+    <select id="selectMenuBoxById" parameterType="Long" resultMap="MenuBoxResult">
+        select b.menu_box_id, b.parent_id, b.ancestors, b.food_name, b.food_photo, b.suggest, b.suggest_lv, b.is_del,
+               (select food_name from menu_box where menu_box_id = b.parent_id) parent_name
+        from menu_box b
+        where b.menu_box_id = #{menuBoxId}
+    </select>
+    <select id="selectChildrenMenuBoxById" parameterType="Long" resultMap="MenuBoxResult">
+        select * from menu_box where find_in_set(#{menuBoxId}, ancestors)
+    </select>
+
+    <insert id="insertMenuBox" parameterType="MenuBox" useGeneratedKeys="true" keyProperty="menuBoxId">
+        insert into menu_box
+        <trim prefix="(" suffix=")" suffixOverrides=",">
+            <if test="parentId != null">parent_id,</if>
+            <if test="ancestors != null">ancestors,</if>
+            <if test="foodName != null">food_name,</if>
+            <if test="foodPhoto != null">food_photo,</if>
+            <if test="suggest != null">suggest,</if>
+            <if test="suggestLv != null">suggest_lv,</if>
+            <if test="isDel != null">is_del,</if>
+            <if test="createBy != null">create_by,</if>
+            <if test="createTime != null">create_time,</if>
+            <if test="updateBy != null">update_by,</if>
+            <if test="updateTime != null">update_time,</if>
+         </trim>
+        <trim prefix="values (" suffix=")" suffixOverrides=",">
+            <if test="parentId != null">#{parentId},</if>
+            <if test="ancestors != null">#{ancestors},</if>
+            <if test="foodName != null">#{foodName},</if>
+            <if test="foodPhoto != null">#{foodPhoto},</if>
+            <if test="suggest != null">#{suggest},</if>
+            <if test="suggestLv != null">#{suggestLv},</if>
+            <if test="isDel != null">#{isDel},</if>
+            <if test="createBy != null">#{createBy},</if>
+            <if test="createTime != null">#{createTime},</if>
+            <if test="updateBy != null">#{updateBy},</if>
+            <if test="updateTime != null">#{updateTime},</if>
+         </trim>
+    </insert>
+
+    <update id="updateMenuBox" parameterType="MenuBox">
+        update menu_box
+        <trim prefix="SET" suffixOverrides=",">
+            <if test="parentId != null">parent_id = #{parentId},</if>
+            <if test="ancestors != null">ancestors = #{ancestors},</if>
+            <if test="foodName != null">food_name = #{foodName},</if>
+            <if test="foodPhoto != null">food_photo = #{foodPhoto},</if>
+            <if test="suggest != null">suggest = #{suggest},</if>
+            <if test="suggestLv != null">suggest_lv = #{suggestLv},</if>
+            <if test="isDel != null">is_del = #{isDel},</if>
+            <if test="createBy != null">create_by = #{createBy},</if>
+            <if test="createTime != null">create_time = #{createTime},</if>
+            <if test="updateBy != null">update_by = #{updateBy},</if>
+            <if test="updateTime != null">update_time = #{updateTime},</if>
+        </trim>
+        where menu_box_id = #{menuBoxId}
+    </update>
+    <update id="updateMenuBoxChildren" parameterType="java.util.List">
+        update menu_box set ancestors =
+        <foreach collection="menuBoxs" item="item" index="index"
+                 separator=" " open="case menu_box_id" close="end">
+            when #{item.menuBoxId} then #{item.ancestors}
+        </foreach>
+        where menu_box_id in
+        <foreach collection="menuBoxs" item="item" index="index"
+                 separator="," open="(" close=")">
+            #{item.menuBoxId}
+        </foreach>
+    </update>
+
+    <delete id="deleteMenuBoxByMenuBoxId" parameterType="Long">
+        delete from menu_box where menu_box_id = #{menuBoxId}
+    </delete>
+
+    <delete id="deleteMenuBoxByMenuBoxIds" parameterType="String">
+        delete from menu_box where menu_box_id in 
+        <foreach item="menuBoxId" collection="array" open="(" separator="," close=")">
+            #{menuBoxId}
+        </foreach>
+    </delete>
+</mapper>

+ 17 - 2
ruoyi-system/src/main/resources/mapper/system/MenuFoodMapper.xml

@@ -9,8 +9,11 @@
         <result property="menuFoodTime" column="menu_food_time"/>
         <result property="menuFoodType" column="menu_food_type"/>
         <result property="menuFoodDetailBk" column="menu_food_detail_bk"/>
+        <result property="menuFoodDetailBkPhoto" column="menu_food_detail_bk_photo"/>
         <result property="menuFoodDetailLu" column="menu_food_detail_lu"/>
+        <result property="menuFoodDetailLuPhoto" column="menu_food_detail_lu_photo"/>
         <result property="menuFoodDetailDi" column="menu_food_detail_di"/>
+        <result property="menuFoodDetailDiPhoto" column="menu_food_detail_di_photo"/>
         <result property="canteenName" column="canteen_name"/>
         <result property="canteenId" column="canteen_id"/>
         <result property="isUse" column="is_use"/>
@@ -27,8 +30,11 @@
                menu_food_time,
                menu_food_type,
                menu_food_detail_bk,
+               menu_food_detail_bk_photo,
                menu_food_detail_lu,
+               menu_food_detail_lu_photo,
                menu_food_detail_di,
+               menu_food_detail_di_photo,
                canteen_name,
                canteen_id,
                is_use,
@@ -75,8 +81,11 @@
             <if test="menuFoodTime != null">menu_food_time,</if>
             <if test="menuFoodType != null">menu_food_type,</if>
             <if test="menuFoodDetailBk != null">menu_food_detail_bk,</if>
+            <if test="menuFoodDetailBkPhoto != null">menu_food_detail_bk_photo,</if>
             <if test="menuFoodDetailLu != null">menu_food_detail_lu,</if>
+            <if test="menuFoodDetailLuPhoto != null">menu_food_detail_lu_photo,</if>
             <if test="menuFoodDetailDi != null">menu_food_detail_di,</if>
+            <if test="menuFoodDetailDiPhoto != null">menu_food_detail_di_photo,</if>
             <if test="canteenName != null">canteen_name,</if>
             <if test="canteenId != null">canteen_id,</if>
             <if test="isUse != null">is_use,</if>
@@ -91,8 +100,11 @@
             <if test="menuFoodTime != null">#{menuFoodTime},</if>
             <if test="menuFoodType != null">#{menuFoodType},</if>
             <if test="menuFoodDetailBk != null">#{menuFoodDetailBk},</if>
+            <if test="menuFoodDetailBkPhoto != null">#{menuFoodDetailBkPhoto},</if>
             <if test="menuFoodDetailLu != null">#{menuFoodDetailLu},</if>
+            <if test="menuFoodDetailLuPhoto != null">#{menuFoodDetailLuPhoto},</if>
             <if test="menuFoodDetailDi != null">#{menuFoodDetailDi},</if>
+            <if test="menuFoodDetailDiPhoto != null">#{menuFoodDetailDiPhoto},</if>
             <if test="canteenName != null">#{canteenName},</if>
             <if test="canteenId != null">#{canteenId},</if>
             <if test="isUse != null">#{isUse},</if>
@@ -106,10 +118,10 @@
     </insert>
 
     <insert id="batchMenuFoodVo">
-        insert into menu_food(menu_food_time, menu_food_detail_bk, menu_food_detail_lu, menu_food_detail_di, is_use,
+        insert into menu_food(menu_food_time, menu_food_detail_bk,menu_food_detail_bk_photo, menu_food_detail_lu,menu_food_detail_lu_photo, menu_food_detail_di, menu_food_detail_di_photo, is_use,
         create_time, remark) values
         <foreach item="item" index="index" collection="list" separator=",">
-            (#{item.menuFoodTime},#{item.menuFoodDetailBk},#{item.menuFoodDetailLu},#{item.menuFoodDetailDi},#{item.isUse},sysdate(),#{item.remark})
+            (#{item.menuFoodTime},#{item.menuFoodDetailBk},#{item.menuFoodDetailBkPhoto},#{item.menuFoodDetailLu},#{item.menuFoodDetailLuPhoto},#{item.menuFoodDetailDi},#{item.menuFoodDetailDiPhoto},#{item.isUse},sysdate(),#{item.remark})
         </foreach>
     </insert>
     <update id="updateMenuFood" parameterType="MenuFood">
@@ -118,8 +130,11 @@
             <if test="menuFoodTime != null">menu_food_time = #{menuFoodTime},</if>
             <if test="menuFoodType != null">menu_food_type = #{menuFoodType},</if>
             <if test="menuFoodDetailBk != null">menu_food_detail_bk = #{menuFoodDetailBk},</if>
+            <if test="menuFoodDetailBkPhoto != null">menu_food_detail_bk_photo = #{menuFoodDetailBkPhoto},</if>
             <if test="menuFoodDetailLu != null">menu_food_detail_lu = #{menuFoodDetailLu},</if>
+            <if test="menuFoodDetailLuPhoto != null">menu_food_detail_lu_photo = #{menuFoodDetailLuPhoto},</if>
             <if test="menuFoodDetailDi != null">menu_food_detail_di = #{menuFoodDetailDi},</if>
+            <if test="menuFoodDetailDiPhoto != null">menu_food_detail_di_photo = #{menuFoodDetailDiPhoto},</if>
             <if test="canteenName != null">canteen_name = #{canteenName},</if>
             <if test="canteenId != null">canteen_id = #{canteenId},</if>
             <if test="isUse != null">is_use = #{isUse},</if>

+ 22 - 4
ruoyi-system/src/main/resources/mapper/system/MenuFoodRecordMapper.xml

@@ -8,9 +8,12 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
         <result property="menuFoodRecordId"    column="menu_food_record_id"    />
         <result property="menuFoodTime"    column="menu_food_time"    />
         <result property="menuFoodType"    column="menu_food_type"    />
-        <result property="menuFoodDetailBk"    column="menu_food_detail_bk"    />
-        <result property="menuFoodDetailLu"    column="menu_food_detail_lu"    />
-        <result property="menuFoodDetailDi"    column="menu_food_detail_di"    />
+        <result property="menuFoodDetailBk" column="menu_food_detail_bk"/>
+        <result property="menuFoodDetailBkPhoto" column="menu_food_detail_bk_photo"/>
+        <result property="menuFoodDetailLu" column="menu_food_detail_lu"/>
+        <result property="menuFoodDetailLuPhoto" column="menu_food_detail_lu_photo"/>
+        <result property="menuFoodDetailDi" column="menu_food_detail_di"/>
+        <result property="menuFoodDetailDiPhoto" column="menu_food_detail_di_photo"/>
         <result property="canteenName"    column="canteen_name"    />
         <result property="canteenId"    column="canteen_id"    />
         <result property="recordTime"    column="record_time"    />
@@ -23,7 +26,13 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
     </resultMap>
 
     <sql id="selectMenuFoodRecordVo">
-        select menu_food_record_id, menu_food_time, menu_food_type, menu_food_detail_bk, menu_food_detail_lu, menu_food_detail_di, canteen_name, canteen_id, record_time, create_dept, create_by, create_time, update_by, update_time, remark from menu_food_record
+        select menu_food_record_id, menu_food_time, menu_food_type,
+               menu_food_detail_bk,
+               menu_food_detail_bk_photo,
+               menu_food_detail_lu,
+               menu_food_detail_lu_photo,
+               menu_food_detail_di,
+               menu_food_detail_di_photo, canteen_name, canteen_id, record_time, create_dept, create_by, create_time, update_by, update_time, remark from menu_food_record
     </sql>
 
     <select id="selectMenuFoodRecordList" parameterType="MenuFoodRecord" resultMap="MenuFoodRecordResult">
@@ -52,8 +61,11 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
             <if test="menuFoodTime != null">menu_food_time,</if>
             <if test="menuFoodType != null">menu_food_type,</if>
             <if test="menuFoodDetailBk != null">menu_food_detail_bk,</if>
+            <if test="menuFoodDetailBkPhoto != null">menu_food_detail_bk_photo,</if>
             <if test="menuFoodDetailLu != null">menu_food_detail_lu,</if>
+            <if test="menuFoodDetailLuPhoto != null">menu_food_detail_lu_photo,</if>
             <if test="menuFoodDetailDi != null">menu_food_detail_di,</if>
+            <if test="menuFoodDetailDiPhoto != null">menu_food_detail_di_photo,</if>
             <if test="canteenName != null">canteen_name,</if>
             <if test="canteenId != null">canteen_id,</if>
             <if test="recordTime != null">record_time,</if>
@@ -68,8 +80,11 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
             <if test="menuFoodTime != null">#{menuFoodTime},</if>
             <if test="menuFoodType != null">#{menuFoodType},</if>
             <if test="menuFoodDetailBk != null">#{menuFoodDetailBk},</if>
+            <if test="menuFoodDetailBkPhoto != null">#{menuFoodDetailBkPhoto},</if>
             <if test="menuFoodDetailLu != null">#{menuFoodDetailLu},</if>
+            <if test="menuFoodDetailLuPhoto != null">#{menuFoodDetailLuPhoto},</if>
             <if test="menuFoodDetailDi != null">#{menuFoodDetailDi},</if>
+            <if test="menuFoodDetailDiPhoto != null">#{menuFoodDetailDiPhoto},</if>
             <if test="canteenName != null">#{canteenName},</if>
             <if test="canteenId != null">#{canteenId},</if>
             <if test="recordTime != null">#{recordTime},</if>
@@ -88,8 +103,11 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
             <if test="menuFoodTime != null">menu_food_time = #{menuFoodTime},</if>
             <if test="menuFoodType != null">menu_food_type = #{menuFoodType},</if>
             <if test="menuFoodDetailBk != null">menu_food_detail_bk = #{menuFoodDetailBk},</if>
+            <if test="menuFoodDetailBkPhoto != null">menu_food_detail_bk_photo = #{menuFoodDetailBkPhoto},</if>
             <if test="menuFoodDetailLu != null">menu_food_detail_lu = #{menuFoodDetailLu},</if>
+            <if test="menuFoodDetailLuPhoto != null">menu_food_detail_lu_photo = #{menuFoodDetailLuPhoto},</if>
             <if test="menuFoodDetailDi != null">menu_food_detail_di = #{menuFoodDetailDi},</if>
+            <if test="menuFoodDetailDiPhoto != null">menu_food_detail_di_photo = #{menuFoodDetailDiPhoto},</if>
             <if test="canteenName != null">canteen_name = #{canteenName},</if>
             <if test="canteenId != null">canteen_id = #{canteenId},</if>
             <if test="recordTime != null">record_time = #{recordTime},</if>

+ 2 - 1
ruoyi-system/src/main/resources/mapper/system/SysUserMapper.xml

@@ -52,6 +52,7 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
 		<result property="nickName"     column="nick_name"    />
 		<result property="avatar"     column="avatar"    />
 		<result property="phonenumber"  column="phonenumber"  />
+		<result property="password"  column="password"  />
 	</resultMap>
 	
 	<sql id="selectUserVo">
@@ -150,7 +151,7 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
 		select user_id, email from sys_user where email = #{email} and del_flag = '0' limit 1
 	</select>
     <select id="getUserInfoList" parameterType="Long" resultMap="SysUserVoResult">
-		select user_id, user_name,nick_name,phonenumber,avatar from sys_user where user_id in
+		select user_id, user_name,nick_name,phonenumber,avatar,password from sys_user where user_id in
 		<foreach collection="array" item="userId" open="(" separator="," close=")">
 			#{userId}
 		</foreach>