Browse Source

`取消订单 退款60m-全款 <60m退一半`

wenhongquan 1 year ago
parent
commit
4dcd21d202

+ 21 - 3
ruoyi-admin/src/test/java/org/dromara/test/TagUnitTest.java

@@ -1,5 +1,7 @@
 package org.dromara.test;
 
+import cn.hutool.core.date.DateUtil;
+import cn.hutool.json.JSONUtil;
 import org.junit.jupiter.api.*;
 import org.springframework.boot.test.context.SpringBootTest;
 
@@ -12,13 +14,29 @@ import org.springframework.boot.test.context.SpringBootTest;
 @DisplayName("标签单元测试案例")
 public class TagUnitTest {
 
-    @Tag("dev")
-    @DisplayName("测试 @Tag dev")
+
     @Test
     public void testTagDev() {
-        System.out.println("dev");
+//        1742313600000
+
+        String cc = "{\n" +
+            "    \"schedulInfo\": {\n" +
+            "        \"id\": 1893197671453421570,\n" +
+            "        \"ext1\": \"{\\\"carInfo\\\": {\\\"id\\\": 1891369958178545666, \\\"gps\\\": \\\"gps-1234567\\\", \\\"ext1\\\": \\\"{}\\\", \\\"ext2\\\": \\\"{}\\\", \\\"carZw\\\": 10, \\\"carNum\\\": \\\"苏A12345\\\", \\\"remark\\\": \\\"小面包车\\\", \\\"driverId\\\": 1}, \\\"pathInfo\\\": {\\\"id\\\": 1891369322254950401, \\\"ext1\\\": \\\"{}\\\", \\\"ext2\\\": \\\"{}\\\", \\\"name\\\": \\\"福安-松罗\\\", \\\"mtime\\\": \\\"08:36:00\\\", \\\"price\\\": 10000, \\\"remark\\\": \\\"\\\", \\\"endArea\\\": 1891367690624557058, \\\"startArea\\\": 1891367270745366530}, \\\"driverInfo\\\": {\\\"userId\\\": 1, \\\"nickName\\\": \\\"管理员测试\\\", \\\"userName\\\": \\\"admin\\\", \\\"avatarUrl\\\": \\\"http://khy.xiaole.vip/khyfile/khy/2024/10/31/aa483cca0d124fa19763c69b1c679c39.jpg\\\"}}\",\n" +
+            "        \"carId\": 1891369958178545666,\n" +
+            "        \"mdate\": 1742313600000,\n" +
+            "        \"mtime\": \"18:36:00\",\n" +
+            "        \"pathId\": 1891369322254950401,\n" +
+            "        \"pprice\": 0\n" +
+            "    }\n" +
+            "}";
+
+
+        System.out.println(JSONUtil.parseObj(cc).getJSONObject("schedulInfo").getDate("mdate"));
     }
 
+
+
     @Tag("prod")
     @DisplayName("测试 @Tag prod")
     @Test

+ 46 - 4
ruoyi-modules/ruoyi-dzbc/src/main/java/org/dromara/system/controller/TblDzbcOrderController.java

@@ -5,6 +5,7 @@ import java.util.List;
 import java.util.concurrent.atomic.AtomicReference;
 import java.util.stream.Collectors;
 
+import cn.hutool.core.date.DateUnit;
 import cn.hutool.core.date.DateUtil;
 import cn.hutool.json.JSONObject;
 import cn.hutool.json.JSONUtil;
@@ -137,7 +138,8 @@ public class TblDzbcOrderController extends BaseController {
     @RepeatSubmit()
     @PutMapping()
     public R<Void> edit(@Validated(EditGroup.class) @RequestBody TblDzbcOrderBo bo) {
-        return toAjax(tblDzbcOrderService.updateByBo(bo));
+//        return toAjax(tblDzbcOrderService.updateByBo(bo));
+        return R.fail("失败");
     }
 
     /**
@@ -150,7 +152,8 @@ public class TblDzbcOrderController extends BaseController {
     @DeleteMapping("/{ids}")
     public R<Void> remove(@NotEmpty(message = "主键不能为空")
                           @PathVariable Long[] ids) {
-        return toAjax(tblDzbcOrderService.deleteWithValidByIds(List.of(ids), true));
+//        return toAjax(tblDzbcOrderService.deleteWithValidByIds(List.of(ids), true));
+        return R.fail("失败");
     }
 
     /**
@@ -164,6 +167,15 @@ public class TblDzbcOrderController extends BaseController {
     public R getOrderWxPay(@PathVariable Long id) {
         TblDzbcOrderVo tblDzbcOrderVo = tblDzbcOrderService.queryById(id);
         if (tblDzbcOrderVo == null) return R.fail("该订单不存在");
+        Long userid=null;
+        if(!LoginHelper.getLoginUser().getRoles().stream().map(i->i.getRoleName()).collect(Collectors.joining(",")).contains("定制班车-管理员")){
+            userid = (LoginHelper.getUserId());
+        }
+        if(userid!=null){
+            if(!tblDzbcOrderVo.getUserId().equals(userid)){
+                return R.fail("您没有权限查看该订单");
+            }
+        }
         if (tblDzbcOrderVo.getStatus().equals("0")) {
             try {
                 WxPayUnifiedOrderRequest orderRequest = new WxPayUnifiedOrderRequest();
@@ -214,13 +226,43 @@ public class TblDzbcOrderController extends BaseController {
     @GetMapping("/cancel/{id}")
     public R<Void> cancelOrder(@PathVariable Long id) {
         TblDzbcOrderVo tblDzbcOrderVo = tblDzbcOrderService.queryById(id);
+        Long userid=null;
+        if(!LoginHelper.getLoginUser().getRoles().stream().map(i->i.getRoleName()).collect(Collectors.joining(",")).contains("定制班车-管理员")){
+            userid = (LoginHelper.getUserId());
+        }
+        if(userid!=null){
+            if(!tblDzbcOrderVo.getUserId().equals(userid)){
+                return R.fail("您没有权限查看该订单");
+            }
+        }
         if (tblDzbcOrderVo == null) return R.fail("该订单不存在");
         if (tblDzbcOrderVo.getStatus().equals("1")) {
+            //判断订单时间 订单时间距离发车>60分钟可以取消
+            double bl = 1;
+            try {
+                JSONObject json = JSONUtil.parseObj(tblDzbcOrderVo.getExt2()).getJSONObject("schedulInfo");
+                Date date = json.getDate("mdate");
+                String time = json.getStr("mtime");
+                Date date1 = DateUtil.parse(DateUtil.format(date, "yyyy-MM-dd") + " " + time, "yyyy-MM-dd HH:mm:ss");
+                if(date1.getTime()-DateUtil.current()>60*60*1000){
+                    bl=1;
+                }else if(date1.getTime()-DateUtil.current()<60*60*1000 && date1.getTime()-DateUtil.current()>0){
+                    bl=0.5;
+                }else{
+                    return R.fail("该订单已发车,无法取消,请联系管理员");
+                }
+            } catch (Exception e) {
+                return R.fail("该订单无法取消");
+            }
+
+            if (DateUtil.between(new Date(), tblDzbcOrderVo.getCreateTime(), DateUnit.MINUTE) > 30) {
+                return R.fail("该订单无法取消");
+            }
             try {
                 JSONObject wxtrade = JSONUtil.parseObj(tblDzbcOrderVo.getExt2());
                 WxPayRefundRequest refundRequest = new WxPayRefundRequest();
                 refundRequest.setTotalFee(tblDzbcOrderVo.getTotalPrice());
-                refundRequest.setRefundFee(tblDzbcOrderVo.getTotalPrice());
+                refundRequest.setRefundFee((int)Math.round(tblDzbcOrderVo.getTotalPrice()*bl));
                 refundRequest.setOutRefundNo(wxtrade.getStr("transactionId"));
                 refundRequest.setNotifyUrl(baseUrl + "/system/commonOther/wx/ref");
                 wxPayService.refund(refundRequest);
@@ -229,7 +271,7 @@ public class TblDzbcOrderController extends BaseController {
                 order1.setId(tblDzbcOrderVo.getId());
                 order1.setStatus("2");
                 tblDzbcOrderService.updateByBo(order1);
-                return R.ok("成功");
+                return R.ok("成功,发车前1小时可以退50%车费");
             }catch (Exception e){}
             return R.fail("该订单无法取消");
         }else if(tblDzbcOrderVo.getStatus().equals("0")){

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

@@ -131,6 +131,8 @@ public class TblDzbcPathSchedulingServiceImpl implements ITblDzbcPathSchedulingS
             }
             params.put("driverInfo",userVo1);
             params.put("carInfo",carVo);
+        }else{
+            throw new RuntimeException("车辆不能为空");
         }
         if(add.getPathId()!=null){
             TblDzbcPathVo pathVo =  pathMapper.selectVoById(bo.getPathId());
@@ -138,6 +140,9 @@ public class TblDzbcPathSchedulingServiceImpl implements ITblDzbcPathSchedulingS
                 throw new RuntimeException("路线不存在");
             }
             params.put("pathInfo",pathVo);
+            add.setMtime(pathVo.getMtime());
+        }else{
+            throw new RuntimeException("路线不能为空");
         }
         add.setExt1(JSONUtil.toJsonStr(params));
         validEntityBeforeSave(add);
@@ -158,6 +163,39 @@ public class TblDzbcPathSchedulingServiceImpl implements ITblDzbcPathSchedulingS
         validEntityBeforeSave(update);
         int c = baseMapper.updateById(update) ;
         if(c>0){
+            Map<String, Object> params = bo.getParams();
+            TblDzbcPathScheduling add = baseMapper.selectById(update.getId());
+            if(add.getCarId()!=null){
+                TblDzbcCarVo carVo =  carMapper.selectVoById(bo.getCarId());
+
+                if(carVo == null){
+                    throw new RuntimeException("车辆不存在");
+                }
+                SysUserVo userVo = userMapper.selectUserById(carVo.getDriverId());
+                SysUserVo userVo1 = new SysUserVo();
+                userVo1.setUserId(userVo.getUserId());
+                userVo1.setUserName(userVo.getUserName());
+                userVo1.setNickName(userVo.getNickName());
+                userVo1.setPhonenumber(userVo.getPhonenumber());
+                userVo1.setEmail(userVo.getEmail());
+                userVo1.setSex(userVo.getSex());
+                if(userVo.getAvatar()!=null){
+                    userVo1.setAvatarUrl(ossService.selectUrlByIds(userVo.getAvatar().toString()));
+                }
+                params.put("driverInfo",userVo1);
+                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.setMtime(pathVo.getMtime());
+            }
+            add.setExt1(JSONUtil.toJsonStr(params));
+            baseMapper.updateById(add);
+
             SysCache();
         }
         return c> 0;

+ 1 - 0
ruoyi-modules/ruoyi-dzbc/src/main/java/org/dromara/system/util/ScheduleCarUtil.java

@@ -39,6 +39,7 @@ public class ScheduleCarUtil {
         map.values().stream().forEach(vo->{
             TblDzbcPathSchedulingBo bo1 = new TblDzbcPathSchedulingBo();
             bo1.setMdate(DateUtil.offsetDay(vo.getMdate(), 1));
+            bo1.setMtime(vo.getMtime());
             bo1.setPathId(vo.getPathId());
             bo1.setExt1(vo.getExt1());
             bo1.setCarId(vo.getCarId());