cloud-server-activity/src/main/java/com/dsh/activity/controller/PointMercharsController.java
@@ -13,6 +13,8 @@ import com.dsh.activity.feignclient.other.model.StoreDetailOfCourse; import com.dsh.activity.model.PointMerchandiseVo; import com.dsh.activity.model.request.*; import com.dsh.activity.model.response.GoodsInfoOneVo; import com.dsh.activity.model.response.StoreVos; import com.dsh.activity.service.*; import com.dsh.activity.util.GDMapGeocodingUtil; import com.dsh.activity.util.StrUtils; @@ -70,6 +72,9 @@ @Resource private CouponCityService ccityService; @Resource private PointsMerchandiseCityService pmdsCityService; @ResponseBody @@ -744,4 +749,96 @@ } } @PostMapping("/base/pointMerchars/queryDetailsOfGoods") public GoodsInfoOneVo queryDetailsOfGoods(@RequestBody Integer id){ SimpleDateFormat simpleDateFormat = new SimpleDateFormat("yyyy-MM-dd"); GoodsInfoOneVo infoOneVo = new GoodsInfoOneVo(); PointsMerchandise byId = pmdsService.getById(id); if (ToolUtil.isNotEmpty(byId)){ infoOneVo.setName(byId.getName()); infoOneVo.setCover(byId.getCover()); infoOneVo.setPics(byId.getProductImages()); infoOneVo.setPrice(byId.getPrice()); infoOneVo.setExchangeMethod(byId.getRedemptionMethod()); switch (byId.getRedemptionMethod()){ case 1: infoOneVo.setIntegral(byId.getIntegral()); break; case 2: infoOneVo.setIntegral(byId.getIntegral()); infoOneVo.setCash(byId.getCash()); break; case 3: infoOneVo.setCash(byId.getCash()); break; default: break; } switch (byId.getUserPopulation()){ case 1: infoOneVo.setUserPopulation("全部用户"); break; case 2: infoOneVo.setUserPopulation("年度会员"); break; case 3: infoOneVo.setUserPopulation("已有学员用户"); break; default: break; } infoOneVo.setQuantityIssued(byId.getQuantityIssued()); List<UserPointsMerchandise> list = upmseService.list(new LambdaQueryWrapper<UserPointsMerchandise>() .eq(UserPointsMerchandise::getPointsMerchandiseId,byId.getId())); infoOneVo.setUseScope(byId.getUseScope()); switch (byId.getUseScope()){ case 1: infoOneVo.setExchangeArea("全国通用"); break; case 2: infoOneVo.setExchangeArea("指定城市"); break; case 3: infoOneVo.setExchangeArea("指定门店"); break; default: break; } infoOneVo.setHasPicked(list.size()); infoOneVo.setPickUpQuantity(byId.getPickUpQuantity()); infoOneVo.setValidTime(simpleDateFormat.format(byId.getStartTime())+"至"+ simpleDateFormat.format(byId.getEndTime())); infoOneVo.setRedemptionInstructions(byId.getRedemptionInstructions()); infoOneVo.setSort(byId.getSort()); } return infoOneVo; } @ResponseBody @PostMapping("/base/pointMerchars/getStoreList") public List<StoreVos> getStoreList(@RequestBody Integer id){ List<StoreVos> storeVos = new ArrayList<>(); List<PointsMerchandiseStore> list = pmdstoService.list(new QueryWrapper<PointsMerchandiseStore>() .eq("pointsMerchandiseId",id)); // TODO: 2023/8/18 查询城市 return storeVos; } @ResponseBody @PostMapping("/base/pointMerchars/getProvinces") public List<StoreVos> getProvinces(@RequestBody Integer id){ List<StoreVos> storeVos = new ArrayList<>(); List<PointsMerchandiseCity> list = pmdsCityService.list(new LambdaQueryWrapper<PointsMerchandiseCity>() .eq(PointsMerchandiseCity::getPointsMerchandiseId,id)); // TODO: 2023/8/18 查询门店 return storeVos; } } cloud-server-activity/src/main/java/com/dsh/activity/entity/PointsMerchandiseCity.java
New file @@ -0,0 +1,67 @@ package com.dsh.activity.entity; import com.baomidou.mybatisplus.annotation.IdType; import com.baomidou.mybatisplus.annotation.TableField; import com.baomidou.mybatisplus.annotation.TableId; import com.baomidou.mybatisplus.annotation.TableName; import com.baomidou.mybatisplus.extension.activerecord.Model; import lombok.Data; import lombok.EqualsAndHashCode; import lombok.experimental.Accessors; import java.io.Serializable; /** * <p> * 积分商品使用门店关系数据 * </p> * * @author jqs * @since 2023-07-12 */ @Data @EqualsAndHashCode(callSuper = false) @Accessors(chain = true) @TableName("t_points_merchandise_city") public class PointsMerchandiseCity extends Model<PointsMerchandiseCity> { private static final long serialVersionUID = 1L; /** * 主键 */ @TableId(value = "id", type = IdType.AUTO) private Integer id; /** * 积分商品id */ @TableField("pointsMerchandiseId") private Integer pointsMerchandiseId; /** * */ @TableField("city") private String city; /** * */ @TableField("cityCode") private String cityCode; /** * */ @TableField("province") private String province; /** * */ @TableField("provinceCode") private String provinceCode; @Override protected Serializable pkVal() { return this.id; } } cloud-server-activity/src/main/java/com/dsh/activity/mapper/PointsMerchandiseCityMapper.java
New file @@ -0,0 +1,16 @@ package com.dsh.activity.mapper; import com.baomidou.mybatisplus.core.mapper.BaseMapper; import com.dsh.activity.entity.PointsMerchandiseCity; /** * <p> * 积分商品使用门店关系数据 Mapper 接口 * </p> * * @author jqs * @since 2023-07-12 */ public interface PointsMerchandiseCityMapper extends BaseMapper<PointsMerchandiseCity> { } cloud-server-activity/src/main/java/com/dsh/activity/model/response/GoodsInfoOneVo.java
New file @@ -0,0 +1,78 @@ package com.dsh.activity.model.response; import lombok.AllArgsConstructor; import lombok.Data; import lombok.NoArgsConstructor; import java.math.BigDecimal; import java.util.List; @Data @AllArgsConstructor @NoArgsConstructor public class GoodsInfoOneVo { String name; /** * 封面图 */ String cover; /** * 原价 */ BigDecimal price; /** * 兑换方式(1=积分,2=现金+积分, 3=现金) */ Integer exchangeMethod; /** * 现金 */ BigDecimal cash; /** * 积分 */ Integer integral; /** * 图片 */ String pics; /** * 用户人群 */ String userPopulation; /** * 发放数量 */ Integer quantityIssued; /** * 已领数量 */ Integer hasPicked; /** * 限领数量 */ Integer pickUpQuantity; /** * 有效期 */ String validTime; /** * 兑换地点 */ String exchangeArea; /** * 兑换地点 (1=全国,2=指定城市,3=指定门店) */ Integer useScope; /** * 商品说明 */ String redemptionInstructions; /** * 排序 */ Integer sort; } cloud-server-activity/src/main/java/com/dsh/activity/model/response/StoreVos.java
New file @@ -0,0 +1,18 @@ package com.dsh.activity.model.response; import lombok.AllArgsConstructor; import lombok.Data; import lombok.NoArgsConstructor; @Data @AllArgsConstructor @NoArgsConstructor public class StoreVos { String num1; String num2; String num3; } cloud-server-activity/src/main/java/com/dsh/activity/service/PointsMerchandiseCityService.java
New file @@ -0,0 +1,16 @@ package com.dsh.activity.service; import com.baomidou.mybatisplus.extension.service.IService; import com.dsh.activity.entity.PointsMerchandiseCity; /** * <p> * 积分商品使用门店关系数据 服务类 * </p> * * @author jqs * @since 2023-07-12 */ public interface PointsMerchandiseCityService extends IService<PointsMerchandiseCity> { } cloud-server-activity/src/main/java/com/dsh/activity/service/impl/PointsMerchandiseCityServiceImpl.java
New file @@ -0,0 +1,20 @@ package com.dsh.activity.service.impl; import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; import com.dsh.activity.entity.PointsMerchandiseCity; import com.dsh.activity.mapper.PointsMerchandiseCityMapper; import com.dsh.activity.service.PointsMerchandiseCityService; import org.springframework.stereotype.Service; /** * <p> * 积分商品使用门店关系数据 服务实现类 * </p> * * @author jqs * @since 2023-07-12 */ @Service public class PointsMerchandiseCityServiceImpl extends ServiceImpl<PointsMerchandiseCityMapper, PointsMerchandiseCity> implements PointsMerchandiseCityService { } cloud-server-activity/src/main/resources/mapper/PointsMerchandiseCityMapper.xml
New file @@ -0,0 +1,6 @@ <?xml version="1.0" encoding="UTF-8"?> <!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd"> <mapper namespace="com.dsh.activity.mapper.PointsMerchandiseCityMapper"> </mapper> cloud-server-management/src/main/java/com/dsh/course/feignClient/activity/PointMercharsClient.java
@@ -5,6 +5,8 @@ import com.dsh.course.feignClient.activity.model.IntegralGoodsOfSearch; import com.dsh.course.feignClient.activity.model.PointMercharsPayedVo; import com.dsh.course.feignClient.activity.model.PointMercharsVo; import com.dsh.guns.modular.system.model.GoodsInfoOneVo; import com.dsh.guns.modular.system.model.StoreVos; import org.springframework.cloud.openfeign.FeignClient; import org.springframework.web.bind.annotation.PostMapping; import org.springframework.web.bind.annotation.RequestBody; @@ -34,4 +36,15 @@ @PostMapping("/base/pointMerchars/updateGoodsDetail") boolean updateGoodsDetail(@RequestBody Map<String, Object> stringObjectHashMap); @PostMapping("/base/pointMerchars/queryDetailsOfGoods") GoodsInfoOneVo queryDetailsOfGoods(@RequestBody Integer id); @PostMapping("/base/pointMerchars/getStoreList") List<StoreVos> getStoreList(@RequestBody Integer id); @PostMapping("/base/pointMerchars/getProvinces") List<StoreVos> getProvinces(@RequestBody Integer id); } cloud-server-management/src/main/java/com/dsh/guns/modular/system/controller/code/TGoodsController.java
@@ -19,10 +19,7 @@ import com.dsh.guns.core.base.tips.SuccessTip; import com.dsh.guns.core.common.constant.factory.PageFactory; import com.dsh.guns.core.util.ToolUtil; import com.dsh.guns.modular.system.model.CouponDataVo; import com.dsh.guns.modular.system.model.Region; import com.dsh.guns.modular.system.model.TCity; import com.dsh.guns.modular.system.model.TStore; import com.dsh.guns.modular.system.model.*; import com.dsh.guns.modular.system.service.ICityService; import com.dsh.guns.modular.system.service.IRegionService; import com.dsh.guns.modular.system.service.IStoreService; @@ -95,6 +92,19 @@ List<TCity> list = cityService.list(new LambdaQueryWrapper<TCity>().eq(TCity::getParentId, 0)); model.addAttribute("list",list); return PREFIX + "TGoods_add.html"; } /** * 跳转到添加 */ @RequestMapping("/tGoods_info") public String tGoodsInfo(Model model) { Integer objectType = UserExt.getUser().getObjectType(); System.out.println(objectType); model.addAttribute("userType",objectType); List<TCity> list = cityService.list(new LambdaQueryWrapper<TCity>().eq(TCity::getParentId, 0)); model.addAttribute("list",list); return PREFIX + "TGoods_detail_one.html"; } @@ -468,4 +478,29 @@ } /** * 跳转到修改商品详情 */ @RequestMapping("/goods_info/{id}") public String goodsInfo(@PathVariable Integer id, Model model) { System.out.println("id:"+id); GoodsInfoOneVo infoOneVo = pointMercharsClient.queryDetailsOfGoods(id); System.out.println("pointMercharsVo:"+infoOneVo); model.addAttribute("item",infoOneVo); String[] split = infoOneVo.getPics().split(","); List<String> list = Arrays.asList(split); if (infoOneVo.getUseScope() == 2){ List<StoreVos> provinces = pointMercharsClient.getProvinces(id); model.addAttribute("city",provinces); } if (infoOneVo.getUseScope() == 2){ List<StoreVos> storeVos = pointMercharsClient.getStoreList(id); model.addAttribute("store",storeVos); } model.addAttribute("pictures",list); model.addAttribute("exchangeMethod",infoOneVo.getExchangeMethod()); return PREFIX + "TGoods_detail_one.html"; } } cloud-server-management/src/main/java/com/dsh/guns/modular/system/model/GoodsInfoOneVo.java
New file @@ -0,0 +1,78 @@ package com.dsh.guns.modular.system.model; import lombok.AllArgsConstructor; import lombok.Data; import lombok.NoArgsConstructor; import java.math.BigDecimal; import java.util.List; @Data @AllArgsConstructor @NoArgsConstructor public class GoodsInfoOneVo { String name; /** * 封面图 */ String cover; /** * 原价 */ BigDecimal price; /** * 兑换方式(1=积分,2=现金+积分, 3=现金) */ Integer exchangeMethod; /** * 现金 */ BigDecimal cash; /** * 积分 */ Integer integral; /** * 图片 */ String pics; /** * 用户人群 */ String userPopulation; /** * 发放数量 */ Integer quantityIssued; /** * 已领数量 */ Integer hasPicked; /** * 限领数量 */ Integer pickUpQuantity; /** * 有效期 */ String validTime; /** * 兑换点 */ String exchangeArea; /** * 兑换地点 (1=全国,2=指定城市,3=指定门店) */ Integer useScope; /** * 商品说明 */ String redemptionInstructions; /** * 排序 */ Integer sort; } cloud-server-management/src/main/java/com/dsh/guns/modular/system/model/StoreVos.java
New file @@ -0,0 +1,18 @@ package com.dsh.guns.modular.system.model; import lombok.AllArgsConstructor; import lombok.Data; import lombok.NoArgsConstructor; @Data @AllArgsConstructor @NoArgsConstructor public class StoreVos { String num1; String num2; String num3; } cloud-server-management/src/main/webapp/WEB-INF/view/system/tGoods/TGoods_detail_one.html
New file @@ -0,0 +1,207 @@ @layout("/common/_container.html"){ <style> .avatar-uploader .el-upload { border: 1px dashed #d9d9d9; border-radius: 6px; cursor: pointer; position: relative; height: 100px; width: 100px; overflow: hidden; display: inline-block; } .avatar-uploader .el-upload:hover { border-color: #409eff; } .avatar-uploader-icon { font-size: 28px; color: #8c939d; width: 100px; height: 100px; line-height: 110px; margin-top: 40px; text-align: center; } .avatar { width: 100px; height: 100px; display: block; } .col-sm-12 { margin-top: 20px; } .col-sm-12 select { height: 33px; } </style> <div class="ibox float-e-margins"> <div class="ibox-content"> <div class="form-horizontal" id="carInfoForm"> <div id="b1"> <#input id="name" name="*商品名称:" type="text" value="${item.name}" readonly="true" /> <#input id="cover" name="*原价:" avatarImg="${item.price}" readonly="true" /> <div class="form-group"> <label class="col-sm-3 control-label head-scu-label">*兑换方式:</label> <div class="col-sm-4"> @if(exchangeMethod == 1){ <input class="col-sm-1 control-label" name="userGroup" type="radio" value="1" checked style="margin-top: 10px" disabled/> <label class="col-sm-1" style="margin-left: -15px;width: 16%;margin-top: 7px">全部用户</label> <input class="col-sm-1 control-label" name="userGroup" type="radio" value="2" style="margin-left: 5%;margin-top: 10px;width: 13px;height: 13px" disabled/> <label class="col-sm-1" style="width: 16%;margin-top: 7px">年度会员</label> <input class="col-sm-1 control-label" name="userGroup" type="radio" value="3" style="margin-left: 4%;margin-top: 10px;width: 13px;height: 13px" disabled/> <label class="col-sm-1" style="width: 18%;margin-top: 5px">已有学员用户</label> @} @if(exchangeMethod == 2){ <input class="col-sm-1 control-label" name="userGroup" type="radio" value="1" style="margin-top: 10px" disabled/> <label class="col-sm-1" style="margin-left: -15px;width: 16%;margin-top: 7px">全部用户</label> <input class="col-sm-1 control-label" name="userGroup" type="radio" value="2" checked style="margin-left: 5%;margin-top: 10px;width: 13px;height: 13px" disabled/> <label class="col-sm-1" style="width: 16%;margin-top: 7px">年度会员</label> <input class="col-sm-1 control-label" name="userGroup" type="radio" value="3" style="margin-left: 4%;margin-top: 10px;width: 13px;height: 13px" disabled/> <label class="col-sm-1" style="width: 18%;margin-top: 5px">已有学员用户</label> @} @if(exchangeMethod == 3){ <input class="col-sm-1 control-label" name="userGroup" type="radio" value="1" style="margin-top: 10px" disabled/> <label class="col-sm-1" style="margin-left: -15px;width: 16%;margin-top: 7px">全部用户</label> <input class="col-sm-1 control-label" name="userGroup" type="radio" value="2" style="margin-left: 5%;margin-top: 10px;width: 13px;height: 13px" disabled/> <label class="col-sm-1" style="width: 16%;margin-top: 7px">年度会员</label> <input class="col-sm-1 control-label" name="userGroup" type="radio" value="3" checked style="margin-left: 4%;margin-top: 10px;width: 13px;height: 13px" disabled/> <label class="col-sm-1" style="width: 18%;margin-top: 5px">已有学员用户</label> @} </div> </div> <#input id="cover" name="*所需现金:" avatarImg="${item.cash}" readonly="true" /> <#input id="cover" name="*所需积分:" avatarImg="${item.integral}" readonly="true" /> <div class="form-group"> <label class="col-sm-3 control-label head-scu-label">*商品封面:</label> <div class="col-sm-4"> <img height="100px" width="100px" src="${item.cover}"> </div> </div> <div class="form-group"> <label class="col-sm-3 control-label head-scu-label">*商品图片:</label> <div class="col-sm-4"> @if(pictures != null){ @for(im in pictures){ <img height="100px" width="100px" src="${im}"> @} @} </div> </div> <#input id="quantityIssued" name="*用户人群:" type="text" value="${item.userPopulation}" readonly="true" /> <#input id="quantityIssued" name="*发放数量:" type="text" value="${item.quantityIssued}" readonly="true" /> <#input id="quantityIssued" name="*限领数量:" type="text" value="${item.pickUpQuantity}" readonly="true" /> <#input id="quantityIssued" name="*已兑换数量:" type="text" value="${item.hasPicked}" readonly="true" /> <#input id="quantityIssued" name="*有效期:" type="text" value="${item.validTime}" readonly="true" /> <#input id="quantityIssued" name="*兑换地点:" type="text" value="${item.exchangeArea}" readonly="true" /> @if(item.useScope == 2){ <table class="table table-bordered" style="width: 70%;margin-left: 228px;" > <thead> <tr> <td>所在省市</td> <td>所属账号</td> <td>门店名称</td> </tr> </thead> @for(s in store){ <td>${s.num1}</td> <td>${s.num2}</td> <td>${s.num3}</td> @} </table> @} @if(item.useScope == 3){ <table class="table table-bordered" style="width: 70%;margin-left: 228px;" > <thead> <tr> <td>所在省市</td> <td>所属账号</td> <td>门店名称</td> </tr> </thead> @for(c in city){ <td>${c.num1}</td> <td>${c.num2}</td> @} </table> @} <div class="form-group" style="margin-left:262px"> <label class="col-sm-3 control-label">兑换说明:</label> <div class="col-sm-4"> <textarea type="text/plain" id="editor" style="height: 300px;width: 800px;" readonly>${item.redemptionInstructions}</textarea> </div> </div> <#input id="quantityIssued" name="*排序:" type="text" value="${item.sort}" readonly="true" /> </div> </div> </div> <div class="row btn-group-m-t"> <div class="col-sm-10 col-sm-offset-5"> <#button btnCss="danger" name="关闭" id="cancel" icon="fa-eraser" clickFun="TGoodsInfoDlg.close()"/> </div> </div> </div> </div> </div> <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 src="${ctxPath}/modular/system/tGoods/tGoods_info.js"></script> <script> var vue2 = new Vue({ el: '#app', data: { autoUpload: true,//自动上传 imageUrl1: '',//模型数据,用于上传图片完成后图片预览 dialogVisible: false }, methods: { handleAvatarSuccess(res, file) { TGoodsInfoDlg.goodsPicArray.push(file.response); }, beforeAvatarUpload(file) { const isLt2M = file.size / 1024 / 1024 < 10; if (!isLt2M) { this.$message.error('上传图片大小不能超过 10MB!'); } return isLt2M; }, handleRemove(file, fileList) { TGoodsInfoDlg.goodsPicArray = TGoodsInfoDlg.goodsPicArray.filter(item => { return item.uid != file.uid; }); }, }, created() { }, }); </script> @} cloud-server-management/src/main/webapp/WEB-INF/view/system/tGoods/TGoods_edit.html
@@ -54,14 +54,14 @@ <div class="form-group"> <label class="col-sm-3 control-label">商品图片(请上传不超过五张图片): </label> <div class="col-sm-2" style="width: 100%;margin-left: 24%;margin-top: 1%"> <div class="avatar-uploader" style="display: flex;"> @for(im in pictures){ <div class="avatar-uploader" style="display: inline-block;"> <div style="margin-right: 16px;position: relative"> <img height="100px" width="100px" src="${im}"> <i class="fa fa-close" onclick="delImg(this)" style="color: red;font-size: 18px;position: absolute;"></i> <i class="el-icon-delete" onclick="delImg(this)" style="color: red;font-size: 18px;position: absolute;left: 0;right: 0;top: 0;bottom: 0"></i> </div> @} <el-upload style="display: inline-block;" :limit="5" class="avatar-uploader" action="/tCouponManage/uploadPic" @@ -71,7 +71,7 @@ :on-remove="handleRemove"> <i class="el-icon-plus"></i> </el-upload> </div> </div> </div> cloud-server-management/src/main/webapp/static/modular/system/tGoods/tGoods.js
@@ -134,7 +134,7 @@ area: ['100%', '100%'], //宽高 fix: false, //不固定 maxmin: true, content: Feng.ctxPath + '/tGoods/tCity_update/' + TPointProducts.seItem.id content: Feng.ctxPath + '/tGoods/goods_info/' + TPointProducts.seItem.id }); this.layerIndex = index; } cloud-server-management/src/main/webapp/static/modular/system/tGoods/tGoods_info.js
@@ -294,6 +294,7 @@ * @param e */ function delImg(e){ $(e).parent().remove(); }