Browse Source

订单优化

zyp 1 tháng trước cách đây
mục cha
commit
656b5c3fef
20 tập tin đã thay đổi với 532 bổ sung376 xóa
  1. 1 1
      .gitignore
  2. 1 0
      fs-admin/src/main/java/com/fs/core/config/SecurityConfig.java
  3. 14 0
      fs-admin/src/main/java/com/fs/store/controller/FsExpressController.java
  4. 1 1
      fs-common/pom.xml
  5. 1 1
      fs-common/src/main/java/com/fs/common/utils/TimeUtils.java
  6. 5 5
      fs-service-system/pom.xml
  7. 6 2
      fs-service-system/src/main/java/com/fs/kingbos/domian/KingbosOrderData.java
  8. 1 1
      fs-service-system/src/main/java/com/fs/kingbos/domian/KingbosOrderResponse.java
  9. 47 0
      fs-service-system/src/main/java/com/fs/kingbos/enums/OrderStatusEnum.java
  10. 1 1
      fs-service-system/src/main/java/com/fs/kingbos/service/K9OrderService.java
  11. 153 57
      fs-service-system/src/main/java/com/fs/kingbos/service/impl/K9OrderServiceImpl.java
  12. 43 0
      fs-service-system/src/main/java/com/fs/store/dto/ExpressResultDTO.java
  13. 10 1
      fs-service-system/src/main/java/com/fs/store/service/IFsStoreOrderService.java
  14. 3 3
      fs-service-system/src/main/java/com/fs/store/service/impl/FsStoreAfterSalesServiceImpl.java
  15. 4 4
      fs-service-system/src/main/java/com/fs/store/service/impl/FsStoreCartServiceImpl.java
  16. 29 44
      fs-service-system/src/main/java/com/fs/store/service/impl/FsStoreOrderServiceImpl.java
  17. 3 93
      fs-user-app/src/main/java/com/fs/app/controller/PayController.java
  18. 25 59
      fs-user-app/src/main/java/com/fs/app/controller/StoreOrderController.java
  19. 183 102
      fs-user-app/src/main/java/com/fs/app/controller/WxUserController.java
  20. 1 1
      fs-user-app/src/main/resources/application.yml

+ 1 - 1
.gitignore

@@ -6,7 +6,7 @@ target/
 !**/src/main/**/target/
 !**/src/test/**/target/
 #*.yml
-logback.xml
+#logback.xml
 
 ### STS ###
 .apt_generated

+ 1 - 0
fs-admin/src/main/java/com/fs/core/config/SecurityConfig.java

@@ -114,6 +114,7 @@ public class SecurityConfig extends WebSecurityConfigurerAdapter
 //                .antMatchers("/hwcloud/upload/progress").anonymous()
                 .antMatchers("/common/uploadHuaWeiObs").anonymous()
 //                .antMatchers("/hwcloud/upload/videoUrl").anonymous()
+                .antMatchers("/store/express/expressNotify").anonymous()
                 .antMatchers("/common/uploadWang").anonymous()
                 .antMatchers("/common/upload").anonymous()
                 .antMatchers("/profile/**").anonymous()

+ 14 - 0
fs-admin/src/main/java/com/fs/store/controller/FsExpressController.java

@@ -5,6 +5,10 @@ import java.util.List;
 import com.fs.common.core.domain.R;
 import com.fs.company.domain.Company;
 import com.fs.company.service.ICompanyService;
+import com.fs.store.dto.ExpressNotifyDTO;
+import com.fs.store.dto.ExpressResultDTO;
+import com.fs.store.service.IFsStoreOrderService;
+import io.swagger.annotations.ApiOperation;
 import org.springframework.security.access.prepost.PreAuthorize;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.web.bind.annotation.GetMapping;
@@ -40,6 +44,9 @@ public class FsExpressController extends BaseController
     @Autowired
     private ICompanyService companyService;
 
+    @Autowired
+    private IFsStoreOrderService orderService;
+
     /**
      * 查询快递公司列表
      */
@@ -131,4 +138,11 @@ public class FsExpressController extends BaseController
         List<Long> list = companyService.selectCompanyByOmsCode(omsCode);
         return R.ok().put("data2",list);
     }
+
+    @ApiOperation("物流信息回调")
+    @PostMapping(path = "/expressNotify" )
+    public ExpressResultDTO expressNotify(ExpressNotifyDTO notifyDTO) throws Exception
+    {
+        return orderService.updateDeliveryItem(notifyDTO);
+    }
 }

+ 1 - 1
fs-common/pom.xml

@@ -117,7 +117,7 @@
         <dependency>
             <groupId>cn.hutool</groupId>
             <artifactId>hutool-all</artifactId>
-            <version>5.3.3</version>
+            <version>5.8.22</version> <!-- 强制指定最新版本 -->
         </dependency>
         <dependency>
             <groupId>org.projectlombok</groupId>

+ 1 - 1
fs-common/src/main/java/com/fs/common/utils/TimeUtils.java

