|  |  |  | 
|---|
|  |  |  | package com.dy.pipIrrTerminal.card; | 
|---|
|  |  |  |  | 
|---|
|  |  |  | import com.alibaba.fastjson2.JSON; | 
|---|
|  |  |  | import com.alibaba.fastjson2.JSONArray; | 
|---|
|  |  |  | import com.alibaba.fastjson2.JSONObject; | 
|---|
|  |  |  | import com.dy.common.webUtil.BaseResponseUtils; | 
|---|
|  |  |  | import com.dy.common.webUtil.QueryResultVo; | 
|---|
|  |  |  | import com.dy.pipIrrGlobal.daoPr.PrWaterPriceMapper; | 
|---|
|  |  |  | 
|---|
|  |  |  | import com.dy.pipIrrTerminal.card.enums.ManagementCardStateENUM; | 
|---|
|  |  |  | import com.dy.pipIrrTerminal.card.enums.OperateTypeENUM; | 
|---|
|  |  |  | import com.dy.pipIrrTerminal.card.enums.RechargeTypeENUM; | 
|---|
|  |  |  | import com.dy.pipIrrTerminal.card.qo.QoTransaction; | 
|---|
|  |  |  | import lombok.extern.slf4j.Slf4j; | 
|---|
|  |  |  | import org.apache.dubbo.common.utils.PojoUtils; | 
|---|
|  |  |  | import org.springframework.beans.factory.annotation.Autowired; | 
|---|
|  |  |  | 
|---|
|  |  |  | import org.springframework.transaction.annotation.Transactional; | 
|---|
|  |  |  | import com.dy.common.util.IDLongGenerator; | 
|---|
|  |  |  |  | 
|---|
|  |  |  | import java.text.DecimalFormat; | 
|---|
|  |  |  | import java.time.LocalDateTime; | 
|---|
|  |  |  | import java.time.format.DateTimeFormatter; | 
|---|
|  |  |  | import java.util.*; | 
|---|
|  |  |  | 
|---|
|  |  |  | } | 
|---|
|  |  |  | } | 
|---|
|  |  |  |  | 
|---|
|  |  |  | Float balance = Optional.ofNullable(seClientCardMapper.getMoneyByCardNum(cardNum)).orElse(0f); | 
|---|
|  |  |  | Float balance = Optional.ofNullable(seClientCardMapper.getMoneyByCardNum(cardNum, null)).orElse(0f); | 
|---|
|  |  |  | Double waterPrice = prWaterPriceMapper.getPrice(); | 
|---|
|  |  |  |  | 
|---|
|  |  |  | VoTermActiveCard voTermActiveCard = new VoTermActiveCard(); | 
|---|
|  |  |  | 
|---|
|  |  |  | seCardOperate.setClientId(clientId); | 
|---|
|  |  |  | seCardOperate.setMoney(po.getBalance()); | 
|---|
|  |  |  | seCardOperate.setRefundAmount(po.getSupplementMoney()); | 
|---|
|  |  |  | seCardOperate.setOperateType(OperateTypeENUM.WRITE_BACK.getCode()); | 
|---|
|  |  |  | seCardOperate.setOperateType(OperateTypeENUM.SUPPLEMENT.getCode()); | 
|---|
|  |  |  | seCardOperate.setRemarks(po.getRemarks()); | 
|---|
|  |  |  | seCardOperate.setOperator(po.getOperator()); | 
|---|
|  |  |  | seCardOperate.setOperateDt(operateTime); | 
|---|
|  |  |  | 
|---|
|  |  |  | Integer operateType = po.getOperateType(); | 
|---|
|  |  |  | String orderNumber = po.getOrderNumber(); | 
|---|
|  |  |  |  | 
|---|
|  |  |  | // 先检查是否为管理卡 | 
|---|
|  |  |  | if (operateType.equals(OperateTypeENUM.MANAGEMENT_CARD_WRITE.getCode().intValue())) { | 
|---|
|  |  |  | // 管理类型卡写卡逻辑 | 
|---|
|  |  |  | return handleManagementCardWrite(cardAddr, orderNumber); | 
|---|
|  |  |  | } | 
|---|
|  |  |  |  | 
|---|
|  |  |  | // 处理农户卡逻辑 | 
|---|
|  |  |  | Long cardId = seClientCardMapper.getCardIdByAddr(cardAddr); | 
|---|
|  |  |  | if (cardId == null || cardId.equals(0)) { | 
|---|
|  |  |  | map.put("msg", "您指定的水卡不存在"); | 
|---|
|  |  |  | return map; | 
|---|
|  |  |  | } | 
|---|
|  |  |  |  | 
|---|
|  |  |  | if (operateType == 1) { | 
|---|
|  |  |  | if (operateType.equals(OperateTypeENUM.ACTIVE.getCode().intValue())) { | 
|---|
|  |  |  | /** | 
|---|
|  |  |  | * 开卡操作执行通知 | 
|---|
|  |  |  | * 1.依据订单号将无效状态的操作记录改为有效 | 
|---|
|  |  |  | 
|---|
|  |  |  | turnRechargeHistoryValidByOrderNumber(orderNumber); | 
|---|
|  |  |  | updateCard(cardId, orderNumber + "p"); | 
|---|
|  |  |  | } | 
|---|
|  |  |  | } else if (operateType == 2) { | 
|---|
|  |  |  | } else if (operateType.equals(OperateTypeENUM.RECHARGE.getCode().intValue())) { | 
|---|
|  |  |  | /** | 
|---|
|  |  |  | * 充值操作执行通知 | 
|---|
|  |  |  | * 1. 操作记录改为有效 | 
|---|
|  |  |  | 
|---|
|  |  |  | turnOperateValidByOrderNumber(orderNumber + "p"); | 
|---|
|  |  |  | turnRechargeHistoryValidByOrderNumber(orderNumber); | 
|---|
|  |  |  | updateCard(cardId, orderNumber + "p"); | 
|---|
|  |  |  | } else if (operateType == 3) { | 
|---|
|  |  |  | } else if (operateType.equals(OperateTypeENUM.CANCEL.getCode().intValue())) { | 
|---|
|  |  |  | /** | 
|---|
|  |  |  | * 销卡操作执行通知 | 
|---|
|  |  |  | * 1. 操作记录改为有效 | 
|---|
|  |  |  | 
|---|
|  |  |  | return map; | 
|---|
|  |  |  | } | 
|---|
|  |  |  |  | 
|---|
|  |  |  | } else if (operateType == 4) { | 
|---|
|  |  |  | } else if (operateType.equals(OperateTypeENUM.REISSUE.getCode().intValue())) { | 
|---|
|  |  |  | /** | 
|---|
|  |  |  | * 补卡操作执行通知 | 
|---|
|  |  |  | * 1. 新水卡记录改为有效 | 
|---|
|  |  |  | 
|---|
|  |  |  | map.put("msg", "补卡回调失败"); | 
|---|
|  |  |  | return map; | 
|---|
|  |  |  | } | 
|---|
|  |  |  | } else if (operateType == 5) { | 
|---|
|  |  |  | } else if (operateType.equals(OperateTypeENUM.REFUND.getCode().intValue())) { | 
|---|
|  |  |  | /** | 
|---|
|  |  |  | * 补扣操作执行通知 | 
|---|
|  |  |  | * 1. 操作记录改为有效 | 
|---|
|  |  |  | 
|---|
|  |  |  | map.put("msg", "补扣回调失败"); | 
|---|
|  |  |  | return map; | 
|---|
|  |  |  | } | 
|---|
|  |  |  | } else if (operateType == 6) { | 
|---|
|  |  |  | } else if (operateType.equals(OperateTypeENUM.SUPPLEMENT.getCode().intValue())) { | 
|---|
|  |  |  | /** | 
|---|
|  |  |  | * 返还操作执行通知 | 
|---|
|  |  |  | * 1. 操作记录改为有效 | 
|---|
|  |  |  | 
|---|
|  |  |  |  | 
|---|
|  |  |  | map.put("success", true); | 
|---|
|  |  |  | map.put("msg", "操作成功"); | 
|---|
|  |  |  | return map; | 
|---|
|  |  |  | } | 
|---|
|  |  |  |  | 
|---|
|  |  |  | /** | 
|---|
|  |  |  | * 处理管理类型卡写卡回调 | 
|---|
|  |  |  | * | 
|---|
|  |  |  | * @param cardAddr    卡地址 | 
|---|
|  |  |  | * @param orderNumber 订单号 | 
|---|
|  |  |  | * @return 处理结果 | 
|---|
|  |  |  | */ | 
|---|
|  |  |  | private Map<String, Object> handleManagementCardWrite(String cardAddr, String orderNumber) { | 
|---|
|  |  |  | Map<String, Object> map = new HashMap<>(); | 
|---|
|  |  |  | map.put("success", false); | 
|---|
|  |  |  | map.put("content", null); | 
|---|
|  |  |  |  | 
|---|
|  |  |  | try { | 
|---|
|  |  |  | // 根据卡地址和订单号查找管理卡 | 
|---|
|  |  |  | SeManagementCard managementCard = seManagementCardMapper.selectOne( | 
|---|
|  |  |  | com.baomidou.mybatisplus.core.toolkit.Wrappers.<SeManagementCard>lambdaQuery() | 
|---|
|  |  |  | .eq(SeManagementCard::getCardAddr, cardAddr) | 
|---|
|  |  |  | .eq(SeManagementCard::getOrderNo, orderNumber)); | 
|---|
|  |  |  |  | 
|---|
|  |  |  | if (managementCard == null) { | 
|---|
|  |  |  | map.put("msg", "未找到对应的管理卡记录"); | 
|---|
|  |  |  | return map; | 
|---|
|  |  |  | } | 
|---|
|  |  |  |  | 
|---|
|  |  |  | // 更新管理卡状态为正常 | 
|---|
|  |  |  | managementCard.setState(ManagementCardStateENUM.NORMAL.getCode()); | 
|---|
|  |  |  |  | 
|---|
|  |  |  | int updateResult = seManagementCardMapper.updateByPrimaryKeySelective(managementCard); | 
|---|
|  |  |  | if (updateResult > 0) { | 
|---|
|  |  |  | map.put("success", true); | 
|---|
|  |  |  | map.put("msg", "管理卡写卡完成,状态已更新为正常"); | 
|---|
|  |  |  | } else { | 
|---|
|  |  |  | map.put("msg", "管理卡状态更新失败"); | 
|---|
|  |  |  | } | 
|---|
|  |  |  | } catch (Exception e) { | 
|---|
|  |  |  | log.error("处理管理卡写卡回调异常", e); | 
|---|
|  |  |  | map.put("msg", "处理管理卡写卡回调时发生异常:" + e.getMessage()); | 
|---|
|  |  |  | } | 
|---|
|  |  |  |  | 
|---|
|  |  |  | return map; | 
|---|
|  |  |  | } | 
|---|
|  |  |  |  | 
|---|
|  |  |  | 
|---|
|  |  |  | Long totalCount = seClientCardMapper.checkCardAddrExists(cardAddr); | 
|---|
|  |  |  | return totalCount != null && totalCount > 0; | 
|---|
|  |  |  | } | 
|---|
|  |  |  |  | 
|---|
|  |  |  | /** | 
|---|
|  |  |  | * 根据指定条件获取交易记录 | 
|---|
|  |  |  | * | 
|---|
|  |  |  | * @param vo | 
|---|
|  |  |  | * @return | 
|---|
|  |  |  | */ | 
|---|
|  |  |  | public Map getTransactions(QoTransaction vo) { | 
|---|
|  |  |  | DecimalFormat df = new DecimalFormat("0.00"); | 
|---|
|  |  |  | // 补齐查询时间 | 
|---|
|  |  |  | 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); | 
|---|
|  |  |  |  | 
|---|
|  |  |  | // 获取符合条件的记录数 | 
|---|
|  |  |  | Long itemTotal = Optional.ofNullable(seCardOperateMapper.getTransactionRecordCount(params)).orElse(0L); | 
|---|
|  |  |  |  | 
|---|
|  |  |  | QueryResultVo<List<VoTradeDetails>> rsVo = new QueryResultVo<>(); | 
|---|
|  |  |  | rsVo.pageSize = vo.pageSize; | 
|---|
|  |  |  | rsVo.pageCurr = vo.pageCurr; | 
|---|
|  |  |  | rsVo.calculateAndSet(itemTotal, params); | 
|---|
|  |  |  |  | 
|---|
|  |  |  | rsVo.obj = seCardOperateMapper.getTransactions(params); | 
|---|
|  |  |  | List<VoTradeDetails> list = rsVo.obj; | 
|---|
|  |  |  | if (list.size() == 0) { | 
|---|
|  |  |  | return new HashMap(); | 
|---|
|  |  |  | } | 
|---|
|  |  |  | //元谋一期陆常丽需求把赠送金额与充值金额分开显示 | 
|---|
|  |  |  | for (int i = list.size()-1; i >= 0 ; i--) { | 
|---|
|  |  |  | Optional.ofNullable(list.get(i).getGift()).orElse(0d); | 
|---|
|  |  |  | if (!list.get(i).getGift().equals(0d)){ | 
|---|
|  |  |  | Double gift1 = list.get(i).getGift();//赠送金额 | 
|---|
|  |  |  | String districtTitle = list.get(i).getDistrictTitle();//地址 | 
|---|
|  |  |  | String clientNum = list.get(i).getClientNum();//农户编号 | 
|---|
|  |  |  | String clientName = list.get(i).getClientName();//农户姓名 | 
|---|
|  |  |  | String phone = list.get(i).getPhone();//手机号 | 
|---|
|  |  |  | Date tradeTime = list.get(i).getTradeTime();//交易时间 | 
|---|
|  |  |  | String orderNumber = list.get(i).getOrderNumber();//订单编号 | 
|---|
|  |  |  | String cardNum = list.get(i).getCardNum();//卡编号 | 
|---|
|  |  |  | String idCard = list.get(i).getIdCard();//身份证 | 
|---|
|  |  |  | String cashierName = list.get(i).getCashierName();//操作人 | 
|---|
|  |  |  | Double money = list.get(i).getMoney();//余额 | 
|---|
|  |  |  | Double cardCost1 = list.get(i).getCardCost();//购卡金额 | 
|---|
|  |  |  | Double tradeAmount = list.get(i).getTradeAmount();//交易金额 | 
|---|
|  |  |  | Double waterCost1 = list.get(i).getWaterCost();//购水金额 | 
|---|
|  |  |  | Double refundAmount1 = list.get(i).getRefundAmount();//返回金额 | 
|---|
|  |  |  | String paymentName = list.get(i).getPaymentName();//支付方式 | 
|---|
|  |  |  | String operateType = list.get(i).getOperateType();//业务类型 | 
|---|
|  |  |  | String cardState = list.get(i).getCardState();//卡状态 | 
|---|
|  |  |  | Long villageId = list.get(i).getVillageId();//村id | 
|---|
|  |  |  | Long cashierId = list.get(i).getCashierId();//收银员id | 
|---|
|  |  |  |  | 
|---|
|  |  |  | list.get(i).setGift(0d); | 
|---|
|  |  |  | list.get(i).setMoney(money-gift1); | 
|---|
|  |  |  |  | 
|---|
|  |  |  | VoTradeDetails voTradeDetail = new VoTradeDetails(); | 
|---|
|  |  |  | voTradeDetail.setDistrictTitle(districtTitle);//2 | 
|---|
|  |  |  | voTradeDetail.setClientNum(clientNum);//2 | 
|---|
|  |  |  | voTradeDetail.setClientName(clientName);//2 | 
|---|
|  |  |  | voTradeDetail.setPhone(phone);//2 | 
|---|
|  |  |  | voTradeDetail.setOperateType("赠送");//2 | 
|---|
|  |  |  | voTradeDetail.setTradeTime(tradeTime);//2 | 
|---|
|  |  |  | voTradeDetail.setWaterCost(0d);//2 | 
|---|
|  |  |  | voTradeDetail.setCardCost(0d);//2 | 
|---|
|  |  |  | voTradeDetail.setGift(gift1);//2 | 
|---|
|  |  |  | voTradeDetail.setTradeAmount(0d);//2 | 
|---|
|  |  |  | voTradeDetail.setRefundAmount(refundAmount1);//2 | 
|---|
|  |  |  | voTradeDetail.setMoney(money);//待2 | 
|---|
|  |  |  | voTradeDetail.setPaymentName("赠送");//2 | 
|---|
|  |  |  | voTradeDetail.setOrderNumber(orderNumber);//2 | 
|---|
|  |  |  | voTradeDetail.setCardNum(cardNum);//2 | 
|---|
|  |  |  | voTradeDetail.setIdCard(idCard);//2 | 
|---|
|  |  |  | voTradeDetail.setCashierName(cashierName);//2 | 
|---|
|  |  |  | voTradeDetail.setCashierId(cashierId);//2 | 
|---|
|  |  |  | voTradeDetail.setCardState(cardState);//2 | 
|---|
|  |  |  | voTradeDetail.setVillageId(villageId);//2 | 
|---|
|  |  |  |  | 
|---|
|  |  |  | list.add(voTradeDetail); | 
|---|
|  |  |  | itemTotal = itemTotal + 1; | 
|---|
|  |  |  | } | 
|---|
|  |  |  | } | 
|---|
|  |  |  | list.sort(Comparator.comparing(VoTradeDetails::getTradeTime)); | 
|---|
|  |  |  | rsVo.obj = list; | 
|---|
|  |  |  | rsVo.calculateAndSet(itemTotal, params); | 
|---|
|  |  |  |  | 
|---|
|  |  |  | // 遍历交易明细记录,汇总购水金额、购卡金额 | 
|---|
|  |  |  | Double totalWaterCost = 0.0; | 
|---|
|  |  |  | Double totalCardCost = 0.0; | 
|---|
|  |  |  | Double totalGift = 0.0; | 
|---|
|  |  |  | Double totalRefund = 0.0; | 
|---|
|  |  |  |  | 
|---|
|  |  |  | JSONArray array = JSONArray.parseArray(JSON.toJSONString(list)); | 
|---|
|  |  |  | for (int i = 0; i < array.size(); i++) { | 
|---|
|  |  |  | JSONObject job = array.getJSONObject(i); | 
|---|
|  |  |  | Double waterCost = Optional.ofNullable(job.getDouble("waterCost")).orElse(0.0); | 
|---|
|  |  |  | Double cardCost = Optional.ofNullable(job.getDouble("cardCost")).orElse(0.0); | 
|---|
|  |  |  | Double gift = Optional.ofNullable(job.getDouble("gift")).orElse(0.0); | 
|---|
|  |  |  | Double refundAmount = Optional.ofNullable(job.getDouble("refundAmount")).orElse(0.0); | 
|---|
|  |  |  |  | 
|---|
|  |  |  | totalWaterCost = totalWaterCost + waterCost; | 
|---|
|  |  |  | totalCardCost = totalCardCost + cardCost; | 
|---|
|  |  |  | totalGift = totalGift + gift; | 
|---|
|  |  |  | totalRefund = totalRefund + refundAmount; | 
|---|
|  |  |  | } | 
|---|
|  |  |  |  | 
|---|
|  |  |  | Map map_record = new HashMap(); | 
|---|
|  |  |  | map_record.put("list", rsVo); | 
|---|
|  |  |  |  | 
|---|
|  |  |  | Map map_result = new HashMap(); | 
|---|
|  |  |  | map_result.put("waterCost", df.format(totalWaterCost)); | 
|---|
|  |  |  | map_result.put("cardCost", df.format(totalCardCost)); | 
|---|
|  |  |  | map_result.put("gift", df.format(totalGift)); | 
|---|
|  |  |  | map_result.put("refund", df.format(totalRefund)); | 
|---|
|  |  |  |  | 
|---|
|  |  |  | map_result.put("records", map_record); | 
|---|
|  |  |  |  | 
|---|
|  |  |  | return map_result; | 
|---|
|  |  |  | } | 
|---|
|  |  |  |  | 
|---|
|  |  |  | /** | 
|---|
|  |  |  | * 根据水卡编号或水卡地址获取操作记录及余额 | 
|---|
|  |  |  | * @param cardNum | 
|---|
|  |  |  | * @return | 
|---|
|  |  |  | */ | 
|---|
|  |  |  | public Map getOperateRecordsAndMoney(Long cardNum, String cardAddr) { | 
|---|
|  |  |  |  | 
|---|
|  |  |  | List<Map<String, Object>> list = Optional.ofNullable(seClientCardMapper.getOperateRecordsByCardNum(cardNum, cardAddr)).orElse(new ArrayList<>()); | 
|---|
|  |  |  | Float mondy = Optional.ofNullable(seClientCardMapper.getMoneyByCardNum(cardNum, cardAddr)).orElse(0f); | 
|---|
|  |  |  | Float amount = Optional.ofNullable(seClientCardMapper.sumRechargeByCardNum(cardNum, cardAddr)).orElse(0f); | 
|---|
|  |  |  |  | 
|---|
|  |  |  | Map map = new HashMap(); | 
|---|
|  |  |  | map.put("mondy", mondy); | 
|---|
|  |  |  | map.put("amount", amount); | 
|---|
|  |  |  | map.put("list", list); | 
|---|
|  |  |  | return map; | 
|---|
|  |  |  | } | 
|---|
|  |  |  | } | 
|---|