From 65ad99e0a5e47c2cfcfd9ceade7dc6f2b83bcbd2 Mon Sep 17 00:00:00 2001
From: jiaosong <jiaosong6760@dingtalk.com>
Date: 星期三, 11 十月 2023 16:38:54 +0800
Subject: [PATCH] #pgsql 订单退款  结算退款 未消费结算

---
 server/platform/src/main/java/com/doumee/task/ScheduleTool.java                           |   21 ++++
 server/services/src/main/java/com/doumee/core/mqtt/service/MqttPushCallback.java          |    2 
 server/platform/src/main/java/com/doumee/api/business/GoodsorderController.java           |   25 ++++++
 server/services/src/main/java/com/doumee/dao/business/web/request/GoodsorderBackDTO.java  |   21 +++++
 server/services/src/main/java/com/doumee/service/business/GoodsorderService.java          |    8 ++
 server/services/src/main/java/com/doumee/service/business/impl/MemberServiceImpl.java     |    8 +-
 server/services/src/main/java/com/doumee/service/business/impl/GoodsorderServiceImpl.java |  134 +++++++++++++++++++++++++++------
 server/services/src/main/java/com/doumee/dao/business/web/response/MiniProgrammeDTO.java  |    2 
 server/services/src/main/java/com/doumee/service/business/impl/RentSiteServiceImpl.java   |    2 
 9 files changed, 190 insertions(+), 33 deletions(-)

diff --git a/server/platform/src/main/java/com/doumee/api/business/GoodsorderController.java b/server/platform/src/main/java/com/doumee/api/business/GoodsorderController.java
index 221c6ed..238304a 100644
--- a/server/platform/src/main/java/com/doumee/api/business/GoodsorderController.java
+++ b/server/platform/src/main/java/com/doumee/api/business/GoodsorderController.java
@@ -11,6 +11,7 @@
 import com.doumee.dao.business.model.WxBillDetail;
 import com.doumee.dao.business.vo.GoodsorderExportVO;
 import com.doumee.dao.business.vo.GoodsorderTotalDataVO;
+import com.doumee.dao.business.web.request.GoodsorderBackDTO;
 import com.doumee.dao.business.web.response.GoodsorderDetailDTO;
 import com.doumee.service.business.GoodsorderService;
 import com.doumee.service.business.GoodsorderService;
@@ -21,6 +22,7 @@
 import org.springframework.web.bind.annotation.*;
 
 import javax.servlet.http.HttpServletResponse;
+import java.math.BigDecimal;
 import java.util.ArrayList;
 import java.util.List;
 
@@ -113,4 +115,27 @@
     public ApiResponse<GoodsorderDetailDTO> findById(@PathVariable String id) {
         return ApiResponse.success(goodsorderService.getGoodsorderDetailDTO(id));
     }
+
+
+    /**
+     * 寮哄埗缁撶畻璁㈠崟
+     * @param id
+     * @return
+     */
+    @ApiOperation("鏍规嵁ID鏌ヨ")
+    @PostMapping("/closerGoodsorder")
+    @RequiresPermissions("business:goodsorder:query")
+    public ApiResponse closerGoodsorder(@RequestParam String id){
+        goodsorderService.closerGoodsorder(id);
+        return ApiResponse.success(null);
+    }
+
+
+    @ApiOperation("鏍规嵁ID鏌ヨ")
+    @PostMapping("/backGoodsorder")
+    @RequiresPermissions("business:goodsorder:query")
+    public ApiResponse backGoodsorder(@RequestBody GoodsorderBackDTO goodsorderBackDTO){
+        goodsorderService.backGoodsorder(goodsorderBackDTO.getOrderId(),goodsorderBackDTO.getMoney());
+        return ApiResponse.success(null);
+    }
 }
