yangdamao 2 lat temu
rodzic
commit
9fcd2db7d6
60 zmienionych plików z 2241 dodań i 48 usunięć
  1. 109 3
      zhongzheng-admin-store/src/main/java/com/zhongzheng/controller/store/OrderController.java
  2. 57 0
      zhongzheng-admin-store/src/main/java/com/zhongzheng/controller/store/OrderPointsController.java
  3. 56 0
      zhongzheng-admin-store/src/main/java/com/zhongzheng/controller/store/RefundOrderController.java
  4. 9 0
      zhongzheng-admin-store/src/main/java/com/zhongzheng/controller/store/StoreController.java
  5. 2 4
      zhongzheng-admin-store/src/main/java/com/zhongzheng/controller/system/LoginController.java
  6. 113 0
      zhongzheng-admin-store/src/main/java/com/zhongzheng/controller/wx/WxLoginController.java
  7. 37 0
      zhongzheng-admin-store/src/main/java/com/zhongzheng/controller/wx/WxPayController.java
  8. 1 0
      zhongzheng-framework/src/main/java/com/zhongzheng/framework/config/SecurityConfig.java
  9. 1 0
      zhongzheng-framework/src/main/java/com/zhongzheng/framework/mybatisplus/CustomMerLineHandler.java
  10. 1 0
      zhongzheng-framework/src/main/java/com/zhongzheng/framework/mybatisplus/CustomStoreLineHandler.java
  11. 9 0
      zhongzheng-framework/src/main/java/com/zhongzheng/framework/mybatisplus/CustomTenantLineHandler.java
  12. 1 1
      zhongzheng-framework/src/main/java/com/zhongzheng/framework/web/service/StoreTokenService.java
  13. 6 8
      zhongzheng-framework/src/main/java/com/zhongzheng/framework/web/service/StoreUserServiceImpl.java
  14. 108 0
      zhongzheng-framework/src/main/java/com/zhongzheng/framework/web/service/WxLoginService.java
  15. 18 3
      zhongzheng-system/src/main/java/com/zhongzheng/modules/order/bo/IntegralOrderAddBo.java
  16. 34 0
      zhongzheng-system/src/main/java/com/zhongzheng/modules/order/bo/IntegralOrderQueryBo.java
  17. 32 0
      zhongzheng-system/src/main/java/com/zhongzheng/modules/order/bo/IntegralOrderRefundBo.java
  18. 32 0
      zhongzheng-system/src/main/java/com/zhongzheng/modules/order/bo/IntegralRechargeBo.java
  19. 25 0
      zhongzheng-system/src/main/java/com/zhongzheng/modules/order/bo/OrderPointsQueryBo.java
  20. 31 0
      zhongzheng-system/src/main/java/com/zhongzheng/modules/order/bo/OrderUserQueryBo.java
  21. 28 0
      zhongzheng-system/src/main/java/com/zhongzheng/modules/order/bo/StoreRefundOrderQueryBo.java
  22. 18 1
      zhongzheng-system/src/main/java/com/zhongzheng/modules/order/domain/Order.java
  23. 4 0
      zhongzheng-system/src/main/java/com/zhongzheng/modules/order/domain/OrderGoods.java
  24. 4 0
      zhongzheng-system/src/main/java/com/zhongzheng/modules/order/domain/OrderPay.java
  25. 66 0
      zhongzheng-system/src/main/java/com/zhongzheng/modules/order/domain/StoreOrderRefund.java
  26. 17 0
      zhongzheng-system/src/main/java/com/zhongzheng/modules/order/mapper/OrderMapper.java
  27. 14 0
      zhongzheng-system/src/main/java/com/zhongzheng/modules/order/mapper/StoreOrderRefundMapper.java
  28. 14 3
      zhongzheng-system/src/main/java/com/zhongzheng/modules/order/service/IOrderService.java
  29. 21 0
      zhongzheng-system/src/main/java/com/zhongzheng/modules/order/service/IStoreOrderRefundService.java
  30. 299 13
      zhongzheng-system/src/main/java/com/zhongzheng/modules/order/service/impl/OrderServiceImpl.java
  31. 27 0
      zhongzheng-system/src/main/java/com/zhongzheng/modules/order/service/impl/StoreOrderRefundServiceImpl.java
  32. 68 0
      zhongzheng-system/src/main/java/com/zhongzheng/modules/order/vo/IntegralOrderDeatilVo.java
  33. 58 0
      zhongzheng-system/src/main/java/com/zhongzheng/modules/order/vo/IntegralOrderGoodsVo.java
  34. 35 0
      zhongzheng-system/src/main/java/com/zhongzheng/modules/order/vo/IntegralOrderStatisticsVo.java
  35. 49 0
      zhongzheng-system/src/main/java/com/zhongzheng/modules/order/vo/IntegralOrderUserVo.java
  36. 91 0
      zhongzheng-system/src/main/java/com/zhongzheng/modules/order/vo/IntegralOrderVo.java
  37. 69 0
      zhongzheng-system/src/main/java/com/zhongzheng/modules/order/vo/StoreOrderRefundVo.java
  38. 7 0
      zhongzheng-system/src/main/java/com/zhongzheng/modules/store/mapper/StoreUserMapper.java
  39. 2 0
      zhongzheng-system/src/main/java/com/zhongzheng/modules/store/service/IStoreUserService.java
  40. 3 0
      zhongzheng-system/src/main/java/com/zhongzheng/modules/system/mapper/SysConfigMapper.java
  41. 2 0
      zhongzheng-system/src/main/java/com/zhongzheng/modules/system/service/ISysConfigService.java
  42. 5 0
      zhongzheng-system/src/main/java/com/zhongzheng/modules/system/service/impl/SysConfigServiceImpl.java
  43. 1 0
      zhongzheng-system/src/main/java/com/zhongzheng/modules/top/goods/service/impl/TopOldOrderServiceImpl.java
  44. 29 0
      zhongzheng-system/src/main/java/com/zhongzheng/modules/top/mall/bo/TopStoreStatementQuery.java
  45. 4 4
      zhongzheng-system/src/main/java/com/zhongzheng/modules/top/mall/service/ITopStoreService.java
  46. 56 7
      zhongzheng-system/src/main/java/com/zhongzheng/modules/top/mall/service/impl/TopStoreServiceImpl.java
  47. 41 0
      zhongzheng-system/src/main/java/com/zhongzheng/modules/top/mall/vo/TopStoreStatementVo.java
  48. 57 0
      zhongzheng-system/src/main/java/com/zhongzheng/modules/user/domain/UserPointsLog.java
  49. 13 0
      zhongzheng-system/src/main/java/com/zhongzheng/modules/user/mapper/UserPointsLogMapper.java
  50. 14 0
      zhongzheng-system/src/main/java/com/zhongzheng/modules/user/service/IUserPointsLogService.java
  51. 24 0
      zhongzheng-system/src/main/java/com/zhongzheng/modules/user/service/impl/UserPointsLogServiceImpl.java
  52. 61 0
      zhongzheng-system/src/main/java/com/zhongzheng/modules/user/vo/UserPointsLogVo.java
  53. 3 0
      zhongzheng-system/src/main/java/com/zhongzheng/modules/wx/service/IWxPayService.java
  54. 145 0
      zhongzheng-system/src/main/java/com/zhongzheng/modules/wx/service/impl/WxPayServiceImpl.java
  55. 1 1
      zhongzheng-system/src/main/resources/mapper/modules/goods/GoodsMapper.xml
  56. 157 0
      zhongzheng-system/src/main/resources/mapper/modules/order/OrderMapper.xml
  57. 18 0
      zhongzheng-system/src/main/resources/mapper/modules/order/StoreOrderRefundMapper.xml
  58. 17 0
      zhongzheng-system/src/main/resources/mapper/modules/order/UserPointsLogMapper.xml
  59. 13 0
      zhongzheng-system/src/main/resources/mapper/modules/store/StoreUserMapper.xml
  60. 4 0
      zhongzheng-system/src/main/resources/mapper/modules/system/SysConfigMapper.xml

+ 109 - 3
zhongzheng-admin-store/src/main/java/com/zhongzheng/controller/store/OrderController.java

@@ -1,15 +1,24 @@
 package com.zhongzheng.controller.store;
 
+import com.zhongzheng.common.annotation.Log;
 import com.zhongzheng.common.core.controller.BaseController;
 import com.zhongzheng.common.core.domain.AjaxResult;
 import com.zhongzheng.common.core.domain.model.StoreLoginUser;
+import com.zhongzheng.common.core.page.TableDataInfo;
 import com.zhongzheng.common.utils.ServletUtils;
+import com.zhongzheng.common.utils.poi.ExcelUtil;
 import com.zhongzheng.framework.web.service.StoreTokenService;
 import com.zhongzheng.framework.web.service.TopTokenService;
 import com.zhongzheng.framework.web.service.WxTokenService;
-import com.zhongzheng.modules.order.bo.IntegralOrderAddBo;
-import com.zhongzheng.modules.order.bo.OrderAddBo;
+import com.zhongzheng.modules.goods.vo.GoodsVo;
+import com.zhongzheng.modules.order.bo.*;
 import com.zhongzheng.modules.order.service.IOrderService;
+import com.zhongzheng.modules.order.vo.IntegralOrderDeatilVo;
+import com.zhongzheng.modules.order.vo.IntegralOrderStatisticsVo;
+import com.zhongzheng.modules.order.vo.IntegralOrderUserVo;
+import com.zhongzheng.modules.order.vo.IntegralOrderVo;
+import com.zhongzheng.modules.top.goods.bo.TopOldOrderQueryBo;
+import com.zhongzheng.modules.top.goods.vo.TopOldOrderVo;
 import com.zhongzheng.modules.user.entity.ClientLoginUser;
 import com.zhongzheng.modules.user.service.IUserService;
 import com.zhongzheng.modules.user.vo.StoreUserDetailVo;
@@ -19,6 +28,8 @@ import lombok.RequiredArgsConstructor;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.web.bind.annotation.*;
 
+import java.util.List;
+
 /**
  * 商户店铺管理Controller
  *
@@ -42,8 +53,103 @@ public class OrderController extends BaseController {
     @PostMapping("/integral")
     public AjaxResult addIntegralOrder(@RequestBody IntegralOrderAddBo bo) {
         StoreLoginUser loginUser = tokenService.getLoginUser(ServletUtils.getRequest());
-        bo.setUserId(loginUser.getUser().getUserId());
+        bo.setLoginId(loginUser.getUser().getUserId());
         return AjaxResult.success(orderService.addIntegralOrder(bo));
     }
 
+    /**
+     * 取消订单
+     */
+    @ApiOperation("取消订单")
+    @PostMapping("/integral/cancel")
+    public AjaxResult<Void> cancelIntegralOrder(@RequestBody IntegralOrderAddBo bo) {
+        StoreLoginUser loginUser = tokenService.getLoginUser(ServletUtils.getRequest());
+        bo.setUserId(loginUser.getUser().getUserId());
+        return toAjax(orderService.cancelIntegralOrder(bo) ? 1 : 0);
+    }
+
+    /**
+     * 订单列表
+     */
+    @ApiOperation("订单列表")
+    @GetMapping("/integral/list")
+    public TableDataInfo<IntegralOrderVo> getIntegralOrderList(IntegralOrderQueryBo bo) {
+        startPage();
+        List<IntegralOrderVo> list = orderService.getIntegralOrderList(bo);
+        return getDataTable(list);
+    }
+
+    /**
+     * 导出订单列表
+     */
+    @ApiOperation("导出订单列表")
+    @GetMapping("/export")
+    public AjaxResult<IntegralOrderVo> export(IntegralOrderQueryBo bo) {
+        List<IntegralOrderVo> list = orderService.getIntegralOrderList(bo);
+        ExcelUtil<IntegralOrderVo> util = new ExcelUtil<IntegralOrderVo>(IntegralOrderVo.class);
+        return util.exportExcel(list, "订单");
+    }
+
+    /**
+     * 订单统计
+     */
+    @ApiOperation("订单统计")
+    @GetMapping("/statistics")
+    public AjaxResult<IntegralOrderStatisticsVo> getIntegralOrderStatistics(IntegralOrderQueryBo bo) {
+        return AjaxResult.success(orderService.getIntegralOrderStatistics(bo));
+    }
+
+    /**
+     * 订单详情
+     */
+    @ApiOperation("订单详情")
+    @GetMapping("/integral/{orderId}")
+    public AjaxResult<IntegralOrderDeatilVo> getIntegralOrderDetail(@PathVariable("orderId") Long orderId) {
+        return AjaxResult.success(orderService.getIntegralOrderDetail(orderId));
+    }
+
+    /**
+     * 订单退款
+     */
+    @ApiOperation("订单退款")
+    @PostMapping("/integral/refund")
+    public AjaxResult<Void> refundIntegralOrder(@RequestBody IntegralOrderRefundBo bo) {
+        StoreLoginUser loginUser = tokenService.getLoginUser(ServletUtils.getRequest());
+        bo.setLoginId(loginUser.getUser().getUserId());
+        return toAjax(orderService.refundIntegralOrder(bo) ? 1 : 0);
+    }
+
+    /**
+     * 订单积分冲账
+     */
+    @ApiOperation("订单积分冲账")
+    @PostMapping("/integral/recharge")
+    public AjaxResult<Void> rechargeIntegral(@RequestBody IntegralRechargeBo bo) {
+        StoreLoginUser loginUser = tokenService.getLoginUser(ServletUtils.getRequest());
+        bo.setLoginId(loginUser.getUser().getUserId());
+        return toAjax(orderService.rechargeIntegral(bo) ? 1 : 0);
+    }
+
+    /**
+     * 订单会员列表
+     */
+    @ApiOperation("订单会员列表")
+    @GetMapping("/user/list")
+    public TableDataInfo<IntegralOrderUserVo> getOrderUserList(OrderUserQueryBo bo) {
+        startPage();
+        List<IntegralOrderUserVo> list = orderService.getOrderUserList(bo);
+        return getDataTable(list);
+    }
+
+    /**
+     * 订单会员导出
+     */
+    @ApiOperation("订单会员导出")
+    @GetMapping("/user/export")
+    public AjaxResult<IntegralOrderUserVo> orderUserExport(OrderUserQueryBo bo) {
+        List<IntegralOrderUserVo> list = orderService.getOrderUserList(bo);
+        ExcelUtil<IntegralOrderUserVo> util = new ExcelUtil<IntegralOrderUserVo>(IntegralOrderUserVo.class);
+        return util.exportExcel(list, "订单会员");
+    }
+
 }

+ 57 - 0
zhongzheng-admin-store/src/main/java/com/zhongzheng/controller/store/OrderPointsController.java

@@ -0,0 +1,57 @@
+package com.zhongzheng.controller.store;
+
+import com.zhongzheng.common.core.controller.BaseController;
+import com.zhongzheng.common.core.domain.AjaxResult;
+import com.zhongzheng.common.core.page.TableDataInfo;
+import com.zhongzheng.common.utils.poi.ExcelUtil;
+import com.zhongzheng.modules.order.bo.OrderPointsQueryBo;
+import com.zhongzheng.modules.order.bo.StoreRefundOrderQueryBo;
+import com.zhongzheng.modules.order.service.IStoreOrderRefundService;
+import com.zhongzheng.modules.order.vo.StoreOrderRefundVo;
+import com.zhongzheng.modules.user.service.IUserPointsLogService;
+import com.zhongzheng.modules.user.vo.UserPointsLogVo;
+import io.swagger.annotations.Api;
+import io.swagger.annotations.ApiOperation;
+import lombok.RequiredArgsConstructor;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.web.bind.annotation.GetMapping;
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.RestController;
+
+import java.util.List;
+
+/**
+ * @author yangdamao
+ * @date 2023年06月09日 14:00
+ */
+@Api(value = "商户店铺订单冲账管理控制器", tags = {"商户店铺订单冲账管理控制器"})
+@RequiredArgsConstructor(onConstructor_ = @Autowired)
+@RestController
+@RequestMapping("/store/points")
+public class OrderPointsController extends BaseController {
+
+    private final IUserPointsLogService userPointsLogService;
+
+    /**
+     * 冲账列表
+     */
+    @ApiOperation("冲账列表")
+    @GetMapping("/list")
+    public TableDataInfo<UserPointsLogVo> getOrderPointsList(OrderPointsQueryBo bo) {
+        startPage();
+        List<UserPointsLogVo> list = userPointsLogService.getOrderPointsList(bo);
+        return getDataTable(list);
+    }
+
+    /**
+     * 导出冲账列表
+     */
+    @ApiOperation("导出冲账列表")
+    @GetMapping("/export")
+    public AjaxResult<UserPointsLogVo> export(OrderPointsQueryBo bo) {
+        List<UserPointsLogVo> list = userPointsLogService.getOrderPointsList(bo);
+        ExcelUtil<UserPointsLogVo> util = new ExcelUtil<UserPointsLogVo>(UserPointsLogVo.class);
+        return util.exportExcel(list, "冲账");
+    }
+
+}

