From fe7c2fff004e4a64dae5f0982ab28663c600c778 Mon Sep 17 00:00:00 2001
From: 无关风月 <443237572@qq.com>
Date: 星期四, 03 四月 2025 15:20:17 +0800
Subject: [PATCH] Merge branch '2.0' of http://120.76.84.145:10101/gitblit/r/java/PlayPai into 2.0

---
 cloud-server-management/src/main/webapp/static/modular/system/tHuiminCard/tHuiminCard.js                     |   37 
 cloud-server-management/src/main/java/com/dsh/guns/modular/system/controller/code/CommontController.java     |   37 
 cloud-server-management/src/main/webapp/static/modular/system/tHuiminCard/tHuiminCard_info.js                |   11 
 cloud-server-management/src/main/webapp/static/modular/system/tHuiminCard/tHuiminCard2.js                    |  143 ++
 cloud-server-management/src/main/java/com/dsh/guns/modular/system/controller/code/THuiminCardController.java |  213 +++
 cloud-server-management/src/main/java/com/dsh/guns/modular/system/model/HuiminCardStoreQuery.java            |   29 
 cloud-server-management/src/main/webapp/WEB-INF/view/system/tHuiminCard/tHuiminCard.html                     |  144 ++
 cloud-server-management/src/main/webapp/WEB-INF/view/system/tHuiminCard/tHuiminCard_add.html                 | 1011 +++++++++++++++++++
 cloud-server-other/src/main/java/com/dsh/other/controller/TRegionController.java                             |    1 
 cloud-server-activity/src/main/java/com/dsh/activity/controller/THuiminCardController.java                   |  122 ++
 cloud-server-activity/src/main/java/com/dsh/activity/entity/TPayHuimin.java                                  |    6 
 cloud-server-management/src/main/java/com/dsh/guns/modular/system/model/HuiminCardStoreVO.java               |   16 
 cloud-server-activity/src/main/java/com/dsh/activity/entity/THuiminCard.java                                 |   36 
 cloud-server-management/src/main/java/com/dsh/guns/modular/system/model/HuiminCardSiteVO.java                |   18 
 cloud-server-management/src/main/webapp/WEB-INF/view/system/tHuiminCard/tHuiminCard_detail.html              | 1078 +++++++++++++++++++++
 cloud-server-management/src/main/webapp/WEB-INF/view/system/tSite/TSite_add.html                             |    2 
 cloud-server-management/src/main/java/com/dsh/course/feignClient/activity/HuiminCardClient.java              |   31 
 cloud-server-management/src/main/java/com/dsh/course/feignClient/activity/model/THuiminCard.java             |   31 
 18 files changed, 2,850 insertions(+), 116 deletions(-)

diff --git a/cloud-server-activity/src/main/java/com/dsh/activity/controller/THuiminCardController.java b/cloud-server-activity/src/main/java/com/dsh/activity/controller/THuiminCardController.java
new file mode 100644
index 0000000..927d2b0
--- /dev/null
+++ b/cloud-server-activity/src/main/java/com/dsh/activity/controller/THuiminCardController.java
@@ -0,0 +1,122 @@
+package com.dsh.activity.controller;
+
+import cn.mb.cloud.common.data.controller.BaseController;
+import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
+import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
+import com.baomidou.mybatisplus.extension.api.R;
+import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
+import com.dsh.activity.entity.THuiminCard;
+import com.dsh.activity.entity.TPayHuimin;
+import com.dsh.activity.service.HuiminCardService;
+import com.dsh.activity.service.PayHuiminService;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.util.StringUtils;
+import org.springframework.web.bind.annotation.*;
+
+import java.util.Date;
+import java.util.List;
+import java.util.Map;
+import java.util.stream.Collectors;
+
+@RestController
+@RequestMapping("/tHuiminCard")
+public class THuiminCardController extends BaseController {
+    @Autowired
+    private HuiminCardService tHuiminCardService;
+    @Autowired
+    private PayHuiminService payHuiminService;
+
+
+    @GetMapping("/queryPage")
+    public Page<THuiminCard> queryPage(Page<THuiminCard> page, THuiminCard tHuiminCard) {
+        QueryWrapper<THuiminCard> queryWrapper = new QueryWrapper<>();
+        if (!StringUtils.isEmpty(tHuiminCard.getHuiMinName())){
+            queryWrapper.like("huiMinName",tHuiminCard.getHuiMinName());
+        }
+        if (!StringUtils.isEmpty(tHuiminCard.getHuiMinType())){
+            queryWrapper.eq("huiMinType",tHuiminCard.getHuiMinType());
+        }
+        if (tHuiminCard.getStartTime() != null && tHuiminCard.getEndTime() != null){
+            queryWrapper.ge("startTime",tHuiminCard.getStartTime());
+            queryWrapper.le("endTime",tHuiminCard.getEndTime());
+        }
+        Integer flag = tHuiminCard.getFlag();
+        if (flag != null){
+            Date now = new Date();
+            switch (flag) {
+                case 1:
+                    queryWrapper.le("startTime", now);
+                    break;
+                    case 2:
+                    queryWrapper.ge("startTime", now);
+                    queryWrapper.le("endTime", now);
+                    break;
+                    case 3:
+                    queryWrapper.lt("endTime", now);
+                    break;
+            }
+        }
+
+        if (tHuiminCard.getStatus() != null){
+            queryWrapper.eq("status",tHuiminCard.getStatus());
+        }
+        Page<THuiminCard> page1 = tHuiminCardService.page(page, queryWrapper);
+        List<THuiminCard> records = page1.getRecords();
+        List<Integer> cardIds = records.stream().map(THuiminCard::getId).collect(Collectors.toList());
+        List<TPayHuimin> list = payHuiminService.list(new LambdaQueryWrapper<TPayHuimin>()
+                .in(TPayHuimin::getCardId, cardIds));
+
+        Map<Integer, Long> cardIdCountMap = list.stream()
+                .collect(Collectors.groupingBy(
+                        TPayHuimin::getCardId,
+                        Collectors.counting()
+                ));
+
+
+        records.forEach(item -> {
+            item.setBuyCount(cardIdCountMap.getOrDefault(item.getId(), 0L).intValue());
+        });
+        return page1;
+    }
+
+    @GetMapping("/getById")
+    public THuiminCard getById(@RequestParam("id") Integer id) {
+        return tHuiminCardService.getById(id);
+    }
+
+    @PostMapping("/save")
+    public R<?> save(@RequestBody THuiminCard tHuiminCard) {
+        tHuiminCardService.save(tHuiminCard);
+        return R.ok("");
+    }
+
+    @PostMapping("/updateById")
+    public R<?> updateById(@RequestBody THuiminCard tHuiminCard) {
+        tHuiminCardService.updateById(tHuiminCard);
+        return R.ok("");
+    }
+
+    @GetMapping("/deleteById")
+    public R<?> deleteById(@RequestParam("id") Integer id) {
+        tHuiminCardService.removeById(id);
+        return R.ok("");
+    }
+
+    /**
+     * 批量删除
+     */
+    @PostMapping("/deleteBatchIds")
+    public R<?> deleteBatchIds(@RequestBody List<Integer> ids) {
+        tHuiminCardService.removeByIds(ids);
+        return R.ok("");
+    }
+
+
+    @GetMapping("/changeState")
+    public String changeState(@RequestParam("id")Integer id, @RequestParam("status") Integer status){
+        THuiminCard tHuiminCard = tHuiminCardService.getById(id);
+        tHuiminCard.setStatus(status);
+        tHuiminCardService.updateById(tHuiminCard);
+        return "success";
+    }
+}
diff --git a/cloud-server-activity/src/main/java/com/dsh/activity/entity/THuiminCard.java b/cloud-server-activity/src/main/java/com/dsh/activity/entity/THuiminCard.java
index 64ac795..4ad7c50 100644
--- a/cloud-server-activity/src/main/java/com/dsh/activity/entity/THuiminCard.java
+++ b/cloud-server-activity/src/main/java/com/dsh/activity/entity/THuiminCard.java
@@ -5,6 +5,7 @@
 import com.baomidou.mybatisplus.annotation.TableId;
 import com.baomidou.mybatisplus.annotation.TableName;
 import com.baomidou.mybatisplus.extension.activerecord.Model;
+import com.fasterxml.jackson.annotation.JsonFormat;
 import io.swagger.annotations.ApiModelProperty;
 import lombok.Data;
 import lombok.EqualsAndHashCode;
@@ -93,7 +94,6 @@
      * 限购数量 为空表示不限
      */
     @ApiModelProperty(value = "限购数量 为空表示不限")
-
     @TableField("limitCount")
     private Integer limitCount;
     /**
@@ -102,13 +102,21 @@
     @ApiModelProperty(value = "轮播图 逗号分隔")
     @TableField("banner")
     private String banner;
+
     /**
      *有效期开始时间 不填表示永久
      */
     @TableField("endTime")
     @ApiModelProperty(value = "有效期开始时间 不填表示永久")
+    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8")
     private Date endTime;
-
+    /**
+     *有效期结束时间 不填表示永久
+     */
+    @TableField("startTime")
+    @ApiModelProperty(value = "有效期结束时间 不填表示永久")
+    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8")
+    private Date startTime;
     /**
      *可使用时间段,周,多个逗号分隔
      */
@@ -154,6 +162,11 @@
     private String sort;
 
     /**
+     *门店id 当使用范围为场地的时候存储门店id
+     */
+    @TableField("storeIds")
+    private String storeIds;
+    /**
      *运营商id
      */
     @ApiModelProperty(value = "运营商id")
@@ -165,12 +178,6 @@
     @ApiModelProperty(value = "状态 1已上架 2已下架 3已删除 ")
     @TableField("status")
     private Integer status;
-    /**
-     *门店ids
-     */
-    @ApiModelProperty(value = "门店ids")
-    @TableField("storeIds")
-    private String storeIds;
 
     @ApiModelProperty("是否购买 0否1是")
     @TableField(exist = false)
@@ -178,6 +185,19 @@
     @ApiModelProperty("立即购买页面的协议列表")
     @TableField(exist = false)
     private List<THuiminAgreementSetting> agreementSettings;
