Prechádzať zdrojové kódy

修改:商户端我的钱包初次提交

lyx 4 mesiacov pred
rodič
commit
8bcb3df331

+ 7 - 0
alien-entity/src/main/java/shop/alien/entity/store/StoreCashOutRecord.java

@@ -91,4 +91,11 @@ public class StoreCashOutRecord extends Model<StoreCashOutRecord> {
     @TableField(value = "updated_user_id", fill = FieldFill.INSERT_UPDATE)
     private Integer updatedUserId;
 
+    @ApiModelProperty(value = "审批备注")
+    @TableField(value = "comments")
+    private String comments;
+
+    @ApiModelProperty(value = "结算账户")
+    @TableField(value = "settlement_account")
+    private String settlementAccount;
 }

+ 16 - 0
alien-entity/src/main/java/shop/alien/entity/store/vo/StoreIncomeDetailsRecordVo.java

@@ -7,6 +7,7 @@ import io.swagger.annotations.ApiModelProperty;
 import lombok.Data;
 import shop.alien.entity.store.StoreIncomeDetailsRecord;
 
+import java.math.BigDecimal;
 import java.util.Date;
 import java.util.List;
 
@@ -55,5 +56,20 @@ public class StoreIncomeDetailsRecordVo extends StoreIncomeDetailsRecord {
     @ApiModelProperty(value = "商家名称")
     String storeName;
 
+    @ApiModelProperty(value = "优惠券收益")
+    String couponMoney;
+
+    @ApiModelProperty(value = "团购收益")
+    String groupMoney;
+
+    @ApiModelProperty(value = "券数量")
+    Integer couponCount;
+
+    @ApiModelProperty(value = "退款标识")
+    String refundType;
+
+    @ApiModelProperty(value = "退款金额")
+    BigDecimal refundMoney;
+
     List<StoreIncomeDetailsRecordVo> incomeDetailsRecordVoList;
 }

+ 3 - 2
alien-entity/src/main/java/shop/alien/mapper/StoreIncomeDetailsRecordMapper.java

@@ -19,12 +19,13 @@ import java.util.List;
 public interface StoreIncomeDetailsRecordMapper extends BaseMapper<StoreIncomeDetailsRecord> {
 
     @Select("select income.id, income.money, income.commission, income.created_time checkTime, uorder.created_time orderTime, date_add(income.created_time, interval 3 day) incomeTime, " +
-            "       income_type, uorder.quan_code, coupon.name couponName, store.store_name " +
+            "       income_type, uorder.quan_code, coupon.name couponName, store.store_name, if(lfo.store_id is not null ,'true','false') refundType " +
             "from store_income_details_record income " +
             "join store_info store on store.id = income.store_id " +
             "left join life_user_order uorder on uorder.id = income.user_order_id " +
             "left join life_coupon coupon on coupon.id = uorder.quan_id " +
-            "where income.created_time between '2025-02-23 00:00:00' and '2025-02-23 23:59:59' ")
+            "left join life_refund_order lfo on coupon.id = lfo.order_id and lfo.status = 0 " +
+            "${ew.customSqlSegment}")
     List<StoreIncomeDetailsRecordVo> getIncomeList(@Param(Constants.WRAPPER) QueryWrapper<StoreIncomeDetailsRecordVo> wrapper);
 
 }

+ 9 - 9
alien-store/src/main/java/shop/alien/store/controller/StoreCashOutRecordController.java

@@ -4,10 +4,7 @@ import io.swagger.annotations.*;
 import lombok.RequiredArgsConstructor;
 import lombok.extern.slf4j.Slf4j;
 import org.springframework.format.annotation.DateTimeFormat;
-import org.springframework.web.bind.annotation.CrossOrigin;
-import org.springframework.web.bind.annotation.GetMapping;
-import org.springframework.web.bind.annotation.RequestMapping;
-import org.springframework.web.bind.annotation.RestController;
+import org.springframework.web.bind.annotation.*;
 import shop.alien.entity.result.R;
 import shop.alien.entity.store.vo.StoreCashOutRecordVo;
 import shop.alien.store.service.StoreCashOutRecordService;
@@ -37,12 +34,15 @@ public class StoreCashOutRecordController {
             @ApiImplicitParam(name = "size", value = "分页条数", dataType = "Integer", paramType = "query"),
             @ApiImplicitParam(name = "storeId", value = "商家id", dataType = "Integer", paramType = "query", required = true),
             @ApiImplicitParam(name = "cashOutStartTime", value = "提现开始时间", dataType = "Integer", paramType = "query"),
-            @ApiImplicitParam(name = "cashOutEndTime", value = "提现结束时间", dataType = "Integer", paramType = "query")})
+            @ApiImplicitParam(name = "cashOutEndTime", value = "提现结束时间", dataType = "Integer", paramType = "query"),
+            @ApiImplicitParam(name = "paymentStatus", value = "提现状态", dataType = "Integer", paramType = "query")
+    })
     @GetMapping("/getCashOutRecordList")
