org.springframework.kafka.core.KafkaTemplate

Here are the examples of the java api org.springframework.kafka.core.KafkaTemplate taken from open source projects. By voting up you can indicate which examples are most useful and appropriate.

273 Examples 7

19 View Source File : SpringKafkaTaskScheduler.java
License : MIT License
Project Creator : zidoshare

/**
 * Spring Kafka Communication Manager
 *
 * @author zido
 */
public clreplaced SpringKafkaTaskScheduler extends AbstractScheduler {

    private String bootstrapServers;

    private String groupId = "Elise";

    private String topicreplacedyzer = "__replacedyzer__";

    private String topicDownload = "__download__";

    private KafkaTemplate<Long, Seed> template;

    private KafkaMessageListenerContainer<Long, Seed> replacedyzerContainer;

    private KafkaMessageListenerContainer<Long, Seed> downloaderContainer;

    public SpringKafkaTaskScheduler setBootstrapServers(String bootstrapServers) {
        this.bootstrapServers = bootstrapServers;
        this.template = createTemplate();
        return this;
    }

    public SpringKafkaTaskScheduler setGroupId(String groupId) {
        this.groupId = groupId;
        return this;
    }

    public SpringKafkaTaskScheduler setTopicreplacedyzer(String topicreplacedyzer) {
        this.topicreplacedyzer = topicreplacedyzer;
        return this;
    }

    public SpringKafkaTaskScheduler setTopicDownload(String topicDownload) {
        this.topicDownload = topicDownload;
        return this;
    }

    @Override
    public synchronized void setResponseProcessor(ResponseProcessor responseProcessor) {
        // TODO not work,and fix this
        // super.setResponseProcessor(responseProcessor);
        if (this.replacedyzerContainer == null) {
            this.replacedyzerContainer = runContainer(topicreplacedyzer, message -> {
                Seed seed = message.value();
                super.onProcess(seed.getTask(), seed.getRequest(), seed.getResponse());
            });
        }
        if (!this.replacedyzerContainer.isRunning()) {
            this.replacedyzerContainer.start();
        }
    }

    public synchronized void setDownloader(Downloader downloader) {
        // TODO not work,and fix this
        // super.setDownloader(downloader);
        if (this.downloaderContainer == null) {
            this.downloaderContainer = runContainer(topicDownload, message -> {
                Seed seed = message.value();
                super.onDownload(seed.getTask(), seed.getRequest());
            });
        }
        if (!this.downloaderContainer.isRunning()) {
            this.downloaderContainer.start();
        }
    }

    private KafkaMessageListenerContainer<Long, Seed> runContainer(String topic, MessageListener<Long, Seed> listener) {
        ContainerProperties containerProps = new ContainerProperties(topic);
        containerProps.setMessageListener(listener);
        KafkaMessageListenerContainer<Long, Seed> tmp = createContainer(containerProps);
        tmp.setBeanName(topic + "message-listener");
        return tmp;
    }

    @Override
    protected void pushWhenNoDuplicate(Task task, Request request) {
        template.send(topicDownload, new Seed().setTask((DefaultTask) task).setRequest(request));
    }

    private KafkaMessageListenerContainer<Long, Seed> createContainer(ContainerProperties containerProps) {
        Map<String, Object> props = consumerProps();
        DefaultKafkaConsumerFactory<Long, Seed> cf = new DefaultKafkaConsumerFactory<>(props);
        return new KafkaMessageListenerContainer<>(cf, containerProps);
    }

    private KafkaTemplate<Long, Seed> createTemplate() {
        Map<String, Object> senderProps = senderProps();
        ProducerFactory<Long, Seed> pf = new DefaultKafkaProducerFactory<>(senderProps);
        return new KafkaTemplate<>(pf, true);
    }

    private Map<String, Object> consumerProps() {
        if (bootstrapServers == null) {
            throw new IllegalArgumentException("bootstrapServers can not be null");
        }
        Map<String, Object> props = new HashMap<>(7);
        props.put(ConsumerConfig.BOOTSTRAP_SERVERS_CONFIG, bootstrapServers);
        props.put(ConsumerConfig.GROUP_ID_CONFIG, groupId);
        props.put(ConsumerConfig.ENABLE_AUTO_COMMIT_CONFIG, true);
        props.put(ConsumerConfig.AUTO_COMMIT_INTERVAL_MS_CONFIG, "100");
        props.put(ConsumerConfig.SESSION_TIMEOUT_MS_CONFIG, "15000");
        props.put(ConsumerConfig.KEY_DESERIALIZER_CLreplaced_CONFIG, LongDeserializer.clreplaced);
        props.put(ConsumerConfig.VALUE_DESERIALIZER_CLreplaced_CONFIG, JsonDeserializer.clreplaced);
        props.put(JsonDeserializer.TRUSTED_PACKAGES, "site.zido.elise.kafka.pojo");
        return props;
    }

    private Map<String, Object> senderProps() {
        if (bootstrapServers == null) {
            throw new IllegalArgumentException("bootstrapServers can not be null");
        }
        Map<String, Object> props = new HashMap<>(7);
        props.put(ProducerConfig.BOOTSTRAP_SERVERS_CONFIG, bootstrapServers);
        props.put(ProducerConfig.RETRIES_CONFIG, 0);
        props.put(ProducerConfig.BATCH_SIZE_CONFIG, 16384);
        props.put(ProducerConfig.LINGER_MS_CONFIG, 1);
        props.put(ProducerConfig.BUFFER_MEMORY_CONFIG, 33554432);
        props.put(ProducerConfig.KEY_SERIALIZER_CLreplaced_CONFIG, LongSerializer.clreplaced);
        props.put(ProducerConfig.VALUE_SERIALIZER_CLreplaced_CONFIG, JsonSerializer.clreplaced);
        props.put(JsonSerializer.ADD_TYPE_INFO_HEADERS, true);
        return props;
    }

    @Override
    public void cancel(boolean ifRunning) {
        if (this.replacedyzerContainer != null && this.replacedyzerContainer.isRunning()) {
            this.replacedyzerContainer.stop();
        }
        if (this.downloaderContainer != null && this.downloaderContainer.isRunning()) {
            this.downloaderContainer.stop();
        }
    }
}

19 View Source File : KafkaSender.java
License : Apache License 2.0
Project Creator : yangyl7239

/**
 */
@Component("kafkaSender")
public clreplaced KafkaSender implements ISender {

    @Value("${adconf.kafka.topic}")
    private String topic;

    private final KafkaTemplate<String, String> kafkaTemplate;

    @Autowired
    public KafkaSender(KafkaTemplate<String, String> kafkaTemplate) {
        this.kafkaTemplate = kafkaTemplate;
    }

    @Override
    public void sender(MySqlRowData rowData) {
        kafkaTemplate.send(topic, JSON.toJSONString(rowData));
    }

    @KafkaListener(topics = { "ad-search-mysql-data" }, groupId = "ad-search")
    public void processMysqlRowData(ConsumerRecord<?, ?> record) {
        Optional<?> kafkaMessage = Optional.ofNullable(record.value());
        if (kafkaMessage.isPresent()) {
            Object message = kafkaMessage.get();
            MySqlRowData rowData = JSON.parseObject(message.toString(), MySqlRowData.clreplaced);
            System.out.println("kafka processMysqlRowData: " + JSON.toJSONString(rowData));
        }
    }
}

19 View Source File : KafkaService.java
License : Apache License 2.0
Project Creator : yanghaiji

/**
 * @author Dylan Yang
 * @Description: KafkaService
 * @replacedle: KafkaService
 * @ProjectName javayh-cloud
 * @date 2019/7/16 23:26
 */
@Slf4j
@Service
public clreplaced KafkaService {

    @Autowired
    private KafkaTemplate kafkaTemplate;

    /**
     * 生产者
     * @param data
     */
    public void send(SysMenu data) {
        ListenableFuture send = kafkaTemplate.send(StaticNumber.JAVAYOHO, data);
        send.addCallback(new ListenableFutureCallback() {

            @Override
            public void onSuccess(Object result) {
                log.info("send success");
            }

            @Override
            public void onFailure(Throwable ex) {
                log.info("send failure");
            }
        });
        log.info("send success");
    }
    // public void sendString(String data){
    // ListenableFuture send = kafkaTemplate.send(StaticNumber.YANGHJ, data);
    // send.addCallback(new ListenableFutureCallback(){
    // @Override
    // public void onSuccess(Object result) {
    // log.info("send success");
    // }
    // @Override
    // public void onFailure(Throwable ex) {
    // log.info("send failure");
    // }
    // });
    // log.info("send success");
    // }
}

19 View Source File : WithdrawController.java
License : Apache License 2.0
Project Creator : xunibidev

/**
 * @author GS
 * @date 2020年01月26日
 */
@RestController
@Slf4j
@RequestMapping(value = "/withdraw", method = RequestMethod.POST)
public clreplaced WithdrawController {

    @Autowired
    private MemberAddressService memberAddressService;

    @Autowired
    private RedisTemplate redisTemplate;

    @Autowired
    private MemberService memberService;

    @Autowired
    private CoinService coinService;

    @Autowired
    private MemberWalletService memberWalletService;

    @Autowired
    private WithdrawRecordService withdrawApplyService;

    @Autowired
    private KafkaTemplate<String, String> kafkaTemplate;

    @Autowired
    private LocaleMessageSourceService sourceService;

    @Autowired
    private MemberTransactionService memberTransactionService;

    /**
     * 增加提现地址
     * @param address
     * @param unit
     * @param remark
     * @param code
     * @param aims
     * @param user
     * @return
     */
    @RequestMapping("address/add")
    @Transactional(rollbackFor = Exception.clreplaced)
    public MessageResult addAddress(String address, String unit, String remark, String code, String aims, @SessionAttribute(SESSION_MEMBER) AuthMember user) {
        hasText(address, sourceService.getMessage("MISSING_COIN_ADDRESS"));
        hasText(unit, sourceService.getMessage("MISSING_COIN_TYPE"));
        hasText(code, sourceService.getMessage("MISSING_VERIFICATION_CODE"));
        hasText(aims, sourceService.getMessage("MISSING_PHONE_OR_EMAIL"));
        ValueOperations valueOperations = redisTemplate.opsForValue();
        Member member = memberService.findOne(user.getId());
        if (member.getMobilePhone() != null && aims.equals(member.getMobilePhone())) {
            Object info = valueOperations.get(SysConstant.PHONE_ADD_ADDRESS_PREFIX + member.getMobilePhone());
            if (info == null || !info.toString().equals(code)) {
                return MessageResult.error(sourceService.getMessage("VERIFICATION_CODE_INCORRECT"));
            } else {
                valueOperations.getOperations().delete(SysConstant.PHONE_ADD_ADDRESS_PREFIX + member.getMobilePhone());
            }
        } else if (member.getEmail() != null && aims.equals(member.getEmail())) {
            Object info = valueOperations.get(SysConstant.ADD_ADDRESS_CODE_PREFIX + member.getEmail());
            if (!info.toString().equals(code)) {
                return MessageResult.error(sourceService.getMessage("VERIFICATION_CODE_INCORRECT"));
            } else {
                valueOperations.getOperations().delete(SysConstant.ADD_ADDRESS_CODE_PREFIX + member.getEmail());
            }
        } else {
            return MessageResult.error(sourceService.getMessage("ADD_ADDRESS_FAILED"));
        }
        MessageResult result = memberAddressService.addMemberAddress(user.getId(), address, unit, remark);
        if (result.getCode() == 0) {
            result.setMessage(sourceService.getMessage("ADD_ADDRESS_SUCCESS"));
        } else if (result.getCode() == 500) {
            result.setMessage(sourceService.getMessage("ADD_ADDRESS_FAILED"));
        } else if (result.getCode() == 600) {
            result.setMessage(sourceService.getMessage("COIN_NOT_SUPPORT"));
        }
        return result;
    }

    /**
     * 删除提现地址
     * @param id
     * @param user
     * @return
     */
    @RequestMapping("address/delete")
    @Transactional(rollbackFor = Exception.clreplaced)
    public MessageResult deleteAddress(long id, @SessionAttribute(SESSION_MEMBER) AuthMember user) {
        MessageResult result = memberAddressService.deleteMemberAddress(user.getId(), id);
        if (result.getCode() == 0) {
            result.setMessage(sourceService.getMessage("DELETE_ADDRESS_SUCCESS"));
        } else {
            result.setMessage(sourceService.getMessage("DELETE_ADDRESS_FAILED"));
        }
        return result;
    }

    /**
     * 提现地址分页信息
     * @param user
     * @param pageNo
     * @param pageSize
     * @param unit
     * @return
     */
    @RequestMapping("address/page")
    public MessageResult addressPage(@SessionAttribute(SESSION_MEMBER) AuthMember user, int pageNo, int pageSize, String unit) {
        Page<MemberAddress> page = memberAddressService.pageQuery(pageNo, pageSize, user.getId(), unit);
        Page<ScanMemberAddress> scanMemberAddresses = page.map(x -> ScanMemberAddress.toScanMemberAddress(x));
        MessageResult result = MessageResult.success();
        result.setData(scanMemberAddresses);
        return result;
    }

    /**
     * 支持提现的地址
     * @return
     */
    @RequestMapping("support/coin")
    public MessageResult queryWithdraw() {
        List<Coin> list = coinService.findAllCanWithDraw();
        List<String> list1 = new ArrayList<>();
        list.stream().forEach(x -> list1.add(x.getUnit()));
        MessageResult result = MessageResult.success();
        result.setData(list1);
        return result;
    }

    /**
     * 提现币种详细信息
     * @param user
     * @return
     */
    @RequestMapping("support/coin/info")
    public MessageResult queryWithdrawCoin(@SessionAttribute(SESSION_MEMBER) AuthMember user) {
        List<Coin> list = coinService.findAllCanWithDraw();
        List<MemberWallet> list1 = memberWalletService.findAllByMemberId(user.getId());
        long id = user.getId();
        List<WithdrawWalletInfo> list2 = list1.stream().filter(x -> list.contains(x.getCoin())).map(x -> WithdrawWalletInfo.builder().balance(x.getBalance()).withdrawScale(x.getCoin().getWithdrawScale()).maxTxFee(x.getCoin().getMaxTxFee()).minTxFee(x.getCoin().getMinTxFee()).minAmount(x.getCoin().getMinWithdrawAmount()).maxAmount(x.getCoin().getMaxWithdrawAmount()).name(x.getCoin().getName()).nameCn(x.getCoin().getNameCn()).threshold(x.getCoin().getWithdrawThreshold()).unit(x.getCoin().getUnit()).accountType(x.getCoin().getAccountType()).canAutoWithdraw(x.getCoin().getCanAutoWithdraw()).addresses(memberAddressService.queryAddress(id, x.getCoin().getName())).build()).collect(Collectors.toList());
        MessageResult result = MessageResult.success();
        result.setData(list2);
        return result;
    }

    /**
     * 申请提币(请到PC端提币或升级APP)
     * 没有验证码校验
     * @param user
     * @param unit
     * @param address
     * @param amount
     * @param fee
     * @param remark
     * @param jyPreplacedword
     * @return
     * @throws Exception
     */
    @RequestMapping("apply")
    @Transactional(rollbackFor = Exception.clreplaced)
    public MessageResult withdraw(@SessionAttribute(SESSION_MEMBER) AuthMember user, String unit, String address, BigDecimal amount, BigDecimal fee, String remark, String jyPreplacedword) throws Exception {
        return MessageResult.success(sourceService.getMessage("WITHDRAW_TO_PC"));
    }

    /**
     * 申请提币(添加验证码校验)
     * @param user
     * @param unit
     * @param address
     * @param amount
     * @param fee
     * @param remark
     * @param jyPreplacedword
     * @return
     * @throws Exception
     */
    @RequestMapping("apply/code")
    @Transactional(rollbackFor = Exception.clreplaced)
    public MessageResult withdrawCode(@SessionAttribute(SESSION_MEMBER) AuthMember user, String unit, String address, BigDecimal amount, BigDecimal fee, String remark, String jyPreplacedword, @RequestParam("code") String code) throws Exception {
        hasText(jyPreplacedword, sourceService.getMessage("MISSING_JYPreplacedWORD"));
        hasText(unit, sourceService.getMessage("MISSING_COIN_TYPE"));
        Coin coin = coinService.findByUnit(unit);
        amount.setScale(coin.getWithdrawScale(), BigDecimal.ROUND_DOWN);
        notNull(coin, sourceService.getMessage("COIN_ILLEGAL"));
        isTrue(coin.getStatus().equals(CommonStatus.NORMAL) && coin.getCanWithdraw().equals(BooleanEnum.IS_TRUE), sourceService.getMessage("COIN_NOT_SUPPORT"));
        isTrue(compare(fee, new BigDecimal(String.valueOf(coin.getMinTxFee()))), sourceService.getMessage("CHARGE_MIN") + coin.getMinTxFee());
        isTrue(compare(new BigDecimal(String.valueOf(coin.getMaxTxFee())), fee), sourceService.getMessage("CHARGE_MAX") + coin.getMaxTxFee());
        isTrue(compare(coin.getMaxWithdrawAmount(), amount), sourceService.getMessage("WITHDRAW_MAX") + coin.getMaxWithdrawAmount());
        isTrue(compare(amount, coin.getMinWithdrawAmount()), sourceService.getMessage("WITHDRAW_MIN") + coin.getMinWithdrawAmount());
        MemberWallet memberWallet = memberWalletService.findByCoinAndMemberId(coin, user.getId());
        isTrue(compare(memberWallet.getBalance(), amount), sourceService.getMessage("INSUFFICIENT_BALANCE"));
        // isTrue(memberAddressService.findByMemberIdAndAddress(user.getId(), address).size() > 0, sourceService.getMessage("WRONG_ADDRESS"));
        isTrue(memberWallet.getIsLock() == BooleanEnum.IS_FALSE, "钱包已锁定");
        Member member = memberService.findOne(user.getId());
        RealNameStatus realNameStatus = member.getRealNameStatus();
        if (!"已认证".equals(realNameStatus.getCnName())) {
            return MessageResult.error(sourceService.getMessage("NO_REALNAM"));
        }
        String mbPreplacedword = member.getJyPreplacedword();
        replacedert.hasText(mbPreplacedword, sourceService.getMessage("NO_SET_JYPreplacedWORD"));
        replacedert.isTrue(Md5.md5Digest(jyPreplacedword + member.getSalt()).toLowerCase().equals(mbPreplacedword), sourceService.getMessage("ERROR_JYPreplacedWORD"));
        ValueOperations valueOperations = redisTemplate.opsForValue();
        String phone = member.getMobilePhone();
        Object codeRedis = valueOperations.get(SysConstant.PHONE_WITHDRAW_MONEY_CODE_PREFIX + phone);
        notNull(codeRedis, sourceService.getMessage("VERIFICATION_CODE_NOT_EXISTS"));
        if (!codeRedis.toString().equals(code)) {
            return error(sourceService.getMessage("VERIFICATION_CODE_INCORRECT"));
        } else {
            valueOperations.getOperations().delete(SysConstant.PHONE_WITHDRAW_MONEY_CODE_PREFIX + phone);
        }
        MessageResult result = memberWalletService.freezeBalance(memberWallet, amount);
        if (result.getCode() != 0) {
            throw new InformationExpiredException("Information Expired");
        }
        WithdrawRecord withdrawApply = new WithdrawRecord();
        withdrawApply.setCoin(coin);
        withdrawApply.setFee(fee);
        withdrawApply.setArrivedAmount(sub(amount, fee));
        withdrawApply.setMemberId(user.getId());
        withdrawApply.setTotalAmount(amount);
        withdrawApply.setAddress(address);
        withdrawApply.setRemark(remark);
        withdrawApply.setCanAutoWithdraw(coin.getCanAutoWithdraw());
        // 提币数量低于或等于阈值并且该币种支持自动提币
        if (amount.compareTo(coin.getWithdrawThreshold()) <= 0 && coin.getCanAutoWithdraw().equals(BooleanEnum.IS_TRUE)) {
            withdrawApply.setStatus(WithdrawStatus.WAITING);
            withdrawApply.setIsAuto(BooleanEnum.IS_TRUE);
            withdrawApply.setDealTime(withdrawApply.getCreateTime());
            WithdrawRecord withdrawRecord = withdrawApplyService.save(withdrawApply);
            JSONObject json = new JSONObject();
            json.put("uid", user.getId());
            // 提币总数量
            json.put("totalAmount", amount);
            // 手续费
            json.put("fee", fee);
            // 预计到账数量
            json.put("arriveAmount", sub(amount, fee));
            // 币种
            json.put("coin", coin);
            // 提币地址
            json.put("address", address);
            // 提币记录id
            json.put("withdrawId", withdrawRecord.getId());
            // 如果是USDT提现,并且地址符合ERC20地址格式,则走ERC20通道提现
            if (coin.getUnit().equals("USDT") && address.substring(0, 2).equals("0x")) {
                kafkaTemplate.send("withdraw", "EUSDT", json.toJSONString());
            } else {
                kafkaTemplate.send("withdraw", coin.getUnit(), json.toJSONString());
            }
            return MessageResult.success(sourceService.getMessage("APPLY_SUCCESS"));
        } else {
            withdrawApply.setStatus(WithdrawStatus.PROCESSING);
            withdrawApply.setIsAuto(BooleanEnum.IS_FALSE);
            if (withdrawApplyService.save(withdrawApply) != null) {
                return MessageResult.success(sourceService.getMessage("APPLY_AUDIT"));
            } else {
                throw new InformationExpiredException("Information Expired");
            }
        }
    }

    /**
     * 提币记录
     * @param user
     * @param page
     * @param pageSize
     * @return
     */
    @GetMapping("record")
    public MessageResult pageWithdraw(@SessionAttribute(SESSION_MEMBER) AuthMember user, int page, int pageSize) {
        MessageResult mr = new MessageResult(0, "success");
        Page<WithdrawRecord> records = withdrawApplyService.findAllByMemberId(user.getId(), page, pageSize);
        records.map(x -> ScanWithdrawRecord.toScanWithdrawRecord(x));
        mr.setData(records);
        return mr;
    }
}

19 View Source File : WithdrawCodeController.java
License : Apache License 2.0
Project Creator : xunibidev

/**
 * @author Hevin QQ:390330302 E-mail:[email protected]
 * @date 2020年01月26日
 */
@RestController
@Slf4j
@RequestMapping(value = "/withdrawcode", method = RequestMethod.POST)
public clreplaced WithdrawCodeController {

    @Autowired
    private MemberAddressService memberAddressService;

    @Autowired
    private RedisTemplate redisTemplate;

    @Autowired
    private MemberService memberService;

    @Autowired
    private CoinService coinService;

    @Autowired
    private MemberWalletService memberWalletService;

    @Autowired
    private WithdrawCodeRecordService withdrawApplyService;

    @Autowired
    private KafkaTemplate<String, String> kafkaTemplate;

    @Autowired
    private LocaleMessageSourceService sourceService;

    @Autowired
    private MemberTransactionService memberTransactionService;

    /**
     * 支持提现的地址
     * @return
     */
    @RequestMapping("support/coin")
    public MessageResult queryWithdraw() {
        List<Coin> list = coinService.findAllCanWithDraw();
        List<String> list1 = new ArrayList<>();
        list.stream().forEach(x -> list1.add(x.getUnit()));
        MessageResult result = MessageResult.success();
        result.setData(list1);
        return result;
    }

    /**
     * 提现币种详细信息
     * @param user
     * @return
     */
    @RequestMapping("support/coin/info")
    public MessageResult queryWithdrawCoin(@SessionAttribute(SESSION_MEMBER) AuthMember user) {
        List<Coin> list = coinService.findAllCanWithDraw();
        List<MemberWallet> list1 = memberWalletService.findAllByMemberId(user.getId());
        long id = user.getId();
        List<WithdrawWalletInfo> list2 = list1.stream().filter(x -> list.contains(x.getCoin())).map(x -> WithdrawWalletInfo.builder().balance(x.getBalance()).withdrawScale(x.getCoin().getWithdrawScale()).maxTxFee(x.getCoin().getMaxTxFee()).minTxFee(x.getCoin().getMinTxFee()).minAmount(x.getCoin().getMinWithdrawAmount()).maxAmount(x.getCoin().getMaxWithdrawAmount()).name(x.getCoin().getName()).nameCn(x.getCoin().getNameCn()).threshold(x.getCoin().getWithdrawThreshold()).unit(x.getCoin().getUnit()).accountType(x.getCoin().getAccountType()).canAutoWithdraw(x.getCoin().getCanAutoWithdraw()).addresses(memberAddressService.queryAddress(id, x.getCoin().getName())).build()).collect(Collectors.toList());
        MessageResult result = MessageResult.success();
        result.setData(list2);
        return result;
    }

    /**
     * 申请提币(添加验证码校验)
     * @param user
     * @param unit 币种单位
     * @param amount 提币数量
     * @param jyPreplacedword  交易密码
     * @return
     * @throws Exception
     */
    @RequestMapping("apply/code")
    @Transactional(rollbackFor = Exception.clreplaced)
    public MessageResult withdrawCode(@SessionAttribute(SESSION_MEMBER) AuthMember user, String unit, BigDecimal amount, String jyPreplacedword) throws Exception {
        hasText(jyPreplacedword, sourceService.getMessage("MISSING_JYPreplacedWORD"));
        hasText(unit, sourceService.getMessage("MISSING_COIN_TYPE"));
        Coin coin = coinService.findByUnit(unit);
        amount.setScale(coin.getWithdrawScale(), BigDecimal.ROUND_DOWN);
        notNull(coin, sourceService.getMessage("COIN_ILLEGAL"));
        isTrue(coin.getStatus().equals(CommonStatus.NORMAL) && coin.getCanWithdraw().equals(BooleanEnum.IS_TRUE), sourceService.getMessage("COIN_NOT_SUPPORT"));
        isTrue(compare(coin.getMaxWithdrawAmount(), amount), sourceService.getMessage("WITHDRAW_MAX") + coin.getMaxWithdrawAmount());
        isTrue(compare(amount, coin.getMinWithdrawAmount()), sourceService.getMessage("WITHDRAW_MIN") + coin.getMinWithdrawAmount());
        MemberWallet memberWallet = memberWalletService.findByCoinAndMemberId(coin, user.getId());
        isTrue(compare(memberWallet.getBalance(), amount), sourceService.getMessage("INSUFFICIENT_BALANCE"));
        // isTrue(memberAddressService.findByMemberIdAndAddress(user.getId(), address).size() > 0, sourceService.getMessage("WRONG_ADDRESS"));
        isTrue(memberWallet.getIsLock() == BooleanEnum.IS_FALSE, "钱包已锁定");
        Member member = memberService.findOne(user.getId());
        String mbPreplacedword = member.getJyPreplacedword();
        replacedert.hasText(mbPreplacedword, sourceService.getMessage("NO_SET_JYPreplacedWORD"));
        replacedert.isTrue(Md5.md5Digest(jyPreplacedword + member.getSalt()).toLowerCase().equals(mbPreplacedword), sourceService.getMessage("ERROR_JYPreplacedWORD"));
        // 冻结用户资产
        MessageResult result = memberWalletService.freezeBalance(memberWallet, amount);
        if (result.getCode() != 0) {
            throw new InformationExpiredException("Information Expired");
        }
        // 生成提现码记录
        WithdrawCodeRecord withdrawApply = new WithdrawCodeRecord();
        withdrawApply.setCoin(coin);
        withdrawApply.setMemberId(user.getId());
        withdrawApply.setWithdrawAmount(amount);
        withdrawApply.setStatus(WithdrawStatus.PROCESSING);
        // 生成提现码(MD5)
        String withdrawCode = Md5.md5Digest(System.currentTimeMillis() + Math.random() + "");
        withdrawApply.setWithdrawCode(withdrawCode);
        if (withdrawApplyService.save(withdrawApply) != null) {
            MessageResult mr = new MessageResult(0, "success");
            mr.setData(withdrawApply);
            return mr;
        } else {
            throw new InformationExpiredException("Information Expired");
        }
    }

    /**
     * 提币码充值
     * @param user
     * @param withdrawCode 提币码
     * @param withdrawCode
     * @return
     * @throws Exception
     */
    @RequestMapping("apply/recharge")
    @Transactional(rollbackFor = Exception.clreplaced)
    public MessageResult withdrawCodeRecharge(@SessionAttribute(SESSION_MEMBER) AuthMember user, String withdrawCode) throws Exception {
        hasText(withdrawCode, sourceService.getMessage("MISSING_JYPreplacedWORD"));
        Member member = memberService.findOne(user.getId());
        WithdrawCodeRecord record = withdrawApplyService.findByWithdrawCode(withdrawCode);
        if (record != null) {
            if (record.getStatus() != WithdrawStatus.PROCESSING) {
                return MessageResult.error("该充值码已被使用或删除!");
            }
            withdrawApplyService.withdrawSuccess(record.getId(), user.getId());
            return MessageResult.success("充值码充值成功!");
        } else {
            return MessageResult.error("充值码不存在!");
        }
    }

    /**
     * 获取提币码信息
     * @param user
     * @param withdrawCode 提币码
     * @param withdrawCode
     * @return
     * @throws Exception
     */
    @RequestMapping("apply/info")
    @Transactional(rollbackFor = Exception.clreplaced)
    public MessageResult getWithdrawCodeInfo(@SessionAttribute(SESSION_MEMBER) AuthMember user, String withdrawCode) throws Exception {
        hasText(withdrawCode, sourceService.getMessage("MISSING_JYPreplacedWORD"));
        Member member = memberService.findOne(user.getId());
        WithdrawCodeRecord record = withdrawApplyService.findByWithdrawCode(withdrawCode);
        if (record != null) {
            MessageResult ret = new MessageResult(0, "获取成功!");
            ret.setData(record);
            return ret;
        } else {
            return MessageResult.error("充值码不存在!");
        }
    }

    /**
     * 提币码记录
     * @param user
     * @param page 页码
     * @param pageSize 数量
     * @return
     */
    @GetMapping("record")
    public MessageResult pageWithdraw(@SessionAttribute(SESSION_MEMBER) AuthMember user, int page, int pageSize) {
        MessageResult mr = new MessageResult(0, "success");
        Page<WithdrawCodeRecord> records = withdrawApplyService.findAllByMemberId(user.getId(), page, pageSize);
        mr.setData(records);
        return mr;
    }
}

