package org.hepx.ticket.service;
import org.hepx.jgt.common.date.DateUtil;
import org.hepx.jgt.common.random.NumberGenerater;
import org.hepx.ticket.entity.*;
import org.hepx.ticket.mapper.*;
import org.hepx.ticket.web.TicketVo;
import org.springframework.beans.BeanUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
import java.math.BigDecimal;
import java.util.Date;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
/**
* User: hepanxi
* Date: 15-4-18
* Time: 上午10:29
*/
@Service
@Transactional
public class TradeServiceImpl implements TradeService {
@Autowired
private TradeMapper tradeMapper;
@Autowired
private TicketMapper ticketMapper;
@Autowired
private PaymentMapper paymentMapper;
@Autowired
private CustomerMapper customerMapper;
@Autowired
private BankAccountMapper bankAccountMapper;
@Override
public Trade createTrade(Trade trade) {
tradeMapper.createTrade(trade);
return trade;
}
@Override
public int updateTrade(Trade trade) {
return tradeMapper.updateTrade(trade);
}
@Override
public int deleteTrade(Long tradeId) {
return tradeMapper.deleteTrade(tradeId);
}
@Override
public Trade findOne(Long tradeId) {
return tradeMapper.findOne(tradeId);
}
@Override
public List<Trade> findAll() {
return tradeMapper.findAll();
}
@Override
public List<Trade> findByCondition(String ticketNo, String startTime, String endTime) {
Map<String, Object> param = new HashMap<String, Object>();
param.put("ticketNo", ticketNo);
param.put("startTime", startTime);
param.put("endTime", endTime);
return tradeMapper.findByCondition(param);
}
@Override
public String getTradeNo() {
Trade trade = tradeMapper.findLast();
if (trade == null) {
return "00001";//默认开始编号
} else {
return NumberGenerater.generate(Long.parseLong(trade.getTradeNo()) + 1);
}
}
@Override
public void createTrade(TicketVo vo) {
Trade trade = vo.getTrade();
List<Ticket> inTickets = vo.getInTickets();
verifInTicket(inTickets);
List<Ticket> outTickets = vo.getOutTickets();
verifOutTicket(outTickets);
List<Payment> payments = vo.getPayments();
trade.setInTicketMoney(sumInTicketMoney(inTickets));
trade.setOutTicketMoney(sumOutTicketMoney(outTickets));
trade.setTradeTotal(BigDecimal.valueOf(trade.getOutTicketMoney())
.subtract(BigDecimal.valueOf(trade.getInTicketMoney())).doubleValue());
trade.setCreateTime(new Date());
Trade t = createTrade(trade);
for (Ticket in_ticket : inTickets) {
in_ticket.setInTradeId(t.getId());
//in_ticket.setInDate(new Date());
in_ticket.setTicketStatus(Ticket.TicketStatus.EXISTED);
ticketMapper.createTicket(in_ticket);
}
for (Ticket out_ticket : outTickets) {
//out_ticket.setOutDate(new Date());
out_ticket.setTicketStatus(Ticket.TicketStatus.SALED);
out_ticket.setOutTradeId(t.getId());
ticketMapper.updateTicket(out_ticket);
}
for (Payment payment : payments) {
payment.setTradeId(t.getId());
/* if("CASH".equals(payment.getPayType())){//表示现金
payment.setPayType("现金");
}else if("TALLY".equals(payment.getPayType())){
payment.setPayType("记账");
}else if(!"".equals(payment.getPayType())) {
BankAccount bankAccount = bankAccountMapper.findOne(Long.parseLong(payment.getPayType()));
payment.setPayType(bankAccount.getAlias());
payment.setAccount(bankAccount.getAccount());
payment.setOwner(bankAccount.getOwner());
payment.setBankName(bankAccount.getBankName());
}*/
paymentMapper.createPayment(payment);
}
//自动创建新客户或更新旧的客户信息
Customer customer_vo = new Customer(trade);
Customer customer_ey = customerMapper.criteriaQuery(customer_vo);
if (customer_ey != null) {
customer_ey.setIdCard(customer_vo.getIdCard());
customerMapper.updateCustomer(customer_ey);
} else {
customerMapper.createCustomer(customer_vo);
}
}
/**
* 验证进票金额计算,前端有计算,确保数据的准确性,这里再验证一下,
* 最终以这里计算为准
* 计算公式=(票面金额-票面零头)*(1-点数)-证明费-其他
*
* @param inTicets
* @return
*/
private void verifInTicket(List<Ticket> inTicets) {
for (Ticket t : inTicets) {
t.setInTicketSurplus((BigDecimal.valueOf(t.getTicketMoney()).subtract(BigDecimal.valueOf(t.getTicketOdd())))
.multiply(new BigDecimal(1).subtract(BigDecimal.valueOf(t.getInPoint() / 100)))
.subtract(BigDecimal.valueOf(t.getCertifyFee())).subtract(BigDecimal.valueOf(t.getOtherFee())).doubleValue());
}
}
/**
* 验证出票金额计算,前端有计算,确保数据的准确性,这里再验证一下,
* 最终以这里计算为准
* 出票公式=票面金额*(1-出票点数)
*
* @param outTicets
*/
private void verifOutTicket(List<Ticket> outTicets) {
for (Ticket t : outTicets) {
t.setOutTicketSurplus(BigDecimal.valueOf(t.getTicketMoney()).multiply(new BigDecimal(1).
subtract(BigDecimal.valueOf(t.getOutPoint() / 100))).doubleValue());
}
}
//汇总进票金额
private double sumInTicketMoney(List<Ticket> inTicets) {
BigDecimal totalInTicketMoney = new BigDecimal(0);
for (Ticket t : inTicets) {
totalInTicketMoney = totalInTicketMoney.add(BigDecimal.valueOf(t.getInTicketSurplus()));
}
return totalInTicketMoney.doubleValue();
}
//汇总出票金额
public double sumOutTicketMoney(List<Ticket> outTicets) {
BigDecimal totalOutTicketMoney = new BigDecimal(0);
for (Ticket t : outTicets) {
totalOutTicketMoney = totalOutTicketMoney.add(BigDecimal.valueOf(t.getOutTicketSurplus()));
}
return totalOutTicketMoney.doubleValue();
}
@Override
public long statTradeByAll() {
return tradeMapper.statTradeByAll();
}
@Override
public long statTradeByDay(Date date) {
return tradeMapper.statTradeByDay(DateUtil.formateDate(date));
}
}