This commit is contained in:
yan.y 2024-12-15 19:58:06 +08:00
parent 9f91bff410
commit 9529abd9ea
31 changed files with 1103 additions and 28 deletions

View File

@ -51,6 +51,11 @@
<artifactId>fileUpload</artifactId>
<version>${project.version}</version>
</dependency>
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>fastjson</artifactId>
<version>1.2.68</version>
</dependency>
</dependencies>
<build>

View File

@ -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<Long, PetBaseInfo> PET_BASE_INFO_MAP = new HashMap<>();
public static final Map<String, List<Goods>> PET_GOODS_MAP = new HashMap<>();
public static final List<ServiceAddrs> SERVICE_ADDRS = new ArrayList<>();
public static final Map<Long, Coupons> 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> serviceAddrs = servicesRepository.findAll();
SERVICE_ADDRS.clear();
SERVICE_ADDRS.addAll(serviceAddrs);
List<Coupons> 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<UserCoupons> userCouponsList = usersCouponsRepository.findUserCouponsByLastExpireTimeLessThan(new Date());
for (UserCoupons userCoupons : userCouponsList) {
userCoupons.setCouponsStatus(3);
}
usersCouponsRepository.saveAllAndFlush(userCouponsList);
List<Coupons> couponsList = couponsRepository.findAllByExpireTimeLessThan(System.currentTimeMillis());
for (Coupons coupons : couponsList) {
coupons.setStatus(StatusEnum.DELETE.getCode());
}
couponsRepository.saveAllAndFlush(couponsList);
}
}

View File

@ -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<Coupons> example = Example.of(coupons, matcher);
Page<Coupons> 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<Users> allUser = usersService.getAllUser();
List<List<Users>> lists = ListUtil.split(allUser, 50);
for (List<Users> list : lists) {
List<UserCoupons> 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<Long> ids) {
List<Users> allUser = usersService.getAllUser();
List<List<Users>> lists = ListUtil.split(allUser, 50);
for (List<Users> list : lists) {
List<UserCoupons> 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<Long> ids) {
// 更新状态
StatusEnum statusEnum = StatusUtil.getStatusEnum(param);
if (couponsService.updateStatus(statusEnum, ids)) {
return ResultVoUtil.success(statusEnum.getMessage() + "成功");
} else {
return ResultVoUtil.error(statusEnum.getMessage() + "失败,请重新操作");
}
}
}

View File

@ -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<String> goodsIds = new ArrayList<>();
goodsIds.addAll(goodsId1);
goodsIds.addAll(goodsId2);
goodsIds.addAll(goodsId3);
goodsIds.addAll(goodsId4);
long subOrderId = IdUtil.getSnowflakeNextId();
List<OrderDetail> 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() + "</br>品种:" + petBaseInfo.getAssortment() + "</br>服务项目:" + goodsName;
orderSub.setPetInfo(petInfo);
orderSub.setCid(0);
orderSub.setUcid(0);
orderSub.setGoodsDiscountAmount(0);
orderMainService.createOrder(orderDetails, orderSub, orderMain);
return ResultVoUtil.success("成功");
}

View File

@ -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;
}

View File

@ -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

View File

@ -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();
}

View File

@ -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<OrderSub> orderSubs;

View File

@ -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;
}

View File

@ -44,4 +44,7 @@ public class UserServiceAddr implements Serializable {
private Date updateDate;
// 数据状态
private Byte status = StatusEnum.OK.getCode();
private String longitude;
private String latitude;
}

View File

@ -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<Coupons, Long> {
List<Coupons> findAllByExpireTimeLessThan(long expireTime);
Coupons findFirstById(long id);
List<Coupons> findByStatusAndSendStatusAndExpireTimeGreaterThanOrderByExpireTimeAsc(byte status, int sendStatus, long expireTime);
}

View File

@ -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<Coupons> getPageList(Example<Coupons> example);
/**
* 根据ID查询数据
* @param id 主键ID
*/
Coupons getById(Long id);
/**
* 保存数据
* @param coupons 实体对象
*/
Coupons save(Coupons coupons);
/**
* 状态(启用冻结删除)/批量状态处理
*/
@Transactional(rollbackFor = Exception.class)
Boolean updateStatus(StatusEnum statusEnum, List<Long> idList);
}