19 View Source File : OrderController.java
License : Apache License 2.0
Project Creator : xunibidev

/**
 * 委托订单处理类
 */
@Slf4j
@RestController
@RequestMapping("/order")
public clreplaced OrderController {

    @Autowired
    private ExchangeOrderService orderService;

    @Autowired
    private MemberWalletService walletService;

    @Autowired
    private ExchangeCoinService exchangeCoinService;

    @Autowired
    private CoinService coinService;

    @Autowired
    private KafkaTemplate<String, String> kafkaTemplate;

    @Autowired
    private ExchangeOrderDetailService exchangeOrderDetailService;

    @Value("${exchange.max-cancel-times:-1}")
    private int maxCancelTimes;

    @Autowired
    private LocaleMessageSourceService msService;

    @Autowired
    private MemberService memberService;

    @Autowired
    private RestTemplate restTemplate;

    @Autowired
    private RedisTemplate redisTemplate;

    private SimpleDateFormat dateTimeFormat = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");

    /**
     * 添加委托订单
     * @param authMember
     * @param direction
     * @param symbol
     * @param price
     * @param amount
     * @param type
     *          usedisCount 暂时不用
     * @return
     */
    @RequestMapping("add")
    public MessageResult addOrder(@SessionAttribute(SESSION_MEMBER) AuthMember authMember, ExchangeOrderDirection direction, String symbol, BigDecimal price, BigDecimal amount, ExchangeOrderType type) {
        // int expireTime = SysConstant.USER_ADD_EXCHANGE_ORDER_TIME_LIMIT_EXPIRE_TIME;
        // ValueOperations valueOperations =  redisTemplate.opsForValue();
        if (direction == null || type == null) {
            return MessageResult.error(500, msService.getMessage("ILLEGAL_ARGUMENT"));
        }
        Member member = memberService.findOne(authMember.getId());
        // if(member.getMemberLevel()== MemberLevelEnum.GENERAL){
        // return MessageResult.error(500,msService.getMessage("REAL_NAME_AUTHENTICATION"));
        // }
        // 是否被禁止交易
        if (member.getTransactionStatus().equals(BooleanEnum.IS_FALSE)) {
            return MessageResult.error(500, msService.getMessage("CANNOT_TRADE"));
        }
        ExchangeOrder order = new ExchangeOrder();
        // 判断限价输入值是否小于零
        if (price.compareTo(BigDecimal.ZERO) <= 0 && type == ExchangeOrderType.LIMIT_PRICE) {
            return MessageResult.error(500, msService.getMessage("EXORBITANT_PRICES"));
        }
        // 判断数量小于零
        if (amount.compareTo(BigDecimal.ZERO) <= 0) {
            return MessageResult.error(500, msService.getMessage("NUMBER_OF_ILLEGAL"));
        }
        // 根据交易对名称(symbol)获取交易对儿信息
        ExchangeCoin exchangeCoin = exchangeCoinService.findBySymbol(symbol);
        if (exchangeCoin == null) {
            return MessageResult.error(500, msService.getMessage("NONSUPPORT_COIN"));
        }
        if (exchangeCoin.getEnable() != 1 || exchangeCoin.getExchangeable() != 1) {
            return MessageResult.error(500, msService.getMessage("COIN_FORBIDDEN"));
        }
        // 不允许卖
        if (exchangeCoin.getEnableSell() == BooleanEnum.IS_FALSE && direction == ExchangeOrderDirection.SELL) {
            return MessageResult.error(500, msService.getMessage("STOP_SELLING"));
        }
        // 不允许买
        if (exchangeCoin.getEnableBuy() == BooleanEnum.IS_FALSE && direction == ExchangeOrderDirection.BUY) {
            return MessageResult.error(500, msService.getMessage("STOP_BUYING"));
        }
        // 获取基准币
        String baseCoin = exchangeCoin.getBaseSymbol();
        // 获取交易币
        String exCoin = exchangeCoin.getCoinSymbol();
        Coin coin;
        // 根据交易方向查询币种信息
        if (direction == ExchangeOrderDirection.SELL) {
            coin = coinService.findByUnit(exCoin);
        } else {
            coin = coinService.findByUnit(baseCoin);
        }
        if (coin == null) {
            return MessageResult.error(500, msService.getMessage("NONSUPPORT_COIN"));
        }
        // 设置价格精度
        price = price.setScale(exchangeCoin.getBaseCoinScale(), BigDecimal.ROUND_DOWN);
        // 委托数量和精度控制
        if (direction == ExchangeOrderDirection.BUY && type == ExchangeOrderType.MARKET_PRICE) {
            amount = amount.setScale(exchangeCoin.getBaseCoinScale(), BigDecimal.ROUND_DOWN);
            // 最小成交额控制
            if (amount.compareTo(exchangeCoin.getMinTurnover()) < 0) {
                return MessageResult.error(500, msService.getMessage("LOWEST_TURNOVER") + exchangeCoin.getMinTurnover());
            }
        } else {
            amount = amount.setScale(exchangeCoin.getCoinScale(), BigDecimal.ROUND_DOWN);
            // 成交量范围控制
            if (exchangeCoin.getMaxVolume() != null && exchangeCoin.getMaxVolume().compareTo(BigDecimal.ZERO) != 0 && exchangeCoin.getMaxVolume().compareTo(amount) < 0) {
                return MessageResult.error(msService.getMessage("AMOUNT_OVER_SIZE") + " " + exchangeCoin.getMaxVolume());
            }
            if (exchangeCoin.getMinVolume() != null && exchangeCoin.getMinVolume().compareTo(BigDecimal.ZERO) != 0 && exchangeCoin.getMinVolume().compareTo(amount) > 0) {
                return MessageResult.error(msService.getMessage("AMOUNT_TOO_SMALL") + " " + exchangeCoin.getMinVolume());
            }
        }
        if (price.compareTo(BigDecimal.ZERO) <= 0 && type == ExchangeOrderType.LIMIT_PRICE) {
            return MessageResult.error(500, msService.getMessage("EXORBITANT_PRICES"));
        }
        if (amount.compareTo(BigDecimal.ZERO) <= 0) {
            return MessageResult.error(500, msService.getMessage("NUMBER_OF_ILLEGAL"));
        }
        MemberWallet baseCoinWallet = walletService.findByCoinUnitAndMemberId(baseCoin, member.getId());
        MemberWallet exCoinWallet = walletService.findByCoinUnitAndMemberId(exCoin, member.getId());
        if (baseCoinWallet == null || exCoinWallet == null) {
            return MessageResult.error(500, msService.getMessage("NONSUPPORT_COIN"));
        }
        if (baseCoinWallet.getIsLock() == BooleanEnum.IS_TRUE || exCoinWallet.getIsLock() == BooleanEnum.IS_TRUE) {
            return MessageResult.error(500, msService.getMessage("WALLET_LOCKED"));
        }
        // 如果有最低卖价限制,出价不能低于此价,且禁止市场价格卖
        if (direction == ExchangeOrderDirection.SELL && exchangeCoin.getMinSellPrice().compareTo(BigDecimal.ZERO) > 0 && ((price.compareTo(exchangeCoin.getMinSellPrice()) < 0) || type == ExchangeOrderType.MARKET_PRICE)) {
            return MessageResult.error(500, msService.getMessage("FLOOR_PRICE") + exchangeCoin.getMinSellPrice());
        }
        // 如果有最高买价限制,出价不能高于此价,且禁止市场价格买
        if (direction == ExchangeOrderDirection.BUY && exchangeCoin.getMaxBuyPrice().compareTo(BigDecimal.ZERO) > 0 && ((price.compareTo(exchangeCoin.getMaxBuyPrice()) > 0) || type == ExchangeOrderType.MARKET_PRICE)) {
            return MessageResult.error(500, msService.getMessage("PRICE_CEILING") + exchangeCoin.getMaxBuyPrice());
        }
        // 查看是否启用市价买卖
        if (type == ExchangeOrderType.MARKET_PRICE) {
            if (exchangeCoin.getEnableMarketBuy() == BooleanEnum.IS_FALSE && direction == ExchangeOrderDirection.BUY) {
                return MessageResult.error(500, msService.getMessage("NO_MARKET_PRICE_BUY"));
            } else if (exchangeCoin.getEnableMarketSell() == BooleanEnum.IS_FALSE && direction == ExchangeOrderDirection.SELL) {
                return MessageResult.error(500, msService.getMessage("NO_MARKET_PRICE_SELL"));
            }
        }
        // 限制委托数量
        if (exchangeCoin.getMaxTradingOrder() > 0 && orderService.findCurrentTradingCount(member.getId(), symbol, direction) >= exchangeCoin.getMaxTradingOrder()) {
            return MessageResult.error(500, msService.getMessage("MAXIMUM_QUANreplacedY") + exchangeCoin.getMaxTradingOrder());
        }
        // 抢购模式活动订单限制(用户无法在活动前下买单)
        // 当前时间戳
        long currentTime = Calendar.getInstance().getTimeInMillis();
        // 抢购模式下,无法在活动开始前下买单,仅限于管理员下卖单
        if (exchangeCoin.getPublishType() == ExchangeCoinPublishType.QIANGGOU) {
            // 抢购模式订单
            try {
                if (currentTime < dateTimeFormat.parse(exchangeCoin.getStartTime()).getTime()) {
                    if (direction == ExchangeOrderDirection.BUY) {
                        // 抢购未开始
                        if (currentTime < dateTimeFormat.parse(exchangeCoin.getStartTime()).getTime()) {
                            return MessageResult.error(500, msService.getMessage("ACTIVITY_NOT_STARTED"));
                        }
                    } else {
                        // 此处2是管理员用户的ID
                        if (member.getId() != 2) {
                            return MessageResult.error(500, msService.getMessage("UNABLE_TO_PLACE_BUY_ORDER"));
                        }
                    }
                } else {
                    // 活动进行期间,无法下卖单 + 无法下市价单
                    if (currentTime < dateTimeFormat.parse(exchangeCoin.getEndTime()).getTime()) {
                        if (direction == ExchangeOrderDirection.SELL) {
                            return MessageResult.error(500, msService.getMessage("UNABLE_TO_PLACE_SELL_ORDER"));
                        }
                        if (type == ExchangeOrderType.MARKET_PRICE) {
                            return MessageResult.error(500, msService.getMessage("ITS_NOT_MARKETABLE"));
                        }
                    } else {
                        // 清盘期间,无法下单
                        if (currentTime < dateTimeFormat.parse(exchangeCoin.getClearTime()).getTime()) {
                            return MessageResult.error(500, msService.getMessage("WINDING_UP"));
                        }
                    }
                }
            } catch (ParseException e) {
                e.printStackTrace();
                return MessageResult.error(500, msService.getMessage("EXAPI_UNKNOWN_ERROR0"));
            }
        }
        // 分摊模式活动订单限制(开始前任何人无法下单)
        if (exchangeCoin.getPublishType() == ExchangeCoinPublishType.FENTAN) {
            try {
                if (currentTime < dateTimeFormat.parse(exchangeCoin.getStartTime()).getTime()) {
                    // UNABLE_TO_PLACE_BUY_ORDER
                    return MessageResult.error(500, msService.getMessage("ACTIVITY_NOT_STARTED"));
                } else {
                    // 活动开始后且在结束前,无法下卖单 + 下单金额必须符合规定
                    if (currentTime < dateTimeFormat.parse(exchangeCoin.getEndTime()).getTime()) {
                        if (direction == ExchangeOrderDirection.SELL) {
                            return MessageResult.error(500, msService.getMessage("ACTIVITY_STARTED_CANT_SELL"));
                        } else {
                            if (type == ExchangeOrderType.MARKET_PRICE) {
                                return MessageResult.error(500, msService.getMessage("ITS_NOT_MARKETABLE"));
                            } else {
                                if (price.compareTo(exchangeCoin.getPublishPrice()) != 0) {
                                    return MessageResult.error(500, msService.getMessage("ORDER_PRICE") + exchangeCoin.getPublishPrice());
                                }
                            }
                        }
                    } else {
                        // 清盘期间,普通用户无法下单,仅有管理员用户ID可下单
                        if (currentTime < dateTimeFormat.parse(exchangeCoin.getClearTime()).getTime()) {
                            // 此处2和10001是管理员用户的ID
                            if (member.getId() != 2 && member.getId() != 10001) {
                                return MessageResult.error(500, msService.getMessage("WINDING_UP"));
                            } else {
                                if (price.compareTo(exchangeCoin.getPublishPrice()) != 0) {
                                    return MessageResult.error(500, msService.getMessage("ORDER_PRICE") + exchangeCoin.getPublishPrice());
                                }
                                if (direction == ExchangeOrderDirection.BUY) {
                                    return MessageResult.error(500, msService.getMessage("PERIOD_LIQUIDATION"));
                                }
                            }
                        }
                    }
                }
            } catch (ParseException e) {
                e.printStackTrace();
                return MessageResult.error(500, msService.getMessage("EXAPI_UNKNOWN_ERROR1"));
            }
        }
        order.setMemberId(member.getId());
        order.setSymbol(symbol);
        order.setBaseSymbol(baseCoin);
        order.setCoinSymbol(exCoin);
        order.setType(type);
        order.setDirection(direction);
        if (order.getType() == ExchangeOrderType.MARKET_PRICE) {
            order.setPrice(BigDecimal.ZERO);
        } else {
            order.setPrice(price);
        }
        order.setUseDiscount("0");
        // 限价买入单时amount为用户设置的总成交额
        order.setAmount(amount);
        MessageResult mr = orderService.addOrder(member.getId(), order);
        if (mr.getCode() != 0) {
            return MessageResult.error(500, msService.getMessage("ORDER_FAILED") + mr.getMessage());
        }
        log.info(">>>>>>>>>>订单提交完成>>>>>>>>>>");
        // 发送消息至Exchange系统
        kafkaTemplate.send("exchange-order", JSON.toJSONString(order));
        MessageResult result = MessageResult.success(msService.getMessage("EXAPI_SUCCESS"));
        result.setData(order.getOrderId());
        return result;
    }

    /**
     * 行情机器人专用:添加委托订单
     * @param uid
     * @param direction
     * @param symbol
     * @param price
     * @param amount
     * @param type
     *          usedisCount 暂时不用
     * @return
     */
    @RequestMapping("mockaddydhdnskd")
    public MessageResult addOrderMock(Long uid, String sign, ExchangeOrderDirection direction, String symbol, BigDecimal price, BigDecimal amount, ExchangeOrderType type) {
        // int expireTime = SysConstant.USER_ADD_EXCHANGE_ORDER_TIME_LIMIT_EXPIRE_TIME;
        // ValueOperations valueOperations =  redisTemplate.opsForValue();
        if (direction == null || type == null) {
            return MessageResult.error(500, msService.getMessage("ILLEGAL_ARGUMENT"));
        }
        // Member member=memberService.findOne(uid);
        // if(member.getMemberLevel()== MemberLevelEnum.GENERAL){
        // return MessageResult.error(500,msService.getMessage("REAL_NAME_AUTHENTICATION"));
        // }
        if (uid != 1 && uid != 10001) {
            return MessageResult.error(500, msService.getMessage("ILLEGAL_ARGUMENT"));
        }
        if (!sign.equals("77585211314qazwsx")) {
            return MessageResult.error(500, msService.getMessage("ILLEGAL_ARGUMENT"));
        }
        // //是否被禁止交易
        // if(member.getTransactionStatus().equals(BooleanEnum.IS_FALSE)){
        // return MessageResult.error(500,msService.getMessage("CANNOT_TRADE"));
        // }
        ExchangeOrder order = new ExchangeOrder();
        // 判断限价输入值是否小于零
        if (price.compareTo(BigDecimal.ZERO) <= 0 && type == ExchangeOrderType.LIMIT_PRICE) {
            return MessageResult.error(500, msService.getMessage("EXORBITANT_PRICES"));
        }
        // 判断数量小于零
        if (amount.compareTo(BigDecimal.ZERO) <= 0) {
            return MessageResult.error(500, msService.getMessage("NUMBER_OF_ILLEGAL"));
        }
        // 根据交易对名称(symbol)获取交易对儿信息
        ExchangeCoin exchangeCoin = exchangeCoinService.findBySymbol(symbol);
        if (exchangeCoin == null) {
            return MessageResult.error(500, msService.getMessage("NONSUPPORT_COIN"));
        }
        if (exchangeCoin.getEnable() != 1 || exchangeCoin.getExchangeable() != 1) {
            return MessageResult.error(500, msService.getMessage("COIN_FORBIDDEN"));
        }
        // 获取基准币
        String baseCoin = exchangeCoin.getBaseSymbol();
        // 获取交易币
        String exCoin = exchangeCoin.getCoinSymbol();
        Coin coin;
        // 根据交易方向查询币种信息
        if (direction == ExchangeOrderDirection.SELL) {
            coin = coinService.findByUnit(exCoin);
        } else {
            coin = coinService.findByUnit(baseCoin);
        }
        if (coin == null) {
            return MessageResult.error(500, msService.getMessage("NONSUPPORT_COIN"));
        }
        // 设置价格精度
        price = price.setScale(exchangeCoin.getBaseCoinScale(), BigDecimal.ROUND_DOWN);
        // 委托数量和精度控制
        if (direction == ExchangeOrderDirection.BUY && type == ExchangeOrderType.MARKET_PRICE) {
            amount = amount.setScale(exchangeCoin.getBaseCoinScale(), BigDecimal.ROUND_DOWN);
            // 最小成交额控制
            if (amount.compareTo(exchangeCoin.getMinTurnover()) < 0) {
                return MessageResult.error(500, msService.getMessage("MINIMUM_TURNOVER") + exchangeCoin.getMinTurnover());
            }
        } else {
            amount = amount.setScale(exchangeCoin.getCoinScale(), BigDecimal.ROUND_DOWN);
            // 成交量范围控制
            if (exchangeCoin.getMaxVolume() != null && exchangeCoin.getMaxVolume().compareTo(BigDecimal.ZERO) != 0 && exchangeCoin.getMaxVolume().compareTo(amount) < 0) {
                return MessageResult.error(msService.getMessage("AMOUNT_OVER_SIZE") + " " + exchangeCoin.getMaxVolume());
            }
            if (exchangeCoin.getMinVolume() != null && exchangeCoin.getMinVolume().compareTo(BigDecimal.ZERO) != 0 && exchangeCoin.getMinVolume().compareTo(amount) > 0) {
                return MessageResult.error(msService.getMessage("AMOUNT_TOO_SMALL") + " " + exchangeCoin.getMinVolume());
            }
        }
        if (price.compareTo(BigDecimal.ZERO) <= 0 && type == ExchangeOrderType.LIMIT_PRICE) {
            return MessageResult.error(500, msService.getMessage("EXORBITANT_PRICES"));
        }
        if (amount.compareTo(BigDecimal.ZERO) <= 0) {
            return MessageResult.error(500, msService.getMessage("NUMBER_OF_ILLEGAL"));
        }
        // MemberWallet baseCoinWallet = walletService.findByCoinUnitAndMemberId(baseCoin, member.getId());
        // MemberWallet exCoinWallet = walletService.findByCoinUnitAndMemberId(exCoin, member.getId());
        // if (baseCoinWallet == null || exCoinWallet == null) {
        // return MessageResult.error(500, msService.getMessage("NONSUPPORT_COIN"));
        // }
        // if (baseCoinWallet.getIsLock() == BooleanEnum.IS_TRUE || exCoinWallet.getIsLock() == BooleanEnum.IS_TRUE) {
        // return MessageResult.error(500, msService.getMessage("WALLET_LOCKED"));
        // }
        // 如果有最低卖价限制,出价不能低于此价,且禁止市场价格卖
        if (direction == ExchangeOrderDirection.SELL && exchangeCoin.getMinSellPrice().compareTo(BigDecimal.ZERO) > 0 && ((price.compareTo(exchangeCoin.getMinSellPrice()) < 0) || type == ExchangeOrderType.MARKET_PRICE)) {
            return MessageResult.error(500, msService.getMessage("EXORBITANT_PRICES"));
        }
        // 如果有最高买价限制,出价不能高于此价,且禁止市场价格买
        if (direction == ExchangeOrderDirection.BUY && exchangeCoin.getMaxBuyPrice().compareTo(BigDecimal.ZERO) > 0 && ((price.compareTo(exchangeCoin.getMaxBuyPrice()) > 0) || type == ExchangeOrderType.MARKET_PRICE)) {
            return MessageResult.error(500, msService.getMessage("NO_PRICE_CEILING"));
        }
        // 查看是否启用市价买卖
        if (type == ExchangeOrderType.MARKET_PRICE) {
            if (exchangeCoin.getEnableMarketBuy() == BooleanEnum.IS_FALSE && direction == ExchangeOrderDirection.BUY) {
                return MessageResult.error(500, msService.getMessage("NO_MARKET_PRICE_BUY"));
            } else if (exchangeCoin.getEnableMarketSell() == BooleanEnum.IS_FALSE && direction == ExchangeOrderDirection.SELL) {
                return MessageResult.error(500, msService.getMessage("NO_MARKET_PRICE_SELL"));
            }
        }
        // //限制委托数量
        // if (exchangeCoin.getMaxTradingOrder() > 0 && orderService.findCurrentTradingCount(uid, symbol, direction) >= exchangeCoin.getMaxTradingOrder()) {
        // return MessageResult.error(500, msService.getMessage("MAXIMUM_QUANreplacedY") + exchangeCoin.getMaxTradingOrder());
        // }
        // 抢购模式活动订单限制(用户无法在活动前下买单)
        // 当前时间戳
        long currentTime = Calendar.getInstance().getTimeInMillis();
        // 抢购模式下,无法在活动开始前下买单,仅限于管理员下卖单
        if (exchangeCoin.getPublishType() == ExchangeCoinPublishType.QIANGGOU) {
            // 抢购模式订单
            try {
                if (currentTime < dateTimeFormat.parse(exchangeCoin.getStartTime()).getTime()) {
                    if (direction == ExchangeOrderDirection.BUY) {
                        // 抢购未开始
                        if (currentTime < dateTimeFormat.parse(exchangeCoin.getStartTime()).getTime()) {
                            return MessageResult.error(500, msService.getMessage("ACTIVITY_NOT_STARTED"));
                        }
                    } else {
                        // 此处2是管理员用户的ID
                        if (uid != 2 && uid != 1 && uid != 10001) {
                            return MessageResult.error(500, msService.getMessage("UNABLE_TO_PLACE_BUY_ORDER"));
                        }
                    }
                } else {
                    // 活动进行期间,无法下卖单 + 无法下市价单
                    if (currentTime < dateTimeFormat.parse(exchangeCoin.getEndTime()).getTime()) {
                        if (direction == ExchangeOrderDirection.SELL) {
                            return MessageResult.error(500, msService.getMessage("UNABLE_TO_PLACE_SELL_ORDER"));
                        }
                        if (type == ExchangeOrderType.MARKET_PRICE) {
                            return MessageResult.error(500, msService.getMessage("ITS_NOT_MARKETABLE"));
                        }
                    } else {
                        // 清盘期间,无法下单
                        if (currentTime < dateTimeFormat.parse(exchangeCoin.getClearTime()).getTime()) {
                            return MessageResult.error(500, msService.getMessage("WINDING_UP"));
                        }
                    }
                }
            } catch (ParseException e) {
                e.printStackTrace();
                return MessageResult.error(500, msService.getMessage("EXAPI_UNKNOWN_ERROR0"));
            }
        }
        // 分摊模式活动订单限制(开始前任何人无法下单)
        if (exchangeCoin.getPublishType() == ExchangeCoinPublishType.FENTAN) {
            try {
                if (currentTime < dateTimeFormat.parse(exchangeCoin.getStartTime()).getTime()) {
                    // UNABLE_TO_PLACE_BUY_ORDER
                    return MessageResult.error(500, msService.getMessage("ACTIVITY_NOT_STARTED"));
                } else {
                    // 活动开始后且在结束前,无法下卖单 + 下单金额必须符合规定
                    if (currentTime < dateTimeFormat.parse(exchangeCoin.getEndTime()).getTime()) {
                        if (direction == ExchangeOrderDirection.SELL) {
                            return MessageResult.error(500, msService.getMessage("ACTIVITY_STARTED_CANT_SELL"));
                        } else {
                            if (type == ExchangeOrderType.MARKET_PRICE) {
                                return MessageResult.error(500, msService.getMessage("ITS_NOT_MARKETABLE"));
                            } else {
                                if (price.compareTo(exchangeCoin.getPublishPrice()) != 0) {
                                    return MessageResult.error(500, msService.getMessage("ORDER_PRICE") + exchangeCoin.getPublishPrice());
                                }
                            }
                        }
                    } else {
                        // 清盘期间,普通用户无法下单,仅有管理员用户ID可下单
                        if (currentTime < dateTimeFormat.parse(exchangeCoin.getClearTime()).getTime()) {
                            // 此处2是超级管理员用户的ID
                            if (uid != 2 && uid != 1 && uid != 10001) {
                                return MessageResult.error(500, msService.getMessage("WINDING_UP"));
                            } else {
                                if (price.compareTo(exchangeCoin.getPublishPrice()) != 0) {
                                    return MessageResult.error(500, msService.getMessage("ORDER_PRICE") + exchangeCoin.getPublishPrice());
                                }
                                if (direction == ExchangeOrderDirection.BUY) {
                                    return MessageResult.error(500, msService.getMessage("PERIOD_LIQUIDATION"));
                                }
                            }
                        }
                    }
                }
            } catch (ParseException e) {
                e.printStackTrace();
                return MessageResult.error(500, msService.getMessage("EXAPI_UNKNOWN_ERROR1"));
            }
        }
        order.setMemberId(uid);
        order.setSymbol(symbol);
        order.setBaseSymbol(baseCoin);
        order.setCoinSymbol(exCoin);
        order.setType(type);
        order.setDirection(direction);
        if (order.getType() == ExchangeOrderType.MARKET_PRICE) {
            order.setPrice(BigDecimal.ZERO);
        } else {
            order.setPrice(price);
        }
        order.setUseDiscount("0");
        // 限价买入单时amount为用户设置的总成交额
        order.setAmount(amount);
        MessageResult mr = orderService.addOrder(uid, order);
        if (mr.getCode() != 0) {
            return MessageResult.error(500, msService.getMessage("ORDER_FAILED") + mr.getMessage());
        }
        log.info(">>>>>>>>>>订单提交完成>>>>>>>>>>");
        // 发送消息至Exchange系统
        kafkaTemplate.send("exchange-order", JSON.toJSONString(order));
        MessageResult result = MessageResult.success(msService.getMessage("EXAPI_SUCCESS"));
        result.setData(order.getOrderId());
        return result;
    }

    /**
     * 历史委托
     */
    @RequestMapping("history")
    public Page<ExchangeOrder> historyOrder(@SessionAttribute(SESSION_MEMBER) AuthMember member, String symbol, int pageNo, int pageSize) {
        Page<ExchangeOrder> page = orderService.findHistory(member.getId(), symbol, pageNo, pageSize);
        /*
        page.getContent().forEach(exchangeOrder -> {
            //获取交易成交详情
            exchangeOrder.setDetail(exchangeOrderDetailService.findAllByOrderId(exchangeOrder.getOrderId()));
        });
        */
        return page;
    }

    /**
     * 个人中心历史委托
     */
    @RequestMapping("personal/history")
    public Page<ExchangeOrder> personalHistoryOrder(@SessionAttribute(SESSION_MEMBER) AuthMember member, @RequestParam(value = "symbol", required = false) String symbol, @RequestParam(value = "type", required = false) ExchangeOrderType type, @RequestParam(value = "status", required = false) ExchangeOrderStatus status, @RequestParam(value = "startTime", required = false) String startTime, @RequestParam(value = "endTime", required = false) String endTime, @RequestParam(value = "direction", required = false) ExchangeOrderDirection direction, @RequestParam(value = "pageNo", defaultValue = "1") int pageNo, @RequestParam(value = "pageSize", defaultValue = "10") int pageSize) {
        Page<ExchangeOrder> page = orderService.findPersonalHistory(member.getId(), symbol, type, status, startTime, endTime, direction, pageNo, pageSize);
        /*
        page.getContent().forEach(exchangeOrder -> {
            //获取交易成交详情
            exchangeOrder.setDetail(exchangeOrderDetailService.findAllByOrderId(exchangeOrder.getOrderId()));
        });
        */
        return page;
    }

    /**
     * 个人中心当前委托
     * @param member
     * @param symbol
     * @param type
     * @param startTime
     * @param endTime
     * @param pageNo
     * @param pageSize
     * @return
     */
    @RequestMapping("personal/current")
    public Page<ExchangeOrder> personalCurrentOrder(@SessionAttribute(SESSION_MEMBER) AuthMember member, @RequestParam(value = "symbol", required = false) String symbol, @RequestParam(value = "type", required = false) ExchangeOrderType type, @RequestParam(value = "startTime", required = false) String startTime, @RequestParam(value = "endTime", required = false) String endTime, @RequestParam(value = "direction", required = false) ExchangeOrderDirection direction, @RequestParam(value = "pageNo", defaultValue = "1") int pageNo, @RequestParam(value = "pageSize", defaultValue = "10") int pageSize) {
        Page<ExchangeOrder> page = orderService.findPersonalCurrent(member.getId(), symbol, type, startTime, endTime, direction, pageNo, pageSize);
        page.getContent().forEach(exchangeOrder -> {
            // 获取交易成交详情
            BigDecimal tradedAmount = BigDecimal.ZERO;
            BigDecimal turnover = BigDecimal.ZERO;
            List<ExchangeOrderDetail> details = exchangeOrderDetailService.findAllByOrderId(exchangeOrder.getOrderId());
            exchangeOrder.setDetail(details);
            for (ExchangeOrderDetail trade : details) {
                tradedAmount = tradedAmount.add(trade.getAmount());
                turnover = turnover.add(trade.getTurnover());
            }
            exchangeOrder.setTradedAmount(tradedAmount);
            exchangeOrder.setTurnover(turnover);
        });
        return page;
    }

    /**
     * 当前委托
     *
     * @param member
     * @param pageNo
     * @param pageSize
     * @return
     */
    @RequestMapping("current")
    public Page<ExchangeOrder> currentOrder(@SessionAttribute(SESSION_MEMBER) AuthMember member, String symbol, int pageNo, int pageSize) {
        Page<ExchangeOrder> page = orderService.findCurrent(member.getId(), symbol, pageNo, pageSize);
        page.getContent().forEach(exchangeOrder -> {
            // 获取交易成交详情
            BigDecimal tradedAmount = BigDecimal.ZERO;
            BigDecimal turnover = BigDecimal.ZERO;
            List<ExchangeOrderDetail> details = exchangeOrderDetailService.findAllByOrderId(exchangeOrder.getOrderId());
            exchangeOrder.setDetail(details);
            for (ExchangeOrderDetail trade : details) {
                tradedAmount = tradedAmount.add(trade.getAmount());
                turnover = turnover.add(trade.getTurnover());
            }
            exchangeOrder.setTradedAmount(tradedAmount);
            exchangeOrder.setTurnover(turnover);
        });
        return page;
    }

    /**
     * 行情机器人专用:当前委托
     * @param uid
     * @param sign
     * @return
     */
    @RequestMapping("mockcurrentydhdnskd")
    public Page<ExchangeOrder> currentOrderMock(Long uid, String sign, String symbol, int pageNo, int pageSize) {
        if (uid != 1 && uid != 10001) {
            return null;
        }
        if (!sign.equals("77585211314qazwsx")) {
            return null;
        }
        Page<ExchangeOrder> page = orderService.findCurrent(uid, symbol, pageNo, pageSize);
        // page.getContent().forEach(exchangeOrder -> {
        // //获取交易成交详情(机器人无需获取详情)
        // 
        // BigDecimal tradedAmount = BigDecimal.ZERO;
        // List<ExchangeOrderDetail> details = exchangeOrderDetailService.findAllByOrderId(exchangeOrder.getOrderId());
        // exchangeOrder.setDetail(details);
        // for (ExchangeOrderDetail trade : details) {
        // tradedAmount = tradedAmount.add(trade.getAmount());
        // }
        // exchangeOrder.setTradedAmount(tradedAmount);
        // 
        // });
        return page;
    }

    /**
     * 行情机器人专用:交易取消委托
     * @param uid
     * @param orderId
     * @return
     */
    @RequestMapping("mockcancelydhdnskd")
    public MessageResult cancelOrdermock(Long uid, String sign, String orderId) {
        ExchangeOrder order = orderService.findOne(orderId);
        if (uid != 1 && uid != 10001) {
            return MessageResult.error(500, msService.getMessage("OPERATION_FORBIDDEN"));
        }
        if (!sign.equals("77585211314qazwsx")) {
            return MessageResult.error(500, msService.getMessage("OPERATION_FORBIDDEN"));
        }
        if (order.getStatus() != ExchangeOrderStatus.TRADING) {
            return MessageResult.error(500, msService.getMessage("ORDER_STATUS_ERROR"));
        }
        // 活动清盘期间,无法撤销订单
        ExchangeCoin exchangeCoin = exchangeCoinService.findBySymbol(order.getSymbol());
        if (exchangeCoin.getPublishType() != ExchangeCoinPublishType.NONE) {
            // 当前时间戳
            long currentTime = Calendar.getInstance().getTimeInMillis();
            try {
                // 处在活动结束时间与清盘结束时间之间
                if (currentTime > dateTimeFormat.parse(exchangeCoin.getEndTime()).getTime() && currentTime < dateTimeFormat.parse(exchangeCoin.getClearTime()).getTime()) {
                    return MessageResult.error(500, msService.getMessage("CANNOT_CANCEL_ORDER"));
                }
            } catch (ParseException e) {
                e.printStackTrace();
                return MessageResult.error(500, msService.getMessage("EXAPI_UNKNOWN_ERROR3"));
            }
        }
        if (isExchangeOrderExist(order)) {
            // 发送消息至Exchange系统
            kafkaTemplate.send("exchange-order-cancel", JSON.toJSONString(order));
        } else {
            // 强制取消
            orderService.forceCancelOrder(order);
        }
        return MessageResult.success(msService.getMessage("EXAPI_SUCCESS"));
    }

    /**
     * 查询委托成交明细
     *
     * @param member
     * @param orderId
     * @return
     */
    @RequestMapping("detail/{orderId}")
    public List<ExchangeOrderDetail> currentOrder(@SessionAttribute(SESSION_MEMBER) AuthMember member, @PathVariable String orderId) {
        return exchangeOrderDetailService.findAllByOrderId(orderId);
    }

    /**
     * 取消委托
     * @param member
     * @param orderId
     * @return
     */
    @RequestMapping("cancel/{orderId}")
    public MessageResult cancelOrder(@SessionAttribute(SESSION_MEMBER) AuthMember member, @PathVariable String orderId) {
        ExchangeOrder order = orderService.findOne(orderId);
        if (order.getMemberId() != member.getId()) {
            return MessageResult.error(500, msService.getMessage("OPERATION_FORBIDDEN"));
        }
        if (order.getStatus() != ExchangeOrderStatus.TRADING) {
            return MessageResult.error(500, msService.getMessage("ORDER_STATUS_ERROR"));
        }
        // 活动清盘期间,无法撤销订单
        ExchangeCoin exchangeCoin = exchangeCoinService.findBySymbol(order.getSymbol());
        if (exchangeCoin.getPublishType() != ExchangeCoinPublishType.NONE) {
            // 当前时间戳
            long currentTime = Calendar.getInstance().getTimeInMillis();
            try {
                // 处在活动结束时间与清盘结束时间之间
                if (currentTime > dateTimeFormat.parse(exchangeCoin.getEndTime()).getTime() && currentTime < dateTimeFormat.parse(exchangeCoin.getClearTime()).getTime()) {
                    return MessageResult.error(500, msService.getMessage("CANNOT_CANCEL_ORDER"));
                }
            } catch (ParseException e) {
                e.printStackTrace();
                return MessageResult.error(500, msService.getMessage("EXAPI_UNKNOWN_ERROR3"));
            }
        }
        if (isExchangeOrderExist(order)) {
            if (maxCancelTimes > 0 && orderService.findTodayOrderCancelTimes(member.getId(), order.getSymbol()) >= maxCancelTimes) {
                return MessageResult.error(500, msService.getMessage("CANCELLED") + maxCancelTimes + msService.getMessage("SECOND"));
            }
            // 发送消息至Exchange系统
            kafkaTemplate.send("exchange-order-cancel", JSON.toJSONString(order));
        } else {
            // 强制取消
            orderService.forceCancelOrder(order);
        }
        return MessageResult.success(msService.getMessage("EXAPI_SUCCESS"));
    }

    /**
     * 查找撮合交易器中订单是否存在
     * @param order
     * @return
     */
    public boolean isExchangeOrderExist(ExchangeOrder order) {
        try {
            String serviceName = "SERVICE-EXCHANGE-TRADE";
            String url = "http://" + serviceName + "/monitor/order?symbol=" + order.getSymbol() + "&orderId=" + order.getOrderId() + "&direction=" + order.getDirection() + "&type=" + order.getType();
            ResponseEnreplacedy<ExchangeOrder> result = restTemplate.getForEnreplacedy(url, ExchangeOrder.clreplaced);
            return result != null;
        } catch (Exception e) {
            e.printStackTrace();
            return false;
        }
    }

    /**
     * 获取下单时间限制
     * @return
     */
    @GetMapping("/time_limit")
    public MessageResult userAddExchangeTimeLimit() {
        MessageResult mr = new MessageResult();
        mr.setCode(0);
        mr.setMessage("EXAPI_SUCCESS");
        mr.setData(SysConstant.USER_ADD_EXCHANGE_ORDER_TIME_LIMIT_EXPIRE_TIME);
        return mr;
    }
}

