浏览代码

Merge remote-tracking branch 'origin/master'

zyp 4 周之前
父节点
当前提交
9d22a3cc4c

+ 47 - 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.SysRole;
 import com.fs.common.core.domain.entity.SysUser;
 import com.fs.common.core.domain.entity.SysUser;
 import com.fs.common.core.domain.model.LoginUser;
 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.param.CompanyStoreOrderMoneyLogsListParam;
 import com.fs.company.service.ICompanyMoneyLogsService;
 import com.fs.company.service.ICompanyMoneyLogsService;
 import com.fs.company.vo.CompanyStoreOrderMoneyLogsVO;
 import com.fs.company.vo.CompanyStoreOrderMoneyLogsVO;
@@ -35,6 +32,7 @@ import com.fs.his.dto.ExpressInfoDTO;
 import com.fs.his.dto.StoreOrderExpressExportDTO;
 import com.fs.his.dto.StoreOrderExpressExportDTO;
 import com.fs.his.dto.TracesDTO;
 import com.fs.his.dto.TracesDTO;
 import com.fs.his.enums.FsStoreOrderLogEnum;
 import com.fs.his.enums.FsStoreOrderLogEnum;
+import com.fs.his.enums.FsStoreOrderStatusEnum;
 import com.fs.his.enums.ShipperCodeEnum;
 import com.fs.his.enums.ShipperCodeEnum;
 import com.fs.his.param.FsFollowMsgParam;
 import com.fs.his.param.FsFollowMsgParam;
 import com.fs.his.param.FsStoreOrderParam;
 import com.fs.his.param.FsStoreOrderParam;
@@ -364,7 +362,11 @@ public class FsStoreOrderController extends BaseController
             moneyLogsMap.setBusinessId(order.getOrderId());
             moneyLogsMap.setBusinessId(order.getOrderId());
             tuiMoneyLogs=moneyLogsService.selectCompanyStoreOrderMoneyLogsList(moneyLogsMap);
             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}")
     @GetMapping(value = "/queryPhone/{orderId}")
@@ -420,9 +422,40 @@ public class FsStoreOrderController extends BaseController
     @PutMapping
     @PutMapping
     public AjaxResult edit(@RequestBody FsStoreOrder fsStoreOrder)
     public AjaxResult edit(@RequestBody FsStoreOrder fsStoreOrder)
     {
     {
+        AjaxResult error = moneyCheck(fsStoreOrder);
+        if (error != null) return error;
         return toAjax(fsStoreOrderService.updateFsStoreOrder(fsStoreOrder));
         return toAjax(fsStoreOrderService.updateFsStoreOrder(fsStoreOrder));
     }
     }
 
 
+    private AjaxResult moneyCheck(FsStoreOrder fsStoreOrder) {
+        BigDecimal payRemain = fsStoreOrder.getPayRemain();
+        BigDecimal payPrice = fsStoreOrder.getPayPrice();
+        if (payRemain != null && payPrice == null){
+            return AjaxResult.error("订单应收金额不正确!");
+        }
+        if (payRemain == null && payPrice != null){
+            return AjaxResult.error("订单物流代收金额不正确!");
+        }
+        if (payRemain != null && payPrice != null){
+            FsStoreOrder temp = fsStoreOrderService.selectFsStoreOrderByOrderId(fsStoreOrder.getOrderId());
+            if (!((Objects.equals(temp.getStatus(), FsStoreOrderStatusEnum.STATUS_2.getValue())
+                    || (Objects.equals(temp.getStatus(), FsStoreOrderStatusEnum.STATUS_1.getValue())))
+                    || (StringUtils.isNotBlank(temp.getExtendOrderId())))
+            ){
+
+                BigDecimal payMoney = temp.getPayMoney();
+                if (fsStoreOrder.getPayMoney()!=null){
+                    fsStoreOrder.setPayMoney(payMoney);
+                }
+                BigDecimal tempPayPrice = payMoney.add(payRemain);
+                if(0 != tempPayPrice.compareTo(fsStoreOrder.getPayPrice())){
+                    return AjaxResult.error("订单金额不正确!");
+                }
+            }
+        }
+        return null;
+    }
+
     /**
     /**
      * 修改订单
      * 修改订单
      */
      */