@@ -230,7 +230,7 @@ public class TimeUtils
         }
 
         public Map<String, Object> toMap() {
-            return BeanUtil.beanToMap(this);
+            return BeanUtil.beanToMap(this, false, true);
         }
 
         public String getSqlDateFormat() {

+ 5 - 5
fs-service-system/pom.xml

@@ -40,11 +40,11 @@
             <version>1.5.21</version>
         </dependency>
 
-        <dependency>
-            <groupId>cn.hutool</groupId>
-            <artifactId>hutool-all</artifactId>
-            <version>5.3.7</version>
-        </dependency>
+<!--        <dependency>-->
+<!--            <groupId>cn.hutool</groupId>-->
+<!--            <artifactId>hutool-all</artifactId>-->
+<!--            <version>5.3.7</version>-->
+<!--        </dependency>-->
         <!-- oss -->
         <dependency>
             <groupId>com.qiniu</groupId>

+ 6 - 2
fs-service-system/src/main/java/com/fs/kingbos/domian/KingbosOrderData.java

@@ -13,7 +13,7 @@ public class KingbosOrderData {
     // 订单来源
     private String cordersource;
     // 订单下单时间
-    private Date dorder_date;
+    private String dorder_date;
     // 店铺买家编号
     private String cshop_buyer_id;
     // 平台类型
@@ -41,7 +41,7 @@ public class KingbosOrderData {
     // 物流成本
     private BigDecimal fpostcost;
     // 最后更新时间
-    private Date dmodified;
+    private String dmodified;
     // 收件人(省)
     private String creceiver_state;
     // 收件人(城市)
@@ -64,4 +64,8 @@ public class KingbosOrderData {
     private String cwarehouse_code;
     // 仓库名称
     private String cwarehouse_name;
+    //货到付款
+    private Integer bis_cod;
+    //代收金额
+    private BigDecimal fshouldpaymoney;
 }

+ 1 - 1
fs-service-system/src/main/java/com/fs/kingbos/domian/KingbosOrderResponse.java

@@ -4,7 +4,7 @@ import lombok.Data;
 
 @Data
 public class KingbosOrderResponse {
-    private Boolean isSuccess; //true:请求成功;false:请求失败;
+    private Boolean IsSuccess; //true:请求成功;false:请求失败;
     private String cbilid; //平台单号
     private String errmsg;  //错误信息
 }

+ 47 - 0
fs-service-system/src/main/java/com/fs/kingbos/enums/OrderStatusEnum.java

@@ -0,0 +1,47 @@
+package com.fs.kingbos.enums;
+
+
+import lombok.AllArgsConstructor;
+import lombok.Getter;
+import lombok.NoArgsConstructor;
+
+
+@Getter
+@NoArgsConstructor
+@AllArgsConstructor
+public enum OrderStatusEnum {
+
+    /**
+     * 发货失败
+     */
+    FAILURE("Failure", "发货失败"),
+
+    /**
+     * 未发货
+     */
+    NO_DELIVERED("NoDelivered", "未发货"),
+
+    /**
+     * 发货中
+     */
+    DELIVERING("Delivering", "发货中"),
+
+    /**
+     * 已发货
+     */
+    SENT("Sent", "已发货"),
+
+    /**
+     * 已取消
+     */
+    CANCELLED("Cancelled", "已取消"),
+
+    /**
+     * 已退货
+     */
+    RETURN("Return", "已退货");
+
+    private String code;
+    private String desc;
+
+}

+ 1 - 1
fs-service-system/src/main/java/com/fs/kingbos/service/K9OrderService.java

@@ -11,5 +11,5 @@ public interface K9OrderService {
 
     KingbosOrderResponse refundOrder(KingbosRefundOrderRequest request);
 
-    void createOmsOrder(Long orderId) throws ParseException;
+    void createOmsOrder(Long orderId,String orderStatus);
 }

+ 153 - 57
fs-service-system/src/main/java/com/fs/kingbos/service/impl/K9OrderServiceImpl.java

@@ -5,8 +5,10 @@ import cn.hutool.http.HttpUtil;
 import cn.hutool.json.JSONObject;
 import cn.hutool.json.JSONUtil;
 import com.fs.common.config.FSSysConfig;
+import com.fs.common.exception.ServiceException;
 import com.fs.common.utils.StringUtils;
 import com.fs.kingbos.domian.*;
+import com.fs.kingbos.enums.OrderStatusEnum;
 import com.fs.kingbos.service.K9OrderService;
 import com.fs.kingbos.util.SignUtil;
 import com.fs.kingbos.util.UrlUtil;
@@ -16,19 +18,28 @@ import com.fs.store.dto.FsStoreCartDTO;
 import com.fs.store.mapper.FsStoreOrderMapper;
 import com.fs.store.mapper.FsStoreProductMapper;
 import com.fs.store.service.IFsStoreOrderItemService;
+import lombok.extern.slf4j.Slf4j;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.stereotype.Service;
 import org.springframework.transaction.annotation.Transactional;
 
+
 import java.math.BigDecimal;
 import java.text.ParseException;
+import java.text.SimpleDateFormat;
 import java.util.ArrayList;
+import java.util.Arrays;
 import java.util.Date;
 import java.util.List;
+import java.util.stream.Collectors;
+
+import static com.fs.kingbos.enums.OrderStatusEnum.CANCELLED;
+import static com.fs.kingbos.enums.OrderStatusEnum.NO_DELIVERED;
 
 @Service
+@Slf4j
 public class K9OrderServiceImpl implements K9OrderService {
     public final static Logger logger = LoggerFactory.getLogger(K9OrderServiceImpl.class);
     @Autowired
@@ -46,11 +57,12 @@ public class K9OrderServiceImpl implements K9OrderService {
         param.set("data", request.getData());
         param.set("d1_data", request.getD1_data());
         String timeStep = System.currentTimeMillis() + "";
+        logger.info("zyp \n【金博网络订单推送参数】:"+param);
         String sign = SignUtil.sign(param.toString(),sysConfig.getKingbosSecret(), sysConfig.getKingbosan(), timeStep);
         String url = UrlUtil.getUrl(sysConfig.getKingbosUrl(),sign, timeStep);
         String json = param.toString();
         String result = HttpUtil.post(url, json);
-        logger.info("zyp \n【金博网络订单】:"+result);
+        logger.info("zyp \n【金博网络订单推送返回】:"+result);
         KingbosOrderResponse response = JSONUtil.toBean(result, KingbosOrderResponse.class);
         return response;
     }
@@ -74,79 +86,163 @@ public class K9OrderServiceImpl implements K9OrderService {
 
     @Override
     @Transactional
-    public void createOmsOrder(Long orderId) throws ParseException {
-        FsStoreOrder order=fsStoreOrderMapper.selectFsStoreOrderById(orderId);
-        if(StringUtils.isEmpty(order.getExtendOrderId())&&order.getStatus()!=1){
-            return;
+    public void createOmsOrder(Long orderId,String orderStatus){
+        logger.info("【金博网络订单】开始创建订单,订单ID: {}", orderId);
+        try {
+            // 1. 获取订单信息并验证
+            FsStoreOrder order = fsStoreOrderMapper.selectFsStoreOrderById(orderId);
+            logger.info("【金博网络订单】订单信息获取成功,订单号: {}", order.getOrderCode());
+
+            // 2. 构建金博订单数据
+            KingbosOrderData data = buildKingbosOrderData(order,orderStatus);
+            logger.info("【金博网络订单】订单数据构建完成,金博订单号: {}", data.getCo_id());
+
+            // 3. 构建订单明细数据
+            List<KingbosOrderD1Data> d1Datas = buildOrderDetailData(order, data.getCdo_id());
+            logger.info("【金博网络订单】订单明细数据构建完成,明细数量: {}", d1Datas.size());
+
+            // 4. 发送订单请求
+            KingbosOrderResponse response = sendOrderRequest(data, d1Datas);
+            if (response.getIsSuccess()){
+                FsStoreOrder order1 = new FsStoreOrder();
+                order1.setId(order.getId());
+                order1.setExtendOrderId(response.getCbilid());
+                fsStoreOrderMapper.updateFsStoreOrder(order1);
+                logger.info("【金博网络订单】订单创建完成,订单ID: {}", orderId);
+            }else {
+                logger.error("【金博网络订单】创建订单失败,订单ID: {}, 错误信息: {}", orderId, response.getErrmsg());
+            }
+        } catch (Exception e) {
+            logger.error("【金博网络订单】创建订单失败,订单ID: {}, 错误信息: {}", orderId, e.getMessage(), e);
+            throw e;
         }
-        //组装金博data
+    }
+
+
+    private KingbosOrderData buildKingbosOrderData(FsStoreOrder order,String orderStatus) {
+        logger.debug("【金博网络订单】开始构建订单数据,订单号: {}", order.getOrderCode());
         KingbosOrderData data = new KingbosOrderData();
-        data.setCordersource("中康未来智慧药房");
-        data.setDorder_date(order.getCreateTime());
-        data.setCshop_buyer_id("zkwlzhyf100");//传固定值不可变
-        data.setCplatformtype("zkwlzhyfminiapp");
-        data.setCshop_id("zkwlzhyf2024");//中康未来智慧药房
-        data.setCshop_name("中康未来智慧药房");
+        // 设置基础信息
+        data.setCordersource("MALL");
+        SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
+        data.setDorder_date(sdf.format(order.getCreateTime()));
+//        data.setCshop_buyer_id("zk2025");
+        data.setCplatformtype("99");
+        data.setCshop_id("zk2025");
+        data.setCshop_name("自建商城");
+        String orderSn = "";
+        // 设置订单编号
+        if (orderStatus.equals(NO_DELIVERED.getCode())){
+            orderSn= IdUtil.getSnowflake(0, 0).nextIdStr();
+        }else if (orderStatus.equals(CANCELLED.getCode())){
+            orderSn = order.getExtendOrderId();
+        }
+
         data.setCso_id(order.getOrderCode());
-        String orderSn = IdUtil.getSnowflake(0, 0).nextIdStr();
         data.setCo_id(orderSn);
         data.setCdo_id(orderSn);
+
+        // 设置金额信息
         data.setFpay_amount(order.getPayPrice());
         data.setFpaid_amount(order.getPayMoney());
         data.setFfreight(order.getTotalPostage());
         data.setFfree_amount(order.getCouponPrice());
-        data.setCstatus("待发货");
         data.setFpostcost(BigDecimal.ZERO);
-        data.setDmodified(new Date());
-        String[] address=order.getUserAddress().split(" ");
+
+        // 设置状态和时间
+        data.setCstatus(orderStatus);//未发货
+        data.setDmodified(sdf.format(order.getUpdateTime()));
+
+        // 设置收货信息
+        setReceiverInfo(data, order);
+
+        // 设置仓库信息
+        data.setCwarehouse_code(sysConfig.getCwarehouseCode());
+        data.setCwarehouse_name(sysConfig.getCwarehouseName());
+
+        // 设置货到付款信息
+        if (!order.getPayType().equals("1")) {
+            data.setBis_cod(1);
+            data.setFshouldpaymoney(order.getDeliveryPayMoney());
+        }
+
+        return data;
+    }
+
+    private void setReceiverInfo(KingbosOrderData data, FsStoreOrder order) {
+        logger.debug("【金博网络订单】开始处理收货信息,订单号: {}", order.getOrderCode());
+        String[] address = order.getUserAddress().split(" ");
+        if (address.length < 3) {
+            logger.error("【金博网络订单】收货地址格式不正确,订单号: {}, 地址: {}", order.getOrderCode(), order.getUserAddress());
+            throw new ServiceException("收货地址格式不正确");
+        }
+
         data.setCreceiver_state(address[0]);
         data.setCreceiver_city(address[1]);
         data.setCreceiver_district(address[2]);
-        //处理地址多空隔问题
-        if(address.length>3){
-            StringBuffer addrs=new StringBuffer();
-            for(int i=3;i<address.length;i++){
-                addrs.append(address[i]);
-            }
-            data.setCreceiver_address(addrs.toString());
-        }
-        else if(address.length==3){
-            data.setCreceiver_address(address[2]);
-        }
-        //处理地址字符问题
-        data.setCreceiver_address(data.getCreceiver_address().replace("+","加"));
-        data.setCreceiver_address(data.getCreceiver_address().replace("\n",""));
+
+        // 处理详细地址
+        String detailAddress = address.length > 3 ?
+            String.join("", Arrays.copyOfRange(address, 3, address.length)) :
+            address[2];
+
+        // 处理特殊字符
+        detailAddress = detailAddress.replace("+", "加")
+                                   .replace("\n", "");
+
+        data.setCreceiver_address(detailAddress);
         data.setCreceiver_name(order.getRealName());
         data.setCreceiver_mobile(order.getUserPhone());
-        data.setCexpress_name(order.getDeliveryName());
-        data.setCexpress_code("SF");
-        data.setCwarehouse_code(sysConfig.getCwarehouseCode());
-        data.setCwarehouse_name(sysConfig.getCwarehouseName());
-        List<KingbosOrderD1Data> d1Datas = new ArrayList<>();
-        FsStoreOrderItem itemMap=new FsStoreOrderItem();
-        itemMap.setOrderId(order.getId());
-        List<FsStoreOrderItem> orderItems=storeOrderItemService.selectFsStoreOrderItemList(itemMap);
-        for (FsStoreOrderItem orderItem: orderItems){
-            FsStoreCartDTO cartDTO= JSONUtil.toBean(orderItem.getJsonInfo(),FsStoreCartDTO.class);
-            KingbosOrderD1Data item = new KingbosOrderD1Data();
-            item.setCdo_id(data.getCdo_id());
-            item.setCo_id(data.getCo_id());
-            item.setCsku_id(cartDTO.getBarCode());
-            item.setCgoodsid(cartDTO.getBarCode());
-            item.setCname(cartDTO.getProductName());
-            item.setCshop_sku_id(cartDTO.getBarCode());
-            item.setIqty(new BigDecimal(orderItem.getNum()));
-            item.setFprice(cartDTO.getPrice());
-            item.setFamount(new BigDecimal(orderItem.getNum()).multiply(cartDTO.getPrice()));
-            item.setCordersource(data.getCordersource());
-            item.setIsreturn(0);
-            item.setFpromoamount(BigDecimal.ZERO);
-            d1Datas.add(item);
-        }
+
+    }
+
+    private List<KingbosOrderD1Data> buildOrderDetailData(FsStoreOrder order, String orderId) {
+        logger.debug("【金博网络订单】开始构建订单明细,订单号: {}", order.getOrderCode());
+        FsStoreOrderItem query = new FsStoreOrderItem();
+        query.setOrderId(order.getId());
+        List<FsStoreOrderItem> orderItems = storeOrderItemService.selectFsStoreOrderItemList(query);
+
+        List<KingbosOrderD1Data> d1Datas = orderItems.stream()
+            .map(item -> buildOrderDetailItem(item, orderId))
+            .collect(Collectors.toList());
+
+        logger.debug("【金博网络订单】订单明细构建完成,订单号: {}, 明细数量: {}", order.getOrderCode(), d1Datas.size());
+        return d1Datas;
+    }
+
+    private KingbosOrderD1Data buildOrderDetailItem(FsStoreOrderItem orderItem, String orderId) {
+        FsStoreCartDTO cartDTO = JSONUtil.toBean(orderItem.getJsonInfo(), FsStoreCartDTO.class);
+        BigDecimal quantity = new BigDecimal(orderItem.getNum());
+
+        KingbosOrderD1Data item = new KingbosOrderD1Data();
+        item.setCdo_id(orderId);
+        item.setCo_id(orderId);
+        item.setCsku_id(cartDTO.getBarCode());
+        item.setCgoodsid(cartDTO.getBarCode());
+        item.setCname(cartDTO.getProductName());
+        item.setCshop_sku_id(cartDTO.getSku());
+        item.setIqty(quantity);
+        item.setFprice(cartDTO.getPrice());
+        item.setFamount(quantity.multiply(cartDTO.getPrice()));
+        item.setCordersource("MALL");
+        item.setFpromoamount(BigDecimal.ZERO);
+
+        return item;
+    }
+
+    private KingbosOrderResponse sendOrderRequest(KingbosOrderData data, List<KingbosOrderD1Data> d1Datas) {
+        logger.info("【金博网络订单】开始发送订单请求,金博订单号: {}", data.getCo_id());
         KingbosOrderRequest request = new KingbosOrderRequest();
         request.setData(data);
         request.setD1_data(d1Datas);
-        KingbosOrderResponse response = this.addOrder(request);
-        logger.info("\n【金博网络订单】: addOrder  res:{}", response);
+
+        try {
+            KingbosOrderResponse response = this.addOrder(request);
+            logger.info("【金博网络订单】订单请求发送成功,金博订单号: {}, 响应结果: {}", data.getCo_id(), response);
+            return response;
+        } catch (Exception e) {
+            logger.error("【金博网络订单】订单请求发送失败,金博订单号: {}, 错误信息: {}", data.getCo_id(), e.getMessage(), e);
+            throw e;
+        }
     }
 }

+ 43 - 0
fs-service-system/src/main/java/com/fs/store/dto/ExpressResultDTO.java

@@ -0,0 +1,43 @@
+package com.fs.store.dto;
+
+import java.time.LocalDateTime;
+import java.time.format.DateTimeFormatter;
+import java.util.HashMap;
+
+
+public class ExpressResultDTO extends HashMap<String, Object> {
+    private static final long serialVersionUID = 1L;
+
+    public ExpressResultDTO() {
+
+    }
+
+    private static String getCurrentTimeString() {
+        DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss");
+        return LocalDateTime.now().format(formatter);
+    }
+
+    public static ExpressResultDTO success(String EBusinessID) {
+        ExpressResultDTO result = new ExpressResultDTO();
+        result.put("EBusinessID", EBusinessID);
+        result.put("UpdateTime", getCurrentTimeString());
+        result.put("Success", true);
+        result.put("Reason", "");
+        return result;
+    }
+
+    public static ExpressResultDTO error(String EBusinessID, String reason) {
+        ExpressResultDTO result = new ExpressResultDTO();
+        result.put("EBusinessID", EBusinessID);
+        result.put("UpdateTime", getCurrentTimeString());
+        result.put("Success", false);
+        result.put("Reason", reason);
+        return result;
+    }
+
+    @Override
+    public ExpressResultDTO put(String key, Object value) {
+        super.put(key, value);
+        return this;
+    }
+}

+ 10 - 1
fs-service-system/src/main/java/com/fs/store/service/IFsStoreOrderService.java

@@ -13,6 +13,7 @@ import com.fs.company.domain.CompanyUser;
 import com.fs.erp.domain.ErpOrder;
 import com.fs.store.domain.FsStoreOrder;
 import com.fs.store.dto.ExpressNotifyDTO;
+import com.fs.store.dto.ExpressResultDTO;
 import com.fs.store.dto.FsStoreOrderComputeDTO;
 import com.fs.store.dto.StoreOrderExpressExportDTO;
 import com.fs.store.param.*;
@@ -196,10 +197,18 @@ public interface IFsStoreOrderService
 
     int uploadItemJson(FsStoreOrder order);
 
-    void updateDeliveryItem(ExpressNotifyDTO notifyDTO);
+    ExpressResultDTO updateDeliveryItem(ExpressNotifyDTO notifyDTO);
 
     FsStoreOrder selectOrderByUserIdLimit1(Long userId);
 
 
     List<FsStoreOrder> selectFsStoreOrderStatisticsByUserId(List<Long> fsUserIdList);
+
+
+    /**
+     * 完成订单
+     * @param orderId 订单id
+     * @return R
+     */
+    R finishStoreOrder(Long orderId);
 }

+ 3 - 3
fs-service-system/src/main/java/com/fs/store/service/impl/FsStoreAfterSalesServiceImpl.java

@@ -198,9 +198,9 @@ public class FsStoreAfterSalesServiceImpl implements IFsStoreAfterSalesService
         if(order.getStatus()==0){
             return R.error("未支付订单不能申请售后");
         }
-//        if(StringUtils.isEmpty(order.getExtendOrderId())){
-//            return R.error("仓库未生成订单,暂时不能申请退款,请联系客服");
-//        }
+        if(StringUtils.isEmpty(order.getExtendOrderId())){
+            return R.error("仓库未生成订单,暂时不能申请退款,请联系客服");
+        }
         if(order.getStatus()== OrderInfoEnum.STATUS_NE3.getValue()){
             return R.error("已取消订单不能申请售后");
         }

+ 4 - 4
fs-service-system/src/main/java/com/fs/store/service/impl/FsStoreCartServiceImpl.java

@@ -143,7 +143,7 @@ public class FsStoreCartServiceImpl implements IFsStoreCartService
                     .isBuy(cartParam.getIsBuy())
                     .build();
             storeCart.setCreateTime(new Date());
-            checkProductStock(cartParam.getProductId(),storeCart.getProductAttrValueId());
+//            checkProductStock(cartParam.getProductId(),storeCart.getProductAttrValueId());
             fsStoreCartMapper.insertFsStoreCart(storeCart);
             return R.ok().put("id",storeCart.getId());
 
@@ -169,7 +169,7 @@ public class FsStoreCartServiceImpl implements IFsStoreCartService
                         .isBuy(0)
                         .build();
                 storeCart.setCreateTime(new Date());
-                checkProductStock(cartParam.getProductId(),storeCart.getProductAttrValueId());
+//                checkProductStock(cartParam.getProductId(),storeCart.getProductAttrValueId());
                 fsStoreCartMapper.insertFsStoreCart(storeCart);
                 return R.ok().put("id",storeCart.getId());
             }
@@ -177,7 +177,7 @@ public class FsStoreCartServiceImpl implements IFsStoreCartService
                 storeCart=cart.get(0);
                 storeCart.setCartNum(cartParam.getCartNum() + cart.get(0).getCartNum());
                 storeCart.setUpdateTime(new Date());
-                checkProductStock(cartParam.getProductId(),storeCart.getProductAttrValueId());
+//                checkProductStock(cartParam.getProductId(),storeCart.getProductAttrValueId());
                 fsStoreCartMapper.updateFsStoreCart(storeCart);
                 return R.ok().put("id",storeCart.getId());
             }
@@ -199,7 +199,7 @@ public class FsStoreCartServiceImpl implements IFsStoreCartService
     @Override
     public R changeNum(long userId, FsStoreCartNumParam cartParam) {
         FsStoreCart cart=fsStoreCartMapper.selectFsStoreCartById(cartParam.getId());
-        checkProductStock(cart.getProductId(),cart.getProductAttrValueId());
+//        checkProductStock(cart.getProductId(),cart.getProductAttrValueId());
         cart.setCartNum(cartParam.getNumber());
         cart.setUpdateTime(new Date());
         fsStoreCartMapper.updateFsStoreCart(cart);

Những thai đổi đã bị hủy bỏ vì nó quá lớn
+ 29 - 44
fs-service-system/src/main/java/com/fs/store/service/impl/FsStoreOrderServiceImpl.java


+ 3 - 93
fs-user-app/src/main/java/com/fs/app/controller/PayController.java

@@ -5,7 +5,6 @@ import com.alibaba.fastjson.JSON;
 import com.fs.common.config.FSSysConfig;
 import com.fs.common.core.controller.BaseController;
 import com.fs.common.core.redis.RedisCache;
-import com.fs.common.exception.CustomException;
 import com.fs.company.service.ICompanyService;
 import com.fs.company.service.ICompanyUserService;
 import com.fs.erp.service.IErpOrderService;
@@ -14,22 +13,18 @@ import com.fs.pay.pay.domain.OrderCallback;
 import com.fs.pay.pay.domain.OrderResult;
 import com.fs.pay.pay.dto.OrderQueryDTO;
 import com.fs.pay.pay.service.PayService;
-import com.fs.pay.pay.service.impl.PayApiServiceImpl;
 import com.fs.pay.pay.util.PayUtil;
-import com.fs.store.domain.*;
-import com.fs.store.enums.*;
-import com.fs.store.service.*;
 import com.fs.pay.service.dto.PayNotifyDTO;
 import com.fs.pay.service.dto.RefundNotifyDTO;
 import com.fs.pay.service.dto.TradeOrder;
+import com.fs.store.domain.FsStorePayment;
+import com.fs.store.service.*;
 import io.swagger.annotations.Api;
 import io.swagger.annotations.ApiOperation;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.context.ApplicationEventPublisher;
-import org.springframework.transaction.annotation.Transactional;
-import org.springframework.transaction.interceptor.TransactionAspectSupport;
 import org.springframework.web.bind.annotation.*;
 
 import javax.servlet.http.HttpServletRequest;
@@ -86,7 +81,7 @@ public class PayController {
         //验证
         HuiFuResult o = JSON.parseObject(resp_data, HuiFuResult.class);
         logger.info("汇付支付回调:"+o);
-        if(o.getResp_code().equals("00000000")){
+        if(o.getResp_code().equals("00000000") && o.getNotify_type().equals("1")){
             String[] order=o.getReq_seq_id().split("-");
             switch (order[0]) {
                 case "store":
@@ -127,89 +122,4 @@ public class PayController {
 
 
 
-    @ApiOperation("小雨点第三方支付回调")
-    @PostMapping(value="/payNotify")
-    public String payNotify(HttpServletRequest request,PayNotifyDTO dto) throws Exception {
-            if("SUCCESS".equals(dto.getOrderStatus())) {
-                //订单号
-                String tradeNo = dto.getMerchOrderNo();
-                List<TradeOrder> tradeOrders= JSON.parseArray(dto.getTradeOrders(),TradeOrder.class);
-                if(tradeOrders!=null&&tradeOrders.size()>0){
-                    for(TradeOrder tradeOrder:tradeOrders){
-                        String[] order=tradeOrder.getSubMerchOrderNo().split("-");
-                        switch (order[0]) {
-                            case "store":
-                                orderService.payConfirm(1,null,order[1], tradeNo,dto.getBankTransactionId(),dto.getBankSerialNo());
-                                return "success";
-                            case "store_remain":
-                                orderService.payRemainConfirm( order[1], tradeNo,dto.getBankTransactionId(),dto.getBankSerialNo());
-                                return "success";
-                            case "payment":
-                                return storePaymentService.payConfirm(order[1], tradeNo,dto.getBankTransactionId(),dto.getBankSerialNo());
-                        }
-                    }
-                }
-            }
-            return "success";
-    }
-    @ApiOperation("小雨点第三方退款回调")
-    @PostMapping(value="/refundNotify")
-    public String refundNotify(HttpServletRequest request, RefundNotifyDTO dto) throws Exception {
-        if("SUCCESS".equals(dto.getOrderStatus())) {
-            String[] orderIds=dto.getOrigMerchOrderNo().split("-");
-            FsStorePayment storePayment=null;
-            switch (orderIds[0]) {
-                case "store":
-                    storePayment=storePaymentService.selectFsStorePaymentByCode(orderIds[1]);
-                    if(storePayment!=null){
-                        storePayment.setRefundMoney(BigDecimal.valueOf(Double.parseDouble(dto.getAmount())));
-                        storePayment.setStatus(-1);
-                        storePayment.setRefundTime(new Date());
-                        storePaymentService.updateFsStorePayment(storePayment);
-                    }
-                    return "success";
-                case "store_remain":
-                    storePayment=storePaymentService.selectFsStorePaymentByCode(orderIds[1]);
-                    if(storePayment!=null){
-                        storePayment.setRefundMoney(BigDecimal.valueOf(Double.parseDouble(dto.getAmount())));
-                        storePayment.setStatus(-1);
-                        storePayment.setRefundTime(new Date());
-                        storePaymentService.updateFsStorePayment(storePayment);
-                    }
-                    return "success";
-                case "doctor":
-                   return "success";
-                case "payment":
-                    storePaymentService.refund(orderIds[1]);
-                    return "success";
-            }
-            return "success";
-        }
-        return "success";
-    }
-
-
-//    @Transactional
-//    public String paymentOp(String payCode,String tradeNo,String bankTransactionId,String bankSerialNo) {
-//
-//        //更新订单状态
-//        FsStorePayment storePayment=storePaymentService.selectFsStorePaymentByCode(payCode);
-//        if(!storePayment.getStatus().equals(0)){
-//            return "";
-//        }
-//        storePayment.setStatus(1);
-//        storePayment.setPayTime(new Date());
-//        storePayment.setTradeNo(tradeNo);
-//        storePayment.setBankSerialNo(bankSerialNo);
-//        storePayment.setBankTransactionId(bankTransactionId);
-//        storePaymentService.updateFsStorePayment(storePayment);
-//        //增加佣金
-//        if(storePayment.getCompanyId()!=null&&storePayment.getCompanyId()>0){
-//            companyService.addCompanyPaymentMoney(storePayment);
-//        }
-//        return "success";
-//
-//    }
-
-
 }

+ 25 - 59
fs-user-app/src/main/java/com/fs/app/controller/StoreOrderController.java

@@ -2,41 +2,30 @@ package com.fs.app.controller;
 
 import cn.binarywang.wx.miniapp.api.WxMaService;
 import cn.binarywang.wx.miniapp.bean.WxMaJscode2SessionResult;
-
 import cn.hutool.core.util.IdUtil;
 import cn.hutool.core.util.ObjectUtil;
 import cn.hutool.json.JSONUtil;
 import com.alibaba.fastjson.JSON;
 import com.alibaba.fastjson.TypeReference;
 import com.fs.app.annotation.Login;
-import com.fs.common.annotation.Log;
-import com.fs.common.annotation.RepeatSubmit;
-
 import com.fs.common.config.FSSysConfig;
 import com.fs.common.core.domain.R;
-import com.fs.common.enums.BusinessType;
 import com.fs.common.exception.CustomException;
-import com.fs.common.utils.*;
+import com.fs.common.utils.IpUtil;
+import com.fs.common.utils.ParseUtils;
+import com.fs.common.utils.ServletUtils;
+import com.fs.common.utils.StringUtils;
 import com.fs.common.utils.ip.IpUtils;
+import com.fs.erp.service.IErpOrderService;
 import com.fs.huifuPay.domain.HuiFuCreateOrder;
 import com.fs.huifuPay.domain.HuifuCreateOrderResult;
 import com.fs.huifuPay.service.HuiFuService;
-import com.fs.pay.pay.config.PayConfig;
-import com.fs.pay.pay.domain.CreateWxOrderResult;
 import com.fs.pay.pay.domain.OrderResult;
 import com.fs.pay.pay.dto.OrderQueryDTO;
-import com.fs.pay.pay.dto.WxJspayDTO;
 import com.fs.pay.pay.service.PayService;
-import com.fs.pay.pay.service.impl.PayApiServiceImpl;
-import com.fs.pay.service.dto.PayQueryDTO;
-import com.fs.store.domain.*;
-import com.fs.system.domain.SysConfig;
-import com.fs.wx.miniapp.config.WxMaConfiguration;
-import com.fs.wx.miniapp.config.WxMaProperties;
-import com.fs.wx.pay.config.WxPayProperties;
-import com.fs.erp.service.IErpOrderService;
+import com.fs.pay.service.IPayService;
 import com.fs.store.config.StoreConfig;
-
+import com.fs.store.domain.*;
 import com.fs.store.dto.FsStoreOrderComputeDTO;
 import com.fs.store.enums.OrderInfoEnum;
 import com.fs.store.mapper.FsStorePaymentMapper;
@@ -44,26 +33,20 @@ import com.fs.store.param.*;
 import com.fs.store.service.*;
 import com.fs.store.vo.FsMyStoreOrderListQueryVO;
 import com.fs.store.vo.FsStoreOrderItemVO;
-import com.fs.pay.service.IPayService;
-import com.fs.pay.service.dto.CreatePayDTO;
-import com.fs.pay.service.dto.PayDTO;
-import com.fs.pay.service.dto.TradeOrder;
 import com.fs.system.service.ISysConfigService;
-import com.github.binarywang.wxpay.bean.entpay.EntPayResult;
+import com.fs.wx.miniapp.config.WxMaConfiguration;
+import com.fs.wx.miniapp.config.WxMaProperties;
+import com.fs.wx.pay.config.WxPayProperties;
 import com.github.binarywang.wxpay.bean.order.WxPayMpOrderResult;
 import com.github.binarywang.wxpay.bean.request.WxPayUnifiedOrderRequest;
 import com.github.binarywang.wxpay.config.WxPayConfig;
 import com.github.binarywang.wxpay.exception.WxPayException;
-import com.github.binarywang.wxpay.service.EntPayService;
 import com.github.binarywang.wxpay.service.WxPayService;
 import com.github.pagehelper.PageHelper;
 import com.github.pagehelper.PageInfo;
-import com.google.gson.Gson;
 import io.swagger.annotations.Api;
 import io.swagger.annotations.ApiOperation;
-import lombok.Synchronized;
 import me.chanjar.weixin.common.error.WxErrorException;
-import org.apache.catalina.servlets.DefaultServlet;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 import org.springframework.beans.factory.annotation.Autowired;
@@ -78,8 +61,6 @@ import java.util.*;
 import java.util.concurrent.TimeUnit;
 
 
-
-
 @Api("商城接口")
 @RestController
 @RequestMapping(value="/app/storeOrder")
@@ -241,7 +222,6 @@ public class StoreOrderController extends  AppBaseController {
     //@Synchronized
     public R pay(HttpServletRequest request, @Validated @RequestBody FsStoreOrderPayParam param)
     {
-        logger.info("zzf \n【pay】:"+param.getOrderId()+"的订单支付类型为"+param.getPayType());
         FsStoreOrder order=orderService.selectFsStoreOrderById(param.getOrderId());
         if(order==null){
             return R.error("订单不存在");
@@ -259,6 +239,7 @@ public class StoreOrderController extends  AppBaseController {
             //已改价处理
             if(order.getIsEditMoney()!=null&&order.getIsEditMoney()==1){
                 //改过价不做处理
+
             }
             else{
                 String config=configService.selectConfigByKey("store.config");
@@ -285,7 +266,6 @@ public class StoreOrderController extends  AppBaseController {
             }
             String payCode = IdUtil.getSnowflake(0, 0).nextIdStr();
 //            order.setOrderCode(orderCode);
-            //易宝支付
             if(order.getPayType().equals("1")||order.getPayType().equals("2")){
                 String json = configService.selectConfigByKey("store.pay");
                 FsPayConfig fsPayConfig = JSON.parseObject(json, FsPayConfig.class);
@@ -306,29 +286,6 @@ public class StoreOrderController extends  AppBaseController {
                 storePayment.setOrderId(order.getId());
                 fsStorePaymentMapper.insertFsStorePayment(storePayment);
 
-//                //创建订单
-//                WxJspayDTO p = new WxJspayDTO();
-//                // 使用setter方法为对象赋值
-//                p.setPayMoney(order.getPayMoney().toString());
-//                p.setLowOrderId("store-"+payCode);
-//                p.setBody("商城订单支付");
-//                p.setIsMinipg("1");
-//                p.setReturnUrl(PayConfig.notifyUrl);
-//                p.setOpenId(user.getMaOpenId());
-//                p.setAttach("");
-//                p.setStoreid("0");
-//                CreateWxOrderResult wxOrder = ybPayService.createWxOrder(p);
-//                if(wxOrder.getStatus().equals("100")){
-//                    FsStorePayment ment=new FsStorePayment();
-//                    ment.setPaymentId(storePayment.getPaymentId());
-//                    ment.setTradeNo(wxOrder.getUpOrderId());
-//                    fsStorePaymentMapper.updateFsStorePayment(ment);
-//                    redisCache.setCacheObject("isPaying:"+order.getId(),order.getId().toString(),1, TimeUnit.MINUTES);
-//                    return R.ok().put("payType",param.getPayType()).put("result",wxOrder.getPay_info());
-//                }
-//                else{
-//                    return R.error(wxOrder.getMessage());
-//                }
                 if (fsPayConfig.getType().equals("hf")){
                     HuiFuCreateOrder o = new HuiFuCreateOrder();
                     o.setTradeType("T_MINIAPP");
@@ -337,7 +294,7 @@ public class StoreOrderController extends  AppBaseController {
                     o.setTransAmt(storePayment.getPayMoney().toString());
                     o.setGoodsDesc("商城订单支付");
                     HuifuCreateOrderResult result = huiFuService.createOrder(o);
-                    if(result.getBank_code()!=null&&result.getBank_code().equals("00000000")){
+                    if(result.getResp_code()!=null&&(result.getResp_code().equals("00000000")||result.getResp_code().equals("00000100"))){
                         FsStorePayment mt=new FsStorePayment();
                         mt.setPaymentId(storePayment.getPaymentId());
                         mt.setTradeNo(result.getHf_seq_id());
@@ -520,14 +477,17 @@ public class StoreOrderController extends  AppBaseController {
                 o.setGoodsDesc("商城订单尾款支付");
                 HuifuCreateOrderResult result = huiFuService.createOrder(o);
                 //创建订单
-                if(result.getBank_code()!=null&&result.getBank_code().equals("00000000")){
+                if(result.getResp_code()!=null&&(result.getResp_code().equals("00000000")||result.getResp_code().equals("00000100"))){
+
                     FsStorePayment mt=new FsStorePayment();
                     mt.setPaymentId(storePayment.getPaymentId());
                     mt.setTradeNo(result.getHf_seq_id());
                     fsStorePaymentMapper.updateFsStorePayment(mt);
                     redisCache.setCacheObject("isPaying:"+order.getId(),order.getId().toString(),1, TimeUnit.MINUTES);
                     Map<String, Object> resultMap = JSON.parseObject(result.getPay_info(), new TypeReference<Map<String, Object>>() {});
-                    return R.ok().put("result",resultMap);
+                    String s = (String) resultMap.get("package");
+                    resultMap.put("packageValue",s);
+                    return R.ok().put("payType",param.getPayType()).put("result",resultMap);
                 }
                 else{
                     return R.error(result.getResp_desc());
@@ -635,13 +595,16 @@ public class StoreOrderController extends  AppBaseController {
                 o.setTransAmt(storePayment.getPayMoney().toString());
                 o.setGoodsDesc("商城订单支付");
                 HuifuCreateOrderResult result = huiFuService.createOrder(o);
-                if(result.getBank_code()!=null&&result.getBank_code().equals("00000000")){
+                if(result.getResp_code()!=null&&(result.getResp_code().equals("00000000")||result.getResp_code().equals("00000100"))){
+
                     FsStorePayment mt=new FsStorePayment();
                     mt.setPaymentId(storePayment.getPaymentId());
                     mt.setTradeNo(result.getHf_seq_id());
                     fsStorePaymentMapper.updateFsStorePayment(mt);
                     redisCache.setCacheObject("isPaying:"+order.getId(),order.getId().toString(),1, TimeUnit.MINUTES);
                     Map<String, Object> resultMap = JSON.parseObject(result.getPay_info(), new TypeReference<Map<String, Object>>() {});
+                    String s = (String) resultMap.get("package");
+                    resultMap.put("packageValue",s);
                     return R.ok().put("result",resultMap);
                 }
                 else{
@@ -752,13 +715,16 @@ public class StoreOrderController extends  AppBaseController {
                 o.setTransAmt(storePayment.getPayMoney().toString());
                 o.setGoodsDesc("商城订单支付");
                 HuifuCreateOrderResult result = huiFuService.createOrder(o);
-                if(result.getBank_code()!=null&&result.getBank_code().equals("00000000")){
+                if(result.getResp_code()!=null&&(result.getResp_code().equals("00000000")||result.getResp_code().equals("00000100"))){
+
                     FsStorePayment mt=new FsStorePayment();
                     mt.setPaymentId(storePayment.getPaymentId());
                     mt.setTradeNo(result.getHf_seq_id());
                     fsStorePaymentMapper.updateFsStorePayment(mt);
                     redisCache.setCacheObject("isPaying:"+order.getId(),order.getId().toString(),1, TimeUnit.MINUTES);
                     Map<String, Object> resultMap = JSON.parseObject(result.getPay_info(), new TypeReference<Map<String, Object>>() {});
+                    String s = (String) resultMap.get("package");
+                    resultMap.put("packageValue",s);
                     return R.ok().put("result",resultMap);
                 }
                 else{

+ 183 - 102
fs-user-app/src/main/java/com/fs/app/controller/WxUserController.java

@@ -1,43 +1,40 @@
 package com.fs.app.controller;
 
+import cn.binarywang.wx.miniapp.api.WxMaService;
+import cn.binarywang.wx.miniapp.bean.WxMaJscode2SessionResult;
+import cn.binarywang.wx.miniapp.bean.WxMaPhoneNumberInfo;
+import cn.binarywang.wx.miniapp.bean.WxMaUserInfo;
 import cn.hutool.core.date.DateTime;
-import cn.hutool.core.util.StrUtil;
 import com.fs.app.annotation.Login;
 import com.fs.app.utils.JwtUtils;
 import com.fs.common.core.domain.R;
-import com.fs.common.core.redis.RedisCache;
 import com.fs.common.exception.CustomException;
-import com.fs.common.utils.OrderUtils;
-import com.fs.store.param.LoginMpWxParam;
 import com.fs.common.utils.IpUtil;
-import com.fs.wx.miniapp.config.WxMaConfiguration;
-import com.fs.wx.miniapp.config.WxMaProperties;
+import com.fs.common.utils.OrderUtils;
 import com.fs.store.domain.FsUser;
+import com.fs.store.param.LoginMpWxParam;
 import com.fs.store.param.LoginWxParam;
 import com.fs.store.service.IFsUserService;
-import com.fs.wx.mp.config.WxMpConfiguration;
+import com.fs.wx.miniapp.config.WxMaConfiguration;
+import com.fs.wx.miniapp.config.WxMaProperties;
 import com.fs.wx.mp.config.WxMpProperties;
 import io.swagger.annotations.Api;
 import io.swagger.annotations.ApiOperation;
 import lombok.Synchronized;
 import me.chanjar.weixin.common.bean.WxOAuth2UserInfo;
 import me.chanjar.weixin.common.bean.oauth2.WxOAuth2AccessToken;
+import me.chanjar.weixin.common.error.WxErrorException;
 import me.chanjar.weixin.mp.api.WxMpService;
 import org.apache.commons.lang3.StringUtils;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 import org.springframework.beans.factory.annotation.Autowired;
-import org.springframework.transaction.annotation.Transactional;
-import org.springframework.web.bind.annotation.*;
-
-import cn.binarywang.wx.miniapp.api.WxMaService;
-import cn.binarywang.wx.miniapp.bean.WxMaJscode2SessionResult;
-import cn.binarywang.wx.miniapp.bean.WxMaPhoneNumberInfo;
-import cn.binarywang.wx.miniapp.bean.WxMaUserInfo;
-import me.chanjar.weixin.common.error.WxErrorException;
+import org.springframework.web.bind.annotation.PostMapping;
+import org.springframework.web.bind.annotation.RequestBody;
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.RestController;
 
 import java.util.Date;
-import java.util.concurrent.TimeUnit;
 
 /**
  * 微信小程序用户接口
@@ -66,103 +63,187 @@ public class WxUserController extends AppBaseController{
      */
     @ApiOperation("登录")
     @PostMapping("/login")
-    public R login( @RequestBody LoginMpWxParam param) {
+    public R login(@RequestBody LoginMpWxParam param) {
         if (StringUtils.isBlank(param.getCode())) {
             return R.error("code不存在");
         }
+
         final WxMaService wxService = WxMaConfiguration.getMaService(maProperties.getConfigs().get(0).getAppid());
         try {
+            // 获取微信会话信息
             WxMaJscode2SessionResult session = wxService.getUserService().getSessionInfo(param.getCode());
-            this.logger.info(session.getSessionKey());
-            this.logger.info(session.getOpenid());
-            // 解密
-            WxMaPhoneNumberInfo phoneNoInfo = wxService.getUserService().getPhoneNoInfo(session.getSessionKey(), param.getEncryptedData(), param.getIv());
-            FsUser user=userService.selectFsUserByMaOpenId(session.getOpenid());
+            logger.info("获取微信会话信息成功 - openid: {}, sessionKey: {}", session.getOpenid(), session.getSessionKey());
+
+            // 获取手机号信息
+            WxMaPhoneNumberInfo phoneNoInfo = wxService.getUserService().getPhoneNoInfo(
+                session.getSessionKey(),
+                param.getEncryptedData(),
+                param.getIv()
+            );
+            logger.info("获取手机号信息成功 - phone: {}", phoneNoInfo.getPhoneNumber());
+
+            // 获取用户IP
             String ip = IpUtil.getRequestIp();
-            if(user==null){
-                //查询手机号是否存在,如果存在,更新
-                FsUser checkPhone=userService.selectFsUserByPhone(phoneNoInfo.getPhoneNumber());
-                if(checkPhone!=null){
-                    if(checkPhone.getMaOpenId()==null){
-                        user=checkPhone;
-                        FsUser userMap=new FsUser();
-                        userMap.setMaOpenId(session.getOpenid());
-                        userMap.setUserId(checkPhone.getUserId());
-                        userMap.setUpdateTime(new DateTime());
-                        userMap.setLastIp(ip);
-                        userService.updateFsUser(userMap);
-                    }
-                    else{
-                        throw new CustomException("此手机号已存在");
-                    }
-                }
-                else{
-                    //写入
-                    user=new FsUser();
-                    if(StringUtils.isNotEmpty(param.getUserCode())){
-                        FsUser tuiUser=userService.selectFsUserByUserCode(param.getUserCode());
-                        if(tuiUser!=null){
-                            user.setIsPromoter(1);
-                            user.setSpreadUserId(tuiUser.getUserId());
-                        }
-                    }
-                    user.setUserCode(OrderUtils.genUserCode());
-                    user.setPhone(phoneNoInfo.getPhoneNumber());
-                    user.setUsername(phoneNoInfo.getPhoneNumber());
-                    user.setNickname("微信用户");
-                    user.setStatus(1);
-                    user.setMaOpenId(session.getOpenid());
-                    user.setLastIp(ip);
-                    user.setIsWeixinAuth(0);
-                    user.setCreateTime(new Date());
-                    userService.insertFsUser(user);
-                }
-           }
-           else{
-               FsUser userMap=new FsUser();
-               userMap.setPhone(phoneNoInfo.getPhoneNumber());
-               userMap.setUserId(user.getUserId());
-               userMap.setUpdateTime(new DateTime());
-               userMap.setLastIp(ip);
-               userService.updateFsUser(userMap);
-           }
-           String token = jwtUtils.generateToken(user.getUserId());
-           return R.ok("登录成功").put("token",token).put("user", user);
+
+            // 查找或创建用户
+            FsUser user = findOrCreateUser(session, phoneNoInfo, ip, param.getUserCode());
+
+            // 生成token
+            String token = jwtUtils.generateToken(user.getUserId());
+
+            // 记录登录日志
+            logger.info("用户登录成功 - userId: {}, phone: {}", user.getUserId(), user.getPhone());
+
+            return R.ok("登录成功")
+                .put("token", token)
+                .put("user", user);
+
         } catch (WxErrorException e) {
-            //this.logger.error(e.getMessage(), e);
-            return R.error("授权失败,"+e.getMessage());
+            logger.error("微信授权失败: {}", e.getMessage(), e);
+            return R.error("授权失败: " + e.getMessage());
+        } catch (CustomException e) {
+            logger.error("业务处理异常: {}", e.getMessage(), e);
+            return R.error(e.getMessage());
+        } catch (Exception e) {
+            logger.error("系统异常: {}", e.getMessage(), e);
+            return R.error("系统异常,请稍后重试");
+        }
+    }
+
+    /**
+     * 查找或创建用户
+     */
+    private FsUser findOrCreateUser(WxMaJscode2SessionResult session,
+                                  WxMaPhoneNumberInfo phoneNoInfo,
+                                  String ip,
+                                  String userCode) {
+        // 优先通过unionid查找用户
+        FsUser user = null;
+        if (session.getUnionid() != null) {
+            user = userService.selectFsUserByUnionid(session.getUnionid());
+            if (user == null) {
+                user = userService.selectFsUserByMaOpenId(session.getOpenid());
+            }
+        } else {
+            user = userService.selectFsUserByMaOpenId(session.getOpenid());
+        }
+
+        if (user == null) {
+            // 检查手机号是否已存在
+            FsUser checkPhone = userService.selectFsUserByPhone(phoneNoInfo.getPhoneNumber());
+            if (checkPhone != null) {
+                if (checkPhone.getMaOpenId() == null) {
+                    // 更新已存在用户的信息
+                    user = updateExistingUser(checkPhone, session, ip);
+                } else {
+                    throw new CustomException("此手机号已被其他微信账号绑定");
+                }
+            } else {
+                // 创建新用户
+                user = createNewUser(session, phoneNoInfo, ip, userCode);
+            }
+        } else {
+            // 更新用户信息
+            updateUserInfo(user, phoneNoInfo, ip);
+        }
+
+        return user;
+    }
+
+    /**
+     * 更新已存在用户的信息
+     */
+    private FsUser updateExistingUser(FsUser existingUser, WxMaJscode2SessionResult session, String ip) {
+        FsUser userMap = new FsUser();
+        userMap.setMaOpenId(session.getOpenid());
+        userMap.setUserId(existingUser.getUserId());
+        userMap.setUpdateTime(new DateTime());
+        userMap.setLastIp(ip);
+        if (session.getUnionid() != null) {
+            userMap.setUnionId(session.getUnionid());
+        }
+        userService.updateFsUser(userMap);
+        return existingUser;
+    }
+
+    /**
+     * 创建新用户
+     */
+    private FsUser createNewUser(WxMaJscode2SessionResult session,
+                               WxMaPhoneNumberInfo phoneNoInfo,
+                               String ip,
+                               String userCode) {
+        FsUser user = new FsUser();
+
+        // 处理推荐关系
+        if (StringUtils.isNotEmpty(userCode)) {
+            FsUser tuiUser = userService.selectFsUserByUserCode(userCode);
+            if (tuiUser != null) {
+                user.setIsPromoter(1);
+                user.setSpreadUserId(tuiUser.getUserId());
+            }
         }
+
+        // 设置用户基本信息
+        user.setUserCode(OrderUtils.genUserCode());
+        user.setPhone(phoneNoInfo.getPhoneNumber());
+        user.setUsername(phoneNoInfo.getPhoneNumber());
+        user.setNickname("微信用户");
+        user.setStatus(1);
+        user.setMaOpenId(session.getOpenid());
+        user.setLastIp(ip);
+        user.setIsWeixinAuth(0);
+        user.setCreateTime(new Date());
+
+        if (session.getUnionid() != null) {
+            user.setUnionId(session.getUnionid());
+        }
+
+        userService.insertFsUser(user);
+        return user;
+    }
+
+    /**
+     * 更新用户信息
+     */
+    private void updateUserInfo(FsUser user, WxMaPhoneNumberInfo phoneNoInfo, String ip) {
+        FsUser userMap = new FsUser();
+        userMap.setPhone(phoneNoInfo.getPhoneNumber());
+        userMap.setUserId(user.getUserId());
+        userMap.setUpdateTime(new DateTime());
+        userMap.setLastIp(ip);
+        userService.updateFsUser(userMap);
     }
 
-//    /**
-//     * <pre>
-//     * 获取微信用户信息
-//     * </pre>
-//     */
-//    @Login
-//    @ApiOperation("获取微信小程序用户信息")
-//    @PostMapping("/getWeixinInfo")
-//    public R getWeixinInfo(@RequestBody LoginMpWxParam param) {
-//        final WxMaService wxService = WxMaConfiguration.getMaService(maProperties.getConfigs().get(0).getAppid());
-//        try {
-//            WxMaJscode2SessionResult session = wxService.getUserService().getSessionInfo(param.getCode());
-//            // 用户信息校验
-//            if (!wxService.getUserService().checkUserInfo(session.getSessionKey(), param.getRawData(), param.getSignature())) {
-//                return R.error("user check failed");
-//            }
-//            // 解密用户信息
-//            WxMaUserInfo userInfo = wxService.getUserService().getUserInfo(session.getSessionKey(), param.getEncryptedData(), param.getIv());
-//            FsUser user=userService.selectFsUserById(Long.parseLong(getUserId()));
-//            user.setNickname(userInfo.getNickName());
-//            user.setAvatar(userInfo.getAvatarUrl());
-//            user.setIsWeixinAuth(1);
-//            userService.updateFsUser(user);
-//            return R.ok();
-//        } catch (WxErrorException e) {
-//            e.printStackTrace();
-//        }
-//        return R.ok("授权成功");
-//    }
+    /**
+     * <pre>
+     * 获取微信用户信息
+     * </pre>
+     */
+    @Login
+    @ApiOperation("获取微信小程序用户信息")
+    @PostMapping("/getWeixinInfo")
+    public R getWeixinInfo(@RequestBody LoginMpWxParam param) {
+        final WxMaService wxService = WxMaConfiguration.getMaService(maProperties.getConfigs().get(0).getAppid());
+        try {
+            WxMaJscode2SessionResult session = wxService.getUserService().getSessionInfo(param.getCode());
+            // 用户信息校验
+            if (!wxService.getUserService().checkUserInfo(session.getSessionKey(), param.getRawData(), param.getSignature())) {
+                return R.error("user check failed");
+            }
+            // 解密用户信息
+            WxMaUserInfo userInfo = wxService.getUserService().getUserInfo(session.getSessionKey(), param.getEncryptedData(), param.getIv());
+            FsUser user=userService.selectFsUserById(Long.parseLong(getUserId()));
+            user.setNickname(userInfo.getNickName());
+            user.setAvatar(userInfo.getAvatarUrl());
+            user.setIsWeixinAuth(1);
+            userService.updateFsUser(user);
+            return R.ok();
+        } catch (WxErrorException e) {
+            e.printStackTrace();
+        }
+        return R.ok("授权成功");
+    }
 
     @ApiOperation("小程序登录")
     @PostMapping("/loginByMiniApp")

+ 1 - 1
fs-user-app/src/main/resources/application.yml

@@ -25,7 +25,7 @@ fs:
 # 开发环境配置
 server:
   # 服务器的HTTP端口,默认为8113
-  port: 8113
+  port: 7014
   servlet:
     # 应用的访问路径
     context-path: /

Một số tệp đã không được hiển thị bởi vì quá nhiều tập tin thay đổi trong này khác