19 View Source File : ExchangeOrderController.java
License : Apache License 2.0
Project Creator : xunibidev

/**
 * @author Hevin QQ:390330302 E-mail:[email protected]
 * @description
 * @date 2019/1/31 10:52
 */
@RestController
@RequestMapping("exchange/exchange-order")
public clreplaced ExchangeOrderController extends BaseAdminController {

    @Autowired
    private KafkaTemplate<String, String> kafkaTemplate;

    @Autowired
    private ExchangeOrderService exchangeOrderService;

    @Autowired
    private LocaleMessageSourceService messageSource;

    @RequiresPermissions("exchange:exchange-order:all")
    @PostMapping("all")
    @AccessLog(module = AdminModule.EXCHANGE, operation = "查找所有exchangeOrder")
    public MessageResult all() {
        List<ExchangeOrder> exchangeOrderList = exchangeOrderService.findAll();
        if (exchangeOrderList != null && exchangeOrderList.size() > 0) {
            return success(exchangeOrderList);
        }
        return error(messageSource.getMessage("NO_DATA"));
    }

    @RequiresPermissions("exchange:exchange-order:detail")
    @PostMapping("detail")
    @AccessLog(module = AdminModule.EXCHANGE, operation = "exchangeOrder详情")
    public MessageResult detail(String id) {
        List<ExchangeOrderDetail> one = exchangeOrderService.getAggregation(id);
        if (one == null) {
            return error(messageSource.getMessage("NO_DATA"));
        }
        return success(one);
    }

    @RequiresPermissions("exchange:exchange-order:page-query")
    @PostMapping("page-query")
    @AccessLog(module = AdminModule.EXCHANGE, operation = "分页查找exchangeOrder")
    public MessageResult page(PageModel pageModel, ExchangeOrderScreen screen) {
        if (pageModel.getDirection() == null && pageModel.getProperty() == null) {
            ArrayList<Sort.Direction> directions = new ArrayList<>();
            directions.add(Sort.Direction.DESC);
            pageModel.setDirection(directions);
            List<String> property = new ArrayList<>();
            property.add("time");
            pageModel.setProperty(property);
        }
        // 获取查询条件
        Predicate predicate = getPredicate(screen);
        Page<ExchangeOrder> all = exchangeOrderService.findAll(predicate, pageModel.getPageable());
        return success(all);
    }

    private Predicate getPredicate(ExchangeOrderScreen screen) {
        ArrayList<BooleanExpression> booleanExpressions = new ArrayList<>();
        QExchangeOrder qExchangeOrder = QExchangeOrder.exchangeOrder;
        if (screen.getOrderDirection() != null) {
            booleanExpressions.add(qExchangeOrder.direction.eq(screen.getOrderDirection()));
        }
        if (StringUtils.isNotEmpty(screen.getOrderId())) {
            booleanExpressions.add(qExchangeOrder.orderId.eq(screen.getOrderId()));
        }
        if (screen.getMemberId() != null) {
            booleanExpressions.add(qExchangeOrder.memberId.eq(screen.getMemberId()));
        }
        if (screen.getType() != null) {
            booleanExpressions.add(qExchangeOrder.type.eq(screen.getType()));
        }
        if (StringUtils.isNotBlank(screen.getCoinSymbol())) {
            booleanExpressions.add(qExchangeOrder.coinSymbol.equalsIgnoreCase(screen.getCoinSymbol()));
        }
        if (StringUtils.isNotBlank(screen.getBaseSymbol())) {
            booleanExpressions.add(qExchangeOrder.baseSymbol.equalsIgnoreCase(screen.getBaseSymbol()));
        }
        if (screen.getStatus() != null) {
            booleanExpressions.add(qExchangeOrder.status.eq(screen.getStatus()));
        }
        if (screen.getMinPrice() != null) {
            booleanExpressions.add(qExchangeOrder.price.goe(screen.getMinPrice()));
        }
        if (screen.getMaxPrice() != null) {
            booleanExpressions.add(qExchangeOrder.price.loe(screen.getMaxPrice()));
        }
        if (screen.getMinTradeAmount() != null) {
            booleanExpressions.add(qExchangeOrder.tradedAmount.goe(screen.getMinTradeAmount()));
        }
        if (screen.getMaxTradeAmount() != null) {
            booleanExpressions.add(qExchangeOrder.tradedAmount.loe(screen.getMaxTradeAmount()));
        }
        if (screen.getMinTurnOver() != null) {
            booleanExpressions.add(qExchangeOrder.turnover.goe(screen.getMinTurnOver()));
        }
        if (screen.getMaxTurnOver() != null) {
            booleanExpressions.add(qExchangeOrder.turnover.loe(screen.getMaxTurnOver()));
        }
        if (screen.getRobotOrder() != null && screen.getRobotOrder() == 1) {
            // 不看机器人(不包含机器人)
            booleanExpressions.add(qExchangeOrder.memberId.notIn(1, 2, 10001));
        // booleanExpressions.add(qExchangeOrder.memberId.notIn(69296 , 52350));
        }
        if (screen.getRobotOrder() != null && screen.getRobotOrder() == 0) {
            // 查看机器人
            booleanExpressions.add(qExchangeOrder.memberId.in(1, 2, 10001));
        // booleanExpressions.add(qExchangeOrder.memberId.in(69296 , 52350));
        }
        if (screen.getCompleted() != null) /**
         * 委托订单
         */
        {
            if (screen.getCompleted() == BooleanEnum.IS_FALSE) {
                booleanExpressions.add(qExchangeOrder.completedTime.isNull().and(qExchangeOrder.canceledTime.isNull()).and(qExchangeOrder.status.eq(ExchangeOrderStatus.TRADING)));
            } else {
                /**
                 * 历史订单
                 */
                booleanExpressions.add(qExchangeOrder.completedTime.isNotNull().or(qExchangeOrder.canceledTime.isNotNull()).or(qExchangeOrder.status.ne(ExchangeOrderStatus.TRADING)));
            }
        }
        return PredicateUtils.getPredicate(booleanExpressions);
    }

    @RequiresPermissions("exchange:exchange-order:entrust-details")
    @PostMapping("entrust-details")
    public MessageResult entrustDetails(ExchangeTradeScreen screen, PageModel pageModel) {
        /* ExchangeOrder
        StringBuilder headSql = new StringBuilder("select orderId as IF(a.direction=0,buyOrderId,sellOrderId)");

        StringBuilder headCount = new StringBuilder("select count(*) ");*/
        return null;
    }

    @RequiresPermissions("exchange:exchange-order:out-excel")
    @GetMapping("out-excel")
    @AccessLog(module = AdminModule.EXCHANGE, operation = "导出 exchangeOrder Excel")
    public MessageResult outExcel(@RequestParam(value = "memberId") Long memberId, @RequestParam(value = "type") ExchangeOrderType type, @RequestParam(value = "symbol") String symbol, @RequestParam(value = "status") ExchangeOrderStatus status, @RequestParam(value = "direction") ExchangeOrderDirection direction, HttpServletRequest request, HttpServletResponse response) throws Exception {
        // 获取查询条件
        List<Predicate> predicates = getPredicates(memberId, type, symbol, status, direction);
        List list = exchangeOrderService.queryWhereOrPage(predicates, null, null).getContent();
        return new FileUtil().exportExcel(request, response, list, "order");
    }

    // 查询条件的获取
    public List<Predicate> getPredicates(Long memberId, ExchangeOrderType type, String symbol, ExchangeOrderStatus status, ExchangeOrderDirection direction) {
        ArrayList<Predicate> predicates = new ArrayList<>();
        QExchangeOrder qExchangeOrder = QExchangeOrder.exchangeOrder;
        // predicates.add(qExchangeOrder.symbol.eq(QExchangeCoin.exchangeCoin.symbol));
        if (memberId != null) {
            predicates.add(qExchangeOrder.memberId.eq(memberId));
        }
        if (type != null) {
            predicates.add(qExchangeOrder.type.eq(type));
        }
        if (symbol != null) {
            predicates.add(qExchangeOrder.symbol.eq(symbol));
        }
        if (status != null) {
            predicates.add(qExchangeOrder.status.eq(status));
        }
        if (direction != null) {
            predicates.add(qExchangeOrder.direction.eq(direction));
        }
        return predicates;
    }

    @RequiresPermissions("exchange:exchange-order:cancel")
    @PostMapping("cancel")
    @AccessLog(module = AdminModule.EXCHANGE, operation = "取消委托")
    public MessageResult cancelOrder(String orderId) {
        ExchangeOrder order = exchangeOrderService.findOne(orderId);
        if (order.getStatus() != ExchangeOrderStatus.TRADING) {
            return MessageResult.error(500, "order not in trading");
        }
        // 发送消息至Exchange系统
        kafkaTemplate.send("exchange-order-cancel", JSON.toJSONString(order));
        return MessageResult.success(messageSource.getMessage("SUCCESS"));
    }
}

19 View Source File : ConsumerRecoveryCallback.java
License : Apache License 2.0
Project Creator : xm-online

@Slf4j
public clreplaced ConsumerRecoveryCallback implements RecoveryCallback<Object> {

    private final String tenantKey;

    private final TopicConfig topicConfig;

    private final KafkaTemplate<String, String> kafkaTemplate;

    public ConsumerRecoveryCallback(String tenantKey, TopicConfig topicConfig, KafkaTemplate<String, String> kafkaTemplate) {
        this.tenantKey = tenantKey;
        this.topicConfig = topicConfig;
        this.kafkaTemplate = kafkaTemplate;
    }

    @Override
    public Object recover(RetryContext context) {
        ConsumerRecord<?, ?> record = (ConsumerRecord) context.getAttribute(CONTEXT_RECORD);
        if (record == null) {
            log.warn("Message skipped. Message record is null for context: {}", context);
            return null;
        }
        String rawBody = String.valueOf(record.value());
        String deadLetterQueue = topicConfig.getDeadLetterQueue();
        try {
            putRid(record);
            if (StringUtils.isEmpty(deadLetterQueue)) {
                log.info("Message skipped. Processing failed for tenant: [{}], body = {}", tenantKey, rawBody);
                acknowledge(rawBody, context);
                return null;
            }
            kafkaTemplate.send(deadLetterQueue, rawBody);
            acknowledge(rawBody, context);
            log.warn("send message to dead-letter [{}] due to retry count exceeded [{}], " + "total processing time = {} ms, body = [{}]", deadLetterQueue, getRetryCounter(record), getTotalProcessingTime(record), rawBody);
        } finally {
            MdcUtils.clear();
        }
        return null;
    }

    private void acknowledge(String rawBody, RetryContext context) {
        Acknowledgment acknowledgment = (Acknowledgment) context.getAttribute(CONTEXT_ACKNOWLEDGMENT);
        if (acknowledgment == null) {
            log.warn("Acknowledge failed for message: [{}], tenant: [{}]", rawBody, tenantKey);
            return;
        }
        acknowledgment.acknowledge();
    }

    private void putRid(ConsumerRecord<?, ?> record) {
        MdcUtils.putRid(new StringJoiner(":").add(tenantKey).add(topicConfig.getTopicName()).add(getRid(record)).toString());
    }
}

19 View Source File : KafkaTransactionsPusher.java
License : GNU General Public License v3.0
Project Creator : wlhbdp

