wenhongquan 1 年間 前
親
コミット
423856f13d
19 ファイル変更、601 行追加、32 行削除
  1. 12 3
      ruoyi-admin/src/main/java/org/dromara/web/controller/AuthController.java
  2. 1 0
      ruoyi-admin/src/main/java/org/dromara/web/util/WxPayProperties.java
  3. 3 0
      ruoyi-admin/src/main/resources/application.yml
  4. 10 1
      ruoyi-modules/ruoyi-dzbc/pom.xml
  5. 155 0
      ruoyi-modules/ruoyi-dzbc/src/main/java/org/dromara/system/controller/CommonController.java
  6. 105 2
      ruoyi-modules/ruoyi-dzbc/src/main/java/org/dromara/system/controller/TblDzbcOrderController.java
  7. 93 2
      ruoyi-modules/ruoyi-dzbc/src/main/java/org/dromara/system/controller/TblDzbcPathSchedulingController.java
  8. 4 1
      ruoyi-modules/ruoyi-dzbc/src/main/java/org/dromara/system/domain/TblDzbcOrder.java
  9. 2 5
      ruoyi-modules/ruoyi-dzbc/src/main/java/org/dromara/system/domain/TblDzbcPath.java
  10. 3 0
      ruoyi-modules/ruoyi-dzbc/src/main/java/org/dromara/system/domain/TblDzbcPathScheduling.java
  11. 4 0
      ruoyi-modules/ruoyi-dzbc/src/main/java/org/dromara/system/domain/bo/TblDzbcOrderBo.java
  12. 3 4
      ruoyi-modules/ruoyi-dzbc/src/main/java/org/dromara/system/domain/bo/TblDzbcPathBo.java
  13. 11 1
      ruoyi-modules/ruoyi-dzbc/src/main/java/org/dromara/system/domain/bo/TblDzbcPathSchedulingBo.java
  14. 5 0
      ruoyi-modules/ruoyi-dzbc/src/main/java/org/dromara/system/domain/vo/TblDzbcOrderVo.java
  15. 10 0
      ruoyi-modules/ruoyi-dzbc/src/main/java/org/dromara/system/domain/vo/TblDzbcPathSchedulingVo.java
  16. 2 5
      ruoyi-modules/ruoyi-dzbc/src/main/java/org/dromara/system/domain/vo/TblDzbcPathVo.java
  17. 85 2
      ruoyi-modules/ruoyi-dzbc/src/main/java/org/dromara/system/service/impl/TblDzbcOrderServiceImpl.java
  18. 93 5
      ruoyi-modules/ruoyi-dzbc/src/main/java/org/dromara/system/service/impl/TblDzbcPathSchedulingServiceImpl.java
  19. 0 1
      ruoyi-modules/ruoyi-dzbc/src/main/java/org/dromara/system/service/impl/TblDzbcPathServiceImpl.java

+ 12 - 3
ruoyi-admin/src/main/java/org/dromara/web/controller/AuthController.java