+ 56 - 0
zhongzheng-admin-store/src/main/java/com/zhongzheng/controller/store/RefundOrderController.java

@@ -0,0 +1,56 @@
+package com.zhongzheng.controller.store;
+
+import com.zhongzheng.common.core.controller.BaseController;
+import com.zhongzheng.common.core.domain.AjaxResult;
+import com.zhongzheng.common.core.page.TableDataInfo;
+import com.zhongzheng.common.utils.poi.ExcelUtil;
+import com.zhongzheng.modules.order.bo.IntegralOrderQueryBo;
+import com.zhongzheng.modules.order.bo.StoreRefundOrderQueryBo;
+import com.zhongzheng.modules.order.service.IStoreOrderRefundService;
+import com.zhongzheng.modules.order.vo.IntegralOrderVo;
+import com.zhongzheng.modules.order.vo.StoreOrderRefundVo;
+import io.swagger.annotations.Api;
+import io.swagger.annotations.ApiOperation;
+import lombok.RequiredArgsConstructor;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.web.bind.annotation.GetMapping;
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.RestController;
+
+import java.util.List;
+
+/**
+ * @author yangdamao
+ * @date 2023年06月09日 14:00
+ */
+@Api(value = "商户店铺退款订单管理控制器", tags = {"商户店铺退款订单管理控制器"})
+@RequiredArgsConstructor(onConstructor_ = @Autowired)
+@RestController
+@RequestMapping("/store/refund")
+public class RefundOrderController extends BaseController {
+
+    private final IStoreOrderRefundService storeOrderRefundService;
+
+    /**
+     * 退款订单列表
+     */
+    @ApiOperation("退款订单列表")
+    @GetMapping("/list")
+    public TableDataInfo<StoreOrderRefundVo> getRefundOrderList(StoreRefundOrderQueryBo bo) {
+        startPage();
+        List<StoreOrderRefundVo> list = storeOrderRefundService.getRefundOrderList(bo);
+        return getDataTable(list);
+    }
+
+    /**
+     * 导出退款订单列表
+     */
+    @ApiOperation("导出退款订单列表")
+    @GetMapping("/export")
+    public AjaxResult<StoreOrderRefundVo> export(StoreRefundOrderQueryBo bo) {
+        List<StoreOrderRefundVo> list = storeOrderRefundService.getRefundOrderList(bo);
+        ExcelUtil<StoreOrderRefundVo> util = new ExcelUtil<StoreOrderRefundVo>(StoreOrderRefundVo.class);
+        return util.exportExcel(list, "退款");
+    }
+
+}

+ 9 - 0
zhongzheng-admin-store/src/main/java/com/zhongzheng/controller/store/StoreController.java

@@ -8,7 +8,9 @@ import com.zhongzheng.common.enums.BusinessType;
 import com.zhongzheng.modules.top.mall.bo.TopStoreAddBo;
 import com.zhongzheng.modules.top.mall.bo.TopStoreEditBo;
 import com.zhongzheng.modules.top.mall.bo.TopStoreQueryBo;
+import com.zhongzheng.modules.top.mall.bo.TopStoreStatementQuery;
 import com.zhongzheng.modules.top.mall.service.ITopStoreService;
+import com.zhongzheng.modules.top.mall.vo.TopStoreStatementVo;
 import com.zhongzheng.modules.top.mall.vo.TopStoreVo;
 import io.swagger.annotations.Api;
 import io.swagger.annotations.ApiOperation;
@@ -105,4 +107,11 @@ public class StoreController extends BaseController {
         return AjaxResult.success("配置内容",iTopStoreService.getPointsRuleConfig());
     }
 
+
+    @ApiOperation("店铺报表")
+    @GetMapping("/statement")
+    public AjaxResult<TopStoreStatementVo> getStatement(TopStoreStatementQuery query) {
+        return AjaxResult.success(iTopStoreService.getStatement(query));
+    }
+
 }

+ 2 - 4
zhongzheng-admin-store/src/main/java/com/zhongzheng/controller/system/LoginController.java

@@ -56,7 +56,7 @@ public class LoginController extends BaseController {
     }
 
     @ApiOperation("账号登录")
-    @PostMapping("/account_login")
+    @PostMapping("/store/account_login")
     public AjaxResult account_login(@RequestBody UserAppAccountLoginBo bo) {
         Map<String,Object> map = iUserService.accountLogin(bo);
         return AjaxResult.success(map);
@@ -132,9 +132,7 @@ public class LoginController extends BaseController {
     public AjaxResult getStoreConfig()
     {
         StoreLoginUser loginUser = tokenService.getLoginUser(ServletUtils.getRequest());
-        StoreUser user = iUserService.getOne(new LambdaQueryWrapper<StoreUser>()
-                .eq(StoreUser::getUserId, loginUser.getUser().getUserId()).last("limit 1"));
-
+        StoreUser user = iUserService.getUserNoTenant(loginUser.getUser().getUserId());
         Map<String,Object> map = new HashMap<>();
         map.put("tenantId", user.getTenantId());
         map.put("storeId", user.getStoreId());

+ 113 - 0
zhongzheng-admin-store/src/main/java/com/zhongzheng/controller/wx/WxLoginController.java

@@ -0,0 +1,113 @@
+package com.zhongzheng.controller.wx;
+
+import cn.hutool.core.lang.Validator;
+import com.alibaba.fastjson.JSON;
+import com.github.xiaoymin.knife4j.annotations.ApiSupport;
+import com.zhongzheng.common.constant.Constants;
+import com.zhongzheng.common.core.domain.AjaxResult;
+import com.zhongzheng.common.core.domain.model.StoreLoginUser;
+import com.zhongzheng.common.core.redis.RedisCache;
+import com.zhongzheng.common.utils.ServletUtils;
+import com.zhongzheng.framework.web.service.StoreTokenService;
+import com.zhongzheng.framework.web.service.WxLoginService;
+import com.zhongzheng.framework.web.service.WxTokenService;
+import com.zhongzheng.modules.user.entity.ClientLoginUser;
+import com.zhongzheng.modules.user.service.IUserService;
+import com.zhongzheng.modules.wx.bo.WxLoginBody;
+import com.zhongzheng.modules.wx.service.IWxPayService;
+import io.swagger.annotations.Api;
+import io.swagger.annotations.ApiOperation;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.web.bind.annotation.*;
+
+import java.util.HashMap;
+import java.util.Map;
+import java.util.concurrent.TimeUnit;
+
+@Api(tags ="微信登录用户操作管理")
+@ApiSupport(order = 2)
+@RestController
+public class WxLoginController
+{
+    @Autowired
+    private WxLoginService wxLoginService;
+
+    @Autowired
+    private IWxPayService iWxPayService;
+
+    @Autowired
+    private StoreTokenService storeTokenService;
+
+    @Autowired
+    private  RedisCache redisCache;
+    private static final Logger log = LoggerFactory.getLogger(WxLoginController.class);
+
+
+    /**
+     * 公众号登录方法
+     *
+     * @param loginBody 登公众号录信息
+     * @return 结果
+     */
+    @ApiOperation("公众号登录")
+    @PostMapping("/app/common/gzh_login")
+    public AjaxResult gzh_login(@RequestBody WxLoginBody loginBody)
+    {
+        Map<String,String> map = wxLoginService.gzh_login(loginBody);
+        return AjaxResult.success(map);
+    }
+
+    /**
+     * 登录方法
+     *
+     * @param loginBody 登录信息
+     * @return 结果
+     */
+    @ApiOperation("小程序微信登录")
+    @PostMapping("/app/common/bindLogin")
+    public AjaxResult bindLogin(@RequestBody WxLoginBody loginBody)
+    {
+        Map<String,Object> map = wxLoginService.storeLogin(loginBody);
+        return AjaxResult.success(map);
+    }
+
+    @ApiOperation("获取用户小程序openid")
+    @PostMapping("/wx/getOpenid")
+    public AjaxResult<Void> getOpenid(@RequestBody WxLoginBody loginBody)
+    {
+        StoreLoginUser loginUser = storeTokenService.getLoginUser(ServletUtils.getRequest());
+        String openId = wxLoginService.getWxStoreOpenId(loginBody,loginUser.getUser().getUserId());
+        return AjaxResult.success(openId);
+    }
+
+    @ApiOperation("小程序已扫码")
+    @GetMapping("/scan_code")
+    public AjaxResult scanCode(WxLoginBody loginBody)
+    {
+        String scanCode = loginBody.getScanCode();
+        String key = "SCAN_LOGIN_"+scanCode;
+        String keyStatus = "SCAN_LOGIN_STATUS_"+scanCode; //0未扫码 1已扫码 2已登录
+        Long status = redisCache.getCacheObject(keyStatus);
+        if(Validator.isEmpty(status)){
+            return AjaxResult.error("标识码不存在");
+        }else{
+            redisCache.setCacheObject(keyStatus, 1L,180, TimeUnit.SECONDS);//延长180秒锁定
+            return AjaxResult.success();
+        }
+    }
+
+
+    @ApiOperation("刷新登录令牌")
+    @GetMapping("/refreshToken/{userAccount}")
+    public AjaxResult refreshToken(@PathVariable("userAccount") String userAccount)
+    {
+        String token = wxLoginService.refreshStoreToken(userAccount);
+        Map<String,Object> map = new HashMap<>();
+        map.put(Constants.TOKEN, token);
+        return AjaxResult.success(map);
+    }
+
+
+}

+ 37 - 0
zhongzheng-admin-store/src/main/java/com/zhongzheng/controller/wx/WxPayController.java

@@ -0,0 +1,37 @@
+package com.zhongzheng.controller.wx;
+
+import com.github.xiaoymin.knife4j.annotations.ApiSupport;
+import com.zhongzheng.common.core.domain.AjaxResult;
+import com.zhongzheng.framework.web.service.WxLoginService;
+import com.zhongzheng.framework.web.service.WxTokenService;
+import com.zhongzheng.modules.user.service.IUserService;
+import com.zhongzheng.modules.wx.bo.WxPayBody;
+import com.zhongzheng.modules.wx.service.IWxPayService;
+import io.swagger.annotations.Api;
+import io.swagger.annotations.ApiOperation;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.web.bind.annotation.PostMapping;
+import org.springframework.web.bind.annotation.RequestBody;
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.RestController;
+
+@Api(tags ="微信支付操作管理")
+@ApiSupport(order = 2)
+@RestController
+@RequestMapping("/wx/pay/store")
+public class WxPayController
+{
+    @Autowired
+    private IWxPayService iWxPayService;
+
+
+    @ApiOperation("获取支付回调凭证")
+    @PostMapping("/callback")
+    public String callback(@RequestBody String notifyData)
+    {
+        System.out.println("支付回调");
+
+        return iWxPayService.paymentStoreCallBack(notifyData);
+    }
+
+}

+ 1 - 0
zhongzheng-framework/src/main/java/com/zhongzheng/framework/config/SecurityConfig.java

@@ -141,6 +141,7 @@ public class SecurityConfig extends WebSecurityConfigurerAdapter
                         "/**/*.js"
                 ).permitAll()
                 .antMatchers("/app/common/**").anonymous() //小程序非验证接口
+                .antMatchers("/store/account_login").anonymous() //小程序非验证接口
                 .antMatchers("/app/store/common/**").anonymous() //核销系统非验证接口
                 .antMatchers("/sys/common/**").anonymous()
                 .antMatchers("/refreshToken/**").anonymous()

+ 1 - 0
zhongzheng-framework/src/main/java/com/zhongzheng/framework/mybatisplus/CustomMerLineHandler.java

@@ -44,6 +44,7 @@ public class CustomMerLineHandler implements TenantLineHandler {
         add("store_user");
         add("store_user_role");
         add("top_sys_config");
+        add("user");
 //       add("top_merchant");
     }};
 

+ 1 - 0
zhongzheng-framework/src/main/java/com/zhongzheng/framework/mybatisplus/CustomStoreLineHandler.java

@@ -42,6 +42,7 @@ public class CustomStoreLineHandler implements TenantLineHandler {
        add("store_user_role");
        add("top_merchant");
        add("top_sys_config");
+       add("user");
     }};
 
     /**

+ 9 - 0
zhongzheng-framework/src/main/java/com/zhongzheng/framework/mybatisplus/CustomTenantLineHandler.java

@@ -46,6 +46,13 @@ public class CustomTenantLineHandler implements TenantLineHandler {
         add("top_sys_tenant_register");
     }};
 
+    /**
+     * 忽略添加租户ID的表
+     */
+    private final static List<String> STORE_IGNORE_TABLE_NAMES = new ArrayList<String>(){{
+        add("user");
+    }};
+
     /**
      * 获取租户ID值表达式(可从cookie、token、缓存中取)
      *
@@ -91,6 +98,8 @@ public class CustomTenantLineHandler implements TenantLineHandler {
         if (enabledTenant == 2 || tableName.contains("top_")){
             //总平台忽略tenantId
             return true;
+        }else if (enabledTenant == 3 && STORE_IGNORE_TABLE_NAMES.contains(tableName)){
+            return true;
         }
         return IGNORE_TABLE_NAMES.contains(tableName);
     }

+ 1 - 1
zhongzheng-framework/src/main/java/com/zhongzheng/framework/web/service/StoreTokenService.java

@@ -77,7 +77,7 @@ public class StoreTokenService
             // 解析对应的权限以及用户信息
             String uuid = (String) claims.get(Constants.STORE_LOGIN_USER_KEY);
             String userKey = getTokenKey(uuid);
-            StoreLoginUser user = redisCache.getCacheObject(userKey);
+            StoreLoginUser user = redisCache.getCacheObjectNoTenant(userKey);
             return user;
         }
         return null;

+ 6 - 8
zhongzheng-framework/src/main/java/com/zhongzheng/framework/web/service/StoreUserServiceImpl.java

@@ -194,6 +194,11 @@ public class StoreUserServiceImpl extends ServiceImpl<StoreUserMapper, StoreUser
         .set(StoreUser::getStatus,-1));
     }
 
+    @Override
+    public StoreUser getUserNoTenant(Long userId) {
+        return baseMapper.getUserNoTenantById(userId);
+    }
+
     @Override
     public StoreUser queryByUnionId(String unionId) {
         StoreUser user = getOne(new LambdaQueryWrapper<StoreUser>()
@@ -243,14 +248,7 @@ public class StoreUserServiceImpl extends ServiceImpl<StoreUserMapper, StoreUser
         if(Validator.isEmpty(bo.getAccount())){
             throw new CustomException("账号不能为空");
         }
-        LambdaQueryWrapper<StoreUser> queryWrapper =new LambdaQueryWrapper<StoreUser>();
-        queryWrapper.and(wq -> wq
-                .eq(StoreUser::getTelphone,EncryptHandler.encrypt(bo.getAccount()))
-                .or()
-                .eq(StoreUser::getIdCard,EncryptHandler.encrypt(bo.getAccount()))
-                .or()
-                .eq(StoreUser::getUserName,bo.getAccount()));
-        StoreUser user = getOne(queryWrapper);
+        StoreUser user = baseMapper.getStoreUserNoTenant(bo);
         if(Validator.isEmpty(user)){
             throw new CustomException("登录信息错误");
         }

+ 108 - 0
zhongzheng-framework/src/main/java/com/zhongzheng/framework/web/service/WxLoginService.java

@@ -15,6 +15,8 @@ import com.google.zxing.client.j2se.MatrixToImageWriter;
 import com.google.zxing.common.BitMatrix;
 import com.google.zxing.qrcode.QRCodeWriter;
 import com.zhongzheng.common.constant.Constants;
+import com.zhongzheng.common.core.domain.entity.store.StoreUser;
+import com.zhongzheng.common.core.domain.model.StoreLoginUser;
 import com.zhongzheng.common.core.redis.RedisCache;
 import com.zhongzheng.common.exception.CustomException;
 import com.zhongzheng.common.type.EncryptHandler;
@@ -29,6 +31,7 @@ import com.zhongzheng.modules.distribution.vo.SellerWxVo;
 import com.zhongzheng.modules.goods.domain.Goods;
 import com.zhongzheng.modules.goods.service.IGoodsService;
 import com.zhongzheng.modules.goods.vo.GoodsVo;
+import com.zhongzheng.modules.store.service.IStoreUserService;
 import com.zhongzheng.modules.system.service.ISysConfigService;
 import com.zhongzheng.modules.user.bo.UserWxFollowAddBo;
 import com.zhongzheng.modules.user.domain.User;
@@ -63,6 +66,9 @@ public class WxLoginService implements IWxLoginService {
     @Autowired
     private WxTokenService wxTokenService;
 
+    @Autowired
+    private StoreTokenService storeTokenService;
+
   //  @Value("${wx.small.appid}")
     private String appid;
 
@@ -141,6 +147,9 @@ public class WxLoginService implements IWxLoginService {
     @Autowired
     private IUserService iUserService;
 
+    @Autowired
+    private IStoreUserService iStoreUserService;
+
     @Autowired
     private UserMapper userMapper;
 
@@ -173,6 +182,14 @@ public class WxLoginService implements IWxLoginService {
 
     }
 
+    public void initStoreData(){
+        Long tenantId = 867735392558919680L;
+        appid = configService.getConfigByKey("wx.store.small.appid",tenantId);
+        appsrcret = configService.getConfigByKey("wx.store.small.appsecret",tenantId);
+        gzh_appsrcret = configService.getConfigByKey("wx.store.gzh.appsecret",tenantId);
+        gzh_appid = configService.getConfigByKey("wx.store.gzh.appid",tenantId);
+    }
+
 
     public Map<String, String> test_login() {
         initData();
@@ -270,6 +287,23 @@ public class WxLoginService implements IWxLoginService {
         return map;
     }
 
+    @Transactional(rollbackFor = Exception.class)
+    public Map<String, Object> storeLogin(WxLoginBody loginBody) {
+        initStoreData();
+        StoreUser user = getWxUnionIdStoreUser(loginBody);
+        if (ObjectUtils.isNull(user)) {
+            throw new CustomException("新用户请先注册!",666);
+        }
+
+        StoreLoginUser loginUser = new StoreLoginUser();
+        loginUser.setUser(user);
+        Map<String, Object> map = new HashMap<>();
+        map.put(Constants.TOKEN, storeTokenService.createToken(loginUser));
+        map.put("user_account", loginUser.getUser().getUserName());
+        map.put("full_info", Validator.isEmpty(user.getIdCard()) ? false : true); //是否完善身份信息
+        return map;
+    }
+
 
     public Map<String, String> smallTel(WxLoginBody loginBody) {
         initData();
@@ -318,6 +352,21 @@ public class WxLoginService implements IWxLoginService {
         return wxTokenService.createToken(loginUser);
     }
 
+    public String refreshStoreToken(String userAccount) {
+        initStoreData();
+        StoreUser user = iStoreUserService
+                .getOne(new LambdaQueryWrapper<StoreUser>()
+                .eq(StoreUser::getUserName, userAccount)
+                .last("limit 1"));
+        if (user == null) {
+            throw new CustomException("userAccount不存在");
+        }
+
+        StoreLoginUser loginUser = new StoreLoginUser();
+        loginUser.setUser(user);
+        return storeTokenService.createToken(loginUser);
+    }
+
     /**
      * 小程序注册
      *
@@ -385,6 +434,27 @@ public class WxLoginService implements IWxLoginService {
     }
 
 
+    //小程序获取用户openid
+    public String getWxStoreOpenId(WxLoginBody loginBody, Long userId) {
+        initStoreData();
+        LambdaQueryWrapper<StoreUser> lqw = Wrappers.lambdaQuery();
+        lqw.eq(StoreUser::getUserId, userId);
+        StoreUser user = iStoreUserService.getOne(lqw);
+        String openId = user.getOpenId();
+
+        //每次更新最新openid
+        String param = String.format(wxAuthParam, appid, appsrcret, loginBody.getCode());
+        String resultString = HttpUtils.sendGet(wxAuthUrl, param);
+        //解析json
+        JSONObject jsonObject = (JSONObject) JSONObject.parse(resultString);
+        String session_key = String.valueOf(jsonObject.get("session_key"));
+        openId = String.valueOf(jsonObject.get("openid"));
+        user.setOpenId(openId);
+        iStoreUserService.updateById(user);
+        return openId;
+    }
+
+
     //小程序获取用户信息
     public User getWxUnionIdUser(WxLoginBody loginBody) {
         initData();
@@ -433,6 +503,44 @@ public class WxLoginService implements IWxLoginService {
         return user;
     }
 
+
+    //小程序获取用户信息
+    public StoreUser getWxUnionIdStoreUser(WxLoginBody loginBody) {
+        String param = String.format(wxAuthParam, appid, appsrcret, loginBody.getCode());
+        String resultString = HttpUtils.sendGet(wxAuthUrl, param);
+        //解析json
+        JSONObject jsonObject = (JSONObject) JSONObject.parse(resultString);
+        String session_key = String.valueOf(jsonObject.get("session_key"));
+        String openId = String.valueOf(jsonObject.get("openid"));
+        String unionId = null;
+        if (jsonObject.containsKey("unionid")) { //当没绑定开放平台
+            unionId = String.valueOf(jsonObject.get("unionid"));
+        }
+        String phoneNumber = obtainWxPhone(loginBody.getIv(), loginBody.getEncryptedData(), session_key);
+        if (Validator.isEmpty(phoneNumber)) {
+            throw new CustomException("该微信没有绑定手机号码" + resultString);
+        }
+        StoreUser user = iStoreUserService.getOne(new LambdaQueryWrapper<StoreUser>()
+                .eq(StoreUser::getTelphone, EncryptHandler.encrypt(phoneNumber)).last("limit 1"));
+        if (Validator.isNotEmpty(user)) {
+            user.setOpenId(openId);
+            user.setUnionId(unionId);
+            user.setUpdateTime(DateUtils.getNowTime());
+            iStoreUserService.updateById(user);
+        } else {
+            //手机匹配不上再匹配openid
+            user = iStoreUserService.getOne(new LambdaQueryWrapper<StoreUser>()
+                    .eq(StoreUser::getOpenId, openId).last("limit 1"));
+            if (Validator.isNotEmpty(user)) {
+                user.setTelphone(phoneNumber);
+                user.setUnionId(unionId);
+                user.setUpdateTime(DateUtils.getNowTime());
+                iStoreUserService.updateById(user);
+            }
+        }
+        return user;
+    }
+
     public String getWxSmallAccessToken() {
         initData();
         String key = "WX_SMALL_ACCESS_TOKEN";

+ 18 - 3
zhongzheng-system/src/main/java/com/zhongzheng/modules/order/bo/IntegralOrderAddBo.java

@@ -42,7 +42,7 @@ public class IntegralOrderAddBo {
     @ApiModelProperty("支付时间")
     private Long payTime;
     /** 支付平台 1微信 2支付宝 */