@Service
@Slf4j
public clreplaced KafkaTransactionsPusher implements Consumer<Transaction> {

    private KafkaTemplate<String, Object> kafkaTemplate;

    private Transaction lastTransaction;

    @Value("${kafka.topic.transactions}")
    private String topic;

    @Autowired
    public KafkaTransactionsPusher(KafkaTemplate<String, Object> kafkaTemplateForJson) {
        this.kafkaTemplate = kafkaTemplateForJson;
    }

    @Override
    public void accept(Transaction transaction) {
        lastTransaction = transaction;
        log.debug("{}", transaction);
        kafkaTemplate.send(topic, transaction);
    }

    public Transaction getLastTransaction() {
        return lastTransaction;
    }
}

19 View Source File : FlinkRulesService.java
License : GNU General Public License v3.0
Project Creator : wlhbdp

@Service
public clreplaced FlinkRulesService {

    private KafkaTemplate<String, String> kafkaTemplate;

    @Value("${kafka.topic.rules}")
    private String topic;

    private final ObjectMapper mapper = new ObjectMapper();

    @Autowired
    public FlinkRulesService(KafkaTemplate<String, String> kafkaTemplate) {
        this.kafkaTemplate = kafkaTemplate;
    }

    public void addRule(Rule rule) {
        String payload = rule.getRulePayload();
        kafkaTemplate.send(topic, payload);
    }

    public void deleteRule(int ruleId) throws JsonProcessingException {
        RulePayload payload = new RulePayload();
        payload.setRuleId(ruleId);
        payload.setRuleState(RuleState.DELETE);
        String payloadJson = mapper.writeValuereplacedtring(payload);
        kafkaTemplate.send(topic, payloadJson);
    }
}

19 View Source File : KafkaPassengerPublisher.java
License : Apache License 2.0
Project Creator : ververica

@Service
@Slf4j
public clreplaced KafkaPreplacedengerPublisher implements Consumer<InboundPreplacedengerMessage> {

    private final String topic;

    private final KafkaTemplate<Object, Object> kafkaTemplate;

    @Autowired
    public KafkaPreplacedengerPublisher(KafkaTemplate<Object, Object> kafkaTemplate, @Value("${kafka.topic.from-preplacedenger}") String topic) {
        this.kafkaTemplate = Objects.requireNonNull(kafkaTemplate);
        this.topic = Objects.requireNonNull(topic);
    }

    @Override
    public void accept(InboundPreplacedengerMessage preplacedenger) {
        byte[] bytes = preplacedenger.getPreplacedengerId().getBytes(StandardCharsets.UTF_8);
        kafkaTemplate.send(topic, bytes, preplacedenger.toByteArray()).addCallback(new ListenableFutureCallback<SendResult<Object, Object>>() {

            @Override
            public void onFailure(@NonNull Throwable throwable) {
                log.warn("couldn't send preplacedenger data.", throwable);
            }

            @Override
            public void onSuccess(SendResult<Object, Object> objectObjectSendResult) {
                log.info("Sent preplacedenger data");
            }
        });
    }
}

19 View Source File : KafkaDriverPublisher.java
License : Apache License 2.0
Project Creator : ververica

@Service
@Slf4j
public clreplaced KafkaDriverPublisher implements Consumer<InboundDriverMessage> {

    private final String topic;

    private KafkaTemplate<Object, Object> kafkaTemplate;

    @Autowired
    public KafkaDriverPublisher(KafkaTemplate<Object, Object> kafkaTemplateForJson, @Value("${kafka.topic.from-driver}") String topic) {
        this.kafkaTemplate = kafkaTemplateForJson;
        this.topic = topic;
    }

    @Override
    public void accept(InboundDriverMessage driver) {
        byte[] keyBytes = driver.getDriverId().getBytes(StandardCharsets.UTF_8);
        ListenableFuture<SendResult<Object, Object>> future = kafkaTemplate.send(topic, keyBytes, driver.toByteArray());
        future.addCallback(new ListenableFutureCallback<SendResult<Object, Object>>() {

            @Override
            public void onFailure(Throwable throwable) {
                log.warn("Failed sending an event to kafka", throwable);
            }

            @Override
            public void onSuccess(SendResult<Object, Object> objectObjectSendResult) {
            }
        });
    }
}

19 View Source File : StatsCollectorTest.java
License : Apache License 2.0
Project Creator : telstra

@RunWith(SpringRunner.clreplaced)
@SpringBootTest(clreplacedes = { StatsCollector.clreplaced })
@TestPropertySource("clreplacedpath:test.properties")
@MockBean(value = { KafkaTemplate.clreplaced })
public clreplaced StatsCollectorTest {

    @MockBean
    KafkaTemplate<String, Object> template;

    @Autowired
    StatsCollector statsCollector;

    @Value("${openkilda.server42.stats.kafka.topic.flowrtt.to_storm}")
    private String toStorm;

    @Test
    public void sendStatsTest() throws Exception {
        Builder bucketBuilder = FlowLatencyPacketBucket.newBuilder();
        FlowLatencyPacket packet1 = FlowLatencyPacket.newBuilder().setFlowId("some-flow-id-1").setDirection(false).setT0(100).setT1(150).setPacketId(1).build();
        FlowLatencyPacket packet2 = FlowLatencyPacket.newBuilder().setDirection(true).setT0(200).setT1(250).setPacketId(2).build();
        bucketBuilder.addPacket(packet1);
        bucketBuilder.addPacket(packet2);
        statsCollector.sendStats(bucketBuilder.build());
        ArgumentCaptor<InfoMessage> argument = ArgumentCaptor.forClreplaced(InfoMessage.clreplaced);
        verify(template).send(eq(toStorm), eq(packet1.getFlowId()), argument.capture());
        InfoMessage packet1Message = argument.getValue();
        FlowRttStatsData statsPacket1 = (FlowRttStatsData) packet1Message.getData();
        replacedertThat(statsPacket1).extracting(FlowRttStatsData::getFlowId, FlowRttStatsData::getT0, FlowRttStatsData::getT1).contains(packet1.getFlowId(), packet1.getT0(), packet1.getT1());
        replacedertThat(statsPacket1).extracting(FlowRttStatsData::getDirection).isEqualTo("forward");
        verify(template).send(eq(toStorm), eq(packet2.getFlowId()), argument.capture());
        InfoMessage packet2Message = argument.getValue();
        FlowRttStatsData statsPacket2 = (FlowRttStatsData) packet2Message.getData();
        replacedertThat(statsPacket2).extracting(FlowRttStatsData::getFlowId, FlowRttStatsData::getT0, FlowRttStatsData::getT1).contains(packet2.getFlowId(), packet2.getT0(), packet2.getT1());
        replacedertThat(statsPacket2).extracting(FlowRttStatsData::getDirection).isEqualTo("reverse");
    }
}

19 View Source File : StatsCollector.java
License : Apache License 2.0
Project Creator : telstra

@Service
@Slf4j
public clreplaced StatsCollector extends Thread {

    private final KafkaTemplate<String, Object> template;

    @Value("${openkilda.server42.stats.zeromq.server.endpoint}")
    private String connectEndpoint;

    @Value("${openkilda.server42.stats.kafka.topic.flowrtt.to_storm}")
    private String toStorm;

    private String sessionId;

    private ZContext context;

    public StatsCollector(KafkaTemplate<String, Object> template) {
        this.template = template;
    }

    @PostConstruct
    private void init() {
        context = new ZContext();
        this.start();
    }

    @PreDestroy
    private void clear() {
        context.close();
    }

    /**
     * Connect to server42 and get statistics.
     */
    @Override
    public void run() {
        sessionId = RandomStringUtils.randomAlphanumeric(8);
        log.info("started with session id {}", sessionId);
        while (!isInterrupted()) {
            Socket server = null;
            try {
                server = context.createSocket(ZMQ.PULL);
                server.setReceiveTimeOut(1000);
                server.connect(connectEndpoint);
                log.info("connect to {}", connectEndpoint);
                while (!isInterrupted()) {
                    byte[] recv = server.recv();
                    log.debug("recv {}", recv);
                    if (recv == null && server.errno() == ZError.EAGAIN) {
                        log.debug("EAGAIN received");
                        break;
                    } else if (recv != null && recv.length == 0) {
                        log.debug("ping received");
                        continue;
                    }
                    log.debug("stats received");
                    handleInput(recv);
                }
            } catch (org.zeromq.ZMQException ex) {
                log.error(ex.toString());
            } finally {
                log.info("disconnected");
                if (server != null) {
                    context.destroySocket(server);
                }
            }
        }
    }

    private void handleInput(byte[] recv) {
        try {
            FlowLatencyPacketBucket flowLatencyPacketBucket = FlowLatencyPacketBucket.parseFrom(recv);
            log.debug("getPacketList size {}", flowLatencyPacketBucket.getPacketList().size());
            sendStats(flowLatencyPacketBucket);
        } catch (InvalidProtocolBufferException e) {
            log.error(e.toString());
        }
    }

    void sendStats(FlowLatencyPacketBucket flowLatencyPacketBucket) throws InvalidProtocolBufferException {
        long currentTimeMillis = System.currentTimeMillis();
        for (FlowLatencyPacket packet : flowLatencyPacketBucket.getPacketList()) {
            FlowRttStatsData data = new FlowRttStatsData(packet.getFlowId(), FlowDirection.fromBoolean(packet.getDirection()).name().toLowerCase(), packet.getT0(), packet.getT1());
            InfoMessage message = new InfoMessage(data, currentTimeMillis, String.format("stats42-%s-%d", sessionId, packet.getPacketId()));
            log.debug("InfoMessage {}", message);
            template.send(toStorm, packet.getFlowId(), message);
        }
    }
}

19 View Source File : KafkaController.java
License : Apache License 2.0
Project Creator : telstra

@RestController
@RequestMapping(value = "/kafka")
@Slf4j
public clreplaced KafkaController {

    private final KafkaTemplate<String, Object> template;

    private static ApiMapper mapper = Mappers.getMapper(ApiMapper.clreplaced);

    @Value("${openkilda.server42.control.kafka.topic.to_storm}")
    private String toStorm;

    @Value("${openkilda.server42.control.kafka.topic.from_storm}")
    private String fromStorm;

    private ConcurrentHashMap<String, DeferredResult<ResponseEnreplacedy<?>>> deferredResultConcurrentHashMap = new ConcurrentHashMap<String, DeferredResult<ResponseEnreplacedy<?>>>();

    public KafkaController(KafkaTemplate<String, Object> template) {
        this.template = template;
    }

    @PostMapping(value = "/flow")
    private void createFlow(@RequestParam String switchId, @RequestBody AddFlowPayload flow) throws InterruptedException, ExecutionException, TimeoutException {
        send(switchId, mapper.map(flow));
    }

    @GetMapping(value = "/flow/")
    @ResponseBody
    private DeferredResult<ResponseEnreplacedy<?>> getFlowList(@RequestParam String switchId) throws InterruptedException, ExecutionException, TimeoutException {
        Headers headers = buildHeader();
        String correlationId = headers.getCorrelationId();
        send(switchId, new ListFlowsRequest(headers));
        DeferredResult<ResponseEnreplacedy<?>> deferredResult = new DeferredResult<>(500L);
        deferredResult.onTimeout(() -> {
            deferredResult.setErrorResult(ResponseEnreplacedy.status(HttpStatus.REQUEST_TIMEOUT).body("Request timeout occurred."));
            deferredResultConcurrentHashMap.remove(correlationId);
        });
        deferredResult.onCompletion(() -> deferredResultConcurrentHashMap.remove(correlationId));
        deferredResult.onError((Throwable throwable) -> {
            deferredResult.setErrorResult(ResponseEnreplacedy.status(HttpStatus.INTERNAL_SERVER_ERROR).body(throwable));
            deferredResultConcurrentHashMap.remove(correlationId);
        });
        deferredResultConcurrentHashMap.put(correlationId, deferredResult);
        return deferredResult;
    }

    @DeleteMapping(value = "/flow/{id}")
    private void deleteFlow(@RequestParam String switchId, @RequestParam(value = "id") String flowId, @RequestParam FlowDirection direction) throws InterruptedException, ExecutionException, TimeoutException {
        send(switchId, RemoveFlow.builder().headers(buildHeader()).flowId(flowId).direction(direction).build());
    }

    @DeleteMapping(value = "/flow/")
    private void clearFlows(@RequestParam String switchId) throws InterruptedException, ExecutionException, TimeoutException {
        send(switchId, ClearFlows.builder().headers(buildHeader()).build());
    }

    @PostMapping(value = "/settings/")
    private void pushSettings(@RequestParam String switchId, @RequestBody PushSettingsPayload settingsPayload) throws InterruptedException, ExecutionException, TimeoutException {
        send(switchId, mapper.map(settingsPayload));
    }

    @KafkaListener(id = "server42-control-storm-stub", topics = "${openkilda.server42.control.kafka.topic.to_storm}")
    private void listen(ListFlowsResponse listFlowsResponse) {
        try {
            DeferredResult<ResponseEnreplacedy<?>> responseEnreplacedyDeferredResult = deferredResultConcurrentHashMap.get(listFlowsResponse.getHeaders().getCorrelationId());
            log.info(listFlowsResponse.getFlowIds().toString());
            log.info(mapper.map(listFlowsResponse).toString());
            responseEnreplacedyDeferredResult.setResult(ResponseEnreplacedy.ok(mapper.map(listFlowsResponse)));
        } catch (NullPointerException ex) {
            log.error("ListFlowsRequest dropped correlation_id {}", listFlowsResponse.getHeaders().getCorrelationId());
        }
    }

    private void send(String switchId, Object payload) throws InterruptedException, ExecutionException, TimeoutException {
        ListenableFuture<SendResult<String, Object>> future = template.send(fromStorm, switchId, payload);
        future.get(30, TimeUnit.SECONDS);
    }

    private Headers buildHeader() {
        String correlationId = UUID.randomUUID().toString();
        return new Headers(correlationId);
    }
}

19 View Source File : ProducerServiceImpl.java
License : Apache License 2.0
Project Creator : tedburner

/**
 * @author: lingjun.jlj
 * @date: 2018/11/13 09:55
 * @description:
 */
@Slf4j
@Service
public clreplaced ProducerServiceImpl implements ProducerService {

    @Resource
    private KafkaTemplate<String, String> kafkaTemplate;

    @Override
    public void sendMessage(String topic, Object msgBody) {
        log.info("kafka produce a message, topic = " + topic + " message =  " + msgBody);
        String jsonString = FormatUtils.obj2str(msgBody);
        kafkaTemplate.send(topic, jsonString);
    }
}

19 View Source File : KafkaController.java
License : Apache License 2.0
Project Creator : tedburner

/**
 * @author: lingjun.jlj
 * @date: 2019/7/22 16:17
 * @version:1.0.0
 * @description:
 */
@Slf4j
@RestController
@RequestMapping(value = "/kafka")
public clreplaced KafkaController {

    // @Autowired
    private KafkaTemplate<String, String> kafkaTemplate;

    @GetMapping(value = "/send")
    public void send() {
        log.info("向kafka发送消息===============");
        Message message = Message.builder().id(System.currentTimeMillis()).msg("今天是" + new Date() + " 天气真不错!!!").build();
        kafkaTemplate.send(MqConstants.KAFKA_TOPIC_TEST, FormatUtils.obj2str(message));
    }
}

19 View Source File : KafkaSendServiceImpl.java
License : Apache License 2.0
Project Creator : sunshinelyz

/**
 * @author binghe
 * @version 1.0.0
 * @description KafkaSendServiceImpl
 */
public clreplaced KafkaSendServiceImpl implements MykitMqSendService {

    private KafkaTemplate kafkaTemplate;

    /**
     * Sets kafka template.
     *
     * @param kafkaTemplate the kafka template
     */
    public void setKafkaTemplate(final KafkaTemplate kafkaTemplate) {
        this.kafkaTemplate = kafkaTemplate;
    }

    @Override
    @SuppressWarnings("unchecked")
    public void sendMessage(final String destination, final Integer pattern, final byte[] message) {
        kafkaTemplate.send(destination, message);
    }
}

19 View Source File : KafkaSendServiceImpl.java
License : Apache License 2.0
Project Creator : sunshinelyz

/**
 * Sets kafka template.
 *
 * @param kafkaTemplate the kafka template
 */
public void setKafkaTemplate(final KafkaTemplate kafkaTemplate) {
    this.kafkaTemplate = kafkaTemplate;
}

19 View Source File : ShippingServiceImpl.java
License : MIT License
Project Creator : striderarun

/**
 * Created by arun_subramonian on 12/19/16.
 */
@Service
public clreplaced ShippingServiceImpl implements ShippingService {

    @Resource
    private ShippingRepository shippingRepository;

    @Autowired
    private KafkaTemplate kafkaTemplate;

    @Autowired
    private ObjectMapper objectMapper;

    @Override
    public void createShippingRequest(Long orderId) {
        Shipping shipping = new Shipping();
        shipping.setOrderId(orderId);
        shipping.setStatus(ShippingStatus.SHIPPED);
        shipping = shippingRepository.save(shipping);
        broadcastOrderShippedEvent(shipping);
    }

    @Override
    public void acknowledgeDelivery(Long shippingId) {
        Shipping shipping = shippingRepository.findOne(shippingId);
        shipping.setStatus(ShippingStatus.DELIVERED);
        shippingRepository.save(shipping);
    }

    private void broadcastOrderShippedEvent(Shipping shipping) {
        Event event = new Event();
        event.setOrderId(shipping.getOrderId());
        try {
            kafkaTemplate.send("ORDER_SHIPPED", objectMapper.writeValuereplacedtring(event));
        } catch (JsonProcessingException e) {
            e.printStackTrace();
        }
    }
}

19 View Source File : Controller.java
License : Apache License 2.0
Project Creator : spring-cloud-samples

/**
 * @author Gary Russell
 * @since 2.2.1
 */
@RestController
public clreplaced Controller {

    @Autowired
    private KafkaTemplate<Object, Object> template;

    @PostMapping(path = "/send/foo/{what}")
    public void sendFoo(@PathVariable String what) {
        this.template.send("topic1", new Foo1(what));
    }
}

19 View Source File : Controller.java
License : Apache License 2.0
Project Creator : spring-cloud-samples

/**
 * @author Gary Russell
 * @author Chris Bono
 * @since 2.2.1
 */
@RestController
public clreplaced Controller {

    @Autowired
    private KafkaTemplate<Object, Object> template;

    @PostMapping(path = "/send/foo/{what}")
    public void sendFoo(@PathVariable String what) {
        this.template.send("topic1", new Foo1(what));
    }

    @PostMapping(path = "/send/foo/message/{what}")
    public void sendFooAsMessage(@PathVariable String what) {
        Map<String, Object> headers = new HashMap<>();
        headers.put("kafka_topic", "topic1");
        headers.put("kafka_messageKey", "key-" + what);
        Message<Foo1> message = MessageBuilder.createMessage(new Foo1(what), new MessageHeaders(headers));
        this.template.send(message);
    }
}

19 View Source File : ApplicationTests.java
License : Apache License 2.0
Project Creator : spring-cloud-samples

@Bean
MessageVerifier<Message<?>> standaloneMessageVerifier(KafkaTemplate kafkaTemplate) {
    return new MessageVerifier<Message<?>>() {

        @Override
        public Message<?> receive(String destination, long timeout, TimeUnit timeUnit, @Nullable YamlContract contract) {
            return null;
        }

        @Override
        public Message<?> receive(String destination, YamlContract contract) {
            return null;
        }

        @Override
        public void send(Message<?> message, String destination, @Nullable YamlContract contract) {
        }

        @Override
        public <T> void send(T payload, Map<String, Object> headers, String destination, @Nullable YamlContract contract) {
            Map<String, Object> newHeaders = headers != null ? new HashMap<>(headers) : new HashMap<>();
            newHeaders.put(KafkaHeaders.TOPIC, destination);
            kafkaTemplate.send(MessageBuilder.createMessage(payload, new MessageHeaders(newHeaders)));
        }
    };
}

19 View Source File : MockSofaTracerSpringKafkaTest.java
License : Apache License 2.0
Project Creator : sofastack

/**
 *  MockSofaTracerSpringKafkaTest
 *
 * @author chenchen6  2020/9/13 22:22
 * @since 3.1.0
 */
public clreplaced MockSofaTracerSpringKafkaTest {

    @Autowired
    private KafkaTemplate<Integer, String> kafkaTemplate;

    @Test
    public void test() {
        if (Objects.isNull(kafkaTemplate)) {
            return;
        }
        kafkaTemplate.send("spring", "message");
    }
}

19 View Source File : WithdrawController.java
License : MIT License
Project Creator : sengeiou

/**
 * @author GS
 * @date 2018年01月26日
 */
