luodangjia
2024-09-27 2e9f0c10501ca6a8cb9633272b2636058ba72bf3
Merge remote-tracking branch 'origin/master'
20个文件已修改
1个文件已添加
346 ■■■■ 已修改文件
ruoyi-api/ruoyi-api-order/src/main/java/com/ruoyi/order/api/factory/ChargingOrderFallbackFactory.java 10 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-api/ruoyi-api-order/src/main/java/com/ruoyi/order/api/feignClient/ChargingOrderClient.java 26 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-api/ruoyi-api-order/src/main/java/com/ruoyi/order/api/model/TShoppingOrder.java 2 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-api/ruoyi-api-order/src/main/java/com/ruoyi/order/api/model/TVipOrder.java 3 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-api/ruoyi-api-other/src/main/java/com/ruoyi/other/api/dto/GoodsDTO.java 2 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-api/ruoyi-api-payment/src/main/java/com/ruoyi/payment/api/factory/WxPaymentFallbackFactory.java 15 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-api/ruoyi-api-payment/src/main/java/com/ruoyi/payment/api/feignClient/WxPaymentClient.java 20 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-api/ruoyi-api-payment/src/main/java/com/ruoyi/payment/api/vo/PaymentOrder.java 2 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-service/ruoyi-chargingPile/src/main/resources/bootstrap.yml 2 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-service/ruoyi-order/src/main/java/com/ruoyi/order/controller/TChargingOrderController.java 33 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-service/ruoyi-order/src/main/java/com/ruoyi/order/controller/TShoppingOrderController.java 16 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-service/ruoyi-order/src/main/java/com/ruoyi/order/controller/TVipOrderController.java 2 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-service/ruoyi-order/src/main/java/com/ruoyi/order/service/impl/TChargingOrderServiceImpl.java 40 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-service/ruoyi-order/src/main/java/com/ruoyi/order/service/impl/TShoppingOrderServiceImpl.java 1 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-service/ruoyi-order/src/main/java/com/ruoyi/order/service/impl/TVipOrderServiceImpl.java 7 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-service/ruoyi-order/src/main/java/com/ruoyi/order/util/task/TaskUtil.java 120 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-service/ruoyi-order/src/main/resources/mapper/order/TShoppingOrderMapper.xml 1 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-service/ruoyi-order/src/main/resources/mapper/order/TVipOrderMapper.xml 2 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-service/ruoyi-other/src/main/java/com/ruoyi/other/controller/TCouponController.java 19 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-service/ruoyi-other/src/main/resources/mapper/other/TGoodsMapper.xml 3 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-service/ruoyi-payment/src/main/java/com/ruoyi/payment/controller/WxPayController.java 20 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-api/ruoyi-api-order/src/main/java/com/ruoyi/order/api/factory/ChargingOrderFallbackFactory.java
@@ -118,6 +118,16 @@
            public R<String> stopCharging(String id) {
                return R.fail("手动停止充电失败:" + throwable.getMessage());
            }
            @Override
            public void chargingOrderWXCallback(String out_trade_no, String transaction_id, String attach) {
                log.error("充电支付成功回调通知失败:" + throwable.getMessage());
            }
            @Override
            public void chargingOrderStartupFailureWxRefund(String out_refund_no, String refund_id, String tradeState, String success_time) {
                log.error("远程启动失败后退款通知失败:" + throwable.getMessage());
            }
        };
    }
}
ruoyi-api/ruoyi-api-order/src/main/java/com/ruoyi/order/api/feignClient/ChargingOrderClient.java
@@ -137,4 +137,30 @@
     */
    @PutMapping(value = "/t-charging-order/stopCharging/{id}")
    R<String> stopCharging(@PathVariable("id") String id);
    /**
     * 充电支付成功回调通知
     * @param out_trade_no
     * @param transaction_id
     * @param attach
     */
    @PostMapping("/t-charging-order/chargingOrderWXCallback")
    void chargingOrderWXCallback(@RequestParam("out_trade_no") String out_trade_no,
                                 @RequestParam("transaction_id") String transaction_id,
                                 @RequestParam("attach") String attach);
    /**
     * 远程启动失败后退款回调
     * @param out_refund_no
     * @param refund_id
     * @param tradeState
     * @param success_time
     */
    @PostMapping("/t-charging-order/chargingOrderStartupFailureWxRefund")
    void chargingOrderStartupFailureWxRefund(@RequestParam("out_trade_no") String out_refund_no,
                                             @RequestParam("out_trade_no") String refund_id,
                                             @RequestParam("out_trade_no") String tradeState,
                                             @RequestParam("out_trade_no") String success_time);
}
ruoyi-api/ruoyi-api-order/src/main/java/com/ruoyi/order/api/model/TShoppingOrder.java
@@ -105,7 +105,7 @@
    @TableField("remark")
    private String remark;
    @ApiModelProperty(value = "状态(1=待发货,2=待收货,3=已完成,4=已取消)")
    @ApiModelProperty(value = "状态(1=待发货,2=待收货,3=已完成,4=已取消 5=交易关闭)")
    @TableField("status")
    private Integer status;