-    @ApiModelProperty("支付平台 1微信 2支付宝")
+    @ApiModelProperty("支付平台 1微信 2支付宝 3现金")
     private Integer payType;
     /** 微信流水号 */
     @ApiModelProperty("微信流水号")
@@ -54,7 +54,7 @@ public class IntegralOrderAddBo {
     @ApiModelProperty("订单完成时间")
     private Long finishTime;
     /** 订单类型   1充值订单 2商品普通订单 */
-    @ApiModelProperty("订单类型   1充值订单 2商品普通订单")
+    @ApiModelProperty("订单类型   1充值订单 2商品普通订单 3核销订单")
     private Integer orderType;
     /** 支付价格 */
     @ApiModelProperty("支付价格")
@@ -63,7 +63,7 @@ public class IntegralOrderAddBo {
     @ApiModelProperty("收费方式 1即刻收费 2稍后收费")
     private Integer chargingType;
     /** 订单来源 1业务员录单 */
-    @ApiModelProperty("订单来源 1业务员普通单 2祥粤云学堂小程序 3祥粤云学堂网站 4祥粤e管证小程序 5业务员录单 6业务系统下单 ")
+    @ApiModelProperty("订单来源 1业务员普通单 2祥粤云学堂小程序 3祥粤云学堂网站 4祥粤e管证小程序 5业务员录单 6业务系统下单 7会员核销系统(PC)8会员核销系统(小程序) ")
     private Integer orderFrom;
     @ApiModelProperty("商品列表")
     private List<OrderGoodsAddBo> goodsList;
@@ -98,4 +98,19 @@ public class IntegralOrderAddBo {
     private String sellerName;
     @ApiModelProperty("底单:1新系统,2旧系统")
     private Integer orderBase;
+
+    @ApiModelProperty("登入用户ID")
+    private Long loginId;
+    /** 抵扣积分 */
+    @ApiModelProperty("抵扣积分")
+    private BigDecimal deductionIntegral;
+    /** 抵扣金额 */
+    @ApiModelProperty("抵扣金额")
+    private BigDecimal deductionMoney;
+    /** 积分规则json */
+    @ApiModelProperty("积分规则json")
+    private String integralRule;
+    /** 补差金额 */
+    @ApiModelProperty("补差金额")
+    private BigDecimal compensationMoney;
 }

+ 34 - 0
zhongzheng-system/src/main/java/com/zhongzheng/modules/order/bo/IntegralOrderQueryBo.java

@@ -0,0 +1,34 @@
+package com.zhongzheng.modules.order.bo;
+
+import com.zhongzheng.common.utils.ServletUtils;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+import net.polyv.common.v1.util.StringUtils;
+
+/**
+ * @author yangdamao
+ * @date 2023年06月08日 17:28
+ */
+@Data
+public class IntegralOrderQueryBo {
+
+    /** 分页大小 */
+    @ApiModelProperty("分页大小")
+    private Integer pageSize;
+    /** 当前页数 */
+    @ApiModelProperty("当前页数")
+    private Integer pageNum;
+
+    @ApiModelProperty("店铺ID")
+    private Long storeId;
+    @ApiModelProperty("商户ID")
+    private Long merId;
+    @ApiModelProperty("机构ID")
+    private Long tenantId;
+    @ApiModelProperty("开始时间")
+    private Long startTime;
+    @ApiModelProperty("结束时间")
+    private Long endTime;
+    @ApiModelProperty("会员手机号")
+    private String telphone;
+}

+ 32 - 0
zhongzheng-system/src/main/java/com/zhongzheng/modules/order/bo/IntegralOrderRefundBo.java

@@ -0,0 +1,32 @@
+package com.zhongzheng.modules.order.bo;
+
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+
+import java.math.BigDecimal;
+import java.util.List;
+
+/**
+ * 订单添加对象 order
+ *
+ * @author ruoyi
+ * @date 2021-11-08
+ */
+@Data
+@ApiModel("订单添加对象")
+public class IntegralOrderRefundBo {
+
+    /** 订单编号 */
+    @ApiModelProperty("订单编号")
+    private String orderSn;
+    /** 用户ID */
+    @ApiModelProperty("用户ID")
+    private Long userId;
+    /** 退款金额 */
+    @ApiModelProperty("退款金额")
+    private BigDecimal refundPrice;
+    @ApiModelProperty("登录人Id")
+    private Long loginId;
+
+}

+ 32 - 0
zhongzheng-system/src/main/java/com/zhongzheng/modules/order/bo/IntegralRechargeBo.java

@@ -0,0 +1,32 @@
+package com.zhongzheng.modules.order.bo;
+
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+
+import java.math.BigDecimal;
+
+/**
+ * 订单添加对象 order
+ *
+ * @author ruoyi
+ * @date 2021-11-08
+ */
+@Data
+@ApiModel("积分冲账对象")
+public class IntegralRechargeBo {
+
+    /** 订单编号 */
+    @ApiModelProperty("订单编号")
+    private String orderSn;
+    /** 用户ID */
+    @ApiModelProperty("用户ID")
+    private Long userId;
+    /** 退款金额 */
+    @ApiModelProperty("积分")
+    private BigDecimal integral;
+
+    @ApiModelProperty("登录人Id")
+    private Long loginId;
+
+}

+ 25 - 0
zhongzheng-system/src/main/java/com/zhongzheng/modules/order/bo/OrderPointsQueryBo.java

@@ -0,0 +1,25 @@
+package com.zhongzheng.modules.order.bo;
+
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+
+/**
+ * @author yangdamao
+ * @date 2023年06月08日 17:28
+ */
+@Data
+public class OrderPointsQueryBo {
+
+    /** 分页大小 */
+    @ApiModelProperty("分页大小")
+    private Integer pageSize;
+    /** 当前页数 */
+    @ApiModelProperty("当前页数")
+    private Integer pageNum;
+
+    @ApiModelProperty("店铺ID")
+    private Long storeId;
+
+    @ApiModelProperty("订单号")
+    private String orderSn;
+}

+ 31 - 0
zhongzheng-system/src/main/java/com/zhongzheng/modules/order/bo/OrderUserQueryBo.java

@@ -0,0 +1,31 @@
+package com.zhongzheng.modules.order.bo;
+
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+
+/**
+ * @author yangdamao
+ * @date 2023年06月08日 17:28
+ */
+@Data
+public class OrderUserQueryBo {
+
+    /** 分页大小 */
+    @ApiModelProperty("分页大小")
+    private Integer pageSize;
+    /** 当前页数 */
+    @ApiModelProperty("当前页数")
+    private Integer pageNum;
+
+    @ApiModelProperty("店铺ID")
+    private Long storeId;
+
+    @ApiModelProperty("商户ID")
+    private Long merId;
+
+    @ApiModelProperty("机构ID")
+    private Long tenantId;
+
+    @ApiModelProperty("关键字")
+    private String keyword;
+}

+ 28 - 0
zhongzheng-system/src/main/java/com/zhongzheng/modules/order/bo/StoreRefundOrderQueryBo.java

@@ -0,0 +1,28 @@
+package com.zhongzheng.modules.order.bo;
+
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+
+/**
+ * @author yangdamao
+ * @date 2023年06月08日 17:28
+ */
+@Data
+public class StoreRefundOrderQueryBo {
+
+    /** 分页大小 */
+    @ApiModelProperty("分页大小")
+    private Integer pageSize;
+    /** 当前页数 */
+    @ApiModelProperty("当前页数")
+    private Integer pageNum;
+
+    @ApiModelProperty("店铺ID")
+    private Long storeId;
+    @ApiModelProperty("开始时间")
+    private Long startTime;
+    @ApiModelProperty("结束时间")
+    private Long endTime;
+    @ApiModelProperty("订单号")
+    private String orderSn;
+}

+ 18 - 1
zhongzheng-system/src/main/java/com/zhongzheng/modules/order/domain/Order.java

@@ -1,6 +1,7 @@
 package com.zhongzheng.modules.order.domain;
 
 import com.baomidou.mybatisplus.annotation.*;
+import io.swagger.annotations.ApiModelProperty;
 import lombok.Data;
 import lombok.NoArgsConstructor;
 import lombok.experimental.Accessors;
@@ -66,7 +67,7 @@ private static final long serialVersionUID=1L;
     private Long updateTime;
     /** 支付时间 */
     private Long payTime;
-    /** 支付平台 1微信 2支付宝 */
+    /** 支付平台 1微信 2支付宝 3现金*/
     private Integer payType;
     /** 微信流水号 */
     private String transid;
@@ -178,4 +179,20 @@ private static final long serialVersionUID=1L;
     /** 分成审核状态 1正常 2待审核 3审核中  4审核不通过 5审核通过待支付 6已支付*/
     private Integer divideStatus;
 
+    /** 抵扣积分 */
+    private BigDecimal deductionIntegral;
+    /** 抵扣金额 */
+    private BigDecimal deductionMoney;
+    /** 补差金额 */
+    private BigDecimal compensationMoney;
+    /** 积分规则json */
+    private String integralRule;
+
+    /** 店铺ID*/
+    private Long storeId;
+    /** 商户ID*/
+    private Long merId;
+
+
+
 }

+ 4 - 0
zhongzheng-system/src/main/java/com/zhongzheng/modules/order/domain/OrderGoods.java

@@ -92,4 +92,8 @@ private static final long serialVersionUID=1L;
     private Integer divideModel;
     @ApiModelProperty("分成钱")
     private BigDecimal divideMoney;
+    /** 店铺ID*/
+    private Long storeId;
+    /** 商户ID*/
+    private Long merId;
 }

+ 4 - 0
zhongzheng-system/src/main/java/com/zhongzheng/modules/order/domain/OrderPay.java

@@ -44,4 +44,8 @@ private static final long serialVersionUID=1L;
     private BigDecimal payPrice;
     /** 微信流水号 */
     private String transid;
