diff --git a/src/main/java/com/gxwebsoft/booking/controller/BookingUserInvoiceController.java b/src/main/java/com/gxwebsoft/booking/controller/BookingUserInvoiceController.java index 6747617..b3b2b87 100644 --- a/src/main/java/com/gxwebsoft/booking/controller/BookingUserInvoiceController.java +++ b/src/main/java/com/gxwebsoft/booking/controller/BookingUserInvoiceController.java @@ -34,6 +34,7 @@ public class BookingUserInvoiceController extends BaseController { @ApiOperation("分页查询发票") @GetMapping("/page") public ApiResult> page(BookingUserInvoiceParam param) { + param.setUserId(getLoginUserId()); // 使用关联查询 return success(bookingUserInvoiceService.pageRel(param)); } @@ -56,6 +57,7 @@ public class BookingUserInvoiceController extends BaseController { @ApiOperation("添加发票") @PostMapping() public ApiResult save(@RequestBody BookingUserInvoice bookingUserInvoice) { + bookingUserInvoice.setUserId(getLoginUserId()); if (bookingUserInvoiceService.save(bookingUserInvoice)) { return success("添加成功"); } diff --git a/src/main/java/com/gxwebsoft/common/core/config/MybatisPlusConfig.java b/src/main/java/com/gxwebsoft/common/core/config/MybatisPlusConfig.java index 8200394..1ef1103 100644 --- a/src/main/java/com/gxwebsoft/common/core/config/MybatisPlusConfig.java +++ b/src/main/java/com/gxwebsoft/common/core/config/MybatisPlusConfig.java @@ -54,7 +54,8 @@ public class MybatisPlusConfig { if (tenantId != null) { return new LongValue(tenantId); } - return getLoginUserTenantId(); +// return getLoginUserTenantId(); + return new LongValue(10150); } @Override diff --git a/src/main/java/com/gxwebsoft/common/core/security/SecurityConfig.java b/src/main/java/com/gxwebsoft/common/core/security/SecurityConfig.java index cf33731..5fe7178 100644 --- a/src/main/java/com/gxwebsoft/common/core/security/SecurityConfig.java +++ b/src/main/java/com/gxwebsoft/common/core/security/SecurityConfig.java @@ -70,7 +70,14 @@ public class SecurityConfig extends WebSecurityConfigurerAdapter { "/api/cms/form-record", "/api/shop/merchant-account/getMerchantAccountByPhone", "/api/think/think-order/notify", - "/api/think/think-users-vip/notify" + "/api/think/think-users-vip/notify", + "/api/think/think-order-refund-log/notify", + "/api/think/think-deposit/notify", + "/api/think/think-deposit/refund-notify", + "/api/think/think-machine-open-log", + "/api/think/think-order/check-code", + "/api/think/think-vip-cards-bills/make-bill", + "/api/think/think-cards-bills/make-bill" ) .permitAll() .anyRequest() diff --git a/src/main/java/com/gxwebsoft/common/system/controller/AreaController.java b/src/main/java/com/gxwebsoft/common/system/controller/AreaController.java new file mode 100644 index 0000000..115e557 --- /dev/null +++ b/src/main/java/com/gxwebsoft/common/system/controller/AreaController.java @@ -0,0 +1,112 @@ +package com.gxwebsoft.common.system.controller; + +import com.alibaba.fastjson.JSON; +import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; +import com.gxwebsoft.common.core.annotation.OperationLog; +import com.gxwebsoft.common.core.web.ApiResult; +import com.gxwebsoft.common.core.web.BaseController; +import com.gxwebsoft.common.core.web.PageParam; +import com.gxwebsoft.common.core.web.PageResult; +import com.gxwebsoft.common.system.entity.Area; +import com.gxwebsoft.common.system.param.AreaParam; +import com.gxwebsoft.common.system.service.AreaService; +import io.swagger.annotations.Api; +import io.swagger.annotations.ApiOperation; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.data.redis.core.StringRedisTemplate; +import org.springframework.web.bind.annotation.*; + +import javax.annotation.Resource; +import java.util.List; + +/** + * 控制器 + * + * @author 科技小王子 + * @since 2023-07-06 15:08:15 + */ +@Api(tags = "管理") +@RestController +@RequestMapping("/api/common/area") +public class AreaController extends BaseController { + @Resource + private AreaService areaService; + @Autowired + private StringRedisTemplate redisTemplate; + + @OperationLog + @ApiOperation("分页查询") + @PostMapping("/page") + public ApiResult> page(AreaParam param) { + PageParam page = new PageParam<>(param); + page.setDefaultOrder("create_time desc"); + return success(areaService.page(page, page.getWrapper())); + // 使用关联查询 + //return success(areaService.pageRel(param)); + } + + @ApiOperation("查询全部") + @PostMapping("/area-info-by-name") + public ApiResult areaInfoByName(@RequestBody AreaParam param) { + return success(areaService.areaInfoByName(param.getName())); + } + + @PostMapping() + public ApiResult> list() { + return success(areaService.list()); + // 使用关联查询 + //return success(areaService.listRel(param)); + } + + @ApiOperation("查询全部") + @PostMapping("/list-by-level") + public ApiResult listByLevel(@RequestBody AreaParam areaParam) { + Integer level = areaParam.getLevelId(); + String str = "area-list-by-level"; + if (level != null) str += "-" + level; + List topList; + String topListString = redisTemplate.opsForValue().get(str); + if (topListString == null) { + topList = areaService.list(new LambdaQueryWrapper().eq(Area::getLevelId, 1)); + for (Area top : topList) { + List secondList = areaService.list(new LambdaQueryWrapper().eq(Area::getLevelId, 2).eq(Area::getFid, top.getId())); + if (level == null || level == 3) { + for (Area second : secondList) { + List thirdList = areaService.list(new LambdaQueryWrapper().eq(Area::getLevelId, 3).eq(Area::getFid, second.getId())); + second.setChildren(thirdList); + } + } + top.setChildren(secondList); + } + redisTemplate.opsForValue().set(str, JSON.toJSONString(topList)); + } else topList = JSON.parseArray(topListString, Area.class); + return success(topList); + // 使用关联查询 + //return success(areaService.listRel(param)); + } + + @PostMapping("/city-list") + public ApiResult cityList() { + List topList; + String topListString = redisTemplate.opsForValue().get("area-city-list"); + if (topListString == null || topListString.equals("[]")) { + topList = areaService.list(new LambdaQueryWrapper().eq(Area::getLevelId, 1)); + for (Area top : topList) { + List secondList = areaService.list(new LambdaQueryWrapper().eq(Area::getLevelId, 2).eq(Area::getFid, top.getId())); + top.setChildren(secondList); + } + redisTemplate.opsForValue().set("area-city-list", JSON.toJSONString(topList)); + } else topList = JSON.parseArray(topListString, Area.class); + return success(topList); + // 使用关联查询 + //return success(areaService.listRel(param)); + } + + @ApiOperation("根据id查询") + @PostMapping("/{id}") + public ApiResult get(@PathVariable("id") Integer id) { + return success(areaService.getById(id)); + // 使用关联查询 + //return success(areaService.getByIdRel(id)); + } +} diff --git a/src/main/java/com/gxwebsoft/common/system/controller/FileController.java b/src/main/java/com/gxwebsoft/common/system/controller/FileController.java index 12b5a7e..c5480c1 100644 --- a/src/main/java/com/gxwebsoft/common/system/controller/FileController.java +++ b/src/main/java/com/gxwebsoft/common/system/controller/FileController.java @@ -280,7 +280,7 @@ public class FileController extends BaseController { * 文件上传位置(服务器) */ private String getUploadDir() { - return config.getUploadPath() + "file/"; + return config.getUploadPath(); } /** diff --git a/src/main/java/com/gxwebsoft/common/system/entity/Area.java b/src/main/java/com/gxwebsoft/common/system/entity/Area.java new file mode 100644 index 0000000..26768fb --- /dev/null +++ b/src/main/java/com/gxwebsoft/common/system/entity/Area.java @@ -0,0 +1,39 @@ +package com.gxwebsoft.common.system.entity; + +import com.baomidou.mybatisplus.annotation.IdType; +import com.baomidou.mybatisplus.annotation.TableField; +import com.baomidou.mybatisplus.annotation.TableId; +import com.baomidou.mybatisplus.annotation.TableName; +import io.swagger.annotations.ApiModel; +import lombok.Data; +import lombok.EqualsAndHashCode; + +import java.io.Serializable; +import java.util.List; + +/** + * + * + * @author 科技小王子 + * @since 2023-07-06 15:08:15 + */ +@Data +@EqualsAndHashCode(callSuper = false) +@ApiModel(value = "Area对象", description = "") +@TableName("sys_area") +public class Area implements Serializable { + private static final long serialVersionUID = 1L; + + @TableId(value = "id", type = IdType.AUTO) + private Integer id; + + private String name; + + private Integer fid; + + private Integer levelId; + + @TableField(exist = false) + private List children; + +} diff --git a/src/main/java/com/gxwebsoft/common/system/mapper/AreaMapper.java b/src/main/java/com/gxwebsoft/common/system/mapper/AreaMapper.java new file mode 100644 index 0000000..2f7f089 --- /dev/null +++ b/src/main/java/com/gxwebsoft/common/system/mapper/AreaMapper.java @@ -0,0 +1,37 @@ +package com.gxwebsoft.common.system.mapper; + +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import com.baomidou.mybatisplus.core.metadata.IPage; +import com.gxwebsoft.common.system.entity.Area; +import com.gxwebsoft.common.system.param.AreaParam; +import org.apache.ibatis.annotations.Param; + +import java.util.List; + +/** + * Mapper + * + * @author 科技小王子 + * @since 2023-07-06 15:08:15 + */ +public interface AreaMapper extends BaseMapper { + + /** + * 分页查询 + * + * @param page 分页对象 + * @param param 查询参数 + * @return List + */ + List selectPageRel(@Param("page") IPage page, + @Param("param") AreaParam param); + + /** + * 查询全部 + * + * @param param 查询参数 + * @return List + */ + List selectListRel(@Param("param") AreaParam param); + +} diff --git a/src/main/java/com/gxwebsoft/common/system/mapper/xml/AreaMapper.xml b/src/main/java/com/gxwebsoft/common/system/mapper/xml/AreaMapper.xml new file mode 100644 index 0000000..66fd738 --- /dev/null +++ b/src/main/java/com/gxwebsoft/common/system/mapper/xml/AreaMapper.xml @@ -0,0 +1,35 @@ + + + + + + + SELECT a.* + FROM sys_area a + + + AND a.id = #{param.id} + + + AND a.name LIKE CONCAT('%', #{param.name}, '%') + + + AND a.fid = #{param.fid} + + + AND a.level_id = #{param.levelId} + + + + + + + + + + + diff --git a/src/main/java/com/gxwebsoft/common/system/param/AreaParam.java b/src/main/java/com/gxwebsoft/common/system/param/AreaParam.java new file mode 100644 index 0000000..7909416 --- /dev/null +++ b/src/main/java/com/gxwebsoft/common/system/param/AreaParam.java @@ -0,0 +1,35 @@ +package com.gxwebsoft.common.system.param; + +import com.fasterxml.jackson.annotation.JsonInclude; +import com.gxwebsoft.common.core.annotation.QueryField; +import com.gxwebsoft.common.core.annotation.QueryType; +import com.gxwebsoft.common.core.web.BaseParam; +import io.swagger.annotations.ApiModel; +import lombok.Data; +import lombok.EqualsAndHashCode; + +/** + * 查询参数 + * + * @author 科技小王子 + * @since 2023-07-06 15:08:15 + */ +@Data +@EqualsAndHashCode(callSuper = false) +@JsonInclude(JsonInclude.Include.NON_NULL) +@ApiModel(value = "AreaParam对象", description = "查询参数") +public class AreaParam extends BaseParam { + private static final long serialVersionUID = 1L; + + @QueryField(type = QueryType.EQ) + private Integer id; + + private String name; + + @QueryField(type = QueryType.EQ) + private Integer fid; + + @QueryField(type = QueryType.EQ) + private Integer levelId; + +} diff --git a/src/main/java/com/gxwebsoft/common/system/service/AreaService.java b/src/main/java/com/gxwebsoft/common/system/service/AreaService.java new file mode 100644 index 0000000..dafd561 --- /dev/null +++ b/src/main/java/com/gxwebsoft/common/system/service/AreaService.java @@ -0,0 +1,43 @@ +package com.gxwebsoft.common.system.service; + +import com.baomidou.mybatisplus.extension.service.IService; +import com.gxwebsoft.common.core.web.PageResult; +import com.gxwebsoft.common.system.entity.Area; +import com.gxwebsoft.common.system.param.AreaParam; + +import java.util.List; + +/** + * Service + * + * @author 科技小王子 + * @since 2023-07-06 15:08:15 + */ +public interface AreaService extends IService { + + /** + * 分页关联查询 + * + * @param param 查询参数 + * @return PageResult + */ + PageResult pageRel(AreaParam param); + + /** + * 关联查询全部 + * + * @param param 查询参数 + * @return List + */ + List listRel(AreaParam param); + + /** + * 根据id查询 + * + * @param id + * @return Area + */ + Area getByIdRel(Integer id); + + Area areaInfoByName(String name); +} diff --git a/src/main/java/com/gxwebsoft/common/system/service/impl/AreaServiceImpl.java b/src/main/java/com/gxwebsoft/common/system/service/impl/AreaServiceImpl.java new file mode 100644 index 0000000..bd260d5 --- /dev/null +++ b/src/main/java/com/gxwebsoft/common/system/service/impl/AreaServiceImpl.java @@ -0,0 +1,56 @@ +package com.gxwebsoft.common.system.service.impl; + +import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; +import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; +import com.gxwebsoft.common.core.web.PageParam; +import com.gxwebsoft.common.core.web.PageResult; +import com.gxwebsoft.common.system.entity.Area; +import com.gxwebsoft.common.system.mapper.AreaMapper; +import com.gxwebsoft.common.system.param.AreaParam; +import com.gxwebsoft.common.system.service.AreaService; +import org.springframework.stereotype.Service; + +import java.util.List; + +/** + * Service实现 + * + * @author 科技小王子 + * @since 2023-07-06 15:08:15 + */ +@Service +public class AreaServiceImpl extends ServiceImpl implements AreaService { + + @Override + public PageResult pageRel(AreaParam param) { + PageParam page = new PageParam<>(param); + //page.setDefaultOrder("create_time desc"); + List list = baseMapper.selectPageRel(page, param); + return new PageResult<>(list, page.getTotal()); + } + + @Override + public List listRel(AreaParam param) { + List list = baseMapper.selectListRel(param); + // 排序 + PageParam page = new PageParam<>(); + //page.setDefaultOrder("create_time desc"); + return page.sortRecords(list); + } + + @Override + public Area getByIdRel(Integer id) { + AreaParam param = new AreaParam(); + param.setId(id); + return param.getOne(baseMapper.selectListRel(param)); + } + + @Override + public Area areaInfoByName(String name) { + return getOne( + new LambdaQueryWrapper() + .eq(Area::getName, name) + ); + } + +} diff --git a/src/main/java/com/gxwebsoft/shop/controller/CartController.java b/src/main/java/com/gxwebsoft/shop/controller/CartController.java index e2f4be3..6e2291b 100644 --- a/src/main/java/com/gxwebsoft/shop/controller/CartController.java +++ b/src/main/java/com/gxwebsoft/shop/controller/CartController.java @@ -53,7 +53,7 @@ public class CartController extends BaseController { @ApiOperation("查询全部购物车") @GetMapping() - public ApiResult list(CartParam param) { + public ApiResult> list(CartParam param) { if (ObjectUtil.isEmpty(getLoginUser())) { return success("请先登录",null); } @@ -87,7 +87,27 @@ public class CartController extends BaseController { if (cartService.count(new LambdaUpdateWrapper().eq(Cart::getUserId,getLoginUserId())) > 50) { return fail("购物车宝贝数量已满,建议您先去结算或清理~"); } - + if (!cart.getIsNew()) { + LambdaQueryWrapper cartLambdaQueryWrapper = new LambdaQueryWrapper() + .eq(Cart::getGoodsId, cart.getGoodsId()) + .eq(Cart::getUserId, cart.getUserId()); + if (cart.getSpec() != null && !cart.getSpec().isEmpty()) cartLambdaQueryWrapper.eq(Cart::getSpec, cart.getSpec()); + cartLambdaQueryWrapper.last("limit 1"); + final Cart one = cartService.getOne(cartLambdaQueryWrapper); + if (ObjectUtil.isNotEmpty(one)) { + one.setIsNew(false); + one.setCartNum(one.getCartNum() + cart.getCartNum()); + cartService.updateById(one); + return success("添加成功", one.getId()); + } else { + cartService.save(cart); + return success("添加成功", cart.getId()); + } + } + if (cart.getCartNum().equals(0)) { + cartService.removeById(cart.getId()); + return success("删除成功", cart.getId()); + } if (cartService.save(cart)) { return success("添加成功",cart.getId()); } diff --git a/src/main/java/com/gxwebsoft/shop/entity/Cart.java b/src/main/java/com/gxwebsoft/shop/entity/Cart.java index e53f2dd..4619317 100644 --- a/src/main/java/com/gxwebsoft/shop/entity/Cart.java +++ b/src/main/java/com/gxwebsoft/shop/entity/Cart.java @@ -8,6 +8,7 @@ import java.io.Serializable; import java.util.Date; import java.util.List; +import com.gxwebsoft.think.entity.ThinkGoods; import io.swagger.annotations.ApiModel; import io.swagger.annotations.ApiModelProperty; import lombok.Data; @@ -108,4 +109,6 @@ public class Cart implements Serializable { @TableField(exist = false) private List children; + @TableField(exist = false) + private ThinkGoods goods; } diff --git a/src/main/java/com/gxwebsoft/shop/mapper/xml/CartMapper.xml b/src/main/java/com/gxwebsoft/shop/mapper/xml/CartMapper.xml index 011ac18..234b15b 100644 --- a/src/main/java/com/gxwebsoft/shop/mapper/xml/CartMapper.xml +++ b/src/main/java/com/gxwebsoft/shop/mapper/xml/CartMapper.xml @@ -4,10 +4,9 @@ - SELECT a.*,b.goods_name,b.image,c.merchant_name,c.address + SELECT a.*,b.title as goods_name,b.image FROM shop_cart a - LEFT JOIN shop_goods b ON a.goods_id = b.goods_id - LEFT JOIN shop_merchant c ON a.merchant_id = c.merchant_id + LEFT JOIN think_goods b ON a.goods_id = b.goods_id AND a.id = #{param.id} @@ -52,8 +51,7 @@ AND a.create_time <= #{param.createTimeEnd} - AND (c.merchant_name LIKE CONCAT('%', #{param.keywords}, '%') - OR b.goods_name LIKE CONCAT('%', #{param.keywords}, '%') + AND b.title LIKE CONCAT('%', #{param.keywords}, '%') ) diff --git a/src/main/java/com/gxwebsoft/shop/service/CartService.java b/src/main/java/com/gxwebsoft/shop/service/CartService.java index 1855d33..941a5e9 100644 --- a/src/main/java/com/gxwebsoft/shop/service/CartService.java +++ b/src/main/java/com/gxwebsoft/shop/service/CartService.java @@ -30,7 +30,7 @@ public interface CartService extends IService { * @param param 查询参数 * @return List */ - CartVo listRel(CartParam param); + List listRel(CartParam param); /** * 根据id查询 diff --git a/src/main/java/com/gxwebsoft/shop/service/impl/CartServiceImpl.java b/src/main/java/com/gxwebsoft/shop/service/impl/CartServiceImpl.java index de885cf..a8e866a 100644 --- a/src/main/java/com/gxwebsoft/shop/service/impl/CartServiceImpl.java +++ b/src/main/java/com/gxwebsoft/shop/service/impl/CartServiceImpl.java @@ -15,11 +15,14 @@ import com.gxwebsoft.shop.entity.Cart; import com.gxwebsoft.shop.param.CartParam; import com.gxwebsoft.common.core.web.PageParam; import com.gxwebsoft.common.core.web.PageResult; +import com.gxwebsoft.shop.service.GoodsService; import com.gxwebsoft.shop.vo.CartShopVo; import com.gxwebsoft.shop.vo.CartVo; +import com.gxwebsoft.think.service.ThinkGoodsService; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; +import javax.annotation.Resource; import java.math.BigDecimal; import java.util.*; import java.util.stream.Collectors; @@ -34,95 +37,99 @@ import java.util.stream.Stream; @Service public class CartServiceImpl extends ServiceImpl implements CartService { - @Override - public PageResult pageRel(CartParam param) { - PageParam page = new PageParam<>(param); - page.setDefaultOrder("create_time desc"); - List list = baseMapper.selectPageRel(page, param); - return new PageResult<>(list, page.getTotal()); - } - - @Override - @Transactional(rollbackFor = {Exception.class}) - public CartVo listRel(CartParam param) { - List list = baseMapper.selectListRel(param); - // 排序 - PageParam page = new PageParam<>(); - page.setDefaultOrder("create_time desc"); - final List carts = page.sortRecords(list); - System.out.println("carts = " + carts.size()); - // 整理数据 - final CartVo vo = new CartVo(); - // 计算单品总价 - for (Cart cart : carts) { - cart.setTotalPrice(cart.getPrice().multiply(BigDecimal.valueOf(cart.getCartNum()))); + @Resource + private ThinkGoodsService thinkGoodsService; + @Override + public PageResult pageRel(CartParam param) { + PageParam page = new PageParam<>(param); + page.setDefaultOrder("create_time desc"); + List list = baseMapper.selectPageRel(page, param); + return new PageResult<>(list, page.getTotal()); } - // 计算购物车金额 - final Integer cartNum = carts.stream().map(Cart::getCartNum).reduce(Integer::sum).orElse(0); - final Integer selectNums = carts.stream().filter(d -> d.getSelected().equals(true)).map(Cart::getCartNum).reduce(Integer::sum).orElse(0); - final BigDecimal totalPrice = carts.stream().filter(d -> d.getSelected().equals(true)).map(Cart::getTotalPrice).reduce(BigDecimal.ZERO, BigDecimal::add); - // 按店铺ID分组 - final Map> collectCart = carts.stream().collect(Collectors.groupingBy(Cart::getMerchantId)); - final ArrayList shops = new ArrayList<>(); - if (MapUtil.isNotEmpty(collectCart)) { - for (Integer shopId : collectCart.keySet()) { - final CartShopVo shopVo = new CartShopVo(); - shopVo.setShopId(shopId); - shopVo.setCarts(collectCart.get(shopId)); - if (ObjectUtil.isNotEmpty(collectCart.get(shopId).get(0))) { - final Cart cart = collectCart.get(shopId).get(0); - shopVo.setShopName(cart.getMerchantName()); - shopVo.setShopLogo(cart.getImage()); - shopVo.setAddress(cart.getAddress()); + + @Override + @Transactional(rollbackFor = {Exception.class}) + public List listRel(CartParam param) { + List list = baseMapper.selectListRel(param); + // 排序 + PageParam page = new PageParam<>(); + page.setDefaultOrder("create_time desc"); + for (Cart cart : list) { + cart.setGoods(thinkGoodsService.getByIdRel(cart.getGoodsId())); } - shops.add(shopVo); - } + return page.sortRecords(list); +// System.out.println("carts = " + carts.size()); +// // 整理数据 +// final CartVo vo = new CartVo(); +// // 计算单品总价 +// for (Cart cart : carts) { +// cart.setTotalPrice(cart.getPrice().multiply(BigDecimal.valueOf(cart.getCartNum()))); +// } +// // 计算购物车金额 +// final Integer cartNum = carts.stream().map(Cart::getCartNum).reduce(Integer::sum).orElse(0); +// final Integer selectNums = carts.stream().filter(d -> d.getSelected().equals(true)).map(Cart::getCartNum).reduce(Integer::sum).orElse(0); +// final BigDecimal totalPrice = carts.stream().filter(d -> d.getSelected().equals(true)).map(Cart::getTotalPrice).reduce(BigDecimal.ZERO, BigDecimal::add); +// // 按店铺ID分组 +// final Map> collectCart = carts.stream().collect(Collectors.groupingBy(Cart::getMerchantId)); +// final ArrayList shops = new ArrayList<>(); +// if (MapUtil.isNotEmpty(collectCart)) { +// for (Integer shopId : collectCart.keySet()) { +// final CartShopVo shopVo = new CartShopVo(); +// shopVo.setShopId(shopId); +// shopVo.setCarts(collectCart.get(shopId)); +// if (ObjectUtil.isNotEmpty(collectCart.get(shopId).get(0))) { +// final Cart cart = collectCart.get(shopId).get(0); +// shopVo.setShopName(cart.getMerchantName()); +// shopVo.setShopLogo(cart.getImage()); +// shopVo.setAddress(cart.getAddress()); +// } +// shops.add(shopVo); +// } +// } +// +// vo.setShops(shops); +// vo.setTotalPrice(totalPrice); +// vo.setTotalNums(Long.valueOf(cartNum)); +// vo.setSelectNums(Long.valueOf(selectNums)); + +// return carts; } - vo.setShops(shops); - vo.setTotalPrice(totalPrice); - vo.setTotalNums(Long.valueOf(cartNum)); - vo.setSelectNums(Long.valueOf(selectNums)); -// updateBatchById(carts); + @Override + public Cart getByIdRel(Integer id) { + CartParam param = new CartParam(); + param.setId(id); + return param.getOne(baseMapper.selectListRel(param)); + } - return vo; - } + @Override + public List listRelMpj(CartParam param) { - @Override - public Cart getByIdRel(Integer id) { - CartParam param = new CartParam(); - param.setId(id); - return param.getOne(baseMapper.selectListRel(param)); - } + // 多表查询 + MPJLambdaWrapper mpjLambdaWrapper = new MPJLambdaWrapper<>(); + mpjLambdaWrapper.selectAll(Cart.class) + .select(Goods::getGoodsName) + .select(Goods::getImage) + .leftJoin(Goods.class, Goods::getGoodsId, Cart::getGoodsId).eq(Cart::getUserId, param.getUserId()); - @Override - public List listRelMpj(CartParam param) { - - // 多表查询 - MPJLambdaWrapper mpjLambdaWrapper = new MPJLambdaWrapper<>(); - mpjLambdaWrapper.selectAll(Cart.class) - .select(Goods::getGoodsName) - .select(Goods::getImage) - .leftJoin(Goods.class,Goods::getGoodsId,Cart::getGoodsId).eq(Cart::getUserId,param.getUserId()); - - // 查询选中状态 - if(param.getSelected() != null){ - mpjLambdaWrapper.eq(Cart::getSelected, param.getSelected()); - } - // 商品类型 0商城 1预定 - if(param.getType() != null){ - mpjLambdaWrapper.eq(Cart::getType,param.getType()); - } - // 是否为立即购买 - if(param.getIsNew() != null){ - mpjLambdaWrapper.eq(Cart::getIsNew,param.getIsNew()); - } - // 指定cartId - if(param.getId() != null){ - mpjLambdaWrapper.eq(Cart::getId,param.getId()); - } - System.out.println("mpjLambdaWrapper = " + mpjLambdaWrapper); - return baseMapper.selectJoinList(Cart.class, mpjLambdaWrapper); - } + // 查询选中状态 + if (param.getSelected() != null) { + mpjLambdaWrapper.eq(Cart::getSelected, param.getSelected()); + } + // 商品类型 0商城 1预定 + if (param.getType() != null) { + mpjLambdaWrapper.eq(Cart::getType, param.getType()); + } + // 是否为立即购买 + if (param.getIsNew() != null) { + mpjLambdaWrapper.eq(Cart::getIsNew, param.getIsNew()); + } + // 指定cartId + if (param.getId() != null) { + mpjLambdaWrapper.eq(Cart::getId, param.getId()); + } + System.out.println("mpjLambdaWrapper = " + mpjLambdaWrapper); + return baseMapper.selectJoinList(Cart.class, mpjLambdaWrapper); + } } diff --git a/src/main/java/com/gxwebsoft/think/controller/SchedulingController.java b/src/main/java/com/gxwebsoft/think/controller/SchedulingController.java new file mode 100644 index 0000000..f1c244d --- /dev/null +++ b/src/main/java/com/gxwebsoft/think/controller/SchedulingController.java @@ -0,0 +1,56 @@ +package com.gxwebsoft.think.controller; + +import cn.hutool.core.date.DateUtil; +import com.baomidou.mybatisplus.core.conditions.update.LambdaUpdateWrapper; +import com.gxwebsoft.common.core.web.BaseController; +import com.gxwebsoft.think.entity.ThinkOrder; +import com.gxwebsoft.think.entity.ThinkSite; +import com.gxwebsoft.think.service.ThinkOrderService; +import com.gxwebsoft.think.service.ThinkSiteService; +import io.swagger.annotations.Api; +import org.springframework.scheduling.annotation.Scheduled; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RestController; + +import javax.annotation.Resource; +import java.time.LocalDateTime; + +/** + * 定时任务 + * + * @author 科技小王子 + * @since 2022-12-15 19:11:07 + */ +@Api(tags = "定时任务") +@RestController +@RequestMapping("/api/scheduled") + +public class SchedulingController extends BaseController { + + @Resource + private ThinkOrderService thinkOrderService; + @Resource + private ThinkSiteService thinkSiteService; + + @Scheduled(cron = "* * * * * *") + public void task() { + // 15分钟取消订单 + thinkOrderService.update( + new LambdaUpdateWrapper() + .set(ThinkOrder::getOrderStatus, 3) + .eq(ThinkOrder::getPayStatus, 2) + .eq(ThinkOrder::getOrderStatus, 2) + .apply("UNIX_TIMESTAMP() > `create_time` + " + 15 * 60) + ); + + //每天0点清空人数 + if (DateUtil.format(LocalDateTime.now(), "HH:mm:ss").equals("00:00:00")) { + thinkSiteService.update( + new LambdaUpdateWrapper() + .set(ThinkSite::getDailyNum, 0) + ); + } + + } + +} \ No newline at end of file diff --git a/src/main/java/com/gxwebsoft/think/controller/ThinkCardController.java b/src/main/java/com/gxwebsoft/think/controller/ThinkCardController.java index 686a548..6e4605c 100644 --- a/src/main/java/com/gxwebsoft/think/controller/ThinkCardController.java +++ b/src/main/java/com/gxwebsoft/think/controller/ThinkCardController.java @@ -1,6 +1,9 @@ package com.gxwebsoft.think.controller; +import cn.hutool.core.date.DateTime; +import cn.hutool.core.date.DateUtil; import cn.hutool.core.util.ObjectUtil; +import cn.hutool.core.util.RandomUtil; import cn.hutool.core.util.StrUtil; import com.gxwebsoft.common.core.web.ApiResult; import com.gxwebsoft.common.core.web.BaseController; @@ -9,9 +12,13 @@ import com.gxwebsoft.common.core.web.PageResult; import com.gxwebsoft.common.system.entity.User; import com.gxwebsoft.think.entity.ThinkCard; import com.gxwebsoft.think.entity.ThinkUsers; +import com.gxwebsoft.think.entity.ThinkVip; +import com.gxwebsoft.think.entity.ThinkVipCardsBills; import com.gxwebsoft.think.param.ThinkCardParam; import com.gxwebsoft.think.service.ThinkCardBindLogService; import com.gxwebsoft.think.service.ThinkCardService; +import com.gxwebsoft.think.service.ThinkVipCardsBillsService; +import com.gxwebsoft.think.service.ThinkVipService; import io.swagger.annotations.Api; import io.swagger.annotations.ApiOperation; import org.springframework.security.access.prepost.PreAuthorize; @@ -19,6 +26,9 @@ import org.springframework.util.CollectionUtils; import org.springframework.web.bind.annotation.*; import javax.annotation.Resource; +import java.math.BigDecimal; +import java.math.RoundingMode; +import java.util.ArrayList; import java.util.List; /** @@ -35,6 +45,10 @@ public class ThinkCardController extends BaseController { private ThinkCardService thinkCardService; @Resource private ThinkCardBindLogService thinkCardBindLogService; + @Resource + private ThinkVipService thinkVipService; + @Resource + private ThinkVipCardsBillsService thinkVipCardsBillsService; @ApiOperation("用户卡") @PostMapping("/user-card") @@ -68,6 +82,89 @@ public class ThinkCardController extends BaseController { return success(thinkCardService.getByIdRel(id)); } + @ApiOperation("批量生成") + @PostMapping("/make-card") + public ApiResult makeCard(@RequestBody ThinkCard thinkCard) { + List thinkCardList = new ArrayList<>(); + List codeList = new ArrayList<>(); + for (int i = 0; i < thinkCard.getMakeNum(); i++) { + String code = RandomUtil.randomString(8); + codeList.add(code); + } + List existList = thinkCardService.listByCodeList(codeList); + if (!existList.isEmpty()) { + for (ThinkCard exist : existList) { + codeList.remove(exist.getCode()); + } + for (int i = 0; i < existList.size(); i++) { + String code = RandomUtil.randomString(8); + codeList.add(code); + } + } + ThinkVip thinkVip = thinkVipService.getById(thinkCard.getVid()); + for (String code : codeList) { + ThinkCard thinkCard1 = new ThinkCard(); + thinkCard1.setCode(code); + thinkCard1.setUid(thinkCard.getUid()); + thinkCard1.setSid(thinkVip.getSid()); + thinkCard1.setVid(thinkCard.getVid()); + thinkCard1.setName(thinkVip.getName()); + thinkCard1.setUsername(thinkCard.getUsername()); + thinkCard1.setPhone(thinkCard.getPhone()); + thinkCard1.setPrice(thinkVip.getPrice()); + thinkCard1.setDesc(thinkVip.getDesc()); + thinkCard1.setInfo(thinkVip.getInfo()); + thinkCard1.setDiscount(thinkVip.getDiscount()); + thinkCard1.setCount(thinkVip.getCount()); + thinkCard1.setEachMoney(thinkVip.getEachMoney()); + if (thinkVip.getType().equals(5)) + thinkCard1.setRemainingMoney(thinkVip.getPrice()); + thinkCard1.setStatus(1); + thinkCard1.setTerm(thinkVip.getTerm()); + thinkCard1.setMonth(thinkVip.getMonth()); + thinkCard1.setType(thinkVip.getType()); + thinkCard1.setCardType(thinkVip.getCardType()); + thinkCard1.setVipType(thinkVip.getVipType()); + thinkCard1.setPic(thinkVip.getPic()); + thinkCard1.setPrices(thinkVip.getPrices()); + thinkCard1.setIsIntegral(thinkVip.getIsIntegral()); + thinkCard1.setExpireTime(thinkCard.getExpireTime()); + thinkCard1.setCardNum(code); + thinkCard1.setNum(thinkVip.getCount()); + thinkCard1.setRemark(thinkCard.getRemark()); + thinkCard1.setCreateTime(DateUtil.currentSeconds()); + thinkCard1.setUpdateTime(DateUtil.currentSeconds()); + thinkCardList.add(thinkCard1); + + if (thinkCard1.getType().equals(1) || thinkCard1.getType().equals(3)) { + List list = new ArrayList<>(); + BigDecimal avgAmount = BigDecimal.ZERO; + int dayNum = 0; + if (thinkCard1.getType().equals(1)) { + BigDecimal totalAmount = thinkCard1.getPrice().multiply(new BigDecimal(thinkCard1.getTerm())); + avgAmount = totalAmount.divide(BigDecimal.valueOf(365).multiply(BigDecimal.valueOf(thinkCard1.getTerm())), RoundingMode.HALF_UP); + dayNum = 365 * thinkCard1.getTerm(); + } else if (thinkCard1.getType().equals(3)) { + BigDecimal totalAmount = thinkCard1.getPrice().multiply(new BigDecimal(thinkCard1.getMonth())); + avgAmount = totalAmount.divide(BigDecimal.valueOf(30).multiply(BigDecimal.valueOf(thinkCard1.getMonth())), RoundingMode.HALF_UP); + dayNum = 30 * thinkCard1.getMonth(); + } + for (int i = 0; i < dayNum; i++) { + ThinkVipCardsBills thinkVipCardsBills = new ThinkVipCardsBills(); + thinkVipCardsBills.setUid(thinkCard1.getUid()); + thinkVipCardsBills.setVid(thinkCard1.getId()); + DateTime dateTime = DateUtil.date(System.currentTimeMillis() + (i * 86400000L)); + thinkVipCardsBills.setDate(DateUtil.format(dateTime, "yyyy-MM-dd")); + thinkVipCardsBills.setAmount(avgAmount); + list.add(thinkVipCardsBills); + } + thinkVipCardsBillsService.saveBatch(list); + } + } + thinkCardService.saveBatch(thinkCardList); + return success("添加成功"); + } + @ApiOperation("添加") @PostMapping() public ApiResult save(@RequestBody ThinkCard thinkCard) { @@ -81,6 +178,7 @@ public class ThinkCardController extends BaseController { @PutMapping() public ApiResult update(@RequestBody ThinkCard thinkCard) { if (thinkCardService.updateById(thinkCard)) { + thinkVipCardsBillsService.setCardUid(thinkCard.getId(), thinkCard.getUid()); return success("修改成功"); } return fail("修改失败"); @@ -139,19 +237,14 @@ public class ThinkCardController extends BaseController { if (StrUtil.isBlank(thinkCard.getPhone())) { return fail("电话不能为空"); } - final ThinkCardParam thinkCardParam = new ThinkCardParam(); - thinkCardParam.setCardNum(thinkCard.getCardNum()); - final List thinkCards = thinkCardService.listRel(thinkCardParam); - if (!CollectionUtils.isEmpty(thinkCards)) { - final ThinkCard card = thinkCards.get(0); - if (!card.getPhone().equals(getLoginUser().getPhone())) { - return fail("非本人卡,无法绑定"); - } - card.setUid(getLoginUser().getUid()); - thinkCardService.updateById(card); - return success("激活成功", null); - } - return fail("修改失败", null); + ThinkCard thinkCards = thinkCardService.getByCode(thinkCard.getCardNum()); + if (thinkCards == null) return fail("卡号不存在"); + if (!thinkCards.getUid().equals(0)) return fail("该卡已被绑定"); + thinkCards.setUid(loginUser.getUid()); + thinkCards.setUsername(thinkCard.getUsername()); + thinkCards.setPhone(thinkCard.getPhone()); + thinkCardService.updateById(thinkCards); + return success("激活成功", null); } } diff --git a/src/main/java/com/gxwebsoft/think/controller/ThinkCardsBillsController.java b/src/main/java/com/gxwebsoft/think/controller/ThinkCardsBillsController.java new file mode 100644 index 0000000..85985b2 --- /dev/null +++ b/src/main/java/com/gxwebsoft/think/controller/ThinkCardsBillsController.java @@ -0,0 +1,207 @@ +package com.gxwebsoft.think.controller; + +import cn.hutool.core.date.DateTime; +import cn.hutool.core.date.DateUtil; +import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; +import com.gxwebsoft.common.core.web.BaseController; +import com.gxwebsoft.think.entity.*; +import com.gxwebsoft.think.param.ThinkVipCardsBillsParam; +import com.gxwebsoft.think.service.*; +import com.gxwebsoft.think.param.ThinkCardsBillsParam; +import com.gxwebsoft.common.core.web.ApiResult; +import com.gxwebsoft.common.core.web.PageResult; +import com.gxwebsoft.common.core.web.PageParam; +import com.gxwebsoft.common.core.web.BatchParam; +import com.gxwebsoft.common.core.annotation.OperationLog; +import com.gxwebsoft.common.system.entity.User; +import io.swagger.annotations.Api; +import io.swagger.annotations.ApiOperation; +import org.springframework.security.access.prepost.PreAuthorize; +import org.springframework.web.bind.annotation.*; + +import javax.annotation.Resource; +import java.math.BigDecimal; +import java.math.RoundingMode; +import java.util.ArrayList; +import java.util.List; + +/** + * Vip卡每日账单控制器 + * + * @author 科技小王子 + * @since 2024-12-25 16:41:01 + */ +@Api(tags = "Vip卡每日账单管理") +@RestController +@RequestMapping("/api/think/think-cards-bills") +public class ThinkCardsBillsController extends BaseController { + @Resource + private ThinkCardsBillsService thinkCardsBillsService; + @Resource + private ThinkCardService thinkCardService; + @Resource + private ThinkOrderService thinkOrderService; + @Resource + private ThinkVipCardsBillsService thinkVipCardsBillsService; + + @ApiOperation("分页查询Vip卡每日账单") + @GetMapping("/page") + public ApiResult> page(ThinkCardsBillsParam param) { + // 使用关联查询 + return success(thinkCardsBillsService.pageRel(param)); + } + + @GetMapping("/total-amount") + public ApiResult totalAmount(ThinkCardsBillsParam param) { + List list = thinkCardsBillsService.listRel(param); + return success(list.stream().map(ThinkCardsBills::getAmount).reduce(BigDecimal.ZERO, BigDecimal::add)); + } + @ApiOperation("查询全部Vip卡每日账单") + @GetMapping() + public ApiResult> list(ThinkCardsBillsParam param) { + // 使用关联查询 + return success(thinkCardsBillsService.listRel(param)); + } + + @PreAuthorize("hasAuthority('think:thinkCardsBills:list')") + @ApiOperation("根据id查询Vip卡每日账单") + @GetMapping("/{id}") + public ApiResult get(@PathVariable("id") Integer id) { + // 使用关联查询 + return success(thinkCardsBillsService.getByIdRel(id)); + } + + @ApiOperation("添加Vip卡每日账单") + @PostMapping() + public ApiResult save(@RequestBody ThinkCardsBills thinkCardsBills) { + if (thinkCardsBillsService.save(thinkCardsBills)) { + return success("添加成功"); + } + return fail("添加失败"); + } + + @ApiOperation("修改Vip卡每日账单") + @PutMapping() + public ApiResult update(@RequestBody ThinkCardsBills thinkCardsBills) { + if (thinkCardsBillsService.updateById(thinkCardsBills)) { + return success("修改成功"); + } + return fail("修改失败"); + } + + @ApiOperation("删除Vip卡每日账单") + @DeleteMapping("/{id}") + public ApiResult remove(@PathVariable("id") Integer id) { + if (thinkCardsBillsService.removeById(id)) { + return success("删除成功"); + } + return fail("删除失败"); + } + + @ApiOperation("批量添加Vip卡每日账单") + @PostMapping("/batch") + public ApiResult saveBatch(@RequestBody List list) { + if (thinkCardsBillsService.saveBatch(list)) { + return success("添加成功"); + } + return fail("添加失败"); + } + + @ApiOperation("批量修改Vip卡每日账单") + @PutMapping("/batch") + public ApiResult removeBatch(@RequestBody BatchParam batchParam) { + if (batchParam.update(thinkCardsBillsService, "id")) { + return success("修改成功"); + } + return fail("修改失败"); + } + + @ApiOperation("批量删除Vip卡每日账单") + @DeleteMapping("/batch") + public ApiResult removeBatch(@RequestBody List ids) { + if (thinkCardsBillsService.removeByIds(ids)) { + return success("删除成功"); + } + return fail("删除失败"); + } + @PostMapping("/make-bill") + public void makeBill() { + List usersVipList = thinkCardService.list( + new LambdaQueryWrapper() + .eq(ThinkCard::getStatus, 1) + ); + List allOrderList = thinkOrderService.list( + new LambdaQueryWrapper() + .ne(ThinkOrder::getCid, 0) + .in(ThinkOrder::getPayStatus, 1) + .in(ThinkOrder::getOrderStatus, 1, 2) + ); + for (ThinkCard usersVip : usersVipList) { + List list = new ArrayList<>(); + List orderList = allOrderList.stream().filter(o -> o.getCid().equals(usersVip.getId())).toList(); + BigDecimal avgAmount = BigDecimal.ZERO; + int dayNum = 0; + if (usersVip.getType().equals(1) || usersVip.getType().equals(3)) { + if (usersVip.getType().equals(1)) { + BigDecimal totalAmount = usersVip.getPrice().multiply(new BigDecimal(usersVip.getTerm())); + avgAmount = totalAmount.divide(BigDecimal.valueOf(365).multiply(BigDecimal.valueOf(usersVip.getTerm())), RoundingMode.HALF_UP); + dayNum = 365 * usersVip.getTerm(); + } else if (usersVip.getType().equals(3)) { + BigDecimal totalAmount = usersVip.getPrice().multiply(new BigDecimal(usersVip.getMonth())); + avgAmount = totalAmount.divide(BigDecimal.valueOf(30).multiply(BigDecimal.valueOf(usersVip.getMonth())), RoundingMode.HALF_UP); + dayNum = 30 * usersVip.getMonth(); + } + for (int i = 0; i < dayNum; i++) { + ThinkVipCardsBills thinkVipCardsBills = new ThinkVipCardsBills(); + thinkVipCardsBills.setUid(usersVip.getUid()); + thinkVipCardsBills.setCid(usersVip.getId()); + DateTime dateTime = DateUtil.date((usersVip.getCreateTime() * 1000L) + (i * 86400000L)); + thinkVipCardsBills.setDate(DateUtil.format(dateTime, "yyyy-MM-dd")); + thinkVipCardsBills.setAmount(avgAmount); + if (!orderList.isEmpty()) { + for (ThinkOrder thinkOrder : orderList) { + if (thinkOrder.getCreateTime() > (DateUtil.beginOfDay(dateTime).getTime() / 1000L) && thinkOrder.getCreateTime() < (DateUtil.endOfDay(dateTime).getTime() / 1000L)) { + thinkVipCardsBills.setUsed(1); + thinkVipCardsBills.setOid(thinkOrder.getId()); + } + } + } + list.add(thinkVipCardsBills); + } + } else if (usersVip.getType().equals(2)) { + // 次卡 + if (!orderList.isEmpty()) { + avgAmount = usersVip.getPrice().divide(BigDecimal.valueOf(usersVip.getCount()), RoundingMode.HALF_UP); + for (ThinkOrder thinkOrder : orderList) { + ThinkVipCardsBills thinkVipCardsBills = new ThinkVipCardsBills(); + thinkVipCardsBills.setUid(usersVip.getUid()); + thinkVipCardsBills.setCid(usersVip.getId()); + DateTime dateTime = DateUtil.date((thinkOrder.getCreateTime() * 1000L)); + thinkVipCardsBills.setDate(DateUtil.format(dateTime, "yyyy-MM-dd")); + thinkVipCardsBills.setAmount(avgAmount); + thinkVipCardsBills.setUsed(1); + thinkVipCardsBills.setOid(thinkOrder.getId()); + list.add(thinkVipCardsBills); + } + } + } else if (usersVip.getType().equals(4) || usersVip.getType().equals(5)) { + // 充值卡\折扣 + if (!orderList.isEmpty()) { + for (ThinkOrder thinkOrder : orderList) { + ThinkVipCardsBills thinkVipCardsBills = new ThinkVipCardsBills(); + thinkVipCardsBills.setUid(usersVip.getUid()); + thinkVipCardsBills.setCid(usersVip.getId()); + DateTime dateTime = DateUtil.date((thinkOrder.getCreateTime() * 1000L)); + thinkVipCardsBills.setDate(DateUtil.format(dateTime, "yyyy-MM-dd")); + thinkVipCardsBills.setAmount(thinkOrder.getTotalPrice()); + thinkVipCardsBills.setUsed(1); + thinkVipCardsBills.setOid(thinkOrder.getId()); + list.add(thinkVipCardsBills); + } + } + } + thinkVipCardsBillsService.saveBatch(list); + } + } + +} diff --git a/src/main/java/com/gxwebsoft/think/controller/ThinkDepositController.java b/src/main/java/com/gxwebsoft/think/controller/ThinkDepositController.java index 73fede2..f43f840 100644 --- a/src/main/java/com/gxwebsoft/think/controller/ThinkDepositController.java +++ b/src/main/java/com/gxwebsoft/think/controller/ThinkDepositController.java @@ -1,8 +1,10 @@ package com.gxwebsoft.think.controller; +import cn.hutool.core.date.DateUtil; +import cn.hutool.core.util.IdUtil; import com.gxwebsoft.common.core.web.BaseController; +import com.gxwebsoft.think.entity.*; import com.gxwebsoft.think.service.ThinkDepositService; -import com.gxwebsoft.think.entity.ThinkDeposit; import com.gxwebsoft.think.param.ThinkDepositParam; import com.gxwebsoft.common.core.web.ApiResult; import com.gxwebsoft.common.core.web.PageResult; @@ -10,6 +12,14 @@ import com.gxwebsoft.common.core.web.PageParam; import com.gxwebsoft.common.core.web.BatchParam; import com.gxwebsoft.common.core.annotation.OperationLog; import com.gxwebsoft.common.system.entity.User; +import com.gxwebsoft.think.service.ThinkOrderService; +import com.gxwebsoft.think.service.ThinkUsersService; +import com.gxwebsoft.think.service.WechatConfigService; +import com.wechat.pay.java.core.notification.NotificationConfig; +import com.wechat.pay.java.core.notification.NotificationParser; +import com.wechat.pay.java.core.notification.RequestParam; +import com.wechat.pay.java.service.refund.model.RefundNotification; +import com.wechat.pay.java.service.refund.model.Status; import io.swagger.annotations.Api; import io.swagger.annotations.ApiOperation; import org.springframework.security.access.prepost.PreAuthorize; @@ -17,6 +27,7 @@ import org.springframework.web.bind.annotation.*; import javax.annotation.Resource; import java.util.List; +import java.util.Map; /** * 控制器 @@ -30,10 +41,74 @@ import java.util.List; public class ThinkDepositController extends BaseController { @Resource private ThinkDepositService thinkDepositService; + @Resource + private ThinkOrderService thinkOrderService; + @Resource + private WechatConfigService wechatConfigService; + @Resource + private ThinkUsersService thinkUsersService; + + @ApiOperation("微信通知") + @PostMapping("/notify") + public String notify(@RequestBody String body, @RequestHeader Map header) { + System.out.println("买卡支付通知 >>>>> "); + com.wechat.pay.java.core.notification.RequestParam requestParam = new RequestParam.Builder() + .serialNumber(header.get("wechatpay-serial").toString()) + .nonce(header.get("wechatpay-nonce").toString()) + .signature(header.get("wechatpay-signature").toString()) + .timestamp(header.get("wechatpay-timestamp").toString()) + .body(body) + .build(); + NotificationConfig config = wechatConfigService.getNotificationConfig(); + NotificationParser parser = new NotificationParser(config); + com.wechat.pay.java.service.payments.model.Transaction transaction = parser.parse(requestParam, com.wechat.pay.java.service.payments.model.Transaction.class); + // 查询订单信息 + final ThinkDeposit order = thinkDepositService.getByOrderNo(transaction.getOutTradeNo()); + if (order == null) return "订单不存在"; + if (order.getStatus().equals(0)) { + // 2.更新订单支付状态 + order.setUpdateTime(DateUtil.currentSeconds()); + order.setStatus(1); + thinkDepositService.updateById(order); + } + return "订单已支付"; + } + + @PostMapping("/refund-notify") + public ApiResult refundNotify(@RequestBody String body, @RequestHeader Map header) { + System.out.println("refund body = " + body); + RequestParam requestParam = new RequestParam.Builder() + .serialNumber(header.get("wechatpay-serial").toString()) + .nonce(header.get("wechatpay-nonce").toString()) + .signature(header.get("wechatpay-signature").toString()) + .timestamp(header.get("wechatpay-timestamp").toString()) + .body(body) + .build(); + NotificationConfig config = wechatConfigService.getNotificationConfig(); + // 初始化 NotificationParser + NotificationParser parser = new NotificationParser(config); + RefundNotification notification = parser.parse(requestParam, RefundNotification.class); + System.out.println("notification = " + notification); + String orderNum = notification.getOutTradeNo(); + ThinkDeposit thinkDeposit = thinkDepositService.getByOrderNo(orderNum); + if (notification.getRefundStatus().equals(Status.SUCCESS)) { + if (thinkDeposit != null) { + thinkDeposit.setRefundTime(DateUtil.currentSeconds()); + } + } else { + thinkDeposit.setStatus(3); + } + thinkDepositService.updateById(thinkDeposit); + return success(); + } @ApiOperation("分页查询") @GetMapping("/page") - public ApiResult> page(ThinkDepositParam param) { + public ApiResult page(ThinkDepositParam param) { + if (param.getForAdmin() == null) { + if (getLoginUser() == null) return fail("请先登录"); + param.setPhone(getLoginUser().getPhone()); + } // 使用关联查询 return success(thinkDepositService.pageRel(param)); } @@ -56,8 +131,19 @@ public class ThinkDepositController extends BaseController { @ApiOperation("添加") @PostMapping() public ApiResult save(@RequestBody ThinkDeposit thinkDeposit) { + User user = getLoginUser(); + ThinkUsers thinkUsers = thinkUsersService.getById(getLoginUser().getUid()); + thinkDeposit.setName(thinkUsers.getUsername()); + thinkDeposit.setPhone(user.getPhone()); + thinkDeposit.setOrderNum(IdUtil.getSnowflake().nextIdStr()); + thinkDeposit.setStatus(0); + thinkDeposit.setAid(0); + thinkDeposit.setCreateTime(DateUtil.currentSeconds()); + thinkDeposit.setUpdateTime(DateUtil.currentSeconds()); if (thinkDepositService.save(thinkDeposit)) { - return success("添加成功"); + String notify = "https://gxtyzx-api.websoft.top/api/think/think-deposit/notify"; + return success(thinkOrderService.createWxOrder(thinkDeposit.getMoney(), thinkDeposit.getOrderNum(), "押金", + getLoginUser().getOpenid(), notify)); } return fail("添加失败"); } @@ -66,6 +152,10 @@ public class ThinkDepositController extends BaseController { @PutMapping() public ApiResult update(@RequestBody ThinkDeposit thinkDeposit) { if (thinkDepositService.updateById(thinkDeposit)) { + ThinkDeposit thinkDeposit1 = thinkDepositService.getByIdRel(thinkDeposit.getId()); + if (thinkDeposit1.getMoneyType().equals(1) && thinkDeposit.getStatus().equals(2)) { + thinkDepositService.refund(thinkDeposit1); + } return success("修改成功"); } return fail("修改失败"); diff --git a/src/main/java/com/gxwebsoft/think/controller/ThinkDepositItemController.java b/src/main/java/com/gxwebsoft/think/controller/ThinkDepositItemController.java new file mode 100644 index 0000000..802c100 --- /dev/null +++ b/src/main/java/com/gxwebsoft/think/controller/ThinkDepositItemController.java @@ -0,0 +1,110 @@ +package com.gxwebsoft.think.controller; + +import com.gxwebsoft.common.core.web.BaseController; +import com.gxwebsoft.think.service.ThinkDepositItemService; +import com.gxwebsoft.think.entity.ThinkDepositItem; +import com.gxwebsoft.think.param.ThinkDepositItemParam; +import com.gxwebsoft.common.core.web.ApiResult; +import com.gxwebsoft.common.core.web.PageResult; +import com.gxwebsoft.common.core.web.PageParam; +import com.gxwebsoft.common.core.web.BatchParam; +import com.gxwebsoft.common.core.annotation.OperationLog; +import com.gxwebsoft.common.system.entity.User; +import io.swagger.annotations.Api; +import io.swagger.annotations.ApiOperation; +import org.springframework.security.access.prepost.PreAuthorize; +import org.springframework.web.bind.annotation.*; + +import javax.annotation.Resource; +import java.util.List; + +/** + * 押金物品控制器 + * + * @author 科技小王子 + * @since 2024-12-05 23:17:01 + */ +@Api(tags = "押金物品管理") +@RestController +@RequestMapping("/api/think/think-deposit-item") +public class ThinkDepositItemController extends BaseController { + @Resource + private ThinkDepositItemService thinkDepositItemService; + + @ApiOperation("分页查询押金物品") + @GetMapping("/page") + public ApiResult> page(ThinkDepositItemParam param) { + // 使用关联查询 + return success(thinkDepositItemService.pageRel(param)); + } + + @ApiOperation("查询全部押金物品") + @GetMapping() + public ApiResult> list(ThinkDepositItemParam param) { + // 使用关联查询 + return success(thinkDepositItemService.listRel(param)); + } + + @PreAuthorize("hasAuthority('think:thinkDepositItem:list')") + @ApiOperation("根据id查询押金物品") + @GetMapping("/{id}") + public ApiResult get(@PathVariable("id") Integer id) { + // 使用关联查询 + return success(thinkDepositItemService.getByIdRel(id)); + } + + @ApiOperation("添加押金物品") + @PostMapping() + public ApiResult save(@RequestBody ThinkDepositItem thinkDepositItem) { + if (thinkDepositItemService.save(thinkDepositItem)) { + return success("添加成功"); + } + return fail("添加失败"); + } + + @ApiOperation("修改押金物品") + @PutMapping() + public ApiResult update(@RequestBody ThinkDepositItem thinkDepositItem) { + if (thinkDepositItemService.updateById(thinkDepositItem)) { + return success("修改成功"); + } + return fail("修改失败"); + } + + @ApiOperation("删除押金物品") + @DeleteMapping("/{id}") + public ApiResult remove(@PathVariable("id") Integer id) { + if (thinkDepositItemService.removeById(id)) { + return success("删除成功"); + } + return fail("删除失败"); + } + + @ApiOperation("批量添加押金物品") + @PostMapping("/batch") + public ApiResult saveBatch(@RequestBody List list) { + if (thinkDepositItemService.saveBatch(list)) { + return success("添加成功"); + } + return fail("添加失败"); + } + + @ApiOperation("批量修改押金物品") + @PutMapping("/batch") + public ApiResult removeBatch(@RequestBody BatchParam batchParam) { + if (batchParam.update(thinkDepositItemService, "id")) { + return success("修改成功"); + } + return fail("修改失败"); + } + + @ApiOperation("批量删除押金物品") + @DeleteMapping("/batch") + public ApiResult removeBatch(@RequestBody List ids) { + if (thinkDepositItemService.removeByIds(ids)) { + return success("删除成功"); + } + return fail("删除失败"); + } + +} diff --git a/src/main/java/com/gxwebsoft/think/controller/ThinkGoodsController.java b/src/main/java/com/gxwebsoft/think/controller/ThinkGoodsController.java index 926c34a..6382483 100644 --- a/src/main/java/com/gxwebsoft/think/controller/ThinkGoodsController.java +++ b/src/main/java/com/gxwebsoft/think/controller/ThinkGoodsController.java @@ -45,7 +45,6 @@ public class ThinkGoodsController extends BaseController { return success(thinkGoodsService.listRel(param)); } - @PreAuthorize("hasAuthority('think:thinkGoods:list')") @ApiOperation("根据id查询") @GetMapping("/{id}") public ApiResult get(@PathVariable("id") Integer id) { diff --git a/src/main/java/com/gxwebsoft/think/controller/ThinkGoodsOrderController.java b/src/main/java/com/gxwebsoft/think/controller/ThinkGoodsOrderController.java index 46fa338..89fd38b 100644 --- a/src/main/java/com/gxwebsoft/think/controller/ThinkGoodsOrderController.java +++ b/src/main/java/com/gxwebsoft/think/controller/ThinkGoodsOrderController.java @@ -1,8 +1,12 @@ package com.gxwebsoft.think.controller; +import cn.hutool.core.date.DateUtil; +import cn.hutool.core.date.LocalDateTimeUtil; +import cn.hutool.core.util.IdUtil; +import cn.hutool.core.util.NumberUtil; import com.gxwebsoft.common.core.web.BaseController; -import com.gxwebsoft.think.service.ThinkGoodsOrderService; -import com.gxwebsoft.think.entity.ThinkGoodsOrder; +import com.gxwebsoft.think.entity.*; +import com.gxwebsoft.think.service.*; import com.gxwebsoft.think.param.ThinkGoodsOrderParam; import com.gxwebsoft.common.core.web.ApiResult; import com.gxwebsoft.common.core.web.PageResult; @@ -10,13 +14,23 @@ import com.gxwebsoft.common.core.web.PageParam; import com.gxwebsoft.common.core.web.BatchParam; import com.gxwebsoft.common.core.annotation.OperationLog; import com.gxwebsoft.common.system.entity.User; +import com.wechat.pay.java.core.notification.NotificationConfig; +import com.wechat.pay.java.core.notification.NotificationParser; +import com.wechat.pay.java.core.notification.RequestParam; import io.swagger.annotations.Api; import io.swagger.annotations.ApiOperation; +import me.chanjar.weixin.common.error.WxErrorException; import org.springframework.security.access.prepost.PreAuthorize; import org.springframework.web.bind.annotation.*; import javax.annotation.Resource; +import java.io.IOException; +import java.math.BigDecimal; +import java.time.LocalDateTime; import java.util.List; +import java.util.Map; + +import static com.gxwebsoft.think.consts.OrderStatusConsts.PAY_TYPE_WECHAT; /** * 控制器 @@ -30,11 +44,82 @@ import java.util.List; public class ThinkGoodsOrderController extends BaseController { @Resource private ThinkGoodsOrderService thinkGoodsOrderService; + @Resource + private WechatConfigService wechatConfigService; + @Resource + private ThinkUsersService thinkUsersService; + @Resource + private ThinkGoodsOrderInfoService thinkGoodsOrderInfoService; + @Resource + private ThinkOrderService thinkOrderService; + @Resource + private ThinkIntegralLogService thinkIntegralLogService; + + @ApiOperation("微信通知") + @PostMapping("/notify") + public String notify(@RequestBody String body, @RequestHeader Map header) { + System.out.println("支付通知 >>>>> "); + com.wechat.pay.java.core.notification.RequestParam requestParam = new RequestParam.Builder() + .serialNumber(header.get("wechatpay-serial").toString()) + .nonce(header.get("wechatpay-nonce").toString()) + .signature(header.get("wechatpay-signature").toString()) + .timestamp(header.get("wechatpay-timestamp").toString()) + .body(body) + .build(); + NotificationConfig config = wechatConfigService.getNotificationConfig(); + NotificationParser parser = new NotificationParser(config); + com.wechat.pay.java.service.payments.model.Transaction transaction = parser.parse(requestParam, com.wechat.pay.java.service.payments.model.Transaction.class); + // 查询订单信息 + final ThinkGoodsOrder order = thinkGoodsOrderService.getByOrderNum(transaction.getOutTradeNo()); + if (order == null) return "订单不存在"; + if (order.getPayStatus().equals(1)) { + updatePay(order, transaction.getTransactionId(), transaction.getAmount().getPayerTotal()); + } + return "订单已支付"; + } + + private void updatePay(ThinkGoodsOrder order, String transactionId, Integer payAmount) { + order.setPayStatus(1); + order.setWechatOrder(transactionId); +// order.setPayPrice(new BigDecimal(NumberUtil.decimalFormat("0.00", transaction.getAmount().getPayerTotal() * 0.01))); + order.setPayPrice(new BigDecimal(NumberUtil.decimalFormat("0.00", payAmount * 0.01))); + order.setPayTime((int) DateUtil.currentSeconds()); + if (order.getPayType().equals(1)) { + order.setWechatOrder(transactionId); + } + else if (order.getPayType().equals(2)) { + ThinkUsers thinkUsers = thinkUsersService.getById(order.getUid()); + BigDecimal oldPoint = thinkUsers.getIntegral(); + BigDecimal totalPoint = BigDecimal.ZERO; + List thinkGoodsOrderInfoList = thinkGoodsOrderInfoService.listInOrder(order.getId()); + String goodsName = thinkGoodsOrderInfoList.get(0).getTitle(); + for (ThinkGoodsOrderInfo info : thinkGoodsOrderInfoList) { + totalPoint = totalPoint.add(info.getIntegral()); + } + thinkUsers.setIntegral(thinkUsers.getIntegral().subtract(totalPoint)); + thinkUsersService.updateById(thinkUsers); + + ThinkIntegralLog thinkIntegralLog = new ThinkIntegralLog(); + thinkIntegralLog.setOrderNum(order.getOrderNum()); + thinkIntegralLog.setOid(order.getId()); + thinkIntegralLog.setSiteName(goodsName); + thinkIntegralLog.setUsername(thinkUsers.getUsername()); + thinkIntegralLog.setPhone(thinkUsers.getPhone()); + thinkIntegralLog.setIntegral(totalPoint); + thinkIntegralLog.setOldMoney(oldPoint); + thinkIntegralLog.setNewMoney(thinkUsers.getIntegral()); + thinkIntegralLog.setInfo("商城购买"); + thinkIntegralLog.setCreateTime((int) DateUtil.currentSeconds()); + thinkIntegralLogService.save(thinkIntegralLog); + } + thinkGoodsOrderService.updateById(order); + } @ApiOperation("分页查询") @GetMapping("/page") public ApiResult> page(ThinkGoodsOrderParam param) { // 使用关联查询 + param.setUid(getLoginUser().getUid()); return success(thinkGoodsOrderService.pageRel(param)); } @@ -45,23 +130,55 @@ public class ThinkGoodsOrderController extends BaseController { return success(thinkGoodsOrderService.listRel(param)); } - @PreAuthorize("hasAuthority('think:thinkGoodsOrder:list')") @ApiOperation("根据id查询") @GetMapping("/{id}") public ApiResult get(@PathVariable("id") Integer id) { + ThinkGoodsOrder thinkGoodsOrder = thinkGoodsOrderService.getByIdRel(id); + thinkGoodsOrder.setInfoList(thinkGoodsOrderInfoService.listInOrder(thinkGoodsOrder.getId())); // 使用关联查询 - return success(thinkGoodsOrderService.getByIdRel(id)); + return success(thinkGoodsOrder); } @ApiOperation("添加") @PostMapping() - public ApiResult save(@RequestBody ThinkGoodsOrder thinkGoodsOrder) { + public ApiResult save(@RequestBody ThinkGoodsOrder thinkGoodsOrder) throws IOException, WxErrorException { + User user = getLoginUser(); + if (user == null) return fail("请先登录"); + ThinkUsers thinkUsers = thinkUsersService.getById(user.getUid()); + if (thinkGoodsOrder.getPayType().equals(2)) { + BigDecimal totalPoint = BigDecimal.ZERO; + for (ThinkGoodsOrderInfo info : thinkGoodsOrder.getInfoList()) { + totalPoint = totalPoint.add(info.getIntegral()); + } + if (thinkUsers.getIntegral().compareTo(totalPoint) < 0) return fail("积分不足"); + } + thinkGoodsOrder.setUid(thinkUsers.getId()); + thinkGoodsOrder.setOrderNum(IdUtil.getSnowflake().nextIdStr()); + thinkGoodsOrder.setWechatOrder(""); + thinkGoodsOrder.setInfo("商城订单"); if (thinkGoodsOrderService.save(thinkGoodsOrder)) { - return success("添加成功"); + for (ThinkGoodsOrderInfo info : thinkGoodsOrder.getInfoList()) { + info.setOid(thinkGoodsOrder.getId()); + } + thinkGoodsOrderInfoService.saveBatch(thinkGoodsOrder.getInfoList()); + return onPay(thinkGoodsOrder); } return fail("添加失败"); } + private ApiResult onPay(ThinkGoodsOrder order) throws IOException, WxErrorException { + // 微信统一下单接口 + if (order.getPayType().equals(PAY_TYPE_WECHAT)) { + String desc = order.getInfoList().get(0).getTitle(); + return success("下单成功", thinkOrderService.createWxOrder(order.getPayPrice(), order.getOrderNum(), desc, getLoginUser().getOpenid())); + } + if (order.getPayType().equals(2)) { + updatePay(order, null, order.getTotalPrice().multiply(BigDecimal.valueOf(100)).intValue()); + return success("支付成功", order.getId()); + } + return fail("支付失败"); + } + @ApiOperation("修改") @PutMapping() public ApiResult update(@RequestBody ThinkGoodsOrder thinkGoodsOrder) { diff --git a/src/main/java/com/gxwebsoft/think/controller/ThinkIntegralController.java b/src/main/java/com/gxwebsoft/think/controller/ThinkIntegralController.java index d43dfe9..d30acbd 100644 --- a/src/main/java/com/gxwebsoft/think/controller/ThinkIntegralController.java +++ b/src/main/java/com/gxwebsoft/think/controller/ThinkIntegralController.java @@ -36,6 +36,13 @@ public class ThinkIntegralController extends BaseController { @Resource private ThinkUsersService thinkUsersService; + @ApiOperation("检查") + @PostMapping("/check") + public ApiResult check() { + // 使用关联查询 + return success(thinkIntegralService.check(getLoginUser().getUid())); + } + @ApiOperation("分页查询") @GetMapping("/page") public ApiResult> page(ThinkIntegralParam param) { @@ -46,6 +53,7 @@ public class ThinkIntegralController extends BaseController { @ApiOperation("查询全部") @GetMapping() public ApiResult> list(ThinkIntegralParam param) { + param.setUid(getLoginUser().getUid()); // 使用关联查询 return success(thinkIntegralService.listRel(param)); } @@ -59,30 +67,31 @@ public class ThinkIntegralController extends BaseController { @ApiOperation("添加") @PostMapping() - public ApiResult save(@RequestBody ThinkIntegral thinkIntegral) { - final User loginUser = getLoginUser(); - if (ObjectUtil.isEmpty(loginUser)) { - return fail("请先登录"); - } - final ThinkUsers users = thinkUsersService.getById(getLoginUser().getUid()); - thinkIntegral.setUid(users.getId()); - thinkIntegral.setUsername(users.getUsername()); - thinkIntegral.setPhone(users.getPhone()); - thinkIntegral.setIntegral(new BigDecimal("1")); - thinkIntegral.setDateTime(DateUtil.today()); - thinkIntegral.setDay(String.valueOf(DateUtil.thisDayOfMonth())); - thinkIntegral.setCreateTime((int) DateUtil.currentSeconds()); + public ApiResult save() { + final User loginUser = getLoginUser(); + if (ObjectUtil.isEmpty(loginUser)) { + return fail("请先登录"); + } + if (thinkIntegralService.check(getLoginUser().getUid()) != null) { + return fail("您今天已经签到过了"); + } + final ThinkUsers users = thinkUsersService.getById(getLoginUser().getUid()); + ThinkIntegral thinkIntegral = new ThinkIntegral(); + thinkIntegral.setUid(users.getId()); + thinkIntegral.setUsername(users.getUsername()); + thinkIntegral.setPhone(users.getPhone()); + thinkIntegral.setIntegral(new BigDecimal("1")); + thinkIntegral.setDateTime(DateUtil.today()); + thinkIntegral.setDay(String.valueOf(DateUtil.thisDayOfMonth())); + thinkIntegral.setCreateTime((int) DateUtil.currentSeconds()); - if (thinkIntegralService.count(new LambdaUpdateWrapper().eq(ThinkIntegral::getId,users.getId()).eq(ThinkIntegral::getDateTime, DateUtil.today())) > 0) { - return fail("您今天已经签到过了."); - } - if (thinkIntegralService.save(thinkIntegral)) { - // 累计积分 - users.setIntegral(users.getIntegral().add(thinkIntegral.getIntegral())); - thinkUsersService.updateById(users); - return success("签到成功"); - } - return fail("签到失败"); + if (thinkIntegralService.save(thinkIntegral)) { + // 累计积分 + users.setIntegral(users.getIntegral().add(thinkIntegral.getIntegral())); + thinkUsersService.updateById(users); + return success("签到成功"); + } + return fail("签到失败"); } @ApiOperation("修改") @@ -133,13 +142,13 @@ public class ThinkIntegralController extends BaseController { @ApiOperation("本月签到数据") @GetMapping("/getSignData") public ApiResult getSignData(ThinkIntegralParam param) { - final User loginUser = getLoginUser(); - if(loginUser == null){ - return fail("请先登录"); - } - String message = thinkIntegralService.count(new LambdaUpdateWrapper().eq(ThinkIntegral::getPhone,loginUser.getPhone()).eq(ThinkIntegral::getDateTime, DateUtil.today())) > 0 ? "您今天已经签到过了" : "操作成功"; - final List list = thinkIntegralService.list(new LambdaUpdateWrapper().eq(ThinkIntegral::getPhone,loginUser.getPhone()).like(ThinkIntegral::getDateTime, param.getDateTime())); - return success(message,list); + final User loginUser = getLoginUser(); + if (loginUser == null) { + return fail("请先登录"); + } + String message = thinkIntegralService.count(new LambdaUpdateWrapper().eq(ThinkIntegral::getPhone, loginUser.getPhone()).eq(ThinkIntegral::getDateTime, DateUtil.today())) > 0 ? "您今天已经签到过了" : "操作成功"; + final List list = thinkIntegralService.list(new LambdaUpdateWrapper().eq(ThinkIntegral::getPhone, loginUser.getPhone()).like(ThinkIntegral::getDateTime, param.getDateTime())); + return success(message, list); } } diff --git a/src/main/java/com/gxwebsoft/think/controller/ThinkInvoiceController.java b/src/main/java/com/gxwebsoft/think/controller/ThinkInvoiceController.java index a900c49..7184bd0 100644 --- a/src/main/java/com/gxwebsoft/think/controller/ThinkInvoiceController.java +++ b/src/main/java/com/gxwebsoft/think/controller/ThinkInvoiceController.java @@ -1,6 +1,7 @@ package com.gxwebsoft.think.controller; import cn.hutool.core.date.DateUtil; +import cn.hutool.core.util.RandomUtil; import cn.hutool.core.util.StrUtil; import com.alibaba.fastjson.JSONObject; import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; @@ -11,9 +12,7 @@ import com.gxwebsoft.common.core.web.BatchParam; import com.gxwebsoft.common.core.web.PageResult; import com.gxwebsoft.think.entity.*; import com.gxwebsoft.think.param.ThinkInvoiceParam; -import com.gxwebsoft.think.service.ThinkInvoiceService; -import com.gxwebsoft.think.service.ThinkOrderInfoService; -import com.gxwebsoft.think.service.ThinkOrderService; +import com.gxwebsoft.think.service.*; import io.swagger.annotations.Api; import io.swagger.annotations.ApiOperation; import nuonuo.open.sdk.NNOpenSDK; @@ -44,10 +43,21 @@ public class ThinkInvoiceController extends BaseController { private ThinkOrderService thinkOrderService; @Resource private ThinkOrderInfoService thinkOrderInfoService; + @Resource + private ThinkUsersVipService thinkUsersVipService; + @Resource + private ThinkSiteService thinkSiteService; + + private final String taxnum = "339901999999142"; + private final String appKey = "SD56531018"; + private final String appSecret = "SD3C429B318C485E"; + private final String sellerTel = "339901999999142"; + private final String url = "https://sandbox.nuonuocs.cn/open/v1/services"; @ApiOperation("分页查询") @GetMapping("/page") public ApiResult> page(ThinkInvoiceParam param) { + if (param.getForAdmin() == null) param.setUid(getLoginUser().getUid()); // 使用关联查询 return success(thinkInvoiceService.pageRel(param)); } @@ -70,8 +80,25 @@ public class ThinkInvoiceController extends BaseController { @ApiOperation("添加") @PostMapping() public ApiResult save(@RequestBody ThinkInvoice thinkInvoice) { + thinkInvoice.setIncoiveNum(""); + thinkInvoice.setUid(getLoginUser().getUid()); + thinkInvoice.setCode(thinkInvoice.getIncoiveCode()); + thinkInvoice.setIncoiveNum(RandomUtil.randomString(20)); + thinkInvoice.setIsOpen(2); + thinkInvoice.setCreateTime(DateUtil.currentSeconds()); + thinkInvoice.setUpdateTime(DateUtil.currentSeconds()); + if (thinkInvoice.getItype().equals(1)) { + List thinkOrderInfoList = thinkOrderInfoService.listInOrder(thinkInvoice.getOid()); + ThinkOrderInfo thinkOrderInfo = thinkOrderInfoList.get(0); + thinkInvoice.setInfo(thinkOrderInfo.getSiteName() + "-" + thinkOrderInfo.getFieldName() + "(" + thinkOrderInfo.getDateTime() + ")"); + } else if (thinkInvoice.getItype().equals(2)) { + ThinkUsersVip thinkUsersVip = thinkUsersVipService.getById(thinkInvoice.getOid()); + thinkInvoice.setInfo(thinkUsersVip.getName() + " 微信订单号: " + thinkUsersVip.getWechatOrder()); + } else if (thinkInvoice.getItype().equals(4)) { + thinkInvoice.setInfo("租赁发票"); + } if (thinkInvoiceService.save(thinkInvoice)) { - return success("添加成功"); + return success("添加成功", thinkInvoice); } return fail("添加失败"); } @@ -122,124 +149,137 @@ public class ThinkInvoiceController extends BaseController { } - @ApiOperation("开具发票") - @PostMapping("/doInvoice") - public ApiResult doInvoice(@RequestBody ThinkInvoice thinkInvoice) { - System.out.println("thinkInvoice = " + thinkInvoice); - final Integer oid = thinkInvoice.getOid(); - final ThinkOrder thinkOrder = thinkOrderService.getById(thinkInvoice.getOid()); - System.out.println("thinkOrder = " + thinkOrder); - final List orderInfos = thinkOrderInfoService.list(new LambdaQueryWrapper().eq(ThinkOrderInfo::getOid,thinkInvoice.getOid())); + @ApiOperation("开具发票") + @PostMapping("/doInvoice") + public ApiResult doInvoice(@RequestBody ThinkInvoice thinkInvoice) { +// System.out.println("thinkInvoice = " + thinkInvoice); +// final Integer oid = thinkInvoice.getOid(); +// final ThinkOrder thinkOrder = thinkOrderService.getById(thinkInvoice.getOid()); +// System.out.println("thinkOrder = " + thinkOrder); +// final List orderInfos = thinkOrderInfoService.list(new LambdaQueryWrapper().eq(ThinkOrderInfo::getOid, thinkInvoice.getOid())); + thinkInvoice.setStatus(1); + thinkInvoiceService.updateById(thinkInvoice); + // 开票接口 + NNOpenSDK sdk = NNOpenSDK.getIntance(); +// String appKey = "92969434"; +// String appSecret = "D51901886E454FEF"; + String method = "nuonuo.OpeMplatform.requestBillingNew";//API方法名 + String token = NNOpenSDK.getIntance().getMerchantToken(appKey, appSecret); //访问令牌 + final NuoNuo nuoNuo = new NuoNuo(); + final NuoNuoOrder order = new NuoNuoOrder(); + order.setBuyerName(thinkInvoice.getName()); + order.setBuyerTaxNum(thinkInvoice.getCode()); + order.setBuyerPhone(thinkInvoice.getPhone()); + order.setSalerTaxNum(taxnum); // 91450100737617400R + order.setSalerTel(sellerTel); + order.setOrderNo((thinkInvoice.getOrderNum() == null || thinkInvoice.getOrderNum().isEmpty()) ? thinkInvoice.getIncoiveNum() : thinkInvoice.getOrderNum()); + order.setInvoiceDate(DateUtil.now()); + order.setClerk("赵裕璐"); + order.setPayee("班嘉良"); + order.setChecker("蓝蕙孚"); + order.setInvoiceType(String.valueOf(thinkInvoice.getInvoicetype())); + order.setRemark("不动产地址:广西壮族自治区南宁市良庆区五象大道西段669号广西体育中心综合馆;(市)标志:否;"); + final NuoNuoGoods goods = new NuoNuoGoods(); + goods.setGoodsName(thinkInvoice.getInfo()); +// goods.setGoodsCode("3040502029902000000"); + goods.setWithTaxFlag("0"); +// if (!CollectionUtils.isEmpty(orderInfos)) { +// final ThinkOrderInfo thinkOrderInfo = orderInfos.get(0); +// if (thinkOrderInfo != null) { +// goods.setDField1(thinkOrderInfo.getDateTime()); +// } +// } + goods.setDField1("无"); + goods.setDField2("无"); + goods.setDField3("无"); + goods.setDField4("无"); + goods.setDField5("无"); + goods.setTaxRate(new BigDecimal("0.05").toString()); + final BigDecimal taxExcludedAmount = thinkInvoice.getPrice().divide(new BigDecimal("1.05"), 4, RoundingMode.HALF_UP); + final BigDecimal tax = taxExcludedAmount.multiply(new BigDecimal("0.05")).setScale(4, RoundingMode.HALF_EVEN); + goods.setTax(tax.toString()); + goods.setTaxExcludedAmount(taxExcludedAmount.toString()); + goods.setTaxIncludedAmount(thinkInvoice.getPrice().toString()); + order.setInvoiceDetail(goods); +// System.out.println("税额 = " + tax); +// System.out.println("不含税金额 = " + taxExcludedAmount); +// System.out.println("含税金额 = " + thinkOrder.getTotalPrice()); + if (thinkInvoice.getItype().equals(1)) { + final ThinkOrder thinkOrder = thinkOrderService.getById(thinkInvoice.getOid()); + NuoNuoRealPropertyRentInfo nuoNuoRealPropertyRentInfo = new NuoNuoRealPropertyRentInfo(); + ThinkSite thinkSite = thinkSiteService.getById(thinkOrder.getSid()); + nuoNuoRealPropertyRentInfo.setRealPropertyAddress(thinkSite.getProvince() + thinkSite.getCity() + thinkSite.getRegion()); + nuoNuoRealPropertyRentInfo.setDetailAddress(thinkSite.getAddress()); + nuoNuoRealPropertyRentInfo.setRealPropertyCertificate(thinkSite.getRealPropertyCertificate()); + nuoNuoRealPropertyRentInfo.setRentStartDate(thinkSite.getRentStartDate()); + nuoNuoRealPropertyRentInfo.setRentEndDate(thinkSite.getRentEndDate()); + nuoNuoRealPropertyRentInfo.setCrossCityFlag("0"); + order.setRealPropertyRentInfo(nuoNuoRealPropertyRentInfo); + } else if (thinkInvoice.getItype().equals(4)) { + NuoNuoRealPropertyRentInfo nuoNuoRealPropertyRentInfo = new NuoNuoRealPropertyRentInfo(); + nuoNuoRealPropertyRentInfo.setRealPropertyAddress("广西壮族自治区南宁市良庆区"); + nuoNuoRealPropertyRentInfo.setDetailAddress("五象大道西段669号"); +// nuoNuoRealPropertyRentInfo.setRealPropertyCertificate(thinkSite.getRealPropertyCertificate()); + nuoNuoRealPropertyRentInfo.setRentStartDate(thinkInvoice.getRentStartDate()); + nuoNuoRealPropertyRentInfo.setRentEndDate(thinkInvoice.getRentEndDate()); + nuoNuoRealPropertyRentInfo.setCrossCityFlag("0"); + order.setRealPropertyRentInfo(nuoNuoRealPropertyRentInfo); + } + nuoNuo.setOrder(order); - // 开票接口 - NNOpenSDK sdk = NNOpenSDK.getIntance(); - String taxnum = "339901999999142";//ISV下授权商户税号,自用型应用置""即可 - String appKey = "SD56531018"; - String appSecret = "SD3C429B318C485E"; - String method = "nuonuo.OpeMplatform.requestBillingNew";//API方法名 - String token = NNOpenSDK.getIntance().getMerchantToken("SD56531018", "SD3C429B318C485E"); //访问令牌 - final NuoNuo nuoNuo = new NuoNuo(); - final NuoNuoOrder order = new NuoNuoOrder(); - order.setBuyerName(thinkInvoice.getName()); - order.setBuyerTaxNum(thinkInvoice.getCode()); -// order.setBuyerPhone(thinkInvoice.getPhone()); -// order.setSalerTaxNum(invoice.getInvoiceCode()); -// order.setSalerTel(invoice.getPhone()); - order.setSalerTaxNum("339901999999142"); // 91450100737617400R - order.setSalerTel("339901999999142"); - order.setOrderNo(thinkOrder.getOrderNum()); - order.setInvoiceDate(DateUtil.now()); - order.setClerk("赵裕璐"); - order.setPayee("班嘉良"); - order.setChecker("蓝蕙孚"); - order.setBuyerPhone(thinkInvoice.getPhone()); - order.setInvoiceType(String.valueOf(thinkInvoice.getInvoicetype())); - order.setRemark("不动产地址:广西壮族自治区南宁市良庆区五象大道西段669号广西体育中心综合馆;(市)标志:否;"); - final NuoNuoGoods goods = new NuoNuoGoods(); - goods.setGoodsName("场地费"); - goods.setGoodsCode("3040502029902000000"); - goods.setWithTaxFlag("0"); - if (!CollectionUtils.isEmpty(orderInfos)) { - final ThinkOrderInfo thinkOrderInfo = orderInfos.get(0); - if (thinkOrderInfo != null) { - goods.setDField1(thinkOrderInfo.getDateTime()); - } + + String content = JSONUtil.toJSONString(nuoNuo);//API私有请求参数 + String senid = UUID.randomUUID().toString(); // 唯一标识,由企业自己生成32位随机码 + String json = sdk.sendPostSyncRequest(url, senid, appKey, appSecret, token, taxnum, method, content); // 请求API + System.out.println("json = " + json); + if (StrUtil.isNotBlank(json)) { + final JSONObject jsonObject = JSONObject.parseObject(json); + final String code = jsonObject.getString("code"); + final String result = jsonObject.getString("result"); + System.out.println("jsonObject = " + jsonObject); + if (code.equals("E0000")) { + final JSONObject resNo = JSONObject.parseObject(result); + final String invoiceSerialNum = resNo.getString("invoiceSerialNum"); + if (thinkInvoice.getItype().equals(1)) { + final ThinkOrder thinkOrder = thinkOrderService.getById(thinkInvoice.getOid()); + thinkOrder.setIsInvoice(1); + thinkOrderService.updateById(thinkOrder); + } else if (thinkInvoice.getItype().equals(2)) { + final ThinkUsersVip thinkUsersVip = thinkUsersVipService.getById(thinkInvoice.getOid()); + thinkUsersVip.setIsInvoice(1); + thinkUsersVipService.updateById(thinkUsersVip); + } + System.out.println("invoiceSerialNum = " + invoiceSerialNum); + thinkInvoice.setIncoiveNum(invoiceSerialNum); + thinkInvoice.setIsOpen(1); + thinkInvoiceService.updateById(thinkInvoice); + return success("发票开具成功", json); + } + } + return fail("发票开具失败"); } - goods.setDField2("无"); - goods.setDField3("无"); - goods.setDField4("无"); - goods.setDField5("无"); - goods.setTaxRate(new BigDecimal("0.05").toString()); - final BigDecimal taxExcludedAmount = thinkOrder.getTotalPrice().divide(new BigDecimal("1.05"), 4, RoundingMode.HALF_UP); - final BigDecimal tax = taxExcludedAmount.multiply(new BigDecimal("0.05")).setScale(4,RoundingMode.HALF_EVEN); - goods.setTax(tax.toString()); - goods.setTaxExcludedAmount(taxExcludedAmount.toString()); - goods.setTaxIncludedAmount(thinkOrder.getTotalPrice().toString()); - order.setInvoiceDetail(goods); - System.out.println("税额 = " + tax); - System.out.println("不含税金额 = " + taxExcludedAmount); - System.out.println("含税金额 = " + thinkOrder.getTotalPrice()); - nuoNuo.setOrder(order); - String content = JSONUtil.toJSONString(nuoNuo);//API私有请求参数 - String url = "https://sandbox.nuonuocs.cn/open/v1/services"; //SDK请求地址 - String senid = UUID.randomUUID().toString(); // 唯一标识,由企业自己生成32位随机码 - String json = sdk.sendPostSyncRequest(url, senid, appKey, appSecret, token, taxnum, method, content); // 请求API - System.out.println("json = " + json); - if (StrUtil.isNotBlank(json)) { - final JSONObject jsonObject = JSONObject.parseObject(json); - final String code = jsonObject.getString("code"); - final String result = jsonObject.getString("result"); - System.out.println("jsonObject = " + jsonObject); - if (code.equals("E0000")) { - final JSONObject resNo = JSONObject.parseObject(result); - final String invoiceSerialNum = resNo.getString("invoiceSerialNum"); - thinkOrder.setIsInvoice(1); - thinkOrderService.updateById(thinkOrder); - System.out.println("invoiceSerialNum = " + invoiceSerialNum); - thinkInvoice.setId(null); - thinkInvoice.setIncoiveNum(invoiceSerialNum); - thinkInvoice.setIncoiveCode("339901999999142"); - thinkInvoice.setUid(thinkOrder.getUid()); - thinkInvoice.setCreateTime(System.currentTimeMillis()/1000); - thinkInvoiceService.save(thinkInvoice); - return success("发票开具成功", json); - } + @ApiOperation("根据id查询发票") + @GetMapping("/showInvoice/{id}") + public ApiResult showInvoice(@PathVariable("id") Integer id) { + final ThinkInvoice thinkInvoice = thinkInvoiceService.getById(id); + NNOpenSDK sdk = NNOpenSDK.getIntance(); + String method = "nuonuo.OpeMplatform.queryInvoiceResult";//API方法名 + String token = NNOpenSDK.getIntance().getMerchantToken(appKey, appSecret); //访问令牌 + + HashMap map = new HashMap<>(); + map.put("serialNos", thinkInvoice.getIncoiveNum()); + String content = JSONUtil.toJSONString(map);//API私有请求参数 + String senid = UUID.randomUUID().toString(); // 唯一标识,由企业自己生成32位随机码 + + String result = sdk.sendPostSyncRequest(url, senid, appKey, appSecret, token, taxnum, method, content); + final JSONObject jsonObject = JSONObject.parseObject(result); + final String code = jsonObject.getString("code"); + final String body = jsonObject.getString("result"); + if (code.equals("E0000")) { + return success("查询成功", body); + } + return success("查询失败", result); } - return fail("发票开具失败"); - } - - @ApiOperation("根据id查询发票") - @GetMapping("/showInvoice/{orderId}") - public ApiResult showInvoice(@PathVariable("orderId") Integer orderId) { - final ThinkInvoice thinkInvoice = thinkInvoiceService.getOne(new LambdaQueryWrapper().eq(ThinkInvoice::getOid,orderId)); - System.out.println("thinkInvoice = " + thinkInvoice); - NNOpenSDK sdk = NNOpenSDK.getIntance(); - String taxnum = "339901999999142";//ISV下授权商户税号,自用型应用置""即可 - String appKey = "SD56531018"; - String appSecret = "SD3C429B318C485E"; - String method = "nuonuo.OpeMplatform.queryInvoiceResult";//API方法名 - String token = NNOpenSDK.getIntance().getMerchantToken("SD56531018", "SD3C429B318C485E"); //访问令牌 - - HashMap map = new HashMap<>(); -// map.put("invoiceCode",invoiceNo); - map.put("serialNos", thinkInvoice.getIncoiveNum()); -// map.put("inTaxAmount", order.getPayPrice().subtract(order.getPayPrice().multiply(new BigDecimal("0.06")))); // 含税金额 -// map.put("exTaxAmount", order.getPayPrice()); // 不含税金额 - System.out.println("map = " + map); - String content = JSONUtil.toJSONString(map);//API私有请求参数 - String url = "https://sandbox.nuonuocs.cn/open/v1/services"; //SDK请求地址 - String senid = UUID.randomUUID().toString(); // 唯一标识,由企业自己生成32位随机码 - - String result = sdk.sendPostSyncRequest(url, senid, appKey, appSecret, token, taxnum, method, content); - System.out.println("result = " + result); - final JSONObject jsonObject = JSONObject.parseObject(result); - final String code = jsonObject.getString("code"); - final String body = jsonObject.getString("result"); - if (code.equals("E0000")) { - return success("查询成功", body); - } - return success("查询失败", result); - } } diff --git a/src/main/java/com/gxwebsoft/think/controller/ThinkMachineOpenLogController.java b/src/main/java/com/gxwebsoft/think/controller/ThinkMachineOpenLogController.java new file mode 100644 index 0000000..ebed295 --- /dev/null +++ b/src/main/java/com/gxwebsoft/think/controller/ThinkMachineOpenLogController.java @@ -0,0 +1,126 @@ +package com.gxwebsoft.think.controller; + +import com.gxwebsoft.common.core.web.BaseController; +import com.gxwebsoft.think.entity.ThinkOrder; +import com.gxwebsoft.think.service.ThinkMachineOpenLogService; +import com.gxwebsoft.think.entity.ThinkMachineOpenLog; +import com.gxwebsoft.think.param.ThinkMachineOpenLogParam; +import com.gxwebsoft.common.core.web.ApiResult; +import com.gxwebsoft.common.core.web.PageResult; +import com.gxwebsoft.common.core.web.PageParam; +import com.gxwebsoft.common.core.web.BatchParam; +import com.gxwebsoft.common.core.annotation.OperationLog; +import com.gxwebsoft.common.system.entity.User; +import com.gxwebsoft.think.service.ThinkOrderService; +import io.swagger.annotations.Api; +import io.swagger.annotations.ApiOperation; +import org.springframework.security.access.prepost.PreAuthorize; +import org.springframework.web.bind.annotation.*; + +import javax.annotation.Resource; +import java.util.List; +import java.util.Map; + +/** + * 闸机开门记录控制器 + * + * @author 科技小王子 + * @since 2024-11-28 18:22:35 + */ +@Api(tags = "闸机开门记录管理") +@RestController +@RequestMapping("/api/think/think-machine-open-log") +public class ThinkMachineOpenLogController extends BaseController { + @Resource + private ThinkMachineOpenLogService thinkMachineOpenLogService; + @Resource + private ThinkOrderService thinkOrderService; + + @ApiOperation("分页查询闸机开门记录") + @GetMapping("/page") + public ApiResult> page(ThinkMachineOpenLogParam param) { + // 使用关联查询 + return success(thinkMachineOpenLogService.pageRel(param)); + } + + @ApiOperation("查询全部闸机开门记录") + @GetMapping() + public ApiResult> list(ThinkMachineOpenLogParam param) { + // 使用关联查询 + return success(thinkMachineOpenLogService.listRel(param)); + } + + @PreAuthorize("hasAuthority('think:thinkMachineOpenLog:list')") + @ApiOperation("根据id查询闸机开门记录") + @GetMapping("/{id}") + public ApiResult get(@PathVariable("id") Integer id) { + // 使用关联查询 + return success(thinkMachineOpenLogService.getByIdRel(id)); + } + + @ApiOperation("添加闸机开门记录") + @PostMapping() + public ApiResult save(@RequestBody ThinkMachineOpenLog thinkMachineOpenLog) { + if (thinkMachineOpenLog.getQrcode() == null || thinkMachineOpenLog.getQrcode().isEmpty()) + return fail("二维码不能为空"); + String[] qrcode = thinkMachineOpenLog.getQrcode().split(","); + for (String s : qrcode) { + Map res = thinkOrderService.getByQrCode(s); + ThinkOrder thinkOrder = (ThinkOrder) res.get("data"); + if (thinkOrder != null) { + ThinkMachineOpenLog openLog = thinkMachineOpenLogService.getByOrderId(thinkOrder.getId()); + if (openLog == null) { + thinkMachineOpenLog.setOrderId(thinkOrder.getId()); + thinkMachineOpenLogService.save(thinkMachineOpenLog); + } + } + } + return success("添加成功"); + } + + @ApiOperation("修改闸机开门记录") + @PutMapping() + public ApiResult update(@RequestBody ThinkMachineOpenLog thinkMachineOpenLog) { + if (thinkMachineOpenLogService.updateById(thinkMachineOpenLog)) { + return success("修改成功"); + } + return fail("修改失败"); + } + + @ApiOperation("删除闸机开门记录") + @DeleteMapping("/{id}") + public ApiResult remove(@PathVariable("id") Integer id) { + if (thinkMachineOpenLogService.removeById(id)) { + return success("删除成功"); + } + return fail("删除失败"); + } + + @ApiOperation("批量添加闸机开门记录") + @PostMapping("/batch") + public ApiResult saveBatch(@RequestBody List list) { + if (thinkMachineOpenLogService.saveBatch(list)) { + return success("添加成功"); + } + return fail("添加失败"); + } + + @ApiOperation("批量修改闸机开门记录") + @PutMapping("/batch") + public ApiResult removeBatch(@RequestBody BatchParam batchParam) { + if (batchParam.update(thinkMachineOpenLogService, "id")) { + return success("修改成功"); + } + return fail("修改失败"); + } + + @ApiOperation("批量删除闸机开门记录") + @DeleteMapping("/batch") + public ApiResult removeBatch(@RequestBody List ids) { + if (thinkMachineOpenLogService.removeByIds(ids)) { + return success("删除成功"); + } + return fail("删除失败"); + } + +} diff --git a/src/main/java/com/gxwebsoft/think/controller/ThinkOrderController.java b/src/main/java/com/gxwebsoft/think/controller/ThinkOrderController.java index e42431a..b900ea4 100644 --- a/src/main/java/com/gxwebsoft/think/controller/ThinkOrderController.java +++ b/src/main/java/com/gxwebsoft/think/controller/ThinkOrderController.java @@ -6,27 +6,28 @@ import cn.hutool.core.date.LocalDateTimeUtil; import cn.hutool.core.io.FileUtil; import cn.hutool.core.util.IdUtil; import cn.hutool.core.util.NumberUtil; +import cn.hutool.crypto.SecureUtil; +import cn.hutool.crypto.symmetric.SymmetricAlgorithm; +import cn.hutool.crypto.symmetric.SymmetricCrypto; import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; +import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; import com.baomidou.mybatisplus.core.conditions.update.LambdaUpdateWrapper; +import com.gxwebsoft.common.core.config.ConfigProperties; import com.gxwebsoft.common.core.exception.BusinessException; +import com.gxwebsoft.common.core.utils.RedisUtil; import com.gxwebsoft.common.core.web.ApiResult; import com.gxwebsoft.common.core.web.BaseController; import com.gxwebsoft.common.core.web.BatchParam; import com.gxwebsoft.common.core.web.PageResult; +import com.gxwebsoft.common.system.entity.FileRecord; import com.gxwebsoft.common.system.entity.User; import com.gxwebsoft.shop.entity.Cart; import com.gxwebsoft.shop.entity.Goods; import com.gxwebsoft.shop.entity.OrderGoods; import com.gxwebsoft.shop.entity.OrderInfo; -import com.gxwebsoft.think.entity.ThinkOrder; -import com.gxwebsoft.think.entity.ThinkOrderInfo; -import com.gxwebsoft.think.entity.ThinkSiteTime; -import com.gxwebsoft.think.entity.ThinkUsersVip; +import com.gxwebsoft.think.entity.*; import com.gxwebsoft.think.param.ThinkOrderParam; -import com.gxwebsoft.think.service.ThinkOrderInfoService; -import com.gxwebsoft.think.service.ThinkOrderService; -import com.gxwebsoft.think.service.ThinkSiteTimeService; -import com.gxwebsoft.think.service.WechatConfigService; +import com.gxwebsoft.think.service.*; import com.wechat.pay.java.core.Config; import com.wechat.pay.java.core.RSAAutoCertificateConfig; import com.wechat.pay.java.core.notification.NotificationConfig; @@ -37,17 +38,26 @@ import com.wechat.pay.java.service.payments.model.TransactionAmount; import io.swagger.annotations.Api; import io.swagger.annotations.ApiOperation; import me.chanjar.weixin.common.error.WxErrorException; +import org.apache.poi.ss.usermodel.CellStyle; +import org.apache.poi.ss.usermodel.Font; +import org.apache.poi.ss.usermodel.HorizontalAlignment; +import org.apache.poi.ss.util.CellRangeAddress; +import org.apache.poi.xssf.streaming.SXSSFRow; +import org.apache.poi.xssf.streaming.SXSSFSheet; +import org.apache.poi.xssf.streaming.SXSSFWorkbook; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.beans.factory.annotation.Value; import org.springframework.web.bind.annotation.*; import javax.annotation.Resource; import javax.servlet.http.HttpServletRequest; +import java.io.FileOutputStream; import java.io.IOException; import java.math.BigDecimal; +import java.math.RoundingMode; +import java.nio.charset.StandardCharsets; import java.time.LocalDateTime; -import java.util.Date; -import java.util.List; -import java.util.Map; -import java.util.Set; +import java.util.*; import java.util.stream.Collectors; import static com.gxwebsoft.think.consts.OrderStatusConsts.PAY_TYPE_WECHAT; @@ -70,8 +80,24 @@ public class ThinkOrderController extends BaseController { private ThinkOrderInfoService thinkOrderInfoService; @Resource private WechatConfigService wechatConfigService; + @Resource + private ThinkUsersVipService thinkUsersVipService; + @Resource + private ThinkCardService thinkCardService; + @Resource + private ThinkVipCardsBillsService thinkVipCardsBillsService; + @Resource + private ThinkSiteService thinkSiteService; - public static String privateKeyPath = "/www/jar/gxtyzx-java/file/93dc8f750fee4eeaa5fb0a768982d639.pem"; + @Autowired + private RedisUtil redisUtil; + + @Value("${config.upload-path}") + private String uploadPath; + @Value("${config.server-url}") + private String serverUrl; + @Resource + private ConfigProperties config; // private NotificationConfig config; @@ -86,14 +112,6 @@ public class ThinkOrderController extends BaseController { .timestamp(header.get("wechatpay-timestamp").toString()) .body(body) .build(); -// if (config == null) { -// config = new RSAAutoCertificateConfig.Builder() -// .merchantId("1604773943") -// .privateKeyFromPath(privateKeyPath) -// .merchantSerialNumber("5EE433741F4AEF889636C423A1CE099090802CBE") -// .apiV3Key("c08jFf8304G8t2jcjFRKTe0t8F43Hjti") -// .build(); -// } NotificationConfig config = wechatConfigService.getNotificationConfig(); NotificationParser parser = new NotificationParser(config); com.wechat.pay.java.service.payments.model.Transaction transaction = parser.parse(requestParam, com.wechat.pay.java.service.payments.model.Transaction.class); @@ -101,36 +119,120 @@ public class ThinkOrderController extends BaseController { final ThinkOrder order = thinkOrderService.getByOrderNum(transaction.getOutTradeNo()); if (order == null) return "订单不存在"; if (order.getPayStatus().equals(2)) { - // 2.更新订单支付状态 - order.setPayStatus(1); - order.setWechatOrder(transaction.getTransactionId()); - order.setPayPrice(new BigDecimal(NumberUtil.decimalFormat("0.00", transaction.getAmount().getPayerTotal() * 0.01))); - order.setPrice(new BigDecimal(NumberUtil.decimalFormat("0.00", transaction.getAmount().getPayerTotal() * 0.01))); - order.setPayTime((int) DateUtil.currentSeconds()); - order.setQrcode("qrcode/" + LocalDateTimeUtil.format(LocalDateTime.now(), "yyyyMMdd") + "/" + IdUtil.getSnowflake().nextIdStr() + ".png"); - thinkOrderService.updateById(order); - // 更新订单商品的支付状态 - if (order.getType().equals(0)) { - List orderInfoList = thinkOrderInfoService.listInOrder(order.getId()); - for (ThinkOrderInfo thinkOrderInfo : orderInfoList) { - thinkOrderInfo.setPayStatus(1); - } - thinkOrderInfoService.updateBatchById(orderInfoList); - } + updatePay(order, transaction.getTransactionId(), transaction.getAmount().getPayerTotal()); } return "订单已支付"; + } + private void updatePay(ThinkOrder order, String transactionId, Integer payAmount) { + order.setPayStatus(1); + order.setWechatOrder(transactionId); +// order.setPayPrice(new BigDecimal(NumberUtil.decimalFormat("0.00", transaction.getAmount().getPayerTotal() * 0.01))); + order.setPrice(new BigDecimal(NumberUtil.decimalFormat("0.00", payAmount * 0.01))); + order.setPayTime((int) DateUtil.currentSeconds()); + order.setQrcode("qrcode/" + LocalDateTimeUtil.format(LocalDateTime.now(), "yyyyMMdd") + "/" + IdUtil.getSnowflake().nextIdStr() + ".png"); + thinkOrderService.updateById(order); + // 更新订单商品的支付状态 + if (order.getType().equals(0)) { + List orderInfoList = thinkOrderInfoService.listInOrder(order.getId()); + for (ThinkOrderInfo thinkOrderInfo : orderInfoList) { + thinkOrderInfo.setPayStatus(1); + } + thinkOrderInfoService.updateBatchById(orderInfoList); + } + // 游泳馆限制人数 + if (order.getSid() != null && order.getSid().equals(37)) { + ThinkSite thinkSite = thinkSiteService.getById(order.getSid()); + thinkSite.setDailyNum(thinkSite.getDailyNum() + 1); + thinkSiteService.updateById(thinkSite); + } + // 使用记录 + boolean saveBill = false; + ThinkVipCardsBills thinkVipCardsBills = new ThinkVipCardsBills(); + thinkVipCardsBills.setOid(order.getId()); + thinkVipCardsBills.setUid(order.getUid()); + thinkVipCardsBills.setUsed(1); + thinkVipCardsBills.setDate(DateUtil.format(LocalDateTime.now(), "yyyy-MM-dd")); + // VIP卡 + if (order.getVid() != null) { + ThinkUsersVip usersVip = thinkUsersVipService.getById(order.getVid()); + if (usersVip.getType().equals(5)) { + BigDecimal newBalance = usersVip.getRemainingMoney().subtract(order.getPayPrice()); + usersVip.setRemainingMoney(newBalance); + thinkVipCardsBills.setAmount(order.getPayPrice()); + } else if (usersVip.getType().equals(4)) { + BigDecimal newBalance = usersVip.getRemainingMoney().subtract(usersVip.getEachMoney()); + usersVip.setRemainingMoney(newBalance); + usersVip.setNum(usersVip.getNum() - 1); + thinkVipCardsBills.setAmount(usersVip.getEachMoney()); + } else { + usersVip.setNum(usersVip.getNum() - 1); + thinkVipCardsBills.setAmount(usersVip.getPrice().divide(BigDecimal.valueOf(usersVip.getCount()), RoundingMode.HALF_UP)); + } + thinkUsersVipService.updateById(usersVip); + + thinkVipCardsBills.setVid(order.getVid()); + saveBill = true; + } + // IC卡 + if (order.getCode() != null) { + ThinkCard card = thinkCardService.getByCode(order.getCode()); + if (card.getType().equals(5)) { + BigDecimal newBalance = card.getRemainingMoney().subtract(order.getPayPrice()); + thinkVipCardsBills.setAmount(order.getPayPrice()); + card.setRemainingMoney(newBalance); + } else if (card.getType().equals(4)) { + BigDecimal newBalance = card.getRemainingMoney().subtract(card.getEachMoney()); + thinkVipCardsBills.setAmount(card.getEachMoney()); + card.setRemainingMoney(newBalance); + } else if (card.getType().equals(2)) { + card.setNum(card.getNum() - 1); + thinkVipCardsBills.setAmount(card.getPrice().divide(BigDecimal.valueOf(card.getCount()), RoundingMode.HALF_UP)); + } + thinkCardService.updateById(card); + + thinkVipCardsBills.setCid(card.getId()); + saveBill = true; + } + + if (saveBill) thinkVipCardsBillsService.addLog(thinkVipCardsBills); } @ApiOperation("分页查询") @GetMapping("/page") public ApiResult page(ThinkOrderParam param) { - if (getLoginUser() == null) return fail("请先登录"); - param.setUid(getLoginUser().getUid()); + if (param.getForAdmin() == null) { + if (getLoginUser() == null) return fail("请先登录"); + param.setUid(getLoginUser().getUid()); + } // 使用关联查询 return success(thinkOrderService.pageRel(param)); } + @ApiOperation("总金额") + @GetMapping("/total-amount") + public ApiResult totalAmount(ThinkOrderParam param) { + BigDecimal totalAmount = BigDecimal.ZERO; + QueryWrapper lambdaQueryWrapper = new QueryWrapper<>(); + lambdaQueryWrapper.select("SUM(`total_price`) AS `total_amount`"); + lambdaQueryWrapper.eq("pay_status", 1); + if (param.getSid() != null) lambdaQueryWrapper.eq("sid", param.getSid()); + if (param.getTimeStart() != null) + lambdaQueryWrapper.ge("create_time", param.getTimeStart()).le("create_time", param.getTimeEnd()); + if (param.getKeywords() != null) { + lambdaQueryWrapper.and( + wrapper -> wrapper.or(w -> w.like("name", param.getKeywords())) + .or(w -> w.like("id", param.getKeywords())) + .or(w -> w.like("order_num", param.getKeywords())) + .or(w -> w.like("phone", param.getKeywords())) + .or(w -> w.like("code", param.getKeywords())) + ); + } + ThinkOrder order = thinkOrderService.getOne(lambdaQueryWrapper); + if (order != null) totalAmount = order.getTotalAmount(); + return success(totalAmount); + } + @ApiOperation("查询全部") @GetMapping() public ApiResult> list(ThinkOrderParam param) { @@ -142,21 +244,67 @@ public class ThinkOrderController extends BaseController { @GetMapping("/{id}") public ApiResult get(@PathVariable("id") Integer id) { // 使用关联查询 - return success(thinkOrderService.getByIdRel(id)); + ThinkOrder order = thinkOrderService.getByIdRel(id); + if (order.getPayStatus().equals(1) && order.getOrderStatus().equals(2)) { + String secretKey = redisUtil.get("secretKey_10150"); + byte[] key = null; + if (secretKey == null) { + key = SecureUtil.generateKey(SymmetricAlgorithm.AES.getValue()).getEncoded(); + redisUtil.set("secretKey_10150", Base64.getEncoder().encodeToString(key)); + } else { + key = Base64.getDecoder().decode(secretKey); + } + SymmetricCrypto aes = new SymmetricCrypto(SymmetricAlgorithm.AES, key); + long timestamp = (int) (System.currentTimeMillis() / 1000); + order.setQrcode(aes.encryptHex(id + "_" + timestamp)); + order.setQrCodeTimestamp(String.valueOf(timestamp)); + } + return success(order); + } + + @ApiOperation("根据code核销") + @PostMapping("/check-code") + public ApiResult getByQrCode(@RequestBody ThinkOrder order) { + if (order.getQrcode() == null || order.getQrcode().isEmpty()) return fail("二维码不能为空"); + // 使用关联查询 + Map res = thinkOrderService.getByQrCode(order.getQrcode()); + if (!(Boolean) res.get("res")) return fail(res.get("msg")); + // 核销动作 + ThinkOrder thinkOrder = (ThinkOrder) res.get("data"); + thinkOrder.setOrderStatus(1); +// thinkOrderService.updateById(thinkOrder); + return success("核销成功", order.getQrcode()); + } + + @ApiOperation("根据code查询") + @GetMapping("/by-code/{code}") + public ApiResult> getByQrCode(@PathVariable("code") String code) { + // 使用关联查询 + return success(thinkOrderService.getByQrCode(code)); } @ApiOperation("添加") @PostMapping() public ApiResult save(@RequestBody ThinkOrder thinkOrder, HttpServletRequest request) throws IOException, WxErrorException { + for (ThinkOrderInfo info : thinkOrder.getThinkOrderInfos()) { + ThinkOrderInfo checkOrder = thinkOrderInfoService.checkOrder(info); + if (checkOrder != null) return fail("该场地已被预定"); + } + if (thinkOrder.getSid().equals(37)) { + ThinkSite thinkSite = thinkSiteService.getById(thinkOrder.getSid()); + if (thinkSite.getDailyMaxNum() != null && thinkSite.getDailyMaxNum() > 0 && thinkSite.getDailyNum() >= thinkSite.getDailyMaxNum()) + return fail("已达上限,无法预定"); + } User user = getLoginUser(); if (user == null) return fail("请先登录"); + if (thinkOrder.getPayType().equals(2) && thinkOrder.getVid() == null) return fail("请选择会员卡"); + if (thinkOrder.getPayType().equals(5) && thinkOrder.getCode() == null) return fail("请选择IC卡"); thinkOrder.setOrderNum(IdUtil.getSnowflake().nextIdStr()); BigDecimal totalPrice = BigDecimal.ZERO; // BigDecimal reducePrice = BigDecimal.ZERO; thinkOrder.setPayPrice(BigDecimal.ZERO); thinkOrder.setReducePrice(BigDecimal.ZERO); thinkOrder.setPrice(BigDecimal.ZERO); - thinkOrder.setPrice(BigDecimal.ZERO); thinkOrder.setUid(user.getUid()); Long now = new Date().getTime(); int timestamp = (int) (now / 1000); @@ -165,19 +313,157 @@ public class ThinkOrderController extends BaseController { ThinkSiteTime siteTime = thinkSiteTimeService.getById(thinkOrderInfo.getSiteTimeId()); thinkOrderInfo.setPrice(BigDecimal.ZERO); thinkOrderInfo.setChildrenPrice(BigDecimal.ZERO); + BigDecimal price = BigDecimal.ZERO; if (siteTime != null && siteTime.getIsStatus() == 1) { - thinkOrderInfo.setPrice(siteTime.getPrice()); + // 半场 + if (thinkOrderInfo.getType().equals(2)) thinkOrderInfo.setPrice(siteTime.getHalfPrice()); + else thinkOrderInfo.setPrice(siteTime.getPrice()); thinkOrderInfo.setChildrenPrice(siteTime.getChildrenPrice()); thinkOrderInfo.setOrderTime(timestamp); thinkOrderInfo.setTimeFlag(now); - thinkOrderInfo.setIsChildren(0); - totalPrice = totalPrice.add(siteTime.getPrice().multiply(BigDecimal.valueOf(thinkOrderInfo.getAdultNum()))); - totalPrice = totalPrice.add(siteTime.getChildrenPrice().multiply(BigDecimal.valueOf(thinkOrderInfo.getChildrenNum()))); +// thinkOrderInfo.setIsChildren(0); + if (thinkOrderInfo.getIsChildren().equals(2)) { + if (thinkOrderInfo.getAdultNum() < 1) return fail("非法请求,code:1"); + if (thinkOrderInfo.getType().equals(2)) + totalPrice = totalPrice.add(siteTime.getHalfPrice().multiply(BigDecimal.valueOf(thinkOrderInfo.getAdultNum()))); + else + totalPrice = totalPrice.add(siteTime.getPrice().multiply(BigDecimal.valueOf(thinkOrderInfo.getAdultNum()))); + + } else { + if (thinkOrderInfo.getChildrenNum() < 1) return fail("非法请求,code:2"); + thinkOrderInfo.setChildrenPrice(siteTime.getChildrenPrice()); + totalPrice = totalPrice.add(siteTime.getChildrenPrice().multiply(BigDecimal.valueOf(thinkOrderInfo.getChildrenNum()))); + } // reducePrice = reducePrice.add(thinkOrderInfo.getChildrenPrice()); - } + } else return fail("非法请求,code:3"); } } thinkOrder.setTotalPrice(totalPrice); + // VIP卡 + if (thinkOrder.getVid() != null) { + ThinkUsersVip usersVip = thinkUsersVipService.getById(thinkOrder.getVid()); + if (usersVip == null) return fail("非法请求,code:4"); + if (!usersVip.getUid().equals(getLoginUser().getUid())) return fail("非法请求,code:1"); + if (usersVip.getType().equals(5)) { + if (usersVip.getRemainingMoney().compareTo(BigDecimal.ZERO) < 1) return fail("余额不足"); + BigDecimal discount = usersVip.getDiscount().divide(BigDecimal.valueOf(10), RoundingMode.HALF_UP); + BigDecimal reducePrice = totalPrice.multiply(discount); + thinkOrder.setReducePrice(reducePrice); + thinkOrder.setPayPrice(totalPrice.subtract(reducePrice)); + } else if (usersVip.getType().equals(4)) { + if (usersVip.getRemainingMoney().compareTo(BigDecimal.ZERO) < 1) return fail("余额不足"); + thinkOrder.setReducePrice(usersVip.getEachMoney()); + thinkOrder.setPayPrice(totalPrice.subtract(usersVip.getEachMoney())); + } else if (usersVip.getType().equals(2)) { + if (usersVip.getNum() < 1) return fail("次数不足"); + thinkOrder.setReducePrice(totalPrice); + thinkOrder.setPayPrice(BigDecimal.ZERO); + } else { + if (usersVip.getNum() < 1) return fail("次数不足"); + // 上次使用的订单 + ThinkOrder lastOrder = thinkOrderService.getLastOrderByVid(usersVip.getId()); + if (lastOrder != null) { + // 今天是否已经使用 + long todayStart = DateUtil.beginOfDay(new Date()).getTime() / 1000; + long todayEnd = DateUtil.endOfDay(new Date()).getTime() / 1000; + if (lastOrder.getCreateTime() >= todayStart && lastOrder.getCreateTime() <= todayEnd) { + return fail("今天已使用"); + } + } + thinkOrder.setReducePrice(totalPrice); + thinkOrder.setPayPrice(BigDecimal.ZERO); + } + switch (usersVip.getType()) { + // 年卡 + case 1: { + thinkOrder.setPayType(7); + thinkOrder.setType(4); + } + break; + // 次卡 + case 2: { + thinkOrder.setPayType(8); + thinkOrder.setType(5); + } + break; + // 月卡 + case 3: { + thinkOrder.setPayType(6); + thinkOrder.setType(3); + } + break; + // 余额卡 + case 4: { + thinkOrder.setPayType(13); + thinkOrder.setType(6); + } + break; + } + } + // IC卡 + if (thinkOrder.getCode() != null) { + ThinkCard card = thinkCardService.getByCode(thinkOrder.getCode()); + if (card == null) return fail("非法请求,code:0"); + if (!card.getUid().equals(getLoginUser().getUid())) return fail("非法请求,code:1"); + if (card.getType().equals(5)) { + if (card.getRemainingMoney().compareTo(BigDecimal.ZERO) < 1) return fail("余额不足"); + BigDecimal discount = card.getDiscount().divide(BigDecimal.valueOf(10), RoundingMode.HALF_UP); + BigDecimal reducePrice = totalPrice.multiply(discount); + thinkOrder.setReducePrice(reducePrice); + thinkOrder.setPayPrice(totalPrice.subtract(reducePrice)); + } else if (card.getType().equals(4)) { + if (card.getRemainingMoney().compareTo(BigDecimal.ZERO) < 1) return fail("余额不足"); + thinkOrder.setReducePrice(card.getEachMoney()); + thinkOrder.setPayPrice(totalPrice.subtract(card.getEachMoney())); + } else if (card.getType().equals(2)) { + if (card.getNum() < 1) return fail("次数不足"); + thinkOrder.setReducePrice(totalPrice); + thinkOrder.setPayPrice(BigDecimal.ZERO); + } else { + // 上次使用的订单 + ThinkOrder lastOrder = thinkOrderService.getLastOrderByCardCode(card.getCode()); + // 今天是否已经使用 + long todayStart = DateUtil.beginOfDay(new Date()).getTime() / 1000; + long todayEnd = DateUtil.endOfDay(new Date()).getTime() / 1000; + if (lastOrder.getCreateTime() >= todayStart && lastOrder.getCreateTime() <= todayEnd) { + return fail("今天已使用"); + } + thinkOrder.setReducePrice(totalPrice); + thinkOrder.setPayPrice(BigDecimal.ZERO); + } + switch (card.getType()) { + // 年卡 + case 1: { + thinkOrder.setPayType(10); + thinkOrder.setType(8); + } + break; + // 次卡 + case 2: { + thinkOrder.setPayType(11); + thinkOrder.setType(9); + } + break; + // 月卡 + case 3: { + thinkOrder.setPayType(9); + thinkOrder.setType(7); + } + break; + // 余额卡 + case 4: { + thinkOrder.setPayType(14); + thinkOrder.setType(10); + } + break; + case 5: { + thinkOrder.setPayType(14); + thinkOrder.setType(13); + } + break; + } + } + thinkOrder.setPayPrice(totalPrice); thinkOrder.setCreateTime(timestamp); thinkOrder.setUpdateTime(timestamp); @@ -198,9 +484,14 @@ public class ThinkOrderController extends BaseController { if (thinkOrder1 == null) return fail("订单不存在"); if (thinkOrder1.getPayStatus().equals(1)) return fail("该订单已支付"); if (thinkOrder1.getOrderStatus().equals(3)) return fail("该订单已取消"); + List thinkOrderInfos = thinkOrderInfoService.listInOrder(thinkOrder.getId()); + for (ThinkOrderInfo info : thinkOrderInfos) { + ThinkOrderInfo checkOrder = thinkOrderInfoService.checkOrder(info); + if (checkOrder != null) return fail("该场地已被预定"); + } String desc = thinkOrder1.getThinkOrderInfos().get(0).getSiteName() + "-" + thinkOrder1.getThinkOrderInfos().get(0).getFieldName(); - return success("下单成功", thinkOrderService.createWxOrder(thinkOrder1.getTotalPrice(), thinkOrder1.getOrderNum(), desc, + return success("下单成功", thinkOrderService.createWxOrder(thinkOrder1.getPayPrice(), thinkOrder1.getOrderNum(), desc, getLoginUser().getOpenid())); } @@ -208,9 +499,14 @@ public class ThinkOrderController extends BaseController { // 微信统一下单接口 if (order.getPayType().equals(PAY_TYPE_WECHAT)) { String desc = order.getThinkOrderInfos().get(0).getSiteName() + "-" + order.getThinkOrderInfos().get(0).getFieldName(); - return success("下单成功", thinkOrderService.createWxOrder(order.getTotalPrice(), order.getOrderNum(), desc, getLoginUser().getOpenid())); + return success("下单成功", thinkOrderService.createWxOrder(order.getPayPrice(), order.getOrderNum(), desc, getLoginUser().getOpenid())); + } + if (order.getPayType() >= 6 || order.getPayType().equals(2)) { + order.setIsInvoice(3); + thinkOrderService.updateById(order); + updatePay(order, null, order.getTotalPrice().multiply(BigDecimal.valueOf(100)).intValue()); + return success("支付成功", order.getId()); } - return fail("支付失败"); } @@ -259,4 +555,61 @@ public class ThinkOrderController extends BaseController { return fail("删除失败"); } + @ApiOperation("导出") + @PostMapping("/export") + public ApiResult export(@RequestBody ThinkOrderParam param) throws IOException { + List orderList = thinkOrderService.listRel(param); + String filename = "excel/财务报表-" + new Date().getTime() + ".xlsx"; + String path = uploadPath + filename; + SXSSFWorkbook workbook = new SXSSFWorkbook(); + //创建工作表单 + SXSSFSheet sheet = workbook.createSheet(); + sheet.setColumnWidth(0, 20 * 256); + sheet.setColumnWidth(1, 20 * 256); + sheet.setColumnWidth(2, 20 * 256); + sheet.setColumnWidth(3, 40 * 256); + sheet.setColumnWidth(4, 20 * 256); + + SXSSFRow row = sheet.createRow(0); + String[] headers = {"场馆名称", "下单时间", "单位", "手机号", "实际转账单位/个人", "价格", "积分", "支付方式", "预付卡号", "预付卡到期时间"}; + String[] payType = {"余额支付", "微信支付", "积分", "支付宝", "现金", "POS机", "VIP月卡", "VIP年卡", "VIP次卡", "IC月卡", + "IC年卡", "IC次卡", "免费", "VIP充值卡", "", "积分支付", "VIP季卡", "IC季卡"}; + for (int i = 0; i < headers.length; i++) { + row.createCell(i).setCellValue(headers[i]); + } + + int rowNum = 1; + for (ThinkOrder order : orderList) { + SXSSFRow orderRow = sheet.createRow(rowNum); + orderRow.createCell(0).setCellValue(order.getSiteName()); + orderRow.createCell(1).setCellValue(DateUtil.format(DateUtil.date(order.getCreateTime() * 1000), "yyyy-MM-dd HH:mm:ss")); + orderRow.createCell(2).setCellValue(order.getName()); + orderRow.createCell(3).setCellValue(order.getPhone()); + orderRow.createCell(4).setCellValue(order.getName()); + orderRow.createCell(5).setCellValue(order.getTotalPrice().toString()); + orderRow.createCell(6).setCellValue("0"); + orderRow.createCell(7).setCellValue(payType[order.getPayType()]); + if (order.getCard() != null) { + orderRow.createCell(8).setCellValue(order.getCard().getCode()); + orderRow.createCell(9).setCellValue(DateUtil.format(DateUtil.date(order.getCard().getExpireTime() * 1000), "yyyy-MM-dd HH:mm:ss")); + } + if (order.getThinkVip() != null) { + orderRow.createCell(8).setCellValue(order.getThinkVip().getCode()); + orderRow.createCell(9).setCellValue(DateUtil.format(DateUtil.date(order.getThinkVip().getExpireTime() * 1000), "yyyy-MM-dd HH:mm:ss")); + } + +// sheet.addMergedRegion(new CellRangeAddress(rowNum, 0, 2, 2)); + rowNum++; + } + FileOutputStream output = new FileOutputStream(path); + workbook.write(output); + output.flush(); + + FileRecord result = new FileRecord(); + result.setCreateUserId(getLoginUserId()); + result.setName(filename); + result.setPath(path); + result.setUrl(config.getServerUrl() + "/file/" + filename); + return success(result); + } } diff --git a/src/main/java/com/gxwebsoft/think/controller/ThinkOrderRefundLogController.java b/src/main/java/com/gxwebsoft/think/controller/ThinkOrderRefundLogController.java index 1ee55b9..a2949ce 100644 --- a/src/main/java/com/gxwebsoft/think/controller/ThinkOrderRefundLogController.java +++ b/src/main/java/com/gxwebsoft/think/controller/ThinkOrderRefundLogController.java @@ -1,8 +1,10 @@ package com.gxwebsoft.think.controller; +import cn.hutool.core.date.DateTime; +import cn.hutool.core.date.DateUtil; import com.gxwebsoft.common.core.web.BaseController; -import com.gxwebsoft.think.service.ThinkOrderRefundLogService; -import com.gxwebsoft.think.entity.ThinkOrderRefundLog; +import com.gxwebsoft.think.entity.*; +import com.gxwebsoft.think.service.*; import com.gxwebsoft.think.param.ThinkOrderRefundLogParam; import com.gxwebsoft.common.core.web.ApiResult; import com.gxwebsoft.common.core.web.PageResult; @@ -10,13 +12,23 @@ import com.gxwebsoft.common.core.web.PageParam; import com.gxwebsoft.common.core.web.BatchParam; import com.gxwebsoft.common.core.annotation.OperationLog; import com.gxwebsoft.common.system.entity.User; +import com.wechat.pay.java.core.notification.NotificationConfig; +import com.wechat.pay.java.core.notification.NotificationParser; +import com.wechat.pay.java.service.refund.model.Refund; +import com.wechat.pay.java.service.refund.model.RefundNotification; +import com.wechat.pay.java.service.refund.model.Status; import io.swagger.annotations.Api; import io.swagger.annotations.ApiOperation; import org.springframework.security.access.prepost.PreAuthorize; import org.springframework.web.bind.annotation.*; import javax.annotation.Resource; +import java.math.BigDecimal; +import java.math.RoundingMode; import java.util.List; +import java.util.Map; + +import com.wechat.pay.java.core.notification.RequestParam; /** * 微信退款记录控制器 @@ -30,6 +42,51 @@ import java.util.List; public class ThinkOrderRefundLogController extends BaseController { @Resource private ThinkOrderRefundLogService thinkOrderRefundLogService; + @Resource + private ThinkOrderService thinkOrderService; + @Resource + private WechatConfigService wechatConfigService; + @Resource + private ThinkVipCardsBillsService thinkVipCardsBillsService; + @Resource + private ThinkUsersVipService thinkUsersVipService; + @Resource + private ThinkCardService thinkCardService; + + @PostMapping("/notify") + public ApiResult refundNotify(@RequestBody String body, @RequestHeader Map header) { + System.out.println("refund body = " + body); + RequestParam requestParam = new RequestParam.Builder() + .serialNumber(header.get("wechatpay-serial").toString()) + .nonce(header.get("wechatpay-nonce").toString()) + .signature(header.get("wechatpay-signature").toString()) + .timestamp(header.get("wechatpay-timestamp").toString()) + .body(body) + .build(); + NotificationConfig config = wechatConfigService.getNotificationConfig(); + // 初始化 NotificationParser + NotificationParser parser = new NotificationParser(config); + RefundNotification notification = parser.parse(requestParam, RefundNotification.class); + System.out.println("notification = " + notification); + String refundNo = notification.getOutRefundNo(); + ThinkOrderRefundLog thinkOrderRefundLog = thinkOrderRefundLogService.getByRefundNo(refundNo); + ThinkOrder thinkOrder = null; + if (thinkOrderRefundLog.getType().equals(0)) { + thinkOrder = thinkOrderService.getById(thinkOrderRefundLog.getOid()); + } + if (notification.getRefundStatus().equals(Status.SUCCESS)) { + thinkOrderRefundLog.setStatus(2); + if (thinkOrder != null) thinkOrder.setOrderStatus(6); + + } else if (notification.getRefundStatus().equals(Status.ABNORMAL) || notification.getRefundStatus().equals(Status.CLOSED)) { + thinkOrderRefundLog.setStatus(4); + if (thinkOrder != null) thinkOrder.setOrderStatus(5); + } + thinkOrderRefundLog.setJson(notification.toString()); + thinkOrderRefundLogService.updateById(thinkOrderRefundLog); + if (thinkOrder != null) thinkOrderService.updateById(thinkOrder); + return success(); + } @ApiOperation("分页查询微信退款记录") @GetMapping("/page") @@ -56,6 +113,59 @@ public class ThinkOrderRefundLogController extends BaseController { @ApiOperation("添加微信退款记录") @PostMapping() public ApiResult save(@RequestBody ThinkOrderRefundLog thinkOrderRefundLog) { + if (thinkOrderRefundLog.getType().equals(0)) { + ThinkOrder thinkOrder = thinkOrderService.getById(thinkOrderRefundLog.getOid()); + thinkOrderRefundLog.setOrder(thinkOrder); + thinkOrderRefundLog.setRefundNo("R" + thinkOrder.getOrderNum()); + thinkOrder.setOrderStatus(4); + thinkOrderService.updateById(thinkOrder); + if (thinkOrder.getPayType().equals(1)) { + thinkOrderService.refund(thinkOrderRefundLog); + }else { + thinkOrder.setOrderStatus(6); + thinkOrderService.updateById(thinkOrder); + if (thinkOrder.getVid() != null && thinkOrder.getVid() != 0) { + ThinkVipCardsBills thinkVipCardsBills = new ThinkVipCardsBills(); + thinkVipCardsBills.setVid(thinkOrder.getVid()); + thinkVipCardsBills.setUid(thinkOrder.getUid()); + DateTime dateTime = DateUtil.date(Long.parseLong(thinkOrder.getStartTime()) * 1000L); + thinkVipCardsBills.setDate(DateUtil.format(dateTime, "yyyy-MM-dd")); + thinkVipCardsBillsService.cancelLog(thinkVipCardsBills); + + ThinkUsersVip usersVip = thinkUsersVipService.getById(thinkOrder.getVid()); + if (usersVip.getType().equals(5)) { + BigDecimal newBalance = usersVip.getRemainingMoney().add(thinkOrder.getPayPrice()); + usersVip.setRemainingMoney(newBalance); + } else if (usersVip.getType().equals(4)) { + BigDecimal newBalance = usersVip.getRemainingMoney().add(usersVip.getEachMoney()); + usersVip.setRemainingMoney(newBalance); + usersVip.setNum(usersVip.getNum() + 1); + } else { + usersVip.setNum(usersVip.getNum() + 1); + } + thinkUsersVipService.updateById(usersVip); + } + if (thinkOrder.getCid() != null && thinkOrder.getCid() != 0) { + ThinkCard card = thinkCardService.getByCode(thinkOrder.getCode()); + if (card.getType().equals(5)) { + BigDecimal newBalance = card.getRemainingMoney().add(thinkOrder.getPayPrice()); + card.setRemainingMoney(newBalance); + } else if (card.getType().equals(4)) { + BigDecimal newBalance = card.getRemainingMoney().add(card.getEachMoney()); + card.setRemainingMoney(newBalance); + } else if (card.getType().equals(2)) { + card.setNum(card.getNum() + 1); + } + + ThinkVipCardsBills thinkVipCardsBills = new ThinkVipCardsBills(); + thinkVipCardsBills.setCid(thinkOrder.getCid()); + thinkVipCardsBills.setUid(thinkOrder.getUid()); + DateTime dateTime = DateUtil.date(Long.parseLong(thinkOrder.getStartTime()) * 1000L); + thinkVipCardsBills.setDate(DateUtil.format(dateTime, "yyyy-MM-dd")); + thinkVipCardsBillsService.cancelLog(thinkVipCardsBills); + } + } + } if (thinkOrderRefundLogService.save(thinkOrderRefundLog)) { return success("添加成功"); } diff --git a/src/main/java/com/gxwebsoft/think/controller/ThinkSiteController.java b/src/main/java/com/gxwebsoft/think/controller/ThinkSiteController.java index 90e4f7c..cdc6170 100644 --- a/src/main/java/com/gxwebsoft/think/controller/ThinkSiteController.java +++ b/src/main/java/com/gxwebsoft/think/controller/ThinkSiteController.java @@ -16,6 +16,7 @@ import org.springframework.security.access.prepost.PreAuthorize; import org.springframework.web.bind.annotation.*; import javax.annotation.Resource; +import java.util.Arrays; import java.util.List; /** @@ -41,6 +42,9 @@ public class ThinkSiteController extends BaseController { @ApiOperation("查询全部") @GetMapping() public ApiResult> list(ThinkSiteParam param) { + if (param.getIds() != null) { + param.setIdList(Arrays.stream(param.getIds().split(",")).map(Integer::parseInt).toList()); + } // 使用关联查询 return success(thinkSiteService.listRel(param)); } diff --git a/src/main/java/com/gxwebsoft/think/controller/ThinkUsersVipController.java b/src/main/java/com/gxwebsoft/think/controller/ThinkUsersVipController.java index 16409f9..b20d9d1 100644 --- a/src/main/java/com/gxwebsoft/think/controller/ThinkUsersVipController.java +++ b/src/main/java/com/gxwebsoft/think/controller/ThinkUsersVipController.java @@ -1,5 +1,6 @@ package com.gxwebsoft.think.controller; +import cn.hutool.core.date.DateTime; import cn.hutool.core.date.DateUtil; import cn.hutool.core.date.LocalDateTimeUtil; import cn.hutool.core.util.IdUtil; @@ -8,6 +9,7 @@ import cn.hutool.core.util.RandomUtil; import cn.hutool.core.util.StrUtil; import com.gxwebsoft.common.core.web.BaseController; import com.gxwebsoft.think.entity.*; +import com.gxwebsoft.think.param.ThinkOrderParam; import com.gxwebsoft.think.service.*; import com.gxwebsoft.think.param.ThinkUsersVipParam; import com.gxwebsoft.common.core.web.ApiResult; @@ -26,10 +28,9 @@ import org.springframework.web.bind.annotation.*; import javax.annotation.Resource; import java.math.BigDecimal; +import java.math.RoundingMode; import java.time.LocalDateTime; -import java.util.ArrayList; -import java.util.List; -import java.util.Map; +import java.util.*; /** * 控制器 @@ -51,20 +52,28 @@ public class ThinkUsersVipController extends BaseController { private WechatConfigService wechatConfigService; @Resource private ThinkSiteService thinkSiteService; + @Resource + private ThinkVipCardsBillsService thinkVipCardsBillsService; @ApiOperation("分页查询") @GetMapping("/page") public ApiResult page(ThinkUsersVipParam param) { - if (getLoginUser() == null) return fail("请先登录"); - param.setUid(getLoginUser().getUid()); + if (param.getForAdmin() == null) { + if (getLoginUser() == null) return fail("请先登录"); + param.setUid(getLoginUser().getUid()); + } // 使用关联查询 return success(thinkUsersVipService.pageRel(param)); } @ApiOperation("查询全部") @GetMapping() - public ApiResult> list(ThinkUsersVipParam param) { + public ApiResult list(ThinkUsersVipParam param) { // 使用关联查询 + if (param.getForAdmin() == null) { + if (getLoginUser() == null) return fail("请先登录"); + param.setUid(getLoginUser().getUid()); + } return success(thinkUsersVipService.listRel(param)); } @@ -102,16 +111,80 @@ public class ThinkUsersVipController extends BaseController { com.wechat.pay.java.service.payments.model.Transaction transaction = parser.parse(requestParam, com.wechat.pay.java.service.payments.model.Transaction.class); // 查询订单信息 final ThinkUsersVip order = thinkUsersVipService.getByOrderNo(transaction.getOutTradeNo()); + ThinkUsersVip usersVip = null; if (order == null) return "订单不存在"; + usersVip = order; if (order.getStatus().equals(2)) { // 2.更新订单支付状态 order.setStatus(1); order.setPayTime(DateUtil.currentSeconds()); order.setPrices(order.getTempPrices()); - // 充值卡 - if (order.getType().equals(4)) order.setRemainingMoney(order.getPrice()); - else if (order.getType().equals(2)) order.setNum(order.getCount()); - thinkUsersVipService.updateById(order); + // 查找有没有一样的卡 + ThinkUsersVip sameOrder = thinkUsersVipService.getByVidAndUid(order.getVid(), order.getUid()); + if (sameOrder != null) { + usersVip = sameOrder; + // 是否已过期,过期的从现在开始计算,未过期的在旧卡基础上叠加 + if (sameOrder.getExpireTime() < DateUtil.currentSeconds()) { + sameOrder.setExpireTime(DateUtil.currentSeconds() + (order.getTerm() * 86400 * 365) + (order.getMonth() * 86400 * 30)); + } else { + sameOrder.setExpireTime(sameOrder.getExpireTime() + (order.getTerm() * 86400 * 365) + (order.getMonth() * 86400 * 30)); + } + // 充值卡 + if (sameOrder.getType().equals(4)) { + // 是否已过期,过期的清空,未过期的在旧卡基础上叠加 + if (sameOrder.getExpireTime() < DateUtil.currentSeconds()) { + sameOrder.setRemainingMoney(order.getPrice()); + } else { + sameOrder.setRemainingMoney(order.getPrice().add(sameOrder.getRemainingMoney())); + } + } else { + if (sameOrder.getExpireTime() < DateUtil.currentSeconds()) { + sameOrder.setNum(order.getCount()); + } else { + sameOrder.setNum(sameOrder.getCount() + order.getCount()); + } + sameOrder.setNum(sameOrder.getCount() + order.getCount()); + } + thinkUsersVipService.updateById(sameOrder); + // 删除订单 + thinkUsersVipService.removeById(order.getId()); + } else { + // 充值卡 + if (order.getType().equals(4)) order.setRemainingMoney(order.getPrice()); + else order.setNum(order.getCount()); + thinkUsersVipService.updateById(order); + } + if (usersVip != null) { + if (usersVip.getType().equals(1) || usersVip.getType().equals(3)) { + List list = new ArrayList<>(); + BigDecimal avgAmount = BigDecimal.ZERO; + int dayNum = 0; + BigDecimal totalAmountInAvg = BigDecimal.ZERO; + BigDecimal totalAmount = BigDecimal.ZERO; + if (usersVip.getType().equals(1)) { + totalAmount = usersVip.getPrice().multiply(new BigDecimal(usersVip.getTerm())); + avgAmount = totalAmount.divide(BigDecimal.valueOf(365).multiply(BigDecimal.valueOf(usersVip.getTerm())), RoundingMode.HALF_UP); + dayNum = 365 * usersVip.getTerm(); + } else if (usersVip.getType().equals(3)) { + totalAmount = usersVip.getPrice().multiply(new BigDecimal(usersVip.getMonth())); + avgAmount = totalAmount.divide(BigDecimal.valueOf(30).multiply(BigDecimal.valueOf(usersVip.getMonth())), RoundingMode.HALF_UP); + dayNum = 30 * usersVip.getMonth(); + } + totalAmountInAvg = avgAmount.multiply(BigDecimal.valueOf(dayNum - 1)); + BigDecimal lastDayAmount = totalAmount.subtract(totalAmountInAvg); + for (int i = 0; i < dayNum; i++) { + ThinkVipCardsBills thinkVipCardsBills = new ThinkVipCardsBills(); + thinkVipCardsBills.setUid(usersVip.getUid()); + thinkVipCardsBills.setVid(usersVip.getId()); + DateTime dateTime = DateUtil.date((usersVip.getCreateTime() * 1000L) + (i * 86400000L)); + thinkVipCardsBills.setDate(DateUtil.format(dateTime, "yyyy-MM-dd")); + if (i == dayNum - 1) thinkVipCardsBills.setAmount(lastDayAmount); + else thinkVipCardsBills.setAmount(avgAmount); + list.add(thinkVipCardsBills); + } + thinkVipCardsBillsService.saveBatch(list); + } + } } return "订单已支付"; @@ -177,6 +250,9 @@ public class ThinkUsersVipController extends BaseController { @PutMapping() public ApiResult update(@RequestBody ThinkUsersVip thinkUsersVip) { if (thinkUsersVipService.updateById(thinkUsersVip)) { + if (thinkUsersVip.getUid().equals(0)) { + thinkVipCardsBillsService.clearUid(thinkUsersVip.getId()); + } return success("修改成功"); } return fail("修改失败"); @@ -218,4 +294,31 @@ public class ThinkUsersVipController extends BaseController { return fail("删除失败"); } + @ApiOperation("使用记录") + @GetMapping("/log/{id}") + public ApiResult getLog(@PathVariable Integer id) { + List> result = new ArrayList<>(); + ThinkUsersVip thinkUsersVip = thinkUsersVipService.getByIdRel(id); + System.out.println(DateUtil.currentSeconds()); + long dayNum = (DateUtil.currentSeconds() - thinkUsersVip.getPayTime()) / 3600 / 24; + List orderList = thinkOrderService.listRel(new ThinkOrderParam() {{ + setVid(id); + setPayStatus(1); + }}); + dayNum += 1; + for (int i = 0; i < dayNum; i++) { + Map data = new HashMap<>(); + Date date = DateUtil.offsetDay(new Date(), -i); + data.put("date", DateUtil.format(date, "yyyy-MM-dd")); + data.put("order", null); + for (ThinkOrder thinkOrder : orderList) { + if (thinkOrder.getCreateTime() > (DateUtil.beginOfDay(date).getTime() / 1000) && thinkOrder.getCreateTime() < (DateUtil.endOfDay(date).getTime() / 1000)) { + data.put("order", thinkOrder); + } + } + result.add(data); + } + return success(result); + } + } diff --git a/src/main/java/com/gxwebsoft/think/controller/ThinkVipCardsBillsController.java b/src/main/java/com/gxwebsoft/think/controller/ThinkVipCardsBillsController.java new file mode 100644 index 0000000..a3e5f9a --- /dev/null +++ b/src/main/java/com/gxwebsoft/think/controller/ThinkVipCardsBillsController.java @@ -0,0 +1,214 @@ +package com.gxwebsoft.think.controller; + +import cn.hutool.core.date.DateTime; +import cn.hutool.core.date.DateUtil; +import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; +import com.gxwebsoft.common.core.web.BaseController; +import com.gxwebsoft.think.entity.ThinkOrder; +import com.gxwebsoft.think.entity.ThinkUsersVip; +import com.gxwebsoft.think.service.ThinkOrderService; +import com.gxwebsoft.think.service.ThinkUsersVipService; +import com.gxwebsoft.think.service.ThinkVipCardsBillsService; +import com.gxwebsoft.think.entity.ThinkVipCardsBills; +import com.gxwebsoft.think.param.ThinkVipCardsBillsParam; +import com.gxwebsoft.common.core.web.ApiResult; +import com.gxwebsoft.common.core.web.PageResult; +import com.gxwebsoft.common.core.web.PageParam; +import com.gxwebsoft.common.core.web.BatchParam; +import com.gxwebsoft.common.core.annotation.OperationLog; +import com.gxwebsoft.common.system.entity.User; +import io.swagger.annotations.Api; +import io.swagger.annotations.ApiOperation; +import org.springframework.security.access.prepost.PreAuthorize; +import org.springframework.web.bind.annotation.*; + +import javax.annotation.Resource; +import java.math.BigDecimal; +import java.math.RoundingMode; +import java.util.ArrayList; +import java.util.List; + +/** + * Vip卡每日账单控制器 + * + * @author 科技小王子 + * @since 2024-12-25 16:41:01 + */ +@Api(tags = "Vip卡每日账单管理") +@RestController +@RequestMapping("/api/think/think-vip-cards-bills") +public class ThinkVipCardsBillsController extends BaseController { + @Resource + private ThinkVipCardsBillsService thinkVipCardsBillsService; + @Resource + private ThinkUsersVipService thinkUsersVipService; + @Resource + private ThinkOrderService thinkOrderService; + + @ApiOperation("分页查询Vip卡每日账单") + @GetMapping("/page") + public ApiResult> page(ThinkVipCardsBillsParam param) { + // 使用关联查询 + return success(thinkVipCardsBillsService.pageRel(param)); + } + + @GetMapping("/total-amount") + public ApiResult totalAmount(ThinkVipCardsBillsParam param) { + List list = thinkVipCardsBillsService.listRel(param); + return success(list.stream().map(ThinkVipCardsBills::getAmount).reduce(BigDecimal.ZERO, BigDecimal::add)); + } + + @ApiOperation("查询全部Vip卡每日账单") + @GetMapping() + public ApiResult> list(ThinkVipCardsBillsParam param) { + // 使用关联查询 + return success(thinkVipCardsBillsService.listRel(param)); + } + + @PreAuthorize("hasAuthority('think:thinkVipCardsBills:list')") + @ApiOperation("根据id查询Vip卡每日账单") + @GetMapping("/{id}") + public ApiResult get(@PathVariable("id") Integer id) { + // 使用关联查询 + return success(thinkVipCardsBillsService.getByIdRel(id)); + } + + @ApiOperation("添加Vip卡每日账单") + @PostMapping() + public ApiResult save(@RequestBody ThinkVipCardsBills thinkVipCardsBills) { + if (thinkVipCardsBillsService.save(thinkVipCardsBills)) { + return success("添加成功"); + } + return fail("添加失败"); + } + + @ApiOperation("修改Vip卡每日账单") + @PutMapping() + public ApiResult update(@RequestBody ThinkVipCardsBills thinkVipCardsBills) { + if (thinkVipCardsBillsService.updateById(thinkVipCardsBills)) { + return success("修改成功"); + } + return fail("修改失败"); + } + + @ApiOperation("删除Vip卡每日账单") + @DeleteMapping("/{id}") + public ApiResult remove(@PathVariable("id") Integer id) { + if (thinkVipCardsBillsService.removeById(id)) { + return success("删除成功"); + } + return fail("删除失败"); + } + + @ApiOperation("批量添加Vip卡每日账单") + @PostMapping("/batch") + public ApiResult saveBatch(@RequestBody List list) { + if (thinkVipCardsBillsService.saveBatch(list)) { + return success("添加成功"); + } + return fail("添加失败"); + } + + @ApiOperation("批量修改Vip卡每日账单") + @PutMapping("/batch") + public ApiResult removeBatch(@RequestBody BatchParam batchParam) { + if (batchParam.update(thinkVipCardsBillsService, "id")) { + return success("修改成功"); + } + return fail("修改失败"); + } + + @ApiOperation("批量删除Vip卡每日账单") + @DeleteMapping("/batch") + public ApiResult removeBatch(@RequestBody List ids) { + if (thinkVipCardsBillsService.removeByIds(ids)) { + return success("删除成功"); + } + return fail("删除失败"); + } + + @PostMapping("/make-bill") + public void makeBill() { + List usersVipList = thinkUsersVipService.list( + new LambdaQueryWrapper() + .eq(ThinkUsersVip::getStatus, 1) + ); + for (ThinkUsersVip usersVip : usersVipList) { + List list = new ArrayList<>(); + List orderList = thinkOrderService.list( + new LambdaQueryWrapper() + .eq(ThinkOrder::getVid, usersVip.getId()) + .in(ThinkOrder::getPayStatus, 1) + .in(ThinkOrder::getOrderStatus, 1, 2) + ); + BigDecimal avgAmount = BigDecimal.ZERO; + int dayNum = 0; + if (usersVip.getType().equals(1) || usersVip.getType().equals(3)) { + BigDecimal totalAmountInAvg = BigDecimal.ZERO; + BigDecimal totalAmount = BigDecimal.ZERO; + if (usersVip.getType().equals(1)) { + totalAmount = usersVip.getPrice().multiply(new BigDecimal(usersVip.getTerm())); + avgAmount = totalAmount.divide(BigDecimal.valueOf(365).multiply(BigDecimal.valueOf(usersVip.getTerm())), RoundingMode.HALF_UP); + dayNum = 365 * usersVip.getTerm(); + } else if (usersVip.getType().equals(3)) { + totalAmount = usersVip.getPrice().multiply(new BigDecimal(usersVip.getMonth())); + avgAmount = totalAmount.divide(BigDecimal.valueOf(30).multiply(BigDecimal.valueOf(usersVip.getMonth())), RoundingMode.HALF_UP); + dayNum = 30 * usersVip.getMonth(); + } + totalAmountInAvg = avgAmount.multiply(BigDecimal.valueOf(dayNum - 1)); + BigDecimal lastDayAmount = totalAmount.subtract(totalAmountInAvg); + for (int i = 0; i < dayNum; i++) { + ThinkVipCardsBills thinkVipCardsBills = new ThinkVipCardsBills(); + thinkVipCardsBills.setUid(usersVip.getUid()); + thinkVipCardsBills.setVid(usersVip.getId()); + DateTime dateTime = DateUtil.date((usersVip.getCreateTime() * 1000L) + (i * 86400000L)); + thinkVipCardsBills.setDate(DateUtil.format(dateTime, "yyyy-MM-dd")); + if (i == dayNum - 1) thinkVipCardsBills.setAmount(lastDayAmount); + else thinkVipCardsBills.setAmount(avgAmount); + if (!orderList.isEmpty()) { + for (ThinkOrder thinkOrder : orderList) { + if (thinkOrder.getCreateTime() > (DateUtil.beginOfDay(dateTime).getTime() / 1000L) && thinkOrder.getCreateTime() < (DateUtil.endOfDay(dateTime).getTime() / 1000L)) { + thinkVipCardsBills.setUsed(1); + thinkVipCardsBills.setOid(thinkOrder.getId()); + } + } + } + list.add(thinkVipCardsBills); + } + } else if (usersVip.getType().equals(2)) { + // 次卡 + if (!orderList.isEmpty()) { + avgAmount = usersVip.getPrice().divide(BigDecimal.valueOf(usersVip.getCount()), RoundingMode.HALF_UP); + for (ThinkOrder thinkOrder : orderList) { + ThinkVipCardsBills thinkVipCardsBills = new ThinkVipCardsBills(); + thinkVipCardsBills.setUid(usersVip.getUid()); + thinkVipCardsBills.setVid(usersVip.getId()); + DateTime dateTime = DateUtil.date((thinkOrder.getCreateTime() * 1000L)); + thinkVipCardsBills.setDate(DateUtil.format(dateTime, "yyyy-MM-dd")); + thinkVipCardsBills.setAmount(avgAmount); + thinkVipCardsBills.setUsed(1); + thinkVipCardsBills.setOid(thinkOrder.getId()); + list.add(thinkVipCardsBills); + } + } + } else if (usersVip.getType().equals(4) || usersVip.getType().equals(5)) { + // 充值卡\折扣 + if (!orderList.isEmpty()) { + for (ThinkOrder thinkOrder : orderList) { + ThinkVipCardsBills thinkVipCardsBills = new ThinkVipCardsBills(); + thinkVipCardsBills.setUid(usersVip.getUid()); + thinkVipCardsBills.setVid(usersVip.getId()); + DateTime dateTime = DateUtil.date((thinkOrder.getCreateTime() * 1000L)); + thinkVipCardsBills.setDate(DateUtil.format(dateTime, "yyyy-MM-dd")); + thinkVipCardsBills.setAmount(thinkOrder.getTotalPrice()); + thinkVipCardsBills.setUsed(1); + thinkVipCardsBills.setOid(thinkOrder.getId()); + list.add(thinkVipCardsBills); + } + } + } + thinkVipCardsBillsService.saveBatch(list); + } + } + +} diff --git a/src/main/java/com/gxwebsoft/think/controller/ThinkVipController.java b/src/main/java/com/gxwebsoft/think/controller/ThinkVipController.java index cf57495..64c6026 100644 --- a/src/main/java/com/gxwebsoft/think/controller/ThinkVipController.java +++ b/src/main/java/com/gxwebsoft/think/controller/ThinkVipController.java @@ -48,6 +48,12 @@ public class ThinkVipController extends BaseController { return success(thinkVipService.listRel(param)); } + @GetMapping("/total") + public ApiResult> total(ThinkVipParam param) { + // 使用关联查询 + return success(thinkVipService.total(param)); + } + @ApiOperation("根据id查询") @GetMapping("/{id}") public ApiResult get(@PathVariable("id") Integer id) { diff --git a/src/main/java/com/gxwebsoft/think/entity/NuoNuoOrder.java b/src/main/java/com/gxwebsoft/think/entity/NuoNuoOrder.java index 059dff6..e97f538 100644 --- a/src/main/java/com/gxwebsoft/think/entity/NuoNuoOrder.java +++ b/src/main/java/com/gxwebsoft/think/entity/NuoNuoOrder.java @@ -87,4 +87,6 @@ public class NuoNuoOrder implements Serializable { @TableField(exist = false) private String invoiceTractorAndCombineH; + @TableField(exist = false) + private NuoNuoRealPropertyRentInfo realPropertyRentInfo; } diff --git a/src/main/java/com/gxwebsoft/think/entity/NuoNuoRealPropertyRentInfo.java b/src/main/java/com/gxwebsoft/think/entity/NuoNuoRealPropertyRentInfo.java new file mode 100644 index 0000000..5719f83 --- /dev/null +++ b/src/main/java/com/gxwebsoft/think/entity/NuoNuoRealPropertyRentInfo.java @@ -0,0 +1,47 @@ +package com.gxwebsoft.think.entity; + +import com.baomidou.mybatisplus.annotation.TableField; +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; +import lombok.EqualsAndHashCode; + +import java.io.Serializable; + +/** + * 发票 + * + * @author 科技小王子 + * @since 2024-05-25 17:20:15 + */ +@Data +@EqualsAndHashCode(callSuper = false) +@ApiModel(value = "NuoNuo不动产经营租赁服务特定要素", description = "不动产经营租赁服务特定要素") +public class NuoNuoRealPropertyRentInfo implements Serializable { + private static final long serialVersionUID = 1L; + + @ApiModelProperty(value = "不动产地址(传对应省市区中文名称--需与行政区划名称一致)") + @TableField(exist = false) + private String realPropertyAddress; + + @ApiModelProperty(value = "详细地址(不动产地址+详细地址 总长度 最大120字符,且必须包含 街、路、村、乡、镇、道 关键词)") + @TableField(exist = false) + private String detailAddress; + + @ApiModelProperty(value = "产权证书/不动产权证号") + @TableField(exist = false) + private String realPropertyCertificate; + + @ApiModelProperty(value = "租赁开始日期(不能晚于租赁结束日期)") + @TableField(exist = false) + private String rentStartDate; + + @ApiModelProperty(value = "租赁结束日期(不能早于租赁开始日期)") + @TableField(exist = false) + private String rentEndDate; + + @ApiModelProperty(value = "跨地(市)标志(0-否 1-是)") + @TableField(exist = false) + private String crossCityFlag; + +} diff --git a/src/main/java/com/gxwebsoft/think/entity/ThinkCard.java b/src/main/java/com/gxwebsoft/think/entity/ThinkCard.java index a8a039a..7b3ad57 100644 --- a/src/main/java/com/gxwebsoft/think/entity/ThinkCard.java +++ b/src/main/java/com/gxwebsoft/think/entity/ThinkCard.java @@ -10,6 +10,7 @@ import lombok.EqualsAndHashCode; import java.io.Serializable; import java.math.BigDecimal; +import java.util.List; /** * @@ -150,4 +151,9 @@ public class ThinkCard implements Serializable { @ApiModelProperty(value = "备注") private String remark; + @TableField(exist = false) + private List siteList; + + @TableField(exist = false) + private Integer makeNum; } diff --git a/src/main/java/com/gxwebsoft/think/entity/ThinkCardsBills.java b/src/main/java/com/gxwebsoft/think/entity/ThinkCardsBills.java new file mode 100644 index 0000000..cdad487 --- /dev/null +++ b/src/main/java/com/gxwebsoft/think/entity/ThinkCardsBills.java @@ -0,0 +1,62 @@ +package com.gxwebsoft.think.entity; + +import com.baomidou.mybatisplus.annotation.IdType; +import com.baomidou.mybatisplus.annotation.TableField; +import com.baomidou.mybatisplus.annotation.TableId; + +import java.math.BigDecimal; +import java.time.LocalDateTime; +import com.baomidou.mybatisplus.annotation.TableLogic; +import java.io.Serializable; +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; +import lombok.EqualsAndHashCode; + +/** + * Vip卡每日账单 + * + * @author 科技小王子 + * @since 2024-12-25 16:41:01 + */ +@Data +@EqualsAndHashCode(callSuper = false) +@ApiModel(value = "ThinkCardsBills对象", description = "Vip卡每日账单") +public class ThinkCardsBills implements Serializable { + private static final long serialVersionUID = 1L; + + @TableId(value = "id", type = IdType.AUTO) + private Integer id; + + private Integer uid; + + private Integer cid; + + private Integer used; + + private String date; + + private BigDecimal amount; + + @ApiModelProperty(value = "租户id") + private Integer tenantId; + + @ApiModelProperty(value = "状态, 0已发布, 1待审核 2已驳回 3违规内容") + private Integer status; + + @ApiModelProperty(value = "是否删除, 0否, 1是") + @TableLogic + private Integer deleted; + + @ApiModelProperty(value = "创建时间") + private LocalDateTime createTime; + + @ApiModelProperty(value = "修改时间") + private LocalDateTime updateTime; + + @TableField(exist = false) + private ThinkCard vip; + + @TableField(exist = false) + private ThinkUsers user; +} diff --git a/src/main/java/com/gxwebsoft/think/entity/ThinkDeposit.java b/src/main/java/com/gxwebsoft/think/entity/ThinkDeposit.java index e28b5bc..80183f0 100644 --- a/src/main/java/com/gxwebsoft/think/entity/ThinkDeposit.java +++ b/src/main/java/com/gxwebsoft/think/entity/ThinkDeposit.java @@ -37,6 +37,8 @@ public class ThinkDeposit implements Serializable { @ApiModelProperty(value = "姓名") private String name; + private String orderNum; + @ApiModelProperty(value = "手机号码") private String phone; @@ -51,8 +53,12 @@ public class ThinkDeposit implements Serializable { @ApiModelProperty(value = "管理员id") private Integer aid; - private Integer createTime; + private Long createTime; - private Integer updateTime; + private Long updateTime; + + private Long refundTime; + + private String failReason; } diff --git a/src/main/java/com/gxwebsoft/think/entity/ThinkDepositItem.java b/src/main/java/com/gxwebsoft/think/entity/ThinkDepositItem.java new file mode 100644 index 0000000..c4e78ed --- /dev/null +++ b/src/main/java/com/gxwebsoft/think/entity/ThinkDepositItem.java @@ -0,0 +1,43 @@ +package com.gxwebsoft.think.entity; + +import java.math.BigDecimal; +import com.baomidou.mybatisplus.annotation.IdType; +import com.baomidou.mybatisplus.annotation.TableId; +import java.io.Serializable; +import java.time.LocalDateTime; + +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; +import lombok.EqualsAndHashCode; + +/** + * 押金物品 + * + * @author 科技小王子 + * @since 2024-12-05 23:17:01 + */ +@Data +@EqualsAndHashCode(callSuper = false) +@ApiModel(value = "ThinkDepositItem对象", description = "押金物品") +public class ThinkDepositItem implements Serializable { + private static final long serialVersionUID = 1L; + + @TableId(value = "id", type = IdType.AUTO) + private Integer id; + + private String title; + + private BigDecimal amount; + + private Integer siteId; + + private String siteName; + + @ApiModelProperty(value = "创建时间") + private LocalDateTime createTime; + + @ApiModelProperty(value = "租户id") + private Integer tenantId; + +} diff --git a/src/main/java/com/gxwebsoft/think/entity/ThinkGoods.java b/src/main/java/com/gxwebsoft/think/entity/ThinkGoods.java index 86c69b7..3fde206 100644 --- a/src/main/java/com/gxwebsoft/think/entity/ThinkGoods.java +++ b/src/main/java/com/gxwebsoft/think/entity/ThinkGoods.java @@ -1,6 +1,7 @@ package com.gxwebsoft.think.entity; import com.baomidou.mybatisplus.annotation.IdType; +import com.baomidou.mybatisplus.annotation.TableField; import com.baomidou.mybatisplus.annotation.TableId; import io.swagger.annotations.ApiModel; import io.swagger.annotations.ApiModelProperty; @@ -62,12 +63,14 @@ public class ThinkGoods implements Serializable { private Integer status; @ApiModelProperty(value = "商品简介") + @TableField(value = "`desc`") private String desc; @ApiModelProperty(value = "商品详细介绍") private String content; @ApiModelProperty(value = "排序") + @TableField(value = "`sort`") private Integer sort; @ApiModelProperty(value = "是否需要发货:1是;0否") @@ -83,4 +86,7 @@ public class ThinkGoods implements Serializable { private Integer updateTime; + @TableField(exist = false) + private ThinkGoodsCategory category; + } diff --git a/src/main/java/com/gxwebsoft/think/entity/ThinkGoodsCategory.java b/src/main/java/com/gxwebsoft/think/entity/ThinkGoodsCategory.java index 2cb0279..fc27550 100644 --- a/src/main/java/com/gxwebsoft/think/entity/ThinkGoodsCategory.java +++ b/src/main/java/com/gxwebsoft/think/entity/ThinkGoodsCategory.java @@ -1,6 +1,7 @@ package com.gxwebsoft.think.entity; import com.baomidou.mybatisplus.annotation.IdType; +import com.baomidou.mybatisplus.annotation.TableField; import com.baomidou.mybatisplus.annotation.TableId; import io.swagger.annotations.ApiModel; import io.swagger.annotations.ApiModelProperty; @@ -8,6 +9,7 @@ import lombok.Data; import lombok.EqualsAndHashCode; import java.io.Serializable; +import java.util.List; /** * @@ -40,4 +42,6 @@ public class ThinkGoodsCategory implements Serializable { private Integer updateTime; + @TableField(exist = false) + private List goodsList; } diff --git a/src/main/java/com/gxwebsoft/think/entity/ThinkGoodsOrder.java b/src/main/java/com/gxwebsoft/think/entity/ThinkGoodsOrder.java index baef389..717efa1 100644 --- a/src/main/java/com/gxwebsoft/think/entity/ThinkGoodsOrder.java +++ b/src/main/java/com/gxwebsoft/think/entity/ThinkGoodsOrder.java @@ -1,6 +1,7 @@ package com.gxwebsoft.think.entity; import com.baomidou.mybatisplus.annotation.IdType; +import com.baomidou.mybatisplus.annotation.TableField; import com.baomidou.mybatisplus.annotation.TableId; import io.swagger.annotations.ApiModel; import io.swagger.annotations.ApiModelProperty; @@ -9,6 +10,7 @@ import lombok.EqualsAndHashCode; import java.io.Serializable; import java.math.BigDecimal; +import java.util.List; /** * @@ -75,4 +77,7 @@ public class ThinkGoodsOrder implements Serializable { @ApiModelProperty(value = "支付时间") private Integer payTime; + @TableField(exist = false) + private List infoList; + } diff --git a/src/main/java/com/gxwebsoft/think/entity/ThinkInvoice.java b/src/main/java/com/gxwebsoft/think/entity/ThinkInvoice.java index 47a0fe5..a3993af 100644 --- a/src/main/java/com/gxwebsoft/think/entity/ThinkInvoice.java +++ b/src/main/java/com/gxwebsoft/think/entity/ThinkInvoice.java @@ -90,4 +90,14 @@ public class ThinkInvoice implements Serializable { private Integer vid; + private Integer status; + + private String rentStartDate; + + private String rentEndDate; + + private String size; + + private String remark; + } diff --git a/src/main/java/com/gxwebsoft/think/entity/ThinkMachineOpenLog.java b/src/main/java/com/gxwebsoft/think/entity/ThinkMachineOpenLog.java new file mode 100644 index 0000000..ff0e7fc --- /dev/null +++ b/src/main/java/com/gxwebsoft/think/entity/ThinkMachineOpenLog.java @@ -0,0 +1,52 @@ +package com.gxwebsoft.think.entity; + +import com.baomidou.mybatisplus.annotation.IdType; +import com.baomidou.mybatisplus.annotation.TableField; +import com.baomidou.mybatisplus.annotation.TableId; +import java.time.LocalDateTime; +import com.baomidou.mybatisplus.annotation.TableLogic; +import java.io.Serializable; +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; +import lombok.EqualsAndHashCode; + +/** + * 闸机开门记录 + * + * @author 科技小王子 + * @since 2024-11-28 18:22:35 + */ +@Data +@EqualsAndHashCode(callSuper = false) +@ApiModel(value = "ThinkMachineOpenLog对象", description = "闸机开门记录") +public class ThinkMachineOpenLog implements Serializable { + private static final long serialVersionUID = 1L; + + @TableId(value = "id", type = IdType.AUTO) + private Integer id; + + private Integer orderId; + + @ApiModelProperty(value = "租户id") + private Integer tenantId; + + @ApiModelProperty(value = "备注") + private String comments; + + @ApiModelProperty(value = "状态, 0在线, 1离线") + private Integer status; + + @ApiModelProperty(value = "是否删除, 0否, 1是") + @TableLogic + private Integer deleted; + + @ApiModelProperty(value = "注册时间") + private LocalDateTime createTime; + + @ApiModelProperty(value = "修改时间") + private LocalDateTime updateTime; + + @TableField(exist = false) + private String qrcode; +} diff --git a/src/main/java/com/gxwebsoft/think/entity/ThinkOrder.java b/src/main/java/com/gxwebsoft/think/entity/ThinkOrder.java index e192877..bd307ef 100644 --- a/src/main/java/com/gxwebsoft/think/entity/ThinkOrder.java +++ b/src/main/java/com/gxwebsoft/think/entity/ThinkOrder.java @@ -67,6 +67,9 @@ public class ThinkOrder implements Serializable { @ApiModelProperty(value = "订单总额") private BigDecimal totalPrice; + @TableField(exist = false) + private BigDecimal totalAmount; + @ApiModelProperty(value = "减少的金额,使用VIP会员折扣、优惠券抵扣、优惠券折扣后减去的价格") private BigDecimal reducePrice; @@ -103,6 +106,10 @@ public class ThinkOrder implements Serializable { @ApiModelProperty(value = "二维码地址,保存订单号,支付成功后才生成") private String qrcode; + @ApiModelProperty(value = "核销码生成时间戳") + @TableField(exist = false) + private String qrCodeTimestamp; + @ApiModelProperty(value = "优惠说明") @TableField("`desc`") private String desc; @@ -156,4 +163,10 @@ public class ThinkOrder implements Serializable { @TableField(exist = false) private String openid; + + @TableField(exist = false) + private ThinkCard card; + + @TableField(exist = false) + private ThinkUsersVip thinkVip; } diff --git a/src/main/java/com/gxwebsoft/think/entity/ThinkOrderRefundLog.java b/src/main/java/com/gxwebsoft/think/entity/ThinkOrderRefundLog.java index dc882ab..48e577e 100644 --- a/src/main/java/com/gxwebsoft/think/entity/ThinkOrderRefundLog.java +++ b/src/main/java/com/gxwebsoft/think/entity/ThinkOrderRefundLog.java @@ -1,6 +1,7 @@ package com.gxwebsoft.think.entity; import com.baomidou.mybatisplus.annotation.IdType; +import com.baomidou.mybatisplus.annotation.TableField; import com.baomidou.mybatisplus.annotation.TableId; import io.swagger.annotations.ApiModel; import io.swagger.annotations.ApiModelProperty; @@ -8,6 +9,7 @@ import lombok.Data; import lombok.EqualsAndHashCode; import java.io.Serializable; +import java.math.BigDecimal; import java.time.LocalDateTime; /** @@ -22,7 +24,7 @@ import java.time.LocalDateTime; public class ThinkOrderRefundLog implements Serializable { private static final long serialVersionUID = 1L; - @TableId(value = "int", type = IdType.AUTO) + @TableId(value = "`int`", type = IdType.AUTO) private Integer id; @ApiModelProperty(value = "用户ID") @@ -31,10 +33,20 @@ public class ThinkOrderRefundLog implements Serializable { @ApiModelProperty(value = "场馆ID") private Integer sid; + @ApiModelProperty(value = "退款单号") + private String refundNo; + + @ApiModelProperty(value = "0订场 1会员卡 2") + private Integer type; + + @ApiModelProperty(value = "退款金额") + private BigDecimal refundAmount; + @ApiModelProperty(value = "订单ID") private Integer oid; @ApiModelProperty(value = "参数json") + @TableField(value = "`json`") private String json; @ApiModelProperty(value = "来源") @@ -46,4 +58,6 @@ public class ThinkOrderRefundLog implements Serializable { @ApiModelProperty(value = "创建时间") private LocalDateTime createTime; + @TableField(exist = false) + private ThinkOrder order; } diff --git a/src/main/java/com/gxwebsoft/think/entity/ThinkSite.java b/src/main/java/com/gxwebsoft/think/entity/ThinkSite.java index 6da84de..4a61d4f 100644 --- a/src/main/java/com/gxwebsoft/think/entity/ThinkSite.java +++ b/src/main/java/com/gxwebsoft/think/entity/ThinkSite.java @@ -38,9 +38,30 @@ public class ThinkSite implements Serializable { @ApiModelProperty(value = "营业时间") private String businessTime; + @ApiModelProperty(value = "省") + private String province; + + @ApiModelProperty(value = "市") + private String city; + + @ApiModelProperty(value = "区") + private String region; + @ApiModelProperty(value = "场馆地址") private String address; + @ApiModelProperty(value = "租赁开始日期(不能晚于租赁结束日期)") + private String rentStartDate; + + @ApiModelProperty(value = "租赁结束日期(不能早于租赁开始日期)") + private String rentEndDate; + + @ApiModelProperty(value = "场馆面积") + private String size; + + @ApiModelProperty(value = "产权证书/不动产权证号") + private String realPropertyCertificate; + @ApiModelProperty(value = "场馆介绍") private String info; @@ -75,6 +96,10 @@ public class ThinkSite implements Serializable { private String lng; + private Integer dailyMaxNum; + + private Integer dailyNum; + @TableField(exist = false) private BigDecimal distance; diff --git a/src/main/java/com/gxwebsoft/think/entity/ThinkVip.java b/src/main/java/com/gxwebsoft/think/entity/ThinkVip.java index cdcd706..0c7d0d9 100644 --- a/src/main/java/com/gxwebsoft/think/entity/ThinkVip.java +++ b/src/main/java/com/gxwebsoft/think/entity/ThinkVip.java @@ -100,4 +100,34 @@ public class ThinkVip implements Serializable { @TableField(exist = false) private List cardList; + @TableField(exist = false) + private Integer totalNum; + + @TableField(exist = false) + private BigDecimal wechatAmount; + + @TableField(exist = false) + private BigDecimal wechatActual; + + @TableField(exist = false) + private BigDecimal wechatRefund; + + @TableField(exist = false) + private BigDecimal posAmount; + + @TableField(exist = false) + private BigDecimal posActual; + + @TableField(exist = false) + private BigDecimal posRefund; + + @TableField(exist = false) + private BigDecimal cashAmount; + + @TableField(exist = false) + private BigDecimal cashActual; + + @TableField(exist = false) + private BigDecimal cashRefund; + } diff --git a/src/main/java/com/gxwebsoft/think/entity/ThinkVipCardsBills.java b/src/main/java/com/gxwebsoft/think/entity/ThinkVipCardsBills.java new file mode 100644 index 0000000..34afec0 --- /dev/null +++ b/src/main/java/com/gxwebsoft/think/entity/ThinkVipCardsBills.java @@ -0,0 +1,69 @@ +package com.gxwebsoft.think.entity; + +import com.baomidou.mybatisplus.annotation.IdType; +import com.baomidou.mybatisplus.annotation.TableField; +import com.baomidou.mybatisplus.annotation.TableId; + +import java.math.BigDecimal; +import java.time.LocalDateTime; +import com.baomidou.mybatisplus.annotation.TableLogic; +import java.io.Serializable; +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; +import lombok.EqualsAndHashCode; + +/** + * Vip卡每日账单 + * + * @author 科技小王子 + * @since 2024-12-25 16:41:01 + */ +@Data +@EqualsAndHashCode(callSuper = false) +@ApiModel(value = "ThinkVipCardsBills对象", description = "Vip卡每日账单") +public class ThinkVipCardsBills implements Serializable { + private static final long serialVersionUID = 1L; + + @TableId(value = "id", type = IdType.AUTO) + private Integer id; + + private Integer uid; + + private Integer vid; + + private Integer cid; + + private Integer oid; + + private String date; + + private BigDecimal amount; + + private Integer used; + + @ApiModelProperty(value = "租户id") + private Integer tenantId; + + @ApiModelProperty(value = "状态, 0已发布, 1待审核 2已驳回 3违规内容") + private Integer status; + + @ApiModelProperty(value = "是否删除, 0否, 1是") + @TableLogic + private Integer deleted; + + @ApiModelProperty(value = "创建时间") + private LocalDateTime createTime; + + @ApiModelProperty(value = "修改时间") + private LocalDateTime updateTime; + + @TableField(exist = false) + private ThinkUsersVip vip; + + @TableField(exist = false) + private ThinkCard card; + + @TableField(exist = false) + private ThinkUsers user; +} diff --git a/src/main/java/com/gxwebsoft/think/mapper/ThinkCardsBillsMapper.java b/src/main/java/com/gxwebsoft/think/mapper/ThinkCardsBillsMapper.java new file mode 100644 index 0000000..3a56ff6 --- /dev/null +++ b/src/main/java/com/gxwebsoft/think/mapper/ThinkCardsBillsMapper.java @@ -0,0 +1,37 @@ +package com.gxwebsoft.think.mapper; + +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import com.baomidou.mybatisplus.core.metadata.IPage; +import com.gxwebsoft.think.entity.ThinkCardsBills; +import com.gxwebsoft.think.param.ThinkCardsBillsParam; +import org.apache.ibatis.annotations.Param; + +import java.util.List; + +/** + * Vip卡每日账单Mapper + * + * @author 科技小王子 + * @since 2024-12-25 16:41:01 + */ +public interface ThinkCardsBillsMapper extends BaseMapper { + + /** + * 分页查询 + * + * @param page 分页对象 + * @param param 查询参数 + * @return List + */ + List selectPageRel(@Param("page") IPage page, + @Param("param") ThinkCardsBillsParam param); + + /** + * 查询全部 + * + * @param param 查询参数 + * @return List + */ + List selectListRel(@Param("param") ThinkCardsBillsParam param); + +} diff --git a/src/main/java/com/gxwebsoft/think/mapper/ThinkDepositItemMapper.java b/src/main/java/com/gxwebsoft/think/mapper/ThinkDepositItemMapper.java new file mode 100644 index 0000000..013cb56 --- /dev/null +++ b/src/main/java/com/gxwebsoft/think/mapper/ThinkDepositItemMapper.java @@ -0,0 +1,37 @@ +package com.gxwebsoft.think.mapper; + +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import com.baomidou.mybatisplus.core.metadata.IPage; +import com.gxwebsoft.think.entity.ThinkDepositItem; +import com.gxwebsoft.think.param.ThinkDepositItemParam; +import org.apache.ibatis.annotations.Param; + +import java.util.List; + +/** + * 押金物品Mapper + * + * @author 科技小王子 + * @since 2024-12-05 23:17:01 + */ +public interface ThinkDepositItemMapper extends BaseMapper { + + /** + * 分页查询 + * + * @param page 分页对象 + * @param param 查询参数 + * @return List + */ + List selectPageRel(@Param("page") IPage page, + @Param("param") ThinkDepositItemParam param); + + /** + * 查询全部 + * + * @param param 查询参数 + * @return List + */ + List selectListRel(@Param("param") ThinkDepositItemParam param); + +} diff --git a/src/main/java/com/gxwebsoft/think/mapper/ThinkMachineOpenLogMapper.java b/src/main/java/com/gxwebsoft/think/mapper/ThinkMachineOpenLogMapper.java new file mode 100644 index 0000000..03d630d --- /dev/null +++ b/src/main/java/com/gxwebsoft/think/mapper/ThinkMachineOpenLogMapper.java @@ -0,0 +1,37 @@ +package com.gxwebsoft.think.mapper; + +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import com.baomidou.mybatisplus.core.metadata.IPage; +import com.gxwebsoft.think.entity.ThinkMachineOpenLog; +import com.gxwebsoft.think.param.ThinkMachineOpenLogParam; +import org.apache.ibatis.annotations.Param; + +import java.util.List; + +/** + * 闸机开门记录Mapper + * + * @author 科技小王子 + * @since 2024-11-28 18:22:35 + */ +public interface ThinkMachineOpenLogMapper extends BaseMapper { + + /** + * 分页查询 + * + * @param page 分页对象 + * @param param 查询参数 + * @return List + */ + List selectPageRel(@Param("page") IPage page, + @Param("param") ThinkMachineOpenLogParam param); + + /** + * 查询全部 + * + * @param param 查询参数 + * @return List + */ + List selectListRel(@Param("param") ThinkMachineOpenLogParam param); + +} diff --git a/src/main/java/com/gxwebsoft/think/mapper/ThinkVipCardsBillsMapper.java b/src/main/java/com/gxwebsoft/think/mapper/ThinkVipCardsBillsMapper.java new file mode 100644 index 0000000..5f9c620 --- /dev/null +++ b/src/main/java/com/gxwebsoft/think/mapper/ThinkVipCardsBillsMapper.java @@ -0,0 +1,37 @@ +package com.gxwebsoft.think.mapper; + +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import com.baomidou.mybatisplus.core.metadata.IPage; +import com.gxwebsoft.think.entity.ThinkVipCardsBills; +import com.gxwebsoft.think.param.ThinkVipCardsBillsParam; +import org.apache.ibatis.annotations.Param; + +import java.util.List; + +/** + * Vip卡每日账单Mapper + * + * @author 科技小王子 + * @since 2024-12-25 16:41:01 + */ +public interface ThinkVipCardsBillsMapper extends BaseMapper { + + /** + * 分页查询 + * + * @param page 分页对象 + * @param param 查询参数 + * @return List + */ + List selectPageRel(@Param("page") IPage page, + @Param("param") ThinkVipCardsBillsParam param); + + /** + * 查询全部 + * + * @param param 查询参数 + * @return List + */ + List selectListRel(@Param("param") ThinkVipCardsBillsParam param); + +} diff --git a/src/main/java/com/gxwebsoft/think/mapper/xml/ThinkCardMapper.xml b/src/main/java/com/gxwebsoft/think/mapper/xml/ThinkCardMapper.xml index 552685e..e24a020 100644 --- a/src/main/java/com/gxwebsoft/think/mapper/xml/ThinkCardMapper.xml +++ b/src/main/java/com/gxwebsoft/think/mapper/xml/ThinkCardMapper.xml @@ -140,6 +140,7 @@ ) + ORDER BY a.create_time DESC diff --git a/src/main/java/com/gxwebsoft/think/mapper/xml/ThinkCardsBillsMapper.xml b/src/main/java/com/gxwebsoft/think/mapper/xml/ThinkCardsBillsMapper.xml new file mode 100644 index 0000000..b0604d1 --- /dev/null +++ b/src/main/java/com/gxwebsoft/think/mapper/xml/ThinkCardsBillsMapper.xml @@ -0,0 +1,60 @@ + + + + + + + SELECT a.* + FROM think_cards_bills a + + + AND a.id = #{param.id} + + + AND a.uid = #{param.uid} + + + AND a.cid = #{param.cid} + + + AND a.date LIKE CONCAT('%', #{param.date}, '%') + + + AND a.amount LIKE CONCAT('%', #{param.amount}, '%') + + + AND a.status = #{param.status} + + + AND a.deleted = #{param.deleted} + + + AND a.deleted = 0 + + + AND a.create_time >= #{param.createTimeStart} + + + AND a.create_time <= #{param.createTimeEnd} + + + AND a.date >= #{param.dateStart} AND a.date <= #{param.dateEnd} + + + AND (a.comments LIKE CONCAT('%', #{param.keywords}, '%') + ) + + + + + + + + + + + diff --git a/src/main/java/com/gxwebsoft/think/mapper/xml/ThinkDepositItemMapper.xml b/src/main/java/com/gxwebsoft/think/mapper/xml/ThinkDepositItemMapper.xml new file mode 100644 index 0000000..30efd1a --- /dev/null +++ b/src/main/java/com/gxwebsoft/think/mapper/xml/ThinkDepositItemMapper.xml @@ -0,0 +1,48 @@ + + + + + + + SELECT a.* + FROM think_deposit_item a + + + AND a.id = #{param.id} + + + AND a.site_id = #{param.siteId} + + + AND a.title LIKE CONCAT('%', #{param.title}, '%') + + + AND a.amount = #{param.amount} + + + AND a.site_name LIKE CONCAT('%', #{param.siteName}, '%') + + + AND a.create_time >= #{param.createTimeStart} + + + AND a.create_time <= #{param.createTimeEnd} + + + AND (a.comments LIKE CONCAT('%', #{param.keywords}, '%') + ) + + + + + + + + + + + diff --git a/src/main/java/com/gxwebsoft/think/mapper/xml/ThinkGoodsMapper.xml b/src/main/java/com/gxwebsoft/think/mapper/xml/ThinkGoodsMapper.xml index 2c90818..2e0059d 100644 --- a/src/main/java/com/gxwebsoft/think/mapper/xml/ThinkGoodsMapper.xml +++ b/src/main/java/com/gxwebsoft/think/mapper/xml/ThinkGoodsMapper.xml @@ -71,7 +71,7 @@ AND a.create_time <= #{param.createTimeEnd} - AND (a.comments LIKE CONCAT('%', #{param.keywords}, '%') + AND (a.title LIKE CONCAT('%', #{param.keywords}, '%') ) diff --git a/src/main/java/com/gxwebsoft/think/mapper/xml/ThinkGoodsOrderMapper.xml b/src/main/java/com/gxwebsoft/think/mapper/xml/ThinkGoodsOrderMapper.xml index 84cc170..723d045 100644 --- a/src/main/java/com/gxwebsoft/think/mapper/xml/ThinkGoodsOrderMapper.xml +++ b/src/main/java/com/gxwebsoft/think/mapper/xml/ThinkGoodsOrderMapper.xml @@ -66,6 +66,7 @@ ) + ORDER BY a.id DESC diff --git a/src/main/java/com/gxwebsoft/think/mapper/xml/ThinkMachineOpenLogMapper.xml b/src/main/java/com/gxwebsoft/think/mapper/xml/ThinkMachineOpenLogMapper.xml new file mode 100644 index 0000000..e04ecba --- /dev/null +++ b/src/main/java/com/gxwebsoft/think/mapper/xml/ThinkMachineOpenLogMapper.xml @@ -0,0 +1,51 @@ + + + + + + + SELECT a.* + FROM think_machine_open_log a + + + AND a.id = #{param.id} + + + AND a.order_id = #{param.orderId} + + + AND a.comments LIKE CONCAT('%', #{param.comments}, '%') + + + AND a.status = #{param.status} + + + AND a.deleted = #{param.deleted} + + + AND a.deleted = 0 + + + AND a.create_time >= #{param.createTimeStart} + + + AND a.create_time <= #{param.createTimeEnd} + + + AND (a.comments LIKE CONCAT('%', #{param.keywords}, '%') + ) + + + + + + + + + + + diff --git a/src/main/java/com/gxwebsoft/think/mapper/xml/ThinkSiteMapper.xml b/src/main/java/com/gxwebsoft/think/mapper/xml/ThinkSiteMapper.xml index c5c90fc..058bf11 100644 --- a/src/main/java/com/gxwebsoft/think/mapper/xml/ThinkSiteMapper.xml +++ b/src/main/java/com/gxwebsoft/think/mapper/xml/ThinkSiteMapper.xml @@ -10,6 +10,12 @@ AND a.id = #{param.id} + + AND a.id IN + + #{id} + + AND a.name LIKE CONCAT('%', #{param.name}, '%') diff --git a/src/main/java/com/gxwebsoft/think/mapper/xml/ThinkUsersMapper.xml b/src/main/java/com/gxwebsoft/think/mapper/xml/ThinkUsersMapper.xml index beac5ff..8655cc7 100644 --- a/src/main/java/com/gxwebsoft/think/mapper/xml/ThinkUsersMapper.xml +++ b/src/main/java/com/gxwebsoft/think/mapper/xml/ThinkUsersMapper.xml @@ -61,9 +61,9 @@ AND (a.truename LIKE CONCAT('%', #{param.keywords}, '%') OR a.id = #{param.keywords} - OR a.phone = #{param.keywords} - OR a.username = #{param.keywords} - OR a.idcard = #{param.keywords} + OR a.phone LIKE CONCAT('%', #{param.keywords}, '%') + OR a.username LIKE CONCAT('%', #{param.keywords}, '%') + OR a.idcard LIKE CONCAT('%', #{param.keywords}, '%') ) diff --git a/src/main/java/com/gxwebsoft/think/mapper/xml/ThinkUsersVipMapper.xml b/src/main/java/com/gxwebsoft/think/mapper/xml/ThinkUsersVipMapper.xml index ff3567a..eb78699 100644 --- a/src/main/java/com/gxwebsoft/think/mapper/xml/ThinkUsersVipMapper.xml +++ b/src/main/java/com/gxwebsoft/think/mapper/xml/ThinkUsersVipMapper.xml @@ -130,6 +130,7 @@ ) + ORDER BY a.create_time DESC diff --git a/src/main/java/com/gxwebsoft/think/mapper/xml/ThinkVipCardsBillsMapper.xml b/src/main/java/com/gxwebsoft/think/mapper/xml/ThinkVipCardsBillsMapper.xml new file mode 100644 index 0000000..234f82e --- /dev/null +++ b/src/main/java/com/gxwebsoft/think/mapper/xml/ThinkVipCardsBillsMapper.xml @@ -0,0 +1,60 @@ + + + + + + + SELECT a.* + FROM think_vip_cards_bills a + + + AND a.id = #{param.id} + + + AND a.uid = #{param.uid} + + + AND a.vid = #{param.vid} + + + AND a.date LIKE CONCAT('%', #{param.date}, '%') + + + AND a.amount LIKE CONCAT('%', #{param.amount}, '%') + + + AND a.status = #{param.status} + + + AND a.deleted = #{param.deleted} + + + AND a.deleted = 0 + + + AND a.create_time >= #{param.createTimeStart} + + + AND a.create_time <= #{param.createTimeEnd} + + + AND a.date >= #{param.dateStart} AND a.date <= #{param.dateEnd} + + + AND (a.comments LIKE CONCAT('%', #{param.keywords}, '%') + ) + + + + + + + + + + + diff --git a/src/main/java/com/gxwebsoft/think/param/ThinkCardsBillsParam.java b/src/main/java/com/gxwebsoft/think/param/ThinkCardsBillsParam.java new file mode 100644 index 0000000..9217076 --- /dev/null +++ b/src/main/java/com/gxwebsoft/think/param/ThinkCardsBillsParam.java @@ -0,0 +1,54 @@ +package com.gxwebsoft.think.param; + +import java.math.BigDecimal; + +import com.baomidou.mybatisplus.annotation.TableField; +import com.gxwebsoft.common.core.annotation.QueryField; +import com.gxwebsoft.common.core.annotation.QueryType; +import com.gxwebsoft.common.core.web.BaseParam; +import com.fasterxml.jackson.annotation.JsonInclude; +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; +import lombok.EqualsAndHashCode; + +/** + * Vip卡每日账单查询参数 + * + * @author 科技小王子 + * @since 2024-12-25 16:41:01 + */ +@Data +@EqualsAndHashCode(callSuper = false) +@JsonInclude(JsonInclude.Include.NON_NULL) +@ApiModel(value = "ThinkCardsBillsParam对象", description = "Vip卡每日账单查询参数") +public class ThinkCardsBillsParam extends BaseParam { + private static final long serialVersionUID = 1L; + + @QueryField(type = QueryType.EQ) + private Integer id; + + @QueryField(type = QueryType.EQ) + private Integer uid; + + @QueryField(type = QueryType.EQ) + private Integer cid; + + private String date; + + private String amount; + + @ApiModelProperty(value = "状态, 0已发布, 1待审核 2已驳回 3违规内容") + @QueryField(type = QueryType.EQ) + private Integer status; + + @ApiModelProperty(value = "是否删除, 0否, 1是") + @QueryField(type = QueryType.EQ) + private Integer deleted; + + @TableField(exist = false) + private String dateStart; + + @TableField(exist = false) + private String dateEnd; +} diff --git a/src/main/java/com/gxwebsoft/think/param/ThinkDepositItemParam.java b/src/main/java/com/gxwebsoft/think/param/ThinkDepositItemParam.java new file mode 100644 index 0000000..ef6070b --- /dev/null +++ b/src/main/java/com/gxwebsoft/think/param/ThinkDepositItemParam.java @@ -0,0 +1,38 @@ +package com.gxwebsoft.think.param; + +import java.math.BigDecimal; +import com.gxwebsoft.common.core.annotation.QueryField; +import com.gxwebsoft.common.core.annotation.QueryType; +import com.gxwebsoft.common.core.web.BaseParam; +import com.fasterxml.jackson.annotation.JsonInclude; +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; +import lombok.EqualsAndHashCode; + +/** + * 押金物品查询参数 + * + * @author 科技小王子 + * @since 2024-12-05 23:17:01 + */ +@Data +@EqualsAndHashCode(callSuper = false) +@JsonInclude(JsonInclude.Include.NON_NULL) +@ApiModel(value = "ThinkDepositItemParam对象", description = "押金物品查询参数") +public class ThinkDepositItemParam extends BaseParam { + private static final long serialVersionUID = 1L; + + @QueryField(type = QueryType.EQ) + private Integer id; + + private Integer siteId; + + private String title; + + @QueryField(type = QueryType.EQ) + private BigDecimal amount; + + private String siteName; + +} diff --git a/src/main/java/com/gxwebsoft/think/param/ThinkDepositParam.java b/src/main/java/com/gxwebsoft/think/param/ThinkDepositParam.java index c5dff25..d626810 100644 --- a/src/main/java/com/gxwebsoft/think/param/ThinkDepositParam.java +++ b/src/main/java/com/gxwebsoft/think/param/ThinkDepositParam.java @@ -1,5 +1,6 @@ package com.gxwebsoft.think.param; +import com.baomidou.mybatisplus.annotation.TableField; import com.fasterxml.jackson.annotation.JsonInclude; import com.gxwebsoft.common.core.annotation.QueryField; import com.gxwebsoft.common.core.annotation.QueryType; @@ -58,4 +59,6 @@ public class ThinkDepositParam extends BaseParam { @QueryField(type = QueryType.EQ) private Integer aid; + @TableField(exist = false) + private Boolean forAdmin; } diff --git a/src/main/java/com/gxwebsoft/think/param/ThinkInvoiceParam.java b/src/main/java/com/gxwebsoft/think/param/ThinkInvoiceParam.java index e6ce6fd..2518c56 100644 --- a/src/main/java/com/gxwebsoft/think/param/ThinkInvoiceParam.java +++ b/src/main/java/com/gxwebsoft/think/param/ThinkInvoiceParam.java @@ -1,5 +1,6 @@ package com.gxwebsoft.think.param; +import com.baomidou.mybatisplus.annotation.TableField; import com.fasterxml.jackson.annotation.JsonInclude; import com.gxwebsoft.common.core.annotation.QueryField; import com.gxwebsoft.common.core.annotation.QueryType; @@ -94,4 +95,7 @@ public class ThinkInvoiceParam extends BaseParam { @QueryField(type = QueryType.EQ) private Integer vid; + @TableField(exist = false) + private Boolean forAdmin; + } diff --git a/src/main/java/com/gxwebsoft/think/param/ThinkMachineOpenLogParam.java b/src/main/java/com/gxwebsoft/think/param/ThinkMachineOpenLogParam.java new file mode 100644 index 0000000..be64afd --- /dev/null +++ b/src/main/java/com/gxwebsoft/think/param/ThinkMachineOpenLogParam.java @@ -0,0 +1,43 @@ +package com.gxwebsoft.think.param; + +import java.math.BigDecimal; +import com.gxwebsoft.common.core.annotation.QueryField; +import com.gxwebsoft.common.core.annotation.QueryType; +import com.gxwebsoft.common.core.web.BaseParam; +import com.fasterxml.jackson.annotation.JsonInclude; +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; +import lombok.EqualsAndHashCode; + +/** + * 闸机开门记录查询参数 + * + * @author 科技小王子 + * @since 2024-11-28 18:22:35 + */ +@Data +@EqualsAndHashCode(callSuper = false) +@JsonInclude(JsonInclude.Include.NON_NULL) +@ApiModel(value = "ThinkMachineOpenLogParam对象", description = "闸机开门记录查询参数") +public class ThinkMachineOpenLogParam extends BaseParam { + private static final long serialVersionUID = 1L; + + @QueryField(type = QueryType.EQ) + private Integer id; + + @QueryField(type = QueryType.EQ) + private Integer orderId; + + @ApiModelProperty(value = "备注") + private String comments; + + @ApiModelProperty(value = "状态, 0在线, 1离线") + @QueryField(type = QueryType.EQ) + private Integer status; + + @ApiModelProperty(value = "是否删除, 0否, 1是") + @QueryField(type = QueryType.EQ) + private Integer deleted; + +} diff --git a/src/main/java/com/gxwebsoft/think/param/ThinkOrderParam.java b/src/main/java/com/gxwebsoft/think/param/ThinkOrderParam.java index 7305fa5..cd0b5e1 100644 --- a/src/main/java/com/gxwebsoft/think/param/ThinkOrderParam.java +++ b/src/main/java/com/gxwebsoft/think/param/ThinkOrderParam.java @@ -1,5 +1,6 @@ package com.gxwebsoft.think.param; +import com.baomidou.mybatisplus.annotation.TableField; import com.fasterxml.jackson.annotation.JsonInclude; import com.gxwebsoft.common.core.annotation.QueryField; import com.gxwebsoft.common.core.annotation.QueryType; @@ -154,4 +155,6 @@ public class ThinkOrderParam extends BaseParam { @QueryField(type = QueryType.EQ) private Integer checkBill; + @TableField(exist = false) + private Boolean forAdmin; } diff --git a/src/main/java/com/gxwebsoft/think/param/ThinkSiteParam.java b/src/main/java/com/gxwebsoft/think/param/ThinkSiteParam.java index 656cacb..b9a37b0 100644 --- a/src/main/java/com/gxwebsoft/think/param/ThinkSiteParam.java +++ b/src/main/java/com/gxwebsoft/think/param/ThinkSiteParam.java @@ -1,5 +1,6 @@ package com.gxwebsoft.think.param; +import com.baomidou.mybatisplus.annotation.TableField; import com.fasterxml.jackson.annotation.JsonInclude; import com.gxwebsoft.common.core.annotation.QueryField; import com.gxwebsoft.common.core.annotation.QueryType; @@ -10,6 +11,7 @@ import lombok.Data; import lombok.EqualsAndHashCode; import java.math.BigDecimal; +import java.util.List; /** * 查询参数 @@ -76,4 +78,9 @@ public class ThinkSiteParam extends BaseParam { @QueryField(type = QueryType.EQ) private Integer weekendOpen; + @TableField(exist = false) + private String ids; + + @TableField(exist = false) + private List idList; } diff --git a/src/main/java/com/gxwebsoft/think/param/ThinkUsersVipParam.java b/src/main/java/com/gxwebsoft/think/param/ThinkUsersVipParam.java index 62650b3..312ef87 100644 --- a/src/main/java/com/gxwebsoft/think/param/ThinkUsersVipParam.java +++ b/src/main/java/com/gxwebsoft/think/param/ThinkUsersVipParam.java @@ -1,5 +1,6 @@ package com.gxwebsoft.think.param; +import com.baomidou.mybatisplus.annotation.TableField; import com.fasterxml.jackson.annotation.JsonInclude; import com.gxwebsoft.common.core.annotation.QueryField; import com.gxwebsoft.common.core.annotation.QueryType; @@ -150,4 +151,6 @@ public class ThinkUsersVipParam extends BaseParam { @QueryField(type = QueryType.EQ) private Integer checkBill; + @TableField(exist = false) + private Boolean forAdmin; } diff --git a/src/main/java/com/gxwebsoft/think/param/ThinkVipCardsBillsParam.java b/src/main/java/com/gxwebsoft/think/param/ThinkVipCardsBillsParam.java new file mode 100644 index 0000000..9316237 --- /dev/null +++ b/src/main/java/com/gxwebsoft/think/param/ThinkVipCardsBillsParam.java @@ -0,0 +1,54 @@ +package com.gxwebsoft.think.param; + +import java.math.BigDecimal; + +import com.baomidou.mybatisplus.annotation.TableField; +import com.gxwebsoft.common.core.annotation.QueryField; +import com.gxwebsoft.common.core.annotation.QueryType; +import com.gxwebsoft.common.core.web.BaseParam; +import com.fasterxml.jackson.annotation.JsonInclude; +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; +import lombok.EqualsAndHashCode; + +/** + * Vip卡每日账单查询参数 + * + * @author 科技小王子 + * @since 2024-12-25 16:41:01 + */ +@Data +@EqualsAndHashCode(callSuper = false) +@JsonInclude(JsonInclude.Include.NON_NULL) +@ApiModel(value = "ThinkVipCardsBillsParam对象", description = "Vip卡每日账单查询参数") +public class ThinkVipCardsBillsParam extends BaseParam { + private static final long serialVersionUID = 1L; + + @QueryField(type = QueryType.EQ) + private Integer id; + + @QueryField(type = QueryType.EQ) + private Integer uid; + + @QueryField(type = QueryType.EQ) + private Integer vid; + + private String date; + + private String amount; + + @ApiModelProperty(value = "状态, 0已发布, 1待审核 2已驳回 3违规内容") + @QueryField(type = QueryType.EQ) + private Integer status; + + @ApiModelProperty(value = "是否删除, 0否, 1是") + @QueryField(type = QueryType.EQ) + private Integer deleted; + + @TableField(exist = false) + private String dateStart; + + @TableField(exist = false) + private String dateEnd; +} diff --git a/src/main/java/com/gxwebsoft/think/service/ThinkCardService.java b/src/main/java/com/gxwebsoft/think/service/ThinkCardService.java index fb07954..7b361bf 100644 --- a/src/main/java/com/gxwebsoft/think/service/ThinkCardService.java +++ b/src/main/java/com/gxwebsoft/think/service/ThinkCardService.java @@ -40,5 +40,9 @@ public interface ThinkCardService extends IService { */ ThinkCard getByIdRel(Integer id); + ThinkCard getByCode(String code); + List userCard(ThinkUsers user); + + List listByCodeList(List codeList); } diff --git a/src/main/java/com/gxwebsoft/think/service/ThinkCardsBillsService.java b/src/main/java/com/gxwebsoft/think/service/ThinkCardsBillsService.java new file mode 100644 index 0000000..394f3ef --- /dev/null +++ b/src/main/java/com/gxwebsoft/think/service/ThinkCardsBillsService.java @@ -0,0 +1,42 @@ +package com.gxwebsoft.think.service; + +import com.baomidou.mybatisplus.extension.service.IService; +import com.gxwebsoft.common.core.web.PageResult; +import com.gxwebsoft.think.entity.ThinkCardsBills; +import com.gxwebsoft.think.param.ThinkCardsBillsParam; + +import java.util.List; + +/** + * Vip卡每日账单Service + * + * @author 科技小王子 + * @since 2024-12-25 16:41:01 + */ +public interface ThinkCardsBillsService extends IService { + + /** + * 分页关联查询 + * + * @param param 查询参数 + * @return PageResult + */ + PageResult pageRel(ThinkCardsBillsParam param); + + /** + * 关联查询全部 + * + * @param param 查询参数 + * @return List + */ + List listRel(ThinkCardsBillsParam param); + + /** + * 根据id查询 + * + * @param id + * @return ThinkCardsBills + */ + ThinkCardsBills getByIdRel(Integer id); + +} diff --git a/src/main/java/com/gxwebsoft/think/service/ThinkDepositItemService.java b/src/main/java/com/gxwebsoft/think/service/ThinkDepositItemService.java new file mode 100644 index 0000000..9adad8a --- /dev/null +++ b/src/main/java/com/gxwebsoft/think/service/ThinkDepositItemService.java @@ -0,0 +1,42 @@ +package com.gxwebsoft.think.service; + +import com.baomidou.mybatisplus.extension.service.IService; +import com.gxwebsoft.common.core.web.PageResult; +import com.gxwebsoft.think.entity.ThinkDepositItem; +import com.gxwebsoft.think.param.ThinkDepositItemParam; + +import java.util.List; + +/** + * 押金物品Service + * + * @author 科技小王子 + * @since 2024-12-05 23:17:01 + */ +public interface ThinkDepositItemService extends IService { + + /** + * 分页关联查询 + * + * @param param 查询参数 + * @return PageResult + */ + PageResult pageRel(ThinkDepositItemParam param); + + /** + * 关联查询全部 + * + * @param param 查询参数 + * @return List + */ + List listRel(ThinkDepositItemParam param); + + /** + * 根据id查询 + * + * @param id + * @return ThinkDepositItem + */ + ThinkDepositItem getByIdRel(Integer id); + +} diff --git a/src/main/java/com/gxwebsoft/think/service/ThinkDepositService.java b/src/main/java/com/gxwebsoft/think/service/ThinkDepositService.java index c19f799..e6c2cd4 100644 --- a/src/main/java/com/gxwebsoft/think/service/ThinkDepositService.java +++ b/src/main/java/com/gxwebsoft/think/service/ThinkDepositService.java @@ -4,6 +4,7 @@ import com.baomidou.mybatisplus.extension.service.IService; import com.gxwebsoft.common.core.web.PageResult; import com.gxwebsoft.think.entity.ThinkDeposit; import com.gxwebsoft.think.param.ThinkDepositParam; +import com.wechat.pay.java.service.refund.model.Refund; import java.util.List; @@ -39,4 +40,7 @@ public interface ThinkDepositService extends IService { */ ThinkDeposit getByIdRel(Integer id); + ThinkDeposit getByOrderNo(String orderNo); + + Refund refund(ThinkDeposit thinkDeposit); } diff --git a/src/main/java/com/gxwebsoft/think/service/ThinkGoodsOrderInfoService.java b/src/main/java/com/gxwebsoft/think/service/ThinkGoodsOrderInfoService.java index 93da95a..916bf7e 100644 --- a/src/main/java/com/gxwebsoft/think/service/ThinkGoodsOrderInfoService.java +++ b/src/main/java/com/gxwebsoft/think/service/ThinkGoodsOrderInfoService.java @@ -39,4 +39,5 @@ public interface ThinkGoodsOrderInfoService extends IService listInOrder(Integer oid); } diff --git a/src/main/java/com/gxwebsoft/think/service/ThinkGoodsOrderService.java b/src/main/java/com/gxwebsoft/think/service/ThinkGoodsOrderService.java index 71597fb..5e12625 100644 --- a/src/main/java/com/gxwebsoft/think/service/ThinkGoodsOrderService.java +++ b/src/main/java/com/gxwebsoft/think/service/ThinkGoodsOrderService.java @@ -39,4 +39,5 @@ public interface ThinkGoodsOrderService extends IService { */ ThinkGoodsOrder getByIdRel(Integer id); + ThinkGoodsOrder getByOrderNum(String orderNum); } diff --git a/src/main/java/com/gxwebsoft/think/service/ThinkIntegralService.java b/src/main/java/com/gxwebsoft/think/service/ThinkIntegralService.java index 11bfe51..dec2050 100644 --- a/src/main/java/com/gxwebsoft/think/service/ThinkIntegralService.java +++ b/src/main/java/com/gxwebsoft/think/service/ThinkIntegralService.java @@ -39,4 +39,5 @@ public interface ThinkIntegralService extends IService { */ ThinkIntegral getByIdRel(Integer id); + ThinkIntegral check(Integer uid); } diff --git a/src/main/java/com/gxwebsoft/think/service/ThinkMachineOpenLogService.java b/src/main/java/com/gxwebsoft/think/service/ThinkMachineOpenLogService.java new file mode 100644 index 0000000..5838841 --- /dev/null +++ b/src/main/java/com/gxwebsoft/think/service/ThinkMachineOpenLogService.java @@ -0,0 +1,43 @@ +package com.gxwebsoft.think.service; + +import com.baomidou.mybatisplus.extension.service.IService; +import com.gxwebsoft.common.core.web.PageResult; +import com.gxwebsoft.think.entity.ThinkMachineOpenLog; +import com.gxwebsoft.think.param.ThinkMachineOpenLogParam; + +import java.util.List; + +/** + * 闸机开门记录Service + * + * @author 科技小王子 + * @since 2024-11-28 18:22:35 + */ +public interface ThinkMachineOpenLogService extends IService { + + /** + * 分页关联查询 + * + * @param param 查询参数 + * @return PageResult + */ + PageResult pageRel(ThinkMachineOpenLogParam param); + + /** + * 关联查询全部 + * + * @param param 查询参数 + * @return List + */ + List listRel(ThinkMachineOpenLogParam param); + + /** + * 根据id查询 + * + * @param id + * @return ThinkMachineOpenLog + */ + ThinkMachineOpenLog getByIdRel(Integer id); + + ThinkMachineOpenLog getByOrderId(Integer orderId); +} diff --git a/src/main/java/com/gxwebsoft/think/service/ThinkOrderInfoService.java b/src/main/java/com/gxwebsoft/think/service/ThinkOrderInfoService.java index d73c3f4..95a4bba 100644 --- a/src/main/java/com/gxwebsoft/think/service/ThinkOrderInfoService.java +++ b/src/main/java/com/gxwebsoft/think/service/ThinkOrderInfoService.java @@ -40,4 +40,6 @@ public interface ThinkOrderInfoService extends IService { ThinkOrderInfo getByIdRel(Integer id); List listInOrder(Integer orderId); + + ThinkOrderInfo checkOrder(ThinkOrderInfo thinkOrderInfo); } diff --git a/src/main/java/com/gxwebsoft/think/service/ThinkOrderRefundLogService.java b/src/main/java/com/gxwebsoft/think/service/ThinkOrderRefundLogService.java index 62b3d5a..bc19739 100644 --- a/src/main/java/com/gxwebsoft/think/service/ThinkOrderRefundLogService.java +++ b/src/main/java/com/gxwebsoft/think/service/ThinkOrderRefundLogService.java @@ -39,4 +39,5 @@ public interface ThinkOrderRefundLogService extends IService { */ ThinkOrder getByIdRel(Integer id); + Map getByQrCode(String qrCode); + ThinkOrder getByOrderNum(String orderNum); // HashMap createWxOrder(ThinkOrder order); @@ -48,4 +53,11 @@ public interface ThinkOrderService extends IService { HashMap createWxOrder(BigDecimal totalPrice, String orderNo, String desc, String openid); HashMap createWxOrder(BigDecimal totalPrice, String orderNo, String desc, String openid, String notify); + + Refund refund(ThinkOrderRefundLog orderRefund); + + ThinkOrder getLastOrderByVid(Integer vid); + + ThinkOrder getLastOrderByCardCode(String code); + } diff --git a/src/main/java/com/gxwebsoft/think/service/ThinkUsersVipService.java b/src/main/java/com/gxwebsoft/think/service/ThinkUsersVipService.java index 85faa57..01d19fd 100644 --- a/src/main/java/com/gxwebsoft/think/service/ThinkUsersVipService.java +++ b/src/main/java/com/gxwebsoft/think/service/ThinkUsersVipService.java @@ -40,4 +40,6 @@ public interface ThinkUsersVipService extends IService { ThinkUsersVip getByIdRel(Integer id); ThinkUsersVip getByOrderNo(String orderNo); + + ThinkUsersVip getByVidAndUid(Integer vid, Integer uid); } diff --git a/src/main/java/com/gxwebsoft/think/service/ThinkVipCardsBillsService.java b/src/main/java/com/gxwebsoft/think/service/ThinkVipCardsBillsService.java new file mode 100644 index 0000000..0cd1487 --- /dev/null +++ b/src/main/java/com/gxwebsoft/think/service/ThinkVipCardsBillsService.java @@ -0,0 +1,51 @@ +package com.gxwebsoft.think.service; + +import com.baomidou.mybatisplus.extension.service.IService; +import com.gxwebsoft.common.core.web.PageResult; +import com.gxwebsoft.think.entity.ThinkVipCardsBills; +import com.gxwebsoft.think.param.ThinkVipCardsBillsParam; + +import java.util.List; + +/** + * Vip卡每日账单Service + * + * @author 科技小王子 + * @since 2024-12-25 16:41:01 + */ +public interface ThinkVipCardsBillsService extends IService { + + /** + * 分页关联查询 + * + * @param param 查询参数 + * @return PageResult + */ + PageResult pageRel(ThinkVipCardsBillsParam param); + + /** + * 关联查询全部 + * + * @param param 查询参数 + * @return List + */ + List listRel(ThinkVipCardsBillsParam param); + + /** + * 根据id查询 + * + * @param id + * @return ThinkVipCardsBills + */ + ThinkVipCardsBills getByIdRel(Integer id); + + void clearUid(Integer vid); + + void setUid(Integer vid, Integer uid); + + void setCardUid(Integer cid, Integer uid); + + void addLog(ThinkVipCardsBills thinkVipCardsBills); + + void cancelLog(ThinkVipCardsBills thinkVipCardsBills); +} diff --git a/src/main/java/com/gxwebsoft/think/service/ThinkVipService.java b/src/main/java/com/gxwebsoft/think/service/ThinkVipService.java index ab18241..7f63967 100644 --- a/src/main/java/com/gxwebsoft/think/service/ThinkVipService.java +++ b/src/main/java/com/gxwebsoft/think/service/ThinkVipService.java @@ -40,4 +40,6 @@ public interface ThinkVipService extends IService { ThinkVip getByIdRel(Integer id); List listByGroup(ThinkVipParam param); + + List total(ThinkVipParam param); } diff --git a/src/main/java/com/gxwebsoft/think/service/impl/ThinkCardServiceImpl.java b/src/main/java/com/gxwebsoft/think/service/impl/ThinkCardServiceImpl.java index 5010271..47ec9fd 100644 --- a/src/main/java/com/gxwebsoft/think/service/impl/ThinkCardServiceImpl.java +++ b/src/main/java/com/gxwebsoft/think/service/impl/ThinkCardServiceImpl.java @@ -1,6 +1,5 @@ package com.gxwebsoft.think.service.impl; -import cn.hutool.core.date.DateUtil; import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; import com.gxwebsoft.think.entity.ThinkUsers; @@ -10,8 +9,11 @@ import com.gxwebsoft.think.entity.ThinkCard; import com.gxwebsoft.think.param.ThinkCardParam; import com.gxwebsoft.common.core.web.PageParam; import com.gxwebsoft.common.core.web.PageResult; +import com.gxwebsoft.think.service.ThinkSiteService; import org.springframework.stereotype.Service; +import javax.annotation.Resource; +import java.util.Arrays; import java.util.List; /** @@ -22,12 +24,18 @@ import java.util.List; */ @Service public class ThinkCardServiceImpl extends ServiceImpl implements ThinkCardService { + @Resource + private ThinkSiteService thinkSiteService; @Override public PageResult pageRel(ThinkCardParam param) { PageParam page = new PageParam<>(param); page.setDefaultOrder("id desc, create_time desc"); List list = baseMapper.selectPageRel(page, param); + for (ThinkCard item : list) { + String[] sids = item.getSid().split(","); + item.setSiteList(thinkSiteService.listByIds(Arrays.stream(sids).map(Integer::valueOf).toList())); + } return new PageResult<>(list, page.getTotal()); } @@ -47,6 +55,13 @@ public class ThinkCardServiceImpl extends ServiceImpl userCard(ThinkUsers user) { return list( @@ -55,8 +70,17 @@ public class ThinkCardServiceImpl extends ServiceImpl w.or(w1 -> w1.gt(ThinkCard::getNum, 0)) - .or(w2 -> w2.gt(ThinkCard::getRemainingMoney, 0))) - .last("AND expire_time > UNIX_TIMESTAMP()") + .or(w2 -> w2.gt(ThinkCard::getRemainingMoney, 0)) + .or(w3 -> w3.last(" expire_time > UNIX_TIMESTAMP()")) + ) + ); + } + + @Override + public List listByCodeList(List codeList) { + return list( + new LambdaQueryWrapper() + .in(ThinkCard::getCode, codeList) ); } diff --git a/src/main/java/com/gxwebsoft/think/service/impl/ThinkCardsBillsServiceImpl.java b/src/main/java/com/gxwebsoft/think/service/impl/ThinkCardsBillsServiceImpl.java new file mode 100644 index 0000000..9e2d21c --- /dev/null +++ b/src/main/java/com/gxwebsoft/think/service/impl/ThinkCardsBillsServiceImpl.java @@ -0,0 +1,58 @@ +package com.gxwebsoft.think.service.impl; + +import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; +import com.gxwebsoft.think.mapper.ThinkCardsBillsMapper; +import com.gxwebsoft.think.service.ThinkCardService; +import com.gxwebsoft.think.service.ThinkCardsBillsService; +import com.gxwebsoft.think.entity.ThinkCardsBills; +import com.gxwebsoft.think.param.ThinkCardsBillsParam; +import com.gxwebsoft.common.core.web.PageParam; +import com.gxwebsoft.common.core.web.PageResult; +import com.gxwebsoft.think.service.ThinkUsersService; +import com.gxwebsoft.think.service.ThinkVipService; +import org.springframework.stereotype.Service; + +import javax.annotation.Resource; +import java.util.List; + +/** + * Vip卡每日账单Service实现 + * + * @author 科技小王子 + * @since 2024-12-25 16:41:01 + */ +@Service +public class ThinkCardsBillsServiceImpl extends ServiceImpl implements ThinkCardsBillsService { + @Resource + private ThinkCardService thinkCardService; + @Resource + private ThinkUsersService thinkUsersService; + @Override + public PageResult pageRel(ThinkCardsBillsParam param) { + PageParam page = new PageParam<>(param); + page.setDefaultOrder("create_time desc"); + List list = baseMapper.selectPageRel(page, param); + for (ThinkCardsBills thinkCardsBills : list) { + thinkCardsBills.setVip(thinkCardService.getById(thinkCardsBills.getCid())); + thinkCardsBills.setUser(thinkUsersService.getById(thinkCardsBills.getUid())); + } + return new PageResult<>(list, page.getTotal()); + } + + @Override + public List listRel(ThinkCardsBillsParam param) { + List list = baseMapper.selectListRel(param); + // 排序 + PageParam page = new PageParam<>(); + page.setDefaultOrder("create_time desc"); + return page.sortRecords(list); + } + + @Override + public ThinkCardsBills getByIdRel(Integer id) { + ThinkCardsBillsParam param = new ThinkCardsBillsParam(); + param.setId(id); + return param.getOne(baseMapper.selectListRel(param)); + } + +} diff --git a/src/main/java/com/gxwebsoft/think/service/impl/ThinkDepositItemServiceImpl.java b/src/main/java/com/gxwebsoft/think/service/impl/ThinkDepositItemServiceImpl.java new file mode 100644 index 0000000..14f0a47 --- /dev/null +++ b/src/main/java/com/gxwebsoft/think/service/impl/ThinkDepositItemServiceImpl.java @@ -0,0 +1,47 @@ +package com.gxwebsoft.think.service.impl; + +import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; +import com.gxwebsoft.think.mapper.ThinkDepositItemMapper; +import com.gxwebsoft.think.service.ThinkDepositItemService; +import com.gxwebsoft.think.entity.ThinkDepositItem; +import com.gxwebsoft.think.param.ThinkDepositItemParam; +import com.gxwebsoft.common.core.web.PageParam; +import com.gxwebsoft.common.core.web.PageResult; +import org.springframework.stereotype.Service; + +import java.util.List; + +/** + * 押金物品Service实现 + * + * @author 科技小王子 + * @since 2024-12-05 23:17:01 + */ +@Service +public class ThinkDepositItemServiceImpl extends ServiceImpl implements ThinkDepositItemService { + + @Override + public PageResult pageRel(ThinkDepositItemParam param) { + PageParam page = new PageParam<>(param); + page.setDefaultOrder("create_time desc"); + List list = baseMapper.selectPageRel(page, param); + return new PageResult<>(list, page.getTotal()); + } + + @Override + public List listRel(ThinkDepositItemParam param) { + List list = baseMapper.selectListRel(param); + // 排序 + PageParam page = new PageParam<>(); + page.setDefaultOrder("create_time desc"); + return page.sortRecords(list); + } + + @Override + public ThinkDepositItem getByIdRel(Integer id) { + ThinkDepositItemParam param = new ThinkDepositItemParam(); + param.setId(id); + return param.getOne(baseMapper.selectListRel(param)); + } + +} diff --git a/src/main/java/com/gxwebsoft/think/service/impl/ThinkDepositServiceImpl.java b/src/main/java/com/gxwebsoft/think/service/impl/ThinkDepositServiceImpl.java index fb8b0f3..a29e448 100644 --- a/src/main/java/com/gxwebsoft/think/service/impl/ThinkDepositServiceImpl.java +++ b/src/main/java/com/gxwebsoft/think/service/impl/ThinkDepositServiceImpl.java @@ -1,5 +1,6 @@ package com.gxwebsoft.think.service.impl; +import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; import com.gxwebsoft.think.mapper.ThinkDepositMapper; import com.gxwebsoft.think.service.ThinkDepositService; @@ -7,8 +8,16 @@ import com.gxwebsoft.think.entity.ThinkDeposit; import com.gxwebsoft.think.param.ThinkDepositParam; import com.gxwebsoft.common.core.web.PageParam; import com.gxwebsoft.common.core.web.PageResult; +import com.gxwebsoft.think.service.WechatConfigService; +import com.wechat.pay.java.core.Config; +import com.wechat.pay.java.service.refund.RefundService; +import com.wechat.pay.java.service.refund.model.AmountReq; +import com.wechat.pay.java.service.refund.model.CreateRequest; +import com.wechat.pay.java.service.refund.model.Refund; import org.springframework.stereotype.Service; +import javax.annotation.Resource; +import java.math.BigDecimal; import java.util.List; /** @@ -19,6 +28,8 @@ import java.util.List; */ @Service public class ThinkDepositServiceImpl extends ServiceImpl implements ThinkDepositService { + @Resource + private WechatConfigService wechatConfigService; @Override public PageResult pageRel(ThinkDepositParam param) { @@ -44,4 +55,29 @@ public class ThinkDepositServiceImpl extends ServiceImpl() + .eq(ThinkDeposit::getOrderNum, orderNo) + ); + } + + @Override + public Refund refund(ThinkDeposit thinkDeposit) { + Config wxConfig = wechatConfigService.getConfig(); + RefundService service = new RefundService.Builder().config(wxConfig).build(); + CreateRequest request = new CreateRequest(); + String refundNotifyUrl = "https://gxtyzx-api.websoft.top/api/think/think-deposit/refund-notify"; + // 金额 + AmountReq amount = new AmountReq(); + amount.setTotal(thinkDeposit.getMoney().multiply(BigDecimal.valueOf(100)).longValue()); + amount.setRefund(thinkDeposit.getMoney().multiply(BigDecimal.valueOf(100)).longValue()); + amount.setCurrency("CNY"); + request.setNotifyUrl(refundNotifyUrl); + request.setAmount(amount); + request.setOutTradeNo(thinkDeposit.getOrderNum()); + request.setOutRefundNo("R" + thinkDeposit.getOrderNum()); + return service.create(request); + } } diff --git a/src/main/java/com/gxwebsoft/think/service/impl/ThinkFieldServiceImpl.java b/src/main/java/com/gxwebsoft/think/service/impl/ThinkFieldServiceImpl.java index 0438b46..f569165 100644 --- a/src/main/java/com/gxwebsoft/think/service/impl/ThinkFieldServiceImpl.java +++ b/src/main/java/com/gxwebsoft/think/service/impl/ThinkFieldServiceImpl.java @@ -66,6 +66,7 @@ public class ThinkFieldServiceImpl extends ServiceImpl list = list( new LambdaQueryWrapper() .eq(ThinkField::getSid, param.getSid()) + .orderByDesc(ThinkField::getSort) ); List orderList = new ArrayList<>(); if (!list.isEmpty()) { @@ -94,17 +95,25 @@ public class ThinkFieldServiceImpl extends ServiceImpl tmpFieldPeriodVoList = param.getPeriodVoList(); - if (!orderList.isEmpty()) { - for (ThinkOrder order : orderList) { - if (field.getId().equals(order.getFid())) { - for (FieldPeriodVo fieldPeriodVo : tmpFieldPeriodVoList) { - if (fieldPeriodVo.getTimestamp().equals(order.getStartTime())) { - fieldPeriodVo.setSold(true); + List tmpFieldPeriodVoList = new ArrayList<>(); + for (FieldPeriodVo fieldPeriodVo : ObjectUtil.clone(param.getPeriodVoList())) { + FieldPeriodVo tmpFieldPeriodVo = new FieldPeriodVo(); + tmpFieldPeriodVo.setPeriod(fieldPeriodVo.getPeriod()); + tmpFieldPeriodVo.setTimestamp(fieldPeriodVo.getTimestamp()); + tmpFieldPeriodVo.setSold(false); + tmpFieldPeriodVo.setId(fieldPeriodVo.getId()); + tmpFieldPeriodVoList.add(tmpFieldPeriodVo); + } + if (field.getIsRepeat().equals(2)) { + if (!orderList.isEmpty()) { + for (ThinkOrder order : orderList) { + if (field.getId().equals(order.getFid())) { + for (FieldPeriodVo fieldPeriodVo : tmpFieldPeriodVoList) { + if (fieldPeriodVo.getTimestamp().equals(order.getStartTime())) { + fieldPeriodVo.setSold(true); + } } } } diff --git a/src/main/java/com/gxwebsoft/think/service/impl/ThinkGoodsCategoryServiceImpl.java b/src/main/java/com/gxwebsoft/think/service/impl/ThinkGoodsCategoryServiceImpl.java index f7e7ef4..ae1fee6 100644 --- a/src/main/java/com/gxwebsoft/think/service/impl/ThinkGoodsCategoryServiceImpl.java +++ b/src/main/java/com/gxwebsoft/think/service/impl/ThinkGoodsCategoryServiceImpl.java @@ -2,13 +2,16 @@ package com.gxwebsoft.think.service.impl; import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; import com.gxwebsoft.think.mapper.ThinkGoodsCategoryMapper; +import com.gxwebsoft.think.param.ThinkGoodsParam; import com.gxwebsoft.think.service.ThinkGoodsCategoryService; import com.gxwebsoft.think.entity.ThinkGoodsCategory; import com.gxwebsoft.think.param.ThinkGoodsCategoryParam; import com.gxwebsoft.common.core.web.PageParam; import com.gxwebsoft.common.core.web.PageResult; +import com.gxwebsoft.think.service.ThinkGoodsService; import org.springframework.stereotype.Service; +import javax.annotation.Resource; import java.util.List; /** @@ -20,6 +23,9 @@ import java.util.List; @Service public class ThinkGoodsCategoryServiceImpl extends ServiceImpl implements ThinkGoodsCategoryService { + @Resource + private ThinkGoodsService thinkGoodsService; + @Override public PageResult pageRel(ThinkGoodsCategoryParam param) { PageParam page = new PageParam<>(param); @@ -34,6 +40,12 @@ public class ThinkGoodsCategoryServiceImpl extends ServiceImpl page = new PageParam<>(); page.setDefaultOrder("create_time desc"); + for (ThinkGoodsCategory thinkGoodsCategory : list) { + thinkGoodsCategory.setGoodsList(thinkGoodsService.listRel(new ThinkGoodsParam() {{ + setCid(thinkGoodsCategory.getId()); + setStatus(1); + }})); + } return page.sortRecords(list); } diff --git a/src/main/java/com/gxwebsoft/think/service/impl/ThinkGoodsOrderInfoServiceImpl.java b/src/main/java/com/gxwebsoft/think/service/impl/ThinkGoodsOrderInfoServiceImpl.java index d901bee..fe197f1 100644 --- a/src/main/java/com/gxwebsoft/think/service/impl/ThinkGoodsOrderInfoServiceImpl.java +++ b/src/main/java/com/gxwebsoft/think/service/impl/ThinkGoodsOrderInfoServiceImpl.java @@ -1,5 +1,6 @@ package com.gxwebsoft.think.service.impl; +import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; import com.gxwebsoft.think.mapper.ThinkGoodsOrderInfoMapper; import com.gxwebsoft.think.service.ThinkGoodsOrderInfoService; @@ -44,4 +45,12 @@ public class ThinkGoodsOrderInfoServiceImpl extends ServiceImpl listInOrder(Integer oid) { + return list( + new LambdaQueryWrapper() + .eq(ThinkGoodsOrderInfo::getOid, oid) + ); + } + } diff --git a/src/main/java/com/gxwebsoft/think/service/impl/ThinkGoodsOrderServiceImpl.java b/src/main/java/com/gxwebsoft/think/service/impl/ThinkGoodsOrderServiceImpl.java index 002ddf1..dc921bb 100644 --- a/src/main/java/com/gxwebsoft/think/service/impl/ThinkGoodsOrderServiceImpl.java +++ b/src/main/java/com/gxwebsoft/think/service/impl/ThinkGoodsOrderServiceImpl.java @@ -2,6 +2,7 @@ package com.gxwebsoft.think.service.impl; import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; import com.gxwebsoft.think.mapper.ThinkGoodsOrderMapper; +import com.gxwebsoft.think.service.ThinkGoodsOrderInfoService; import com.gxwebsoft.think.service.ThinkGoodsOrderService; import com.gxwebsoft.think.entity.ThinkGoodsOrder; import com.gxwebsoft.think.param.ThinkGoodsOrderParam; @@ -9,6 +10,7 @@ import com.gxwebsoft.common.core.web.PageParam; import com.gxwebsoft.common.core.web.PageResult; import org.springframework.stereotype.Service; +import javax.annotation.Resource; import java.util.List; /** @@ -19,12 +21,16 @@ import java.util.List; */ @Service public class ThinkGoodsOrderServiceImpl extends ServiceImpl implements ThinkGoodsOrderService { - + @Resource + private ThinkGoodsOrderInfoService thinkGoodsOrderInfoService; @Override public PageResult pageRel(ThinkGoodsOrderParam param) { PageParam page = new PageParam<>(param); page.setDefaultOrder("create_time desc"); List list = baseMapper.selectPageRel(page, param); + for (ThinkGoodsOrder thinkGoodsOrder : list) { + thinkGoodsOrder.setInfoList(thinkGoodsOrderInfoService.listInOrder(thinkGoodsOrder.getId())); + } return new PageResult<>(list, page.getTotal()); } @@ -44,4 +50,11 @@ public class ThinkGoodsOrderServiceImpl extends ServiceImpl implements ThinkGoodsService { + @Resource + private ThinkGoodsCategoryService thinkGoodsCategoryService; @Override public PageResult pageRel(ThinkGoodsParam param) { PageParam page = new PageParam<>(param); page.setDefaultOrder("create_time desc"); List list = baseMapper.selectPageRel(page, param); + for (ThinkGoods thinkGoods : list) { + thinkGoods.setCategory(thinkGoodsCategoryService.getById(thinkGoods.getCid())); + } return new PageResult<>(list, page.getTotal()); } diff --git a/src/main/java/com/gxwebsoft/think/service/impl/ThinkIntegralServiceImpl.java b/src/main/java/com/gxwebsoft/think/service/impl/ThinkIntegralServiceImpl.java index 99df21d..59eb385 100644 --- a/src/main/java/com/gxwebsoft/think/service/impl/ThinkIntegralServiceImpl.java +++ b/src/main/java/com/gxwebsoft/think/service/impl/ThinkIntegralServiceImpl.java @@ -1,5 +1,7 @@ package com.gxwebsoft.think.service.impl; +import cn.hutool.core.date.DateUtil; +import com.baomidou.mybatisplus.core.conditions.update.LambdaUpdateWrapper; import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; import com.gxwebsoft.think.mapper.ThinkIntegralMapper; import com.gxwebsoft.think.service.ThinkIntegralService; @@ -44,4 +46,12 @@ public class ThinkIntegralServiceImpl extends ServiceImpl() + .eq(ThinkIntegral::getId, uid) + .eq(ThinkIntegral::getDateTime, DateUtil.today())); + } + } diff --git a/src/main/java/com/gxwebsoft/think/service/impl/ThinkMachineOpenLogServiceImpl.java b/src/main/java/com/gxwebsoft/think/service/impl/ThinkMachineOpenLogServiceImpl.java new file mode 100644 index 0000000..d8ffdae --- /dev/null +++ b/src/main/java/com/gxwebsoft/think/service/impl/ThinkMachineOpenLogServiceImpl.java @@ -0,0 +1,54 @@ +package com.gxwebsoft.think.service.impl; + +import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; +import com.gxwebsoft.think.mapper.ThinkMachineOpenLogMapper; +import com.gxwebsoft.think.service.ThinkMachineOpenLogService; +import com.gxwebsoft.think.entity.ThinkMachineOpenLog; +import com.gxwebsoft.think.param.ThinkMachineOpenLogParam; +import com.gxwebsoft.common.core.web.PageParam; +import com.gxwebsoft.common.core.web.PageResult; +import org.springframework.stereotype.Service; + +import java.util.List; + +/** + * 闸机开门记录Service实现 + * + * @author 科技小王子 + * @since 2024-11-28 18:22:35 + */ +@Service +public class ThinkMachineOpenLogServiceImpl extends ServiceImpl implements ThinkMachineOpenLogService { + + @Override + public PageResult pageRel(ThinkMachineOpenLogParam param) { + PageParam page = new PageParam<>(param); + page.setDefaultOrder("create_time desc"); + List list = baseMapper.selectPageRel(page, param); + return new PageResult<>(list, page.getTotal()); + } + + @Override + public List listRel(ThinkMachineOpenLogParam param) { + List list = baseMapper.selectListRel(param); + // 排序 + PageParam page = new PageParam<>(); + page.setDefaultOrder("create_time desc"); + return page.sortRecords(list); + } + + @Override + public ThinkMachineOpenLog getByIdRel(Integer id) { + ThinkMachineOpenLogParam param = new ThinkMachineOpenLogParam(); + param.setId(id); + return param.getOne(baseMapper.selectListRel(param)); + } + + @Override + public ThinkMachineOpenLog getByOrderId(Integer orderId) { + ThinkMachineOpenLogParam param = new ThinkMachineOpenLogParam(); + param.setOrderId(orderId); + return param.getOne(baseMapper.selectListRel(param)); + } + +} diff --git a/src/main/java/com/gxwebsoft/think/service/impl/ThinkOrderInfoServiceImpl.java b/src/main/java/com/gxwebsoft/think/service/impl/ThinkOrderInfoServiceImpl.java index a223916..290d9c3 100644 --- a/src/main/java/com/gxwebsoft/think/service/impl/ThinkOrderInfoServiceImpl.java +++ b/src/main/java/com/gxwebsoft/think/service/impl/ThinkOrderInfoServiceImpl.java @@ -53,4 +53,15 @@ public class ThinkOrderInfoServiceImpl extends ServiceImpl() + .eq(ThinkOrderInfo::getSid, thinkOrderInfo.getSid()) + .eq(ThinkOrderInfo::getFid, thinkOrderInfo.getFid()) + .eq(ThinkOrderInfo::getStartTime, thinkOrderInfo.getStartTime()) + .eq(ThinkOrderInfo::getPayStatus, 1) + .last("limit 1") + ); + } } diff --git a/src/main/java/com/gxwebsoft/think/service/impl/ThinkOrderRefundLogServiceImpl.java b/src/main/java/com/gxwebsoft/think/service/impl/ThinkOrderRefundLogServiceImpl.java index a95b2b3..e02ec36 100644 --- a/src/main/java/com/gxwebsoft/think/service/impl/ThinkOrderRefundLogServiceImpl.java +++ b/src/main/java/com/gxwebsoft/think/service/impl/ThinkOrderRefundLogServiceImpl.java @@ -1,5 +1,6 @@ package com.gxwebsoft.think.service.impl; +import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; import com.gxwebsoft.think.mapper.ThinkOrderRefundLogMapper; import com.gxwebsoft.think.service.ThinkOrderRefundLogService; @@ -44,4 +45,13 @@ public class ThinkOrderRefundLogServiceImpl extends ServiceImpl() + .eq(ThinkOrderRefundLog::getRefundNo, refundNo) + .last("limit 1") + ); + } + } diff --git a/src/main/java/com/gxwebsoft/think/service/impl/ThinkOrderServiceImpl.java b/src/main/java/com/gxwebsoft/think/service/impl/ThinkOrderServiceImpl.java index 1b371fb..a9d3162 100644 --- a/src/main/java/com/gxwebsoft/think/service/impl/ThinkOrderServiceImpl.java +++ b/src/main/java/com/gxwebsoft/think/service/impl/ThinkOrderServiceImpl.java @@ -1,31 +1,39 @@ package com.gxwebsoft.think.service.impl; import cn.hutool.core.util.ObjectUtil; +import cn.hutool.crypto.SecureUtil; +import cn.hutool.crypto.symmetric.SymmetricAlgorithm; +import cn.hutool.crypto.symmetric.SymmetricCrypto; import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; import com.gxwebsoft.common.core.config.ConfigProperties; import com.gxwebsoft.common.core.utils.RedisUtil; import com.gxwebsoft.think.entity.ThinkOrderInfo; +import com.gxwebsoft.think.entity.ThinkOrderRefundLog; import com.gxwebsoft.think.mapper.ThinkOrderMapper; -import com.gxwebsoft.think.service.ThinkOrderInfoService; -import com.gxwebsoft.think.service.ThinkOrderService; +import com.gxwebsoft.think.service.*; import com.gxwebsoft.think.entity.ThinkOrder; import com.gxwebsoft.think.param.ThinkOrderParam; import com.gxwebsoft.common.core.web.PageParam; import com.gxwebsoft.common.core.web.PageResult; -import com.gxwebsoft.think.service.WechatConfigService; import com.wechat.pay.java.core.Config; import com.wechat.pay.java.service.payments.jsapi.JsapiServiceExtension; import com.wechat.pay.java.service.payments.jsapi.model.Amount; import com.wechat.pay.java.service.payments.jsapi.model.Payer; import com.wechat.pay.java.service.payments.jsapi.model.PrepayRequest; import com.wechat.pay.java.service.payments.jsapi.model.PrepayWithRequestPaymentResponse; +import com.wechat.pay.java.service.refund.RefundService; +import com.wechat.pay.java.service.refund.model.AmountReq; +import com.wechat.pay.java.service.refund.model.CreateRequest; +import com.wechat.pay.java.service.refund.model.Refund; import org.springframework.stereotype.Service; import javax.annotation.Resource; import java.math.BigDecimal; +import java.util.Base64; import java.util.HashMap; import java.util.List; +import java.util.Map; /** * Service实现 @@ -43,6 +51,10 @@ public class ThinkOrderServiceImpl extends ServiceImpl list = baseMapper.selectPageRel(page, param); list.forEach(d -> { d.setThinkOrderInfos(thinkOrderInfoService.list(new LambdaQueryWrapper().eq(ThinkOrderInfo::getOid, d.getId()))); + if (d.getCid() != null && !d.getCid().equals(0)) { + d.setCard(thinkCardService.getById(d.getCid())); + } + if (d.getVid() != null && !d.getVid().equals(0)) { + d.setThinkVip(thinkUsersVipService.getById(d.getVid())); + } + }); return new PageResult<>(list, page.getTotal()); } @@ -66,6 +85,15 @@ public class ThinkOrderServiceImpl extends ServiceImpl listRel(ThinkOrderParam param) { List list = baseMapper.selectListRel(param); + list.forEach(d -> { + d.setThinkOrderInfos(thinkOrderInfoService.list(new LambdaQueryWrapper().eq(ThinkOrderInfo::getOid, d.getId()))); + if (d.getCid() != null && !d.getCid().equals(0)) { + d.setCard(thinkCardService.getById(d.getCid())); + } + if (d.getVid() != null && !d.getVid().equals(0)) { + d.setThinkVip(thinkUsersVipService.getById(d.getVid())); + } + }); // 排序 PageParam page = new PageParam<>(); page.setDefaultOrder("create_time desc"); @@ -83,6 +111,63 @@ public class ThinkOrderServiceImpl extends ServiceImpl getByQrCode(String qrCode) { + String secretKey = redisUtil.get("secretKey_10150"); + byte[] key = null; + if (secretKey == null) { + key = SecureUtil.generateKey(SymmetricAlgorithm.AES.getValue()).getEncoded(); + redisUtil.set("secretKey_10150", Base64.getEncoder().encodeToString(key)); + } else { + key = Base64.getDecoder().decode(secretKey); + } + SymmetricCrypto aes = new SymmetricCrypto(SymmetricAlgorithm.AES, key); + try { + String data = aes.decryptStr(qrCode); + String[] idArr = data.split("_"); +// if ((int) (System.currentTimeMillis() / 1000) > Long.parseLong(idArr[1]) + 120) { +// return new HashMap<>() {{ +// put("res", false); +// put("msg", "核销码已过期"); +// }}; +// } + ThinkOrderParam param = new ThinkOrderParam(); + param.setId(Integer.valueOf(idArr[0])); + final ThinkOrder thinkOrder = param.getOne(baseMapper.selectListRel(param)); + if (thinkOrder == null) { + return new HashMap<>() {{ + put("res", false); + put("msg", "订单不存在"); + }}; + } + if (!thinkOrder.getPayStatus().equals(1)) { + return new HashMap<>() {{ + put("res", false); + put("msg", "该订单未支付"); + }}; + } + if (thinkOrder.getOrderStatus().equals(1)) { + return new HashMap<>() {{ + put("res", false); + put("msg", "该订单已核销"); + }}; + } + if (ObjectUtil.isNotEmpty(thinkOrder)) { + thinkOrder.setThinkOrderInfos(thinkOrderInfoService.list(new LambdaQueryWrapper().eq(ThinkOrderInfo::getOid, thinkOrder.getId()))); + } + return new HashMap<>() {{ + put("res", true); + put("data", thinkOrder); + }}; + } catch (Exception e) { + System.out.println(e.getMessage()); + return new HashMap<>() {{ + put("res", false); + put("msg", "核销码错误"); + }}; + } + } + @Override public ThinkOrder getByOrderNum(String orderNum) { ThinkOrderParam param = new ThinkOrderParam(); @@ -141,7 +226,7 @@ public class ThinkOrderServiceImpl extends ServiceImpl() + .eq(ThinkOrder::getVid, vid) + .eq(ThinkOrder::getPayStatus, 1) + .orderByDesc(ThinkOrder::getCreateTime) + .last("limit 1") + ); + } + + @Override + public ThinkOrder getLastOrderByCardCode(String code) { + return getOne( + new LambdaQueryWrapper() + .eq(ThinkOrder::getCode, code) + .eq(ThinkOrder::getPayStatus, 1) + .orderByDesc(ThinkOrder::getCreateTime) + .last("limit 1") + ); + } + } diff --git a/src/main/java/com/gxwebsoft/think/service/impl/ThinkUsersVipServiceImpl.java b/src/main/java/com/gxwebsoft/think/service/impl/ThinkUsersVipServiceImpl.java index 993ad70..0ce2f0e 100644 --- a/src/main/java/com/gxwebsoft/think/service/impl/ThinkUsersVipServiceImpl.java +++ b/src/main/java/com/gxwebsoft/think/service/impl/ThinkUsersVipServiceImpl.java @@ -76,4 +76,14 @@ public class ThinkUsersVipServiceImpl extends ServiceImpl() + .eq(ThinkUsersVip::getVid, vid) + .eq(ThinkUsersVip::getUid, uid) + .orderByDesc(ThinkUsersVip::getExpireTime) + .last("limit 1") + ); + } } diff --git a/src/main/java/com/gxwebsoft/think/service/impl/ThinkVipCardsBillsServiceImpl.java b/src/main/java/com/gxwebsoft/think/service/impl/ThinkVipCardsBillsServiceImpl.java new file mode 100644 index 0000000..f34672a --- /dev/null +++ b/src/main/java/com/gxwebsoft/think/service/impl/ThinkVipCardsBillsServiceImpl.java @@ -0,0 +1,117 @@ +package com.gxwebsoft.think.service.impl; + +import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; +import com.baomidou.mybatisplus.core.conditions.update.LambdaUpdateWrapper; +import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; +import com.gxwebsoft.think.mapper.ThinkVipCardsBillsMapper; +import com.gxwebsoft.think.service.ThinkCardService; +import com.gxwebsoft.think.service.ThinkUsersService; +import com.gxwebsoft.think.service.ThinkUsersVipService; +import com.gxwebsoft.think.service.ThinkVipCardsBillsService; +import com.gxwebsoft.think.entity.ThinkVipCardsBills; +import com.gxwebsoft.think.param.ThinkVipCardsBillsParam; +import com.gxwebsoft.common.core.web.PageParam; +import com.gxwebsoft.common.core.web.PageResult; +import org.springframework.stereotype.Service; + +import javax.annotation.Resource; +import java.util.List; + +/** + * Vip卡每日账单Service实现 + * + * @author 科技小王子 + * @since 2024-12-25 16:41:01 + */ +@Service +public class ThinkVipCardsBillsServiceImpl extends ServiceImpl implements ThinkVipCardsBillsService { + @Resource + private ThinkUsersVipService thinkUsersVipService; + @Resource + private ThinkUsersService thinkUsersService; + @Resource + private ThinkCardService thinkCardService; + + @Override + public PageResult pageRel(ThinkVipCardsBillsParam param) { + PageParam page = new PageParam<>(param); + page.setDefaultOrder("create_time desc"); + List list = baseMapper.selectPageRel(page, param); + for (ThinkVipCardsBills thinkVipCardsBills : list) { + if (thinkVipCardsBills.getVid() != null) + thinkVipCardsBills.setVip(thinkUsersVipService.getById(thinkVipCardsBills.getVid())); + if (thinkVipCardsBills.getCid() != null) + thinkVipCardsBills.setCard(thinkCardService.getById(thinkVipCardsBills.getCid())); + if (thinkVipCardsBills.getUid() != null && !thinkVipCardsBills.getUid().equals(0)) + thinkVipCardsBills.setUser(thinkUsersService.getById(thinkVipCardsBills.getUid())); + } + return new PageResult<>(list, page.getTotal()); + } + + @Override + public List listRel(ThinkVipCardsBillsParam param) { + List list = baseMapper.selectListRel(param); + // 排序 + PageParam page = new PageParam<>(); + page.setDefaultOrder("create_time desc"); + return page.sortRecords(list); + } + + @Override + public ThinkVipCardsBills getByIdRel(Integer id) { + ThinkVipCardsBillsParam param = new ThinkVipCardsBillsParam(); + param.setId(id); + return param.getOne(baseMapper.selectListRel(param)); + } + + @Override + public void clearUid(Integer vid) { + setUid(vid, 0); + } + + @Override + public void setUid(Integer vid, Integer uid) { + update( + new LambdaUpdateWrapper() + .eq(ThinkVipCardsBills::getVid, vid) + .set(ThinkVipCardsBills::getUid, uid) + ); + } + + @Override + public void setCardUid(Integer cid, Integer uid) { + update( + new LambdaUpdateWrapper() + .eq(ThinkVipCardsBills::getCid, cid) + .set(ThinkVipCardsBills::getUid, uid) + ); + } + + @Override + public void addLog(ThinkVipCardsBills thinkVipCardsBills) { + LambdaQueryWrapper wrapper = new LambdaQueryWrapper() + .eq(ThinkVipCardsBills::getUid, thinkVipCardsBills.getUid()) + .eq(ThinkVipCardsBills::getDate, thinkVipCardsBills.getDate()); + if (thinkVipCardsBills.getCid() != null) wrapper.eq(ThinkVipCardsBills::getCid, thinkVipCardsBills.getCid()); + if (thinkVipCardsBills.getVid() != null) wrapper.eq(ThinkVipCardsBills::getVid, thinkVipCardsBills.getVid()); + ThinkVipCardsBills check = getOne(wrapper); + if (check == null) save(thinkVipCardsBills); + else { + check.setUsed(1); + updateById(check); + } + } + + @Override + public void cancelLog(ThinkVipCardsBills thinkVipCardsBills) { + LambdaQueryWrapper wrapper = new LambdaQueryWrapper() + .eq(ThinkVipCardsBills::getUid, thinkVipCardsBills.getUid()) + .eq(ThinkVipCardsBills::getDate, thinkVipCardsBills.getDate()); + if (thinkVipCardsBills.getCid() != null) wrapper.eq(ThinkVipCardsBills::getCid, thinkVipCardsBills.getCid()); + if (thinkVipCardsBills.getVid() != null) wrapper.eq(ThinkVipCardsBills::getVid, thinkVipCardsBills.getVid()); + ThinkVipCardsBills check = getOne(wrapper); + thinkVipCardsBills.setUsed(0); + if (check != null) save(thinkVipCardsBills); + } + +} diff --git a/src/main/java/com/gxwebsoft/think/service/impl/ThinkVipServiceImpl.java b/src/main/java/com/gxwebsoft/think/service/impl/ThinkVipServiceImpl.java index c6a95e6..50fcdb2 100644 --- a/src/main/java/com/gxwebsoft/think/service/impl/ThinkVipServiceImpl.java +++ b/src/main/java/com/gxwebsoft/think/service/impl/ThinkVipServiceImpl.java @@ -5,15 +5,18 @@ import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; import com.gxwebsoft.common.core.web.PageParam; import com.gxwebsoft.common.core.web.PageResult; import com.gxwebsoft.think.entity.ThinkSite; +import com.gxwebsoft.think.entity.ThinkUsersVip; import com.gxwebsoft.think.entity.ThinkVip; import com.gxwebsoft.think.mapper.ThinkVipMapper; import com.gxwebsoft.think.param.ThinkVipParam; import com.gxwebsoft.think.service.ThinkSiteService; +import com.gxwebsoft.think.service.ThinkUsersVipService; import com.gxwebsoft.think.service.ThinkVipService; import org.springframework.stereotype.Service; import org.springframework.util.CollectionUtils; import javax.annotation.Resource; +import java.math.BigDecimal; import java.util.ArrayList; import java.util.List; import java.util.Map; @@ -29,6 +32,8 @@ import java.util.stream.Collectors; public class ThinkVipServiceImpl extends ServiceImpl implements ThinkVipService { @Resource private ThinkSiteService thinkSiteService; + @Resource + private ThinkUsersVipService thinkUsersVipService; @Override public PageResult pageRel(ThinkVipParam param) { @@ -102,4 +107,35 @@ public class ThinkVipServiceImpl extends ServiceImpl i return list; } + @Override + public List total(ThinkVipParam param){ + List list = list(); + LambdaQueryWrapper wrapper = new LambdaQueryWrapper<>(); + wrapper.eq(ThinkUsersVip::getStatus, 1); + if (param.getCreateTimeStart() != null) { + wrapper.ge(ThinkUsersVip::getCreateTime, param.getCreateTimeStart()); + wrapper.le(ThinkUsersVip::getCreateTime, param.getCreateTimeEnd()); + } + List usersVips = thinkUsersVipService.list(wrapper); + for (ThinkVip thinkVip : list) { + thinkVip.setPosAmount(BigDecimal.ZERO); + thinkVip.setPosActual(BigDecimal.ZERO); + thinkVip.setPosRefund(BigDecimal.ZERO); + thinkVip.setCashAmount(BigDecimal.ZERO); + thinkVip.setCashActual(BigDecimal.ZERO); + thinkVip.setCashRefund(BigDecimal.ZERO); + thinkVip.setWechatActual(BigDecimal.ZERO); + thinkVip.setWechatAmount(BigDecimal.ZERO); + thinkVip.setWechatRefund(BigDecimal.ZERO); + thinkVip.setTotalNum(0); + for (ThinkUsersVip usersVip : usersVips) { + if (thinkVip.getId().equals(usersVip.getVid())) { + thinkVip.setTotalNum(thinkVip.getTotalNum() + 1); + thinkVip.setWechatAmount(thinkVip.getPrice().add(thinkVip.getWechatAmount())); + thinkVip.setWechatActual(thinkVip.getPrice().add(thinkVip.getWechatActual())); + } + } + } + return list; + } } diff --git a/src/main/java/com/gxwebsoft/think/service/impl/WechatConfigServiceImpl.java b/src/main/java/com/gxwebsoft/think/service/impl/WechatConfigServiceImpl.java index 3709e23..8b66ce0 100644 --- a/src/main/java/com/gxwebsoft/think/service/impl/WechatConfigServiceImpl.java +++ b/src/main/java/com/gxwebsoft/think/service/impl/WechatConfigServiceImpl.java @@ -12,7 +12,7 @@ import java.lang.annotation.Annotation; @Service public class WechatConfigServiceImpl implements WechatConfigService { private RSAAutoCertificateConfig config; - public static String privateKeyPath = "/www/jar/gxtyzx-java/file/93dc8f750fee4eeaa5fb0a768982d639.pem"; + public static String privateKeyPath = "/www/wwwroot/gxtyzx-api/file/93dc8f750fee4eeaa5fb0a768982d639.pem"; @Override public NotificationConfig getNotificationConfig() { diff --git a/src/main/resources/application-dev-local.yml b/src/main/resources/application-dev-local.yml new file mode 100644 index 0000000..3449c48 --- /dev/null +++ b/src/main/resources/application-dev-local.yml @@ -0,0 +1,25 @@ +# 开发环境配置 + +# 数据源配置 +spring: + datasource: + url: jdbc:mysql://47.119.165.234:3308/gxtyzx?useUnicode=true&characterEncoding=utf8&useSSL=false&serverTimezone=GMT%2B8 + username: gxtyzx + password: SLRGhfDcLtjMHcet + driver-class-name: com.mysql.cj.jdbc.Driver + type: com.alibaba.druid.pool.DruidDataSource + +# 日志配置 +logging: + level: + com.gxwebsoft: DEBUG + com.baomidou.mybatisplus: DEBUG + +socketio: + host: localhost #IP地址 + +# 框架配置 +config: + # 开发环境接口 + server-url: http://127.0.0.1:9099/api + upload-path: /Users/liangxin/Project/JAVA/gxtyzx-java/file/ diff --git a/src/main/resources/application-dev.yml b/src/main/resources/application-dev.yml index 789d8ff..ee228a8 100644 --- a/src/main/resources/application-dev.yml +++ b/src/main/resources/application-dev.yml @@ -3,9 +3,9 @@ # 数据源配置 spring: datasource: - url: jdbc:mysql://47.119.165.234:3308/gxtyzx?useUnicode=true&characterEncoding=utf8&useSSL=false&serverTimezone=GMT%2B8 - username: gxtyzx - password: SLRGhfDcLtjMHcet + url: jdbc:mysql://47.121.133.163:3308/gxtyzx_ws?useUnicode=true&characterEncoding=utf8&useSSL=false&serverTimezone=GMT%2B8 + username: gxtyzx_ws + password: 2jPKyRhw5eTLHhJJ driver-class-name: com.mysql.cj.jdbc.Driver type: com.alibaba.druid.pool.DruidDataSource @@ -22,4 +22,4 @@ socketio: config: # 开发环境接口 server-url: http://127.0.0.1:9091/api - upload-path: /Users/gxwebsoft/Documents/uploads/ # window(D:\Temp) + upload-path: /www/jar/gxtyzx-java/file/ diff --git a/src/main/resources/application.yml b/src/main/resources/application.yml index 3230187..3d9818f 100644 --- a/src/main/resources/application.yml +++ b/src/main/resources/application.yml @@ -7,7 +7,8 @@ socketio: # 多环境配置 spring: profiles: - active: dev +# active: dev + active: dev-local # active: prod application: diff --git a/src/test/java/com/gxwebsoft/generator/ThinkGenerator.java b/src/test/java/com/gxwebsoft/generator/ThinkGenerator.java index 70eae05..96a6025 100644 --- a/src/test/java/com/gxwebsoft/generator/ThinkGenerator.java +++ b/src/test/java/com/gxwebsoft/generator/ThinkGenerator.java @@ -27,8 +27,8 @@ public class ThinkGenerator { // 输出目录 private static final String OUTPUT_DIR = "/src/main/java"; // Vue文件输出位置 - private static final String OUTPUT_LOCATION_VUE = "/Users/gxwebsoft/VUE/gxtyzx-admin-vue"; - private static final String OUTPUT_LOCATION_UNIAPP = "/Users/gxwebsoft/VUE/gxtyzx-uniapp-cli"; + private static final String OUTPUT_LOCATION_VUE = "/Users/liangxin/Project/Html/web/gxtyzx-admin-vue"; + private static final String OUTPUT_LOCATION_UNIAPP = "/Users/liangxin/Project/Html/miniProgram/gxtyzx-uniapp-cli"; // Vue文件输出目录 private static final String OUTPUT_DIR_VUE = "/src"; // 作者名称 @@ -117,7 +117,8 @@ public class ThinkGenerator { // "think_users_vip_cancle_log", // "think_wechat_bill", // "think_wechat_bill_log", -// "think_wechat_deposit" + "think_cards_bills", + "think_vip_cards_bills", }; // 需要去除的表前缀 private static final String[] TABLE_PREFIX = new String[]{ diff --git a/websoft-modules.log b/websoft-modules.log new file mode 100644 index 0000000..05c3ad5 --- /dev/null +++ b/websoft-modules.log @@ -0,0 +1,43 @@ +2024-10-12 13:09:52.764 WARN 87797 --- [restartedMain] com.alibaba.druid.pool.DruidDataSource : removeAbandoned is true, not use in production. +2024-10-12 13:10:18.728 WARN 87797 --- [restartedMain] ConfigServletWebServerApplicationContext : Exception encountered during context initialization - cancelling refresh attempt: org.springframework.beans.factory.BeanDefinitionStoreException: Failed to parse configuration class [com.gxwebsoft.WebSoftApplication]; nested exception is java.io.FileNotFoundException: class path resource [com/gxwebsoft/WebSoftApplication.class] cannot be opened because it does not exist +2024-10-12 13:10:18.737 ERROR 87797 --- [restartedMain] o.s.boot.SpringApplication : Application run failed + +org.springframework.beans.factory.BeanDefinitionStoreException: Failed to parse configuration class [com.gxwebsoft.WebSoftApplication]; nested exception is java.io.FileNotFoundException: class path resource [com/gxwebsoft/WebSoftApplication.class] cannot be opened because it does not exist + at org.springframework.context.annotation.ConfigurationClassParser.parse(ConfigurationClassParser.java:189) ~[spring-context-5.3.9.jar:5.3.9] + at org.springframework.context.annotation.ConfigurationClassPostProcessor.processConfigBeanDefinitions(ConfigurationClassPostProcessor.java:331) ~[spring-context-5.3.9.jar:5.3.9] + at org.springframework.context.annotation.ConfigurationClassPostProcessor.postProcessBeanDefinitionRegistry(ConfigurationClassPostProcessor.java:247) ~[spring-context-5.3.9.jar:5.3.9] + at org.springframework.context.support.PostProcessorRegistrationDelegate.invokeBeanDefinitionRegistryPostProcessors(PostProcessorRegistrationDelegate.java:311) ~[spring-context-5.3.9.jar:5.3.9] + at org.springframework.context.support.PostProcessorRegistrationDelegate.invokeBeanFactoryPostProcessors(PostProcessorRegistrationDelegate.java:112) ~[spring-context-5.3.9.jar:5.3.9] + at org.springframework.context.support.AbstractApplicationContext.invokeBeanFactoryPostProcessors(AbstractApplicationContext.java:746) ~[spring-context-5.3.9.jar:5.3.9] + at org.springframework.context.support.AbstractApplicationContext.refresh(AbstractApplicationContext.java:564) ~[spring-context-5.3.9.jar:5.3.9] + at org.springframework.boot.web.servlet.context.ServletWebServerApplicationContext.refresh(ServletWebServerApplicationContext.java:145) ~[spring-boot-2.5.4.jar:2.5.4] + at org.springframework.boot.SpringApplication.refresh(SpringApplication.java:754) ~[spring-boot-2.5.4.jar:2.5.4] + at org.springframework.boot.SpringApplication.refreshContext(SpringApplication.java:434) ~[spring-boot-2.5.4.jar:2.5.4] + at org.springframework.boot.SpringApplication.run(SpringApplication.java:338) ~[spring-boot-2.5.4.jar:2.5.4] + at org.springframework.boot.SpringApplication.run(SpringApplication.java:1343) ~[spring-boot-2.5.4.jar:2.5.4] + at org.springframework.boot.SpringApplication.run(SpringApplication.java:1332) ~[spring-boot-2.5.4.jar:2.5.4] + at com.gxwebsoft.WebSoftApplication.main(WebSoftApplication.java:25) ~[classes/:na] + at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke0(Native Method) ~[na:na] + at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:77) ~[na:na] + at java.base/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) ~[na:na] + at java.base/java.lang.reflect.Method.invoke(Method.java:568) ~[na:na] + at org.springframework.boot.devtools.restart.RestartLauncher.run(RestartLauncher.java:49) ~[spring-boot-devtools-2.5.4.jar:2.5.4] +Caused by: java.io.FileNotFoundException: class path resource [com/gxwebsoft/WebSoftApplication.class] cannot be opened because it does not exist + at org.springframework.core.io.ClassPathResource.getInputStream(ClassPathResource.java:187) ~[spring-core-5.3.9.jar:5.3.9] + at org.springframework.core.type.classreading.SimpleMetadataReader.getClassReader(SimpleMetadataReader.java:55) ~[spring-core-5.3.9.jar:5.3.9] + at org.springframework.core.type.classreading.SimpleMetadataReader.(SimpleMetadataReader.java:49) ~[spring-core-5.3.9.jar:5.3.9] + at org.springframework.core.type.classreading.SimpleMetadataReaderFactory.getMetadataReader(SimpleMetadataReaderFactory.java:103) ~[spring-core-5.3.9.jar:5.3.9] + at org.springframework.boot.type.classreading.ConcurrentReferenceCachingMetadataReaderFactory.createMetadataReader(ConcurrentReferenceCachingMetadataReaderFactory.java:86) ~[spring-boot-2.5.4.jar:2.5.4] + at org.springframework.boot.type.classreading.ConcurrentReferenceCachingMetadataReaderFactory.getMetadataReader(ConcurrentReferenceCachingMetadataReaderFactory.java:73) ~[spring-boot-2.5.4.jar:2.5.4] + at org.springframework.core.type.classreading.SimpleMetadataReaderFactory.getMetadataReader(SimpleMetadataReaderFactory.java:81) ~[spring-core-5.3.9.jar:5.3.9] + at org.springframework.context.annotation.ConfigurationClassParser.asSourceClass(ConfigurationClassParser.java:696) ~[spring-context-5.3.9.jar:5.3.9] + at org.springframework.context.annotation.ConfigurationClassParser.asSourceClass(ConfigurationClassParser.java:665) ~[spring-context-5.3.9.jar:5.3.9] + at org.springframework.context.annotation.ConfigurationClassParser.asSourceClass(ConfigurationClassParser.java:643) ~[spring-context-5.3.9.jar:5.3.9] + at org.springframework.context.annotation.ConfigurationClassParser.processConfigurationClass(ConfigurationClassParser.java:248) ~[spring-context-5.3.9.jar:5.3.9] + at org.springframework.context.annotation.ConfigurationClassParser.parse(ConfigurationClassParser.java:207) ~[spring-context-5.3.9.jar:5.3.9] + at org.springframework.context.annotation.ConfigurationClassParser.parse(ConfigurationClassParser.java:175) ~[spring-context-5.3.9.jar:5.3.9] + ... 18 common frames omitted + +2024-10-12 13:10:27.218 WARN 87797 --- [restartedMain] com.alibaba.druid.pool.DruidDataSource : removeAbandoned is true, not use in production. +2024-10-12 15:13:32.735 WARN 87797 --- [http-nio-9099-exec-10] c.a.druid.pool.DruidAbstractDataSource : discard long time none received connection. , jdbcUrl : jdbc:mysql://gxtyzx.gxsportscenter.com:33063/tyzxDB?useUnicode=true&characterEncoding=utf8&useSSL=false&serverTimezone=GMT%2B8, version : 1.2.5, lastPacketReceivedIdleMillis : 263464 +2024-10-12 15:13:32.750 WARN 87797 --- [http-nio-9099-exec-10] c.a.druid.pool.DruidAbstractDataSource : discard long time none received connection. , jdbcUrl : jdbc:mysql://gxtyzx.gxsportscenter.com:33063/tyzxDB?useUnicode=true&characterEncoding=utf8&useSSL=false&serverTimezone=GMT%2B8, version : 1.2.5, lastPacketReceivedIdleMillis : 263443