|  |  | 
 |  |  | 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; | 
 |  |  |     } | 
 |  |  |  | 
 |  |  | 
 |  |  |                     .domain(dto.getDomain()) | 
 |  |  |                     .openClostTime(dto.getOpenClostTime()) | 
 |  |  |                     .remarks(dto.getRemarks()) | 
 |  |  |                     .state(ManagementCardStateENUM.NORMAL.getCode()) // 默认状态为正常 | 
 |  |  |                     .state(ManagementCardStateENUM.UNWRITTEN.getCode()) // 默认状态为未写卡 | 
 |  |  |                     .build(); | 
 |  |  |  | 
 |  |  |             // 插入数据库 | 
 |  |  | 
 |  |  |         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; | 
 |  |  |     } | 
 |  |  | } |