View File

@ -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<Coupons> getPageList(Example<Coupons> 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<Long> idList) {
return couponsRepository.updateStatus(statusEnum.getCode(), idList) > 0;
}
}

View File

@ -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<OrderSub> 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 = "<br><br>";
}
Optional<Pet> 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() + "<br>品种:" + petBaseInfo.getAssortment() + "<br>服务项目:" + 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() + "<br>联系电话:" + userServiceAddr.getMobile() + "<br>地址:" + 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<OrderSub> 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);
}
}
}

View File

@ -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;
}

View File

@ -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<UserCoupons> 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<Coupons> 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;
}

View File

@ -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;
}
}

View File

@ -57,6 +57,8 @@ public class Users implements Serializable {
@LastModifiedDate
private Date updateDate;
private Long inviteUserId;
private Byte status = StatusEnum.OK.getCode();
@Transient

View File

@ -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<UserCoupons, Integer> {
List<UserCoupons> findUserCouponsByLastExpireTimeLessThan(Date date);
List<UserCoupons> findUserCouponsByUidAndCidAndCouponsStatusOrderByUpdateTimeDesc(long uid, int cid, int couponsStatus);
List<UserCoupons> findUserCouponsByUid(long uid);
List<UserCoupons> findUserCouponsByUidIn(List<Long> 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<Long> findUserCouponsGtCidCount(int cid);
}

View File

@ -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<UserServiceAddr> getUserAddrList(long uid);
UserServiceAddr getAddrById(long userServerAddrId);
List<Users> getAllUser();
void sendUserCoupons(List<UserCoupons> userCoupons);
void returnUserCoupons(long id, int cid);
List<UserCoupons> getUserCouponsList(long uid);
List<UserCoupons> getUserCouponsList(List<Long> uids);
List<Long> getUserCouponsGtCid(int cid);
void updateUserServiceAddr(UserServiceAddr userServiceAddr);
List<Coupons> findRechargeCoupons();
}

View File

@ -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<Users> getAllUser() {
return usersRepository.findAll();
}
@Override
public void sendUserCoupons(List<UserCoupons> userCoupons) {
usersCouponsRepository.saveAllAndFlush(userCoupons);
}
@Override
public void returnUserCoupons(long id, int cid) {
List<UserCoupons> userCouponsList = usersCouponsRepository.findUserCouponsByUidAndCidAndCouponsStatusOrderByUpdateTimeDesc(id, cid, 2);
if (!userCouponsList.isEmpty()) {
UserCoupons userCoupons = userCouponsList.get(0);
userCoupons.setCouponsStatus(1);
usersCouponsRepository.saveAndFlush(userCoupons);
}
}
@Override
public List<UserCoupons> getUserCouponsList(long uid) {
List<UserCoupons> userCouponsList = usersCouponsRepository.findUserCouponsByUid(uid);
for (UserCoupons userCoupons : userCouponsList) {
userCoupons.setCoupons(couponsRepository.findFirstById(userCoupons.getCid().longValue()));
}
return userCouponsList;
}
@Override
public List<UserCoupons> getUserCouponsList(List<Long> uids) {
return usersCouponsRepository.findUserCouponsByUidIn(uids);
}
@Override
public List<Long> getUserCouponsGtCid(int cid) {
return usersCouponsRepository.findUserCouponsGtCidCount(cid);
}
@Override
public void updateUserServiceAddr(UserServiceAddr userServiceAddr) {
userServiceAddrRepository.save(userServiceAddr);
}
@Override
public List<Coupons> findRechargeCoupons() {
return couponsRepository.findByStatusAndSendStatusAndExpireTimeGreaterThanOrderByExpireTimeAsc((byte) 1, 4, System.currentTimeMillis());
}
}

View File