@@ -583,7 +616,15 @@ public class FsStoreOrderController extends BaseController
     {
     {
         LoginUser loginUser = tokenService.getLoginUser(ServletUtils.getRequest());
         LoginUser loginUser = tokenService.getLoginUser(ServletUtils.getRequest());
         fsStoreOrder.setOperator(loginUser.getUser().getNickName());
         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));
+        }
     }
     }
 
 
     /**
     /**

+ 7 - 1
fs-admin/src/main/java/com/fs/his/task/Task.java

@@ -62,6 +62,7 @@ import org.springframework.beans.factory.annotation.Qualifier;
 import org.springframework.stereotype.Component;
 import org.springframework.stereotype.Component;
 
 
 import java.util.*;
 import java.util.*;
+import java.util.concurrent.CompletableFuture;
 
 
 @Slf4j
 @Slf4j
 @Component("task")
 @Component("task")
@@ -555,9 +556,14 @@ public class Task {
         if (erpOrderService !=null && erpOrderService == dfOrderService){
         if (erpOrderService !=null && erpOrderService == dfOrderService){
             orders = fsStoreOrderMapper.selectShippedOrder();
             orders = fsStoreOrderMapper.selectShippedOrder();
             if(orders!=null&& !orders.isEmpty()){
             if(orders!=null&& !orders.isEmpty()){
+                List<CompletableFuture<Void>> futures = new ArrayList<>();
                 for(FsStoreOrder order:orders){
                 for(FsStoreOrder order:orders){
-                    erpOrderService.getOrderDeliveryStatus(order);
+                    CompletableFuture<Void> future = CompletableFuture.runAsync(() -> {
+                        erpOrderService.getOrderDeliveryStatus(order);
+                    });
+                    futures.add(future);
                 }
                 }
+                CompletableFuture.allOf(futures.toArray(new CompletableFuture[0])).join();
             }
             }
         }
         }
     }
     }

+ 34 - 42
fs-service/src/main/java/com/fs/course/service/impl/FsCourseFinishTempServiceImpl.java

@@ -259,50 +259,15 @@ public class FsCourseFinishTempServiceImpl implements IFsCourseFinishTempService
 
 
             // 3. 检查是否需要更新
             // 3. 检查是否需要更新
             boolean shouldUpdate = true;
             boolean shouldUpdate = true;
-            int currentYear = Calendar.getInstance().get(Calendar.YEAR);
-
-            // Convert input dates to full YYYYMMDD format
-            String fullMonthDay = String.valueOf(currentYear) + monthDay; // becomes YYYYMMDD
-            String fullDayOfMonth = String.valueOf(currentYear) +
-                    String.format("%02d", Calendar.getInstance().get(Calendar.MONTH) + 1) +
-                    String.format("%02d", Integer.parseInt(dayOfMonth));
 
 
             for (String mark : allOldMarks) {
             for (String mark : allOldMarks) {
-                Matcher numMatcher = Pattern.compile("\\*(\\d{1,4})完").matcher(mark);
-                if (numMatcher.find()) {
-                    String numStr = numMatcher.group(1);
-                    String fullOldDate;
-
-                    if (numStr.length() <= 2) { // 处理 "*D完" 格式
-
-                        int day = Integer.parseInt(numStr);
-                        Calendar cal = Calendar.getInstance();
-                        int currentMonth = cal.get(Calendar.MONTH) + 1;
-                        int currentDay = cal.get(Calendar.DAY_OF_MONTH);
-                        int year = cal.get(Calendar.YEAR);
-
-                        // 获取上个月的最大天数
-                        int prevMonth = (currentMonth == 1) ? 12 : currentMonth - 1;
-                        int prevYear = (currentMonth == 1) ? year - 1 : year;
-                        cal.set(prevYear, prevMonth - 1, 1); // Calendar 月份是 0-based
-                        int maxDaysInPrevMonth = cal.getActualMaximum(Calendar.DAY_OF_MONTH);
-
-                        // 如果 day > 上个月的天数,说明是上个月的日期
-                        if (day > maxDaysInPrevMonth || day > currentDay + 7) {
-                            currentMonth = prevMonth;
-                            year = prevYear;
-                        }
-
-                        fullOldDate = String.format("%04d%02d%02d", year, currentMonth, day);
-
-                        // 比较日期
-                        if (Integer.parseInt(fullOldDate) >= Integer.parseInt(fullMonthDay) ||
-                                Integer.parseInt(fullOldDate) >= Integer.parseInt(fullDayOfMonth)) {
-                            shouldUpdate = false;
-                            break;
-                        }
-                    }
 
 
+                String normalizedOldMark = normalizeMarkFormat(mark);
+                // 直接比较字符串是否相等
+                if (normalizedOldMark.equals(newNotes) ||
+                        normalizedOldMark.equals(newNotesDay)) {
+                    shouldUpdate = false;
+                    break;
                 }
                 }
             }
             }
 
 
@@ -349,7 +314,7 @@ public class FsCourseFinishTempServiceImpl implements IFsCourseFinishTempService
 
 
                         break;
                         break;
                     } else {
                     } else {
-                        if (attempt==2 && (qwResult.getErrcode() == 45033 || qwResult.getErrcode()== -1 || qwResult.getErrcode()== 60020)) {
+                        if (attempt==2 && (qwResult.getErrcode() == 45033 || qwResult.getErrcode()== -1 || qwResult.getErrcode()== 60020 )) {
                             QwCourseFinishRemarkRty remarkRty=new QwCourseFinishRemarkRty();
                             QwCourseFinishRemarkRty remarkRty=new QwCourseFinishRemarkRty();
                             remarkRty.setQwUserId(externalContact.getUserId());
                             remarkRty.setQwUserId(externalContact.getUserId());
                             remarkRty.setCorpId(externalContact.getCorpId());
                             remarkRty.setCorpId(externalContact.getCorpId());
@@ -385,6 +350,33 @@ public class FsCourseFinishTempServiceImpl implements IFsCourseFinishTempService
 
 
     }
     }
 
 
+    /**
+     * 标准化标记格式,将不同格式统一为标准格式
+     * 例如: "*5完" -> "*05完", "*305完" -> "*0305完" (如果是3位数字)
+     */
+    private String normalizeMarkFormat(String mark) {
+        Matcher matcher = Pattern.compile("\\*(\\d{1,4})完").matcher(mark);
+        if (matcher.find()) {
+            String digits = matcher.group(1);
+
+            // 根据数字长度进行标准化
+            switch (digits.length()) {
+                case 1: // "*D完" -> "*0D完"
+                    return "*0" + digits + "完";
+                case 2: // "*DD完" -> 保持不变
+                    return mark;
+                case 3: // "*DDD完" -> 可能是 "*MDD完" 或 "*DDM完",统一为4位
+                    // 假设是月日格式,补零到4位 "*0MDD完"
+                    return "*0" + digits + "完";
+                case 4: // "*MMDD完" -> 保持不变
+                    return mark;
+                default:
+                    return mark;
+            }
+        }
+        return mark;
+    }
+
 //    @Override
 //    @Override
 //    public void updateFsCourseFinishTempByCompanyUserId() {
 //    public void updateFsCourseFinishTempByCompanyUserId() {
 //        List<FsCourseFinishTemp> fsCourseFinishTemps = fsCourseFinishTempMapper.selectFsCourseFinishTempByCompanyList();
 //        List<FsCourseFinishTemp> fsCourseFinishTemps = fsCourseFinishTempMapper.selectFsCourseFinishTempByCompanyList();