+    /**
+     * 状态: 1-未开始 2-已开始 3-已结束
+     */
+    @TableField(exist = false)
+    private Integer flag;
+
+    /**
+     * 已购数量
+     */
+    @TableField(exist = false)
+    private Integer buyCount;
+
+
     @Override
     protected Serializable pkVal() {
         return this.id;
diff --git a/cloud-server-activity/src/main/java/com/dsh/activity/entity/TPayHuimin.java b/cloud-server-activity/src/main/java/com/dsh/activity/entity/TPayHuimin.java
index 2fa71dc..34d65c5 100644
--- a/cloud-server-activity/src/main/java/com/dsh/activity/entity/TPayHuimin.java
+++ b/cloud-server-activity/src/main/java/com/dsh/activity/entity/TPayHuimin.java
@@ -110,6 +110,12 @@
     @TableField("refundNumber")
     private String refundNumber;
 
+    /**
+     * 已购数量
+     */
+    @TableField(exist = false)
+    private Integer buyCount;
+
 
 
     @Override
diff --git a/cloud-server-management/src/main/java/com/dsh/course/feignClient/activity/HuiminCardClient.java b/cloud-server-management/src/main/java/com/dsh/course/feignClient/activity/HuiminCardClient.java
index 0bcc5b8..6445fae 100644
--- a/cloud-server-management/src/main/java/com/dsh/course/feignClient/activity/HuiminCardClient.java
+++ b/cloud-server-management/src/main/java/com/dsh/course/feignClient/activity/HuiminCardClient.java
@@ -1,6 +1,16 @@
 package com.dsh.course.feignClient.activity;
 
+import com.baomidou.mybatisplus.extension.api.R;
+import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
+import com.dsh.course.feignClient.activity.model.THuiminCard;
+import com.dsh.guns.modular.system.model.CoachChangeStateVO;
 import org.springframework.cloud.openfeign.FeignClient;
+import org.springframework.web.bind.annotation.GetMapping;
+import org.springframework.web.bind.annotation.PostMapping;
+import org.springframework.web.bind.annotation.RequestBody;
+import org.springframework.web.bind.annotation.RequestParam;
+
+import java.util.List;
 
 /**
  * @author mitao
@@ -8,4 +18,25 @@
  */
 @FeignClient(value = "mb-cloud-activity")
 public interface HuiminCardClient {
+    @PostMapping(value = "/tHuiminCard/save")
+    void save(@RequestBody THuiminCard tHuiminCard);
+
+    @GetMapping(value = "/tHuiminCard/queryPage")
+    Page<THuiminCard> queryPage(@RequestParam("page") Page<THuiminCard>page,
+                                 @RequestParam("tHuiminCard") THuiminCard tHuiminCard);
+
+    @GetMapping(value = "/tHuiminCard/getById")
+    THuiminCard getById(@RequestParam("id") Integer id);
+
+    @PostMapping(value = "/tHuiminCard/updateById")
+    void updateById(@RequestBody THuiminCard tHuiminCard);
+
+
+    @GetMapping("/tHuiminCard/deleteById")
+    void deleteById(@RequestParam("id") Integer id);
+    @PostMapping("/tHuiminCard/deleteBatchIds")
+    void deleteBatchIds(@RequestBody List<Integer> ids);
+
+    @GetMapping("/tHuiminCard/changeState")
+    String changeState(@RequestParam("id")Integer id, @RequestParam("status") Integer status);
 }
diff --git a/cloud-server-management/src/main/java/com/dsh/course/feignClient/activity/model/THuiminCard.java b/cloud-server-management/src/main/java/com/dsh/course/feignClient/activity/model/THuiminCard.java
index d50b289..310c633 100644
--- a/cloud-server-management/src/main/java/com/dsh/course/feignClient/activity/model/THuiminCard.java
+++ b/cloud-server-management/src/main/java/com/dsh/course/feignClient/activity/model/THuiminCard.java
@@ -5,9 +5,12 @@
 import com.baomidou.mybatisplus.annotation.TableId;
 import com.baomidou.mybatisplus.annotation.TableName;
 import com.baomidou.mybatisplus.extension.activerecord.Model;
+import com.fasterxml.jackson.annotation.JsonFormat;
+import io.swagger.annotations.ApiModelProperty;
 import lombok.Data;
 import lombok.EqualsAndHashCode;
 import lombok.experimental.Accessors;
+import org.springframework.format.annotation.DateTimeFormat;
 
 import java.io.Serializable;
 import java.math.BigDecimal;
@@ -88,7 +91,17 @@
      *有效期 不填表示永久
      */
     @TableField("endTime")
+    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8")
+    @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss")
     private Date endTime;
+
+    /**
+     *有效期结束时间 不填表示永久
+     */
+    @TableField("startTime")
+    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8")
+    @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss")
+    private Date startTime;
     /**
      *可使用时间段,周,多个逗号分隔
      */
@@ -127,8 +140,8 @@
     /**
      *门店id
      */
-    @TableField("storeId")
-    private Integer storeId;
+    @TableField("storeIds")
+    private String storeIds;
     /**
      *运营商id
      */
@@ -136,6 +149,20 @@
     private Integer operatorId;
 
 
+    /**
+     *状态 1已上架 2已下架 3已删除
+     */
+    @ApiModelProperty(value = "状态 1已上架 2已下架 3已删除 ")
+    @TableField("status")
+    private Integer status;
+
+
+
+    @TableField(exist = false)
+    private String startTimeStr;
+    @TableField(exist = false)
+    private String endTimeStr;
+
     @Override
     protected Serializable pkVal() {
         return this.id;
diff --git a/cloud-server-management/src/main/java/com/dsh/guns/modular/system/controller/code/CommontController.java b/cloud-server-management/src/main/java/com/dsh/guns/modular/system/controller/code/CommontController.java
new file mode 100644
index 0000000..fb23e6b
--- /dev/null
+++ b/cloud-server-management/src/main/java/com/dsh/guns/modular/system/controller/code/CommontController.java
@@ -0,0 +1,37 @@
+package com.dsh.guns.modular.system.controller.code;
+
+import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
+import com.dsh.guns.modular.system.model.TCity;
+import com.dsh.guns.modular.system.service.ICityService;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.RestController;
+
+import java.util.List;
+
+@RestController
+@RequestMapping("/base")
+public class CommontController {
+    @Autowired
+    private ICityService cityService;
+
+
+    /**
+     * 获取所有省份
+     */
+    @RequestMapping("/region/getProvince")
+    public List<TCity> getProvince() {
+        return cityService.list(new LambdaQueryWrapper<TCity>()
+                .eq(TCity::getParentId, 0));
+    }
+
+    /**
+     * 获取所有城市
+     */
+    @RequestMapping("/region/getCity")
+    public List<TCity> getCity() {
+        return cityService.list(new LambdaQueryWrapper<TCity>()
+                .isNotNull(TCity::getCitycode));
+    }
+
+}
diff --git a/cloud-server-management/src/main/java/com/dsh/guns/modular/system/controller/code/THuiminCardController.java b/cloud-server-management/src/main/java/com/dsh/guns/modular/system/controller/code/THuiminCardController.java
index a76a0ca..95e930c 100644
--- a/cloud-server-management/src/main/java/com/dsh/guns/modular/system/controller/code/THuiminCardController.java
+++ b/cloud-server-management/src/main/java/com/dsh/guns/modular/system/controller/code/THuiminCardController.java
@@ -1,10 +1,28 @@
 package com.dsh.guns.modular.system.controller.code;
 
+import cn.hutool.core.date.DateUtil;
+import com.alibaba.fastjson.JSONObject;
+import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
+import com.baomidou.mybatisplus.core.metadata.IPage;
+import com.baomidou.mybatisplus.extension.api.R;
+import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
 import com.dsh.course.feignClient.activity.HuiminCardClient;
+import com.dsh.course.feignClient.activity.model.THuiminCard;
 import com.dsh.guns.core.base.controller.BaseController;
+import com.dsh.guns.core.page.PageInfoBT;
+import com.dsh.guns.modular.system.model.*;
+import com.dsh.guns.modular.system.service.IStoreService;
+import com.dsh.guns.modular.system.service.ITSiteService;
+import com.dsh.guns.modular.system.service.TOperatorService;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.stereotype.Controller;
-import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.util.StringUtils;
+import org.springframework.web.bind.annotation.*;
+
+import java.util.ArrayList;
+import java.util.Arrays;
+import java.util.Date;
+import java.util.List;
 
 /**
  * 惠民卡控制器
@@ -20,6 +38,12 @@
 
     @Autowired
     private HuiminCardClient huiminCardClient;
+    @Autowired
+    private IStoreService storeService;
+    @Autowired
+    private TOperatorService operatorService;
+    @Autowired
+    private ITSiteService tSiteService;
 
     /**
      * 跳转到惠民卡首页
@@ -38,7 +62,173 @@
         return PREFIX + "tHuiminCard_add.html";
     }
 
-  /*  *//**
+    /**
+     * 跳转到详情页面
+     */
+    @RequestMapping("/tHuiminCard_detail/{id}")
+    public String tHuiminCardDetail(@PathVariable("id") Integer id) {
+        THuiminCard byId = huiminCardClient.getById(id);
+        Date startTime = byId.getStartTime();
+        if (startTime != null){
+            byId.setStartTimeStr(DateUtil.format(startTime, "yyyy-MM-dd HH:mm:ss"));
+        }
+        Date endTime = byId.getEndTime();
+        if (endTime != null){
+            byId.setEndTimeStr(DateUtil.format(endTime, "yyyy-MM-dd HH:mm:ss"));
+        }
+        String jsonString = JSONObject.toJSONString(byId);
+        setAttr("tHuiminCard", jsonString);
+        return PREFIX + "tHuiminCard_detail.html";
+    }
+
+
+    /**
+     * 获取惠民卡列表
+     * @return
+     */
+    @RequestMapping(value = "/list")
+    @ResponseBody
+    public PageInfoBT<THuiminCard> list(Page<THuiminCard> page,THuiminCard tHuiminCard) {
+        return super.packForBT(huiminCardClient.queryPage(page, tHuiminCard));
+    }
+
+    /**
+     * 获取门店列表
+     */
+    @RequestMapping(value = "/storeList")
+    @ResponseBody
+    public Object storeList(Page<TStore> page, HuiminCardStoreQuery query) {
+        String storeIds = query.getStoreIds();
+        String[] ids = {};
+        if (!StringUtils.isEmpty(storeIds)){
+             ids = storeIds.split(",");
+        }
+
+        Page<TStore> storePage = storeService.page(page, new LambdaQueryWrapper<TStore>()
+                .in(ids.length > 0, TStore::getId, Arrays.asList(ids))
+                .eq(!StringUtils.isEmpty(query.getProvinceCode()), TStore::getProvinceCode, query.getProvinceCode())
+                .eq(!StringUtils.isEmpty(query.getCityCode()), TStore::getCityCode, query.getCityCode())
+                .eq(query.getOperatorId() != null, TStore::getOperatorId, query.getOperatorId())
+                .like(!StringUtils.isEmpty(query.getStoreName()), TStore::getName, query.getStoreName())
+                .orderByDesc(TStore::getCreateTime));
+        return storePage.convert(tStore -> {
+            HuiminCardStoreVO huiminCardStoreVO = new HuiminCardStoreVO();
+            huiminCardStoreVO.setStoreId(tStore.getId());
+            huiminCardStoreVO.setProvince(tStore.getProvince());
+            huiminCardStoreVO.setStoreName(tStore.getName());
+            huiminCardStoreVO.setIds(tStore.getIds());
+            TOperator operator = operatorService.getById(tStore.getOperatorId());
+            if (operator != null){
+                huiminCardStoreVO.setOperatorName(operator.getName());
+            }
+            return huiminCardStoreVO;
+        });
+    }
+
+    /**
+     * 获取场地列表
+     */
+    @RequestMapping(value = "/siteList")
+    @ResponseBody
+    public Object siteList(Page<TSite> page, HuiminCardStoreQuery query) {
+        String storeName = query.getStoreName();
+        List<String> storeIds = new ArrayList<>();
+        if (!StringUtils.isEmpty(storeName)){
+            List<String> storeIdsByName = storeService.listObjs(new LambdaQueryWrapper<TStore>()
+                    .select(TStore::getId)
+                    .eq(TStore::getName, storeName), String::valueOf);
+            if (storeIdsByName != null && !storeIdsByName.isEmpty()){
+                storeIds.addAll(storeIdsByName);
+            }else {
+                return null;
+            }
+        }
+        Integer operatorId = query.getOperatorId();
+        if (operatorId != null){
+            List<String> storeIdsByOperatorId = storeService.listObjs(new LambdaQueryWrapper<TStore>()
+                    .select(TStore::getId)
+                    .eq(TStore::getOperatorId, operatorId), String::valueOf);
+            if (storeIdsByOperatorId != null && !storeIdsByOperatorId.isEmpty()){
+                storeIds.addAll(storeIdsByOperatorId);
+            }else {
+                return null;
+            }
+        }
+
+        Page<TSite> sitePage = tSiteService.page(page, new LambdaQueryWrapper<TSite>()
+                .eq(!StringUtils.isEmpty(query.getProvinceCode()), TSite::getProvinceCode, query.getProvinceCode())
+                .eq(!StringUtils.isEmpty(query.getCityCode()), TSite::getCityCode, query.getCityCode())
+                .in(!storeIds.isEmpty(), TSite::getStoreId, storeIds));
+
+
+        return sitePage.convert(tSite -> {
+            HuiminCardSiteVO huiminCardSiteVO = new HuiminCardSiteVO();
+            huiminCardSiteVO.setSiteId(tSite.getId());
+            huiminCardSiteVO.setProvince(tSite.getProvince());
+            huiminCardSiteVO.setSiteName(tSite.getName());
+            huiminCardSiteVO.setIds(tSite.getIds());
+
+            TStore store = storeService.getById(tSite.getStoreId());
+            if (store != null){
+                huiminCardSiteVO.setStoreName(store.getName());
+            }
+
+            TOperator operator = operatorService.getById(tSite.getOperatorId());
+            if (operator != null){
+                huiminCardSiteVO.setOperatorName(operator.getName());
+            }
+            return huiminCardSiteVO;
+
+        });
+    }
+
+
+    @PostMapping(value = "/add")
+    @ResponseBody
+    public Object add(THuiminCard tHuiminCard) {
+        huiminCardClient.save(tHuiminCard);
+        return SUCCESS_TIP;
+    }
+    @RequestMapping(value = "/update")
+    @ResponseBody
+    public Object update(THuiminCard tHuiminCard) {
+        huiminCardClient.updateById(tHuiminCard);
+        return SUCCESS_TIP;
+    }
+
+    @RequestMapping(value = "/delete")
+    @ResponseBody
+    public Object delete(@RequestParam String ids) {
+        if (StringUtils.isEmpty(ids)) {
+            throw new IllegalArgumentException("参数ids不能为空");
+        }
+        String[] idStrings = ids.split(",");
+        List<Integer> idList = new ArrayList<>(idStrings.length);
+
+        for (String idStr : idStrings) {
+            idStr = idStr.trim();
+            if (!idStr.isEmpty()) {
+                idList.add(Integer.parseInt(idStr));
+            }
+        }
+        huiminCardClient.deleteBatchIds(idList);
+        return SUCCESS_TIP;
+    }
+
+    /**
+     * 上下架状态修改
+     */
+    @RequestMapping(value = "/changeState")
+    @ResponseBody
+    public Object changeState(Integer id, Integer status) {
+        String s = huiminCardClient.changeState(id, status);
+        System.out.println(s);
+        return SUCCESS_TIP;
+    }
+
+
+
+    /*  *//**
      * 跳转到修改惠民卡
      *//*
     @RequestMapping("/tHuiminCard_update/{tHuiminCardId}")
@@ -58,25 +248,8 @@
         return huiminCardClient.selectList(null);
     }
 
-    *//**
-     * 新增惠民卡
-     *//*
-    @RequestMapping(value = "/add")
-    @ResponseBody
-    public Object add(THuiminCard tHuiminCard) {
-        huiminCardClient.insert(tHuiminCard);
-        return SUCCESS_TIP;
-    }
 
-    *//**
-     * 删除惠民卡
-     *//*
-    @RequestMapping(value = "/delete")
-    @ResponseBody
-    public Object delete(@RequestParam Integer tHuiminCardId) {
-        huiminCardClient.deleteById(tHuiminCardId);
-        return SUCCESS_TIP;
-    }
+
 
     *//**
      * 修改惠民卡
diff --git a/cloud-server-management/src/main/java/com/dsh/guns/modular/system/model/HuiminCardSiteVO.java b/cloud-server-management/src/main/java/com/dsh/guns/modular/system/model/HuiminCardSiteVO.java
new file mode 100644
index 0000000..8bfe020
--- /dev/null
+++ b/cloud-server-management/src/main/java/com/dsh/guns/modular/system/model/HuiminCardSiteVO.java
@@ -0,0 +1,18 @@
+package com.dsh.guns.modular.system.model;
+
+import lombok.Data;
+
+@Data
+public class HuiminCardSiteVO {
+    private Integer siteId;
+
+    private String province;
+
+    private String operatorName;
+
+    private String siteName;
+
+    private String storeName;
+
+    private String ids;
+}
diff --git a/cloud-server-management/src/main/java/com/dsh/guns/modular/system/model/HuiminCardStoreQuery.java b/cloud-server-management/src/main/java/com/dsh/guns/modular/system/model/HuiminCardStoreQuery.java
new file mode 100644
index 0000000..8e2f20b
--- /dev/null
+++ b/cloud-server-management/src/main/java/com/dsh/guns/modular/system/model/HuiminCardStoreQuery.java
@@ -0,0 +1,29 @@
+package com.dsh.guns.modular.system.model;
+
+import lombok.Data;
+
+@Data
+public class HuiminCardStoreQuery {
+    /**
+     * 省份编号
+     */
+    private String provinceCode;
+
+    /**
+     * 市编号
+     */
+    private String cityCode;
+
+    /**
+     * 运营商Id
+     */
+    private Integer operatorId;
+
+    /**
+     * 门店名称
+     */
+    private String storeName;
+
+    private String storeIds;
+
+}
diff --git a/cloud-server-management/src/main/java/com/dsh/guns/modular/system/model/HuiminCardStoreVO.java b/cloud-server-management/src/main/java/com/dsh/guns/modular/system/model/HuiminCardStoreVO.java
new file mode 100644
index 0000000..d22e09c
--- /dev/null
+++ b/cloud-server-management/src/main/java/com/dsh/guns/modular/system/model/HuiminCardStoreVO.java
@@ -0,0 +1,16 @@
+package com.dsh.guns.modular.system.model;
+
+import lombok.Data;
+
+@Data
+public class HuiminCardStoreVO {
+    private Integer storeId;
+
+    private String province;
+
+    private String operatorName;
+
+    private String storeName;
+
+    private String ids;
+}
diff --git a/cloud-server-management/src/main/webapp/WEB-INF/view/system/tHuiminCard/tHuiminCard.html b/cloud-server-management/src/main/webapp/WEB-INF/view/system/tHuiminCard/tHuiminCard.html
index 7d89adb..6a8c60b 100644
--- a/cloud-server-management/src/main/webapp/WEB-INF/view/system/tHuiminCard/tHuiminCard.html
+++ b/cloud-server-management/src/main/webapp/WEB-INF/view/system/tHuiminCard/tHuiminCard.html
@@ -1,38 +1,136 @@
 @layout("/common/_container.html"){
-<div class="row">
+<div class="row" id="app0">
     <div class="col-sm-12">
         <div class="ibox float-e-margins">
             <div class="ibox-title">
                 <h5>惠民卡管理</h5>
             </div>
             <div class="ibox-content">
-                <div class="row row-lg">
+                <el-form :inline="true" :model="query">
+                    <el-form-item label="惠民卡名称:">
+                        <el-input v-model="query.name" placeholder="请输入"></el-input>
+                    </el-form-item>
+
+                    <el-form-item label="惠民卡类型:">
+                        <el-select v-model="query.type" placeholder="全部">
+                            <el-option label="全部" value=""></el-option>
+                            <el-option label="年度卡" value="year"></el-option>
+                            <el-option label="季度卡" value="quarter"></el-option>
+                        </el-select>
+                    </el-form-item>
+
+                    <el-form-item label="有效期:">
+                        <el-date-picker
+                                v-model="query.dateRange"
+                                type="daterange"
+                                range-separator="至"
+                                start-placeholder="开始日期"
+                                end-placeholder="结束日期">
+                        </el-date-picker>
+                    </el-form-item>
+
+                    <el-form-item label="可售状态:">
+                        <el-select v-model="query.status" placeholder="全部">
+                            <el-option label="全部" value=""></el-option>
+                            <el-option label="已上架" value="1"></el-option>
+                            <el-option label="已下架" value="0"></el-option>
+                        </el-select>
+                    </el-form-item>
+                </el-form>
+                <div class="row">
                     <div class="col-sm-12">
-                        <div class="row">
-                            <div class="col-sm-3">
-                                <#NameCon id="condition" name="名称" />
-                            </div>
-                            <div class="col-sm-3">
-                                <#button name="搜索" icon="fa-search" clickFun="THuiminCard.search()"/>
-                            </div>
-                        </div>
-                        <div class="hidden-xs" id="THuiminCardTableToolbar" role="group">
-                            @if(shiro.hasPermission("/tHuiminCard/add")){
-                                <#button name="添加" icon="fa-plus" clickFun="THuiminCard.openAddTHuiminCard()"/>
-                            @}
-                            @if(shiro.hasPermission("/tHuiminCard/update")){
-                                <#button name="修改" icon="fa-edit" clickFun="THuiminCard.openTHuiminCardDetail()" space="true"/>
-                            @}
-                            @if(shiro.hasPermission("/tHuiminCard/delete")){
-                                <#button name="删除" icon="fa-remove" clickFun="THuiminCard.delete()" space="true"/>
-                            @}
-                        </div>
-                        <#table id="THuiminCardTable"/>
+                        <el-button type="primary" size="mini" v-on:click="handleAdd" icon="el-icon-circle-plus-outline">添加</el-button>
+                        <el-button type="primary" size="mini" v-on:click="handleEdit" icon="el-icon-edit">编辑</el-button>
+                        <el-button type="primary" size="mini" v-on:click="handleDelete" icon="el-icon-delete">删除</el-button>
+                        <el-button type="primary" size="mini" v-on:click="handleShelves(1)" icon="el-icon-upload2">上架</el-button>
+                        <el-button type="primary" size="mini" v-on:click="handleShelves(2)" icon="el-icon-download">下架</el-button>
+                        <el-button type="primary" size="mini" v-on:click="handleViewDetail" icon="el-icon-tickets">查看详情</el-button>
                     </div>
                 </div>
+                <el-table
+                        :data="tableData"
+                        stripe
+                        style="width: 100%"
+                        v-on:selection-change="handleSelectionChange">
+                    <el-table-column type="selection" width="55"></el-table-column>
+                    <el-table-column prop="huiMinName" label="惠民卡名称"></el-table-column>
+                    <el-table-column prop="huiMinType" label="类型">
+                        <template slot-scope="scope">
+                            <span v-if="scope.row.huiMinType === '1'">年度卡</span>
+                            <span v-else-if="scope.row.huiMinType === '2'">年内卡</span>
+                            <span v-else>未知类型</span>
+                        </template>
+                    </el-table-column>
+                    <el-table-column prop="salesMoney" label="售卖金额">
+                        <template slot-scope="scope">
+                            ¥{{ scope.row.salesMoney }}
+                        </template>
+                    </el-table-column>
+                    <el-table-column prop="date" min-width="200px" label="有效期">
+                        <template slot-scope="scope">
+                            {{ scope.row.startTime }}至{{ scope.row.endTime }}
+                        </template>
+                    </el-table-column>
+                    <el-table-column prop="grantCount" label="发放数量">
+                        <template slot-scope="scope">
+                            {{ scope.row.grantCount == null ? '无限制' : scope.row.grantCount }}
+                        </template>
+                    </el-table-column>
+                    <el-table-column prop="limitCount" label="限购数量">
+                        <template slot-scope="scope">
+                            {{ scope.row.limitCount == null ? '无限制' : scope.row.limitCount }}
+                        </template>
+                    </el-table-column>
+                    <el-table-column prop="buyCount" label="已购数量">
+                        <template slot-scope="scope">
+                            {{ scope.row.buyCount == null ? 0 : scope.row.buyCount }}
+                        </template>
+                    </el-table-column>
+                    <el-table-column prop="sort" label="排序"></el-table-column>
+                    <el-table-column prop="flag" label="活动状态" >
+                        <template slot-scope="scope">
+                            <span v-if="scope.row.flag === '1'">未开始</span>
+                            <span v-else-if="scope.row.flag === '2'">已开始</span>
+                            <span v-else-if="scope.row.flag === '3'">已结束</span>
+                            <span v-else>未知类型</span>
+                        </template>
+                    </el-table-column>
+                    <el-table-column prop="status" label="可售状态">
+                        <template slot-scope="scope">
+                            <span v-if="scope.row.status === '1'">已上架</span>
+                            <span v-else-if="scope.row.status === '2'">已下架</span>
+                            <span v-else-if="scope.row.status === '3'">已删除</span>
+                            <span v-else>未知类型</span>
+                        </template>
+                    </el-table-column>
+                    <el-table-column label="操作">
+                        <template slot-scope="scope">
+                            <el-button type="text" v-on:click="handleViewDetail(scope.row)">查看详情</el-button>
+                        </template>
+                    </el-table-column>
+                </el-table>
+
+                <!-- 分页 -->
+                <el-pagination
+                        v-on:size-change="handleSizeChange"
+                        v-on:current-change="handleCurrentChange"
+                        :current-page="currentPage"
+                        :page-sizes="[10, 20, 50, 100]"
+                        :page-size="pageSize"
+                        layout="total, sizes, prev, pager, next, jumper"
+                        :total="total">
+                </el-pagination>
             </div>
         </div>
     </div>
 </div>
-<script src="${ctxPath}/static/modular/system/tHuiminCard/tHuiminCard.js"></script>
+<script src="${ctxPath}/js/vue/vue.js"></script>
+<script src="${ctxPath}/js/elementui/index.js"></script>
+<script src="${ctxPath}/modular/system/tHuiminCard/tHuiminCard2.js"></script>
+<link rel="stylesheet" href="${ctxPath}/js/elementui/index.css">
+<script src="${ctxPath}/modular/system/tHuiminCard/tHuiminCard.js"></script>
+<script src="${ctxPath}/modular/system/tHuiminAgreement/tHuiminAgreement.js"></script>
+<script>
+
+</script>
 @}
diff --git a/cloud-server-management/src/main/webapp/WEB-INF/view/system/tHuiminCard/tHuiminCard_add.html b/cloud-server-management/src/main/webapp/WEB-INF/view/system/tHuiminCard/tHuiminCard_add.html
index bf93e48..86d4f84 100644
--- a/cloud-server-management/src/main/webapp/WEB-INF/view/system/tHuiminCard/tHuiminCard_add.html
+++ b/cloud-server-management/src/main/webapp/WEB-INF/view/system/tHuiminCard/tHuiminCard_add.html
@@ -1,45 +1,990 @@
 @layout("/common/_container.html"){
-<div class="ibox float-e-margins">
-    <div class="ibox-content">
-        <div class="form-horizontal">
+<body>
+<div id="app0" class="form-container">
+    <el-form :rules="rules" label-position="left" ref="formRef" label-width="120px" :model="huiminCard" size="small">
+        <el-form-item label="惠民卡名称" prop="huiMinName">
+            <el-input v-model="huiminCard.huiMinName"></el-input>
+        </el-form-item>
 
-            <div class="row">
-                <div class="col-sm-6 b-r">
-                            <#input id="id" name="主键id" underline="true"/>
-                            <#input id="huiMinName" name="惠民卡名称" underline="true"/>
-                            <#input id="huiMinType" name="惠民卡类型1年度2年内" underline="true"/>
-                            <#input id="salesMoney" name="售卖金额" underline="true"/>
-                            <#input id="buyCover" name="已购买封面" underline="true"/>
-                            <#input id="unBuyCover" name="未购买封面" underline="true"/>
-                            <#input id="buyRemark" name="已购买使用说明" underline="true"/>
-                            <#input id="unBuyRemark" name="未购买使用说明" underline="true"/>
-                            <#input id="banner" name="轮播图 逗号分隔" underline="true"/>
-                            <#input id="grantCount" name="发放数量 为空表示不限"/>
-                </div>
 
-                <div class="col-sm-6">
-                            <#input id="limitCount" name=" 限购数量 为空表示不限" underline="true"/>
-                            <#input id="endTime" name="有效期 不填表示永久" underline="true"/>
-                            <#input id="useWeeks" name="可使用时间段,周,多个逗号分隔" underline="true"/>
-                            <#input id="useTimes" name="可使用时间段,时分秒,多个逗号分隔" underline="true"/>
-                            <#input id="unUseTimes" name="不可用时间段,yyyy-MM-dd HH:mm:ss,多个逗号分隔" underline="true"/>
-                            <#input id="useScope" name="使用范围1门店2场地" underline="true"/>
-                            <#input id="useIds" name="根据适用范围,存储门店id或场地id,多个逗号分隔" underline="true"/>
-                            <#input id="introduce" name="惠民卡介绍" underline="true"/>
-                            <#input id="sort" name="排序" underline="true"/>
-                            <#input id="storeId" name="门店id" underline="true"/>
+        <!-- 惠民卡类型 -->
+        <el-form-item label="惠民卡类型" prop="huiMinType">
+            <el-radio-group v-model="huiminCard.huiMinType">
+                <el-radio :label="1">年度卡</el-radio>
+                <el-radio :label="2">年内卡</el-radio>
+            </el-radio-group>
+        </el-form-item>
+
+        <!-- 售卖金额 -->
+        <el-form-item label="售卖金额" prop="salesMoney">
+            <el-input placeholder="请输入内容" v-model="huiminCard.salesMoney">
+                <template slot="append">¥</template>
+            </el-input>
+        </el-form-item>
+
+        <!-- 封面图片 -->
+        <el-row>
+            <el-form-item label="封面图片2" prop="cover">
+                <el-col :span="12">
+                    <div class="upload-area text-center">
+                        <el-upload
+                                :limit="1"
+                                action="/tCouponManage/uploadPic"
+                                list-type="picture-card"
+                                :multiple="false"
+                                accept="."
+                                :on-success="handleUnBuyCoverSuccess"
+                                :before-upload="beforeUpload"
+                                :on-exceed="handleUnBuyCoverExceed"
+                                :on-remove="handleUnBuyCoverRemove">
+                            <i class="el-icon-plus avatar-uploader-icon"></i>
+                        </el-upload>
+                        <span>未购买封面</span>
+                    </div>
+
+                </el-col>
+                <el-col :span="12">
+                    <div class="upload-area text-center" style="display: flex">
+                        <el-upload
+                                :limit="1"
+                                class="avatar-uploader"
+                                action="/tCouponManage/uploadPic"
+                                list-type="picture-card"
+                                :multiple="false"
+                                accept="."
+                                :on-success="handleBuyCoverSuccess"
+                                :before-upload="beforeUpload"
+                                :on-remove="handleBuyCoverRemove">
+                            <i class="el-icon-plus avatar-uploader-icon"></i>
+                        </el-upload>
+                        <span>已购买封面</span>
+                    </div>
+                </el-col>
+            </el-form-item>
+        </el-row>
+
+
+        <!-- 使用说明 -->
+        <el-form-item label="使用说明" prop="unBuyRemark">
+            <el-input
+                    type="textarea"
+                    :autosize="{ minRows: 2, maxRows: 4}"
+                    placeholder="请输入少于200字使用说明"
+                    v-model="huiminCard.unBuyRemark">
+            </el-input>
+        </el-form-item>
+
+
+        <!-- 使用期限 -->
+        <el-form-item label="使用期限" prop="buyRemark">
+            <el-input
+                    type="textarea"
+                    :autosize="{ minRows: 2, maxRows: 4}"
+                    placeholder="请输入少于200字使用说明"
+                    v-model="huiminCard.buyRemark">
+            </el-input>
+        </el-form-item>
+
+
+        <!-- 轮播介绍图 -->
+        <el-form-item label="轮播介绍图" prop="banner">
+            <div class="upload-area">
+                <div class="d-flex align-items-center justify-content-between">
+                    <el-upload
+                            :limit="5"
+                            class="avatar-uploader"
+                            action="/tCouponManage/uploadPic"
+                            list-type="picture-card"
+                            accept="."
+                            :on-success="handleSuccess"
+                            :before-upload="beforeUpload"
+                            :on-remove="handleRemove">
+                        <i class="el-icon-plus avatar-uploader-icon"></i>
+                    </el-upload>
+                    <span>点击上传,最多5张</span>
                 </div>
             </div>
+        </el-form-item>
 
-            <div class="row btn-group-m-t">
-                <div class="col-sm-10">
-                    <#button btnCss="info" name="提交" id="ensure" icon="fa-check" clickFun="THuiminCardInfoDlg.addSubmit()"/>
-                    <#button btnCss="danger" name="取消" id="cancel" icon="fa-eraser" clickFun="THuiminCardInfoDlg.close()"/>
+
+        <!-- 发放数量 -->
+        <el-form-item label="发放数量">
+            <el-input v-model="huiminCard.grantCount"></el-input>
+        </el-form-item>
+
+
+        <!-- 限购数量 -->
+        <el-form-item label="限购数量">
+            <el-input v-model="huiminCard.limitCount"></el-input>
+        </el-form-item>
+
+
+        <!-- 有效期 -->
+        <el-form-item label="有效期">
+            <el-date-picker
+                    v-model="huiminCard.endTime"
+                    type="date"
+                    placeholder="选择日期">
+            </el-date-picker>
+        </el-form-item>
+
+
+        <!-- 可用时间 -->
+        <el-form-item label="可用时间" prop="weeks">
+            <el-card
+                    shadow="never"
+                    v-for="(weekGroup, groupIndex) in huiminCard.weeks"
+                    :key="'weekGroup_' + groupIndex">
+                <div slot="header"
+                     style="display: flex;
+                align-items: center;
+                height: 18px;
+                padding: 0 16px;">
+                    <el-button type="text" v-on:click="addWeek()">添加</el-button>
                 </div>
+
+                <div class="form-group" style="display: flex; justify-content: space-between;">
+                    <div
+                            class="col-md-1"
+                            style="flex: 1 0 calc(100% / 7);"
+                            v-for="(day, dayIndex) in weekGroup.days"
+                            :key="dayIndex">
+                        <input
+                                class="form-check-input"
+                                type="checkbox"
+                                :name="'week_'+''+groupIndex"
+                                :value="day.value"
+                                v-model="day.checked">
+                        <label class="form-check-label">
+                            {{ day.label }}
+                        </label>
+                    </div>
+                </div>
+                <!-- 时间输入和删除按钮 -->
+                <div class="row g-3">
+                    <div class="col-md-6" style="display: flex">
+                        <el-time-select
+                                placeholder="起始时间"
+                                v-model="weekGroup.startTime"
+                                :picker-options="{
+                                                start: '00:00',
+                                                step: '01:00',
+                                                end: '23:00'}"
+                        >
+                        </el-time-select>
+                        <el-time-select
+                                placeholder="结束时间"
+                                v-model="weekGroup.endTime"
+                                :picker-options="{
+                                              start: '00:00',
+                                              step: '01:00',
+                                              end: '23:00',
+                                              minTime: weekGroup.startTime}">
+                        </el-time-select>
+                    </div>
+                    <div class="col-md-6">
+                        <button
+                                type="button"
+                                class="btn btn-danger"
+                                style="float: right"
+                                v-on:click="removeWeek(groupIndex)"
+                        >
+                            <i class="fa fa-trash"></i> 删除
+                        </button>
+                    </div>
+                </div>
+            </el-card>
+        </el-form-item>
+
+        <!-- 不可用时间 -->
+        <el-form-item label="不可用时间" prop="unUseTimes">
+            <el-button type="text" v-on:click="addUnUseTime()">添加</el-button>
+            <div v-for="(item, dayIndex) in times"
+                 :key="dayIndex"
+                 class="date-picker-item mb-2">
+                <el-date-picker
+                        type="datetime"
+                        placeholder="选择日期"
+                        v-model="item.date">
+                </el-date-picker>
+                <button
+                        type="button"
+                        class="btn btn-danger btn-sm ml-2"
+                        v-on:click="removeUnUseTime(dayIndex)">
+                    删除
+                </button>
+            </div>
+        </el-form-item>
+
+        <!-- 适用范围 -->
+        <el-form-item label="适用范围" prop="useScope">
+            <el-radio v-model="huiminCard.useScope" label="1">指定门店</el-radio>
+            <el-radio v-model="huiminCard.useScope" label="2">指定场地</el-radio>
+        </el-form-item>
+
+        <!-- 指定门店 -->
+        <el-form-item label="指定门店" v-if="huiminCard.useScope === '1'" prop="storeIds">
+            <el-button type="text" v-on:click="handleSelectStore()">选择门店</el-button>
+            <el-table
+                    :data="tableData"
+                    height="250"
+                    border>
+                <el-table-column
+                        prop="province"
+                        label="所在省市">
+                </el-table-column>
+                <el-table-column
+                        prop="operatorName"
+                        label="所属运营商">
+                </el-table-column>
+                <el-table-column
+                        prop="storeName"
+                        label="门店名称">
+                </el-table-column>
+                <el-table-column
+                        prop="ids"
+                        label="闸机ID">
+                </el-table-column>
+                <el-table-column label="操作" align="center" class-name="small-padding fixed-width">
+                    <template slot-scope="scope">
+                        <el-button
+                                size="mini"
+                                type="text"
+                                v-on:click="handleRemoveStore(scope.$index)"
+                                icon="el-icon-delete"
+                        >删除
+                        </el-button>
+                    </template>
+                </el-table-column>
+            </el-table>
+        </el-form-item>
+
+        <!-- 指定场地 -->
+        <el-form-item label="指定场地" v-if="huiminCard.useScope === '2'" prop="siteIds">
+            <el-button type="text" v-on:click="handleSelectStore()">选择场地</el-button>
+            <el-table
+                    :data="tableData"
+                    height="250"
+                    border>
+                <el-table-column
+                        prop="province"
+                        label="所在省市">
+                </el-table-column>
+                <el-table-column
+                        prop="operatorName"
+                        label="所属运营商">
+                </el-table-column>
+                <el-table-column
+                        prop="storeName"
+                        label="门店名称">
+                </el-table-column>
+                <el-table-column
+                        prop="ids"
+                        label="闸机ID">
+                </el-table-column>
+                <el-table-column label="操作" align="center" class-name="small-padding fixed-width">
+                    <template slot-scope="scope">
+                        <el-button
+                                size="mini"
+                                type="text"
+                                v-on:click="handleRemoveStore(scope.$index)"
+                                icon="el-icon-delete"
+                        >删除
+                        </el-button>
+                    </template>
+                </el-table-column>
+            </el-table>
+        </el-form-item>
+
+        <!-- 惠民卡介绍 -->
+        <el-form-item label="惠民卡介绍" prop="introduce">
+            <textarea type="text/plain" v-model="introduces" id="editor_1"></textarea>
+        </el-form-item>
+
+        <!-- 排序 -->
+        <el-form-item label="排序">
+            <el-input v-model="huiminCard.sort"></el-input>
+        </el-form-item>
+
+
+        <!-- 操作按钮 -->
+        <div class="row mt-5">
+            <div class="col-sm-9 offset-sm-3">
+                <button type="button" v-on:click="submitForm('formRef')" class="btn btn-primary px-4">提交保存</button>
             </div>
         </div>
