Pārlūkot izejas kodu

多店铺下单

ct 3 dienas atpakaļ
vecāks
revīzija
3f61510cd8
20 mainītis faili ar 1823 papildinājumiem un 42 dzēšanām
  1. 3 0
      fs-service/src/main/java/com/fs/hisStore/domain/FsStoreOrderScrm.java
  2. 12 0
      fs-service/src/main/java/com/fs/hisStore/domain/FsStorePaymentScrm.java
  3. 28 0
      fs-service/src/main/java/com/fs/hisStore/mapper/FsStoreCartScrmMapper.java
  4. 2 0
      fs-service/src/main/java/com/fs/hisStore/mapper/FsStoreOrderScrmMapper.java
  5. 15 0
      fs-service/src/main/java/com/fs/hisStore/param/FsStoreConfirmOrderGroupStoreParam.java
  6. 1 0
      fs-service/src/main/java/com/fs/hisStore/param/FsStoreConfirmOrderParam.java
  7. 24 0
      fs-service/src/main/java/com/fs/hisStore/param/FsStoreOrderComputedGroupStoreParam.java
  8. 52 0
      fs-service/src/main/java/com/fs/hisStore/param/FsStoreOrderCreateGroupStoreParam.java
  9. 7 0
      fs-service/src/main/java/com/fs/hisStore/param/FsStoreOrderCreateParam.java
  10. 18 0
      fs-service/src/main/java/com/fs/hisStore/param/FsStoreOrderPayCombinationIdParam.java
  11. 9 8
      fs-service/src/main/java/com/fs/hisStore/service/IFsStoreCartScrmService.java
  12. 7 1
      fs-service/src/main/java/com/fs/hisStore/service/IFsStoreOrderScrmService.java
  13. 93 0
      fs-service/src/main/java/com/fs/hisStore/service/impl/FsStoreCartScrmServiceImpl.java
  14. 147 20
      fs-service/src/main/java/com/fs/hisStore/service/impl/FsStoreOrderScrmServiceImpl.java
  15. 13 0
      fs-service/src/main/java/com/fs/hisStore/vo/FsHuiFuPayInfo.java
  16. 15 0
      fs-service/src/main/java/com/fs/hisStore/vo/FsStoreCartQueryGroupStoreVO.java
  17. 1006 0
      fs-service/src/main/java/com/fs/hisStore/vo/FsStoreOrderGroupStoreVO.java
  18. 10 1
      fs-service/src/main/resources/mapper/hisStore/FsStoreOrderScrmMapper.xml
  19. 6 1
      fs-service/src/main/resources/mapper/hisStore/FsStorePaymentScrmMapper.xml
  20. 355 11
      fs-user-app/src/main/java/com/fs/app/controller/store/StoreOrderScrmController.java

+ 3 - 0
fs-service/src/main/java/com/fs/hisStore/domain/FsStoreOrderScrm.java

@@ -268,4 +268,7 @@ public class FsStoreOrderScrm extends BaseEntity
 
     private Integer orderMedium; //媒体来源
 
+    //组合订单标识
+    private String combinationOrderId;
+
 }

+ 12 - 0
fs-service/src/main/java/com/fs/hisStore/domain/FsStorePaymentScrm.java

@@ -82,6 +82,10 @@ public class FsStorePaymentScrm extends BaseEntity
 
     private Integer isPayRemain;
 
+
+
+    private String paySubCode;
+
     public String getPayMode() {
         return payMode;
     }
@@ -276,5 +280,13 @@ public class FsStorePaymentScrm extends BaseEntity
         return status;
     }
 
+    public String getPaySubCode() {
+        return paySubCode;
+    }
+
+    public void setPaySubCode(String paySubCode) {
+        this.paySubCode = paySubCode;
+    }
+
 
 }

+ 28 - 0
fs-service/src/main/java/com/fs/hisStore/mapper/FsStoreCartScrmMapper.java

@@ -75,6 +75,34 @@ public interface FsStoreCartScrmMapper
     int delCart(Long[] ids);
     @Select("select c.*,p.cate_id,p.product_name,p.image as product_image,p.temp_id,p.product_type,v.price,v.sku as product_attr_name,v.image as product_attr_image,v.stock,v.cost,v.integral,v.weight,v.volume,v.bar_code,v.group_bar_code,v.brokerage,v.brokerage_two,v.brokerage_three from fs_store_cart_scrm c left join fs_store_product_scrm p on p.product_id=c.product_id left join fs_store_product_attr_value_scrm v on v.id=c.product_attr_value_id where find_in_set(c.id,#{ids})")
     List<FsStoreCartQueryVO> selectFsStoreCartListByIds(String ids);
+
+    @Select({"<script> " +
+            "select q.* FROM (" +
+            "select c.*,p.cate_id,p.product_name,p.image as product_image,p.temp_id,p.product_type,v.price,v.ot_price," +
+            "v.sku as product_attr_name,v.image as product_attr_image,v.stock,v.cost,v.integral,v.weight," +
+            "v.volume,v.erp_code,v.erp_sku_name,v.bar_code,v.group_bar_code,v.brokerage,v.brokerage_two," +
+            "v.brokerage_three,s.store_id,s.store_name from fs_store_cart_scrm c left join fs_store_product_scrm p " +
+            "on p.product_id=c.product_id left join fs_store_product_attr_value_scrm v on v.id=c.product_attr_value_id " +
+            "left join fs_store_scrm s on v.store_id=s.store_id " +
+            "where find_in_set(c.id,#{ids})" +
+            ") q where 1= 1" +
+            "<if test = 'storeId != null    '> " +
+//                "and q.store_id =#{storeId} " +
+//                "</if>" +
+//                "<if test = 'storeId == -1    '> " +
+//                "and q.store_id IS NULL " +
+            "<choose>" +
+            "<when test='storeId == -1'>" +
+            "and q.store_id IS NULL" +
+            "</when>" +
+            "<otherwise>" +
+            "and q.store_id =#{storeId} " +
+            "</otherwise>" +
+            "</choose>" +
+            "</if>" +
+            "</script>"})
+    List<FsStoreCartQueryVO> selectFsStoreCartListByIdsAndStore(@Param("ids") String ids,@Param("storeId")Long storeId);
+
     @Update("update  fs_store_cart_scrm set is_pay=1 where find_in_set(id,#{cartIds})")
     void updateIsPay(String cartIds);
 

+ 2 - 0
fs-service/src/main/java/com/fs/hisStore/mapper/FsStoreOrderScrmMapper.java

@@ -1057,4 +1057,6 @@ public interface FsStoreOrderScrmMapper
     FsStoreOrderScrm selectLastByCustomerId(@Param("customerId")Long customerId);
 
     List<Map<String, Object>> selectFsStoreProductCountsByDept(Map<String, Object> map);
+
+    List<FsStoreOrderScrm> getStoreOrderByCombinationId(String combinationId);
 }

+ 15 - 0
fs-service/src/main/java/com/fs/hisStore/param/FsStoreConfirmOrderGroupStoreParam.java

@@ -0,0 +1,15 @@
+package com.fs.hisStore.param;
+
+import lombok.Getter;
+import lombok.Setter;
+
+@Getter
+@Setter
+public class FsStoreConfirmOrderGroupStoreParam {
+//    @NotBlank(message = "请提交购买的商品")
+//    @ApiModelProperty(value = "购物车ID 多个,分隔")
+    private Long storeId;
+//    @NotBlank(message = "购买类型不能为空")
+//    @ApiModelProperty(value = "buy cart")
+    private FsStoreConfirmOrderParam data;
+}

+ 1 - 0
fs-service/src/main/java/com/fs/hisStore/param/FsStoreConfirmOrderParam.java

@@ -14,4 +14,5 @@ public class FsStoreConfirmOrderParam {
     @NotBlank(message = "购买类型不能为空")
     @ApiModelProperty(value = "buy cart")
     private String type;
+    private Long storeId;
 }

+ 24 - 0
fs-service/src/main/java/com/fs/hisStore/param/FsStoreOrderComputedGroupStoreParam.java

@@ -0,0 +1,24 @@
+package com.fs.hisStore.param;
+
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+
+import java.util.List;
+
+@Data
+public class FsStoreOrderComputedGroupStoreParam {
+//    @ApiModelProperty(value = "orderKey")
+//    private String orderKey;
+    @ApiModelProperty(value = "orderKeys")
+    private List<String> orderKeys;
+    //@NotBlank(message = "请选择地址")
+    @ApiModelProperty(value = "地址ID")
+    private Long addressId;
+
+    @ApiModelProperty(value = "使用积分 1使用")
+    private Integer useIntegral;
+    @ApiModelProperty(value = "优惠券")
+    private Long couponUserId;
+
+    private String createOrderKey;
+}

+ 52 - 0
fs-service/src/main/java/com/fs/hisStore/param/FsStoreOrderCreateGroupStoreParam.java

@@ -0,0 +1,52 @@
+package com.fs.hisStore.param;
+
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+
+import javax.validation.constraints.NotBlank;
+import javax.validation.constraints.NotNull;
+import javax.validation.constraints.Size;
+import java.math.BigDecimal;
+import java.util.List;
+
+@Data
+public class FsStoreOrderCreateGroupStoreParam {
+    private Long companyId;
+    private Long companyUserId;
+    private Long userId;
+
+    @ApiModelProperty(value = "orderKeys")
+    @NotNull(message = "orderKeys不能为空")
+    private List<String> orderKeys;
+
+    @ApiModelProperty(value = "地址ID")
+    @NotNull(message = "地址不能为空")
+    private Long addressId;
+
+    @ApiModelProperty(value = "来源")
+    private String from;
+
+    @Size(max = 200,message = "长度超过了限制")
+    @ApiModelProperty(value = "备注")
+    private List<String> mark;
+
+    @NotBlank(message="请选择支付方式")
+    @ApiModelProperty(value = "支付方式")
+    private String payType;
+
+    @ApiModelProperty(value = "使用积分 1使用")
+    private Integer useIntegral;
+    private BigDecimal payPrice;
+    private Long paymentId;
+
+    @ApiModelProperty(value = "优惠券")
+    private Long couponUserId;
+
+    private Long tuiUserId;
+
+    private String createOrderKey;
+    //订单创建类型 1普通订单 2套餐订单 3制单
+    private Integer orderCreateType;
+
+    private Long storeId;
+}

+ 7 - 0
fs-service/src/main/java/com/fs/hisStore/param/FsStoreOrderCreateParam.java

@@ -8,6 +8,7 @@ import javax.validation.constraints.NotNull;
 import javax.validation.constraints.Size;
 import java.io.Serializable;
 import java.math.BigDecimal;
+import java.util.List;
 
 @Data
 public class FsStoreOrderCreateParam implements Serializable
@@ -18,6 +19,7 @@ public class FsStoreOrderCreateParam implements Serializable
     @ApiModelProperty(value = "orderKey")
     @NotNull(message = "orderKey不能为空")
     private String orderKey;
+
     @ApiModelProperty(value = "地址ID")
     @NotNull(message = "地址不能为空")
     private Long addressId;