diff --git a/server/platform/src/main/java/com/doumee/task/ScheduleTool.java b/server/platform/src/main/java/com/doumee/task/ScheduleTool.java
index 84637d1..fe11644 100644
--- a/server/platform/src/main/java/com/doumee/task/ScheduleTool.java
+++ b/server/platform/src/main/java/com/doumee/task/ScheduleTool.java
@@ -2,14 +2,19 @@
 
 
 import com.doumee.biz.system.SystemDictDataBiz;
+import com.doumee.core.constants.Constants;
 import com.doumee.core.utils.DateUtil;
+import com.doumee.dao.business.model.Goodsorder;
+import com.doumee.service.business.GoodsorderService;
 import com.doumee.service.business.WxBillService;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.scheduling.annotation.EnableScheduling;
 import org.springframework.scheduling.annotation.Scheduled;
 import org.springframework.stereotype.Component;
+import org.springframework.util.CollectionUtils;
 
 import java.util.Date;
+import java.util.List;
 
 /**
  * 瀹氭椂浠诲姟
@@ -25,9 +30,12 @@
 
     @Autowired
     private SystemDictDataBiz systemDictDataBiz;
+
     @Autowired
     private WxBillService wxBillService;
 
+    @Autowired
+    private GoodsorderService goodsorderService;
     /**
      * @throws Exception
      */
@@ -44,8 +52,17 @@
      */
 //    @Scheduled(fixedDelay = 1000*60)
     public void getYesterdayBill() throws Exception {
-        Date ydate = DateUtil.addDaysToDate(new Date(), -1);
-        wxBillService.getWxBill(ydate);
+
+        Goodsorder goodsorder = new Goodsorder();
+        goodsorder.setIsdeleted(Constants.ZERO);
+        goodsorder.setStatus(Constants.goodsorderStatus.pay);
+        List<Goodsorder> list = goodsorderService.findList(goodsorder);
+        if (!CollectionUtils.isEmpty(list)){
+            list.forEach(s->{
+                goodsorderService.closerGoodsorder(s.getId());
+            });
+
+        }
 
     }
 }
diff --git a/server/services/src/main/java/com/doumee/core/mqtt/service/MqttPushCallback.java b/server/services/src/main/java/com/doumee/core/mqtt/service/MqttPushCallback.java
index aee7901..cc42954 100644
--- a/server/services/src/main/java/com/doumee/core/mqtt/service/MqttPushCallback.java
+++ b/server/services/src/main/java/com/doumee/core/mqtt/service/MqttPushCallback.java
@@ -20,7 +20,7 @@
         public void connectionLost(Throwable cause) {
 
             // 杩炴帴涓㈠け鍚庯紝涓�鑸湪杩欓噷闈㈣繘琛岄噸杩�
-            System.out.println("杩炴帴鏂紑锛屽彲浠ュ仛閲嶈繛");
+//            System.out.println("杩炴帴鏂紑锛屽彲浠ュ仛閲嶈繛");
         }
 
         @Override
diff --git a/server/services/src/main/java/com/doumee/dao/business/web/request/GoodsorderBackDTO.java b/server/services/src/main/java/com/doumee/dao/business/web/request/GoodsorderBackDTO.java
new file mode 100644
index 0000000..4f2da98
--- /dev/null
+++ b/server/services/src/main/java/com/doumee/dao/business/web/request/GoodsorderBackDTO.java
@@ -0,0 +1,21 @@
+package com.doumee.dao.business.web.request;
+
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+
+import java.math.BigDecimal;
+/**
+ * @author T14
+ */
+@Data
+@ApiModel("閫�娆捐姹�")
+public class GoodsorderBackDTO {
+
+
+    @ApiModelProperty(value = "璁㈠崟id")
+    private String orderId;
+
+    @ApiModelProperty(value = "閫�娆鹃噾棰�")
+    private BigDecimal money;
+}
diff --git a/server/services/src/main/java/com/doumee/dao/business/web/response/MiniProgrammeDTO.java b/server/services/src/main/java/com/doumee/dao/business/web/response/MiniProgrammeDTO.java
index 36fabe4..3137788 100644
--- a/server/services/src/main/java/com/doumee/dao/business/web/response/MiniProgrammeDTO.java
+++ b/server/services/src/main/java/com/doumee/dao/business/web/response/MiniProgrammeDTO.java
@@ -4,6 +4,7 @@
 import com.fasterxml.jackson.core.JsonProcessingException;
 import com.fasterxml.jackson.databind.ObjectMapper;
 import com.fasterxml.jackson.databind.PropertyNamingStrategy;