@RestController
@Slf4j
@RequestMapping(value = "/withdraw", method = RequestMethod.POST)
public clreplaced WithdrawController {

    @Autowired
    private MemberAddressService memberAddressService;

    @Autowired
    private RedisTemplate redisTemplate;

    @Autowired
    private MemberService memberService;

    @Autowired
    private CoinService coinService;

    @Autowired
    private MemberWalletService memberWalletService;

    @Autowired
    private WithdrawRecordService withdrawApplyService;

    @Autowired
    private KafkaTemplate<String, String> kafkaTemplate;

    @Autowired
    private LocaleMessageSourceService sourceService;

    @Autowired
    private MemberTransactionService memberTransactionService;

    /**
     * 增加提现地址
     * @param address
     * @param unit
     * @param remark
     * @param code
     * @param aims
     * @param user
     * @return
     */
    @RequestMapping("address/add")
    @Transactional(rollbackFor = Exception.clreplaced)
    public MessageResult addAddress(String address, String unit, String remark, String code, String aims, @SessionAttribute(SESSION_MEMBER) AuthMember user) {
        hasText(address, sourceService.getMessage("MISSING_COIN_ADDRESS"));
        hasText(unit, sourceService.getMessage("MISSING_COIN_TYPE"));
        hasText(code, sourceService.getMessage("MISSING_VERIFICATION_CODE"));
        hasText(aims, sourceService.getMessage("MISSING_PHONE_OR_EMAIL"));
        ValueOperations valueOperations = redisTemplate.opsForValue();
        Member member = memberService.findOne(user.getId());
        if (member.getMobilePhone() != null && aims.equals(member.getMobilePhone())) {
            Object info = valueOperations.get(SysConstant.PHONE_ADD_ADDRESS_PREFIX + member.getMobilePhone());
            if (info == null || !info.toString().equals(code)) {
                return MessageResult.error(sourceService.getMessage("VERIFICATION_CODE_INCORRECT"));
            } else {
                valueOperations.getOperations().delete(SysConstant.PHONE_ADD_ADDRESS_PREFIX + member.getMobilePhone());
            }
        } else if (member.getEmail() != null && aims.equals(member.getEmail())) {
            Object info = valueOperations.get(SysConstant.ADD_ADDRESS_CODE_PREFIX + member.getEmail());
            if (!info.toString().equals(code)) {
                return MessageResult.error(sourceService.getMessage("VERIFICATION_CODE_INCORRECT"));
            } else {
                valueOperations.getOperations().delete(SysConstant.ADD_ADDRESS_CODE_PREFIX + member.getEmail());
            }
        } else {
            return MessageResult.error(sourceService.getMessage("ADD_ADDRESS_FAILED"));
        }
        MessageResult result = memberAddressService.addMemberAddress(user.getId(), address, unit, remark);
        if (result.getCode() == 0) {
            result.setMessage(sourceService.getMessage("ADD_ADDRESS_SUCCESS"));
        } else if (result.getCode() == 500) {
            result.setMessage(sourceService.getMessage("ADD_ADDRESS_FAILED"));
        } else if (result.getCode() == 600) {
            result.setMessage(sourceService.getMessage("COIN_NOT_SUPPORT"));
        }
        return result;
    }

    /**
     * 删除提现地址
     * @param id
     * @param user
     * @return
     */
    @RequestMapping("address/delete")
    @Transactional(rollbackFor = Exception.clreplaced)
    public MessageResult deleteAddress(long id, @SessionAttribute(SESSION_MEMBER) AuthMember user) {
        MessageResult result = memberAddressService.deleteMemberAddress(user.getId(), id);
        if (result.getCode() == 0) {
            result.setMessage(sourceService.getMessage("DELETE_ADDRESS_SUCCESS"));
        } else {
            result.setMessage(sourceService.getMessage("DELETE_ADDRESS_FAILED"));
        }
        return result;
    }

    /**
     * 提现地址分页信息
     * @param user
     * @param pageNo
     * @param pageSize
     * @param unit
     * @return
     */
    @RequestMapping("address/page")
    public MessageResult addressPage(@SessionAttribute(SESSION_MEMBER) AuthMember user, int pageNo, int pageSize, String unit) {
        Page<MemberAddress> page = memberAddressService.pageQuery(pageNo, pageSize, user.getId(), unit);
        Page<ScanMemberAddress> scanMemberAddresses = page.map(x -> ScanMemberAddress.toScanMemberAddress(x));
        MessageResult result = MessageResult.success();
        result.setData(scanMemberAddresses);
        return result;
    }

    /**
     * 支持提现的地址
     * @return
     */
    @RequestMapping("support/coin")
    public MessageResult queryWithdraw() {
        List<Coin> list = coinService.findAllCanWithDraw();
        List<String> list1 = new ArrayList<>();
        list.stream().forEach(x -> list1.add(x.getUnit()));
        MessageResult result = MessageResult.success();
        result.setData(list1);
        return result;
    }

    /**
     * 提现币种详细信息
     * @param user
     * @return
     */
    @RequestMapping("support/coin/info")
    public MessageResult queryWithdrawCoin(@SessionAttribute(SESSION_MEMBER) AuthMember user) {
        List<Coin> list = coinService.findAllCanWithDraw();
        List<MemberWallet> list1 = memberWalletService.findAllByMemberId(user.getId());
        long id = user.getId();
        List<WithdrawWalletInfo> list2 = list1.stream().filter(x -> list.contains(x.getCoin())).map(x -> WithdrawWalletInfo.builder().balance(x.getBalance()).withdrawScale(x.getCoin().getWithdrawScale()).maxTxFee(x.getCoin().getMaxTxFee()).minTxFee(x.getCoin().getMinTxFee()).minAmount(x.getCoin().getMinWithdrawAmount()).maxAmount(x.getCoin().getMaxWithdrawAmount()).name(x.getCoin().getName()).nameCn(x.getCoin().getNameCn()).threshold(x.getCoin().getWithdrawThreshold()).unit(x.getCoin().getUnit()).canAutoWithdraw(x.getCoin().getCanAutoWithdraw()).addresses(memberAddressService.queryAddress(id, x.getCoin().getName())).build()).collect(Collectors.toList());
        MessageResult result = MessageResult.success();
        result.setData(list2);
        return result;
    }

    /**
     * 申请提币(请到PC端提币或升级APP)
     * 没有验证码校验
     * @param user
     * @param unit
     * @param address
     * @param amount
     * @param fee
     * @param remark
     * @param jyPreplacedword
     * @return
     * @throws Exception
     */
    @RequestMapping("apply")
    @Transactional(rollbackFor = Exception.clreplaced)
    public MessageResult withdraw(@SessionAttribute(SESSION_MEMBER) AuthMember user, String unit, String address, BigDecimal amount, BigDecimal fee, String remark, String jyPreplacedword) throws Exception {
        return MessageResult.success(sourceService.getMessage("WITHDRAW_TO_PC"));
    }

    /**
     * 申请提币(添加验证码校验)
     * @param user
     * @param unit
     * @param address
     * @param amount
     * @param fee
     * @param remark
     * @param jyPreplacedword
     * @return
     * @throws Exception
     */
    @RequestMapping("apply/code")
    @Transactional(rollbackFor = Exception.clreplaced)
    public MessageResult withdrawCode(@SessionAttribute(SESSION_MEMBER) AuthMember user, String unit, String address, BigDecimal amount, BigDecimal fee, String remark, String jyPreplacedword, @RequestParam("code") String code) throws Exception {
        hasText(jyPreplacedword, sourceService.getMessage("MISSING_JYPreplacedWORD"));
        hasText(unit, sourceService.getMessage("MISSING_COIN_TYPE"));
        Coin coin = coinService.findByUnit(unit);
        amount.setScale(coin.getWithdrawScale(), BigDecimal.ROUND_DOWN);
        notNull(coin, sourceService.getMessage("COIN_ILLEGAL"));
        isTrue(coin.getStatus().equals(CommonStatus.NORMAL) && coin.getCanWithdraw().equals(BooleanEnum.IS_TRUE), sourceService.getMessage("COIN_NOT_SUPPORT"));
        isTrue(compare(fee, new BigDecimal(String.valueOf(coin.getMinTxFee()))), sourceService.getMessage("CHARGE_MIN") + coin.getMinTxFee());
        isTrue(compare(new BigDecimal(String.valueOf(coin.getMaxTxFee())), fee), sourceService.getMessage("CHARGE_MAX") + coin.getMaxTxFee());
        isTrue(compare(coin.getMaxWithdrawAmount(), amount), sourceService.getMessage("WITHDRAW_MAX") + coin.getMaxWithdrawAmount());
        isTrue(compare(amount, coin.getMinWithdrawAmount()), sourceService.getMessage("WITHDRAW_MIN") + coin.getMinWithdrawAmount());
        MemberWallet memberWallet = memberWalletService.findByCoinAndMemberId(coin, user.getId());
        isTrue(compare(memberWallet.getBalance(), amount), sourceService.getMessage("INSUFFICIENT_BALANCE"));
        // isTrue(memberAddressService.findByMemberIdAndAddress(user.getId(), address).size() > 0, sourceService.getMessage("WRONG_ADDRESS"));
        isTrue(memberWallet.getIsLock() == BooleanEnum.IS_FALSE, "钱包已锁定");
        Member member = memberService.findOne(user.getId());
        String mbPreplacedword = member.getJyPreplacedword();
        replacedert.hasText(mbPreplacedword, sourceService.getMessage("NO_SET_JYPreplacedWORD"));
        replacedert.isTrue(Md5.md5Digest(jyPreplacedword + member.getSalt()).toLowerCase().equals(mbPreplacedword), sourceService.getMessage("ERROR_JYPreplacedWORD"));
        ValueOperations valueOperations = redisTemplate.opsForValue();
        String phone = member.getMobilePhone();
        Object codeRedis = valueOperations.get(SysConstant.PHONE_WITHDRAW_MONEY_CODE_PREFIX + phone);
        notNull(codeRedis, sourceService.getMessage("VERIFICATION_CODE_NOT_EXISTS"));
        if (!codeRedis.toString().equals(code)) {
            return error(sourceService.getMessage("VERIFICATION_CODE_INCORRECT"));
        } else {
            valueOperations.getOperations().delete(SysConstant.PHONE_WITHDRAW_MONEY_CODE_PREFIX + phone);
        }
        MessageResult result = memberWalletService.freezeBalance(memberWallet, amount);
        if (result.getCode() != 0) {
            throw new InformationExpiredException("Information Expired");
        }
        WithdrawRecord withdrawApply = new WithdrawRecord();
        withdrawApply.setCoin(coin);
        withdrawApply.setFee(fee);
        withdrawApply.setArrivedAmount(sub(amount, fee));
        withdrawApply.setMemberId(user.getId());
        withdrawApply.setTotalAmount(amount);
        withdrawApply.setAddress(address);
        withdrawApply.setRemark(remark);
        withdrawApply.setCanAutoWithdraw(coin.getCanAutoWithdraw());
        // 提币数量低于或等于阈值并且该币种支持自动提币
        if (amount.compareTo(coin.getWithdrawThreshold()) <= 0 && coin.getCanAutoWithdraw().equals(BooleanEnum.IS_TRUE)) {
            withdrawApply.setStatus(WithdrawStatus.WAITING);
            withdrawApply.setIsAuto(BooleanEnum.IS_TRUE);
            withdrawApply.setDealTime(withdrawApply.getCreateTime());
            WithdrawRecord withdrawRecord = withdrawApplyService.save(withdrawApply);
            JSONObject json = new JSONObject();
            json.put("uid", user.getId());
            // 提币总数量
            json.put("totalAmount", amount);
            // 手续费
            json.put("fee", fee);
            // 预计到账数量
            json.put("arriveAmount", sub(amount, fee));
            // 币种
            json.put("coin", coin);
            // 提币地址
            json.put("address", address);
            // 提币记录id
            json.put("withdrawId", withdrawRecord.getId());
            kafkaTemplate.send("withdraw", coin.getUnit(), json.toJSONString());
            return MessageResult.success(sourceService.getMessage("APPLY_SUCCESS"));
        } else {
            withdrawApply.setStatus(WithdrawStatus.PROCESSING);
            withdrawApply.setIsAuto(BooleanEnum.IS_FALSE);
            if (withdrawApplyService.save(withdrawApply) != null) {
                return MessageResult.success(sourceService.getMessage("APPLY_AUDIT"));
            } else {
                throw new InformationExpiredException("Information Expired");
            }
        }
    }

    /**
     * 提币记录
     * @param user
     * @param page
     * @param pageSize
     * @return
     */
    @GetMapping("record")
    public MessageResult pageWithdraw(@SessionAttribute(SESSION_MEMBER) AuthMember user, int page, int pageSize) {
        MessageResult mr = new MessageResult(0, "success");
        Page<WithdrawRecord> records = withdrawApplyService.findAllByMemberId(user.getId(), page, pageSize);
        records.map(x -> ScanWithdrawRecord.toScanWithdrawRecord(x));
        mr.setData(records);
        return mr;
    }
}

19 View Source File : OrderController.java
License : MIT License
Project Creator : sengeiou

/**
 * 委托订单处理类
 */
@Slf4j
@RestController
@RequestMapping("/order")
public clreplaced OrderController {

    @Autowired
    private ExchangeOrderService orderService;

    @Autowired
    private MemberWalletService walletService;

    @Autowired
    private ExchangeCoinService exchangeCoinService;

    @Autowired
    private CoinService coinService;

    @Autowired
    private KafkaTemplate<String, String> kafkaTemplate;

    @Autowired
    private ExchangeOrderDetailService exchangeOrderDetailService;

    @Value("${exchange.max-cancel-times:-1}")
    private int maxCancelTimes;

    @Autowired
    private LocaleMessageSourceService msService;

    @Autowired
    private MemberService memberService;

    @Autowired
    private RestTemplate restTemplate;

    @Autowired
    private RedisTemplate redisTemplate;

    /**
     * 添加委托订单
     * @param authMember
     * @param direction
     * @param symbol
     * @param price
     * @param amount
     * @param type
     *          usedisCount 暂时不用
     * @return
     */
    @RequestMapping("add")
    public MessageResult addOrder(@SessionAttribute(SESSION_MEMBER) AuthMember authMember, ExchangeOrderDirection direction, String symbol, BigDecimal price, BigDecimal amount, ExchangeOrderType type) {
        int expireTime = SysConstant.USER_ADD_EXCHANGE_ORDER_TIME_LIMIT_EXPIRE_TIME;
        ValueOperations valueOperations = redisTemplate.opsForValue();
        if (direction == null || type == null) {
            return MessageResult.error(500, msService.getMessage("ILLEGAL_ARGUMENT"));
        }
        Member member = memberService.findOne(authMember.getId());
        if (member.getMemberLevel() == MemberLevelEnum.GENERAL) {
            return MessageResult.error(500, "请先进行实名认证");
        }
        // 是否被禁止交易
        if (member.getTransactionStatus().equals(BooleanEnum.IS_FALSE)) {
            return MessageResult.error(500, msService.getMessage("CANNOT_TRADE"));
        }
        ExchangeOrder order = new ExchangeOrder();
        // 判断限价输入值是否小于零
        if (price.compareTo(BigDecimal.ZERO) <= 0 && type == ExchangeOrderType.LIMIT_PRICE) {
            return MessageResult.error(500, msService.getMessage("EXORBITANT_PRICES"));
        }
        // 判断数量小于零
        if (amount.compareTo(BigDecimal.ZERO) <= 0) {
            return MessageResult.error(500, msService.getMessage("NUMBER_OF_ILLEGAL"));
        }
        // 根据交易对名称(symbol)获取交易对儿信息
        ExchangeCoin exchangeCoin = exchangeCoinService.findBySymbol(symbol);
        if (exchangeCoin == null || exchangeCoin.getEnable() != 1) {
            return MessageResult.error(500, msService.getMessage("NONSUPPORT_COIN"));
        }
        // 获取基准币
        String baseCoin = exchangeCoin.getBaseSymbol();
        // 获取交易币
        String exCoin = exchangeCoin.getCoinSymbol();
        Coin coin;
        // 根据交易方向查询币种信息
        if (direction == ExchangeOrderDirection.SELL) {
            coin = coinService.findByUnit(exCoin);
        } else {
            coin = coinService.findByUnit(baseCoin);
        }
        if (coin == null) {
            return MessageResult.error(500, msService.getMessage("NONSUPPORT_COIN"));
        }
        // 设置价格精度
        price = price.setScale(exchangeCoin.getBaseCoinScale(), BigDecimal.ROUND_DOWN);
        // 委托数量和精度控制
        if (direction == ExchangeOrderDirection.BUY && type == ExchangeOrderType.MARKET_PRICE) {
            amount = amount.setScale(exchangeCoin.getBaseCoinScale(), BigDecimal.ROUND_DOWN);
            // 最小成交额控制
            if (amount.compareTo(exchangeCoin.getMinTurnover()) < 0) {
                return MessageResult.error(500, "成交额至少为" + exchangeCoin.getMinTurnover());
            }
        } else {
            amount = amount.setScale(exchangeCoin.getCoinScale(), BigDecimal.ROUND_DOWN);
            // 成交量范围控制
            if (exchangeCoin.getMaxVolume() != null && exchangeCoin.getMaxVolume().compareTo(BigDecimal.ZERO) != 0 && exchangeCoin.getMaxVolume().compareTo(amount) < 0) {
                return MessageResult.error(msService.getMessage("AMOUNT_OVER_SIZE") + " " + exchangeCoin.getMaxVolume());
            }
            if (exchangeCoin.getMinVolume() != null && exchangeCoin.getMinVolume().compareTo(BigDecimal.ZERO) != 0 && exchangeCoin.getMinVolume().compareTo(amount) > 0) {
                return MessageResult.error(msService.getMessage("AMOUNT_TOO_SMALL") + " " + exchangeCoin.getMinVolume());
            }
        }
        if (price.compareTo(BigDecimal.ZERO) <= 0 && type == ExchangeOrderType.LIMIT_PRICE) {
            return MessageResult.error(500, msService.getMessage("EXORBITANT_PRICES"));
        }
        if (amount.compareTo(BigDecimal.ZERO) <= 0) {
            return MessageResult.error(500, msService.getMessage("NUMBER_OF_ILLEGAL"));
        }
        MemberWallet baseCoinWallet = walletService.findByCoinUnitAndMemberId(baseCoin, member.getId());
        MemberWallet exCoinWallet = walletService.findByCoinUnitAndMemberId(exCoin, member.getId());
        if (baseCoinWallet == null || exCoinWallet == null) {
            return MessageResult.error(500, msService.getMessage("NONSUPPORT_COIN"));
        }
        if (baseCoinWallet.getIsLock() == BooleanEnum.IS_TRUE || exCoinWallet.getIsLock() == BooleanEnum.IS_TRUE) {
            return MessageResult.error(500, msService.getMessage("WALLET_LOCKED"));
        }
        // 如果有最低卖价限制,出价不能低于此价,且禁止市场价格卖
        if (direction == ExchangeOrderDirection.SELL && exchangeCoin.getMinSellPrice().compareTo(BigDecimal.ZERO) > 0 && ((price.compareTo(exchangeCoin.getMinSellPrice()) < 0) || type == ExchangeOrderType.MARKET_PRICE)) {
            return MessageResult.error(500, msService.getMessage("EXORBITANT_PRICES"));
        }
        // 查看是否启用市价买卖
        if (type == ExchangeOrderType.MARKET_PRICE) {
            if (exchangeCoin.getEnableMarketBuy() == BooleanEnum.IS_FALSE && direction == ExchangeOrderDirection.BUY) {
                return MessageResult.error(500, "不支持市价购买");
            } else if (exchangeCoin.getEnableMarketSell() == BooleanEnum.IS_FALSE && direction == ExchangeOrderDirection.SELL) {
                return MessageResult.error(500, "不支持市价出售");
            }
        }
        // 限制委托数量
        if (exchangeCoin.getMaxTradingOrder() > 0 && orderService.findCurrentTradingCount(member.getId(), symbol, direction) >= exchangeCoin.getMaxTradingOrder()) {
            return MessageResult.error(500, "超过最大挂单数量 " + exchangeCoin.getMaxTradingOrder());
        }
        order.setMemberId(member.getId());
        order.setSymbol(symbol);
        order.setBaseSymbol(baseCoin);
        order.setCoinSymbol(exCoin);
        order.setType(type);
        order.setDirection(direction);
        if (order.getType() == ExchangeOrderType.MARKET_PRICE) {
            order.setPrice(BigDecimal.ZERO);
        } else {
            order.setPrice(price);
        }
        order.setUseDiscount("0");
        // 限价买入单时amount为用户设置的总成交额
        order.setAmount(amount);
        MessageResult mr = orderService.addOrder(member.getId(), order);
        if (mr.getCode() != 0) {
            return MessageResult.error(500, "提交订单失败:" + mr.getMessage());
        }
        log.info(">>>>>>>>>>订单提交完成>>>>>>>>>>");
        // 发送消息至Exchange系统
        kafkaTemplate.send("exchange-order", JSON.toJSONString(order));
        MessageResult result = MessageResult.success("success");
        result.setData(order.getOrderId());
        return result;
    }

    /**
     * 历史委托
     */
    @RequestMapping("history")
    public Page<ExchangeOrder> historyOrder(@SessionAttribute(SESSION_MEMBER) AuthMember member, String symbol, int pageNo, int pageSize) {
        Page<ExchangeOrder> page = orderService.findHistory(member.getId(), symbol, pageNo, pageSize);
        page.getContent().forEach(exchangeOrder -> {
            // 获取交易成交详情
            exchangeOrder.setDetail(exchangeOrderDetailService.findAllByOrderId(exchangeOrder.getOrderId()));
        });
        return page;
    }

    /**
     * 个人中心历史委托
     */
    @RequestMapping("personal/history")
    public Page<ExchangeOrder> personalHistoryOrder(@SessionAttribute(SESSION_MEMBER) AuthMember member, @RequestParam(value = "symbol", required = false) String symbol, @RequestParam(value = "type", required = false) ExchangeOrderType type, @RequestParam(value = "status", required = false) ExchangeOrderStatus status, @RequestParam(value = "startTime", required = false) String startTime, @RequestParam(value = "endTime", required = false) String endTime, @RequestParam(value = "direction", required = false) ExchangeOrderDirection direction, @RequestParam(value = "pageNo", defaultValue = "1") int pageNo, @RequestParam(value = "pageSize", defaultValue = "10") int pageSize) {
        Page<ExchangeOrder> page = orderService.findPersonalHistory(member.getId(), symbol, type, status, startTime, endTime, direction, pageNo, pageSize);
        page.getContent().forEach(exchangeOrder -> {
            // 获取交易成交详情
            exchangeOrder.setDetail(exchangeOrderDetailService.findAllByOrderId(exchangeOrder.getOrderId()));
        });
        return page;
    }

    /**
     * 个人中心当前委托
     * @param member
     * @param symbol
     * @param type
     * @param startTime
     * @param endTime
     * @param pageNo
     * @param pageSize
     * @return
     */
    @RequestMapping("personal/current")
    public Page<ExchangeOrder> personalCurrentOrder(@SessionAttribute(SESSION_MEMBER) AuthMember member, @RequestParam(value = "symbol", required = false) String symbol, @RequestParam(value = "type", required = false) ExchangeOrderType type, @RequestParam(value = "startTime", required = false) String startTime, @RequestParam(value = "endTime", required = false) String endTime, @RequestParam(value = "direction", required = false) ExchangeOrderDirection direction, @RequestParam(value = "pageNo", defaultValue = "1") int pageNo, @RequestParam(value = "pageSize", defaultValue = "10") int pageSize) {
        Page<ExchangeOrder> page = orderService.findPersonalCurrent(member.getId(), symbol, type, startTime, endTime, direction, pageNo, pageSize);
        page.getContent().forEach(exchangeOrder -> {
            // 获取交易成交详情
            BigDecimal tradedAmount = BigDecimal.ZERO;
            List<ExchangeOrderDetail> details = exchangeOrderDetailService.findAllByOrderId(exchangeOrder.getOrderId());
            exchangeOrder.setDetail(details);
            for (ExchangeOrderDetail trade : details) {
                tradedAmount = tradedAmount.add(trade.getAmount());
            }
            exchangeOrder.setTradedAmount(tradedAmount);
        });
        return page;
    }

    /**
     * 当前委托
     *
     * @param member
     * @param pageNo
     * @param pageSize
     * @return
     */
    @RequestMapping("current")
    public Page<ExchangeOrder> currentOrder(@SessionAttribute(SESSION_MEMBER) AuthMember member, String symbol, int pageNo, int pageSize) {
        Page<ExchangeOrder> page = orderService.findCurrent(member.getId(), symbol, pageNo, pageSize);
        page.getContent().forEach(exchangeOrder -> {
            // 获取交易成交详情
            BigDecimal tradedAmount = BigDecimal.ZERO;
            List<ExchangeOrderDetail> details = exchangeOrderDetailService.findAllByOrderId(exchangeOrder.getOrderId());
            exchangeOrder.setDetail(details);
            for (ExchangeOrderDetail trade : details) {
                tradedAmount = tradedAmount.add(trade.getAmount());
            }
            exchangeOrder.setTradedAmount(tradedAmount);
        });
        return page;
    }

    /**
     * 查询委托成交明细
     *
     * @param member
     * @param orderId
     * @return
     */
    @RequestMapping("detail/{orderId}")
    public List<ExchangeOrderDetail> currentOrder(@SessionAttribute(SESSION_MEMBER) AuthMember member, @PathVariable String orderId) {
        return exchangeOrderDetailService.findAllByOrderId(orderId);
    }

    @RequestMapping("cancel/{orderId}")
    public MessageResult cancelOrder(@SessionAttribute(SESSION_MEMBER) AuthMember member, @PathVariable String orderId) {
        ExchangeOrder order = orderService.findOne(orderId);
        if (order.getMemberId() != member.getId()) {
            return MessageResult.error(500, "禁止操作");
        }
        if (order.getStatus() != ExchangeOrderStatus.TRADING) {
            return MessageResult.error(500, "订单不在交易");
        }
        if (isExchangeOrderExist(order)) {
            if (maxCancelTimes > 0 && orderService.findTodayOrderCancelTimes(member.getId(), order.getSymbol()) >= maxCancelTimes) {
                return MessageResult.error(500, "你今天已经取消了 " + maxCancelTimes + " 次");
            }
            // 发送消息至Exchange系统
            kafkaTemplate.send("exchange-order-cancel", JSON.toJSONString(order));
        } else {
            // 强制取消
            orderService.forceCancelOrder(order);
        }
        return MessageResult.success("success");
    }

    /**
     * 查找撮合交易器中订单是否存在
     * @param order
     * @return
     */
    public boolean isExchangeOrderExist(ExchangeOrder order) {
        try {
            String serviceName = "SERVICE-EXCHANGE-TRADE";
            String url = "http://" + serviceName + "/monitor/order?symbol=" + order.getSymbol() + "&orderId=" + order.getOrderId() + "&direction=" + order.getDirection() + "&type=" + order.getType();
            ResponseEnreplacedy<ExchangeOrder> result = restTemplate.getForEnreplacedy(url, ExchangeOrder.clreplaced);
            return result != null;
        } catch (Exception e) {
            e.printStackTrace();
            return false;
        }
    }

    /**
     * 获取下单时间限制
     * @return
     */
    @GetMapping("/time_limit")
    public MessageResult userAddExchangeTimeLimit() {
        MessageResult mr = new MessageResult();
        mr.setCode(0);
        mr.setMessage("success");
        mr.setData(SysConstant.USER_ADD_EXCHANGE_ORDER_TIME_LIMIT_EXPIRE_TIME);
        return mr;
    }
}

19 View Source File : KafkaServiceImpl.java
License : Apache License 2.0
Project Creator : sanshengshui

/**
 * @author james
 * @description kafka消息生产者处理类
 */
@Service
public clreplaced KafkaServiceImpl implements GrozaKafkaService {

    @Autowired
    private KafkaTemplate kafkaTemplate;

    private static Gson gson = new GsonBuilder().create();

    @Override
    public void send(InternalMessage internalMessage) {
        kafkaTemplate.send(internalMessage.getTopic(), gson.toJson(internalMessage));
    }
}

19 View Source File : KafkaItemWriter.java
License : Apache License 2.0
Project Creator : redis-developer

/**
 * @author Julien Ruaux
 */
public clreplaced KafkaItemWriter<K> extends AbstracreplacedemStreamItemWriter<ProducerRecord<K, Object>> {

    private final KafkaTemplate<K, Object> kafkaTemplate;

    @Builder
    private KafkaItemWriter(@NonNull KafkaTemplate<K, Object> kafkaTemplate) {
        this.kafkaTemplate = kafkaTemplate;
    }

    @Override
    public void write(List<? extends ProducerRecord<K, Object>> items) {
        for (ProducerRecord<K, Object> item : items) {
            this.kafkaTemplate.send(item);
        }
    }
}

19 View Source File : BankAccountServiceImpl.java
License : Apache License 2.0
Project Creator : PhoenixIQ

/**
 * @author baozi
 * @date 2020/5/27 12:09 PM
 */
