浏览代码

社团预约功能完善

xianwait 2 年之前
父节点
当前提交
be79232d0f
共有 20 个文件被更改,包括 531 次插入319 次删除
  1. 37 10
      willalp-admin/src/main/java/com/willalp/web/controller/app/AppThreeController.java
  2. 15 23
      willalp-admin/src/main/java/com/willalp/web/controller/canteen/HsCanteenDiningPlaceController.java
  3. 28 4
      willalp-admin/src/main/java/com/willalp/web/controller/clockingin/HsEventController.java
  4. 6 7
      willalp-admin/src/main/java/com/willalp/web/controller/clockingin/HsOrgPersonnelFilesController.java
  5. 5 5
      willalp-admin/src/main/java/com/willalp/web/controller/system/SysConfigController.java
  6. 10 9
      willalp-clocking-in/src/main/java/com/willalp/event/domain/HsEvent.java
  7. 6 39
      willalp-clocking-in/src/main/java/com/willalp/event/domain/vo/AppActivityAppointRecordVo.java
  8. 2 2
      willalp-clocking-in/src/main/java/com/willalp/event/domain/vo/ClubActivityMoreVo.java
  9. 20 4
      willalp-clocking-in/src/main/java/com/willalp/event/mapper/HsEventMapper.java
  10. 1 0
      willalp-clocking-in/src/main/java/com/willalp/event/mapper/xml/HsActivityAppointMapper.xml
  11. 24 15
      willalp-clocking-in/src/main/java/com/willalp/event/mapper/xml/HsEventMapper.xml
  12. 16 7
      willalp-clocking-in/src/main/java/com/willalp/event/service/IHsEventService.java
  13. 29 20
      willalp-clocking-in/src/main/java/com/willalp/event/service/impl/HsEventServiceImpl.java
  14. 1 1
      willalp-clocking-in/src/main/java/com/willalp/files/mapper/xml/HsOrgPersonnelFilesMapper.xml
  15. 21 8
      willalp-clocking-in/src/main/java/com/willalp/flow/service/impl/HsFlowEngineServiceImpl.java
  16. 10 4
      willalp-framework/src/main/java/com/willalp/framework/config/JacksonConfig.java
  17. 9 1
      willalp-ui/src/api/eventConfig/event.js
  18. 9 13
      willalp-ui/src/views/canteen/gift/index.vue
  19. 1 5
      willalp-ui/src/views/canteen/place/index.vue
  20. 281 142
      willalp-ui/src/views/eventConfig/event/index.vue

+ 37 - 10
willalp-admin/src/main/java/com/willalp/web/controller/app/AppThreeController.java

@@ -31,6 +31,7 @@ import io.swagger.annotations.Api;
 import org.apache.commons.logging.Log;
 import org.apache.commons.logging.LogFactory;
 import org.springframework.beans.factory.annotation.Value;
+import org.springframework.transaction.annotation.Transactional;
 import org.springframework.web.bind.annotation.PostMapping;
 import org.springframework.web.bind.annotation.RequestMapping;
 import org.springframework.web.bind.annotation.RequestParam;
@@ -154,6 +155,7 @@ public class AppThreeController extends BaseController {
             eventImg.setEventId(request.getHeader("eventId"));
             eventImg.setType(fileName.split("\\.")[1]);
             eventImg.setUrl(baseUrl + url);
+            eventImg.setCreateTime(new Date());
             eventImgService.save(eventImg);
             return ajax;
         } catch (Exception e) {
@@ -167,7 +169,7 @@ public class AppThreeController extends BaseController {
             return AjaxResult.error();
         }
         return AjaxResult.success(eventImgService.getBaseMapper().selectList(new QueryWrapper<HsEventImg>()
-                .eq("event_id", eventId)));
+                .eq("event_id", eventId).orderByDesc("create_time")));
     }
 
 
@@ -182,6 +184,7 @@ public class AppThreeController extends BaseController {
         return AjaxResult.success(eventService.appGetMoreById(eventId));
     }
 
+    @Transactional(rollbackFor = Exception.class)
     @RequestMapping("/eventOrder")
     public AjaxResult eventOrder(String eventId) {
         if (StringUtils.isBlank(eventId)) {
@@ -191,21 +194,27 @@ public class AppThreeController extends BaseController {
         if (hsEvent == null) {
             return AjaxResult.error("活动不存在或已经结束");
         }
+        if ("3".equals(hsEvent.getEventStatus())) {
+            return AjaxResult.error("活动进行中,已无法预约");
+        }
+        if ("4".equals(hsEvent.getEventStatus())) {
+            return AjaxResult.error("活动已结束");
+        }
         //限额验证
-        Integer count = Math.toIntExact(activityAppointService.getBaseMapper().selectCount(new QueryWrapper<HsActivityAppoint>()
+        int count = Math.toIntExact(activityAppointService.getBaseMapper().selectCount(new QueryWrapper<HsActivityAppoint>()
                 .eq("activity_id", eventId)
                 .eq("create_by", getUsername())));
-        Integer sum = Math.toIntExact(activityAppointService.getBaseMapper().selectCount(new QueryWrapper<HsActivityAppoint>()
-                .eq("activity_id", eventId)));
         if (count > 0) {
             return AjaxResult.error("您已经预约过了,不能重复预约");
         }
-        if (sum < hsEvent.getLimitNum()) {
+        //更新预约数量
+        if (eventService.eventAppointOrder(eventId) > 0) {
+            //生成预约记录
             HsActivityAppoint activityAppoint = new HsActivityAppoint();
             activityAppoint.setActivityId(eventId);
             SysUser user = getLoginUser().getUser();
             if (user == null) {
-                return AjaxResult.error("预约失败");
+                return AjaxResult.error("预约失败,非法用户操作");
             }
             activityAppoint.setAppointeeName(user.getNickName());
             activityAppoint.setAppointeePhone(user.getPhonenumber());
@@ -215,10 +224,16 @@ public class AppThreeController extends BaseController {
             activityAppoint.setCreateTime(new Date());
             return AjaxResult.success(activityAppointService.save(activityAppoint));
         } else {
-            return AjaxResult.error("名额已满");
+            int sum = Math.toIntExact(activityAppointService.getBaseMapper().selectCount(new QueryWrapper<HsActivityAppoint>()
+                    .eq("activity_id", eventId)));
+            if (sum == hsEvent.getLimitNum()) {
+                return AjaxResult.error("名额已满");
+            }
+            return AjaxResult.error("预约失败,请联系管理员");
         }
     }
 
+    @Transactional(rollbackFor = Exception.class)
     @RequestMapping("/backEventOrder")
     public AjaxResult backEventOrder(String id) {
         if (StringUtils.isBlank(id)) {
@@ -231,14 +246,26 @@ public class AppThreeController extends BaseController {
                 return AjaxResult.error("活动不存在或已经结束");
             }
             //时间验证
-            Date eventEndTime = hsEvent.getEventEndTime();
+            Date eventStartTime = hsEvent.getEventStartTime();
             //禁止取消预约时限
             Integer banCancelSubscribeTimeLimit = hsEvent.getBanCancelSubscribeTimeLimit();
             long msTime = banCancelSubscribeTimeLimit * (1000 * 60 * 60);
             long timeMillis = System.currentTimeMillis();
-            msTime = eventEndTime.getTime() - msTime;
+            msTime = eventStartTime.getTime() - msTime;
+            if ("3".equals(hsEvent.getEventStatus())) {
+                return AjaxResult.error("活动进行中,无法取消预约");
+            }
+            if ("4".equals(hsEvent.getEventStatus())) {
+                return AjaxResult.error("活动已结束,无法取消预约");
+            }
             if (timeMillis < msTime) {
-                return toAjax(activityAppointService.removeById(id));
+                //更新预约数量
+                if (eventService.eventAppointBack(hsEvent.getId()) > 0) {
+                    //删除预约记录
+                    return toAjax(activityAppointService.removeById(id));
+                } else {
+                    return AjaxResult.error("取消失败,请联系管理员");
+                }
             } else {
                 return AjaxResult.error("已过可退时间");
             }

+ 15 - 23
willalp-admin/src/main/java/com/willalp/web/controller/canteen/HsCanteenDiningPlaceController.java

@@ -13,7 +13,6 @@ import com.willalp.common.utils.poi.ExcelUtil;
 import com.willalp.number.domain.req.NumberRuleReq;
 import com.willalp.number.service.IHsSysNumberRuleService;
 import org.springframework.beans.factory.annotation.Autowired;
-import org.springframework.security.access.prepost.PreAuthorize;
 import org.springframework.web.bind.annotation.*;
 
 import java.util.List;
@@ -26,8 +25,7 @@ import java.util.List;
  */
 @RestController
 @RequestMapping("/canteen/place")
-public class HsCanteenDiningPlaceController extends BaseController
-{
+public class HsCanteenDiningPlaceController extends BaseController {
     @Autowired
     private IHsCanteenDiningPlaceService hsCanteenDiningPlaceService;
 
@@ -39,8 +37,7 @@ public class HsCanteenDiningPlaceController extends BaseController
      */
     //@PreAuthorize("@ss.hasPermi('canteen:place:list')")
     @GetMapping("/list")
-    public AjaxResult list(HsCanteenDiningPlace hsCanteenDiningPlace)
-    {
+    public AjaxResult list(HsCanteenDiningPlace hsCanteenDiningPlace) {
         hsCanteenDiningPlace.setParentId(null);
         List<HsCanteenDiningPlace> list = hsCanteenDiningPlaceService.selectHsCanteenDiningPlaceList(hsCanteenDiningPlace);
         return AjaxResult.success(list);
@@ -48,18 +45,17 @@ public class HsCanteenDiningPlaceController extends BaseController
 
 
     @GetMapping("/integralExchangeGetPlace")
-    public AjaxResult integralExchangeGetPlace(){
+    public AjaxResult integralExchangeGetPlace() {
         return AjaxResult.success(hsCanteenDiningPlaceService.getPlaceByConfigKey(IHsCanteenDiningPlaceService.GIFT_PLACE_CONFIG_KEY));
     }
 
     /**
      * 导出就餐地列表
      */
-    @PreAuthorize("@ss.hasPermi('canteen:place:export')")
+//    @PreAuthorize("@ss.hasPermi('canteen:place:export')")
     @Log(title = "就餐地", businessType = BusinessType.EXPORT)
     @GetMapping("/export")
-    public AjaxResult export(HsCanteenDiningPlace hsCanteenDiningPlace)
-    {
+    public AjaxResult export(HsCanteenDiningPlace hsCanteenDiningPlace) {
         List<HsCanteenDiningPlace> list = hsCanteenDiningPlaceService.selectHsCanteenDiningPlaceList(hsCanteenDiningPlace);
         ExcelUtil<HsCanteenDiningPlace> util = new ExcelUtil<HsCanteenDiningPlace>(HsCanteenDiningPlace.class);
         return util.exportExcel(list, "就餐地数据");
@@ -68,23 +64,21 @@ public class HsCanteenDiningPlaceController extends BaseController
     /**
      * 获取就餐地详细信息
      */
-    @PreAuthorize("@ss.hasPermi('canteen:place:query')")
+//    @PreAuthorize("@ss.hasPermi('canteen:place:query')")
     @GetMapping(value = "/{placeId}")
-    public AjaxResult getInfo(@PathVariable("placeId") Long placeId)
-    {
+    public AjaxResult getInfo(@PathVariable("placeId") Long placeId) {
         return AjaxResult.success(hsCanteenDiningPlaceService.getById(placeId));
     }
 
     /**
      * 新增就餐地
      */
-    @PreAuthorize("@ss.hasPermi('canteen:place:add')")
+//    @PreAuthorize("@ss.hasPermi('canteen:place:add')")
     @Log(title = "就餐地", businessType = BusinessType.INSERT)
     @PostMapping
-    public AjaxResult add(@RequestBody HsCanteenDiningPlace hsCanteenDiningPlace)
-    {
+    public AjaxResult add(@RequestBody HsCanteenDiningPlace hsCanteenDiningPlace) {
         //编号
-        NumberRuleReq numberRuleReq =new NumberRuleReq();
+        NumberRuleReq numberRuleReq = new NumberRuleReq();
         numberRuleReq.setRuleId(NumberRuleEnum.PLACE.getValue());
         numberRuleReq.setInput(hsCanteenDiningPlace.getJgid());
         String number = hsSysNumberRuleService.getNumber(numberRuleReq);
@@ -105,11 +99,10 @@ public class HsCanteenDiningPlaceController extends BaseController
     /**
      * 修改就餐地
      */
-    @PreAuthorize("@ss.hasPermi('canteen:place:edit')")
+//    @PreAuthorize("@ss.hasPermi('canteen:place:edit')")
     @Log(title = "就餐地", businessType = BusinessType.UPDATE)
     @PutMapping
-    public AjaxResult edit(@RequestBody HsCanteenDiningPlace hsCanteenDiningPlace)
-    {
+    public AjaxResult edit(@RequestBody HsCanteenDiningPlace hsCanteenDiningPlace) {
         hsCanteenDiningPlace.setUpdateBy(SecurityUtils.getUsername());
         return toAjax(hsCanteenDiningPlaceService.updateById(hsCanteenDiningPlace));
     }
@@ -117,11 +110,10 @@ public class HsCanteenDiningPlaceController extends BaseController
     /**
      * 删除就餐地
      */
-    @PreAuthorize("@ss.hasPermi('canteen:place:remove')")
+//    @PreAuthorize("@ss.hasPermi('canteen:place:remove')")
     @Log(title = "就餐地", businessType = BusinessType.DELETE)
-	@DeleteMapping("/{placeIds}")
-    public AjaxResult remove(@PathVariable Long placeIds)
-    {
+    @DeleteMapping("/{placeIds}")
+    public AjaxResult remove(@PathVariable Long placeIds) {
         return toAjax(hsCanteenDiningPlaceService.deleteHsCanteenDiningPlaceByPlaceId(placeIds));
     }
 }

+ 28 - 4
willalp-admin/src/main/java/com/willalp/web/controller/clockingin/HsEventController.java

@@ -80,11 +80,11 @@ public class HsEventController extends BaseController {
         hsEvent.setCreateBy(SecurityUtils.getUsername());
         hsEvent.setCreateTime(DateUtils.getNowDate());
         if (hsEvent.getEventStartTime() != null) {
-            String dateToStr = DateUtils.parseDateToStr("yyyy-MM-dd", hsEvent.getEventStartTime());
+            String dateToStr = DateUtils.parseDateToStr("yyyy-MM-dd HH", hsEvent.getEventStartTime());
             if (StringUtils.isNotBlank(hsEvent.getEventPlace())) {
                 HsCanteenDiningPlace canteenDiningPlace = placeService.getById(hsEvent.getEventPlace());
                 if (canteenDiningPlace != null) {
-                    hsEvent.setEventName(dateToStr + canteenDiningPlace.getPlaceName());
+                    hsEvent.setEventName(dateToStr +"时 - "+ canteenDiningPlace.getPlaceName());
                     return toAjax(hsEventService.save(hsEvent));
                 }
             }
@@ -92,6 +92,30 @@ public class HsEventController extends BaseController {
         return AjaxResult.error();
     }
 
+    /**
+     * 新增活动配置
+     */
+    @PreAuthorize("@ss.hasPermi('eventConfig:event:add')")
+    @Log(title = "活动配置", businessType = BusinessType.INSERT)
+    @PostMapping("/saveEvents")
+    public AjaxResult add(@RequestBody List<HsEvent> eventFormList) {
+        if (eventFormList != null && eventFormList.size() > 0) {
+            eventFormList.forEach(hsEvent -> {
+                if (hsEvent.getEventStartTime() != null) {
+                    String dateToStr = DateUtils.parseDateToStr("yyyy-MM-dd HH", hsEvent.getEventStartTime());
+                    if (StringUtils.isNotBlank(hsEvent.getEventPlace())) {
+                        HsCanteenDiningPlace canteenDiningPlace = placeService.getById(hsEvent.getEventPlace());
+                        if (canteenDiningPlace != null) {
+                            hsEvent.setEventName(dateToStr +"时 - "+ canteenDiningPlace.getPlaceName());
+                        }
+                    }
+                }
+            });
+            return toAjax(hsEventService.saveBatch(eventFormList));
+        }
+        return AjaxResult.error();
+    }
+
     /**
      * 修改活动配置
      */
@@ -102,11 +126,11 @@ public class HsEventController extends BaseController {
         hsEvent.setUpdateBy(SecurityUtils.getUsername());
         hsEvent.setUpdateTime(DateUtils.getNowDate());
         if (hsEvent.getEventStartTime() != null) {
-            String dateToStr = DateUtils.parseDateToStr("yyyy-MM-dd", hsEvent.getEventStartTime());
+            String dateToStr = DateUtils.parseDateToStr("yyyy-MM-dd HH", hsEvent.getEventStartTime());
             if (StringUtils.isNotBlank(hsEvent.getEventPlace())) {
                 HsCanteenDiningPlace canteenDiningPlace = placeService.getById(hsEvent.getEventPlace());
                 if (canteenDiningPlace != null) {
-                    hsEvent.setEventName(dateToStr + canteenDiningPlace.getPlaceName());
+                    hsEvent.setEventName(dateToStr +"时 - "+ canteenDiningPlace.getPlaceName());
                 }
             }
         }

+ 6 - 7
willalp-admin/src/main/java/com/willalp/web/controller/clockingin/HsOrgPersonnelFilesController.java

@@ -14,7 +14,6 @@ import com.willalp.files.domain.HsOrgPersonnelFiles;
 import com.willalp.files.service.IHsOrgPersonnelFilesService;
 import com.willalp.system.domain.SysUserOrganization;
 import com.willalp.system.service.ISysUserOrganizationService;
-import org.springframework.security.access.prepost.PreAuthorize;
 import org.springframework.web.bind.annotation.*;
 import org.springframework.web.multipart.MultipartFile;
 
@@ -40,7 +39,7 @@ public class HsOrgPersonnelFilesController extends BaseController {
     /**
      * 查询机构人员档案列表
      */
-    @PreAuthorize("@ss.hasPermi('files:files:list')")
+//    @PreAuthorize("@ss.hasPermi('files:files:list')")
     @GetMapping("/list")
     public TableDataInfo list(HsOrgPersonnelFiles hsOrgPersonnelFiles) {
         startPage();
@@ -51,7 +50,7 @@ public class HsOrgPersonnelFilesController extends BaseController {
     /**
      * 导出机构人员档案列表
      */
-    @PreAuthorize("@ss.hasPermi('files:files:export')")
+//    @PreAuthorize("@ss.hasPermi('files:files:export')")
     @Log(title = "机构人员档案", businessType = BusinessType.EXPORT)
     @GetMapping("/export")
     public AjaxResult export(HsOrgPersonnelFiles hsOrgPersonnelFiles) {
@@ -78,7 +77,7 @@ public class HsOrgPersonnelFilesController extends BaseController {
     /**
      * 获取机构人员档案详细信息`
      */
-    @PreAuthorize("@ss.hasPermi('files:files:query')")
+//    @PreAuthorize("@ss.hasPermi('files:files:query')")
     @GetMapping(value = "/{id}")
     public AjaxResult getInfo(@PathVariable("id") String id) {
         return AjaxResult.success(hsOrgPersonnelFilesService.getById(id));
@@ -87,7 +86,7 @@ public class HsOrgPersonnelFilesController extends BaseController {
     /**
      * 新增机构人员档案
      */
-    @PreAuthorize("@ss.hasPermi('files:files:add')")
+//    @PreAuthorize("@ss.hasPermi('files:files:add')")
     @Log(title = "机构人员档案", businessType = BusinessType.INSERT)
     @PostMapping
     public AjaxResult add(@RequestBody HsOrgPersonnelFiles hsOrgPersonnelFiles) {
@@ -99,7 +98,7 @@ public class HsOrgPersonnelFilesController extends BaseController {
     /**
      * 修改机构人员档案
      */
-    @PreAuthorize("@ss.hasPermi('files:files:edit')")
+//    @PreAuthorize("@ss.hasPermi('files:files:edit')")
     @Log(title = "机构人员档案", businessType = BusinessType.UPDATE)
     @PutMapping
     public AjaxResult edit(@RequestBody HsOrgPersonnelFiles hsOrgPersonnelFiles) {
@@ -127,7 +126,7 @@ public class HsOrgPersonnelFilesController extends BaseController {
     /**
      * 删除机构人员档案
      */
-    @PreAuthorize("@ss.hasPermi('files:files:remove')")
+//    @PreAuthorize("@ss.hasPermi('files:files:remove')")
     @Log(title = "机构人员档案", businessType = BusinessType.DELETE)
     @DeleteMapping("/{ids}")
     public AjaxResult remove(@PathVariable String[] ids) {

+ 5 - 5
willalp-admin/src/main/java/com/willalp/web/controller/system/SysConfigController.java

@@ -32,7 +32,7 @@ public class SysConfigController extends BaseController
     /**
      * 获取参数配置列表
      */
-    @PreAuthorize("@ss.hasPermi('system:config:list')")
+//    @PreAuthorize("@ss.hasPermi('system:config:list')")
     @GetMapping("/list")
     public TableDataInfo list(SysConfig config)
     {
@@ -54,7 +54,7 @@ public class SysConfigController extends BaseController
     /**
      * 根据参数编号获取详细信息
      */
-    @PreAuthorize("@ss.hasPermi('system:config:query')")
+//    @PreAuthorize("@ss.hasPermi('system:config:query')")
     @GetMapping(value = "/{configId}")
     public AjaxResult getInfo(@PathVariable Long configId)
     {
@@ -76,7 +76,7 @@ public class SysConfigController extends BaseController
     /**
      * 新增参数配置
      */
-    @PreAuthorize("@ss.hasPermi('system:config:add')")
+//    @PreAuthorize("@ss.hasPermi('system:config:add')")
     @Log(title = "参数管理", businessType = BusinessType.INSERT)
     @PostMapping
     @RepeatSubmit
@@ -93,7 +93,7 @@ public class SysConfigController extends BaseController
     /**
      * 修改参数配置
      */
-    @PreAuthorize("@ss.hasPermi('system:config:edit')")
+//    @PreAuthorize("@ss.hasPermi('system:config:edit')")
     @Log(title = "参数管理", businessType = BusinessType.UPDATE)
     @PutMapping
     public AjaxResult edit(@Validated @RequestBody SysConfig config)
@@ -109,7 +109,7 @@ public class SysConfigController extends BaseController
     /**
      * 删除参数配置
      */
-    @PreAuthorize("@ss.hasPermi('system:config:remove')")
+//    @PreAuthorize("@ss.hasPermi('system:config:remove')")
     @Log(title = "参数管理", businessType = BusinessType.DELETE)
     @DeleteMapping("/{configIds}")
     public AjaxResult remove(@PathVariable Long[] configIds)

+ 10 - 9
willalp-clocking-in/src/main/java/com/willalp/event/domain/HsEvent.java

@@ -37,16 +37,16 @@ public class HsEvent extends BaseEntity
     @Excel(name = "事件名称")
     private String eventName;
 
-    /** 事件开始时间 */
+    /** 活动开始时间 */
     @DateTimeFormat
     @JsonFormat(pattern = "yyyy-MM-dd HH:mm", timezone = "GMT+8")
-    @Excel(name = "事件开始时间", width = 30, dateFormat = "yyyy-MM-dd")
+    @Excel(name = "活动开始时间", width = 30, dateFormat = "yyyy-MM-dd")
     private Date eventStartTime;
 
-    /** 事件结束时间 */
+    /** 活动结束时间 */
     @DateTimeFormat
     @JsonFormat(pattern = "yyyy-MM-dd HH:mm", timezone = "GMT+8")
-    @Excel(name = "事件结束时间", width = 30, dateFormat = "yyyy-MM-dd")
+    @Excel(name = "活动结束时间", width = 30, dateFormat = "yyyy-MM-dd")
     private Date eventEndTime;
 
     /** 开始时间 */
@@ -55,11 +55,6 @@ public class HsEvent extends BaseEntity
     @Excel(name = "开始时间", width = 30, dateFormat = "yyyy-MM-dd")
     private Date startTime;
 
-    /** 事件时间 */
-    @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss")
-    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8")
-    @Excel(name = "事件时间", width = 30, dateFormat = "yyyy-MM-dd HH:mm:ss")
-    private Date eventTime;
 
     /** 结束时间 */
     @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss")
@@ -67,6 +62,12 @@ public class HsEvent extends BaseEntity
     @Excel(name = "结束时间", width = 30, dateFormat = "yyyy-MM-dd")
     private Date endTime;
 
+    /** 事件时间 */
+    @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss")
+    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8")
+    @Excel(name = "事件时间", width = 30, dateFormat = "yyyy-MM-dd HH:mm:ss")
+    private Date eventTime;
+
     /** 事件类型 */
     @Excel(name = "事件类型")
     private String eventType;

+ 6 - 39
willalp-clocking-in/src/main/java/com/willalp/event/domain/vo/AppActivityAppointRecordVo.java

@@ -2,6 +2,7 @@ package com.willalp.event.domain.vo;
 
 import com.fasterxml.jackson.annotation.JsonFormat;
 import com.willalp.common.annotation.Excel;
+import lombok.Data;
 
 import java.util.Date;
 
@@ -11,11 +12,16 @@ import java.util.Date;
  * @author willalp
  * @date 2023-01-29*/
 
+@Data
 public class AppActivityAppointRecordVo {
 
     /** 主键 */
     private String id;
 
+    /** eventId */
+    @Excel(name = "eventId")
+    private String eventId;
+
     /** 事件名称 */
     @Excel(name = "事件名称")
     private String eventName;
@@ -33,43 +39,4 @@ public class AppActivityAppointRecordVo {
     @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss" , timezone = "GMT+8")
     private Date createTime;
 
-    public void setId(String id) {
-        this.id = id;
-    }
-
-    public String getId() {
-        return id;
-    }
-
-    public void setEventName(String eventName) {
-        this.eventName = eventName;
-    }
-
-    public String getEventName() {
-        return eventName;
-    }
-
-    public Date getEventTime() {
-        return eventTime;
-    }
-
-    public void setEventStartTime(Date eventTime) {
-        this.eventTime = eventTime;
-    }
-
-    public String getEventType() {
-        return eventType;
-    }
-
-    public void setEventType(String eventType) {
-        this.eventType = eventType;
-    }
-
-    public Date getCreateTime() {
-        return createTime;
-    }
-
-    public void setCreateTime(Date createTime) {
-        this.createTime = createTime;
-    }
 }

+ 2 - 2
willalp-clocking-in/src/main/java/com/willalp/event/domain/vo/ClubActivityMoreVo.java

@@ -36,12 +36,12 @@ public class ClubActivityMoreVo {
     private String clubName;
 
     /** 事件开始时间 */
-    @JsonFormat(pattern = "yyyy-MM-dd HH:mm")
+    @JsonFormat(pattern = "yyyy-MM-dd HH:mm", timezone = "GMT+8")
     @Excel(name = "事件开始时间", width = 30, dateFormat = "yyyy-MM-dd")
     private Date eventStartTime;
 
     /** 事件结束时间 */
-    @JsonFormat(pattern = "yyyy-MM-dd HH:mm")
+    @JsonFormat(pattern = "yyyy-MM-dd HH:mm", timezone = "GMT+8")
     @Excel(name = "事件结束时间", width = 30, dateFormat = "yyyy-MM-dd")
     private Date eventEndTime;
 

+ 20 - 4
willalp-clocking-in/src/main/java/com/willalp/event/mapper/HsEventMapper.java

@@ -25,18 +25,17 @@ public interface HsEventMapper extends BaseMapper<HsEvent> {
     /**
      * 获取当前时间进行中的事件
      *
-     * @param hsEvent
      * @return
      */
-    List<HsEvent> getNowEventList(HsEvent hsEvent);
+    List<HsEvent> getNowEventList();
+
 
     /**
      * 获取当前时间结束或过期的事件
      *
-     * @param hsEvent
      * @return
      */
-    List<HsEvent> getFormerlyEventList(HsEvent hsEvent);
+    List<HsEvent> getFormerlyEventList();
 
     /**
      * app获取活动集
@@ -52,4 +51,21 @@ public interface HsEventMapper extends BaseMapper<HsEvent> {
      * @return
      */
     ClubActivityMoreVo appGetMoreById(@Param("id") String id);
+
+
+    /**
+     * 活动预约操作
+     *
+     * @param eventId
+     * @return
+     */
+    int eventAppointOrder(@Param("eventId") String eventId);
+
+    /**
+     * 取消活动预约操作
+     *
+     * @param eventId
+     * @return
+     */
+    int eventAppointBack(@Param("eventId") String eventId);
 }

+ 1 - 0
willalp-clocking-in/src/main/java/com/willalp/event/mapper/xml/HsActivityAppointMapper.xml

@@ -66,6 +66,7 @@
     </select>
     <select id="appGetRecord" resultType="com.willalp.event.domain.vo.AppActivityAppointRecordVo">
         select haa.id              id,
+               he.id               eventId,
                he.event_name       eventName,
                he.event_start_time eventTime,
                hai.project_name    eventType,

+ 24 - 15
willalp-clocking-in/src/main/java/com/willalp/event/mapper/xml/HsEventMapper.xml

@@ -56,7 +56,6 @@
                remark
         from hs_event
     </sql>
-
     <select id="selectHsEventList" parameterType="HsEvent" resultMap="HsEventResult">
         <include refid="selectHsEventVo"/>
         <where>
@@ -92,38 +91,34 @@
         <include refid="selectHsEventVo"/>
         WHERE
         is_delete = 0
-        AND
-        end_time &gt; NOW()
-        AND
-        start_time &lt; NOW();
+        AND event_status = '2'
+        AND event_start_time &lt; NOW()
+        AND event_end_time &gt; NOW()
     </select>
 
     <select id="getFormerlyEventList" resultType="com.willalp.event.domain.HsEvent">
         <include refid="selectHsEventVo"/>
         WHERE
         is_delete = 0
-        AND
-        end_time &lt; NOW()
+        AND event_status = '3'
+        AND event_end_time &lt; NOW()
     </select>
     <select id="appGetEvents" resultType="com.willalp.event.domain.HsEvent">
         SELECT he.id,
                limit_num,
                event_start_time,
                event_end_time,
-               hcdp.place_name           event_place,
-               hcdp.place_site           eventPlaceSite,
-               hcdp.place_img_url        eventImgUrl,
-               (SELECT count(1)
-                FROM hs_activity_appoint haa
-                WHERE he.id = haa.activity_id
-                  AND haa.is_delete = 0) alreadyHave
+               hcdp.place_name    event_place,
+               hcdp.place_site    eventPlaceSite,
+               hcdp.place_img_url eventImgUrl,
+               he.now_num         alreadyHave
         FROM hs_event he
                  LEFT JOIN hs_canteen_dining_place hcdp ON he.event_place = hcdp.place_id
             AND hcdp.place_type = 4
             AND hcdp.is_delete = 0
         WHERE he.is_delete = 0
           AND he.activity_type_id = #{associationsInfoId}
-          AND (he.event_status = '2' or he.event_status = '3')
+          AND he.event_status = '2'
     </select>
     <select id="appGetMoreById" resultType="com.willalp.event.domain.vo.ClubActivityMoreVo">
         SELECT he.id,
@@ -145,5 +140,19 @@
           AND hai.is_delete = 0
           AND hcdp.is_delete = 0
     </select>
+    <update id="eventAppointOrder">
+        update hs_event
+        set now_num = now_num + 1
+        WHERE is_delete = 0
+          AND id = #{eventId}
+          AND now_num &lt; limit_num
+    </update>
+    <update id="eventAppointBack">
+        update hs_event
+        set now_num = now_num - 1
+        WHERE is_delete = 0
+          AND id = #{eventId}
+          AND now_num &gt; 0
+    </update>
 </mapper>
 

+ 16 - 7
willalp-clocking-in/src/main/java/com/willalp/event/service/IHsEventService.java

@@ -21,13 +21,6 @@ public interface IHsEventService extends IService<HsEvent> {
      */
     List<HsEvent> selectHsEventList(HsEvent hsEvent);
 
-    /**
-     * 获取当前时间满足的事件
-     *
-     * @param hsEvent
-     * @return
-     */
-    List<HsEvent> getNowEventList(HsEvent hsEvent);
 
     /**
      * 定时更新事件状态
@@ -49,4 +42,20 @@ public interface IHsEventService extends IService<HsEvent> {
      * @return
      */
     ClubActivityMoreVo appGetMoreById(String eventId);
+
+    /**
+     * 活动预约操作
+     *
+     * @param eventId
+     * @return
+     */
+    int eventAppointOrder(String eventId);
+
+    /**
+     * 取消活动预约操作
+     *
+     * @param eventId
+     * @return
+     */
+    int eventAppointBack(String eventId);
 }

+ 29 - 20
willalp-clocking-in/src/main/java/com/willalp/event/service/impl/HsEventServiceImpl.java

@@ -2,13 +2,13 @@ package com.willalp.event.service.impl;
 
 import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
 import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
+import com.willalp.common.exception.base.BaseException;
 import com.willalp.common.utils.StringUtils;
 import com.willalp.event.domain.HsEvent;
 import com.willalp.event.domain.HsEventBusinessRelation;
 import com.willalp.event.domain.HsEventImg;
 import com.willalp.event.domain.vo.ClubActivityMoreVo;
 import com.willalp.event.mapper.HsEventMapper;
-import com.willalp.event.service.IHsAssociationsInfoService;
 import com.willalp.event.service.IHsEventBusinessRelationService;
 import com.willalp.event.service.IHsEventService;
 import org.slf4j.Logger;
@@ -51,11 +51,6 @@ public class HsEventServiceImpl extends ServiceImpl<HsEventMapper, HsEvent> impl
         return hsEvents;
     }
 
-    @Override
-    public List<HsEvent> getNowEventList(HsEvent hsEvent) {
-        return hsEventMapper.getNowEventList(hsEvent);
-    }
-
     @Resource
     private IHsEventBusinessRelationService relationService;
 
@@ -63,20 +58,21 @@ public class HsEventServiceImpl extends ServiceImpl<HsEventMapper, HsEvent> impl
     public void timingUpdateEventStatus() {
         logger.info("=============开始扫描事件状态=============");
         //过期或结束
-        List<HsEvent> formerlyEventList = baseMapper.getFormerlyEventList(null);
+        List<HsEvent> formerlyEventList = baseMapper.getFormerlyEventList();
         //进行中
-        List<HsEvent> nowEventList = baseMapper.getNowEventList(null);
-        List<HsEvent> formerlyEvents = formerlyEventList.stream().filter(item -> StringUtils.isNotBlank(item.getEventStatus()) && !("4".equals(item.getEventStatus()))).collect(Collectors.toList());
-        List<HsEvent> nowEvents = nowEventList.stream().filter(item -> StringUtils.isNotBlank(item.getEventStatus()) && !("3".equals(item.getEventStatus()))).collect(Collectors.toList());
-        if (formerlyEvents.size() > 0) {
-            formerlyEvents.forEach(item -> item.setEventStatus("4"));
+        List<HsEvent> nowEventList = baseMapper.getNowEventList();
+
+        if (formerlyEventList.size() > 0) {
+            formerlyEventList.forEach(item -> item.setEventStatus("4"));
         }
-        if (nowEvents.size() > 0) {
-            nowEvents.forEach(item -> item.setEventStatus("3"));
+
+        if (nowEventList.size() > 0) {
+            nowEventList.forEach(item -> item.setEventStatus("3"));
         }
+
         List<HsEvent> sumList = new ArrayList<>();
-        sumList.addAll(formerlyEvents);
-        sumList.addAll(nowEvents);
+        sumList.addAll(formerlyEventList);
+        sumList.addAll(nowEventList);
         if (sumList.size() > 0) {
             updateBatchById(sumList);
             List<String> collect = sumList.stream().map(HsEvent::getId).collect(Collectors.toList());
@@ -88,7 +84,7 @@ public class HsEventServiceImpl extends ServiceImpl<HsEventMapper, HsEvent> impl
             //删除关系表数据
             relationService.getBaseMapper().delete(new QueryWrapper<HsEventBusinessRelation>()
                     .in("event_id", collect));
-            logger.info("事件状态更新成功 - 共【" + sumList.size() + "】条,开始进行【" + nowEvents.size() + "】条,已结束【" + formerlyEvents.size() + "】条 ==> 已删除相关数据");
+            logger.info("事件状态更新成功 - 共【" + sumList.size() + "】条,开始进行【" + nowEventList.size() + "】条,已结束【" + formerlyEventList.size() + "】条 ==> 已删除相关数据");
         }
     }
 
@@ -97,9 +93,6 @@ public class HsEventServiceImpl extends ServiceImpl<HsEventMapper, HsEvent> impl
         return baseMapper.appGetEvents(associationsInfoId);
     }
 
-    @Resource
-    private IHsAssociationsInfoService associationsInfoService;
-
     @Override
     public ClubActivityMoreVo appGetMoreById(String eventId) {
         if (StringUtils.isBlank(eventId)) {
@@ -111,4 +104,20 @@ public class HsEventServiceImpl extends ServiceImpl<HsEventMapper, HsEvent> impl
         }
         return clubActivityMoreVo;
     }
+
+    @Override
+    public int eventAppointOrder(String eventId) {
+        if (StringUtils.isBlank(eventId)) {
+            throw new BaseException("预约失败,活动ID为空");
+        }
+        return hsEventMapper.eventAppointOrder(eventId);
+    }
+
+    @Override
+    public int eventAppointBack(String eventId) {
+        if (StringUtils.isBlank(eventId)) {
+            throw new BaseException("取消预约失败,活动ID为空");
+        }
+        return hsEventMapper.eventAppointBack(eventId);
+    }
 }

+ 1 - 1
willalp-clocking-in/src/main/java/com/willalp/files/mapper/xml/HsOrgPersonnelFilesMapper.xml

@@ -131,6 +131,6 @@
         </where>
     </select>
     <select id="flowGetFilesById" resultType="java.util.Map">
-        SELECT hopf.id,hopf.* FROM hs_org_personnel_files hopf where is_delete = 0 AND now_status = 1 AND id = #{id}
+        SELECT hopf.id,hopf.* FROM hs_org_personnel_files hopf where is_delete = 0 AND id = #{id}
     </select>
 </mapper>

+ 21 - 8
willalp-clocking-in/src/main/java/com/willalp/flow/service/impl/HsFlowEngineServiceImpl.java

@@ -290,6 +290,7 @@ public class HsFlowEngineServiceImpl implements HsFlowEngineService {
                 flowBase = flowBaseService.getFlowTaskBaseByGroupIdAndBaseId(hsFlowTask.getBaseGroupId(), stepId);
             }
         }
+
         //任务结束
         if (flowBase == null && !resultCaseOf) {
             hsFlowTask.setBaseId(null);
@@ -300,7 +301,7 @@ public class HsFlowEngineServiceImpl implements HsFlowEngineService {
             frrEnd.setComment(TASK_AUTO_END_CN_TEXT);
             frrEnd.setOperator(SecurityUtils.getUsername());
             frrEnd.setTaskId(flow.getTaskId());
-            frrEnd.setCreateTime(new Date(System.currentTimeMillis() + 1000));
+            frrEnd.setCreateTime(new Date(System.currentTimeMillis() + 10000));
             list.add(frrEnd);
             //生成审批结果消息列表
             HsAppUserMsg appUserMsg = new HsAppUserMsg();
@@ -409,7 +410,7 @@ public class HsFlowEngineServiceImpl implements HsFlowEngineService {
                 cc.setFormData(JSON.toJSONString(formData));
                 cc.setTaskId(task.getId());
                 cc.setTitle(task.getTaskName());
-                cc.setCreateTime(new Date());
+                cc.setCreateTime(new Date(System.currentTimeMillis() + 10000));
                 cc.setUpdateTime(new Date());
                 cc.setRemark("0");
                 Operators operators = JSON.parseObject(base.getOperator(), Operators.class);
@@ -599,18 +600,30 @@ public class HsFlowEngineServiceImpl implements HsFlowEngineService {
                             if (ObjectUtils.isNotNull(stringObjectMap)) {
                                 if ("biz_leave".equals(example.getBusinessTableName())) {
                                     //请假流程添加图片
-                                    List<Map<String, Object>> leaveImgs = leaveImgService.getBaseMapper().selectMaps(new QueryWrapper<BizLeaveImg>().eq("biz_leave_id", businessId));
-                                    stringObjectMap.put("imgUrls", leaveImgs);
+                                    if (StringUtils.isNotBlank(businessId)) {
+                                        List<Map<String, Object>> leaveImgs = leaveImgService.getBaseMapper().selectMaps(new QueryWrapper<BizLeaveImg>().eq("biz_leave_id", businessId));
+                                        if (null != leaveImgs) {
+                                            stringObjectMap.put("imgUrls", leaveImgs);
+                                        }
+                                    }
                                 }
                                 if ("hs_goods_storage_record".equals(example.getBusinessTableName())) {
                                     //物资流程物资数据
-                                    Map<String, Object> goods = goodsStorageService.flowGetGoodsById(String.valueOf(stringObjectMap.get("goods_id")));
-                                    stringObjectMap.put("goodsData", goods);
+                                    if (null != stringObjectMap.get("goods_id")) {
+                                        Map<String, Object> goods = goodsStorageService.flowGetGoodsById(String.valueOf(stringObjectMap.get("goods_id")));
+                                        if (null != goods) {
+                                            stringObjectMap.put("goodsData", goods);
+                                        }
+                                    }
                                 }
                                 if ("personnel_hire_approval".equals(example.getBusinessTableName())) {
                                     //人员数据
-                                    Map<String, Object> personnel = opfService.flowGetFilesById(String.valueOf(stringObjectMap.get("personnel_id")));
-                                    stringObjectMap.put("personnelData", personnel);
+                                    if (null != stringObjectMap.get("personnel_id")) {
+                                        Map<String, Object> personnel = opfService.flowGetFilesById(String.valueOf(stringObjectMap.get("personnel_id")));
+                                        if (null != personnel) {
+                                            stringObjectMap.put("personnelData", personnel);
+                                        }
+                                    }
                                 }
                                 //统一时间类型字段处理
                                 Set<String> strings = stringObjectMap.keySet();

+ 10 - 4
willalp-framework/src/main/java/com/willalp/framework/config/JacksonConfig.java

@@ -1,14 +1,15 @@
 package com.willalp.framework.config;
 
-import org.springframework.context.annotation.Bean;
-import org.springframework.context.annotation.Configuration;
-import org.springframework.http.converter.json.Jackson2ObjectMapperBuilder;
-import org.springframework.http.converter.json.MappingJackson2HttpMessageConverter;
 import com.fasterxml.jackson.annotation.JsonInclude;
 import com.fasterxml.jackson.databind.MapperFeature;
 import com.fasterxml.jackson.databind.ObjectMapper;
+import com.fasterxml.jackson.databind.SerializationFeature;
 import com.fasterxml.jackson.databind.module.SimpleModule;
 import com.fasterxml.jackson.databind.ser.std.ToStringSerializer;
+import org.springframework.context.annotation.Bean;
+import org.springframework.context.annotation.Configuration;
+import org.springframework.http.converter.json.Jackson2ObjectMapperBuilder;
+import org.springframework.http.converter.json.MappingJackson2HttpMessageConverter;
 
 /**
  * Jackson配置
@@ -33,4 +34,9 @@ public class JacksonConfig
         objectMapper.configure(MapperFeature.PROPAGATE_TRANSIENT_MARKER, true);
         return new MappingJackson2HttpMessageConverter(objectMapper);
     }
+
+    @Bean
+    public ObjectMapper objectMapper() {
+        return new ObjectMapper().disable(SerializationFeature.FAIL_ON_EMPTY_BEANS);
+    }
 }

+ 9 - 1
willalp-ui/src/api/eventConfig/event.js

@@ -35,6 +35,14 @@ export function updateEvent(data) {
   })
 }
 
+export function addEvents(data) {
+  return request({
+    url: '/eventConfig/event/saveEvents',
+    method: 'post',
+    data: data
+  })
+}
+
 // 删除活动配置
 export function delEvent(id) {
   return request({
@@ -50,4 +58,4 @@ export function exportEvent(query) {
     method: 'get',
     params: query
   })
-}
+}

+ 9 - 13
willalp-ui/src/views/canteen/gift/index.vue

@@ -215,7 +215,7 @@
     </el-dialog>
     <!-- 添加或修改礼品登记对话框 -->
     <el-dialog title="活动事件配置" :visible.sync="eventForm.open" width="1600px" append-to-body>
-      <eventConfig ref="event" :id="eventGiftForm.eventId"></eventConfig>
+      <eventConfig ref="event" eventType="2"></eventConfig>
     </el-dialog>
 
     <!-- 绑定活动礼品话框 -->
@@ -267,12 +267,12 @@ import {
   setNoticeStatus,
   bindingList
 } from '@/api/canteen/gift'
-import { getMasterOrgInfos } from '@/api/master-api'
-import { listGiftType } from '@/api/canteen/giftType'
+import {getMasterOrgInfos} from '@/api/master-api'
+import {listGiftType} from '@/api/canteen/giftType'
 import eventConfig from '@/views/eventConfig/event'
 import Treeselect from '@riophae/vue-treeselect'
 import '@riophae/vue-treeselect/dist/vue-treeselect.css'
-import { submitBindingRelation } from '@/api/eventConfig/relation'
+import {submitBindingRelation} from '@/api/eventConfig/relation'
 
 export default {
   name: 'Gift',
@@ -345,10 +345,10 @@ export default {
       // 表单校验
       rules: {
         giftName: [
-          { required: true, message: '礼品名称不能为空', trigger: 'blur' }
+          {required: true, message: '礼品名称不能为空', trigger: 'blur'}
         ],
         qybz: [
-          { required: true, message: '启用标志 0-启用 1-禁用不能为空', trigger: 'change' }
+          {required: true, message: '启用标志 0-启用 1-禁用不能为空', trigger: 'change'}
         ]
       }
     }
@@ -419,7 +419,7 @@ export default {
         this.eventGiftForm.open = true
         setTimeout(() => {
           this.eventGiftForm.eventId = this.$refs.event.getEventId()
-        }, 10)
+        }, 100)
         this.bindingQueryParams.total = response.total
         this.bindingQueryParams.loading = false
       })
@@ -428,7 +428,7 @@ export default {
     getTreeselect() {
       listGiftType().then(response => {
         this.giftTypeOptions = []
-        const data = { id: 0, giftTypeName: '顶级分类', children: [] }
+        const data = {id: 0, giftTypeName: '顶级分类', children: []}
         data.children = this.handleTree(response.data, 'id', 'parentId')
         this.giftTypeOptions.push(data)
       })
@@ -505,10 +505,6 @@ export default {
     },
     eventShow() {
       this.eventForm.open = true
-      setTimeout(() => {
-        this.$refs.event.queryParams.eventType = '2'
-        this.$refs.event.getList()
-      }, 100)
     },
     /** 修改按钮操作 */
     handleUpdate(row) {
@@ -545,7 +541,7 @@ export default {
     /** 删除按钮操作 */
     handleDelete(row) {
       const giftIds = row.giftId || this.ids
-      this.$modal.confirm('是否确认删除礼品登记编号为"' + giftIds + '"的数据项?').then(function() {
+      this.$modal.confirm('是否确认删除礼品登记编号为"' + giftIds + '"的数据项?').then(function () {
         return delGift(giftIds)
       }).then(() => {
         this.getList()

+ 1 - 5
willalp-ui/src/views/canteen/place/index.vue

@@ -23,7 +23,6 @@
           icon="el-icon-plus"
           size="mini"
           @click="handleAdd"
-          v-hasPermi="['canteen:place:add']"
         >新增
         </el-button>
       </el-col>
@@ -59,7 +58,6 @@
             type="text"
             icon="el-icon-edit"
             @click="handleUpdate(scope.row)"
-            v-hasPermi="['canteen:place:edit']"
           >修改
           </el-button>
           <el-button
@@ -67,7 +65,6 @@
             type="text"
             icon="el-icon-plus"
             @click="handleAdd(scope.row)"
-            v-hasPermi="['canteen:place:add']"
           >新增
           </el-button>
           <el-button
@@ -75,7 +72,6 @@
             type="text"
             icon="el-icon-delete"
             @click="handleDelete(scope.row)"
-            v-hasPermi="['canteen:place:remove']"
           >删除
           </el-button>
         </template>
@@ -166,13 +162,13 @@ export default {
     }
   },
   created() {
-    this.queryParams.placeType = this.$root._route.query.placeType
     this.getList()
   },
   methods: {
     /** 查询地点列表 */
     getList() {
       this.loading = true
+      this.queryParams.placeType = this.$root._route.query.placeType
       this.queryParams.jgid = user.state.organ
       listPlace(this.queryParams).then(response => {
         this.placeList = this.handleTree(response.data, 'placeId', 'parentId')

+ 281 - 142
willalp-ui/src/views/eventConfig/event/index.vue

@@ -2,7 +2,7 @@
   <div class="app-container">
     <el-form :model="queryParams" ref="queryForm" :inline="true" v-show="showSearch">
       <el-form-item label="事件类型" prop="eventType">
-        <el-select disabled v-model="queryParams.eventType" placeholder="请选择事件类型" clearable size="small">
+        <el-select v-model="queryParams.eventType" placeholder="请选择事件类型" clearable size="small" disabeld>
           <el-option
             v-for="dict in dict.type.event_type"
             :key="dict.value"
@@ -102,7 +102,7 @@
         >导出
         </el-button>
       </el-col>
-      <el-col :span="1.5">
+      <el-col :span="1.5" v-if="queryParams.eventType === '1'">
         <el-button
           type="warning"
           plain
@@ -113,7 +113,7 @@
         >预约公告
         </el-button>
       </el-col>
-      <el-col :span="1.5">
+      <el-col :span="1.5" v-if="queryParams.eventType === '1'">
         <div style="padding: 5px">
           <el-switch
             @change="setNoticeStatus"
@@ -192,16 +192,16 @@
           <span>{{ parseTime(scope.row.eventEndTime, '{y}-{m}-{d} {h}:{i}') }}</span>
         </template>
       </el-table-column>
-      <el-table-column label="事件开始于" align="center" prop="startTime" width="90">
+      <el-table-column label="预约开始于" align="center" prop="startTime" width="90">
         <template slot-scope="scope">
           <span>{{ parseTime(scope.row.startTime, '{y}-{m}-{d} {h}:{i}:{s}') }}</span>
         </template>
       </el-table-column>
-      <el-table-column label="事件结束于" align="center" prop="endTime" width="90">
-        <template slot-scope="scope">
-          <span>{{ parseTime(scope.row.endTime, '{y}-{m}-{d} {h}:{i}:{s}') }}</span>
-        </template>
-      </el-table-column>
+      <!--      <el-table-column label="预约结束于" align="center" prop="endTime" width="90">-->
+      <!--        <template slot-scope="scope">-->
+      <!--          <span>{{ parseTime(scope.row.endTime, '{y}-{m}-{d} {h}:{i}:{s}') }}</span>-->
+      <!--        </template>-->
+      <!--      </el-table-column>-->
       <el-table-column label="事件状态" align="center" prop="eventStatus">
         <template slot-scope="scope">
           <dict-tag :options="dict.type.event_status" :value="scope.row.eventStatus"/>
@@ -230,7 +230,7 @@
     </el-table>
 
     <!--积分兑换-->
-    <el-table v-if="queryParams.eventType === '2'" v-loading="loading" :data="eventList"
+    <el-table v-else-if="queryParams.eventType === '2'" v-loading="loading" :data="eventList"
               @selection-change="handleSelectionChange">
       <el-table-column type="selection" width="55" align="center"/>
       <el-table-column label="编码" align="center" prop="eventNo"/>
@@ -293,102 +293,212 @@
     />
 
     <!-- 添加或修改活动配置对话框 -->
-    <el-dialog :title="title" :visible.sync="open" width="700px" append-to-body>
-      <el-form ref="form" :model="form" :rules="rules">
-        <el-row :gutter="50">
+    <el-dialog :title="title" :visible.sync="open" width="1400px" append-to-body>
+      <el-form v-if="queryParams.eventType === '1'" ref="form" :model="form" :rules="rules">
+        <el-row :gutter="30">
           <el-col :span="12">
             <el-form-item label="编码" prop="eventNo">
               <el-input v-model="form.eventNo" placeholder="请输入事件编号"/>
             </el-form-item>
-          </el-col>
-          <el-col :span="12">
-            <el-form-item label="事件名称" prop="eventName">
-              <el-input v-model="form.eventName" placeholder="请输入事件名称" disabled/>
+            <el-form-item label="活动名称" prop="eventName">
+              <el-input v-model="form.eventName" placeholder="请输入活动名称" disabled/>
             </el-form-item>
-          </el-col>
-        </el-row>
-        <el-form-item label="项目" prop="eventName">
-          <el-select v-model="form.activityTypeId">
-            <el-option v-for="item in associationsList"
-                       :label="item.projectName"
-                       :value="item.id"
-                       :key="item.id"
-            />
-          </el-select>
-        </el-form-item>
-        <el-form-item label="地点" prop="eventPlace" v-if="queryParams.eventStatus !== '1'">
-          <treeselect v-model="form.eventPlace" :options="placeOptions" :normalizer="normalizer"
-                      placeholder="请选择地点"/>
-        </el-form-item>
-        <el-row>
-          <el-col :span="8">
-            <el-form-item label="数量限制" prop="limitNum">
-              <el-row>
-                <el-col :span="18">
-                  <el-input v-model="form.limitNum" placeholder="请输入数量限制"/>
-                </el-col>
-                <el-col :span="1">
-                  <div style="padding: 0.5px">
+            <el-row :gutter="50">
+              <el-col :span="12">
+                <el-form-item label="项目" prop="eventName">
+                  <el-select v-model="form.activityTypeId">
+                    <el-option v-for="item in associationsList"
+                               :label="item.projectName"
+                               :value="item.id"
+                               :key="item.id"
+                    />
+                  </el-select>
+                </el-form-item>
+              </el-col>
+              <el-col :span="12">
+                <el-form-item label="事件状态" prop="eventStatus">
+                  <el-select v-model="form.eventStatus" placeholder="请选择事件状态">
+                    <el-option
+                      v-for="dict in dict.type.event_status"
+                      :key="dict.value"
+                      :label="dict.label"
+                      :value="dict.value"
+                    ></el-option>
+                  </el-select>
+                </el-form-item>
+              </el-col>
+            </el-row>
+            <el-form-item label="地点" prop="eventPlace" v-if="queryParams.eventType === '1'">
+              <treeselect v-model="form.eventPlace" :options="placeOptions" :normalizer="normalizer"
+                          placeholder="请选择地点"/>
+            </el-form-item>
+            <el-row>
+              <el-col :span="8">
+                <el-form-item label="数量限制" prop="limitNum">
+                  <el-row>
+                    <el-col :span="18">
+                      <el-input v-model="form.limitNum" placeholder="请输入数量限制"/>
+                    </el-col>
+                    <el-col :span="1">
+                      <div style="padding: 0.5px">
 
-                  </div>
+                      </div>
+                    </el-col>
+                    <el-col :span="4"> 名</el-col>
+                  </el-row>
+                </el-form-item>
+              </el-col>
+              <el-col :span="8">
+                <el-form-item label="禁止取消预约时限" prop="banCancelSubscribeTimeLimit">
+                  <el-row>
+                    <el-col :span="18">
+                      <el-input v-model="form.banCancelSubscribeTimeLimit" placeholder="请输入禁止取消预约时限"/>
+                    </el-col>
+                    <el-col :span="1">
+                      <div style="padding: 0.5px">
+
+                      </div>
+                    </el-col>
+                    <el-col :span="4">小时</el-col>
+                  </el-row>
+                </el-form-item>
+              </el-col>
+              <el-col :span="8">
+                <el-form-item label="活动开始前多久提示" prop="howLongRemind">
+                  <el-row>
+                    <el-col :span="19">
+                      <el-input v-model="form.howLongRemind" placeholder="请输入活动开始前多久提示"/>
+                    </el-col>
+                    <el-col :span="1">
+                      <div style="padding: 0.5px">
+
+                      </div>
+                    </el-col>
+                    <el-col :span="4">小时</el-col>
+                  </el-row>
+                </el-form-item>
+              </el-col>
+            </el-row>
+            <div v-if="form.id === null">
+              <el-button
+                size="mini"
+                type="text"
+                icon="el-icon-plus"
+                @click="addEvent()"
+              >添加
+              </el-button>
+            </div>
+            <div v-if="form.id === null && queryParams.eventType === '1'" class="eventDiv"
+                 v-for="(item,index) in eventFormList">
+              <el-row :gutter="10">
+                <el-col :span="12">
+                  <el-form-item label="活动开始于" prop="eventStartTime">
+                    <el-date-picker
+                      clearable size="small"
+                      v-model="eventFormList[index].eventStartTime"
+                      type="datetime"
+                      value-format="yyyy-MM-dd HH:mm"
+                      placeholder="选择开始于">
+                    </el-date-picker>
+                  </el-form-item>
                 </el-col>
-                <el-col :span="4"> 名</el-col>
-              </el-row>
-            </el-form-item>
-          </el-col>
-          <el-col :span="8">
-            <el-form-item label="禁止取消预约时限" prop="banCancelSubscribeTimeLimit">
-              <el-row>
-                <el-col :span="18">
-                  <el-input v-model="form.banCancelSubscribeTimeLimit" placeholder="请输入禁止取消预约时限"/>
+                <el-col :span="12">
+                  <el-form-item label="活动结束于" prop="eventEndTime">
+                    <el-date-picker
+                      clearable size="small"
+                      v-model="eventFormList[index].eventEndTime"
+                      type="datetime"
+                      value-format="yyyy-MM-dd HH:mm"
+                      placeholder="选择开始于">
+                    </el-date-picker>
+                  </el-form-item>
                 </el-col>
-                <el-col :span="1">
-                  <div style="padding: 0.5px">
-
-                  </div>
+              </el-row>
+              <el-row :gutter="10">
+                <el-col :span="12">
+                  <el-form-item label="预约开始于" prop="startTime">
+                    <el-date-picker
+                      clearable size="small"
+                      v-model="eventFormList[index].startTime"
+                      type="datetime"
+                      value-format="yyyy-MM-dd HH:mm:ss"
+                      placeholder="选择开始于">
+                    </el-date-picker>
+                  </el-form-item>
                 </el-col>
-                <el-col :span="4">小时</el-col>
               </el-row>
-            </el-form-item>
-          </el-col>
-          <el-col :span="8">
-            <el-form-item label="活动开始前多久提示" prop="howLongRemind">
-              <el-row>
-                <el-col :span="19">
-                  <el-input v-model="form.howLongRemind" placeholder="请输入活动开始前多久提示"/>
+            </div>
+            <div v-if="form.id !== null" class="eventDiv">
+              <el-row :gutter="10">
+                <el-col :span="12">
+                  <el-form-item label="活动开始于" prop="eventStartTime">
+                    <el-date-picker
+                      clearable size="small"
+                      v-model="form.eventStartTime"
+                      type="datetime"
+                      value-format="yyyy-MM-dd HH:mm"
+                      placeholder="选择开始于">
+                    </el-date-picker>
+                  </el-form-item>
                 </el-col>
-                <el-col :span="1">
-                  <div style="padding: 0.5px">
-
-                  </div>
+                <el-col :span="12">
+                  <el-form-item label="活动结束于" prop="eventEndTime">
+                    <el-date-picker
+                      clearable size="small"
+                      v-model="form.eventEndTime"
+                      type="datetime"
+                      value-format="yyyy-MM-dd HH:mm"
+                      placeholder="选择开始于">
+                    </el-date-picker>
+                  </el-form-item>
                 </el-col>
-                <el-col :span="4">小时</el-col>
               </el-row>
+              <el-row :gutter="10">
+                <el-col :span="12">
+                  <el-form-item label="预约开始于" prop="startTime">
+                    <el-date-picker
+                      clearable size="small"
+                      v-model="form.startTime"
+                      type="datetime"
+                      value-format="yyyy-MM-dd HH:mm:ss"
+                      placeholder="选择开始于">
+                    </el-date-picker>
+                  </el-form-item>
+                </el-col>
+              </el-row>
+            </div>
+          </el-col>
+          <el-col :span="12">
+            <el-form-item label="描述" v-if="queryParams.eventType === '1'">
+              <editor v-model="form.eventDescribe" :min-height="392"/>
+            </el-form-item>
+            <el-form-item label="备注" prop="remark">
+              <el-input v-model="form.remark" placeholder="请输入备注"/>
             </el-form-item>
           </el-col>
         </el-row>
-        <el-form-item label="活动开始于" prop="eventStartTime">
-          <el-date-picker
-            clearable size="small"
-            v-model="form.eventStartTime"
-            type="datetime"
-            value-format="yyyy-MM-dd HH:mm"
-            placeholder="选择开始于">
-          </el-date-picker>
+      </el-form>
+      <el-form v-if="queryParams.eventType === '2'" ref="form" :model="form" :rules="rules">
+        <el-form-item label="编码" prop="eventNo">
+          <el-input v-model="form.eventNo" placeholder="请输入事件编号"/>
         </el-form-item>
-        <el-form-item label="活动结束于" prop="eventEndTime">
-          <el-date-picker
-            clearable size="small"
-            v-model="form.eventEndTime"
-            type="datetime"
-            value-format="yyyy-MM-dd HH:mm"
-            placeholder="选择开始于">
-          </el-date-picker>
+        <el-form-item label="事件状态" prop="eventStatus">
+          <el-select v-model="form.eventStatus" placeholder="请选择事件状态">
+            <el-option
+              v-for="dict in dict.type.event_status"
+              :key="dict.value"
+              :label="dict.label"
+              :value="dict.value"
+            ></el-option>
+          </el-select>
+        </el-form-item>
+        <el-form-item label="活动名称" prop="eventName">
+          <el-input v-model="item.eventName" placeholder="请输入活动名称"/>
         </el-form-item>
         <el-form-item label="预约开始于" prop="startTime">
           <el-date-picker
             clearable size="small"
-            v-model="form.startTime"
+            v-model="item.startTime"
             type="datetime"
             value-format="yyyy-MM-dd HH:mm:ss"
             placeholder="选择开始于">
@@ -403,6 +513,19 @@
             placeholder="选择结束于">
           </el-date-picker>
         </el-form-item>
+        <el-form-item label="备注" prop="remark">
+          <el-input v-model="form.remark" placeholder="请输入备注"/>
+        </el-form-item>
+        <!--<el-form-item label="事件类型" prop="eventType">-->
+        <!--  <el-select v-model="form.eventType" placeholder="请选择事件类型">-->
+        <!--    <el-option-->
+        <!--      v-for="dict in dict.type.event_type"-->
+        <!--      :key="dict.value"-->
+        <!--      :label="dict.label"-->
+        <!--      :value="dict.value"-->
+        <!--    ></el-option>-->
+        <!--  </el-select>-->
+        <!--</el-form-item>-->
         <!-- <el-form-item label="执行于" prop="eventTime">-->
         <!--   <el-date-picker-->
         <!--     clearable size="small"-->
@@ -412,35 +535,11 @@
         <!--     placeholder="选择执行于">-->
         <!--   </el-date-picker>-->
         <!-- </el-form-item>-->
-        <el-form-item label="事件类型" prop="eventType">
-          <el-select v-model="form.eventType" placeholder="请选择事件类型">
-            <el-option
-              v-for="dict in dict.type.event_type"
-              :key="dict.value"
-              :label="dict.label"
-              :value="dict.value"
-            ></el-option>
-          </el-select>
-        </el-form-item>
-        <el-form-item label="事件描述" v-if="queryParams.eventStatus !== '1'">
-          <editor v-model="form.eventDescribe" :min-height="192"/>
-        </el-form-item>
-        <el-form-item label="事件状态" prop="eventStatus">
-          <el-select v-model="form.eventStatus" placeholder="请选择事件状态">
-            <el-option
-              v-for="dict in dict.type.event_status"
-              :key="dict.value"
-              :label="dict.label"
-              :value="dict.value"
-            ></el-option>
-          </el-select>
-        </el-form-item>
-        <el-form-item label="备注" prop="remark" v-if="queryParams.eventStatus !== '1'">
-          <el-input v-model="form.remark" placeholder="请输入备注"/>
-        </el-form-item>
+
       </el-form>
       <div slot="footer" class="dialog-footer">
-        <el-button type="primary" @click="submitForm">确 定</el-button>
+        <el-button v-if="!form.id" type="primary" @click="submitEvents()">确 定</el-button>
+        <el-button v-else type="primary" @click="submitForm">确 定</el-button>
         <el-button @click="cancel">取 消</el-button>
       </div>
     </el-dialog>
@@ -456,7 +555,7 @@
 </template>
 
 <script>
-import { listEvent, getEvent, delEvent, addEvent, updateEvent, exportEvent } from '@/api/eventConfig/event'
+import { listEvent, getEvent, delEvent, addEvent, updateEvent, exportEvent, addEvents } from '@/api/eventConfig/event'
 import { addImg } from '@/api/event/img'
 import { listPlace } from '@/api/canteen/place'
 import user from '@/store/modules/user'
@@ -471,6 +570,12 @@ export default {
   components: {
     Treeselect
   },
+  props: {
+    eventType: {
+      type: String,
+      default: ''
+    }
+  },
   dicts: ['event_type', 'event_status'],
   data() {
     return {
@@ -536,38 +641,18 @@ export default {
       },
       // 表单参数
       form: {},
+      eventFormList: [{
+        eventName: '',
+        startTime: null,
+        eventType: '1',
+        eventStartTime: null,
+        eventEndTime: null
+      }],
       // 表单校验
       rules: {}
     }
   },
-  watch: {
-    value: {
-      handler(val) {
-        if (val) {
-          // 首先将值转为数组
-          const list = Array.isArray(val) ? val : this.value.split(',')
-          // 然后将数组转为对象数组
-          this.fileList = list.map(item => {
-            if (typeof item === 'string') {
-              if (item.indexOf(this.baseUrl) === -1) {
-                item = { name: this.baseUrl + item, url: this.baseUrl + item }
-              } else {
-                item = { name: item, url: item }
-              }
-            }
-            return item
-          })
-        } else {
-          this.fileList = []
-          return []
-        }
-      },
-      deep: true,
-      immediate: true
-    }
-  },
   created() {
-    this.queryParams.eventType = this.$root._route.query.eventType
     this.getNoticeStatus()
     this.getNotice()
     this.getTreeselect()
@@ -575,6 +660,39 @@ export default {
     this.getList()
   },
   methods: {
+    submitEvents() {
+      for (let i = 0; i < this.eventFormList.length; i++) {
+        this.eventFormList[i] = { ...this.form, ...this.eventFormList[i] }
+        this.eventFormList[i].eventNo = this.eventFormList[i].eventNo + i
+      }
+      addEvents(this.eventFormList).then(res => {
+        if (res.code === 200) {
+          this.getList()
+          this.$modal.msgSuccess('新增成功')
+          this.cancel()
+        }
+      })
+    },
+    addEvent() {
+      if (this.eventFormList.length > 0) {
+        this.eventFormList.push({
+          eventName: this.eventFormList[0].eventName,
+          startTime: this.eventFormList[0].startTime,
+          eventType: '1',
+          eventStartTime: this.eventFormList[0].eventStartTime,
+          eventEndTime: this.eventFormList[0].eventEndTime
+        })
+      } else {
+        this.eventFormList.push({
+          eventName: '',
+          startTime: null,
+          eventType: '1',
+          eventStartTime: null,
+          eventEndTime: null
+        })
+      }
+      console.log(this.eventFormList)
+    },
     // 删除图片
     handleRemove(file, fileList) {
       const findex = this.fileList.map(f => f.name).indexOf(file.name)
@@ -672,6 +790,9 @@ export default {
     },
     /** 查询活动配置列表 */
     getList() {
+      if (this.$root._route.query.eventType) {
+        this.queryParams.eventType = this.$root._route.query.eventType
+      }
       this.loading = true
       listEvent(this.queryParams).then(response => {
         this.eventList = response.rows
@@ -713,6 +834,7 @@ export default {
       this.open = false
       this.noticeForm.open = false
       this.eventGiftForm.open = false
+      this.eventFormList = []
       this.noticeForm.text = ''
       this.reset()
     },
@@ -762,6 +884,16 @@ export default {
     /** 新增按钮操作 */
     handleAdd() {
       this.reset()
+      this.eventFormList = [{
+        eventName: '',
+        startTime: null,
+        eventType: '1',
+        eventStartTime: null,
+        eventEndTime: null
+      }]
+      if (this.$root._route.query.eventType) {
+        this.form.eventType = this.$root._route.query.eventType
+      }
       this.open = true
       this.title = '添加活动配置'
     },
@@ -777,6 +909,7 @@ export default {
     },
     /** 提交按钮 */
     submitForm() {
+      this.form.eventType = this.$root._route.query.eventType
       this.$refs['form'].validate(valid => {
         if (valid) {
           if (this.form.id != null) {
@@ -786,8 +919,6 @@ export default {
               this.getList()
             })
           } else {
-            let date = this.parseTime(this.form.eventStartTime, '{y}-{m}-{d}')
-            console.log(this.form)
             addEvent(this.form).then(() => {
               this.$modal.msgSuccess('新增成功')
               this.open = false
@@ -823,3 +954,11 @@ export default {
   }
 }
 </script>
+<style scoped>
+.eventDiv {
+  border: 1px solid #cbcbcb;
+  padding: 20px 20px 0 20px;
+  margin: 0 0 10px 0;
+  border-radius: 10px;
+}
+</style>