+    /** 店铺ID*/
+    private Long storeId;
+    /** 商户ID*/
+    private Long merId;
 }

+ 66 - 0
zhongzheng-system/src/main/java/com/zhongzheng/modules/order/domain/StoreOrderRefund.java

@@ -0,0 +1,66 @@
+package com.zhongzheng.modules.order.domain;
+
+import com.baomidou.mybatisplus.annotation.FieldFill;
+import com.baomidou.mybatisplus.annotation.TableField;
+import com.baomidou.mybatisplus.annotation.TableId;
+import com.baomidou.mybatisplus.annotation.TableName;
+import lombok.Data;
+import lombok.NoArgsConstructor;
+import lombok.experimental.Accessors;
+
+import java.io.Serializable;
+import java.math.BigDecimal;
+
+/**
+ * 订单商品退款对象 order_goods_refund
+ *
+ * @author hjl
+ * @date 2022-01-04
+ */
+@Data
+@NoArgsConstructor
+@Accessors(chain = true)
+@TableName("store_order_refund")
+public class StoreOrderRefund implements Serializable {
+
+    /** $column.columnComment */
+    @TableId(value = "refund_id")
+    private Long refundId;
+    /** 退款单号 */
+    private String refundSn;
+    /** 用户ID */
+    private Long userId;
+    /** 订单编号 */
+    private String orderSn;
+    /** 退款金额 */
+    private BigDecimal refundFee;
+    /** 实际退款金额 */
+    private BigDecimal realRefundFee;
+    /** 添加时间 */
+    @TableField(fill = FieldFill.INSERT)
+    private Long createTime;
+    /** 修改时间 */
+    @TableField(fill = FieldFill.INSERT_UPDATE)
+    private Long updateTime;
+    /** 状态 1正常 0关闭 */
+    private Integer status;
+    /** 微信退款单号 */
+    private String wxpayRefundId;
+    /** 申请退款原因 */
+    private String applyReason;
+    /** 申请图片地址 , 拼接 */
+    private String applyImgs;
+    /** 退款类型 1核销退款 */
+    private Integer type;
+    /** 退款时间 */
+    private Long refundTime;
+    /** 店铺ID */
+    private Long storeId;
+    /** 商户ID */
+    private Long merId;
+    /** 商户ID */
+    private Long tenantId;
+    /** 操作人 */
+    private String createBy;
+
+}

+ 17 - 0
zhongzheng-system/src/main/java/com/zhongzheng/modules/order/mapper/OrderMapper.java

@@ -1,11 +1,16 @@
 package com.zhongzheng.modules.order.mapper;
+import com.baomidou.mybatisplus.annotation.InterceptorIgnore;
 import com.baomidou.mybatisplus.core.mapper.BaseMapper;
 import com.zhongzheng.modules.base.bo.ConsoleQueryBo;
 import com.zhongzheng.modules.grade.bo.ClassGradeListBo;
 import com.zhongzheng.modules.grade.domain.ClassGrade;
+import com.zhongzheng.modules.order.bo.IntegralOrderQueryBo;
 import com.zhongzheng.modules.order.bo.OrderGoodsQueryBo;
 import com.zhongzheng.modules.order.bo.OrderQueryBo;
+import com.zhongzheng.modules.order.bo.OrderUserQueryBo;
 import com.zhongzheng.modules.order.domain.Order;
+import com.zhongzheng.modules.order.vo.IntegralOrderUserVo;
+import com.zhongzheng.modules.order.vo.IntegralOrderVo;
 import com.zhongzheng.modules.order.vo.OrderGoodsVo;
 import com.zhongzheng.modules.order.vo.OrderListVo;
 import org.apache.ibatis.annotations.Param;
@@ -43,4 +48,16 @@ public interface OrderMapper extends BaseMapper<Order> {
     OrderListVo queryDetailByOrderSn(String orderSn);
 
     List<Long> getUserGoods(@Param("userId") Long userId);
+
+    @InterceptorIgnore(tenantLine = "true")
+    List<IntegralOrderVo> getIntegralOrderList(IntegralOrderQueryBo bo);
+
+    @InterceptorIgnore(tenantLine = "true")
+    Long getIntegralOrderList_COUNT(IntegralOrderQueryBo bo);
+
+    @InterceptorIgnore(tenantLine = "true")
+    List<IntegralOrderUserVo> getOrderUserList(OrderUserQueryBo bo);
+
+    @InterceptorIgnore(tenantLine = "true")
+    Long getOrderUserList_COUNT(OrderUserQueryBo bo);
 }

+ 14 - 0
zhongzheng-system/src/main/java/com/zhongzheng/modules/order/mapper/StoreOrderRefundMapper.java

@@ -0,0 +1,14 @@
+package com.zhongzheng.modules.order.mapper;
+
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+import com.zhongzheng.modules.order.bo.StoreRefundOrderQueryBo;
+import com.zhongzheng.modules.order.domain.Order;
+import com.zhongzheng.modules.order.domain.StoreOrderRefund;
+import com.zhongzheng.modules.order.vo.StoreOrderRefundVo;
+
+import java.util.List;
+
+public interface StoreOrderRefundMapper extends BaseMapper<StoreOrderRefund> {
+
+    List<StoreOrderRefundVo> getRefundOrderList(StoreRefundOrderQueryBo bo);
+}

+ 14 - 3
zhongzheng-system/src/main/java/com/zhongzheng/modules/order/service/IOrderService.java

@@ -4,9 +4,7 @@ import com.baomidou.mybatisplus.extension.service.IService;
 import com.zhongzheng.modules.base.bo.ConsoleQueryBo;
 import com.zhongzheng.modules.order.bo.*;
 import com.zhongzheng.modules.order.domain.Order;
-import com.zhongzheng.modules.order.vo.OrderGoodsVo;
-import com.zhongzheng.modules.order.vo.OrderListVo;
-import com.zhongzheng.modules.order.vo.OrderVo;
+import com.zhongzheng.modules.order.vo.*;
 
 import java.util.Collection;
 import java.util.List;
@@ -113,4 +111,17 @@ public interface IOrderService extends IService<Order> {
 
 	Map<String, String> addIntegralOrder(IntegralOrderAddBo bo);
 
+    Boolean cancelIntegralOrder(IntegralOrderAddBo bo);
+
+	List<IntegralOrderVo> getIntegralOrderList(IntegralOrderQueryBo bo);
+
+	IntegralOrderDeatilVo getIntegralOrderDetail(Long orderId);
+
+	IntegralOrderStatisticsVo getIntegralOrderStatistics(IntegralOrderQueryBo bo);
+
+	boolean refundIntegralOrder(IntegralOrderRefundBo bo);
+
+	boolean rechargeIntegral(IntegralRechargeBo bo);
+
+	List<IntegralOrderUserVo> getOrderUserList(OrderUserQueryBo bo);
 }

+ 21 - 0
zhongzheng-system/src/main/java/com/zhongzheng/modules/order/service/IStoreOrderRefundService.java

@@ -0,0 +1,21 @@
+package com.zhongzheng.modules.order.service;
+
+import com.baomidou.mybatisplus.extension.service.IService;
+import com.zhongzheng.modules.order.bo.StoreRefundOrderQueryBo;
+import com.zhongzheng.modules.order.domain.StoreOrderRefund;
+import com.zhongzheng.modules.order.vo.IntegralOrderVo;
+import com.zhongzheng.modules.order.vo.StoreOrderRefundVo;
+
+import java.util.List;
+
+public interface IStoreOrderRefundService extends IService<StoreOrderRefund> {
+
+    /**
+     * 退款订单列表
+     * @author change
+     * @date 2023/6/9 14:08
+     * @param bo
+     * @return java.util.List<com.zhongzheng.modules.order.vo.IntegralOrderVo>
+     */
+    List<StoreOrderRefundVo> getRefundOrderList(StoreRefundOrderQueryBo bo);
+}

+ 299 - 13
zhongzheng-system/src/main/java/com/zhongzheng/modules/order/service/impl/OrderServiceImpl.java

@@ -14,6 +14,7 @@ import com.baomidou.mybatisplus.core.toolkit.ObjectUtils;
 import com.baomidou.mybatisplus.core.toolkit.Wrappers;
 import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
 import com.github.pagehelper.Page;
+import com.zhongzheng.common.core.domain.entity.store.StoreUser;
 import com.zhongzheng.common.core.redis.RedisCache;
 import com.zhongzheng.common.core.redis.RedisLockEntity;
 import com.zhongzheng.common.exception.CustomException;
@@ -65,10 +66,8 @@ import com.zhongzheng.modules.order.bo.*;
 import com.zhongzheng.modules.order.domain.*;
 import com.zhongzheng.modules.order.mapper.OrderMapper;
 import com.zhongzheng.modules.order.service.*;
-import com.zhongzheng.modules.order.vo.OrderGoodsVo;
-import com.zhongzheng.modules.order.vo.OrderListVo;
-import com.zhongzheng.modules.order.vo.OrderPayVo;
-import com.zhongzheng.modules.order.vo.OrderVo;
+import com.zhongzheng.modules.order.vo.*;
+import com.zhongzheng.modules.store.service.IStoreUserService;
 import com.zhongzheng.modules.system.domain.SysOldOrg;
 import com.zhongzheng.modules.system.domain.SysTenant;
 import com.zhongzheng.modules.system.service.ISysOldOrgService;
@@ -85,7 +84,9 @@ import com.zhongzheng.modules.top.goods.service.ITopOldOrderCheckLogService;
 import com.zhongzheng.modules.top.goods.service.ITopOldOrderCheckService;
 import com.zhongzheng.modules.user.domain.User;
 import com.zhongzheng.modules.user.domain.UserExamGoods;
+import com.zhongzheng.modules.user.domain.UserPointsLog;
 import com.zhongzheng.modules.user.service.IUserExamGoodsService;
+import com.zhongzheng.modules.user.service.IUserPointsLogService;
 import com.zhongzheng.modules.user.service.IUserService;
 import com.zhongzheng.modules.user.vo.UserVo;
 import com.zhongzheng.modules.wx.service.IWxPayService;
@@ -194,6 +195,12 @@ public class OrderServiceImpl extends ServiceImpl<OrderMapper, Order> implements
     private ITopOldOrderCheckService topOldOrderCheckService;
     @Autowired
     private ITopOldOrderCheckLogService topOldOrderCheckLogService;
+    @Autowired
+    private IUserPointsLogService userPointsLogService;
+    @Autowired
+    private IStoreOrderRefundService storeOrderRefundService;
+    @Autowired
+    private IStoreUserService storeUserService;
 
 
     @Override
@@ -2256,8 +2263,9 @@ public class OrderServiceImpl extends ServiceImpl<OrderMapper, Order> implements
     }
 
     @Override