@JsonSerialize
@Slf4j
@Service
public clreplaced BankAccountServiceImpl implements BankAccountService {

    @Value("${phoenix.server.topic.account}")
    private String accountTopic;

    @Value("${phoenix.server.topic.account-tn}")
    private String accountTnTopic;

    @Value("${phoenix.server.topic.create-account-event}")
    private String createAccountEventTopic;

    // kafka发送端
    private final KafkaTemplate<String, String> kafkaTemplate;

    // phoenix 客户端
    private final PhoenixClient phoenixClient;

    // 账户存储
    private final AccountStoreRepository accountStoreRepository;

    public BankAccountServiceImpl(KafkaTemplate<String, String> kafkaTemplate, PhoenixClient phoenixClient, AccountStoreRepository accountStoreRepository) {
        this.kafkaTemplate = kafkaTemplate;
        this.phoenixClient = phoenixClient;
        this.accountStoreRepository = accountStoreRepository;
    }

    @Override
    public String queryAllAccount(boolean linearizability) {
        // 1. 通过数据库查询账户列表
        List<AccountStore> accountStores = new ArrayList<>();
        accountStoreRepository.findAll().forEach(accountStore -> accountStores.add(accountStore));
        // 2. 查询账户信息,如果linearizability == true,会使用QueryCmd直接读取内存来
        // 达到线性一致性读. 否则会读业务数据库实现最终一致性读(业务数据库是异步写入的)
        List<AccountQueryEvent> accountQueryEvents = new ArrayList<>();
        if (linearizability) {
            accountStores.forEach(accountStore -> {
                Future<RpcResult> future = phoenixClient.send(new AccountQueryCmd(accountStore.getAccountCode()), accountTopic, null);
                RpcResult<AccountQueryEvent> rpcResult = null;
                try {
                    rpcResult = future.get(100, TimeUnit.SECONDS);
                } catch (Exception e) {
                    log.error(e.getLocalizedMessage(), e);
                    return;
                }
                AccountQueryEvent accountQueryEvent = rpcResult.getData();
                accountQueryEvents.add(accountQueryEvent);
            });
        } else {
            accountStores.forEach(accountStore -> accountQueryEvents.add(new AccountQueryEvent(accountStore.getAccountCode(), accountStore.getBalanceAmt(), accountStore.getSuccessTransferOut(), accountStore.getFailTransferOut(), accountStore.getSuccessTransferIn())));
        }
        // 3. 转换为html
        double totalBalanceAmt = 0;
        int totalSuccessTransferOut = 0;
        int totalFailTransferOut = 0;
        int totalSuccessTransferIn = 0;
        StringBuffer sb = new StringBuffer();
        sb.append("<table border=1 width='1200px'>");
        sb.append("<tr><th>银行账户</th><th>账户余额</th><th>成功转出次数</th><th>失败转出次数</th><th>成功转入次数</th></tr>");
        for (AccountQueryEvent accountQueryEvent : accountQueryEvents) {
            sb.append("<tr>");
            sb.append("<td>" + accountQueryEvent.getAccount() + "</td>");
            sb.append("<td>" + accountQueryEvent.getBalanceAmt() + "</td>");
            sb.append("<td>" + accountQueryEvent.getSuccessTransferOut() + "</td>");
            sb.append("<td>" + accountQueryEvent.getFailTransferOut() + "</td>");
            sb.append("<td>" + accountQueryEvent.getSuccessTransferIn() + "</td>");
            sb.append("</tr>");
            totalBalanceAmt += accountQueryEvent.getBalanceAmt();
            totalSuccessTransferOut += accountQueryEvent.getSuccessTransferOut();
            totalFailTransferOut += accountQueryEvent.getFailTransferOut();
            totalSuccessTransferIn += accountQueryEvent.getSuccessTransferIn();
        }
        if (accountQueryEvents.size() > 1) {
            sb.append("<tr>");
            sb.append("<td>账户数量:" + accountQueryEvents.size() + "</td>");
            sb.append("<td>账户余额汇总:" + totalBalanceAmt + "</td>");
            sb.append("<td>成功转出汇总:" + totalSuccessTransferOut + "</td>");
            sb.append("<td>失败转出汇总:" + totalFailTransferOut + "</td>");
            sb.append("<td>成功转入汇总:" + totalSuccessTransferIn + "</td>");
            sb.append("</tr>");
        }
        sb.append("</table>");
        return sb.toString();
    }

    @Override
    public String startBenchmarkTransfer(int total, int tps, int aggregateNum) {
        log.info("start a message test: aggregateNum<{}> total<{}>, tps<{}>", aggregateNum, total, tps);
        int timeout = total / tps + 5;
        RateLimiter messageTestTask = new RateLimiter(tps, total, timeout, () -> {
            String outAccount = codeFormat(new Random().nextInt(aggregateNum));
            String inAccount = codeFormat(new Random().nextInt(aggregateNum));
            int amt = new Random().nextInt(100);
            AccountTransferCmd req = new AccountTransferCmd(inAccount, outAccount, amt);
            phoenixClient.send(req, accountTnTopic, null);
        }, "message_test", new RateLimiter.RunMonitor(false));
        messageTestTask.start();
        return String.format("开始随机转账:total=<%d>,tps=<%d>,aggregateNum=<%d>", total, tps, aggregateNum);
    }

    @Override
    public String transfer(String outAccountCode, String inAccountCode, double amt) {
        AccountTransferCmd req = new AccountTransferCmd(inAccountCode, outAccountCode, amt);
        Future<RpcResult> future = phoenixClient.send(req, accountTnTopic, null);
        RpcResult rpcResult;
        try {
            rpcResult = future.get(10, TimeUnit.SECONDS);
            return rpcResult.getMessage();
        } catch (InterruptedException | ExecutionException | TimeoutException e) {
            return "rpc error: " + e.getMessage();
        }
    }

    @Override
    public String batchAllocate(int total, int tps, int aggregateNum) {
        log.info("start a message test: aggregateNum<{}> total<{}>, tps<{}>", aggregateNum, total, tps);
        int timeout = total / tps + 5;
        // 设置速率限制器发送请求
        RateLimiter messageTestTask = new RateLimiter(tps, total, timeout, () -> {
            String account = codeFormat(new Random().nextInt(aggregateNum));
            int amt = (100 - new Random().nextInt(200));
            AccountAllocateCmd cmd = new AccountAllocateCmd(account, amt);
            phoenixClient.send(cmd, accountTopic, "");
        }, "account", new RateLimiter.RunMonitor(false));
        // 开始随机划拨
        messageTestTask.start();
        return String.format("开始随机转账:total=<%d>,tps=<%d>,aggregateNum=<%d>", total, tps, aggregateNum);
    }

    @Override
    public String allocate(String account, double amt, String allocateNumber) {
        AccountAllocateCmd cmd = new AccountAllocateCmd(account, amt, allocateNumber);
        Future<RpcResult> future = phoenixClient.send(cmd, accountTopic, "");
        try {
            RpcResult result = future.get(10, TimeUnit.SECONDS);
            return result.getMessage();
        } catch (InterruptedException | ExecutionException | TimeoutException e) {
            return "rpc error: " + e.getMessage();
        }
    }

    @Override
    public String createAccount(String account, double amt) {
        Account.AccountCreateCmd createCmd = Account.AccountCreateCmd.newBuilder().setAccountCode(account).setBalanceAmt(amt).build();
        Future<RpcResult> future = phoenixClient.send(createCmd, accountTopic, null);
        try {
            RpcResult result = future.get(10, TimeUnit.SECONDS);
            return result.getMessage();
        } catch (InterruptedException | ExecutionException | TimeoutException e) {
            return "rpc error: " + e.getMessage();
        }
    }

    @Override
    public String batchCreateAccount(int aggregateNum, double amt) {
        List<String> accounts = new ArrayList<>();
        for (int i = 0; i < aggregateNum; i++) {
            accounts.add(codeFormat(i));
        }
        UpperAccountCreateEvent otherSystemBatchAccountCreateEvent = new UpperAccountCreateEvent(accounts, amt);
        String jsonStr = JsonUtils.encode(otherSystemBatchAccountCreateEvent);
        log.info("send message: {}", jsonStr);
        kafkaTemplate.send(createAccountEventTopic, otherSystemBatchAccountCreateEvent.getClreplaced().getName(), jsonStr);
        return "批量创建账户事件发送成功";
    }

    /**
     * 格式化账户编码
     * @param num 代号
     * @return accountCode
     */
    private String codeFormat(int num) {
        return String.format("A%08d", num);
    }
}

19 View Source File : KafkaMessageSenderEndpointFactoryTest.java
License : Apache License 2.0
Project Creator : otto-de

@Test
public void shouldNotMatchMessageQueueSelectors() {
    final MessageInterceptorRegistry interceptorRegistry = mock(MessageInterceptorRegistry.clreplaced);
    final KafkaTemplate kafkaTemplate = mock(KafkaTemplate.clreplaced);
    final KafkaMessageSenderEndpointFactory factory = new KafkaMessageSenderEndpointFactory(interceptorRegistry, kafkaTemplate);
    replacedertThat(factory.matches(MessageQueue.clreplaced), is(false));
}

19 View Source File : KafkaMessageSenderEndpointFactoryTest.java
License : Apache License 2.0
Project Creator : otto-de

@Test
public void shouldMatchMessageLogSelectors() {
    final MessageInterceptorRegistry interceptorRegistry = mock(MessageInterceptorRegistry.clreplaced);
    final KafkaTemplate kafkaTemplate = mock(KafkaTemplate.clreplaced);
    final KafkaMessageSenderEndpointFactory factory = new KafkaMessageSenderEndpointFactory(interceptorRegistry, kafkaTemplate);
    replacedertThat(factory.matches(MessageLog.clreplaced), is(true));
    replacedertThat(factory.matches(Kafka.clreplaced), is(true));
}

19 View Source File : KafkaMessageSenderEndpointFactoryTest.java
License : Apache License 2.0
Project Creator : otto-de

@Test
public void shouldBuildKinesisMessageSender() {
    final KafkaTemplate kafkaTemplate = mock(KafkaTemplate.clreplaced);
    final KafkaMessageSenderEndpointFactory factory = new KafkaMessageSenderEndpointFactory(new MessageInterceptorRegistry(), kafkaTemplate);
    final KafkaMessageSender sender = (KafkaMessageSender) factory.create("foo-stream", MessageFormat.V1);
    replacedertThat(sender.getChannelName(), is("foo-stream"));
    replacedertThat(sender.getMessageFormat(), is(MessageFormat.V1));
    replacedertThat(sender, is(instanceOf(KafkaMessageSender.clreplaced)));
}

19 View Source File : KafkaMessageSenderEndpointFactory.java
License : Apache License 2.0
Project Creator : otto-de

public clreplaced KafkaMessageSenderEndpointFactory implements MessageSenderEndpointFactory {

    private final MessageInterceptorRegistry registry;

    private final KafkaTemplate<String, String> kafkaTemplate;

    public KafkaMessageSenderEndpointFactory(final MessageInterceptorRegistry registry, final KafkaTemplate<String, String> kafkaTemplate) {
        this.registry = registry;
        this.kafkaTemplate = kafkaTemplate;
    }

    @Override
    public MessageSenderEndpoint create(@Nonnull final String channelName, final MessageFormat messageFormat) {
        return new KafkaMessageSender(channelName, registry, new TextMessageTranslator(), kafkaTemplate);
    }

    @Override
    public boolean matches(final Clreplaced<? extends Selector> channelSelector) {
        return channelSelector.isreplacedignableFrom(selector());
    }

    @Override
    public Clreplaced<? extends Selector> selector() {
        return Kafka.clreplaced;
    }
}

19 View Source File : Producer.java
License : Apache License 2.0
Project Creator : opentracing-contrib

@Service
public clreplaced Producer {

    private static final String TOPIC = "users";

    @Autowired
    private KafkaTemplate<String, String> kafkaTemplate;

    void sendMessage(final String message) {
        System.out.println(String.format("#### -> Producing message -> %s", message));
        this.kafkaTemplate.send(TOPIC, message);
    }
}

19 View Source File : SpringKafkaTest.java
License : Apache License 2.0
Project Creator : opentracing-contrib

@Test
public void test(final MockTracer tracer) {
    try (final AnnotationConfigApplicationContext context = new AnnotationConfigApplicationContext(KafkaConfiguration.clreplaced)) {
        final KafkaTemplate<Integer, String> kafkaTemplate = context.getBean(KafkaTemplate.clreplaced);
        kafkaTemplate.send("spring", "message");
        await().atMost(15, TimeUnit.SECONDS).until(() -> tracer.finishedSpans().size(), equalTo(1));
        replacedertEquals(1, counter.get());
        replacedertEquals(1, tracer.finishedSpans().size());
    }
}

19 View Source File : LoadTestProducer.java
License : GNU General Public License v2.0
Project Creator : metersphere

@Service
public clreplaced LoadTestProducer {

    private static final String SEPARATOR = " ";

    @Value("${kafka.log.topic}")
    private String topic;

    @Resource
    private KafkaTemplate<String, Object> kafkaTemplate;

    public void sendMessage(String reportId) {
        String[] contents = new String[] { reportId, "none", "0", "Notifying test listeners of end of test" };
        String log = StringUtils.join(contents, SEPARATOR);
        this.kafkaTemplate.send(topic, log);
    }
}

19 View Source File : KafkaServiceImpl.java
License : Apache License 2.0
Project Creator : luoyusoft

@Slf4j
@Service
public clreplaced KafkaServiceImpl implements KafkaService {

    @Resource
    private KafkaTemplate<String, String> kafkaTemplate;

    @Override
    public boolean sendMessage(String message) {
        // 发送消息
        kafkaTemplate.send("test_topic", message);
        return true;
    }
}

19 View Source File : KafkaEventSender.java
License : MIT License
Project Creator : liuxx-u

/**
 * kafka事件注册器,向kafka队列中push消息
 * @author liuxx
 */
@Slf4j
public clreplaced KafkaEventSender implements IEventSender {

    private final IEventLogDispatcher eventLogDispatcher;

    private final KafkaTemplate<String, IEventArg> kafkaTemplate;

    public KafkaEventSender(IEventLogDispatcher eventLogDispatcher, KafkaTemplate<String, IEventArg> kafkaTemplate) {
        this.eventLogDispatcher = eventLogDispatcher;
        this.kafkaTemplate = kafkaTemplate;
    }

    /**
     * 事件注册
     *
     * @param eventArg 事件参数
     */
    @Override
    public void fire(IEventArg eventArg) {
        ListenableFuture<SendResult<String, IEventArg>> listenableFuture = kafkaTemplate.send(getTopic(eventArg), eventArg);
        EventSendLog sendLog = new EventSendLog(eventArg);
        // 发送成功回调
        SuccessCallback<SendResult<String, IEventArg>> successCallback = result -> {
            if (eventLogDispatcher == null) {
                return;
            }
            sendLog.setSuccess(true);
            Map<String, Object> map = new HashMap<>(2);
            if (result != null) {
                map.put("producerRecord", result.getProducerRecord());
                map.put("metadata", result.getRecordMetadata());
            }
            sendLog.setExtJson(JSON.toJSONString(map));
            this.eventLogDispatcher.dispatch(sendLog);
        };
        // 发送失败回调
        FailureCallback failureCallback = ex -> {
            if (eventLogDispatcher == null) {
                return;
            }
            sendLog.setSuccess(false);
            sendLog.setMessage(ex.getMessage());
            this.eventLogDispatcher.dispatch(sendLog);
            log.error(ex.getMessage());
        };
        listenableFuture.addCallback(successCallback, failureCallback);
    }

    /**
     * 获取kafka的topic
     *
     * @param eventArg 事件消息
     * @return topic topic
     */
    private String getTopic(IEventArg eventArg) {
        return eventArg.getClreplaced().getName();
    }
}

19 View Source File : KafkaController.java
License : Apache License 2.0
Project Creator : li7nux

@RestController
public clreplaced KafkaController {

    private KafkaTemplate<String, Object> kafkaTemplate;

    @Autowired
    KafkaController(KafkaTemplate kafkaTemplate) {
        this.kafkaTemplate = kafkaTemplate;
    }

    @PostMapping("/message/send")
    public String sendMessage(@RequestBody Message message) {
        kafkaTemplate.send(ChcpConstants.KAFKA_LISTENER_TOPIC.getTopic(), message.getMessage());
        return message.getMessage();
    }
}

19 View Source File : ProducerController.java
License : Apache License 2.0
Project Creator : kaituozhesh

/**
 * ClreplacedName: ProducerController
 * Description:
 * date: 2020/3/8 17:44
 *
 * @author kaituozhe_sh
 */
@RestController
@RequestMapping("/send")
public clreplaced ProducerController {

    @Autowired
    private KafkaTemplate<String, Object> kafkaTemplate;

    @RequestMapping("/message")
    public String send(String msg) {
        kafkaTemplate.send("demo", msg);
        return "success";
    }
}

19 View Source File : WithdrawController.java
License : Apache License 2.0
Project Creator : jammy928

/**
 * @author GS
 * @date 2018年01月26日
 */
@RestController
@Slf4j
@RequestMapping(value = "/withdraw", method = RequestMethod.POST)
public clreplaced WithdrawController {

    @Autowired
    private MemberAddressService memberAddressService;

    @Autowired
    private RedisTemplate redisTemplate;

    @Autowired
    private MemberService memberService;

    @Autowired
    private CoinService coinService;

    @Autowired
    private MemberWalletService memberWalletService;

    @Autowired
    private WithdrawRecordService withdrawApplyService;

    @Autowired
    private KafkaTemplate<String, String> kafkaTemplate;

    @Autowired
    private LocaleMessageSourceService sourceService;

    @Autowired
    private MemberTransactionService memberTransactionService;

    /**
     * 增加提现地址
     * @param address
     * @param unit
     * @param remark
     * @param code
     * @param aims
     * @param user
     * @return
     */
    @RequestMapping("address/add")
    @Transactional(rollbackFor = Exception.clreplaced)
    public MessageResult addAddress(String address, String unit, String remark, String code, String aims, @SessionAttribute(SESSION_MEMBER) AuthMember user) {
        hasText(address, sourceService.getMessage("MISSING_COIN_ADDRESS"));
        hasText(unit, sourceService.getMessage("MISSING_COIN_TYPE"));
        hasText(code, sourceService.getMessage("MISSING_VERIFICATION_CODE"));
        hasText(aims, sourceService.getMessage("MISSING_PHONE_OR_EMAIL"));
        ValueOperations valueOperations = redisTemplate.opsForValue();
        Member member = memberService.findOne(user.getId());
        if (member.getMobilePhone() != null && aims.equals(member.getMobilePhone())) {
            Object info = valueOperations.get(SysConstant.PHONE_ADD_ADDRESS_PREFIX + member.getMobilePhone());
            if (info == null || !info.toString().equals(code)) {
                return MessageResult.error(sourceService.getMessage("VERIFICATION_CODE_INCORRECT"));
            } else {
                valueOperations.getOperations().delete(SysConstant.PHONE_ADD_ADDRESS_PREFIX + member.getMobilePhone());
            }
        } else if (member.getEmail() != null && aims.equals(member.getEmail())) {
            Object info = valueOperations.get(SysConstant.ADD_ADDRESS_CODE_PREFIX + member.getEmail());
            if (!info.toString().equals(code)) {
                return MessageResult.error(sourceService.getMessage("VERIFICATION_CODE_INCORRECT"));
            } else {
                valueOperations.getOperations().delete(SysConstant.ADD_ADDRESS_CODE_PREFIX + member.getEmail());
            }
        } else {
            return MessageResult.error(sourceService.getMessage("ADD_ADDRESS_FAILED"));
        }
        MessageResult result = memberAddressService.addMemberAddress(user.getId(), address, unit, remark);
        if (result.getCode() == 0) {
            result.setMessage(sourceService.getMessage("ADD_ADDRESS_SUCCESS"));
        } else if (result.getCode() == 500) {
            result.setMessage(sourceService.getMessage("ADD_ADDRESS_FAILED"));
        } else if (result.getCode() == 600) {
            result.setMessage(sourceService.getMessage("COIN_NOT_SUPPORT"));
        }
        return result;
    }

    /**
     * 删除提现地址
     * @param id
     * @param user
     * @return
     */
    @RequestMapping("address/delete")
    @Transactional(rollbackFor = Exception.clreplaced)
    public MessageResult deleteAddress(long id, @SessionAttribute(SESSION_MEMBER) AuthMember user) {
        MessageResult result = memberAddressService.deleteMemberAddress(user.getId(), id);
        if (result.getCode() == 0) {
            result.setMessage(sourceService.getMessage("DELETE_ADDRESS_SUCCESS"));
        } else {
            result.setMessage(sourceService.getMessage("DELETE_ADDRESS_FAILED"));
        }
        return result;
    }

    /**
     * 提现地址分页信息
     * @param user
     * @param pageNo
     * @param pageSize
     * @param unit
     * @return
     */
    @RequestMapping("address/page")
    public MessageResult addressPage(@SessionAttribute(SESSION_MEMBER) AuthMember user, int pageNo, int pageSize, String unit) {
        Page<MemberAddress> page = memberAddressService.pageQuery(pageNo, pageSize, user.getId(), unit);
        Page<ScanMemberAddress> scanMemberAddresses = page.map(x -> ScanMemberAddress.toScanMemberAddress(x));
        MessageResult result = MessageResult.success();
        result.setData(scanMemberAddresses);
        return result;
    }

    /**
     * 支持提现的地址
     * @return
     */
    @RequestMapping("support/coin")
    public MessageResult queryWithdraw() {
        List<Coin> list = coinService.findAllCanWithDraw();
        List<String> list1 = new ArrayList<>();
        list.stream().forEach(x -> list1.add(x.getUnit()));
        MessageResult result = MessageResult.success();
        result.setData(list1);
        return result;
    }

    /**
     * 提现币种详细信息
     * @param user
     * @return
     */
    @RequestMapping("support/coin/info")
    public MessageResult queryWithdrawCoin(@SessionAttribute(SESSION_MEMBER) AuthMember user) {
        List<Coin> list = coinService.findAllCanWithDraw();
        List<MemberWallet> list1 = memberWalletService.findAllByMemberId(user.getId());
        long id = user.getId();
        List<WithdrawWalletInfo> list2 = list1.stream().filter(x -> list.contains(x.getCoin())).map(x -> WithdrawWalletInfo.builder().balance(x.getBalance()).withdrawScale(x.getCoin().getWithdrawScale()).maxTxFee(x.getCoin().getMaxTxFee()).minTxFee(x.getCoin().getMinTxFee()).minAmount(x.getCoin().getMinWithdrawAmount()).maxAmount(x.getCoin().getMaxWithdrawAmount()).name(x.getCoin().getName()).nameCn(x.getCoin().getNameCn()).threshold(x.getCoin().getWithdrawThreshold()).unit(x.getCoin().getUnit()).accountType(x.getCoin().getAccountType()).canAutoWithdraw(x.getCoin().getCanAutoWithdraw()).addresses(memberAddressService.queryAddress(id, x.getCoin().getName())).build()).collect(Collectors.toList());
        MessageResult result = MessageResult.success();
        result.setData(list2);
        return result;
    }

    /**
     * 申请提币(请到PC端提币或升级APP)
     * 没有验证码校验
     * @param user
     * @param unit
     * @param address
     * @param amount
     * @param fee
     * @param remark
     * @param jyPreplacedword
     * @return
     * @throws Exception
     */
    @RequestMapping("apply")
    @Transactional(rollbackFor = Exception.clreplaced)
    public MessageResult withdraw(@SessionAttribute(SESSION_MEMBER) AuthMember user, String unit, String address, BigDecimal amount, BigDecimal fee, String remark, String jyPreplacedword) throws Exception {
        return MessageResult.success(sourceService.getMessage("WITHDRAW_TO_PC"));
    }

    /**
     * 申请提币(添加验证码校验)
     * @param user
     * @param unit
     * @param address
     * @param amount
     * @param fee
     * @param remark
     * @param jyPreplacedword
     * @return
     * @throws Exception
     */
    @RequestMapping("apply/code")
    @Transactional(rollbackFor = Exception.clreplaced)
    public MessageResult withdrawCode(@SessionAttribute(SESSION_MEMBER) AuthMember user, String unit, String address, BigDecimal amount, BigDecimal fee, String remark, String jyPreplacedword, @RequestParam("code") String code) throws Exception {
        hasText(jyPreplacedword, sourceService.getMessage("MISSING_JYPreplacedWORD"));
        hasText(unit, sourceService.getMessage("MISSING_COIN_TYPE"));
        Coin coin = coinService.findByUnit(unit);
        amount.setScale(coin.getWithdrawScale(), BigDecimal.ROUND_DOWN);
        notNull(coin, sourceService.getMessage("COIN_ILLEGAL"));
        isTrue(coin.getStatus().equals(CommonStatus.NORMAL) && coin.getCanWithdraw().equals(BooleanEnum.IS_TRUE), sourceService.getMessage("COIN_NOT_SUPPORT"));
        isTrue(compare(fee, new BigDecimal(String.valueOf(coin.getMinTxFee()))), sourceService.getMessage("CHARGE_MIN") + coin.getMinTxFee());
        isTrue(compare(new BigDecimal(String.valueOf(coin.getMaxTxFee())), fee), sourceService.getMessage("CHARGE_MAX") + coin.getMaxTxFee());
        isTrue(compare(coin.getMaxWithdrawAmount(), amount), sourceService.getMessage("WITHDRAW_MAX") + coin.getMaxWithdrawAmount());
        isTrue(compare(amount, coin.getMinWithdrawAmount()), sourceService.getMessage("WITHDRAW_MIN") + coin.getMinWithdrawAmount());
        MemberWallet memberWallet = memberWalletService.findByCoinAndMemberId(coin, user.getId());
        isTrue(compare(memberWallet.getBalance(), amount), sourceService.getMessage("INSUFFICIENT_BALANCE"));
        // isTrue(memberAddressService.findByMemberIdAndAddress(user.getId(), address).size() > 0, sourceService.getMessage("WRONG_ADDRESS"));
        isTrue(memberWallet.getIsLock() == BooleanEnum.IS_FALSE, "钱包已锁定");
        Member member = memberService.findOne(user.getId());
        String mbPreplacedword = member.getJyPreplacedword();
        replacedert.hasText(mbPreplacedword, sourceService.getMessage("NO_SET_JYPreplacedWORD"));
        replacedert.isTrue(Md5.md5Digest(jyPreplacedword + member.getSalt()).toLowerCase().equals(mbPreplacedword), sourceService.getMessage("ERROR_JYPreplacedWORD"));
        ValueOperations valueOperations = redisTemplate.opsForValue();
        String phone = member.getMobilePhone();
        Object codeRedis = valueOperations.get(SysConstant.PHONE_WITHDRAW_MONEY_CODE_PREFIX + phone);
        notNull(codeRedis, sourceService.getMessage("VERIFICATION_CODE_NOT_EXISTS"));
        if (!codeRedis.toString().equals(code)) {
            return error(sourceService.getMessage("VERIFICATION_CODE_INCORRECT"));
        } else {
            valueOperations.getOperations().delete(SysConstant.PHONE_WITHDRAW_MONEY_CODE_PREFIX + phone);
        }
        MessageResult result = memberWalletService.freezeBalance(memberWallet, amount);
        if (result.getCode() != 0) {
            throw new InformationExpiredException("Information Expired");
        }
        WithdrawRecord withdrawApply = new WithdrawRecord();
        withdrawApply.setCoin(coin);
        withdrawApply.setFee(fee);
        withdrawApply.setArrivedAmount(sub(amount, fee));
        withdrawApply.setMemberId(user.getId());
        withdrawApply.setTotalAmount(amount);
        withdrawApply.setAddress(address);
        withdrawApply.setRemark(remark);
        withdrawApply.setCanAutoWithdraw(coin.getCanAutoWithdraw());
        // 提币数量低于或等于阈值并且该币种支持自动提币
        if (amount.compareTo(coin.getWithdrawThreshold()) <= 0 && coin.getCanAutoWithdraw().equals(BooleanEnum.IS_TRUE)) {
            withdrawApply.setStatus(WithdrawStatus.WAITING);
            withdrawApply.setIsAuto(BooleanEnum.IS_TRUE);
            withdrawApply.setDealTime(withdrawApply.getCreateTime());
            WithdrawRecord withdrawRecord = withdrawApplyService.save(withdrawApply);
            JSONObject json = new JSONObject();
            json.put("uid", user.getId());
            // 提币总数量
            json.put("totalAmount", amount);
            // 手续费
            json.put("fee", fee);
            // 预计到账数量
            json.put("arriveAmount", sub(amount, fee));
            // 币种
            json.put("coin", coin);
            // 提币地址
            json.put("address", address);
            // 提币记录id
            json.put("withdrawId", withdrawRecord.getId());
            kafkaTemplate.send("withdraw", coin.getUnit(), json.toJSONString());
            return MessageResult.success(sourceService.getMessage("APPLY_SUCCESS"));
        } else {
            withdrawApply.setStatus(WithdrawStatus.PROCESSING);
            withdrawApply.setIsAuto(BooleanEnum.IS_FALSE);
            if (withdrawApplyService.save(withdrawApply) != null) {
                return MessageResult.success(sourceService.getMessage("APPLY_AUDIT"));
            } else {
                throw new InformationExpiredException("Information Expired");
            }
        }
    }

    /**
     * 提币记录
     * @param user
     * @param page
     * @param pageSize
     * @return
     */
    @GetMapping("record")
    public MessageResult pageWithdraw(@SessionAttribute(SESSION_MEMBER) AuthMember user, int page, int pageSize) {
        MessageResult mr = new MessageResult(0, "success");
        Page<WithdrawRecord> records = withdrawApplyService.findAllByMemberId(user.getId(), page, pageSize);
        records.map(x -> ScanWithdrawRecord.toScanWithdrawRecord(x));
        mr.setData(records);
        return mr;
    }
}

19 View Source File : OrderController.java
License : Apache License 2.0
Project Creator : jammy928