@@ -93,6 +93,10 @@ public class AuthController {
     private final ISysSocialService sysSocialService;
     private final ISysUserService sysUserService;
 
+    private final ISysRoleService roleService;
+
+
+
 
 
 
@@ -334,16 +338,20 @@ public class AuthController {
             userVo =  sysUserService.selectUserByUserName(phone.getPhoneNumber());
         }
 
+
+        //定制班车普通用户角色
+        Long roleId = 1889878542601625601L;
+
         try {
             SysUserBo bo = BeanUtil.toBean(userVo, SysUserBo.class);
             if (bo.getRoleIds() == null) {
-                bo.setRoleIds(new Long[]{1763484977044361217L});
+                bo.setRoleIds(new Long[]{roleId});
                 bo.setPassword(null);
                 bo.setUserType(null);
             } else {
                 List<Long> a = Arrays.stream(bo.getRoleIds()).toList();
-                if(!a.contains(1763484977044361217L)){
-                    a.add(1763484977044361217L);
+                if(!a.contains(roleId)){
+                    a.add(roleId);
                 }
                 bo.setPassword(null);
                 bo.setUserType(null);
@@ -359,6 +367,7 @@ public class AuthController {
         BeanUtil.copyProperties(authUserData.getToken(), bo);
         bo.setUserId(userVo.getUserId());
         bo.setAuthId(authId);
+        bo.setSource("WECHAT_MINI_PROGRAM_1");
         bo.setOpenId(authUserData.getUuid());
         bo.setUserName(authUserData.getUsername());
         bo.setNickName(authUserData.getNickname());

+ 1 - 0
ruoyi-admin/src/main/java/org/dromara/web/util/WxPayProperties.java

@@ -43,6 +43,7 @@ public class WxPayProperties {
          */
         private String keyPath;
 
+
         /**
          * apiV3 秘钥值
          * (V3商户模式需要)

+ 3 - 0
ruoyi-admin/src/main/resources/application.yml

@@ -274,6 +274,8 @@ forest:
   connect-timeout: 3000        # 连接超时时间,单位为毫秒
   read-timeout: 3000           # 数据读取超时时间,单位为毫秒
 
+baseUrl: https://khy.xiaole.vip/api
+
 wx:
   miniapp:
     configs:
@@ -291,3 +293,4 @@ wx:
     mchKey: FP1arPM22zIjZeQUniJO2vMEHxf4KjHh #微信支付商户密钥
     keyPath: apiclient_cert.p12 # p12证书的位置,可以指定绝对路径,也可以指定类路径(以classpath:开头)
 
+

+ 10 - 1
ruoyi-modules/ruoyi-dzbc/pom.xml

@@ -126,7 +126,16 @@
             <groupId>org.dromara</groupId>
             <artifactId>ruoyi-system</artifactId>
         </dependency>
-
+        <dependency>
+            <groupId>org.dromara</groupId>
+            <artifactId>ruoyi-khy</artifactId>
+        </dependency>
+        <dependency>
+            <groupId>com.github.binarywang</groupId>
+            <artifactId>weixin-java-pay</artifactId>
+            <version>4.6.7.B</version>
+            <scope>compile</scope>
+        </dependency>
 
 
     </dependencies>

+ 155 - 0
ruoyi-modules/ruoyi-dzbc/src/main/java/org/dromara/system/controller/CommonController.java

@@ -0,0 +1,155 @@
+package org.dromara.system.controller;
+
+import cn.dev33.satoken.annotation.SaIgnore;
+import cn.hutool.core.date.DateUtil;
+import cn.hutool.core.util.StrUtil;
+import cn.hutool.json.JSONArray;
+import cn.hutool.json.JSONObject;
+import cn.hutool.json.JSONUtil;
+import com.github.binarywang.wxpay.bean.notify.WxPayNotifyResponse;
+import com.github.binarywang.wxpay.bean.notify.WxPayOrderNotifyResult;
+import com.github.binarywang.wxpay.bean.notify.WxPayRefundNotifyResult;
+import com.github.binarywang.wxpay.service.WxPayService;
+import jakarta.servlet.http.HttpServletRequest;
+import jakarta.servlet.http.HttpServletResponse;
+import lombok.RequiredArgsConstructor;
+import lombok.extern.slf4j.Slf4j;
+import okhttp3.OkHttpClient;
+import org.apache.commons.io.IOUtils;
+import org.dromara.common.core.domain.R;
+import org.dromara.common.core.utils.SpringUtils;
+import org.dromara.common.log.annotation.Log;
+import org.dromara.common.log.enums.BusinessType;
+import org.dromara.common.mybatis.core.page.PageQuery;
+import org.dromara.common.mybatis.core.page.TableDataInfo;
+import org.dromara.common.redis.utils.CacheUtils;
+import org.dromara.common.redis.utils.RedisUtils;
+import org.dromara.system.domain.bo.SysDictDataBo;
+import org.dromara.system.domain.bo.TblDzbcBannerBo;
+import org.dromara.system.domain.bo.TblDzbcOrderBo;
+import org.dromara.system.domain.vo.SysDictDataVo;
+import org.dromara.system.domain.vo.TblDzbcBannerVo;
+import org.dromara.system.domain.vo.TblDzbcOrderVo;
+import org.dromara.system.service.ISysDictDataService;
+import org.dromara.system.service.ITblDzbcBannerService;
+import org.dromara.system.service.ITblDzbcOrderService;
+import org.dromara.util.CabinetUtil;
+import org.dromara.util.MessageUtils;
+import org.dromara.util.YingshiHttp;
+import org.springframework.beans.factory.annotation.Value;
+import org.springframework.validation.annotation.Validated;
+import org.springframework.web.bind.annotation.*;
+
+import java.time.Duration;
+import java.util.ArrayList;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+
+import static org.dromara.util.CabinetUtil.CABINET_BOXS;
+import static org.dromara.util.CabinetUtil.CABINET_INFO;
+
+@Validated
+@RequiredArgsConstructor
+@RestController
+@Slf4j
+@SaIgnore
+@RequestMapping("/common")
+public class CommonController extends TblBaseController {
+
+    private final ITblDzbcBannerService bannerService;
+
+    private final ITblDzbcOrderService orderService;
+    private final WxPayService wxPayService;
+
+
+
+    /**
+     * 小程序banner列表
+     */
+    @GetMapping("/list")
+    public R<Object> list(TblDzbcBannerBo bo) {
+        return R.ok(bannerService.queryList(bo));
+    }
+
+    @ResponseBody
+    @Log(title = "定制班车-订单微信支付回调", businessType = BusinessType.UPDATE)
+    @RequestMapping("/wx")
+    public String payNotify(HttpServletRequest request, HttpServletResponse response) {
+        try {
+            String xmlResult = IOUtils.toString(request.getInputStream(), request.getCharacterEncoding());
+            WxPayOrderNotifyResult result = wxPayService.parseOrderNotifyResult(xmlResult);
+
+            // 加入自己处理订单的业务逻辑,需要判断订单是否已经支付过,否则可能会重复调用
+            String orderId = result.getOutTradeNo();
+            String tradeNo = result.getTransactionId();
+
+            try{
+              TblDzbcOrderVo order = orderService.queryById(Long.parseLong(orderId));
+              if(order.getStatus().equals("0")){
+                  TblDzbcOrderBo order1 = new TblDzbcOrderBo();
+                  order1.setId(order.getId());
+                  order1.setStatus("1");
+                  order1.setExt2(JSONUtil.toJsonStr(result));
+                  orderService.updateByBo(order1);
+              }
+
+            } catch (Exception e) {
+
+            }
+
+
+//            String totalFee = BaseWxPayResult.fenToYuan(result.getTotalFee());
+            return WxPayNotifyResponse.success("处理成功!");
+        } catch (Exception e) {
+            log.error("微信回调结果异常,异常原因{}", e.getMessage());
+            return WxPayNotifyResponse.fail(e.getMessage());
+        }
+    }
+
+
+    @ResponseBody
+    @Log(title = "定制班车-订单微信退款回调", businessType = BusinessType.UPDATE)
+    @RequestMapping("/wx/ref")
+    public String payNotifyRef(HttpServletRequest request, HttpServletResponse response) {
+        try {
+            String xmlResult = IOUtils.toString(request.getInputStream(), request.getCharacterEncoding());
+            WxPayRefundNotifyResult result = wxPayService.parseRefundNotifyResult(xmlResult);
+            if(result.getAppid()!=null){
+                String orderId = result.getReqInfo().getOutTradeNo();
+
+                try{
+                    TblDzbcOrderVo order = orderService.queryById(Long.parseLong(orderId));
+                    if(order.getStatus().equals("2")){
+                        TblDzbcOrderBo order1 = new TblDzbcOrderBo();
+                        order1.setId(order.getId());
+                        order1.setStatus("4");
+                        orderService.updateByBo(order1);
+
+
+                        order1 = new TblDzbcOrderBo();
+                        order1.setId(order.getId());
+                        order1.setStatus("5");
+                        orderService.updateByBo(order1);
+                    }
+                } catch (Exception e) {
+
+                }
+            }
+
+
+
+
+//            String totalFee = BaseWxPayResult.fenToYuan(result.getTotalFee());
+            return WxPayNotifyResponse.success("处理成功!");
+        } catch (Exception e) {
+            log.error("微信回调结果异常,异常原因{}", e.getMessage());
+            return WxPayNotifyResponse.fail(e.getMessage());
+        }
+    }
+
+
+
+
+
+}

+ 105 - 2
ruoyi-modules/ruoyi-dzbc/src/main/java/org/dromara/system/controller/TblDzbcOrderController.java

@@ -1,11 +1,25 @@
 package org.dromara.system.controller;
 
+import java.util.Date;
 import java.util.List;
-
+import java.util.concurrent.atomic.AtomicReference;
+
+import cn.hutool.core.date.DateUtil;
+import cn.hutool.json.JSONObject;
+import cn.hutool.json.JSONUtil;
+import com.github.binarywang.wxpay.bean.request.WxPayRefundQueryRequest;
+import com.github.binarywang.wxpay.bean.request.WxPayRefundRequest;
+import com.github.binarywang.wxpay.bean.request.WxPayUnifiedOrderRequest;
+import com.github.binarywang.wxpay.bean.result.WxPayRefundQueryResult;
+import com.github.binarywang.wxpay.service.WxPayService;
 import lombok.RequiredArgsConstructor;
 import jakarta.servlet.http.HttpServletResponse;
 import jakarta.validation.constraints.*;
-import cn.dev33.satoken.annotation.SaCheckPermission;
+import lombok.extern.slf4j.Slf4j;
+import org.dromara.common.satoken.utils.LoginHelper;
+import org.dromara.system.domain.vo.SysSocialVo;
+import org.dromara.system.service.ISysSocialService;
+import org.springframework.beans.factory.annotation.Value;
 import org.springframework.web.bind.annotation.*;
 import org.springframework.validation.annotation.Validated;
 import org.dromara.common.idempotent.annotation.RepeatSubmit;
@@ -31,11 +45,19 @@ import org.dromara.common.mybatis.core.page.TableDataInfo;
 @Validated
 @RequiredArgsConstructor
 @RestController
+@Slf4j
 @RequestMapping("/system/dzbcOrder")
 public class TblDzbcOrderController extends BaseController {
 
     private final ITblDzbcOrderService tblDzbcOrderService;
 
+    private final ISysSocialService sysSocialService;
+
+    private final WxPayService wxPayService;
+
+    @Value("${baseUrl}")
+    String baseUrl;
+
     /**
      * 查询定制班车-订单列表
      */
@@ -102,4 +124,85 @@ public class TblDzbcOrderController extends BaseController {
                           @PathVariable Long[] ids) {
         return toAjax(tblDzbcOrderService.deleteWithValidByIds(List.of(ids), true));
     }
+
+    @Log(title = "定制班车-订单", businessType = BusinessType.INSERT)
+    @RepeatSubmit()
+    @GetMapping("/pay/wx/{id}")
+    public R<Void> getOrderWxPay(@PathVariable Long id) {
+        TblDzbcOrderVo tblDzbcOrderVo = tblDzbcOrderService.queryById(id);
+        if (tblDzbcOrderVo == null) return R.fail("该订单不存在");
+        if (tblDzbcOrderVo.getStatus().equals("0")) {
+            try {
+                WxPayUnifiedOrderRequest orderRequest = new WxPayUnifiedOrderRequest();
+                orderRequest.setBody("定制班车车票");
+                orderRequest.setOutTradeNo(tblDzbcOrderVo.getId().toString());
+                orderRequest.setTotalFee(tblDzbcOrderVo.getTotalPrice());
+                orderRequest.setTradeType("JSAPI");
+                orderRequest.setGoodsTag(tblDzbcOrderVo.getName());
+                orderRequest.setNotifyUrl(baseUrl + "/common/wx");
+                List<SysSocialVo> sysSocials = sysSocialService.queryListByUserId(LoginHelper.getUserId());
+                AtomicReference<SysSocialVo> sysSocialVo1 = new AtomicReference<>();
+                sysSocials.forEach(sysSocialVo -> {
+                    if (sysSocialVo.getSource().equals("WECHAT_MINI_PROGRAM_1")) {
+                        sysSocialVo1.set(sysSocialVo);
+                    }
+                });
+                if (sysSocialVo1.get() == null) {
+                    return R.fail("该用户未绑定微信小程序");
+                }
+                orderRequest.setOpenid(sysSocialVo1.get().getOpenId());
+                orderRequest.setSpbillCreateIp("127.0.0.1");
+                orderRequest.setTimeStart(DateUtil.format(new Date(), "yyyyMMddHHmmss"));
+                orderRequest.setTimeExpire(DateUtil.format(DateUtil.offsetMinute(new Date(), 30), "yyyyMMddHHmmss"));
+
+                return R.ok(wxPayService.createOrder(orderRequest));
+
+            } catch (Exception w) {
+                log.error("微信支付异常,异常原因{}", w.getMessage());
+            }
+            return R.fail("该订单无法支付");
+
+
+        } else {
+            return R.fail("该订单无法支付");
+        }
+
+    }
+
+
+    @Log(title = "定制班车-订单", businessType = BusinessType.UPDATE)
+    @RepeatSubmit()
+    @GetMapping("/cancel/{id}")
+    public R<Void> cancelOrder(@PathVariable Long id) {
+        TblDzbcOrderVo tblDzbcOrderVo = tblDzbcOrderService.queryById(id);
+        if (tblDzbcOrderVo == null) return R.fail("该订单不存在");
+        if (tblDzbcOrderVo.getStatus().equals("1")) {
+            try {
+                JSONObject wxtrade = JSONUtil.parseObj(tblDzbcOrderVo.getExt2());
+                WxPayRefundRequest refundRequest = new WxPayRefundRequest();
+                refundRequest.setTotalFee(tblDzbcOrderVo.getTotalPrice());
+                refundRequest.setRefundFee(tblDzbcOrderVo.getTotalPrice());
+                refundRequest.setOutRefundNo(wxtrade.getStr("transactionId"));
+                refundRequest.setNotifyUrl(baseUrl + "/common/wxref");
+                wxPayService.refund(refundRequest);
+
+
+                TblDzbcOrderBo order1 = new TblDzbcOrderBo();
+                order1.setId(tblDzbcOrderVo.getId());
+                order1.setStatus("2");
+                tblDzbcOrderService.updateByBo(order1);
+                return R.ok("成功");
+            }catch (Exception e){}
+            return R.fail("该订单无法取消");
+        }else if(tblDzbcOrderVo.getStatus().equals("0")){
+            TblDzbcOrderBo order1 = new TblDzbcOrderBo();
+            order1.setId(tblDzbcOrderVo.getId());
+            order1.setStatus("5");
+            tblDzbcOrderService.updateByBo(order1);
+            return R.ok("成功");
+        } else{
+            return R.fail("该订单无法取消");
+        }
+
+    }
 }

+ 93 - 2
ruoyi-modules/ruoyi-dzbc/src/main/java/org/dromara/system/controller/TblDzbcPathSchedulingController.java

@@ -1,11 +1,19 @@
 package org.dromara.system.controller;
 
-import java.util.List;
+import java.util.*;
+import java.util.concurrent.atomic.AtomicInteger;
+import java.util.stream.Collectors;
 
+import cn.hutool.core.date.DateField;
+import cn.hutool.core.date.DateUtil;
+import cn.hutool.core.util.StrUtil;
+import cn.hutool.json.JSONObject;
+import cn.hutool.json.JSONUtil;
 import lombok.RequiredArgsConstructor;
 import jakarta.servlet.http.HttpServletResponse;
 import jakarta.validation.constraints.*;
-import cn.dev33.satoken.annotation.SaCheckPermission;
+import org.dromara.common.redis.utils.RedisUtils;
+import org.springframework.util.Assert;
 import org.springframework.web.bind.annotation.*;
 import org.springframework.validation.annotation.Validated;
 import org.dromara.common.idempotent.annotation.RepeatSubmit;
@@ -102,4 +110,87 @@ public class TblDzbcPathSchedulingController extends BaseController {
                           @PathVariable Long[] ids) {
         return toAjax(tblDzbcPathSchedulingService.deleteWithValidByIds(List.of(ids), true));
     }
+
+
+    @Log(title = "定制班车-路线排班", businessType = BusinessType.DELETE)
+    @GetMapping("/getCarTickets")
+    public R<Object> getCarTickets(@RequestParam(required = true) String searchDate,@RequestParam(required = true) Long fromareaId,@RequestParam(required = true) Long toareaId) {
+        //优先从缓存中获取车量信息  缓存没有则初始化缓存
+        Date date = new Date();
+        try{
+            date =  DateUtil.parseDate(searchDate);
+        }catch (Exception e){
+            return R.fail("日期格式不正确 eg:2025-02-01");
+        }
+
+
+        Collection ret = RedisUtils.keys("dzbc_path_scheduling");
+        if (ret == null||ret.size()<1) {
+            TblDzbcPathSchedulingBo bo = new TblDzbcPathSchedulingBo();
+            bo.getParams().put("mdate", DateUtil.today());
+            List<TblDzbcPathSchedulingVo> allTblDzbcPathScheduling = tblDzbcPathSchedulingService.queryList(bo);
+            for (TblDzbcPathSchedulingVo tblDzbcPathSchedulingVo : allTblDzbcPathScheduling) {
+               Map<String, TblDzbcPathSchedulingVo> dataMap =  RedisUtils.getCacheMap(StrUtil.format("dzbc_path_scheduling|{}", DateUtil.formatDate(tblDzbcPathSchedulingVo.getMdate())));
+               if(dataMap == null||dataMap.size()<1) dataMap =new HashMap<>();
+                dataMap.put(tblDzbcPathSchedulingVo.getId().toString(), tblDzbcPathSchedulingVo);
+                RedisUtils.setCacheMap(StrUtil.format("dzbc_path_scheduling|{}", DateUtil.formatDate(tblDzbcPathSchedulingVo.getMdate())), dataMap);
+                RedisUtils.expire(StrUtil.format("dzbc_path_scheduling|{}", DateUtil.formatDate(tblDzbcPathSchedulingVo.getMdate())), DateUtil.offset(tblDzbcPathSchedulingVo.getMdate(), DateField.HOUR_OF_DAY, 24).getTime() - DateUtil.current());
+            }
+        }
+        Map<String, TblDzbcPathSchedulingVo> dataMap = RedisUtils.getCacheMap(StrUtil.format("dzbc_path_scheduling|{}", DateUtil.formatDate(date)));
+        //先获取
+        if(dataMap == null||dataMap.size()<1){
+            return  R.fail("没有排班信息");
+        }else{
+            List<TblDzbcPathSchedulingVo> carTickets = dataMap.values().stream().filter(item -> {
+                if(item.getExt1()!=null){
+                   JSONObject dataObject = JSONUtil.parseObj(item.getExt1()).getJSONObject("pathInfo");
+                   if(dataObject.getLong("startArea").equals(fromareaId) && dataObject.getLong("endArea").equals(toareaId)){
+                       return true;
+                   }
+                }
+                return false;
+            }).collect(Collectors.toList());
+
+            if(carTickets.size()<1){return  R.fail("没有排班信息");}
+            //计算余票
+            for (TblDzbcPathSchedulingVo carTicket : carTickets) {
+                //先计算车辆座位数
+                if(carTicket.getExt1() != null){
+                    try {
+                        JSONObject data = JSONUtil.parseObj(carTicket.getExt1());
+                        JSONObject carInfo = data.getJSONObject("carInfo");
+                        Integer zw =  carInfo.getInt("carZw");
+                        carTicket.setTicket(zw);
+                    }
+                    catch (Exception e){
+                        carTicket.setTicket(0);
+                    }
+                }else{
+                    carTicket.setTicket(0);
+                }
+
+                if(carTicket.getExt2() != null){
+                    //获取已售车票
+                    //{
+                    //   orderid:{ zw:2,userinfos:[user1,{lx:'成人','name':'张三','cardNo':'1234567890','cardType':'身份证'}]  }
+                    // }
+                    try {
+                        AtomicInteger salszw = new AtomicInteger();
+                        JSONObject data = JSONUtil.parseObj(carTicket.getExt2());
+                        List<String> orderids =  data.keySet().stream().collect(Collectors.toList());
+                        data.keySet().stream().forEach( orderid -> {
+                            JSONObject order = data.getJSONObject(orderid);
+                            salszw.addAndGet(order.getInt("zw"));
+                        } );
+                        carTicket.setTicket(carTicket.getTicket() - salszw.get());
+                    }
+                    catch (Exception e){
+                        carTicket.setTicket(0);
+                    }
+                }
+            }
+            return R.ok(carTickets);
+        }
+    }
 }

+ 4 - 1
ruoyi-modules/ruoyi-dzbc/src/main/java/org/dromara/system/domain/TblDzbcOrder.java

@@ -43,7 +43,7 @@ public class TblDzbcOrder extends BaseEntity {
     private Long schedulingId;
 
     /**
-     * 状态 
+     * 状态
 0-待支付
 1-已支付
 2-取消待退款
@@ -79,5 +79,8 @@ public class TblDzbcOrder extends BaseEntity {
      */
     private String ext2;
 
+    private Integer num;
+    private Integer price;
+    private Integer totalPrice;
 
 }

+ 2 - 5
ruoyi-modules/ruoyi-dzbc/src/main/java/org/dromara/system/domain/TblDzbcPath.java

@@ -48,11 +48,6 @@ public class TblDzbcPath extends BaseEntity {
     private String mtime;
 
     /**
-     * 价格浮动比例
-     */
-    private Long pprice;
-
-    /**
      * 备注
      */
     private String remark;
@@ -67,5 +62,7 @@ public class TblDzbcPath extends BaseEntity {
      */
     private String ext2;
 
+    private Integer price;
+
 
 }

+ 3 - 0
ruoyi-modules/ruoyi-dzbc/src/main/java/org/dromara/system/domain/TblDzbcPathScheduling.java

@@ -75,4 +75,7 @@ public class TblDzbcPathScheduling extends BaseEntity {
     private String ext2;
 
 
+    private Integer  pprice;
+
+
 }

+ 4 - 0
ruoyi-modules/ruoyi-dzbc/src/main/java/org/dromara/system/domain/bo/TblDzbcOrderBo.java

@@ -88,5 +88,9 @@ public class TblDzbcOrderBo extends BaseEntity {
     //@NotBlank(message = "扩展2不能为空", groups = { AddGroup.class, EditGroup.class })
     private String ext2;
 
+    private Integer num;
+    private Integer price;
+    private Integer totalPrice;
+
 
 }

+ 3 - 4
ruoyi-modules/ruoyi-dzbc/src/main/java/org/dromara/system/domain/bo/TblDzbcPathBo.java

@@ -50,11 +50,8 @@ public class TblDzbcPathBo extends BaseEntity {
     //@NotBlank(message = "开始时间不能为空", groups = { AddGroup.class, EditGroup.class })
     private String mtime;
 
-    /**
-     * 价格浮动比例
-     */
     //@NotNull(message = "价格浮动比例不能为空", groups = { AddGroup.class, EditGroup.class })
-    private Long pprice;
+
 
     /**
      * 备注
@@ -74,5 +71,7 @@ public class TblDzbcPathBo extends BaseEntity {
     //@NotBlank(message = "扩展2不能为空", groups = { AddGroup.class, EditGroup.class })
     private String ext2;
 
+    private Integer price;
+
 
 }

+ 11 - 1
ruoyi-modules/ruoyi-dzbc/src/main/java/org/dromara/system/domain/bo/TblDzbcPathSchedulingBo.java

@@ -1,5 +1,6 @@
 package org.dromara.system.domain.bo;
 
+import com.fasterxml.jackson.annotation.JsonFormat;
 import org.dromara.system.domain.TblDzbcPathScheduling;
 import org.dromara.common.mybatis.core.domain.BaseEntity;
 import org.dromara.common.core.validate.AddGroup;
@@ -9,7 +10,7 @@ import lombok.Data;
 import lombok.EqualsAndHashCode;
 import jakarta.validation.constraints.*;
 import java.util.Date;
-import com.fasterxml.jackson.annotation.JsonFormat;
+import org.springframework.format.annotation.DateTimeFormat;
 
 /**
  * 定制班车-路线排班业务对象 tbl_dzbc_path_scheduling
@@ -44,6 +45,8 @@ public class TblDzbcPathSchedulingBo extends BaseEntity {
      * 排班日期
      */
     //@NotNull(message = "排班日期不能为空", groups = { AddGroup.class, EditGroup.class })
+    @JsonFormat(pattern = "yyyy-MM-dd")
+    @DateTimeFormat(pattern = "yyyy-MM-dd")
     private Date mdate;
 
     /**
@@ -82,5 +85,12 @@ public class TblDzbcPathSchedulingBo extends BaseEntity {
     //@NotBlank(message = "扩展2不能为空", groups = { AddGroup.class, EditGroup.class })
     private String ext2;
 
+    /**
+     * 是否自动排班
+     */
+    private Integer isauto;
+
+    private Integer  pprice;
+
 
 }

+ 5 - 0
ruoyi-modules/ruoyi-dzbc/src/main/java/org/dromara/system/domain/vo/TblDzbcOrderVo.java

@@ -89,4 +89,9 @@ public class TblDzbcOrderVo implements Serializable {
     private String ext2;
 
 
+    private Integer num;
+    private Integer price;
+    private Integer totalPrice;
+
+
 }

+ 10 - 0
ruoyi-modules/ruoyi-dzbc/src/main/java/org/dromara/system/domain/vo/TblDzbcPathSchedulingVo.java

@@ -91,4 +91,14 @@ public class TblDzbcPathSchedulingVo implements Serializable {
     private String ext2;
 
 
+    @ExcelProperty(value = "是否自动排班")
+    private Integer isauto;
+
+
+    //余票
+    private Integer ticket;
+
+    private Integer  pprice;
+
+
 }

+ 2 - 5
ruoyi-modules/ruoyi-dzbc/src/main/java/org/dromara/system/domain/vo/TblDzbcPathVo.java

@@ -58,11 +58,6 @@ public class TblDzbcPathVo implements Serializable {
     @ExcelProperty(value = "开始时间")
     private String mtime;
 
-    /**
-     * 价格浮动比例
-     */
-    @ExcelProperty(value = "价格浮动比例")
-    private Long pprice;
 
     /**
      * 备注
@@ -82,5 +77,7 @@ public class TblDzbcPathVo implements Serializable {
     @ExcelProperty(value = "扩展2")
     private String ext2;
 
+    private Integer price;
+
 
 }

+ 85 - 2
ruoyi-modules/ruoyi-dzbc/src/main/java/org/dromara/system/service/impl/TblDzbcOrderServiceImpl.java

@@ -1,5 +1,10 @@
 package org.dromara.system.service.impl;
 
+import cn.hutool.core.date.DateUtil;
+import cn.hutool.json.JSONUtil;
+import com.github.binarywang.wxpay.bean.request.BaseWxPayRequest;
+import com.github.binarywang.wxpay.bean.request.WxPayUnifiedOrderRequest;
+import com.github.binarywang.wxpay.service.WxPayService;
 import org.dromara.common.core.utils.MapstructUtils;
 import org.dromara.common.core.utils.StringUtils;
 import org.dromara.common.mybatis.core.page.TableDataInfo;
@@ -8,12 +13,18 @@ import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
 import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
 import com.baomidou.mybatisplus.core.toolkit.Wrappers;
 import lombok.RequiredArgsConstructor;
+import org.dromara.common.satoken.utils.LoginHelper;
+import org.dromara.system.domain.TblDzbcOrderLog;
+import org.dromara.system.domain.TblDzbcSite;
+import org.dromara.system.domain.bo.TblDzbcOrderLogBo;
+import org.dromara.system.domain.vo.*;
+import org.dromara.system.mapper.*;
+import org.dromara.util.DistanceCalculator;
 import org.springframework.stereotype.Service;
 import org.dromara.system.domain.bo.TblDzbcOrderBo;
-import org.dromara.system.domain.vo.TblDzbcOrderVo;
 import org.dromara.system.domain.TblDzbcOrder;
-import org.dromara.system.mapper.TblDzbcOrderMapper;
 import org.dromara.system.service.ITblDzbcOrderService;
+import org.springframework.util.Assert;
 
 import java.util.List;
 import java.util.Map;
@@ -30,6 +41,15 @@ import java.util.Collection;
 public class TblDzbcOrderServiceImpl implements ITblDzbcOrderService {
 
     private final TblDzbcOrderMapper baseMapper;
+    private final TblDzbcSiteMapper siteMapper;
+    private final TblDzbcOrderLogMapper orderLogMapper;
+    private final SysConfigMapper sysConfigMapper;
+    private final TblDzbcAreaMapper areaMapper;
+    private final TblDzbcPathSchedulingMapper pathSchedulingMapper;
+    private final TblDzbcPathMapper pathMapper;
+
+
+
 
     /**
      * 查询定制班车-订单
@@ -79,9 +99,59 @@ public class TblDzbcOrderServiceImpl implements ITblDzbcOrderService {
     public Boolean insertByBo(TblDzbcOrderBo bo) {
         TblDzbcOrder add = MapstructUtils.convert(bo, TblDzbcOrder.class);
         validEntityBeforeSave(add);
+        Assert.isTrue(bo.getSchedulingId()!=null,"缺少路线班次");
+        TblDzbcPathSchedulingVo scheduling = pathSchedulingMapper.selectVoById(bo.getSchedulingId());
+        TblDzbcPathVo pathVo = pathMapper.selectVoById(scheduling.getPathId());
+        //Ext1  { zw:2,usersInfos:[user1,{lx:'成人','name':'张三','cardNo':'1234567890','cardType':'身份证'}]  }
+        Assert.isTrue(scheduling!=null,"路线排班不存在");
+        Assert.isTrue(pathVo!=null,"路线不存在");
+        Assert.isTrue(bo.getNum()!=null,"缺少座位数");
+//        Assert.isTrue(bo.getParams().get("usersInfo")!=null,"缺少订购人员");
+        if(bo.getParams().get("usersInfo")==null){
+            bo.getParams().put("usersInfo",new Object[]{});
+        }
+
+        Assert.isTrue(bo.getParams().get("startSiteId")!=null,"缺少出发站点");
+        Assert.isTrue(bo.getParams().get("endSiteId")!=null,"缺少目的站点");
+        //查询起点  //查询终点
+        TblDzbcSiteVo startSite = siteMapper.selectVoById(Long.parseLong(bo.getParams().get("startSiteId").toString()));
+        TblDzbcSiteVo endSite =  siteMapper.selectVoById(Long.parseLong(bo.getParams().get("endSiteId").toString()));
+        Assert.isTrue(startSite!=null&&endSite!=null,"站点Id不存在");
+        Assert.isTrue(!startSite.getAreaId().equals(endSite.getAreaId()),"站点不在能在同一区域");
+        //查询起点区域到目前区域的距离
+        List<TblDzbcAreaVo> areas = areaMapper.selectVoBatchIds(List.of(startSite.getAreaId(),endSite.getAreaId()), TblDzbcAreaVo.class);
+        Assert.isTrue(areas.size()==2,"站点信息错误");
+        double distanceArea = DistanceCalculator.calculateDistance(areas.get(0).getLocation(),areas.get(1).getLocation());
+        double distanceSite = DistanceCalculator.calculateDistance(startSite.getLocation(),endSite.getLocation());
+        Assert.isTrue(pathVo.getPrice()!=null,"路线价格未设置");
+        //单价 根据区域-区域 单价及站点-站点 计算价格
+        double price = pathVo.getPrice()*(distanceSite/distanceArea);
+        //计算加价
+        add.setPrice((int)Math.round(price+scheduling.getPprice()));
+
+        add.setStartInfo(JSONUtil.toJsonStr(Map.of("areaInfo", areas.get(0), "siteInfo", startSite)));
+        add.setEndInfo(JSONUtil.toJsonStr(Map.of("areaInfo", areas.get(1), "siteInfo", endSite)));
+
+        add.setUserId(LoginHelper.getUserId());
+
+        add.setName(DateUtil.formatDate(scheduling.getMdate())+" "+pathVo.getName()+" "+scheduling.getMtime());
+        //计算总价
+        add.setTotalPrice(add.getNum()*add.getPrice());
+
+        bo.getParams().put("zw",add.getNum());
+        add.setExt1(JSONUtil.toJsonStr(bo.getParams()));
+
         boolean flag = baseMapper.insert(add) > 0;
         if (flag) {
             bo.setId(add.getId());
+            try {
+                TblDzbcOrderLog orderLogBo = new TblDzbcOrderLog();
+                orderLogBo.setOrderId(bo.getId());
+                orderLogBo.setExt1(JSONUtil.toJsonStr(bo));
+                orderLogMapper.insert(orderLogBo);
+            } catch (Exception e) {
+
+            }
         }
         return flag;
     }
@@ -93,9 +163,22 @@ public class TblDzbcOrderServiceImpl implements ITblDzbcOrderService {
     public Boolean updateByBo(TblDzbcOrderBo bo) {
         TblDzbcOrder update = MapstructUtils.convert(bo, TblDzbcOrder.class);
         validEntityBeforeSave(update);
+
+        try {
+            TblDzbcOrderLog orderLogBo = new TblDzbcOrderLog();
+            orderLogBo.setOrderId(bo.getId());
+            orderLogBo.setExt1(JSONUtil.toJsonStr(update));
+            orderLogMapper.insert(orderLogBo);
+        } catch (Exception e) {
+
+        }
+
+
         return baseMapper.updateById(update) > 0;
     }
 
+
+
     /**
      * 保存前的数据校验
      */

+ 93 - 5
ruoyi-modules/ruoyi-dzbc/src/main/java/org/dromara/system/service/impl/TblDzbcPathSchedulingServiceImpl.java

@@ -1,5 +1,10 @@
 package org.dromara.system.service.impl;
 
+import cn.hutool.core.date.DateField;
+import cn.hutool.core.date.DateTime;
+import cn.hutool.core.date.DateUtil;
+import cn.hutool.core.util.StrUtil;
+import cn.hutool.json.JSONUtil;
 import org.dromara.common.core.utils.MapstructUtils;
 import org.dromara.common.core.utils.StringUtils;
 import org.dromara.common.mybatis.core.page.TableDataInfo;
@@ -8,6 +13,13 @@ import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
 import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
 import com.baomidou.mybatisplus.core.toolkit.Wrappers;
 import lombok.RequiredArgsConstructor;
+import org.dromara.common.redis.utils.CacheUtils;
+import org.dromara.common.redis.utils.RedisUtils;
+import org.dromara.system.domain.TblDzbcPath;
+import org.dromara.system.domain.vo.TblDzbcCarVo;
+import org.dromara.system.domain.vo.TblDzbcPathVo;
+import org.dromara.system.mapper.TblDzbcCarMapper;
+import org.dromara.system.mapper.TblDzbcPathMapper;
 import org.springframework.stereotype.Service;
 import org.dromara.system.domain.bo.TblDzbcPathSchedulingBo;
 import org.dromara.system.domain.vo.TblDzbcPathSchedulingVo;
@@ -15,9 +27,8 @@ import org.dromara.system.domain.TblDzbcPathScheduling;
 import org.dromara.system.mapper.TblDzbcPathSchedulingMapper;
 import org.dromara.system.service.ITblDzbcPathSchedulingService;
 
-import java.util.List;
-import java.util.Map;
-import java.util.Collection;
+import java.time.Duration;
+import java.util.*;
 
 /**
  * 定制班车-路线排班Service业务层处理
@@ -31,6 +42,9 @@ public class TblDzbcPathSchedulingServiceImpl implements ITblDzbcPathSchedulingS
 
     private final TblDzbcPathSchedulingMapper baseMapper;
 
+    private final TblDzbcCarMapper carMapper;
+    private final TblDzbcPathMapper pathMapper;
+
     /**
      * 查询定制班车-路线排班
      */
@@ -69,6 +83,11 @@ public class TblDzbcPathSchedulingServiceImpl implements ITblDzbcPathSchedulingS
         lqw.eq(StringUtils.isNotBlank(bo.getEndSites()), TblDzbcPathScheduling::getEndSites, bo.getEndSites());
         lqw.eq(StringUtils.isNotBlank(bo.getExt1()), TblDzbcPathScheduling::getExt1, bo.getExt1());
         lqw.eq(StringUtils.isNotBlank(bo.getExt2()), TblDzbcPathScheduling::getExt2, bo.getExt2());
+        if(params!=null){
+            if(params.containsKey("mdate")){
+                lqw.ge(params.get("mdate")!=null, TblDzbcPathScheduling::getMdate, (params.get("mdate").toString()));
+            }
+        }
         return lqw;
     }
 
@@ -78,10 +97,28 @@ public class TblDzbcPathSchedulingServiceImpl implements ITblDzbcPathSchedulingS
     @Override
     public Boolean insertByBo(TblDzbcPathSchedulingBo bo) {
         TblDzbcPathScheduling add = MapstructUtils.convert(bo, TblDzbcPathScheduling.class);
+        //添加车辆信息
+        Map<String, Object> params = bo.getParams();
+        if(add.getCarId()!=null){
+           TblDzbcCarVo carVo =  carMapper.selectVoById(bo.getCarId());
+           if(carVo == null){
+               throw new RuntimeException("车辆不存在");
+           }
+            params.put("carInfo",carVo);
+        }
+        if(add.getPathId()!=null){
+            TblDzbcPathVo pathVo =  pathMapper.selectVoById(bo.getPathId());
+            if(pathVo == null){
+                throw new RuntimeException("路线不存在");
+            }
+            params.put("pathInfo",pathVo);
+        }
+        add.setExt1(JSONUtil.toJsonStr(params));
         validEntityBeforeSave(add);
         boolean flag = baseMapper.insert(add) > 0;
         if (flag) {
             bo.setId(add.getId());
+            SysCache(add.getId(),null);
         }
         return flag;
     }
@@ -93,9 +130,56 @@ public class TblDzbcPathSchedulingServiceImpl implements ITblDzbcPathSchedulingS
     public Boolean updateByBo(TblDzbcPathSchedulingBo bo) {
         TblDzbcPathScheduling update = MapstructUtils.convert(bo, TblDzbcPathScheduling.class);
         validEntityBeforeSave(update);
-        return baseMapper.updateById(update) > 0;
+        int c = baseMapper.updateById(update) ;
+        if(c>0){
+            SysCache(bo.getId(),null);
+        }
+        return c> 0;
     }
 
+
+    private void SysCache(Long id, Collection<Long> ids) {
+        try {
+
+            if(ids!=null){
+                List<String> keys = RedisUtils.keys("dzbc_path_scheduling").stream().toList();
+                for (String key : keys) {
+                    Map<String,TblDzbcPathSchedulingVo> boMap = RedisUtils.getCacheMap(key.toString());
+                    if(boMap == null){
+                        boMap = new HashMap<>();
+                    }
+                    for (Long id1 : ids) {
+                        boMap.remove(id1.toString());
+                    }
+                    RedisUtils.setCacheMap(key.toString(),boMap);
+                    String date = key.split("\\|")[1];
+                    long datetime = DateUtil.parseDate(date).getTime();
+                    long currentdatetime = DateUtil.parseDate(DateUtil.today()).getTime();
+                    if(datetime<currentdatetime){
+                        RedisUtils.deleteObject(key.toString());
+                    }
+                    RedisUtils.expire(key.toString(),DateUtil.parseDate(date).offset(DateField.HOUR_OF_DAY,24).getTime()-DateUtil.current() );
+                }
+            }else{
+                TblDzbcPathSchedulingVo bo = baseMapper.selectVoById(id);
+                if(bo == null||bo.getMdate()==null) return;
+                {
+                    Map<String, TblDzbcPathSchedulingVo> boMap = RedisUtils.getCacheMap(StrUtil.format("dzbc_path_scheduling|{}", DateUtil.formatDate(bo.getMdate())));
+                    if (boMap == null||boMap.size() <1) {
+                        boMap = new HashMap<>();
+                    }
+
+                    boMap.put(id.toString(), bo);
+                    RedisUtils.setCacheMap(StrUtil.format("dzbc_path_scheduling|{}", DateUtil.formatDate(bo.getMdate())), boMap);
+                    RedisUtils.expire(StrUtil.format("dzbc_path_scheduling|{}", DateUtil.formatDate(bo.getMdate())), DateUtil.offset(bo.getMdate(), DateField.HOUR_OF_DAY, 24).getTime() - DateUtil.current());
+                }
+            }
+        }catch (Exception e){}
+
+
+    }
+
+
     /**
      * 保存前的数据校验
      */
@@ -111,6 +195,10 @@ public class TblDzbcPathSchedulingServiceImpl implements ITblDzbcPathSchedulingS
         if(isValid){
             //TODO 做一些业务上的校验,判断是否需要校验
         }
-        return baseMapper.deleteBatchIds(ids) > 0;
+        int c =  baseMapper.deleteBatchIds(ids) ;
+        if(c>0){
+            SysCache(null,ids);
+        }
+        return c>0;
     }
 }

+ 0 - 1
ruoyi-modules/ruoyi-dzbc/src/main/java/org/dromara/system/service/impl/TblDzbcPathServiceImpl.java

@@ -65,7 +65,6 @@ public class TblDzbcPathServiceImpl implements ITblDzbcPathService {
         lqw.eq(bo.getStartArea() != null, TblDzbcPath::getStartArea, bo.getStartArea());
         lqw.eq(bo.getEndArea() != null, TblDzbcPath::getEndArea, bo.getEndArea());
         lqw.eq(StringUtils.isNotBlank(bo.getMtime()), TblDzbcPath::getMtime, bo.getMtime());
-        lqw.eq(bo.getPprice() != null, TblDzbcPath::getPprice, bo.getPprice());
         lqw.eq(StringUtils.isNotBlank(bo.getExt1()), TblDzbcPath::getExt1, bo.getExt1());
         lqw.eq(StringUtils.isNotBlank(bo.getExt2()), TblDzbcPath::getExt2, bo.getExt2());
         return lqw;