update
This commit is contained in:
parent
9f91bff410
commit
9529abd9ea
|
|
@ -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>
|
||||
|
|
|
|||
|
|
@ -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);
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
|
|
|
|||
|
|
@ -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() + "失败,请重新操作");
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
@ -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("成功");
|
||||
}
|
||||
|
|
|
|||
|
|
@ -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;
|
||||
}
|
||||
|
|
@ -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
|
||||
|
|
|
|||
|
|
@ -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();
|
||||
}
|
||||
|
|
@ -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;
|
||||
|
||||
|
|
|
|||
|
|
@ -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;
|
||||
|
||||
|
||||
}
|
||||
|
|
@ -44,4 +44,7 @@ public class UserServiceAddr implements Serializable {
|
|||
private Date updateDate;
|
||||
// 数据状态
|
||||
private Byte status = StatusEnum.OK.getCode();
|
||||
|
||||
private String longitude;
|
||||
private String latitude;
|
||||
}
|
||||
|
|
@ -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);
|
||||
|
||||
}
|
||||
|
|
@ -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);
|
||||
}
|
||||
|
|
@ -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;
|
||||
}
|
||||
}
|
||||
|
|
@ -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);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
@ -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;
|
||||
}
|
||||
|
|
@ -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;
|
||||
}
|
||||
|
||||
|
|
|
|||
|
|
@ -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;
|
||||
}
|
||||
}
|
||||
|
|
@ -57,6 +57,8 @@ public class Users implements Serializable {
|
|||
@LastModifiedDate
|
||||
private Date updateDate;
|
||||
|
||||
private Long inviteUserId;
|
||||
|
||||
private Byte status = StatusEnum.OK.getCode();
|
||||
|
||||
@Transient
|
||||
|
|
|
|||
|
|
@ -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);
|
||||
|
||||
}
|
||||
|
|
@ -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();
|
||||
}
|
||||
|
|
@ -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());
|
||||
}
|
||||
}
|
||||
|
|
@ -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>
|
||||
|
|
@ -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>
|
||||
|
|
@ -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> -->
|
||||
<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>
|
||||
|
|
@ -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>
|
||||
|
|
@ -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">
|
||||
|
|
|
|||
|
|
@ -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>
|
||||
|
|
|
|||
|
|
@ -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>
|
||||
|
|
|
|||
|
|
@ -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>
|
||||
|
|
|
|||
|
|
@ -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>
|
||||
|
|
@ -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));
|
||||
}
|
||||
|
||||
/**
|
||||
* 清除缓存中指定的数据
|
||||
|
|
|
|||
Loading…
Reference in New Issue