+        <!-- 选择门店 -->
+        <el-dialog
+                title="选择门店"
+                :visible.sync="dialogVisible2"
+                width="80%"
+                :before-close="handleStoreClose">
+            <el-form ref="form" :model="storeForm" label-width="80px">
+                <el-row :gutter="10">
+                    <el-col :span="6">
+                        <el-form-item label="所在省">
+                            <el-select v-model="storeForm.provinceCode" size="mini" filterable placeholder="请选择">
+                                <el-option
+                                        v-for="item in provinces"
+                                        :key="item.code"
+                                        :label="item.name"
+                                        :value="item.code">
+                                </el-option>
+                            </el-select>
+                        </el-form-item>
+                    </el-col>
+                    <el-col :span="6">
+                        <el-form-item label="所在市2">
+                            <el-select v-model="storeForm.cityCode" size="mini" filterable placeholder="请选择">
+                                <el-option
+                                        v-for="item in cities"
+                                        :key="item.citycode"
+                                        :label="item.name"
+                                        :value="item.citycode">
+                                </el-option>
+                            </el-select>
+                        </el-form-item>
+                    </el-col>
+                    <el-col :span="6">
+                        <el-form-item label="所属运营商">
+                            <el-input size="mini" v-model="storeForm.operatorId" placeholder="请输入内容"></el-input>
+                        </el-form-item>
+                    </el-col>
+                    <el-col :span="6">
+                        <el-form-item label="门店名称">
+                            <el-input size="mini" v-model="storeForm.storeName" placeholder="请输入内容"></el-input>
+                        </el-form-item>
+                    </el-col>
+                </el-row>
+                <el-row>
+                    <el-col :span="24">
+                        <el-button v-on:click="storeList" style="background-color:#1ab394;color: #ffffff" size="mini" icon="el-icon-search">
+                            搜索
+                        </el-button>
+                    </el-col>
+                </el-row>
 