@@ -54,4 +56,9 @@ public class FsStoreOrderCreateParam implements Serializable
 
     private Integer orderType; //订单类型
     private Integer orderMedium; //媒体来源
+
+    private Long storeId;
+
+    //组合订单唯一标识
+    private String combinationOrderId;
 }

+ 18 - 0
fs-service/src/main/java/com/fs/hisStore/param/FsStoreOrderPayCombinationIdParam.java

@@ -0,0 +1,18 @@
+package com.fs.hisStore.param;
+
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+
+import javax.validation.constraints.NotNull;
+import java.io.Serializable;
+
+@Data
+public class FsStoreOrderPayCombinationIdParam implements Serializable {
+    @ApiModelProperty(value = "combinationOrderId")
+    @NotNull(message = "组合订单标识不能为空")
+    private String combinationOrderId;
+
+    @ApiModelProperty(value = "payType")
+    @NotNull(message = "支付类型不能为空")
+    private Integer payType;
+}

+ 9 - 8
fs-service/src/main/java/com/fs/hisStore/service/IFsStoreCartScrmService.java

@@ -12,15 +12,15 @@ import com.fs.hisStore.vo.FsStoreCartVO;
 
 /**
  * 购物车Service接口
- * 
+ *
  * @author fs
  * @date 2022-03-21
  */
-public interface IFsStoreCartScrmService 
+public interface IFsStoreCartScrmService
 {
     /**
      * 查询购物车
-     * 
+     *
      * @param id 购物车ID
      * @return 购物车
      */
@@ -28,7 +28,7 @@ public interface IFsStoreCartScrmService
 
     /**
      * 查询购物车列表
-     * 
+     *
      * @param fsStoreCart 购物车
      * @return 购物车集合
      */
@@ -36,7 +36,7 @@ public interface IFsStoreCartScrmService
 
     /**
      * 新增购物车
-     * 
+     *
      * @param fsStoreCart 购物车
      * @return 结果
      */
@@ -44,7 +44,7 @@ public interface IFsStoreCartScrmService
 
     /**
      * 修改购物车
-     * 
+     *
      * @param fsStoreCart 购物车
      * @return 结果
      */
@@ -52,7 +52,7 @@ public interface IFsStoreCartScrmService
 
     /**
      * 批量删除购物车
-     * 
+     *
      * @param ids 需要删除的购物车ID
      * @return 结果
      */
@@ -60,7 +60,7 @@ public interface IFsStoreCartScrmService
 
     /**
      * 删除购物车信息
-     * 
+     *
      * @param id 购物车ID
      * @return 结果
      */
@@ -81,4 +81,5 @@ public interface IFsStoreCartScrmService
 
     Integer selectFsStoreCartCount(FsStoreCartCountParam param);
 
+    void checkProductStock( Long productId, Long productAttrValueId,Integer cartNum);
 }

+ 7 - 1
fs-service/src/main/java/com/fs/hisStore/service/IFsStoreOrderScrmService.java

@@ -85,10 +85,14 @@ public interface IFsStoreOrderScrmService
 
     List<FsPromotionOrderVO> selectFsPromotionOrderListVO(FsStoreOrderParam param);
 
-    R confirmOrder(long uid, FsStoreConfirmOrderParam cartParam);
+//    R confirmOrder(long uid, FsStoreConfirmOrderParam cartParam);
+    R confirmOrder(long uid, List<FsStoreConfirmOrderGroupStoreParam> cartParamList);
 
+//    FsStoreOrderComputeDTO computedOrder(long parseLong, FsStoreOrderComputedParam param);
     FsStoreOrderComputeDTO computedOrder(long parseLong, FsStoreOrderComputedParam param);
 
+    List<FsStoreOrderComputeDTO> computedOrders(long parseLong, FsStoreOrderComputedGroupStoreParam param);
+
     R createOrder(long userId, FsStoreOrderCreateParam param);
 
     void cancelOrder(Long orderId);
@@ -239,4 +243,6 @@ public interface IFsStoreOrderScrmService
     R updateSalesOrderMoneyByProduct(FsStoreOrderMoneyByProductParam param);
 
     List<FsStoreProductCountsVO> selectFsStoreProductCountsByDept(Map<String, Object> map, Long deptId);
+
+    List<FsStoreOrderScrm> getStoreOrderByCombinationId(String combinationId);
 }

+ 93 - 0
fs-service/src/main/java/com/fs/hisStore/service/impl/FsStoreCartScrmServiceImpl.java

@@ -314,6 +314,99 @@ public class FsStoreCartScrmServiceImpl implements IFsStoreCartScrmService
         return  fsStoreCartMapper.selectFsStoreCartCount(param);
     }
 