ruoyi-api/ruoyi-api-order/src/main/java/com/ruoyi/order/api/model/TVipOrder.java
@@ -101,5 +101,8 @@
    @ApiModelProperty(value = "userUid")
    @TableField(exist = false)
    private String userUid;
    @ApiModelProperty(value = "购买用户")
    @TableField(exist = false)
    private String userPhone;
}
ruoyi-api/ruoyi-api-other/src/main/java/com/ruoyi/other/api/dto/GoodsDTO.java
@@ -14,6 +14,6 @@
    private String name;
    @ApiModelProperty(value = "1现金购买 2积分兑换 ")
    private Integer type;
    @ApiModelProperty(value = "1全部 2已售罄 ")
    @ApiModelProperty(value = "1全部 2已售罄 3已下架")
    private Integer otherState;
}
ruoyi-api/ruoyi-api-payment/src/main/java/com/ruoyi/payment/api/factory/WxPaymentFallbackFactory.java
@@ -38,16 +38,6 @@
            public R<Map<String, Object>> orderPay(PaymentOrder paymentOrder) {
                return R.fail("调起微信支付失败:" + throwable.getMessage());
            }
            @Override
            public R<Map<String, Object>> payNotify(HttpServletRequest request) {
                return R.fail("微信支付回调失败:" + throwable.getMessage());
            }
            @Override
            public void ack() {
            }
            @Override
            public void close(String outTradeNo) {
@@ -57,11 +47,6 @@
            @Override
            public R<String> refundOrderR(WxPaymentRefundModel model) {
                return R.fail("微信退款失败:" + throwable.getMessage());
            }
            @Override
            public R<WxRefundNotifyResp> refundNotify(HttpServletRequest request) {
                return R.fail("微信退款回调失败:" + throwable.getMessage());
            }
        };
    }
ruoyi-api/ruoyi-api-payment/src/main/java/com/ruoyi/payment/api/feignClient/WxPaymentClient.java
@@ -41,20 +41,6 @@
    R<Map<String, Object>> orderPay(@RequestBody PaymentOrder paymentOrder);
    
    
    /**
     * 支付回调
     * @param request
     * @return
     */
    @PostMapping("/wx/pay/notify")
    R<Map<String, Object>> payNotify(HttpServletRequest request);
    /**
     * 支付回调成功后的成功应答
     */
    @PostMapping("/wx/pay/ack")
    void ack();
    
    /**
     * 关闭订单
@@ -66,10 +52,4 @@
    @ApiOperation("订单退款")
    @PostMapping(value = "/wx/refundOrderR")
    public R<String> refundOrderR(@RequestBody WxPaymentRefundModel model);
    @ApiOperation("订单退款回调")
    @PostMapping(value = "/wx/refund/notify")
    R<WxRefundNotifyResp> refundNotify(HttpServletRequest request);
}
ruoyi-api/ruoyi-api-payment/src/main/java/com/ruoyi/payment/api/vo/PaymentOrder.java
@@ -29,5 +29,5 @@
    /**
     * 回调地址
     */
    private String notifyUrl ="http://221.182.45.100:9000/payment/wx/pay/notify";
    private String notifyUrl ="/payment/wx/pay/notify";
}
ruoyi-service/ruoyi-chargingPile/src/main/resources/bootstrap.yml
@@ -46,7 +46,7 @@
  enabled: true
  application-id: ${spring.application.name}
  tx-service-group: seata_tx_group    #此处配置自定义的seata事务分组名称
  enable-auto-data-source-proxy: false
  enable-auto-data-source-proxy: true
  service:
    vgroup-mapping:
      seata_tx_group: default