-    </div>
+                <el-row>
+                    <el-col :span="24">
+                        <el-table
+                                v-loading="tableStoreLoading"
+                                :data="tableStoreData"
+                                height="250"
+                                v-on:selection-change="handleSelectionChange"
+                                border>
+                            <el-table-column
+                                    type="selection"
+                                    width="55">
+                            </el-table-column>
+                            <el-table-column
+                                    prop="province"
+                                    label="所在省市">
+                            </el-table-column>
+                            <el-table-column
+                                    prop="operatorName"
+                                    label="所属运营商">
+                            </el-table-column>
+                            <el-table-column
+                                    prop="storeName"
+                                    label="门店名称">
+                            </el-table-column>
+                            <el-table-column
+                                    prop="ids"
+                                    label="闸机ID">
+                            </el-table-column>
+                        </el-table>
+                        <el-pagination
+                                background
+                                layout="prev, pager, next"
+                                v-on:pagination="storeList"
+                                :page.sync="queryParams.pageNum"
+                                :limit.sync="queryParams.pageSize"
+                                :total="tableStoreTotal">
+                        </el-pagination>
+                    </el-col>
+                </el-row>
+            </el-form>
+            <span slot="footer" class="dialog-footer">
+                <el-button v-on:click="dialogVisible2 = false">取 消</el-button>
+                <el-button type="primary" v-on:click="handleStore">确 定</el-button>
+            </span>
+        </el-dialog>
+
+        <!-- 选择场地 -->
+        <el-dialog
+                title="选择场地"
+                :visible.sync="dialogVisible3"
+                width="80%"
+                :before-close="handleSiteClose">
+
+            <el-table
+                    v-loading="tableSiteLoading"
+                    :data="tableSiteData"
+                    height="250"
+                    v-on:selection-change="handleSelectionChange"
+                    border>
+                <el-table-column
+                        type="selection"
+                        width="55">
+                </el-table-column>
+                <el-table-column
+                        prop="province"
+                        label="所在省市">
+                </el-table-column>
+                <el-table-column
+                        prop="operatorName"
+                        label="所属运营商">
+                </el-table-column>
+                <el-table-column
+                        prop="storeName"
+                        label="门店名称">
+
+                </el-table-column>
+                <el-table-column
+                        prop="siteName"
+                        label="场地名称">
+                </el-table-column>
+                <el-table-column
+                        prop="ids"
+                        label="闸机ID2">
+                </el-table-column>
+            </el-table>
+
+            <pagination
+                    v-show="tableSiteTotal>0"
+                    :total="tableSiteTotal"
+                    :page.sync="queryParams.pageNum"
+                    :limit.sync="queryParams.pageSize"
+                    v-on:pagination="siteList"></pagination>
+
+            <span slot="footer" class="dialog-footer">
+                <el-button v-on:click="dialogVisible3 = false">取 消</el-button>
+                <el-button type="primary" v-on:click="handleSite">确 定</el-button>
+            </span>
+        </el-dialog>
+    </el-form>
 </div>