+    @Override
+    public void checkProductStock(Long productId, Long productAttrValueId, Integer cartNum) {
+        IErpGoodsService goodsService = getErpService();
+        if(goodsService != null){
+            log.info("检查库存 {} {}",productId,productAttrValueId);
+            FsStoreProductAttrValueScrm productAttrValue=valueMapper.selectFsStoreProductAttrValueById(productAttrValueId);
+            if(StringUtils.isEmpty(productAttrValue.getGroupBarCode())){
+                //单品
+                ErpGoodsStockQueryRequert queryRequert = new ErpGoodsStockQueryRequert();
+                queryRequert.setBarcode(productAttrValue.getBarCode());
+                ErpGoodsStockQueryResponse goodsStock = goodsService.getGoodsStock(queryRequert);
+                if(goodsStock != null && goodsStock.getStocks() != null && !goodsStock.getStocks().isEmpty()){
+
+                    int stocks = Integer.valueOf(goodsStock.getStocks().get(0).getSalable_qty());
+
+                    if(stocks<=0){
+                        productAttrValue.setStock(0);
+                        valueMapper.updateFsStoreProductAttrValue(productAttrValue);
+                        fsStoreProductMapper.updateStock(productId);
+                        throw new CustomException("库存不足");
+                    } else if (stocks < cartNum){
+                        //更新库存
+                        productAttrValue.setStock(stocks);
+                        valueMapper.updateFsStoreProductAttrValue(productAttrValue);
+                        fsStoreProductMapper.updateStock(productId);
+                        throw new CustomException("库存不足");
+                    }
+                    else{
+                        //更新库存
+                        productAttrValue.setStock(stocks);
+                        valueMapper.updateFsStoreProductAttrValue(productAttrValue);
+                        fsStoreProductMapper.updateStock(productId);
+                        return;
+                    }
+
+                }
+                else{
+                    throw new CustomException("未获取到库存");
+                }
+
+            }
+            else{
+                //组合码
+                FsStoreProductGroupScrm group=productGroupMapper.selectFsStoreProductGroupByBarCode(productAttrValue.getGroupBarCode());
+                if(group!=null){
+                    Integer totalStock=0;
+                    JSONArray jsonArray= JSONUtil.parseArray(group.getProducts());
+                    List<StoreProductGroupDTO> productGroupDTOS=JSONUtil.toList(jsonArray, StoreProductGroupDTO.class);
+                    if(productGroupDTOS!=null){
+                        for(StoreProductGroupDTO dto:productGroupDTOS){
+                            FsStoreProductAttrValueScrm attrValue=valueMapper.selectFsStoreProductAttrValueById(dto.getId());
+                            ErpGoodsStockQueryRequert queryRequert = new ErpGoodsStockQueryRequert();
+                            queryRequert.setBarcode(attrValue.getGroupBarCode());
+                            ErpGoodsStockQueryResponse goodsStock = goodsService.getGoodsStock(queryRequert);
+                            if(goodsStock != null && goodsStock.getStocks() != null && !goodsStock.getStocks().isEmpty()){
+                                int stocks = Integer.valueOf(goodsStock.getStocks().get(0).getSalable_qty());
+
+
+                                if(stocks<=0){
+                                    attrValue.setStock(0);
+                                    valueMapper.updateFsStoreProductAttrValue(attrValue);
+                                    fsStoreProductMapper.updateStock(productId);
+                                    throw new CustomException("库存不足");
+                                } else if (stocks < cartNum){
+                                    //更新库存
+                                    productAttrValue.setStock(stocks);
+                                    valueMapper.updateFsStoreProductAttrValue(productAttrValue);
+                                    fsStoreProductMapper.updateStock(productId);
+                                    throw new CustomException("库存不足");
+                                }
+                                else{
+                                    //更新库存
+                                    attrValue.setStock(stocks);
+                                    valueMapper.updateFsStoreProductAttrValue(attrValue);
+                                    fsStoreProductMapper.updateStock(productId);
+                                }
+                                totalStock+=stocks;
+                            }
+                        }
+                    }
+                    productAttrValue.setStock(totalStock);
+                    valueMapper.updateFsStoreProductAttrValue(productAttrValue);
+                    fsStoreProductMapper.updateStock(productId);
+                }
+
+            }
+        }
+        int stock=valueMapper.selectFsStoreProductStockById(productAttrValueId);
+        if (stock < 1) {
+            throw new CustomException("库存不足");
+        }
+    }
+
     private IErpGoodsService getErpService(){
         //判断是否开启erp
         IErpGoodsService goodsService = null;

+ 147 - 20
fs-service/src/main/java/com/fs/hisStore/service/impl/FsStoreOrderScrmServiceImpl.java

@@ -37,6 +37,9 @@ import com.fs.erp.dto.*;
 import com.fs.erp.mapper.FsErpFinishPushMapper;
 import com.fs.erp.service.IErpOrderService;
 import com.fs.his.config.FsSysConfig;
+import com.fs.his.domain.FsStore;
+import com.fs.his.domain.FsUserAddress;
+import com.fs.his.mapper.FsStoreMapper;
 import com.fs.his.utils.ConfigUtil;
 import com.fs.hisStore.config.FsErpConfig;
 import com.fs.hisStore.dto.*;
@@ -233,6 +236,8 @@ public class FsStoreOrderScrmServiceImpl implements IFsStoreOrderScrmService
 
     @Autowired
     private FsStoreProductScrmMapper fsStoreProductMapper;
+    @Autowired
+    private FsStoreScrmMapper fsStoreMapper;
 
     /**
      * 查询订单
@@ -383,28 +388,70 @@ public class FsStoreOrderScrmServiceImpl implements IFsStoreOrderScrmService
         return list;
     }
 
-    @Override
-    public R confirmOrder(long uid, FsStoreConfirmOrderParam cartParam) {
+//    @Override
+//    public R confirmOrder(long uid, FsStoreConfirmOrderParam cartParam) {
+//        //获取地址信息和购物车信息
+//        FsUserAddressScrm address= userAddressMapper.selectFsUserAddressByDefaultAddress(uid);
+//        List<FsStoreCartQueryVO> carts=cartMapper.selectFsStoreCartListByIds(cartParam.getCartIds());
+//        for (FsStoreCartQueryVO cart : carts) {
+//            if (cart.getChangePrice() != null && BigDecimal.ZERO.compareTo(cart.getChangePrice())<0){
+//                cart.setPrice(cart.getChangePrice());
+//                //删除改价
+//                FsStoreCartScrm fsStoreCart = new FsStoreCartScrm();
+//                fsStoreCart.setId(cart.getId());
+//                fsStoreCart.setChangePrice(BigDecimal.ZERO);
+//                cartMapper.updateFsStoreCart(fsStoreCart);
+//            }
+//        }
+//        String uuid = IdUtil.randomUUID();
+//        redisCache.setCacheObject("orderKey:"+uuid, cartParam.getCartIds(), 300, TimeUnit.SECONDS);
+//        redisCache.setCacheObject("orderCarts:"+uuid, carts, 300, TimeUnit.SECONDS);
+//        return R.ok().put("orderKey",uuid).put("address",address).put("carts",carts);
+//
+//    }
+@Override
+public R confirmOrder(long uid, List<FsStoreConfirmOrderGroupStoreParam> cartParamList) {
+    FsUserAddressScrm address = null;
+    List<String> uuids = new ArrayList<>();
+    List<FsStoreCartQueryGroupStoreVO> list = new ArrayList<>();
+    for (FsStoreConfirmOrderGroupStoreParam cartGroupStoreParam : cartParamList) {
+        FsStoreConfirmOrderParam cartParam = cartGroupStoreParam.getData();
         //获取地址信息和购物车信息
-        FsUserAddressScrm address= userAddressMapper.selectFsUserAddressByDefaultAddress(uid);
-        List<FsStoreCartQueryVO> carts=cartMapper.selectFsStoreCartListByIds(cartParam.getCartIds());
-        for (FsStoreCartQueryVO cart : carts) {
-            if (cart.getChangePrice() != null && BigDecimal.ZERO.compareTo(cart.getChangePrice())<0){
-                cart.setPrice(cart.getChangePrice());
-                //删除改价
-                FsStoreCartScrm fsStoreCart = new FsStoreCartScrm();
-                fsStoreCart.setId(cart.getId());
-                fsStoreCart.setChangePrice(BigDecimal.ZERO);
-                cartMapper.updateFsStoreCart(fsStoreCart);
-            }
+        address = userAddressMapper.selectFsUserAddressByDefaultAddress(uid);
+        //分组展示购物车信息
+        List<FsStoreCartQueryGroupStoreVO> carts = new ArrayList<>();
+        List<FsStoreCartQueryVO> redisCarts = new ArrayList<>();
+        //查询店铺id
+        FsStoreScrm fsStore = fsStoreMapper.selectFsStoreByStoreId(cartGroupStoreParam.getStoreId());
+        FsStoreCartQueryGroupStoreVO vo = new FsStoreCartQueryGroupStoreVO();
+        ////todo 目前存在商品属性没有storeid的脏数据 暂且会查询为null的
+        List<FsStoreCartQueryVO> cartQueryVo = null;
+        if (fsStore == null) {
+            vo.setStoreName("null");
+            cartQueryVo = cartMapper.selectFsStoreCartListByIdsAndStore(cartParam.getCartIds(), -1L);
+            vo.setList(cartQueryVo);
+        } else {
+            vo.setStoreName(fsStore.getStoreName());
+            cartQueryVo = cartMapper.selectFsStoreCartListByIdsAndStore(cartParam.getCartIds(), cartGroupStoreParam.getStoreId());
+
         }
-        String uuid = IdUtil.randomUUID();
-        redisCache.setCacheObject("orderKey:"+uuid, cartParam.getCartIds(), 300, TimeUnit.SECONDS);
-        redisCache.setCacheObject("orderCarts:"+uuid, carts, 300, TimeUnit.SECONDS);
-        return R.ok().put("orderKey",uuid).put("address",address).put("carts",carts);
+        vo.setList(cartQueryVo);
+        carts.add(vo);
+        redisCarts.addAll(cartQueryVo);
+//            }
 
+        list.addAll(carts);
+        String uuid = IdUtil.randomUUID();
+        uuids.add(uuid);
+        redisCache.setCacheObject("orderKey:" + uuid, cartParam.getCartIds(), 300, TimeUnit.SECONDS);
+//            redisCache.setCacheObject("orderCarts:" + uuid, carts, 300, TimeUnit.SECONDS);
+        redisCache.setCacheObject("orderCarts:" + uuid, redisCarts, 300, TimeUnit.SECONDS);
     }
 
+    return R.ok().put("orderKeys", uuids).put("address", address).put("carts", list);
+
+}
+
     @Override
     public FsStoreOrderComputeDTO computedOrder(long uid, FsStoreOrderComputedParam param) {
         String cartIds = redisCache.getCacheObject("orderKey:" + param.getOrderKey());
@@ -498,6 +545,60 @@ public class FsStoreOrderScrmServiceImpl implements IFsStoreOrderScrmService
                 .build();
     }
 
+    @Override
+    @Transactional(rollbackFor = Exception.class)
+    public List<FsStoreOrderComputeDTO> computedOrders(long uid, FsStoreOrderComputedGroupStoreParam params) {
+        //返回值
+        List<FsStoreOrderComputeDTO> dtos = new ArrayList<>();
+        List<String> orderKeys = params.getOrderKeys();
+        //总数
+        BigDecimal payPriceTotal = BigDecimal.ZERO;
+        BigDecimal totalPriceTotal = BigDecimal.ZERO;
+        Double usedIntegralTotal = 0.;
+        BigDecimal payIntegralTotal = BigDecimal.ZERO;
+        BigDecimal payPostageTotal = BigDecimal.ZERO;
+        BigDecimal deductionPriceTotal = BigDecimal.ZERO;
+
+
+        List<String> createOrderKeys = null;
+        if (params.getCreateOrderKey() == null) {
+            createOrderKeys = orderKeys;
+        } else {
+            createOrderKeys = Arrays.asList(params.getCreateOrderKey().split(","));
+        }
+
+
+        for (int i = 0; i < orderKeys.size(); i++) {
+//        for (String orderKey : orderKeys) {
+            FsStoreOrderComputedParam computedParam = new FsStoreOrderComputedParam();
+            BeanUtils.copyProperties(computedParam, params);
+            computedParam.setOrderKey(orderKeys.get(i));
+            if (!createOrderKeys.isEmpty() && createOrderKeys.get(i) != null) {
+                computedParam.setCreateOrderKey(createOrderKeys.get(i));
+            }
+
+            FsStoreOrderComputeDTO dto = this.computedOrder(uid, computedParam);
+            payPriceTotal = NumberUtil.add(payPriceTotal, dto.getPayPrice());
+            totalPriceTotal = NumberUtil.add(totalPriceTotal, dto.getTotalPrice());
+            usedIntegralTotal += dto.getUsedIntegral();
+            payIntegralTotal = NumberUtil.add(payIntegralTotal, dto.getPayIntegral());
+            payPostageTotal = NumberUtil.add(payPostageTotal, dto.getPayPostage());
+            deductionPriceTotal = NumberUtil.add(deductionPriceTotal, dto.getDeductionPrice());
+            dtos.add(dto);
+        }
+//
+
+        dtos.add(FsStoreOrderComputeDTO.builder()
+                .totalPrice(totalPriceTotal)
+                .payPrice(payPriceTotal)
+                .payPostage(payPostageTotal)
+                .deductionPrice(deductionPriceTotal)
+                .usedIntegral(usedIntegralTotal)
+                .payIntegral(payIntegralTotal)
+                .build());
+        return dtos;
+    }
+
 
     @Override
     @Transactional
@@ -507,13 +608,14 @@ public class FsStoreOrderScrmServiceImpl implements IFsStoreOrderScrmService
         //计算金额
         FsStoreOrderComputeDTO dto=this.computedOrder(userId, computedParam);
         String cartIds = redisCache.getCacheObject("orderKey:" + param.getOrderKey());
-//        Integer totalNum = 0;
+        Long totalNum = 0L;
         BigDecimal integral = BigDecimal.ZERO;
         if(cartIds!=null){
             //获取购物车列表
             List<FsStoreCartQueryVO> carts = redisCache.getCacheObject("orderCarts:" + param.getOrderKey());
             //获取地址
             FsUserAddressScrm address=userAddressMapper.selectFsUserAddressById(param.getAddressId());
+
             //生成分布式唯一值
             String orderSn = IdUtil.getSnowflake(0, 0).nextIdStr();
             //是否使用积分
@@ -547,10 +649,21 @@ public class FsStoreOrderScrmServiceImpl implements IFsStoreOrderScrmService
             storeOrder.setUserAddress(address.getProvince() + " " + address.getCity() +
                     " " + address.getDistrict() + " " + address.getDetail().trim());
             storeOrder.setCartId(cartIds);
-            storeOrder.setTotalNum(Long.parseLong(String.valueOf(carts.size())));
+            for (FsStoreCartQueryVO cart : carts) {
+                //检测库存
+                cartService.checkProductStock(cart.getProductId(), cart.getProductAttrValueId(), cart.getCartNum());
+                totalNum += cart.getCartNum();
+                integral = NumberUtil.add(integral,
+                        NumberUtil.mul(cart.getCartNum(), cart.getIntegral()));
+            }
+            storeOrder.setTotalNum(totalNum);
             storeOrder.setTotalPrice(dto.getTotalPrice());
             storeOrder.setTotalPostage(dto.getPayPostage());
 
+            if (param.getStoreId() != null) {
+                storeOrder.setStoreId(param.getStoreId());
+            }
+
             //优惠券处理
             if(param.getCouponUserId()!=null){
                 FsStoreCouponUserScrm couponUser=couponUserService.selectFsStoreCouponUserById(param.getCouponUserId());
@@ -662,6 +775,7 @@ public class FsStoreOrderScrmServiceImpl implements IFsStoreOrderScrmService
                 storeOrder.setOrderType(param.getOrderType());
                 storeOrder.setOrderMedium(param.getOrderMedium());
             }
+            storeOrder.setCombinationOrderId(param.getCombinationOrderId());
             Integer flag=fsStoreOrderMapper.insertFsStoreOrder(storeOrder);
             if (flag==0) {
                 return R.error("订单创建失败");
@@ -1058,7 +1172,15 @@ public class FsStoreOrderScrmServiceImpl implements IFsStoreOrderScrmService
         FsStoreConfirmOrderParam confirmOrderParam=new FsStoreConfirmOrderParam();
         confirmOrderParam.setCartIds(StringUtils.join(cartIds.toArray(), ","));
         confirmOrderParam.setType("buy");
-        R confirmResult=this.confirmOrder(param.getUserId(),confirmOrderParam);
+
+        List<FsStoreConfirmOrderGroupStoreParam> params = new ArrayList<>();
+        FsStoreConfirmOrderGroupStoreParam tempParam = new FsStoreConfirmOrderGroupStoreParam();
+        tempParam.setData(confirmOrderParam);
+        params.add(tempParam);
+
+//        R confirmResult=this.confirmOrder(param.getUserId(),confirmOrderParam);
+
+        R confirmResult = this.confirmOrder(param.getUserId(), params);
         if(confirmResult.get("code").equals(200)){
             FsStoreOrderCreateParam createParam=new FsStoreOrderCreateParam();
             createParam.setUserId(param.getUserId());
@@ -2934,4 +3056,9 @@ public class FsStoreOrderScrmServiceImpl implements IFsStoreOrderScrmService
 
         return vos;
     }
+
+    @Override
+    public List<FsStoreOrderScrm> getStoreOrderByCombinationId(String combinationId) {
+        return fsStoreOrderMapper.getStoreOrderByCombinationId(combinationId);
+    }
 }

+ 13 - 0
fs-service/src/main/java/com/fs/hisStore/vo/FsHuiFuPayInfo.java

@@ -0,0 +1,13 @@
+package com.fs.hisStore.vo;
+
+import lombok.Data;
+
+@Data
+public class FsHuiFuPayInfo {
+    private String timeStamp;
+    private String packageStr;
+    private String paySign;
+    private String appId;
+    private String signType;
+    private String nonceStr;
+}

+ 15 - 0
fs-service/src/main/java/com/fs/hisStore/vo/FsStoreCartQueryGroupStoreVO.java

@@ -0,0 +1,15 @@
+package com.fs.hisStore.vo;
+
+import lombok.Data;
+
+import java.math.BigDecimal;
+import java.util.List;
+
+@Data
+public class FsStoreCartQueryGroupStoreVO {
+    private String storeName;
+    private List<FsStoreCartQueryVO> list;
+    private BigDecimal totalMoney; //原价
+    private BigDecimal payMoney; //实收
+    private String createOrderKey;
+}

+ 1006 - 0
fs-service/src/main/java/com/fs/hisStore/vo/FsStoreOrderGroupStoreVO.java

@@ -0,0 +1,1006 @@
+package com.fs.hisStore.vo;
+
+import com.fasterxml.jackson.annotation.JsonFormat;
+import com.fs.common.annotation.Excel;
+import com.fs.common.core.domain.BaseEntity;
+import org.apache.commons.lang3.builder.ToStringBuilder;
+import org.apache.commons.lang3.builder.ToStringStyle;
+
+import java.math.BigDecimal;
+import java.util.Date;
+import java.util.List;
+
+/**
+ *
+ * @author fs
+ * @date 2022-03-15
+ */
+public class FsStoreOrderGroupStoreVO extends BaseEntity
+{
+    private static final long serialVersionUID = 1L;
+
+    /** 订单ID */
+    private List<Long> ids;
+
+    /** 订单号 */
+    private List<String> orderCodes;
+
+//    /** 额外订单号 */
+//    private String extendOrderId;
+//
+//    private String payOrderId;
+//
+//    private String bankOrderId;
+
+    /** 用户id */
+    private Long userId;
+
+    /** 用户姓名 */
+    @Excel(name = "收货人")
+    private String realName;
+
+    /** 用户电话 */
+    @Excel(name = "手机号")
+    private String userPhone;
+
+    /** 详细地址 */
+    @Excel(name = "详细地址")
+    private String userAddress;
+
+//    /** 购物车id */
+//    private String cartId;
+//
+//    /** 运费金额 */
+//    private BigDecimal freightPrice;
+
+    /** 订单商品总数 */
+    @Excel(name = "订单商品总数")
+    private Long totalNum;
+
+    /** 订单总价 */
+    @Excel(name = "订单总价")
+    private BigDecimal totalPrice;
+
+    /** 邮费 */
+    private BigDecimal totalPostage;
+
+    /** 实际支付金额 */
+    @Excel(name = "应付金额")
+    private BigDecimal payPrice;
+
+    /** 支付邮费 */
+    private BigDecimal payPostage;
+
+    @Excel(name = "物流代收金额")
+    private BigDecimal payDelivery;
+
+    @Excel(name = "支付金额")
+    private BigDecimal payMoney;
+
+    /** 抵扣金额 */
+    private BigDecimal deductionPrice;
+
+    /** 优惠券id */
+    private Long couponId;
+
+    /** 优惠券金额 */
+    private BigDecimal couponPrice;
+
+    /** 支付状态 */
+    @Excel(name = "支付状态 1已支付 0未支付 2支付中")
+    private Integer paid;
+
+    /** 支付时间 */
+    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
+    @Excel(name = "支付时间", width = 30, dateFormat = "yyyy-MM-dd HH:mm:ss")
+    private Date payTime;
+
+    /** 支付方式 */
+    @Excel(name = "支付方式 1线上 2物流代收")
+    private String payType;
+
+    private Integer status;
+
+    /** 0 未退款 1 申请中 2 已退款 */
+    private Integer refundStatus;
+
+    /** 退款图片 */
+    @Excel(name = "退款图片")
+    private String refundReasonWapImg;
+
+    /** 退款用户说明 */
+    @Excel(name = "退款用户说明")
+    private String refundReasonWapExplain;
+
+    /** 退款时间 */
+
+    private Date refundReasonTime;
+
+    /** 前台退款原因 */
+    private String refundReasonWap;
+
+    /** 不退款的理由 */
+    private String refundReason;
+
+    /** 退款金额 */
+    private BigDecimal refundPrice;
+
+    /** 快递公司编号 */
+    @Excel(name = "快递公司编号")
+    private String deliverySn;
+
+    /** 快递名称/送货人姓名 */
+    @Excel(name = "快递名称")
+    private String deliveryName;
+
+    /** 发货类型 */
+    private String deliveryType;
+
+    /** 快递单号/手机号 */
+    @Excel(name = "快递单号")
+    private String deliveryId;
+
+    /** 消费赚取积分 */
+    private BigDecimal gainIntegral;
+
+    /** 使用积分 */
+    @Excel(name = "使用积分")
+    private BigDecimal useIntegral;
+
+    /** 实际支付积分 */
+    @Excel(name = "实际支付积分")
+    private BigDecimal payIntegral;
+
+    /** 给用户退了多少积分 */
+    private BigDecimal backIntegral;
+
+    /** 备注 */
+    @Excel(name = "备注")
+    private String mark;
+
+
+    /** 是否删除 */
+    private Integer isDel;
+
+    /** 成本价 */
+    private BigDecimal cost;
+
+    /** 核销码 */
+    private String verifyCode;
+
+    /** 门店id */
+    private Long storeId;
+
+    /** 配送方式 1=快递 ,2=门店自提 */
+    private Integer shippingType;
+
+    /** 支付渠道(0微信公众号1微信小程序) */
+    private Integer isChannel;
+
+    /** 是否提醒 */
+    private Integer isRemind;
+
+    /** 是否系统删除 */
+    private Integer isSysDel;
+
+    private Integer isPrescribe;
+
+    private Long prescribeId;
+
+    private Long companyId;
+
+    private Long companyUserId;
+
+    private Integer isPackage;
+
+    private String packageJson;
+
+    private String itemJson;
+
+    private Integer orderType;
+
+    private Long packageId;
+
+    private Integer orderCreateType;
+
+    private String storeHouseCode;
+
+
+
+    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
+    @Excel(name = "完成时间", width = 30, dateFormat = "yyyy-MM-dd HH:mm:ss")
+    private Date finishTime;
+
+    private Integer deliveryStatus;
+
+    private Integer deliveryPayStatus;
+
+    @Excel(name = "快递帐单日期")
+    private String deliveryTime;
+
+    @Excel(name = "快递结算日期")
+    private String deliveryPayTime;
+
+    private BigDecimal deliveryPayMoney;
+
+    private BigDecimal tuiMoney;
+
+    private Integer tuiMoneyStatus;
+
+    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
+    @Excel(name = "回单导入时间", width = 30, dateFormat = "yyyy-MM-dd HH:mm:ss")
+    private Date deliveryImportTime;
+
+    private Long tuiUserId;
+
+    private Integer tuiUserMoneyStatus;
+
+    private Long deptId;
+
+    private Integer isEditMoney;
+
+    private Long customerId;
+
+    private Integer isPayRemain;
+
+    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
+    @Excel(name = "发货时间", width = 30, dateFormat = "yyyy-MM-dd HH:mm:ss")
+    private Date deliverySendTime;
+
+    //凭证
+    private String certificates;
+
+    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
+    private Date uploadTime;
+
+    private Long scheduleId; //归属档期id
+
+    //组合订单标识
+    private String combinationOrderId;
+
+    public Long getScheduleId() {
+        return scheduleId;
+    }
+
+    public void setScheduleId(Long scheduleId) {
+        this.scheduleId = scheduleId;
+    }
+
+    public Date getUploadTime() {
+        return uploadTime;
+    }
+
+    public void setUploadTime(Date uploadTime) {
+        this.uploadTime = uploadTime;
+    }
+
+    public String getCertificates() {
+        return certificates;
+    }
+
+    public void setCertificates(String certificates) {
+        this.certificates = certificates;
+    }
+
+    public Date getDeliverySendTime() {
+        return deliverySendTime;
+    }
+
+    public void setDeliverySendTime(Date deliverySendTime) {
+        this.deliverySendTime = deliverySendTime;
+    }
+
+    public Integer getIsPayRemain() {
+        return isPayRemain;
+    }
+
+    public void setIsPayRemain(Integer isPayRemain) {
+        this.isPayRemain = isPayRemain;
+    }
+
+    public Long getCustomerId() {
+        return customerId;
+    }
+
+    public void setCustomerId(Long customerId) {
+        this.customerId = customerId;
+    }
+
+    public Integer getTuiUserMoneyStatus() {
+        return tuiUserMoneyStatus;
+    }
+
+    public void setTuiUserMoneyStatus(Integer tuiUserMoneyStatus) {
+        this.tuiUserMoneyStatus = tuiUserMoneyStatus;
+    }
+
+    public Integer getIsEditMoney() {
+        return isEditMoney;
+    }
+
+    public void setIsEditMoney(Integer isEditMoney) {
+        this.isEditMoney = isEditMoney;
+    }
+
+    public Long getDeptId() {
+        return deptId;
+    }
+
+    public void setDeptId(Long deptId) {
+        this.deptId = deptId;
+    }
+
+    public String getStoreHouseCode() {
+        return storeHouseCode;
+    }
+
+    public void setStoreHouseCode(String storeHouseCode) {
+        this.storeHouseCode = storeHouseCode;
+    }
+
+    public Integer getOrderCreateType() {
+        return orderCreateType;
+    }
+
+    public void setOrderCreateType(Integer orderCreateType) {
+        this.orderCreateType = orderCreateType;
+    }
+
+    public Long getTuiUserId() {
+        return tuiUserId;
+    }
+
+    public void setTuiUserId(Long tuiUserId) {
+        this.tuiUserId = tuiUserId;
+    }
+
+    public Date getDeliveryImportTime() {
+        return deliveryImportTime;
+    }
+
+    public void setDeliveryImportTime(Date deliveryImportTime) {
+        this.deliveryImportTime = deliveryImportTime;
+    }
+
+    public Integer getTuiMoneyStatus() {
+        return tuiMoneyStatus;
+    }
+
+    public void setTuiMoneyStatus(Integer tuiMoneyStatus) {
+        this.tuiMoneyStatus = tuiMoneyStatus;
+    }
+
+    public BigDecimal getTuiMoney() {
+        return tuiMoney;
+    }
+
+    public void setTuiMoney(BigDecimal tuiMoney) {
+        this.tuiMoney = tuiMoney;
+    }
+
+//    public String getPayOrderId() {
+//        return payOrderId;
+//    }
+//
+//    public void setPayOrderId(String payOrderId) {
+//        this.payOrderId = payOrderId;
+//    }
+//
+//    public String getBankOrderId() {
+//        return bankOrderId;
+//    }
+
+//    public void setBankOrderId(String bankOrderId) {
+//        this.bankOrderId = bankOrderId;
+//    }
+
+    public BigDecimal getDeliveryPayMoney() {
+        return deliveryPayMoney;
+    }
+
+    public void setDeliveryPayMoney(BigDecimal deliveryPayMoney) {
+        this.deliveryPayMoney = deliveryPayMoney;
+    }
+
+    public Integer getDeliveryStatus() {
+        return deliveryStatus;
+    }
+
+    public void setDeliveryStatus(Integer deliveryStatus) {
+        this.deliveryStatus = deliveryStatus;
+    }
+
+    public Integer getDeliveryPayStatus() {
+        return deliveryPayStatus;
+    }
+
+    public void setDeliveryPayStatus(Integer deliveryPayStatus) {
+        this.deliveryPayStatus = deliveryPayStatus;
+    }
+
+    public String getDeliveryTime() {
+        return deliveryTime;
+    }
+
+    public void setDeliveryTime(String deliveryTime) {
+        this.deliveryTime = deliveryTime;
+    }
+
+    public String getDeliveryPayTime() {
+        return deliveryPayTime;
+    }
+
+    public void setDeliveryPayTime(String deliveryPayTime) {
+        this.deliveryPayTime = deliveryPayTime;
+    }
+
+    public Date getFinishTime() {
+        return finishTime;
+    }
+
+    public void setFinishTime(Date finishTime) {
+        this.finishTime = finishTime;
+    }
+
+    public Long getPackageId() {
+        return packageId;
+    }
+
+    public void setPackageId(Long packageId) {
+        this.packageId = packageId;
+    }
+
+    public Integer getOrderType() {
+        return orderType;
+    }
+
+    public void setOrderType(Integer orderType) {
+        this.orderType = orderType;
+    }
+
+    public String getPackageJson() {
+        return packageJson;
+    }
+
+    public void setPackageJson(String packageJson) {
+        this.packageJson = packageJson;
+    }
+
+    public static long getSerialVersionUID() {
+        return serialVersionUID;
+    }
+
+    public BigDecimal getPayMoney() {
+        return payMoney;
+    }
+
+    public void setPayMoney(BigDecimal payMoney) {
+        this.payMoney = payMoney;
+    }
+
+    public BigDecimal getPayDelivery() {
+        return payDelivery;
+    }
+
+    public void setPayDelivery(BigDecimal payDelivery) {
+        this.payDelivery = payDelivery;
+    }
+
+    public Integer getIsPackage() {
+        return isPackage;
+    }
+
+    public void setIsPackage(Integer isPackage) {
+        this.isPackage = isPackage;
+    }
+
+    public Long getCompanyId() {
+        return companyId;
+    }
+
+    public void setCompanyId(Long companyId) {
+        this.companyId = companyId;
+    }
+
+    public Long getCompanyUserId() {
+        return companyUserId;
+    }
+
+    public void setCompanyUserId(Long companyUserId) {
+        this.companyUserId = companyUserId;
+    }
+
+    public Long getPrescribeId() {
+        return prescribeId;
+    }
+
+    public void setPrescribeId(Long prescribeId) {
+        this.prescribeId = prescribeId;
+    }
+
+    public Integer getIsPrescribe() {
+        return isPrescribe;
+    }
+
+    public void setIsPrescribe(Integer isPrescribe) {
+        this.isPrescribe = isPrescribe;
+    }
+
+    public void setIds(List<Long> ids)
+    {
+        this.ids = ids;
+    }
+
+    public List<Long> getIds()
+    {
+        return ids;
+    }
+    public void setOrderCodes(List<String> orderCodes)
+    {
+        this.orderCodes = orderCodes;
+    }
+
+    public List<String> getOrderCodes()
+    {
+        return orderCodes;
+    }
+//    public void setExtendOrderId(String extendOrderId)
+//    {
+//        this.extendOrderId = extendOrderId;
+//    }
+//
+//    public String getExtendOrderId()
+//    {
+//        return extendOrderId;
+//    }
+    public void setUserId(Long userId)
+    {
+        this.userId = userId;
+    }
+
+    public Long getUserId()
+    {
+        return userId;
+    }
+    public void setRealName(String realName)
+    {
+        this.realName = realName;
+    }
+
+    public String getRealName()
+    {
+        return realName;
+    }
+    public void setUserPhone(String userPhone)
+    {
+        this.userPhone = userPhone;
+    }
+
+    public String getUserPhone()
+    {
+        return userPhone;
+    }
+    public void setUserAddress(String userAddress)
+    {
+        this.userAddress = userAddress;
+    }
+
+    public String getUserAddress()
+    {
+        return userAddress;
+    }
+//    public void setCartId(String cartId)
+//    {
+//        this.cartId = cartId;
+//    }
+//
+//    public String getCartId()
+//    {
+//        return cartId;
+//    }
+//    public void setFreightPrice(BigDecimal freightPrice)
+//    {
+//        this.freightPrice = freightPrice;
+//    }
+//
+//    public BigDecimal getFreightPrice()
+//    {
+//        return freightPrice;
+//    }
+    public void setTotalNum(Long totalNum)
+    {
+        this.totalNum = totalNum;
+    }
+
+    public Long getTotalNum()
+    {
+        return totalNum;
+    }
+    public void setTotalPrice(BigDecimal totalPrice)
+    {
+        this.totalPrice = totalPrice;
+    }
+
+    public BigDecimal getTotalPrice()
+    {
+        return totalPrice;
+    }
+    public void setTotalPostage(BigDecimal totalPostage)
+    {
+        this.totalPostage = totalPostage;
+    }
+
+    public BigDecimal getTotalPostage()
+    {
+        return totalPostage;
+    }
+    public void setPayPrice(BigDecimal payPrice)
+    {
+        this.payPrice = payPrice;
+    }
+
+    public BigDecimal getPayPrice()
+    {
+        return payPrice;
+    }
+    public void setPayPostage(BigDecimal payPostage)
+    {
+        this.payPostage = payPostage;
+    }
+
+    public BigDecimal getPayPostage()
+    {
+        return payPostage;
+    }
+    public void setDeductionPrice(BigDecimal deductionPrice)
+    {
+        this.deductionPrice = deductionPrice;
+    }
+
+    public BigDecimal getDeductionPrice()
+    {
+        return deductionPrice;
+    }
+    public void setCouponId(Long couponId)
+    {
+        this.couponId = couponId;
+    }
+
+    public Long getCouponId()
+    {
+        return couponId;
+    }
+    public void setCouponPrice(BigDecimal couponPrice)
+    {
+        this.couponPrice = couponPrice;
+    }
+
+    public BigDecimal getCouponPrice()
+    {
+        return couponPrice;
+    }
+    public void setPaid(Integer paid)
+    {
+        this.paid = paid;
+    }
+
+    public Integer getPaid()
+    {
+        return paid;
+    }
+    public void setPayTime(Date payTime)
+    {
+        this.payTime = payTime;
+    }
+
+    public Date getPayTime()
+    {
+        return payTime;
+    }
+    public void setPayType(String payType)
+    {
+        this.payType = payType;
+    }
+
+    public String getPayType()
+    {
+        return payType;
+    }
+    public void setStatus(Integer status)
+    {
+        this.status = status;
+    }
+
+    public Integer getStatus()
+    {
+        return status;
+    }
+    public void setRefundStatus(Integer refundStatus)
+    {
+        this.refundStatus = refundStatus;
+    }
+
+    public Integer getRefundStatus()
+    {
+        return refundStatus;
+    }
+    public void setRefundReasonWapImg(String refundReasonWapImg)
+    {
+        this.refundReasonWapImg = refundReasonWapImg;
+    }
+
+    public String getRefundReasonWapImg()
+    {
+        return refundReasonWapImg;
+    }
+    public void setRefundReasonWapExplain(String refundReasonWapExplain)
+    {
+        this.refundReasonWapExplain = refundReasonWapExplain;
+    }
+
+    public String getRefundReasonWapExplain()
+    {
+        return refundReasonWapExplain;
+    }
+    public void setRefundReasonTime(Date refundReasonTime)
+    {
+        this.refundReasonTime = refundReasonTime;
+    }
+
+    public Date getRefundReasonTime()
+    {
+        return refundReasonTime;
+    }
+    public void setRefundReasonWap(String refundReasonWap)
+    {
+        this.refundReasonWap = refundReasonWap;
+    }
+
+    public String getRefundReasonWap()
+    {
+        return refundReasonWap;
+    }
+    public void setRefundReason(String refundReason)
+    {
+        this.refundReason = refundReason;
+    }
+
+    public String getRefundReason()
+    {
+        return refundReason;
+    }
+    public void setRefundPrice(BigDecimal refundPrice)
+    {
+        this.refundPrice = refundPrice;
+    }
+
+    public BigDecimal getRefundPrice()
+    {
+        return refundPrice;
+    }
+    public void setDeliverySn(String deliverySn)
+    {
+        this.deliverySn = deliverySn;
+    }
+
+    public String getDeliverySn()
+    {
+        return deliverySn;
+    }
+    public void setDeliveryName(String deliveryName)
+    {
+        this.deliveryName = deliveryName;
+    }
+
+    public String getDeliveryName()
+    {
+        return deliveryName;
+    }
+    public void setDeliveryType(String deliveryType)
+    {
+        this.deliveryType = deliveryType;
+    }
+
+    public String getDeliveryType()
+    {
+        return deliveryType;
+    }
+    public void setDeliveryId(String deliveryId)
+    {
+        this.deliveryId = deliveryId;
+    }
+
+    public String getDeliveryId()
+    {
+        return deliveryId;
+    }
+    public void setGainIntegral(BigDecimal gainIntegral)
+    {
+        this.gainIntegral = gainIntegral;
+    }
+
+    public BigDecimal getGainIntegral()
+    {
+        return gainIntegral;
+    }
+    public void setUseIntegral(BigDecimal useIntegral)
+    {
+        this.useIntegral = useIntegral;
+    }
+
+    public BigDecimal getUseIntegral()
+    {
+        return useIntegral;
+    }
+    public void setPayIntegral(BigDecimal payIntegral)
+    {
+        this.payIntegral = payIntegral;
+    }
+
+    public BigDecimal getPayIntegral()
+    {
+        return payIntegral;
+    }
+    public void setBackIntegral(BigDecimal backIntegral)
+    {
+        this.backIntegral = backIntegral;
+    }
+
+    public BigDecimal getBackIntegral()
+    {
+        return backIntegral;
+    }
+    public void setMark(String mark)
+    {
+        this.mark = mark;
+    }
+
+    public String getMark()
+    {
+        return mark;
+    }
+    public void setIsDel(Integer isDel)
+    {
+        this.isDel = isDel;
+    }
+
+    public Integer getIsDel()
+    {
+        return isDel;
+    }
+    public void setCost(BigDecimal cost)
+    {
+        this.cost = cost;
+    }
+
+    public BigDecimal getCost()
+    {
+        return cost;
+    }
+    public void setVerifyCode(String verifyCode)
+    {
+        this.verifyCode = verifyCode;
+    }
+
+    public String getVerifyCode()
+    {
+        return verifyCode;
+    }
+    public void setStoreId(Long storeId)
+    {
+        this.storeId = storeId;
+    }
+
+    public Long getStoreId()
+    {
+        return storeId;
+    }
+    public void setShippingType(Integer shippingType)
+    {
+        this.shippingType = shippingType;
+    }
+
+    public Integer getShippingType()
+    {
+        return shippingType;
+    }
+    public void setIsChannel(Integer isChannel)
+    {
+        this.isChannel = isChannel;
+    }
+
+    public Integer getIsChannel()
+    {
+        return isChannel;
+    }
+    public void setIsRemind(Integer isRemind)
+    {
+        this.isRemind = isRemind;
+    }
+
+    public Integer getIsRemind()
+    {
+        return isRemind;
+    }
+    public void setIsSysDel(Integer isSysDel)
+    {
+        this.isSysDel = isSysDel;
+    }
+
+    public Integer getIsSysDel()
+    {
+        return isSysDel;
+    }
+
+    public String getItemJson() {
+        return itemJson;
+    }
+
+    public void setItemJson(String itemJson) {
+        this.itemJson = itemJson;
+    }
+
+
+    @Override
+    public String toString() {
+        return new ToStringBuilder(this,ToStringStyle.MULTI_LINE_STYLE)
+                .append("ids", getIds())
+                .append("orderCodes", getOrderCodes())
+//                .append("extendOrderId", getExtendOrderId())
+                .append("userId", getUserId())
+                .append("realName", getRealName())
+                .append("userPhone", getUserPhone())
+                .append("userAddress", getUserAddress())
+//                .append("cartId", getCartId())
+//                .append("freightPrice", getFreightPrice())
+                .append("totalNum", getTotalNum())
+                .append("totalPrice", getTotalPrice())
+                .append("totalPostage", getTotalPostage())
+                .append("payPrice", getPayPrice())
+                .append("payPostage", getPayPostage())
+                .append("deductionPrice", getDeductionPrice())
+                .append("couponId", getCouponId())
+                .append("couponPrice", getCouponPrice())
+                .append("paid", getPaid())
+                .append("payTime", getPayTime())
+                .append("payType", getPayType())
+                .append("createTime", getCreateTime())
+                .append("updateTime", getUpdateTime())
+                .append("status", getStatus())
+                .append("refundStatus", getRefundStatus())
+                .append("refundReasonWapImg", getRefundReasonWapImg())
+                .append("refundReasonWapExplain", getRefundReasonWapExplain())
+                .append("refundReasonTime", getRefundReasonTime())
+                .append("refundReasonWap", getRefundReasonWap())
+                .append("refundReason", getRefundReason())
+                .append("refundPrice", getRefundPrice())
+                .append("deliverySn", getDeliverySn())
+                .append("deliveryName", getDeliveryName())
+                .append("deliveryType", getDeliveryType())
+                .append("deliveryId", getDeliveryId())
+                .append("gainIntegral", getGainIntegral())
+                .append("useIntegral", getUseIntegral())
+                .append("payIntegral", getPayIntegral())
+                .append("backIntegral", getBackIntegral())
+                .append("mark", getMark())
+                .append("isDel", getIsDel())
+                .append("remark", getRemark())
+                .append("cost", getCost())
+                .append("verifyCode", getVerifyCode())
+                .append("storeId", getStoreId())
+                .append("shippingType", getShippingType())
+                .append("isChannel", getIsChannel())
+                .append("isRemind", getIsRemind())
+                .append("isSysDel", getIsSysDel())
+                .append("combinationOrderId", getCombinationOrderId())
+                .toString();
+    }
+
+    public String getCombinationOrderId() {
+        return combinationOrderId;
+    }
+
+    public void setCombinationOrderId(String combinationOrderId) {
+        this.combinationOrderId = combinationOrderId;
+    }
+}

+ 10 - 1
fs-service/src/main/resources/mapper/hisStore/FsStoreOrderScrmMapper.xml

@@ -89,10 +89,11 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
         <result property="orderVisit"    column="order_visit"    />
         <result property="serviceFee"    column="service_fee"    />
         <!--<result property="orderMedium"    column="order_medium"    />-->
+        <result property="combinationOrderId"    column="combination_order_id"    />
     </resultMap>
 
     <sql id="selectFsStoreOrderVo">
-        select id, order_code,service_fee, extend_order_id,pay_order_id,bank_order_id, user_id,order_visit, real_name, user_phone, user_address, cart_id, freight_price, total_num, total_price, total_postage, pay_price, pay_postage,pay_delivery,pay_money, deduction_price, coupon_id, coupon_price, paid, pay_time, pay_type, create_time, update_time, status, refund_status, refund_reason_wap_img, refund_reason_wap_explain, refund_reason_time, refund_reason_wap, refund_reason, refund_price, delivery_sn, delivery_name, delivery_type, delivery_id, gain_integral, use_integral, pay_integral, back_integral, mark, is_del, remark, cost, verify_code, store_id, shipping_type, is_channel, is_remind, is_sys_del,is_prescribe,prescribe_id ,company_id,company_user_id,is_package,package_json,item_json,order_type,package_id,finish_time,delivery_status,delivery_pay_status,delivery_time,delivery_pay_time,delivery_pay_money,tui_money,tui_money_status,delivery_import_time,tui_user_id,tui_user_money_status,order_create_type,store_house_code,dept_id,is_edit_money,customer_id,is_pay_remain,delivery_send_time,certificates,schedule_id from fs_store_order_scrm
+        select id, order_code,service_fee, extend_order_id,pay_order_id,bank_order_id, user_id,order_visit, real_name, user_phone, user_address, cart_id, freight_price, total_num, total_price, total_postage, pay_price, pay_postage,pay_delivery,pay_money, deduction_price, coupon_id, coupon_price, paid, pay_time, pay_type, create_time, update_time, status, refund_status, refund_reason_wap_img, refund_reason_wap_explain, refund_reason_time, refund_reason_wap, refund_reason, refund_price, delivery_sn, delivery_name, delivery_type, delivery_id, gain_integral, use_integral, pay_integral, back_integral, mark, is_del, remark, cost, verify_code, store_id, shipping_type, is_channel, is_remind, is_sys_del,is_prescribe,prescribe_id ,company_id,company_user_id,is_package,package_json,item_json,order_type,package_id,finish_time,delivery_status,delivery_pay_status,delivery_time,delivery_pay_time,delivery_pay_money,tui_money,tui_money_status,delivery_import_time,tui_user_id,tui_user_money_status,order_create_type,store_house_code,dept_id,is_edit_money,customer_id,is_pay_remain,delivery_send_time,certificates,schedule_id,combination_order_id from fs_store_order_scrm
     </sql>
 
     <select id="selectFsStoreOrderList" parameterType="FsStoreOrderScrm" resultMap="FsStoreOrderResult">
@@ -152,6 +153,7 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
             <if test="deliveryPayStatus != null "> and delivery_pay_status = #{deliveryPayStatus}</if>
             <if test="deliveryTime != null "> and delivery_time = #{deliveryTime}</if>
             <if test="deliveryImportTime != null "> and delivery_import_time = #{deliveryImportTime}</if>
+            <if test="combinationOrderId != null "> and combination_order_id = #{combinationOrderId}</if>
         </where>
     </select>
 
@@ -244,6 +246,7 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
             <if test="orderVisit != null">order_visit,</if>
             <if test="serviceFee != null">service_fee,</if>
             <if test="orderMedium != null">order_medium,</if>
+            <if test="combinationOrderId != null">combination_order_id,</if>
          </trim>
         <trim prefix="values (" suffix=")" suffixOverrides=",">
             <if test="orderCode != null and orderCode != ''">#{orderCode},</if>
@@ -326,6 +329,7 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
             <if test="orderVisit != null">#{orderVisit},</if>
             <if test="serviceFee != null">#{serviceFee},</if>
             <if test="orderMedium != null">#{orderMedium},</if>
+            <if test="combinationOrderId != null">#{combinationOrderId},</if>
          </trim>
     </insert>
 
@@ -414,6 +418,7 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
             <if test="orderVisit != null">order_visit = #{orderVisit},</if>
             <if test="serviceFee != null">service_fee = #{serviceFee},</if>
             <if test="orderMedium != null">order_medium = #{orderMedium},</if>
+            <if test="combinationOrderId != null">combination_order_id = #{combinationOrderId},</if>
         </trim>
         where id = #{id}
     </update>
@@ -867,4 +872,8 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
         GROUP BY t.order_type
         HAVING t.order_type > 0
     </select>
+    <select id="getStoreOrderByCombinationId" resultType="com.fs.hisStore.domain.FsStoreOrderScrm">
+        <include refid="selectFsStoreOrderVo"/>
+        where combination_order_id like #{combinationId}
+    </select>
 </mapper>

+ 6 - 1
fs-service/src/main/resources/mapper/hisStore/FsStorePaymentScrmMapper.xml

@@ -28,10 +28,11 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
         <result property="orderId"    column="order_id"    />
         <result property="isPayRemain"    column="is_pay_remain"    />
         <result property="payMode"    column="pay_mode"    />
+        <result property="paySubCode"    column="pay_sub_code"    />
     </resultMap>
 
     <sql id="selectFsStorePaymentVo">
-        select payment_id,pay_mode, pay_code, pay_type_code, pay_money, pay_time, create_time, trade_no, user_id, open_id, business_type, business_order_id, status,remark,company_id,company_user_id,dept_id,bank_transaction_id,bank_serial_no,refund_money,refund_time,order_id,is_pay_remain from fs_store_payment_scrm
+        select payment_id,pay_mode, pay_code, pay_type_code, pay_money, pay_time, create_time, trade_no, user_id, open_id, business_type, business_order_id, status,remark,company_id,company_user_id,dept_id,bank_transaction_id,bank_serial_no,refund_money,refund_time,order_id,is_pay_remain,pay_sub_code from fs_store_payment_scrm
 
     </sql>
 
@@ -39,6 +40,7 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
         <include refid="selectFsStorePaymentVo"/>
         <where>
             <if test="payCode != null  and payCode != ''"> and pay_code = #{payCode}</if>
+            <if test="paySubCode != null  and paySubCode != ''"> and pay_sub_code = #{paySubCode}</if>
             <if test="payTypeCode != null  and payTypeCode != ''"> and pay_type_code = #{payTypeCode}</if>
             <if test="payMoney != null "> and pay_money = #{payMoney}</if>
             <if test="payTime != null "> and pay_time = #{payTime}</if>
@@ -67,6 +69,7 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
         insert into fs_store_payment_scrm
         <trim prefix="(" suffix=")" suffixOverrides=",">
             <if test="payCode != null">pay_code,</if>
+            <if test="paySubCode != null">pay_sub_code,</if>
             <if test="payTypeCode != null">pay_type_code,</if>
             <if test="payMoney != null">pay_money,</if>
             <if test="payTime != null">pay_time,</if>
@@ -91,6 +94,7 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
         </trim>
         <trim prefix="values (" suffix=")" suffixOverrides=",">
             <if test="payCode != null">#{payCode},</if>
+            <if test="paySubCode != null">#{paySubCode},</if>
             <if test="payTypeCode != null">#{payTypeCode},</if>
             <if test="payMoney != null">#{payMoney},</if>
             <if test="payTime != null">#{payTime},</if>
@@ -119,6 +123,7 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
         update fs_store_payment_scrm
         <trim prefix="SET" suffixOverrides=",">
             <if test="payCode != null">pay_code = #{payCode},</if>
+            <if test="paySubCode != null">pay_sub_code = #{paySubCode},</if>
             <if test="payTypeCode != null">pay_type_code = #{payTypeCode},</if>
             <if test="payMoney != null">pay_money = #{payMoney},</if>
             <if test="payTime != null">pay_time = #{payTime},</if>

+ 355 - 11
fs-user-app/src/main/java/com/fs/app/controller/store/StoreOrderScrmController.java

@@ -3,7 +3,9 @@ package com.fs.app.controller.store;
 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.NumberUtil;
 import cn.hutool.core.util.ObjectUtil;
+import cn.hutool.json.JSONObject;
 import cn.hutool.json.JSONUtil;
 import com.alibaba.fastjson.JSON;
 import com.alibaba.fastjson.TypeReference;
@@ -27,7 +29,9 @@ import com.fs.hisStore.enums.OrderInfoEnum;
 import com.fs.hisStore.mapper.FsStorePaymentScrmMapper;
 import com.fs.hisStore.param.*;
 import com.fs.hisStore.service.*;
+import com.fs.hisStore.vo.FsHuiFuPayInfo;
 import com.fs.hisStore.vo.FsMyStoreOrderListQueryVO;
+import com.fs.hisStore.vo.FsStoreOrderGroupStoreVO;
 import com.fs.hisStore.vo.FsStoreOrderItemVO;
 import com.fs.huifuPay.domain.HuiFuCreateOrder;
 import com.fs.huifuPay.domain.HuifuCreateOrderResult;
@@ -50,6 +54,7 @@ import io.swagger.annotations.ApiOperation;
 import me.chanjar.weixin.common.error.WxErrorException;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
+import org.springframework.beans.BeanUtils;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.beans.factory.annotation.Qualifier;
 import org.springframework.transaction.annotation.Transactional;
@@ -251,28 +256,121 @@ public class StoreOrderScrmController extends AppBaseController {
         return R.ok().put("order",order).put("productPackage",productPackage).put("payLimitTime",payLimitTime);
     }
 
+    @Login
+    @ApiOperation("根据组合标识获取订单")
+    @GetMapping("/getStoreOrderByCombinationId")
+    public R getStoreOrderById(@RequestParam("combinationId") String combinationId, HttpServletRequest request) {
+        if (StringUtils.isBlank(combinationId)) {
+            return R.error("未选择订单");
+        }
+        List<FsStoreOrderScrm> orders = orderService.getStoreOrderByCombinationId(combinationId);
+        FsStoreOrderGroupStoreVO orderRes = new FsStoreOrderGroupStoreVO();
+        ArrayList<FsStoreProductPackageScrm> productPackages = new ArrayList<>();
+        List<Long> ids = new ArrayList<>();
+        List<String> orderCode = new ArrayList<>();
+        BigDecimal payPrice = BigDecimal.ZERO;
+        BigDecimal payMoney = BigDecimal.ZERO;
+        String payLimitTime = "";
+        String prescribeOrder = "";
+        for (int i = 0; i < orders.size(); i++) {
+            String json = configService.selectConfigByKey("store.config");
+            StoreConfig config = JSONUtil.toBean(json, StoreConfig.class);
+            Calendar calendar = Calendar.getInstance();
+            calendar.setTime(orders.get(i).getCreateTime());
+            calendar.add(Calendar.MINUTE, config.getUnPayTime());
+            SimpleDateFormat format = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
+            payLimitTime = format.format(calendar.getTime());
+            FsStoreProductPackageScrm productPackage = null;
+            if (orders.get(i).getIsPackage() != null && orders.get(i).getIsPackage() == 1) {
+                productPackage = productPackageService.selectFsStoreProductPackageById(orders.get(i).getPackageId());
+            }
+            productPackages.add(productPackage);
+            payMoney = NumberUtil.add(payMoney, orders.get(i).getPayMoney());
+            payPrice = NumberUtil.add(payPrice, orders.get(i).getPayPrice());
+            ids.add(orders.get(i).getId());
+            orderCode.add(orders.get(i).getOrderCode());
+            if (orders.get(i).getIsPrescribe() ==1){
+                if (prescribeOrder.length()<=1){
+                    prescribeOrder = prescribeOrder + orders.get(i).getId();
+                } else {
+                    prescribeOrder = prescribeOrder + "," + orders.get(i).getId();
+                }
+            }
+        }
+        orderRes.setIds(ids);
+        orderRes.setOrderCodes(orderCode);
+        orderRes.setPayType(orders.get(0).getPayType());
+        orderRes.setIsEditMoney(orders.get(0).getIsEditMoney());
+        orderRes.setOrderCreateType(orders.get(0).getOrderCreateType());
+        orderRes.setCreateTime(orders.get(0).getCreateTime());
+        orderRes.setPayPrice(payPrice);
+        orderRes.setPayMoney(payMoney);
+        orderRes.setCombinationOrderId(combinationId);
+
+
+        return R.ok().put("order", orderRes).put("productPackage", productPackages).put("payLimitTime", payLimitTime)
+                .put("prescribeOrder",prescribeOrder);
+    }
+
 
     @Login
     @ApiOperation("确认订单")
     @PostMapping("/confirm")
-    public R confirm(@Validated @RequestBody FsStoreConfirmOrderParam param, HttpServletRequest request){
-        return orderService.confirmOrder(Long.parseLong(getUserId()),param);
+//    public R confirm(@Validated @RequestBody FsStoreConfirmOrderParam param, HttpServletRequest request){
+    public R confirm(@Validated @RequestBody List<FsStoreConfirmOrderGroupStoreParam> paramList, HttpServletRequest request) {
+        return orderService.confirmOrder(Long.parseLong(getUserId()),paramList);
     }
+
+//    @Login
+//    @ApiOperation("计算订单金额")
+//    @PostMapping("/computed")
+//    public R computed(@Validated @RequestBody FsStoreOrderComputedParam param, HttpServletRequest request){
+//        FsStoreOrderComputeDTO dto=orderService.computedOrder(Long.parseLong(getUserId()),param);
+//        return R.ok().put("data",dto);
+//    }
+
     @Login
     @ApiOperation("计算订单金额")
     @PostMapping("/computed")
-    public R computed(@Validated @RequestBody FsStoreOrderComputedParam param, HttpServletRequest request){
-        FsStoreOrderComputeDTO dto=orderService.computedOrder(Long.parseLong(getUserId()),param);
-        return R.ok().put("data",dto);
+    public R computed(@Validated @RequestBody FsStoreOrderComputedGroupStoreParam param, HttpServletRequest request) {
+        List<FsStoreOrderComputeDTO> dtos = orderService.computedOrders(Long.parseLong(getUserId()), param);
+        return R.ok().put("data", dtos);
     }
 
-    @Login
-    @ApiOperation("创建订单")
-    @PostMapping("/create")
-    public R create(@Validated @RequestBody FsStoreOrderCreateParam param, HttpServletRequest request){
-        String userId=getUserId();
-        return orderService.createOrder(Long.parseLong(getUserId()),param);
+//    @Login
+//    @ApiOperation("创建订单")
+//    @PostMapping("/create")
+//    public R create(@Validated @RequestBody FsStoreOrderCreateParam param, HttpServletRequest request){
+//        String userId=getUserId();
+//        return orderService.createOrder(Long.parseLong(getUserId()),param);
+//    }
+@Login
+@ApiOperation("创建订单")
+@PostMapping("/create")
+public List<R> create(@Validated @RequestBody FsStoreOrderCreateGroupStoreParam param, HttpServletRequest request) {
+    List<R> res = new ArrayList<>();
+    String combinationOrderId = IdUtil.randomUUID();
+    List<String> orderKeys = param.getOrderKeys();
+
+    List<String> createOrderKeys = null;
+    if (param.getCreateOrderKey()==null){
+        createOrderKeys = orderKeys;
+    } else {
+        createOrderKeys = Arrays.asList(param.getCreateOrderKey().split(","));
+    }
+    for (int i = 0; i < orderKeys.size(); i++) {
+        FsStoreOrderCreateParam fsStoreOrderCreateParam = new FsStoreOrderCreateParam();
+        BeanUtils.copyProperties(param, fsStoreOrderCreateParam);
+        //备注
+        fsStoreOrderCreateParam.setMark(param.getMark().get(i));
+        fsStoreOrderCreateParam.setOrderKey(orderKeys.get(i));
+        fsStoreOrderCreateParam.setCombinationOrderId(combinationOrderId);
+        fsStoreOrderCreateParam.setCreateOrderKey(createOrderKeys.get(i));
+        R order = orderService.createOrder(Long.parseLong(getUserId()), fsStoreOrderCreateParam);
+        res.add(order);
     }
+    return res;
+}
 
     @Login
     @ApiOperation("支付")
@@ -416,6 +514,176 @@ public class StoreOrderScrmController extends AppBaseController {
 
     }
 
+    @Login
+    @ApiOperation("支付")
+    @PostMapping("/payByCombinationId")
+    @Transactional
+    public R payByCombinationId(HttpServletRequest request, @Validated @RequestBody FsStoreOrderPayCombinationIdParam param) {
+        //组合微信支付order
+        FsStoreOrderScrm fsStoreOrder = new FsStoreOrderScrm();
+        BigDecimal payPrice = BigDecimal.ZERO;
+        BigDecimal payMoneyTotal = BigDecimal.ZERO;
+
+        FsUserScrm fsUser = new FsUserScrm();
+
+        String payCode = IdUtil.getSnowflake(0, 0).nextIdStr();
+        List<FsStoreOrderScrm> orders = orderService.getStoreOrderByCombinationId(param.getCombinationOrderId());
+        //新增的支付详情id
+        ArrayList<Long> paymentIds = new ArrayList<>();
+        for (FsStoreOrderScrm order : orders) {
+            if (order == null) {
+                return R.error("订单不存在");
+            }
+            if (order.getStatus() != OrderInfoEnum.STATUS_0.getValue()) {
+                return R.error("订单状态不正确");
+            }
+            FsUserScrm user = userService.selectFsUserById(order.getUserId());
+
+            fsUser = user;
+
+            payPrice = NumberUtil.add(payPrice, order.getPayPrice());
+            if (user != null && StringUtils.isNotEmpty(user.getMaOpenId())) {
+                //已改价处理
+                if (order.getIsEditMoney() != null && order.getIsEditMoney() == 1) {
+                    //改过价不做处理
+                } else {
+                    String config = configService.selectConfigByKey("his.store");
+                    StoreConfig storeConfig = JSONUtil.toBean(config, StoreConfig.class);
+                    if (param.getPayType().equals(1)) {
+                        order.setPayType("1");
+                        order.setPayMoney(order.getPayPrice());
+                        order.setPayDelivery(BigDecimal.ZERO);
+                        payMoneyTotal = NumberUtil.add(payMoneyTotal, order.getPayPrice());
+                    } else if (param.getPayType().equals(2)) {
+                        order.setPayType("2");
+                        BigDecimal payMoney = order.getPayPrice().multiply(new BigDecimal(storeConfig.getPayRate())).divide(new BigDecimal(100));
+                        payMoney = new BigDecimal(payMoney.setScale(0, BigDecimal.ROUND_HALF_UP).longValue());
+                        order.setPayDelivery(order.getPayPrice().subtract(payMoney));
+                        order.setPayMoney(payMoney);
+
+                        payMoneyTotal = NumberUtil.add(payMoneyTotal, payMoney);
+
+                    } else if (param.getPayType().equals(3)) {
+                        //货到付款
+                        order.setPayType("3");
+                        order.setPayDelivery(order.getPayPrice());
+                        order.setPayMoney(BigDecimal.ZERO);
+                    }
+                    orderService.updateFsStoreOrder(order);
+                }
+            } else {
+                return R.error("用户OPENID不存在");
+            }
+
+            if (order.getPayType().equals("1") || order.getPayType().equals("2")) {
+                String paySubCode = IdUtil.getSnowflake(0, 0).nextIdStr();
+                FsStorePaymentScrm payment = new FsStorePaymentScrm();
+                payment.setCompanyId(order.getCompanyId());
+                payment.setCompanyUserId(order.getCompanyUserId());
+                payment.setStatus(0);
+                payment.setPayCode(payCode);
+                payment.setPaySubCode(paySubCode);
+                payment.setPayMoney(order.getPayMoney());
+                payment.setCreateTime(new Date());
+                payment.setPayTypeCode("weixin");
+                payment.setBusinessType(2);
+                payment.setRemark("商城订单支付");
+                payment.setOpenId(order.getRealName());
+                payment.setUserId(fsUser.getUserId());
+                //换成唯一标识
+//            storePayment.setBusinessOrderId(order.getId().toString());
+                payment.setBusinessOrderId(order.getCombinationOrderId());
+                payment.setOrderId(order.getId());
+                fsStorePaymentMapper.insertFsStorePayment(payment);
+                paymentIds.add(payment.getPaymentId());
+            }
+        }
+
+        fsStoreOrder.setPayType(orders.get(0).getPayType());
+        fsStoreOrder.setCompanyId(orders.get(0).getCompanyId());
+        fsStoreOrder.setCompanyUserId(orders.get(0).getCompanyUserId());
+        fsStoreOrder.setPayMoney(payMoneyTotal);
+        fsStoreOrder.setRealName(orders.get(0).getRealName());
+        fsStoreOrder.setCombinationOrderId(orders.get(0).getCombinationOrderId());
+        if (fsUser != null && StringUtils.isNotEmpty(fsUser.getMaOpenId())) {
+//            String payCode = IdUtil.getSnowflake(0, 0).nextIdStr();
+            if (fsStoreOrder.getPayType().equals("1") || fsStoreOrder.getPayType().equals("2")) {
+                FsStorePaymentScrm storePayment = new FsStorePaymentScrm();
+                storePayment.setCompanyId(fsStoreOrder.getCompanyId());
+                storePayment.setCompanyUserId(fsStoreOrder.getCompanyUserId());
+                storePayment.setStatus(0);
+                storePayment.setPayCode(payCode);
+                storePayment.setPayMoney(fsStoreOrder.getPayMoney());
+                storePayment.setCreateTime(new Date());
+                storePayment.setPayTypeCode("weixin");
+                storePayment.setBusinessType(2);
+                storePayment.setRemark("商城订单支付");
+                storePayment.setOpenId(fsStoreOrder.getRealName());
+                storePayment.setUserId(fsUser.getUserId());
+
+                //支付
+                HuiFuCreateOrder o = new HuiFuCreateOrder();
+                o.setTradeType("T_MINIAPP");
+                o.setOpenid(fsUser.getMaOpenId());
+                o.setReqSeqId("store-" + storePayment.getPayCode());
+                o.setTransAmt(storePayment.getPayMoney().toString());
+                o.setGoodsDesc("商城订单支付");
+                HuifuCreateOrderResult result = huiFuService.createOrder(o);
+                //创建订单
+                if (result.getBank_code() != null && result.getBank_code().equals("00000000")) {
+                    for (Long paymentId : paymentIds) {
+                        FsStorePaymentScrm mt = new FsStorePaymentScrm();
+                        mt.setPaymentId(paymentId);
+                        mt.setTradeNo(result.getHf_seq_id());
+                        fsStorePaymentMapper.updateFsStorePayment(mt);
+                    }
+
+                    String mes = result.getPay_info();
+                    JSONObject payInfo = JSONUtil.parseObj(mes);
+                    FsHuiFuPayInfo fsHuiFuPayInfo = new FsHuiFuPayInfo();
+                    if (payInfo.get("timeStamp") != null) {
+                        fsHuiFuPayInfo.setTimeStamp(payInfo.get("timeStamp").toString());
+                    }
+                    if (payInfo.get("package") != null) {
+                        fsHuiFuPayInfo.setPackageStr(payInfo.get("package").toString());
+                    }
+                    if (payInfo.get("paySign") != null) {
+                        fsHuiFuPayInfo.setPaySign(payInfo.get("paySign").toString());
+
+                    }
+                    if (payInfo.get("appId") != null) {
+                        fsHuiFuPayInfo.setAppId(payInfo.get("appId").toString());
+
+                    }
+                    if (payInfo.get("signType") != null) {
+                        fsHuiFuPayInfo.setSignType(payInfo.get("signType").toString());
+
+                    }
+                    if (payInfo.get("nonceStr") != null) {
+                        fsHuiFuPayInfo.setNonceStr(payInfo.get("nonceStr").toString());
+                    }
+
+
+//                    return R.ok().put("payType",param.getPayType()).put("result",result.getPay_info());
+                    return R.ok().put("payType", param.getPayType()).put("result", fsHuiFuPayInfo);
+                } else {
+                    return R.error(result.getResp_desc());
+                }
+            } else if (fsStoreOrder.getPayType().equals("3")) {
+                for (FsStoreOrderScrm order : orders) {
+                    //货到付款
+                    orderService.payConfirm(2, order.getId(), null, null, null, null);
+                    return R.ok().put("payType", param.getPayType());
+                }
+
+            }
+
+
+        }
+        return R.error("用户OPENID不存在");
+
+    }
+
 
 
 
@@ -495,6 +763,82 @@ public class StoreOrderScrmController extends AppBaseController {
 
     }
 
+    @Login
+    @ApiOperation("修改支付类型")
+    @PostMapping("/editPayTypeByCombinationId")
+    @Transactional
+    public R editPayTypeByCombinationId(HttpServletRequest request, @Validated @RequestBody FsStoreOrderPayCombinationIdParam param) {
+        //返回对象
+        FsStoreOrderGroupStoreVO orderRes = new FsStoreOrderGroupStoreVO();
+        List<Long> ids = new ArrayList<>();
+        List<String> orderCodes = new ArrayList<>();
+        String prescribeOrder = "";
+        BigDecimal payPrice = BigDecimal.ZERO;
+        BigDecimal payMoneyRes = BigDecimal.ZERO;
+        List<FsStoreOrderScrm> orders = orderService.getStoreOrderByCombinationId(param.getCombinationOrderId());
+        for (int i = 0; i < orders.size(); i++) {
+
+            if (orders.get(i) == null) {
+                return R.error("订单不存在");
+            }
+            if (orders.get(i).getStatus() != OrderInfoEnum.STATUS_0.getValue()) {
+                return R.error("订单状态不正确");
+            }
+            FsUserScrm user = userService.selectFsUserById(orders.get(i).getUserId());
+            if (user != null && StringUtils.isNotEmpty(user.getMaOpenId())) {
+                //已改价处理
+                if (orders.get(i).getIsEditMoney() != null && orders.get(i).getIsEditMoney() == 1) {
+                    //改过价不做处理
+                } else {
+                    String config = configService.selectConfigByKey("his.store");
+                    StoreConfig storeConfig = JSONUtil.toBean(config, StoreConfig.class);
+                    if (param.getPayType().equals(1)) {
+                        orders.get(i).setPayType("1");
+                        orders.get(i).setPayMoney(orders.get(i).getPayPrice());
+                        orders.get(i).setPayDelivery(BigDecimal.ZERO);
+                    } else if (param.getPayType().equals(2)) {
+
+                        orders.get(i).setPayType("2");
+                        BigDecimal payMoney = orders.get(i).getPayPrice().multiply(new BigDecimal(storeConfig.getPayRate())).divide(new BigDecimal(100));
+                        payMoney = new BigDecimal(payMoney.setScale(0, BigDecimal.ROUND_HALF_UP).longValue());
+                        orders.get(i).setPayDelivery(orders.get(i).getPayPrice().subtract(payMoney));
+                        orders.get(i).setPayMoney(payMoney);
+                    } else if (param.getPayType().equals(3)) {
+                        //货到付款
+                        orders.get(i).setPayType("3");
+                        orders.get(i).setPayDelivery(orders.get(i).getPayPrice());
+                        orders.get(i).setPayMoney(BigDecimal.ZERO);
+                    }
+                    if (orders.get(i).getIsPrescribe() ==1){
+                        if (prescribeOrder.length()<=1){
+                            prescribeOrder = prescribeOrder + orders.get(i).getId();
+                        } else {
+                            prescribeOrder = prescribeOrder + "," + orders.get(i).getId();
+                        }
+                    }
+                    orderService.updateFsStoreOrder(orders.get(i));
+                    ids.add(orders.get(i).getId());
+                    orderCodes.add(orders.get(i).getOrderCode());
+                }
+                payMoneyRes = NumberUtil.add(orders.get(i).getPayMoney(), payMoneyRes);
+                payPrice = NumberUtil.add(payPrice, orders.get(i).getPayPrice());
+            } else {
+                return R.error(orders.get(i).getOrderCode() + "用户OPENID不存在");
+            }
+        }
+        orderRes.setIds(ids);
+        orderRes.setOrderCodes(orderCodes);
+        orderRes.setPayType(orders.get(0).getPayType());
+        orderRes.setIsEditMoney(orders.get(0).getIsEditMoney());
+        orderRes.setOrderCreateType(orders.get(0).getOrderCreateType());
+        orderRes.setCreateTime(orders.get(0).getCreateTime());
+        orderRes.setPayPrice(payPrice);
+        orderRes.setPayMoney(payMoneyRes);
+        orderRes.setCombinationOrderId(param.getCombinationOrderId());
+//        return R.ok().put("order", orderRes);
+        return R.ok().put("order", orderRes).put("prescribeOrder",prescribeOrder);
+    }
+
 
     @Login
     @ApiOperation("支付尾款")