From 3bc7fe7b6eb9a6f9b6ed346b6cd3c8f5a4a32e39 Mon Sep 17 00:00:00 2001 From: luofl <1442745593@qq.com> Date: 星期五, 11 四月 2025 09:09:14 +0800 Subject: [PATCH] 1 --- cloud-server-management/src/main/webapp/WEB-INF/view/system/tHuiminCard/tHuiminCard_add.html | 155 +++++++++----- cloud-server-management/src/main/webapp/static/modular/system/tHuiminCard/tHuiminCard2.js | 15 cloud-server-activity/src/main/java/com/dsh/activity/controller/THuiminCardController.java | 59 ++++- cloud-server-management/src/main/java/com/dsh/guns/modular/system/controller/code/THuiminCardController.java | 177 +++++++++++---- cloud-server-management/src/main/java/com/dsh/guns/modular/system/model/HuiminCardStoreVO.java | 2 cloud-server-management/src/main/webapp/WEB-INF/view/system/tHuiminCard/tHuiminCard.html | 51 +++- cloud-server-activity/src/main/java/com/dsh/activity/entity/THuiminCard.java | 37 ++ cloud-server-management/src/main/webapp/WEB-INF/view/system/tHuiminCard/tHuiminCard_detail.html | 93 +++++--- cloud-server-management/src/main/java/com/dsh/course/feignClient/activity/HuiminCardClient.java | 5 cloud-server-management/src/main/java/com/dsh/course/feignClient/activity/model/THuiminCard.java | 18 + 10 files changed, 432 insertions(+), 180 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 index b227540..e41cc81 100644 --- 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 @@ -27,9 +27,20 @@ private PayHuiminService payHuiminService; - @GetMapping("/queryPage") - public Page<THuiminCard> queryPage(Page<THuiminCard> page, THuiminCard tHuiminCard) { + @PostMapping("/queryPage") + public Page<THuiminCard> queryPage(@RequestBody THuiminCard tHuiminCard) { QueryWrapper<THuiminCard> queryWrapper = new QueryWrapper<>(); + + + Integer objectType = tHuiminCard.getObjectType(); + Integer objectId = tHuiminCard.getObjectId(); + if (objectType == 2){ + queryWrapper.eq("operatorId",objectId); + } + if (objectType == 3){ + queryWrapper.apply("FIND_IN_SET("+objectId+",storeIds)"); + } + if (!StringUtils.isEmpty(tHuiminCard.getHuiMinName())){ queryWrapper.like("huiMinName",tHuiminCard.getHuiMinName()); } @@ -40,19 +51,19 @@ queryWrapper.ge("startTime",tHuiminCard.getStartTime()); queryWrapper.le("endTime",tHuiminCard.getEndTime()); } - Integer flag = tHuiminCard.getFlag(); - if (flag != null){ + Integer huiMinStatus = tHuiminCard.getHuiMinStatus(); + // 惠民卡状态:1未开始 2已开始 3已结束 + if (huiMinStatus != null){ Date now = new Date(); - switch (flag) { + switch (huiMinStatus) { case 1: - queryWrapper.le("startTime", now); + queryWrapper.gt("startTime", now); break; - case 2: - queryWrapper.ge("startTime", now); + case 2: + queryWrapper.apply("(startTime <= now() AND endTime >= now()) OR(startTime IS NULL AND endTime IS NULL)"); + break; + case 3: queryWrapper.le("endTime", now); - break; - case 3: - queryWrapper.lt("endTime", now); break; } } @@ -60,8 +71,14 @@ if (tHuiminCard.getStatus() != null){ queryWrapper.eq("status",tHuiminCard.getStatus()); } + Page<THuiminCard> page = new Page<>(); + page.setCurrent(tHuiminCard.getCurrent()); + page.setSize(tHuiminCard.getSize()); Page<THuiminCard> page1 = tHuiminCardService.page(page, queryWrapper); List<THuiminCard> records = page1.getRecords(); + if (records.isEmpty()){ + return page1; + } List<Integer> cardIds = records.stream().map(THuiminCard::getId).collect(Collectors.toList()); List<TPayHuimin> list = payHuiminService.list(new LambdaQueryWrapper<TPayHuimin>() .in(TPayHuimin::getCardId, cardIds)); @@ -75,6 +92,25 @@ records.forEach(item -> { item.setBuyCount(cardIdCountMap.getOrDefault(item.getId(), 0L).intValue()); + + // 惠民卡状态计算逻辑 + Date startTime = item.getStartTime(); + Date endTime = item.getEndTime(); + + Date now = new Date(); + if (startTime == null || endTime == null) { + // 时间字段未填写时默认状态为「已开始」 + item.setHuiMinStatus(2); + } else { + if (startTime.after(now)) { + item.setHuiMinStatus(1); // 未开始 + } else if (endTime.before(now)) { + item.setHuiMinStatus(3); // 已结束 + } else { + item.setHuiMinStatus(2); // 已开始 + } + } + }); return page1; } @@ -92,7 +128,6 @@ @PostMapping("/updateById") public R<?> updateById(@RequestBody THuiminCard tHuiminCard) { - String unUseTimes = tHuiminCard.getUnUseTimes(); tHuiminCardService.updateById(tHuiminCard); return R.ok(""); } 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 3c49174..0628825 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 @@ -103,18 +103,20 @@ @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") + @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; /** @@ -140,7 +142,6 @@ */ @TableField("useScope") @ApiModelProperty(value = "使用范围1门店2场地") - private Integer useScope; /** *根据适用范围,存储门店id或场地id,多个逗号分隔 @@ -196,6 +197,24 @@ */ @TableField(exist = false) private Integer buyCount; + @TableField(exist = false) + private Long current; + @TableField(exist = false) + private Long size; + /** + * 惠民卡状态:1未开始 2已开始 3已结束 + */ + @TableField(exist = false) + private Integer huiMinStatus; + + /** + * 1=平台,2=城市管理员,3=门店 + */ + @TableField(exist = false) + private Integer objectType; + + @TableField(exist = false) + private Integer objectId; @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 6445fae..05b3831 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 @@ -21,9 +21,8 @@ @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); + @PostMapping(value = "/tHuiminCard/queryPage") + Page<THuiminCard> queryPage(@RequestBody THuiminCard tHuiminCard); @GetMapping(value = "/tHuiminCard/getById") THuiminCard getById(@RequestParam("id") Integer id); 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 dc31ff8..39c3612 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 @@ -167,6 +167,24 @@ private String startTimeStr; @TableField(exist = false) private String endTimeStr; + @TableField(exist = false) + private Long current; + @TableField(exist = false) + private Long size; + /** + * 惠民卡状态:1未开始 2已开始 3已结束 + */ + @TableField(exist = false) + private Integer huiMinStatus; + + /** + * 1=平台,2=城市管理员,3=门店 + */ + @TableField(exist = false) + private Integer objectType; + + @TableField(exist = false) + private Integer objectId; @Override protected Serializable pkVal() { 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 d65ffc3..98cb2b2 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 @@ -8,6 +8,7 @@ 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.config.UserExt; import com.dsh.guns.core.base.controller.BaseController; import com.dsh.guns.core.page.PageInfoBT; import com.dsh.guns.modular.system.model.*; @@ -16,13 +17,13 @@ import com.dsh.guns.modular.system.service.TOperatorService; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Controller; +import org.springframework.ui.Model; 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; +import java.util.*; +import java.util.function.Function; +import java.util.stream.Collectors; /** * 惠民卡控制器 @@ -57,8 +58,9 @@ * 跳转到添加惠民卡 */ @RequestMapping("/tHuiminCard_add") - public String tHuiminCardAdd() { - + public String tHuiminCardAdd(Model model) { + User user = UserExt.getUser(); + model.addAttribute("objectType", user.getObjectType()); return PREFIX + "tHuiminCard_add.html"; } @@ -66,7 +68,9 @@ * 跳转到详情页面 */ @RequestMapping("/tHuiminCard_detail/{id}") - public String tHuiminCardDetail(@PathVariable("id") Integer id) { + public String tHuiminCardDetail(@PathVariable("id") Integer id,Model model) { + User user = UserExt.getUser(); + model.addAttribute("objectType", user.getObjectType()); return PREFIX + "tHuiminCard_detail.html"; } @@ -75,7 +79,9 @@ */ @RequestMapping("/getDetail") @ResponseBody - public THuiminCard getDetail(Integer id) { + public THuiminCard getDetail(Integer id,Model model) { + User user = UserExt.getUser(); + model.addAttribute("objectType", user.getObjectType()); return huiminCardClient.getById(id); } @@ -86,8 +92,16 @@ */ @RequestMapping(value = "/list") @ResponseBody - public PageInfoBT<THuiminCard> list(Page<THuiminCard> page,THuiminCard tHuiminCard) { - return super.packForBT(huiminCardClient.queryPage(page, tHuiminCard)); + public PageInfoBT<THuiminCard> list(THuiminCard tHuiminCard) { + User user = UserExt.getUser(); + if(user == null){ + return null; + } + Integer objectType = user.getObjectType(); + tHuiminCard.setObjectType(objectType); + Integer objectId = user.getObjectId(); + tHuiminCard.setObjectId(objectId); + return super.packForBT(huiminCardClient.queryPage(tHuiminCard)); } /** @@ -101,8 +115,19 @@ if (!StringUtils.isEmpty(storeIds)){ ids = storeIds.split(","); } - + User user = UserExt.getUser(); + if(user == null){ + return null; + } + Integer objectType = user.getObjectType(); + if (objectType != 1 && objectType != 2){ + throw new RuntimeException("权限不足"); + } + if (objectType == 2){ + query.setOperatorId(user.getObjectId()); + } Page<TStore> storePage = storeService.page(page, new LambdaQueryWrapper<TStore>() + .eq(TStore::getState, 1) .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()) @@ -118,6 +143,7 @@ TOperator operator = operatorService.getById(tStore.getOperatorId()); if (operator != null){ huiminCardStoreVO.setOperatorName(operator.getName()); + huiminCardStoreVO.setOperatorId(tStore.getOperatorId()); } return huiminCardStoreVO; }); @@ -131,65 +157,115 @@ 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; - } + + // 收集storeName条件的storeIds(不提前返回null) + if (!StringUtils.isEmpty(storeName)) { + List<String> storeIdsByName = storeService.listObjs( + new LambdaQueryWrapper<TStore>() + .select(TStore::getId) + .eq(TStore::getName, storeName), + String::valueOf); + storeIds.addAll(storeIdsByName); } + + // 收集operatorId条件的storeIds(不提前返回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; - } + if (operatorId != null) { + List<String> storeIdsByOperatorId = storeService.listObjs( + new LambdaQueryWrapper<TStore>() + .select(TStore::getId) + .eq(TStore::getOperatorId, operatorId), + String::valueOf); + storeIds.addAll(storeIdsByOperatorId); } - 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)); + // 处理用户权限过滤(objectType为2) + User user = UserExt.getUser(); + if (user != null && user.getObjectType() == 2) { + List<String> authorizedStoreIds = storeService.listObjs( + new LambdaQueryWrapper<TStore>() + .select(TStore::getId) + .eq(TStore::getOperatorId, user.getObjectId()), + String::valueOf); + if (authorizedStoreIds.isEmpty()) { + new Page(); + } + if (storeIds.isEmpty()){ + storeIds.addAll(authorizedStoreIds); + }else { + storeIds.retainAll(new HashSet<>(authorizedStoreIds)); + } + + }else if (user != null && user.getObjectType() == 3){ + storeIds = new ArrayList<>(); + storeIds.add(String.valueOf(user.getObjectId())); + } + + // 最终查询条件:storeIds为空时会返回空Page + 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)); + + // 批量查询store和operator,避免N+1问题 + List<TSite> sites = sitePage.getRecords(); + if (sites.isEmpty()) { + return sitePage.convert(t -> null); // 返回空Page + } + + // 收集需要的storeId和operatorId + List<Integer> storeIdsForVO = sites.stream().map(TSite::getStoreId).distinct().collect(Collectors.toList()); + List<Integer> operatorIdsForVO = sites.stream().map(TSite::getOperatorId).distinct().collect(Collectors.toList()); + + // 批量查询并缓存结果 + Map<Integer, TStore> storeMap = storeService.listByIds(storeIdsForVO) + .stream() + .collect(Collectors.toMap(TStore::getId, Function.identity())); + + Map<Integer, TOperator> operatorMap = operatorService.listByIds(operatorIdsForVO) + .stream() + .collect(Collectors.toMap(TOperator::getId, Function.identity())); + + // 转换VO时直接使用缓存结果 return sitePage.convert(tSite -> { - HuiminCardSiteVO huiminCardSiteVO = new HuiminCardSiteVO(); - huiminCardSiteVO.setSiteId(tSite.getId()); - huiminCardSiteVO.setProvince(tSite.getProvince()); - huiminCardSiteVO.setSiteName(tSite.getName()); - huiminCardSiteVO.setIds(tSite.getIds()); + HuiminCardSiteVO vo = new HuiminCardSiteVO(); + vo.setSiteId(tSite.getId()); + vo.setProvince(tSite.getProvince()); + vo.setSiteName(tSite.getName()); + vo.setIds(tSite.getIds()); - TStore store = storeService.getById(tSite.getStoreId()); - if (store != null){ - huiminCardSiteVO.setStoreName(store.getName()); + TStore store = storeMap.get(tSite.getStoreId()); + if (store != null) { + vo.setStoreName(store.getName()); } - TOperator operator = operatorService.getById(tSite.getOperatorId()); - if (operator != null){ - huiminCardSiteVO.setOperatorName(operator.getName()); + TOperator operator = operatorMap.get(tSite.getOperatorId()); + if (operator != null) { + vo.setOperatorName(operator.getName()); } - return huiminCardSiteVO; - + return vo; }); } + @PostMapping(value = "/add") @ResponseBody public Object add(THuiminCard tHuiminCard) { int a = 0; + String useIds = tHuiminCard.getUseIds(); + String[] useIdArr = useIds.split(","); if (tHuiminCard.getUseScope()==1){ - tHuiminCard.setStoreIds(tHuiminCard.getUseIds()); + tHuiminCard.setStoreIds(useIds); + String useId = useIdArr[0]; + TStore store = storeService.getById(useId); + tHuiminCard.setOperatorId(store.getOperatorId()); }else{ StringBuilder storeIds = new StringBuilder(); - for (String s : tHuiminCard.getUseIds().split(",")) { + for (String s : useIdArr) { TSite site = tSiteService.getById(s); if (site!=null){ storeIds.append(site.getStoreId()).append(","); @@ -197,7 +273,12 @@ } StringBuilder stringBuilder = storeIds.deleteCharAt(storeIds.length() - 1); tHuiminCard.setStoreIds(stringBuilder.toString()); + + String useId = useIdArr[0]; + TSite site = tSiteService.getById(useId); + tHuiminCard.setOperatorId(site.getOperatorId()); } + huiminCardClient.save(tHuiminCard); return SUCCESS_TIP; } 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 index d22e09c..2e87066 100644 --- 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 @@ -10,6 +10,8 @@ private String operatorName; + private Integer operatorId; + 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 7a6b43f..b4492dd 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 @@ -8,11 +8,11 @@ <div class="ibox-content"> <el-form :inline="true" :model="query"> <el-form-item label="惠民卡名称:"> - <el-input v-model="query.name" placeholder="请输入"></el-input> + <el-input v-model="query.huiMinName" placeholder="请输入"></el-input> </el-form-item> <el-form-item label="惠民卡类型:"> - <el-select v-model="query.type" placeholder="全部"> + <el-select v-model="query.huiMinType" placeholder="全部"> <el-option label="全部" value=""></el-option> <el-option label="年度卡" value="year"></el-option> <el-option label="季度卡" value="quarter"></el-option> @@ -22,11 +22,21 @@ <el-form-item label="有效期:"> <el-date-picker v-model="query.dateRange" + value-format="yyyy-MM-dd HH:mm:ss" type="daterange" range-separator="至" start-placeholder="开始日期" end-placeholder="结束日期"> </el-date-picker> + </el-form-item> + + <el-form-item label="惠民卡状态:"> + <el-select v-model="query.huiMinStatus" placeholder="全部"> + <el-option label="全部" value=""></el-option> + <el-option label="未开始" value="1"></el-option> + <el-option label="已开始" value="2"></el-option> + <el-option label="已结束" value="3"></el-option> + </el-select> </el-form-item> <el-form-item label="可售状态:"> @@ -39,13 +49,30 @@ </el-form> <div class="row"> <div class="col-sm-12"> - <el-button type="primary" size="medium" style="background-color:#1ab394;color: #ffffff;border:#1ab394;" v-on:click="handleSearch" icon="el-icon-search">搜索</el-button> - <el-button type="primary" size="medium" style="background-color:#1ab394;color: #ffffff;border:#1ab394;" v-on:click="handleAdd" icon="el-icon-circle-plus-outline">添加</el-button> - <el-button type="primary" size="medium" style="background-color:#1ab394;color: #ffffff;border:#1ab394;" v-on:click="handleEdit" icon="el-icon-edit">编辑</el-button> - <el-button type="primary" size="medium" style="background-color:#1ab394;color: #ffffff;border:#1ab394;" v-on:click="handleDelete" icon="el-icon-delete">删除</el-button> - <el-button type="primary" size="medium" style="background-color:#1ab394;color: #ffffff;border:#1ab394;" v-on:click="handleShelves(1)" icon="el-icon-upload2">上架</el-button> - <el-button type="primary" size="medium" style="background-color:#1ab394;color: #ffffff;border:#1ab394;" v-on:click="handleShelves(2)" icon="el-icon-download">下架</el-button> - <el-button type="primary" size="medium" style="background-color:#1ab394;color: #ffffff;border:#1ab394;" v-on:click="handleViewDetail" icon="el-icon-tickets">查看详情</el-button> + <button type="button" class="btn btn-primary" v-on:click="handleSearch"> + <i class="fa fa-search"></i> + 搜索 + </button> + <button type="button" class="btn btn-primary" v-on:click="handleAdd"> + <i class="fa fa-plus"></i> + 添加 + </button> + <button type="button" class="btn btn-primary" v-on:click="handleEdit"> + <i class="fa fa-edit"></i> + 编辑 + </button> + <button type="button" class="btn btn-primary" v-on:click="handleDelete"> + <i class="fa fa-remove"></i> + 删除 + </button> + <button type="button" class="btn btn-primary" v-on:click="handleShelves(1)"> + <i class="fa fa-check"></i> + 上架 + </button> + <button type="button" class="btn btn-primary" v-on:click="handleShelves(2)"> + <i class="fa fa-remove"></i> + 下架 + </button> </div> </div> <el-table @@ -91,9 +118,9 @@ <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-if="scope.row.huiMinStatus === 1">未开始</span> + <span v-else-if="scope.row.huiMinStatus === 2">已开始</span> + <span v-else-if="scope.row.huiMinStatus === 3">已结束</span> <span v-else>未知类型</span> </template> </el-table-column> 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 39eaf75..5eb8e8e 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 @@ -167,24 +167,18 @@ <!-- 时间输入和删除按钮 --> <div class="row g-3"> <div class="col-md-6" style="display: flex"> - <el-time-select - placeholder="起始时间" + <el-time-picker v-model="weekGroup.startTime" - :picker-options="{ - start: '00:00', - step: '01:00', - end: '23:00'}" - > - </el-time-select> - <el-time-select - placeholder="结束时间" + format="HH:mm" + value-format="HH:mm" + placeholder="开始时间"> + </el-time-picker> + <el-time-picker + format="HH:mm" + value-format="HH:mm" v-model="weekGroup.endTime" - :picker-options="{ - start: '00:00', - step: '01:00', - end: '23:00', - minTime: weekGroup.startTime}"> - </el-time-select> + placeholder="结束时间"> + </el-time-picker> </div> <div class="col-md-6"> <button @@ -223,13 +217,13 @@ </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 label="适用范围" prop="useScope" > + <el-radio v-if="objectType !=='3'" v-model="huiminCard.useScope" v-on:change="useScopeChange()" label="1">指定门店</el-radio> + <el-radio v-model="huiminCard.useScope" v-on:change="useScopeChange()" label="2">指定场地</el-radio> </el-form-item> <!-- 指定门店 --> - <el-form-item label="指定门店" v-if="huiminCard.useScope === '1'" prop="storeIds"> + <el-form-item label="指定门店" v-if="huiminCard.useScope === '1' && objectType !=='3'" prop="storeIds"> <el-button type="text" v-on:click="handleSelectStore()">选择门店</el-button> <el-table :data="tableData" @@ -302,6 +296,7 @@ </el-table> </el-form-item> + <!-- 惠民卡介绍 --> <el-form-item label="惠民卡介绍" prop="introduce"> <textarea type="text/plain" v-model="introduces" id="editor_1"></textarea> @@ -332,7 +327,6 @@ <el-select v-model="storeForm.provinceCode" size="mini" clearable filterable placeholder="请选择"> <el-option v-for="item in provinces" - :key="item.code" :label="item.name" :value="item.code"> </el-option> @@ -344,7 +338,6 @@ <el-select v-model="storeForm.cityCode" clearable size="mini" filterable placeholder="请选择"> <el-option v-for="item in cities" - :key="item.citycode" :label="item.name" :value="item.citycode"> </el-option> @@ -352,11 +345,10 @@ </el-form-item> </el-col> <el-col :span="6"> - <el-form-item label="所属运营商"> + <el-form-item label="所属运营商" label-width="100px"> <el-select v-model="storeForm.operatorId" clearable size="mini" filterable placeholder="请选择"> <el-option v-for="item in operations" - :key="item.id" :label="item.name" :value="item.id"> </el-option> @@ -405,12 +397,13 @@ </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"> + v-on:size-change="handleStoreSizeChange" + v-on:current-change="handleStoreCurrentChange" + :current-page="currentStorePage" + :page-sizes="[10, 50, 100, 200]" + :page-size="pageStoreSize" + layout="total, sizes, prev, pager, next, jumper" + :total="storeTotal"> </el-pagination> <span slot="footer" class="dialog-footer"> <el-button v-on:click="dialogVisible2 = false">取 消</el-button> @@ -432,7 +425,6 @@ <el-select v-model="siteForm.provinceCode" size="mini" clearable filterable placeholder="请选择"> <el-option v-for="item in provinces" - :key="item.code" :label="item.name" :value="item.code"> </el-option> @@ -444,7 +436,6 @@ <el-select v-model="siteForm.cityCode" clearable size="mini" filterable placeholder="请选择"> <el-option v-for="item in cities" - :key="item.citycode" :label="item.name" :value="item.citycode"> </el-option> @@ -452,11 +443,10 @@ </el-form-item> </el-col> <el-col :span="6"> - <el-form-item label="所属运营商"> + <el-form-item label="所属运营商" label-width="100px"> <el-select v-model="siteForm.operatorId" clearable size="mini" filterable placeholder="请选择"> <el-option v-for="item in operations" - :key="item.id" :label="item.name" :value="item.id"> </el-option> @@ -511,12 +501,16 @@ </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> + + <el-pagination + v-on:size-change="handleSiteSizeChange" + v-on:current-change="handleSiteCurrentChange" + :current-page="currentSitePage" + :page-sizes="[10, 50, 100, 200]" + :page-size="pageSiteSize" + layout="total, sizes, prev, pager, next, jumper" + :total="siteTotal"> + </el-pagination> <span slot="footer" class="dialog-footer"> <el-button v-on:click="dialogVisible3 = false">取 消</el-button> @@ -647,6 +641,13 @@ introduces: null, multipleSelection1: [], multipleSelection2: [], + currentSitePage: 1, + pageSiteSize: 10, + currentStorePage: 1, + pageStoreSize: 10, + siteTotal: 0, + storeTotal: 0, + objectType: null, unUseTimes: [ {} ], @@ -673,7 +674,6 @@ }, tableData: [], tableStoreData: [], - tableStoreTotal: 0, tableStoreLoading: false, tableSiteData: [], tableSiteTotal: 0, @@ -798,7 +798,7 @@ return isLt2M; }, handleRemove(file, fileList) { - const fileUrl = file.response; + const fileUrl = file.url; this.banners.forEach((item, index) => { if (item === fileUrl) { this.banners.splice(index, 1); @@ -864,7 +864,7 @@ let ajax = new $ax(Feng.ctxPath + "/tHuiminCard/storeList", (data) => { vm.tableStoreData = data.records; // 使用 vm 替代 this - vm.tableStoreTotal = data.total; + vm.storeTotal = data.total; vm.tableStoreLoading = false; console.log('成功获取数据:', vm.tableStoreData); // 验证数据 }, @@ -873,8 +873,8 @@ Feng.error("请求失败: " + data.responseJSON.message); } ); - this.storeForm.pageNum = vm.queryParams.pageNum; - this.storeForm.pageSize = vm.queryParams.pageSize + this.storeForm.pageNum = vm.currentStorePage; + this.storeForm.pageSize = vm.pageStoreSize ajax.set(this.storeForm); ajax.start(); @@ -887,6 +887,9 @@ vm.tableSiteData = data.records; // 使用 vm 替代 this vm.tableSiteTotal = data.total; vm.tableSiteLoading = false; + vm.currentStorePage = data.current; + vm.pageStoreSize = data.size; + vm.siteTotal = data.total; console.log('成功获取数据:', vm.tableSiteData); // 验证数据 }, (data) => { @@ -894,8 +897,8 @@ Feng.error("请求失败: " + data.responseJSON.message); } ); - this.siteForm.pageNum = vm.queryParams.pageNum; - this.siteForm.pageSize = vm.queryParams.pageSize + this.siteForm.current = vm.currentSitePage; + this.siteForm.size = vm.pageSiteSize ajax.set(this.siteForm); ajax.start(); }, @@ -903,14 +906,10 @@ this.dialogVisible2 = false; }, handleSiteClose() { - this.$confirm('确认关闭?1') - .then(_ => { - this.dialogVisible3 = false; - }) - .catch(_ => { - }); + this.dialogVisible3 = false; }, handleSelectionChange(val) { + if (this.huiminCard.useScope === '1') { this.multipleSelection1 = val; } else if (this.huiminCard.useScope === '2') { @@ -937,8 +936,30 @@ Feng.info('请选择数据'); return; } - this.dialogVisible2 = false - this.tableData = this.multipleSelection1; + + // 新增:检查所有新选中的门店是否属于同一运营商 + const firstOperator = this.multipleSelection1[0].operatorId; + if (this.multipleSelection1.some(item => item.operatorId !== firstOperator)) { + Feng.info('请选择同一运营商'); + return; + } + + // 检查新选门店与已有门店的运营商是否一致(如果需要) + if (this.tableData.length > 0) { + const existingOperator = this.tableData[0].operatorId; + if (firstOperator !== existingOperator) { + Feng.info('新选门店的运营商需与已有门店一致'); + return; + } + } + + this.multipleSelection1.forEach((item) => { + if (!this.tableData.some(item1 => item1.storeId === item.storeId)) { + this.tableData.push(item); + } + }); + + this.dialogVisible2 = false; this.huiminCard.useIds = this.tableData.map(item => item.storeId).join(','); }, handleSite() { @@ -949,6 +970,9 @@ this.dialogVisible3 = false this.tableData = this.multipleSelection2; this.huiminCard.useIds = this.tableData.map(item => item.siteId).join(','); + }, + useScopeChange() { + this.tableData = []; }, submitForm(formName) { this.$refs[formName].validate(valid => { @@ -984,10 +1008,29 @@ } }); }, + handleSiteSizeChange(val){ + this.pageSiteSize = val; + this.siteList(); + }, + handleSiteCurrentChange(val){ + this.currentSitePage = val; + this.siteList(); + }, + handleStoreSizeChange(val){ + this.pageSiteSize = val; + this.storeList(); + }, + handleStoreCurrentChange(val){ + this.currentSitePage = val; + this.storeList(); + }, }, created() { let editor_1 = UE.getEditor('editor_1'); - + this.objectType = `${objectType}` + if (this.objectType === '3'){ + this.huiminCard.useScope = '2' + } let ajax = new $ax(Feng.ctxPath + "/base/region/getProvince", (data) => { 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 index 55ca096..e70122c 100644 --- 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 @@ -206,7 +206,7 @@ <!-- 不可用时间 --> <el-form-item label="不可用时间" prop="unUseTimes"> - <el-button type="text" v-on:click="addUnUseTime()">添加</el-button> + <el-button typ e="text" v-on:click="addUnUseTime()">添加</el-button> <div v-for="(item, dayIndex) in unUseTimes" :key="dayIndex" class="date-picker-item mb-2"> @@ -228,12 +228,12 @@ <!-- 适用范围 --> <el-form-item label="适用范围" prop="useScope"> - <el-radio v-model="huiminCard.useScope" label="1">指定门店</el-radio> + <el-radio v-if="objectType !=='3'" 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-form-item label="指定门店" v-if="huiminCard.useScope === '1' && objectType !=='3'" prop="storeIds"> <el-button type="text" v-on:click="handleSelectStore()">选择门店</el-button> <el-table :data="tableData" @@ -438,11 +438,9 @@ <el-row :gutter="10"> <el-col :span="6"> <el-form-item label="所在省"> - <el-select v-model="siteForm.provinceCode" size="mini" clearable filterable - placeholder="请选择"> + <el-select v-model="siteForm.provinceCode" size="mini" clearable filterable placeholder="请选择"> <el-option v-for="item in provinces" - :key="item.code" :label="item.name" :value="item.code"> </el-option> @@ -451,11 +449,9 @@ </el-col> <el-col :span="6"> <el-form-item label="所在市"> - <el-select v-model="siteForm.cityCode" clearable size="mini" filterable - placeholder="请选择"> + <el-select v-model="siteForm.cityCode" clearable size="mini" filterable placeholder="请选择"> <el-option v-for="item in cities" - :key="item.citycode" :label="item.name" :value="item.citycode"> </el-option> @@ -463,12 +459,10 @@ </el-form-item> </el-col> <el-col :span="6"> - <el-form-item label="所属运营商"> - <el-select v-model="siteForm.operatorId" clearable size="mini" filterable - placeholder="请选择"> + <el-form-item label="所属运营商" label-width="100px"> + <el-select v-model="siteForm.operatorId" clearable size="mini" filterable placeholder="请选择"> <el-option v-for="item in operations" - :key="item.id" :label="item.name" :value="item.id"> </el-option> @@ -483,8 +477,7 @@ </el-row> <el-row> <el-col :span="24"> - <el-button v-on:click="siteList" style="background-color:#1ab394;color: #ffffff" size="mini" - icon="el-icon-search"> + <el-button v-on:click="siteList" style="background-color:#1ab394;color: #ffffff" size="mini" icon="el-icon-search"> 搜索 </el-button> </el-col> @@ -524,12 +517,16 @@ </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> + + <el-pagination + v-on:size-change="handleSiteSizeChange" + v-on:current-change="handleSiteCurrentChange" + :current-page="currentSitePage" + :page-sizes="[10, 50, 100, 200]" + :page-size="pageSiteSize" + layout="total, sizes, prev, pager, next, jumper" + :total="siteTotal"> + </el-pagination> <span slot="footer" class="dialog-footer"> <el-button v-on:click="dialogVisible3 = false">取 消</el-button> @@ -605,6 +602,13 @@ operatorId: null, storeName: '', }, + objectType: null, + currentSitePage: 1, + pageSiteSize: 10, + currentStorePage: 1, + pageStoreSize: 10, + siteTotal: 0, + storeTotal: 0, unBuyCoverFileList: [], buyCoverFileList: [], bannerFileList: [], @@ -814,7 +818,8 @@ return isLt2M; }, handleRemove(file, fileList) { - const fileUrl = file.response; + + const fileUrl = file.url; this.banners.forEach((item, index) => { if (item === fileUrl) { this.banners.splice(index, 1); @@ -880,7 +885,7 @@ let ajax = new $ax(Feng.ctxPath + "/tHuiminCard/storeList", (data) => { vm.tableStoreData = data.records; // 使用 vm 替代 this - vm.tableStoreTotal = data.total; + vm.storeTotal = data.total; vm.tableStoreLoading = false; console.log('成功获取数据:', vm.tableStoreData); // 验证数据 }, @@ -889,8 +894,8 @@ Feng.error("请求失败: " + data.responseJSON.message); } ); - this.storeForm.pageNum = vm.queryParams.pageNum; - this.storeForm.pageSize = vm.queryParams.pageSize + this.storeForm.pageNum = vm.currentStorePage; + this.storeForm.pageSize = vm.pageStoreSize ajax.set(this.storeForm); ajax.start(); @@ -903,6 +908,9 @@ vm.tableSiteData = data.records; // 使用 vm 替代 this vm.tableSiteTotal = data.total; vm.tableSiteLoading = false; + vm.currentStorePage = data.current; + vm.pageStoreSize = data.size; + vm.siteTotal = data.total; console.log('成功获取数据:', vm.tableSiteData); // 验证数据 }, (data) => { @@ -910,8 +918,8 @@ Feng.error("请求失败: " + data.responseJSON.message); } ); - this.siteForm.pageNum = vm.queryParams.pageNum; - this.siteForm.pageSize = vm.queryParams.pageSize + this.siteForm.current = vm.currentSitePage; + this.siteForm.size = vm.pageSiteSize ajax.set(this.siteForm); ajax.start(); }, @@ -919,12 +927,7 @@ this.dialogVisible2 = false; }, handleSiteClose() { - this.$confirm('确认关闭?1') - .then(_ => { - this.dialogVisible3 = false; - }) - .catch(_ => { - }); + this.dialogVisible3 = false; }, handleSelectionChange(val) { if (this.huiminCard.useScope === '1') { @@ -1001,10 +1004,27 @@ }, cancelForm(){ parent.layer.close(window.parent.THuiminCard.layerIndex); - } + }, + handleSiteSizeChange(val){ + this.pageSiteSize = val; + this.siteList(); + }, + handleSiteCurrentChange(val){ + this.currentSitePage = val; + this.siteList(); + }, + handleStoreSizeChange(val){ + this.pageSiteSize = val; + this.storeList(); + }, + handleStoreCurrentChange(val){ + this.currentSitePage = val; + this.storeList(); + }, }, created() { let editor_1 = UE.getEditor('editor_1'); + this.objectType = `${objectType}` const urlParams = new URLSearchParams(window.location.search); this.pageType = urlParams.get('pageType'); @@ -1023,13 +1043,16 @@ this.periodOfValidity = [data.startTime, data.endTime] + console.log("data.useScope",data.useScope) + this.huiminCard = { ...data, - unUseTimes: data.unUseTimes == null? {}: JSON.parse(data.unUseTimes), huiMinType: Number(data.huiMinType), startTime: data.startTimeStr, endTime: data.endTimeStr, + useScope: data.useScope+"", } + this.unUseTimes = data.unUseTimes == null? {}: JSON.parse(data.unUseTimes), // 设置内容(需在编辑器就绪后调用) editor_1.ready(() => { editor_1.setContent(this.huiminCard.introduce); 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 index fcde6a0..597ae5b 100644 --- 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 @@ -3,10 +3,11 @@ data() { return { query: { - name: '', - type: '', + huiMinName: '', + huiMinType: '', dateRange: [], - status: '' + status: '', + huiMinStatus: '', }, loading: false, currentPage: 1, @@ -41,8 +42,10 @@ // 添加请求参数 ajax.set({ - pageNum: this.currentPage, - pageSize: this.pageSize, + current: this.currentPage, + size: this.pageSize, + startTime: this.query.dateRange.length > 0 ? this.query.dateRange[0] : null, + endTime: this.query.dateRange.length > 0 ? this.query.dateRange[1] : null, ...this.query }); ajax.start(); @@ -111,9 +114,11 @@ }, handleSizeChange(val) { this.pageSize = val + this.handleSearch() }, handleCurrentChange(val) { this.currentPage = val + this.handleSearch() }, handleSelectionChange(selection) { // 多选处理 -- Gitblit v1.7.1