package com.platform.yijia.controller;
import com.alibaba.fastjson.JSON;
import com.alibaba.fastjson.JSONObject;
import com.alibaba.fastjson.parser.Feature;
import com.google.gson.Gson;
import com.platform.yijia.param.request.RechargeBalance;
import com.platform.yijia.pojo.*;
import com.platform.yijia.service.*;
import com.platform.yijia.utils.*;
import com.platform.yijia.utils.weixinapp.WxPushUtil;
import me.chanjar.weixin.mp.bean.template.WxMpTemplateData;
import org.apache.commons.lang3.StringUtils;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.stereotype.Controller;
import org.springframework.transaction.annotation.Transactional;
import org.springframework.web.bind.annotation.*;
import javax.annotation.Resource;
import java.math.BigDecimal;
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.*;
/*
*
ElectronicMembershipCardController
* 电子会员卡(储蓄卡)功能模块
* @Author JK
* @Date 2021年3月22日
*/
@Controller
@RequestMapping("/demo")
public class ElectronicMembershipCardController {
private static Logger logger =(Logger) LoggerFactory.getLogger(ElectronicMembershipCardController.class);
@Resource
private ElectronicMembershipCardService electronicMembershipCardService;
@Resource
private StationService stationService;
@Resource
private GzhNewsTemplateService gzhNewsTemplateService;
@Resource
private WxPushUtil wxPushUtil;
@Resource
private PayOrderService payOrderService;
@Resource
private CustomerGradeServices customerGradeServices;
@Resource
private CustomerManagerService customerManagerService;
@Resource
private CustomerPointsService customerPointsService;
@Resource
private IntegralRuleService integralRuleService;
@Resource
private CustomerPointsRecordService customerPointsRecordService;
@Resource
private StationOilGunService stationOilGunService;
//查询该油站是否启用电子会员卡
@RequestMapping(value = "/getStationCardEnabledFlag", method = RequestMethod.GET)
@ResponseBody
public String getStationCardEnabledFlag(@RequestParam Integer stationId){
Gson gson =new Gson();
//返回结果集
ResultData resultData = null;
if(stationId !=null){
String stationCardEnabledFlag = electronicMembershipCardService.getStationCardEnabledFlag(stationId);
resultData = ResultData.success(stationCardEnabledFlag);
}else {
resultData = ResultData.error(CodeMsg.REQUEST_FAIL);
}
return gson.toJson(resultData);
}
//获取用户电子会员卡(储蓄卡)列表
@RequestMapping(value = "/getElectronicCardList", method = RequestMethod.GET)
@ResponseBody
public String getElectronicCardList(@RequestParam Integer stationId, String unionId){
Gson gson =new Gson();
//返回结果集
ResultData resultData = null;
logger.info("获取用户电子会员卡信息参数:油站ID:"+ stationId+"用户unionId:"+unionId);
if(stationId !=null && unionId !=null && unionId !=""){
String stationCardEnabledFlag = electronicMembershipCardService.getStationCardEnabledFlag(stationId);
if(stationCardEnabledFlag.equals("1")){
CustomerElectronicCard customerElectronicCard = new CustomerElectronicCard();
customerElectronicCard.setStationId(stationId);
customerElectronicCard.setUnionId(unionId);
List electronicCardList = electronicMembershipCardService.getElectronicCardList(customerElectronicCard);
resultData = ResultData.success(electronicCardList);
}else {
resultData = ResultData.error(CodeMsg.NO_CARDENABLEFLAG);
}
}else {
resultData = ResultData.error(CodeMsg.REQUEST_FAIL);
}
return gson.toJson(resultData);
}
//用户充值电子会员卡(储蓄卡)生成充值记录
@RequestMapping(value = "/rechargeBalance", consumes = "application/json", method = RequestMethod.POST)
@ResponseBody
@Transactional
public String rechargeBalance(@RequestBody RechargeBalance rechargeBalance){
Gson gson =new Gson();
//返回结果集
ResultData resultData = null;
if(rechargeBalance !=null){
BigDecimal amt = new BigDecimal(rechargeBalance.getAmt());
//String openId = rechargeBalance.getOpenId(); //公众号的openId
Integer stationId = rechargeBalance.getStationId();
//BigDecimal presentAmt = new BigDecimal(rechargeBalance.getPresentAmt());
String payType = rechargeBalance.getPayType();
String customerName = rechargeBalance.getCustomerName();
String cardOilsType = rechargeBalance.getCardOilsType();
String unionId = rechargeBalance.getUnionId();
String stationName = rechargeBalance.getStationName();
String stationCardEnabledFlag = electronicMembershipCardService.getStationCardEnabledFlag(stationId);
logger.info("充值金额:"+amt);
logger.info("支付类型:"+payType);
logger.info("充值卡类型:"+cardOilsType);
logger.info("充值金额:"+amt);
logger.info("油站ID:"+stationId);
logger.info("充值unionId:"+unionId);
//是否启用电子卡功能
if(stationCardEnabledFlag.equals("1")){
CustomerCardUseRecord customerCardUseRecord = new CustomerCardUseRecord(); //电子会员卡使用记录
CustomerCardSetting customerCardSetting = new CustomerCardSetting(); //电子卡优惠规则设置
customerCardSetting.setStationId(stationId);
customerCardSetting.setCardOilsType(cardOilsType);
customerCardSetting.setOrderBy("DESC");
//获取用户要充值电子卡的优惠规则信息
List cardRechargeSettingList = electronicMembershipCardService.getCardRechargeSettingList(customerCardSetting);
if(cardRechargeSettingList !=null && cardRechargeSettingList.size() ==1){
String discountTime = cardRechargeSettingList.get(0).getDiscountTime();
//stationName = cardRechargeSettingList.get(0).getStationName();
String[] dctime={}; //会员充值活动时间
if(discountTime.contains(",")){
dctime =discountTime.split(",");
}else {
dctime =new String[1];
dctime[0] = discountTime;
}
String currentTime =null;
Calendar calendar = Calendar.getInstance();
calendar.setTime(new Date()); //获取当前时间
//循环优惠规则明细
for (CustomerCardSettingDetail cardDetail : cardRechargeSettingList.get(0).getCustomerCardSettingDetailList()){
if(amt.compareTo(cardDetail.getDiscountAmtStart()) ==1 || amt.compareTo(cardDetail.getDiscountAmtStart()) ==0){
//String isDiscountCoupon = cardRechargeSettingList.get(0).getIsDiscountCoupon(); //是否使用优惠券
//充值优惠类型
if(cardDetail.getSettingRuleType().equals("1")){ //按充值金额
BigDecimal presentAmt = cardDetail.getPresentAmt(); //当前赠送金额
if(cardRechargeSettingList.get(0).getDiscountTimeSetting().equals("1") && dctime !=null){
String discountTimeType = cardRechargeSettingList.get(0).getDiscountTimeType(); //获取日期类型
switch (discountTimeType){
case "1": // 1.按周来
int day_Week = calendar.get(Calendar.DAY_OF_WEEK);
day_Week= day_Week-1; //减一原因:数据库存的下标从零开始
currentTime = String.valueOf(day_Week);
break;
case "2": // 2.每月的多少号
int day_month = calendar.get(Calendar.DAY_OF_MONTH);
day_month = day_month-1; //减一原因:数据库存的下标从零开始
currentTime = String.valueOf(day_month); //当前时间
break;
case "3": // 3.固定日期
currentTime =new SimpleDateFormat("yyyy-MM-dd").format(new Date());
break;
}
for (String str : dctime){
if(str.equals(currentTime)){ //如果当前时间在会员日活动时间内
//计算会员日内的总赠送积分
if(cardRechargeSettingList.get(0).getPresentScale() !=null){
presentAmt = presentAmt.multiply(new BigDecimal(cardRechargeSettingList.get(0).getPresentScale()).divide(new BigDecimal(100))).add(presentAmt);
}
break;
}
}
}
customerCardUseRecord.setAmt(amt);
customerCardUseRecord.setPresentAmt(presentAmt);
}else if(cardDetail.getSettingRuleType().equals("2")){ //按充值金额的比例
BigDecimal presentAmt = amt.multiply(cardDetail.getPresentAmt().divide(new BigDecimal(100))); //当前赠送金额比例的赠送积分
if(cardRechargeSettingList.get(0).getDiscountTimeSetting().equals("1") && dctime !=null){
String discountTimeType = cardRechargeSettingList.get(0).getDiscountTimeType(); //获取日期类型
switch (discountTimeType){
case "1": // 1.按周来
int day_Week = calendar.get(Calendar.DAY_OF_WEEK);
day_Week= day_Week-1; //减一原因:数据库存的下标从零开始
currentTime = String.valueOf(day_Week);
break;
case "2": // 2.每月的多少号
int day_month = calendar.get(Calendar.DAY_OF_MONTH);
day_month = day_month-1; //减一原因:数据库存的下标从零开始
currentTime = String.valueOf(day_month); //当前时间
break;
case "3": // 3.固定日期
currentTime =new SimpleDateFormat("yyyy-MM-dd").format(new Date());
break;
}
for (String str : dctime){
if(str.equals(currentTime)){ //如果当前时间在会员日活动时间内
//计算会员日期内的总赠送积分
if(cardRechargeSettingList.get(0).getPresentScale() !=null){
presentAmt = presentAmt.multiply(new BigDecimal(cardRechargeSettingList.get(0).getPresentScale()).divide(new BigDecimal(100))).add(presentAmt);
}
break;
}
}
}
customerCardUseRecord.setAmt(amt);
customerCardUseRecord.setPresentAmt(presentAmt);
}
break;
}else {
customerCardUseRecord.setAmt(amt);
customerCardUseRecord.setPresentAmt(new BigDecimal(0));
}
}
}else {
customerCardUseRecord.setAmt(amt);
customerCardUseRecord.setPresentAmt(new BigDecimal(0));
}
customerCardUseRecord.setUnionId(unionId);
customerCardUseRecord.setStationId(stationId);
customerCardUseRecord.setCardOilsType(cardOilsType);
customerCardUseRecord.setStationName(stationName);
customerCardUseRecord.setCustomerName(customerName);
customerCardUseRecord.setUsageType("+");
customerCardUseRecord.setPayType(payType); //1表示微信
customerCardUseRecord.setCreateTime(new Date());
customerCardUseRecord.setStatus("0");
CustomerElectronicCard c = new CustomerElectronicCard(); //电子会员卡
c.setUnionId(unionId);
c.setStationId(stationId);
c.setCardOilsType(cardOilsType);
CustomerElectronicCard electronicCardInfoByUnionId = electronicMembershipCardService.getElectronicCardInfoByUnionId(c);
if(electronicCardInfoByUnionId !=null && electronicCardInfoByUnionId.getCustomerNo() !=null){
customerCardUseRecord.setCustomerNo(electronicCardInfoByUnionId.getCustomerNo());
customerCardUseRecord.setBalance(electronicCardInfoByUnionId.getAmt());
}
//订单规则 时间+6位随机数
Random random = new Random();
String str="";
for(int i=0; i<6; i++){
str+=random.nextInt(10);
}
String orderNo = System.nanoTime()+str;
customerCardUseRecord.setOrderNo(orderNo);
logger.info("电子卡的充值单号:" +orderNo);
electronicMembershipCardService.insetCardUseRecordRecharge(customerCardUseRecord); //插入电子会员卡的使用记录
resultData = ResultData.success(orderNo);
}
}
return gson.toJson(resultData);
}
//电子卡支付
@RequestMapping(value = "/dzkPaySet", method = RequestMethod.GET)
@ResponseBody
@Transactional
public String dzkPaySet(@RequestParam String ordNo) throws ParseException {
Gson gson =new Gson();
ResultData resultData =null;
if(ordNo !=null){
PayOrder payOrder = new PayOrder();
payOrder.setOrderNo(ordNo);
//获取用户订单信息
Map resultMap = payOrderService.getOrderInfoAndUserInfoByOrderNo(payOrder);
logger.info("电子卡支付时用户订单信息和用户信息:", resultMap.toString());
if(resultMap !=null && resultMap.get("status").toString().equals("0")){
String stationId = resultMap.get("stationId").toString();
String oilName =resultMap.get("oilName").toString();
String mobilePhone =resultMap.get("mobilePhone").toString();
String unionId =resultMap.get("unionId").toString();
String minaOpenid =resultMap.get("minaOpenid").toString();
String consumerId =resultMap.get("consumerId").toString();
String registeDate =resultMap.get("registeDate").toString();
String stationName =resultMap.get("stationName").toString();
String consumer =resultMap.get("consumer").toString();
String oilLiters = resultMap.get("orderLiters").toString(); //orderLiters
String receivableAmt = resultMap.get("receivableAmt").toString();
String amt = resultMap.get("amt").toString();
String orderType = resultMap.get("orderType").toString();
String groupId = resultMap.get("groupId").toString();
CustomerCardUseRecord customerCardUseRecord = new CustomerCardUseRecord(); //电子会员卡插入消费记录
BigDecimal balance = null; //电子会员卡余额
CustomerElectronicCard customerElectronicCard = new CustomerElectronicCard();
String cardOilsType ="";
switch (oilName){ //根据油品名称存储电子卡油品类型 1.汽油 2.柴油
case "92#":
cardOilsType ="1";
break;
case "95#":
cardOilsType ="1";
break;
case "98#":
cardOilsType ="1";
break;
case "0#":
cardOilsType ="2";
break;
case "-10#":
cardOilsType ="2";
break;
case "-20#":
cardOilsType ="2";
break;
}
customerElectronicCard.setCardOilsType(cardOilsType);
customerElectronicCard.setUnionId(resultMap.get("unionId").toString());
customerElectronicCard.setStationId(Integer.valueOf(resultMap.get("stationId").toString()));
//获取用户电子会员卡信息
CustomerElectronicCard cardInfo = electronicMembershipCardService.getElectronicCardInfoByUnionId(customerElectronicCard);
if(cardInfo !=null ){
customerCardUseRecord.setOrderNo(ordNo); //电子会员卡记录订单号
customerCardUseRecord.setUnionId(cardInfo.getUnionId()); //电子会员卡记录用户唯一标识
customerCardUseRecord.setCustomerNo(cardInfo.getCustomerNo());
customerCardUseRecord.setAmt(new BigDecimal(amt)); //电子会员卡记录用户余额
customerCardUseRecord.setStatus("1");
customerCardUseRecord.setCardOilsType(cardInfo.getCardOilsType());
customerCardUseRecord.setBalance(cardInfo.getAmt().subtract(new BigDecimal(amt)));
customerCardUseRecord.setStationName(cardInfo.getStationName());
customerCardUseRecord.setStationId(cardInfo.getStationId());
customerCardUseRecord.setUsageType("-");
customerCardUseRecord.setCustomerName(consumer);
customerCardUseRecord.setCreateTime(new Date());
balance = cardInfo.getAmt();
}
//判断订单金额是否小于电子会员卡的余额
if(balance !=null && customerCardUseRecord.getAmt().compareTo(balance) == -1 || customerCardUseRecord.getAmt().compareTo(balance) ==0){
electronicMembershipCardService.insetCardUseRecordConsumption(customerCardUseRecord);
//更新电子会员卡余额
CustomerElectronicCard c = new CustomerElectronicCard();
c.setAmt(balance.subtract(customerCardUseRecord.getAmt()));
c.setUnionId(customerCardUseRecord.getUnionId());
c.setStationId(customerCardUseRecord.getStationId());
c.setCardOilsType(cardOilsType);
c.setRecentlyTime(new Date());
electronicMembershipCardService.updateElectronicCardInfoByUnionId(c);
payOrder.setPayType("dzk"); //支付方式 //支付类型
payOrder.setStatus("1");
payOrder.setPayDate(new Date()); //支付时间
payOrder.setReceivedAmt(Double.valueOf(amt));
payOrder.setDzkAmt(Double.valueOf(amt));
//payOrder.setTransactionId(ordNo);
payOrderService.getUpdatePayOrder(payOrder);
resultMap.put("payType","dzk");
//插入集团客户信息
//insertCustomerGroup(resultMap);
//更新客户表
CustomerManage customerManage = new CustomerManage();
customerManage.setStationId(Integer.valueOf(stationId));
customerManage.setMinaOpenid(minaOpenid);
customerManage.setOilName(oilName);
customerManage.setPhoneNumber(mobilePhone);
Map params_1 = new HashMap<>();
params_1.put("stationId", stationId);
params_1.put("oilName", oilName);
//获取该油站的优惠方式
String discountPlanType = stationService.getStationDiscountWay(stationId);
logger.info("油站优惠方式:"+discountPlanType);
//获取客户会员信息
CustomerManage customerManageInfo = customerManagerService.getCustomerManageInfo(customerManage);
customerManage.setGroupId(Integer.valueOf(groupId));
if(customerManageInfo !=null){
//此处用于更新没有会员ID的用户
if(!StringUtils.isNotBlank(customerManageInfo.getMemberId())){
String customerId=groupId+stationId+System.nanoTime();
customerManage.setMemberId(customerId);
}
customerManage.setGroupId(Integer.valueOf(groupId));
customerManage.setPhoneNumber(mobilePhone);
customerManage.setAmt(customerManageInfo.getAmt().add(new BigDecimal(amt)));
customerManage.setLiters(customerManageInfo.getLiters().add(new BigDecimal(oilLiters)));
logger.info("存在客户 更新时手机号参数: " + customerManage.getPhoneNumber());
List