package com.taoke.autopay.controller.client; import com.google.gson.Gson; import com.google.gson.GsonBuilder; import com.google.gson.TypeAdapter; import com.google.gson.stream.JsonReader; import com.google.gson.stream.JsonWriter; import com.taoke.autopay.dao.KeyOrderMapper; import com.taoke.autopay.dto.DYOrderDto; import com.taoke.autopay.entity.*; import com.taoke.autopay.exception.KeyOrderException; import com.taoke.autopay.exception.KeyVerifyException; import com.taoke.autopay.exception.WxOrderCountException; import com.taoke.autopay.factory.OrderFactory; import com.taoke.autopay.manager.OrderPayFailProcessor; import com.taoke.autopay.manager.PayCountVerifyManager; import com.taoke.autopay.service.*; import com.taoke.autopay.utils.*; import com.taoke.autopay.utils.order.DYOrderApi; import com.taoke.autopay.utils.order.OrderChannelApiUtil; import com.taoke.autopay.utils.order.OrderChannelUtil; import com.taoke.autopay.vo.AcceptData; import com.taoke.autopay.vo.KeyOrderVO; import com.taoke.autopay.vo.OrderFilter; import net.sf.json.JSONArray; import net.sf.json.JSONObject; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.stereotype.Controller; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.ResponseBody; import javax.annotation.Resource; import java.io.IOException; import java.io.UnsupportedEncodingException; import java.math.BigDecimal; import java.math.RoundingMode; import java.util.*; import java.util.regex.Matcher; import java.util.regex.Pattern; /** * @author hxh * @title: OrderController * @description: TODO * @date 2024/6/14 19:57 */ @Controller @RequestMapping("api/order") public class OrderController { private Logger loggerPay = LoggerFactory.getLogger("payLogger"); private Gson gson = new GsonBuilder().registerTypeAdapter(Date.class, new TypeAdapter() { @Override public void write(JsonWriter out, Date value) throws IOException { String desc = ""; if (value != null) { // 判断是否是同一天 desc = TimeUtil.getGernalTime(value.getTime(), "yyyy-MM-dd HH:mm:ss"); out.value(desc); } else { out.value(""); } } @Override public Date read(JsonReader in) throws IOException { return new Date(); } }).create(); @Resource private KeyOrderService keyOrderService; @Resource private ClientInfoService clientInfoService; @Resource private WxUserOrderCountService wxUserOrderCountService; @Resource private WxUserSettingService wxUserSettingService; @Resource private SystemConfigService systemConfigService; @Resource private OrderPayFailProcessor orderPayFailProcessor; @Resource private PayMoneySettingService payMoneySettingService; @Resource private UserSettingService userSettingService; @Resource private PayCountVerifyManager payCountVerifyManager; @ResponseBody @RequestMapping("listOrder") public String listOrder(AcceptData acceptData, OrderFilter filter) { KeyOrderMapper.DaoQuery query = new KeyOrderMapper.DaoQuery(); Long uid = filter.getUid(); ClientInfo info = clientInfoService.selectByPrimaryKey(uid); query.distributeClientUid = filter.getUid(); if (info == null) { return JsonUtil.loadFalseResult("客户端ID不存在"); } if (info.getRule() == 1) { // 超级管理员 query.distributeClientUid = null; } clientInfoService.setActiveTime(filter.getUid(), new Date()); query.start = (filter.getPage() - 1) * filter.getPageSize(); query.count = filter.getPageSize(); query.minCreateTime = new Date(System.currentTimeMillis() - 1000 * 60 * 30L); if (filter.getState() != null) { switch (filter.getState()) { case OrderFilter.STATE_NOT_PROCESS: query.stateList = Arrays.asList(new Integer[]{KeyOrder.STATE_NOT_PROCESS}); break; case OrderFilter.STATE_PROCESSED: query.stateList = Arrays.asList(new Integer[]{KeyOrder.STATE_PAY, KeyOrder.STATE_REJECT_PAY}); break; case OrderFilter.STATE_PROCESS_ERROR: query.stateList = Arrays.asList(new Integer[]{KeyOrder.STATE_NOT_PAY}); break; } } if (filter.getTimeType() != null) { long now = System.currentTimeMillis(); String nowDay = TimeUtil.getGernalTime(now, "yyyy-MM-dd"); switch (filter.getTimeType()) { case OrderFilter.TIME_TYPE_TODAY: query.minCreateTime = new Date(TimeUtil.convertToTimeTemp(nowDay, "yyyy-MM-dd")); break; case OrderFilter.TIME_TYPE_YESTERDAY: query.maxCreateTime = new Date(TimeUtil.convertToTimeTemp(nowDay, "yyyy-MM-dd")); query.minCreateTime = new Date(TimeUtil.convertToTimeTemp(TimeUtil.getGernalTime(now - 24 * 60 * 60 * 1000L, "yyyy-MM-dd"), "yyyy-MM-dd")); break; case OrderFilter.TIME_TYPE_WEEK: Calendar calendar = Calendar.getInstance(); calendar.setTime(new Date(now)); int day = calendar.get(Calendar.DAY_OF_WEEK); day -= 1; if (day == 0) { // 星期天 day = 7; } query.minCreateTime = new Date(TimeUtil.convertToTimeTemp(TimeUtil.getGernalTime(now - 24 * 60 * 60 * 1000L * (day - 1), "yyyy-MM-dd"), "yyyy-MM-dd")); break; case OrderFilter.TIME_TYPE_MONTH: query.minCreateTime = new Date(TimeUtil.convertToTimeTemp(TimeUtil.getGernalTime(now, "yyyy-MM"), "yyyy-MM")); break; } } if (filter.getSort() == 0) { query.sortList = Arrays.asList(new String[]{"create_time asc"}); } else { query.sortList = Arrays.asList(new String[]{"create_time desc"}); } List list = keyOrderService.list(query); List voList = new ArrayList<>(); for (KeyOrder order : list) { voList.add(OrderFactory.create(order)); } long count = keyOrderService.count(query); JSONObject data = new JSONObject(); data.put("count", count); data.put("list", gson.toJson(voList)); return JsonUtil.loadTrueResult(data); } @ResponseBody @RequestMapping("setOrderNoV2") public String setOrderNoV2(AcceptData acceptData, String id, String orderNoDesc, String orderStatus, String money) { loggerPay.info("setOrderNo[{}]: {}-{}-{}-{}", acceptData.getUid(), id, orderNoDesc, orderStatus, money); if (StringUtil.isNullOrEmpty(id)) { return JsonUtil.loadFalseResult("请上传id"); } if (StringUtil.isNullOrEmpty(money)) { return JsonUtil.loadFalseResult("请上传money"); } KeyOrder order = keyOrderService.selectById(id); if (order == null) { return JsonUtil.loadFalseResult("口令不存在"); } money = money.replace("¥", ""); int orderType = Constant.ORDER_TYPE_UNKNOWN; if (orderNoDesc.contains("抖音") || orderNoDesc.contains("上海格物致品")) { orderType = Constant.ORDER_TYPE_DY; } else if (orderNoDesc.contains("快手")) { orderType = Constant.ORDER_TYPE_KS; } String orderNo = ""; try { if (orderType == Constant.ORDER_TYPE_UNKNOWN) { throw new KeyOrderException("未定义的订单类型"); } if (!StringUtil.isNullOrEmpty(orderStatus)) { throw new KeyOrderException(orderStatus); } DYOrderDto dyOrderDto = null; try { // 验证订单是否可以支付 dyOrderDto = keyOrderService.verifyKey(orderNoDesc, orderStatus, money, null, null); } catch (KeyVerifyException ve) { throw new KeyOrderException("口令验证失败:" + ve.getMessage()); } // if(dyOrderDto!=null&&order.getOrderMoney()!=null){ // // 判断订单支付金额与用户提交的金额是否匹配 // if(dyOrderDto.getPay_amount()!=order.getOrderMoney().multiply(new BigDecimal(100)).setScale(0, RoundingMode.FLOOR).intValue()){ // throw new KeyOrderException(String.format("订单接口金额不匹配:%s-%s",dyOrderDto.getPay_amount(),MoneyUtil.getMoneyStr(order.getOrderMoney()))); // } // } if (dyOrderDto != null) { orderNo = dyOrderDto.getOrder_id(); } OrderChannelEnum orderChannel = null; if (dyOrderDto != null) { orderChannel = OrderChannelUtil.getChannelByKey(dyOrderDto.getOrderChannel()); } else { orderChannel = OrderChannelEnum.unknown; } // 验证渠道支付次数是否达到上限 if (order.getUid() != null) { payCountVerifyManager.verifyPayCount(order.getUid(), orderType, orderChannel); } // 设置进入 KeyOrder orderUpdate = new KeyOrder(); orderUpdate.setId(id); orderUpdate.setOrderType(orderType); orderUpdate.setOrderNo(orderNo); orderUpdate.setOrderMoney(new BigDecimal(money)); if (dyOrderDto != null) { orderUpdate.setOrderState(dyOrderDto.getOrder_status()); orderUpdate.setOrderChannel(dyOrderDto.getOrderChannel()); orderUpdate.setPayType(Constant.PAY_TYPE_WITH_ORDER_NO); } else { orderUpdate.setPayType(Constant.PAY_TYPE_WITH_MONEY); orderUpdate.setOrderChannel(OrderChannelEnum.unknown.getKey()); } orderUpdate.setExcutePayTime(new Date()); keyOrderService.update(orderUpdate); order = keyOrderService.selectById(id); order.setPayType(orderUpdate.getPayType()); return JsonUtil.loadTrueResult(gson.toJson(OrderFactory.create(order))); } catch (KeyOrderException e) { loggerPay.info(String.format("设置订单号出错:%s-%s", id, e.getMessage())); KeyOrder orderUpdate = new KeyOrder(); orderUpdate.setId(id); orderUpdate.setOrderType(orderType); orderUpdate.setOrderNo(orderNo); orderUpdate.setOrderMoney(new BigDecimal(money)); orderUpdate.setOrderState(0); orderUpdate.setState(KeyOrder.STATE_REJECT_PAY); if (order.getExcutePayTime() == null) { orderUpdate.setExcutePayTime(new Date()); } orderUpdate.setStateDesc(e.getMessage()); keyOrderService.update(orderUpdate); return JsonUtil.loadFalseResult(e.getMessage()); } catch (Exception e) { e.printStackTrace(); return JsonUtil.loadFalseResult(e.getMessage()); } } /** * @author hxh * @description 设置商家是否可支付 * @date 1:26 2025/2/8 * @param: acceptData * @param: id * @param: merchant * @return java.lang.String **/ @ResponseBody @RequestMapping("isMerchantCanPay") public String isMerchantCanPay(AcceptData acceptData, String id, String merchant) { loggerPay.info("isMerchantCanPay[{}]: {}-{}", acceptData.getUid(), id, merchant); // 判断是否为卡金额 KeyOrder keyOrder = keyOrderService.selectById(id); if (keyOrder == null) { return JsonUtil.loadFalseResult("订单ID不存在"); } OrderChannelEnum orderChannel = OrderChannelUtil.getChannelByKey(keyOrder.getOrderChannel()); if (orderChannel != OrderChannelEnum.unknown) { // 确定渠道的订单可直接支付 return JsonUtil.loadTrueResult(""); } // 获取卡金额的设置信息 PayMoneySetting payMoneySetting = payMoneySettingService.getSettingByMoney(keyOrder.getOrderMoney()); if (payMoneySetting == null) { keyOrderService.rejectPay(keyOrder.getId(),"付款金额不属于卡金额范围"); return JsonUtil.loadFalseResult("付款金额不属于卡金额范围"); } if (payMoneySetting.getVerifyMerchantChannel() == null || payMoneySetting.getVerifyMerchantChannel() == OrderChannelEnum.unknown) { // 没有设置校验渠道 return JsonUtil.loadTrueResult(""); } try { // 目前只判断超享佣 boolean isCanPay = OrderChannelApiUtil.isMerchantCanPay(payMoneySetting.getVerifyMerchantChannel(), merchant, keyOrder.getOrderMoney()); if (isCanPay) { // 通过商家校验 try { payCountVerifyManager.verifyPayCount(keyOrder.getUid(), keyOrder.getOrderType(), payMoneySetting.getVerifyMerchantChannel()); }catch (KeyOrderException ee){ // 拒绝支付 keyOrderService.rejectPay(keyOrder.getId(), ee.getMessage()); return JsonUtil.loadFalseResult(ee.getMessage()); }finally { // 更新渠道 KeyOrder update = new KeyOrder(); update.setId(keyOrder.getId()); update.setOrderChannel(payMoneySetting.getVerifyMerchantChannel().getKey()); keyOrderService.update(update); } return JsonUtil.loadTrueResult(""); } else { // 未通过商家校验 keyOrderService.rejectPay(keyOrder.getId(),"商家校验未通过"); return JsonUtil.loadFalseResult("商家校验未通过"); } } catch (UnsupportedEncodingException e) { return JsonUtil.loadFalseResult(e.getMessage()); } } /** * @return java.lang.String * @author hxh * @description 是否可以执行支付 * @date 0:22 2024/12/28 * @param: acceptData * @param: id **/ @ResponseBody @RequestMapping("canExcutePay") public String canExcutePay(AcceptData acceptData, String id) { try { KeyOrder keyOrder = keyOrderService.selectByIdForUpdate(id); if (keyOrder == null) { throw new Exception("订单不存在"); } if (keyOrder.getState() == KeyOrder.STATE_PAY) { throw new Exception("订单已支付"); } loggerPay.info("canExcutePay[{}]: {}-{}", acceptData.getUid(), id, "可以支付"); return JsonUtil.loadTrueResult(""); } catch (Exception e) { loggerPay.error("canExcutePay[{}]: {}-{}", acceptData.getUid(), id, "不可以支付:" + e.getMessage()); return JsonUtil.loadFalseResult(e.getMessage()); } } @ResponseBody @RequestMapping("setPayResult") public String setPayResult(AcceptData acceptData, String id, boolean paySuccess, String msg, String payMerchant) { loggerPay.info("setPayResult[{}]: {}-{}-{}-{}", acceptData.getUid(), id, paySuccess, msg, payMerchant); if (StringUtil.isNullOrEmpty(id)) { return JsonUtil.loadFalseResult("请上传id"); } KeyOrder order = keyOrderService.selectById(id); if (order == null) { return JsonUtil.loadFalseResult("口令不存在"); } // if (StringUtil.isNullOrEmpty(order.getOrderNo())) { // return JsonUtil.loadFalseResult("没有匹配到订单号"); // } if (order.getState() == KeyOrder.STATE_NOT_PROCESS) { if (!paySuccess) { // 支付失败 if (msg != null && msg.contains("超时")) { loggerPay.info(String.format("因为超时支付失败不处理:%s-%s", order.getId(), msg)); orderPayFailProcessor.processPayFail(order.getId(), msg); } else { KeyOrder orderUpdate = new KeyOrder(); orderUpdate.setId(id); orderUpdate.setState(KeyOrder.STATE_NOT_PAY); orderUpdate.setStateDesc("支付失败:" + msg); orderUpdate.setPayMerchant(payMerchant); keyOrderService.update(orderUpdate); } loggerPay.info("处理支付失败完成"); } else { try { keyOrderService.paySuccess(id, "支付成功", TimeUtil.getGernalTime(System.currentTimeMillis(), Constant.DB_DAY_FORMAT), payMerchant); loggerPay.info("处理支付成功完成"); } catch (WxOrderCountException e) { loggerPay.error(e.getMessage()); e.printStackTrace(); return JsonUtil.loadFalseResult(e.getMessage()); } } } return JsonUtil.loadTrueResult(""); } @ResponseBody @RequestMapping("rejectPay") public String rejectPay(AcceptData acceptData, String id) { loggerPay.info("rejectPay: {}-{}", acceptData.getUid(), id); if (StringUtil.isNullOrEmpty(id)) { return JsonUtil.loadFalseResult("请上传id"); } KeyOrder order = keyOrderService.selectById(id); if (order == null) { return JsonUtil.loadFalseResult("口令不存在"); } if (order.getState() != KeyOrder.STATE_NOT_PROCESS) { return JsonUtil.loadFalseResult("只能驳回未执行状态的口令"); } KeyOrder orderUpdate = new KeyOrder(); orderUpdate.setId(id); orderUpdate.setState(KeyOrder.STATE_REJECT_PAY); orderUpdate.setStateDesc("人工驳回"); keyOrderService.update(orderUpdate); return JsonUtil.loadTrueResult(""); } @ResponseBody @RequestMapping("deleteAll") public String deleteAll(AcceptData acceptData, Long uid) { ClientInfo user = clientInfoService.selectByPrimaryKey(uid); if (user == null) { return JsonUtil.loadFalseResult("用户不存在"); } if (user.getRule() != ClientInfo.RULE_ADMIN) { return JsonUtil.loadFalseResult("只有管理员才能删除"); } // 删除10天之前的数据 keyOrderService.deleteAll(new Date(System.currentTimeMillis() - 24 * 60 * 60 * 1000L * 10)); // keyOrderService.deleteAll(new Date(System.currentTimeMillis())); // 刪除所有數據 return JsonUtil.loadTrueResult(""); } public static void main(String[] args) { Calendar calendar = Calendar.getInstance(); for (int i = 0; i < 7; i++) { calendar.setTime(new Date(System.currentTimeMillis() - 24 * 60 * 60 * 1000L * i)); int day = calendar.get(Calendar.DAY_OF_WEEK); System.out.println(day - 1); } } }