Przeglądaj źródła

金牛:售后部分商品退款

ct 4 tygodni temu
rodzic
commit
30a729402f

+ 15 - 6
fs-admin/src/main/java/com/fs/his/controller/FsStoreOrderController.java

@@ -11,10 +11,7 @@ import com.fs.common.core.domain.R;
 import com.fs.common.core.domain.entity.SysRole;
 import com.fs.common.core.domain.entity.SysUser;
 import com.fs.common.core.domain.model.LoginUser;
-import com.fs.common.utils.ParseUtils;
-import com.fs.common.utils.SecurityUtils;
-import com.fs.common.utils.ServletUtils;
-import com.fs.common.utils.StringUtils;
+import com.fs.common.utils.*;
 import com.fs.company.param.CompanyStoreOrderMoneyLogsListParam;
 import com.fs.company.service.ICompanyMoneyLogsService;
 import com.fs.company.vo.CompanyStoreOrderMoneyLogsVO;
@@ -365,7 +362,11 @@ public class FsStoreOrderController extends BaseController
             moneyLogsMap.setBusinessId(order.getOrderId());
             tuiMoneyLogs=moneyLogsService.selectCompanyStoreOrderMoneyLogsList(moneyLogsMap);
         }
-        return R.ok().put("data",order).put("tuiMoneyLogs",tuiMoneyLogs);
+        if ((CloudHostUtils.hasCloudHostName("金牛明医"))){
+            return R.ok().put("data",order).put("tuiMoneyLogs",tuiMoneyLogs).put("isUpdateRefund",1).put("isUpdatePayRemain",1);
+        } else {
+            return R.ok().put("data",order).put("tuiMoneyLogs",tuiMoneyLogs).put("isUpdateRefund",0).put("isUpdatePayRemain",0);
+        }
     }
 
     @GetMapping(value = "/queryPhone/{orderId}")