+ 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.setDeliveryName(proCode);
                                             order.setDeliveryCode("SF");
                                             order.setDeliveryCode("SF");
                                             order.setStatus(3);
                                             order.setStatus(3);
-                                            order.setDeliverySendTime(DateUtils.getNowDate());
+                                            order.setDeliverySendTime(DateUtils.getNowDate()); //更新发货时间
                                             fsStoreOrderMapper.updateFsStoreOrder(order);
                                             fsStoreOrderMapper.updateFsStoreOrder(order);
                                             fsStoreOrderLogsService.create(order.getOrderId(), FsStoreOrderLogEnum.DELIVERY_GOODS.getValue(), FsStoreOrderLogEnum.DELIVERY_GOODS.getDesc());
                                             fsStoreOrderLogsService.create(order.getOrderId(), FsStoreOrderLogEnum.DELIVERY_GOODS.getValue(), FsStoreOrderLogEnum.DELIVERY_GOODS.getDesc());
                                             if (order.getCompanyId() != null && order.getCompanyId() > 0) {
                                             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.FsStoreOrderItemListDVO;
 import com.fs.his.vo.FsStoreOrderItemListUVO;
 import com.fs.his.vo.FsStoreOrderItemListUVO;
 import com.fs.his.vo.FsStoreOrderItemVO;
 import com.fs.his.vo.FsStoreOrderItemVO;
+import org.apache.ibatis.annotations.Param;
 import org.apache.ibatis.annotations.Select;
 import org.apache.ibatis.annotations.Select;
 
 
 /**
 /**
@@ -72,4 +73,6 @@ public interface FsStoreOrderItemMapper
     List<FsStoreOrderItemExcelVO> selectFsStoreOrderItemExcelVOListByOrderId(Long orderId);
     List<FsStoreOrderItemExcelVO> selectFsStoreOrderItemExcelVOListByOrderId(Long orderId);
     @Select("select product_id,json_info,num from fs_store_order_item where order_id=#{orderId}")
     @Select("select product_id,json_info,num from fs_store_order_item where order_id=#{orderId}")
     List<FsStoreOrderItemListDVO> selectFsStoreOrderItemListDVOByOrderId(Long 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;
 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 lombok.Data;
 
 
+import java.math.BigDecimal;
+import java.util.List;
+
 @Data
 @Data
 public class FsStoreOrderSalesParam {
 public class FsStoreOrderSalesParam {
 
 
@@ -14,4 +20,8 @@ public class FsStoreOrderSalesParam {
     private String operator;
     private String operator;
 
 
     private Long companyId;
     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);
     Map<String,BigDecimal> selectFsStoreOrderStatistics(FsStoreOrderParam fsStoreOrder);
 
 
     String selectFsStoreOrderProductStatistics(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) {
         if (payments != null && payments.size() > 0) {
             FsStorePayment payment = payments.get(0);
             FsStorePayment payment = payments.get(0);
+            if (reMoney.compareTo(payment.getPayMoney())>0) {
+                return 0; //退款金额不能大于实际支付金额
+            }
             String json = configService.selectConfigByKey("his.pay");
             String json = configService.selectConfigByKey("his.pay");
             if (payment.getPayMode().equals("wx")) {
             if (payment.getPayMode().equals("wx")) {
                 WxPayConfig payConfig = new WxPayConfig();
                 WxPayConfig payConfig = new WxPayConfig();
@@ -481,7 +484,7 @@ public class FsStoreAfterSalesServiceImpl implements IFsStoreAfterSalesService {
                         paymentMap.setPaymentId(payment.getPaymentId());
                         paymentMap.setPaymentId(payment.getPaymentId());
                         paymentMap.setStatus(-1);
                         paymentMap.setStatus(-1);
                         paymentMap.setRefundTime(DateUtils.getNowDate());
                         paymentMap.setRefundTime(DateUtils.getNowDate());
-                        paymentMap.setRefundMoney(payment.getPayMoney());
+                        paymentMap.setRefundMoney(reMoney);
                         fsStorePaymentMapper.updateFsStorePayment(paymentMap);
                         fsStorePaymentMapper.updateFsStorePayment(paymentMap);
                     } else {
                     } else {
                         throw new CustomException("退款请求失败" + refundQueryResult.getReturnMsg());
                         throw new CustomException("退款请求失败" + refundQueryResult.getReturnMsg());
@@ -492,7 +495,7 @@ public class FsStoreAfterSalesServiceImpl implements IFsStoreAfterSalesService {
             } else if (payment.getPayMode().equals("yb")) {
             } else if (payment.getPayMode().equals("yb")) {
                 //易宝
                 //易宝
                 RefundDTO refundDTO = new RefundDTO();
                 RefundDTO refundDTO = new RefundDTO();
-                refundDTO.setRefundMoney(payment.getPayMoney().toString());
+                refundDTO.setRefundMoney(reMoney.toString());
                 refundDTO.setLowRefundNo(orderType + "-" + payment.getPayCode());
                 refundDTO.setLowRefundNo(orderType + "-" + payment.getPayCode());
                 refundDTO.setUpOrderId(payment.getTradeNo());
                 refundDTO.setUpOrderId(payment.getTradeNo());
                 com.fs.ybPay.domain.RefundResult result = payService.refund(refundDTO);
                 com.fs.ybPay.domain.RefundResult result = payService.refund(refundDTO);
@@ -502,7 +505,7 @@ public class FsStoreAfterSalesServiceImpl implements IFsStoreAfterSalesService {
                     paymentMap.setPaymentId(payment.getPaymentId());
                     paymentMap.setPaymentId(payment.getPaymentId());
                     paymentMap.setStatus(-1);
                     paymentMap.setStatus(-1);
                     paymentMap.setRefundTime(DateUtils.getNowDate());
                     paymentMap.setRefundTime(DateUtils.getNowDate());
-                    paymentMap.setRefundMoney(payment.getPayMoney());
+                    paymentMap.setRefundMoney(reMoney);
                     fsStorePaymentMapper.updateFsStorePayment(paymentMap);
                     fsStorePaymentMapper.updateFsStorePayment(paymentMap);
                 } else {
                 } else {
                     throw new CustomException("退款请求失败" + result.getMessage());
                     throw new CustomException("退款请求失败" + result.getMessage());
@@ -518,7 +521,7 @@ public class FsStoreAfterSalesServiceImpl implements IFsStoreAfterSalesService {
                 SimpleDateFormat sdf = new SimpleDateFormat("yyyyMMddHHmmss");
                 SimpleDateFormat sdf = new SimpleDateFormat("yyyyMMddHHmmss");
                 tzBankResult.setTrxSendTime(sdf.format(new Date()));
                 tzBankResult.setTrxSendTime(sdf.format(new Date()));
                 // 退款金额
                 // 退款金额
-                tzBankResult.setRefundOrdTransAmt(payment.getPayMoney().doubleValue());
+                tzBankResult.setRefundOrdTransAmt(reMoney.doubleValue());
                 TzBankResult<RefundResult> result = tzBankService.refund(tzBankResult);
                 TzBankResult<RefundResult> result = tzBankService.refund(tzBankResult);
                 logger.info("订单退款返回结果:退款订单id:" + order.getOrderId() + result);
                 logger.info("订单退款返回结果:退款订单id:" + order.getOrderId() + result);
                 if (result.getBody().getRefundOrdStatus().equals("90") || result.getBody().getRefundOrdStatus().equals("60")) {
                 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.setPaymentId(payment.getPaymentId());
                     paymentMap.setStatus(-1);
                     paymentMap.setStatus(-1);
                     paymentMap.setRefundTime(DateUtils.getNowDate());
                     paymentMap.setRefundTime(DateUtils.getNowDate());
-                    paymentMap.setRefundMoney(payment.getPayMoney());
+                    paymentMap.setRefundMoney(reMoney);
                     fsStorePaymentMapper.updateFsStorePayment(paymentMap);
                     fsStorePaymentMapper.updateFsStorePayment(paymentMap);
                 } else {
                 } else {
                     throw new CustomException("退款请求失败" + result.getRetMsg());
                     throw new CustomException("退款请求失败" + result.getRetMsg());
                 }
                 }
             } else if (payment.getPayMode().equals("hf")) {
             } else if (payment.getPayMode().equals("hf")) {
                 V2TradePaymentScanpayRefundRequest request = new V2TradePaymentScanpayRefundRequest();
                 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.setOrgReqDate(new SimpleDateFormat("yyyyMMdd").format(payment.getCreateTime()));
                 request.setReqSeqId("refund-" + payment.getPayCode());
                 request.setReqSeqId("refund-" + payment.getPayCode());
                 Map<String, Object> extendInfoMap = new HashMap<>();
                 Map<String, Object> extendInfoMap = new HashMap<>();
                 extendInfoMap.put("org_req_seq_id", orderType + "-" + payment.getPayCode());
                 extendInfoMap.put("org_req_seq_id", orderType + "-" + payment.getPayCode());
                 request.setExtendInfo(extendInfoMap);
                 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())) {
             if (StringUtils.isNotEmpty(fsStoreOrder.getExtendOrderId())) {

+ 139 - 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.domain.FsStorePaymentScrm;
 import com.fs.hisStore.mapper.FsStoreOrderScrmMapper;
 import com.fs.hisStore.mapper.FsStoreOrderScrmMapper;
 import com.fs.hisStore.mapper.FsStorePaymentScrmMapper;
 import com.fs.hisStore.mapper.FsStorePaymentScrmMapper;
+import com.fs.hisStore.param.FsStoreOrderRefundByProductParam;
 import com.fs.hisapi.domain.ApiResponse;
 import com.fs.hisapi.domain.ApiResponse;
 import com.fs.hisapi.param.CreateOrderParam;
 import com.fs.hisapi.param.CreateOrderParam;
 import com.fs.hisapi.param.RecipeDetailParam;
 import com.fs.hisapi.param.RecipeDetailParam;
@@ -3726,6 +3727,16 @@ public class FsStoreOrderServiceImpl implements IFsStoreOrderService {
                 param.setDeliveryStatus((vo.getDeliveryStatus()==null|| vo.getDeliveryStatus().isEmpty())?null:Integer.valueOf(vo.getDeliveryStatus()));
                 param.setDeliveryStatus((vo.getDeliveryStatus()==null|| vo.getDeliveryStatus().isEmpty())?null:Integer.valueOf(vo.getDeliveryStatus()));
                 param.setDeliveryType(vo.getDeliveryType().isEmpty()?null:vo.getDeliveryType());
                 param.setDeliveryType(vo.getDeliveryType().isEmpty()?null:vo.getDeliveryType());
                 param.setUpdateTime(DateUtils.getNowDate());
                 param.setUpdateTime(DateUtils.getNowDate());
+
+                //修改订单金额
+                BigDecimal payRemain = vo.getPayRemain();
+                if (payRemain != null){
+                    if (!payRemain.equals(o.getPayRemain())){
+                        BigDecimal payMoney = o.getPayMoney(); //实收金额
+                        param.setPayPrice(payMoney.add(payRemain)); //应收金额
+                        param.setPayRemain(vo.getPayRemain());
+                    }
+                }
                 fsStoreOrderMapper.updateFsStoreOrder(param);
                 fsStoreOrderMapper.updateFsStoreOrder(param);
 
 
                 successNum++;
                 successNum++;
@@ -3762,4 +3773,132 @@ public class FsStoreOrderServiceImpl implements IFsStoreOrderService {
         return fsStoreOrderMapper.selectFsStoreOrderProductStatistics(fsStoreOrder);
         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;
+    }
+
 }
 }

+ 4 - 0
fs-service/src/main/java/com/fs/his/vo/FsStoreOrderStatusExcelVO.java

@@ -3,6 +3,8 @@ package com.fs.his.vo;
 import com.fs.common.annotation.Excel;
 import com.fs.common.annotation.Excel;
 import lombok.Data;
 import lombok.Data;
 
 
+import java.math.BigDecimal;
+
 @Data
 @Data
 public class FsStoreOrderStatusExcelVO {
 public class FsStoreOrderStatusExcelVO {
 
 
@@ -12,6 +14,8 @@ public class FsStoreOrderStatusExcelVO {
     @Excel(name = "订单状态",dictType = "sys_order_status")
     @Excel(name = "订单状态",dictType = "sys_order_status")
     private String status;
     private String status;
 
 
+    @Excel(name = "物流代收金额")
+    private BigDecimal payRemain;
 
 
     /** 物流状态 */
     /** 物流状态 */
     @Excel(name = "物流状态",dictType = "sys_store_order_delivery_status")
     @Excel(name = "物流状态",dictType = "sys_store_order_delivery_status")

+ 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"/>
         <include refid="selectFsStoreOrderItemVo"/>
         where item_id = #{itemId}
         where item_id = #{itemId}
     </select>
     </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 id="insertFsStoreOrderItem" parameterType="FsStoreOrderItem" useGeneratedKeys="true" keyProperty="itemId">
         insert into fs_store_order_item
         insert into fs_store_order_item