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