package com.rnt.service;
import java.math.BigDecimal;
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.Date;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import com.alibaba.fastjson.JSONObject;
import com.jfinal.aop.Before;
import com.jfinal.aop.Duang;
import com.jfinal.log.Log;
import com.jfinal.plugin.activerecord.Db;
import com.jfinal.plugin.activerecord.tx.Tx;
import com.rnt.commo.enums.DSEnum;
import com.rnt.commo.enums.DataStatusEnum;
import com.rnt.commo.enums.OrderTypeEnum;
import com.rnt.commo.enums.PayOrderEnum;
import com.rnt.commo.enums.SequenceTypeEnum;
import com.rnt.model.zf.CardCoupons;
import com.rnt.model.zf.Order;
import com.rnt.model.zf.OrderDetailCard;
import com.rnt.model.zf.ParkOrderFlow;
import com.rnt.model.zf.PayOrder;
import com.rnt.utils.DateUtil;
import com.rnt.utils.SequenceUtil;
import com.rnt.vo.OrderVO;
import org.beetl.sql.core.kit.StringKit;
public class OrderService {
IRainQueryService iRainQueryService = Duang.duang(IRainQueryService.class);
private static final Log logger = Log.getLog(OrderService.class);
/**
* 支付成功后调用的函数
*
* @param payOrderId 支付单ID
* @return 是否成功
*/
@Before(Tx.class)
public Boolean payOrderSuccess(String payOrderId,String transId) {
logger.info("========支付成功后,修改单据状态==== start ====");
logger.info("========支付成功后,修改单据状态 入参为:payOrderId="+payOrderId+"; transId="+transId);
//修改支付单状态
PayOrder payOrder = PayOrder.dao.findFirst("select * from td_b_pay_order t where t.pay_order_id = ?", payOrderId);
payOrder.setPayOrderState(Integer.valueOf(PayOrderEnum.PAY_ORDER_STATE_PAY_SUCCESS.getValue()));
//微信端的订单交易流水
payOrder.setRltPayOrderId(transId);
boolean flag = payOrder.update();
logger.info("修改支付单,flag状态为: flag=" + flag);
String orderId = payOrder.getRltOrderId();
//修改订单状态
Order order = Order.dao.findFirst("select * from td_b_order t where t.order_id = ?", orderId);
order.setOrderState(OrderTypeEnum.ORDER_TYPE_3.value());
flag = flag & order.update();
logger.info("修改订单,flag状态为: flag=" + flag);
//查询订单明细表
OrderDetailCard orderDetailCard = OrderDetailCard.dao.findFirst(
"select * from td_b_order_detail_card t where t.order_id = ?", orderId);
Integer orderDetailType = orderDetailCard.getOrderDetailType();
Long cardCoponsId = orderDetailCard.getPersonCardId();
CardCoupons cardCoupons = CardCoupons.dao.findById(cardCoponsId);
Integer orderType = order.getOrderType();
if(OrderTypeEnum.PARK_ORDER_TYPE_1.value().equals(orderType)){
/**停车订单*/
/** 上面已将订单状态修改为已支付,无需后续操作了*/
logger.info("停车订单修改,将订单状态修改为已支付");
}else if(OrderTypeEnum.PARK_ORDER_TYPE_2.value().equals(orderType) || OrderTypeEnum.PARK_ORDER_TYPE_3.value().equals(orderType)){
/**年卡、月卡订单*/
if (OrderTypeEnum.ORDER_DETAIL_TYPE_BUY_CARD.value().equals(orderDetailType)) {
/**购卡单*/
cardCoupons.setDataState(DataStatusEnum.DATA_STATUS_VALID.value());
flag = flag & cardCoupons.update();
logger.info("购卡单修改数据状态,flag状态为: flag=" + flag);
} else if (OrderTypeEnum.ORDER_DETAIL_TYPE_RENEW_CARD.value().equals(orderDetailType)) {
/**续费单*/
//1、 从订单明细表中获取失效日期
Date expDate = orderDetailCard.getExpDate();
//2、更改个人卡卷表失效日期
cardCoupons.setExpDate(expDate);
flag = flag & cardCoupons.update();
logger.info("支付单修改数据状态,flag状态为: flag=" + flag);
} else {
logger.info("无法识别的订单类型 orderDetailType=" + orderDetailType);
}
}else{
logger.info("无法识别的订单类型 orderType=" + orderType);
}
logger.info("========支付成功后,修改单据状态==== end ====");
return flag;
}
/**
* 查询支付成功的历史车牌,最多3个.
*
* @param custId 个人客户id
* @return
*/
public List queryHistoryCarNum(String custId) {
List list = new ArrayList();
StringBuffer sql = new StringBuffer("select a.car_number");
sql.append(" from td_b_order a ");
sql.append(" where a.order_state in(3,4) ");
sql.append(" and cust_person_id= ? ");
sql.append(" group by a.car_number,a.create_date");
sql.append(" order by a.create_date desc ");
sql.append(" limit 0,3 ");
List orderList = new Order().find(sql.toString(), custId);
if (orderList != null && orderList.size() > 0) {
for (Order order : orderList) {
list.add(order.getCarNumber());
}
}
return list;
}
/**
* 查询待支付的停车订单.
* 步骤:
* 1.查询待支付的订单
* 1.调用艾润接口查询费用.
* 3.更新订单费用.
* 4.更新订单明细费用.
* 5.插入订单流水表.
*
* @param carNum
* @throws ParseException
*/
public OrderVO queryParkOrderForNotPay(String carNum) throws ParseException {
logger.info("开始查询待支付单信息,carNum=" + carNum);
OrderVO orderVO = new OrderVO();
SimpleDateFormat format = new SimpleDateFormat("yyyy-MM-dd HH:mm");
String irunResult = "";
//1.查询待支付订单
Order order = this.findOrderByCarNum(carNum);
//2.调用艾润接口
if (order != null && StringKit.isNotBlank(order.getParkId())) {
irunResult = iRainQueryService.billQuery(carNum, order.getParkId());
} else {
logger.info("查询订单失败");
}
boolean orderUpdateFlg = false;
int updateOrderDetailFlg = 0;
//3.更新订单
if (StringKit.isNotBlank(irunResult) && !"NO_PARK_RECORD".equals(JSONObject.parseObject(irunResult).get("code"))) {
Map map = jsonToMapForIrunResult(irunResult);
Order updateOrder = new Order();
if (map != null && map.size() > 0) {
updateOrder.setId(order.getId());
updateOrder.setOrderId(order.getOrderId());
updateOrder.setOrderType(Integer.valueOf(PayOrderEnum.PAY_RESOURCE_TYPE_PARK.getValue()));
updateOrder.setOrderState(Integer.valueOf(OrderTypeEnum.ORDER_TYPE_2.value()));
updateOrder.setOrderPayedFee(new BigDecimal(map.get("order_payed_fee")));
updateOrder.setOrderNotPayFee(new BigDecimal(map.get("order_not_pay_fee")));
updateOrder.setOrderTotalFee(new BigDecimal(map.get("order_total_fee")));
updateOrder.setModfiyDate(new Date());
/**更新订单表.*/
orderUpdateFlg = updateOrder.update();
} else {
logger.info("没有查询到费用信息");
}
if (orderUpdateFlg) {
StringBuffer sqls = new StringBuffer("update td_b_order_detail_park a ");
sqls.append("set a.order_id =?,");
sqls.append("a.record_id=?,");
sqls.append("a.park_in_time=?,");
sqls.append("a.park_out_time =?,");
sqls.append("a.parking_duration=?,");
sqls.append("a.modfiy_date= ?,");
sqls.append("a.remark= '查询费用后更新'");
sqls.append(" where a.order_id =?");
/**更新订单明细表.*/
updateOrderDetailFlg = Db.use(DSEnum.ZF_DATASOURCE.name()).update(sqls.toString(),
order.getOrderId(),
map.get("record_id"),
format.parse(map.get("park_in_time")),
format.parse(map.get("park_out_time")),
Long.valueOf(map.get("parking_duration")),
new Date(),
order.getOrderId());
if (updateOrderDetailFlg <= 0) {
logger.info("更新订单子表失败");
} else {
//封装返回数据
orderVO.setOrderId(order.getOrderId());
orderVO.setParkId(order.getParkId());
orderVO.setParkName(map.get("park_name"));
orderVO.setParkAddress(map.get("park_address"));
orderVO.setCarNumber(order.getCarNumber());
orderVO.setOrderPayedFee(new BigDecimal(map.get("order_payed_fee")));
orderVO.setOrderNotPayFee(new BigDecimal(map.get("order_not_pay_fee")));
orderVO.setOrderTotalFee(new BigDecimal(map.get("order_total_fee")));
orderVO.setOrderTitle("待付费用");
orderVO.setParkInTime(format.parse(map.get("park_in_time")));
orderVO.setParkOutTime(format.parse(map.get("park_out_time")));
orderVO.setParkingDuration(DateUtil.secondToTime(Long.valueOf(map.get("parking_duration"))));
}
ParkOrderFlow parkOrderFlow = new ParkOrderFlow();
parkOrderFlow.setParkOrderFolwId(SequenceUtil.getNextOrderId(SequenceTypeEnum.ORDER_PARK_FLOW.value()));
parkOrderFlow.setParkOrderId(order.getOrderId());
parkOrderFlow.setProcTime(new Date());
parkOrderFlow.setProcResult(1);
parkOrderFlow.save();
} else {
logger.info("更新订单失败");
}
}
logger.info("结束查询待支付单信息");
return orderVO;
}
/**
* 获取查询费用返回结果.
*
* @param json
* @return
*/
private Map jsonToMapForIrunResult(String json) {
JSONObject jsobj = JSONObject.parseObject(json);
Map map = new HashMap();
if (jsobj != null) {
if (!jsobj.get("status").toString().equals("0")) {
JSONObject data = (JSONObject)jsobj.get("data");
// 出场时间对象
JSONObject parkOutObject = (JSONObject)data.get("out");
//停车记录id
map.put("record_id", data.getString("id"));
// 出场时间
map.put("park_out_time", parkOutObject.getString("time"));
if (data.get("park") != null) {
map.put("park_name", JSONObject.parseObject(data.get("park").toString()).get("name") + "");
map.put("park_address", JSONObject.parseObject(data.get("park").toString()).get("address") + "");
}
//入场时间
if (data.get("in") != null) {
map.put("park_in_time", JSONObject.parseObject(data.get("in").toString()).getString("time"));
}
//总费用
map.put("order_total_fee", JSONObject.parseObject(data.get("charge").toString()).getString("due"));
//已付费用
map.put("order_payed_fee", JSONObject.parseObject(data.get("charge").toString()).getString("paid"));
//未支付费用(本次应付金额)
map.put("order_not_pay_fee", JSONObject.parseObject(data.get("charge").toString()).getString("unpaid"));
//停车时长 单位:秒
map.put("parking_duration",
JSONObject.parseObject(data.get("charge").toString()).getString("duration"));
}
}
return map;
}
/**
* 通过车牌查询待核算支付单信息.
*
* @param
*/
public Order findOrderByCarNum(String carNum) {
//1.查询待支付订单
StringBuffer sql = new StringBuffer(
"select a.id, a.order_id,a.car_number,a.order_title,a.order_payed_fee,a.order_not_pay_fee,a"
+ ".order_total_fee,a.park_id");
sql.append(" from td_b_order a");
sql.append(" where a.order_state in(1,2,3)");
sql.append(" and a.car_number=?");
sql.append(" order by a.create_date DESC");
Order order = new Order().findFirst(sql.toString(), carNum);
return order;
}
}