Quellcode durchsuchen

Merge branch 'master' of http://101.37.21.97:3000/wash/wash_server_v2

lhch2015 vor 1 Monat
Ursprung
Commit
8d63834268
21 geänderte Dateien mit 647 neuen und 88 gelöschten Zeilen
  1. 110 0
      admin-ui/rule.md
  2. 3 9
      yiqi-admin/src/main/java/com/yiqi/admin/controller/app/AppUserController.java
  3. 45 3
      yiqi-admin/src/main/java/com/yiqi/admin/controller/order/OrderClothController.java
  4. 11 11
      yiqi-admin/src/main/java/com/yiqi/admin/controller/order/OrderClothItemController.java
  5. 48 16
      yiqi-admin/src/main/java/com/yiqi/admin/controller/order/OrderGoodsController.java
  6. 33 7
      yiqi-admin/src/main/java/com/yiqi/admin/controller/order/OrderRechargeController.java
  7. 64 22
      yiqi-common/src/main/java/com/yiqi/common/utils/OrderNoUtils.java
  8. 0 3
      yiqi-common/src/main/java/com/yiqi/core/service/ISettlementStoreStatisticsService.java
  9. 40 0
      yiqi-common/src/main/java/com/yiqi/order/domain/vo/OrderClothPrintVO.java
  10. 141 0
      yiqi-common/src/main/java/com/yiqi/order/domain/vo/OrderGoodsPrintVO.java
  11. 44 0
      yiqi-common/src/main/java/com/yiqi/order/domain/vo/OrderRechargePrintVO.java
  12. 8 0
      yiqi-common/src/main/java/com/yiqi/order/service/IOrderClothItemService.java
  13. 8 0
      yiqi-common/src/main/java/com/yiqi/recharge/domain/RechargePasswordCard.java
  14. 0 6
      yiqi-core/src/main/java/com/yiqi/core/service/impl/SettlementStoreStatisticsServiceImpl.java
  15. 43 0
      yiqi-core/src/main/java/com/yiqi/order/service/impl/OrderClothItemServiceImpl.java
  16. 1 1
      yiqi-core/src/main/java/com/yiqi/order/service/impl/OrderPayInfoServiceImpl.java
  17. 30 2
      yiqi-core/src/main/java/com/yiqi/order/service/impl/OrderRechargeServiceImpl.java
  18. 1 1
      yiqi-core/src/main/java/com/yiqi/order/service/impl/OrderRefundInfoServiceImpl.java
  19. 3 3
      yiqi-core/src/main/java/com/yiqi/order/service/impl/PayServiceImpl.java
  20. 11 1
      yiqi-core/src/main/java/com/yiqi/recharge/service/impl/RechargePasswordCardServiceImpl.java
  21. 3 3
      yiqi-core/src/main/resources/mapper/recharge/RechargePasswordCardMapper.xml

+ 110 - 0
admin-ui/rule.md

@@ -0,0 +1,110 @@
+# UI设计规范文档
+
+## 1. 设计原则
+
+### 1.1 一致性
+- 保持界面元素的一致性
+- 使用统一的颜色方案
+- 保持字体和图标风格统一
+- 统一的交互模式
+
+### 1.2 简洁性
+- 避免界面元素过度拥挤
+- 使用清晰的视觉层次
+- 突出重要信息
+- 减少不必要的装饰元素
+
+### 1.3 可用性
+- 确保所有功能易于访问
+- 提供清晰的反馈
+- 保持操作流程简单直观
+- 提供必要的帮助信息
+
+## 2. 颜色规范
+
+### 2.1 主色调
+- 主色:#1890FF(蓝色)
+- 辅助色:#52C41A(绿色)
+- 警告色:#FAAD14(橙色)
+- 错误色:#F5222D(红色)
+
+### 2.2 中性色
+- 标题文字:#262626
+- 正文文字:#595959
+- 次要文字:#8C8C8C
+- 禁用文字:#BFBFBF
+- 边框颜色:#D9D9D9
+- 背景色:#F0F2F5
+
+## 3. 字体规范
+
+### 3.1 字体家族
+- 中文:PingFang SC
+- 英文:Helvetica Neue
+
+### 3.2 字号规范
+- 主标题:24px
+- 次标题:20px
+- 小标题:16px
+- 正文:14px
+- 辅助文字:12px
+
+## 4. 布局规范
+
+### 4.1 间距
+- 页面边距:24px
+- 组件间距:16px
+- 内部间距:8px
+
+### 4.2 栅格系统
+- 使用24栅格系统
+- 响应式断点:
+  - xs: <576px
+  - sm: ≥576px
+  - md: ≥768px
+  - lg: ≥992px
+  - xl: ≥1200px
+
+## 5. 组件规范
+
+### 5.1 按钮
+- 主要按钮:实心背景
+- 次要按钮:描边样式
+- 文字按钮:纯文字样式
+- 按钮高度:32px/40px
+
+### 5.2 表单
+- 输入框高度:32px
+- 标签对齐:右对齐
+- 必填项标记:红色星号
+
+### 5.3 表格
+- 表头背景色:#FAFAFA
+- 行高:48px
+- 斑马纹:隔行变色
+
+## 6. 交互规范
+
+### 6.1 状态反馈
+- 加载状态:使用加载动画
+- 成功提示:绿色对勾图标
+- 错误提示:红色错误图标
+- 警告提示:黄色警告图标
+
+### 6.2 动画效果
+- 过渡时间:0.3s
+- 缓动函数:ease-in-out
+- 弹窗动画:fade + slide
+
+## 7. 响应式设计
+
+### 7.1 移动端适配
+- 优先考虑移动端体验
+- 使用弹性布局
+- 关键信息优先展示
+- 触控区域最小44x44px
+
+### 7.2 桌面端优化
+- 合理利用空间
+- 支持快捷键操作
+- 提供高级功能入口

+ 3 - 9
yiqi-admin/src/main/java/com/yiqi/admin/controller/app/AppUserController.java

@@ -91,15 +91,9 @@ public class AppUserController extends BaseController {
         }
 
         RechargePasswordCard rechargePasswordCard = rechargePasswordCardService.selectTotalBalanceGroupByAppUser(appUser.getId(), orderType);
-        if (rechargePasswordCard != null) {
-            appUserVO.setRechargeBalance(rechargePasswordCard.getRechargeBalance());
-            appUserVO.setGiveBalance(rechargePasswordCard.getGiveBalance());
-            appUserVO.setWelfareBalance(rechargePasswordCard.getWelfareBalance());
-        } else {
-            appUserVO.setRechargeBalance(BigDecimal.ZERO);
-            appUserVO.setGiveBalance(BigDecimal.ZERO);
-            appUserVO.setWelfareBalance(BigDecimal.ZERO);
-        }
+        appUserVO.setRechargeBalance(rechargePasswordCard.getRechargeBalance());
+        appUserVO.setGiveBalance(rechargePasswordCard.getGiveBalance());
+        appUserVO.setWelfareBalance(rechargePasswordCard.getWelfareBalance());
         return R.ok(appUserVO);
     }
 

+ 45 - 3
yiqi-admin/src/main/java/com/yiqi/admin/controller/order/OrderClothController.java

@@ -5,6 +5,7 @@ import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
 import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
 import com.baomidou.mybatisplus.core.conditions.update.UpdateWrapper;
 import com.yiqi.app.domain.*;
+import com.yiqi.app.domain.vo.AppUserInfoVO;
 import com.yiqi.app.service.*;
 import com.yiqi.common.exception.ServiceException;
 import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
@@ -22,12 +23,12 @@ import com.yiqi.core.domain.dto.wx.IntracityExpressAddOrderRequest;
 import com.yiqi.core.domain.vo.ClothHangerOrderRelationVO;
 import com.yiqi.core.domain.vo.wx.IntracityExpressCreateOrderResult;
 import com.yiqi.core.service.ISysStoreIntracityExpressService;
-import com.yiqi.order.domain.OrderCloth;
-import com.yiqi.order.domain.OrderClothItem;
-import com.yiqi.order.domain.OrderDelivery;
+import com.yiqi.order.domain.*;
 import com.yiqi.order.domain.dto.*;
 import com.yiqi.order.domain.vo.*;
 import com.yiqi.order.service.*;
+import com.yiqi.recharge.domain.RechargePasswordCard;
+import com.yiqi.recharge.service.IRechargePasswordCardService;
 import com.yiqi.system.domain.ManageFactory;
 import com.yiqi.system.domain.SysOrg;
 import com.yiqi.system.domain.SysSettlementRate;