-<script src="${ctxPath}/static/modular/system/tHuiminCard/tHuiminCard_info.js"></script>
+
+<style>
+    .form-container {
+        background: #ffffff;
+        border-radius: 12px;
+        box-shadow: 0 4px 16px rgba(0, 0, 0, 0.1);
+        padding: 2rem;
+    }
+
+    .upload-area {
+        border: 2px dashed #dee2e6;
+        border-radius: 8px;
+        padding: 1.5rem;
+        transition: all 0.3s;
+        cursor: pointer;
+        flex-direction: column;
+        align-items: center;
+        justify-content: center;
+        min-height: 200px; /* 设置一个最小高度,确保有足够的空间 */
+        position: relative; /* 为图片定位提供基准 */
+        overflow: hidden; /* 防止图片溢出 */
+    }
+
+    .upload-area:hover {
+        border-color: #4a90e2;
+        background: #f8f9fa;
+    }
+
+    .upload-area i {
+        margin-bottom: 10px;
+    }
+
+    input[type=file] {
+        display: none;
+    }
+
+
+</style>
+
+<script src="${ctxPath}/modular/system/tHuiminCard/tHuiminCard_info.js"></script>
+<script src="${ctxPath}/js/vue/vue.js"></script>
+<script src="${ctxPath}/js/elementui/index.js"></script>
+<link rel="stylesheet" href="${ctxPath}/js/elementui/index.css">
+<script>
+    let vue = new Vue({
+        el: '#app0',
+        props: {
+            // 数量限制
+            limit: {
+                type: Number,
+                default: 2
+            },
+        },
+        data() {
+            return {
+                storeForm: {
+                    provinceCode: null,
+                    cityCode: null,
+                    operatorId: null,
+                    storeName: '',
+                },
+
+                provinces: [],
+                cities: [],
+                stores: [],
+                operations: [],
+                autoUpload: true,//自动上传
+                previewImg: '',//模型数据,用于上传图片完成后图片预览
+                dialogVisible: false,
+                dialogVisible2: false,
+                dialogVisible3: false,
+                times: [{}],
+                banners: [],
+                introduces: null,
+                multipleSelection1: [],
+                multipleSelection2: [],
+                huiminCard: {
+                    id: null,
+                    huiMinName: null,
+                    huiMinType: null,
+                    salesMoney: null,
+                    buyCover: null,
+                    unBuyCover: null,
+                    buyRemark: null,
+                    unBuyRemark: null,
+                    grantCount: null,
+                    limitCount: null,
+                    banner: null,
+                    endTime: null,
+                    useWeeks: null,
+                    useTimes: null,
+                    introduce: null,
+                    weeks: [
+                        {
+                            days: [ // 每个星期组的星期选项
+                                {
+                                    value: '1',
+                                    label: '星期一',
+                                    checked: false,
+                                },
+                                {
+                                    value: '2',
+                                    label: '星期二',
+                                    checked: false,
+                                },
+                                {
+                                    value: '3',
+                                    label: '星期三',
+                                    checked: false,
+                                },
+                                {
+                                    value: '4',
+                                    label: '星期四',
+                                    checked: false,
+                                },
+                                {
+                                    value: '5',
+                                    label: '星期五',
+                                    checked: false,
+                                },
+                                {
+                                    value: '6',
+                                    label: '星期六',
+                                    checked: false,
+                                },
+                                {
+                                    value: '7',
+                                    label: '星期日',
+                                    checked: false,
+                                }
+                            ],
+                        },
+                    ],
+                    unUseTimes: [
+                        {date: null}
+                    ],
+                    useScope: '1',
+                    useIds: null,
+                    sort: null,
+                    storeId: null
+                },
+                tableData: [],
+                tableStoreData: [],
+                tableStoreTotal: 0,
+                tableStoreLoading: false,
+                tableSiteData: [],
+                tableSiteTotal: 0,
+                tableSiteLoading: false,
+                queryParams: {
+                    pageNum: 1,
+                    pageSize: 10,
+                },
+
+                rules: {
+                    buyRemark: [{required: true, message: '请输入使用说明', trigger: 'blur'}],
+                    cover: [{
+                        validator: (rule, value, callback) => {
+                            if (!this.huiminCard.unBuyCover) {
+                                callback(new Error('请上传未购买封面'));
+                            }
+                            if (!this.huiminCard.buyCover) {
+                                callback(new Error('请上传已购买封面'));
+                            }
+                            callback();
+                        },
+                        trigger: 'blur'
+                    }],
+                    buyCover: [{required: true, message: '已购买封面不能为空', trigger: 'blur'}],
+                    huiMinName: [{required: true, message: '请输入惠民卡名称', trigger: 'blur'}],
+                    huiMinType: [{required: true, message: '请选择惠民卡类型', trigger: 'change'}],
+                    salesMoney: [{required: true, message: '请输入售卖金额', trigger: 'blur'}],
+                    unBuyRemark: [{required: true, message: '请输入使用说明', trigger: 'blur'}],
+                    banner: [{required: true, message: '请上传轮播图', trigger: 'blur'}],
+                    limitCount: [{required: true, message: '请输入限购数量', trigger: 'blur'}],
+                    weeks: [
+                        {
+                            required: true,
+                            message: '请填写可用时间',
+                            trigger: 'blur',
+                            validator: (rule, value, callback) => {
+                                const everyFalse = this.huiminCard.weeks.every(week =>
+                                    week.days.every(day =>
+                                        day.checked === false
+                                    )
+                                );
+                                if (everyFalse) {
+                                    callback(new Error('请选择可用星期'));
+                                }
+                                const everyNull = this.huiminCard.weeks.every(obj =>
+                                    obj.startTime === null ||
+                                    obj.endTime === null
+                                );
+                                if (everyNull) {
+                                    callback(new Error('请选择可用时间'));
+                                }
+                                callback();
+                            },
+                        }
+                    ],
+                    storeIds: [
+                        {
+                            required: true,
+                            trigger: 'blur',
+                            validator: (rule, value, callback) => {
+                                if (this.huiminCard.useIds === null || this.huiminCard.useIds.length === 0) {
+                                    callback(new Error('请选择指定门店'));
+                                }
+                                callback();
+                            },
+                        }
+                    ],
+                    siteIds: [
+                        {
+                            required: true,
+                            trigger: 'blur',
+                            validator: (rule, value, callback) => {
+                                if (this.huiminCard.useIds === null || this.huiminCard.useIds.length === 0) {
+                                    callback(new Error('请选择指定场地'));
+                                }
+                                callback();
+                            },
+                        }
+                    ],
+                    introduce: [
+                        {
+                            required: true, validator: (rule, value, callback) => {
+                                let content = UE.getEditor('editor_1').getContent();
+                                console.log(content)
+                                if (content.length === 0) {
+                                    callback(new Error('请输入详细介绍'));
+                                } else {
+                                    callback();
+                                }
+                            }
+                        }
+                    ],
+                },
+            }
+        },
+        methods: {
+            handleUnBuyCoverSuccess(res, file) {
+                this.huiminCard.unBuyCover = res;
+            },
+            handleUnBuyCoverExceed() {
+                Feng.error('最多上传一张图片');
+            },
+            handleUnBuyCoverRemove(file, fileList) {
+                this.huiminCard.unBuyCover = '';
+            },
+            handleBuyCoverSuccess(res, file) {
+                this.huiminCard.buyCover = res;
+            },
+            handleBuyCoverRemove(file, fileList) {
+                this.huiminCard.buyCover = '';
+            },
+            handleSuccess(res, file) {
+                this.banners.push(res)
+                this.huiminCard.banner = this.banners.join(',');
+            },
+
+            beforeUpload(file) {
+                console.log(111111)
+                const isLt2M = file.size / 1024 / 1024 < 10;
+                if (!isLt2M) {
+                    Feng.error('上传图片大小不能超过 10MB!');
+                }
+                return isLt2M;
+            },
+            handleRemove(file, fileList) {
+                const fileUrl = file.response;
+                this.banners.forEach((item, index) => {
+                    if (item === fileUrl) {
+                        this.banners.splice(index, 1);
+                    }
+                });
+                this.huiminCard.banner = this.banners.join(',');
+            },
+            addWeek() {
+                // 新增一个包含默认星期的组
+                this.huiminCard.weeks.push({
+                    days: [
+                        {
+                            value: '1',
+                            label: '星期一',
+                            checked: false,
+                        },
+                        {
+                            value: '2',
+                            label: '星期二',
+                            checked: false,
+                        },
+                        {
+                            value: '3',
+                            label: '星期三',
+                            checked: false,
+                        },
+                        {
+                            value: '4',
+                            label: '星期四',
+                            checked: false,
+                        },
+                        {
+                            value: '5',
+                            label: '星期五',
+                            checked: false,
+                        },
+                        {
+                            value: '6',
+                            label: '星期六',
+                            checked: false,
+                        },
+                        {
+                            value: '7',
+                            label: '星期日',
+                            checked: false,
+                        }
+                    ],
+                });
+            },
+            removeWeek(index) {
+                this.huiminCard.weeks.splice(index, 1);
+                console.log(this.weeks)
+            },
+            addUnUseTime() {
+                this.times.push({date: null});
+            },
+            removeUnUseTime(index) {
+                this.times.splice(index, 1);
+            },
+            storeList() {
+                this.tableStoreLoading = true;
+                let vm = this;
+                let ajax = new $ax(Feng.ctxPath + "/tHuiminCard/storeList",
+                    (data) => {
+                        vm.tableStoreData = data.records; // 使用 vm 替代 this
+                        vm.tableStoreTotal = data.total;
+                        vm.tableStoreLoading = false;
+                        console.log('成功获取数据:', vm.tableStoreData); // 验证数据
+                    },
+                    (data) => {
+                        vm.tableStoreLoading = false;
+                        Feng.error("请求失败: " + data.responseJSON.message);
+                    }
+                );
+                this.storeForm.pageNum = vm.queryParams.pageNum;
+                this.storeForm.pageSize = vm.queryParams.pageSize
+                ajax.set(this.storeForm);
+
+                ajax.start();
+            },
+            siteList() {
+                this.tableSiteLoading = true;
+                let vm = this;
+                let ajax = new $ax(Feng.ctxPath + "/tHuiminCard/siteList",
+                    (data) => {
+                        vm.tableSiteData = data.records; // 使用 vm 替代 this
+                        vm.tableSiteTotal = data.total;
+                        vm.tableSiteLoading = false;
+                        console.log('成功获取数据:', vm.tableSiteData); // 验证数据
+                    },
+                    (data) => {
+                        vm.tableSiteLoading = false;
+                        Feng.error("请求失败: " + data.responseJSON.message);
+                    }
+                );
+                ajax.start();
+            },
+            handleStoreClose() {
+                this.dialogVisible2 = false;
+            },
+            handleSiteClose() {
+                this.$confirm('确认关闭?1')
+                    .then(_ => {
+                        this.dialogVisible3 = false;
+                    })
+                    .catch(_ => {
+                    });
+            },
+            handleSelectionChange(val) {
+                if (this.huiminCard.useScope === '1') {
+                    this.multipleSelection1 = val;
+                } else if (this.huiminCard.useScope === '2') {
+                    this.multipleSelection2 = val;
+                }
+
+            },
+            handleRemoveStore(index) {
+                this.tableData.splice(index, 1);
+            },
+            handleSelectStore() {
+                this.queryParams.pageNum = 1;
+                this.queryParams.pageSize = 10;
+                if (this.huiminCard.useScope === '1') {
+                    this.dialogVisible2 = true;
+                    this.storeList();
+                } else if (this.huiminCard.useScope === '2') {
+                    this.dialogVisible3 = true;
+                    this.siteList();
+                }
+            },
+            handleStore() {
+                if (this.multipleSelection1.length === 0) {
+                    Feng.info('请选择数据');
+                    return;
+                }
+                this.dialogVisible2 = false
+                this.tableData = this.multipleSelection1;
+                this.huiminCard.useIds = this.tableData.map(item => item.storeId).join(',');
+            },
+            handleSite() {
+                if (this.multipleSelection2.length === 0) {
+                    Feng.info('请选择数据');
+                    return;
+                }
+                this.dialogVisible3 = false
+                this.tableData = this.multipleSelection2;
+                this.huiminCard.useIds = this.tableData.map(item => item.siteId).join(',');
+            },
+            submitForm(formName) {
+                this.$refs[formName].validate(valid => {
+                    console.log(valid)
+                    if (valid) {
+                        let data = this.huiminCard;
+                        let weeks = data.weeks;
+                        var formatWeekAndTime1 = formatWeekAndTime(weeks);
+                        data.useTimes = formatWeekAndTime1.useTimes;
+                        data.useWeeks = formatWeekAndTime1.useWeeks;
+                        data.unUseTimes = formatUnUseTimes(this.times);
+                        data.introduce = UE.getEditor('editor_1').getContent();
+                        console.log(data.introduce)
+
+                        let vm = this;
+                        let ajax = new $ax(Feng.ctxPath + "/tHuiminCard/add",
+                            (data) => {
+                                window.parent.THuiminCard.table.refresh();
+                                THuiminCardInfoDlg.close();
+                            },
+                            (data) => {
+                                vm.tableStoreLoading = false;
+                                Feng.error("请求失败: " + data.responseJSON.message);
+                            }
+                        );
+                        ajax.set(data)
+                        ajax.start();
+                    }
+                });
+            },
+        },
+        created() {
+            let editor_1 = UE.getEditor('editor_1');
+
+
+            let ajax = new $ax(Feng.ctxPath + "/base/region/getProvince",
+                (data) => {
+                    this.provinces = data;
+                },
+                (data) => {
+                    Feng.error("请求失败: " + data.responseJSON.message);
+                }
+            );
+            ajax.start();
+
+            let ajax2 = new $ax(Feng.ctxPath + "/base/region/getCity",
+                (data) => {
+                    this.cities = data;
+                },
+                (data) => {
+                    Feng.error("请求失败: " + data.responseJSON.message);
+                }
+            );
+            ajax2.start();
+
+        },
+    });
+
+    function formatWeekAndTime(data) {
+        const weekTimeMap = {};
+
+        data.forEach(item => {
+            // 确定时间段(优先使用直接字段)
+            const startTime = item.startTime || item.time?.startTime || '';
+            const endTime = item.endTime || item.time?.endTime || '';
+            const timePair = startTime + ";" + endTime;
+
+            // 遍历days数组,记录每个选中星期对应的时间段
+            item.days.forEach(day => {
+                if (day.checked && day.value) {
+                    weekTimeMap[day.value] = timePair;
+                }
+            });
+        });
+
+        // 按星期数字排序并生成最终字符串
+        const sortedWeeks = Object.keys(weekTimeMap).sort((a, b) => a - b);
+        const useWeeks = sortedWeeks.join(',');
+        const useTimes = sortedWeeks.map(week => weekTimeMap[week]).join(',');
+
+        return {useWeeks, useTimes};
+    }
+
+    function formatUnUseTimes(nUseTimes) {
+        if (!nUseTimes) {
+            return "";
+        }
+        let dates = [];
+        nUseTimes.forEach(item => {
+            // 格式化
+            const date = item.date;
+            const year = date.getFullYear();
+            const month = String(date.getMonth() + 1).padStart(2, '0'); // 月份从0开始,需要+1
+            const day = String(date.getDate()).padStart(2, '0');
+            const hours = String(date.getHours()).padStart(2, '0');
+            const minutes = String(date.getMinutes()).padStart(2, '0');
+            const seconds = String(date.getSeconds()).padStart(2, '0');
+            dates.push(year + '-' + month + '-' + day + '-' + hours + ':' + minutes + ':' + seconds)
+        });
+        return dates.join(',');
+    }
+
+</script>
+
+
+</body>
 @}