@ -0,0 +1,89 @@
<!DOCTYPE html>
<html xmlns:th="http://www.thymeleaf.org">
<head th:replace="/common/template :: header(~{::title},~{::link},~{::style})">
</head>
<body>
<div class="layui-form timo-compile">
<form th:action="@{/orders/coupons/save}">
<input type="hidden" name="id" th:if="${coupons}" th:value="${coupons.id}">
<div class="layui-form-item">
<label class="layui-form-label">优惠券名称</label>
<div class="layui-input-inline">
<input class="layui-input" type="text" name="name" placeholder="请输入优惠券名称" th:value="${coupons?.name}">
</div>
</div>
<div class="layui-form-item">
<label class="layui-form-label">有效商品子类型(子类型商品可使用)</label>
<div class="layui-input-inline">
<select class="timo-search-select" name="goodsSubType" mo:dict="GOODS_SUB_TYPE"
mo-selected="${coupons?.goodsSubType}"></select>
</div>
</div>
<div class="layui-form-item">
<label class="layui-form-label">折扣10-100</label>
<div class="layui-input-inline">
<input class="layui-input" type="text" name="discount" placeholder="请输入折扣" th:value="${coupons?.discount}">
</div>
</div>
<div class="layui-form-item">
<label class="layui-form-label">来源</label>
<div class="layui-input-inline">
<input class="layui-input" type="text" name="source" placeholder="请输入来源" th:value="${coupons?.source}">
</div>
</div>
<div class="layui-form-item">
<label class="layui-form-label">使用限制</label>
<div class="layui-input-inline">
<div class="layui-input-inline">
<select class="timo-search-select" name="periodType" mo:dict="PERIOD_TYPE"
mo-selected="${coupons?.periodType}"></select>
</div>
</div>
</div>
<div class="layui-form-item">
<label class="layui-form-label">使用限制信息</label>
<div class="layui-input-inline">
<input class="layui-input" type="text" name="period" placeholder="请输入使用限制信息" th:value="${coupons?.period}">
</div>
</div>
<div class="layui-form-item">
<label class="layui-form-label">领取过期时间</label>
<div class="layui-input-inline">
<input class="layui-input" type="text" id="expireTime" name="expireTimeStr" placeholder="请输入过期时间" th:value="${coupons?.expireTimeStr}">
</div>
</div>
<div class="layui-form-item">
<label class="layui-form-label">下发类型</label>
<div class="layui-input-inline">
<div class="layui-input-inline">
<select class="timo-search-select" name="sendStatus" mo:dict="COUPONS_SEND_STATUS"
mo-selected="${coupons?.sendStatus}"></select>
</div>
</div>
</div>
<div class="layui-form-item">
<label class="layui-form-label">领取后过期天数</label>
<div class="layui-input-inline">
<input class="layui-input" type="text" name="drawDay" placeholder="领取后过期天数" th:value="${coupons?.drawDay}">
</div>
</div>
<div class="layui-form-item timo-finally">
<button class="layui-btn ajax-submit"><i class="fa fa-check-circle"></i> 保存</button>
<button class="layui-btn btn-secondary close-popup"><i class="fa fa-times-circle"></i> 关闭</button>
</div>
</form>
</div>
<script th:replace="/common/template :: script"></script>
<script>
layui.use(['laydate'], function () {
var laydate = layui.laydate;
// 渲染
laydate.render({
elem: '#expireTime',
type: 'datetime'
});
})
</script>
</body>
</html>

View File

@ -0,0 +1,53 @@
<!DOCTYPE html>
<html xmlns:th="http://www.thymeleaf.org">
<head th:replace="/common/template :: header(~{::title},~{::link},~{::style})">
</head>
<body>
<div class="timo-detail-page">
<div class="timo-detail-title">基本信息</div>
<table class="layui-table timo-detail-table">
<colgroup>
<col width="100px"><col>
<col width="100px"><col>
</colgroup>
<tbody>
<tr>
<th>主键ID</th>
<td th:text="${coupons.id}"></td>
<th>优惠券名称</th>
<td th:text="${coupons.name}"></td>
</tr>
<tr>
<th>有效商品子类型</th>
<td th:text="${coupons.goodsSubType}"></td>
<th>折扣</th>
<td th:text="${coupons.discount}"></td>
</tr>
<tr>
<th>来源</th>
<td th:text="${coupons.source}"></td>
<th>使用限制</th>
<td th:text="${coupons.periodType}"></td>
</tr>
<tr>
<th>使用限制信息</th>
<td th:text="${coupons.period}"></td>
<th>过期时间戳</th>
<td th:text="${coupons.expireTime}"></td>
</tr>
<tr>
<th>下发类型</th>
<td th:text="${coupons.sendStatus}"></td>
<th>创建时间</th>
<td th:text="${coupons.createTime}"></td>
</tr>
<tr>
<th>更新时间</th>
<td th:text="${#dates.format(coupons.updateDate, 'yyyy-MM-dd HH:mm:ss')}" colspan="3"></td>
</tr>
</tbody>
</table>
</div>
<script th:replace="/common/template :: script"></script>
</body>
</html>