-    public R<StoreCashOutRecordVo> getCashOutRecordList(Integer storeId,
-                                                        @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss") Date cashOutStartTime,
-                                                        @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss") Date cashOutEndTime) {
-        return R.data(storeCashOutRecordService.getCashOutRecordList(storeId, cashOutStartTime, cashOutEndTime));
+    public R<StoreCashOutRecordVo> getCashOutRecordList(@RequestParam(defaultValue = "1") Integer page, @RequestParam(defaultValue = "10") Integer size, Integer storeId,
+                                                        @DateTimeFormat(pattern = "yyyy-MM-dd 00:00:00") String cashOutStartTime,
+                                                        @DateTimeFormat(pattern = "yyyy-MM-dd 23:59:59") String cashOutEndTime,
+                                                        String paymentStatus) {
+        return R.data(storeCashOutRecordService.getCashOutRecordList(storeId, cashOutStartTime, cashOutEndTime,page,size,paymentStatus));
     }
 
     @ApiOperation("提现详情")

+ 19 - 14
alien-store/src/main/java/shop/alien/store/controller/StoreIncomeDetailsRecordController.java

@@ -32,19 +32,16 @@ public class StoreIncomeDetailsRecordController {
 
     private final ScheduledTask scheduledTask;
 
-    @ApiOperation("提现-提现全部")
+    @ApiOperation("提现-提现全部/部分提现")
     @ApiOperationSupport(order = 1)
     @ApiImplicitParams({
             @ApiImplicitParam(name = "storeId", value = "门店id", dataType = "Integer", paramType = "query", required = true),
-            @ApiImplicitParam(name = "payPassword", value = "支付密码", dataType = "String", paramType = "query", required = true)
+            @ApiImplicitParam(name = "payPassword", value = "支付密码", dataType = "String", paramType = "query", required = true),
+            @ApiImplicitParam(name = "withdrawalMoney", value = "提现金额", dataType = "Integer", paramType = "query", required = true)
     })
     @GetMapping("/cashOut")
-    public R<Boolean> cashOut(Integer storeId, String payPassword) {
-        String s = storeIncomeDetailsRecordService.cashOut(storeId, payPassword);
-        if ("success".equals(s)) {
-            return R.success("提现成功");
-        }
-        return R.fail(s);
+    public R cashOut(Integer storeId, String payPassword, Integer withdrawalMoney) {
+        return storeIncomeDetailsRecordService.cashOut(storeId, payPassword, withdrawalMoney);
     }
 
     @ApiOperation("新增收入-手续费一单一算")
@@ -72,11 +69,17 @@ public class StoreIncomeDetailsRecordController {
     @ApiImplicitParams({
             @ApiImplicitParam(name = "storeId", value = "门店id", dataType = "Integer", paramType = "query", required = true),
             @ApiImplicitParam(name = "incomeType", value = "收入类型, 0:主页, 1:优惠券, 2:代金券, 3:套餐, 4:联名卡", dataType = "Integer", paramType = "query"),
-            @ApiImplicitParam(name = "paymentType", value = "账期类型,0:未到,1:已到", dataType = "Integer", paramType = "query")
+            @ApiImplicitParam(name = "paymentType", value = "账期类型,0:未到,1:已到", dataType = "Integer", paramType = "query"),
+            @ApiImplicitParam(name = "startTime", value = "开始时间", dataType = "Date", paramType = "query"),
+            @ApiImplicitParam(name = "endTime", value = "结束时间", dataType = "Date", paramType = "query"),
+            @ApiImplicitParam(name = "page", value = "页数", dataType = "String", paramType = "query"),
+            @ApiImplicitParam(name = "size", value = "条数", dataType = "String", paramType = "query")
     })
     @GetMapping("/noYetPayment")
-    public R<JSONObject> noYetPayment(Integer storeId, Integer incomeType, Integer paymentType) {
-        return R.data(storeIncomeDetailsRecordService.noYetPayment(storeId, incomeType, paymentType));
+    public R<JSONObject> noYetPayment(Integer storeId, Integer incomeType, Integer paymentType, String startTime, String endTime,
+                                      @RequestParam(value = "page", defaultValue = "1") int page,
+                                      @RequestParam(value = "size", defaultValue = "10") int size) {
+        return R.data(storeIncomeDetailsRecordService.noYetPayment(storeId, incomeType, paymentType,startTime,endTime, page, size));
     }
 
     @ApiOperation("账户余额-总金额, 可提现金额")
@@ -94,11 +97,13 @@ public class StoreIncomeDetailsRecordController {
     @ApiImplicitParams({
             @ApiImplicitParam(name = "storeId", value = "门店id", dataType = "Integer", paramType = "query", required = true),
             @ApiImplicitParam(name = "date", value = "日期", dataType = "String", paramType = "query", required = true),
-            @ApiImplicitParam(name = "incomeType", value = "收入类型, 0:主页, 1:优惠券, 2:代金券, 3:套餐, 4:联名卡", dataType = "Integer", paramType = "query")
+            @ApiImplicitParam(name = "incomeType", value = "收入类型, 0:主页, 1:优惠券, 2:代金券, 3:套餐, 4:联名卡", dataType = "Integer", paramType = "query"),
+            @ApiImplicitParam(name = "page", value = "分页页数", dataType = "Integer", paramType = "query"),
+            @ApiImplicitParam(name = "size", value = "分页条数", dataType = "Integer", paramType = "query")
     })
     @GetMapping("/groupIncome")
-    public R<StoreIncomeDetailsRecordVo> groupIncome(Integer storeId, String date, Integer incomeType) {
-        return R.data(storeIncomeDetailsRecordService.groupIncome(storeId, date, incomeType));
+    public R<StoreIncomeDetailsRecordVo> groupIncome(Integer storeId, String date, Integer incomeType,@RequestParam(defaultValue = "1") Integer page, @RequestParam(defaultValue = "10") Integer size) {
+        return R.data(storeIncomeDetailsRecordService.groupIncome(storeId, date, incomeType,page,size));
     }
 
     //团购详情

+ 10 - 0
alien-store/src/main/java/shop/alien/store/controller/StoreUserController.java

@@ -410,4 +410,14 @@ public class StoreUserController {
         storeUserService.deleteStoreAccountInfo(storeUserVo);
         return R.success("删除成功");
     }
+
+    /**
+     * 根据id判断是否有支付密码
+     */
+    @ApiOperation("是否有支付密码")
+    @GetMapping("/havePayPassword")
+    public R<Boolean> havePayPassword(@RequestParam String storeUserId,@RequestParam(required = false) String password){
+        log.info("StoreUserController.havePayPassword?storeUserId={},password={}",storeUserId,password);
+        return storeUserService.havePayPassword(storeUserId,password);
+    }
 }

+ 1 - 1
alien-store/src/main/java/shop/alien/store/service/StoreCashOutRecordService.java

@@ -17,7 +17,7 @@ public interface StoreCashOutRecordService extends IService<StoreCashOutRecord>
 
     JSONObject getCanCashOutMoney(Integer storeId);
 
-    StoreCashOutRecordVo getCashOutRecordList(Integer storeId, Date cashOutStartTime, Date cashOutEndTime);
+    StoreCashOutRecordVo getCashOutRecordList(Integer storeId, String cashOutStartTime, String cashOutEndTime, Integer page, Integer size, String paymentStatus);
 
     StoreCashOutRecordVo getCashOutRecordById(Integer id);
 

+ 5 - 3
alien-store/src/main/java/shop/alien/store/service/StoreIncomeDetailsRecordService.java

@@ -2,6 +2,7 @@ package shop.alien.store.service;
 
 import com.alibaba.fastjson.JSONObject;
 import com.baomidou.mybatisplus.extension.service.IService;
+import shop.alien.entity.result.R;
 import shop.alien.entity.store.StoreIncomeDetailsRecord;
 import shop.alien.entity.store.vo.StoreIncomeDetailsRecordVo;
 
@@ -20,9 +21,10 @@ public interface StoreIncomeDetailsRecordService extends IService<StoreIncomeDet
      *
      * @param storeId     门店id
      * @param payPassword 支付密码
+     * @param money 提现金额
      * @return 是否成功
      */
-    String cashOut(Integer storeId, String payPassword);
+    R cashOut(Integer storeId, String payPassword, Integer money);
 
     /**
      * 今日收益
@@ -40,7 +42,7 @@ public interface StoreIncomeDetailsRecordService extends IService<StoreIncomeDet
      * @param paymentType 账期类型,0:未到,1:已到
      * @return 未到账期
      */
-    JSONObject noYetPayment(Integer storeId, Integer incomeType, Integer paymentType);
+    JSONObject noYetPayment(Integer storeId, Integer incomeType, Integer paymentType, String startTime, String endTime, int page, int size);
 
     /**
      * 账户余额
@@ -58,6 +60,6 @@ public interface StoreIncomeDetailsRecordService extends IService<StoreIncomeDet
      * @param incomeType 收入类型, 0:主页, 1:优惠券, 2:代金券, 3:套餐, 4:联名卡
      * @return 团购收益
      */
-    StoreIncomeDetailsRecordVo groupIncome(Integer storeId, String date, Integer incomeType);
+    StoreIncomeDetailsRecordVo groupIncome(Integer storeId, String date, Integer incomeType, Integer page, Integer size);
 
 }

+ 2 - 0
alien-store/src/main/java/shop/alien/store/service/StoreUserService.java

@@ -189,4 +189,6 @@ public interface StoreUserService extends IService<StoreUser> {
      * @return
      */
     List<String> getIds(String name, String phone);
+
+    R<Boolean> havePayPassword(String storeUserId, String password);
 }

+ 11 - 2
alien-store/src/main/java/shop/alien/store/service/impl/LifeCouponServiceImpl.java

@@ -2,6 +2,7 @@ package shop.alien.store.service.impl;
 
 import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
 import com.baomidou.mybatisplus.core.conditions.update.LambdaUpdateWrapper;
+import com.baomidou.mybatisplus.core.conditions.update.UpdateWrapper;
 import com.baomidou.mybatisplus.core.metadata.IPage;
 import com.baomidou.mybatisplus.core.toolkit.ObjectUtils;
 import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
@@ -48,6 +49,8 @@ public class LifeCouponServiceImpl extends ServiceImpl<LifeCouponMapper, LifeCou
 
     private final EssentialHolidayComparisonMapper essentialHolidayComparisonMapper;
 
+    private final StoreUserMapper storeUserMapper;
+
     @Override
     public boolean addOrUpdateCoupon(LifeCoupon lifeCoupon) {
 
@@ -168,11 +171,12 @@ public class LifeCouponServiceImpl extends ServiceImpl<LifeCouponMapper, LifeCou
         LambdaUpdateWrapper<LifeCoupon> couponWrapper = new LambdaUpdateWrapper<>();
         couponWrapper.eq(LifeCoupon::getId, order.getQuanId());
         LifeCoupon coupon = lifeCouponMapper.selectOne(couponWrapper);
-
+        // TODO 抽成比例应该从商户里取
         BigDecimal amounts = new BigDecimal(order.getFinalPrice()).multiply(new BigDecimal(100));
         BigDecimal commission = amounts.multiply(new BigDecimal(0.04)).setScale(0, RoundingMode.HALF_UP);
         BigDecimal money = amounts.subtract(commission);
 
+        // 插入收入明细表数据
         StoreIncomeDetailsRecord record = new StoreIncomeDetailsRecord();
         record.setStoreId(Integer.parseInt(storeId));
         record.setUserOrderId(Integer.parseInt(order.getId()));
@@ -181,7 +185,12 @@ public class LifeCouponServiceImpl extends ServiceImpl<LifeCouponMapper, LifeCou
         record.setCommission(commission.intValue());
         record.setMoney(money.intValue());
         storeIncomeDetailsRecordMapper.insert(record);
-
+        // 店铺账户余额增加
+        UpdateWrapper<StoreUser> updateWrapper = new UpdateWrapper();
+        updateWrapper.eq("store_id",storeId);
+        updateWrapper.eq("delete_flag",0);
+        updateWrapper.setSql("money = money + "+money);
+        storeUserMapper.update(null,updateWrapper);
         //发放好友优惠券
         LifeDiscountCouponStoreFriendDto lifeDiscountCouponStoreFriendDto = new LifeDiscountCouponStoreFriendDto();
         lifeDiscountCouponStoreFriendDto.setOrderId(Integer.parseInt(order.getId()));

+ 9 - 5
alien-store/src/main/java/shop/alien/store/service/impl/StoreCashOutRecordServiceImpl.java

@@ -3,6 +3,7 @@ package shop.alien.store.service.impl;
 import com.alibaba.fastjson2.JSONArray;
 import com.alibaba.fastjson2.JSONObject;
 import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
+import com.baomidou.mybatisplus.core.metadata.IPage;
 import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
 import lombok.RequiredArgsConstructor;
 import org.springframework.beans.BeanUtils;
@@ -13,10 +14,12 @@ import shop.alien.entity.store.vo.StoreCashOutRecordVo;
 import shop.alien.mapper.StoreCashOutRecordMapper;
 import shop.alien.mapper.StoreIncomeDetailsRecordMapper;
 import shop.alien.store.service.StoreCashOutRecordService;
+import shop.alien.util.common.ListToPage;
 
 import java.math.BigDecimal;
 import java.math.RoundingMode;
 import java.time.ZoneId;
+import java.util.ArrayList;
 import java.util.Date;
 import java.util.List;
 import java.util.Map;
@@ -41,16 +44,17 @@ public class StoreCashOutRecordServiceImpl extends ServiceImpl<StoreCashOutRecor
     }
 
     @Override
-    public StoreCashOutRecordVo getCashOutRecordList(Integer storeId, Date cashOutStartTime, Date cashOutEndTime) {
+    public StoreCashOutRecordVo getCashOutRecordList(Integer storeId, String cashOutStartTime, String cashOutEndTime, Integer page, Integer size, String paymentStatus) {
         LambdaQueryWrapper<StoreCashOutRecord> wrapper = new LambdaQueryWrapper<>();
         wrapper.eq(StoreCashOutRecord::getStoreId, storeId);
-        wrapper.le(null != cashOutStartTime, StoreCashOutRecord::getCreatedTime, cashOutStartTime);
-        wrapper.ge(null != cashOutEndTime, StoreCashOutRecord::getCreatedTime, cashOutEndTime);
+        wrapper.eq(null != paymentStatus, StoreCashOutRecord::getPaymentStatus, paymentStatus);
+        wrapper.le(null != cashOutEndTime, StoreCashOutRecord::getCreatedTime, cashOutEndTime + " 23:59:59");
+        wrapper.ge(null != cashOutStartTime, StoreCashOutRecord::getCreatedTime, cashOutStartTime + " 00:00:00" );
         wrapper.orderByDesc(StoreCashOutRecord::getCreatedTime);
         List<StoreCashOutRecord> recordList = storeCashOutRecordMapper.selectList(wrapper);
-
+        IPage<StoreCashOutRecord> storeCashOutRecordIPage = ListToPage.setPage(recordList, page, size);
         StoreCashOutRecordVo vo = new StoreCashOutRecordVo();
-        vo.setCashOutRecordList(recordList);
+        vo.setCashOutRecordList( storeCashOutRecordIPage.getRecords());
         vo.setCashOutAllMoney(new BigDecimal(recordList.stream().mapToInt(StoreCashOutRecord::getMoney).sum()).divide(new BigDecimal(100), 0, RoundingMode.HALF_UP));
         vo.setCashOutNum(recordList.size());
         return vo;

+ 119 - 20
alien-store/src/main/java/shop/alien/store/service/impl/StoreIncomeDetailsRecordServiceImpl.java

@@ -1,18 +1,20 @@
 package shop.alien.store.service.impl;
 
+import cn.hutool.core.bean.BeanUtil;
 import com.alibaba.fastjson.JSON;
 import com.alibaba.fastjson.JSONArray;
 import com.alibaba.fastjson.JSONObject;
 import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
 import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
+import com.baomidou.mybatisplus.core.metadata.IPage;
+import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
 import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
 import lombok.RequiredArgsConstructor;
+import org.springframework.beans.BeanUtils;
 import org.springframework.stereotype.Service;
 import org.springframework.transaction.annotation.Transactional;
-import shop.alien.entity.store.StoreAliPayLog;
-import shop.alien.entity.store.StoreCashOutRecord;
-import shop.alien.entity.store.StoreIncomeDetailsRecord;
-import shop.alien.entity.store.StoreUser;
+import shop.alien.entity.result.R;
+import shop.alien.entity.store.*;
 import shop.alien.entity.store.vo.StoreIncomeDetailsRecordVo;
 import shop.alien.mapper.StoreCashOutRecordMapper;
 import shop.alien.mapper.StoreIncomeDetailsRecordMapper;
@@ -21,11 +23,15 @@ import shop.alien.store.service.StoreIncomeDetailsRecordService;
 import shop.alien.store.service.StoreUserService;
 import shop.alien.store.util.ali.AliApi;
 import shop.alien.util.common.DateUtils;
+import shop.alien.util.common.ListToPage;
 
 import java.math.BigDecimal;
 import java.math.RoundingMode;
+import java.text.ParseException;
 import java.text.SimpleDateFormat;
 import java.time.LocalDate;
+import java.time.LocalDateTime;
+import java.time.LocalTime;
 import java.time.ZoneId;
 import java.util.*;
 import java.util.stream.Collectors;
@@ -55,13 +61,14 @@ public class StoreIncomeDetailsRecordServiceImpl extends ServiceImpl<StoreIncome
      *
      * @param storeId     门店id
      * @param payPassword 支付密码
+     * @param withdrawalMoney 提现金额
      * @return 是否成功
      */
     @Transactional
     @Override
-    public String cashOut(Integer storeId, String payPassword) {
+    public R cashOut(Integer storeId, String payPassword, Integer withdrawalMoney) {
         StoreUser storeUser = storeUserMapper.selectOne(new LambdaQueryWrapper<StoreUser>().eq(StoreUser::getStoreId, storeId).eq(StoreUser::getPayPassword, payPassword));
-        if (storeUser != null) {
+        /*if (storeUser != null) {
             //查询可用账单(大于创建时间3天)
             LambdaQueryWrapper<StoreIncomeDetailsRecord> wrapper = new LambdaQueryWrapper<>();
             //当前时间-3天大于创建时间
@@ -114,8 +121,37 @@ public class StoreIncomeDetailsRecordServiceImpl extends ServiceImpl<StoreIncome
                 return "支付宝转账失败";
             }
             return "账单未到可提现时间";
+        }*/
+        if ( null != storeUser){
+            if( storeUser.getMoney() >= withdrawalMoney){
+                //调用支付宝转账
+                BigDecimal decimal = new BigDecimal(withdrawalMoney);
+                BigDecimal divide = decimal.divide(new BigDecimal(100), 2, RoundingMode.HALF_UP);
+                if (Double.parseDouble(divide.toString()) < 0.10) {
+                    return R.fail("金额不能小于0.1元");
+                }
+                //增加提现记录
+                StoreCashOutRecord storeCashOutRecord = new StoreCashOutRecord();
+                storeCashOutRecord.setStoreId(storeId);
+//                storeCashOutRecord.setOrderNo(pay.getOutBizNo());
+                storeCashOutRecord.setMoney(withdrawalMoney);
+                // 手续费不是减过了吗
+//                storeCashOutRecord.setCommission(commission);
+                storeCashOutRecord.setCashOutType(0);
+//                storeCashOutRecord.setAliOrderNo(pay.getOrderId());
+                storeCashOutRecord.setPaymentDate(new Date());
+                storeCashOutRecord.setPaymentStatus(0);
+                storeCashOutRecord.setDeleteFlag(0);
+//                storeCashOutRecord.setIncomeStartTime(startDate);
+//                storeCashOutRecord.setIncomeEndTime(endDate);
+                storeCashOutRecordMapper.insert(storeCashOutRecord);
+                //减少账户余额
+                storeUserMapper.updateById(new StoreUser(storeUser.getId(), storeUser.getMoney() - withdrawalMoney));
+                return R.data(storeCashOutRecord);
+            }
+            return R.fail("余额不足");
         }
-        return "支付密码错误";
+        return R.fail("支付密码错误");
     }
 
     /**
@@ -146,17 +182,19 @@ public class StoreIncomeDetailsRecordServiceImpl extends ServiceImpl<StoreIncome
      * @return 未到账期
      */
     @Override
-    public JSONObject noYetPayment(Integer storeId, Integer incomeType, Integer paymentType) {
+    public JSONObject noYetPayment(Integer storeId, Integer incomeType, Integer paymentType, String startTime, String endTime, int page, int size) {
         LambdaQueryWrapper<StoreIncomeDetailsRecord> wrapper = new LambdaQueryWrapper<>();
         JSONObject jsonObject = new JSONObject();
         Date now = new Date();
         SimpleDateFormat df = new SimpleDateFormat("yyyy-MM-dd");
         if (paymentType == 0) {
+            wrapper.isNull(StoreIncomeDetailsRecord::getCashOutId);
             //未到账期, 当前时间-3天大于创建时间
             wrapper.gt(StoreIncomeDetailsRecord::getCreatedTime, DateUtils.calcDays(new Date(), -3));
             Date startDate = DateUtils.calcDays(now, -3);
             jsonObject.put("date", df.format(startDate) + " ~ " + df.format(now));
         } else {
+            wrapper.isNotNull(StoreIncomeDetailsRecord::getCashOutId);
             //已到账期, 当前时间-4~27天大于创建时间
             wrapper.between(StoreIncomeDetailsRecord::getCreatedTime, DateUtils.calcDays(new Date(), -27), DateUtils.calcDays(new Date(), -4));
             Date startDate = DateUtils.calcDays(now, -27);
@@ -164,23 +202,56 @@ public class StoreIncomeDetailsRecordServiceImpl extends ServiceImpl<StoreIncome
             jsonObject.put("date", df.format(startDate) + " ~ " + df.format(endDate));
         }
         //未绑定提现记录的
-        wrapper.isNull(StoreIncomeDetailsRecord::getCashOutId)
-                .eq(null != incomeType, StoreIncomeDetailsRecord::getIncomeType, incomeType)
+        LocalDate startDate = LocalDate.parse(startTime);
+        LocalDate endDate = LocalDate.parse(endTime);
+        // 创建当天的开始和结束时间点
+        LocalDateTime startOfDay = startDate.atStartOfDay();
+        LocalDateTime endOfDay = endDate.atTime(LocalTime.MAX);
+        wrapper.between(StoreIncomeDetailsRecord::getCreatedTime,startOfDay,endOfDay)
                 .orderByDesc(StoreIncomeDetailsRecord::getCreatedTime);
+        if(null != incomeType) {
+            if (0 == incomeType) {
+                wrapper.in(StoreIncomeDetailsRecord::getIncomeType, "2", "3");
+            } else {
+                wrapper.eq(StoreIncomeDetailsRecord::getIncomeType, incomeType);
+            }
+        }
+        // 计算总钱数
         List<StoreIncomeDetailsRecord> list = this.list(wrapper);
-        Map<String, Integer> groupedByCreatedTime = list.stream().collect(
+/*        Map<String, Integer> groupedByCreatedTime = list.stream().collect(
                 Collectors.groupingBy(
                         item -> item.getCreatedTime().toInstant().atZone(ZoneId.systemDefault()).toLocalDate().toString(),
                         Collectors.summingInt(StoreIncomeDetailsRecord::getMoney)));
-
+        // 分别计算日期下优惠券和团购的钱数
+        Map<String, Integer> groupedByCreatedTimeAndType = list.stream().collect(
+                Collectors.groupingBy(
+                        item -> item.getCreatedTime().toInstant().atZone(ZoneId.systemDefault()).toLocalDate().toString().concat("-").concat(item.getIncomeType().toString()),
+                        Collectors.summingInt(StoreIncomeDetailsRecord::getMoney)));
         List<StoreIncomeDetailsRecordVo> resultList = new ArrayList<>();
         groupedByCreatedTime.forEach((key, value) -> {
             StoreIncomeDetailsRecordVo vo = new StoreIncomeDetailsRecordVo();
+            // 手动拼接key判断
+            if( groupedByCreatedTimeAndType.containsKey(key.concat("-2")) ){
+                vo.setCouponMoney(new BigDecimal(groupedByCreatedTimeAndType.get(key.concat("-2"))).divide(new BigDecimal(100), 2, RoundingMode.HALF_UP).toString());
+            }
+            if( groupedByCreatedTimeAndType.containsKey(key.concat("-3")) ){
+                vo.setGroupMoney(new BigDecimal(groupedByCreatedTimeAndType.get(key.concat("-3"))).divide(new BigDecimal(100), 2, RoundingMode.HALF_UP).toString());
+            }
+
             vo.setMoneyStr(new BigDecimal(value).divide(new BigDecimal(100), 2, RoundingMode.HALF_UP).toString());
             vo.setDate(key);
             resultList.add(vo);
-        });
-        jsonObject.put("data", resultList);
+        });*/
+        List<StoreIncomeDetailsRecordVo> resultList = new ArrayList<>();
+        for (StoreIncomeDetailsRecord storeIncomeDetailsRecord : list) {
+            StoreIncomeDetailsRecordVo vo = new StoreIncomeDetailsRecordVo();
+            BeanUtils.copyProperties(storeIncomeDetailsRecord, vo);
+            vo.setMoneyStr(new BigDecimal(vo.getMoney()).divide(new BigDecimal(100), 2, RoundingMode.HALF_UP).toString());
+            String format = df.format(vo.getCreatedTime());
+            vo.setDate(format);
+            resultList.add(vo);
+        }
+        jsonObject.put("data", ListToPage.setPage(resultList, page, size));
         jsonObject.put("money", new BigDecimal(list.stream().mapToInt(StoreIncomeDetailsRecord::getMoney).sum()).divide(new BigDecimal(100), 2, RoundingMode.HALF_UP).toString());
         return jsonObject;
     }
@@ -207,8 +278,10 @@ public class StoreIncomeDetailsRecordServiceImpl extends ServiceImpl<StoreIncome
         List<StoreIncomeDetailsRecord> list = this.list(wrapper);
         int cashOutMoney = 0;
         cashOutMoney += list.stream().mapToInt(StoreIncomeDetailsRecord::getMoney).sum();
+        List<StoreCashOutRecord> storeCashOutRecords = storeCashOutRecordMapper.selectList(new QueryWrapper<StoreCashOutRecord>().eq("store_id", storeId).ne("payment_status", "2").eq("delete_flag", "0"));
+        int totalAmount = storeCashOutRecords.stream().collect(Collectors.summingInt(StoreCashOutRecord::getMoney));
         //可提现金额 4~27天
-        map.put("cashOutMoney", new BigDecimal(cashOutMoney).divide(new BigDecimal(100), 2, RoundingMode.HALF_UP).toString());
+        map.put("cashOutMoney", new BigDecimal(cashOutMoney).subtract(BigDecimal.valueOf(totalAmount)).divide(new BigDecimal(100), 2, RoundingMode.HALF_UP).toString());
         return map;
     }
 
@@ -221,13 +294,18 @@ public class StoreIncomeDetailsRecordServiceImpl extends ServiceImpl<StoreIncome
      * @return 团购收益
      */
     @Override
-    public StoreIncomeDetailsRecordVo groupIncome(Integer storeId, String date, Integer incomeType) {
+    public StoreIncomeDetailsRecordVo groupIncome(Integer storeId, String date, Integer incomeType, Integer page, Integer size) {
         LambdaQueryWrapper<StoreIncomeDetailsRecord> wrapper = new LambdaQueryWrapper<>();
         //当前时间-3天大于创建时间
         wrapper.between(StoreIncomeDetailsRecord::getCreatedTime, date + " 00:00:00", date + " 23:59:59")
                 //未绑定提现记录的
-                .isNull(StoreIncomeDetailsRecord::getCashOutId)
-                .eq(null != incomeType, StoreIncomeDetailsRecord::getIncomeType, incomeType);
+                .isNull(StoreIncomeDetailsRecord::getCashOutId);
+        if(null != incomeType && 0 == incomeType){
+            wrapper.in(StoreIncomeDetailsRecord::getIncomeType, "2","3");
+        } else {
+            wrapper.eq(StoreIncomeDetailsRecord::getIncomeType, incomeType);
+        }
+
         List<StoreIncomeDetailsRecord> list = this.list(wrapper);
         Integer allIncome = 0;
         Integer commission = 0;
@@ -263,10 +341,31 @@ public class StoreIncomeDetailsRecordServiceImpl extends ServiceImpl<StoreIncome
                 .eq("income.store_id", storeId)
                 .between("income.created_time", date + " 00:00:00", date + " 23:59:59")
                 .orderByDesc("income.created_time");
-        incomeWrapper.eq(null != incomeType, "income.income_type", incomeType);
+        if(null != incomeType) {
+            if (0 == incomeType) {
+                incomeWrapper.in("income_type", "2", "3");
+            } else {
+                incomeWrapper.eq("income_type", incomeType);
+            }
+        }
         List<StoreIncomeDetailsRecordVo> incomeDetailsRecordVoList = storeIncomeDetailsRecordMapper.getIncomeList(incomeWrapper);
-        vo.setIncomeDetailsRecordVoList(incomeDetailsRecordVoList);
+        Map<String, List<StoreIncomeDetailsRecordVo>> collect = incomeDetailsRecordVoList.stream().collect(Collectors.groupingBy(x -> x.getRefundType()));
 
+        vo.setIncomeDetailsRecordVoList(new ArrayList<>());
+        vo.setRefundMoney(new BigDecimal(0));
+        vo.setCouponCount(0);
+        if ( collect.containsKey("false")){
+            vo.setIncomeDetailsRecordVoList(ListToPage.setPage(incomeDetailsRecordVoList,page,size).getRecords());
+//                    ListToPage.setPage(
+//                            collect.get("false")
+//                                    .stream()
+//                                    .sorted(Comparator.comparing(StoreIncomeDetailsRecordVo::getCheckTime)
+//                                            .reversed()).collect(Collectors.toList()), page, size).getRecords());
+            vo.setCouponCount( collect.get("false").size() - (collect.containsKey("true") ? collect.get("true").size() : 0));
+        }
+        if( collect.containsKey("true") ){
+            vo.setRefundMoney(new BigDecimal(collect.get("true").stream().mapToInt(StoreIncomeDetailsRecordVo::getMoney).sum()).divide(new BigDecimal(100), 2, RoundingMode.HALF_UP));
+        }
         return vo;
     }
 }

+ 14 - 0
alien-store/src/main/java/shop/alien/store/service/impl/StoreUserServiceImpl.java

@@ -762,4 +762,18 @@ public class StoreUserServiceImpl extends ServiceImpl<StoreUserMapper, StoreUser
         return CollectionUtils.isEmpty(res) ? Arrays.asList("") : res;
     }
 
+    @Override
+    public R<Boolean> havePayPassword(String storeUserId,String password) {
+        StoreUser storeUser = storeUserMapper.selectById(storeUserId);
+        if (null == storeUser) {
+            return R.fail("未查询到用户");
+        }
+        if( null == storeUser.getPayPassword()){
+            return R.fail("false");
+        } else if(null != password){
+             return password.equals(storeUser.getPayPassword())? R.success("true"):R.fail("false");
+        }
+        return R.success("true");
+    }
+
 }

+ 5 - 1
alien-util/src/main/java/shop/alien/util/common/ListToPage.java

@@ -3,6 +3,7 @@ package shop.alien.util.common;
 import com.baomidou.mybatisplus.core.metadata.IPage;
 import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
 
+import java.util.ArrayList;
 import java.util.List;
 
 /**
@@ -32,7 +33,10 @@ public class ListToPage {
         iPage.setPages(pages);
         int fromIndex = (pageNum - 1) * pageSize;
         int toIndex = Math.min(pageNum * pageSize, list.size());
-        List<T> records = list.subList(fromIndex, toIndex);
+        List<T> records = new ArrayList<T>();
+        if(fromIndex <= toIndex && fromIndex >= 0){
+            records = list.subList(fromIndex, toIndex);
+        }
         iPage.setRecords(records);
         return iPage;
     }