@@ -615,7 +616,15 @@ public class FsStoreOrderController extends BaseController
     {
         LoginUser loginUser = tokenService.getLoginUser(ServletUtils.getRequest());
         fsStoreOrder.setOperator(loginUser.getUser().getNickName());
-        return toAjax(fsStoreOrderService.afterSales(fsStoreOrder));
+        if (fsStoreOrder.getRefundAmount() != null){
+            if (fsStoreOrder.getRefundList()!=null && !fsStoreOrder.getRefundList().isEmpty()){
+                return toAjax(fsStoreOrderService.afterSalesByProduct(fsStoreOrder));
+            } else {
+                return AjaxResult.error("没有选择需要退款的商品!");
+            }
+        } else {
+            return toAjax(fsStoreOrderService.afterSales(fsStoreOrder));
+        }
     }
 
     /**

+ 1 - 1
fs-service/src/main/java/com/fs/erp/service/impl/DfOrderServiceImpl.java

@@ -701,7 +701,7 @@ public class DfOrderServiceImpl implements IErpOrderService
                                             order.setDeliveryName(proCode);
                                             order.setDeliveryCode("SF");
                                             order.setStatus(3);
-                                            order.setDeliverySendTime(DateUtils.getNowDate());
+                                            order.setDeliverySendTime(DateUtils.getNowDate()); //更新发货时间
                                             fsStoreOrderMapper.updateFsStoreOrder(order);
                                             fsStoreOrderLogsService.create(order.getOrderId(), FsStoreOrderLogEnum.DELIVERY_GOODS.getValue(), FsStoreOrderLogEnum.DELIVERY_GOODS.getDesc());
                                             if (order.getCompanyId() != null && order.getCompanyId() > 0) {

+ 3 - 0
fs-service/src/main/java/com/fs/his/mapper/FsStoreOrderItemMapper.java

@@ -6,6 +6,7 @@ import com.fs.his.vo.FsStoreOrderItemExcelVO;
 import com.fs.his.vo.FsStoreOrderItemListDVO;
 import com.fs.his.vo.FsStoreOrderItemListUVO;
 import com.fs.his.vo.FsStoreOrderItemVO;
+import org.apache.ibatis.annotations.Param;
 import org.apache.ibatis.annotations.Select;
 
 /**
@@ -72,4 +73,6 @@ public interface FsStoreOrderItemMapper
     List<FsStoreOrderItemExcelVO> selectFsStoreOrderItemExcelVOListByOrderId(Long orderId);
     @Select("select product_id,json_info,num from fs_store_order_item where order_id=#{orderId}")
     List<FsStoreOrderItemListDVO> selectFsStoreOrderItemListDVOByOrderId(Long orderId);
+
+    List<FsStoreOrderItem> selectFsStoreOrderItemListByItemIds(@Param("itemIds") List<Long> itemIds);
 }

+ 10 - 0
fs-service/src/main/java/com/fs/his/param/FsStoreOrderSalesParam.java

@@ -1,7 +1,13 @@
 package com.fs.his.param;
 
+import com.fs.hisStore.param.FsStoreOrderRefundByProductParam;
+import com.fs.hisStore.param.FsStoreOrderRefundParam;
+import com.fs.tzBankPay.doman.RefundParam;
 import lombok.Data;
 
+import java.math.BigDecimal;
+import java.util.List;
+
 @Data
 public class FsStoreOrderSalesParam {
 
@@ -14,4 +20,8 @@ public class FsStoreOrderSalesParam {
     private String operator;
 
     private Long companyId;
+
+    private BigDecimal refundAmount;
+
+    private List<FsStoreOrderRefundByProductParam> refundList;
 }

+ 2 - 0
fs-service/src/main/java/com/fs/his/service/IFsStoreOrderService.java

@@ -265,4 +265,6 @@ public interface IFsStoreOrderService
     Map<String,BigDecimal> selectFsStoreOrderStatistics(FsStoreOrderParam fsStoreOrder);
 
     String selectFsStoreOrderProductStatistics(FsStoreOrderParam fsStoreOrder);
+
+    int afterSalesByProduct(FsStoreOrderSalesParam fsStoreOrder);
 }

+ 22 - 18
fs-service/src/main/java/com/fs/his/service/impl/FsStoreAfterSalesServiceImpl.java

@@ -456,6 +456,9 @@ public class FsStoreAfterSalesServiceImpl implements IFsStoreAfterSalesService {
         }
         if (payments != null && payments.size() > 0) {
             FsStorePayment payment = payments.get(0);
+            if (reMoney.compareTo(payment.getPayMoney())>0) {
+                return 0; //退款金额不能大于实际支付金额
+            }
             String json = configService.selectConfigByKey("his.pay");
             if (payment.getPayMode().equals("wx")) {
                 WxPayConfig payConfig = new WxPayConfig();
@@ -481,7 +484,7 @@ public class FsStoreAfterSalesServiceImpl implements IFsStoreAfterSalesService {
                         paymentMap.setPaymentId(payment.getPaymentId());
                         paymentMap.setStatus(-1);
                         paymentMap.setRefundTime(DateUtils.getNowDate());
-                        paymentMap.setRefundMoney(payment.getPayMoney());
+                        paymentMap.setRefundMoney(reMoney);
                         fsStorePaymentMapper.updateFsStorePayment(paymentMap);
                     } else {
                         throw new CustomException("退款请求失败" + refundQueryResult.getReturnMsg());
@@ -492,7 +495,7 @@ public class FsStoreAfterSalesServiceImpl implements IFsStoreAfterSalesService {
             } else if (payment.getPayMode().equals("yb")) {
                 //易宝
                 RefundDTO refundDTO = new RefundDTO();
-                refundDTO.setRefundMoney(payment.getPayMoney().toString());
+                refundDTO.setRefundMoney(reMoney.toString());
                 refundDTO.setLowRefundNo(orderType + "-" + payment.getPayCode());
                 refundDTO.setUpOrderId(payment.getTradeNo());
                 com.fs.ybPay.domain.RefundResult result = payService.refund(refundDTO);
@@ -502,7 +505,7 @@ public class FsStoreAfterSalesServiceImpl implements IFsStoreAfterSalesService {
                     paymentMap.setPaymentId(payment.getPaymentId());
                     paymentMap.setStatus(-1);
                     paymentMap.setRefundTime(DateUtils.getNowDate());
-                    paymentMap.setRefundMoney(payment.getPayMoney());
+                    paymentMap.setRefundMoney(reMoney);
                     fsStorePaymentMapper.updateFsStorePayment(paymentMap);
                 } else {
                     throw new CustomException("退款请求失败" + result.getMessage());
@@ -518,7 +521,7 @@ public class FsStoreAfterSalesServiceImpl implements IFsStoreAfterSalesService {
                 SimpleDateFormat sdf = new SimpleDateFormat("yyyyMMddHHmmss");
                 tzBankResult.setTrxSendTime(sdf.format(new Date()));
                 // 退款金额
-                tzBankResult.setRefundOrdTransAmt(payment.getPayMoney().doubleValue());
+                tzBankResult.setRefundOrdTransAmt(reMoney.doubleValue());
                 TzBankResult<RefundResult> result = tzBankService.refund(tzBankResult);
                 logger.info("订单退款返回结果:退款订单id:" + order.getOrderId() + result);
                 if (result.getBody().getRefundOrdStatus().equals("90") || result.getBody().getRefundOrdStatus().equals("60")) {
@@ -526,31 +529,32 @@ public class FsStoreAfterSalesServiceImpl implements IFsStoreAfterSalesService {
                     paymentMap.setPaymentId(payment.getPaymentId());
                     paymentMap.setStatus(-1);
                     paymentMap.setRefundTime(DateUtils.getNowDate());
-                    paymentMap.setRefundMoney(payment.getPayMoney());
+                    paymentMap.setRefundMoney(reMoney);
                     fsStorePaymentMapper.updateFsStorePayment(paymentMap);
                 } else {
                     throw new CustomException("退款请求失败" + result.getRetMsg());
                 }
             } else if (payment.getPayMode().equals("hf")) {
                 V2TradePaymentScanpayRefundRequest request = new V2TradePaymentScanpayRefundRequest();
-                request.setOrdAmt(payment.getPayMoney().toString());
+//                request.setOrdAmt(payment.getPayMoney().toString());
+                request.setOrdAmt(reMoney.toString());
                 request.setOrgReqDate(new SimpleDateFormat("yyyyMMdd").format(payment.getCreateTime()));
                 request.setReqSeqId("refund-" + payment.getPayCode());
                 Map<String, Object> extendInfoMap = new HashMap<>();
                 extendInfoMap.put("org_req_seq_id", orderType + "-" + payment.getPayCode());
                 request.setExtendInfo(extendInfoMap);
-                HuiFuRefundResult refund = huiFuService.refund(request);
-                logger.info("订单退款返回结果:退款订单id:" + order.getOrderId() + refund);
-                if ((refund.getResp_code().equals("00000000") || refund.getResp_code().equals("00000100")) && (refund.getTrans_stat().equals("S") || refund.getTrans_stat().equals("P"))) {
-                    FsStorePayment paymentMap = new FsStorePayment();
-                    paymentMap.setPaymentId(payment.getPaymentId());
-                    paymentMap.setStatus(-1);
-                    paymentMap.setRefundTime(DateUtils.getNowDate());
-                    paymentMap.setRefundMoney(payment.getPayMoney());
-                    fsStorePaymentMapper.updateFsStorePayment(paymentMap);
-                } else {
-                    throw new CustomException("退款请求失败" + refund.getResp_desc());
-                }
+//                HuiFuRefundResult refund = huiFuService.refund(request);
+//                logger.info("订单退款返回结果:退款订单id:" + order.getOrderId() + refund);
+//                if ((refund.getResp_code().equals("00000000") || refund.getResp_code().equals("00000100")) && (refund.getTrans_stat().equals("S") || refund.getTrans_stat().equals("P"))) {
+//                    FsStorePayment paymentMap = new FsStorePayment();
+//                    paymentMap.setPaymentId(payment.getPaymentId());
+//                    paymentMap.setStatus(-1);
+//                    paymentMap.setRefundTime(DateUtils.getNowDate());
+//                    paymentMap.setRefundMoney(payment.getPayMoney());
+//                    fsStorePaymentMapper.updateFsStorePayment(paymentMap);
+//                } else {
+//                    throw new CustomException("退款请求失败" + refund.getResp_desc());
+//                }
             }
             //管易作废
             if (StringUtils.isNotEmpty(fsStoreOrder.getExtendOrderId())) {

+ 129 - 0
fs-service/src/main/java/com/fs/his/service/impl/FsStoreOrderServiceImpl.java

@@ -49,6 +49,7 @@ import com.fs.hisStore.domain.FsStoreOrderScrm;
 import com.fs.hisStore.domain.FsStorePaymentScrm;
 import com.fs.hisStore.mapper.FsStoreOrderScrmMapper;
 import com.fs.hisStore.mapper.FsStorePaymentScrmMapper;
+import com.fs.hisStore.param.FsStoreOrderRefundByProductParam;
 import com.fs.hisapi.domain.ApiResponse;
 import com.fs.hisapi.param.CreateOrderParam;
 import com.fs.hisapi.param.RecipeDetailParam;
@@ -3772,4 +3773,132 @@ public class FsStoreOrderServiceImpl implements IFsStoreOrderService {
         return fsStoreOrderMapper.selectFsStoreOrderProductStatistics(fsStoreOrder);
     }
 
+    @Override
+    public int afterSalesByProduct(FsStoreOrderSalesParam param) {
+        FsStoreOrder order = fsStoreOrderMapper.selectFsStoreOrderByOrderId(param.getOrderId());
+        if (order.getStatus() < 0) {
+            throw new CustomException("订单不可提交售后");
+        }
+        //判断总退款金额是否小于等于实付金额
+        BigDecimal refundAmount = param.getRefundAmount();
+        if (refundAmount.compareTo(order.getPayMoney())>0){
+            throw new CustomException("退款金额不能大于实付金额");
+        }
+        List<FsStoreOrderRefundByProductParam> refundList = param.getRefundList();
+        List<Long> itemIds = refundList.stream().filter(item->item.getNum()>0).map(FsStoreOrderRefundByProductParam::getItemId).collect(Collectors.toList());
+        if (itemIds.isEmpty()){
+            throw new CustomException("没有选择需要退款的商品/选择退款商品数量不能为0");
+        }
+        List<FsStoreOrderItem> fsStoreOrderItems = fsStoreOrderItemMapper.selectFsStoreOrderItemListByItemIds(itemIds);
+        if (fsStoreOrderItems.size() != itemIds.size()){
+            throw new CustomException("所退商品明细不存在");
+        }
+        FsStoreAfterSales fsStoreAfterSales = new FsStoreAfterSales();
+        fsStoreAfterSales.setOrderId(order.getOrderId());
+        fsStoreAfterSales.setStoreId(order.getStoreId());
+        fsStoreAfterSales.setRefundAmount(refundAmount);
+        fsStoreAfterSales.setCreateTime(DateUtils.getNowDate());
+        if (order.getStatus() == 2 || order.getStatus() == 3) {
+            fsStoreAfterSales.setRefundType(0);
+        }
+        if (order.getStatus() == 4) {
+            FsStore fsStore = fsStoreMapper.selectFsStoreByStoreId(order.getStoreId());
+            fsStoreAfterSales.setRefundType(1);
+            fsStoreAfterSales.setPhoneNumber(fsStore.getRefundPhone());
+            fsStoreAfterSales.setAddress(fsStore.getRefundAddress());
+            fsStoreAfterSales.setConsignee(fsStore.getRefundConsignee());
+        }
+        fsStoreAfterSales.setStatus(0);
+        fsStoreAfterSales.setDeptId(order.getDeptId());
+        fsStoreAfterSales.setSalesStatus(0);
+        fsStoreAfterSales.setOrderStatus(order.getStatus());
+        fsStoreAfterSales.setUserId(order.getUserId());
+        fsStoreAfterSales.setCompanyId(order.getCompanyId());
+        fsStoreAfterSales.setCompanyUserId(order.getCompanyUserId());
+        fsStoreAfterSales.setIsDel(0);
+        fsStoreAfterSalesService.insertFsStoreAfterSales(fsStoreAfterSales);
+
+        for (FsStoreOrderItem fsStoreOrderItem : fsStoreOrderItems) {
+            for (FsStoreOrderRefundByProductParam fsStoreOrderRefundByProductParam : refundList) {
+                if (Objects.equals(fsStoreOrderRefundByProductParam.getItemId(), fsStoreOrderItem.getItemId())) {
+                    FsStoreAfterSalesItem item = new FsStoreAfterSalesItem();
+                    item.setAfterSalesId(fsStoreAfterSales.getId());
+                    item.setProductId(fsStoreOrderItem.getProductId());
+                    String jsonInfo = fsStoreOrderItem.getJsonInfo();
+                    FsProdItemDTO fsProdItemDTO = JSON.parseObject(jsonInfo, FsProdItemDTO.class);
+                    fsProdItemDTO.setPrice(fsStoreOrderRefundByProductParam.getMoney());
+                    fsProdItemDTO.setNum(fsStoreOrderRefundByProductParam.getNum());
+                    item.setJsonInfo(JSONUtil.toJsonStr(fsProdItemDTO));
+                    fsStoreAfterSalesItemMapper.insertFsStoreAfterSalesItem(item);
+                    break;
+                }
+            }
+        }
+        //增加操作日志
+        FsStoreAfterSalesLogs logs = new FsStoreAfterSalesLogs();
+        logs.setChangeTime(new DateTime());
+        logs.setChangeType(0);
+        logs.setStoreAfterSalesId(fsStoreAfterSales.getId());
+        logs.setOperator(param.getOperator());
+        logs.setCompanyId(param.getCompanyId());
+        logs.setChangeMessage("平台提交售后");
+        fsStoreAfterSalesLogsMapper.insertFsStoreAfterSalesLogs(logs);
+        //添加订单日志
+        fsStoreOrderLogsService.create(order.getOrderId(), FsStoreOrderLogEnum.REFUND_ORDER_PLATFORM.getValue(),
+                param.getOperator() + " " +FsStoreOrderLogEnum.REFUND_ORDER_PLATFORM.getDesc());
+        //判断是否开启erp
+        FsSysConfig sysConfig = configUtil.getSysConfig();
+        Integer erpOpen = sysConfig.getErpOpen();
+        if (erpOpen != null && erpOpen == 1) {
+            //判断erp类型
+            Integer erpType = sysConfig.getErpType();
+            if (erpType != null) {
+
+                IErpOrderService erpOrderService = null;
+                if (erpType == 1) {
+                    //管易
+                    erpOrderService = gyOrderService;
+                } else if (erpType == 2) {
+                    //旺店通
+                    erpOrderService = wdtOrderService;
+                } else if (erpType == 3) {
+                    //瀚智
+                    erpOrderService = hzOMSOrderService;
+                } else if (erpType == 4) {
+                    //瀚智
+                    erpOrderService = dfOrderService;
+                } else if (erpType == 5) {
+                    erpOrderService = jSTOrderService;
+                }else if (erpType == 6) {
+                    erpOrderService = k9OrderService;
+                }
+                if (erpOrderService != null && StringUtils.isNotEmpty(order.getExtendOrderId())) {
+                    if (!order.getExtendOrderId().equals("HIS")) {
+                        if (erpType != 3) {
+                            ErpRefundUpdateRequest request = new ErpRefundUpdateRequest();
+                            request.setTid(order.getOrderCode());
+                            request.setOid(order.getOrderCode());
+                            request.setRefund_state(1);
+                            erpOrderService.refundUpdate(request);
+                        } else {
+                            ErpRefundOrder erpRefundOrder = new ErpRefundOrder();
+                            erpRefundOrder.setOrderCode(order.getOrderCode());
+                            erpRefundOrder.setAfterSalesId(fsStoreAfterSales.getId());
+                            erpOrderService.refundOrder(erpRefundOrder);
+                        }
+                    }
+                }
+            }
+        }
+        order.setStatus(-1);
+        order.setRefundStatus(1 + "");
+        fsStoreOrderMapper.updateFsStoreOrder(order);
+        if (order.getPackageOrderId() != null) {
+            FsPackageOrder fsPackageOrder = fsPackageOrderMapper.selectFsPackageOrderByOrderId(order.getPackageOrderId());
+            fsPackageOrder.setRefundStatus(1);
+            fsPackageOrderMapper.updateFsPackageOrder(fsPackageOrder);
+        }
+        return 1;
+    }
+
 }

+ 19 - 0
fs-service/src/main/java/com/fs/hisStore/param/FsStoreOrderRefundByProductParam.java

@@ -0,0 +1,19 @@
+package com.fs.hisStore.param;
+
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+
+import java.io.Serializable;
+import java.math.BigDecimal;
+
+@Data
+public class FsStoreOrderRefundByProductParam implements Serializable
+{
+    private Long itemId; //订单明细id
+
+    private Integer num; //退款数量
+
+    private BigDecimal money; //退款单价
+
+
+}

+ 6 - 0
fs-service/src/main/resources/mapper/his/FsStoreOrderItemMapper.xml

@@ -41,6 +41,12 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
         <include refid="selectFsStoreOrderItemVo"/>
         where item_id = #{itemId}
     </select>
+    <select id="selectFsStoreOrderItemListByItemIds" resultType="com.fs.his.domain.FsStoreOrderItem">
+        select * from fs_store_order_item where  item_id in
+        <foreach collection="itemIds" item="itemId" open="(" separator="," close=")">
+            #{itemId}
+        </foreach>
+    </select>
 
     <insert id="insertFsStoreOrderItem" parameterType="FsStoreOrderItem" useGeneratedKeys="true" keyProperty="itemId">
         insert into fs_store_order_item