package com.dy.pipIrrSell.cardOperate;
|
|
import com.alibaba.fastjson2.JSONArray;
|
import com.alibaba.fastjson2.JSONObject;
|
import com.dy.common.webUtil.BaseResponse;
|
import com.dy.common.webUtil.BaseResponseUtils;
|
import com.dy.common.webUtil.QueryResultVo;
|
import com.dy.pipIrrGlobal.daoSe.SeCardOperateMapper;
|
import com.dy.pipIrrGlobal.daoSe.SeClientCardMapper;
|
import com.dy.pipIrrGlobal.daoSe.SeClientMapper;
|
import com.dy.pipIrrGlobal.pojoSe.SeCardOperate;
|
import com.dy.pipIrrGlobal.pojoSe.SeClientCard;
|
import com.dy.pipIrrGlobal.voSe.*;
|
import com.dy.pipIrrSell.cardOperate.dto.DtoRecharge;
|
import com.dy.pipIrrSell.cardOperate.enums.OperateTypeENUM;
|
import com.dy.pipIrrSell.cardOperate.qo.*;
|
import com.dy.pipIrrSell.clientCard.ClientCardSv;
|
import com.dy.pipIrrSell.clientCard.LastOperateENUM;
|
import com.dy.pipIrrSell.result.SellResultCode;
|
import lombok.extern.slf4j.Slf4j;
|
import org.apache.dubbo.common.utils.PojoUtils;
|
import org.springframework.beans.factory.annotation.Autowired;
|
import org.springframework.stereotype.Service;
|
|
import java.text.ParseException;
|
import java.text.SimpleDateFormat;
|
import java.util.*;
|
|
/**
|
* @author ZhuBaoMin
|
* @date 2024-01-18 19:36
|
* @LastEditTime 2024-01-18 19:36
|
* @Description
|
*/
|
|
@Slf4j
|
@Service
|
public class CardOperateSv {
|
@Autowired
|
private SeCardOperateMapper seCardOperateMapper;
|
|
@Autowired
|
private SeClientCardMapper seClientCardMapper;
|
|
@Autowired
|
private SeClientMapper seClientMapper;
|
|
@Autowired
|
private ClientCardSv clientCardSv;
|
|
|
/**
|
* 添加开卡记录
|
* @param po 水卡操作对象
|
* @return 开卡记录主键
|
*/
|
public Long activeCard(SeCardOperate po) {
|
seCardOperateMapper.insert(po);
|
return po.getId();
|
}
|
|
/**
|
* 根据农户编号获取5级行政区划代码,开卡使用
|
* @param clientNum 农户编号
|
* @return 5级行政区划代码
|
*/
|
public Long getAreaCodeByNum(String clientNum) {
|
return seClientMapper.getAreaCodeByNum(clientNum);
|
}
|
|
/**
|
* 根据农户编号获取5级行政区划串areaCode,补卡过程中开新卡使用
|
* @param clientId
|
* @return
|
*/
|
public Long getAreaCodeById(Long clientId) {
|
return seClientMapper.getAreaCodeById(clientId);
|
}
|
/**
|
* 根据行政区划串模块查询水卡编号,开卡使用
|
* @param areaCode
|
* @return
|
*/
|
String getCardNumOfMax(String areaCode) {
|
return seClientCardMapper.getCardNumOfMax(areaCode);
|
}
|
|
/**
|
* 根据农户编号获取农户ID,开卡使用
|
* @param clientNum
|
* @return
|
*/
|
public Long getClientIdByNum(String clientNum) {
|
return seClientMapper.getClientIdByNum(clientNum);
|
}
|
|
/**
|
* 添加水卡操作对象,各操作都使用
|
* @param po 水卡操作对象
|
* @return 操作记录主键
|
*/
|
public Long add(SeCardOperate po) {
|
seCardOperateMapper.insert(po);
|
return po.getId();
|
}
|
|
/**
|
* 添加充值记录
|
* 修改农户信息、添加充值记录
|
* @param po
|
* @return
|
*/
|
public BaseResponse<Boolean> addRecharge(DtoRecharge po){
|
/**
|
* cardId 水卡编号(依据水卡编号获取)
|
* clientId 农户编号(依据水卡编号获取)
|
* cardNum 水卡编号
|
* money 卡片余额
|
* amount 充值金额
|
* gift 赠送金额
|
* afterRecharge 充值后余额
|
* paymentId 支付方式编号
|
* price 水价
|
* remarks 备注
|
* operator 操作人编号
|
* rechargeTime 充值时间
|
*/
|
Long cardId = 0L;
|
Long clientId = 0L;
|
String cardNum = po.getCardNum();
|
Float money = po.getMoney();
|
Float amount = po.getAmount();
|
Float gift = po.getGift();
|
Float afterRecharge = money + amount + gift;
|
Long paymentId = po.getPaymentId();
|
Float price = po.getPrice();
|
String remarks = po.getRemarks();
|
Long operator = po.getOperator();
|
Date rechargeTime = new Date();
|
|
|
// 验证水卡状态是否支持当前操作
|
String stateName = Optional.ofNullable(clientCardSv.getCardStateByCardNum(Long.parseLong(cardNum))).orElse("");
|
if(stateName.length() == 0 || !stateName.equals("正常")) {
|
return BaseResponseUtils.buildFail(stateName + ", " + SellResultCode.THE_CARD_NOT_SUPPORT_THIS_OPERATION.getMessage());
|
}
|
|
/**
|
* 依据水卡编号获取水卡表主键及农户编号
|
*/
|
Map map = Optional.ofNullable(clientCardSv.getCardIdAndClientNum(cardNum)).orElse(new HashMap());
|
if(map == null || map.size() <= 0) {
|
return BaseResponseUtils.buildFail(SellResultCode.CARD_NUMBER_MISTAKE.getMessage());
|
}
|
cardId = Long.parseLong(map.get("cardId").toString());
|
clientId = Long.parseLong(map.get("clientId").toString());
|
|
/**
|
* 修改农户卡信息:
|
* 补卡时间
|
* 最后操作类型-2
|
*/
|
SeClientCard seClientCard = new SeClientCard();
|
seClientCard.setId(cardId);
|
seClientCard.setMoney(afterRecharge);
|
seClientCard.setRechargedt(rechargeTime);
|
seClientCard.setLastoper(LastOperateENUM.RECHARGE.getCode ());
|
Integer rec_updateClientCard = Optional.ofNullable(clientCardSv.UpdateClientCard(seClientCard)).orElse(0);
|
if(rec_updateClientCard == 0) {
|
return BaseResponseUtils.buildFail(SellResultCode.RECHARGE_FAIL_WRITE_CLIENT_CARD_ERROR.getMessage());
|
}
|
|
/**
|
* 添加充值记录
|
*/
|
SeCardOperate seCardOperate = new SeCardOperate();
|
seCardOperate.setCardId(cardId);
|
seCardOperate.setClientId(clientId);
|
seCardOperate.setMoney(money);
|
seCardOperate.setTradeAmount(amount);
|
seCardOperate.setGift(gift);
|
seCardOperate.setOperateType(OperateTypeENUM.RECHARGE.getCode());
|
seCardOperate.setPaymentId(paymentId);
|
seCardOperate.setPrice(price);
|
seCardOperate.setRemarks(remarks);
|
seCardOperate.setOperator(operator);
|
seCardOperate.setOperateDt(rechargeTime);
|
|
seCardOperateMapper.insert(seCardOperate);
|
Long rec = Optional.ofNullable(seCardOperate.getId()).orElse(0L);
|
if(rec == 0) {
|
return BaseResponseUtils.buildFail(SellResultCode.REPLACE_FAIL_WRITE_RECHARGE_ERROR.getMessage());
|
}
|
|
return BaseResponseUtils.buildSuccess(true) ;
|
}
|
|
|
/**
|
* 根据指定条件获取充值记录
|
* @param queryVo
|
* @return
|
*/
|
public QueryResultVo<List<VoRecharge>> getRecharges(QoRecharge queryVo) {
|
//完善查询充值记录的起止时间
|
String rechargeTimeStart = queryVo.rechargeTimeStart;
|
String rechargeTimeStop = queryVo.rechargeTimeStop;
|
if(rechargeTimeStart != null) {
|
rechargeTimeStart = rechargeTimeStart + " 00:00:00";
|
queryVo.setRechargeTimeStart(rechargeTimeStart);
|
}
|
if(rechargeTimeStop != null) {
|
rechargeTimeStop = rechargeTimeStop + " 23:59:59";
|
queryVo.setRechargeTimeStop(rechargeTimeStop);
|
}
|
|
Map<String, Object> params = (Map<String, Object>) PojoUtils.generalize(queryVo);
|
|
Long itemTotal = seCardOperateMapper.getRecordCount(params);
|
|
QueryResultVo<List<VoRecharge>> rsVo = new QueryResultVo<>() ;
|
Integer pageCurr = 0;
|
Integer pageSize = 10000;
|
rsVo.pageCurr = 1;
|
rsVo.pageSize = 10000;
|
if(queryVo.pageSize != null && queryVo.pageCurr != null) {
|
rsVo.pageSize = queryVo.pageSize ;
|
rsVo.pageCurr = queryVo.pageCurr;
|
pageSize = queryVo.pageSize ;
|
pageCurr = (Integer.parseInt(params.get("pageCurr").toString()) - 1) * Integer.parseInt(params.get("pageSize").toString());
|
}
|
params.put("pageCurr", pageCurr);
|
params.put("pageSize", pageSize);
|
|
rsVo.calculateAndSet(itemTotal, params);
|
rsVo.obj = seCardOperateMapper.getRecharges(params);
|
return rsVo ;
|
}
|
|
|
/**
|
* 根据指定条件获取交易记录
|
* @param vo
|
* @return
|
*/
|
public Map getTransactions(QoTransaction vo){
|
// 补齐查询时间
|
String operateTimeStart = vo.operateTimeStart;
|
String operateTimeStop = vo.operateTimeStop;
|
if(operateTimeStart != null) {
|
operateTimeStart = operateTimeStart + " 00:00:00";
|
vo.setOperateTimeStart(operateTimeStart);
|
}
|
if(operateTimeStop != null) {
|
operateTimeStop = operateTimeStop + " 23:59:59";
|
vo.setOperateTimeStop(operateTimeStop);
|
}
|
|
// 生成查询参数
|
Map<String, Object> params = (Map<String, Object>) PojoUtils.generalize(vo) ;
|
|
// 获取汇总的购水金额、购卡金额
|
Float waterCost = 0f;
|
Float cardCost = 0f;
|
Map map_sum = Optional.ofNullable(seCardOperateMapper.getTransactionSums(params)).orElse(new HashMap());
|
if(map_sum.size() > 0) {
|
waterCost = Float.parseFloat(map_sum.get("waterCost").toString());
|
cardCost = Float.parseFloat(map_sum.get("cardCost").toString());
|
}
|
|
// 获取符合条件的记录数
|
Long itemTotal = seCardOperateMapper.getTransactionRecordCount(params);
|
|
Integer pageSize = vo.getPageSize();
|
// 计算总页数
|
Integer pageTotal ;
|
pageTotal = (int)Math.ceil((itemTotal==null?0.0D:itemTotal.doubleValue())/pageSize);
|
|
// 根据当前页码及每页数量计算偏移量
|
Integer pageCurr = (Integer.parseInt(params.get("pageCurr").toString()) - 1) * Integer.parseInt(params.get("pageSize").toString());
|
params.put("pageCurr", pageCurr);
|
|
List<VoTransaction> lit = seCardOperateMapper.getTransactions(params);
|
Map map_record = new HashMap();
|
map_record.put("itemTotal", itemTotal);
|
map_record.put("pageCurr", vo.pageCurr);
|
map_record.put("pageSize", pageSize);
|
map_record.put("pageTotal", pageTotal);
|
map_record.put("list", lit);
|
|
Map map_result = new HashMap();
|
map_result.put("waterCost", waterCost);
|
map_result.put("cardCost", cardCost);
|
map_result.put("records", map_record);
|
|
return map_result;
|
}
|
|
/**
|
* 获取交易统计记录
|
* 1.交易统计记录
|
* 2.笔数合计、实收金额合计、赠送金额合计
|
* 3.每一天、各种支付方式实收金额合计
|
* @param vo
|
* @return
|
*/
|
public Map getTransactionStatistics(QoTransactionStatistics vo) throws ParseException {
|
/**
|
* 遍历查询日期,取出每天三种支付方式(现金、扫码、转账)实收金额
|
* 每天一个对象
|
* 对象组成JSONArray添加到返回对象中
|
*/
|
SimpleDateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd");
|
Date startDate = dateFormat.parse(vo.getOperateTimeStart());
|
Date stopDate = dateFormat.parse(vo.getOperateTimeStop());
|
Calendar calendar = Calendar.getInstance();
|
calendar.setTime(startDate);
|
|
JSONArray array_paymentSums = new JSONArray();
|
while (calendar.getTime().before(stopDate) || calendar.getTime().equals(stopDate)) {
|
String tradeDate = dateFormat.format(calendar.getTime()) ;
|
Float receivedCash = Optional.ofNullable(seCardOperateMapper.getPaymentSums(tradeDate ,1L)).orElse(0f);
|
Float receivedQRCode = Optional.ofNullable(seCardOperateMapper.getPaymentSums(tradeDate,2L)).orElse(0f);
|
Float receivedTransfer = Optional.ofNullable(seCardOperateMapper.getPaymentSums(tradeDate, 3L)).orElse(0f);
|
JSONObject job = new JSONObject();
|
job.put("tradeDate", tradeDate);
|
job.put("receivedCash", receivedCash);
|
job.put("receivedQRCode", receivedQRCode);
|
job.put("receivedTransfer", receivedTransfer);
|
|
array_paymentSums.add(job);
|
calendar.add(Calendar.DAY_OF_MONTH, 1);
|
}
|
|
|
// 补齐查询时间
|
String operateTimeStart = vo.operateTimeStart;
|
String operateTimeStop = vo.operateTimeStop;
|
if(operateTimeStart != null) {
|
operateTimeStart = operateTimeStart + " 00:00:00";
|
vo.setOperateTimeStart(operateTimeStart);
|
}
|
if(operateTimeStop != null) {
|
operateTimeStop = operateTimeStop + " 23:59:59";
|
vo.setOperateTimeStop(operateTimeStop);
|
}
|
|
// 生成查询参数
|
Map<String, Object> params = (Map<String, Object>) PojoUtils.generalize(vo) ;
|
|
//获取笔数合计、实收金额合计、赠送金额合计
|
Integer totalCount = 0;
|
Float totalReceived = 0f;
|
Float totalGift = 0f;
|
Map map_sum = Optional.ofNullable(seCardOperateMapper.getTransactionStatisticsSums(params)).orElse(new HashMap());
|
if(map_sum.size() > 0) {
|
totalCount = Integer.parseInt(map_sum.get("totalCount").toString());
|
totalReceived = Float.parseFloat(map_sum.get("totalReceived").toString());
|
totalGift = Float.parseFloat(map_sum.get("totalGift").toString());
|
}
|
|
// 获取符合条件的记录数
|
Long itemTotal = seCardOperateMapper.getTransactionStatisticsRecordCount(params);
|
|
Integer pageSize = vo.getPageSize();
|
// 计算总页数
|
Integer pageTotal ;
|
pageTotal = (int)Math.ceil((itemTotal==null?0.0D:itemTotal.doubleValue())/pageSize);
|
|
// 根据当前页码及每页数量计算偏移量
|
Integer pageCurr = (Integer.parseInt(params.get("pageCurr").toString()) - 1) * Integer.parseInt(params.get("pageSize").toString());
|
params.put("pageCurr", pageCurr);
|
|
List<VoTransactionStatistics> list = seCardOperateMapper.getTransactionStatistics(params);
|
Map map_record = new HashMap();
|
map_record.put("itemTotal", itemTotal);
|
map_record.put("pageCurr", vo.pageCurr);
|
map_record.put("pageSize", pageSize);
|
map_record.put("pageTotal", pageTotal);
|
map_record.put("list", list);
|
|
Map map_result = new HashMap();
|
map_result.put("totalCount", totalCount);
|
map_result.put("totalReceived", totalReceived);
|
map_result.put("totalGift", totalGift);
|
map_result.put("records", map_record);
|
map_result.put("paymentSums", array_paymentSums);
|
|
return map_result;
|
}
|
|
/**
|
* 根据指定条件获取开卡记录
|
* @param queryVo
|
* @return
|
*/
|
public QueryResultVo<List<VoActiveCardNew>> getActiveCards(QoActiveCard queryVo) {
|
//完善查询充值记录的起止时间
|
String activeTimeStart = queryVo.activeTimeStart;
|
String activeTimeStop = queryVo.activeTimeStop;
|
if(activeTimeStart != null) {
|
activeTimeStart = activeTimeStart + " 00:00:00";
|
queryVo.setActiveTimeStart(activeTimeStart);
|
}
|
if(activeTimeStop != null) {
|
activeTimeStop = activeTimeStop + " 23:59:59";
|
queryVo.setActiveTimeStop(activeTimeStop);
|
}
|
|
Map<String, Object> params = (Map<String, Object>) PojoUtils.generalize(queryVo);
|
|
Long itemTotal = seCardOperateMapper.getActiveCardRecordCount(params);
|
|
QueryResultVo<List<VoActiveCardNew>> rsVo = new QueryResultVo<>() ;
|
Integer pageCurr = 0;
|
Integer pageSize = 10000;
|
rsVo.pageCurr = 1;
|
rsVo.pageSize = 10000;
|
if(queryVo.pageSize != null && queryVo.pageCurr != null) {
|
rsVo.pageSize = queryVo.pageSize ;
|
rsVo.pageCurr = queryVo.pageCurr;
|
pageSize = queryVo.pageSize ;
|
pageCurr = (Integer.parseInt(params.get("pageCurr").toString()) - 1) * Integer.parseInt(params.get("pageSize").toString());
|
}
|
params.put("pageCurr", pageCurr);
|
params.put("pageSize", pageSize);
|
|
rsVo.calculateAndSet(itemTotal, params);
|
rsVo.obj = seCardOperateMapper.getActiveCards(params);
|
return rsVo ;
|
}
|
|
/**
|
* 根据指定条件获取补卡记录
|
* @param queryVo
|
* @return
|
*/
|
public QueryResultVo<List<VoReissueCard>> getReissueCards(QoReissueCard queryVo) {
|
//完善查询充值记录的起止时间
|
String reissueCardTimeStart = queryVo.reissueCardTimeStart;
|
String reissueCardTimeStop = queryVo.reissueCardTimeStop;
|
if(reissueCardTimeStart != null) {
|
reissueCardTimeStart = reissueCardTimeStart + " 00:00:00";
|
queryVo.setReissueCardTimeStart(reissueCardTimeStart);
|
}
|
if(reissueCardTimeStop != null) {
|
reissueCardTimeStop = reissueCardTimeStop + " 23:59:59";
|
queryVo.setReissueCardTimeStop(reissueCardTimeStop);
|
}
|
|
Map<String, Object> params = (Map<String, Object>) PojoUtils.generalize(queryVo);
|
|
Long itemTotal = seCardOperateMapper.getReissueCardRecordCount(params);
|
|
QueryResultVo<List<VoReissueCard>> rsVo = new QueryResultVo<>() ;
|
Integer pageCurr = 0;
|
Integer pageSize = 10000;
|
rsVo.pageCurr = 1;
|
rsVo.pageSize = 10000;
|
if(queryVo.pageSize != null && queryVo.pageCurr != null) {
|
rsVo.pageSize = queryVo.pageSize ;
|
rsVo.pageCurr = queryVo.pageCurr;
|
pageSize = queryVo.pageSize ;
|
pageCurr = (Integer.parseInt(params.get("pageCurr").toString()) - 1) * Integer.parseInt(params.get("pageSize").toString());
|
}
|
params.put("pageCurr", pageCurr);
|
params.put("pageSize", pageSize);
|
|
rsVo.calculateAndSet(itemTotal, params);
|
rsVo.obj = seCardOperateMapper.getReissueCards(params);
|
return rsVo ;
|
}
|
}
|