View File

@ -0,0 +1,79 @@
<!DOCTYPE html>
<html xmlns:th="http://www.thymeleaf.org"
xmlns:mo="http://www.thymeleaf.org">
<head th:replace="/common/template :: header(~{::title},~{::link},~{::style})">
</head>
<body class="timo-layout-page">
<div class="layui-card">
<div class="layui-card-header timo-card-header">
<span><i class="fa fa-bars"></i> 优惠券管理</span>
<i class="layui-icon layui-icon-refresh refresh-btn"></i>
</div>
<div class="layui-card-body">
<div class="layui-row timo-card-screen">
<div class="pull-right screen-btn-group">
<button class="layui-btn open-popup" data-title="添加优惠券" th:attr="data-url=@{/orders/coupons/add}" data-size="auto">
<i class="fa fa-plus"></i> 添加</button>
<div class="btn-group">
<button class="layui-btn">操作<span class="caret"></span></button>
<dl class="layui-nav-child layui-anim layui-anim-upbit">
<dd><a class="ajax-status" th:href="@{/orders/coupons/status/ok}">启用</a></dd>
<dd><a class="ajax-status" th:href="@{/orders/coupons/status/freezed}">冻结</a></dd>
<dd><a class="ajax-status" th:href="@{/orders/coupons/status/delete}">删除</a></dd>
</dl>
</div>
</div>
</div>
<div class="timo-table-wrap">
<table class="layui-table timo-table">
<thead>
<tr>
<th class="timo-table-checkbox">
<label class="timo-checkbox"><input type="checkbox">
<i class="layui-icon layui-icon-ok"></i></label>
</th>
<th>优惠券ID</th>
<th>优惠券名称</th>
<th>有效商品子类型</th>
<th>折扣</th>
<th>来源</th>
<th>使用限制</th>
<th>使用限制信息</th>
<th>可领取过期时间</th>
<th>下发类型</th>
<th>领取后过期天数</th>
<th>创建时间</th>
<th>操作</th>
</tr>
</thead>
<tbody>
<tr th:each="item:${list}">
<td><label class="timo-checkbox"><input type="checkbox" th:value="${item.id}">
<i class="layui-icon layui-icon-ok"></i></label></td>
<td th:text="${item.id}">优惠券ID</td>
<td th:text="${item.name}">优惠券名称</td>
<td th:text="${#dicts.goodsSubType(item.goodsSubType)}">有效商品子类型(子类型商品可使用)</td>
<td th:text="${item.discount}">折扣10-100</td>
<td th:text="${item.source}">来源</td>
<td th:text="${#dicts.periodType(item.periodType)}">使用限制</td>
<td th:text="${item.period}">使用限制信息</td>
<td th:text="${#dates.format(new java.util.Date(item.expireTime), 'yyyy-MM-dd HH:mm:ss')}">过期时间</td>
<td th:text="${#dicts.couponsSendStatus(item.sendStatus)}">下发类型</td>
<td th:text="${item.drawDay}">领取后过期天数</td>
<td th:text="${item.createTime}">创建时间</td>
<td>
<!-- <a class="ajax-get" data-msg="一键下发所有用户" th:href="@{/orders/coupons/send(ids=${item.id})}">一键下发</a>&nbsp;&nbsp;-->
<a class="open-popup" data-title="下发优惠券" th:if="${item.sendStatus == 5}" th:attr="data-url=@{'/orders/coupons/toSend/'+${item.id}}" data-size="auto" href="#">下发优惠券</a>
<a class="open-popup" data-title="编辑优惠券" th:attr="data-url=@{'/orders/coupons/edit/'+${item.id}}" data-size="auto" href="#">编辑</a>
<a class="ajax-get" data-msg="您是否确认删除" th:href="@{/orders/coupons/status/delete(ids=${item.id})}">删除</a>
</td>
</tr>
</tbody>
</table>
</div>
<div th:replace="/common/fragment :: page"></div>
</div>
</div>
<script th:replace="/common/template :: script"></script>
</body>
</html>