/**
 * 委托订单处理类
 */
@Slf4j
@RestController
@RequestMapping("/order")
public clreplaced OrderController {

    @Autowired
    private ExchangeOrderService orderService;

    @Autowired
    private MemberWalletService walletService;

    @Autowired
    private ExchangeCoinService exchangeCoinService;

    @Autowired
    private CoinService coinService;

    @Autowired
    private KafkaTemplate<String, String> kafkaTemplate;

    @Autowired
    private ExchangeOrderDetailService exchangeOrderDetailService;

    @Value("${exchange.max-cancel-times:-1}")
    private int maxCancelTimes;

    @Autowired
    private LocaleMessageSourceService msService;

    @Autowired
    private MemberService memberService;

    @Autowired
    private RestTemplate restTemplate;

    @Autowired
    private RedisTemplate redisTemplate;

    private SimpleDateFormat dateTimeFormat = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");

    /**
     * 添加委托订单
     * @param authMember
     * @param direction
     * @param symbol
     * @param price
     * @param amount
     * @param type
     *          usedisCount 暂时不用
     * @return
     */
    @RequestMapping("add")
    public MessageResult addOrder(@SessionAttribute(SESSION_MEMBER) AuthMember authMember, ExchangeOrderDirection direction, String symbol, BigDecimal price, BigDecimal amount, ExchangeOrderType type) {
        // int expireTime = SysConstant.USER_ADD_EXCHANGE_ORDER_TIME_LIMIT_EXPIRE_TIME;
        // ValueOperations valueOperations =  redisTemplate.opsForValue();
        if (direction == null || type == null) {
            return MessageResult.error(500, msService.getMessage("ILLEGAL_ARGUMENT"));
        }
        Member member = memberService.findOne(authMember.getId());
        /*
        if(member.getMemberLevel()== MemberLevelEnum.GENERAL){
            return MessageResult.error(500,"请先进行实名认证");
        }
        */
        // 是否被禁止交易
        if (member.getTransactionStatus().equals(BooleanEnum.IS_FALSE)) {
            return MessageResult.error(500, msService.getMessage("CANNOT_TRADE"));
        }
        ExchangeOrder order = new ExchangeOrder();
        // 判断限价输入值是否小于零
        if (price.compareTo(BigDecimal.ZERO) <= 0 && type == ExchangeOrderType.LIMIT_PRICE) {
            return MessageResult.error(500, msService.getMessage("EXORBITANT_PRICES"));
        }
        // 判断数量小于零
        if (amount.compareTo(BigDecimal.ZERO) <= 0) {
            return MessageResult.error(500, msService.getMessage("NUMBER_OF_ILLEGAL"));
        }
        // 根据交易对名称(symbol)获取交易对儿信息
        ExchangeCoin exchangeCoin = exchangeCoinService.findBySymbol(symbol);
        if (exchangeCoin == null) {
            return MessageResult.error(500, msService.getMessage("NONSUPPORT_COIN"));
        }
        if (exchangeCoin.getEnable() != 1 || exchangeCoin.getExchangeable() != 1) {
            return MessageResult.error(500, msService.getMessage("COIN_FORBIDDEN"));
        }
        // 获取基准币
        String baseCoin = exchangeCoin.getBaseSymbol();
        // 获取交易币
        String exCoin = exchangeCoin.getCoinSymbol();
        Coin coin;
        // 根据交易方向查询币种信息
        if (direction == ExchangeOrderDirection.SELL) {
            coin = coinService.findByUnit(exCoin);
        } else {
            coin = coinService.findByUnit(baseCoin);
        }
        if (coin == null) {
            return MessageResult.error(500, msService.getMessage("NONSUPPORT_COIN"));
        }
        // 设置价格精度
        price = price.setScale(exchangeCoin.getBaseCoinScale(), BigDecimal.ROUND_DOWN);
        // 委托数量和精度控制
        if (direction == ExchangeOrderDirection.BUY && type == ExchangeOrderType.MARKET_PRICE) {
            amount = amount.setScale(exchangeCoin.getBaseCoinScale(), BigDecimal.ROUND_DOWN);
            // 最小成交额控制
            if (amount.compareTo(exchangeCoin.getMinTurnover()) < 0) {
                return MessageResult.error(500, "成交额至少为" + exchangeCoin.getMinTurnover());
            }
        } else {
            amount = amount.setScale(exchangeCoin.getCoinScale(), BigDecimal.ROUND_DOWN);
            // 成交量范围控制
            if (exchangeCoin.getMaxVolume() != null && exchangeCoin.getMaxVolume().compareTo(BigDecimal.ZERO) != 0 && exchangeCoin.getMaxVolume().compareTo(amount) < 0) {
                return MessageResult.error(msService.getMessage("AMOUNT_OVER_SIZE") + " " + exchangeCoin.getMaxVolume());
            }
            if (exchangeCoin.getMinVolume() != null && exchangeCoin.getMinVolume().compareTo(BigDecimal.ZERO) != 0 && exchangeCoin.getMinVolume().compareTo(amount) > 0) {
                return MessageResult.error(msService.getMessage("AMOUNT_TOO_SMALL") + " " + exchangeCoin.getMinVolume());
            }
        }
        if (price.compareTo(BigDecimal.ZERO) <= 0 && type == ExchangeOrderType.LIMIT_PRICE) {
            return MessageResult.error(500, msService.getMessage("EXORBITANT_PRICES"));
        }
        if (amount.compareTo(BigDecimal.ZERO) <= 0) {
            return MessageResult.error(500, msService.getMessage("NUMBER_OF_ILLEGAL"));
        }
        MemberWallet baseCoinWallet = walletService.findByCoinUnitAndMemberId(baseCoin, member.getId());
        MemberWallet exCoinWallet = walletService.findByCoinUnitAndMemberId(exCoin, member.getId());
        if (baseCoinWallet == null || exCoinWallet == null) {
            return MessageResult.error(500, msService.getMessage("NONSUPPORT_COIN"));
        }
        if (baseCoinWallet.getIsLock() == BooleanEnum.IS_TRUE || exCoinWallet.getIsLock() == BooleanEnum.IS_TRUE) {
            return MessageResult.error(500, msService.getMessage("WALLET_LOCKED"));
        }
        // 如果有最低卖价限制,出价不能低于此价,且禁止市场价格卖
        if (direction == ExchangeOrderDirection.SELL && exchangeCoin.getMinSellPrice().compareTo(BigDecimal.ZERO) > 0 && ((price.compareTo(exchangeCoin.getMinSellPrice()) < 0) || type == ExchangeOrderType.MARKET_PRICE)) {
            return MessageResult.error(500, "不能低于最低限价: " + exchangeCoin.getMinSellPrice());
        }
        // 如果有最高买价限制,出价不能高于此价,且禁止市场价格买
        if (direction == ExchangeOrderDirection.BUY && exchangeCoin.getMaxBuyPrice().compareTo(BigDecimal.ZERO) > 0 && ((price.compareTo(exchangeCoin.getMaxBuyPrice()) > 0) || type == ExchangeOrderType.MARKET_PRICE)) {
            return MessageResult.error(500, "不能高于最高限价:" + exchangeCoin.getMaxBuyPrice());
        }
        // 查看是否启用市价买卖
        if (type == ExchangeOrderType.MARKET_PRICE) {
            if (exchangeCoin.getEnableMarketBuy() == BooleanEnum.IS_FALSE && direction == ExchangeOrderDirection.BUY) {
                return MessageResult.error(500, "不支持市价购买");
            } else if (exchangeCoin.getEnableMarketSell() == BooleanEnum.IS_FALSE && direction == ExchangeOrderDirection.SELL) {
                return MessageResult.error(500, "不支持市价出售");
            }
        }
        // 限制委托数量
        if (exchangeCoin.getMaxTradingOrder() > 0 && orderService.findCurrentTradingCount(member.getId(), symbol, direction) >= exchangeCoin.getMaxTradingOrder()) {
            return MessageResult.error(500, "超过最大挂单数量 " + exchangeCoin.getMaxTradingOrder());
        }
        // 抢购模式活动订单限制(用户无法在活动前下买单)
        // 当前时间戳
        long currentTime = Calendar.getInstance().getTimeInMillis();
        // 抢购模式下,无法在活动开始前下买单,仅限于管理员下卖单
        if (exchangeCoin.getPublishType() == ExchangeCoinPublishType.QIANGGOU) {
            // 抢购模式订单
            try {
                if (currentTime < dateTimeFormat.parse(exchangeCoin.getStartTime()).getTime()) {
                    if (direction == ExchangeOrderDirection.BUY) {
                        // 抢购未开始
                        if (currentTime < dateTimeFormat.parse(exchangeCoin.getStartTime()).getTime()) {
                            return MessageResult.error(500, "活动尚未开始");
                        }
                    } else {
                        // 此处2是管理员用户的ID
                        if (member.getId() != 2) {
                            return MessageResult.error(500, "活动开始前无法下单");
                        }
                    }
                } else {
                    // 活动进行期间,无法下卖单 + 无法下市价单
                    if (currentTime < dateTimeFormat.parse(exchangeCoin.getEndTime()).getTime()) {
                        if (direction == ExchangeOrderDirection.SELL) {
                            return MessageResult.error(500, "无法下卖单");
                        }
                        if (type == ExchangeOrderType.MARKET_PRICE) {
                            return MessageResult.error(500, "活动期间无法下市价单");
                        }
                    } else {
                        // 清盘期间,无法下单
                        if (currentTime < dateTimeFormat.parse(exchangeCoin.getClearTime()).getTime()) {
                            return MessageResult.error(500, "清盘期间无法下单");
                        }
                    }
                }
            } catch (ParseException e) {
                e.printStackTrace();
                return MessageResult.error(500, "未知错误:9000");
            }
        }
        // 分摊模式活动订单限制(开始前任何人无法下单)
        if (exchangeCoin.getPublishType() == ExchangeCoinPublishType.FENTAN) {
            try {
                if (currentTime < dateTimeFormat.parse(exchangeCoin.getStartTime()).getTime()) {
                    // 活动开始前无法下单
                    return MessageResult.error(500, "活动尚未开始");
                } else {
                    // 活动开始后且在结束前,无法下卖单 + 下单金额必须符合规定
                    if (currentTime < dateTimeFormat.parse(exchangeCoin.getEndTime()).getTime()) {
                        if (direction == ExchangeOrderDirection.SELL) {
                            return MessageResult.error(500, "活动进行期间无法下卖单");
                        } else {
                            if (type == ExchangeOrderType.MARKET_PRICE) {
                                return MessageResult.error(500, "活动期间无法下市价单");
                            } else {
                                if (price.compareTo(exchangeCoin.getPublishPrice()) != 0) {
                                    return MessageResult.error(500, "下单价格必须为:" + exchangeCoin.getPublishPrice());
                                }
                            }
                        }
                    } else {
                        // 清盘期间,普通用户无法下单,仅有管理员用户ID可下单
                        if (currentTime < dateTimeFormat.parse(exchangeCoin.getClearTime()).getTime()) {
                            // 此处2和10001是管理员用户的ID
                            if (member.getId() != 2 && member.getId() != 10001) {
                                return MessageResult.error(500, "清盘期间无法下单");
                            } else {
                                if (price.compareTo(exchangeCoin.getPublishPrice()) != 0) {
                                    return MessageResult.error(500, "下单价格必须为:" + exchangeCoin.getPublishPrice());
                                }
                                if (direction == ExchangeOrderDirection.BUY) {
                                    return MessageResult.error(500, "清盘期间无法下买单");
                                }
                            }
                        }
                    }
                }
            } catch (ParseException e) {
                e.printStackTrace();
                return MessageResult.error(500, "未知错误:9001");
            }
        }
        order.setMemberId(member.getId());
        order.setSymbol(symbol);
        order.setBaseSymbol(baseCoin);
        order.setCoinSymbol(exCoin);
        order.setType(type);
        order.setDirection(direction);
        if (order.getType() == ExchangeOrderType.MARKET_PRICE) {
            order.setPrice(BigDecimal.ZERO);
        } else {
            order.setPrice(price);
        }
        order.setUseDiscount("0");
        // 限价买入单时amount为用户设置的总成交额
        order.setAmount(amount);
        MessageResult mr = orderService.addOrder(member.getId(), order);
        if (mr.getCode() != 0) {
            return MessageResult.error(500, "提交订单失败:" + mr.getMessage());
        }
        log.info(">>>>>>>>>>订单提交完成>>>>>>>>>>");
        // 发送消息至Exchange系统
        kafkaTemplate.send("exchange-order", JSON.toJSONString(order));
        MessageResult result = MessageResult.success("success");
        result.setData(order.getOrderId());
        return result;
    }

    /**
     * 行情机器人专用:添加委托订单
     * @param authMember
     * @param direction
     * @param symbol
     * @param price
     * @param amount
     * @param type
     *          usedisCount 暂时不用
     * @return
     */
    @RequestMapping("mockaddydhdnskd")
    public MessageResult addOrderMock(Long uid, String sign, ExchangeOrderDirection direction, String symbol, BigDecimal price, BigDecimal amount, ExchangeOrderType type) {
        // int expireTime = SysConstant.USER_ADD_EXCHANGE_ORDER_TIME_LIMIT_EXPIRE_TIME;
        // ValueOperations valueOperations =  redisTemplate.opsForValue();
        if (direction == null || type == null) {
            return MessageResult.error(500, msService.getMessage("ILLEGAL_ARGUMENT"));
        }
        /*
        Member member=memberService.findOne(uid);
        if(member.getMemberLevel()== MemberLevelEnum.GENERAL){
            return MessageResult.error(500,"请先进行实名认证");
        }
        */
        if (uid != 1 && uid != 10001) {
            return MessageResult.error(500, msService.getMessage("ILLEGAL_ARGUMENT"));
        }
        if (!sign.equals("987654321asdf")) {
            return MessageResult.error(500, msService.getMessage("ILLEGAL_ARGUMENT"));
        }
        /*
        //是否被禁止交易
        if(member.getTransactionStatus().equals(BooleanEnum.IS_FALSE)){
            return MessageResult.error(500,msService.getMessage("CANNOT_TRADE"));
        }
        */
        ExchangeOrder order = new ExchangeOrder();
        // 判断限价输入值是否小于零
        if (price.compareTo(BigDecimal.ZERO) <= 0 && type == ExchangeOrderType.LIMIT_PRICE) {
            return MessageResult.error(500, msService.getMessage("EXORBITANT_PRICES"));
        }
        // 判断数量小于零
        if (amount.compareTo(BigDecimal.ZERO) <= 0) {
            return MessageResult.error(500, msService.getMessage("NUMBER_OF_ILLEGAL"));
        }
        // 根据交易对名称(symbol)获取交易对儿信息
        ExchangeCoin exchangeCoin = exchangeCoinService.findBySymbol(symbol);
        if (exchangeCoin == null) {
            return MessageResult.error(500, msService.getMessage("NONSUPPORT_COIN"));
        }
        if (exchangeCoin.getEnable() != 1 || exchangeCoin.getExchangeable() != 1) {
            return MessageResult.error(500, msService.getMessage("COIN_FORBIDDEN"));
        }
        // 获取基准币
        String baseCoin = exchangeCoin.getBaseSymbol();
        // 获取交易币
        String exCoin = exchangeCoin.getCoinSymbol();
        Coin coin;
        // 根据交易方向查询币种信息
        if (direction == ExchangeOrderDirection.SELL) {
            coin = coinService.findByUnit(exCoin);
        } else {
            coin = coinService.findByUnit(baseCoin);
        }
        if (coin == null) {
            return MessageResult.error(500, msService.getMessage("NONSUPPORT_COIN"));
        }
        // 设置价格精度
        price = price.setScale(exchangeCoin.getBaseCoinScale(), BigDecimal.ROUND_DOWN);
        // 委托数量和精度控制
        if (direction == ExchangeOrderDirection.BUY && type == ExchangeOrderType.MARKET_PRICE) {
            amount = amount.setScale(exchangeCoin.getBaseCoinScale(), BigDecimal.ROUND_DOWN);
            // 最小成交额控制
            if (amount.compareTo(exchangeCoin.getMinTurnover()) < 0) {
                return MessageResult.error(500, "成交额至少为" + exchangeCoin.getMinTurnover());
            }
        } else {
            amount = amount.setScale(exchangeCoin.getCoinScale(), BigDecimal.ROUND_DOWN);
            // 成交量范围控制
            if (exchangeCoin.getMaxVolume() != null && exchangeCoin.getMaxVolume().compareTo(BigDecimal.ZERO) != 0 && exchangeCoin.getMaxVolume().compareTo(amount) < 0) {
                return MessageResult.error(msService.getMessage("AMOUNT_OVER_SIZE") + " " + exchangeCoin.getMaxVolume());
            }
            if (exchangeCoin.getMinVolume() != null && exchangeCoin.getMinVolume().compareTo(BigDecimal.ZERO) != 0 && exchangeCoin.getMinVolume().compareTo(amount) > 0) {
                return MessageResult.error(msService.getMessage("AMOUNT_TOO_SMALL") + " " + exchangeCoin.getMinVolume());
            }
        }
        if (price.compareTo(BigDecimal.ZERO) <= 0 && type == ExchangeOrderType.LIMIT_PRICE) {
            return MessageResult.error(500, msService.getMessage("EXORBITANT_PRICES"));
        }
        if (amount.compareTo(BigDecimal.ZERO) <= 0) {
            return MessageResult.error(500, msService.getMessage("NUMBER_OF_ILLEGAL"));
        }
        /*
        MemberWallet baseCoinWallet = walletService.findByCoinUnitAndMemberId(baseCoin, member.getId());
        MemberWallet exCoinWallet = walletService.findByCoinUnitAndMemberId(exCoin, member.getId());
        if (baseCoinWallet == null || exCoinWallet == null) {
            return MessageResult.error(500, msService.getMessage("NONSUPPORT_COIN"));
        }
        if (baseCoinWallet.getIsLock() == BooleanEnum.IS_TRUE || exCoinWallet.getIsLock() == BooleanEnum.IS_TRUE) {
            return MessageResult.error(500, msService.getMessage("WALLET_LOCKED"));
        }
        */
        // 如果有最低卖价限制,出价不能低于此价,且禁止市场价格卖
        if (direction == ExchangeOrderDirection.SELL && exchangeCoin.getMinSellPrice().compareTo(BigDecimal.ZERO) > 0 && ((price.compareTo(exchangeCoin.getMinSellPrice()) < 0) || type == ExchangeOrderType.MARKET_PRICE)) {
            return MessageResult.error(500, msService.getMessage("EXORBITANT_PRICES"));
        }
        // 如果有最高买价限制,出价不能高于此价,且禁止市场价格买
        if (direction == ExchangeOrderDirection.BUY && exchangeCoin.getMaxBuyPrice().compareTo(BigDecimal.ZERO) > 0 && ((price.compareTo(exchangeCoin.getMaxBuyPrice()) > 0) || type == ExchangeOrderType.MARKET_PRICE)) {
            return MessageResult.error(500, "价格不能高于最高限价!");
        }
        // 查看是否启用市价买卖
        if (type == ExchangeOrderType.MARKET_PRICE) {
            if (exchangeCoin.getEnableMarketBuy() == BooleanEnum.IS_FALSE && direction == ExchangeOrderDirection.BUY) {
                return MessageResult.error(500, "不支持市价购买");
            } else if (exchangeCoin.getEnableMarketSell() == BooleanEnum.IS_FALSE && direction == ExchangeOrderDirection.SELL) {
                return MessageResult.error(500, "不支持市价出售");
            }
        }
        /*
        //限制委托数量
        if (exchangeCoin.getMaxTradingOrder() > 0 && orderService.findCurrentTradingCount(uid, symbol, direction) >= exchangeCoin.getMaxTradingOrder()) {
            return MessageResult.error(500, "超过最大挂单数量 " + exchangeCoin.getMaxTradingOrder());
        }
        */
        // 抢购模式活动订单限制(用户无法在活动前下买单)
        // 当前时间戳
        long currentTime = Calendar.getInstance().getTimeInMillis();
        // 抢购模式下,无法在活动开始前下买单,仅限于管理员下卖单
        if (exchangeCoin.getPublishType() == ExchangeCoinPublishType.QIANGGOU) {
            // 抢购模式订单
            try {
                if (currentTime < dateTimeFormat.parse(exchangeCoin.getStartTime()).getTime()) {
                    if (direction == ExchangeOrderDirection.BUY) {
                        // 抢购未开始
                        if (currentTime < dateTimeFormat.parse(exchangeCoin.getStartTime()).getTime()) {
                            return MessageResult.error(500, "活动尚未开始");
                        }
                    } else {
                        // 此处2是管理员用户的ID
                        if (uid != 2 && uid != 1 && uid != 10001) {
                            return MessageResult.error(500, "活动开始前无法下单");
                        }
                    }
                } else {
                    // 活动进行期间,无法下卖单 + 无法下市价单
                    if (currentTime < dateTimeFormat.parse(exchangeCoin.getEndTime()).getTime()) {
                        if (direction == ExchangeOrderDirection.SELL) {
                            return MessageResult.error(500, "无法下卖单");
                        }
                        if (type == ExchangeOrderType.MARKET_PRICE) {
                            return MessageResult.error(500, "活动期间无法下市价单");
                        }
                    } else {
                        // 清盘期间,无法下单
                        if (currentTime < dateTimeFormat.parse(exchangeCoin.getClearTime()).getTime()) {
                            return MessageResult.error(500, "清盘期间无法下单");
                        }
                    }
                }
            } catch (ParseException e) {
                e.printStackTrace();
                return MessageResult.error(500, "未知错误:9000");
            }
        }
        // 分摊模式活动订单限制(开始前任何人无法下单)
        if (exchangeCoin.getPublishType() == ExchangeCoinPublishType.FENTAN) {
            try {
                if (currentTime < dateTimeFormat.parse(exchangeCoin.getStartTime()).getTime()) {
                    // 活动开始前无法下单
                    return MessageResult.error(500, "活动尚未开始");
                } else {
                    // 活动开始后且在结束前,无法下卖单 + 下单金额必须符合规定
                    if (currentTime < dateTimeFormat.parse(exchangeCoin.getEndTime()).getTime()) {
                        if (direction == ExchangeOrderDirection.SELL) {
                            return MessageResult.error(500, "活动进行期间无法下卖单");
                        } else {
                            if (type == ExchangeOrderType.MARKET_PRICE) {
                                return MessageResult.error(500, "活动期间无法下市价单");
                            } else {
                                if (price.compareTo(exchangeCoin.getPublishPrice()) != 0) {
                                    return MessageResult.error(500, "下单价格必须为:" + exchangeCoin.getPublishPrice());
                                }
                            }
                        }
                    } else {
                        // 清盘期间,普通用户无法下单,仅有管理员用户ID可下单
                        if (currentTime < dateTimeFormat.parse(exchangeCoin.getClearTime()).getTime()) {
                            // 此处2是超级管理员用户的ID
                            if (uid != 2 && uid != 1 && uid != 10001) {
                                return MessageResult.error(500, "清盘期间无法下单");
                            } else {
                                if (price.compareTo(exchangeCoin.getPublishPrice()) != 0) {
                                    return MessageResult.error(500, "下单价格必须为:" + exchangeCoin.getPublishPrice());
                                }
                                if (direction == ExchangeOrderDirection.BUY) {
                                    return MessageResult.error(500, "清盘期间无法下买单");
                                }
                            }
                        }
                    }
                }
            } catch (ParseException e) {
                e.printStackTrace();
                return MessageResult.error(500, "未知错误:9001");
            }
        }
        order.setMemberId(uid);
        order.setSymbol(symbol);
        order.setBaseSymbol(baseCoin);
        order.setCoinSymbol(exCoin);
        order.setType(type);
        order.setDirection(direction);
        if (order.getType() == ExchangeOrderType.MARKET_PRICE) {
            order.setPrice(BigDecimal.ZERO);
        } else {
            order.setPrice(price);
        }
        order.setUseDiscount("0");
        // 限价买入单时amount为用户设置的总成交额
        order.setAmount(amount);
        MessageResult mr = orderService.addOrder(uid, order);
        if (mr.getCode() != 0) {
            return MessageResult.error(500, "提交订单失败:" + mr.getMessage());
        }
        log.info(">>>>>>>>>>订单提交完成>>>>>>>>>>");
        // 发送消息至Exchange系统
        kafkaTemplate.send("exchange-order", JSON.toJSONString(order));
        MessageResult result = MessageResult.success("success");
        result.setData(order.getOrderId());
        return result;
    }

    /**
     * 历史委托
     */
    @RequestMapping("history")
    public Page<ExchangeOrder> historyOrder(@SessionAttribute(SESSION_MEMBER) AuthMember member, String symbol, int pageNo, int pageSize) {
        Page<ExchangeOrder> page = orderService.findHistory(member.getId(), symbol, pageNo, pageSize);
        /*
        page.getContent().forEach(exchangeOrder -> {
            //获取交易成交详情
            exchangeOrder.setDetail(exchangeOrderDetailService.findAllByOrderId(exchangeOrder.getOrderId()));
        });
        */
        return page;
    }

    /**
     * 个人中心历史委托
     */
    @RequestMapping("personal/history")
    public Page<ExchangeOrder> personalHistoryOrder(@SessionAttribute(SESSION_MEMBER) AuthMember member, @RequestParam(value = "symbol", required = false) String symbol, @RequestParam(value = "type", required = false) ExchangeOrderType type, @RequestParam(value = "status", required = false) ExchangeOrderStatus status, @RequestParam(value = "startTime", required = false) String startTime, @RequestParam(value = "endTime", required = false) String endTime, @RequestParam(value = "direction", required = false) ExchangeOrderDirection direction, @RequestParam(value = "pageNo", defaultValue = "1") int pageNo, @RequestParam(value = "pageSize", defaultValue = "10") int pageSize) {
        Page<ExchangeOrder> page = orderService.findPersonalHistory(member.getId(), symbol, type, status, startTime, endTime, direction, pageNo, pageSize);
        /*
        page.getContent().forEach(exchangeOrder -> {
            //获取交易成交详情
            exchangeOrder.setDetail(exchangeOrderDetailService.findAllByOrderId(exchangeOrder.getOrderId()));
        });
        */
        return page;
    }

    /**
     * 个人中心当前委托
     * @param member
     * @param symbol
     * @param type
     * @param startTime
     * @param endTime
     * @param pageNo
     * @param pageSize
     * @return
     */
    @RequestMapping("personal/current")
    public Page<ExchangeOrder> personalCurrentOrder(@SessionAttribute(SESSION_MEMBER) AuthMember member, @RequestParam(value = "symbol", required = false) String symbol, @RequestParam(value = "type", required = false) ExchangeOrderType type, @RequestParam(value = "startTime", required = false) String startTime, @RequestParam(value = "endTime", required = false) String endTime, @RequestParam(value = "direction", required = false) ExchangeOrderDirection direction, @RequestParam(value = "pageNo", defaultValue = "1") int pageNo, @RequestParam(value = "pageSize", defaultValue = "10") int pageSize) {
        Page<ExchangeOrder> page = orderService.findPersonalCurrent(member.getId(), symbol, type, startTime, endTime, direction, pageNo, pageSize);
        page.getContent().forEach(exchangeOrder -> {
            // 获取交易成交详情
            BigDecimal tradedAmount = BigDecimal.ZERO;
            BigDecimal turnover = BigDecimal.ZERO;
            List<ExchangeOrderDetail> details = exchangeOrderDetailService.findAllByOrderId(exchangeOrder.getOrderId());
            exchangeOrder.setDetail(details);
            for (ExchangeOrderDetail trade : details) {
                tradedAmount = tradedAmount.add(trade.getAmount());
                turnover = turnover.add(trade.getTurnover());
            }
            exchangeOrder.setTradedAmount(tradedAmount);
            exchangeOrder.setTurnover(turnover);
        });
        return page;
    }

    /**
     * 当前委托
     *
     * @param member
     * @param pageNo
     * @param pageSize
     * @return
     */
    @RequestMapping("current")
    public Page<ExchangeOrder> currentOrder(@SessionAttribute(SESSION_MEMBER) AuthMember member, String symbol, int pageNo, int pageSize) {
        Page<ExchangeOrder> page = orderService.findCurrent(member.getId(), symbol, pageNo, pageSize);
        page.getContent().forEach(exchangeOrder -> {
            // 获取交易成交详情
            BigDecimal tradedAmount = BigDecimal.ZERO;
            BigDecimal turnover = BigDecimal.ZERO;
            List<ExchangeOrderDetail> details = exchangeOrderDetailService.findAllByOrderId(exchangeOrder.getOrderId());
            exchangeOrder.setDetail(details);
            for (ExchangeOrderDetail trade : details) {
                tradedAmount = tradedAmount.add(trade.getAmount());
                turnover = turnover.add(trade.getTurnover());
            }
            exchangeOrder.setTradedAmount(tradedAmount);
            exchangeOrder.setTurnover(turnover);
        });
        return page;
    }

    /**
     * 行情机器人专用:当前委托
     * @param member
     * @param orderId
     * @return
     */
    @RequestMapping("mockcurrentydhdnskd")
    public Page<ExchangeOrder> currentOrderMock(Long uid, String sign, String symbol, int pageNo, int pageSize) {
        if (uid != 1 && uid != 10001) {
            return null;
        }
        if (!sign.equals("987654321asdf")) {
            return null;
        }
        Page<ExchangeOrder> page = orderService.findCurrent(uid, symbol, pageNo, pageSize);
        /*
        page.getContent().forEach(exchangeOrder -> {
            //获取交易成交详情(机器人无需获取详情)
        	
            BigDecimal tradedAmount = BigDecimal.ZERO;
            List<ExchangeOrderDetail> details = exchangeOrderDetailService.findAllByOrderId(exchangeOrder.getOrderId());
            exchangeOrder.setDetail(details);
            for (ExchangeOrderDetail trade : details) {
                tradedAmount = tradedAmount.add(trade.getAmount());
            }
            exchangeOrder.setTradedAmount(tradedAmount);
            
        });
        */
        return page;
    }

    /**
     * 行情机器人专用:交易取消委托
     * @param member
     * @param orderId
     * @return
     */
    @RequestMapping("mockcancelydhdnskd")
    public MessageResult cancelOrdermock(Long uid, String sign, String orderId) {
        ExchangeOrder order = orderService.findOne(orderId);
        if (uid != 1 && uid != 10001) {
            return MessageResult.error(500, "禁止操作");
        }
        if (!sign.equals("987654321asdf")) {
            return MessageResult.error(500, "禁止操作");
        }
        if (order.getStatus() != ExchangeOrderStatus.TRADING) {
            return MessageResult.error(500, "订单状态错误(已成交或已撤销)");
        }
        // 活动清盘期间,无法撤销订单
        ExchangeCoin exchangeCoin = exchangeCoinService.findBySymbol(order.getSymbol());
        if (exchangeCoin.getPublishType() != ExchangeCoinPublishType.NONE) {
            // 当前时间戳
            long currentTime = Calendar.getInstance().getTimeInMillis();
            try {
                // 处在活动结束时间与清盘结束时间之间
                if (currentTime > dateTimeFormat.parse(exchangeCoin.getEndTime()).getTime() && currentTime < dateTimeFormat.parse(exchangeCoin.getClearTime()).getTime()) {
                    return MessageResult.error(500, "盘整期间无法撤销订单");
                }
            } catch (ParseException e) {
                e.printStackTrace();
                return MessageResult.error(500, "未知错误:9003");
            }
        }
        if (isExchangeOrderExist(order)) {
            // 发送消息至Exchange系统
            kafkaTemplate.send("exchange-order-cancel", JSON.toJSONString(order));
        } else {
            // 强制取消
            orderService.forceCancelOrder(order);
        }
        return MessageResult.success("success");
    }

    /**
     * 查询委托成交明细
     *
     * @param member
     * @param orderId
     * @return
     */
    @RequestMapping("detail/{orderId}")
    public List<ExchangeOrderDetail> currentOrder(@SessionAttribute(SESSION_MEMBER) AuthMember member, @PathVariable String orderId) {
        return exchangeOrderDetailService.findAllByOrderId(orderId);
    }

    /**
     * 取消委托
     * @param member
     * @param orderId
     * @return
     */
    @RequestMapping("cancel/{orderId}")
    public MessageResult cancelOrder(@SessionAttribute(SESSION_MEMBER) AuthMember member, @PathVariable String orderId) {
        ExchangeOrder order = orderService.findOne(orderId);
        if (order.getMemberId() != member.getId()) {
            return MessageResult.error(500, "禁止操作");
        }
        if (order.getStatus() != ExchangeOrderStatus.TRADING) {
            return MessageResult.error(500, "订单状态错误(已成交或已撤销)");
        }
        // 活动清盘期间,无法撤销订单
        ExchangeCoin exchangeCoin = exchangeCoinService.findBySymbol(order.getSymbol());
        if (exchangeCoin.getPublishType() != ExchangeCoinPublishType.NONE) {
            // 当前时间戳
            long currentTime = Calendar.getInstance().getTimeInMillis();
            try {
                // 处在活动结束时间与清盘结束时间之间
                if (currentTime > dateTimeFormat.parse(exchangeCoin.getEndTime()).getTime() && currentTime < dateTimeFormat.parse(exchangeCoin.getClearTime()).getTime()) {
                    return MessageResult.error(500, "盘整期间无法撤销订单");
                }
            } catch (ParseException e) {
                e.printStackTrace();
                return MessageResult.error(500, "未知错误:9003");
            }
        }
        if (isExchangeOrderExist(order)) {
            if (maxCancelTimes > 0 && orderService.findTodayOrderCancelTimes(member.getId(), order.getSymbol()) >= maxCancelTimes) {
                return MessageResult.error(500, "你今天已经取消了 " + maxCancelTimes + " 次");
            }
            // 发送消息至Exchange系统
            kafkaTemplate.send("exchange-order-cancel", JSON.toJSONString(order));
        } else {
            // 强制取消
            orderService.forceCancelOrder(order);
        }
        return MessageResult.success("success");
    }

    /**
     * 查找撮合交易器中订单是否存在
     * @param order
     * @return
     */
    public boolean isExchangeOrderExist(ExchangeOrder order) {
        try {
            String serviceName = "SERVICE-EXCHANGE-TRADE";
            String url = "http://" + serviceName + "/monitor/order?symbol=" + order.getSymbol() + "&orderId=" + order.getOrderId() + "&direction=" + order.getDirection() + "&type=" + order.getType();
            ResponseEnreplacedy<ExchangeOrder> result = restTemplate.getForEnreplacedy(url, ExchangeOrder.clreplaced);
            return result != null;
        } catch (Exception e) {
            e.printStackTrace();
            return false;
        }
    }

    /**
     * 获取下单时间限制
     * @return
     */
    @GetMapping("/time_limit")
    public MessageResult userAddExchangeTimeLimit() {
        MessageResult mr = new MessageResult();
        mr.setCode(0);
        mr.setMessage("success");
        mr.setData(SysConstant.USER_ADD_EXCHANGE_ORDER_TIME_LIMIT_EXPIRE_TIME);
        return mr;
    }
}

