Commit df29a37c authored by wlx@33.cn's avatar wlx@33.cn

提交盲盒下单

parent db3f3bf9
......@@ -158,4 +158,10 @@ public interface UserAssetMapper extends BaseMapper<UserAsset> {
@Select("select * from user_asset where uid = #{uid} and coin = #{coin}")
UserAsset getCoin(@Param("uid") String uid, @Param("coin") String value);
@Update("update user_asset set amount = amount -#{number},frozen = frozen + #{number},update_time = #{time} where id = #{id} and update_time = #{updateTime} and amount >= #{number}")
int useToFrozen(@Param("id") Long id,
@Param("number") BigDecimal number,
@Param("updateTime") Long updateTime,
@Param("time") long currentTimeMillis);
}
......@@ -156,4 +156,7 @@ public interface IUserAssetService extends IService<UserAsset> {
int addReward(String uid, String commentId, BigDecimal evaluationRefund);
int deleteAmount(Long id, BigDecimal amount);
//可用变冻结
int useToFrozen(Long id, BigDecimal number, Long updateTime, long currentTimeMillis);
}
......@@ -578,4 +578,9 @@ public class UserAssetServiceImpl extends ServiceImpl<UserAssetMapper, UserAsset
public int deleteAmount(Long id, BigDecimal amount) {
return coinDao.deleteAmount(id, amount);
}
@Override
public int useToFrozen(Long id, BigDecimal number, Long updateTime, long currentTimeMillis) {
return coinDao.useToFrozen(id, number, updateTime, currentTimeMillis);
}
}
package com.fzm.mall.server.front.constant;
import java.math.BigDecimal;
public class CommonConst {
public static final String USER = "user";
public static final String SIGNATURE = "signature";
public static final String NONCE = "nonce";
public static final BigDecimal NEGATIVE_ONE = new BigDecimal("-1");
/**
* a = b
*/
public static final int BIEDICIMAL_EQUAL_RESULT = 0;
/**
* a < b
*/
public static final int BIEDICIMAL_LEFT_LESS = -1;
/**
* a > b
*/
public static final int BIEDICIMAL_LEFT_GREATER = 1;
public CommonConst() {
}
}
package com.fzm.mall.server.front.constant;
import java.math.BigDecimal;
/**
* @author tdz
* @date 2021/03/02 14:51
......@@ -16,4 +18,15 @@ public class GoodMainConst {
*/
public final static String ORDER_BY_CART = "1";
/**
* 盲盒商品单次下单的购买数量:一次只能买一个
*/
public final static Integer BLIND_BOX_ORDER_SKU_NUM = 1;
public final static BigDecimal BLIND_BOX_ORDER_SKU_NUM_BIGDECIMAL = new BigDecimal("1");
/**
* 盲盒商品的待支付订单回显规格属性值的默认值
*/
public final static String DEFAULT_PROP_VALUE = "默认";
}
......@@ -68,6 +68,8 @@ public enum MallResponseEnum {
NOT_SUPPORT_BUY_MYSELF("200221","NOT_SUPPORT_BUY_MYSELF"),
ONLY_SUPPORT_MAIL("200222","ONLY_SUPPORT_MAIL"),
SEND_CODE_ERR("200223","SEND_CODE_ERR"),
HOT_ACTIVITY("200237","HOT_ACTIVITY"),
// 系统参数配置
QUERY_SUCCESS("200200", "query_success"),
......
package com.fzm.mall.server.front.enums;
public enum AssetRecordTypeEnum {
//积分充值
INTEGRAL_RECHARGE(7),
//积分抵扣
INTEGRAL_DEDUCTION(9),
//退款
RETURN_MONEY(10),
//商品币购买
BUY_GOODS(11),
//扣除积分
DEDUCT_INTEGRAL(17),
//提货
DRAW_GOODS(18),
//评论奖励
COMMENT_REWARD(19),
//转赠-转入
PRESENT_IN(20),
//转赠—转出
PRESENT_OUT(21),
//注册奖励
REGISTER_REWARD(22),
//外部token转入
OUT_TOKEN_IN(23),
//外部NFT转入
OUT_NFT_IN(24),
//向外划转
TRANSFER_OUT(25),
//退货
RETURN_GOODS(26),
//邀请注册奖励
INVITE_REGISTER_REWARD(27),
//发布转让
RELEASE_TRANSFER(28),
//商品币退还
GOODS_COIN_REFUND(29),
//积分抵扣退还
INTEGRAL_DEDUCTION_RETURN(30),
//31.slg数字资产发行 32.slg数字资产增发 33.slg数字资产减发 34.slg数字资产回收 35.slc防伪NFT转入
//物物交换转让转入
BARTER_TRANSFER_IN(36),
//物物交换转让转出
BARTER_TRANSFER_OUT(37),
;
private Integer type;
AssetRecordTypeEnum(Integer type){
this.type = type;
}
public Integer getType() {
return type;
}
}
package com.fzm.mall.server.front.enums;
public enum GoodSpuSalesTypeEnum {
/**
* 普通商品
*/
GENERAL(1),
/**
* 盲盒商品
*/
BLIND_BOX(4),
;
private Integer type;
GoodSpuSalesTypeEnum(Integer type){
this.type = type;
}
public Integer getType() {
return type;
}
}
package com.fzm.mall.server.front.enums;
public enum OrderPayStateEnum {
/**
* 6->待付款
*/
PAY_STATE_TO_PAY(6),
;
private Integer state;
OrderPayStateEnum(Integer state){
this.state = state;
}
public Integer getState() {
return state;
}
}
package com.fzm.mall.server.front.enums;
public enum OrderPayTypeEnum {
//积分支付
INTEGRAL(4),
;
private Integer type;
OrderPayTypeEnum(Integer type){
this.type = type;
}
public Integer getType() {
return type;
}
}
package com.fzm.mall.server.front.enums;
public enum OrderStateEnum {
/**
* 7->待支付
*/
ORDER_STATE_TO_PAY(7),
;
private Integer state;
OrderStateEnum(Integer state){
this.state = state;
}
public Integer getState() {
return state;
}
}
package com.fzm.mall.server.front.enums;
public enum OrderTypeEnum {
/**
* 普通商品
*/
GENERAL(1),
;
private Integer type;
OrderTypeEnum(Integer type){
this.type = type;
}
public Integer getType() {
return type;
}
}
......@@ -2,6 +2,7 @@ package com.fzm.mall.server.front.goods.mapper;
import com.fzm.mall.server.front.goods.model.DistributionTemplateItem;
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import org.apache.ibatis.annotations.Mapper;
import org.apache.ibatis.annotations.Param;
import org.apache.ibatis.annotations.Select;
......@@ -13,6 +14,7 @@ import org.apache.ibatis.annotations.Select;
* @author fzm
* @since 2021-03-19
*/
@Mapper
public interface DistributionTemplateItemMapper extends BaseMapper<DistributionTemplateItem> {
@Select("select * from distribution_template_item where template_id = #{templateId} and delivery_area like #{province}")
DistributionTemplateItem getByTemplateIdAndProvince(@Param("templateId") String templateId, @Param("province") String province);
......
......@@ -2,6 +2,7 @@ package com.fzm.mall.server.front.goods.mapper;
import com.fzm.mall.server.front.goods.model.DistributionTemplate;
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import org.apache.ibatis.annotations.Mapper;
/**
* <p>
......@@ -11,6 +12,7 @@ import com.baomidou.mybatisplus.core.mapper.BaseMapper;
* @author fzm
* @since 2021-03-19
*/
@Mapper
public interface DistributionTemplateMapper extends BaseMapper<DistributionTemplate> {
}
......@@ -66,8 +66,8 @@ public interface GoodSkuMapper extends BaseMapper<GoodSku> {
@Select("select a.merchant_id as merchantId,a.template_id as templateId,a.name as name,a.goods_id as goodsId,b.* from goods_spu a left join goods_sku b on a.goods_id = b.goods_id where b.sku_id = #{skuId}")
SkuVo getSkuVoBySkuId(@Param("skuId") String skuId);
@Update("update goods_sku set stock =stock - #{num} where sku_id = #{skuId} and stock >= #{num}")
int delStock(@Param("skuId") String skuId, @Param("num") Integer num);
// @Update("update goods_sku set stock =stock - #{num} where sku_id = #{skuId} and stock >= #{num}")
// int delStock(@Param("skuId") String skuId, @Param("num") Integer num);
@Update("update goods_sku set stock =stock + #{num} where sku_id = #{skuId}")
void addStock(@Param("skuId") String skuId, @Param("num") Integer number);
......@@ -84,4 +84,13 @@ public interface GoodSkuMapper extends BaseMapper<GoodSku> {
String getGoodsName(@Param("goodsId") String goodsId);
SaleHotVo count(String goodsId);
/**
* 获取库存大于0的sku列表
*/
List<SkuVo> listAvailableSku(@Param("goodsId") String goodsId);
int delStock(@Param("skuId") String skuId,
@Param("num") Integer num,
@Param("updateTime")Long updateTime);
}
......@@ -144,6 +144,9 @@ public class GoodSpu implements Serializable {
@ApiModelProperty(value = "溯源hash")
private String hash;
@ApiModelProperty(value = "(销售方式)1.普通 4.盲盒")
private Integer salesType;
public void initTokenId() {
if (commodityPass.equals(COMMODITY_PASS_OUT)){
setTokenId(Long.valueOf(tokenIdStr));
......
......@@ -66,4 +66,15 @@ public class SkuVo {
private String commodityPassId;
@ApiModelProperty(value = "盲盒商品的销售难度系数(1-10)")
private Integer difficulty;
@ApiModelProperty(value = "盲盒商品的规格是否为隐藏款")
private Boolean isHide;
@ApiModelProperty(value = "更新时间")
private Long updateTime;
@ApiModelProperty(value = "盲盒商品价格")
private BigDecimal blindBoxprice;
}
......@@ -19,7 +19,7 @@ public interface IDistributionTemplateService extends IService<DistributionTempl
DistributionTemplate getTemplateId(String templateId);
BigDecimal getPrice(String templateId, String province, BigDecimal bigDecimal, Integer integer, BigDecimal bigDecimal1);
BigDecimal getPrice(String templateId, String province, BigDecimal postFeeTotal, Integer merchantGoodSize, BigDecimal merchantGoodWeight);
DistributionTemplate getByMerchantId(String merchantId);
}
......@@ -15,6 +15,9 @@ import java.util.Map;
* @since 2021-03-02
*/
public interface IGoodSkuPropService extends IService<GoodSkuProp> {
List<Map<String, Object>> getSkuPropListBySkuId (String skuId, boolean hideSku);
List<Map<String, Object>> getSkuPropListBySkuId (String skuId);
List<GoodSkuProp> getList(String string);
......
......@@ -19,7 +19,7 @@ public interface IGoodSkuService extends IService<GoodSku> {
SkuVo getSkuVoBySkuId(String skuId);
int delStock(String skuId,Integer num);
int delStock(String skuId,Integer num, Long updateTime);
void addStock(String skuId, Integer number);
......
package com.fzm.mall.server.front.goods.service.impl;
import com.baomidou.mybatisplus.core.conditions.Wrapper;
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.baomidou.mybatisplus.core.enums.SqlLike;
import com.fzm.mall.server.front.goods.mapper.DistributionTemplateItemMapper;
import com.fzm.mall.server.front.goods.model.DistributionTemplate;
import com.fzm.mall.server.front.goods.mapper.DistributionTemplateMapper;
......@@ -28,9 +26,6 @@ public class DistributionTemplateServiceImpl extends ServiceImpl<DistributionTem
@Autowired
private DistributionTemplateItemMapper distributionTemplateItemMapper;
@Autowired
private DistributionTemplateMapper distributionTemplateMapper;
@Override
public DistributionTemplate getTemplateId(String templateId) {
QueryWrapper<DistributionTemplate> q = new QueryWrapper<>();
......@@ -39,7 +34,7 @@ public class DistributionTemplateServiceImpl extends ServiceImpl<DistributionTem
}
@Override
public BigDecimal getPrice(String templateId, String province, BigDecimal bigDecimal,Integer size,BigDecimal weight) {
public BigDecimal getPrice(String templateId, String province, BigDecimal postFeeTotal,Integer size,BigDecimal weight) {
province = "%"+province+"%";
DistributionTemplateItem distributionTemplateItem = distributionTemplateItemMapper.getByTemplateIdAndProvince(templateId,province);
if(distributionTemplateItem == null){
......@@ -55,7 +50,7 @@ public class DistributionTemplateServiceImpl extends ServiceImpl<DistributionTem
return BigDecimal.ZERO;
}
}else if(distributionTemplateItem.getPricingType()==3){
if(distributionTemplateItem.getFreeShippingAmount().compareTo(bigDecimal)==1){
if(distributionTemplateItem.getFreeShippingAmount().compareTo(postFeeTotal)==1){
return getBigDecimal(templateId, size, weight);
}else{
return BigDecimal.ZERO;
......
......@@ -2,6 +2,7 @@ package com.fzm.mall.server.front.goods.service.impl;
import com.alibaba.fastjson.JSONObject;
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.fzm.mall.server.front.constant.GoodMainConst;
import com.fzm.mall.server.front.goods.model.GoodSkuProp;
import com.fzm.mall.server.front.goods.mapper.GoodSkuPropMapper;
import com.fzm.mall.server.front.goods.service.IGoodSkuPropService;
......@@ -38,7 +39,8 @@ public class GoodSkuPropServiceImpl extends ServiceImpl<GoodSkuPropMapper, GoodS
System.out.println(skuProp);
}
public List<Map<String, Object>> getSkuPropListBySkuId(String skuId) {
@Override
public List<Map<String, Object>> getSkuPropListBySkuId(String skuId, boolean hideSku) {
List<Map<String, Object>> skuProp = goodRedis.getSkuProp(skuId);
if (skuProp != null) {
return skuProp;
......@@ -53,7 +55,14 @@ public class GoodSkuPropServiceImpl extends ServiceImpl<GoodSkuPropMapper, GoodS
for (GoodSkuProp prop : list) {
Map<String, Object> map = new HashMap<>();
map.put("name", prop.getPropKey());
map.put("value", prop.getPropVal());
/**
* 待支付的盲盒订单需要隐藏规格信息
*/
if (hideSku){
map.put("value", GoodMainConst.DEFAULT_PROP_VALUE);
}else{
map.put("value", prop.getPropVal());
}
skuProp.add(map);
}
goodRedis.setSkuProp(skuId, skuProp);
......@@ -61,6 +70,11 @@ public class GoodSkuPropServiceImpl extends ServiceImpl<GoodSkuPropMapper, GoodS
return skuProp;
}
@Override
public List<Map<String, Object>> getSkuPropListBySkuId(String skuId) {
return getSkuPropListBySkuId(skuId, false);
}
@Override
public List<GoodSkuProp> getList(String string) {
......
......@@ -61,8 +61,8 @@ public class GoodSkuServiceImpl extends ServiceImpl<GoodSkuMapper, GoodSku> impl
}
@Override
public int delStock(String skuId, Integer num) {
return skuMapper.delStock(skuId,num);
public int delStock(String skuId, Integer num, Long updateTime) {
return skuMapper.delStock(skuId,num,updateTime);
}
@Override
......
......@@ -2,6 +2,10 @@ package com.fzm.mall.server.front.merchant.mapper;
import com.fzm.mall.server.front.merchant.model.Merchant;
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import org.apache.ibatis.annotations.Mapper;
import org.apache.ibatis.annotations.Param;
import java.math.BigDecimal;
/**
* <p>
......@@ -11,6 +15,8 @@ import com.baomidou.mybatisplus.core.mapper.BaseMapper;
* @author fzm
* @since 2021-03-02
*/
@Mapper
public interface MerchantMapper extends BaseMapper<Merchant> {
BigDecimal getPrice(@Param("coin") String coin);
}
......@@ -3,6 +3,8 @@ package com.fzm.mall.server.front.merchant.service;
import com.fzm.mall.server.front.merchant.model.Merchant;
import com.baomidou.mybatisplus.extension.service.IService;
import java.math.BigDecimal;
/**
* <p>
* 服务类
......@@ -12,6 +14,9 @@ import com.baomidou.mybatisplus.extension.service.IService;
* @since 2021-03-02
*/
public interface IMerchantService extends IService<Merchant> {
Merchant info(String merchantId) ;
BigDecimal getPrice(String coin);
}
......@@ -10,6 +10,8 @@ import com.fzm.mall.server.front.redis.MerchantRedis;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import java.math.BigDecimal;
/**
* <p>
* 服务实现类
......@@ -20,9 +22,13 @@ import org.springframework.stereotype.Service;
*/
@Service
public class MerchantServiceImpl extends ServiceImpl<MerchantMapper, Merchant> implements IMerchantService {
@Autowired
private MerchantRedis merchantRedis;
@Autowired
private MerchantMapper merchantMapper;
@Override
public Merchant info(String merchantId) {
/*Merchant merchant = merchantRedis.getMerchant(merchantId);
......@@ -38,4 +44,8 @@ public class MerchantServiceImpl extends ServiceImpl<MerchantMapper, Merchant> i
return getOne(queryWrapper);
}
@Override
public BigDecimal getPrice(String coin) {
return merchantMapper.getPrice(coin);
}
}
......@@ -34,8 +34,11 @@ import io.netty.util.internal.StringUtil;
import io.swagger.annotations.ApiOperation;
import jdk.nashorn.internal.ir.annotations.Ignore;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.util.ObjectUtils;
import org.springframework.util.StringUtils;
import org.springframework.web.bind.annotation.*;
import javax.validation.Valid;
import java.math.BigDecimal;
import java.util.Date;
import java.util.List;
......@@ -93,7 +96,6 @@ public class OrderController {
String pid = "";
try {
pid = orderService.createOrder(header.getUid(), orderVo, header.getType());
msgProducer.sendTTL(pid, QueueTTLTypeEnum.ORDER_CLOSE_TTL, configService.getConfig().getOrderCloseLimit());
} catch (Exception e) {
String msg = e.getMessage();
if (("商品不存在或下架").equals(msg)) {
......@@ -118,6 +120,46 @@ public class OrderController {
return new ResponseVO<>(MallResponseEnum.SUCCESS, pid);
}
@ApiOperation(value = "盲盒下单")
@PostMapping("/blindBox/createOrder")
public ResponseVO<String> blindBoxCreateOrder(@Ignore @RequestAttribute Header header, @RequestBody @Valid OrderBlindBoxVo orderVo) {
/**
* 參數校驗
*/
if(ObjectUtils.isEmpty(orderVo.getDelivery()) || StringUtils.isEmpty(orderVo.getGoodsId())){
return new ResponseVO<>(MallResponseEnum.PARAMETER_ERR);
}
String pid = "";
try {
pid = orderService.blindBoxCreateOrder(header.getUid(), header.getType(), orderVo);
} catch (Exception e) {
String msg = e.getMessage();
if (("商品不存在或下架").equals(msg)) {
return new ResponseVO<>(MallResponseEnum.GOODS_NOT_BUY);
} else if (("库存不足!!!").equals(msg)) {
return new ResponseVO<>(MallResponseEnum.GOOD_STOCK_NOT_ENOUGH);
} else if (("存在无效优惠券!!!").equals(msg)) {
return new ResponseVO<>(MallResponseEnum.GOOD_COUPON_NOT_EXIST);
} else if (("一个商品只能使用一个优惠券!!!").equals(msg)) {
return new ResponseVO<>(MallResponseEnum.GOOD_COUPON_NOT_EXIST);
} else if (("商品数量错误").equals(msg)) {
return new ResponseVO<>(MallResponseEnum.GOOD_NUM_ERR);
} else if (("当前地区不支持快递").equals(msg)) {
return new ResponseVO<>(MallResponseEnum.NOT_SUPPORT_MAIL);
}else if("活动火爆".equals(msg)){
return new ResponseVO<>(MallResponseEnum.HOT_ACTIVITY);
} else{
e.printStackTrace();
//数据库异常
return new ResponseVO<>(MallResponseEnum.DB_ERROR);
}
}
return new ResponseVO<>(MallResponseEnum.SUCCESS, pid);
}
@ApiOperation(value = "支付 参数 pid")
@PostMapping("/pay")
public ResponseVO<String> pay(@Ignore @RequestAttribute Header header, @RequestBody PayVo payVo) {
......
......@@ -26,6 +26,11 @@ import lombok.EqualsAndHashCode;
@ApiModel(value="Pay对象", description="支付订单结果表")
public class Pay implements Serializable {
/**
* 支付状态:6->待付款
*/
public static final Integer PAY_STATE_TO_PAY = 6;
private static final long serialVersionUID = 1L;
@ApiModelProperty(value = "主键自增编号")
......@@ -50,7 +55,7 @@ public class Pay implements Serializable {
@ApiModelProperty(value = "待支付金额")
private BigDecimal unpaidAmount;
@ApiModelProperty(value = "支付方式, 1->支付宝,2->微信 , 3->ccny")
@ApiModelProperty(value = "支付方式, 1->支付宝,2->微信 , 3->ccny 4:积分")
private Integer payType;
@ApiModelProperty(value = "订单号")
......@@ -73,5 +78,11 @@ public class Pay implements Serializable {
private String outBizNo;
@ApiModelProperty(value = "用于抵扣的积分名称")
@TableField(exist = false)
private String coin;
@ApiModelProperty(value = "用于抵扣的积分数量")
@TableField(exist = false)
private BigDecimal integralDeduction;
}
package com.fzm.mall.server.front.order.model.vo;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
import java.math.BigDecimal;
import java.util.List;
@Data
public class OrderBlindBoxVo {
private static final long serialVersionUID = 1L;
/**
* 是否直接提货,1->是
*/
public static final Integer DELIVERY_IMMEDIATELY = 1;
@ApiModelProperty(value = "是否直接提货,0->否,1->是", required = true)
private Integer delivery;
@ApiModelProperty(value = "收货人名称")
private String uname;
@ApiModelProperty(value = "收人手机号")
private String phone;
@ApiModelProperty(value = "提货地址")
private String address;
@ApiModelProperty(value = "省份名字或直辖市")
private String province;
@ApiModelProperty(value = "盲盒商品id", required = true)
private String goodsId;
@ApiModelProperty(value = "用于抵扣的积分的名称")
private String coin;
@ApiModelProperty(value = "用于抵扣的积分的数量")
private BigDecimal coinNumber;
@ApiModelProperty(value = "备注")
private String vNote;
@ApiModelProperty(value = "优惠券列表")
private List<String> goodsIdCouponIdList;
}
package com.fzm.mall.server.front.order.service;
import com.fzm.mall.server.front.goods.model.vo.SkuVo;
/**
* <p>
* 盲盒
* </p>
*
* @author wulixian
* @since 2022-02-23
*/
public interface IOrderBindBoxService {
/**
* 随机抽取盲盒sku
* @param goodsId
* @return
*/
SkuVo genRandomSku(String goodsId);
}
......@@ -8,6 +8,7 @@ import com.baomidou.mybatisplus.extension.service.IService;
import com.fzm.mall.server.front.order.model.OrderDetail;
import com.fzm.mall.server.front.order.model.po.NftOrderPo;
import com.fzm.mall.server.front.order.model.po.PreSaleOrderVo;
import com.fzm.mall.server.front.order.model.vo.OrderBlindBoxVo;
import com.fzm.mall.server.front.order.model.vo.OrderVo;
import com.fzm.mall.server.front.order.model.vo.ReturnMoneyDetail;
......@@ -54,4 +55,13 @@ public interface IOrderService extends IService<Order> {
String createPreSaleOrder(String uid, PreSaleOrderVo preSaleOrderVo);
String createNftOrder(String uid, List<NftOrderPo> nftOrderPos);
/**
* 盲盒下单
* @param uid
* @param type
* @param orderVo
* @return
*/
String blindBoxCreateOrder(String uid, Integer type, OrderBlindBoxVo orderVo);
}
package com.fzm.mall.server.front.order.service.impl;
import com.fzm.mall.server.front.constant.GoodMainConst;
import com.fzm.mall.server.front.goods.mapper.GoodSkuMapper;
import com.fzm.mall.server.front.goods.model.vo.SkuVo;
import com.fzm.mall.server.front.order.service.IOrderBindBoxService;
import lombok.RequiredArgsConstructor;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.util.CollectionUtils;
import java.util.ArrayList;
import java.util.List;
import java.util.concurrent.ThreadLocalRandom;
/**
* @author wulixian
* @since 2022/2/23
*/
@Service
@RequiredArgsConstructor(onConstructor = @__(@Autowired))
public class IOrderBindBoxServiceImpl implements IOrderBindBoxService {
private final GoodSkuMapper goodSkuMapper;
@Override
public SkuVo genRandomSku(String goodsId) {
SkuVo result = null;
/**
* 从数据库获取库存大于0的盲盒sku列表
*/
List<SkuVo> skuList = goodSkuMapper.listAvailableSku(goodsId);
if (!CollectionUtils.isEmpty(skuList)) {
int difficulty = skuList.stream().map(SkuVo::getDifficulty).findFirst().get();
result = genRandomSku(skuList, difficulty);
}
if (result == null) {
throw new RuntimeException("库存不足!!!");
}
//加时间锁
int i = goodSkuMapper.delStock(result.getSkuId(), GoodMainConst.BLIND_BOX_ORDER_SKU_NUM, result.getUpdateTime());
if (i == 0) {
throw new RuntimeException("活动火爆");
}
return result;
}
/**
* @param prodList 从数据库获取的库存大于0的盲盒产品列表
* @param difficulty 正整数[1,10]
* @return 随机产品规格
* @descprition 随机获得产品
* @author lyz
* @create 2022/2/14 9:42
*/
public static SkuVo genRandomSku(List<SkuVo> prodList, int difficulty) {
int hiddenWeight = difficulty == 10 ? 1 : (10 - difficulty);
List<SkuVo> baseList = new ArrayList<>();
for (SkuVo prodItem : prodList) {
if (prodItem.getIsHide()) {
for (int i = 0; i < hiddenWeight; i++) {
baseList.add(prodItem);
}
} else {
for (int i = 0; i < difficulty; i++) {
baseList.add(prodItem);
}
}
}
//为了增加随机度,可以打开
//Collections.shuffle(baseList);
int base = baseList.size();
int randomNum = ThreadLocalRandom.current().nextInt(base);
return baseList.get(randomNum);
}
}
......@@ -14,10 +14,12 @@ import com.fzm.mall.server.front.asset.service.IOrderPayService;
import com.fzm.mall.server.front.asset.service.IUserAssetRecordService;
import com.fzm.mall.server.front.asset.service.IUserAssetService;
import com.fzm.mall.server.front.base.PageVO;
import com.fzm.mall.server.front.constant.CommonConst;
import com.fzm.mall.server.front.constant.GoodMainConst;
import com.fzm.mall.server.front.constant.MALLGlobalConfig;
import com.fzm.mall.server.front.constant.PaymentTypeConst;
import com.fzm.mall.server.front.constant.cache.MallCacheHeader;
import com.fzm.mall.server.front.enums.QueueTTLTypeEnum;
import com.fzm.mall.server.front.enums.*;
import com.fzm.mall.server.front.goods.model.*;
import com.fzm.mall.server.front.goods.model.vo.GoodsVo;
import com.fzm.mall.server.front.goods.model.vo.SkuVo;
......@@ -45,6 +47,7 @@ import com.fzm.mall.server.front.util.OrderUtil;
import com.fzm.mall.server.front.util.TimeUtil;
import io.netty.util.internal.StringUtil;
import lombok.RequiredArgsConstructor;
import org.apache.commons.lang3.StringUtils;
import org.springframework.beans.BeanUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
......@@ -98,6 +101,8 @@ public class OrderServiceImpl extends ServiceImpl<OrderMapper, Order> implements
private final INftService nftService;
private final ISpuService ispuService;
private final IRedisService redisService;
private final IOrderBindBoxService orderBindBoxService;
@Autowired
private ChainUtil chainUtil;
......@@ -175,7 +180,12 @@ public class OrderServiceImpl extends ServiceImpl<OrderMapper, Order> implements
vo.setThumb(goodSpu.getThumb());
String commonentId = goodCommentService.getCommonentId(oid, skuId);
vo.setCommentId(commonentId);
List<Map<String, Object>> skuPropListMap = skuPropService.getSkuPropListBySkuId(skuId);
/**
* 待支付的盲盒订单需要隐藏规格信息
*/
boolean hideSku = orderVO.getOrderState() == OrderStateEnum.ORDER_STATE_TO_PAY.getState() &&
goodSpu.getSalesType() == GoodSpuSalesTypeEnum.BLIND_BOX.getType();
List<Map<String, Object>> skuPropListMap = skuPropService.getSkuPropListBySkuId(skuId, hideSku);
vo.setPropList(skuPropListMap);
orders.add(vo);
}
......@@ -318,7 +328,7 @@ public class OrderServiceImpl extends ServiceImpl<OrderMapper, Order> implements
//商品数量错误
throw new RuntimeException("商品数量错误");
}
int i = goodSkuService.delStock(skuVo.getSkuId(), orderSkuVo.getNum());
int i = goodSkuService.delStock(skuVo.getSkuId(), orderSkuVo.getNum(), skuVo.getUpdateTime());
if (i != 1) {
throw new RuntimeException("库存不足!!!");
}
......@@ -330,30 +340,30 @@ public class OrderServiceImpl extends ServiceImpl<OrderMapper, Order> implements
templateId = skuVo.getTemplateId();
OrderDetail orderDetail = new OrderDetail();
int commodity = spuService.getCommodityBySkuId(orderSkuVo.getSkuId());
if(commodity == 3){
if (commodity == 3) {
int saleType = spuService.getNftSalesType(orderSkuVo.getSkuId());
if(saleType == 2){
while (!redisService.setNx("select"+skuVo.getCommodityPassId())){
if (saleType == 2) {
while (!redisService.setNx("select" + skuVo.getCommodityPassId())) {
}
String serialNo = skuService.getSerialNo(skuVo.getCommodityPassId());
List<Long> array = JSON.parseArray(serialNo, Long.class);
if(array.size()<orderSkuVo.getNum()){
if (array.size() < orderSkuVo.getNum()) {
throw new RuntimeException("库存不足!!!");
}
int index = 1;
List<Long> list = new ArrayList<>();
for (Long o:array) {
if(index<=orderSkuVo.getNum()){
for (Long o : array) {
if (index <= orderSkuVo.getNum()) {
list.add(o);
index ++;
}else{
index++;
} else {
break;
}
}
boolean remove = array.removeAll(list);
skuService.updateSerialNo(JSON.toJSONString(array),skuVo.getCommodityPassId());
redisService.del("select"+skuVo.getCommodityPassId());
skuService.updateSerialNo(JSON.toJSONString(array), skuVo.getCommodityPassId());
redisService.del("select" + skuVo.getCommodityPassId());
orderDetail.setSerialNo(JSON.toJSONString(list));
}
}
......@@ -692,11 +702,11 @@ public class OrderServiceImpl extends ServiceImpl<OrderMapper, Order> implements
for (OrderDetail orderDetail : details) {
SkuVo skuVo = skuService.getBySkuId(orderDetail.getSkuId());
log.error("skuVo+++"+skuVo.toString());
log.error("skuVo+++" + skuVo.toString());
//String hash = paraChainUtil.evmTransfer(, null, user.getAddress(), , orderDetail.getCoin());
//String replace = orderDetail.getCoin().replace(MALLGlobalConfig.GOODS_NFT_PREFIX,"");
int commodity = spuService.getCommodityBySkuId(orderDetail.getSkuId());
if(commodity == 1){
if (commodity == 1) {
//打币
UserAsset coin = userAssetService.getCoin(order.getUid(), orderDetail.getCoin());
if (coin == null) {
......@@ -711,7 +721,7 @@ public class OrderServiceImpl extends ServiceImpl<OrderMapper, Order> implements
userAssetService.addCoin(coin.getId(), new BigDecimal(orderDetail.getNumber()));
}
String coinName = orderDetail.getCoin().replace(MALLGlobalConfig.GOODS_NFT_PREFIX, "");
String hash = chainUtil.evmTransfer(user.getAddress(),m.getTokenIssueAddr(),Long.valueOf(coinName),orderDetail.getNumber().longValue());
String hash = chainUtil.evmTransfer(user.getAddress(), m.getTokenIssueAddr(), Long.valueOf(coinName), orderDetail.getNumber().longValue());
UserAssetRecord userAssetRecord = new UserAssetRecord();
userAssetRecord.setUid(order.getUid());
userAssetRecord.setAmount(new BigDecimal(orderDetail.getNumber()));
......@@ -738,7 +748,7 @@ public class OrderServiceImpl extends ServiceImpl<OrderMapper, Order> implements
tranDto.setUpdateTime(System.currentTimeMillis());
log.error(JSONObject.toJSONString(tranDto));
msgProducer.sendTTL(JSONObject.toJSONString(tranDto), QueueTTLTypeEnum.CONFIRM_WITHDRAW_TTL, 5 * 1000);
}else if(commodity == 2){
} else if (commodity == 2) {
//打币
UserAsset coin = userAssetService.getCoin(order.getUid(), orderDetail.getCoin());
if (coin == null) {
......@@ -753,7 +763,7 @@ public class OrderServiceImpl extends ServiceImpl<OrderMapper, Order> implements
userAssetService.addCoin(coin.getId(), new BigDecimal(orderDetail.getNumber()));
}
String coinName = orderDetail.getCoin().replace(MALLGlobalConfig.GOODS_NFT_PREFIX, "");
String hash = chainUtil.evmTransfer(user.getAddress(),m.getTokenIssueAddr(),Long.valueOf(coinName),orderDetail.getNumber().longValue());
String hash = chainUtil.evmTransfer(user.getAddress(), m.getTokenIssueAddr(), Long.valueOf(coinName), orderDetail.getNumber().longValue());
UserAssetRecord userAssetRecord = new UserAssetRecord();
userAssetRecord.setUid(order.getUid());
userAssetRecord.setAmount(new BigDecimal(orderDetail.getNumber()));
......@@ -780,9 +790,9 @@ public class OrderServiceImpl extends ServiceImpl<OrderMapper, Order> implements
tranDto.setUpdateTime(System.currentTimeMillis());
log.error(JSONObject.toJSONString(tranDto));
msgProducer.sendTTL(JSONObject.toJSONString(tranDto), QueueTTLTypeEnum.CONFIRM_WITHDRAW_TTL, 5 * 1000);
}else if(commodity == 3){
} else if (commodity == 3) {
int saleType = spuService.getNftSalesType(orderDetail.getSkuId());
if(saleType ==1){
if (saleType == 1) {
//打币
UserAsset coin = userAssetService.getCoin(order.getUid(), orderDetail.getCoin());
if (coin == null) {
......@@ -797,7 +807,7 @@ public class OrderServiceImpl extends ServiceImpl<OrderMapper, Order> implements
userAssetService.addCoin(coin.getId(), new BigDecimal(orderDetail.getNumber()));
}
String coinName = orderDetail.getCoin().replace(MALLGlobalConfig.GOODS_NFT_PREFIX, "");
String hash = chainUtil.evmTransfer(user.getAddress(),m.getTokenIssueAddr(),Long.valueOf(coinName),orderDetail.getNumber().longValue());
String hash = chainUtil.evmTransfer(user.getAddress(), m.getTokenIssueAddr(), Long.valueOf(coinName), orderDetail.getNumber().longValue());
UserAssetRecord userAssetRecord = new UserAssetRecord();
userAssetRecord.setUid(order.getUid());
userAssetRecord.setAmount(new BigDecimal(orderDetail.getNumber()));
......@@ -824,10 +834,10 @@ public class OrderServiceImpl extends ServiceImpl<OrderMapper, Order> implements
tranDto.setUpdateTime(System.currentTimeMillis());
log.error(JSONObject.toJSONString(tranDto));
msgProducer.sendTTL(JSONObject.toJSONString(tranDto), QueueTTLTypeEnum.CONFIRM_WITHDRAW_TTL, 5 * 1000);
}else{
} else {
String json = orderDetail.getSerialNo();
JSONArray array = JSON.parseArray(json);
for (Object o:array) {
for (Object o : array) {
//打币
UserAsset coin = userAssetService.getCoin(order.getUid(), o.toString());
if (coin == null) {
......@@ -841,7 +851,7 @@ public class OrderServiceImpl extends ServiceImpl<OrderMapper, Order> implements
} else {
userAssetService.addCoin(coin.getId(), new BigDecimal(orderDetail.getNumber()));
}
String hash = chainUtil.evmTransfer(user.getAddress(),m.getTokenIssueAddr(),Long.valueOf(o.toString()),1);
String hash = chainUtil.evmTransfer(user.getAddress(), m.getTokenIssueAddr(), Long.valueOf(o.toString()), 1);
UserAssetRecord userAssetRecord = new UserAssetRecord();
userAssetRecord.setUid(order.getUid());
userAssetRecord.setAmount(new BigDecimal(orderDetail.getNumber()));
......@@ -880,7 +890,7 @@ public class OrderServiceImpl extends ServiceImpl<OrderMapper, Order> implements
Collection<Delivery> list = new ArrayList<>();
for (OrderDetail orderDetail : details) {
int commodity = spuService.getCommodityBySkuId(orderDetail.getSkuId());
if(commodity == 1){
if (commodity == 1) {
//打币
UserAsset coin = userAssetService.getCoin(order.getUid(), orderDetail.getCoin());
if (coin == null) {
......@@ -895,7 +905,7 @@ public class OrderServiceImpl extends ServiceImpl<OrderMapper, Order> implements
userAssetService.addCoin(coin.getId(), new BigDecimal(orderDetail.getNumber()));
}
String coinName = orderDetail.getCoin().replace(MALLGlobalConfig.GOODS_NFT_PREFIX, "");
String hash = chainUtil.evmTransfer(user.getAddress(),m.getTokenIssueAddr(),Long.valueOf(coinName),orderDetail.getNumber().longValue());
String hash = chainUtil.evmTransfer(user.getAddress(), m.getTokenIssueAddr(), Long.valueOf(coinName), orderDetail.getNumber().longValue());
UserAssetRecord userAssetRecord = new UserAssetRecord();
userAssetRecord.setUid(order.getUid());
userAssetRecord.setAmount(new BigDecimal(orderDetail.getNumber()));
......@@ -947,7 +957,7 @@ public class OrderServiceImpl extends ServiceImpl<OrderMapper, Order> implements
delivery.setNote(orderDetail.getNote());
delivery.setDeliveryState(0);
list.add(delivery);
}else if(commodity == 2){
} else if (commodity == 2) {
//打币
UserAsset coin = userAssetService.getCoin(order.getUid(), orderDetail.getCoin());
if (coin == null) {
......@@ -962,7 +972,7 @@ public class OrderServiceImpl extends ServiceImpl<OrderMapper, Order> implements
userAssetService.addCoin(coin.getId(), new BigDecimal(orderDetail.getNumber()));
}
String coinName = orderDetail.getCoin().replace(MALLGlobalConfig.GOODS_NFT_PREFIX, "");
String hash = chainUtil.evmTransfer(user.getAddress(),m.getTokenIssueAddr(),Long.valueOf(coinName),orderDetail.getNumber().longValue());
String hash = chainUtil.evmTransfer(user.getAddress(), m.getTokenIssueAddr(), Long.valueOf(coinName), orderDetail.getNumber().longValue());
UserAssetRecord userAssetRecord = new UserAssetRecord();
userAssetRecord.setUid(order.getUid());
userAssetRecord.setAmount(new BigDecimal(orderDetail.getNumber()));
......@@ -1014,9 +1024,9 @@ public class OrderServiceImpl extends ServiceImpl<OrderMapper, Order> implements
delivery.setNote(orderDetail.getNote());
delivery.setDeliveryState(0);
list.add(delivery);
}else if(commodity == 3){
} else if (commodity == 3) {
int saleType = spuService.getNftSalesType(orderDetail.getSkuId());
if(saleType ==1){
if (saleType == 1) {
//打币
UserAsset coin = userAssetService.getCoin(order.getUid(), orderDetail.getCoin());
if (coin == null) {
......@@ -1031,7 +1041,7 @@ public class OrderServiceImpl extends ServiceImpl<OrderMapper, Order> implements
userAssetService.addCoin(coin.getId(), new BigDecimal(orderDetail.getNumber()));
}
String coinName = orderDetail.getCoin().replace(MALLGlobalConfig.GOODS_NFT_PREFIX, "");
String hash = chainUtil.evmTransfer(user.getAddress(),m.getTokenIssueAddr(),Long.valueOf(coinName),orderDetail.getNumber().longValue());
String hash = chainUtil.evmTransfer(user.getAddress(), m.getTokenIssueAddr(), Long.valueOf(coinName), orderDetail.getNumber().longValue());
UserAssetRecord userAssetRecord = new UserAssetRecord();
userAssetRecord.setUid(order.getUid());
userAssetRecord.setAmount(new BigDecimal(orderDetail.getNumber()));
......@@ -1083,10 +1093,10 @@ public class OrderServiceImpl extends ServiceImpl<OrderMapper, Order> implements
delivery.setNote(orderDetail.getNote());
delivery.setDeliveryState(0);
list.add(delivery);
}else{
} else {
String json = orderDetail.getSerialNo();
JSONArray array = JSON.parseArray(json);
for (Object o:array) {
for (Object o : array) {
//打币
UserAsset coin = userAssetService.getCoin(order.getUid(), o.toString());
if (coin == null) {
......@@ -1100,7 +1110,7 @@ public class OrderServiceImpl extends ServiceImpl<OrderMapper, Order> implements
} else {
userAssetService.addCoin(coin.getId(), new BigDecimal(orderDetail.getNumber()));
}
String hash = chainUtil.evmTransfer(user.getAddress(),m.getTokenIssueAddr(),Long.valueOf(o.toString()),1);
String hash = chainUtil.evmTransfer(user.getAddress(), m.getTokenIssueAddr(), Long.valueOf(o.toString()), 1);
UserAssetRecord userAssetRecord = new UserAssetRecord();
userAssetRecord.setUid(order.getUid());
userAssetRecord.setAmount(new BigDecimal(orderDetail.getNumber()));
......@@ -1186,11 +1196,11 @@ public class OrderServiceImpl extends ServiceImpl<OrderMapper, Order> implements
List<Long> noList = JSON.parseArray(no, Long.class);
SkuVo skuVo = goodSkuService.getSkuVoBySkuId(orderDetail.getSkuId());
String serialNo = skuService.getSerialNo(skuVo.getCommodityPassId());
if(!StringUtil.isNullOrEmpty(serialNo)){
if (!StringUtil.isNullOrEmpty(serialNo)) {
List<Long> serialNoList = JSON.parseArray(serialNo, Long.class);
serialNoList.addAll(noList);
Collections.sort(serialNoList);
skuService.updateSerialNo(JSON.toJSONString(serialNoList),skuVo.getCommodityPassId());
skuService.updateSerialNo(JSON.toJSONString(serialNoList), skuVo.getCommodityPassId());
}
}
}
......@@ -1254,7 +1264,7 @@ public class OrderServiceImpl extends ServiceImpl<OrderMapper, Order> implements
public String createPreSaleOrder(String uid, PreSaleOrderVo preSaleOrderVo) {
SkuVo skuVo = goodSkuService.getSkuVoBySkuId(preSaleOrderVo.getSkuId());
PreSale preSale = preSaleService.getByGoodsId(skuVo.getGoodsId());
int i = goodSkuService.delStock(preSaleOrderVo.getSkuId(), preSaleOrderVo.getNumber());
int i = goodSkuService.delStock(preSaleOrderVo.getSkuId(), preSaleOrderVo.getNumber(), skuVo.getUpdateTime());
if (i != 1) {
throw new RuntimeException("库存不足!!!");
}
......@@ -1359,47 +1369,279 @@ public class OrderServiceImpl extends ServiceImpl<OrderMapper, Order> implements
return null;
}
/**
* 盲盒下单
*
* @param uid 当前用户uid
* @param type type(2.APP 3.PC 4.微信小程序)
* @param orderVo
* @return
*/
@Override
public String blindBoxCreateOrder(String uid, Integer type, OrderBlindBoxVo orderVo) {
/**
* 1.根据算法,获取本次下单的对应的盲盒sku信息(sku基本信息+快递模板id),生成订单详情order_detail
*/
SkuVo skuVo = orderBindBoxService.genRandomSku(orderVo.getGoodsId());
String oid = OrderUtil.getOid();
OrderDetail orderDetail = saveOrderDetail(skuVo, oid);
/**
* 2.记录本次下单的sku的数量和规格信息,计算邮费
*/
BigDecimal postFee = BigDecimal.ZERO;
if (orderVo.getDelivery().equals(OrderBlindBoxVo.DELIVERY_IMMEDIATELY)) {
postFee = sumPostFee(skuVo, orderVo, orderDetail);
}
/**
* 3.计算本次下单可享受的促销优惠:优惠券+促销活动
*/
List<OrderSkuVo> orderSkuVoList = new ArrayList<>();
OrderSkuVo orderSkuVo = new OrderSkuVo();
orderSkuVo.setSkuId(skuVo.getSkuId());
orderSkuVo.setNum(orderDetail.getNumber());
BigDecimal promotionDiscountAmount = sumPromotionDiscount(skuVo, orderSkuVoList, type, oid);
/**
* 优惠券
*/
BigDecimal couponDiscountAmount = sumCouponDiscount(uid, type, orderVo.getGoodsIdCouponIdList(), orderSkuVoList, skuVo.getMerchantId(), oid);
/**
* 4.最终支付时,扣除用于抵扣的积分并生成积分抵扣记录
*/
String payId = OrderUtil.getPayId();
BigDecimal skuAmount = skuVo.getBlindBoxprice().multiply(GoodMainConst.BLIND_BOX_ORDER_SKU_NUM_BIGDECIMAL);
BigDecimal discountAmount = promotionDiscountAmount.add(couponDiscountAmount);
BigDecimal payableAmount = BigDecimal.ZERO;
payableAmount = payableAmount.add(skuAmount).add(postFee).subtract(discountAmount)
.compareTo(BigDecimal.ZERO) == CommonConst.BIEDICIMAL_LEFT_LESS ? BigDecimal.ZERO : payableAmount;
BigDecimal integralDeductionNum = saveIntegralRecord(payableAmount, orderVo, uid, payId);
/**
* 5.生成支付单order_pay和订单order_info
*/
saveOrderInfo(payId, oid, uid, skuVo.getMerchantId(), skuAmount, discountAmount, postFee, integralDeductionNum, orderVo);
saveOrderPay(payId, oid, orderVo.getCoin(), integralDeductionNum, uid, payableAmount);
return payId;
}
/**
* 生成订单信息 order_info
* @param payId
* @param oid
* @param uid
* @param merchantId
* @param skuAmount 商品总价
* @param discountAmount 促销活动优惠金额 + 优惠券优惠金额
* @param postFee 运费
* @param integralDeductionNum 积分抵扣的金额
* @param orderVo
*/
private void saveOrderInfo(String payId, String oid, String uid, String merchantId, BigDecimal skuAmount,
BigDecimal discountAmount, BigDecimal postFee, BigDecimal integralDeductionNum, OrderBlindBoxVo orderVo) {
Order order = new Order();
order.setOid(oid);
order.setUid(uid);
order.setPayId(payId);
order.setMerchantId(merchantId);
order.setTotal(skuAmount);
order.setOrderType(OrderTypeEnum.GENERAL.getType());
order.setDelivery(orderVo.getDelivery());
order.setUname(orderVo.getUname());
order.setPhone(orderVo.getPhone());
order.setAddress(orderVo.getAddress());
order.setVNote(orderVo.getVNote());
order.setPostFee(postFee);
order.setDiscountAmount(discountAmount);
BigDecimal amount = skuAmount.add(postFee).subtract(discountAmount).subtract(integralDeductionNum);
amount = amount.compareTo(BigDecimal.ZERO) == CommonConst.BIEDICIMAL_LEFT_LESS ? BigDecimal.ZERO : amount;
order.setAmount(amount);
order.setOrderState(OrderStateEnum.ORDER_STATE_TO_PAY.getState());
orderMapper.insert(order);
}
/**
* 生成支付单信息
* @param payId
* @param oid
* @param coin 用于抵扣的积分名称
* @param integralDeductionNum 用于抵扣的积分数量
* @param uid
* @param payableAmount 剩余未支付的金额
*/
private void saveOrderPay(String payId, String oid, String coin, BigDecimal integralDeductionNum, String uid, BigDecimal payableAmount) {
Pay pay = new Pay();
pay.setPayId(payId);
/**
* 一幕不存在积分抵扣
* pay.setCoin(coin);
* pay.setIntegralDeduction(integralDeductionNum);
*/
pay.setUid(uid);
pay.setState(OrderPayStateEnum.PAY_STATE_TO_PAY.getState());
pay.setTotal(payableAmount);
pay.setPaidAmount(BigDecimal.ZERO);
pay.setUnpaidAmount(payableAmount);
pay.setPayType(OrderPayTypeEnum.INTEGRAL.getType());
JSONArray oidsJsonArray = new JSONArray();
oidsJsonArray.add(oid);
pay.setOidsJson(oidsJsonArray.toJSONString());
payService.save(pay);
}
/* private String tranCoinAndNft(String skuId,String from,String to,BigDecimal number,int goodsType,String coin) {
//商品通证(0.否 1.是,自动生成Token 2.是,使用外部既有Token)
int commodity = spuService.getCommodityBySkuId(skuId);
if(goodsType == 1||goodsType == 2){
if(commodity == 1){
return chainUtil.tranToken(from,"",to,number,coin);
}else if(commodity == 2){
Long trueCoin = skuService.getTrueCoin(coin);
long [] a = new long[]{trueCoin};
long [] b = new long[]{number.longValue()};
return chainUtil.evmExec(a,b,from,to);
/**
* 最终支付时,扣除用于抵扣的积分并生成积分抵扣记录
*
* @param payableAmount 订单待付金额 = sku总价(单价*数量) + 运费 - 促销活动优惠金额 - 优惠券优惠金额
* @param orderVo
* @param uid
* @param payId
* @return 用于抵扣的积分数量
*/
private BigDecimal saveIntegralRecord(BigDecimal payableAmount, OrderBlindBoxVo orderVo, String uid, String payId) {
BigDecimal result = BigDecimal.ZERO;
if (payableAmount.compareTo(BigDecimal.ZERO) == CommonConst.BIEDICIMAL_EQUAL_RESULT) {
return result;
}
boolean coinAvilable = StringUtils.isNotBlank(orderVo.getCoin()) && orderVo.getCoinNumber() != null
&& orderVo.getCoinNumber().compareTo(BigDecimal.ZERO) == CommonConst.BIEDICIMAL_LEFT_GREATER;
if (coinAvilable) {
BigDecimal price = merchantService.getPrice(orderVo.getCoin());
if (price == null || price.compareTo(BigDecimal.ZERO) != CommonConst.BIEDICIMAL_LEFT_GREATER) {
throw new RuntimeException("COIN_NOT_USEFUL");
}
}else if(goodsType == 6){
if(commodity == 1){
String coinName = coin.replace(MALLGlobalConfig.GOODS_NFT_PREFIX, "");
return chainUtil.evmTransfer(to,from,Long.valueOf(coinName),number.longValue());
}else if(commodity == 2){
return chainUtil.evmTransfer(to,from,Long.valueOf(coin),number.longValue());
}else if(commodity == 3){
int saleType = spuService.getNftSalesType(skuId);
if(saleType ==1){
return chainUtil.evmTransfer(to,from,Long.valueOf(coin),number.longValue());
}else{
Long tokenId = skuService.getTokenId(skuId);
String json = skuService.getSerialNo(tokenId);
JSONArray array = JSON.parseArray(json);
for(int i = 1;i<=number.intValue();i++){
for (int j = 1;j<=array.size();j++) {
if(array.getInteger(j)==1){
String coinName = tokenId+""+j;
chainUtil.evmTransfer(to,from,Long.valueOf(coinName),1);
}
}
}
}
/**
* 余额全部用积分抵扣需要的积分数量
*/
BigDecimal avilableNum = payableAmount.divide(price, 2, RoundingMode.UP);
result = avilableNum.compareTo(orderVo.getCoinNumber()) == CommonConst.BIEDICIMAL_LEFT_GREATER ? orderVo.getCoinNumber() : avilableNum;
payableAmount = payableAmount.subtract(orderVo.getCoinNumber().multiply(price).setScale(2, RoundingMode.DOWN))
.compareTo(BigDecimal.ZERO) == CommonConst.BIEDICIMAL_LEFT_GREATER ? payableAmount : BigDecimal.ZERO;
saveUserAssetRecord(uid, orderVo, result, payId);
}
return result;
}
/**
* 生成积分抵扣记录
*
* @param uid
* @param orderVo
* @param avilableNum 可用于抵扣的积分数量
*/
private void saveUserAssetRecord(String uid, OrderBlindBoxVo orderVo, BigDecimal avilableNum, String payId) {
//扣除积分
UserAsset coin = userAssetService.getCoin(uid, orderVo.getCoin());
int i = userAssetService.useToFrozen(coin.getId(), avilableNum, coin.getUpdateTime(), System.currentTimeMillis());
if (i == 1) {
//生成积分抵扣记录
UserAssetRecord assetRecord = new UserAssetRecord();
assetRecord.setFlowId(OrderUtil.getFlowId());
assetRecord.setUid(uid);
assetRecord.setCoin(orderVo.getCoin());
assetRecord.setType(AssetRecordTypeEnum.INTEGRAL_DEDUCTION.getType());
assetRecord.setAmount(avilableNum);
assetRecord.setStatus(3);
assetRecord.setOtherSide("平台");
assetRecord.setHash("");
assetRecord.setNote(payId);
userAssetRecordService.save(assetRecord);
} else {
throw new RuntimeException("COIN_NOT_ENOUGH");
}
}
/**
* 优惠券使用
*
* @param uid
* @param type
* @param goodsIdCouponIdList
* @param orderSkuVoList
* @param merchantId
* @param oid
*/
private BigDecimal sumCouponDiscount(String uid, Integer type, List<String> goodsIdCouponIdList, List<OrderSkuVo> orderSkuVoList, String merchantId, String oid) {
BigDecimal result = BigDecimal.ZERO;
if (CollectionUtils.isEmpty(goodsIdCouponIdList)) {
return result;
}
Map<String, BigDecimal> merchantCoupon;
try {
merchantCoupon = marketingCouponService.getCoupon(uid, goodsIdCouponIdList, orderSkuVoList, type);
} catch (Exception e) {
throw new RuntimeException("存在无效优惠券!!!");
}
Set<String> merchantIdSet = merchantCoupon.keySet();
if (CollectionUtils.isEmpty(merchantIdSet)) {
merchantIdSet.add(merchantId);
}
for (String merchId : merchantIdSet) {
if (merchantCoupon.get(merchId) != null) {
result = merchantCoupon.get(merchId);
GoodsCoupon goodsCoupon = new GoodsCoupon();
goodsCoupon.setCouponId("");
goodsCoupon.setGoodsId("");
goodsCoupon.setAmount(result);
goodsCoupon.setOid(oid);
goodsCoupon.setUid(uid);
goodsCouponService.save(goodsCoupon);
}
}
return "";
}*/
return result;
}
/**
* 计算本次下单可享受的促销优惠金额:优惠券+促销活动
*
* @param skuVo
* @param orderSkuVoList
* @param type
* @param oid
* @return 可优惠的金额
*/
private BigDecimal sumPromotionDiscount(SkuVo skuVo, List<OrderSkuVo> orderSkuVoList, Integer type, String oid) {
return marketingPromotionService.promotion(skuVo.getMerchantId(), orderSkuVoList, type, oid);
}
/**
* 计算邮费
*
* @param skuVo
* @param orderVo
* @param orderDetail
* @return
*/
private BigDecimal sumPostFee(SkuVo skuVo, OrderBlindBoxVo orderVo, OrderDetail orderDetail) {
BigDecimal merchantGoodWeight = skuVo.getWeight().multiply(GoodMainConst.BLIND_BOX_ORDER_SKU_NUM_BIGDECIMAL);
BigDecimal result = distributionTemplateService.getPrice(skuVo.getTemplateId(), orderVo.getProvince(), BigDecimal.ZERO, orderDetail.getNumber(), merchantGoodWeight);
if (result.compareTo(CommonConst.NEGATIVE_ONE) == CommonConst.BIEDICIMAL_EQUAL_RESULT) {
throw new RuntimeException("当前地区不支持快递");
}
return result;
}
/**
* 生成订单详情order_detail
*
* @param skuVo
* @param oid
*/
private OrderDetail saveOrderDetail(SkuVo skuVo, String oid) {
OrderDetail orderDetail = new OrderDetail();
orderDetail.setOid(oid);
orderDetail.setGoodsId(skuVo.getGoodsId());
orderDetail.setSkuId(skuVo.getSkuId());
orderDetail.setCoin(skuVo.getCoinName());
orderDetail.setName(skuVo.getName());
orderDetail.setNumber(GoodMainConst.BLIND_BOX_ORDER_SKU_NUM);
orderDetail.setAmount(skuVo.getBlindBoxprice());
orderDetailService.save(orderDetail);
return orderDetail;
}
}
......@@ -7,4 +7,15 @@
from goods_sku
where goods_id = #{goodsId}
</select>
<select id="listAvailableSku" resultType="com.fzm.mall.server.front.goods.model.vo.SkuVo">
select sk.*, sp.difficulty, sp.merchant_id, sp.blind_box_price as blindBoxprice
from goods_sku sk
left join goods_spu sp on sk.goods_id = sp.goods_id
where sk.goods_id = #{goodsId} and sk.status = '1' and sk.stock > 0
</select>
<update id="delStock">
update goods_sku set stock =stock - #{num} where sku_id = #{skuId} and stock >= #{num} and update_time = #{updateTime}
</update>
</mapper>
......@@ -2,4 +2,9 @@
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="com.fzm.mall.server.front.merchant.mapper.MerchantMapper">
<select id="getPrice" resultType="decimal">
select price
from merchant_integral
where label = #{coin}
</select>
</mapper>
......@@ -58,4 +58,5 @@ NOT_SUPPORT_BUY_MYSELF=\u6682\u4E0D\u652F\u6301\u81EA\u5DF1\u4E70\u81EA\u5DF1\u7
ONLY_SUPPORT_MAIL=\u5F53\u524D\u5546\u54C1\u4EC5\u652F\u6301\u63D0\u8D27
RECORD_EXIST=\u76F8\u5173\u4EA4\u6613\u8BB0\u5F55\u5DF2\u5B58\u5728\uFF0C\u53D6\u6D88\u5931\u8D25
ADDR_INVALID=\u65E0\u6548\u5730\u5740
SEND_CODE_ERR=\u77ED\u4FE1\u53D1\u9001\u5931\u8D25\uFF0C\u8BF7\u91CD\u8BD5
\ No newline at end of file
SEND_CODE_ERR=\u77ED\u4FE1\u53D1\u9001\u5931\u8D25\uFF0C\u8BF7\u91CD\u8BD5
HOT_ACTIVITY=\u6D3B\u52A8\u592A\u8FC7\u706B\u7206\uFF0C\u8BF7\u7A0D\u540E\u518D\u8BD5
\ No newline at end of file
package com.fzm.mall.server.front;
import lombok.Builder;
import lombok.Data;
import java.util.ArrayList;
import java.util.Collections;
import java.util.List;
import java.util.concurrent.ThreadLocalRandom;
/**
* @author lyz
* @mail lyz@disanbo.com
* @create 2022/2/10 14:20
* @description
*/
public class BlindBoxTest {
public static void main(String[] args) {
ProdItem prod1 = ProdItem.builder().prodId("111111").isHidden(false).build();
ProdItem prod2 = ProdItem.builder().prodId("222222").isHidden(false).build();
ProdItem prod3 = ProdItem.builder().prodId("333333").isHidden(false).build();
ProdItem prod4 = ProdItem.builder().prodId("444444").isHidden(false).build();
ProdItem prod5 = ProdItem.builder().prodId("555555").isHidden(true).build();
ProdItem prod6 = ProdItem.builder().prodId("666666").isHidden(false).build();
List<ProdItem> prodList = new ArrayList<>();
prodList.add(prod1);
prodList.add(prod6);
prodList.add(prod3);
prodList.add(prod2);
prodList.add(prod5);
prodList.add(prod4);
System.out.println(genRandomProd(prodList, 1));
}
/**
* @descprition 随机获得产品
* @author lyz
* @create 2022/2/14 9:42
* @param prodList 从数据库获取的库存大于0的盲盒产品列表
* @param difficulty 正整数[1,10]
* @return 随机产品编号
*/
public static String genRandomProd(List<ProdItem> prodList, int difficulty){
int hiddenWeight = difficulty == 10 ? 1 : (10 - difficulty);
List<String> baseList = new ArrayList<>();
for(ProdItem prodItem : prodList){
if(prodItem.isHidden){
for(int i=0;i<hiddenWeight;i++){
baseList.add(prodItem.prodId);
}
}else{
for(int i=0;i<difficulty;i++){
baseList.add(prodItem.prodId);
}
}
}
//为了增加随机度,可以打开
//Collections.shuffle(baseList);
int base = baseList.size();
int randomNum = ThreadLocalRandom.current().nextInt(base);
return baseList.get(randomNum);
}
@Data
@Builder
static class ProdItem {
private String prodId;
private boolean isHidden;
}
}
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment