Commit 37d1cf30 authored by shiyu's avatar shiyu

Merge branch 'quanku_v1.9'

parents 70f5aa27 025bd5ad
......@@ -119,6 +119,7 @@ public class ShiroConfig {
filterChainDefinitionMap.put("/admin/sysIMRecord/**", "anon");
filterChainDefinitionMap.put("/admin/consignSaleManage/**", "anon");
filterChainDefinitionMap.put("/admin/returnOrderManage/**", "anon");
filterChainDefinitionMap.put("/admin/supplierItem/**", "anon");
filterChainDefinitionMap.put("/admin/invitationCode/**", "anon");
// filterChainDefinitionMap.put("/admin/**", "anon");
......
package com.wwdz.ch.admin.controller;
import com.alibaba.fastjson.JSON;
import com.wwdz.ch.admin.service.SysIMService;
import com.wwdz.ch.admin.service.SysSupplierItemService;
import com.wwdz.ch.core.consts.ResultCode;
import com.wwdz.ch.core.type.Result;
import com.wwdz.ch.db.dto.request.distribution.SupplierItemRequestDto;
import com.xxdxxs.service.FormHandler;
import com.xxdxxs.validation.Validator;
import io.swagger.annotations.ApiOperation;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
@RestController
@RequestMapping("/admin/supplierItem")
public class SysSupplierItemController {
private static final Logger logger = LoggerFactory.getLogger(SysSupplierItemController.class);
@Autowired
SysSupplierItemService sysSupplierItemService;
@ApiOperation(value = "新增商品")
@PostMapping("/create")
public Result create(@RequestBody SupplierItemRequestDto dto) {
logger.info("新增商品,请求参数:{}", JSON.toJSONString(dto));
Validator validator = new Validator(FormHandler.ofEntity(dto));
validator.set("name", "商品名称").must().string()
.set("distributionPrice", "商品供货价").must().string()
.set("type", "商品类型").must().number()
.set("buyLimitNum", "限购数量").must().number()
.end();
if (!validator.isValid()) {
return Result.failed(validator.getErrorInfo());
}
return sysSupplierItemService.create(dto);
}
@ApiOperation(value = "编辑商品")
@PostMapping("/update")
public Result update(@RequestBody SupplierItemRequestDto dto) {
logger.info("编辑商品,请求参数:{}", JSON.toJSONString(dto));
if (dto.getId() == null) {
return Result.failed(ResultCode.PARAM_ERROR);
}
return sysSupplierItemService.update(dto);
}
@ApiOperation(value = "查询商品列表")
@PostMapping("/findList")
public Result findList(@RequestBody SupplierItemRequestDto dto) {
logger.info("查询商品列表,请求参数:{}", JSON.toJSONString(dto));
return sysSupplierItemService.findList(dto);
}
@ApiOperation(value = "查询商品详情")
@PostMapping("/findDetail")
public Result findDetail(@RequestBody SupplierItemRequestDto dto) {
logger.info("查询商品详情,请求参数:{}", JSON.toJSONString(dto));
if (dto.getId() == null) {
return Result.failed(ResultCode.PARAM_ERROR);
}
return sysSupplierItemService.findDetail(dto);
}
@ApiOperation(value = "商品上下架")
@PostMapping("/updateOnSale")
public Result updateOnSale(@RequestBody SupplierItemRequestDto dto) {
logger.info("商品上下架,请求参数:{}", JSON.toJSONString(dto));
if (dto.getId() == null || dto.getIsOnSale() == null) {
return Result.failed(ResultCode.PARAM_ERROR);
}
return sysSupplierItemService.updateOnSale(dto);
}
@ApiOperation(value = "删除商品")
@PostMapping("/delete")
public Result delete(@RequestBody SupplierItemRequestDto dto) {
logger.info("删除商品,请求参数:{}", JSON.toJSONString(dto));
if (dto.getId() == null) {
return Result.failed(ResultCode.PARAM_ERROR);
}
return sysSupplierItemService.delete(dto);
}
}
......@@ -67,7 +67,7 @@ public class SynItemToEsJob {
/**
* 隔2分钟运行一次
*/
@Scheduled(fixedDelay = 1000 * 60 * 2)
// @Scheduled(fixedDelay = 1000 * 60 * 2)
public void execute() {
RLock lock = redissonClient.getLock(QUANKU_SYN_TO_ES_TASK_KEY);
if (!lock.tryLock()) {
......
package com.wwdz.ch.admin.service;
import com.wwdz.ch.core.type.Result;
import com.wwdz.ch.db.dto.request.distribution.SupplierItemRequestDto;
public interface SysSupplierItemService {
/**
* 新增商品
* @param dto
* @return
*/
Result create(SupplierItemRequestDto dto);
/**
* 查询供应商商品列表
* @param dto
* @return
*/
Result findList(SupplierItemRequestDto dto);
/**
* 查询供应商商品详情
* @param dto
* @return
*/
Result findDetail(SupplierItemRequestDto dto);
/**
* 编辑更新
* @param dto
* @return
*/
Result update(SupplierItemRequestDto dto);
/**
* 上下架
* @param dto
* @return
*/
Result updateOnSale(SupplierItemRequestDto dto);
/**
* 删除商品
* @param dto
* @return
*/
Result delete(SupplierItemRequestDto dto);
}
package com.wwdz.ch.core.api;
import com.wwdz.ch.core.entity.AbstractSubscribeMsg;
import com.wwdz.ch.core.entity.ConsignSaleSubscribeMsg;
import com.wwdz.ch.core.util.OkHttpUtil;
import com.wwdz.ch.core.util.RedisUtils;
......@@ -23,7 +22,6 @@ public class OfficialAccountApi {
private static final Logger logger = LoggerFactory.getLogger(OfficialAccountApi.class);
private final static String GET_USER_BASE_INFO_URL = "https://api.weixin.qq.com/cgi-bin/user/info?lang=zh_CN";
private final static String SEND_MSG_URL = "https://api.weixin.qq.com/cgi-bin/message/template/send";
......
......@@ -305,4 +305,29 @@ public class WxPayServiceApi {
return Result.failed();
}
/**
* 微信支付关闭订单
* @param dto
* @return
*/
public Result closeOrder(DistributionOrderRequestDto dto){
try {
//请求微信支付相关配置
JsapiServiceExtension service = new JsapiServiceExtension.Builder()
.config(rsaAutoCertificateConfig)
.signType("RSA") // 不填默认为RSA
.build();
CloseOrderRequest request = new CloseOrderRequest();
request.setOutTradeNo(dto.getDistributionOrderId());
request.setMchid(wxPayProperties.getMerchantId());
service.closeOrder(request);
return Result.success();
}catch (Exception e){
logger.error("微信支付关闭订单错误error : {}", e);
}
return Result.failed();
}
}
......@@ -32,6 +32,11 @@ public interface CommConsts {
*/
public static final String UPLOAD_PRE_WXACODE_DIRECTORY = "quanku/wxacode/";
/**
* 拍卖出价的锁
*/
public static final String AUCTION_LOCK_KEY_PRE = "AUCTION:OFFER:";
}
......@@ -82,4 +82,118 @@ public class DistributionEnum {
}
/**
* 分销类型
*/
public enum DistributionTypeEnum {
FIXED_PRICE(1, "一口价"),
AUCTION(2, "竞拍"),
;
private int code;
private String des;
DistributionTypeEnum(int code, String des) {
this.code = code;
this.des = des;
}
public static String getNameByCode(int code) {
for (DistributionTypeEnum distributionTypeEnum : DistributionTypeEnum.values()) {
if (code == distributionTypeEnum.getCode()) {
return distributionTypeEnum.getDes();
}
}
return null;
}
public int getCode() {
return code;
}
public String getDes() {
return des;
}
}
/**
* 竞拍状态
*/
public enum AuctionStateEnum {
NOT_START(1, "未开拍"),
IN_AUCTION(2, "拍卖中"),
END(3, "已截拍")
;
private int code;
private String des;
AuctionStateEnum(int code, String des) {
this.code = code;
this.des = des;
}
public static String getNameByCode(int code) {
for (AuctionStateEnum auctionStateEnum : AuctionStateEnum.values()) {
if (code == auctionStateEnum.getCode()) {
return auctionStateEnum.getDes();
}
}
return null;
}
public int getCode() {
return code;
}
public String getDes() {
return des;
}
}
/**
* 竞拍状态
*/
public enum AuctionUserStateEnum {
PROCESS(1, "出价"),
LEAD(2, "已领先"),
PRE_PAY(3, "立即支付"),
END(4, "竞拍结束")
;
private int code;
private String des;
AuctionUserStateEnum(int code, String des) {
this.code = code;
this.des = des;
}
public static String getNameByCode(int code) {
for (AuctionUserStateEnum auctionUserStateEnum : AuctionUserStateEnum.values()) {
if (code == auctionUserStateEnum.getCode()) {
return auctionUserStateEnum.getDes();
}
}
return null;
}
public int getCode() {
return code;
}
public String getDes() {
return des;
}
}
}
package com.wwdz.ch.wx.entity.vo.distribution;
package com.wwdz.ch.core.entity;
import com.wwdz.ch.core.util.PriceUtil;
import com.xxdxxs.entity.Entity;
......@@ -101,8 +101,68 @@ public class SupplierItemVo implements Entity {
*/
private String shareId;
/**
* 商品售出的数量
*/
private Long selledNum;
/**
* 是否限购
*/
private Boolean isLimitBuy = true;
/**
* 限购数量
*/
private Integer buyLimitNum;
/**
* 商品类型1一口价2竞拍
*/
private Integer type;
/**
* 分销商是否购买过
*/
private Boolean shopBought;
/**
* 竞拍开始时间
*/
private Date auctionStartTime;
/**
* 竞拍结束时间
*/
private Date auctionEndTime;
/**
* 起拍价
* 单位元 需要转为分
*/
private String startPrice;
/**
* 加价幅度
* 单位元 需要转为分
*/
private String addExtent;
/**
* 实际竞拍结束时间
*/
private Date realEndTime;
/**
* 是否可编辑
*/
private Boolean editAble;
/**
* 针对竞拍品
* 最新价格
*/
private String currentPrice;
}
package com.wwdz.ch.core.notify;
import com.aliyun.dysmsapi20170525.models.SendSmsResponse;
import com.wwdz.ch.core.type.Result;
import com.wwdz.ch.core.util.CacheUtil;
import com.wwdz.ch.db.domain.User;
import com.xxdxxs.utils.JsonUtils;
import com.xxdxxs.utils.StringUtils;
import lombok.extern.slf4j.Slf4j;
import okhttp3.Cache;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Service;
......@@ -29,6 +35,9 @@ public class AliSmsSender implements SmsSender {
@Value("${dts.notify.alisms.templateCode}")
private String templateCode;
@Autowired
CacheUtil cacheUtil;
//短信API产品名称(短信产品名固定,无需修改)
final String product = "Dysmsapi";
......@@ -82,4 +91,42 @@ public class AliSmsSender implements SmsSender {
}
}
public Result sendAuctionWithTemplate(long userId, String msg) {
try {
User user = cacheUtil.getAppletUsers(userId);
if (user == null) {
logger.error("======== userId:{},用户信息为空不能发送短信 ========", userId);
return Result.failed("用户信息为空");
}
String phone = user.getMobile();
if (StringUtils.isEmpty(phone)) {
logger.error("======== userId:{},手机号为空不能发送短信 ========", userId);
return Result.failed("手机号为空");
}
Map<String, Object> map = new HashMap<>();
map.put("msg", msg);
logger.info("拍卖通知发送内容 : {} ", msg);
com.aliyun.dysmsapi20170525.Client client = createClient();
com.aliyun.dysmsapi20170525.models.SendSmsRequest sendSmsRequest = new com.aliyun.dysmsapi20170525.models.SendSmsRequest()
.setPhoneNumbers(phone)
.setTemplateCode(templateCode)
.setTemplateParam(JsonUtils.fromMap(map))
.setSignName("玩物得志");
SendSmsResponse sendSmsResponse = client.sendSmsWithOptions(sendSmsRequest, new com.aliyun.teautil.models.RuntimeOptions());
logger.info("拍卖通知发送结果 : {} ", JsonUtils.from(sendSmsResponse));
if ("OK".equals(sendSmsResponse.getBody().code)) {
return Result.success();
}
} catch (Exception e) {
logger.error("AliSmsSender.sendWithTemplate(),userId={}, error:{}",userId, e);
}
return Result.failed();
}
public static void main(String[] args) {
}
}
......@@ -164,6 +164,20 @@ public class CacheUtil {
return map.get(key);
}*/
/**
* 查询小程序用户手机号
*
* @return
*/
public String getAppletUserPhoneList(long key) {
User user = dtsUserDao.findById(key);
return user.getMobile();
/* List<User> userList = dtsUserDao.findAll();
Map<Long, String> map = userList.stream().collect(Collectors.toMap(User::getId, User::getNickname, (k1, k2) -> k2));
return map.get(key);*/
}
/**
* 查询小程序会员
......
......@@ -26,6 +26,8 @@ public class PriceUtil {
return bigDecimal.longValue();
}
public static Integer convertPriceFromStrToInt(String price){
BigDecimal bigDecimal = new BigDecimal(price);
bigDecimal = bigDecimal.multiply(new BigDecimal(100));
......@@ -53,6 +55,9 @@ public class PriceUtil {
DecimalFormat df = new DecimalFormat("#0.00");
String a = df.format(bigDecimal);
System.out.println(new BigDecimal(a).stripTrailingZeros().toPlainString());
System.out.println("+++++++" + convertPriceFromStr("0"));
}
......
......@@ -6,6 +6,10 @@ import org.springframework.util.StringUtils;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;
import java.util.Map;
import java.util.concurrent.ConcurrentHashMap;
import java.util.function.Function;
import java.util.function.Predicate;
import java.util.stream.IntStream;
public class StringUtil {
......@@ -43,5 +47,9 @@ public class StringUtil {
return numberArray;
}
public static <T> Predicate<T> distinctByKey(Function<? super T, ?> keyExtractor) {
Map<Object,Boolean> seen = new ConcurrentHashMap<>();
return t -> seen.putIfAbsent(keyExtractor.apply(t), Boolean.TRUE) == null;
}
}
......@@ -21,6 +21,8 @@ dts:
msg-url: pages/consignNodeDetail/index
#分销业务,公众号消息点击后跳转到小程序页面的链接
distribution-msg-url: pages/saleOrderDetail/index
#分销拍卖业务,众号消息点击后跳转到小程序页面的链接
auction-msg-url: pages/saleAuctionDetail/index
# 商户证书文件路径
# 请参考“商户证书”一节 https://pay.weixin.qq.com/wiki/doc/api/wxa/wxa_api.php?chapter=4_3
......
......@@ -13,6 +13,8 @@ dts:
msg-url: pages/consignNodeDetail/index
#分销业务,公众号消息点击后跳转到小程序页面的链接
distribution-msg-url: pages/saleOrderDetail/index
#分销拍卖业务,众号消息点击后跳转到小程序页面的链接
auction-msg-url: pages/saleAuctionDetail/index
# 商户证书文件路径
# 请参考“商户证书”一节 https://pay.weixin.qq.com/wiki/doc/api/wxa/wxa_api.php?chapter=4_3
key-path: xxxxx
......
......@@ -14,4 +14,6 @@ public class DistributionOrderNum implements Entity {
private String stateName;
private Integer num;
private Integer selledNum;
}
package com.wwdz.ch.db.dao.distribution;
import com.wwdz.ch.db.domain.distribution.AuctionConfig;
import java.util.Date;
import java.util.List;
public interface AuctionConfigDao {
/**
* 插入新记录
*
* @param auctionConfig
* @return
*/
int insert(AuctionConfig auctionConfig);
/**
* 更新拍卖配置
*
* @param auctionConfig
* @return
*/
int update(AuctionConfig auctionConfig);
/**
* 根据商品id查询拍卖设置
* @param itemId
* @return
*/
AuctionConfig findByItemId(long itemId);
/**
* 查询截拍时间超过指定时间的拍卖配置
* @param
* @return
*/
List<AuctionConfig> findList(Date startTime, Date endTime);
/**
* 查询截拍后在一小时内的拍卖配置
* @param
* @return
*/
List<AuctionConfig> findEndList();
/**
* 查询超过截拍时间,但状态没有更改为截拍的商品记录
* @param
* @return
*/
List<AuctionConfig> findTimeOutNotValidList();
/**
* 查询一小时内即将截拍的拍卖商品
* @param
* @return
*/
List<AuctionConfig> findAbortEndList();
/**
* 更新截拍时间
* @param itemId
* @param realEndTime
* @return
*/
int updateRealEndTime(long itemId, Date realEndTime);
/**
* 拍卖结束
* @param itemId
* @return
*/
int setEnd(long itemId);
/**
* 拍卖配置更新为有效
* @param itemId
* @return
*/
int setValid(long itemId);
/**
* 拍卖配置更新为已处理
* @param itemId
* @return
*/
int setDeal(long itemId);
}
package com.wwdz.ch.db.dao.distribution;
import com.wwdz.ch.db.domain.distribution.AuctionRecord;
import com.wwdz.ch.db.dto.request.distribution.AuctionRecordRequestDto;
import java.util.Date;
import java.util.List;
public interface AuctionRecordDao {
/**
* 插入新记录
*
* @param auctionRecord
* @return
*/
int insert(AuctionRecord auctionRecord);
/**
* 更新记录
* 价格被反超时,设置islead字段为false
* @param itemId
* @return
*/
int updateNotLead(long itemId);
/**
* 根据主键id更新记录
* 价格被反超时,设置islead字段为false
* @param id
* @return
*/
int updateNotLeadById(int id);
/**
* 查询出价记录
* @param dto
* @return
*/
List<AuctionRecord> find(AuctionRecordRequestDto dto);
/**
* 查询出价记录
* @param dto
* @return
*/
List<AuctionRecord> findByPage(AuctionRecordRequestDto dto);
/**
* 根据商品id查询出价记录
* @param itemId
* @return
*/
List<AuctionRecord> findByItemId(long itemId);
/**
* 查询最新的一条出价记录
* @param itemId
* @return
*/
AuctionRecord findLastedRecord(long itemId);
/**
* 查询用户第一条出价记录
* @param itemId
* @param userId
* @return
*/
AuctionRecord findFirstRecord(long itemId, long userId);
/**
* 统计出价次数
* @param dto
* @return
*/
long count(AuctionRecordRequestDto dto);
/**
* 查询用户出价过的商品
* @param userId
* @param startTime
* @param endTime
* @return
*/
List<AuctionRecord> findRecordByUserId(long userId, Date startTime, Date endTime);
}
......@@ -5,6 +5,7 @@ import com.wwdz.ch.db.domain.distribution.DistributionOrder;
import com.wwdz.ch.db.dto.request.distribution.DistributionOrderRequestDto;
import org.apache.ibatis.annotations.Param;
import java.util.Date;
import java.util.List;
public interface DistributionOrderDao {
......@@ -34,6 +35,15 @@ public interface DistributionOrderDao {
*/
DistributionOrder findById(String distributionOrderId);
/**
* 查询该商品是否生成了订单
* 用于拍卖生成订单判断
* @param itemId
* @return
*/
DistributionOrder findByItemId(long itemId);
/**
* 根据买家id查询
* @param buyerId
......@@ -71,6 +81,16 @@ public interface DistributionOrderDao {
*/
List<DistributionOrder> findByPage(DistributionOrderRequestDto dto);
List<DistributionOrder> findList(Date startTime, Date endTime);
/**
* 统计商品卖出数量
* @param itemId
* @return
*/
Long countSelledNum(long itemId);
/**
* 根据状态统计订单数量
* @param buyerId
......
......@@ -36,6 +36,14 @@ public interface DistributorProfitDao {
*/
DistributorProfit findById(String distributionOrderId);
/**
* 根据分销单号查询
* @param distributionOrderId
* @return
*/
DistributorProfit findByIdOfDistributor(String distributionOrderId, long distributorId);
/**
* 统计分销商卖出的商品数量
*
......
......@@ -11,6 +11,8 @@ import java.util.List;
public interface SupplierItemDao {
long insert(SupplierItem supplierItem);
/**
* 查询商品列表
* @param supplierItemRequestDto
......@@ -35,4 +37,6 @@ public interface SupplierItemDao {
* @return
*/
int updateStock(long itemId, int stock);
}
......@@ -132,4 +132,15 @@ public class DistributionOrderRequestDto extends BaseRequestDto implements Entit
* 退款接口请求秘钥
*/
private String secret;
private Date startTime;
private Date endTime;
/**
* 订单类型
* 1 一口价
* 2 竞价
*/
private Integer type;
}
......@@ -44,6 +44,15 @@ public class DistributorProfitDaoImpl implements DistributorProfitDao {
return distributorProfitMapper.selectOneByExample(example);
}
@Override
public DistributorProfit findByIdOfDistributor(String distributionOrderId, long distributorId) {
DistributorProfitExample example = new DistributorProfitExample();
DistributorProfitExample.Criteria criteria = example.createCriteria();
criteria.andDistributionOrderIdEqualTo(distributionOrderId);
criteria.andDistributorIdEqualTo(distributorId);
return distributorProfitMapper.selectOneByExample(example);
}
@Override
public Long countSellItemNum(long distributorId) {
Long num = distributorProfitMapper.countSellItemNum(distributorId);
......
This diff is collapsed.
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