19 View Source File : ExchangeOrderController.java
License : Apache License 2.0
Project Creator : jammy928

/**
 * @author Shaoxianjun
 * @description
 * @date 2019/1/31 10:52
 */
@RestController
@RequestMapping("exchange/exchange-order")
public clreplaced ExchangeOrderController extends BaseAdminController {

    @Autowired
    private KafkaTemplate<String, String> kafkaTemplate;

    @Autowired
    private ExchangeOrderService exchangeOrderService;

    @Autowired
    private LocaleMessageSourceService messageSource;

    @RequiresPermissions("exchange:exchange-order:all")
    @PostMapping("all")
    @AccessLog(module = AdminModule.EXCHANGE, operation = "查找所有exchangeOrder")
    public MessageResult all() {
        List<ExchangeOrder> exchangeOrderList = exchangeOrderService.findAll();
        if (exchangeOrderList != null && exchangeOrderList.size() > 0) {
            return success(exchangeOrderList);
        }
        return error(messageSource.getMessage("NO_DATA"));
    }

    @RequiresPermissions("exchange:exchange-order:detail")
    @PostMapping("detail")
    @AccessLog(module = AdminModule.EXCHANGE, operation = "exchangeOrder详情")
    public MessageResult detail(String id) {
        List<ExchangeOrderDetail> one = exchangeOrderService.getAggregation(id);
        if (one == null) {
            return error(messageSource.getMessage("NO_DATA"));
        }
        return success(one);
    }

    @RequiresPermissions("exchange:exchange-order:page-query")
    @PostMapping("page-query")
    @AccessLog(module = AdminModule.EXCHANGE, operation = "分页查找exchangeOrder")
    public MessageResult page(PageModel pageModel, ExchangeOrderScreen screen) {
        if (pageModel.getDirection() == null && pageModel.getProperty() == null) {
            ArrayList<Sort.Direction> directions = new ArrayList<>();
            directions.add(Sort.Direction.DESC);
            pageModel.setDirection(directions);
            List<String> property = new ArrayList<>();
            property.add("time");
            pageModel.setProperty(property);
        }
        // 获取查询条件
        Predicate predicate = getPredicate(screen);
        Page<ExchangeOrder> all = exchangeOrderService.findAll(predicate, pageModel.getPageable());
        return success(all);
    }

    private Predicate getPredicate(ExchangeOrderScreen screen) {
        ArrayList<BooleanExpression> booleanExpressions = new ArrayList<>();
        QExchangeOrder qExchangeOrder = QExchangeOrder.exchangeOrder;
        if (screen.getOrderDirection() != null) {
            booleanExpressions.add(qExchangeOrder.direction.eq(screen.getOrderDirection()));
        }
        if (StringUtils.isNotEmpty(screen.getOrderId())) {
            booleanExpressions.add(qExchangeOrder.orderId.eq(screen.getOrderId()));
        }
        if (screen.getMemberId() != null) {
            booleanExpressions.add(qExchangeOrder.memberId.eq(screen.getMemberId()));
        }
        if (screen.getType() != null) {
            booleanExpressions.add(qExchangeOrder.type.eq(screen.getType()));
        }
        if (StringUtils.isNotBlank(screen.getCoinSymbol())) {
            booleanExpressions.add(qExchangeOrder.coinSymbol.equalsIgnoreCase(screen.getCoinSymbol()));
        }
        if (StringUtils.isNotBlank(screen.getBaseSymbol())) {
            booleanExpressions.add(qExchangeOrder.baseSymbol.equalsIgnoreCase(screen.getBaseSymbol()));
        }
        if (screen.getStatus() != null) {
            booleanExpressions.add(qExchangeOrder.status.eq(screen.getStatus()));
        }
        if (screen.getMinPrice() != null) {
            booleanExpressions.add(qExchangeOrder.price.goe(screen.getMinPrice()));
        }
        if (screen.getMaxPrice() != null) {
            booleanExpressions.add(qExchangeOrder.price.loe(screen.getMaxPrice()));
        }
        if (screen.getMinTradeAmount() != null) {
            booleanExpressions.add(qExchangeOrder.tradedAmount.goe(screen.getMinTradeAmount()));
        }
        if (screen.getMaxTradeAmount() != null) {
            booleanExpressions.add(qExchangeOrder.tradedAmount.loe(screen.getMaxTradeAmount()));
        }
        if (screen.getMinTurnOver() != null) {
            booleanExpressions.add(qExchangeOrder.turnover.goe(screen.getMinTurnOver()));
        }
        if (screen.getMaxTurnOver() != null) {
            booleanExpressions.add(qExchangeOrder.turnover.loe(screen.getMaxTurnOver()));
        }
        if (screen.getRobotOrder() != null && screen.getRobotOrder() == 1) {
            // 不看机器人(不包含机器人)
            booleanExpressions.add(qExchangeOrder.memberId.notIn(1, 2, 10001));
        // booleanExpressions.add(qExchangeOrder.memberId.notIn(69296 , 52350));
        }
        if (screen.getRobotOrder() != null && screen.getRobotOrder() == 0) {
            // 查看机器人
            booleanExpressions.add(qExchangeOrder.memberId.in(1, 2, 10001));
        // booleanExpressions.add(qExchangeOrder.memberId.in(69296 , 52350));
        }
        if (screen.getCompleted() != null) /**
         * 委托订单
         */
        {
            if (screen.getCompleted() == BooleanEnum.IS_FALSE) {
                booleanExpressions.add(qExchangeOrder.completedTime.isNull().and(qExchangeOrder.canceledTime.isNull()).and(qExchangeOrder.status.eq(ExchangeOrderStatus.TRADING)));
            } else {
                /**
                 * 历史订单
                 */
                booleanExpressions.add(qExchangeOrder.completedTime.isNotNull().or(qExchangeOrder.canceledTime.isNotNull()).or(qExchangeOrder.status.ne(ExchangeOrderStatus.TRADING)));
            }
        }
        return PredicateUtils.getPredicate(booleanExpressions);
    }

    @RequiresPermissions("exchange:exchange-order:entrust-details")
    @PostMapping("entrust-details")
    public MessageResult entrustDetails(ExchangeTradeScreen screen, PageModel pageModel) {
        /* ExchangeOrder
        StringBuilder headSql = new StringBuilder("select orderId as IF(a.direction=0,buyOrderId,sellOrderId)");

        StringBuilder headCount = new StringBuilder("select count(*) ");*/
        return null;
    }

    @RequiresPermissions("exchange:exchange-order:out-excel")
    @GetMapping("out-excel")
    @AccessLog(module = AdminModule.EXCHANGE, operation = "导出 exchangeOrder Excel")
    public MessageResult outExcel(@RequestParam(value = "memberId") Long memberId, @RequestParam(value = "type") ExchangeOrderType type, @RequestParam(value = "symbol") String symbol, @RequestParam(value = "status") ExchangeOrderStatus status, @RequestParam(value = "direction") ExchangeOrderDirection direction, HttpServletRequest request, HttpServletResponse response) throws Exception {
        // 获取查询条件
        List<Predicate> predicates = getPredicates(memberId, type, symbol, status, direction);
        List list = exchangeOrderService.queryWhereOrPage(predicates, null, null).getContent();
        return new FileUtil().exportExcel(request, response, list, "order");
    }

    // 查询条件的获取
    public List<Predicate> getPredicates(Long memberId, ExchangeOrderType type, String symbol, ExchangeOrderStatus status, ExchangeOrderDirection direction) {
        ArrayList<Predicate> predicates = new ArrayList<>();
        QExchangeOrder qExchangeOrder = QExchangeOrder.exchangeOrder;
        // predicates.add(qExchangeOrder.symbol.eq(QExchangeCoin.exchangeCoin.symbol));
        if (memberId != null) {
            predicates.add(qExchangeOrder.memberId.eq(memberId));
        }
        if (type != null) {
            predicates.add(qExchangeOrder.type.eq(type));
        }
        if (symbol != null) {
            predicates.add(qExchangeOrder.symbol.eq(symbol));
        }
        if (status != null) {
            predicates.add(qExchangeOrder.status.eq(status));
        }
        if (direction != null) {
            predicates.add(qExchangeOrder.direction.eq(direction));
        }
        return predicates;
    }

    @RequiresPermissions("exchange:exchange-order:cancel")
    @PostMapping("cancel")
    @AccessLog(module = AdminModule.EXCHANGE, operation = "取消委托")
    public MessageResult cancelOrder(String orderId) {
        ExchangeOrder order = exchangeOrderService.findOne(orderId);
        if (order.getStatus() != ExchangeOrderStatus.TRADING) {
            return MessageResult.error(500, "order not in trading");
        }
        // 发送消息至Exchange系统
        kafkaTemplate.send("exchange-order-cancel", JSON.toJSONString(order));
        return MessageResult.success(messageSource.getMessage("SUCCESS"));
    }
}

19 View Source File : ProucerController.java
License : Apache License 2.0
Project Creator : huifer

/**
 * <p>replacedle : ProucerController </p>
 * <p>Description : </p>
 *
 * @author huifer
 * @date 2019-06-19
 */
@RestController
public clreplaced ProucerController {

    @Autowired
    private KafkaTemplate kafkaTemplate;

    @GetMapping("/test")
    public String sendMsg() {
        kafkaTemplate.send("hello-spring-boot-kafka", "hello");
        return "ok";
    }
}

19 View Source File : KafkaSenderImpl.java
License : GNU Affero General Public License v3.0
Project Creator : HermesGermany

/**
 * Wraps a KafkaTemplate to make concatenated Futures Thread-safe.
 *
 * @author AlbrechtFlo
 */
public clreplaced KafkaSenderImpl implements KafkaSender {

    private KafkaTemplate<String, String> kafkaTemplate;

    private KafkaFutureDecoupler futureDecoupler;

    public KafkaSenderImpl(KafkaTemplate<String, String> template, KafkaFutureDecoupler futureDecoupler) {
        this.kafkaTemplate = template;
        this.futureDecoupler = futureDecoupler;
    }

    @Override
    public CompletableFuture<Void> send(String topic, String key, String message) {
        return futureDecoupler.toCompletableFuture(kafkaTemplate.send(new ProducerRecord<>(topic, key, message))).thenApply(o -> null);
    }
}

19 View Source File : KafkaAnnotationDrivenConfiguration.java
License : Apache License 2.0
Project Creator : hello-shf

/**
 * Configuration for Kafka annotation-driven support.
 *
 * @author Gary Russell
 * @author Eddú Meléndez
 * @since 1.5.0
 */
@Configuration
@ConditionalOnClreplaced(EnableKafka.clreplaced)
clreplaced KafkaAnnotationDrivenConfiguration {

    private final KafkaProperties properties;

    private final RecordMessageConverter messageConverter;

    private final KafkaTemplate<Object, Object> kafkaTemplate;

    KafkaAnnotationDrivenConfiguration(KafkaProperties properties, ObjectProvider<RecordMessageConverter> messageConverter, ObjectProvider<KafkaTemplate<Object, Object>> kafkaTemplate) {
        this.properties = properties;
        this.messageConverter = messageConverter.getIfUnique();
        this.kafkaTemplate = kafkaTemplate.getIfUnique();
    }

    @Bean
    @ConditionalOnMissingBean
    public ConcurrentKafkaListenerContainerFactoryConfigurer kafkaListenerContainerFactoryConfigurer() {
        ConcurrentKafkaListenerContainerFactoryConfigurer configurer = new ConcurrentKafkaListenerContainerFactoryConfigurer();
        configurer.setKafkaProperties(this.properties);
        configurer.setMessageConverter(this.messageConverter);
        configurer.setReplyTemplate(this.kafkaTemplate);
        return configurer;
    }

    @Bean
    @ConditionalOnMissingBean(name = "kafkaListenerContainerFactory")
    public ConcurrentKafkaListenerContainerFactory<?, ?> kafkaListenerContainerFactory(ConcurrentKafkaListenerContainerFactoryConfigurer configurer, ConsumerFactory<Object, Object> kafkaConsumerFactory) {
        ConcurrentKafkaListenerContainerFactory<Object, Object> factory = new ConcurrentKafkaListenerContainerFactory<>();
        configurer.configure(factory, kafkaConsumerFactory);
        return factory;
    }

    @Configuration
    @EnableKafka
    @ConditionalOnMissingBean(name = KafkaListenerConfigUtils.KAFKA_LISTENER_ANNOTATION_PROCESSOR_BEAN_NAME)
    protected static clreplaced EnableKafkaConfiguration {
    }
}

/**
 * Configure {@link ConcurrentKafkaListenerContainerFactory} with sensible defaults.
 *
 * @author Gary Russell
 * @author Eddú Meléndez
 * @since 1.5.0
 */
public clreplaced ConcurrentKafkaListenerContainerFactoryConfigurer {

    private KafkaProperties properties;

    private RecordMessageConverter messageConverter;

    private KafkaTemplate<Object, Object> replyTemplate;

    /**
     * Set the {@link KafkaProperties} to use.
     *
     * @param properties the properties
     */
    void setKafkaProperties(KafkaProperties properties) {
        this.properties = properties;
    }

    /**
     * Set the {@link RecordMessageConverter} to use.
     *
     * @param messageConverter the message converter
     */
    void setMessageConverter(RecordMessageConverter messageConverter) {
        this.messageConverter = messageConverter;
    }

    /**
     * Set the {@link KafkaTemplate} to use to send replies.
     *
     * @param replyTemplate the reply template
     */
    void setReplyTemplate(KafkaTemplate<Object, Object> replyTemplate) {
        this.replyTemplate = replyTemplate;
    }

    /**
     * Configure the specified Kafka listener container factory. The factory can be
     * further tuned and default settings can be overridden.
     *
     * @param listenerFactory the {@link ConcurrentKafkaListenerContainerFactory} instance
     *                        to configure
     * @param consumerFactory the {@link ConsumerFactory} to use
     */
    public void configure(ConcurrentKafkaListenerContainerFactory<Object, Object> listenerFactory, ConsumerFactory<Object, Object> consumerFactory) {
        listenerFactory.setConsumerFactory(consumerFactory);
        configureListenerFactory(listenerFactory);
        configureContainer(listenerFactory.getContainerProperties());
    }

    private void configureListenerFactory(ConcurrentKafkaListenerContainerFactory<Object, Object> factory) {
        PropertyMapper map = PropertyMapper.get();
        Listener properties = this.properties.getListener();
        map.from(properties::getConcurrency).whenNonNull().to(factory::setConcurrency);
        map.from(() -> this.messageConverter).whenNonNull().to(factory::setMessageConverter);
        map.from(() -> this.replyTemplate).whenNonNull().to(factory::setReplyTemplate);
        map.from(properties::getType).whenEqualTo(Listener.Type.BATCH).toCall(() -> factory.setBatchListener(true));
    }

    private void configureContainer(ContainerProperties container) {
        PropertyMapper map = PropertyMapper.get();
        Listener properties = this.properties.getListener();
        map.from(properties::getAckMode).whenNonNull().to(container::setAckMode);
        map.from(properties::getClientId).whenNonNull().to(container::setClientId);
        map.from(properties::getAckCount).whenNonNull().to(container::setAckCount);
        map.from(properties::getAckTime).whenNonNull().as(Duration::toMillis).to(container::setAckTime);
        map.from(properties::getPollTimeout).whenNonNull().as(Duration::toMillis).to(container::setPollTimeout);
        map.from(properties::getNoPollThreshold).whenNonNull().to(container::setNoPollThreshold);
        map.from(properties::getIdleEventInterval).whenNonNull().as(Duration::toMillis).to(container::setIdleEventInterval);
        map.from(properties::getMonitorInterval).whenNonNull().as(Duration::getSeconds).as(Number::intValue).to(container::setMonitorInterval);
        map.from(properties::getLogContainerConfig).whenNonNull().to(container::setLogContainerConfig);
    }
}

19 View Source File : KafkaOrderMessagingService.java
License : Apache License 2.0
Project Creator : habuma

@Service
public clreplaced KafkaOrderMessagingService implements OrderMessagingService {

    private KafkaTemplate<String, Order> kafkaTemplate;

    @Autowired
    public KafkaOrderMessagingService(KafkaTemplate<String, Order> kafkaTemplate) {
        this.kafkaTemplate = kafkaTemplate;
    }

    @Override
    public void sendOrder(Order order) {
        kafkaTemplate.send("tacocloud.orders.topic", order);
    }
}

19 View Source File : SampleService.java
License : MIT License
Project Creator : gexiangdong

@Service
public clreplaced SampleService {

    private static final Log log = LogFactory.getLog(SampleService.clreplaced);

    private final KafkaTemplate<String, Object> kafkaTemplate;

    @Autowired
    public SampleService(KafkaTemplate<?, ?> kt) {
        this.kafkaTemplate = (KafkaTemplate<String, Object>) kt;
    }

    /**
     * 每10秒执行一次,往kafka服务器发送消息
     */
    @Scheduled(fixedRate = 10000)
    public void autoSendMessage() {
        if (log.isTraceEnabled()) {
            log.trace("即将发送消息到datetime-topic.");
        }
        SimpleDateFormat sdf = new SimpleDateFormat("yyyy/MM/dd kk:mm:ss");
        String d = sdf.format(new Date());
        kafkaTemplate.send("datetime-topic", sdf.format(new Date()));
    }
}

19 View Source File : Publisher.java
License : Apache License 2.0
Project Creator : garyrussell

/**
 * @author Gary Russell
 * @since 5.1
 */
public clreplaced Publisher implements ApplicationRunner {

    private final String topic;

    @Autowired
    private KafkaTemplate<byte[], byte[]> template;

    public Publisher(String topic) {
        this.topic = topic;
    }

    @Override
    public void run(ApplicationArguments args) throws Exception {
        Scanner scanner = new Scanner(System.in);
        String line = scanner.nextLine();
        while (!line.equals("exit")) {
            this.template.send(this.topic, line.getBytes());
            line = scanner.nextLine();
        }
        scanner.close();
    }
}

See More Examples