ruoyi-service/ruoyi-order/src/main/java/com/ruoyi/order/controller/TChargingOrderController.java
@@ -68,6 +68,7 @@
import org.springframework.web.bind.annotation.*;
import javax.annotation.Resource;
import javax.servlet.ServletInputStream;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.PrintWriter;
@@ -429,21 +430,12 @@
    
    /**
     * 充电充值支付回调
     * @param request
     */
    @ResponseBody
    @PostMapping(value = "/chargingOrderWXCallback")
    public void chargingOrderWXCallback(HttpServletRequest request) {
        Map<String, Object> data = wxPaymentClient.payNotify(request).getData();
        if (null != data) {
            String out_trade_no = data.get("out_trade_no").toString();
            String transaction_id = data.get("transaction_id").toString();
            String attach = data.get("attach").toString();
            AjaxResult ajaxResult = chargingOrderService.chargingOrderCallback(1, out_trade_no, transaction_id, attach);
            if (ajaxResult.isSuccess()) {
                wxPaymentClient.ack();
            }
        }
    public void chargingOrderWXCallback(@RequestParam("out_trade_no") String out_trade_no, @RequestParam("transaction_id") String transaction_id,
                                        @RequestParam("attach") String attach) {
        AjaxResult ajaxResult = chargingOrderService.chargingOrderCallback(1, out_trade_no, transaction_id, attach);
    }
@@ -472,19 +464,14 @@
    
    /**
     * 远程启动失败后退款回调
     * @param request
     */
    @ResponseBody
    @PostMapping(value = "/chargingOrderStartupFailureWxRefund")
    public void chargingOrderStartupFailureWxRefund(HttpServletRequest request){
        WxRefundNotifyResp data = wxPaymentClient.refundNotify(request).getData();
        if(null != data){
            String out_refund_no = data.getOut_refund_no();
            String refund_id = data.getRefund_id();
            String tradeState = data.getTradeState();
            String success_time = data.getSuccess_time();
            chargingOrderService.chargingOrderStartupFailureWxRefund(out_refund_no, refund_id, tradeState, success_time);
        }
    public void chargingOrderStartupFailureWxRefund(@RequestParam("out_trade_no") String out_refund_no,
                                                    @RequestParam("out_trade_no") String refund_id,
                                                    @RequestParam("out_trade_no") String tradeState,
                                                    @RequestParam("out_trade_no") String success_time){
        chargingOrderService.chargingOrderStartupFailureWxRefund(out_refund_no, refund_id, tradeState, success_time);
    }
    
    
@@ -585,7 +572,7 @@
    }
    @ResponseBody
    @PostMapping(value = "/work/shop")
    @GetMapping(value = "/work/shop")
    @ApiOperation(value = "购物收入", tags = {"后台-工作台"})
    public R workShop(@RequestBody ChargingStatisticsQueryDto statisticsQueryDto) {
        //count近6个月的数据
ruoyi-service/ruoyi-order/src/main/java/com/ruoyi/order/controller/TShoppingOrderController.java
@@ -274,14 +274,14 @@
     */
    @PostMapping("/cancelShoppingOrderWxRefund")
    public void cancelShoppingOrderWxRefund(HttpServletRequest request) {
        WxRefundNotifyResp data = wxPaymentClient.refundNotify(request).getData();
        if (null != data) {
            String out_refund_no = data.getOut_refund_no();
            String refund_id = data.getRefund_id();
            String tradeState = data.getTradeState();
            String success_time = data.getSuccess_time();
            shoppingOrderService.cancelShoppingOrderWxRefund(out_refund_no, refund_id, tradeState, success_time);
        }
//        WxRefundNotifyResp data = wxPaymentClient.refundNotify(request).getData();
//        if (null != data) {
//            String out_refund_no = data.getOut_refund_no();
//            String refund_id = data.getRefund_id();
//            String tradeState = data.getTradeState();
//            String success_time = data.getSuccess_time();
//            shoppingOrderService.cancelShoppingOrderWxRefund(out_refund_no, refund_id, tradeState, success_time);
//        }
    }
    
    
ruoyi-service/ruoyi-order/src/main/java/com/ruoyi/order/controller/TVipOrderController.java
@@ -70,6 +70,8 @@
    @PostMapping("/addVipOrder")
    @ApiOperation(value = "添加会员订单", tags = {"管理后台-会员订单"})
    public R<Long> addVipOrder(@RequestBody TVipOrder dto) {
        List<TVipOrder> list = vipOrderService.lambdaQuery().eq(TVipOrder::getCode, dto.getCode()).list();
        if (!list.isEmpty())return R.fail("订单编号已存在");
        vipOrderService.saveOrUpdate(dto);
        return R.ok(dto.getId());
    }
ruoyi-service/ruoyi-order/src/main/java/com/ruoyi/order/service/impl/TChargingOrderServiceImpl.java
@@ -498,7 +498,7 @@
            paymentOrder.setAmount(addChargingOrder.getPaymentAmount());
            paymentOrder.setOpenId(appUser.getWxOpenid());
            paymentOrder.setDescription("充电充值");
            paymentOrder.setNotifyUrl("/order/t-charging-order/chargingOrderWXCallback");
            paymentOrder.setNotifyUrl("/payment/wx/pay/notify");
            Map<String, Object> data = wxPaymentClient.orderPay(paymentOrder).getData();
            return AjaxResult.success(data);
        }
@@ -511,7 +511,7 @@
            req.setBody("充电充值");
            AliPaymentResp data = aliPaymentClient.payment(req).getData();
            if(null != data){
                data.setNotifyUrl(data.getNotifyUrl() + "/t-charging-order/chargingOrderALICallback");
                data.setNotifyUrl(data.getNotifyUrl() + "/order/t-charging-order/chargingOrderALICallback");
                return AjaxResult.success(data);
            }
        }