+    @Transactional(rollbackFor = Exception.class)
     public Map<String, String> addIntegralOrder(IntegralOrderAddBo bo) {
-        String key = "ORDER-" + "-" + bo.getUserId();
+        String key = "ORDER-HX" + "-" + bo.getUserId();
         Long value = redisCache.getCacheObject(key);
         if (Validator.isNotEmpty(value)) {
             throw new CustomException("请勿频繁提交订单");
@@ -2267,15 +2275,27 @@ public class OrderServiceImpl extends ServiceImpl<OrderMapper, Order> implements
         if (goodsList == null || goodsList.size() < 1) {
             throw new CustomException("商品列表为空");
         }
+        if (bo.getOrderType() == 3 && bo.getDeductionIntegral().compareTo(BigDecimal.ZERO) > 0){
+            //核销订单,积分扣除
+            User user = iUserService.getById(bo.getUserId());
+            if (user.getPointsValue().compareTo(bo.getDeductionIntegral()) < 0){
+                throw new CustomException("订单有误【用户积分不够】!请检查");
+            }
+        }
+
         Order add = BeanUtil.toBean(bo, Order.class);
         validEntityBeforeSave(add);
         add.setCreateTime(DateUtils.getNowTime());
         add.setUpdateTime(DateUtils.getNowTime());
         add.setOrderType(3);//核销订单
+        //订单实付价格
+        BigDecimal payPrice = add.getPayPrice();
+        //支付方式
+        Integer payType = add.getPayType();
         //生成订单号
         String out_trade_no = "HX"+DateUtils.getDateOrderSn();
         BigDecimal totalPrice = new BigDecimal(0);
-        BigDecimal payPrice = new BigDecimal(0);
+        BigDecimal goodsTotalPrice = new BigDecimal(0);
         String body = "中正核销系统-";
         List<OrderGoods> freeList = new ArrayList<>();
         //生成订单
@@ -2300,7 +2320,7 @@ public class OrderServiceImpl extends ServiceImpl<OrderMapper, Order> implements
             //订单价格不计算优惠
             totalPrice = totalPrice.add(goods.getStandPrice());
             //暂不计算优惠券
-            payPrice = payPrice.add(goods.getSpecialPrice());
+            goodsTotalPrice = goodsTotalPrice.add(goods.getSpecialPrice());
             iOrderGoodsService.save(orderGoods);
 
             if (goods.getGoodsType() == 7) {
@@ -2308,23 +2328,29 @@ public class OrderServiceImpl extends ServiceImpl<OrderMapper, Order> implements
             }
 
             //商品0元加入免费商品列表
-            if (orderGoods.getGoodsPrice().compareTo(BigDecimal.ZERO) == 0) {
+            if (orderGoods.getGoodsPrice().compareTo(BigDecimal.ZERO) == 0 || payType == 3) {
                 freeList.add(orderGoods);
             }
         }
+        //价格校验
+        if (goodsTotalPrice.compareTo(payPrice) > 0){
+            throw new CustomException("订单价格有误!请稍后");
+        }
 
         add.setOrderSn(out_trade_no);
         add.setOrderFrom(Order.FROM_HX_PC);
         add.setPayPrice(payPrice);
         add.setPayType(bo.getPayType());
         add.setOrderPrice(totalPrice);
+        add.setCheckStatus(1);
+        add.setRefundStatus(1);
         //生成支付单号
         String pay_no = DateUtils.getPayOrderSn();
         //订单0元
-        if (payPrice.compareTo(BigDecimal.ZERO) == 0) {
+        if (payPrice.compareTo(BigDecimal.ZERO) == 0 || payType == 3) {
             //完全收费
             add.setOrderStatus(Order.ORDER_STATUS_PAY);
-            add.setPayStatus(Order.PAY_FREE);
+            add.setPayStatus(payType == 3?Order.PAY_FULL:Order.PAY_FREE);
             add.setStatus(1);
         } else {
             OrderPayAddBo payAddBo = new OrderPayAddBo();
@@ -2339,7 +2365,9 @@ public class OrderServiceImpl extends ServiceImpl<OrderMapper, Order> implements
 
         //处理免费商品
         for (OrderGoods orderGoods : freeList) {
-            dealFreeGoods(orderGoods, add);
+            orderGoods.setPayStatus(payType == 3?OrderGoods.PAY_FULL:OrderGoods.PAY_FREE);
+            orderGoods.setGoodsReceived(orderGoods.getGoodsRealPrice());
+            iOrderGoodsService.updateById(orderGoods);
         }
 
         Map<String, Object> result = new HashMap<>();
@@ -2348,14 +2376,272 @@ public class OrderServiceImpl extends ServiceImpl<OrderMapper, Order> implements
         UserVo userVo = iUserService.queryById(add.getUserId());
         Map<String, String> payResult = new HashMap<>();
         //大于0元,获取微信支付信息
-        if (payPrice.compareTo(BigDecimal.ZERO) != 0) {
-            payResult = iWxPayService.paymentPc(pay_no, userVo.getOpenId(), body, payPrice);
+        if (payPrice.compareTo(BigDecimal.ZERO) != 0 && payType != 3) {
+            payResult = iWxPayService.paymentStorePc(pay_no, userVo.getOpenId(), body, payPrice);
+        }else{
+            //等于0元,或者现金支付
+            //积分扣除,保存积分变动
+            if (bo.getDeductionIntegral().compareTo(BigDecimal.ZERO) > 0){
+                BigDecimal subtract = userVo.getPointsValue().subtract(bo.getDeductionIntegral());
+                UserPointsLog log = new UserPointsLog();
+                log.setUserId(userVo.getUserId());
+                log.setPoints(bo.getDeductionIntegral());
+                log.setPointsBefore(userVo.getPointsValue());
+                log.setPointsAfter(subtract);
+                log.setStatus(1);
+                log.setOrderSn(add.getOrderSn());
+                log.setType(1);
+                log.setCreateTime(DateUtils.getNowTime());
+                log.setUpdateTime(DateUtils.getNowTime());
+                userPointsLogService.save(log);
+                iUserService.update(new LambdaUpdateWrapper<User>()
+                        .eq(User::getUserId,add.getUserId())
+                        .set(User::getPointsValue,subtract));
+            }
         }
 
         payResult.put("orderSn", out_trade_no);
         return payResult;
     }
 
+    @Override
+    @Transactional(rollbackFor = Exception.class)
+    public Boolean cancelIntegralOrder(IntegralOrderAddBo bo) {
+        Order order = getOne(new LambdaQueryWrapper<Order>().eq(Order::getOrderSn, bo.getOrderSn()));
+        if (ObjectUtils.isNull(order)){
+            throw new CustomException("订单信息有误!");
+        }
+        if (order.getPayStatus() != 0){
+            throw new CustomException("订单已支付,不能取消!");
+        }
+        order.setOrderStatus(-1);//手动关闭订单
+        updateById(order);
+        List<OrderGoods> list = iOrderGoodsService.list(new LambdaQueryWrapper<OrderGoods>().eq(OrderGoods::getOrderSn, bo.getOrderSn()));
+        if (CollectionUtils.isNotEmpty(list)){
+            //关闭订单
+            list.forEach(x -> x.setStatus(0));
+            iOrderGoodsService.updateBatchById(list);
+        }
+        return true;
+    }
+
+    @Override
+    public List<IntegralOrderVo> getIntegralOrderList(IntegralOrderQueryBo bo) {
+        String store = ServletUtils.getRequest().getHeader("Store");
+        if (StringUtils.isNotBlank(store)){
+            bo.setStoreId(Long.valueOf(store));
+        }
+        String merId = ServletUtils.getRequest().getHeader("MerId");
+        if (StringUtils.isNotBlank(merId)){
+            bo.setMerId(Long.valueOf(merId));
+        }
+        String tenantId = ServletUtils.getRequest().getHeader("TenantId");
+        if (StringUtils.isNotBlank(tenantId)){
+            bo.setTenantId(Long.valueOf(tenantId));
+        }
+        return baseMapper.getIntegralOrderList(bo);
+    }
+
+    @Override
+    public IntegralOrderDeatilVo getIntegralOrderDetail(Long orderId) {
+        Order order = getById(orderId);
+        if (ObjectUtils.isNull(order)){
+            throw new CustomException("订单信息获取有误!");
+        }
+        IntegralOrderDeatilVo vo = BeanUtil.toBean(order, IntegralOrderDeatilVo.class);
+
+        //订单商品
+        List<OrderGoods> orderGoodsList = iOrderGoodsService.list(new LambdaQueryWrapper<OrderGoods>()
+                .eq(OrderGoods::getOrderSn, order.getOrderSn()));
+        if (CollectionUtils.isEmpty(orderGoodsList)){
+            throw new CustomException("订单不存在商品信息!");
+        }
+
+        List<IntegralOrderGoodsVo> goodsVoList = new ArrayList<>();
+        BigDecimal goodsPrice = BigDecimal.ZERO;
+        BigDecimal discountsPrice = BigDecimal.ZERO;
+        for (OrderGoods orderGoods : orderGoodsList) {
+            //商品金额
+            Goods goods = iGoodsService.getById(orderGoods.getGoodsId());
+            goodsPrice = goodsPrice.add(goods.getStandPrice());
+            discountsPrice = discountsPrice.add(goods.getSpecialPrice());
+
+            IntegralOrderGoodsVo goodsVo = new IntegralOrderGoodsVo();
+            goodsVo.setOrderSn(order.getOrderSn());
+            goodsVo.setOrderGoodsId(orderGoods.getOrderGoodsId());
+            goodsVo.setGoodsId(goods.getGoodsId());
+            goodsVo.setGoodsName(goods.getGoodsName());
+            goodsVo.setGoodsPrice(goods.getStandPrice());
+            goodsVo.setCoverUrl(goods.getCoverUrl());
+            goodsVo.setGoodsInputData(orderGoods.getGoodsInputData());
+            goodsVo.setGoodsRealPrice(orderGoods.getGoodsRealPrice());
+            goodsVo.setPayStatus(orderGoods.getPayStatus());
+            goodsVo.setStatus(orderGoods.getStatus());
+            goodsVoList.add(goodsVo);
+        }
+        vo.setGoodsPrice(goodsPrice);
+        vo.setDiscountsPrice(discountsPrice);
+        vo.setAnotherPrice(order.getPayPrice().subtract(discountsPrice));
+        return vo;
+    }
+
+    @Override
+    public IntegralOrderStatisticsVo getIntegralOrderStatistics(IntegralOrderQueryBo bo) {
+        List<IntegralOrderVo> list = baseMapper.getIntegralOrderList(bo);
+        if (CollectionUtils.isEmpty(list)){
+            return null;
+        }
+        BigDecimal orderPriceTotal = list.stream().map(IntegralOrderVo::getOrderPrice).reduce(BigDecimal.ZERO, BigDecimal::add);
+        BigDecimal payPriceTotal = list.stream().map(IntegralOrderVo::getPayPrice).reduce(BigDecimal.ZERO, BigDecimal::add);
+        BigDecimal deductionIntegralTotal = list.stream().map(IntegralOrderVo::getDeductionIntegral).reduce(BigDecimal.ZERO, BigDecimal::add);
+        BigDecimal deductionPriceTotal = list.stream().map(IntegralOrderVo::getDeductionMoney).reduce(BigDecimal.ZERO, BigDecimal::add);
+
+        BigDecimal goodsPriceTotal = BigDecimal.ZERO;
+        BigDecimal refundMoneyTotal = BigDecimal.ZERO;
+        for (IntegralOrderVo orderVo : list) {
+            //商品金额
+            List<OrderGoods> goodsList = iOrderGoodsService
+                    .list(new LambdaQueryWrapper<OrderGoods>().eq(OrderGoods::getOrderSn, orderVo.getOrderSn()).eq(OrderGoods::getStatus,1));
+            if (CollectionUtils.isNotEmpty(goodsList)){
+                BigDecimal goodsPrice = goodsList.stream().map(OrderGoods::getGoodsPrice).reduce(BigDecimal.ZERO, BigDecimal::add);
+                goodsPriceTotal = goodsPriceTotal.add(goodsPrice);
+            }
+
+            //退款金额
+            List<StoreOrderRefund> refundList = storeOrderRefundService.list(new LambdaQueryWrapper<StoreOrderRefund>()
+                    .eq(StoreOrderRefund::getOrderSn, orderVo.getOrderSn()).eq(StoreOrderRefund::getStatus, 1));
+            if (CollectionUtils.isNotEmpty(refundList)){
+                BigDecimal refundPrice = refundList.stream().map(StoreOrderRefund::getRealRefundFee).reduce(BigDecimal.ZERO, BigDecimal::add);
+                refundMoneyTotal = refundMoneyTotal.add(refundPrice);
+            }
+        }
+        IntegralOrderStatisticsVo vo = new IntegralOrderStatisticsVo();
+        vo.setDeductionIntegralTotal(deductionIntegralTotal);
+        vo.setDeductionPriceTotal(deductionPriceTotal);
+        vo.setOrderPriceTotal(orderPriceTotal);
+        vo.setGoodsPriceTotal(goodsPriceTotal);
+        vo.setPayPriceTotal(payPriceTotal);
+        vo.setRefundMoneyTotal(refundMoneyTotal);
+        return vo;
+    }
+
+    @Override
+    @Transactional(rollbackFor = Exception.class)
+    public boolean refundIntegralOrder(IntegralOrderRefundBo bo) {
+        //退款账号角色校验
+        Order order = getOne(new LambdaQueryWrapper<Order>().eq(Order::getOrderSn, bo.getOrderSn()));
+        if (Objects.isNull(order)){
+            throw new CustomException("订单信息有误!请检查");
+        }
+        BigDecimal refundPrice = BigDecimal.ZERO;
+        //查看订单已退金额
+        List<StoreOrderRefund> refundList = storeOrderRefundService.list(new LambdaQueryWrapper<StoreOrderRefund>()
+                .eq(StoreOrderRefund::getOrderSn, order.getOrderSn()).eq(StoreOrderRefund::getStatus, 1));
+        if (CollectionUtils.isNotEmpty(refundList)){
+            refundPrice = refundList.stream().map(StoreOrderRefund::getRealRefundFee).reduce(BigDecimal.ZERO,BigDecimal::add);
+        }
+        BigDecimal payPrice = order.getPayPrice();
+        //可退金额
+        BigDecimal returnable = payPrice.subtract(refundPrice);
+        if (returnable.compareTo(bo.getRefundPrice()) < 0){
+            throw new CustomException("订单可退金额不足!请检查");
+        }
+        //退款生成
+        StoreOrderRefund add = new StoreOrderRefund();
+
+        add.setCreateTime(DateUtils.getNowTime());
+        add.setUpdateTime(DateUtils.getNowTime());
+        //退款单号
+        String refundSn = DateUtils.getDateOrderSn();
+        add.setRefundSn(refundSn);
+        add.setRefundFee(bo.getRefundPrice());
+        add.setUserId(order.getUserId());
+        add.setType(1); // 核销退款
+        add.setOrderSn(bo.getOrderSn());
+        //操作人
+        StoreUser user = storeUserService.getById(bo.getLoginId());
+        add.setCreateBy(user.getRealname());
+        storeOrderRefundService.save(add);
+        order.setOrderRefund(bo.getRefundPrice());
+        order.setRefundStatus(2);
+        updateById(order);
+
+        if (order.getPayType() == 1){
+            //微信支付,原路返回
+            Map<String, String> payResult =  iWxPayService.refund(refundSn,order.getTransid(),bo.getRefundPrice(),order.getPayPrice());
+        }
+        StoreOrderRefund refund = storeOrderRefundService.getOne(new LambdaQueryWrapper<StoreOrderRefund>().eq(StoreOrderRefund::getRefundSn, refundSn));
+        refund.setRealRefundFee(bo.getRefundPrice());
+        refund.setRefundTime(DateUtils.getNowTime());
+        storeOrderRefundService.updateById(refund);
+
+        BigDecimal refundedPrice = order.getOrderRefunded().add(bo.getRefundPrice());
+        Integer refundStatus = 0;
+        if (refundedPrice.compareTo(order.getPayPrice()) < 0 ){
+            refundStatus = 5; // 部分退款
+        }else {
+            refundStatus = 3;// 已退款
+        }
+        updateById(order);
+        return update(new LambdaUpdateWrapper<Order>()
+        .set(Order::getOrderRefunded,refundedPrice)
+        .set(Order::getRefundStatus,refundStatus)
+        .eq(Order::getOrderSn,order.getOrderSn()));
+    }
+
+    @Override
+    @Transactional(rollbackFor = Exception.class)
+    public boolean rechargeIntegral(IntegralRechargeBo bo) {
+        Order order = getOne(new LambdaQueryWrapper<Order>().eq(Order::getOrderSn, bo.getOrderSn()));
+        if (ObjectUtil.isNull(order)){
+            throw new CustomException("订单信息获取有误!");
+        }
+        StoreUser storeUser = storeUserService.getById(bo.getLoginId());
+        //积分校验
+        if (order.getDeductionIntegral().compareTo(bo.getIntegral()) < 0){
+            throw new CustomException("订单积分不足!请检查");
+        }
+        BigDecimal integral = bo.getIntegral();
+        //积分冲账
+        User user = iUserService.getById(order.getUserId());
+        BigDecimal pointsValue = user.getPointsValue();
+        BigDecimal add = pointsValue.add(integral);
+        user.setPointsValue(add);
+        //记录
+        UserPointsLog log = new UserPointsLog();
+        log.setUserId(user.getUserId());
+        log.setPoints(integral);
+        log.setPointsBefore(pointsValue);
+        log.setPointsAfter(add);
+        log.setOrderSn(order.getOrderSn());
+        log.setStatus(1);
+        log.setType(2);//积分冲账
+        log.setCreateTime(DateUtils.getNowTime());
+        log.setUpdateTime(DateUtils.getNowTime());
+        log.setCreateBy(storeUser.getRealname());
+        userPointsLogService.save(log);
+
+        iUserService.updateById(user);
+        return true;
+    }
+
+    @Override
+    public List<IntegralOrderUserVo> getOrderUserList(OrderUserQueryBo bo) {
+        String store = ServletUtils.getRequest().getHeader("Store");
+        if (StringUtils.isNotBlank(store)){
+            bo.setStoreId(Long.valueOf(store));
+        }
+        String merId = ServletUtils.getRequest().getHeader("MerId");
+        if (StringUtils.isNotBlank(merId)){
+            bo.setMerId(Long.valueOf(merId));
+        }
+        String tenantId = ServletUtils.getRequest().getHeader("TenantId");
+        if (StringUtils.isNotBlank(tenantId)){
+            bo.setTenantId(Long.valueOf(tenantId));
+        }
+        return baseMapper.getOrderUserList(bo);
+    }
+
     private String createGradeCode(Long goodsId, CourseBusinessVo business) {
 
         Goods goods = iGoodsService.getById(goodsId);

+ 27 - 0
zhongzheng-system/src/main/java/com/zhongzheng/modules/order/service/impl/StoreOrderRefundServiceImpl.java

@@ -0,0 +1,27 @@
+package com.zhongzheng.modules.order.service.impl;
+
+import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
+import com.zhongzheng.modules.order.bo.StoreRefundOrderQueryBo;
+import com.zhongzheng.modules.order.domain.OrderShareMoney;
+import com.zhongzheng.modules.order.domain.StoreOrderRefund;
+import com.zhongzheng.modules.order.mapper.OrderShareMoneyMapper;
+import com.zhongzheng.modules.order.mapper.StoreOrderRefundMapper;
+import com.zhongzheng.modules.order.service.IStoreOrderRefundService;
+import com.zhongzheng.modules.order.vo.StoreOrderRefundVo;
+import org.springframework.stereotype.Service;
+
+import java.util.List;
+
+/**
+ * @author yangdamao
+ * @date 2023年06月09日 9:33
+ */
+@Service
+public class StoreOrderRefundServiceImpl extends ServiceImpl<StoreOrderRefundMapper, StoreOrderRefund> implements IStoreOrderRefundService {
+
+
+    @Override
+    public List<StoreOrderRefundVo> getRefundOrderList(StoreRefundOrderQueryBo bo) {
+        return baseMapper.getRefundOrderList(bo);
+    }
+}

+ 68 - 0
zhongzheng-system/src/main/java/com/zhongzheng/modules/order/vo/IntegralOrderDeatilVo.java

@@ -0,0 +1,68 @@
+package com.zhongzheng.modules.order.vo;
+
+import com.zhongzheng.common.annotation.Excel;
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+
+import java.math.BigDecimal;
+import java.util.List;
+
+
+/**
+ * 订单视图对象 mall_package
+ *
+ * @author ruoyi
+ * @date 2021-11-08
+ */
+@Data
+@ApiModel("核销订单详情")
+public class IntegralOrderDeatilVo {
+	private static final long serialVersionUID = 1L;
+
+	/** $pkColumn.columnComment */
+	@ApiModelProperty("$pkColumn.columnComment")
+	private Long orderId;
+
+	/** 订单编号 */
+	@ApiModelProperty("订单编号")
+	private String orderSn;
+	/** 订单价格 */
+	@ApiModelProperty("订单金额(元)")
+	private BigDecimal orderPrice;
+	@ApiModelProperty("商品金额(元)")
+	private BigDecimal goodsPrice;
+	@ApiModelProperty("会员商品金额(元)")
+	private BigDecimal discountsPrice;
+	@ApiModelProperty("其他金额(元)")
+	private BigDecimal anotherPrice;
+	@ApiModelProperty("订单状态 -2 超时关闭,-1手动关闭,0普通状态,1为已付款,3为成功")
+	private Integer orderStatus;
+	/** 1有效 0无效 */
+	@ApiModelProperty("1有效 0无效")
+	private Integer status;
+	/** 支付平台 1微信 2支付宝 */
+	@ApiModelProperty("支付平台 1微信 2支付宝")
+	private Integer payType;
+	/** 订单类型 1充值订单 2金币消费订单 */
+	@ApiModelProperty("订单类型 1充值订单 2商品普通订单 3核销订单")
+	private Integer orderType;
+	/** 支付价格 */
+	@ApiModelProperty("已付金额(元)")
+	private BigDecimal payPrice;
+	/** 支付价格 */
+	@ApiModelProperty("抵扣积分")
+	private BigDecimal deductionIntegral;
+	/** 支付价格 */
+	@ApiModelProperty("抵扣金额(元)")
+	private BigDecimal deductionMoney;
+	@ApiModelProperty("订单来源 7会员核销系统(PC)8会员核销系统(小程序)")
+	private Integer orderFrom;
+	@ApiModelProperty("支付状态 0未收费,1部分付款  2完全付款 3免费")
+	private Integer payStatus;
+	@ApiModelProperty("店铺ID")
+	private Long storeId;
+	@ApiModelProperty("订单商品")
+	private List<IntegralOrderGoodsVo> goodsList;
+
+}

+ 58 - 0
zhongzheng-system/src/main/java/com/zhongzheng/modules/order/vo/IntegralOrderGoodsVo.java

@@ -0,0 +1,58 @@
+package com.zhongzheng.modules.order.vo;
+
+import com.zhongzheng.common.annotation.Excel;
+import com.zhongzheng.modules.exam.vo.ExamApplyGoodsVo;
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+
+import java.math.BigDecimal;
+import java.util.List;
+
+
+/**
+ * 订单商品视图对象 mall_package
+ *
+ * @author hjl
+ * @date 2021-11-08
+ */
+@Data
+@ApiModel("订单商品视图对象")
+public class IntegralOrderGoodsVo {
+	private static final long serialVersionUID = 1L;
+	/** $pkColumn.columnComment */
+	@ApiModelProperty("$pkColumn.columnComment")
+	private Long orderGoodsId;
+	/** 订单编号 */
+	@ApiModelProperty("订单编号")
+	private String orderSn;
+	/** 商品id */
+	@ApiModelProperty("商品id")
+	private Long goodsId;
+	/** 商品采集数据 */
+	@ApiModelProperty("商品采集数据")
+	private String goodsInputData;
+	/** 商品标准价格 */
+	@ApiModelProperty("商品标准价格")
+	private BigDecimal goodsPrice;
+	@ApiModelProperty("商品成交价格")
+	private BigDecimal goodsRealPrice;
+
+	@ApiModelProperty("商品优惠价格")
+	private BigDecimal goodsSpecialPrice;
+
+	@ApiModelProperty("商品名称")
+	private String goodsName;
+	/**  状态 1正常 0关闭  */
+	@ApiModelProperty(" 状态 1正常 0关闭")
+	private Integer status;
+
+	/** 支付状态 1未收费 2部分收费 3完全收费 */
+	@ApiModelProperty("支付状态 1未收费 2部分收费 3完全收费")
+	private Integer payStatus;
+	@ApiModelProperty("商品类型 1视频2题库 3面授 4服务 5组合")
+	private Integer goodsType;
+	@ApiModelProperty("封面地址")
+	private String coverUrl;
+
+}

+ 35 - 0
zhongzheng-system/src/main/java/com/zhongzheng/modules/order/vo/IntegralOrderStatisticsVo.java

@@ -0,0 +1,35 @@
+package com.zhongzheng.modules.order.vo;
+
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+
+import java.math.BigDecimal;
+
+
+/**
+ * 订单商品视图对象 mall_package
+ *
+ * @author hjl
+ * @date 2021-11-08
+ */
+@Data
+@ApiModel("订单统计对象")
+public class IntegralOrderStatisticsVo {
+	private static final long serialVersionUID = 1L;
+
+	/** 商品标准价格 */
+	@ApiModelProperty("订单金额")
+	private BigDecimal orderPriceTotal;
+	@ApiModelProperty("商品金额")
+	private BigDecimal goodsPriceTotal;
+	@ApiModelProperty("已付金额")
+	private BigDecimal payPriceTotal;
+	@ApiModelProperty("抵扣金额")
+	private BigDecimal deductionPriceTotal;
+	@ApiModelProperty("抵扣积分")
+	private BigDecimal deductionIntegralTotal;
+	@ApiModelProperty("退款金额")
+	private BigDecimal refundMoneyTotal;
+
+}

+ 49 - 0
zhongzheng-system/src/main/java/com/zhongzheng/modules/order/vo/IntegralOrderUserVo.java

@@ -0,0 +1,49 @@
+package com.zhongzheng.modules.order.vo;
+
+import com.zhongzheng.common.annotation.Excel;
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+
+import java.math.BigDecimal;
+
+
+/**
+ * 订单视图对象 mall_package
+ *
+ * @author ruoyi
+ * @date 2021-11-08
+ */
+@Data
+@ApiModel("核销订单")
+public class IntegralOrderUserVo {
+	private static final long serialVersionUID = 1L;
+
+	/** 用户ID */
+	@ApiModelProperty("用户ID")
+	private Long userId;
+	/** 订单价格 */
+	@ApiModelProperty("订单金额(元)")
+	private BigDecimal orderPrice;
+	/** 支付价格 */
+	@Excel(name = "总消费金额(元)")
+	@ApiModelProperty("总消费金额(元)")
+	private BigDecimal payPriceTotal;
+	@ApiModelProperty("店铺ID")
+	private Long storeId;
+	@Excel(name = "所属店铺")
+	@ApiModelProperty("所属店铺")
+	private String storeName;
+	@Excel(name = "会员名称")
+	@ApiModelProperty("会员名称")
+	private String userName;
+	@Excel(name = "会员手机号")
+	@ApiModelProperty("会员手机号")
+	private String telphone;
+	@Excel(name = "会员卡号")
+	@ApiModelProperty("会员卡号")
+	private String cardSn;
+
+
+
+}

+ 91 - 0
zhongzheng-system/src/main/java/com/zhongzheng/modules/order/vo/IntegralOrderVo.java

@@ -0,0 +1,91 @@
+package com.zhongzheng.modules.order.vo;
+
+import com.zhongzheng.common.annotation.Excel;
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+
+import java.math.BigDecimal;
+
+
+/**
+ * 订单视图对象 mall_package
+ *
+ * @author ruoyi
+ * @date 2021-11-08
+ */
+@Data
+@ApiModel("核销订单")
+public class IntegralOrderVo {
+	private static final long serialVersionUID = 1L;
+
+	/** $pkColumn.columnComment */
+	@ApiModelProperty("$pkColumn.columnComment")
+	private Long orderId;
+
+	/** 订单编号 */
+	@Excel(name = "订单编号")
+	@ApiModelProperty("订单编号")
+	private String orderSn;
+	/** 用户ID */
+	@ApiModelProperty("用户ID")
+	private Long userId;
+	/** 订单价格 */
+	@Excel(name = "订单金额(元)")
+	@ApiModelProperty("订单金额(元)")
+	private BigDecimal orderPrice;
+	@ApiModelProperty("订单状态 -2 超时关闭,-1手动关闭,0普通状态,1为已付款,3为成功")
+	private Integer orderStatus;
+	/** 1有效 0无效 */
+	@ApiModelProperty("1有效 0无效")
+	private Integer status;
+	/** 支付平台 1微信 2支付宝 */
+	@Excel(name = "支付平台 1微信 2支付宝")
+	@ApiModelProperty("支付平台 1微信 2支付宝")
+	private Integer payType;
+	/** 订单类型 1充值订单 2金币消费订单 */
+	@ApiModelProperty("订单类型 1充值订单 2商品普通订单 3核销订单")
+	private Integer orderType;
+	/** 支付价格 */
+	@Excel(name = "已付金额(元)")
+	@ApiModelProperty("已付金额(元)")
+	private BigDecimal payPrice;
+	/** 支付价格 */
+	@Excel(name = "抵扣积分")
+	@ApiModelProperty("抵扣积分")
+	private BigDecimal deductionIntegral;
+	/** 支付价格 */
+	@Excel(name = "抵扣金额(元)")
+	@ApiModelProperty("抵扣金额(元)")
+	private BigDecimal deductionMoney;
+	/** 订单来源 1业务员录单 */
+	@ApiModelProperty("订单来源 7会员核销系统(PC)8会员核销系统(小程序)")
+	private Integer orderFrom;
+	/** 支付状态 0未收费,1部分付款  2完全付款 3免费 */
+	@Excel(name = "支付状态 0未收费,1部分付款  2完全付款 3免费")
+	@ApiModelProperty("支付状态 0未收费,1部分付款  2完全付款 3免费")
+	private Integer payStatus;
+	@ApiModelProperty("店铺ID")
+	private Long storeId;
+
+	@Excel(name = "所属店铺")
+	@ApiModelProperty("所属店铺")
+	private String storeName;
+
+	@Excel(name = "核销时间")
+	@ApiModelProperty("核销时间")
+	private Long createTime;
+	@Excel(name = "会员名称")
+	@ApiModelProperty("会员名称")
+	private String userName;
+	@Excel(name = "会员手机号")
+	@ApiModelProperty("会员手机号")
+	private String telphone;
+	@Excel(name = "积分规则")
+	@ApiModelProperty("积分规则")
+	private String integralRule;
+	@Excel(name = "退款金额(元)")
+	@ApiModelProperty("退款金额(元)")
+	private BigDecimal refundMoney;
+
+}

+ 69 - 0
zhongzheng-system/src/main/java/com/zhongzheng/modules/order/vo/StoreOrderRefundVo.java

@@ -0,0 +1,69 @@
+package com.zhongzheng.modules.order.vo;
+
+import com.zhongzheng.common.annotation.Excel;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+
+import java.io.Serializable;
+import java.math.BigDecimal;
+
+/**
+ * 订单商品退款对象 order_goods_refund
+ *
+ * @author hjl
+ * @date 2022-01-04
+ */
+@Data
+public class StoreOrderRefundVo implements Serializable {
+
+    /** $column.columnComment */
+    private Long refundId;
+    /** 退款单号 */
+    @Excel(name = "退款编号")
+    @ApiModelProperty("退款编号")
+    private String refundSn;
+    /** 用户ID */
+    @ApiModelProperty("订单编号")
+    private Long userId;
+    /** 订单编号 */
+    @Excel(name = "订单编号")
+    @ApiModelProperty("订单编号")
+    private String orderSn;
+    /** 退款金额 */
+    @Excel(name = "退款金额")
+    @ApiModelProperty("退款金额")
+    private BigDecimal refundFee;
+    /** 实际退款金额 */
+    @Excel(name = "实际退款金额")
+    @ApiModelProperty("实际退款金额")
+    private BigDecimal realRefundFee;
+    /** 添加时间 */
+    private Long createTime;
+    /** 修改时间 */
+    private Long updateTime;
+    /** 状态 1正常 0关闭 */
+    private Integer status;
+    /** 微信退款单号 */
+    private String wxpayRefundId;
+    /** 申请退款原因 */
+    private String applyReason;
+    /** 申请图片地址 , 拼接 */
+    private String applyImgs;
+    /** 退款类型 1核销退款 */
+    private Integer type;
+    /** 退款时间 */
+    @Excel(name = "退款时间")
+    @ApiModelProperty("退款时间")
+    private Long refundTime;
+    /** 店铺ID */
+    private Long storeId;
+    /** 商户ID */
+    private Long merId;
+    /** 商户ID */
+    private Long tenantId;
+    /** 操作人 */
+    @Excel(name = "操作人")
+    @ApiModelProperty("操作人")
+    private String createBy;
+
+}

+ 7 - 0
zhongzheng-system/src/main/java/com/zhongzheng/modules/store/mapper/StoreUserMapper.java

@@ -1,10 +1,12 @@
 package com.zhongzheng.modules.store.mapper;
 
 
+import com.baomidou.mybatisplus.annotation.InterceptorIgnore;
 import com.baomidou.mybatisplus.core.mapper.BaseMapper;
 import com.zhongzheng.common.core.domain.entity.TopSysUser;
 import com.zhongzheng.common.core.domain.entity.store.StoreUser;
 import com.zhongzheng.modules.course.bo.CourseBusinessQueryBo;
+import com.zhongzheng.modules.user.bo.UserAppAccountLoginBo;
 import org.apache.ibatis.annotations.Param;
 
 import java.util.List;
@@ -28,4 +30,9 @@ public interface StoreUserMapper extends BaseMapper<StoreUser> {
      */
     List<StoreUser> selectUserList(StoreUser sysUser);
 
+    @InterceptorIgnore(tenantLine = "true")
+    StoreUser getStoreUserNoTenant(UserAppAccountLoginBo bo);
+
+    @InterceptorIgnore(tenantLine = "true")
+    StoreUser getUserNoTenantById(Long userId);
 }

+ 2 - 0
zhongzheng-system/src/main/java/com/zhongzheng/modules/store/service/IStoreUserService.java

@@ -87,4 +87,6 @@ public interface IStoreUserService extends IService<StoreUser> {
     boolean restorePwd(SysUserEditBo bo);
 
     boolean batchDelete(SysUserEditBo bo);
+
+    StoreUser getUserNoTenant(Long userId);
 }

+ 3 - 0
zhongzheng-system/src/main/java/com/zhongzheng/modules/system/mapper/SysConfigMapper.java

@@ -14,4 +14,7 @@ public interface SysConfigMapper extends BaseMapper<SysConfig> {
 
     @InterceptorIgnore(tenantLine = "true")
     SysConfig getSysConfigByKeyTenant(@Param("key") String key,@Param("tenantId") Long tenantId);
+
+    @InterceptorIgnore(tenantLine = "true")
+    String getConfigByKey(@Param("key")String key,@Param("tenantId") Long tenantId);
 }

+ 2 - 0
zhongzheng-system/src/main/java/com/zhongzheng/modules/system/service/ISysConfigService.java

@@ -76,4 +76,6 @@ public interface ISysConfigService extends IService<SysConfig> {
     public String checkConfigKeyUnique(SysConfigVo config);
 
     SysConfig getSysConfigByKeyTenant(String key, Long tenantId);
+
+    String getConfigByKey(String key, Long tenantId);
 }

+ 5 - 0
zhongzheng-system/src/main/java/com/zhongzheng/modules/system/service/impl/SysConfigServiceImpl.java

@@ -227,6 +227,11 @@ public class SysConfigServiceImpl extends ServiceImpl<SysConfigMapper, SysConfig
         return baseMapper.getSysConfigByKeyTenant(key, tenantId);
     }
 
+    @Override
+    public String getConfigByKey(String key, Long tenantId) {
+        return baseMapper.getConfigByKey(key, tenantId);
+    }
+
     /**
      * 设置cache key
      *

+ 1 - 0
zhongzheng-system/src/main/java/com/zhongzheng/modules/top/goods/service/impl/TopOldOrderServiceImpl.java

@@ -598,6 +598,7 @@ public class TopOldOrderServiceImpl extends ServiceImpl<TopOldOrderMapper, TopOl
         edit.setCreateTime(DateUtils.getNowTime());
         edit.setUpdateTime(DateUtils.getNowTime());
         edit.setCheckStatus(0);
+        edit.setRefundStatus(order.getRefundStatus());
         //未收账款
         if (ObjectUtils.isNull(bo.getOrderReceived()) || bo.getOrderReceived().compareTo(new BigDecimal("0.00")) == 0) {
             edit.setOrderUncollected(bo.getPayPrice());

+ 29 - 0
zhongzheng-system/src/main/java/com/zhongzheng/modules/top/mall/bo/TopStoreStatementQuery.java

@@ -0,0 +1,29 @@
+package com.zhongzheng.modules.top.mall.bo;
+
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+
+import java.util.List;
+
+
+/**
+ * 商户店铺管理编辑对象 top_store
+ *
+ * @author hjl
+ * @date 2023-05-25
+ */
+@Data
+@ApiModel("商户店铺报表对象")
+public class TopStoreStatementQuery {
+
+    @ApiModelProperty("店铺ID")
+    private Long storeId;
+
+    @ApiModelProperty("开始时间")
+    private Long startTime;
+
+    @ApiModelProperty("结束时间")
+    private Long endTime;
+
+}

+ 4 - 4
zhongzheng-system/src/main/java/com/zhongzheng/modules/top/mall/service/ITopStoreService.java

@@ -2,11 +2,9 @@ package com.zhongzheng.modules.top.mall.service;
 
 
 import com.baomidou.mybatisplus.extension.service.IService;
-import com.zhongzheng.modules.top.mall.bo.TopMerchantEditBo;
-import com.zhongzheng.modules.top.mall.bo.TopStoreAddBo;
-import com.zhongzheng.modules.top.mall.bo.TopStoreEditBo;
-import com.zhongzheng.modules.top.mall.bo.TopStoreQueryBo;
+import com.zhongzheng.modules.top.mall.bo.*;
 import com.zhongzheng.modules.top.mall.domain.TopStore;
+import com.zhongzheng.modules.top.mall.vo.TopStoreStatementVo;
 import com.zhongzheng.modules.top.mall.vo.TopStoreVo;
 import com.zhongzheng.modules.top.user.vo.TopSysPointsRuleVo;
 
@@ -58,4 +56,6 @@ public interface ITopStoreService extends IService<TopStore> {
 	TopSysPointsRuleVo getPointsRuleConfig();
 
 	boolean updatePointsRuleConfig(TopSysPointsRuleVo bo);
+
+	TopStoreStatementVo getStatement(TopStoreStatementQuery query);
 }

+ 56 - 7
zhongzheng-system/src/main/java/com/zhongzheng/modules/top/mall/service/impl/TopStoreServiceImpl.java

@@ -2,23 +2,27 @@ package com.zhongzheng.modules.top.mall.service.impl;
 
 import cn.hutool.core.bean.BeanUtil;
 import cn.hutool.core.lang.Validator;
+import cn.hutool.core.util.ObjectUtil;
 import cn.hutool.core.util.StrUtil;
 import com.alibaba.fastjson.JSON;
 import com.baomidou.mybatisplus.core.conditions.update.LambdaUpdateWrapper;
+import com.baomidou.mybatisplus.core.toolkit.CollectionUtils;
+import com.baomidou.mybatisplus.core.toolkit.StringUtils;
 import com.zhongzheng.common.exception.CustomException;
 import com.zhongzheng.common.utils.DateUtils;
 import com.zhongzheng.common.utils.SecurityUtils;
+import com.zhongzheng.common.utils.ServletUtils;
 import com.zhongzheng.common.utils.SnowflakeIdUtils;
-import com.zhongzheng.modules.top.mall.bo.TopActionLogAddBo;
-import com.zhongzheng.modules.top.mall.bo.TopStoreAddBo;
-import com.zhongzheng.modules.top.mall.bo.TopStoreEditBo;
-import com.zhongzheng.modules.top.mall.bo.TopStoreQueryBo;
+import com.zhongzheng.modules.order.domain.Order;
+import com.zhongzheng.modules.order.service.IOrderService;
+import com.zhongzheng.modules.top.mall.bo.*;
 import com.zhongzheng.modules.top.mall.domain.TopStore;
 import com.zhongzheng.modules.top.mall.mapper.TopStoreMapper;
 import com.zhongzheng.modules.top.mall.service.ITopActionLogService;
 import com.zhongzheng.modules.top.mall.service.ITopMerchantService;
 import com.zhongzheng.modules.top.mall.service.ITopStoreService;
 import com.zhongzheng.modules.top.mall.vo.TopMerchantVo;
+import com.zhongzheng.modules.top.mall.vo.TopStoreStatementVo;
 import com.zhongzheng.modules.top.mall.vo.TopStoreVo;
 import com.zhongzheng.modules.top.user.domain.TopSysConfig;
 import com.zhongzheng.modules.top.user.service.ITopSysConfigService;
@@ -31,9 +35,8 @@ import com.baomidou.mybatisplus.core.toolkit.Wrappers;
 import com.github.pagehelper.Page;
 
 
-import java.util.Collection;
-import java.util.Collections;
-import java.util.List;
+import java.math.BigDecimal;
+import java.util.*;
 import java.util.stream.Collectors;
 
 /**
@@ -54,6 +57,9 @@ public class TopStoreServiceImpl extends ServiceImpl<TopStoreMapper, TopStore> i
     @Autowired
     private ITopMerchantService iTopMerchantService;
 
+    @Autowired
+    private IOrderService iOrderService;
+
     @Override
     public TopStoreVo queryById(Long storeId){
         TopStore db = this.baseMapper.selectById(storeId);
@@ -223,4 +229,47 @@ public class TopStoreServiceImpl extends ServiceImpl<TopStoreMapper, TopStore> i
         objectLambdaUpdateWrapper.set(TopSysConfig::getConfigValue, JSON.toJSONString(bo));
         return topConfigService.update(null, objectLambdaUpdateWrapper);
     }
+
+    @Override
+    public TopStoreStatementVo getStatement(TopStoreStatementQuery query) {
+        if (ObjectUtil.isNull(query.getStoreId())){
+            String store = ServletUtils.getRequest().getHeader("Store");
+            if (StringUtils.isNotBlank(store)){
+                query.setStoreId(Long.valueOf(store));
+            }
+        }
+        //获取所有核销订单
+        List<Order> orderList = iOrderService.list(new LambdaQueryWrapper<Order>()
+                .eq(Order::getOrderType, 3)
+                .eq(ObjectUtil.isNotNull(query.getStoreId()),Order::getStoreId,query.getStoreId())
+                .ge(ObjectUtil.isNotNull(query.getStartTime()),Order::getCreateTime,query.getStartTime())
+                .le(ObjectUtil.isNotNull(query.getEndTime()),Order::getCreateTime,query.getEndTime())
+                .ne(Order::getStatus, -1));
+        if (CollectionUtils.isEmpty(orderList)){
+            return new TopStoreStatementVo();
+        }
+        Integer orderNum = orderList.size();
+        BigDecimal priceTotal = orderList.stream().filter(x -> x.getOrderStatus() == 1 && ObjectUtil.isNotEmpty(x.getPayPrice())).map(Order::getPayPrice).reduce(BigDecimal.ZERO, BigDecimal::add);
+        Set<Long> userIds = orderList.stream().map(Order::getUserId).collect(Collectors.toSet());
+        Integer userNum = userIds.size();
+        Integer newUserNum = 0;
+        Integer oldUserNum = 0;
+        Map<Long, List<Order>> orderMap = orderList.stream().collect(Collectors.groupingBy(Order::getUserId));
+        for (Long userId : orderMap.keySet()) {
+            List<Order> userOrderList = orderMap.get(userId);
+            if (userOrderList.size() > 1){
+                oldUserNum += userOrderList.size();
+            }else {
+                newUserNum += userOrderList.size();
+            }
+        }
+
+        TopStoreStatementVo vo = new TopStoreStatementVo();
+        vo.setOrderNum(orderNum);
+        vo.setPriceTotal(priceTotal);
+        vo.setUserNum(userNum);
+        vo.setNewUserNum(newUserNum);
+        vo.setOldUserNum(oldUserNum);
+        return vo;
+    }
 }

+ 41 - 0
zhongzheng-system/src/main/java/com/zhongzheng/modules/top/mall/vo/TopStoreStatementVo.java

@@ -0,0 +1,41 @@
+package com.zhongzheng.modules.top.mall.vo;
+
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+
+import java.math.BigDecimal;
+import java.util.List;
+
+
+/**
+ * 商户店铺管理编辑对象 top_store
+ *
+ * @author hjl
+ * @date 2023-05-25
+ */
+@Data
+@ApiModel("商户店铺报表对象")
+public class TopStoreStatementVo {
+
+    /** 会员消费总金额 */
+    @ApiModelProperty("会员消费总金额")
+    private BigDecimal priceTotal;
+
+    /** 订单数 */
+    @ApiModelProperty("订单数")
+    private Integer orderNum;
+
+    /** 会员数 */
+    @ApiModelProperty("会员数")
+    private Integer userNum;
+
+    /** 新会员 */
+    @ApiModelProperty("新会员")
+    private Integer newUserNum;
+
+    /** 老会员 */
+    @ApiModelProperty("老会员")
+    private Integer oldUserNum;
+
+}

+ 57 - 0
zhongzheng-system/src/main/java/com/zhongzheng/modules/user/domain/UserPointsLog.java

@@ -0,0 +1,57 @@
+package com.zhongzheng.modules.user.domain;
+
+import com.baomidou.mybatisplus.annotation.FieldFill;
+import com.baomidou.mybatisplus.annotation.TableField;
+import com.baomidou.mybatisplus.annotation.TableId;
+import com.baomidou.mybatisplus.annotation.TableName;
+import lombok.Data;
+import lombok.NoArgsConstructor;
+import lombok.experimental.Accessors;
+
+import java.io.Serializable;
+import java.math.BigDecimal;
+
+/**
+ * 用户积分变动 user_points_log
+ *
+ * @author hjl
+ * @date 2022-08-17
+ */
+@Data
+@NoArgsConstructor
+@Accessors(chain = true)
+@TableName("user_points_log")
+public class UserPointsLog implements Serializable {
+
+private static final long serialVersionUID=1L;
+
+    /** $column.columnComment */
+    @TableId(value = "id")
+    private Long id;
+    /** 用户ID */
+    private Long userId;
+    /** 订单号 */
+    private String orderSn;
+    /** 变动积分 */
+    private BigDecimal points;
+    /** 变动前积分 */
+    private BigDecimal pointsBefore;
+    /** 变动后积分 */
+    private BigDecimal pointsAfter;
+    /** 类型:1订单消耗 2积分冲账*/
+    private Integer type;
+    /** 状态1正常 0停用 */
+    private Integer status;
+    /** 创建时间 */
+    private Long createTime;
+    /** $column.columnComment */
+    private Long updateTime;
+    /** 店铺ID */
+    private Long storeId;
+    /** 机构ID */
+    private Long tenantId;
+    /** 商户ID */
+    private Long merId;
+    /** 操作人 */
+    private String createBy;
+}

+ 13 - 0
zhongzheng-system/src/main/java/com/zhongzheng/modules/user/mapper/UserPointsLogMapper.java

@@ -0,0 +1,13 @@
+package com.zhongzheng.modules.user.mapper;
+
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+import com.zhongzheng.modules.order.bo.OrderPointsQueryBo;
+import com.zhongzheng.modules.user.domain.UserPointsLog;
+import com.zhongzheng.modules.user.vo.UserPointsLogVo;
+
+import java.util.List;
+
+public interface UserPointsLogMapper extends BaseMapper<UserPointsLog> {
+
+    List<UserPointsLogVo> getOrderPointsList(OrderPointsQueryBo bo);
+}

+ 14 - 0
zhongzheng-system/src/main/java/com/zhongzheng/modules/user/service/IUserPointsLogService.java

@@ -0,0 +1,14 @@
+package com.zhongzheng.modules.user.service;
+
+import com.baomidou.mybatisplus.extension.service.IService;
+import com.zhongzheng.modules.order.bo.OrderPointsQueryBo;
+import com.zhongzheng.modules.user.domain.UserPlan;
+import com.zhongzheng.modules.user.domain.UserPointsLog;
+import com.zhongzheng.modules.user.vo.UserPointsLogVo;
+
+import java.util.List;
+
+public interface IUserPointsLogService extends IService<UserPointsLog> {
+
+    List<UserPointsLogVo> getOrderPointsList(OrderPointsQueryBo bo);
+}

+ 24 - 0
zhongzheng-system/src/main/java/com/zhongzheng/modules/user/service/impl/UserPointsLogServiceImpl.java

@@ -0,0 +1,24 @@
+package com.zhongzheng.modules.user.service.impl;
+
+import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
+import com.zhongzheng.modules.order.bo.OrderPointsQueryBo;
+import com.zhongzheng.modules.user.domain.UserPointsLog;
+import com.zhongzheng.modules.user.mapper.UserPointsLogMapper;
+import com.zhongzheng.modules.user.service.IUserPointsLogService;
+import com.zhongzheng.modules.user.vo.UserPointsLogVo;
+import org.springframework.stereotype.Service;
+
+import java.util.List;
+
+/**
+ * @author yangdamao
+ * @date 2023年06月08日 11:18
+ */
+@Service
+public class UserPointsLogServiceImpl extends ServiceImpl<UserPointsLogMapper, UserPointsLog> implements IUserPointsLogService {
+
+    @Override
+    public List<UserPointsLogVo> getOrderPointsList(OrderPointsQueryBo bo) {
+        return baseMapper.getOrderPointsList(bo);
+    }
+}

+ 61 - 0
zhongzheng-system/src/main/java/com/zhongzheng/modules/user/vo/UserPointsLogVo.java

@@ -0,0 +1,61 @@
+package com.zhongzheng.modules.user.vo;
+
+import com.baomidou.mybatisplus.annotation.TableId;
+import com.baomidou.mybatisplus.annotation.TableName;
+import com.zhongzheng.common.annotation.Excel;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+import lombok.NoArgsConstructor;
+import lombok.experimental.Accessors;
+
+import java.io.Serializable;
+import java.math.BigDecimal;
+
+/**
+ * 用户积分变动 user_points_log
+ *
+ * @author hjl
+ * @date 2022-08-17
+ */
+@Data
+public class UserPointsLogVo implements Serializable {
+
+    private Long id;
+    /** 用户ID */
+    @ApiModelProperty("用户ID")
+    private Long userId;
+    /** 变动积分 */
+    @Excel(name = "变动积分")
+    @ApiModelProperty("变动积分")
+    private BigDecimal points;
+    @Excel(name = "订单号")
+    @ApiModelProperty("订单号")
+    private String orderSn;
+    /** 变动前积分 */
+    @Excel(name = "变动前积分")
+    @ApiModelProperty("变动前积分")
+    private BigDecimal pointsBefore;
+    /** 变动后积分 */
+    @Excel(name = "变动后积分")
+    @ApiModelProperty("变动后积分")
+    private BigDecimal pointsAfter;
+    /** 类型:1订单消耗 2积分冲账*/
+    @ApiModelProperty("类型:1订单消耗 2积分冲账")
+    private Integer type;
+    /** 状态1正常 0停用 */
+    private Integer status;
+    /** 创建时间 */
+    private Long createTime;
+    /** $column.columnComment */
+    private Long updateTime;
+    /** 店铺ID */
+    private Long storeId;
+    /** 机构ID */
+    private Long tenantId;
+    /** 商户ID */
+    private Long merId;
+    /** 操作人 */
+    @Excel(name = "操作人")
+    @ApiModelProperty("操作人")
+    private String createBy;
+}

+ 3 - 0
zhongzheng-system/src/main/java/com/zhongzheng/modules/wx/service/IWxPayService.java

@@ -49,4 +49,7 @@ public interface IWxPayService {
 
 	boolean shareToOldSys(Order order,List<OrderGoods> goodsList);
 
+	Map<String, String> paymentStorePc(String pay_no, String openId, String body, BigDecimal payPrice);
+
+    String paymentStoreCallBack(String notifyData);
 }

+ 145 - 0
zhongzheng-system/src/main/java/com/zhongzheng/modules/wx/service/impl/WxPayServiceImpl.java

@@ -5,6 +5,7 @@ import cn.hutool.core.lang.Validator;
 import com.alibaba.fastjson.JSON;
 import com.alibaba.fastjson.JSONObject;
 import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
+import com.baomidou.mybatisplus.core.conditions.update.LambdaUpdateWrapper;
 import com.baomidou.mybatisplus.core.toolkit.CollectionUtils;
 import com.baomidou.mybatisplus.core.toolkit.ObjectUtils;
 import com.google.zxing.BarcodeFormat;
@@ -62,7 +63,9 @@ import com.zhongzheng.modules.top.goods.domain.*;
 import com.zhongzheng.modules.top.goods.service.*;
 import com.zhongzheng.modules.user.bo.UserExamGoodsQueryBo;
 import com.zhongzheng.modules.user.bo.UserExamGoodsSupplementAddBo;
+import com.zhongzheng.modules.user.domain.User;
 import com.zhongzheng.modules.user.domain.UserExamGoods;
+import com.zhongzheng.modules.user.domain.UserPointsLog;
 import com.zhongzheng.modules.user.service.*;
 import com.zhongzheng.modules.user.vo.UserExamGoodsVo;
 import com.zhongzheng.modules.user.vo.UserVo;
@@ -222,6 +225,8 @@ public class WxPayServiceImpl implements IWxPayService {
     private ITopOldOrderCheckService topOldOrderCheckService;
     @Autowired
     private ITopOldOrderCheckLogService topOldOrderCheckLogService;
+    @Autowired
+    private IUserPointsLogService userPointsLogService;
 
     private String gzh_tokenUrl = "https://api.weixin.qq.com/cgi-bin/token";
 
@@ -238,6 +243,16 @@ public class WxPayServiceImpl implements IWxPayService {
         notifyUrl =  configService.selectConfigByKey("wx.wepay.notifyUrl");
     }
 
+    private void initStoreData() {
+        Long tenantId = 867735392558919680L;
+        appid = configService.getConfigByKey("wx.small.appid",tenantId);
+        gzhAppid = configService.getConfigByKey("wx.gzh.appid",tenantId);
+        gzh_appsrcret = configService.getConfigByKey("wx.gzh.appsecret",tenantId);
+        mchid = configService.getConfigByKey("wx.wepay.mchid",tenantId);
+        key = configService.getConfigByKey("wx.wepay.key",tenantId);
+        appsecret = configService.getConfigByKey("wx.wepay.appsecret",tenantId);
+        notifyUrl =  configService.getConfigByKey("wx.store.wepay.notifyUrl",tenantId);
+    }
 
     @Override
     public Map<String, String> payment(String out_trade_no, String openid, String body, BigDecimal price) {
@@ -916,6 +931,136 @@ public class WxPayServiceImpl implements IWxPayService {
         return false;
     }
 
+    @Override
+    public Map<String, String> paymentStorePc(String out_trade_no, String openid, String body, BigDecimal price) {
+        initStoreData();
+        WxSmallConfig config = new WxSmallConfig(gzhAppid, mchid, key);
+        BigDecimal unit = new BigDecimal(100);
+        price = price.multiply(unit);
+        try {
+            WXPay wxpay = new WXPay(config);
+            Map<String, String> data = new HashMap<String, String>();
+            data.put("body", body);
+            data.put("out_trade_no", out_trade_no);
+            data.put("device_info", "");
+            data.put("fee_type", "CNY");
+            data.put("total_fee", price.intValue() + "");
+            //     data.put("openid", openid);
+            data.put("spbill_create_ip", IpUtils.getIpAddr(ServletUtils.getRequest()));
+            data.put("notify_url", notifyUrl);
+            data.put("trade_type", "NATIVE");
+            String TenantId = ServletUtils.getRequest().getHeader("TenantId");
+            data.put("attach", TenantId);
+            Map<String, String> resp = wxpay.unifiedOrder(data);
+            log.error("核销PC支付:"+JSON.toJSONString(resp));
+            Map<String, String> result = new HashMap<>();
+            String code_url = resp.get("code_url");
+            if (Validator.isEmpty(code_url)) {
+                throw new CustomException("支付错误");
+            }
+            QRCodeWriter qrCodeWriter = new QRCodeWriter();
+            BitMatrix bitMatrix = qrCodeWriter.encode(code_url, BarcodeFormat.QR_CODE, 120, 120);
+            // 写到输出流
+            ByteArrayOutputStream outputStream = new ByteArrayOutputStream();
+            MatrixToImageWriter.writeToStream(bitMatrix, "jpg", outputStream);
+            //转换为base64
+            Base64.Encoder encoder1 = Base64.getEncoder();
+            String urlBase64 = "data:image/jpeg;base64,"
+                    + encoder1.encodeToString(outputStream.toByteArray());
+            result.put("urlBase64", urlBase64);
+            return result;
+        } catch (Exception e) {
+            e.printStackTrace();
+        }
+
+        return null;
+    }
+
+    @Override
+    public String paymentStoreCallBack(String notifyData) {
+        String xmlBack = "<xml><return_code><![CDATA[FAIL]]></return_code><return_msg><![CDATA[报文为空]]></return_msg></xml> ";
+        try {
+            Map<String, String> notifyMap = WXPayUtil.xmlToMap(notifyData);  // 转换成map
+            String TenantId = notifyMap.get("attach");
+            ServletUtils.getRequestAttributes().getResponse().setHeader("TenantId", TenantId);
+            initStoreData();
+            WxSmallConfig config = new WxSmallConfig(appid, mchid, key);
+            WXPay wxpay = new WXPay(config);
+            if (wxpay.isPayResultNotifySignatureValid(notifyMap)) {
+                String result_code = notifyMap.get("result_code");
+                if ("SUCCESS".equals(result_code)) {
+                    String out_trade_no = notifyMap.get("out_trade_no");
+                    String transaction_id = notifyMap.get("transaction_id");
+                    OrderPay orderPay = iOrderPayService.getOne(new LambdaQueryWrapper<OrderPay>().eq(OrderPay::getPaySn, out_trade_no));
+                    if (Validator.isNotEmpty(orderPay)) {
+                        String orderSn = orderPay.getOrderSn();
+                        orderPay.setTransid(transaction_id);
+                        orderPay.setStatus(1);
+                        orderPay.setUpdateTime(DateUtils.getNowTime());
+                        iOrderPayService.updateById(orderPay);
+                        if (dealStoreOrder(orderSn, transaction_id)) {
+                            xmlBack = "<xml><return_code><![CDATA[SUCCESS]]></return_code><return_msg><![CDATA[OK]]></return_msg></xml>";
+                            return xmlBack;
+                        }
+                    }
+                }
+            } else {
+                // 签名错误,如果数据里没有sign字段,也认为是签名错误
+            }
+        } catch (Exception e) {
+            e.printStackTrace();
+        }
+        return xmlBack;
+    }
+
+    private boolean dealStoreOrder(String out_trade_no, String transaction_id) {
+        String key = out_trade_no;
+        String ticket = redisCache.getCacheObject(key);
+        if (Validator.isNotEmpty(ticket)) {
+            return false;
+        }
+        redisCache.setCacheObject(key, "dealing", 30, TimeUnit.SECONDS);//30秒
+        Order order = iOrderService.getOne(new LambdaQueryWrapper<Order>().eq(Order::getOrderSn, out_trade_no));
+        if (order != null && order.getOrderStatus() == 0) {
+            order.setOrderStatus(Order.ORDER_STATUS_PAY);
+            order.setPayStatus(Order.PAY_FULL);
+            order.setPayTime(DateUtils.getNowTime());
+            order.setTransid(transaction_id);
+            order.setOrderGeneral(out_trade_no);
+            order.setStatus(1);
+
+            if (iOrderService.updateById(order)) {
+                //积分处理
+                if (ObjectUtils.isNotNull(order.getDeductionIntegral()) && order.getDeductionIntegral().compareTo(BigDecimal.ZERO) > 0){
+                    User user = iUserService.getById(order.getUserId());
+                    BigDecimal subtract = user.getPointsValue().subtract(order.getDeductionIntegral());
+                    UserPointsLog log = new UserPointsLog();
+                    log.setUserId(user.getUserId());
+                    log.setPoints(order.getDeductionIntegral());
+                    log.setPointsBefore(user.getPointsValue());
+                    log.setPointsAfter(subtract);
+                    log.setStatus(1);
+                    log.setType(1);
+                    log.setOrderSn(order.getOrderSn());
+                    log.setCreateTime(DateUtils.getNowTime());
+                    log.setUpdateTime(DateUtils.getNowTime());
+                    userPointsLogService.save(log);
+                    user.setPointsValue(subtract);
+                    iUserService.updateById(user);
+                }
+                Map<String, Object> map = new HashMap<>();
+                map.put("order_sn", out_trade_no);
+                List<OrderGoods> goodsList = iOrderGoodsService.listByMap(map);
+                for (OrderGoods g : goodsList) {
+                    g.setPayStatus(OrderGoods.PAY_FULL);
+                    g.setGoodsReceived(g.getGoodsRealPrice());
+                    iOrderGoodsService.updateById(g);
+                }
+            }
+        }
+        return true;
+    }
+
     @Override
     public void updateUserExamGoods(OrderGoods g, Order order) {
         GoodsVo goodsVo = iGoodsService.queryById(g.getGoodsId());

+ 1 - 1
zhongzheng-system/src/main/resources/mapper/modules/goods/GoodsMapper.xml

@@ -963,7 +963,7 @@
             AND g.goods_type = #{goodsType}
         </if>
         <if test="categoryId != null and categoryId != ''">
-            AND (INSTR(g.category_ids,#{categoryId}) > 0
+            AND INSTR(g.category_ids,#{categoryId}) > 0
         </if>
         <if test="goodsName != null and goodsName != ''">
             AND g.goods_name like concat('%', #{goodsName}, '%')

+ 157 - 0
zhongzheng-system/src/main/resources/mapper/modules/order/OrderMapper.xml

@@ -454,4 +454,161 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
           and og.status = 1
     </select>
 
+    <select id="getIntegralOrderList" resultType="com.zhongzheng.modules.order.vo.IntegralOrderVo" parameterType="com.zhongzheng.modules.order.bo.IntegralOrderQueryBo">
+        SELECT
+            o.order_id,
+            o.order_sn,
+            u.user_id,
+            u.realname AS userName,
+            u.telphone,
+            o.order_price,
+            o.order_status,
+            o.`status`,
+            o.pay_type,
+            o.order_type,
+            o.pay_price,
+            o.deduction_integral,
+            o.deduction_money,
+            o.order_from,
+            o.pay_status,
+            o.store_id,
+            ts.store_name,
+            o.create_time,
+            o.integral_rule
+        FROM
+            `order` o
+                LEFT JOIN order_goods og ON o.order_sn = og.order_sn
+                LEFT JOIN `user` u ON o.user_id = u.user_id
+                LEFT JOIN top_store ts ON o.store_id = ts.store_id
+        WHERE
+            o.`status` = 1
+          AND o.order_type = 3
+        <if test="storeId != null and storeId != ''">
+            AND o.store_id = #{storeId}
+        </if>
+        <if test="merId != null and merId != ''">
+            AND o.mer_id = #{merId}
+        </if>
+        <if test="tenantId != null and tenantId != ''">
+            AND o.tenant_id = #{tenantId}
+        </if>
+        <if test="telphone != null and telphone != ''">
+            AND u.telphone = #{telphone,typeHandler=com.zhongzheng.common.type.EncryptHandler}
+        </if>
+        <if test="startTime != null and startTime != ''">
+            AND o.create_time <![CDATA[  >=  ]]> #{startTime}
+        </if>
+        <if test="endTime != null and endTime != ''">
+            AND o.create_time <![CDATA[  <=  ]]> #{endTime}
+        </if>
+    </select>
+
+    <select id="getIntegralOrderList_COUNT" resultType="Long">
+        SELECT
+        count( o.order_sn)
+        FROM
+        `order` o
+        LEFT JOIN order_goods og ON o.order_sn = og.order_sn
+        LEFT JOIN `user` u ON o.user_id = u.user_id
+        LEFT JOIN top_store ts ON o.store_id = ts.store_id
+        WHERE
+        o.`status` = 1
+        AND o.order_type = 3
+        <if test="storeId != null and storeId != ''">
+            AND o.store_id = #{storeId}
+        </if>
+        <if test="merId != null and merId != ''">
+            AND o.mer_id = #{merId}
+        </if>
+        <if test="tenantId != null and tenantId != ''">
+            AND o.tenant_id = #{tenantId}
+        </if>
+        <if test="telphone != null and telphone != ''">
+            AND u.telphone = #{telphone,typeHandler=com.zhongzheng.common.type.EncryptHandler}
+        </if>
+        <if test="startTime != null and startTime != ''">
+            AND o.create_time <![CDATA[  >=  ]]> #{startTime}
+        </if>
+        <if test="endTime != null and endTime != ''">
+            AND o.create_time <![CDATA[  <=  ]]> #{endTime}
+        </if>
+    </select>
+
+    <select id="getOrderUserList" parameterType="com.zhongzheng.modules.order.bo.OrderUserQueryBo" resultType="com.zhongzheng.modules.order.vo.IntegralOrderUserVo">
+        SELECT
+            u.user_id,
+            ( SELECT ts.store_name FROM top_store ts WHERE ts.store_id = a.store_id ) AS store_name,
+            u.vip_card as cardSn,
+            u.realname as userName,
+            u.telphone,
+            a.payPriceTotal,
+            a.orderPrice,
+            a.store_id,
+            u.points_value
+        FROM
+            (
+                SELECT
+                    o.store_id,
+                    o.user_id,
+                    SUM( o.pay_price ) AS payPriceTotal,
+                    SUM( o.order_price ) AS orderPrice
+                FROM
+                    `order` o
+                WHERE
+                    o.order_type = 3
+                  AND o.`status` = 1
+                <if test="storeId != null and storeId != ''">
+                    AND o.store_id = #{storeId}
+                </if>
+                <if test="merId != null and merId != ''">
+                    AND o.mer_id = #{merId}
+                </if>
+                <if test="tenantId != null and tenantId != ''">
+                    AND o.tenant_id = #{tenantId}
+                </if>
+                GROUP BY
+                    o.store_id,
+                    o.user_id
+            ) a
+                LEFT JOIN `user` u ON a.user_id = u.user_id
+        WHERE 1=1
+        <if test="keyword != null and keyword != ''">
+            AND (u.telphone = #{keyword,typeHandler=com.zhongzheng.common.type.EncryptHandler} OR u.vip_card = #{keyword})
+        </if>
+    </select>
+
+    <select id="getOrderUserList_COUNT" resultType="Long">
+        SELECT
+        COUNT(a.user_id)
+        FROM
+        (
+        SELECT
+        o.store_id,
+        o.user_id,
+        SUM( o.pay_price ) AS payPriceTotal
+        FROM
+        `order` o
+        WHERE
+        o.order_type = 3
+        AND 1 = 1
+        <if test="storeId != null and storeId != ''">
+            AND o.store_id = #{storeId}
+        </if>
+        <if test="merId != null and merId != ''">
+            AND o.mer_id = #{merId}
+        </if>
+        <if test="tenantId != null and tenantId != ''">
+            AND o.tenant_id = #{tenantId}
+        </if>
+        GROUP BY
+        o.store_id,
+        o.user_id
+        ) a
+        LEFT JOIN `user` u ON a.user_id = u.user_id
+        WHERE 1=1
+        <if test="keyword != null and keyword != ''">
+            AND (u.telphone = #{keyword,typeHandler=com.zhongzheng.common.type.EncryptHandler} OR u.vip_card = #{keyword})
+        </if>
+    </select>
+
 </mapper>

+ 18 - 0
zhongzheng-system/src/main/resources/mapper/modules/order/StoreOrderRefundMapper.xml

@@ -0,0 +1,18 @@
+<?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.zhongzheng.modules.order.mapper.StoreOrderRefundMapper">
+
+    <select id="getRefundOrderList" parameterType="com.zhongzheng.modules.order.bo.StoreRefundOrderQueryBo" resultType="com.zhongzheng.modules.order.vo.StoreOrderRefundVo">
+        SELECT * FROM store_order_refund WHERE `status` = 1
+        <if test="storeId != null and storeId != ''">
+            AND store_id = #{storeId}
+        </if>
+        <if test="orderSn != null and orderSn != ''">
+            AND order_sn = #{orderSn}
+        </if>
+    </select>
+
+
+</mapper>

+ 17 - 0
zhongzheng-system/src/main/resources/mapper/modules/order/UserPointsLogMapper.xml

@@ -0,0 +1,17 @@
+<?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.zhongzheng.modules.user.mapper.UserPointsLogMapper">
+
+    <select id="getOrderPointsList" parameterType="com.zhongzheng.modules.order.bo.OrderPointsQueryBo" resultType="com.zhongzheng.modules.user.vo.UserPointsLogVo">
+        SELECT * FROM user_points_log WHERE `status` = 1 AND type = 2
+        <if test="storeId != null and storeId != ''">
+            AND store_id = #{storeId}
+        </if>
+        <if test="orderSn != null and orderSn != ''">
+            AND order_sn = #{orderSn}
+        </if>
+    </select>
+
+</mapper>

+ 13 - 0
zhongzheng-system/src/main/resources/mapper/modules/store/StoreUserMapper.xml

@@ -49,4 +49,17 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
         order by u.create_time desc
     </select>
 
+    <select id="getStoreUserNoTenant" parameterType="com.zhongzheng.modules.user.bo.UserAppAccountLoginBo" resultType="com.zhongzheng.common.core.domain.entity.store.StoreUser">
+        select * from store_user u
+        where 1=1
+        <if test="account != null and account != ''">
+            AND (u.user_name = #{account} or u.telphone = #{account,typeHandler=com.zhongzheng.common.type.EncryptHandler}
+                      or u.id_card = #{account,typeHandler=com.zhongzheng.common.type.EncryptHandler})
+        </if>
+    </select>
+
+    <select id="getUserNoTenantById" parameterType="java.lang.Long" resultType="com.zhongzheng.common.core.domain.entity.store.StoreUser">
+        select * from store_user u where user_id = #{userId}
+    </select>
+
 </mapper>

+ 4 - 0
zhongzheng-system/src/main/resources/mapper/modules/system/SysConfigMapper.xml

@@ -20,4 +20,8 @@
         select * from sys_config where config_key = #{key} and tenant_id = #{tenantId}
     </select>
 
+    <select id="getConfigByKey" parameterType="map" resultType="java.lang.String">
+        select config_value from sys_config where config_key = #{key} and tenant_id = #{tenantId}
+    </select>
+
 </mapper>