@@ -65,6 +66,8 @@ public class OrderClothController extends BaseController {
     @Autowired
     private IAppUserService appUserService;
     @Autowired
+    private IOrderClothAddressService orderClothAddressService;
+    @Autowired
     private IOrderClothItemService orderClothItemService;
     @Autowired
     private ISysSettlementRateService sysSettlementRateService;
@@ -75,6 +78,8 @@ public class OrderClothController extends BaseController {
     @Autowired
     private IAppDeliveryRelationService appDeliveryRelationService;
     @Autowired
+    private IRechargePasswordCardService rechargePasswordCardService;
+    @Autowired
     private IPayService payService;
     @Autowired
     private ISysOrgService sysOrgService;
@@ -671,6 +676,43 @@ public class OrderClothController extends BaseController {
         return success(orderClothService.selectOrderClothById(id));
     }
 
+    /**
+     * 获取零售商品订单详细信息
+     */
+    @GetMapping(value = "/print/{id}")
+    @ApiOperation(value = "洗衣订单打印")
+    public R<OrderClothPrintVO> getPrintInfo(@PathVariable("id") Long id) {
+        OrderClothPrintVO orderClothPrintVO = new OrderClothPrintVO();
+        OrderCloth orderCloth = orderClothService.selectOrderClothById(id);
+        com.yiqi.common.utils.bean.BeanUtils.copyProperties(orderCloth, orderClothPrintVO);
+        AppUserInfoVO userInfo = appUserService.getAppUserInfoById(orderClothPrintVO.getAppUserId());
+        OrderClothAddress orderClothAddress = orderClothAddressService.getByorderSn(orderClothPrintVO.getOrderNo());
+        if (orderClothAddress != null) {
+            userInfo.setAddress(orderClothAddress.getAddress());
+            userInfo.setAddressDetail(orderClothAddress.getAddressDetail());
+            userInfo.setProvince(orderClothAddress.getProvince());
+            userInfo.setCity(orderClothAddress.getCity());
+            userInfo.setArea(orderClothAddress.getArea());
+        }
+        userInfo.setContactName(orderClothPrintVO.getContactName());
+        userInfo.setContactPhone(orderClothPrintVO.getContactPhone());
+        orderClothPrintVO.setAppUserInfoVO(userInfo);
+        //获取衣服明细
+        List<OrderClothItemVO> orderClothItemList = orderClothItemService.queryClothItemByOrderId(orderClothPrintVO.getOrderNo());
+        orderClothPrintVO.setOrderClothItemVOS(orderClothItemList);
+        RechargePasswordCard rechargePasswordCard = rechargePasswordCardService.selectTotalBalanceGroupByAppUser(orderClothPrintVO.getAppUserId(), null);
+        if (orderClothPrintVO.getPayType().equals(PayType.BALANCE.getCode())) {
+            orderClothPrintVO.setMemberBeforeBalance(CurrencyUtil.add(rechargePasswordCard.getTotalBalance(), orderClothPrintVO.getPayAmount()));
+            orderClothPrintVO.setMemberAfterBalance(rechargePasswordCard.getTotalBalance());
+            orderClothPrintVO.setMemberChangeAmount(orderClothPrintVO.getPayAmount());
+        } else {
+            orderClothPrintVO.setMemberBeforeBalance(rechargePasswordCard.getTotalBalance());
+            orderClothPrintVO.setMemberAfterBalance(rechargePasswordCard.getTotalBalance());
+            orderClothPrintVO.setMemberChangeAmount(BigDecimal.ZERO);
+        }
+        return R.ok(orderClothPrintVO);
+    }
+
     /**
      * 删除洗衣订单
      */

+ 11 - 11
yiqi-admin/src/main/java/com/yiqi/admin/controller/order/OrderClothItemController.java

@@ -152,7 +152,7 @@ public class OrderClothItemController extends BaseController {
     @ApiOperation("工厂重洗衣服")
     @GetMapping(value = "rewashCloth")
     public R rewashCloth(@RequestParam @ApiParam("水洗唛") String washCode) throws Exception {
-        if (washCode.contains(OrderNoUtils.cloth_wash_code_header)) {
+        if (washCode.startsWith(OrderNoUtils.cloth_wash_code_header)) {
             LambdaQueryWrapper<OrderClothItem> lambdaQueryWrapper = new QueryWrapper<OrderClothItem>().lambda()
                     .eq(OrderClothItem::getFactoryId, SecurityUtils.getLoginUser().getOrgId()).eq(OrderClothItem::getWashCode, washCode);
             OrderClothItem orderClothItem = orderClothItemService.getOne(lambdaQueryWrapper);
@@ -171,7 +171,7 @@ public class OrderClothItemController extends BaseController {
             //记录日志
             orderClothItemFlowRecordService.addRecord(orderClothItem, ClothOrderFlowStatus.reWash.getCode());
         }
-        if (washCode.contains(OrderNoUtils.cloth_wash_adjust_code_header)) {
+        if (washCode.startsWith(OrderNoUtils.cloth_wash_adjust_code_header)) {
             OrderClothAdjunct orderClothAdjunct = orderClothAdjunctService.selectOrderClothAdjunctByAdjunctNo(washCode);
             if (orderClothAdjunct == null) {
                 throw new ServiceException("未查询到衣物");
@@ -195,7 +195,7 @@ public class OrderClothItemController extends BaseController {
     @GetMapping(value = "/deleteInFactory")
     public R deleteInFactory(@RequestParam @ApiParam("水洗唛") String washCode) throws Exception {
 
-        if (washCode.contains(OrderNoUtils.cloth_wash_code_header)) {
+        if (washCode.startsWith(OrderNoUtils.cloth_wash_code_header)) {
             LambdaQueryWrapper<OrderClothItem> lambdaQueryWrapper = new QueryWrapper<OrderClothItem>().lambda()
                     .eq(OrderClothItem::getFactoryId, SecurityUtils.getLoginUser().getOrgId()).eq(OrderClothItem::getWashCode, washCode);
             OrderClothItem orderClothItem = orderClothItemService.getOne(lambdaQueryWrapper);
@@ -213,7 +213,7 @@ public class OrderClothItemController extends BaseController {
 
             orderClothItemFlowRecordService.addRecord(orderClothItem, ClothOrderFlowStatus.deleteInFactory.getCode());
         }
-        if (washCode.contains(OrderNoUtils.cloth_wash_adjust_code_header)) {
+        if (washCode.startsWith(OrderNoUtils.cloth_wash_adjust_code_header)) {
             OrderClothAdjunct orderClothAdjunct = orderClothAdjunctService.selectOrderClothAdjunctByAdjunctNo(washCode);
             if (orderClothAdjunct == null) {
                 throw new ServiceException("未查询到衣物");
@@ -234,7 +234,7 @@ public class OrderClothItemController extends BaseController {
     @ApiOperation("工厂撤销入厂")
     @GetMapping(value = "/cancelOrderInFactory")
     public R cancelOrderInFactory(@RequestParam @ApiParam("水洗唛") String washCode) throws Exception {
-        if (washCode.contains(OrderNoUtils.cloth_wash_code_header)) {
+        if (washCode.startsWith(OrderNoUtils.cloth_wash_code_header)) {
             LambdaQueryWrapper<OrderClothItem> lambdaQueryWrapper = new QueryWrapper<OrderClothItem>().lambda()
                     .eq(OrderClothItem::getFactoryId, SecurityUtils.getLoginUser().getOrgId()).eq(OrderClothItem::getWashCode, washCode);
             OrderClothItem orderClothItem = orderClothItemService.getOne(lambdaQueryWrapper);
@@ -248,7 +248,7 @@ public class OrderClothItemController extends BaseController {
             //生成一条工厂撤单退款申请
             orderClothService.refundOrderItemApply(orderClothItem, "工厂手动执行撤单");
         }
-        if (washCode.contains(OrderNoUtils.cloth_wash_adjust_code_header)) {
+        if (washCode.startsWith(OrderNoUtils.cloth_wash_adjust_code_header)) {
             throw new ServiceException("衣服附件无法单独执行撤单逻辑");
         }
         return R.ok();
@@ -261,7 +261,7 @@ public class OrderClothItemController extends BaseController {
     public R<OrderClothItemVO> inFactory(@RequestParam @ApiParam("水洗唛") String washCode) throws Exception {
         OrderClothItemVO orderClothItemVO = new OrderClothItemVO();
         OrderClothItem orderClothItem = null;
-        if (washCode.contains(OrderNoUtils.cloth_wash_code_header)) {
+        if (washCode.startsWith(OrderNoUtils.cloth_wash_code_header)) {
             LambdaQueryWrapper<OrderClothItem> lambdaQueryWrapper = new QueryWrapper<OrderClothItem>().lambda()
                     .eq(OrderClothItem::getFactoryId, SecurityUtils.getLoginUser().getOrgId()).eq(OrderClothItem::getWashCode, washCode);
             orderClothItem = orderClothItemService.getOne(lambdaQueryWrapper);
@@ -294,7 +294,7 @@ public class OrderClothItemController extends BaseController {
                     .lambda().eq(OrderClothType::getOrderClothId, orderClothItem.getId())));
             orderClothItemVO.setFlowStatus(orderClothItem.getFlowStatus());
         }
-        if (washCode.contains(OrderNoUtils.cloth_wash_adjust_code_header)) {
+        if (washCode.startsWith(OrderNoUtils.cloth_wash_adjust_code_header)) {
             OrderClothAdjunct orderClothAdjunct = orderClothAdjunctService.selectOrderClothAdjunctByAdjunctNo(washCode);
             if (orderClothAdjunct == null) {
                 throw new ServiceException("未查询到衣物");
@@ -351,7 +351,7 @@ public class OrderClothItemController extends BaseController {
     public R<OrderClothItemVO> checkCloth(@RequestParam @ApiParam("水洗唛") String washCode) throws Exception {
         OrderClothItemVO orderClothItemVO = new OrderClothItemVO();
         OrderClothItem orderClothItem = null;
-        if (washCode.contains(OrderNoUtils.cloth_wash_code_header)) {
+        if (washCode.startsWith(OrderNoUtils.cloth_wash_code_header)) {
             LambdaQueryWrapper<OrderClothItem> lambdaQueryWrapper = new QueryWrapper<OrderClothItem>().lambda()
                     .eq(OrderClothItem::getFactoryId, SecurityUtils.getLoginUser().getOrgId()).eq(OrderClothItem::getWashCode, washCode);
             orderClothItem = orderClothItemService.getOne(lambdaQueryWrapper);
@@ -386,7 +386,7 @@ public class OrderClothItemController extends BaseController {
             //添加记录
             orderClothItemFlowRecordService.addRecord(orderClothItem, ClothOrderFlowStatus.checkCloth.getCode());
         }
-        if (washCode.contains(OrderNoUtils.cloth_wash_adjust_code_header)) {
+        if (washCode.startsWith(OrderNoUtils.cloth_wash_adjust_code_header)) {
             OrderClothAdjunct orderClothAdjunct = orderClothAdjunctService.selectOrderClothAdjunctByAdjunctNo(washCode);
             if (orderClothAdjunct == null) {
                 throw new ServiceException("未查询到衣物");
@@ -910,7 +910,7 @@ public class OrderClothItemController extends BaseController {
     @ApiOperation(value = "查询洗衣订单-待上挂衣服列表")
     public R<Page<OrderClothItemVO>> getOrderClothItemListByUpHanger(OrderClothHangerDTO orderClothHangerDTO) {
 
-        if (StringUtils.isNotBlank(orderClothHangerDTO.getWashCode()) && orderClothHangerDTO.getWashCode().contains(OrderNoUtils.cloth_wash_adjust_code_header)) {
+        if (StringUtils.isNotBlank(orderClothHangerDTO.getWashCode()) && orderClothHangerDTO.getWashCode().startsWith(OrderNoUtils.cloth_wash_adjust_code_header)) {
             OrderClothItemVO orderClothItemVO = new OrderClothItemVO();
             OrderClothAdjunct orderClothAdjunct = orderClothAdjunctService.selectOrderClothAdjunctByAdjunctNo(orderClothHangerDTO.getWashCode());
             if (orderClothAdjunct == null) {

+ 48 - 16
yiqi-admin/src/main/java/com/yiqi/admin/controller/order/OrderGoodsController.java

@@ -1,6 +1,7 @@
 package com.yiqi.admin.controller.order;
 
 import java.math.BigDecimal;
+import java.util.Currency;
 import java.util.List;
 import java.util.Map;
 import java.util.stream.Collectors;
@@ -16,6 +17,7 @@ import com.yiqi.common.constant.UrlConstants;
 import com.yiqi.common.core.domain.R;
 import com.yiqi.common.core.domain.entity.SysUser;
 import com.yiqi.common.enums.*;
+import com.yiqi.common.utils.CurrencyUtil;
 import com.yiqi.common.utils.DateUtils;
 import com.yiqi.common.utils.SecurityUtils;
 import com.yiqi.common.utils.bean.BeanUtils;
@@ -23,6 +25,9 @@ import com.yiqi.common.utils.poi.ExcelUtil;
 import com.yiqi.order.domain.dto.*;
 import com.yiqi.order.domain.dto.weapp.AppOrderGoodsCancelDTO;
 import com.yiqi.order.domain.vo.*;
+import com.yiqi.recharge.domain.RechargePasswordCard;
+import com.yiqi.recharge.service.IRechargePasswordCardService;
+import com.yiqi.system.domain.SysStore;
 import io.swagger.annotations.Api;
 import io.swagger.annotations.ApiOperation;
 import org.springframework.beans.factory.annotation.Autowired;
@@ -55,7 +60,9 @@ public class OrderGoodsController extends BaseController {
     @Autowired
     private IAppUserService appUserService;
 
-    //<editor-folder desc="基础函数">
+    @Autowired
+    private IRechargePasswordCardService rechargePasswordCardService;
+
     /**
      * 查询零售商品订单列表
      */
@@ -66,11 +73,11 @@ public class OrderGoodsController extends BaseController {
         startPage();
         List<GoodsOrderQueryVO> orderGoodsList = orderGoodsService.selectOrderGoodsList(goodsOrderQueryDTO);
         List<Long> appUserIdList = orderGoodsList.stream().map(GoodsOrderQueryVO::getAppUserId).collect(Collectors.toList());
-        if (CollUtil.isNotEmpty(appUserIdList)){
+        if (CollUtil.isNotEmpty(appUserIdList)) {
             List<AppUserInfoVO> userInfoList = appUserService.getAppUserInfoByIds(appUserIdList);
             Map<Long, AppUserInfoVO> userInfoVOMap = userInfoList.stream().collect(Collectors.toMap(AppUserInfoVO::getAppUserId, AppUserInfoVO -> AppUserInfoVO));
             for (GoodsOrderQueryVO vo : orderGoodsList) {
-                if(userInfoVOMap.containsKey(vo.getAppUserId())){
+                if (userInfoVOMap.containsKey(vo.getAppUserId())) {
                     BeanUtils.copyProperties(userInfoVOMap.get(vo.getAppUserId()), vo);
                 }
             }
@@ -103,12 +110,37 @@ public class OrderGoodsController extends BaseController {
         BeanUtils.copyProperties(orderGoods, goodsOrderInfoVO);
         goodsOrderInfoVO.setOrderGoodsSkuList(orderGoodsService.selectOrderGoodsById(id));
         AppUserInfoVO userInfo = appUserService.getAppUserInfoById(orderGoods.getAppUserId());
-        if (userInfo != null){
+        if (userInfo != null) {
             BeanUtils.copyProperties(userInfo, goodsOrderInfoVO);
         }
         return R.ok(goodsOrderInfoVO);
     }
 
+    /**
+     * 获取零售商品订单详细信息
+     */
+    @GetMapping(value = "/print/{id}")
+    @ApiOperation(value = "商品订单打印")
+    public R<OrderGoodsPrintVO> getPrintInfo(@PathVariable("id") Long id) {
+        OrderGoodsPrintVO goodsOrderInfoVO = new OrderGoodsPrintVO();
+        OrderGoods orderGoods = orderGoodsService.getById(id);
+        BeanUtils.copyProperties(orderGoods, goodsOrderInfoVO);
+        goodsOrderInfoVO.setOrderGoodsSkuList(orderGoodsService.selectOrderGoodsById(id));
+        AppUserInfoVO userInfo = appUserService.getAppUserInfoById(orderGoods.getAppUserId());
+        goodsOrderInfoVO.setAppUserInfoVO(userInfo);
+        RechargePasswordCard rechargePasswordCard = rechargePasswordCardService.selectTotalBalanceGroupByAppUser(orderGoods.getAppUserId(), OrderType.goods.getCode());
+        if (orderGoods.getPayType().equals(PayType.BALANCE.getCode())) {
+            goodsOrderInfoVO.setMemberBeforeBalance(CurrencyUtil.add(rechargePasswordCard.getTotalBalance(), orderGoods.getPayAmount()));
+            goodsOrderInfoVO.setMemberAfterBalance(rechargePasswordCard.getTotalBalance());
+            goodsOrderInfoVO.setMemberChangeAmount(orderGoods.getPayAmount());
+        } else {
+            goodsOrderInfoVO.setMemberBeforeBalance(rechargePasswordCard.getTotalBalance());
+            goodsOrderInfoVO.setMemberAfterBalance(rechargePasswordCard.getTotalBalance());
+            goodsOrderInfoVO.setMemberChangeAmount(BigDecimal.ZERO);
+        }
+        return R.ok(goodsOrderInfoVO);
+    }
+
     /**
      * 新增零售商品订单-下单
      */
@@ -123,19 +155,19 @@ public class OrderGoodsController extends BaseController {
         List<OrderGoodsSkuInfoVO> orderGoodsSkuInfoVOS = orderGoodsService.getOrderSkuInfoByOrderSkuId(orderGoodsDTO);
         BigDecimal totalPrice = orderGoodsSkuInfoVOS.stream().map(item -> item.getSalePrice().multiply(new BigDecimal(item.getBuyNum())))
                 .reduce(BigDecimal.ZERO, BigDecimal::add);
-        if (BigDecimal.ZERO.equals(totalPrice)){
+        if (BigDecimal.ZERO.equals(totalPrice)) {
             error("商品总价不能为0");
         }
         orderGoodsDTO.setTotalPrice(totalPrice);
 
         // 设置门店线下参数
         SysUser user = SecurityUtils.getLoginUser().getUser();
-        orderGoodsDTO.setGoodsType(orderGoodsInsertDTO.getGoodsType() == null ? GoodsType.NORMAL.getCode() :orderGoodsInsertDTO.getGoodsType());
+        orderGoodsDTO.setGoodsType(orderGoodsInsertDTO.getGoodsType() == null ? GoodsType.NORMAL.getCode() : orderGoodsInsertDTO.getGoodsType());
         orderGoodsDTO.setSourceType(user.getUserType());
         orderGoodsDTO.setOrgId(user.getStoreId());
         orderGoodsDTO.setSendTime(DateUtils.getNowDate());
         orderGoodsDTO.setFinishTime(DateUtils.getNowDate());
-        if (orderGoodsDTO.getDeductAmount() == null){
+        if (orderGoodsDTO.getDeductAmount() == null) {
             orderGoodsDTO.setDeductAmount(BigDecimal.ZERO);
         }
         return R.ok(orderGoodsService.insertRetailOrderGoods(orderGoodsDTO, orderGoodsSkuInfoVOS));
@@ -157,7 +189,7 @@ public class OrderGoodsController extends BaseController {
     @Transactional(rollbackFor = Exception.class)
     @PostMapping("/rePayOrder")
     @ApiOperation(value = "零售商品订单-重新支付")
-    public  R<OrderPayResultVO> rePayOrder(@RequestBody OrderGoodsDTO orderGoodsDTO) {
+    public R<OrderPayResultVO> rePayOrder(@RequestBody OrderGoodsDTO orderGoodsDTO) {
         return R.ok(orderGoodsService.rePayOrder(orderGoodsDTO));
     }
 
@@ -203,11 +235,11 @@ public class OrderGoodsController extends BaseController {
      * 商品订单退款审核,审批同意
      */
     @Transactional(rollbackFor = Exception.class)
-    @GetMapping ("/refundApprovalPass")
+    @GetMapping("/refundApprovalPass")
     @ApiOperation(value = "商品订单退款审核,审批同意")
     public R refundApprovalPass(@RequestParam("orderId") Long orderId) {
         // 操作人校验
-        if (!SecurityUtils.getLoginUser().getSourceType().equals(SourceType.MANAGER.getCode())){
+        if (!SecurityUtils.getLoginUser().getSourceType().equals(SourceType.MANAGER.getCode())) {
             throw new ServiceException("当前登录人没有权限操作");
         }
         return R.ok(orderGoodsService.refundApprovalPass(orderId));
@@ -221,7 +253,7 @@ public class OrderGoodsController extends BaseController {
     @ApiOperation(value = "商品订单退款审核,审批驳回")
     public R refundApprovalReject(@RequestParam("orderId") Long orderId) {
         // 操作人校验
-        if (!SecurityUtils.getLoginUser().getSourceType().equals(SourceType.MANAGER.getCode())){
+        if (!SecurityUtils.getLoginUser().getSourceType().equals(SourceType.MANAGER.getCode())) {
             throw new ServiceException("当前登录人没有权限操作");
         }
         return R.ok(orderGoodsService.refundApprovalReject(orderId));
@@ -234,7 +266,7 @@ public class OrderGoodsController extends BaseController {
                 .eq(OrderGoods::getDelFlag, DeleteStatus.OK.getCode())
                 .eq(OrderGoods::getAppUserId, memberOrderQueryDTO.getAppUserId())
                 .ne(OrderGoods::getRefundStatus, OrderRefundStatus.REFUND_SUCCESS.getCode());
-        if (SourceType.STORE.getCode().equals(SecurityUtils.getLoginUser().getSourceType())){
+        if (SourceType.STORE.getCode().equals(SecurityUtils.getLoginUser().getSourceType())) {
             queryWrapper.eq(OrderGoods::getSourceType, SourceType.STORE.getCode());
             queryWrapper.eq(OrderGoods::getOrgId, SecurityUtils.getLoginUser().getOrgId());
         }
@@ -254,11 +286,11 @@ public class OrderGoodsController extends BaseController {
         startPage();
         List<GoodsOrderRefundQueryVO> orderGoodsList = orderGoodsService.getRefundOrderGoodsList(goodsOrderRefundQueryDTO);
         List<Long> appUserIdList = orderGoodsList.stream().map(GoodsOrderRefundQueryVO::getAppUserId).collect(Collectors.toList());
-        if (CollUtil.isNotEmpty(appUserIdList)){
+        if (CollUtil.isNotEmpty(appUserIdList)) {
             List<AppUserInfoVO> userInfoList = appUserService.getAppUserInfoByIds(appUserIdList);
             Map<Long, AppUserInfoVO> userInfoVOMap = userInfoList.stream().collect(Collectors.toMap(AppUserInfoVO::getAppUserId, AppUserInfoVO -> AppUserInfoVO));
             for (GoodsOrderRefundQueryVO vo : orderGoodsList) {
-                if(userInfoVOMap.containsKey(vo.getAppUserId())){
+                if (userInfoVOMap.containsKey(vo.getAppUserId())) {
                     BeanUtils.copyProperties(userInfoVOMap.get(vo.getAppUserId()), vo);
                 }
             }
@@ -277,11 +309,11 @@ public class OrderGoodsController extends BaseController {
         goodsOrderRefundQueryDTO.setPageSizeExport(50000);
         List<GoodsOrderRefundQueryVO> orderGoodsList = orderGoodsService.getRefundOrderGoodsList(goodsOrderRefundQueryDTO);
         List<Long> appUserIdList = orderGoodsList.stream().map(GoodsOrderRefundQueryVO::getAppUserId).collect(Collectors.toList());
-        if (CollUtil.isNotEmpty(appUserIdList)){
+        if (CollUtil.isNotEmpty(appUserIdList)) {
             List<AppUserInfoVO> userInfoList = appUserService.getAppUserInfoByIds(appUserIdList);
             Map<Long, AppUserInfoVO> userInfoVOMap = userInfoList.stream().collect(Collectors.toMap(AppUserInfoVO::getAppUserId, AppUserInfoVO -> AppUserInfoVO));
             for (GoodsOrderRefundQueryVO vo : orderGoodsList) {
-                if(userInfoVOMap.containsKey(vo.getAppUserId())){
+                if (userInfoVOMap.containsKey(vo.getAppUserId())) {
                     BeanUtils.copyProperties(userInfoVOMap.get(vo.getAppUserId()), vo);
                 }
             }

+ 33 - 7
yiqi-admin/src/main/java/com/yiqi/admin/controller/order/OrderRechargeController.java

@@ -2,7 +2,9 @@ package com.yiqi.admin.controller.order;
 
 import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
 import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
-import com.yiqi.common.enums.OrderRechargeStatus;
+import com.yiqi.app.domain.vo.AppUserInfoVO;
+import com.yiqi.app.service.IAppUserService;
+import com.yiqi.common.enums.*;
 import com.yiqi.common.exception.ServiceException;
 import com.yiqi.common.annotation.Log;
 import com.yiqi.common.constant.UrlConstants;
@@ -10,24 +12,24 @@ import com.yiqi.common.core.controller.BaseController;
 import com.yiqi.common.core.domain.AjaxResult;
 import com.yiqi.common.core.domain.R;
 import com.yiqi.common.core.page.TableDataInfo;
-import com.yiqi.common.enums.BusinessType;
-import com.yiqi.common.enums.OrderSourceType;
+import com.yiqi.common.utils.CurrencyUtil;
 import com.yiqi.common.utils.SecurityUtils;
+import com.yiqi.common.utils.bean.BeanUtils;
 import com.yiqi.common.utils.poi.ExcelUtil;
+import com.yiqi.order.domain.OrderGoods;
 import com.yiqi.order.domain.OrderRecharge;
 import com.yiqi.order.domain.OrderRechargeInstalment;
 import com.yiqi.order.domain.dto.OrderRechargeCreateDTO;
 import com.yiqi.order.domain.dto.OrderRechargeQueryDTO;
-import com.yiqi.order.domain.vo.OrderRechargeListVO;
-import com.yiqi.order.domain.vo.OrderRechargeRecordVO;
-import com.yiqi.order.domain.vo.OrderPayResultVO;
+import com.yiqi.order.domain.vo.*;
 import com.yiqi.order.domain.vo.weapp.AppOrderRechargeResultVO;
 import com.yiqi.order.service.IOrderRechargeInstalmentService;
 import com.yiqi.order.service.IOrderRechargeService;
+import com.yiqi.recharge.domain.RechargePasswordCard;
+import com.yiqi.recharge.service.IRechargePasswordCardService;
 import io.swagger.annotations.Api;
 import io.swagger.annotations.ApiOperation;
 import io.swagger.annotations.ApiParam;
-import org.springframework.beans.BeanUtils;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.security.access.prepost.PreAuthorize;
 import org.springframework.transaction.annotation.Transactional;
@@ -53,6 +55,12 @@ public class OrderRechargeController extends BaseController {
     @Autowired
     IOrderRechargeInstalmentService orderRechargeInstalmentService;
 
+    @Autowired
+    private IAppUserService appUserService;
+
+    @Autowired
+    private IRechargePasswordCardService rechargePasswordCardService;
+
     /**
      * 查询充值订单列表
      */
@@ -88,6 +96,24 @@ public class OrderRechargeController extends BaseController {
         return success(orderRechargeService.selectOrderRechargeById(id));
     }
 
+    /**
+     * 获取零售商品订单详细信息
+     */
+    @GetMapping(value = "/print/{id}")
+    @ApiOperation(value = "充值订单打印")
+    public R<OrderRechargePrintVO> getPrintInfo(@PathVariable("id") Long id) {
+        OrderRechargePrintVO orderRechargePrintVO = new OrderRechargePrintVO();
+        OrderRecharge orderRecharge = orderRechargeService.selectOrderRechargeById(id);
+        BeanUtils.copyProperties(orderRecharge, orderRechargePrintVO);
+        AppUserInfoVO userInfo = appUserService.getAppUserInfoById(orderRecharge.getAppUserId());
+        orderRechargePrintVO.setAppUserInfoVO(userInfo);
+        RechargePasswordCard rechargePasswordCard = rechargePasswordCardService.selectTotalBalanceGroupByAppUser(orderRecharge.getAppUserId(), null);
+        orderRechargePrintVO.setMemberChangeAmount(CurrencyUtil.add(orderRecharge.getRechargeAmount(), orderRecharge.getWelfareAmount(), orderRecharge.getGiveAmount()));
+        orderRechargePrintVO.setMemberAfterBalance(rechargePasswordCard.getTotalBalance());
+        orderRechargePrintVO.setMemberBeforeBalance(CurrencyUtil.add(rechargePasswordCard.getTotalBalance(), orderRechargePrintVO.getMemberChangeAmount()));
+        return R.ok(orderRechargePrintVO);
+    }
+
     /**
      * 新增充值订单
      */

+ 64 - 22
yiqi-common/src/main/java/com/yiqi/common/utils/OrderNoUtils.java

@@ -1,96 +1,138 @@
 package com.yiqi.common.utils;
 
+import cn.hutool.core.date.DateUnit;
+import cn.hutool.core.date.DateUtil;
 import com.yiqi.common.config.SnowFlakeConfig;
+import com.yiqi.common.core.redis.RedisUtils;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.stereotype.Component;
 
+import java.util.Date;
+import java.util.Random;
+
 @Component
 public class OrderNoUtils {
-    @Autowired
-    SnowFlakeConfig snowFlakeConfig;
 
-    public final static String cloth_wash_code_header = "WA";
-    public final static String cloth_wash_adjust_code_header = "WD";
-    public final static String activity_order_header = "AC";
-    public final static String cloth_order_header = "CL";
-    public final static String purchase_order_header = "PU";
-    public final static String goods_order_header = "GO";
-    public final static String recharge_order_header = "RE";
-    public final static String delivery_order_header = "DE";
-    public final static String refund_order_header = "RF";
+    @Autowired
+    RedisUtils redisUtils;
 
+    public final static String cloth_wash_code_header = "1";
+    public final static String cloth_wash_adjust_code_header = "2";
+    public final static String activity_order_header = "A";
+    public final static String cloth_order_header = "C";
+    public final static String purchase_order_header = "P";
+    public final static String goods_order_header = "G";
+    public final static String recharge_order_header = "R";
+    public final static String delivery_order_header = "D";
 
 
     /**
      * 洗衣水洗唛号生成
+     *
      * @return
      */
-    public String getClothWashCode(){
+    public String getClothWashCode() {
         return getOrderNo(cloth_wash_code_header);
     }
 
     /**
      * 洗衣水洗附件单号
+     *
      * @return
      */
-    public String getClothWashAdjustCode(){
+    public String getClothWashAdjustCode() {
         return getOrderNo(cloth_wash_adjust_code_header);
     }
 
     /**
      * 洗衣订单号生成
+     *
      * @return
      */
-    public String getClothOrderNo(){
+    public String getClothOrderNo() {
         return getOrderNo(cloth_order_header);
     }
 
     /**
      * 进货订单号生成
+     *
      * @return
      */
-    public String getPurchaseOrderNo(){
+    public String getPurchaseOrderNo() {
         return getOrderNo(purchase_order_header);
     }
 
     /**
      * 商品订单号生成
+     *
      * @return
      */
-    public String getGoodsOrderNo(){
+    public String getGoodsOrderNo() {
         return getOrderNo(goods_order_header);
     }
 
     /**
      * 活动订单号生成
+     *
      * @return
      */
-    public String getActivityOrderNo(){
+    public String getActivityOrderNo() {
         return getOrderNo(activity_order_header);
     }
 
     /**
      * 充值订单号生成
+     *
      * @return
      */
-    public String getRechargeOrderNo(){
+    public String getRechargeOrderNo() {
         return getOrderNo(recharge_order_header);
     }
 
     /**
      * 配送费订单号生成
+     *
      * @return
      */
-    public String getDeliveryOrderNo(){
+    public String getDeliveryOrderNo() {
         return getOrderNo(delivery_order_header);
     }
 
 
-    public String getOrderNo(String headerKey){
-        return headerKey + snowFlakeConfig.getInstance().nextId();
+    public String getOrderNo(String headerKey) {
+        Long days = DateUtil.between(new Date(), DateUtils.parseDate("2022-01-01"), DateUnit.DAY);
+        String date = DateUtil.format(new Date(), "HHmmss");
+        Long num = getOrderNum(headerKey);
+        String str = String.format("%03d", num.intValue());
+        return headerKey + days + date + str;
     }
 
-    public String getOrderNo(){
+    public String getOrderNo() {
         return getOrderNo("");
     }
+
+
+    /**
+     * REDIS_KEY
+     */
+    public final static String REDIS_KEY = "ORDER_NUM:";
+
+    /**
+     * 获取取货码
+     *
+     * @return
+     */
+    public Long getOrderNum(String headerKey) {
+        if (StringUtils.isEmpty(headerKey)) {
+            headerKey = "O";
+        }
+        String key = REDIS_KEY + headerKey + ":" + DateUtil.formatDate(new Date());
+        Long count = redisUtils.incr(key, 1);
+        redisUtils.expire(key, 24 * 3600);
+        return count;
+    }
+
+    public static void main(String[] args) {
+        System.out.println(new OrderNoUtils().getOrderNo());
+    }
 }

+ 0 - 3
yiqi-common/src/main/java/com/yiqi/core/service/ISettlementStoreStatisticsService.java

@@ -49,9 +49,6 @@ public interface ISettlementStoreStatisticsService extends IService<SettlementSt
 
 
 
-    StoreChargeStatistics generateChargeStatistics(Long storeId, Date start, Date end);
-
-
     /**
      * 平台每日统计列表 (按门店)
      *

+ 40 - 0
yiqi-common/src/main/java/com/yiqi/order/domain/vo/OrderClothPrintVO.java

@@ -0,0 +1,40 @@
+package com.yiqi.order.domain.vo;
+
+import com.baomidou.mybatisplus.annotation.IdType;
+import com.baomidou.mybatisplus.annotation.TableId;
+import com.fasterxml.jackson.annotation.JsonFormat;
+import com.yiqi.app.domain.vo.AppUserInfoVO;
+import com.yiqi.common.annotation.Excel;
+import com.yiqi.order.domain.OrderCloth;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+
+import java.math.BigDecimal;
+import java.util.Date;
+import java.util.List;
+
+/**
+ * 订单打印VO
+ *
+ * @author weiximei
+ * @date 2020-05-06
+ */
+@Data
+public class OrderClothPrintVO extends OrderCloth {
+
+    @ApiModelProperty("客户信息")
+    private AppUserInfoVO appUserInfoVO;
+
+    @ApiModelProperty("会员支付前剩余余额")
+    private BigDecimal memberBeforeBalance;
+
+    @ApiModelProperty("会员变动金额")
+    private BigDecimal memberChangeAmount;
+
+    @ApiModelProperty("会员支付后剩余余额")
+    private BigDecimal memberAfterBalance;
+
+    @ApiModelProperty("订单明细")
+    private List<OrderClothItemVO> orderClothItemVOS;
+
+}

+ 141 - 0
yiqi-common/src/main/java/com/yiqi/order/domain/vo/OrderGoodsPrintVO.java

@@ -0,0 +1,141 @@
+package com.yiqi.order.domain.vo;
+
+import com.baomidou.mybatisplus.annotation.IdType;
+import com.baomidou.mybatisplus.annotation.TableId;
+import com.fasterxml.jackson.annotation.JsonFormat;
+import com.yiqi.app.domain.vo.AppUserInfoVO;
+import com.yiqi.app.domain.vo.AppUserVO;
+import com.yiqi.common.annotation.Excel;
+import com.yiqi.system.domain.SysStore;
+import com.yiqi.system.domain.vo.OrgVO;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+
+import java.io.Serializable;
+import java.math.BigDecimal;
+import java.util.Date;
+import java.util.List;
+
+/**
+ * 订单打印VO
+ *
+ * @author weiximei
+ * @date 2020-05-06
+ */
+@Data
+public class OrderGoodsPrintVO implements Serializable {
+    /**
+     * 主键ID
+     */
+    @ApiModelProperty("主键ID")
+    @TableId(type = IdType.AUTO)
+
+    private Long id;
+
+    /**
+     * 订单编号
+     */
+    @Excel(name = "订单编号")
+    @ApiModelProperty("订单编号")
+    private String orderNo;
+
+    /**
+     * 配送方式(0=到店自取,1=快递)
+     */
+    @Excel(name = "配送方式", readConverterExp = "0==到店自取,1=快递")
+    @ApiModelProperty("配送方式(0=到店自取,1=快递)")
+    private String deliveryWay;
+
+    /**
+     * 快递公司
+     */
+    @Excel(name = "快递公司")
+    @ApiModelProperty("快递公司")
+    private String deliveryCompany;
+
+    /**
+     * 快递单号
+     */
+    @Excel(name = "快递单号")
+    @ApiModelProperty("快递单号")
+    private String deliveryNo;
+
+    /**
+     * 订单总价
+     */
+    @Excel(name = "订单总价")
+    @ApiModelProperty("订单总价")
+    private BigDecimal totalPrice;
+
+    /**
+     * 抵扣金额
+     */
+    @Excel(name = "抵扣金额")
+    @ApiModelProperty("抵扣金额")
+    private BigDecimal deductAmount;
+
+    /**
+     * 抵扣积分
+     */
+    @Excel(name = "抵扣积分")
+    @ApiModelProperty("抵扣积分")
+    private Integer deductPoint;
+
+    /**
+     * 支付金额
+     */
+    @Excel(name = "支付金额")
+    @ApiModelProperty("支付金额")
+    private BigDecimal payAmount;
+
+    /**
+     * 支付时间
+     */
+    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8")
+    @Excel(name = "支付时间", width = 30, dateFormat = "yyyy-MM-dd")
+    @ApiModelProperty("支付时间")
+    private Date payTime;
+
+    /**
+     * 发货时间
+     */
+    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8")
+    @Excel(name = "发货时间", width = 30, dateFormat = "yyyy-MM-dd")
+    @ApiModelProperty("发货时间")
+    private Date sendTime;
+
+    /**
+     * 确认收货时间
+     */
+    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8")
+    @Excel(name = "确认收货时间", width = 30, dateFormat = "yyyy-MM-dd")
+    @ApiModelProperty("确认收货时间")
+    private Date finishTime;
+
+    @ApiModelProperty("预约时间")
+    @JsonFormat(pattern = "yyyy-MM-dd HH:mm", timezone = "GMT+8")
+    private Date appointmentTime;
+
+    @ApiModelProperty("支付方式(0=微信,1=支付宝,2=现金,3=余额)")
+    private String payType;
+
+    @ApiModelProperty("创建时间")
+    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8")
+    private Date createTime;
+
+    @ApiModelProperty("商品明细")
+    private List<OrderRetailGoodsSkuVO> orderGoodsSkuList;
+
+    @ApiModelProperty("客户信息")
+    private AppUserInfoVO appUserInfoVO;
+
+    @ApiModelProperty("会员支付前剩余余额")
+    private BigDecimal memberBeforeBalance;
+
+    @ApiModelProperty("会员变动金额")
+    private BigDecimal memberChangeAmount;
+
+    @ApiModelProperty("会员支付后剩余余额")
+    private BigDecimal memberAfterBalance;
+
+}

+ 44 - 0
yiqi-common/src/main/java/com/yiqi/order/domain/vo/OrderRechargePrintVO.java

@@ -0,0 +1,44 @@
+package com.yiqi.order.domain.vo;
+
+import com.baomidou.mybatisplus.annotation.IdType;
+import com.baomidou.mybatisplus.annotation.TableId;
+import com.fasterxml.jackson.annotation.JsonFormat;
+import com.yiqi.app.domain.vo.AppUserInfoVO;
+import com.yiqi.common.annotation.Excel;
+import com.yiqi.order.domain.OrderRecharge;
+import com.yiqi.system.domain.SysStore;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+
+import java.math.BigDecimal;
+import java.util.Date;
+import java.util.List;
+
+/**
+ * 订单打印VO
+ *
+ * @author weiximei
+ * @date 2020-05-06
+ */
+@Data
+public class OrderRechargePrintVO extends OrderRecharge {
+
+    /**
+     * 订单详情
+     */
+    @ApiModelProperty("衣服详情")
+    List<OrderClothItemVO> orderClothItemVOS;
+
+    @ApiModelProperty("客户信息")
+    private AppUserInfoVO appUserInfoVO;
+
+    @ApiModelProperty("会员支付前剩余余额")
+    private BigDecimal memberBeforeBalance;
+
+    @ApiModelProperty("会员变动金额")
+    private BigDecimal memberChangeAmount;
+
+    @ApiModelProperty("会员支付后剩余余额")
+    private BigDecimal memberAfterBalance;
+
+}

+ 8 - 0
yiqi-common/src/main/java/com/yiqi/order/service/IOrderClothItemService.java

@@ -120,6 +120,14 @@ public interface IOrderClothItemService extends IService<OrderClothItem> {
      */
     List<OrderClothItemVO> queryClothItem(OrderClothItemQueryDTO orderClothItemQueryDTO);
 
+    /**
+     * 根据订单id查询 clothesItem
+     *
+     * @param orderId
+     * @return
+     */
+    List<OrderClothItemVO> queryClothItemByOrderId(String orderSn);
+
     /**
      * 修改所有 clothesItem 状态
      *

+ 8 - 0
yiqi-common/src/main/java/com/yiqi/recharge/domain/RechargePasswordCard.java

@@ -4,6 +4,7 @@ import java.math.BigDecimal;
 import java.util.Date;
 
 import com.baomidou.mybatisplus.annotation.IdType;
+import com.baomidou.mybatisplus.annotation.TableField;
 import com.baomidou.mybatisplus.annotation.TableId;
 import com.fasterxml.jackson.annotation.JsonFormat;
 import com.baomidou.mybatisplus.annotation.TableName;
@@ -199,4 +200,11 @@ public class RechargePasswordCard extends BaseEntity {
 
     @ApiModelProperty("是否支持汽车美容使用 Y是,N否")
     private String isSupportCar;
+
+    /**
+     * 充值卡总余额
+     */
+    @ApiModelProperty("充值卡总余额")
+    @TableField(exist = false)
+    private BigDecimal totalBalance;
 }

+ 0 - 6
yiqi-core/src/main/java/com/yiqi/core/service/impl/SettlementStoreStatisticsServiceImpl.java

@@ -85,11 +85,6 @@ public class SettlementStoreStatisticsServiceImpl extends ServiceImpl<Settlement
         return baseMapper.orderStatistics(storeId, startDay, endDay);
     }
 
-    @Override
-    public StoreChargeStatistics generateChargeStatistics(Long storeId, Date start, Date end) {
-        return null;
-    }
-
     @Override
     public List<SettlementStoreStatistics> generatePlatformStatisticsByDate(Date start, Date end) {
         Integer startDay = Integer.parseInt(DateUtil.format(start, "yyyyMMdd"));
@@ -400,7 +395,6 @@ public class SettlementStoreStatisticsServiceImpl extends ServiceImpl<Settlement
         BigDecimal wxPayAmount = BigDecimal.ZERO;
         BigDecimal aliPayAmount = BigDecimal.ZERO;
         BigDecimal cashPayAmount = BigDecimal.ZERO;
-        BigDecimal memberPayAmount = BigDecimal.ZERO;
         BigDecimal passwordCardAmount = BigDecimal.ZERO;
 
         for (OrderRecharge recharge : rechargeList) {

+ 43 - 0
yiqi-core/src/main/java/com/yiqi/order/service/impl/OrderClothItemServiceImpl.java

@@ -6,7 +6,9 @@ import java.util.stream.Collectors;
 import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
 import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
 import com.baomidou.mybatisplus.core.conditions.update.UpdateWrapper;
+import com.github.pagehelper.PageInfo;
 import com.qcloud.cos.common_utils.CommonFileUtils;
+import com.yiqi.common.enums.SourceType;
 import com.yiqi.common.exception.ServiceException;
 import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
 import com.yiqi.app.domain.AppUser;
@@ -26,6 +28,7 @@ import com.yiqi.order.domain.*;
 import com.yiqi.order.domain.dto.*;
 import com.yiqi.order.domain.vo.*;
 import com.yiqi.order.service.*;
+import com.yiqi.system.domain.SysOrg;
 import com.yiqi.system.service.ISysOrgService;
 import org.springframework.beans.BeanUtils;
 import org.springframework.beans.factory.annotation.Autowired;
@@ -340,6 +343,46 @@ public class OrderClothItemServiceImpl extends ServiceImpl<OrderClothItemMapper,
         return baseMapper.queryClothItem(orderClothItemQueryDTO);
     }
 
+    @Override
+    public List<OrderClothItemVO> queryClothItemByOrderId(String orderSn) {
+        OrderClothItemQueryDTO orderClothItemQueryDTO = new OrderClothItemQueryDTO();
+        orderClothItemQueryDTO.setOrderNo(orderSn);
+        List<OrderClothItemVO> orderClothItemVOList = orderClothItemService.queryClothItem(orderClothItemQueryDTO);
+        Set<Long> orderClothItemIds = orderClothItemVOList.stream().map(OrderClothItemVO::getId).collect(Collectors.toSet());
+        Map<Long, List<OrderClothAdjunct>> orderClothAdjunctMap = orderClothAdjunctService.list(
+                        new QueryWrapper<OrderClothAdjunct>().lambda().in(OrderClothAdjunct::getOrderClothId, orderClothItemIds))
+                .stream().collect(Collectors.groupingBy(OrderClothAdjunct::getOrderClothId));
+        Map<Long, List<OrderClothColor>> orderClothColorMap = orderClothColorService.list(
+                        new QueryWrapper<OrderClothColor>().lambda().in(OrderClothColor::getOrderClothId, orderClothItemIds))
+                .stream().collect(Collectors.groupingBy(OrderClothColor::getOrderClothId));
+        Map<Long, List<OrderClothCraft>> orderClothCraftMap = orderClothCraftService.list(
+                        new QueryWrapper<OrderClothCraft>().lambda().in(OrderClothCraft::getOrderClothId, orderClothItemIds))
+                .stream().collect(Collectors.groupingBy(OrderClothCraft::getOrderClothId));
+        Map<Long, List<OrderClothFlaw>> orderClothFlawMap = orderClothFlawService.list(
+                        new QueryWrapper<OrderClothFlaw>().lambda().in(OrderClothFlaw::getOrderClothId, orderClothItemIds))
+                .stream().collect(Collectors.groupingBy(OrderClothFlaw::getOrderClothId));
+        Map<Long, List<OrderClothType>> orderClothTypeMap = orderClothTypeService.list(
+                        new QueryWrapper<OrderClothType>().lambda().in(OrderClothType::getOrderClothId, orderClothItemIds))
+                .stream().collect(Collectors.groupingBy(OrderClothType::getOrderClothId));
+
+        List<OrderClothItemVO> orderClothItemVOS = new ArrayList<>();
+        for (OrderClothItemVO orderClothItemVO : orderClothItemVOList) {
+            orderClothItemVO.setOrderClothAdjuncts(orderClothAdjunctMap.get(orderClothItemVO.getId()));
+            orderClothItemVO.setOrderClothColors(orderClothColorMap.get(orderClothItemVO.getId()));
+            orderClothItemVO.setOrderClothCrafts(orderClothCraftMap.get(orderClothItemVO.getId()));
+            orderClothItemVO.setOrderClothFlaws(orderClothFlawMap.get(orderClothItemVO.getId()));
+            orderClothItemVO.setOrderClothTypes(orderClothTypeMap.get(orderClothItemVO.getId()));
+            if (orderClothItemVO.getPlanSendClothTime() != null) {
+                if (orderClothItemVO.getPlanSendClothTime().getTime() < DateUtils.getNowDate().getTime()) {
+                    orderClothItemVO.setTimeoutDayNum((DateUtils.getNowDate().getTime()
+                            - orderClothItemVO.getPlanSendClothTime().getTime()) / (24 * 3600 * 1000) + 1);
+                }
+            }
+            orderClothItemVOS.add(orderClothItemVO);
+        }
+        return orderClothItemVOS;
+    }
+
     @Override
     public void updateAllClothItemStatusByOrderId(Long clothOrderId, String flawStatus) {
         baseMapper.updateAllClothItemStatusByOrderId(clothOrderId, flawStatus);

+ 1 - 1
yiqi-core/src/main/java/com/yiqi/order/service/impl/OrderPayInfoServiceImpl.java

@@ -98,7 +98,7 @@ public class OrderPayInfoServiceImpl extends ServiceImpl<OrderPayInfoMapper, Ord
         orderPayInfo.setPayType(payType);
         orderPayInfo.setOrderNo(orderNo);
         orderPayInfo.setPayAmount(payAmount);
-        orderPayInfo.setRequestNo(orderNoUtils.getOrderNo(orderNo.substring(0, 2)));
+        orderPayInfo.setRequestNo(orderNoUtils.getOrderNo(orderNo.substring(0, 1)));
         orderPayInfo.setCreateTime(DateUtils.getNowDate());
         baseMapper.insert(orderPayInfo);
         return orderPayInfo;

+ 30 - 2
yiqi-core/src/main/java/com/yiqi/order/service/impl/OrderRechargeServiceImpl.java

@@ -16,6 +16,7 @@ import com.yiqi.app.domain.AppCouponItem;
 import com.yiqi.app.service.IAppCouponItemService;
 import com.yiqi.common.core.domain.R;
 import com.yiqi.common.utils.CurrencyUtil;
+import com.yiqi.common.utils.pay.PayCodeUtils;
 import com.yiqi.delay.DelayQueueCache;
 import com.yiqi.lock.RedisLockUtil;
 import com.yiqi.order.domain.vo.*;
@@ -468,8 +469,24 @@ public class OrderRechargeServiceImpl extends ServiceImpl<OrderRechargeMapper, O
         orderRecharge.setRemark(createDTO.getRemark());
         orderRecharge.setRefundAmount(BigDecimal.ZERO);
 
-        // 2. 设置支付信息
         orderRecharge.setPayType(createDTO.getPayType());
+        // 2. 设置支付信息
+        if (createDTO.getPayType().equals(PayType.WECHAT.getCode()) || createDTO.getPayType().equals(PayType.ALIPAY.getCode())) {
+            String payType = PayCodeUtils.getPayTypeByCode(createDTO.getAuthCode());
+            orderRecharge.setPayType(payType);
+        }
+
+        if (createDTO.getPayType().equals(PayType.COMBINE.getCode())) {
+            //组合支付
+            String payType = PayCodeUtils.getPayTypeByCode(createDTO.getAuthCode());
+            if (payType.equals(PayType.WECHAT.getCode())) {
+                orderRecharge.setWxPayAmount(CurrencyUtil.sub(createDTO.getPayAmount(), createDTO.getCashPayAmount()));
+            }
+            if (payType.equals(PayType.ALIPAY.getCode())) {
+                orderRecharge.setAliPayAmount(CurrencyUtil.sub(createDTO.getPayAmount(), createDTO.getCashPayAmount()));
+            }
+        }
+
         orderRecharge.setOrderStatus(OrderRechargeStatus.NO_PAY.getCode());
         orderRecharge.setPayStatus(PayStatus.WAITING_TO_PAY.getCode());
 
@@ -555,6 +572,17 @@ public class OrderRechargeServiceImpl extends ServiceImpl<OrderRechargeMapper, O
         // 3. 线下支付(微信/支付宝)
         if (OrderSourceType.OFFLINE.getCode().equals(createDTO.getOrderSource())) {
             // 2. 发起支付
+            if (orderRecharge.getPayType().equals(PayType.COMBINE.getCode())) {
+                //如果是组合支付
+                String payType = PayCodeUtils.getPayTypeByCode(createDTO.getAuthCode());
+                orderRecharge.setPayType(payType);
+                if (payType.equals(PayType.WECHAT.getCode())) {
+                    orderRecharge.setPayAmount(orderRecharge.getWxPayAmount());
+                }
+                if (payType.equals(PayType.ALIPAY.getCode())) {
+                    orderRecharge.setPayAmount(orderRecharge.getAliPayAmount());
+                }
+            }
             return payService.faceToFacePay(
                     PayOrderFaceToFaceDTO.createRechargeOrderPayData(
                             orderRecharge.getOrderNo(),
@@ -746,7 +774,7 @@ public class OrderRechargeServiceImpl extends ServiceImpl<OrderRechargeMapper, O
 
     @Override
     public void paySuccess(OrderRecharge orderRecharge, String outTradeNo) {
-        if (orderRecharge.getPayStatus().equals(PayStatus.HAS_PAY.getCode()) ) {
+        if (orderRecharge.getPayStatus().equals(PayStatus.HAS_PAY.getCode())) {
             log.error("订单已支付成功,无需再次处理,订单号:{}", orderRecharge.getOrderNo());
             return;
         }

+ 1 - 1
yiqi-core/src/main/java/com/yiqi/order/service/impl/OrderRefundInfoServiceImpl.java

@@ -100,7 +100,7 @@ public class OrderRefundInfoServiceImpl extends ServiceImpl<OrderRefundInfoMappe
         orderRefundInfo.setStoreId(payRefundDTO.getStoreId());
         orderRefundInfo.setOriginOrderNo(payRefundDTO.getOrderNo());
         orderRefundInfo.setRefundOrderNo(payRefundDTO.getOutRequestNo());
-        orderRefundInfo.setRequestNo(orderNoUtils.getOrderNo(payRefundDTO.getOrderNo().substring(0, 2)));
+        orderRefundInfo.setRequestNo(orderNoUtils.getOrderNo(payRefundDTO.getOrderNo().substring(0, 1)));
         orderRefundInfo.setRefundAmount(payRefundDTO.getRefundAmount());
         orderRefundInfo.setPayAmount(payRefundDTO.getTotalAmount());
         orderRefundInfo.setPayType(payRefundDTO.getPayType());

+ 3 - 3
yiqi-core/src/main/java/com/yiqi/order/service/impl/PayServiceImpl.java

@@ -87,7 +87,7 @@ public class PayServiceImpl implements IPayService {
         }
         orderPayInfo.setPayStatus("1");
         orderPayInfoService.updateById(orderPayInfo);
-        String header = orderPayNo.substring(0, 2);
+        String header = orderPayNo.substring(0, 1);
         if (StringUtils.isBlank(orderNo)) {
             orderNo = orderPayInfo.getOrderNo();
         }
@@ -119,7 +119,7 @@ public class PayServiceImpl implements IPayService {
         orderRefundInfo.setRefundStatus("1");
         orderRefundInfoService.updateById(orderRefundInfo);
         String refundNo = orderRefundInfo.getRefundOrderNo();
-        String header = refundNo.substring(0, 2);
+        String header = refundNo.substring(0, 1);
         switch (EnumUtils.getEnumByType(header, OrderNoHeaderType.class)) {
             case cloth_order_header: {
                 return orderClothService.refundSuccess(refundNo, orderNo);
@@ -317,7 +317,7 @@ public class PayServiceImpl implements IPayService {
      */
     @Override
     public void refundNotify(String orderNo, String refundStatus) {
-        String header = orderNo.substring(0, 2);
+        String header = orderNo.substring(0, 1);
         switch (EnumUtils.getEnumByType(header, OrderNoHeaderType.class)) {
             case cloth_order_header: {
                 if (OrderRefundStatus.REFUND_SUCCESS.getCode().equals(refundStatus)) {

+ 11 - 1
yiqi-core/src/main/java/com/yiqi/recharge/service/impl/RechargePasswordCardServiceImpl.java

@@ -100,7 +100,17 @@ public class RechargePasswordCardServiceImpl extends ServiceImpl<RechargePasswor
 
     @Override
     public RechargePasswordCard selectTotalBalanceGroupByAppUser(Long appUserId, String orderType) {
-        return baseMapper.selectTotalBalanceGroupByAppUser(appUserId, orderType);
+        RechargePasswordCard rechargePasswordCard = baseMapper.selectTotalBalanceGroupByAppUser(appUserId, orderType);
+        if (rechargePasswordCard != null) {
+            rechargePasswordCard.setTotalBalance(rechargePasswordCard.getRechargeBalance().add(rechargePasswordCard.getGiveBalance()).add(rechargePasswordCard.getWelfareBalance()));
+        } else {
+            rechargePasswordCard = new RechargePasswordCard();
+            rechargePasswordCard.setTotalBalance(BigDecimal.ZERO);
+            rechargePasswordCard.setRechargeBalance(BigDecimal.ZERO);
+            rechargePasswordCard.setGiveBalance(BigDecimal.ZERO);
+            rechargePasswordCard.setWelfareBalance(BigDecimal.ZERO);
+        }
+        return rechargePasswordCard;
     }
 
     @Override

+ 3 - 3
yiqi-core/src/main/resources/mapper/recharge/RechargePasswordCardMapper.xml

@@ -119,9 +119,9 @@
         and del_flag='0'
     </select>
     <select id="selectTotalBalanceGroupByAppUser" resultType="com.yiqi.recharge.domain.RechargePasswordCard">
-        select sum(recharge_balance) as rechargeBalance,
-        sum(give_balance) as giveBalance,
-        sum(welfare_balance) as welfareBalance
+        select IFNULL(SUM(recharge_balance), 0) as rechargeBalance,
+        IFNULL(SUM(give_balance), 0) as giveBalance,
+        IFNULL(SUM(welfare_balance), 0) as welfareBalance
         from recharge_password_card
         where recharge_user_id = #{appUserId} and recharge_status = '1'
         and (expire_time &gt;= now() or expire_time IS NULL)