View File

@ -0,0 +1,33 @@
<!DOCTYPE html>
<html xmlns:th="http://www.thymeleaf.org">
<head th:replace="/common/template :: header(~{::title},~{::link},~{::style})">
</head>
<body>
<div class="layui-form timo-compile">
<form th:action="@{/orders/coupons/send}">
<input type="hidden" name="id" th:if="${coupons}" th:value="${coupons.id}">
<div class="layui-form-item">
<label class="layui-form-label">下发类型</label>
<div class="layui-input-inline">
<select class="timo-search-select" name="sendType">
<option value="1">指定用户</option>
<option value="2">所有用户</option>
</select>
</div>
</div>
<div class="layui-form-item">
<label class="layui-form-label">用户ID指定用户必须传入</label>
<div class="layui-input-inline">
<input class="layui-input" type="text" name="uid" placeholder="请输入用户">
</div>
</div>
<div class="layui-form-item timo-finally">
<button class="layui-btn ajax-submit"><i class="fa fa-check-circle"></i> 保存</button>
<button class="layui-btn btn-secondary close-popup"><i class="fa fa-times-circle"></i> 关闭</button>
</div>
</form>
</div>
<script th:replace="/common/template :: script"></script>
</body>
</html>

View File

@ -20,6 +20,13 @@
mo-selected="${goods?.goodsType}"></select>
</div>
</div>
<div class="layui-form-item">
<label class="layui-form-label">商品子类型</label>
<div class="layui-input-inline">
<select class="timo-search-select" name="goodsSubType" mo:dict="GOODS_SUB_TYPE"
mo-selected="${goods?.goodsSubType}"></select>
</div>
</div>
<div class="layui-form-item">
<label class="layui-form-label">商品服务时间</label>
<div class="layui-input-inline">

View File

@ -42,6 +42,7 @@
<th>商品ID</th>
<th>商品名称</th>
<th>商品类型</th>
<th>商品子类型</th>
<th>商品服务时间</th>
<th>商品价格</th>
<th>是否可购买多个</th>
@ -55,6 +56,7 @@
<td th:text="${item.id}">商品ID</td>
<td th:text="${item.name}">商品名称</td>
<td th:text="${#dicts.goodsType(item.goodsType)}">商品类型</td>
<td th:text="${#dicts.goodsSubType(item.goodsSubType)}">商品子类型</td>
<td th:text="${item.time}">商品服务时间</td>
<td th:text="${item.price}">商品价格</td>
<td th:text="${#dicts.goodsBuyMany(item.buyMany)}">是否可购买多个</td>

View File

@ -83,8 +83,11 @@
<th>支付类型</th>
<th>总金额</th>
<th>支付金额</th>
<th>会员折扣支付金额</th>
<th>折扣</th>
<th>会员折扣金额</th>
<th>会员折扣</th>
<th>优惠券折扣金额</th>
<th>优惠券ID</th>
<th>优惠券名称</th>
<th>订单ID</th>
</tr>
</thead>
@ -112,12 +115,14 @@
<td th:text="${#dicts.payStatus(item.payStatus)}">付款状态</td>
<td th:text="${#dicts.payType(item.payType)}">支付类型</td>
<td th:text="${item.totalAmount}">总金额</td>
<td th:text="${item.payTotalAmount > 0 ? item.payAmount / 10.0 : item.payTotalAmount}">支付金额</td>
<td th:text="${item.payTotalAmount / 10.0}">会员折扣支付金额</td>
<td th:text="${item.payDiscount / 100.0}">折扣</td>
<td th:text="${item.payAmount / 10.0}">支付金额</td>
<td th:text="${item.vipDiscountAmount / 10.0}">会员折扣金额</td>
<td th:text="${item.payDiscount / 100.0}">会员折扣</td>
<td th:text="${item.goodsDiscountAmount / 10.0}">优惠券折扣金额</td>
<td th:text="${item.ucid}">优惠券ID</td>
<td th:text="${item.coupons?.name}">优惠券名称</td>
<td th:text="${item.orderId}">订单ID</td>
<!--<td>
<a class="open-popup" data-title="编辑订单" th:attr="data-url=@{'/orders/orderMain/edit/'+${item.id}}" data-size="auto" href="#">编辑</a>
<a class="open-popup" data-title="详细信息" th:attr="data-url=@{'/orders/orderMain/detail/'+${item.id}}" data-size="800,600" href="#">详细</a>

