Browse Source

fixed 订单结算

fushengqian 1 year ago
parent
commit
8b8be6d02e
25 changed files with 1089 additions and 500 deletions
  1. 3 0
      fuint-application/src/main/java/com/fuint/common/dto/OrderDto.java
  2. 56 0
      fuint-application/src/main/java/com/fuint/common/dto/SettlementDto.java
  3. 43 0
      fuint-application/src/main/java/com/fuint/common/dto/SettlementOrderDto.java
  4. 3 0
      fuint-application/src/main/java/com/fuint/common/dto/UserOrderDto.java
  5. 37 0
      fuint-application/src/main/java/com/fuint/common/enums/SettleStatusEnum.java
  6. 4 1
      fuint-application/src/main/java/com/fuint/common/param/OrderListParam.java
  7. 10 2
      fuint-application/src/main/java/com/fuint/common/service/OrderService.java
  8. 24 6
      fuint-application/src/main/java/com/fuint/common/service/SettlementService.java
  9. 432 5
      fuint-application/src/main/java/com/fuint/common/service/impl/OrderServiceImpl.java
  10. 2 2
      fuint-application/src/main/java/com/fuint/common/service/impl/SendSmsServiceImpl.java
  11. 117 468
      fuint-application/src/main/java/com/fuint/common/service/impl/SettlementServiceImpl.java
  12. 20 0
      fuint-application/src/main/java/com/fuint/common/util/CommonUtil.java
  13. 7 6
      fuint-application/src/main/java/com/fuint/module/backendApi/controller/BackendOrderController.java
  14. 161 0
      fuint-application/src/main/java/com/fuint/module/backendApi/controller/BackendSettlementController.java
  15. 1 1
      fuint-application/src/main/java/com/fuint/module/backendApi/controller/BackendSubMessageController.java
  16. 3 2
      fuint-application/src/main/java/com/fuint/module/clientApi/controller/ClientOrderController.java
  17. 4 4
      fuint-application/src/main/java/com/fuint/module/clientApi/controller/ClientSettlementController.java
  18. 4 3
      fuint-application/src/main/java/com/fuint/module/merchantApi/controller/MerchantOrderController.java
  19. 14 0
      fuint-repository/src/main/java/com/fuint/repository/mapper/MtSettlementMapper.java
  20. 14 0
      fuint-repository/src/main/java/com/fuint/repository/mapper/MtSettlementOrderMapper.java
  21. 3 0
      fuint-repository/src/main/java/com/fuint/repository/model/MtOrder.java
  22. 65 0
      fuint-repository/src/main/java/com/fuint/repository/model/MtSettlement.java
  23. 52 0
      fuint-repository/src/main/java/com/fuint/repository/model/MtSettlementOrder.java
  24. 5 0
      fuint-repository/src/main/resources/mapper/MtSettlementMapper.xml
  25. 5 0
      fuint-repository/src/main/resources/mapper/MtSettlementOrderMapper.xml

+ 3 - 0
fuint-application/src/main/java/com/fuint/common/dto/OrderDto.java