@@ -550,7 +550,9 @@
        //根据当前充值的金额和计费模板算出充电的金额
        BigDecimal rechargeAmount = chargingOrder.getRechargeAmount();
        BigDecimal rechargeAmount1 = new BigDecimal(rechargeAmount.toString());
        Long now = System.currentTimeMillis();
        SimpleDateFormat sdf = new SimpleDateFormat("HHmm");
        Long now = Long.valueOf(sdf.format(new Date()));
        Long nowTimeMillis = System.currentTimeMillis();
        //根据支付金额,获取出使用的计费策略明细
        //计算电费金额和服务费
        BigDecimal serviceCharge = BigDecimal.ZERO;
@@ -559,21 +561,27 @@
        BigDecimal discount = chargingOrder.getVipDiscount();
        //先根据额定功率计算出每秒充电度数,然后计算出支付金额能充多少度电
        TChargingGun tChargingGun = chargingGunClient.getChargingGunById(chargingOrder.getChargingGunId()).getData();
        BigDecimal s_degrees = tChargingGun.getRatedPower().divide(new BigDecimal(3600));
        BigDecimal s_degrees = tChargingGun.getRatedPower().divide(new BigDecimal(3600), 6, RoundingMode.HALF_EVEN);
        TAppUser appUser = appUserClient.getUserById(chargingOrder.getAppUserId()).getData();
        List<AccountingStrategyDetailOrder> list = accountingStrategyDetailOrderClient.getAllAccountingStrategyDetailOrder(chargingOrder.getId()).getData();
        for (AccountingStrategyDetailOrder accountingStrategyDetailOrder : list) {
            AccountingStrategyOrder accountingStrategyOrder = accountingStrategyOrderClient.getAccountingStrategyOrderById(accountingStrategyDetailOrder.getAccountingStrategyOrderId()).getData();
            Integer start = Integer.valueOf(accountingStrategyDetailOrder.getStartTime().replaceAll(":", ""));
            Integer end = Integer.valueOf(accountingStrategyDetailOrder.getEndTime().replaceAll(":", ""));
            String[] split = accountingStrategyDetailOrder.getEndTime().split(":");
            if(now >= start){
            if(now >= start && now < end){
                Calendar calendar = Calendar.getInstance();
                calendar.set(Calendar.HOUR_OF_DAY, Integer.valueOf(split[0]));
                calendar.set(Calendar.MINUTE, Integer.valueOf(split[1]));
                //到此策略结束的秒数
                long m = (calendar.getTimeInMillis() - now) / 1000;
                if(null == nowTimeMillis){
                    String[] split1 = accountingStrategyDetailOrder.getStartTime().split(":");
                    Calendar calendar1 = Calendar.getInstance();
                    calendar1.set(Calendar.HOUR_OF_DAY, Integer.valueOf(split1[0]));
                    calendar1.set(Calendar.MINUTE, Integer.valueOf(split1[1]));
                    nowTimeMillis = calendar.getTimeInMillis();
                }
                long m = (calendar.getTimeInMillis() - nowTimeMillis) / 1000;
                //每度电的单价
                BigDecimal total_unit = accountingStrategyDetailOrder.getElectrovalence().add(accountingStrategyDetailOrder.getServiceCharge());
                //每秒需要支付的金额
@@ -586,6 +594,7 @@
                    serviceCharge = accountingStrategyDetailOrder.getServiceCharge().multiply(s_degrees).multiply(new BigDecimal(m));
                    discountAmount = discountAmount.add(serviceCharge.multiply((new BigDecimal(10).subtract(discount)).divide(new BigDecimal(10))));
                    rechargeAmount1 = rechargeAmount1.subtract(multiply.multiply(new BigDecimal(m)));
                    nowTimeMillis = null;
                }else{
                    electrovalence = accountingStrategyDetailOrder.getElectrovalence().multiply(s_degrees).multiply(new BigDecimal(times));
                    serviceCharge = accountingStrategyDetailOrder.getServiceCharge().multiply(s_degrees).multiply(new BigDecimal(times));
@@ -620,7 +629,8 @@
        chargingOrder.setChargeAmount(electrovalence);
        chargingOrder.setVipDiscountAmount(discountAmount);
        this.updateById(chargingOrder);
        TChargingPile chargingPile = chargingPileClient.getChargingPileById(tChargingGun.getChargingPileId()).getData();
        //调用远程启动充电消息
        PlatformStartCharging platformStartCharging = new PlatformStartCharging();
@@ -630,6 +640,10 @@
        //使用订单id作为逻辑卡号
        platformStartCharging.setCard_number(chargingOrder.getId().toString());
        platformStartCharging.setAccount_balance(electrovalence);
        System.err.println("-------------------远程调起开始充电请求-------------------");
        System.err.println(platformStartCharging.toString());
        sendMessageClient.platformStartCharging(platformStartCharging);
        //异步线程检测远程启动的应答结果。如果失败,则需要全额退款
        String code = chargingOrder.getCode();
@@ -637,6 +651,8 @@
        ScheduledExecutorService scheduler = Executors.newScheduledThreadPool(1);
        scheduler.scheduleAtFixedRate(()->{
            List<PlatformStartChargingReply> data = platformStartChargingReplyClient.getPlatformStartChargingReply(code).getData();
            System.err.println("-------------------开始检查调起充电结果-------------------");
            System.err.println(data.toString());
            if(data.size() != 0){
                PlatformStartChargingReply platformStartChargingReply = data.get(1);
                Integer startup_result = platformStartChargingReply.getStartup_result();
@@ -711,7 +727,7 @@
                model.setOut_trade_no(chargingOrder.getCode());
                model.setOut_refund_no(chargingOrderRefund.getRefundCode());
                model.setReason("充电失败,取消充电订单");
                model.setNotify_url("/order/t-charging-order/chargingOrderStartupFailureWxRefund");
                model.setNotify_url("/payment/wx/refund/notify");
                WxPaymentRefundModel.RefundAmount amount = new WxPaymentRefundModel.RefundAmount();
                amount.setRefund(rechargeAmount.multiply(new BigDecimal(100)).intValue());
                amount.setTotal(rechargeAmount.multiply(new BigDecimal(100)).intValue());
@@ -1115,7 +1131,7 @@
                model.setOut_trade_no(chargingOrder.getCode());
                model.setOut_refund_no(chargingOrderRefund.getRefundCode());
                model.setReason("充电完成退款");
                model.setNotify_url("/order/t-charging-order/chargingOrderStartupFailureWxRefund");
                model.setNotify_url("/payment/wx/refund/notify");
                WxPaymentRefundModel.RefundAmount amount = new WxPaymentRefundModel.RefundAmount();
                amount.setRefund(refundAmount.multiply(new BigDecimal(100)).intValue());
                amount.setTotal(rechargeAmount.multiply(new BigDecimal(100)).intValue());
ruoyi-service/ruoyi-order/src/main/java/com/ruoyi/order/service/impl/TShoppingOrderServiceImpl.java
@@ -584,6 +584,7 @@
                    if (data1!=null){
                        tShoppingOrder.setName(data1.getName());
                    }
                    tShoppingOrder.setStatus(3);
                    break;
            }
            if (tShoppingOrder.getAppUserId() != null){
ruoyi-service/ruoyi-order/src/main/java/com/ruoyi/order/service/impl/TVipOrderServiceImpl.java
@@ -3,6 +3,8 @@
import com.baomidou.mybatisplus.core.toolkit.Wrappers;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import com.ruoyi.account.api.dto.GiveVipDto;
import com.ruoyi.account.api.feignClient.AppUserClient;
import com.ruoyi.account.api.model.TAppUser;
import com.ruoyi.common.core.web.page.PageInfo;
import com.ruoyi.order.api.model.TShoppingOrder;
import com.ruoyi.order.api.model.TVipOrder;
@@ -33,6 +35,8 @@
    @Resource
    private VipClient vipClient;
    @Resource
    private AppUserClient appUserClient;
    @Override
    public PageInfo<TVipOrder> pageList(VipShoppingOrderQuery query) {
        String startTime1 = null;
@@ -50,9 +54,12 @@
            tVipOrder.setUid(tVipOrder.getId().toString());
            tVipOrder.setUserUid(tVipOrder.getAppUserId().toString());
            TVip data = vipClient.getInfo(tVipOrder.getVipId()).getData();
            if (data!=null){
                tVipOrder.setName(data.getName());
            }
            TAppUser data1 = appUserClient.getUserById(tVipOrder.getAppUserId()).getData();
            if (data1!=null)tVipOrder.setUserPhone(data1.getPhone());
        }
        pageInfo.setRecords(list);
        return pageInfo;
ruoyi-service/ruoyi-order/src/main/java/com/ruoyi/order/util/task/TaskUtil.java
New file
@@ -0,0 +1,120 @@
package com.ruoyi.order.util.task;
import com.alibaba.fastjson2.util.UUIDUtils;
import com.alibaba.nacos.common.utils.UuidUtils;
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.ruoyi.chargingPile.api.feignClient.SiteClient;
import com.ruoyi.chargingPile.api.model.Site;
import com.ruoyi.order.api.model.TChargingBill;
import com.ruoyi.order.service.TChargingBillService;
import org.apache.logging.log4j.core.util.UuidUtil;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.scheduling.annotation.Scheduled;
import org.springframework.stereotype.Component;
import javax.annotation.Resource;
import java.time.LocalDate;
import java.time.LocalDateTime;
import java.time.ZoneId;
import java.time.format.DateTimeFormatter;
import java.util.ArrayList;
import java.util.Date;
import java.util.List;
import java.util.Random;
import java.util.stream.Collectors;
/**
 * @author zhibing.pu
 * @date 2023/7/11 8:39
 */
@Component
public class TaskUtil {
    @Resource
    private TChargingBillService chargingBillService;
    @Resource
    private SiteClient siteClient;
    public static void main(String[] args) {
        LocalDate firstDayOfLastMonth = LocalDate.now().minusMonths(1).
                withDayOfMonth(2);
        String string = firstDayOfLastMonth.toString();
        // 将-替换为空字符串
        string = string.replace("-", "");
        System.err.println(string);
    }
    // 每月2号凌晨12点执行的定时任务
    @Scheduled(cron = "0 0 0 2 * ?")
    public void taskMonth() {
        try {
            // 获取上个月的开始和结束日期
            LocalDate firstDayOfLastMonth = LocalDate.now().minusMonths(1).
                    withDayOfMonth(2);
            String string = firstDayOfLastMonth.toString();
            // 将-替换为空字符串
            string = string.replace("-", "");
            // 生成一次全站订单
            TChargingBill tChargingBill = new TChargingBill();
            // 订单生成规则JSD+20231201(账单所属月份)+1131304205(随机10位数)+001(当月账单序号,每月重置)
            Random random = new Random();
            String randomDigits = random.ints(10, 0, 10) // 生成10个随机数字,范围在0-9
                    .mapToObj(String::valueOf)
                    .collect(Collectors.joining()); // 将其连接成一个字符串
            tChargingBill.setCode("JSD"+string+randomDigits+"001" );
            tChargingBill.setType(1);
            tChargingBill.setBillTime(LocalDateTime.now());
            tChargingBill.setStatus(1);
            tChargingBill.setOrderState(2);
            chargingBillService.save(tChargingBill);
            // 每月二号给每个站点生成上月账单
            List<Integer> collect = siteClient.getSiteAll().getData().stream().map(Site::getId).collect(Collectors.toList());
            List<TChargingBill> tChargingBills = new ArrayList<>();
            for (int i = 1; i <= collect.size(); i++) {
                TChargingBill tChargingBill1 = new TChargingBill();
                Random random1 = new Random();
                String randomDigits1 = random1.ints(10, 0, 10) // 生成10个随机数字,范围在0-9
                        .mapToObj(String::valueOf)
                        .collect(Collectors.joining()); // 将其连接成一个字符串
                tChargingBill1.setCode("JSD"+string+randomDigits1+i );
                tChargingBill1.setType(2);
                tChargingBill1.setSiteId(collect.get(i));
                tChargingBill1.setBillTime(LocalDateTime.now());
                tChargingBill1.setStatus(1);
                tChargingBill1.setOrderState(2);
                tChargingBills.add(tChargingBill1);
            }
            if (!tChargingBills.isEmpty())chargingBillService.saveBatch(tChargingBills);
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
    // 每个月最后一天23点执行的定时任务
    @Scheduled(cron = "0 0 23 L * ?")
    public void taskLastDay() {
        try {
            // 获取上个月的开始和结束日期
            LocalDate firstDayOfLastMonth = LocalDate.now().minusMonths(1).
                    withDayOfMonth(1);
            LocalDate lastDayOfLastMonth = LocalDate.now().minusMonths(1).
                    withDayOfMonth(firstDayOfLastMonth.lengthOfMonth());
            // 将 LocalDate 转换为 LocalDateTime,并设定时间为一天的开始
            LocalDateTime startDateTime = firstDayOfLastMonth.atStartOfDay();
            LocalDateTime endDateTime = lastDayOfLastMonth.atTime(23, 59, 59); // 设定到最后一秒
            // 构建查询条件
            LambdaQueryWrapper<TChargingBill> queryWrapper = new LambdaQueryWrapper<>();
            queryWrapper.ge(TChargingBill::getBillTime,
                            Date.from(startDateTime.atZone(ZoneId.systemDefault()).toInstant()))
                    .le(TChargingBill::getBillTime,
                            Date.from(endDateTime.atZone(ZoneId.systemDefault()).toInstant())); // 使用 le 包括最后一天的记录
            List<TChargingBill> list = chargingBillService.list(queryWrapper);
            for (TChargingBill tChargingBill : list) {
                tChargingBill.setStatus(2);
            }
            chargingBillService.updateBatchById(list);
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
}
ruoyi-service/ruoyi-order/src/main/resources/mapper/order/TShoppingOrderMapper.xml
@@ -255,6 +255,7 @@
        </if>
        and t1.payment_status = 2
        AND t1.del_flag = ${@com.ruoyi.common.core.enums.DelFlagEnum@NO.getCode()}
        order by t1.create_time desc
    </select>
    <select id="sixBefore" resultType="com.ruoyi.order.dto.SixShopDto">
        SELECT
ruoyi-service/ruoyi-order/src/main/resources/mapper/order/TVipOrderMapper.xml
@@ -44,7 +44,9 @@
        <if test="startTime1 != null and startTime1!=''">
            and (t1.create_time between #{startTime1} and #{startTime2}
        </if>
        and t1.payment_status = 2
        AND t1.del_flag = ${@com.ruoyi.common.core.enums.DelFlagEnum@NO.getCode()}
        order by t1.create_time desc
    </select>
    <select id="sixBefore" resultType="com.ruoyi.order.dto.SixVipDto">
        SELECT
ruoyi-service/ruoyi-other/src/main/java/com/ruoyi/other/controller/TCouponController.java
@@ -35,6 +35,7 @@
import javax.annotation.Resource;
import java.math.BigDecimal;
import java.time.LocalDateTime;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;
import java.util.Objects;
@@ -180,6 +181,24 @@
    public AjaxResult<PageInfo<TCoupon>> pageList(@RequestBody CouponQuery dto) {
        return AjaxResult.ok(tCouponService.pageList(dto));
    }
    @ApiOperation(tags = {"管理后台-优惠券管理"},value = "优惠券列表分页查询")
    @PostMapping(value = "/pageList3")
    public AjaxResult<List<TCoupon>> pageList() {
        List<TCoupon> tCoupons = new ArrayList<>();
        List<TCoupon> list = tCouponService.lambdaQuery().eq(TCoupon::getStatus, 1)
                .orderByDesc(TCoupon::getCreateTime).list();
        for (TCoupon tCoupon : list) {
            if (tCoupon.getValidityPeriodMode()==1){
                if (LocalDateTime.now().isBefore(tCoupon.getEndTime())){
                    tCoupons.add(tCoupon);
                }
            }else{
                tCoupons.add(tCoupon);
            }
        }
        return AjaxResult.ok(tCoupons);
    }
    /**
     * 小程序远程调用 获取优惠券信息
ruoyi-service/ruoyi-other/src/main/resources/mapper/other/TGoodsMapper.xml
@@ -45,6 +45,9 @@
            <if test="req.otherState != null and req.otherState == 2">
                AND  inventory = 0
            </if>
            <if test="req.otherState != null and req.otherState ==3">
                AND  status = #{req.status}
            </if>
            AND del_flag = ${@com.ruoyi.common.core.enums.DelFlagEnum@NO.getCode()}
        </where>
        ORDER BY create_time DESC
ruoyi-service/ruoyi-payment/src/main/java/com/ruoyi/payment/controller/WxPayController.java
@@ -3,6 +3,7 @@
import com.fasterxml.jackson.core.type.TypeReference;
import com.ruoyi.common.core.domain.R;
import com.ruoyi.common.core.web.domain.AjaxResult;
import com.ruoyi.order.api.feignClient.ChargingOrderClient;
import com.ruoyi.order.api.feignClient.OrderClient;
import com.ruoyi.payment.api.vo.PaymentOrder;
import com.ruoyi.payment.api.vo.WxRefundNotifyResp;
@@ -37,6 +38,9 @@
    @Resource
    private OrderClient orderClient;
    @Resource
    private ChargingOrderClient chargingOrderClient;
@@ -121,6 +125,7 @@
            log.info("支付回调:{}", params);
            String outRefundNo = (String) params.get("transaction_id");
            String out_trade_no = params.get("out_trade_no").toString();
            String attach = params.get("attach").toString();
            String substring = out_trade_no.substring(0, 2);
            switch (substring){
                //购物订单
@@ -132,8 +137,12 @@
                    orderClient.vipCallBack(out_trade_no,outRefundNo);
                    System.err.println("----收到会员回调");
                    break;
                case "CD":
                    chargingOrderClient.chargingOrderWXCallback(out_trade_no, outRefundNo, attach);
                    System.err.println("----充电支付回调");
                    break;
            }
            wxV3Pay.ack();
            return R.ok(params);
        } catch (Exception e) {
            log.error("支付回调异常:{}", e, e);
@@ -180,6 +189,15 @@
            // 时间不对的话,可以调用  WxTimeUtils.toRfc3339Date(success_time)转换一下
            String success_time = params.get("success_time").toString();
            if (tradeState.equals(RefundEnum.SUCCESS.name())) {
                String substring = out_refund_no.substring(0, 3);
                switch (substring){
                    //购物订单
                    case "CDF":
                        chargingOrderClient.chargingOrderStartupFailureWxRefund(out_refund_no, refund_id, tradeState, success_time);
                        System.err.println("----充电启动失败退款回调通知");
                        break;
                }
                WxRefundNotifyResp resp = new WxRefundNotifyResp();
                resp.setOut_trade_no(out_trade_no);
                resp.setOut_refund_no(out_refund_no);