From 9529abd9eaf694f7452f20ad5f3e702d1db2ffd9 Mon Sep 17 00:00:00 2001 From: "yan.y" Date: Sun, 15 Dec 2024 19:58:06 +0800 Subject: [PATCH] update --- admin/pom.xml | 5 + .../admin/config/InitLoadDataService.java | 38 +++- .../orders/controller/CouponsController.java | 186 ++++++++++++++++++ .../controller/OrderMainController.java | 41 +++- .../linln/admin/orders/domain/Coupons.java | 61 ++++++ .../com/linln/admin/orders/domain/Goods.java | 3 + .../admin/orders/domain/OrderDetail.java | 2 + .../linln/admin/orders/domain/OrderMain.java | 11 ++ .../linln/admin/orders/domain/OrderSub.java | 10 +- .../admin/orders/domain/UserServiceAddr.java | 3 + .../orders/repository/CouponsRepository.java | 20 ++ .../admin/orders/service/CouponsService.java | 41 ++++ .../service/impl/CouponsServiceImpl.java | 65 ++++++ .../service/impl/OrderMainServiceImpl.java | 48 ++++- .../admin/orders/validator/CouponsValid.java | 29 +++ .../users/controller/UsersController.java | 25 ++- .../linln/admin/users/domain/UserCoupons.java | 68 +++++++ .../com/linln/admin/users/domain/Users.java | 2 + .../repository/UsersCouponsRepository.java | 27 +++ .../admin/users/service/UsersService.java | 21 +- .../users/service/impl/UsersServiceImpl.java | 69 +++++++ .../templates/orders/coupons/add.html | 89 +++++++++ .../templates/orders/coupons/detail.html | 53 +++++ .../templates/orders/coupons/index.html | 79 ++++++++ .../templates/orders/coupons/send.html | 33 ++++ .../resources/templates/orders/goods/add.html | 7 + .../templates/orders/goods/index.html | 2 + .../templates/orders/orderMain/index.html | 17 +- .../templates/users/users/index.html | 6 + .../templates/users/users/userCoupons.html | 38 ++++ .../component/thymeleaf/utility/DictUtil.java | 32 +++ 31 files changed, 1103 insertions(+), 28 deletions(-) create mode 100644 admin/src/main/java/com/linln/admin/orders/controller/CouponsController.java create mode 100644 admin/src/main/java/com/linln/admin/orders/domain/Coupons.java create mode 100644 admin/src/main/java/com/linln/admin/orders/repository/CouponsRepository.java create mode 100644 admin/src/main/java/com/linln/admin/orders/service/CouponsService.java create mode 100644 admin/src/main/java/com/linln/admin/orders/service/impl/CouponsServiceImpl.java create mode 100644 admin/src/main/java/com/linln/admin/orders/validator/CouponsValid.java create mode 100644 admin/src/main/java/com/linln/admin/users/domain/UserCoupons.java create mode 100644 admin/src/main/java/com/linln/admin/users/repository/UsersCouponsRepository.java create mode 100644 admin/src/main/resources/templates/orders/coupons/add.html create mode 100644 admin/src/main/resources/templates/orders/coupons/detail.html create mode 100644 admin/src/main/resources/templates/orders/coupons/index.html create mode 100644 admin/src/main/resources/templates/orders/coupons/send.html create mode 100644 admin/src/main/resources/templates/users/users/userCoupons.html diff --git a/admin/pom.xml b/admin/pom.xml index b2eeea8..4bcc808 100644 --- a/admin/pom.xml +++ b/admin/pom.xml @@ -51,6 +51,11 @@ fileUpload ${project.version} + + com.alibaba + fastjson + 1.2.68 + diff --git a/admin/src/main/java/com/linln/admin/config/InitLoadDataService.java b/admin/src/main/java/com/linln/admin/config/InitLoadDataService.java index 2f69ca8..b852d40 100644 --- a/admin/src/main/java/com/linln/admin/config/InitLoadDataService.java +++ b/admin/src/main/java/com/linln/admin/config/InitLoadDataService.java @@ -2,6 +2,9 @@ package com.linln.admin.config; import com.linln.admin.orders.domain.*; import com.linln.admin.orders.repository.*; +import com.linln.admin.users.domain.UserCoupons; +import com.linln.admin.users.repository.UsersCouponsRepository; +import com.linln.common.enums.StatusEnum; import lombok.Data; import lombok.extern.slf4j.Slf4j; import org.springframework.boot.availability.ApplicationAvailabilityBean; @@ -11,10 +14,7 @@ import org.springframework.scheduling.annotation.Scheduled; import org.springframework.stereotype.Component; import javax.annotation.Resource; -import java.util.ArrayList; -import java.util.HashMap; -import java.util.List; -import java.util.Map; +import java.util.*; import java.util.stream.Collectors; /** @@ -23,7 +23,6 @@ import java.util.stream.Collectors; * @Date: Created in 22:40 2023/7/3 * @Modified by: */ -@Data @Slf4j @Component public class InitLoadDataService extends ApplicationAvailabilityBean { @@ -33,6 +32,7 @@ public class InitLoadDataService extends ApplicationAvailabilityBean { public static final Map PET_BASE_INFO_MAP = new HashMap<>(); public static final Map> PET_GOODS_MAP = new HashMap<>(); public static final List SERVICE_ADDRS = new ArrayList<>(); + public static final Map COUPONS_MAP = new HashMap<>(); @Resource private PetBaseInfoRepository petBaseInfoRepository; @@ -48,6 +48,13 @@ public class InitLoadDataService extends ApplicationAvailabilityBean { @Resource private ServiceAddrsRepository servicesRepository; + + @Resource + private UsersCouponsRepository usersCouponsRepository; + + @Resource + private CouponsRepository couponsRepository; + @Override public void onApplicationEvent(AvailabilityChangeEvent event) { super.onApplicationEvent(event); @@ -84,11 +91,32 @@ public class InitLoadDataService extends ApplicationAvailabilityBean { List serviceAddrs = servicesRepository.findAll(); SERVICE_ADDRS.clear(); SERVICE_ADDRS.addAll(serviceAddrs); + List couponsList = couponsRepository.findAll(); + COUPONS_MAP.clear(); + COUPONS_MAP.putAll(couponsList.stream().collect(Collectors.toMap(Coupons::getId, coupons -> coupons))); log.info("goods load all as : {}", GOODS_MAP); log.info("petBaseInfos load all as : {}", PET_BASE_INFO_MAP); log.info("carList load all as : {}", CAR_MAP); log.info("petGoodsList load all as : {}", PET_GOODS_MAP); log.info("serviceAddrs load all as : {}", serviceAddrs); } + + /** + * 优惠券过期逻辑 + */ + @Scheduled(cron = "0 0/1 * * * ?") + public void couponsExpire() { + List userCouponsList = usersCouponsRepository.findUserCouponsByLastExpireTimeLessThan(new Date()); + for (UserCoupons userCoupons : userCouponsList) { + userCoupons.setCouponsStatus(3); + } + usersCouponsRepository.saveAllAndFlush(userCouponsList); + List couponsList = couponsRepository.findAllByExpireTimeLessThan(System.currentTimeMillis()); + for (Coupons coupons : couponsList) { + coupons.setStatus(StatusEnum.DELETE.getCode()); + } + couponsRepository.saveAllAndFlush(couponsList); + } + } diff --git a/admin/src/main/java/com/linln/admin/orders/controller/CouponsController.java b/admin/src/main/java/com/linln/admin/orders/controller/CouponsController.java new file mode 100644 index 0000000..3c04ee9 --- /dev/null +++ b/admin/src/main/java/com/linln/admin/orders/controller/CouponsController.java @@ -0,0 +1,186 @@ +package com.linln.admin.orders.controller; + +import cn.hutool.core.collection.ListUtil; +import cn.hutool.core.date.DatePattern; +import cn.hutool.core.date.DateUtil; +import com.linln.admin.config.InitLoadDataService; +import com.linln.admin.orders.domain.Coupons; +import com.linln.admin.orders.service.CouponsService; +import com.linln.admin.orders.validator.CouponsValid; +import com.linln.admin.users.domain.UserCoupons; +import com.linln.admin.users.domain.Users; +import com.linln.admin.users.service.UsersService; +import com.linln.common.enums.StatusEnum; +import com.linln.common.utils.EntityBeanUtil; +import com.linln.common.utils.ResultVoUtil; +import com.linln.common.utils.StatusUtil; +import com.linln.common.vo.ResultVo; +import org.apache.shiro.authz.annotation.RequiresPermissions; +import org.springframework.data.domain.Example; +import org.springframework.data.domain.ExampleMatcher; +import org.springframework.data.domain.Page; +import org.springframework.stereotype.Controller; +import org.springframework.ui.Model; +import org.springframework.validation.annotation.Validated; +import org.springframework.web.bind.annotation.*; + +import java.util.*; +import java.util.stream.Collectors; +import javax.annotation.Resource; + +/** + * @author gion + * @date 2024/08/14 + */ +@Controller +@RequestMapping("/orders/coupons") +public class CouponsController { + + @Resource + private CouponsService couponsService; + + @Resource + private UsersService usersService; + + /** + * 列表页面 + */ + @GetMapping("/index") + @RequiresPermissions("orders:coupons:index") + public String index(Model model, Coupons coupons) { + + // 创建匹配器,进行动态查询匹配 + ExampleMatcher matcher = ExampleMatcher.matching(); + + // 获取数据列表 + Example example = Example.of(coupons, matcher); + Page list = couponsService.getPageList(example); + + // 封装数据 + model.addAttribute("list", list.getContent()); + model.addAttribute("page", list); + return "/orders/coupons/index"; + } + + /** + * 跳转到添加页面 + */ + @GetMapping("/add") + @RequiresPermissions("orders:coupons:add") + public String toAdd() { + return "/orders/coupons/add"; + } + + /** + * 跳转到编辑页面 + */ + @GetMapping("/edit/{id}") + @RequiresPermissions("orders:coupons:edit") + public String toEdit(@PathVariable("id") Coupons coupons, Model model) { + model.addAttribute("coupons", coupons); + return "/orders/coupons/add"; + } + + /** + * 保存添加/修改的数据 + * @param valid 验证对象 + */ + @PostMapping("/save") + @RequiresPermissions({"orders:coupons:add", "orders:coupons:edit"}) + @ResponseBody + public ResultVo save(@Validated CouponsValid valid, Coupons coupons) { + // 复制保留无需修改的数据 + if (coupons.getId() != null) { + Coupons beCoupons = couponsService.getById(coupons.getId()); + EntityBeanUtil.copyProperties(beCoupons, coupons); + } + coupons.setExpireTime(DateUtil.parse(coupons.getExpireTimeStr(), DatePattern.NORM_DATETIME_PATTERN).getTime()); + coupons.setCreateDate(new Date()); + coupons.setCreateTime(new Date()); + // 保存数据 + couponsService.save(coupons); + return ResultVoUtil.SAVE_SUCCESS; + } + + /** + * 跳转到详细页面 + */ + @GetMapping("/detail/{id}") + @RequiresPermissions("orders:coupons:detail") + public String toDetail(@PathVariable("id") Coupons coupons, Model model) { + model.addAttribute("coupons",coupons); + return "/orders/coupons/detail"; + } + + + /** + * 跳转到下发页面 + */ + @GetMapping("/toSend/{id}") + @RequiresPermissions("orders:coupons:edit") + public String toSend(@PathVariable("id") Coupons coupons, Model model) { + model.addAttribute("coupons", coupons); + return "/orders/coupons/send"; + } + + + /** + * 一键下发所有用户 + */ + @RequestMapping("/send") + @RequiresPermissions("orders:coupons:status") + @ResponseBody + public ResultVo send(Coupons couponsParam) { + Coupons coupons = couponsService.getById(couponsParam.getId()); + Date lastExpireTime = DateUtil.offsetDay(new Date(), coupons.getDrawDay()); + if (couponsParam.getSendType() == 1) { + Users users = usersService.getById(couponsParam.getUid()); + usersService.sendUserCoupons(Collections.singletonList(new UserCoupons(users.getId(), coupons.getId().intValue(), 1, lastExpireTime))); + } else { + List allUser = usersService.getAllUser(); + List> lists = ListUtil.split(allUser, 50); + for (List list : lists) { + List userCouponsList = new ArrayList<>(list.size()); + userCouponsList.addAll(list.stream().map(m -> new UserCoupons(m.getId(), coupons.getId().intValue(), 1, lastExpireTime)).collect(Collectors.toList())); + usersService.sendUserCoupons(userCouponsList); + } + } + return ResultVoUtil.success("成功"); + } + /*@RequestMapping("/send") + @RequiresPermissions("orders:coupons:status") + @ResponseBody + public ResultVo send(@RequestParam(value = "ids", required = false) List ids) { + List allUser = usersService.getAllUser(); + List> lists = ListUtil.split(allUser, 50); + for (List list : lists) { + List userCouponsList = new ArrayList<>(list.size() * ids.size()); + for (Long cid : ids) { + Coupons coupons = couponsService.getById(cid); + Date lastExpireTime = DateUtil.offsetDay(new Date(), coupons.getDrawDay()); + userCouponsList.addAll(list.stream().map(m -> new UserCoupons(m.getId(), coupons.getId().intValue(), 1, lastExpireTime)).collect(Collectors.toList())); + } + usersService.sendUserCoupons(userCouponsList); + } + + return ResultVoUtil.success("成功"); + }*/ + + /** + * 设置一条或者多条数据的状态 + */ + @RequestMapping("/status/{param}") + @RequiresPermissions("orders:coupons:status") + @ResponseBody + public ResultVo status( + @PathVariable("param") String param, + @RequestParam(value = "ids", required = false) List ids) { + // 更新状态 + StatusEnum statusEnum = StatusUtil.getStatusEnum(param); + if (couponsService.updateStatus(statusEnum, ids)) { + return ResultVoUtil.success(statusEnum.getMessage() + "成功"); + } else { + return ResultVoUtil.error(statusEnum.getMessage() + "失败,请重新操作"); + } + } +} \ No newline at end of file diff --git a/admin/src/main/java/com/linln/admin/orders/controller/OrderMainController.java b/admin/src/main/java/com/linln/admin/orders/controller/OrderMainController.java index 1e2bd98..f8a3ebf 100644 --- a/admin/src/main/java/com/linln/admin/orders/controller/OrderMainController.java +++ b/admin/src/main/java/com/linln/admin/orders/controller/OrderMainController.java @@ -5,11 +5,14 @@ import cn.hutool.core.date.DatePattern; import cn.hutool.core.date.DateUtil; import cn.hutool.core.util.IdUtil; import cn.hutool.core.util.StrUtil; +import cn.hutool.http.HttpUtil; +import com.alibaba.fastjson.JSONObject; import com.linln.admin.config.InitLoadDataService; import com.linln.admin.orders.domain.*; import com.linln.admin.orders.service.OrderMainService; import com.linln.admin.orders.validator.OrderMainValid; import com.linln.admin.users.service.PetService; +import com.linln.admin.users.service.UsersService; import com.linln.common.enums.StatusEnum; import com.linln.common.utils.EntityBeanUtil; import com.linln.common.utils.ResultVoUtil; @@ -46,6 +49,9 @@ public class OrderMainController { @Resource private PetService petService; + @Resource + private UsersService usersService; + /** * 列表页面 */ @@ -152,6 +158,17 @@ public class OrderMainController { orderMain.setServiceTime(carOrder.getServiceTime()); orderMainService.save(orderMain); if (StrUtil.isNotBlank(carOrder.getAddr())) { + UserServiceAddr userServiceAddrInfo = usersService.getAddrById(carOrder.getAddrId()); + if (!userServiceAddrInfo.getAddr().equals(carOrder.getAddr())) { + String result = HttpUtil.get("https://apis.map.qq.com/ws/geocoder/v1/?address=" + carOrder.getAddr() + "&key=MWWBZ-5YT6Q-LVC5S-4DE4D-ZU7Q6-ECFCL&poi_options=policy=2"); + JSONObject resultJson = JSONObject.parseObject(result); + if (resultJson.getIntValue("status") == 0) { + JSONObject data = resultJson.getJSONObject("result"); + userServiceAddrInfo.setLatitude(data.getJSONObject("location").getString("lat")); + userServiceAddrInfo.setLongitude(data.getJSONObject("location").getString("lng")); + usersService.updateUserServiceAddr(userServiceAddrInfo); + } + } orderMainService.updateUserAddr(carOrder.getAddrId(), carOrder.getAddr()); } return ResultVoUtil.SAVE_SUCCESS; @@ -250,24 +267,37 @@ public class OrderMainController { orderMain.setUid(pet.getUid()); orderMain.setOrderStatus(Byte.valueOf("1")); orderMain.setPayType(Byte.valueOf("1")); - orderMain.setServiceTime(serviceTime); + String formatServiceTime = DateUtil.format(DateUtil.parse(serviceTime, DatePattern.NORM_DATETIME_MINUTE_FORMAT), DatePattern.NORM_DATETIME_MINUTE_FORMAT); + orderMain.setServiceTime(formatServiceTime); orderMain.setServiceAddrId(Long.parseLong(userServiceAddr)); orderMain.setProjectionServiceTime(0); orderMain.setPayTotalAmount(0); orderMain.setTotalAmount(0); orderMain.setPayDiscount(0); orderMain.setPayStatus(Byte.valueOf("0")); - orderMain.setServiceAddrId(Long.parseLong(userServiceAddr)); orderMain.setCreateTime(new Date()); orderMain.setDispatchStatus(Byte.valueOf("0")); } + + + UserServiceAddr userServiceAddrInfo = usersService.getAddrById(Long.parseLong(userServiceAddr)); + + String result = HttpUtil.get("https://apis.map.qq.com/ws/geocoder/v1/?address=" + userServiceAddrInfo.getAddr() + "&key=MWWBZ-5YT6Q-LVC5S-4DE4D-ZU7Q6-ECFCL"); + JSONObject resultJson = JSONObject.parseObject(result); + if (resultJson.getIntValue("status") == 0) { + JSONObject data = resultJson.getJSONObject("result"); + userServiceAddrInfo.setLatitude(data.getJSONObject("location").getString("lat")); + userServiceAddrInfo.setLongitude(data.getJSONObject("location").getString("lng")); + usersService.updateUserServiceAddr(userServiceAddrInfo); + } + + List goodsIds = new ArrayList<>(); goodsIds.addAll(goodsId1); goodsIds.addAll(goodsId2); goodsIds.addAll(goodsId3); goodsIds.addAll(goodsId4); long subOrderId = IdUtil.getSnowflakeNextId(); - List orderDetails = new ArrayList<>(); Integer totalAmount = 0; int projectServiceTime = 0; @@ -302,12 +332,15 @@ public class OrderMainController { orderSub.setPayType(Byte.valueOf("1")); orderSub.setDiscount(100); orderSub.setTotalAmount(totalAmount); - orderSub.setPayAmount(totalAmount); + orderSub.setPayAmount(totalAmount * 10); orderSub.setCreateTime(new Date()); orderSub.setProjectionServiceTime(projectServiceTime); PetBaseInfo petBaseInfo = InitLoadDataService.PET_BASE_INFO_MAP.get(pet.getPetId()); String petInfo = "宠物名称:" + pet.getNickName() + "
品种:" + petBaseInfo.getAssortment() + "
服务项目:" + goodsName; orderSub.setPetInfo(petInfo); + orderSub.setCid(0); + orderSub.setUcid(0); + orderSub.setGoodsDiscountAmount(0); orderMainService.createOrder(orderDetails, orderSub, orderMain); return ResultVoUtil.success("成功"); } diff --git a/admin/src/main/java/com/linln/admin/orders/domain/Coupons.java b/admin/src/main/java/com/linln/admin/orders/domain/Coupons.java new file mode 100644 index 0000000..04927e5 --- /dev/null +++ b/admin/src/main/java/com/linln/admin/orders/domain/Coupons.java @@ -0,0 +1,61 @@ +package com.linln.admin.orders.domain; + +import com.linln.common.enums.StatusEnum; +import lombok.Data; +import org.springframework.data.annotation.LastModifiedDate; +import org.springframework.data.jpa.domain.support.AuditingEntityListener; +import org.springframework.format.annotation.DateTimeFormat; + +import javax.persistence.*; +import java.io.Serializable; +import java.util.Date; + +/** + * @author gion + * @date 2024/08/14 + */ +@Data +@Entity +@Table(name="coupons") +@EntityListeners(AuditingEntityListener.class) +public class Coupons implements Serializable { + // 主键ID + @Id + @GeneratedValue(strategy=GenerationType.IDENTITY) + private Long id; + private String name; + // 有效商品子类型 + private Integer goodsSubType; + // 折扣 + private Integer discount; + // 来源 + private String source; + // 使用限制 + private Integer periodType; + // 使用限制信息 + private String period; + // 过期时间戳 + private Long expireTime; + @Transient + private String expireTimeStr; + // 下发类型 1领取 2新用户注册赠送 3邀请新用户赠送 + private Integer sendStatus; + // 创建时间 + @DateTimeFormat(pattern="yyyy-MM-dd HH:mm:ss") + private Date createTime; + // 创建时间 + @DateTimeFormat(pattern="yyyy-MM-dd HH:mm:ss") + private Date createDate; + // 更新时间 + @LastModifiedDate + private Date updateDate; + // 数据状态 + private Byte status = StatusEnum.OK.getCode(); + // 领取后过期天数 + private Integer drawDay; + + @Transient + private Integer sendType; + @Transient + private Long uid; +} \ No newline at end of file diff --git a/admin/src/main/java/com/linln/admin/orders/domain/Goods.java b/admin/src/main/java/com/linln/admin/orders/domain/Goods.java index f59dfa8..093c70c 100644 --- a/admin/src/main/java/com/linln/admin/orders/domain/Goods.java +++ b/admin/src/main/java/com/linln/admin/orders/domain/Goods.java @@ -53,6 +53,9 @@ public class Goods implements Serializable { // 数据状态 private Byte status = StatusEnum.OK.getCode(); + //商品子类型 1:洗护 2:美容 3:SPA 4:驱虫 5:洁牙 + private Integer goodsSubType; + @Transient private Integer petType; @Transient diff --git a/admin/src/main/java/com/linln/admin/orders/domain/OrderDetail.java b/admin/src/main/java/com/linln/admin/orders/domain/OrderDetail.java index 2921807..4774a32 100644 --- a/admin/src/main/java/com/linln/admin/orders/domain/OrderDetail.java +++ b/admin/src/main/java/com/linln/admin/orders/domain/OrderDetail.java @@ -40,6 +40,8 @@ public class OrderDetail implements Serializable { private Date createDate; @LastModifiedDate private Date updateDate; + + private Integer discountAmount; // 数据状态 private Byte status = StatusEnum.OK.getCode(); } \ No newline at end of file diff --git a/admin/src/main/java/com/linln/admin/orders/domain/OrderMain.java b/admin/src/main/java/com/linln/admin/orders/domain/OrderMain.java index 18ddeb3..be59eeb 100644 --- a/admin/src/main/java/com/linln/admin/orders/domain/OrderMain.java +++ b/admin/src/main/java/com/linln/admin/orders/domain/OrderMain.java @@ -73,6 +73,17 @@ public class OrderMain implements Serializable { @Transient private Integer payAmount; + @Transient + private Integer goodsDiscountAmount; + @Transient + private Integer vipDiscountAmount; + @Transient + private Integer cid; + @Transient + private Integer ucid; + @Transient + private Coupons coupons; + @Transient private List orderSubs; diff --git a/admin/src/main/java/com/linln/admin/orders/domain/OrderSub.java b/admin/src/main/java/com/linln/admin/orders/domain/OrderSub.java index 1806815..17db30c 100644 --- a/admin/src/main/java/com/linln/admin/orders/domain/OrderSub.java +++ b/admin/src/main/java/com/linln/admin/orders/domain/OrderSub.java @@ -12,7 +12,6 @@ import org.springframework.format.annotation.DateTimeFormat; import javax.persistence.*; import java.io.Serializable; import java.util.Date; -import java.util.List; /** * @author gion @@ -67,4 +66,13 @@ public class OrderSub implements Serializable { private String petInfo; + private Integer cid; + private Integer ucid; + + private Integer goodsDiscountAmount; + private Integer goodsOriginAmount; + @Transient + private int vipAmount; + + } \ No newline at end of file diff --git a/admin/src/main/java/com/linln/admin/orders/domain/UserServiceAddr.java b/admin/src/main/java/com/linln/admin/orders/domain/UserServiceAddr.java index 5632e20..1bd1adf 100644 --- a/admin/src/main/java/com/linln/admin/orders/domain/UserServiceAddr.java +++ b/admin/src/main/java/com/linln/admin/orders/domain/UserServiceAddr.java @@ -44,4 +44,7 @@ public class UserServiceAddr implements Serializable { private Date updateDate; // 数据状态 private Byte status = StatusEnum.OK.getCode(); + + private String longitude; + private String latitude; } \ No newline at end of file diff --git a/admin/src/main/java/com/linln/admin/orders/repository/CouponsRepository.java b/admin/src/main/java/com/linln/admin/orders/repository/CouponsRepository.java new file mode 100644 index 0000000..26dda30 --- /dev/null +++ b/admin/src/main/java/com/linln/admin/orders/repository/CouponsRepository.java @@ -0,0 +1,20 @@ +package com.linln.admin.orders.repository; + +import com.linln.admin.orders.domain.Coupons; +import com.linln.modules.system.repository.BaseRepository; + +import java.util.List; + +/** + * @author gion + * @date 2024/08/14 + */ +public interface CouponsRepository extends BaseRepository { + + List findAllByExpireTimeLessThan(long expireTime); + + Coupons findFirstById(long id); + + List findByStatusAndSendStatusAndExpireTimeGreaterThanOrderByExpireTimeAsc(byte status, int sendStatus, long expireTime); + +} \ No newline at end of file diff --git a/admin/src/main/java/com/linln/admin/orders/service/CouponsService.java b/admin/src/main/java/com/linln/admin/orders/service/CouponsService.java new file mode 100644 index 0000000..081980d --- /dev/null +++ b/admin/src/main/java/com/linln/admin/orders/service/CouponsService.java @@ -0,0 +1,41 @@ +package com.linln.admin.orders.service; + +import com.linln.admin.orders.domain.Coupons; +import com.linln.common.enums.StatusEnum; +import org.springframework.data.domain.Example; +import org.springframework.data.domain.Page; +import org.springframework.transaction.annotation.Transactional; + +import java.util.List; + +/** + * @author gion + * @date 2024/08/14 + */ +public interface CouponsService { + + /** + * 获取分页列表数据 + * @param example 查询实例 + * @return 返回分页数据 + */ + Page getPageList(Example example); + + /** + * 根据ID查询数据 + * @param id 主键ID + */ + Coupons getById(Long id); + + /** + * 保存数据 + * @param coupons 实体对象 + */ + Coupons save(Coupons coupons); + + /** + * 状态(启用,冻结,删除)/批量状态处理 + */ + @Transactional(rollbackFor = Exception.class) + Boolean updateStatus(StatusEnum statusEnum, List idList); +} \ No newline at end of file diff --git a/admin/src/main/java/com/linln/admin/orders/service/impl/CouponsServiceImpl.java b/admin/src/main/java/com/linln/admin/orders/service/impl/CouponsServiceImpl.java new file mode 100644 index 0000000..68491b7 --- /dev/null +++ b/admin/src/main/java/com/linln/admin/orders/service/impl/CouponsServiceImpl.java @@ -0,0 +1,65 @@ +package com.linln.admin.orders.service.impl; + +import com.linln.admin.orders.domain.Coupons; +import com.linln.admin.orders.repository.CouponsRepository; +import com.linln.admin.orders.service.CouponsService; +import com.linln.common.data.PageSort; +import com.linln.common.enums.StatusEnum; +import org.springframework.data.domain.Example; +import org.springframework.data.domain.Page; +import org.springframework.data.domain.PageRequest; +import org.springframework.stereotype.Service; +import org.springframework.transaction.annotation.Transactional; + +import java.util.List; +import javax.annotation.Resource; + +/** + * @author gion + * @date 2024/08/14 + */ +@Service +public class CouponsServiceImpl implements CouponsService { + + @Resource + private CouponsRepository couponsRepository; + + /** + * 根据ID查询数据 + * @param id 主键ID + */ + @Override + public Coupons getById(Long id) { + return couponsRepository.findById(id).orElse(null); + } + + /** + * 获取分页列表数据 + * @param example 查询实例 + * @return 返回分页数据 + */ + @Override + public Page getPageList(Example example) { + // 创建分页对象 + PageRequest page = PageSort.pageRequest(); + return couponsRepository.findAll(example, page); + } + + /** + * 保存数据 + * @param coupons 实体对象 + */ + @Override + public Coupons save(Coupons coupons) { + return couponsRepository.save(coupons); + } + + /** + * 状态(启用,冻结,删除)/批量状态处理 + */ + @Override + @Transactional(rollbackFor = Exception.class) + public Boolean updateStatus(StatusEnum statusEnum, List idList) { + return couponsRepository.updateStatus(statusEnum.getCode(), idList) > 0; + } +} \ No newline at end of file diff --git a/admin/src/main/java/com/linln/admin/orders/service/impl/OrderMainServiceImpl.java b/admin/src/main/java/com/linln/admin/orders/service/impl/OrderMainServiceImpl.java index 9eb084d..d41d3c7 100644 --- a/admin/src/main/java/com/linln/admin/orders/service/impl/OrderMainServiceImpl.java +++ b/admin/src/main/java/com/linln/admin/orders/service/impl/OrderMainServiceImpl.java @@ -13,6 +13,7 @@ import com.linln.admin.users.service.UsersAmountRecordsService; import com.linln.admin.users.service.UsersService; import com.linln.common.data.PageSort; import com.linln.common.enums.StatusEnum; +import org.apache.shiro.config.Ini; import org.springframework.data.domain.Example; import org.springframework.data.domain.Page; import org.springframework.data.domain.PageRequest; @@ -103,12 +104,16 @@ public class OrderMainServiceImpl implements OrderMainService { List orderSubs = orderSubRepository.findAllByMainOrderId(orderMain.getOrderId()); orderMain.setOrderSubs(orderSubs); orderMain.setTotalAmount(orderSubs.stream().map(OrderSub::getTotalAmount).reduce(0, Integer::sum)); + + orderMain.setCid(orderSubs.get(0).getCid()); + orderMain.setUcid(orderSubs.get(0).getUcid()); if (orderMain.getPayTotalAmount() != null && orderMain.getPayTotalAmount() > 0) { orderMain.setPayAmount(orderMain.getPayTotalAmount()); } else { orderMain.setPayAmount(orderSubs.stream().map(OrderSub::getPayAmount).filter(Objects::nonNull).reduce(0, Integer::sum)); orderMain.setPayTotalAmount(0); } + int couponsOriginPrice = 0; for (OrderSub orderSub : orderSubs) { OrderDetail exampleOrderDetail = new OrderDetail(); exampleOrderDetail.setSubOrderId(orderSub.getOrderId()); @@ -121,19 +126,35 @@ public class OrderMainServiceImpl implements OrderMainService { str = "、" + orderSub.getGoods(); } orderSub.setGoods(goods.getName() + str); + if (orderSub.getCid() != null && orderSub.getCid() > 0) { + Coupons coupons = InitLoadDataService.COUPONS_MAP.get(orderSub.getCid().longValue()); + if (coupons.getGoodsSubType() != goods.getGoodsSubType()) { + orderSub.setVipAmount(orderSub.getVipAmount() + goods.getPrice()); + } else { + couponsOriginPrice = couponsOriginPrice + goods.getPrice(); + } + orderMain.setCoupons(coupons); + } } String str = ""; if (orderSubs.size() > 1) { str = "

"; } - Optional petOptional = petRepository.findById(orderSub.getPetId()); - if (petOptional.isPresent()) { - Pet pet = petOptional.get(); - PetBaseInfo petBaseInfo = InitLoadDataService.PET_BASE_INFO_MAP.get(pet.getPetId()); - orderSub.setPetInfo("宠物名称:" + pet.getNickName() + "
品种:" + petBaseInfo.getAssortment() + "
服务项目:" + orderSub.getGoods()); - } orderMain.setPetInfos(orderSub.getPetInfo() + str + (orderMain.getPetInfos() == null ? "" : orderMain.getPetInfos())); } + if (orderMain.getPayStatus() == 0 || orderMain.getPayDiscount() == 0) { + orderMain.setVipDiscountAmount(0); + } else { + Integer originPrice = orderSubs.stream().map(OrderSub::getVipAmount).reduce(0, Integer::sum); + int vipDiscountAmount = 0; + if (originPrice > 0) { + vipDiscountAmount = ((orderSubs.stream().map(OrderSub::getGoodsOriginAmount).reduce(0, Integer::sum) * 10) - (int) (originPrice * (orderMain.getPayDiscount() / 100.0) * 10)); + } else { + vipDiscountAmount = ((orderSubs.stream().map(OrderSub::getGoodsOriginAmount).reduce(0, Integer::sum) * 10) - (int) (orderSubs.stream().map(OrderSub::getGoodsOriginAmount).reduce(0, Integer::sum) * (orderMain.getPayDiscount() / 100.0) * 10)); + } + orderMain.setVipDiscountAmount(Math.max(vipDiscountAmount, 0)); + } + orderMain.setGoodsDiscountAmount(couponsOriginPrice * 10 - orderSubs.stream().map(OrderSub::getGoodsDiscountAmount).reduce(0, Integer::sum)); orderMain.setUserServiceAddr("姓名:" + userServiceAddr.getName() + "
联系电话:" + userServiceAddr.getMobile() + "
地址:" + userServiceAddr.getAddr()); } @@ -189,7 +210,6 @@ public class OrderMainServiceImpl implements OrderMainService { usersAmountRecords.setOrderId(orderMain.getOrderId()); usersAmountRecordsService.save(usersAmountRecords); usersService.save(users); - } orderMain.setPayTotalAmount(0); orderMain.setPayStatus((byte) 0); @@ -198,6 +218,10 @@ public class OrderMainServiceImpl implements OrderMainService { List orderSubs = orderSubRepository.findAllByMainOrderId(orderMain.getOrderId()); for (OrderSub orderSub : orderSubs) { orderSub.setOrderStatus(Byte.valueOf("4")); + if (orderSub.getCid() > 0) { + //返还优惠券 + usersService.returnUserCoupons(orderMain.getUid(), orderSub.getCid()); + } } orderSubRepository.saveAll(orderSubs); orderMainRepository.save(orderMain); @@ -330,6 +354,16 @@ public class OrderMainServiceImpl implements OrderMainService { orderMainRepository.save(orderMain); orderSubRepository.saveAll(orderSubs); usersService.save(users); + } else { + UsersAmountRecords usersAmountRecords = new UsersAmountRecords(); + usersAmountRecords.setUserId(users.getId()); + usersAmountRecords.setType(3); + usersAmountRecords.setOriginAmount(0); + usersAmountRecords.setProAmount(discountAmount); + usersAmountRecords.setCurrAmount(0); + usersAmountRecords.setProScene("后台下单"); + usersAmountRecords.setOrderId(orderMain.getOrderId()); + usersAmountRecordsService.save(usersAmountRecords); } } } \ No newline at end of file diff --git a/admin/src/main/java/com/linln/admin/orders/validator/CouponsValid.java b/admin/src/main/java/com/linln/admin/orders/validator/CouponsValid.java new file mode 100644 index 0000000..a8e9697 --- /dev/null +++ b/admin/src/main/java/com/linln/admin/orders/validator/CouponsValid.java @@ -0,0 +1,29 @@ +package com.linln.admin.orders.validator; + +import lombok.Data; + +import java.io.Serializable; +import javax.validation.constraints.NotEmpty; +import javax.validation.constraints.NotNull; + +/** + * @author gion + * @date 2024/08/14 + */ +@Data +public class CouponsValid implements Serializable { + @NotEmpty(message = "优惠券名称不能为空") + private String name; + @NotNull(message = "有效商品子类型不能为空") + private Integer goodsSubType; + @NotNull(message = "折扣不能为空") + private Integer discount; + @NotEmpty(message = "来源不能为空") + private String source; + @NotNull(message = "使用限制不能为空") + private Integer periodType; + @NotNull(message = "过期时间不能为空") + private String expireTimeStr; + @NotNull(message = "下发类型不能为空") + private Integer sendStatus; +} \ No newline at end of file diff --git a/admin/src/main/java/com/linln/admin/users/controller/UsersController.java b/admin/src/main/java/com/linln/admin/users/controller/UsersController.java index deeb4ff..a8883f2 100644 --- a/admin/src/main/java/com/linln/admin/users/controller/UsersController.java +++ b/admin/src/main/java/com/linln/admin/users/controller/UsersController.java @@ -1,10 +1,13 @@ package com.linln.admin.users.controller; +import cn.hutool.core.date.DateUtil; import cn.hutool.core.lang.UUID; import cn.hutool.core.util.IdUtil; import com.linln.admin.config.InitLoadDataService; +import com.linln.admin.orders.domain.Coupons; import com.linln.admin.orders.domain.Goods; import com.linln.admin.orders.domain.Pet; +import com.linln.admin.users.domain.UserCoupons; import com.linln.admin.users.domain.Users; import com.linln.admin.users.domain.UsersAmountRecords; import com.linln.admin.users.service.PetService; @@ -30,10 +33,8 @@ import org.springframework.ui.Model; import org.springframework.validation.annotation.Validated; import org.springframework.web.bind.annotation.*; -import java.util.ArrayList; -import java.util.List; -import java.util.Map; -import java.util.TreeMap; +import java.util.*; +import java.util.stream.Collectors; /** * @author gion @@ -131,6 +132,7 @@ public class UsersController { goodsList.addAll(goodsList5); } for (Goods goods : goodsList) { + if (goods == null) continue; if (goodsMap.containsKey(goods.getGoodsType())) { goodsMap.get(goods.getGoodsType()).add(goods); } else { @@ -150,6 +152,18 @@ public class UsersController { return "/users/users/petInfos"; } + + + /** + * 跳转到宠物信息页面 + */ + @GetMapping("/toCouponsInfos/{id}") + @RequiresPermissions("users:users:add") + public String toCouponsInfos(@PathVariable("id") Users users, Model model) { + List userCouponsList = usersService.getUserCouponsList(users.getId()); + model.addAttribute("userCouponsList", userCouponsList); + return "/users/users/userCoupons"; + } /** * 跳转到编辑页面 */ @@ -215,6 +229,9 @@ public class UsersController { usersAmountRecordsService.save(usersAmountRecords); User user = ShiroUtil.getSubject(); log.info("充值\t用户 : {}\t充值前金额 : {}\t充值金额 : {}\t充值后金额 : {}\t操作用户 : {}", user.getId(), amount, payAmount, payedAmount, user.getId()); + List rechargeCoupons = usersService.findRechargeCoupons(); + Users finalUsers = users; + usersService.sendUserCoupons(rechargeCoupons.stream().map(m -> new UserCoupons(finalUsers.getId(), m.getId().intValue(), 1, DateUtil.offsetDay(new Date(), m.getDrawDay()))).collect(Collectors.toList())); return ResultVoUtil.SAVE_SUCCESS; } diff --git a/admin/src/main/java/com/linln/admin/users/domain/UserCoupons.java b/admin/src/main/java/com/linln/admin/users/domain/UserCoupons.java new file mode 100644 index 0000000..e1b5711 --- /dev/null +++ b/admin/src/main/java/com/linln/admin/users/domain/UserCoupons.java @@ -0,0 +1,68 @@ +package com.linln.admin.users.domain; + +import com.linln.admin.orders.domain.Coupons; +import com.linln.common.enums.StatusEnum; +import com.linln.common.utils.StatusUtil; +import lombok.Data; +import org.hibernate.annotations.Where; +import org.springframework.data.annotation.CreatedDate; +import org.springframework.data.annotation.LastModifiedDate; +import org.springframework.data.jpa.domain.support.AuditingEntityListener; +import org.springframework.format.annotation.DateTimeFormat; + +import javax.persistence.*; +import java.util.Date; + +/** + * @author: yan.y + * @Description: + * @Date: Created in 16:40 2024/8/14 + * @Modified by: + */ +@Data +@Entity +@Table(name="user_coupons") +@EntityListeners(AuditingEntityListener.class) +@Where(clause = StatusUtil.NOT_DELETE) +public class UserCoupons { + + // 主键ID + @Id + @GeneratedValue(strategy=GenerationType.IDENTITY) + private Integer id; + + private Long uid; + + private Integer cid; + + //状态 1未使用 2已使用 3已过期 + private Integer couponsStatus; + + // 订单创建时间 + @DateTimeFormat(pattern="yyyy-MM-dd HH:mm:ss") + private Date createTime; + @CreatedDate + private Date createDate; + @LastModifiedDate + private Date updateDate; + private Date updateTime; + // 数据状态 + private Byte status = StatusEnum.OK.getCode(); + + // 最后过期时间 + @DateTimeFormat(pattern="yyyy-MM-dd HH:mm:ss") + private Date lastExpireTime; + + @Transient + private Coupons coupons; + + public UserCoupons() { + } + + public UserCoupons(Long uid, Integer cid, Integer couponsStatus, Date lastExpireTime) { + this.uid = uid; + this.cid = cid; + this.couponsStatus = couponsStatus; + this.lastExpireTime = lastExpireTime; + } +} diff --git a/admin/src/main/java/com/linln/admin/users/domain/Users.java b/admin/src/main/java/com/linln/admin/users/domain/Users.java index 7630dcc..fd75405 100644 --- a/admin/src/main/java/com/linln/admin/users/domain/Users.java +++ b/admin/src/main/java/com/linln/admin/users/domain/Users.java @@ -57,6 +57,8 @@ public class Users implements Serializable { @LastModifiedDate private Date updateDate; + private Long inviteUserId; + private Byte status = StatusEnum.OK.getCode(); @Transient diff --git a/admin/src/main/java/com/linln/admin/users/repository/UsersCouponsRepository.java b/admin/src/main/java/com/linln/admin/users/repository/UsersCouponsRepository.java new file mode 100644 index 0000000..94f2ccc --- /dev/null +++ b/admin/src/main/java/com/linln/admin/users/repository/UsersCouponsRepository.java @@ -0,0 +1,27 @@ +package com.linln.admin.users.repository; + +import com.linln.admin.users.domain.UserCoupons; +import com.linln.modules.system.repository.BaseRepository; +import org.springframework.data.jpa.repository.Query; + +import java.util.Date; +import java.util.List; + +/** + * @author gion + * @date 2024/04/28 + */ +public interface UsersCouponsRepository extends BaseRepository { + + List findUserCouponsByLastExpireTimeLessThan(Date date); + + List findUserCouponsByUidAndCidAndCouponsStatusOrderByUpdateTimeDesc(long uid, int cid, int couponsStatus); + + List findUserCouponsByUid(long uid); + + List findUserCouponsByUidIn(List uids); + + @Query(nativeQuery = true, value = "select uid from user_coupons where cid = :cid and coupons_status = 1 group by uid,cid having count(1) > 0") + List findUserCouponsGtCidCount(int cid); + +} \ No newline at end of file diff --git a/admin/src/main/java/com/linln/admin/users/service/UsersService.java b/admin/src/main/java/com/linln/admin/users/service/UsersService.java index 9887793..3f4793b 100644 --- a/admin/src/main/java/com/linln/admin/users/service/UsersService.java +++ b/admin/src/main/java/com/linln/admin/users/service/UsersService.java @@ -1,7 +1,8 @@ package com.linln.admin.users.service; -import com.linln.admin.orders.domain.ServiceAddrs; +import com.linln.admin.orders.domain.Coupons; import com.linln.admin.orders.domain.UserServiceAddr; +import com.linln.admin.users.domain.UserCoupons; import com.linln.admin.users.domain.Users; import com.linln.common.enums.StatusEnum; import org.springframework.data.domain.Example; @@ -46,4 +47,22 @@ public interface UsersService { void updateAmountAndDiscount(long id, long discount, int amount); List getUserAddrList(long uid); + + UserServiceAddr getAddrById(long userServerAddrId); + + List getAllUser(); + + void sendUserCoupons(List userCoupons); + + void returnUserCoupons(long id, int cid); + + List getUserCouponsList(long uid); + + List getUserCouponsList(List uids); + + List getUserCouponsGtCid(int cid); + + void updateUserServiceAddr(UserServiceAddr userServiceAddr); + + List findRechargeCoupons(); } \ No newline at end of file diff --git a/admin/src/main/java/com/linln/admin/users/service/impl/UsersServiceImpl.java b/admin/src/main/java/com/linln/admin/users/service/impl/UsersServiceImpl.java index 0b80430..3c9eaf8 100644 --- a/admin/src/main/java/com/linln/admin/users/service/impl/UsersServiceImpl.java +++ b/admin/src/main/java/com/linln/admin/users/service/impl/UsersServiceImpl.java @@ -1,8 +1,14 @@ package com.linln.admin.users.service.impl; +import com.linln.admin.orders.domain.Coupons; +import com.linln.admin.orders.domain.ServiceAddrs; import com.linln.admin.orders.domain.UserServiceAddr; +import com.linln.admin.orders.repository.CouponsRepository; +import com.linln.admin.orders.repository.ServiceAddrsRepository; import com.linln.admin.orders.repository.UserServiceAddrRepository; +import com.linln.admin.users.domain.UserCoupons; import com.linln.admin.users.domain.Users; +import com.linln.admin.users.repository.UsersCouponsRepository; import com.linln.admin.users.repository.UsersRepository; import com.linln.admin.users.service.UsersService; import com.linln.common.data.PageSort; @@ -31,6 +37,15 @@ public class UsersServiceImpl implements UsersService { @Resource private UserServiceAddrRepository userServiceAddrRepository; + @Resource + private UsersCouponsRepository usersCouponsRepository; + + @Resource + private CouponsRepository couponsRepository; + + @Resource + private ServiceAddrsRepository serviceAddrsRepository; + /** * 根据ID查询数据 * @param id 主键ID @@ -81,4 +96,58 @@ public class UsersServiceImpl implements UsersService { userServiceAddrFind.setUid(uid); return userServiceAddrRepository.findAll(Example.of(userServiceAddrFind)); } + + @Override + public UserServiceAddr getAddrById(long userServerAddrId) { + return userServiceAddrRepository.getById(userServerAddrId); + } + + @Override + public List getAllUser() { + return usersRepository.findAll(); + } + + @Override + public void sendUserCoupons(List userCoupons) { + usersCouponsRepository.saveAllAndFlush(userCoupons); + } + + @Override + public void returnUserCoupons(long id, int cid) { + List userCouponsList = usersCouponsRepository.findUserCouponsByUidAndCidAndCouponsStatusOrderByUpdateTimeDesc(id, cid, 2); + if (!userCouponsList.isEmpty()) { + UserCoupons userCoupons = userCouponsList.get(0); + userCoupons.setCouponsStatus(1); + usersCouponsRepository.saveAndFlush(userCoupons); + } + } + + @Override + public List getUserCouponsList(long uid) { + List userCouponsList = usersCouponsRepository.findUserCouponsByUid(uid); + for (UserCoupons userCoupons : userCouponsList) { + userCoupons.setCoupons(couponsRepository.findFirstById(userCoupons.getCid().longValue())); + } + return userCouponsList; + } + + @Override + public List getUserCouponsList(List uids) { + return usersCouponsRepository.findUserCouponsByUidIn(uids); + } + + @Override + public List getUserCouponsGtCid(int cid) { + return usersCouponsRepository.findUserCouponsGtCidCount(cid); + } + + @Override + public void updateUserServiceAddr(UserServiceAddr userServiceAddr) { + userServiceAddrRepository.save(userServiceAddr); + } + + @Override + public List findRechargeCoupons() { + return couponsRepository.findByStatusAndSendStatusAndExpireTimeGreaterThanOrderByExpireTimeAsc((byte) 1, 4, System.currentTimeMillis()); + } } \ No newline at end of file diff --git a/admin/src/main/resources/templates/orders/coupons/add.html b/admin/src/main/resources/templates/orders/coupons/add.html new file mode 100644 index 0000000..2db804c --- /dev/null +++ b/admin/src/main/resources/templates/orders/coupons/add.html @@ -0,0 +1,89 @@ + + + + + +
+
+ +
+ +
+ +
+
+ +
+ +
+ +
+
+
+ +
+ +
+
+
+ +
+ +
+
+
+ +
+
+ +
+
+
+
+ +
+ +
+
+
+ +
+ +
+
+
+ +
+
+ +
+
+
+
+ +
+ +
+
+
+ + +
+
+
+ + + + \ No newline at end of file diff --git a/admin/src/main/resources/templates/orders/coupons/detail.html b/admin/src/main/resources/templates/orders/coupons/detail.html new file mode 100644 index 0000000..5eb9fbb --- /dev/null +++ b/admin/src/main/resources/templates/orders/coupons/detail.html @@ -0,0 +1,53 @@ + + + + + +
+
基本信息
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
主键ID优惠券名称
有效商品子类型折扣
来源使用限制
使用限制信息过期时间戳
下发类型创建时间
更新时间
+
+ + + \ No newline at end of file diff --git a/admin/src/main/resources/templates/orders/coupons/index.html b/admin/src/main/resources/templates/orders/coupons/index.html new file mode 100644 index 0000000..34d28ce --- /dev/null +++ b/admin/src/main/resources/templates/orders/coupons/index.html @@ -0,0 +1,79 @@ + + + + + +
+
+ 优惠券管理 + +
+
+
+
+ +
+ +
+
启用
+
冻结
+
删除
+
+
+
+
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + 优惠券ID优惠券名称有效商品子类型折扣来源使用限制使用限制信息可领取过期时间下发类型领取后过期天数创建时间操作
优惠券ID优惠券名称有效商品子类型(子类型商品可使用)折扣(10-100)来源使用限制使用限制信息过期时间下发类型领取后过期天数创建时间 + + 下发优惠券 + 编辑 + 删除 +
+
+
+
+
+ + + \ No newline at end of file diff --git a/admin/src/main/resources/templates/orders/coupons/send.html b/admin/src/main/resources/templates/orders/coupons/send.html new file mode 100644 index 0000000..c513630 --- /dev/null +++ b/admin/src/main/resources/templates/orders/coupons/send.html @@ -0,0 +1,33 @@ + + + + + +
+
+ +
+ +
+ +
+
+
+ +
+ +
+
+ +
+ + +
+
+
+ + + \ No newline at end of file diff --git a/admin/src/main/resources/templates/orders/goods/add.html b/admin/src/main/resources/templates/orders/goods/add.html index 59da4be..7884ad0 100644 --- a/admin/src/main/resources/templates/orders/goods/add.html +++ b/admin/src/main/resources/templates/orders/goods/add.html @@ -20,6 +20,13 @@ mo-selected="${goods?.goodsType}"> +
+ +
+ +
+
diff --git a/admin/src/main/resources/templates/orders/goods/index.html b/admin/src/main/resources/templates/orders/goods/index.html index 7b9efa6..961f32c 100644 --- a/admin/src/main/resources/templates/orders/goods/index.html +++ b/admin/src/main/resources/templates/orders/goods/index.html @@ -42,6 +42,7 @@ 商品ID 商品名称 商品类型 + 商品子类型 商品服务时间 商品价格 是否可购买多个 @@ -55,6 +56,7 @@ 商品ID 商品名称 商品类型 + 商品子类型 商品服务时间 商品价格 是否可购买多个 diff --git a/admin/src/main/resources/templates/orders/orderMain/index.html b/admin/src/main/resources/templates/orders/orderMain/index.html index dad2f29..b2bced3 100644 --- a/admin/src/main/resources/templates/orders/orderMain/index.html +++ b/admin/src/main/resources/templates/orders/orderMain/index.html @@ -83,8 +83,11 @@ 支付类型 总金额 支付金额 - 会员折扣支付金额 - 折扣 + 会员折扣金额 + 会员折扣 + 优惠券折扣金额 + 优惠券ID + 优惠券名称 订单ID @@ -112,12 +115,14 @@ 付款状态 支付类型 总金额 - 支付金额 - 会员折扣支付金额 - 折扣 + 支付金额 + 会员折扣金额 + 会员折扣 + 优惠券折扣金额 + 优惠券ID + 优惠券名称 订单ID -