diff --git a/cloud-server-management/src/main/webapp/WEB-INF/view/system/tHuiminCard/tHuiminCard_detail.html b/cloud-server-management/src/main/webapp/WEB-INF/view/system/tHuiminCard/tHuiminCard_detail.html
new file mode 100644
index 0000000..535210a
--- /dev/null
+++ b/cloud-server-management/src/main/webapp/WEB-INF/view/system/tHuiminCard/tHuiminCard_detail.html
@@ -0,0 +1,1078 @@
+@layout("/common/_container.html"){
+<body>
+<div id="app0" class="form-container">
+    <el-form :rules="rules" :disabled="huiminCard.id != null && pageType === 'detail'" label-position="left" ref="formRef" label-width="120px" :model="huiminCard" size="small">
+        <el-form-item label="惠民卡名称" prop="huiMinName">
+            <el-input v-model="huiminCard.huiMinName"></el-input>
+        </el-form-item>
+
+
+        <!-- 惠民卡类型 -->
+        <el-form-item label="惠民卡类型" prop="huiMinType">
+            <el-radio-group v-model="huiminCard.huiMinType">
+                <el-radio :label="1">年度卡</el-radio>
+                <el-radio :label="2">年内卡</el-radio>
+            </el-radio-group>
+        </el-form-item>
+
+        <!-- 售卖金额 -->
+        <el-form-item label="售卖金额" prop="salesMoney">
+            <el-input placeholder="请输入内容" v-model="huiminCard.salesMoney">
+                <template slot="append">¥</template>
+            </el-input>
+        </el-form-item>
+
+        <!-- 封面图片 -->
+        <el-row>
+            <el-form-item label="封面图片" prop="cover">
+                <el-col :span="12">
+                    <div class="upload-area text-center" style="display: flex">
+                        <el-upload
+                                :limit="1"
+                                class="avatar-uploader"
+                                action="/tCouponManage/uploadPic"
+                                list-type="picture-card"
+                                :multiple="false"
+                                accept="."
+                                :on-success="handleUnBuyCoverSuccess"
+                                :before-upload="beforeUpload"
+                                :on-remove="handleUnBuyCoverRemove">
+                            <img :src="huiminCard.unBuyCover" class="avatar">
+                        </el-upload>
+                        <span>已购买封面</span>
+                    </div>
+
+                </el-col>
+                <el-col :span="12">
+                    <div class="upload-area text-center" style="display: flex">
+                        <el-upload
+                                :limit="1"
+                                class="avatar-uploader"
+                                action="/tCouponManage/uploadPic"
+                                list-type="picture-card"
+                                :multiple="false"
+                                accept="."
+                                :on-success="handleBuyCoverSuccess"
+                                :before-upload="beforeUpload"
+                                :on-remove="handleBuyCoverRemove">
+                            <img :src="huiminCard.buyCover" class="avatar">
+                            <i class="el-icon-plus avatar-uploader-icon"></i>
+                        </el-upload>
+                        <span>已购买封面</span>
+                    </div>
+                </el-col>
+            </el-form-item>
+        </el-row>
+
+
+        <!-- 使用说明 -->
+        <el-form-item label="使用说明" prop="unBuyRemark">
+            <el-input
+                    type="textarea"
+                    :autosize="{ minRows: 2, maxRows: 4}"
+                    placeholder="请输入少于200字使用说明"
+                    v-model="huiminCard.unBuyRemark">
+            </el-input>
+        </el-form-item>
+
+
+        <!-- 使用期限 -->
+        <el-form-item label="使用期限" prop="buyRemark">
+            <el-input
+                    type="textarea"
+                    :autosize="{ minRows: 2, maxRows: 4}"
+                    placeholder="请输入少于200字使用说明"
+                    v-model="huiminCard.buyRemark">
+            </el-input>
+        </el-form-item>
+
+
+        <!-- 轮播介绍图 -->
+        <el-form-item label="轮播介绍图" prop="banner">
+            <div class="upload-area">
+                <div class="d-flex align-items-center justify-content-between">
+                    <el-upload
+                            :limit="5"
+                            class="avatar-uploader"
+                            action="/tCouponManage/uploadPic"
+                            list-type="picture-card"
+                            :file-list="banners"
+                            accept="."
+                            :on-success="handleSuccess"
+                            :before-upload="beforeUpload"
+                            :on-remove="handleRemove">
+                        <i class="el-icon-plus avatar-uploader-icon"></i>
+                    </el-upload>
+                    <span>点击上传,最多5张</span>
+                </div>
+            </div>
+        </el-form-item>
+
+
+        <!-- 发放数量 -->
+        <el-form-item label="发放数量">
+            <el-input v-model="huiminCard.grantCount"></el-input>
+        </el-form-item>
+
+
+        <!-- 限购数量 -->
+        <el-form-item label="限购数量">
+            <el-input v-model="huiminCard.limitCount"></el-input>
+        </el-form-item>
+
+
+        <!-- 有效期 -->
+        <el-form-item label="有效期">
+            <el-date-picker
+                    v-model="huiminCard.endTime"
+                    type="date"
+                    placeholder="选择日期">
+            </el-date-picker>
+        </el-form-item>
+
+
+        <!-- 可用时间 -->
+        <el-form-item label="可用时间" prop="weeks">
+            <el-button type="text" v-on:click="addWeek()">添加</el-button>
+            <el-card
+                    shadow="never"
+                    v-for="(weekGroup, groupIndex) in weeks"
+                    :key="'weekGroup_' + groupIndex">
+                <div slot="header"
+                     style="display: flex;
+                align-items: center;
+                height: 18px;
+                padding: 0 16px;">
+                    <el-button type="text" v-on:click="addWeek()">添加</el-button>
+                </div>
+
+                <div class="form-group" style="display: flex; justify-content: space-between;">
+                    <div
+                            class="col-md-1"
+                            style="flex: 1 0 calc(100% / 7);"
+                            v-for="(day, dayIndex) in weekGroup.days"
+                            :key="dayIndex">
+                        <input
+                                class="form-check-input"
+                                type="checkbox"
+                                :name="'week_'+''+groupIndex"
+                                :value="day.value"
+                                v-model="day.checked">
+                        <label class="form-check-label">
+                            {{ day.label }}
+                        </label>
+                    </div>
+                </div>
+                <!-- 时间输入和删除按钮 -->
+                <div class="row g-3">
+                    <div class="col-md-6" style="display: flex">
+                        <el-time-select
+                                placeholder="起始时间"
+                                v-model="weekGroup.startTime"
+                                :picker-options="{
+                                                start: '00:00',
+                                                step: '01:00',
+                                                end: '23:00'}"
+                        >
+                        </el-time-select>
+                        <el-time-select
+                                placeholder="结束时间"
+                                v-model="weekGroup.endTime"
+                                :picker-options="{
+                                              start: '00:00',
+                                              step: '01:00',
+                                              end: '23:00',
+                                              minTime: weekGroup.startTime}">
+                        </el-time-select>
+                    </div>
+                    <div class="col-md-6">
+                        <button
+                                type="button"
+                                class="btn btn-danger"
+                                style="float: right"
+                                v-on:click="removeWeek(groupIndex)"
+                        >
+                            <i class="fa fa-trash"></i> 删除
+                        </button>
+                    </div>
+                </div>
+            </el-card>
+        </el-form-item>
+
+        <!-- 不可用时间 -->
+        <el-form-item label="不可用时间" prop="unUseTimes">
+            <el-button type="text" v-on:click="addUnUseTime()">添加</el-button>
+            <div v-for="(item, dayIndex) in times"
+                 :key="dayIndex"
+                 class="date-picker-item mb-2">
+                <el-date-picker
+                        type="datetime"
+                        placeholder="选择日期"
+                        v-model="item.date">
+                </el-date-picker>
+                <button
+                        type="button"
+                        class="btn btn-danger btn-sm ml-2"
+                        v-on:click="removeUnUseTime(dayIndex)">
+                    删除
+                </button>
+            </div>
+        </el-form-item>
+
+        <!-- 适用范围 -->
+        <el-form-item label="适用范围" prop="useScope">
+            <el-radio v-model="huiminCard.useScope" label="1">指定门店</el-radio>
+            <el-radio v-model="huiminCard.useScope" label="2">指定场地</el-radio>
+        </el-form-item>
+
+        <!-- 指定门店 -->
+        <el-form-item label="指定门店" v-if="huiminCard.useScope === '1'" prop="storeIds">
+            <el-button type="text" v-on:click="handleSelectStore()">选择门店</el-button>
+            <el-table
+                    :data="tableData"
+                    height="250"
+                    border>
+                <el-table-column
+                        prop="province"
+                        label="所在省市">
+                </el-table-column>
+                <el-table-column
+                        prop="operatorName"
+                        label="所属运营商">
+                </el-table-column>
+                <el-table-column
+                        prop="storeName"
+                        label="门店名称">
+                </el-table-column>
+                <el-table-column
+                        prop="ids"
+                        label="闸机ID">
+                </el-table-column>
+                <el-table-column label="操作" align="center" class-name="small-padding fixed-width">
+                    <template slot-scope="scope">
+                        <el-button
+                                size="mini"
+                                type="text"
+                                v-on:click="handleRemoveStore(scope.$index)"
+                                icon="el-icon-delete"
+                        >删除
+                        </el-button>
+                    </template>
+                </el-table-column>
+            </el-table>
+        </el-form-item>
+
+        <!-- 指定场地 -->
+        <el-form-item label="指定场地" v-if="huiminCard.useScope === '2'" prop="siteIds">
+            <el-button type="text" v-on:click="handleSelectStore()">选择场地</el-button>
+            <el-table
+                    :data="tableData"
+                    height="250"
+                    border>
+                <el-table-column
+                        prop="province"
+                        label="所在省市">
+                </el-table-column>
+                <el-table-column
+                        prop="operatorName"
+                        label="所属运营商">
+                </el-table-column>
+                <el-table-column
+                        prop="storeName"
+                        label="门店名称">
+                </el-table-column>
+                <el-table-column
+                        prop="ids"
+                        label="闸机ID">
+                </el-table-column>
+                <el-table-column label="操作" align="center" class-name="small-padding fixed-width">
+                    <template slot-scope="scope">
+                        <el-button
+                                size="mini"
+                                type="text"
+                                v-on:click="handleRemoveStore(scope.$index)"
+                                icon="el-icon-delete"
+                        >删除
+                        </el-button>
+                    </template>
+                </el-table-column>
+            </el-table>
+        </el-form-item>
+
+        <!-- 惠民卡介绍 -->
+        <el-form-item label="惠民卡介绍" prop="introduce">
+            <textarea type="text/plain" v-model="introduces" id="editor_1"></textarea>
+        </el-form-item>
+
+        <!-- 排序 -->
+        <el-form-item label="排序">
+            <el-input v-model="huiminCard.sort"></el-input>
+        </el-form-item>
+
+
+        <!-- 操作按钮 -->
+        <div class="row mt-5">
+            <div class="col-sm-9 offset-sm-3">
+                <button v-if="pageType === 'edit'" type="button" v-on:click="submitForm('formRef')" class="btn btn-primary px-4">提交保存</button>
+                <button type="button" v-on:click="cancelForm()" class="btn btn-primary px-4">取 消</button>
+            </div>
+        </div>
+
+        <!-- 选择门店 -->
+        <el-dialog
+                title="选择门店"
+                :visible.sync="dialogVisible2"
+                width="80%"
+                :before-close="handleStoreClose">
+
+            <el-table
+                    v-loading="tableStoreLoading"
+                    :data="tableStoreData"
+                    height="250"
+                    v-on:selection-change="handleSelectionChange"
+                    border>
+                <el-table-column
+                        type="selection"
+                        width="55">
+                </el-table-column>
+                <el-table-column
+                        prop="province"
+                        label="所在省市">
+                </el-table-column>
+                <el-table-column
+                        prop="operatorName"
+                        label="所属运营商">
+                </el-table-column>
+                <el-table-column
+                        prop="storeName"
+                        label="门店名称">
+                </el-table-column>
+                <el-table-column
+                        prop="ids"
+                        label="闸机ID">
+                </el-table-column>
+            </el-table>
+            <el-pagination
+                    background
+                    layout="prev, pager, next"
+                    v-on:pagination="storeList"
+                    :total="tableStoreTotal">
+            </el-pagination>
+
+            <span slot="footer" class="dialog-footer">
+                <el-button v-on:click="dialogVisible2 = false">取 消</el-button>
+                <el-button type="primary" v-on:click="handleStore">确 定</el-button>
+            </span>
+        </el-dialog>
+
+        <!-- 选择场地 -->
+        <el-dialog
+                title="选择场地"
+                :visible.sync="dialogVisible3"
+                width="80%"
+                :before-close="handleSiteClose">
+
+            <el-table
+                    v-loading="tableSiteLoading"
+                    :data="tableSiteData"
+                    height="250"
+                    v-on:selection-change="handleSelectionChange"
+                    border>
+                <el-table-column
+                        type="selection"
+                        width="55">
+                </el-table-column>
+                <el-table-column
+                        prop="province"
+                        label="所在省市">
+                </el-table-column>
+                <el-table-column
+                        prop="operatorName"
+                        label="所属运营商">
+                </el-table-column>
+                <el-table-column
+                        prop="storeName"
+                        label="门店名称">
+
+                </el-table-column>
+                <el-table-column
+                        prop="siteName"
+                        label="场地名称">
+                </el-table-column>
+                <el-table-column
+                        prop="ids"
+                        label="闸机ID2">
+                </el-table-column>
+            </el-table>
+
+            <pagination
+                    v-show="tableSiteTotal>0"
+                    :total="tableSiteTotal"
+                    :page.sync="queryParams.pageNum"
+                    :limit.sync="queryParams.pageSize"
+                    v-on:pagination="siteList"></pagination>
+
+            <span slot="footer" class="dialog-footer">
+                <el-button v-on:click="dialogVisible3 = false">取 消</el-button>
+                <el-button type="primary" v-on:click="handleSite">确 定</el-button>
+            </span>
+        </el-dialog>
+    </el-form>
+</div>
+
+<style>
+    .form-container {
+        background: #ffffff;
+        border-radius: 12px;
+        box-shadow: 0 4px 16px rgba(0, 0, 0, 0.1);
+        padding: 2rem;
+    }
+
+    .upload-area {
+        border: 2px dashed #dee2e6;
+        border-radius: 8px;
+        padding: 1.5rem;
+        transition: all 0.3s;
+        cursor: pointer;
+        flex-direction: column;
+        align-items: center;
+        justify-content: center;
+        min-height: 200px; /* 设置一个最小高度,确保有足够的空间 */
+        position: relative; /* 为图片定位提供基准 */
+        overflow: hidden; /* 防止图片溢出 */
+    }
+
+    .upload-area:hover {
+        border-color: #4a90e2;
+        background: #f8f9fa;
+    }
+
+    .upload-area i {
+        margin-bottom: 10px;
+    }
+
+    .avatar-uploader .el-upload {
+        border: 1px dashed #d9d9d9;
+        border-radius: 6px;
+        cursor: pointer;
+        position: relative;
+        overflow: hidden;
+    }
+
+    .avatar-uploader .el-upload:hover {
+        border-color: #409EFF;
+    }
+
+    .avatar-uploader-icon {
+        font-size: 28px;
+        color: #8c939d;
+        width: 178px;
+        height: 178px;
+        line-height: 178px;
+        text-align: center;
+    }
+
+    .avatar {
+        width: 178px;
+        height: 178px;
+        display: block;
+    }
+
+
+</style>
+
+<script src="${ctxPath}/modular/system/tHuiminCard/tHuiminCard_info.js"></script>
+<script src="${ctxPath}/js/vue/vue.js"></script>
+<script src="${ctxPath}/js/elementui/index.js"></script>
+<link rel="stylesheet" href="${ctxPath}/js/elementui/index.css">
+<script>
+    let vue = new Vue({
+        el: '#app0',
+        props: {
+            // 数量限制
+            limit: {
+                type: Number,
+                default: 2
+            },
+        },
+        data() {
+            return {
+                autoUpload: true,//自动上传
+                previewImg: '',//模型数据,用于上传图片完成后图片预览
+                dialogVisible: false,
+                dialogVisible2: false,
+                dialogVisible3: false,
+                pageType: null,
+                times: [
+                    {
+
+                    }
+                ],
+                banners: [],
+                introduces: null,
+                multipleSelection1: [],
+                multipleSelection2: [],
+                weeks: [
+                    {
+                        days: [ // 每个星期组的星期选项
+                            {
+                                value: '1',
+                                label: '星期一',
+                                checked: false,
+                            },
+                            {
+                                value: '2',
+                                label: '星期二',
+                                checked: false,
+                            },
+                            {
+                                value: '3',
+                                label: '星期三',
+                                checked: false,
+                            },
+                            {
+                                value: '4',
+                                label: '星期四',
+                                checked: false,
+                            },
+                            {
+                                value: '5',
+                                label: '星期五',
+                                checked: false,
+                            },
+                            {
+                                value: '6',
+                                label: '星期六',
+                                checked: false,
+                            },
+                            {
+                                value: '7',
+                                label: '星期日',
+                                checked: false,
+                            }
+                        ],
+                    },
+                ],
+                huiminCard: {
+                    id: null,
+                    huiMinName: null,
+                    huiMinType: null,
+                    salesMoney: null,
+                    buyCover: null,
+                    unBuyCover: null,
+                    buyRemark: null,
+                    unBuyRemark: null,
+                    grantCount: null,
+                    limitCount: null,
+                    banner: null,
+                    endTime: null,
+                    useWeeks: null,
+                    useTimes: null,
+                    introduce: null,
+                    unUseTimes: [
+                        {date: null}
+                    ],
+                    useScope: '1',
+                    useIds: null,
+                    sort: null,
+                    storeId: null
+                },
+                tableData: [],
+                tableStoreData: [],
+                tableStoreTotal: 0,
+                tableStoreLoading: false,
+                tableSiteData: [],
+                tableSiteTotal: 0,
+                tableSiteLoading: false,
+                queryParams: {
+                    pageNum: 1,
+                    pageSize: 10,
+                },
+
+                rules: {
+                    buyRemark: [{required: true, message: '请输入使用说明', trigger: 'blur'}],
+                    cover: [{
+                        validator: (rule, value, callback) => {
+                            if (!this.huiminCard.unBuyCover) {
+                                callback(new Error('请上传未购买封面'));
+                            }
+                            if (!this.huiminCard.buyCover) {
+                                callback(new Error('请上传已购买封面'));
+                            }
+                            callback();
+                        },
+                        trigger: 'blur'
+                    }],
+                    buyCover: [{required: true, message: '已购买封面不能为空', trigger: 'blur'}],
+                    huiMinName: [{required: true, message: '请输入惠民卡名称', trigger: 'blur'}],
+                    huiMinType: [{required: true, message: '请选择惠民卡类型', trigger: 'change'}],
+                    salesMoney: [{required: true, message: '请输入售卖金额', trigger: 'blur'}],
+                    unBuyRemark: [{required: true, message: '请输入使用说明', trigger: 'blur'}],
+                    banner: [{required: true, message: '请上传轮播图', trigger: 'blur'}],
+                    limitCount: [{required: true, message: '请输入限购数量', trigger: 'blur'}],
+                    weeks: [
+                        {
+                            required: true,
+                            message: '请填写可用时间',
+                            trigger: 'blur',
+                            validator: (rule, value, callback) => {
+                                const everyFalse = this.weeks.every(week =>
+                                    week.days.every(day =>
+                                        day.checked === false
+                                    )
+                                );
+                                if (everyFalse) {
+                                    callback(new Error('请选择可用星期'));
+                                }
+                                const everyNull = this.weeks.every(obj =>
+                                    obj.startTime === null ||
+                                    obj.endTime === null
+                                );
+                                if (everyNull) {
+                                    callback(new Error('请选择可用时间'));
+                                }
+                                callback();
+                            },
+                        }
+                    ],
+                    unUseTimes: [{
+                        required: true,
+                        message: '请选择可用时间',
+                        trigger: 'blur',
+                        validator: (rule, value, callback) => {
+                            const everyNull = this.times.every(obj =>
+                                obj.date === null
+                            );
+                            if (everyNull) {
+                                callback(new Error('请选择可用时间'));
+                            }
+                            callback();
+                        },
+                    }],
+                    storeIds: [
+                        {
+                            required: true,
+                            trigger: 'blur',
+                            validator: (rule, value, callback) => {
+                                if (this.huiminCard.useIds === null || this.huiminCard.useIds.length === 0) {
+                                    callback(new Error('请选择指定门店'));
+                                }
+                                callback();
+                            },
+                        }
+                    ],
+                    siteIds: [
+                        {
+                            required: true,
+                            trigger: 'blur',
+                            validator: (rule, value, callback) => {
+                                if (this.huiminCard.useIds === null || this.huiminCard.useIds.length === 0) {
+                                    callback(new Error('请选择指定场地'));
+                                }
+                                callback();
+                            },
+                        }
+                    ],
+                    introduce: [
+                        {
+                            required: true, validator: (rule, value, callback) => {
+                                let content = UE.getEditor('editor_1').getContent();
+                                console.log(content)
+                                if (content.length === 0) {
+                                    callback(new Error('请输入详细介绍'));
+                                } else {
+                                    callback();
+                                }
+                            }
+                        }
+                    ],
+                },
+            }
+        },
+        methods: {
+            handleUnBuyCoverSuccess(res, file) {
+                this.huiminCard.unBuyCover = res;
+            },
+            handleUnBuyCoverRemove(file, fileList) {
+                this.huiminCard.unBuyCover = '';
+            },
+            handleBuyCoverSuccess(res, file) {
+                this.huiminCard.buyCover = res;
+            },
+            handleBuyCoverRemove(file, fileList) {
+                this.huiminCard.buyCover = '';
+            },
+            handleSuccess(res, file) {
+                let banner = this.huiminCard.banner;
+
+                if (banner === null) {
+                    this.huiminCard.banner = res;
+                } else {
+                    let banners = banner.split(',');
+
+                    banners.push({
+                        url: res,
+                    });
+                    this.huiminCard.banner = this.banners.map(item => {
+                        return item.url;
+                    }).join(',');
+                }
+            },
+
+            beforeUpload(file) {
+                const isLt2M = file.size / 1024 / 1024 < 10;
+                if (!isLt2M) {
+                    Feng.error('上传图片大小不能超过 10MB!');
+                }
+                return isLt2M;
+            },
+            handleRemove(file, fileList) {
+                const fileUrl = file.response;
+                // 1.删除 this.banners中的图片地址
+                this.banners = this.banners.filter(item => {
+                    return item.url !== fileUrl;
+                });
+                //2.重新给this.huiminCard.banner 赋值
+                thi.huiminCard.banner = this.banners.map(item => {
+                    return item.url;
+                }).join(',');
+            },
+            addWeek() {
+                // 新增一个包含默认星期的组
+                console.log(this.huiminCard)
+                this.weeks.push({
+                    days: [
+                        {
+                            value: '1',
+                            label: '星期一',
+                            checked: false,
+                        },
+                        {
+                            value: '2',
+                            label: '星期二',
+                            checked: false,
+                        },
+                        {
+                            value: '3',
+                            label: '星期三',
+                            checked: false,
+                        },
+                        {
+                            value: '4',
+                            label: '星期四',
+                            checked: false,
+                        },
+                        {
+                            value: '5',
+                            label: '星期五',
+                            checked: false,
+                        },
+                        {
+                            value: '6',
+                            label: '星期六',
+                            checked: false,
+                        },
+                        {
+                            value: '7',
+                            label: '星期日',
+                            checked: false,
+                        }
+                    ],
+                });
+            },
+            removeWeek(index) {
+                this.weeks.splice(index, 1);
+            },
+            addUnUseTime() {
+                this.times.push({date: null});
+            },
+            removeUnUseTime(index) {
+                this.times.splice(index, 1);
+            },
+            storeList() {
+                this.tableStoreLoading = true;
+                let vm = this;
+                let ajax = new $ax(Feng.ctxPath + "/tHuiminCard/storeList",
+                    (data) => {
+                        vm.tableStoreData = data.records; // 使用 vm 替代 this
+                        vm.tableStoreTotal = data.total;
+                        vm.tableStoreLoading = false;
+                        console.log('成功获取数据:', vm.tableStoreData); // 验证数据
+                    },
+                    (data) => {
+                        vm.tableStoreLoading = false;
+                        Feng.error("请求失败: " + data.responseJSON.message);
+                    }
+                );
+                ajax.start();
+            },
+            siteList() {
+                this.tableSiteLoading = true;
+                let vm = this;
+                let ajax = new $ax(Feng.ctxPath + "/tHuiminCard/siteList",
+                    (data) => {
+                        vm.tableSiteData = data.records; // 使用 vm 替代 this
+                        vm.tableSiteTotal = data.total;
+                        vm.tableSiteLoading = false;
+                        console.log('成功获取数据:', vm.tableSiteData); // 验证数据
+                    },
+                    (data) => {
+                        vm.tableSiteLoading = false;
+                        Feng.error("请求失败: " + data.responseJSON.message);
+                    }
+                );
+                ajax.start();
+            },
+            handleStoreClose() {
+                this.dialogVisible2 = false;
+            },
+            handleSiteClose() {
+                this.$confirm('确认关闭?1')
+                    .then(_ => {
+                        this.dialogVisible3 = false;
+                    })
+                    .catch(_ => {
+                    });
+            },
+            handleSelectionChange(val) {
+                if (this.huiminCard.useScope === '1') {
+                    this.multipleSelection1 = val;
+                } else if (this.huiminCard.useScope === '2') {
+                    this.multipleSelection2 = val;
+                }
+
+            },
+            handleRemoveStore(index) {
+                this.tableData.splice(index, 1);
+            },
+            handleSelectStore() {
+                if (this.huiminCard.useScope === '1') {
+                    this.dialogVisible2 = true;
+                    this.storeList();
+                } else if (this.huiminCard.useScope === '2') {
+                    this.dialogVisible3 = true;
+                    this.siteList();
+                }
+            },
+            handleStore() {
+                if (this.multipleSelection1.length === 0) {
+                    Feng.info('请选择数据');
+                    return;
+                }
+                this.dialogVisible2 = false
+                this.tableData = this.multipleSelection1;
+                this.huiminCard.useIds = this.tableData.map(item => item.storeId).join(',');
+            },
+            handleSite() {
+                if (this.multipleSelection2.length === 0) {
+                    Feng.info('请选择数据');
+                    return;
+                }
+                this.dialogVisible3 = false
+                this.tableData = this.multipleSelection2;
+                this.huiminCard.useIds = this.tableData.map(item => item.siteId).join(',');
+            },
+            submitForm(formName) {
+                this.$refs[formName].validate(valid => {
+                    if (valid) {
+                        let data = this.huiminCard;
+                        let weeks = this.weeks;
+                        console.log(weeks)
+                        const formatWeekAndTime1 = formatWeekAndTime(weeks);
+                        data.useTimes = formatWeekAndTime1.useTimes;
+                        data.useWeeks = formatWeekAndTime1.useWeeks;
+                        data.unUseTimes = formatUnUseTimes(this.times);
+                        data.introduce = UE.getEditor('editor_1').getContent();
+
+                        let vm = this;
+                        let ajax = new $ax(Feng.ctxPath + "/tHuiminCard/update",
+                            (data) => {
+                                // 正确调用父页面方法
+                                window.parent.parentVue.handleSearch();
+                                THuiminCardInfoDlg.close();
+                            },
+                            (data) => {
+                                vm.tableStoreLoading = false;
+                                Feng.error("请求失败: " + data.responseJSON.message);
+                            }
+                        );
+                        ajax.set(data)
+                        ajax.start();
+                    }
+                });
+            },
+            cancelForm(){
+                parent.layer.close(window.parent.THuiminCard.layerIndex);
+            }
+        },
+        created() {
+            // 初始化编辑器
+            this.editor = UE.getEditor('editor_1');
+            // 设置内容(需在编辑器就绪后调用)
+            this.editor.ready(() => {
+                this.editor.setContent(this.huiminCard.introduce);
+            });
+            const rawData = JSON.parse(`${tHuiminCard}`);
+
+            console.log("rawData",rawData)
+            this.weeks = parseWeekAndTime(rawData.useWeeks, rawData.useTimes)
+            console.log("rawData.banner",rawData.banner)
+            // 将原始数据转换为banner数组
+            this.banners = rawData.banner.split(",").map(item => {
+                return {
+                    url: item
+                }
+            });
+
+
+            // 将原始数据转换为times数组
+            this.times = rawData.unUseTimes.split(",").map(item => {
+                const formattedDate = item.replace(/(\d{4}-\d{2}-\d{2})-(\d{2}:\d{2}:\d{2})/, "$1T$2");
+                return {
+                    original: item, // 原始字符串
+                    date: new Date(formattedDate) // 转换后的 Date 对象
+                };
+            });
+
+            let url
+            if (rawData.useScope == '1'){
+                url = Feng.ctxPath + "/tHuiminCard/storeList"
+            }else {
+                url = Feng.ctxPath + "/tHuiminCard/siteList"
+            }
+            if (rawData.useIds !== '' && rawData.useIds !== null){
+                let vm = this;
+                let ajax = new $ax(Feng.ctxPath + url,
+                    (data) => {
+                        vm.tableData = data.records; // 使用 vm 替代 this
+                    },
+                    (data) => {
+                        Feng.error("请求失败: " + data.responseJSON.message);
+                    }
+                );
+                ajax.set("storeIds",rawData.useIds)
+                ajax.start();
+            }
+
+
+            // 将原始数据转换为tableData数组
+            this.huiminCard = {
+                ...rawData,
+                huiMinType: Number(rawData.huiMinType),
+                startTime: rawData.startTimeStr,
+                endTime: rawData.endTimeStr,
+            }
+
+            const urlParams = new URLSearchParams(window.location.search);
+             // 直接获取参数值
+            this.pageType = urlParams.get('pageType');
+        },
+    });
+
+    function formatWeekAndTime(data) {
+        const weekTimeMap = {};
+
+        data.forEach(item => {
+            // 确定时间段(优先使用直接字段)
+            const startTime = item.startTime || item.time?.startTime || '';
+            const endTime = item.endTime || item.time?.endTime || '';
+            const timePair = startTime + ";" + endTime;
+
+            // 遍历days数组,记录每个选中星期对应的时间段
+            item.days.forEach(day => {
+                if (day.checked && day.value) {
+                    weekTimeMap[day.value] = timePair;
+                }
+            });
+        });
+
+        // 按星期数字排序并生成最终字符串
+        const sortedWeeks = Object.keys(weekTimeMap).sort((a, b) => a - b);
+        const useWeeks = sortedWeeks.join(',');
+        const useTimes = sortedWeeks.map(week => weekTimeMap[week]).join(',');
+
+        return {useWeeks, useTimes};
+    }
+
+
+    function parseWeekAndTime(useWeeks, useTimes) {
+        // 将字符串按逗号分割成数组
+        const weeks = useWeeks.split(',').filter(Boolean); // 去除空值
+        const times = useTimes.split(',').filter(Boolean);
+
+        // 确保星期和时间段的数量一致
+        if (weeks.length !== times.length) {
+            throw new Error("星期和时间段的数量不匹配");
+        }
+
+        // 定义完整的 days 数组模板
+        const fullDays = [
+            { value: '1', label: '星期一', checked: false },
+            { value: '2', label: '星期二', checked: false },
+            { value: '3', label: '星期三', checked: false },
+            { value: '4', label: '星期四', checked: false },
+            { value: '5', label: '星期五', checked: false },
+            { value: '6', label: '星期六', checked: false },
+            { value: '7', label: '星期日', checked: false }
+        ];
+
+        // 构造还原的数据结构
+        const result = [];
+
+        weeks.forEach((week, index) => {
+            const [startTime, endTime] = times[index].split(';'); // 分割时间段
+
+            // 查找是否已有相同时间段的项,如果有则复用
+            let existingItem = result.find(item =>
+                item.startTime === startTime && item.endTime === endTime
+            );
+
+            if (!existingItem) {
+                // 如果没有找到,则创建新项
+                existingItem = {
+                    startTime,
+                    endTime,
+                    days: JSON.parse(JSON.stringify(fullDays)) // 深拷贝完整 days 数组
+                };
+                result.push(existingItem);
+            }
+
+            // 更新当前星期的 checked 状态
+            const dayToUpdate = existingItem.days.find(day => day.value === week);
+            if (dayToUpdate) {
+                dayToUpdate.checked = true;
+            }
+        });
+
+        return result;
+    }
+
+
+
+
+
+    function formatUnUseTimes(nUseTimes) {
+        if (!nUseTimes) {
+            return "";
+        }
+        let dates = [];
+        nUseTimes.forEach(item => {
+            // 格式化
+            const date = item.date;
+            const year = date.getFullYear();
+            const month = String(date.getMonth() + 1).padStart(2, '0'); // 月份从0开始,需要+1
+            const day = String(date.getDate()).padStart(2, '0');
+            const hours = String(date.getHours()).padStart(2, '0');
+            const minutes = String(date.getMinutes()).padStart(2, '0');
+            const seconds = String(date.getSeconds()).padStart(2, '0');
+            dates.push(year + '-' + month + '-' + day + '-' + hours + ':' + minutes + ':' + seconds)
+        });
+        return dates.join(',');
+    }
+
+
+</script>
+
+
+</body>
+@}
diff --git a/cloud-server-management/src/main/webapp/WEB-INF/view/system/tSite/TSite_add.html b/cloud-server-management/src/main/webapp/WEB-INF/view/system/tSite/TSite_add.html
index 74fa8f6..a25a0b4 100644
--- a/cloud-server-management/src/main/webapp/WEB-INF/view/system/tSite/TSite_add.html
+++ b/cloud-server-management/src/main/webapp/WEB-INF/view/system/tSite/TSite_add.html
@@ -204,7 +204,7 @@
 
                 @if(objectType==1){
                 <div class="form-group"   style=" margin-left: 17%;" >
-                    <label class="col-sm-1 control-label">场地说明:</label>
+                    <label class="col-sm-1 control-label">场地说明222:</label>
                     <div class="col-sm-5">
                         <textarea type="text/plain" id="editor"  style="height: 300px;width: 800px;"></textarea>
                     </div>
diff --git a/cloud-server-management/src/main/webapp/static/modular/system/tHuiminCard/tHuiminCard.js b/cloud-server-management/src/main/webapp/static/modular/system/tHuiminCard/tHuiminCard.js
index 6999a9d..91a3eed 100644
--- a/cloud-server-management/src/main/webapp/static/modular/system/tHuiminCard/tHuiminCard.js
+++ b/cloud-server-management/src/main/webapp/static/modular/system/tHuiminCard/tHuiminCard.js
@@ -58,7 +58,7 @@
     var index = layer.open({
         type: 2,
         title: '添加惠民卡',
-        area: ['800px', '420px'], //宽高
+        area: ['100%', '100%'], //宽高
         fix: false, //不固定
         maxmin: true,
         content: Feng.ctxPath + '/tHuiminCard/tHuiminCard_add'
@@ -69,18 +69,17 @@
 /**
  * 打开查看惠民卡详情
  */
-THuiminCard.openTHuiminCardDetail = function () {
-    if (this.check()) {
-        var index = layer.open({
-            type: 2,
-            title: '惠民卡详情',
-            area: ['800px', '420px'], //宽高
-            fix: false, //不固定
-            maxmin: true,
-            content: Feng.ctxPath + '/tHuiminCard/tHuiminCard_update/' + THuiminCard.seItem.id
-        });
-        this.layerIndex = index;
-    }
+THuiminCard.openTHuiminCardDetail = function (id, pageType) {
+    console.log(id)
+    let index = layer.open({
+        type: 2,
+        title: '惠民卡详情',
+        area: ['100%', '100%'], //宽高
+        fix: false, //不固定
+        maxmin: true,
+        content: Feng.ctxPath + '/tHuiminCard/tHuiminCard_detail/' + id+'?pageType='+pageType
+    });
+    this.layerIndex = index;
 };
 
 /**
@@ -99,18 +98,12 @@
     }
 };
 
+
+
 /**
  * 查询惠民卡列表
  */
 THuiminCard.search = function () {
-    var queryData = {};
-    queryData['condition'] = $("#condition").val();
-    THuiminCard.table.refresh({query: queryData});
+
 };
 
-$(function () {
-    var defaultColunms = THuiminCard.initColumn();
-    var table = new BSTable(THuiminCard.id, "/tHuiminCard/list", defaultColunms);
-    table.setPaginationType("client");
-    THuiminCard.table = table.init();
-});
diff --git a/cloud-server-management/src/main/webapp/static/modular/system/tHuiminCard/tHuiminCard2.js b/cloud-server-management/src/main/webapp/static/modular/system/tHuiminCard/tHuiminCard2.js
new file mode 100644
index 0000000..994fce8
--- /dev/null
+++ b/cloud-server-management/src/main/webapp/static/modular/system/tHuiminCard/tHuiminCard2.js
@@ -0,0 +1,143 @@
+window.parentVue = new Vue({
+    el: '#app0',
+    data() {
+        return {
+            query: {
+                name: '',
+                type: '',
+                dateRange: [],
+                status: ''
+            },
+            currentPage: 1,
+            pageSize: 10,
+            total: 800,
+            ids: [],
+            tableData: [
+            ]
+        }
+    },
+    methods: {
+        handleSearch() {
+            console.log('搜索条件:', this.query)
+            // 修复方案:使用箭头函数 + 字段校验
+            const vm = this; // 保留Vue实例引用
+            let ajax = new $ax(Feng.ctxPath + "/tHuiminCard/list",
+                (data) => { // 改用箭头函数
+                    console.log('原始数据:', data);
+                    if(data.rows && Array.isArray(data.rows)){
+                        vm.tableData = data.rows;
+                        vm.total = data.total;
+                    }else{
+                        vm.tableData = [];
+                        vm.total = 0;
+                    }
+                },
+                (data) => {
+                    Feng.error("搜索失败: " + (data.responseJSON?.message || '服务器异常')); // 错误提示优化
+                });
+
+            // 添加请求参数
+            ajax.set({
+                pageNum: this.currentPage,
+                pageSize: this.pageSize,
+                ...this.query
+            });
+            ajax.start();
+        },
+        handleAdd() {
+            // 添加逻辑
+            THuiminCard.openAddTHuiminCard();
+        },
+        handleEdit(id) {
+            if (this.ids.length === 0){
+                Feng.info('请选择要操作的数据')
+                return
+            }
+            if (this.ids.length > 1){
+                Feng.info('请选择一条数据')
+                return
+            }
+            THuiminCard.openTHuiminCardDetail(this.ids[0], 'edit')
+        },
+        handleDelete() {
+            // 删除逻辑
+            console.log(this.ids)
+            if (this.ids.length === 0){
+                Feng.info('请选择要操作的数据')
+                return
+            }
+            const mv = this
+            this.ids.forEach(id => {
+
+                const ajax = new $ax(Feng.ctxPath + "/tHuiminCard/delete", function (data) {
+                    Feng.success("操作成功!");
+                    mv.handleSearch();
+                }, function (data) {
+                    Feng.error("操作失败!" + data.responseJSON.message + "!");
+                });
+                ajax.set("ids",mv.ids.join(","));
+                ajax.start();
+            })
+        },
+        handleShelves(status) {
+            // 上架逻辑
+            console.log(this.ids)
+            if (this.ids.length === 0){
+                Feng.info('请选择要操作的数据')
+                return
+            }
+            const mv = this
+            this.ids.forEach(id => {
+
+                const ajax = new $ax(Feng.ctxPath + "/tHuiminCard/changeState", function (data) {
+                    Feng.success("操作成功!");
+                    mv.handleSearch();
+                }, function (data) {
+                    Feng.error("操作失败!" + data.responseJSON.message + "!");
+                });
+                ajax.set("id",id);
+                ajax.set("status",status);
+                ajax.start();
+
+
+            })
+
+        },
+        handleUnshelve() {
+            // 下架逻辑
+        },
+        handleSizeChange(val) {
+            this.pageSize = val
+        },
+        handleCurrentChange(val) {
+            this.currentPage = val
+        },
+        handleSelectionChange(selection) {
+            // 多选处理
+            console.log(11)
+            this.ids = selection.map(item => item.id)
+        },
+        handleViewDetail(row) {
+            if (this.ids.length === 0 && !row){
+                Feng.info('请选择要操作的数据')
+                return
+            }
+            if (this.ids.length > 1 && !row){
+                Feng.info('请选择一条数据')
+                return
+            }
+            // 查看详情
+            let id;
+            if (row){
+                id = row.id
+            }else {
+                id = this.ids[0]
+            }
+            THuiminCard.openTHuiminCardDetail(id,'detail')
+        }
+    },
+    created() {
+        // 初始化逻辑
+        this.handleSearch()
+    }
+});
\ No newline at end of file
diff --git a/cloud-server-management/src/main/webapp/static/modular/system/tHuiminCard/tHuiminCard_info.js b/cloud-server-management/src/main/webapp/static/modular/system/tHuiminCard/tHuiminCard_info.js
index cc0c15a..a33ffb1 100644
--- a/cloud-server-management/src/main/webapp/static/modular/system/tHuiminCard/tHuiminCard_info.js
+++ b/cloud-server-management/src/main/webapp/static/modular/system/tHuiminCard/tHuiminCard_info.js
@@ -5,6 +5,10 @@
     tHuiminCardInfoData : {}
 };
 
+let bannerImages = [];
+
+const maxUploadCount = 5;
+
 /**
  * 清除数据
  */
@@ -78,7 +82,6 @@
     //提交信息
     var ajax = new $ax(Feng.ctxPath + "/tHuiminCard/add", function(data){
         Feng.success("添加成功!");
-        window.parent.THuiminCard.table.refresh();
         THuiminCardInfoDlg.close();
     },function(data){
         Feng.error("添加失败!" + data.responseJSON.message + "!");
@@ -105,8 +108,4 @@
     });
     ajax.set(this.tHuiminCardInfoData);
     ajax.start();
-}
-
-$(function() {
-
-});
+}
\ No newline at end of file
diff --git a/cloud-server-other/src/main/java/com/dsh/other/controller/TRegionController.java b/cloud-server-other/src/main/java/com/dsh/other/controller/TRegionController.java
index 4267948..6eea0d7 100644
--- a/cloud-server-other/src/main/java/com/dsh/other/controller/TRegionController.java
+++ b/cloud-server-other/src/main/java/com/dsh/other/controller/TRegionController.java
@@ -45,5 +45,4 @@
             return cityDataAndProvinceDataVos;
         }
     }
-
 }

--
Gitblit v1.7.1