@@ -111,6 +111,9 @@ public class OrderDto implements Serializable {
     @ApiModelProperty("支付状态")
     private String payStatus;
 
+    @ApiModelProperty(value="结算状态")
+    private String settleStatus;
+
     @ApiModelProperty("最后操作人")
     private String operator;
 

+ 56 - 0
fuint-application/src/main/java/com/fuint/common/dto/SettlementDto.java

@@ -0,0 +1,56 @@
+package com.fuint.common.dto;
+
+import java.io.Serializable;
+import java.math.BigDecimal;
+import java.util.Date;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Getter;
+import lombok.Setter;
+
+/**
+ * 结算实体类
+ *
+ * Created by FSQ
+ * CopyRight https://www.fuint.cn
+ */
+@Getter
+@Setter
+public class SettlementDto implements Serializable {
+
+    @ApiModelProperty("自增ID")
+    private Integer id;
+
+    @ApiModelProperty("结算单号")
+    private String settlementNo;
+
+    @ApiModelProperty("商户ID")
+    private Integer merchantId;
+
+    @ApiModelProperty("店铺ID")
+    private Integer storeId;
+
+    @ApiModelProperty("订单总金额")
+    private BigDecimal totalOrderAmount;
+
+    @ApiModelProperty("结算金额")
+    private BigDecimal amount;
+
+    @ApiModelProperty("创建时间")
+    private Date createTime;
+
+    @ApiModelProperty("更新时间")
+    private Date updateTime;
+
+    @ApiModelProperty("备注说明")
+    private String description;
+
+    @ApiModelProperty("最后操作人")
+    private String operator;
+
+    @ApiModelProperty("支付状态,A待支付;B已支付")
+    private String payStatus;
+
+    @ApiModelProperty("状态,A正常;D删除")
+    private String status;
+
+}

+ 43 - 0
fuint-application/src/main/java/com/fuint/common/dto/SettlementOrderDto.java

@@ -0,0 +1,43 @@
+package com.fuint.common.dto;
+
+import java.io.Serializable;
+import java.util.Date;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Getter;
+import lombok.Setter;
+
+/**
+ * 结算订单表
+ *
+ * Created by FSQ
+ * CopyRight https://www.fuint.cn
+ */
+@Getter
+@Setter
+public class SettlementOrderDto implements Serializable {
+
+    @ApiModelProperty("自增ID")
+    private Integer id;
+
+    @ApiModelProperty("结算ID")
+    private Integer settlementId;
+
+    @ApiModelProperty("订单ID")
+    private Integer orderId;
+
+    @ApiModelProperty("创建时间")
+    private Date createTime;
+
+    @ApiModelProperty("更新时间")
+    private Date updateTime;
+
+    @ApiModelProperty("备注说明")
+    private String description;
+
+    @ApiModelProperty("最后操作人")
+    private String operator;
+
+    @ApiModelProperty("状态,A正常;D删除")
+    private String status;
+
+}

+ 3 - 0
fuint-application/src/main/java/com/fuint/common/dto/UserOrderDto.java

@@ -98,6 +98,9 @@ public class UserOrderDto implements Serializable {
     @ApiModelProperty("支付状态")
     private String payStatus;
 
+    @ApiModelProperty(value="结算状态")
+    private String settleStatus;
+
     @ApiModelProperty("状态说明")
     private String statusText;
 

+ 37 - 0
fuint-application/src/main/java/com/fuint/common/enums/SettleStatusEnum.java

@@ -0,0 +1,37 @@
+package com.fuint.common.enums;
+
+/**
+ * 订单结算状态
+ *
+ * Created by FSQ
+ * CopyRight https://www.fuint.cn
+ */
+public enum SettleStatusEnum {
+    WAIT("A", "待结算"),
+    COMPLETE("B", "已结算");
+
+    private String key;
+
+    private String value;
+
+    SettleStatusEnum(String key, String value) {
+        this.key = key;
+        this.value = value;
+    }
+
+    public String getKey() {
+        return key;
+    }
+
+    public void setKey(String key) {
+        this.key = key;
+    }
+
+    public String getValue() {
+        return value;
+    }
+
+    public void setValue(String value) {
+        this.value = value;
+    }
+}

+ 4 - 1
fuint-application/src/main/java/com/fuint/common/param/OrderListParam.java

@@ -22,7 +22,7 @@ public class OrderListParam extends PageParam implements Serializable {
     private Integer merchantId;
 
     @ApiModelProperty(value="店铺ID", name="storeId")
-    private String storeId;
+    private Integer storeId;
 
     @ApiModelProperty(value="店铺ID,逗号分隔", name="storeIds")
     private String storeIds;
@@ -33,6 +33,9 @@ public class OrderListParam extends PageParam implements Serializable {
     @ApiModelProperty(value="支付状态", name="payStatus")
     private String payStatus;
 
+    @ApiModelProperty(value="结算状态", name="settleStatus")
+    private String settleStatus;
+
     @ApiModelProperty(value="数据类型,1)toPay:待支付;2)paid:已支付;3)cancel:已取消", name="dataType")
     private String dataType;
 

+ 10 - 2
fuint-application/src/main/java/com/fuint/common/service/OrderService.java

@@ -4,10 +4,13 @@ import com.baomidou.mybatisplus.extension.service.IService;
 import com.fuint.common.dto.UserOrderDto;
 import com.fuint.common.dto.OrderDto;
 import com.fuint.common.param.OrderListParam;
+import com.fuint.common.param.SettlementParam;
 import com.fuint.framework.exception.BusinessCheckException;
-import com.fuint.framework.web.ResponseObject;
+import com.fuint.framework.pagination.PaginationResponse;
 import com.fuint.repository.model.MtCart;
 import com.fuint.repository.model.MtOrder;
+
+import javax.servlet.http.HttpServletRequest;
 import java.math.BigDecimal;
 import java.util.Date;
 import java.util.List;
@@ -26,7 +29,7 @@ public interface OrderService extends IService<MtOrder> {
      * @param  orderListParam
      * @throws BusinessCheckException
      * */
-    ResponseObject getUserOrderList(OrderListParam orderListParam) throws BusinessCheckException;
+    PaginationResponse getUserOrderList(OrderListParam orderListParam) throws BusinessCheckException;
 
     /**
      * 创建订单
@@ -36,6 +39,11 @@ public interface OrderService extends IService<MtOrder> {
      */
     MtOrder saveOrder(OrderDto reqDto) throws BusinessCheckException;
 
+    /**
+     * 订单提交结算
+     * */
+    Map<String, Object> doSettle(HttpServletRequest request, SettlementParam settlementParam) throws BusinessCheckException;
+
     /**
      * 获取订单详情
      *

+ 24 - 6
fuint-application/src/main/java/com/fuint/common/service/SettlementService.java

@@ -1,9 +1,9 @@
 package com.fuint.common.service;
 
-import com.fuint.common.param.SettlementParam;
 import com.fuint.framework.exception.BusinessCheckException;
-import javax.servlet.http.HttpServletRequest;
-import java.util.Map;
+import com.fuint.framework.pagination.PaginationRequest;
+import com.fuint.framework.pagination.PaginationResponse;
+import com.fuint.repository.model.MtSettlement;
 
 /**
  * 订单结算相关业务接口
@@ -14,8 +14,26 @@ import java.util.Map;
 public interface SettlementService {
 
     /**
-     * 订单提交结算
-     * */
-    Map<String, Object> doSubmit(HttpServletRequest request, SettlementParam settlementParam) throws BusinessCheckException;
+     * 分页查询结算列表
+     *
+     * @param paginationRequest
+     * @return
+     */
+    PaginationResponse<MtSettlement> querySettlementListByPagination(PaginationRequest paginationRequest) throws BusinessCheckException;
+
+    /**
+     * 提交结算
+     *
+     * @param  mtSettlement
+     * @throws BusinessCheckException
+     */
+    Boolean submitSettlement(MtSettlement mtSettlement) throws BusinessCheckException;
 
+    /**
+     * 获取结算详情
+     *
+     * @param settlementId
+     * @return
+     * */
+    MtSettlement getSettlementInfo(Integer settlementId) throws BusinessCheckException;
 }

+ 432 - 5
fuint-application/src/main/java/com/fuint/common/service/impl/OrderServiceImpl.java

@@ -8,16 +8,19 @@ import com.fuint.common.Constants;
 import com.fuint.common.dto.*;
 import com.fuint.common.enums.*;
 import com.fuint.common.param.OrderListParam;
+import com.fuint.common.param.SettlementParam;
 import com.fuint.common.service.*;
 import com.fuint.common.util.CommonUtil;
 import com.fuint.common.util.DateUtil;
 import com.fuint.common.util.SeqUtil;
+import com.fuint.common.util.TokenUtil;
 import com.fuint.framework.annoation.OperationServiceLog;
 import com.fuint.framework.exception.BusinessCheckException;
 import com.fuint.framework.pagination.PaginationResponse;
 import com.fuint.framework.web.ResponseObject;
 import com.fuint.repository.mapper.*;
 import com.fuint.repository.model.*;
+import com.fuint.utils.PropertiesUtil;
 import com.fuint.utils.StringUtil;
 import com.github.pagehelper.Page;
 import com.github.pagehelper.PageHelper;
@@ -31,6 +34,7 @@ import org.springframework.data.domain.PageRequest;
 import org.springframework.stereotype.Service;
 import org.springframework.transaction.annotation.Transactional;
 import javax.annotation.Resource;
+import javax.servlet.http.HttpServletRequest;
 import java.math.BigDecimal;
 import java.util.*;
 
@@ -108,6 +112,9 @@ public class OrderServiceImpl extends ServiceImpl<MtOrderMapper, MtOrder> implem
     @Autowired
     private RefundService refundService;
 
+    @Autowired
+    private BalanceService balanceService;
+
     @Autowired
     private WeixinService weixinService;
 
@@ -120,6 +127,15 @@ public class OrderServiceImpl extends ServiceImpl<MtOrderMapper, MtOrder> implem
     @Autowired
     private OpenGiftService openGiftService;
 
+    @Autowired
+    private MerchantService merchantService;
+
+    @Autowired
+    private StaffService staffService;
+
+    @Autowired
+    private PaymentService paymentService;
+
     /**
      * 获取用户订单列表
      * @param  orderListParam
@@ -127,14 +143,15 @@ public class OrderServiceImpl extends ServiceImpl<MtOrderMapper, MtOrder> implem
      * */
     @Override
     @Transactional(rollbackFor = Exception.class)
-    public ResponseObject getUserOrderList(OrderListParam orderListParam) throws BusinessCheckException {
+    public PaginationResponse getUserOrderList(OrderListParam orderListParam) throws BusinessCheckException {
         Integer pageNumber = orderListParam.getPage() == null ? Constants.PAGE_NUMBER : orderListParam.getPage();
         Integer pageSize = orderListParam.getPageSize() == null ? Constants.PAGE_SIZE : orderListParam.getPageSize();
         String userId = orderListParam.getUserId() == null ? "" : orderListParam.getUserId();
         Integer merchantId = orderListParam.getMerchantId() == null ? 0 : orderListParam.getMerchantId();
-        String storeId = orderListParam.getStoreId() == null ? "" : orderListParam.getStoreId();
+        Integer storeId = orderListParam.getStoreId() == null ? 0 : orderListParam.getStoreId();
         String status =  orderListParam.getStatus() == null ? "": orderListParam.getStatus();
         String payStatus =  orderListParam.getPayStatus() == null ? "": orderListParam.getPayStatus();
+        String settleStatus =  orderListParam.getSettleStatus() == null ? "": orderListParam.getSettleStatus();
         String dataType =  orderListParam.getDataType() == null ? "": orderListParam.getDataType();
         String type =  orderListParam.getType() == null ? "": orderListParam.getType();
         String orderSn =  orderListParam.getOrderSn() == null ? "": orderListParam.getOrderSn();
@@ -167,6 +184,9 @@ public class OrderServiceImpl extends ServiceImpl<MtOrderMapper, MtOrder> implem
         if (StringUtil.isNotEmpty(payStatus)) {
             lambdaQueryWrapper.eq(MtOrder::getPayStatus, payStatus);
         }
+        if (StringUtil.isNotEmpty(settleStatus)) {
+            lambdaQueryWrapper.eq(MtOrder::getSettleStatus, settleStatus);
+        }
         if (StringUtil.isNotEmpty(mobile)) {
             MtUser userInfo = memberService.queryMemberByMobile(merchantId, mobile);
             if (userInfo != null) {
@@ -178,10 +198,10 @@ public class OrderServiceImpl extends ServiceImpl<MtOrderMapper, MtOrder> implem
         if (StringUtil.isNotEmpty(userId)) {
             lambdaQueryWrapper.eq(MtOrder::getUserId, userId);
         }
-        if (merchantId > 0) {
+        if (merchantId != null && merchantId > 0) {
             lambdaQueryWrapper.eq(MtOrder::getMerchantId, merchantId);
         }
-        if (StringUtil.isNotEmpty(storeId)) {
+        if (storeId != null && storeId > 0) {
             lambdaQueryWrapper.eq(MtOrder::getStoreId, storeId);
         }
         if (StringUtil.isNotEmpty(staffId)) {
@@ -226,7 +246,7 @@ public class OrderServiceImpl extends ServiceImpl<MtOrderMapper, MtOrder> implem
         paginationResponse.setTotalElements(pageHelper.getTotal());
         paginationResponse.setContent(dataList);
 
-        return new ResponseObject(200, "查询成功", paginationResponse);
+        return paginationResponse;
     }
 
     /**
@@ -285,6 +305,7 @@ public class OrderServiceImpl extends ServiceImpl<MtOrderMapper, MtOrder> implem
         mtOrder.setIsVisitor(orderDto.getIsVisitor());
         mtOrder.setUpdateTime(new Date());
         mtOrder.setDeliveryFee(orderDto.getDeliveryFee() == null ? new BigDecimal(0) : orderDto.getDeliveryFee());
+        mtOrder.setSettleStatus(SettleStatusEnum.WAIT.getKey());
 
         if (mtOrder.getId() == null || mtOrder.getId() <= 0) {
             mtOrder.setCreateTime(new Date());
@@ -524,6 +545,412 @@ public class OrderServiceImpl extends ServiceImpl<MtOrderMapper, MtOrder> implem
         return orderInfo;
     }
 
+    /**
+     * 订单结算
+     * @return
+     * */
+    @Override
+    @Transactional(rollbackFor = Exception.class)
+    public Map<String, Object> doSettle(HttpServletRequest request, SettlementParam param) throws BusinessCheckException {
+        String token = request.getHeader("Access-Token");
+        Integer storeId = request.getHeader("storeId") == null ? 0 : Integer.parseInt(request.getHeader("storeId"));
+        String platform = request.getHeader("platform") == null ? "" : request.getHeader("platform");
+        String merchantNo = request.getHeader("merchantNo") == null ? "" : request.getHeader("merchantNo");
+
+        String cartIds = param.getCartIds() == null ? "" : param.getCartIds();
+        Integer targetId = param.getTargetId() == null ? 0 : Integer.parseInt(param.getTargetId()); // 储值卡、升级等级必填
+        String selectNum = param.getSelectNum() == null ? "" : param.getSelectNum(); // 储值卡必填
+        String remark = param.getRemark() == null ? "" : param.getRemark();
+        String type = param.getType() == null ? "" : param.getType(); // 订单类型
+        String payAmount = param.getPayAmount() == null ? "0" : StringUtil.isEmpty(param.getPayAmount()) ? "0" : param.getPayAmount(); // 支付金额
+        Integer usePoint = param.getUsePoint() == null ? 0 : param.getUsePoint(); // 使用积分数量
+        Integer couponId = param.getCouponId() == null ? 0 : param.getCouponId(); // 会员卡券ID
+        String payType = param.getPayType() == null ? PayTypeEnum.JSAPI.getKey() : param.getPayType();
+        String authCode = param.getAuthCode() == null ? "" : param.getAuthCode();
+        Integer userId = param.getUserId() == null ? 0 : param.getUserId(); // 指定下单会员 eg:收银功能
+        String cashierPayAmount = param.getCashierPayAmount() == null ? "" : param.getCashierPayAmount(); // 收银台实付金额
+        String cashierDiscountAmount = param.getCashierDiscountAmount() == null ? "" : param.getCashierDiscountAmount(); // 收银台优惠金额
+        Integer goodsId = param.getGoodsId() == null ? 0 : param.getGoodsId(); // 立即购买商品ID
+        Integer skuId = param.getSkuId() == null ? 0 : param.getSkuId(); // 立即购买商品skuId
+        Integer buyNum = param.getBuyNum() == null ? 1 : param.getBuyNum(); // 立即购买商品数量
+        String orderMode = param.getOrderMode()== null ? OrderModeEnum.ONESELF.getKey() : param.getOrderMode(); // 订单模式(配送or自取)
+        Integer orderId = param.getOrderId() == null ? null : param.getOrderId(); // 订单ID
+        Integer merchantId = merchantService.getMerchantId(merchantNo);
+        UserInfo loginInfo = TokenUtil.getUserInfoByToken(token);
+        MtUser userInfo = null;
+        if (loginInfo != null) {
+            userInfo = memberService.queryMemberById(loginInfo.getId());
+        }
+
+        // 后台管理员或店员操作
+        String operator = null;
+        Integer staffId = 0;
+        String isVisitor = YesOrNoEnum.NO.getKey();
+        AccountInfo accountInfo = TokenUtil.getAccountInfoByToken(token);
+        if (accountInfo != null) {
+            operator = accountInfo.getAccountName();
+            staffId = accountInfo.getStaffId() == null ? 0 : accountInfo.getStaffId();
+            storeId = accountInfo.getStoreId();
+            merchantId = accountInfo.getMerchantId();
+            if (storeId <= 0) {
+                MtStore mtStore = storeService.getDefaultStore(merchantNo);
+                if (mtStore != null) {
+                    storeId = mtStore.getId();
+                }
+            }
+            if (userId < 1) {
+                isVisitor = YesOrNoEnum.YES.getKey();
+            }
+        }
+
+        if (userInfo == null) {
+            MtUser user = memberService.getCurrentUserInfo(request, userId, token);
+            if (user != null) {
+                userInfo = memberService.queryMemberById(user.getId());
+            }
+        } else {
+            MtStaff mtStaff = staffService.queryStaffByUserId(userInfo.getId());
+            if (mtStaff == null) {
+                mtStaff = staffService.queryStaffByMobile(userInfo.getMobile());
+            }
+            if (mtStaff != null) {
+                operator = mtStaff.getRealName();
+            }
+        }
+
+        MtSetting config = settingService.querySettingByName(merchantId, OrderSettingEnum.IS_CLOSE.getKey());
+        if (config != null && config.getValue().equals("true")) {
+            throw new BusinessCheckException("系统已关闭交易功能,请稍后再试!");
+        }
+
+        // 收银台通过手机号自动注册会员信息
+        if ((userInfo == null || StringUtil.isEmpty(token))) {
+            String mobile = param.getMobile() == null ? "" : param.getMobile();
+            if (StringUtil.isNotEmpty(operator) && StringUtil.isNotEmpty(mobile)) {
+                userInfo = memberService.queryMemberByMobile(merchantId, mobile);
+                // 自动注册会员
+                if (userInfo == null) {
+                    userInfo = memberService.addMemberByMobile(merchantId, mobile);
+                }
+            }
+        }
+
+        if (userInfo == null) {
+            if (StringUtil.isNotEmpty(operator)) {
+                throw new BusinessCheckException("该管理员还未关联店铺员工");
+            } else {
+                throw new BusinessCheckException("请先登录");
+            }
+        }
+
+        if (userId <= 0) {
+            userId = userInfo.getId();
+        } else {
+            if (StringUtil.isNotEmpty(operator)) {
+                userInfo = memberService.queryMemberById(userId);
+            }
+        }
+        param.setUserId(userId);
+
+        // 订单所属店铺
+        if (storeId < 1) {
+            if (userInfo.getStoreId() > 0) {
+                storeId = userInfo.getStoreId();
+            }
+        }
+
+        // 生成订单数据
+        OrderDto orderDto = new OrderDto();
+        orderDto.setId(orderId);
+        orderDto.setRemark(remark);
+        orderDto.setUserId(userId);
+        orderDto.setMerchantId(merchantId);
+        orderDto.setStoreId(storeId);
+        orderDto.setType(type);
+        orderDto.setGoodsId(goodsId);
+        orderDto.setSkuId(skuId);
+        orderDto.setBuyNum(buyNum);
+        orderDto.setOrderMode(orderMode);
+        orderDto.setOperator(operator);
+        orderDto.setPayType(payType);
+        orderDto.setCouponId(0);
+        orderDto.setStaffId(staffId);
+        orderDto.setIsVisitor(isVisitor);
+        orderDto.setPlatform(platform);
+
+        MtSetting pointSetting = settingService.querySettingByName(merchantId, PointSettingEnum.CAN_USE_AS_MONEY.getKey());
+        // 使用积分数量
+        if (pointSetting != null && pointSetting.getValue().equals("true")) {
+            orderDto.setUsePoint(usePoint);
+        } else {
+            orderDto.setUsePoint(0);
+            usePoint = 0;
+        }
+
+        orderDto.setPointAmount(new BigDecimal("0"));
+        orderDto.setDiscount(new BigDecimal("0"));
+        orderDto.setPayAmount(new BigDecimal("0"));
+        orderDto.setAmount(new BigDecimal("0"));
+        orderDto.setCartIds(cartIds);
+
+        // 储值卡的订单
+        if (orderDto.getType().equals(OrderTypeEnum.PRESTORE.getKey())) {
+            orderDto.setCouponId(targetId);
+            String orderParam = "";
+            BigDecimal totalAmount = new BigDecimal(0);
+
+            MtCoupon couponInfo = couponService.queryCouponById(targetId);
+            String inRule = couponInfo.getInRule();
+            String[] selectNumArr = selectNum.split(",");
+            String[] ruleArr = inRule.split(",");
+            for (int i = 0; i < ruleArr.length; i++) {
+                String item = ruleArr[i] + "_" + (StringUtil.isNotEmpty(selectNumArr[i]) ? selectNumArr[i] : 0);
+                String[] itemArr = item.split("_");
+                // 预存金额
+                BigDecimal price = new BigDecimal(itemArr[0]);
+                // 预存数量
+                BigDecimal num = new BigDecimal(selectNumArr[i]);
+                BigDecimal amount = price.multiply(num);
+                totalAmount = totalAmount.add(amount);
+                orderParam = StringUtil.isEmpty(orderParam) ?  item : orderParam + ","+item;
+            }
+
+            orderDto.setParam(orderParam);
+            orderDto.setAmount(totalAmount);
+            payAmount = totalAmount.toString();
+        }
+
+        // 付款订单
+        if (orderDto.getType().equals(OrderTypeEnum.PAYMENT.getKey())) {
+            orderDto.setAmount(new BigDecimal(payAmount));
+            orderDto.setPayAmount(new BigDecimal(payAmount));
+            orderDto.setDiscount(new BigDecimal("0"));
+        }
+
+        // 会员升级订单
+        if (orderDto.getType().equals(OrderTypeEnum.MEMBER.getKey())) {
+            orderDto.setParam(targetId.toString());
+            orderDto.setCouponId(couponId);
+            MtUserGrade userGrade = userGradeService.queryUserGradeById(merchantId, targetId, orderDto.getUserId());
+            if (userGrade != null) {
+                orderDto.setRemark("付费升级" + userGrade.getName());
+                orderDto.setAmount(new BigDecimal(userGrade.getCatchValue().toString()));
+            }
+        }
+
+        // 商品订单
+        if (orderDto.getType().equals(OrderTypeEnum.GOOGS.getKey())) {
+            orderDto.setCouponId(couponId);
+        }
+
+        // 商品订单且配送要加上配送费用
+        if (orderDto.getType().equals(OrderTypeEnum.GOOGS.getKey()) && orderDto.getOrderMode().equals(OrderModeEnum.EXPRESS.getKey())) {
+            MtSetting mtSetting = settingService.querySettingByName(merchantId, OrderSettingEnum.DELIVERY_FEE.getKey());
+            if (mtSetting != null && StringUtil.isNotEmpty(mtSetting.getValue())) {
+                BigDecimal deliveryFee = new BigDecimal(mtSetting.getValue());
+                if (deliveryFee.compareTo(new BigDecimal("0")) > 0) {
+                    orderDto.setDeliveryFee(deliveryFee);
+                }
+            }
+        }
+
+        // 使用积分抵扣
+        if (usePoint > 0) {
+            List<MtSetting> settingList = settingService.getSettingList(merchantId, SettingTypeEnum.POINT.getKey());
+            String canUsedAsMoney = "false";
+            String exchangeNeedPoint = "0";
+            for (MtSetting setting : settingList) {
+                if (setting.getName().equals("canUsedAsMoney")) {
+                    canUsedAsMoney = setting.getValue();
+                } else if (setting.getName().equals("exchangeNeedPoint")) {
+                    exchangeNeedPoint = setting.getValue();
+                }
+            }
+            // 是否可以使用积分,并且积分数量足够
+            if (canUsedAsMoney.equals("true") && Float.parseFloat(exchangeNeedPoint) > 0 && (userInfo.getPoint() >= usePoint)) {
+                orderDto.setUsePoint(usePoint);
+                orderDto.setPointAmount(new BigDecimal(usePoint).divide(new BigDecimal(exchangeNeedPoint), BigDecimal.ROUND_CEILING, 3));
+                if (orderDto.getPayAmount().compareTo(orderDto.getPointAmount()) > 0) {
+                    orderDto.setPayAmount(orderDto.getPayAmount().subtract(orderDto.getPointAmount()));
+                } else {
+                    orderDto.setPayAmount(new BigDecimal("0"));
+                }
+            }
+        }
+
+        // 首先生成订单,拿到订单ID
+        MtOrder orderInfo;
+        try {
+            orderInfo = saveOrder(orderDto);
+        } catch (BusinessCheckException e) {
+            throw new BusinessCheckException(e.getMessage() == null ?  "生成订单失败" : e.getMessage());
+        }
+
+        orderDto.setId(orderInfo.getId());
+        param.setOrderId(orderInfo.getId());
+
+        // 收银台实付金额、优惠金额
+        if ((StringUtil.isNotEmpty(cashierPayAmount) || StringUtil.isNotEmpty(cashierDiscountAmount)) && StringUtil.isNotEmpty(operator)) {
+            OrderDto reqOrder = new OrderDto();
+            reqOrder.setId(orderInfo.getId());
+            if (orderInfo.getAmount().compareTo(new BigDecimal("0")) <= 0) {
+                reqOrder.setAmount(new BigDecimal(cashierPayAmount).add(new BigDecimal(cashierDiscountAmount)));
+            } else {
+                reqOrder.setAmount(orderInfo.getAmount());
+            }
+            if (new BigDecimal(cashierDiscountAmount).compareTo(new BigDecimal("0")) > 0) {
+                reqOrder.setDiscount(new BigDecimal(cashierDiscountAmount).add(orderInfo.getDiscount()));
+            } else {
+                reqOrder.setDiscount(orderInfo.getDiscount());
+            }
+            BigDecimal realPayAmount = reqOrder.getAmount().subtract(reqOrder.getDiscount());
+            if (realPayAmount.compareTo(new BigDecimal("0")) < 0) {
+                realPayAmount = new BigDecimal("0");
+            }
+            reqOrder.setPayAmount(realPayAmount);
+            updateOrder(reqOrder);
+            orderInfo = getOrderInfo(orderInfo.getId());
+        }
+
+        // 订单中使用卡券抵扣(付款订单、会员升级订单)
+        if (couponId > 0 && (orderDto.getType().equals(OrderTypeEnum.PAYMENT.getKey())) || orderDto.getType().equals(OrderTypeEnum.MEMBER.getKey())) {
+            if (orderDto.getAmount().compareTo(new BigDecimal("0")) > 0) {
+                MtUserCoupon userCouponInfo = userCouponService.getUserCouponDetail(couponId);
+                if (userCouponInfo != null) {
+                    MtCoupon couponInfo = couponService.queryCouponById(userCouponInfo.getCouponId());
+                    if (couponInfo != null) {
+                        boolean isEffective = couponService.isCouponEffective(couponInfo, userCouponInfo);
+                        if (isEffective && userCouponInfo.getUserId().equals(orderDto.getUserId())) {
+                            // 优惠券,直接减去优惠券金额
+                            if (couponInfo.getType().equals(CouponTypeEnum.COUPON.getKey())) {
+                                // 检查是否会员升级专用卡券
+                                boolean canUse = true;
+                                if (couponInfo.getUseFor() != null && StringUtil.isNotEmpty(couponInfo.getUseFor())) {
+                                    if (orderDto.getType().equals(OrderTypeEnum.MEMBER.getKey())) {
+                                        if (!couponInfo.getUseFor().equals(CouponUseForEnum.MEMBER_GRADE.getKey())) {
+                                            canUse = false;
+                                        }
+                                    }
+                                }
+                                if (canUse) {
+                                    String useCode = couponService.useCoupon(couponId, orderDto.getUserId(), orderDto.getStoreId(), orderInfo.getId(), userCouponInfo.getAmount(), "核销");
+                                    if (StringUtil.isNotEmpty(useCode)) {
+                                        orderDto.setCouponId(couponId);
+                                        orderDto.setDiscount(orderInfo.getDiscount().add(userCouponInfo.getAmount()));
+                                        updateOrder(orderDto);
+                                    }
+                                }
+                            } else if(couponInfo.getType().equals(CouponTypeEnum.PRESTORE.getKey())) {
+                                // 储值卡,减去余额
+                                BigDecimal useCouponAmount = userCouponInfo.getBalance();
+                                if (orderInfo.getPayAmount().compareTo(userCouponInfo.getBalance()) <= 0) {
+                                    useCouponAmount = orderInfo.getPayAmount();
+                                }
+                                try {
+                                    String useCode = couponService.useCoupon(couponId, orderDto.getUserId(), orderDto.getStoreId(), orderInfo.getId(), useCouponAmount, "核销");
+                                    if (StringUtil.isNotEmpty(useCode)) {
+                                        orderDto.setCouponId(couponId);
+                                        orderDto.setDiscount(orderInfo.getDiscount().add(useCouponAmount));
+                                        orderDto.setPayAmount(orderInfo.getPayAmount().subtract(useCouponAmount));
+                                        updateOrder(orderDto);
+                                    }
+                                } catch (BusinessCheckException e) {
+                                    throw new BusinessCheckException(e.getMessage() == null ?  "生成订单失败" : e.getMessage());
+                                }
+                            }
+                        }
+                    }
+                }
+            }
+        }
+
+        // 生成支付订单
+        orderInfo = getOrderInfo(orderInfo.getId());
+        String ip = CommonUtil.getIPFromHttpRequest(request);
+        BigDecimal realPayAmount = orderInfo.getAmount().subtract(new BigDecimal(orderInfo.getDiscount().toString())).subtract(new BigDecimal(orderInfo.getPointAmount().toString())).add(orderInfo.getDeliveryFee());
+
+        // 支付类的订单,检查余额是否充足
+        if (type.equals(OrderTypeEnum.PAYMENT.getKey()) && payType.equals(PayTypeEnum.BALANCE.getKey())) {
+            if (userInfo.getBalance() == null || realPayAmount.compareTo(userInfo.getBalance()) > 0) {
+                throw new BusinessCheckException("会员余额不足");
+            }
+            if (StringUtil.isNotEmpty(cashierPayAmount)) {
+                if (userInfo.getBalance() == null || new BigDecimal(cashierPayAmount).compareTo(userInfo.getBalance()) > 0) {
+                    throw new BusinessCheckException("会员余额不足");
+                }
+            }
+        }
+
+        ResponseObject paymentInfo = null;
+        String errorMessage = "";
+
+        // 应付金额大于0才提交微信支付
+        if (realPayAmount.compareTo(new BigDecimal("0")) > 0) {
+            if (payType.equals(PayTypeEnum.CASH.getKey()) && StringUtil.isNotEmpty(operator)) {
+                // 收银台现金支付,更新为已支付
+                setOrderPayed(orderInfo.getId(), null);
+            } else if(payType.equals(PayTypeEnum.BALANCE.getKey())) {
+                // 余额支付
+                MtBalance balance = new MtBalance();
+                balance.setMobile(userInfo.getMobile());
+                balance.setOrderSn(orderInfo.getOrderSn());
+                balance.setUserId(userInfo.getId());
+                balance.setMerchantId(userInfo.getMerchantId());
+                BigDecimal balanceAmount = realPayAmount.subtract(realPayAmount).subtract(realPayAmount);
+                balance.setAmount(balanceAmount);
+                boolean isPay = balanceService.addBalance(balance);
+                if (isPay) {
+                    setOrderPayed(orderInfo.getId(), realPayAmount);
+                } else {
+                    errorMessage = PropertiesUtil.getResponseErrorMessageByCode(5001);
+                }
+            } else {
+                BigDecimal wxPayAmount = realPayAmount.multiply(new BigDecimal("100"));
+                // 扫码支付,先返回不处理,后面拿到支付二维码再处理
+                if ((payType.equals(PayTypeEnum.MICROPAY.getKey()) || payType.equals(PayTypeEnum.ALISCAN.getKey())) && StringUtil.isEmpty(authCode)) {
+                    paymentInfo = new ResponseObject(200, "请求成功", new HashMap<>());
+                } else {
+                    paymentInfo = paymentService.createPrepayOrder(userInfo, orderInfo, (wxPayAmount.intValue()), authCode, 0, ip, platform);
+                }
+                if (paymentInfo.getData() == null) {
+                    errorMessage = PropertiesUtil.getResponseErrorMessageByCode(3000);
+                }
+            }
+        } else {
+            // 应付金额是0,直接更新为已支付
+            setOrderPayed(orderInfo.getId(), null);
+        }
+
+        orderInfo = getOrderInfo(orderInfo.getId());
+        Map<String, Object> outParams = new HashMap();
+        outParams.put("isCreated", true);
+        outParams.put("orderInfo", orderInfo);
+
+        if (paymentInfo != null) {
+            outParams.put("payment", paymentInfo.getData());
+            outParams.put("payType", payType);
+        } else {
+            outParams.put("payment", null);
+            outParams.put("payType", "BALANCE");
+        }
+
+        // 1分钟后发送小程序订阅消息
+        Date nowTime = new Date();
+        Date sendTime = new Date(nowTime.getTime() + 60000);
+        Map<String, Object> params = new HashMap<>();
+        String dateTime = DateUtil.formatDate(Calendar.getInstance().getTime(), "yyyy-MM-dd HH:mm");
+        params.put("time", dateTime);
+        params.put("orderSn", orderInfo.getOrderSn());
+        params.put("remark", "您的订单已生成,请留意~");
+        weixinService.sendSubscribeMessage(merchantId, userInfo.getId(), userInfo.getOpenId(), WxMessageEnum.ORDER_CREATED.getKey(), "pages/order/index", params, sendTime);
+
+        if (StringUtil.isNotEmpty(errorMessage)) {
+            throw new BusinessCheckException(errorMessage);
+        } else {
+            return outParams;
+        }
+    }
+
     /**
      * 获取订单详情
      *

+ 2 - 2
fuint-application/src/main/java/com/fuint/common/service/impl/SendSmsServiceImpl.java

@@ -129,8 +129,8 @@ public class SendSmsServiceImpl implements SendSmsService {
 
         boolean flag = false;
         try {
-            // idea下中文乱码
-            if (!CommonUtil.isUtf8(signName)) {
+            // 解决中文乱码
+            if (!CommonUtil.isUtf8(signName) || CommonUtil.isErrCode(signName)) {
                 signName = new String(signName.getBytes("ISO8859-1"), "UTF-8");
             }
 

+ 117 - 468
fuint-application/src/main/java/com/fuint/common/service/impl/SettlementServiceImpl.java

@@ -1,23 +1,33 @@
 package com.fuint.common.service.impl;
 
-import com.fuint.common.dto.AccountInfo;
-import com.fuint.common.dto.OrderDto;
-import com.fuint.common.dto.UserInfo;
-import com.fuint.common.enums.*;
-import com.fuint.common.param.SettlementParam;
-import com.fuint.common.service.*;
+import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
+import com.baomidou.mybatisplus.core.toolkit.Wrappers;
+import com.fuint.common.dto.UserOrderDto;
+import com.fuint.common.enums.SettleStatusEnum;
+import com.fuint.common.enums.StatusEnum;
+import com.fuint.common.param.OrderListParam;
+import com.fuint.common.service.OrderService;
+import com.fuint.common.service.SettlementService;
 import com.fuint.common.util.CommonUtil;
-import com.fuint.common.util.DateUtil;
-import com.fuint.common.util.TokenUtil;
+import com.fuint.framework.annoation.OperationServiceLog;
 import com.fuint.framework.exception.BusinessCheckException;
-import com.fuint.framework.web.ResponseObject;
-import com.fuint.repository.model.*;
-import com.fuint.utils.PropertiesUtil;
-import com.fuint.utils.StringUtil;
+import com.fuint.framework.pagination.PaginationRequest;
+import com.fuint.framework.pagination.PaginationResponse;
+import com.fuint.repository.mapper.MtSettlementMapper;
+import com.fuint.repository.mapper.MtSettlementOrderMapper;
+import com.fuint.repository.model.MtBanner;
+import com.fuint.repository.model.MtOrder;
+import com.fuint.repository.model.MtSettlement;
+import com.fuint.repository.model.MtSettlementOrder;
+import com.github.pagehelper.Page;
+import com.github.pagehelper.PageHelper;
+import org.apache.commons.lang.StringUtils;
 import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.data.domain.PageImpl;
+import org.springframework.data.domain.PageRequest;
 import org.springframework.stereotype.Service;
 import org.springframework.transaction.annotation.Transactional;
-import javax.servlet.http.HttpServletRequest;
+import javax.annotation.Resource;
 import java.math.BigDecimal;
 import java.util.*;
 
@@ -30,14 +40,11 @@ import java.util.*;
 @Service
 public class SettlementServiceImpl implements SettlementService {
 
-    @Autowired
-    private WeixinService weixinService;
+    @Resource
+    private MtSettlementMapper mtSettlementMapper;
 
-    /**
-     * 会员服务接口
-     * */
-    @Autowired
-    private MemberService memberService;
+    @Resource
+    private MtSettlementOrderMapper mtSettlementOrderMapper;
 
     /**
      * 订单服务接口
@@ -46,462 +53,104 @@ public class SettlementServiceImpl implements SettlementService {
     private OrderService orderService;
 
     /**
-     * 余额服务接口
-     * */
-    @Autowired
-    private BalanceService balanceService;
-
-    /**
-     * 店铺服务接口
-     */
-    @Autowired
-    private StoreService storeService;
-
-    /**
-     * 员工服务接口
-     * */
-    @Autowired
-    private StaffService staffService;
-
-    /**
-     * 配置服务接口
-     * */
-    @Autowired
-    private SettingService settingService;
-
-    /**
-     * 卡券服务接口
+     * 分页查询结算列表
+     *
+     * @param paginationRequest
+     * @return
      */
-    @Autowired
-    private CouponService couponService;
-
-    /**
-     * 会员等级接口
-     * */
-    @Autowired
-    UserGradeService userGradeService;
-
-    /**
-     * 会员卡券服务
-     * */
-    @Autowired
-    private UserCouponService userCouponService;
-
-    /**
-     * 支付服务接口
-     * */
-    @Autowired
-    private PaymentService paymentService;
+    @Override
+    public PaginationResponse<MtSettlement> querySettlementListByPagination(PaginationRequest paginationRequest) {
+        Page<MtBanner> pageHelper = PageHelper.startPage(paginationRequest.getCurrentPage(), paginationRequest.getPageSize());
+        LambdaQueryWrapper<MtSettlement> lambdaQueryWrapper = Wrappers.lambdaQuery();
+        lambdaQueryWrapper.ne(MtSettlement::getStatus, StatusEnum.DISABLE.getKey());
+
+        String status = paginationRequest.getSearchParams().get("status") == null ? "" : paginationRequest.getSearchParams().get("status").toString();
+        if (StringUtils.isNotBlank(status)) {
+            lambdaQueryWrapper.eq(MtSettlement::getStatus, status);
+        }
+        String merchantId = paginationRequest.getSearchParams().get("merchantId") == null ? "" : paginationRequest.getSearchParams().get("merchantId").toString();
+        if (StringUtils.isNotBlank(merchantId)) {
+            lambdaQueryWrapper.eq(MtSettlement::getMerchantId, merchantId);
+        }
+        String storeId = paginationRequest.getSearchParams().get("storeId") == null ? "" : paginationRequest.getSearchParams().get("storeId").toString();
+        if (StringUtils.isNotBlank(storeId)) {
+            lambdaQueryWrapper.eq(MtSettlement::getStoreId, storeId);
+        }
+        String description = paginationRequest.getSearchParams().get("description") == null ? "" : paginationRequest.getSearchParams().get("description").toString();
+        if (StringUtils.isNotBlank(description)) {
+            lambdaQueryWrapper.like(MtSettlement::getDescription, description);
+        }
+        lambdaQueryWrapper.orderByDesc(MtSettlement::getId);
+        List<MtSettlement> dataList = mtSettlementMapper.selectList(lambdaQueryWrapper);
+
+        PageRequest pageRequest = PageRequest.of(paginationRequest.getCurrentPage(), paginationRequest.getPageSize());
+        PageImpl pageImpl = new PageImpl(dataList, pageRequest, pageHelper.getTotal());
+        PaginationResponse<MtSettlement> paginationResponse = new PaginationResponse(pageImpl, MtSettlement.class);
+        paginationResponse.setTotalPages(pageHelper.getPages());
+        paginationResponse.setTotalElements(pageHelper.getTotal());
+        paginationResponse.setContent(dataList);
+
+        return paginationResponse;
+    }
 
     /**
-     * 商户服务接口
+     * 提交结算
+     *
+     * @param  mtSettlement
+     * @throws BusinessCheckException
      */
-    @Autowired
-    private MerchantService merchantService;
+    @Override
+    @Transactional(rollbackFor = Exception.class)
+    @OperationServiceLog(description = "发起结算")
+    public Boolean submitSettlement(MtSettlement mtSettlement) throws BusinessCheckException {
+        OrderListParam orderParam = new OrderListParam();
+        orderParam.setMerchantId(mtSettlement.getMerchantId());
+        orderParam.setStoreId(mtSettlement.getStoreId());
+        orderParam.setPage(1);
+        orderParam.setPageSize(100000);
+
+        PaginationResponse response = orderService.getUserOrderList(orderParam);
+        List<UserOrderDto> orderList = response.getContent();
+        BigDecimal amount = new BigDecimal("0");
+        BigDecimal totalOrderAmount = new BigDecimal("0");
+        if (orderList != null && orderList.size() > 0) {
+            for (UserOrderDto orderDto : orderList) {
+                 amount = amount.add(orderDto.getPayAmount());
+                 totalOrderAmount = totalOrderAmount.add(orderDto.getPayAmount());
+            }
+        }
+        mtSettlement.setSettlementNo(CommonUtil.createSettlementNo());
+        mtSettlement.setAmount(amount);
+        mtSettlement.setTotalOrderAmount(totalOrderAmount);
+        mtSettlement.setStatus(StatusEnum.ENABLED.getKey());
+        mtSettlement.setCreateTime(new Date());
+        mtSettlement.setUpdateTime(new Date());
+        mtSettlementMapper.insert(mtSettlement);
+        if (orderList != null && orderList.size() > 0) {
+            for (UserOrderDto orderDto : orderList) {
+                 MtSettlementOrder mtSettlementOrder = new MtSettlementOrder();
+                 mtSettlementOrder.setId(mtSettlement.getId());
+                 mtSettlementOrder.setOrderId(orderDto.getId());
+                 mtSettlementOrder.setCreateTime(new Date());
+                 mtSettlementOrder.setUpdateTime(new Date());
+                 mtSettlement.setStatus(StatusEnum.ENABLED.getKey());
+                 mtSettlementOrderMapper.insert(mtSettlementOrder);
+                 MtOrder mtOrder = orderService.getById(orderDto.getId());
+                 mtOrder.setSettleStatus(SettleStatusEnum.COMPLETE.getKey());
+                 orderService.updateOrder(mtOrder);
+            }
+        }
+        return true;
+    }
 
     /**
-     * 订单结算
+     * 获取结算详情
+     *
+     * @param settlementId
      * @return
      * */
     @Override
-    @Transactional(rollbackFor = Exception.class)
-    public Map<String, Object> doSubmit(HttpServletRequest request, SettlementParam param) throws BusinessCheckException {
-        String token = request.getHeader("Access-Token");
-        Integer storeId = request.getHeader("storeId") == null ? 0 : Integer.parseInt(request.getHeader("storeId"));
-        String platform = request.getHeader("platform") == null ? "" : request.getHeader("platform");
-        String merchantNo = request.getHeader("merchantNo") == null ? "" : request.getHeader("merchantNo");
-
-        String cartIds = param.getCartIds() == null ? "" : param.getCartIds();
-        Integer targetId = param.getTargetId() == null ? 0 : Integer.parseInt(param.getTargetId()); // 储值卡、升级等级必填
-        String selectNum = param.getSelectNum() == null ? "" : param.getSelectNum(); // 储值卡必填
-        String remark = param.getRemark() == null ? "" : param.getRemark();
-        String type = param.getType() == null ? "" : param.getType(); // 订单类型
-        String payAmount = param.getPayAmount() == null ? "0" : StringUtil.isEmpty(param.getPayAmount()) ? "0" : param.getPayAmount(); // 支付金额
-        Integer usePoint = param.getUsePoint() == null ? 0 : param.getUsePoint(); // 使用积分数量
-        Integer couponId = param.getCouponId() == null ? 0 : param.getCouponId(); // 会员卡券ID
-        String payType = param.getPayType() == null ? PayTypeEnum.JSAPI.getKey() : param.getPayType();
-        String authCode = param.getAuthCode() == null ? "" : param.getAuthCode();
-        Integer userId = param.getUserId() == null ? 0 : param.getUserId(); // 指定下单会员 eg:收银功能
-        String cashierPayAmount = param.getCashierPayAmount() == null ? "" : param.getCashierPayAmount(); // 收银台实付金额
-        String cashierDiscountAmount = param.getCashierDiscountAmount() == null ? "" : param.getCashierDiscountAmount(); // 收银台优惠金额
-        Integer goodsId = param.getGoodsId() == null ? 0 : param.getGoodsId(); // 立即购买商品ID
-        Integer skuId = param.getSkuId() == null ? 0 : param.getSkuId(); // 立即购买商品skuId
-        Integer buyNum = param.getBuyNum() == null ? 1 : param.getBuyNum(); // 立即购买商品数量
-        String orderMode = param.getOrderMode()== null ? OrderModeEnum.ONESELF.getKey() : param.getOrderMode(); // 订单模式(配送or自取)
-        Integer orderId = param.getOrderId() == null ? null : param.getOrderId(); // 订单ID
-        Integer merchantId = merchantService.getMerchantId(merchantNo);
-        UserInfo loginInfo = TokenUtil.getUserInfoByToken(token);
-        MtUser userInfo = null;
-        if (loginInfo != null) {
-            userInfo = memberService.queryMemberById(loginInfo.getId());
-        }
-
-        // 后台管理员或店员操作
-        String operator = null;
-        Integer staffId = 0;
-        String isVisitor = YesOrNoEnum.NO.getKey();
-        AccountInfo accountInfo = TokenUtil.getAccountInfoByToken(token);
-        if (accountInfo != null) {
-            operator = accountInfo.getAccountName();
-            staffId = accountInfo.getStaffId() == null ? 0 : accountInfo.getStaffId();
-            storeId = accountInfo.getStoreId();
-            merchantId = accountInfo.getMerchantId();
-            if (storeId <= 0) {
-                MtStore mtStore = storeService.getDefaultStore(merchantNo);
-                if (mtStore != null) {
-                    storeId = mtStore.getId();
-                }
-            }
-            if (userId < 1) {
-                isVisitor = YesOrNoEnum.YES.getKey();
-            }
-        }
-
-        if (userInfo == null) {
-            MtUser user = memberService.getCurrentUserInfo(request, userId, token);
-            if (user != null) {
-                userInfo = memberService.queryMemberById(user.getId());
-            }
-        } else {
-            MtStaff mtStaff = staffService.queryStaffByUserId(userInfo.getId());
-            if (mtStaff == null) {
-                mtStaff = staffService.queryStaffByMobile(userInfo.getMobile());
-            }
-            if (mtStaff != null) {
-                operator = mtStaff.getRealName();
-            }
-        }
-
-        MtSetting config = settingService.querySettingByName(merchantId, OrderSettingEnum.IS_CLOSE.getKey());
-        if (config != null && config.getValue().equals("true")) {
-            throw new BusinessCheckException("系统已关闭交易功能,请稍后再试!");
-        }
-
-        // 收银台通过手机号自动注册会员信息
-        if ((userInfo == null || StringUtil.isEmpty(token))) {
-            String mobile = param.getMobile() == null ? "" : param.getMobile();
-            if (StringUtil.isNotEmpty(operator) && StringUtil.isNotEmpty(mobile)) {
-                userInfo = memberService.queryMemberByMobile(merchantId, mobile);
-                // 自动注册会员
-                if (userInfo == null) {
-                    userInfo = memberService.addMemberByMobile(merchantId, mobile);
-                }
-            }
-        }
-
-        if (userInfo == null) {
-            if (StringUtil.isNotEmpty(operator)) {
-                throw new BusinessCheckException("该管理员还未关联店铺员工");
-            } else {
-                throw new BusinessCheckException("请先登录");
-            }
-        }
-
-        if (userId <= 0) {
-            userId = userInfo.getId();
-        } else {
-            if (StringUtil.isNotEmpty(operator)) {
-                userInfo = memberService.queryMemberById(userId);
-            }
-        }
-        param.setUserId(userId);
-
-        // 订单所属店铺
-        if (storeId < 1) {
-            if (userInfo.getStoreId() > 0) {
-                storeId = userInfo.getStoreId();
-            }
-        }
-
-        // 生成订单数据
-        OrderDto orderDto = new OrderDto();
-        orderDto.setId(orderId);
-        orderDto.setRemark(remark);
-        orderDto.setUserId(userId);
-        orderDto.setMerchantId(merchantId);
-        orderDto.setStoreId(storeId);
-        orderDto.setType(type);
-        orderDto.setGoodsId(goodsId);
-        orderDto.setSkuId(skuId);
-        orderDto.setBuyNum(buyNum);
-        orderDto.setOrderMode(orderMode);
-        orderDto.setOperator(operator);
-        orderDto.setPayType(payType);
-        orderDto.setCouponId(0);
-        orderDto.setStaffId(staffId);
-        orderDto.setIsVisitor(isVisitor);
-        orderDto.setPlatform(platform);
-
-        MtSetting pointSetting = settingService.querySettingByName(merchantId, PointSettingEnum.CAN_USE_AS_MONEY.getKey());
-        // 使用积分数量
-        if (pointSetting != null && pointSetting.getValue().equals("true")) {
-            orderDto.setUsePoint(usePoint);
-        } else {
-            orderDto.setUsePoint(0);
-            usePoint = 0;
-        }
-
-        orderDto.setPointAmount(new BigDecimal("0"));
-        orderDto.setDiscount(new BigDecimal("0"));
-        orderDto.setPayAmount(new BigDecimal("0"));
-        orderDto.setAmount(new BigDecimal("0"));
-        orderDto.setCartIds(cartIds);
-
-        // 储值卡的订单
-        if (orderDto.getType().equals(OrderTypeEnum.PRESTORE.getKey())) {
-            orderDto.setCouponId(targetId);
-            String orderParam = "";
-            BigDecimal totalAmount = new BigDecimal(0);
-
-            MtCoupon couponInfo = couponService.queryCouponById(targetId);
-            String inRule = couponInfo.getInRule();
-            String[] selectNumArr = selectNum.split(",");
-            String[] ruleArr = inRule.split(",");
-            for (int i = 0; i < ruleArr.length; i++) {
-                String item = ruleArr[i] + "_" + (StringUtil.isNotEmpty(selectNumArr[i]) ? selectNumArr[i] : 0);
-                String[] itemArr = item.split("_");
-                // 预存金额
-                BigDecimal price = new BigDecimal(itemArr[0]);
-                // 预存数量
-                BigDecimal num = new BigDecimal(selectNumArr[i]);
-                BigDecimal amount = price.multiply(num);
-                totalAmount = totalAmount.add(amount);
-                orderParam = StringUtil.isEmpty(orderParam) ?  item : orderParam + ","+item;
-            }
-
-            orderDto.setParam(orderParam);
-            orderDto.setAmount(totalAmount);
-            payAmount = totalAmount.toString();
-        }
-
-        // 付款订单
-        if (orderDto.getType().equals(OrderTypeEnum.PAYMENT.getKey())) {
-            orderDto.setAmount(new BigDecimal(payAmount));
-            orderDto.setPayAmount(new BigDecimal(payAmount));
-            orderDto.setDiscount(new BigDecimal("0"));
-        }
-
-        // 会员升级订单
-        if (orderDto.getType().equals(OrderTypeEnum.MEMBER.getKey())) {
-            orderDto.setParam(targetId.toString());
-            orderDto.setCouponId(couponId);
-            MtUserGrade userGrade = userGradeService.queryUserGradeById(merchantId, targetId, orderDto.getUserId());
-            if (userGrade != null) {
-                orderDto.setRemark("付费升级" + userGrade.getName());
-                orderDto.setAmount(new BigDecimal(userGrade.getCatchValue().toString()));
-            }
-        }
-
-        // 商品订单
-        if (orderDto.getType().equals(OrderTypeEnum.GOOGS.getKey())) {
-            orderDto.setCouponId(couponId);
-        }
-
-        // 商品订单且配送要加上配送费用
-        if (orderDto.getType().equals(OrderTypeEnum.GOOGS.getKey()) && orderDto.getOrderMode().equals(OrderModeEnum.EXPRESS.getKey())) {
-            MtSetting mtSetting = settingService.querySettingByName(merchantId, OrderSettingEnum.DELIVERY_FEE.getKey());
-            if (mtSetting != null && StringUtil.isNotEmpty(mtSetting.getValue())) {
-                BigDecimal deliveryFee = new BigDecimal(mtSetting.getValue());
-                if (deliveryFee.compareTo(new BigDecimal("0")) > 0) {
-                    orderDto.setDeliveryFee(deliveryFee);
-                }
-            }
-        }
-
-        // 使用积分抵扣
-        if (usePoint > 0) {
-            List<MtSetting> settingList = settingService.getSettingList(merchantId, SettingTypeEnum.POINT.getKey());
-            String canUsedAsMoney = "false";
-            String exchangeNeedPoint = "0";
-            for (MtSetting setting : settingList) {
-                if (setting.getName().equals("canUsedAsMoney")) {
-                    canUsedAsMoney = setting.getValue();
-                } else if (setting.getName().equals("exchangeNeedPoint")) {
-                    exchangeNeedPoint = setting.getValue();
-                }
-            }
-            // 是否可以使用积分,并且积分数量足够
-            if (canUsedAsMoney.equals("true") && Float.parseFloat(exchangeNeedPoint) > 0 && (userInfo.getPoint() >= usePoint)) {
-                orderDto.setUsePoint(usePoint);
-                orderDto.setPointAmount(new BigDecimal(usePoint).divide(new BigDecimal(exchangeNeedPoint), BigDecimal.ROUND_CEILING, 3));
-                if (orderDto.getPayAmount().compareTo(orderDto.getPointAmount()) > 0) {
-                    orderDto.setPayAmount(orderDto.getPayAmount().subtract(orderDto.getPointAmount()));
-                } else {
-                    orderDto.setPayAmount(new BigDecimal("0"));
-                }
-            }
-        }
-
-        // 首先生成订单,拿到订单ID
-        MtOrder orderInfo;
-        try {
-            orderInfo = orderService.saveOrder(orderDto);
-        } catch (BusinessCheckException e) {
-            throw new BusinessCheckException(e.getMessage() == null ?  "生成订单失败" : e.getMessage());
-        }
-
-        orderDto.setId(orderInfo.getId());
-        param.setOrderId(orderInfo.getId());
-
-        // 收银台实付金额、优惠金额
-        if ((StringUtil.isNotEmpty(cashierPayAmount) || StringUtil.isNotEmpty(cashierDiscountAmount)) && StringUtil.isNotEmpty(operator)) {
-            OrderDto reqOrder = new OrderDto();
-            reqOrder.setId(orderInfo.getId());
-            if (orderInfo.getAmount().compareTo(new BigDecimal("0")) <= 0) {
-                reqOrder.setAmount(new BigDecimal(cashierPayAmount).add(new BigDecimal(cashierDiscountAmount)));
-            } else {
-                reqOrder.setAmount(orderInfo.getAmount());
-            }
-            if (new BigDecimal(cashierDiscountAmount).compareTo(new BigDecimal("0")) > 0) {
-                reqOrder.setDiscount(new BigDecimal(cashierDiscountAmount).add(orderInfo.getDiscount()));
-            } else {
-                reqOrder.setDiscount(orderInfo.getDiscount());
-            }
-            BigDecimal realPayAmount = reqOrder.getAmount().subtract(reqOrder.getDiscount());
-            if (realPayAmount.compareTo(new BigDecimal("0")) < 0) {
-                realPayAmount = new BigDecimal("0");
-            }
-            reqOrder.setPayAmount(realPayAmount);
-            orderService.updateOrder(reqOrder);
-            orderInfo = orderService.getOrderInfo(orderInfo.getId());
-        }
-
-        // 订单中使用卡券抵扣(付款订单、会员升级订单)
-        if (couponId > 0 && (orderDto.getType().equals(OrderTypeEnum.PAYMENT.getKey())) || orderDto.getType().equals(OrderTypeEnum.MEMBER.getKey())) {
-            if (orderDto.getAmount().compareTo(new BigDecimal("0")) > 0) {
-                MtUserCoupon userCouponInfo = userCouponService.getUserCouponDetail(couponId);
-                if (userCouponInfo != null) {
-                    MtCoupon couponInfo = couponService.queryCouponById(userCouponInfo.getCouponId());
-                    if (couponInfo != null) {
-                        boolean isEffective = couponService.isCouponEffective(couponInfo, userCouponInfo);
-                        if (isEffective && userCouponInfo.getUserId().equals(orderDto.getUserId())) {
-                            // 优惠券,直接减去优惠券金额
-                            if (couponInfo.getType().equals(CouponTypeEnum.COUPON.getKey())) {
-                                // 检查是否会员升级专用卡券
-                                boolean canUse = true;
-                                if (couponInfo.getUseFor() != null && StringUtil.isNotEmpty(couponInfo.getUseFor())) {
-                                    if (orderDto.getType().equals(OrderTypeEnum.MEMBER.getKey())) {
-                                        if (!couponInfo.getUseFor().equals(CouponUseForEnum.MEMBER_GRADE.getKey())) {
-                                            canUse = false;
-                                        }
-                                    }
-                                }
-                                if (canUse) {
-                                    String useCode = couponService.useCoupon(couponId, orderDto.getUserId(), orderDto.getStoreId(), orderInfo.getId(), userCouponInfo.getAmount(), "核销");
-                                    if (StringUtil.isNotEmpty(useCode)) {
-                                        orderDto.setCouponId(couponId);
-                                        orderDto.setDiscount(orderInfo.getDiscount().add(userCouponInfo.getAmount()));
-                                        orderService.updateOrder(orderDto);
-                                    }
-                                }
-                            } else if(couponInfo.getType().equals(CouponTypeEnum.PRESTORE.getKey())) {
-                                // 储值卡,减去余额
-                                BigDecimal useCouponAmount = userCouponInfo.getBalance();
-                                if (orderInfo.getPayAmount().compareTo(userCouponInfo.getBalance()) <= 0) {
-                                    useCouponAmount = orderInfo.getPayAmount();
-                                }
-                                try {
-                                    String useCode = couponService.useCoupon(couponId, orderDto.getUserId(), orderDto.getStoreId(), orderInfo.getId(), useCouponAmount, "核销");
-                                    if (StringUtil.isNotEmpty(useCode)) {
-                                        orderDto.setCouponId(couponId);
-                                        orderDto.setDiscount(orderInfo.getDiscount().add(useCouponAmount));
-                                        orderDto.setPayAmount(orderInfo.getPayAmount().subtract(useCouponAmount));
-                                        orderService.updateOrder(orderDto);
-                                    }
-                                } catch (BusinessCheckException e) {
-                                    throw new BusinessCheckException(e.getMessage() == null ?  "生成订单失败" : e.getMessage());
-                                }
-                            }
-                        }
-                    }
-                }
-            }
-        }
-
-        // 生成支付订单
-        orderInfo = orderService.getOrderInfo(orderInfo.getId());
-        String ip = CommonUtil.getIPFromHttpRequest(request);
-        BigDecimal realPayAmount = orderInfo.getAmount().subtract(new BigDecimal(orderInfo.getDiscount().toString())).subtract(new BigDecimal(orderInfo.getPointAmount().toString())).add(orderInfo.getDeliveryFee());
-
-        // 支付类的订单,检查余额是否充足
-        if (type.equals(OrderTypeEnum.PAYMENT.getKey()) && payType.equals(PayTypeEnum.BALANCE.getKey())) {
-            if (userInfo.getBalance() == null || realPayAmount.compareTo(userInfo.getBalance()) > 0) {
-                throw new BusinessCheckException("会员余额不足");
-            }
-            if (StringUtil.isNotEmpty(cashierPayAmount)) {
-                if (userInfo.getBalance() == null || new BigDecimal(cashierPayAmount).compareTo(userInfo.getBalance()) > 0) {
-                    throw new BusinessCheckException("会员余额不足");
-                }
-            }
-        }
-
-        ResponseObject paymentInfo = null;
-        String errorMessage = "";
-
-        // 应付金额大于0才提交微信支付
-        if (realPayAmount.compareTo(new BigDecimal("0")) > 0) {
-            if (payType.equals(PayTypeEnum.CASH.getKey()) && StringUtil.isNotEmpty(operator)) {
-                // 收银台现金支付,更新为已支付
-                orderService.setOrderPayed(orderInfo.getId(), null);
-            } else if(payType.equals(PayTypeEnum.BALANCE.getKey())) {
-                // 余额支付
-                MtBalance balance = new MtBalance();
-                balance.setMobile(userInfo.getMobile());
-                balance.setOrderSn(orderInfo.getOrderSn());
-                balance.setUserId(userInfo.getId());
-                balance.setMerchantId(userInfo.getMerchantId());
-                BigDecimal balanceAmount = realPayAmount.subtract(realPayAmount).subtract(realPayAmount);
-                balance.setAmount(balanceAmount);
-                boolean isPay = balanceService.addBalance(balance);
-                if (isPay) {
-                    orderService.setOrderPayed(orderInfo.getId(), realPayAmount);
-                } else {
-                    errorMessage = PropertiesUtil.getResponseErrorMessageByCode(5001);
-                }
-            } else {
-                BigDecimal wxPayAmount = realPayAmount.multiply(new BigDecimal("100"));
-                // 扫码支付,先返回不处理,后面拿到支付二维码再处理
-                if ((payType.equals(PayTypeEnum.MICROPAY.getKey()) || payType.equals(PayTypeEnum.ALISCAN.getKey())) && StringUtil.isEmpty(authCode)) {
-                    paymentInfo = new ResponseObject(200, "请求成功", new HashMap<>());
-                } else {
-                    paymentInfo = paymentService.createPrepayOrder(userInfo, orderInfo, (wxPayAmount.intValue()), authCode, 0, ip, platform);
-                }
-                if (paymentInfo.getData() == null) {
-                    errorMessage = PropertiesUtil.getResponseErrorMessageByCode(3000);
-                }
-            }
-        } else {
-            // 应付金额是0,直接更新为已支付
-            orderService.setOrderPayed(orderInfo.getId(), null);
-        }
-
-        orderInfo = orderService.getOrderInfo(orderInfo.getId());
-        Map<String, Object> outParams = new HashMap();
-        outParams.put("isCreated", true);
-        outParams.put("orderInfo", orderInfo);
-
-        if (paymentInfo != null) {
-            outParams.put("payment", paymentInfo.getData());
-            outParams.put("payType", payType);
-        } else {
-            outParams.put("payment", null);
-            outParams.put("payType", "BALANCE");
-        }
-
-        // 1分钟后发送小程序订阅消息
-        Date nowTime = new Date();
-        Date sendTime = new Date(nowTime.getTime() + 60000);
-        Map<String, Object> params = new HashMap<>();
-        String dateTime = DateUtil.formatDate(Calendar.getInstance().getTime(), "yyyy-MM-dd HH:mm");
-        params.put("time", dateTime);
-        params.put("orderSn", orderInfo.getOrderSn());
-        params.put("remark", "您的订单已生成,请留意~");
-        weixinService.sendSubscribeMessage(merchantId, userInfo.getId(), userInfo.getOpenId(), WxMessageEnum.ORDER_CREATED.getKey(), "pages/order/index", params, sendTime);
-
-        if (StringUtil.isNotEmpty(errorMessage)) {
-            throw new BusinessCheckException(errorMessage);
-        } else {
-            return outParams;
-        }
+    public MtSettlement getSettlementInfo(Integer settlementId) {
+        return mtSettlementMapper.selectById(settlementId);
     }
 }

+ 20 - 0
fuint-application/src/main/java/com/fuint/common/util/CommonUtil.java

@@ -52,6 +52,15 @@ public class CommonUtil {
         return false;
     }
 
+    /**
+     * 判断是否乱码
+     *
+     * @param str
+     * @return
+     * */
+    public static boolean isErrCode(String str) {
+        return !(java.nio.charset.Charset.forName("GBK").newEncoder().canEncode(str));
+    }
 
     /**
      * 判断是否数字
@@ -117,6 +126,17 @@ public class CommonUtil {
         return sb.toString();
     }
 
+    /**
+     * 生成随机结算单号(13位数)
+     * */
+    public static String createSettlementNo() {
+        StringBuilder sb = new StringBuilder("8");
+        sb.append(SeqUtil.getRandomNumber(4));
+        sb.append(SeqUtil.getRandomNumber(4));
+        sb.append(SeqUtil.getRandomNumber(4));
+        return sb.toString();
+    }
+
     /**
      * 生成随机订单号
      * @param userId

+ 7 - 6
fuint-application/src/main/java/com/fuint/module/backendApi/controller/BackendOrderController.java

@@ -6,6 +6,7 @@ import com.fuint.common.param.OrderListParam;
 import com.fuint.common.service.*;
 import com.fuint.common.util.TokenUtil;
 import com.fuint.framework.exception.BusinessCheckException;
+import com.fuint.framework.pagination.PaginationResponse;
 import com.fuint.framework.web.BaseController;
 import com.fuint.framework.web.ResponseObject;
 import com.fuint.repository.model.MtSetting;
@@ -97,9 +98,9 @@ public class BackendOrderController extends BaseController {
         }
         Integer storeId = account.getStoreId() == null ? 0 : account.getStoreId();
         if (storeId > 0) {
-            orderListParam.setStoreId(storeId.toString());
+            orderListParam.setStoreId(storeId);
         }
-        ResponseObject response = orderService.getUserOrderList(orderListParam);
+        PaginationResponse response = orderService.getUserOrderList(orderListParam);
         // 订单类型列表
         OrderTypeEnum[] typeListEnum = OrderTypeEnum.values();
         List<ParamDto> typeList = new ArrayList<>();
@@ -173,7 +174,7 @@ public class BackendOrderController extends BaseController {
         result.put("orderModeList", orderModeList);
         result.put("storeList", storeList);
         result.put("payTypeList", payTypeList);
-        result.put("paginationResponse", response.getData());
+        result.put("paginationResponse", response);
 
         return getSuccessResult(result);
     }
@@ -396,14 +397,14 @@ public class BackendOrderController extends BaseController {
         Integer storeId = account.getStoreId() == null ? 0 : account.getStoreId();
         Integer staffId = account.getStaffId();
         if (storeId > 0) {
-            orderListParam.setStoreId(storeId.toString());
+            orderListParam.setStoreId(storeId);
         }
         if (staffId > 0) {
             orderListParam.setStaffId(staffId.toString());
         }
 
-        ResponseObject response = orderService.getUserOrderList(orderListParam);
-        return getSuccessResult(response.getData());
+        PaginationResponse response = orderService.getUserOrderList(orderListParam);
+        return getSuccessResult(response);
     }
 
     /**

+ 161 - 0
fuint-application/src/main/java/com/fuint/module/backendApi/controller/BackendSettlementController.java

@@ -0,0 +1,161 @@
+package com.fuint.module.backendApi.controller;
+
+import com.fuint.common.Constants;
+import com.fuint.common.dto.AccountInfo;
+import com.fuint.common.enums.StatusEnum;
+import com.fuint.common.service.MerchantService;
+import com.fuint.common.service.SettlementService;
+import com.fuint.common.service.StoreService;
+import com.fuint.common.util.TokenUtil;
+import com.fuint.framework.exception.BusinessCheckException;
+import com.fuint.framework.pagination.PaginationRequest;
+import com.fuint.framework.pagination.PaginationResponse;
+import com.fuint.framework.web.BaseController;
+import com.fuint.framework.web.ResponseObject;
+import com.fuint.repository.model.MtMerchant;
+import com.fuint.repository.model.MtSettlement;
+import com.fuint.repository.model.MtStore;
+import com.fuint.utils.StringUtil;
+import io.swagger.annotations.Api;
+import io.swagger.annotations.ApiOperation;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.security.access.prepost.PreAuthorize;
+import org.springframework.web.bind.annotation.*;
+import javax.servlet.http.HttpServletRequest;
+import java.util.*;
+
+/**
+ * 商户结算管理controller
+ *
+ * Created by FSQ
+ * CopyRight https://www.fuint.cn
+ */
+@Api(tags="管理端-商户结算相关接口")
+@RestController
+@RequestMapping(value = "/backendApi/settlement")
+public class BackendSettlementController extends BaseController {
+
+    /**
+     * 结算服务接口
+     * */
+    @Autowired
+    private SettlementService settlementService;
+
+    /**
+     * 店铺服务接口
+     */
+    @Autowired
+    private StoreService storeService;
+
+    /**
+     * 商户服务接口
+     */
+    @Autowired
+    private MerchantService merchantService;
+
+    /**
+     * 结算列表查询
+     *
+     * @param  request HttpServletRequest对象
+     * @return 余额明细列表
+     */
+    @ApiOperation(value = "结算列表查询")
+    @RequestMapping(value = "/list", method = RequestMethod.GET)
+    @CrossOrigin
+    @PreAuthorize("@pms.hasPermission('settlement:index')")
+    public ResponseObject list(HttpServletRequest request) throws BusinessCheckException {
+        String token = request.getHeader("Access-Token");
+        Integer page = request.getParameter("page") == null ? Constants.PAGE_NUMBER : Integer.parseInt(request.getParameter("page"));
+        Integer pageSize = request.getParameter("pageSize") == null ? Constants.PAGE_SIZE : Integer.parseInt(request.getParameter("pageSize"));
+        String mobile = request.getParameter("mobile") == null ? "" : request.getParameter("mobile");
+        String userId = request.getParameter("userId") == null ? "" : request.getParameter("userId");
+        String status = request.getParameter("status") == null ? StatusEnum.ENABLED.getKey() : request.getParameter("status");
+
+        AccountInfo accountInfo = TokenUtil.getAccountInfoByToken(token);
+        if (accountInfo == null) {
+            return getFailureResult(1001, "请先登录");
+        }
+        Map<String, Object> searchParams = new HashMap<>();
+        if (StringUtil.isNotEmpty(mobile)) {
+            searchParams.put("mobile", mobile);
+        }
+        if (StringUtil.isNotEmpty(userId)) {
+            searchParams.put("userId", userId);
+        }
+        if (StringUtil.isNotEmpty(status)) {
+            searchParams.put("status", status);
+        }
+        Integer storeId = accountInfo.getStoreId();
+        if (storeId != null && storeId > 0) {
+            searchParams.put("storeId", storeId);
+        }
+        if (accountInfo.getMerchantId() != null && accountInfo.getMerchantId() > 0) {
+            searchParams.put("merchantId", accountInfo.getMerchantId());
+        }
+
+        Map<String, Object> params = new HashMap<>();
+        params.put("status", StatusEnum.ENABLED.getKey());
+        if (accountInfo.getStoreId() != null && accountInfo.getStoreId() > 0) {
+            params.put("storeId", accountInfo.getStoreId());
+        }
+        if (accountInfo.getMerchantId() != null && accountInfo.getMerchantId() > 0) {
+            params.put("merchantId", accountInfo.getMerchantId());
+        }
+        List<MtStore> storeList = storeService.queryStoresByParams(params);
+        List<MtMerchant> merchantList = merchantService.queryMerchantByParams(params);
+
+        PaginationRequest paginationRequest = new PaginationRequest();
+        paginationRequest.setCurrentPage(page);
+        paginationRequest.setPageSize(pageSize);
+        paginationRequest.setSearchParams(searchParams);
+
+        PaginationResponse<MtSettlement> paginationResponse = settlementService.querySettlementListByPagination(paginationRequest);
+
+        Map<String, Object> result = new HashMap<>();
+        result.put("merchantList", merchantList);
+        result.put("storeList", storeList);
+        result.put("paginationResponse", paginationResponse);
+
+        return getSuccessResult(result);
+    }
+
+    /**
+     * 提交结算
+     *
+     * @param request HttpServletRequest对象
+     * @return
+     */
+    @ApiOperation(value = "提交结算")
+    @RequestMapping(value = "/doSubmit", method = RequestMethod.POST)
+    @CrossOrigin
+    @PreAuthorize("@pms.hasPermission('settlement:doSubmit')")
+    public ResponseObject doSubmit(HttpServletRequest request, @RequestBody Map<String, Object> param) throws BusinessCheckException {
+        String token = request.getHeader("Access-Token");
+        String merchantId = StringUtil.isEmpty(param.get("merchantId").toString())? "0" : param.get("merchantId").toString();
+        String storeId = StringUtil.isEmpty(param.get("storeId").toString()) ? "0" : param.get("storeId").toString();
+        String remark = param.get("remark") == null ? "后台发起结算" : param.get("remark").toString();
+
+        AccountInfo accountInfo = TokenUtil.getAccountInfoByToken(token);
+        if (accountInfo == null) {
+            return getFailureResult(1001, "请先登录");
+        }
+
+        String operator = accountInfo.getAccountName();
+        MtSettlement mtSettlement = new MtSettlement();
+        if (accountInfo.getMerchantId() != null && accountInfo.getMerchantId() > 0) {
+            mtSettlement.setMerchantId(accountInfo.getMerchantId());
+        } else {
+            mtSettlement.setMerchantId(Integer.parseInt(merchantId));
+        }
+        if (accountInfo.getStoreId() != null && accountInfo.getStoreId() > 0) {
+            mtSettlement.setStoreId(accountInfo.getStoreId());
+        } else {
+            mtSettlement.setStoreId(Integer.parseInt(storeId));
+        }
+        mtSettlement.setDescription(remark);
+        mtSettlement.setOperator(operator);
+
+        settlementService.submitSettlement(mtSettlement);
+        return getSuccessResult(true);
+    }
+}

+ 1 - 1
fuint-application/src/main/java/com/fuint/module/backendApi/controller/BackendSubMessageController.java

@@ -160,7 +160,7 @@ public class BackendSubMessageController extends BaseController {
                         dto.setKey(obj.get("key").toString());
                         // 解决中文乱码
                         String pName = obj.get("name").toString();
-                        if (!CommonUtil.isUtf8(pName)) {
+                        if (!CommonUtil.isUtf8(pName) || CommonUtil.isErrCode(pName)) {
                             pName = new String(obj.get("name").toString().getBytes("ISO8859-1"), "UTF-8");
                         }
                         dto.setName(pName);

+ 3 - 2
fuint-application/src/main/java/com/fuint/module/clientApi/controller/ClientOrderController.java

@@ -8,6 +8,7 @@ import com.fuint.common.param.OrderListParam;
 import com.fuint.common.service.OrderService;
 import com.fuint.common.util.TokenUtil;
 import com.fuint.framework.exception.BusinessCheckException;
+import com.fuint.framework.pagination.PaginationResponse;
 import com.fuint.framework.web.BaseController;
 import com.fuint.framework.web.ResponseObject;
 import com.fuint.repository.model.MtOrder;
@@ -53,9 +54,9 @@ public class ClientOrderController extends BaseController {
         }
 
         orderListParam.setUserId(userInfo.getId().toString());
-        ResponseObject orderData = orderService.getUserOrderList(orderListParam);
+        PaginationResponse orderData = orderService.getUserOrderList(orderListParam);
 
-        return getSuccessResult(orderData.getData());
+        return getSuccessResult(orderData);
     }
 
     /**

+ 4 - 4
fuint-application/src/main/java/com/fuint/module/clientApi/controller/ClientSettlementController.java

@@ -1,7 +1,7 @@
 package com.fuint.module.clientApi.controller;
 
 import com.fuint.common.param.SettlementParam;
-import com.fuint.common.service.SettlementService;
+import com.fuint.common.service.OrderService;
 import com.fuint.framework.exception.BusinessCheckException;
 import com.fuint.framework.web.BaseController;
 import com.fuint.framework.web.ResponseObject;
@@ -24,10 +24,10 @@ import java.util.Map;
 public class ClientSettlementController extends BaseController {
 
     /**
-     * 会员等级接口
+     * 订单接口
      * */
     @Autowired
-    private SettlementService settlementService;
+    private OrderService orderService;
 
     /**
      * 订单结算
@@ -36,7 +36,7 @@ public class ClientSettlementController extends BaseController {
     @RequestMapping(value = "/submit", method = RequestMethod.POST)
     @CrossOrigin
     public ResponseObject submit(HttpServletRequest request, @RequestBody SettlementParam param) throws BusinessCheckException {
-        Map<String, Object> result = settlementService.doSubmit(request, param);
+        Map<String, Object> result = orderService.doSettle(request, param);
         return getSuccessResult(result);
     }
 }

+ 4 - 3
fuint-application/src/main/java/com/fuint/module/merchantApi/controller/MerchantOrderController.java

@@ -9,6 +9,7 @@ import com.fuint.common.service.OrderService;
 import com.fuint.common.service.StaffService;
 import com.fuint.common.util.TokenUtil;
 import com.fuint.framework.exception.BusinessCheckException;
+import com.fuint.framework.pagination.PaginationResponse;
 import com.fuint.framework.web.BaseController;
 import com.fuint.framework.web.ResponseObject;
 import com.fuint.repository.model.MtOrder;
@@ -72,11 +73,11 @@ public class MerchantOrderController extends BaseController {
         if (staffInfo == null) {
             return getFailureResult(1002, "该账号不是商户");
         } else if(staffInfo.getStoreId() != null && staffInfo.getStoreId() > 0){
-            orderListParam.setStoreId(staffInfo.getStoreId().toString());
+            orderListParam.setStoreId(staffInfo.getStoreId());
         }
 
-        ResponseObject orderData = orderService.getUserOrderList(orderListParam);
-        return getSuccessResult(orderData.getData());
+        PaginationResponse orderData = orderService.getUserOrderList(orderListParam);
+        return getSuccessResult(orderData);
     }
 
     /**

+ 14 - 0
fuint-repository/src/main/java/com/fuint/repository/mapper/MtSettlementMapper.java

@@ -0,0 +1,14 @@
+package com.fuint.repository.mapper;
+
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+import com.fuint.repository.model.MtSettlement;
+
+/**
+ * 结算表 Mapper 接口
+ *
+ * Created by FSQ
+ * CopyRight https://www.fuint.cn
+ */
+public interface MtSettlementMapper extends BaseMapper<MtSettlement> {
+
+}

+ 14 - 0
fuint-repository/src/main/java/com/fuint/repository/mapper/MtSettlementOrderMapper.java

@@ -0,0 +1,14 @@
+package com.fuint.repository.mapper;
+
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+import com.fuint.repository.model.MtSettlementOrder;
+
+/**
+ * 结算订单表 Mapper 接口
+ *
+ * Created by FSQ
+ * CopyRight https://www.fuint.cn
+ */
+public interface MtSettlementOrderMapper extends BaseMapper<MtSettlementOrder> {
+
+}

+ 3 - 0
fuint-repository/src/main/java/com/fuint/repository/model/MtOrder.java

@@ -65,6 +65,9 @@ public class MtOrder implements Serializable {
     @ApiModelProperty("支付金额")
     private BigDecimal payAmount;
 
+    @ApiModelProperty(value="结算状态")
+    private String settleStatus;
+
     @ApiModelProperty("使用积分数量")
     private Integer usePoint;
 

+ 65 - 0
fuint-repository/src/main/java/com/fuint/repository/model/MtSettlement.java

@@ -0,0 +1,65 @@
+package com.fuint.repository.model;
+
+import com.baomidou.mybatisplus.annotation.IdType;
+import com.baomidou.mybatisplus.annotation.TableId;
+import com.baomidou.mybatisplus.annotation.TableName;
+import java.io.Serializable;
+import java.math.BigDecimal;
+import java.util.Date;
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Getter;
+import lombok.Setter;
+
+/**
+ * 结算表
+ *
+ * Created by FSQ
+ * CopyRight https://www.fuint.cn
+ */
+@Getter
+@Setter
+@TableName("mt_settlement")
+@ApiModel(value = "MtSettlement对象", description = "结算表")
+public class MtSettlement implements Serializable {
+
+    private static final long serialVersionUID = 1L;
+
+    @ApiModelProperty("自增ID")
+    @TableId(value = "ID", type = IdType.AUTO)
+    private Integer id;
+
+    @ApiModelProperty("结算单号")
+    private String settlementNo;
+
+    @ApiModelProperty("商户ID")
+    private Integer merchantId;
+
+    @ApiModelProperty("店铺ID")
+    private Integer storeId;
+
+    @ApiModelProperty("订单总金额")
+    private BigDecimal totalOrderAmount;
+
+    @ApiModelProperty("结算金额")
+    private BigDecimal amount;
+
+    @ApiModelProperty("创建时间")
+    private Date createTime;
+
+    @ApiModelProperty("更新时间")
+    private Date updateTime;
+
+    @ApiModelProperty("备注说明")
+    private String description;
+
+    @ApiModelProperty("最后操作人")
+    private String operator;
+
+    @ApiModelProperty("支付状态,A待支付;B已支付")
+    private String payStatus;
+
+    @ApiModelProperty("状态,A正常;D删除")
+    private String status;
+
+}

+ 52 - 0
fuint-repository/src/main/java/com/fuint/repository/model/MtSettlementOrder.java

@@ -0,0 +1,52 @@
+package com.fuint.repository.model;
+
+import com.baomidou.mybatisplus.annotation.IdType;
+import com.baomidou.mybatisplus.annotation.TableId;
+import com.baomidou.mybatisplus.annotation.TableName;
+import java.io.Serializable;
+import java.util.Date;
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Getter;
+import lombok.Setter;
+
+/**
+ * 结算订单表
+ *
+ * Created by FSQ
+ * CopyRight https://www.fuint.cn
+ */
+@Getter
+@Setter
+@TableName("mt_settlement_order")
+@ApiModel(value = "MtSettlementOrder对象", description = "结算订单表")
+public class MtSettlementOrder implements Serializable {
+
+    private static final long serialVersionUID = 1L;
+
+    @ApiModelProperty("自增ID")
+    @TableId(value = "ID", type = IdType.AUTO)
+    private Integer id;
+
+    @ApiModelProperty("结算ID")
+    private Integer settlementId;
+
+    @ApiModelProperty("订单ID")
+    private Integer orderId;
+
+    @ApiModelProperty("创建时间")
+    private Date createTime;
+
+    @ApiModelProperty("更新时间")
+    private Date updateTime;
+
+    @ApiModelProperty("备注说明")
+    private String description;
+
+    @ApiModelProperty("最后操作人")
+    private String operator;
+
+    @ApiModelProperty("状态,A正常;D删除")
+    private String status;
+
+}

+ 5 - 0
fuint-repository/src/main/resources/mapper/MtSettlementMapper.xml

@@ -0,0 +1,5 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
+<mapper namespace="com.fuint.repository.mapper.MtPointMapper">
+
+</mapper>

+ 5 - 0
fuint-repository/src/main/resources/mapper/MtSettlementOrderMapper.xml

@@ -0,0 +1,5 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
+<mapper namespace="com.fuint.repository.mapper.MtPointMapper">
+
+</mapper>