View File

@ -60,6 +60,7 @@
<thead>
<tr>
<th>用户ID</th>
<th>邀请人ID</th>
<th>昵称</th>
<th>头像地址</th>
<th>余额</th>
@ -68,6 +69,7 @@
<th>手机号</th>
<th>角色</th>
<th>用户宠物</th>
<th>优惠券</th>
<th>创建时间</th>
<th>用户操作</th>
</tr>
@ -75,6 +77,7 @@
<tbody>
<tr th:each="item:${list}">
<td th:text="${item.id}">用户ID</td>
<td th:text="${item.inviteUserId}">邀请人ID</td>
<td th:text="${item.nickName}">昵称</td>
<td><img th:src="${item.headImgUrl}" alt="url" style="width: 100px; height: auto;"/> </td>
<td th:text="${item.amount == null ? 0 : item.amount / 10.0}">余额</td>
@ -85,6 +88,9 @@
<td>
<a class="open-popup" data-title="宠物下单" th:attr="data-url=@{'/users/users/toPetInfos/'+${item.id}}" data-size="auto" href="#">宠物下单</a>
</td>
<td>
<a class="open-popup" data-title="优惠券列表" th:attr="data-url=@{'/users/users/toCouponsInfos/'+${item.id}}" data-size="auto" href="#">优惠券列表</a>
</td>
<td th:text="${item.createTime}">创建时间</td>
<td>
<a class="open-popup" data-title="充值" th:attr="data-url=@{'/users/users/toRecharge/'+${item.id}}" data-size="auto" href="#">充值</a>

View File

@ -0,0 +1,38 @@
<!DOCTYPE html>
<html xmlns:th="http://www.thymeleaf.org"
xmlns:mo="http://www.thymeleaf.org">
<head th:replace="/common/template :: header(~{::title},~{::link},~{::style})">
</head>
<body class="timo-layout-page">
<div class="layui-card">
<div class="layui-card-body">
<div class="timo-table-wrap">
<table class="layui-table timo-table">
<thead>
<tr>
<th>优惠券ID</th>
<th>优惠券名称</th>
<th>优惠券折扣</th>
<th>优惠券状态</th>
<th>过期时间</th>
<th>最后更新时间</th>
</tr>
</thead>
<tbody>
<tr th:each="item:${userCouponsList}">
<td th:text="${item.id}">优惠券ID</td>
<td th:text="${item.coupons.name}">优惠券名称</td>
<td th:text="${item.coupons.discount / 10.0}">优惠券折扣</td>
<td th:text="${#dicts.userCouponsStatus(item.couponsStatus)}">优惠券状态</td>
<td th:text="${item.lastExpireTime}">过期时间</td>
<td th:text="${item.updateTime}">最后更新时间</td>
</tr>
</tbody>
</table>
</div>
</div>
</div>
<script th:replace="/common/template :: script"></script>
</body>
</html>

View File

@ -210,6 +210,38 @@ public class DictUtil {
String label = "GOODS_BUY_MANY";
return DictUtil.keyValue(label, String.valueOf(status));
}
/**
* 封装数据状态字典
* @param status 状态
*/
public static String goodsSubType(Byte status){
String label = "GOODS_SUB_TYPE";
return DictUtil.keyValue(label, String.valueOf(status));
}
/**
* 封装数据状态字典
* @param status 状态
*/
public static String periodType(Byte status){
String label = "PERIOD_TYPE";
return DictUtil.keyValue(label, String.valueOf(status));
}
/**
* 封装数据状态字典
* @param status 状态
*/
public static String couponsSendStatus(Byte status){
String label = "COUPONS_SEND_STATUS";
return DictUtil.keyValue(label, String.valueOf(status));
}
/**
* 封装数据状态字典
* @param status 状态
*/
public static String userCouponsStatus(Byte status){
String label = "USER_COUPONS_STATUS";
return DictUtil.keyValue(label, String.valueOf(status));
}
/**
* 清除缓存中指定的数据