+import io.swagger.annotations.ApiModel;
 import io.swagger.annotations.ApiModelProperty;
 import lombok.Data;
 
@@ -13,6 +14,7 @@
  * @author T14
  */
 @Data
+@ApiModel("楠戣璁板綍杩斿洖绫�")
 public class MiniProgrammeDTO {
 
     @ApiModelProperty("涓婚〉涓婚")
diff --git a/server/services/src/main/java/com/doumee/service/business/GoodsorderService.java b/server/services/src/main/java/com/doumee/service/business/GoodsorderService.java
index 3120eae..213dd1d 100644
--- a/server/services/src/main/java/com/doumee/service/business/GoodsorderService.java
+++ b/server/services/src/main/java/com/doumee/service/business/GoodsorderService.java
@@ -12,6 +12,7 @@
 import com.doumee.dao.business.web.response.GoodsorderDetailDTO;
 import com.doumee.dao.business.web.response.RidesDetailResponse;
 
+import java.math.BigDecimal;
 import java.util.List;
 
 /**
@@ -146,6 +147,13 @@
 
 
     /**
+     * 閫�娆�
+     * @param orderId
+     */
+    void backGoodsorder(String orderId, BigDecimal money);
+
+
+    /**
      * 楠戣璁板綍璇︽儏
      * @param id
      * @return
diff --git a/server/services/src/main/java/com/doumee/service/business/impl/GoodsorderServiceImpl.java b/server/services/src/main/java/com/doumee/service/business/impl/GoodsorderServiceImpl.java
index 7b24ac9..0c8f1e1 100644
--- a/server/services/src/main/java/com/doumee/service/business/impl/GoodsorderServiceImpl.java
+++ b/server/services/src/main/java/com/doumee/service/business/impl/GoodsorderServiceImpl.java
@@ -34,6 +34,7 @@
 import com.doumee.service.business.GoodsorderService;
 import com.doumee.service.business.MemberRidesService;
 import com.doumee.service.business.PricingRuleService;
+import com.doumee.service.business.RefundService;
 import com.github.binarywang.wxpay.bean.notify.WxPayNotifyResponse;
 import com.github.binarywang.wxpay.bean.request.BaseWxPayRequest;
 import com.github.binarywang.wxpay.bean.request.WxPayUnifiedOrderRequest;
@@ -100,6 +101,9 @@
 
     @Autowired
     PricingRuleService pricingRuleService;
+
+    @Autowired
+    RefundService refundService;
 
     @Override
     public String create(Goodsorder goodsorder) {
@@ -326,15 +330,16 @@
         return goodsorderDetailDTO;
     }
 
+    @Transactional(rollbackFor = {Exception.class,BusinessException.class})
     @Override
-    public void closerGoodsorder(String id) {
+    public void closerGoodsorder(String orderId) {
 
 
         LoginUserInfo principal = (LoginUserInfo) SecurityUtils.getSubject().getPrincipal();
-        Goodsorder goodsorder = goodsorderMapper.selectById(id);
+        Goodsorder goodsorder = goodsorderMapper.selectById(orderId);
         QueryWrapper<MemberRides> wrapper = new QueryWrapper<>();
         wrapper.lambda()
-                .eq(MemberRides::getOrdreId,id);
+                .eq(MemberRides::getOrdreId,orderId);
         List<MemberRides> memberRides = memberRidesMapper.selectList(wrapper);
         if (!CollectionUtils.isEmpty(memberRides)){
             boolean exitUnBack = memberRides.stream().anyMatch(s -> !Constants.MEMBER_RIDES_STATUS.BACK_CYCLING.getKey().equals(s.getStatus()));
@@ -361,8 +366,10 @@
 
             Integer durationSum = memberRides.stream().filter(s -> s.getDuration() > 0).mapToInt(s -> s.getDuration()).sum();
             if (durationSum > pricingRule.getMemberRides().getBaseTime()){
+                BigDecimal bigDecimal = new BigDecimal((durationSum - pricingRule.getMemberRides().getBaseTime()));
                 BigDecimal basePrice = pricingRule.getMemberRides().getBasePrice();
-                BigDecimal multiply = pricingRule.getMemberRides().getUnitPrice().multiply(new BigDecimal((durationSum - pricingRule.getMemberRides().getBaseTime())));
+                BigDecimal multiply = pricingRule.getMemberRides().getUnitPrice()
+                                                .multiply(bigDecimal.divide(pricingRule.getMemberRides().getUnitPrice(),BigDecimal.ROUND_UP));
                 ridesDetailResponse.setAmount(basePrice.add(multiply));
             }else {
                 ridesDetailResponse.setAmount(pricingRule.getMemberRides().getBasePrice());
@@ -371,36 +378,114 @@
             ridesDetailResponse.setDuration(durationSum);
             ridesDetailResponse.setMemberRidesResponseList(collect);
 
+            if(goodsorder.getMoney().compareTo(ridesDetailResponse.getAmount())>Constants.ZERO){
 
-            Refund refund = new Refund();
-            refund.setCreateDate(new Date());
-            refund.setCreator(principal.getId());
-            refund.setEditDate(new Date());
-            refund.setEditor(principal.getId());
-            refund.setIsdeleted(Constants.ZERO);
-            refund.setInfo("绯荤粺缁撶畻鍚庤鍗曡嚜鍔ㄥ畬缁�");
-//            refund.setCode();
-            refund.setMemberId(goodsorder.getMemberId());
-            refund.setMoney(goodsorder.getMoney().subtract(ridesDetailResponse.getAmount()));
-//            refund.setStatus();
-//            refund.setPreOrderid();
-//            refund.setOnlineOrderid();
-            refund.setPayWay(goodsorder.getPayWay());
-            refund.setDoneDate(new Date());
-            refund.setType(Constants.ONE);
-            refund.setObjId(goodsorder.getId());
-            refund.setReason("纭畾寮哄埗缁撶畻鍚楋紵缁撶畻鍚庤鍗曡嚜鍔ㄥ畬缁�");
-            refundMapper.insert(refund);
+                RefundDTO refundDTO = new RefundDTO();
+                refundDTO.setOrderId(orderId);
+                refundDTO.setCanBalance(goodsorder.getMoney());
+                refundDTO.setRefundAmount(goodsorder.getMoney().subtract(ridesDetailResponse.getAmount()));
+                refundDTO.setTotalAmount(goodsorder.getMoney());
+                refundDTO.setMemberId(goodsorder.getMemberId());
+                refundDTO.setReason("骞冲彴寮哄埗缁撶畻閫�娆�");
+                refundDTO.setType(Constants.REFUND_TYPE.PLAT_AUTO.getKey());
+                Refund refund = wxMiniUtilService.wxRefund(refundDTO);
+
+                //瀛樺偍 娑堣垂浜ゆ槗娴佹按
+                Transactions transactions = new Transactions();
+                transactions.setMemberId(goodsorder.getMemberId());
+                transactions.setCreateDate(new Date());
+                transactions.setIsdeleted(Constants.ZERO);
+                transactions.setOrderId(orderId);
+                transactions.setMoney(goodsorder.getMoney().compareTo(ridesDetailResponse.getAmount())<=Constants.ZERO?goodsorder.getMoney():ridesDetailResponse.getAmount());
+                transactions.setType(Constants.transactionsType.consumption);
+                transactions.setDoneDate(new Date());
+                transactions.setTitle("娑堣垂缁撶畻");
+                transactions.setContent("缁撶畻瀹為檯娑堣垂");
+                transactions.setBalance(BigDecimal.ZERO);
+                transactions.setObjId(orderId);
+                transactions.setObjType(Constants.ONE);
+                transactionsMapper.insert(transactions);
+
+                Goodsorder update = new Goodsorder();
+                update.setId(goodsorder.getId());
+                update.setStatus(Constants.GOODSORDER_STATUS.CLOSE.getKey());
+                update.setCloseMoney(goodsorder.getMoney().subtract(ridesDetailResponse.getAmount()));
+                update.setCloseId(refund.getId());
+                update.setCloseDate(refund.getDoneDate());
+                update.setCloseInfo(refund.getInfo());
+                update.setCloseUserId(principal.getId());
+                update.setCloseType(Constants.ONE);
+                goodsorderMapper.updateById(update);
+            }
+        }else {
+
+            RefundDTO refundDTO = new RefundDTO();
+            refundDTO.setOrderId(orderId);
+            refundDTO.setCanBalance(goodsorder.getMoney());
+            refundDTO.setRefundAmount(goodsorder.getMoney());
+            refundDTO.setTotalAmount(goodsorder.getMoney());
+            refundDTO.setMemberId(goodsorder.getMemberId());
+            refundDTO.setReason("骞冲彴寮哄埗缁撶畻閫�娆�");
+            refundDTO.setType(Constants.REFUND_TYPE.PLAT_FORCE.getKey());
+            Refund refund = wxMiniUtilService.wxRefund(refundDTO);
+
+            //瀛樺偍 娑堣垂浜ゆ槗娴佹按
+            Transactions transactions = new Transactions();
+            transactions.setMemberId(goodsorder.getMemberId());
+            transactions.setCreateDate(new Date());
+            transactions.setIsdeleted(Constants.ZERO);
+            transactions.setOrderId(orderId);
+            transactions.setMoney(goodsorder.getMoney());
+            transactions.setType(Constants.transactionsType.consumption);
+            transactions.setDoneDate(new Date());
+            transactions.setTitle("娑堣垂缁撶畻");
+            transactions.setContent("缁撶畻瀹為檯娑堣垂");
+            transactions.setBalance(BigDecimal.ZERO);
+            transactions.setObjId(orderId);
+            transactions.setObjType(Constants.ONE);
+            transactionsMapper.insert(transactions);
+
             Goodsorder update = new Goodsorder();
             update.setId(goodsorder.getId());
             update.setStatus(Constants.GOODSORDER_STATUS.CLOSE.getKey());
-            update.setCloseMoney(goodsorder.getMoney().subtract(ridesDetailResponse.getAmount()));
+            update.setCloseMoney(goodsorder.getMoney());
             update.setCloseId(refund.getId());
             update.setCloseDate(refund.getDoneDate());
             update.setCloseInfo(refund.getInfo());
             update.setCloseUserId(principal.getId());
             update.setCloseType(Constants.ONE);
             goodsorderMapper.updateById(update);
+
+        }
+
+
+    }
+
+    @Override
+    public void backGoodsorder(String orderId, BigDecimal money) {
+
+        LoginUserInfo principal = (LoginUserInfo) SecurityUtils.getSubject().getPrincipal();
+        Goodsorder goodsorder = goodsorderMapper.selectById(orderId);
+        QueryWrapper<Refund> wrapper = new QueryWrapper<>();
+        wrapper.lambda()
+                .eq(Refund::getObjId,orderId)
+                .orderByDesc(Refund::getCreateDate)
+                .last("limit 1");
+        Refund lastRefund = refundMapper.selectOne(wrapper);
+        if (Objects.isNull(lastRefund)){
+            throw new BusinessException(ResponseStatus.BAD_REQUEST.getCode(),"鏀硅鍗曡缁撶畻鍚庡湪閫�娆�");
+        }
+        BigDecimal canBalance = lastRefund.getCanBalance();
+        if(canBalance.compareTo(money) > Constants.ZERO){
+            RefundDTO refundDTO = new RefundDTO();
+            refundDTO.setOrderId(orderId);
+            refundDTO.setCanBalance(lastRefund.getCanBalance().subtract(lastRefund.getMoney()));
+            refundDTO.setRefundAmount(money);
+            refundDTO.setTotalAmount(goodsorder.getMoney());
+            refundDTO.setMemberId(goodsorder.getMemberId());
+            refundDTO.setReason("骞冲彴閫�娆�");
+            refundDTO.setType(Constants.REFUND_TYPE.BACK.getKey());
+            Refund refund = wxMiniUtilService.wxRefund(refundDTO);
         }
     }
 
@@ -611,7 +696,6 @@
             Integer durationSum = memberRides.stream().filter(s -> s.getDuration() > 0).mapToInt(s -> s.getDuration()).sum();
             if (durationSum > pricingRule.getMemberRides().getBaseTime()){
                 BigDecimal basePrice = pricingRule.getMemberRides().getBasePrice();
-                //TODO 鍙栬瘉
                 BigDecimal multiply = pricingRule.getMemberRides().getUnitPrice().multiply(new BigDecimal((durationSum - pricingRule.getMemberRides().getBaseTime())).divide(new BigDecimal(pricingRule.getMemberRides().getUnitTime())).setScale(0,BigDecimal.ROUND_CEILING));
                 ridesDetailResponse.setAmount(basePrice.add(multiply));
             }else {
diff --git a/server/services/src/main/java/com/doumee/service/business/impl/MemberServiceImpl.java b/server/services/src/main/java/com/doumee/service/business/impl/MemberServiceImpl.java
index 7c5d6f4..cfbb756 100644
--- a/server/services/src/main/java/com/doumee/service/business/impl/MemberServiceImpl.java
+++ b/server/services/src/main/java/com/doumee/service/business/impl/MemberServiceImpl.java
@@ -79,13 +79,13 @@
         insert.setEditor(principal.getId());
         insert.setIsdeleted(Constants.ZERO);
         insert.setName(member.getName());
-        insert.setName(member.getNickname());
-        insert.setStatus(Constants.ZERO);
+        insert.setNickname(member.getNickname());
+        insert.setStatus(member.getStatus());
         insert.setRegisterDate(new Date());
         insert.setCardNo(member.getCardNo());
         insert.setType(Constants.ONE);
-        memberMapper.insert(member);
-        return member.getId();
+        memberMapper.insert(insert);
+        return insert.getId();
     }
 
     @Override
diff --git a/server/services/src/main/java/com/doumee/service/business/impl/RentSiteServiceImpl.java b/server/services/src/main/java/com/doumee/service/business/impl/RentSiteServiceImpl.java
index 3649991..2236504 100644
--- a/server/services/src/main/java/com/doumee/service/business/impl/RentSiteServiceImpl.java
+++ b/server/services/src/main/java/com/doumee/service/business/impl/RentSiteServiceImpl.java
@@ -98,7 +98,7 @@
         QueryWrapper<RentSite> wrapper = new QueryWrapper<>(rentSite);
         return rentSiteMapper.selectList(wrapper);
     }
-  
+
     @Override
     public PageData<RentSite> findPage(PageWrap<RentSite> pageWrap) {
         IPage<RentSite> page = new Page<>(pageWrap.getPage(), pageWrap.getCapacity());

--
Gitblit v1.9.3