Prechádzať zdrojové kódy

1订单完成超48小时自动分账
callAutoAccount(hCount, percent)---->订单结算状态:已结算+商户分账
mysql
##增加字段
alter table t_order add w_status int default 0 null comment '订单结算状态(0:未结算(默认) 1:待结算 2:已结算)' after n_status
2后台增加收入明细页
收入明细 列表接口开发 已完成,已调试
累计收入接口开发 已完成,已调试
3体现记录
提现记录 列表接口优化完成,已调试
导出功能接口开发完成,待调试
订单结算状态优化 字段[w_status ==>属性值wStatus]
订单生成:默认[未结算]
订单确认服务完成:变更为[待结算]
订单拒绝:重置为[未结算]
订单取消:重置为[未结算]
订单 技师完成服务的时间[endTime] 超过48小时 : 变更为[已结算] 并分账 划入余额
4商户端增加账户明细页
商户收益接口开发完成,[我的收益,待结算,已结算,已提现],已调试
商户收入明细列表接口开发完成,已调试
提现记录接口优化完成,已调试
5提现审核
PC端提现审核接口优化完成,已调试
WX端提现审核接口优化完成,已调试

yanwanli 1 týždeň pred
rodič
commit
a1625485e8
16 zmenil súbory, kde vykonal 827 pridanie a 27 odobranie
  1. 83 0
      nightFragrance-admin/src/main/java/com/ylx/web/controller/massage/TFinancialIncomeController.java
  2. 26 0
      nightFragrance-admin/src/main/java/com/ylx/web/controller/massage/TOrderController.java
  3. 76 10
      nightFragrance-admin/src/main/java/com/ylx/web/controller/massage/TTxRecordController.java
  4. 9 0
      nightFragrance-admin/src/main/resources/application-dev.yml
  5. 171 0
      nightFragrance-massage/src/main/java/com/ylx/massage/domain/TOrder.java
  6. 47 0
      nightFragrance-massage/src/main/java/com/ylx/massage/domain/TTxRecord.java
  7. 56 0
      nightFragrance-massage/src/main/java/com/ylx/massage/enums/OrderWStateEnum.java
  8. 2 1
      nightFragrance-massage/src/main/java/com/ylx/massage/enums/TTxRecordEnum.java
  9. 4 0
      nightFragrance-massage/src/main/java/com/ylx/massage/mapper/TOrderMapper.java
  10. 39 0
      nightFragrance-massage/src/main/java/com/ylx/massage/service/TOrderService.java
  11. 7 0
      nightFragrance-massage/src/main/java/com/ylx/massage/service/TTxRecordService.java
  12. 6 0
      nightFragrance-massage/src/main/java/com/ylx/massage/service/TWxUserService.java
  13. 216 10
      nightFragrance-massage/src/main/java/com/ylx/massage/service/impl/TOrderServiceImpl.java
  14. 31 0
      nightFragrance-massage/src/main/java/com/ylx/massage/service/impl/TTxRecordServiceImpl.java
  15. 24 0
      nightFragrance-massage/src/main/java/com/ylx/massage/task/massageTask.java
  16. 30 6
      nightFragrance-massage/src/main/resources/mapper/massage/TOrderMapper.xml

+ 83 - 0
nightFragrance-admin/src/main/java/com/ylx/web/controller/massage/TFinancialIncomeController.java

@@ -0,0 +1,83 @@
+package com.ylx.web.controller.massage;
+
+import com.alibaba.fastjson.JSON;
+import com.alibaba.fastjson.JSONObject;
+import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
+import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
+import com.ylx.common.annotation.Log;
+import com.ylx.common.core.controller.BaseController;
+import com.ylx.common.core.domain.R;
+import com.ylx.common.core.domain.model.LoginUser;
+import com.ylx.common.enums.BusinessType;
+import com.ylx.common.exception.ServiceException;
+import com.ylx.common.utils.StringUtils;
+import com.ylx.common.utils.poi.ExcelUtil;
+import com.ylx.massage.domain.OrderAllocationLog;
+import com.ylx.massage.domain.TJs;
+import com.ylx.massage.domain.TOrder;
+import com.ylx.massage.domain.vo.OrderAllocationResultVo;
+import com.ylx.massage.domain.vo.OrderVerificationVo;
+import com.ylx.massage.domain.vo.TechnicianAvailabilityVo;
+import com.ylx.massage.enums.Enumproject;
+import com.ylx.massage.enums.OrderStatusEnum;
+import com.ylx.massage.enums.OrderStatusEnumVo;
+import com.ylx.massage.service.OrderAllocationLogService;
+import com.ylx.massage.service.TJsService;
+import com.ylx.massage.service.TOrderService;
+import io.swagger.annotations.Api;
+import io.swagger.annotations.ApiOperation;
+import lombok.extern.slf4j.Slf4j;
+import org.springframework.beans.BeanUtils;
+import org.springframework.web.bind.annotation.*;
+
+import javax.annotation.Resource;
+import javax.servlet.http.HttpServletResponse;
+import java.math.BigDecimal;
+import java.time.LocalDateTime;
+import java.util.List;
+import java.util.Optional;
+import java.util.stream.Collectors;
+
+/**
+ * 订单表 前端控制器
+ */
+@RestController
+@Slf4j
+@Api(tags = {"财务管理"})
+@RequestMapping("api/financial/v1")
+public class TFinancialIncomeController extends BaseController {
+    @Resource
+    private TOrderService orderService;
+
+    /**
+     * PC收入明细
+     *
+     * @param page
+     * @param order
+     * @return R
+     */
+    @Log(title = "PC收入明细信息", businessType = BusinessType.OTHER)
+    @ApiOperation("PC收入明细信息")
+    @RequestMapping(value = "pc/getOrderIncome", method = RequestMethod.GET)
+    public R getPcOrderIncome(Page<TOrder> page, TOrder order) {
+        try {
+            LoginUser loginUser = this.getLoginUser();
+            log.info("登录用户信息:{}", JSON.toJSONString(loginUser));
+            order.setDeptId(loginUser.getDeptId().toString());
+            Page<TOrder> all = orderService.getPcOrderIncome(page, order);
+            return R.ok(all);
+        } catch (Exception e) {
+            e.printStackTrace();
+            throw new RuntimeException(e);
+        }
+    }
+
+    @Log(title = "订单信息", businessType = BusinessType.EXPORT)
+    @ApiOperation("导出")
+    @PostMapping(value = "pc/export")
+    public void export(HttpServletResponse response, Page<TOrder> page, TOrder param) {
+        Page<TOrder> all = orderService.getAll(page, param);
+        ExcelUtil<TOrder> util = new ExcelUtil<>(TOrder.class);
+        util.exportExcel(response, all.getRecords(), "订单");
+    }
+}

+ 26 - 0
nightFragrance-admin/src/main/java/com/ylx/web/controller/massage/TOrderController.java

@@ -14,6 +14,7 @@ import com.ylx.common.utils.StringUtils;
 import com.ylx.common.utils.poi.ExcelUtil;
 import com.ylx.massage.domain.TJs;
 import com.ylx.massage.domain.TOrder;
+import com.ylx.massage.domain.TWxUser;
 import com.ylx.massage.domain.vo.OrderAllocationResultVo;
 import com.ylx.massage.domain.vo.OrderVerificationVo;
 import com.ylx.massage.domain.vo.TechnicianAvailabilityVo;
@@ -36,7 +37,9 @@ import javax.annotation.Resource;
 import javax.servlet.http.HttpServletResponse;
 import java.math.BigDecimal;
 import java.time.LocalDateTime;
+import java.time.YearMonth;
 import java.util.List;
+import java.util.Map;
 import java.util.Optional;
 import java.util.stream.Collectors;
 
@@ -610,4 +613,27 @@ public class TOrderController extends BaseController {
             return R.fail("系统异常");
         }
     }
+
+    @Log(title = "累计营业收入,平台佣金收入,累计商家收入", businessType = BusinessType.OTHER)
+    @ApiOperation("累计营业收入,平台佣金收入,累计商家收入")
+    @RequestMapping(value = "pc/totalData", method = RequestMethod.GET)
+    public R totalData() {
+        log.info("累计营业收入,平台佣金收入,累计商家收入,查询开始:{}", LocalDateTime.now());
+        return R.ok(orderService.totalData());
+    }
+
+    @ApiOperation("商户收益,总额,待结算,已结算")
+    @RequestMapping(value = "wx/myIncome", method = RequestMethod.GET)
+    public R<Map<String, String>> myIncome(TWxUser user){
+        log.info("商户收益,总额,待结算,已结算,查询开始:{}", LocalDateTime.now());
+        return R.ok(orderService.myIncome(user));
+    }
+
+    @ApiOperation("商户收入明细")
+    @RequestMapping(value = "wx/myIncomeDetail", method = RequestMethod.GET)
+    public R<Map<YearMonth, List<TOrder>>> myIncomeDetail(TWxUser user, Integer wStatus){
+        log.info("商户收入明细,查询开始:{}", LocalDateTime.now());
+        return R.ok(orderService.myIncomeDetail(user, wStatus));
+    }
+
 }

+ 76 - 10
nightFragrance-admin/src/main/java/com/ylx/web/controller/massage/TTxRecordController.java

@@ -1,24 +1,30 @@
 package com.ylx.web.controller.massage;
 
+import cn.hutool.core.collection.CollectionUtil;
 import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
 import com.baomidou.mybatisplus.core.toolkit.StringUtils;
 import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
+import com.ylx.common.annotation.Log;
 import com.ylx.common.core.controller.BaseController;
 import com.ylx.common.core.domain.R;
+import com.ylx.common.enums.BusinessType;
 import com.ylx.common.exception.ServiceException;
+import com.ylx.common.utils.poi.ExcelUtil;
+import com.ylx.massage.domain.TOrder;
 import com.ylx.massage.domain.TTxRecord;
 import com.ylx.massage.service.TTxRecordService;
 import io.swagger.annotations.Api;
 import io.swagger.annotations.ApiOperation;
 import lombok.extern.slf4j.Slf4j;
-import org.springframework.web.bind.annotation.RequestBody;
-import org.springframework.web.bind.annotation.RequestMapping;
-import org.springframework.web.bind.annotation.RequestMethod;
-import org.springframework.web.bind.annotation.RestController;
+import org.springframework.web.bind.annotation.*;
 
 
 import javax.annotation.Resource;
-import java.util.List;
+import javax.servlet.http.HttpServletResponse;
+import java.time.LocalDateTime;
+import java.time.YearMonth;
+import java.util.*;
+import java.util.stream.Collectors;
 
 /**
  * 提现表 前端控制器
@@ -71,6 +77,7 @@ public class TTxRecordController extends BaseController {
     @ApiOperation("审核通过/驳回")
     @RequestMapping(value = "wx/auditing", method = RequestMethod.POST)
     public R auditing(@RequestBody TTxRecord record) {
+        log.info("wx端审核通过/驳回  开始:{}", LocalDateTime.now());
         try {
             return R.ok(recordService.auditing(record));
         } catch (ServiceException s) {
@@ -84,6 +91,42 @@ public class TTxRecordController extends BaseController {
     }
 
     /**
+     * pc端提现 手动输入:税率 扣除税费
+     * @param record
+     * @return
+     */
+    @ApiOperation("审核通过/驳回")
+    @RequestMapping(value = "pc/auditing", method = RequestMethod.POST)
+    public R pcAuditing(@RequestBody TTxRecord record) {
+        log.info("pc端审核通过/驳回  开始:{}", LocalDateTime.now());
+        try {
+            return R.ok(recordService.auditing(record));
+        } catch (ServiceException s) {
+            log.error(s.getMessage());
+            return R.fail(s.getMessage());
+        } catch (Exception e) {
+            StackTraceElement stackTraceElement= e.getStackTrace()[0];
+            log.error("系统出错,错误信息:"+ e +" at "+stackTraceElement.getClassName()+"."+stackTraceElement.getMethodName()+":"+stackTraceElement.getLineNumber());
+            return R.fail("系统异常");
+        }
+    }
+
+    /**
+     * 导出提现信息
+     * @param response
+     * @param page
+     * @param record
+     */
+    @Log(title = "提现信息", businessType = BusinessType.EXPORT)
+    @ApiOperation("导出")
+    @PostMapping(value = "pc/export")
+    public void export(HttpServletResponse response, Page<TTxRecord> page, TTxRecord record) {
+        Page<TTxRecord> pageRecord = recordService.page(page, record, this.getDeptId());
+        ExcelUtil<TTxRecord> util = new ExcelUtil<>(TTxRecord.class);
+        util.exportExcel(response, pageRecord.getRecords(), "提现信息");
+    }
+
+     /**
      * 管理员获取提现信息
      *
      * @return
@@ -96,12 +139,17 @@ public class TTxRecordController extends BaseController {
         tTxRecordLambdaQueryWrapper.eq(null != txRecord.getnStatus(), TTxRecord::getnStatus, txRecord.getnStatus()).
                 eq(StringUtils.isNotBlank(txRecord.getcPhone()), TTxRecord::getcPhone, txRecord.getcPhone()).
                 eq(StringUtils.isNotBlank(txRecord.getcName()), TTxRecord::getcName, txRecord.getcName()).
-                eq(StringUtils.isNotBlank(txRecord.getcOpenId()), TTxRecord::getcOpenId, txRecord.getcOpenId()).
-                orderByDesc(TTxRecord::getDtCreateTime);
+                eq(txRecord.getnStatus() != null, TTxRecord::getnStatus, txRecord.getnStatus()).
+                eq(StringUtils.isNotBlank(txRecord.getcOpenId()), TTxRecord::getcOpenId, txRecord.getcOpenId());
+        if(txRecord.getStartTime() != null && txRecord.getEndTime() != null) {
+            tTxRecordLambdaQueryWrapper.ge(TTxRecord::getDtCreateTime, txRecord.getStartTime()).
+                        le(StringUtils.isNotBlank(txRecord.getcOpenId()), TTxRecord::getcOpenId, txRecord.getcOpenId());
+        }
+        tTxRecordLambdaQueryWrapper.orderByDesc(TTxRecord::getDtCreateTime);
         if(null != this.getDeptId() && this.getDeptId() != 100){
             tTxRecordLambdaQueryWrapper.eq(TTxRecord::getDeptId,this.getDeptId());
         }
-        return R.ok(recordService.page(page, tTxRecordLambdaQueryWrapper));
+        return R.ok(recordService.page(page, txRecord, this.getDeptId()));
     }
 
 
@@ -112,10 +160,28 @@ public class TTxRecordController extends BaseController {
      */
     @ApiOperation("商家获取提现记录")
     @RequestMapping(value = "wx/select", method = RequestMethod.GET)
-    public R<List<TTxRecord>> wxSelect(TTxRecord txRecord) {
+    public R<Map<YearMonth, List<TTxRecord>>> wxSelect(TTxRecord txRecord) {
+        log.info("商家获取提现记录,查询开始:{}", LocalDateTime.now());
         LambdaQueryWrapper<TTxRecord> tTxRecordLambdaQueryWrapper = new LambdaQueryWrapper<>();
         tTxRecordLambdaQueryWrapper.eq(null != txRecord.getcOpenId(), TTxRecord::getcOpenId, txRecord.getcOpenId()).
                 orderByDesc(TTxRecord::getDtCreateTime);
-        return R.ok(recordService.list(tTxRecordLambdaQueryWrapper));
+        List<TTxRecord> listRecord = recordService.list(tTxRecordLambdaQueryWrapper);
+        Map<YearMonth, List<TTxRecord>> sortedMonthlyGroupedOrders = new HashMap<>();
+        if (CollectionUtil.isNotEmpty(listRecord)) {
+
+            Map<YearMonth, List<TTxRecord>> map = listRecord.stream()
+                    .collect(Collectors.groupingBy(
+                            order -> YearMonth.from(order.getDtCreateTime()),
+                            Collectors.collectingAndThen(
+                                    Collectors.toList(),
+                                    list -> list.stream()
+                                            .sorted(Comparator.comparing(TTxRecord::getDtCreateTime).reversed())
+                                            .collect(Collectors.toList())
+                            )
+                    ));
+            sortedMonthlyGroupedOrders = new TreeMap<>(Comparator.reverseOrder());
+            sortedMonthlyGroupedOrders.putAll(map);
+        }
+        return R.ok(sortedMonthlyGroupedOrders);
     }
 }

+ 9 - 0
nightFragrance-admin/src/main/resources/application-dev.yml

@@ -292,3 +292,12 @@ ffmpeg:
   container-work-dir: /data
   # 宿主机路径映射(Docker volume映射的源路径)
   host-volume-path: /usr/local/java/nightFragrance/uploadPath
+
+# 自动分账超时时间_hour
+hCount:
+  48
+# 自动分账佣金比例 商户
+percent:
+  0.06
+hPercent:
+  0.94

+ 171 - 0
nightFragrance-massage/src/main/java/com/ylx/massage/domain/TOrder.java

@@ -343,6 +343,15 @@ public class TOrder implements Serializable {
     @ApiModelProperty("订单状态: -1待付款 0待接单 1已接单 6已出发 2已到达 3服务中 4待评价 5已完成 7:退单待审核 8:退单审核通过  -2已取消 -3已拒绝")
     private Integer nStatus;
 
+    /**
+     * 2026-03-27 新增字段
+     * 订单待结算状态
+     * -0-未结算 1-待结算 2-已结算
+     */
+    @TableField("w_status")
+    @ApiModelProperty("待结算状态: -0-未结算(默认) 1-待结算 2-已结算")
+    private Integer wStatus;
+
     /**
      * 备注地址
      * 地址的补充说明或地标信息
@@ -504,6 +513,104 @@ public class TOrder implements Serializable {
     @ApiModelProperty("订单状态名称")
     private String statusName;
 
+    /**
+     * 订单金额
+     * 非数据库字段,用于展示订单金额的文本描述
+     */
+    @TableField(exist = false)
+    @Excel(name = "订单金额")
+    @ApiModelProperty("订单金额")
+    private String orderPrice;
+
+    /**
+     * 实付金额
+     * 非数据库字段,用于展示实付金额的文本描述
+     */
+    @TableField(exist = false)
+    @Excel(name = "实付金额")
+    @ApiModelProperty("实付金额")
+    private String realPayPrice;
+
+    /**
+     * 优惠券补贴
+     * 非数据库字段,用于展示优惠券补贴的文本描述
+     */
+    @TableField(exist = false)
+    @Excel(name = "优惠券补贴")
+    @ApiModelProperty("优惠券补贴")
+    private String couponPrice;
+
+    /**
+     * 平台佣金比例
+     * 非数据库字段,用于展示平台佣金比例的文本描述
+     */
+    @TableField(exist = false)
+    @Excel(name = "平台佣金比例")
+    @ApiModelProperty("平台佣金比例")
+    private String percent;
+
+    /**
+     * 平台佣金
+     * 非数据库字段,用于展示平台佣金的文本描述
+     */
+    @TableField(exist = false)
+    @Excel(name = "平台佣金")
+    @ApiModelProperty("平台佣金")
+    private String yPrice;
+
+    /**
+     * 商户应收金额/待结算金额
+     * 非数据库字段,用于展示商户应收金额的文本描述
+     */
+    @TableField(exist = false)
+    @Excel(name = "商户应收金额")
+    @ApiModelProperty("商户应收金额/待结算金额")
+    private String rPrice;
+
+    /**
+     * 接单时间
+     * 非数据库字段,用于展示接单时间的文本描述
+     */
+    @TableField(exist = false)
+    @Excel(name = "接单时间开始")
+    @ApiModelProperty("接单时间开始")
+    private String acceptanceTimeBegin;
+
+    /**
+     * 接单时间
+     * 非数据库字段,用于展示接单时间的文本描述
+     */
+    @TableField(exist = false)
+    @Excel(name = "接单时间结束")
+    @ApiModelProperty("接单时间结束")
+    private String acceptanceTimeEnd;
+
+    /**
+     * 支付时间
+     * 非数据库字段,用于展示支付时间的文本描述
+     */
+    @TableField(exist = false)
+    @Excel(name = "支付时间开始")
+    @ApiModelProperty("支付时间开始")
+    private String payTimeBegin;
+
+    /**
+     * 支付时间
+     * 非数据库字段,用于展示支付时间的文本描述
+     */
+    @TableField(exist = false)
+    @Excel(name = "支付时间结束")
+    @ApiModelProperty("支付时间结束")
+    private String payTimeEnd;
+
+    /**
+     * 订单服务项目
+     * 非数据库字段,用于展示订单服务项目的文本描述
+     */
+    @TableField(exist = false)
+    @ApiModelProperty("订单服务项目")
+    private String projectNames;
+
 
     /**
      * 服务时长(分钟)
@@ -678,4 +785,68 @@ public class TOrder implements Serializable {
     public void setWxUser(TWxUser wxUser) {
         this.wxUser = wxUser;
     }
+
+    public Integer getwStatus() {
+        return wStatus;
+    }
+
+    public void setwStatus(Integer wStatus) {
+        this.wStatus = wStatus;
+    }
+
+    public String getOrderPrice() {
+        return orderPrice;
+    }
+
+    public void setOrderPrice(String orderPrice) {
+        this.orderPrice = orderPrice;
+    }
+
+    public String getRealPayPrice() {
+        return realPayPrice;
+    }
+
+    public void setRealPayPrice(String realPayPrice) {
+        this.realPayPrice = realPayPrice;
+    }
+
+    public String getCouponPrice() {
+        return couponPrice;
+    }
+
+    public void setCouponPrice(String couponPrice) {
+        this.couponPrice = couponPrice;
+    }
+
+    public String getPercent() {
+        return percent;
+    }
+
+    public void setPercent(String percent) {
+        this.percent = percent;
+    }
+
+    public String getyPrice() {
+        return yPrice;
+    }
+
+    public void setyPrice(String yPrice) {
+        this.yPrice = yPrice;
+    }
+
+    public String getrPrice() {
+        return rPrice;
+    }
+
+    public void setrPrice(String rPrice) {
+        this.rPrice = rPrice;
+    }
+
+    public String getProjectNames() {
+        return projectNames;
+    }
+
+    public void setProjectNames(String projectNames) {
+        this.projectNames = projectNames;
+    }
 }

+ 47 - 0
nightFragrance-massage/src/main/java/com/ylx/massage/domain/TTxRecord.java

@@ -4,6 +4,7 @@ import com.baomidou.mybatisplus.annotation.TableField;
 import com.baomidou.mybatisplus.annotation.TableId;
 import com.baomidou.mybatisplus.annotation.TableLogic;
 import com.baomidou.mybatisplus.annotation.TableName;
+import com.ylx.common.annotation.Excel;
 import io.swagger.annotations.ApiModel;
 import io.swagger.annotations.ApiModelProperty;
 import lombok.Getter;
@@ -38,6 +39,7 @@ public class TTxRecord implements Serializable {
     /**
      * 提现单号
      */
+    @Excel(name = "提现单号")
     @TableField("cash_no")
     @ApiModelProperty("提现单号")
     private String cashNo;
@@ -61,10 +63,18 @@ public class TTxRecord implements Serializable {
     /**
      * 提现金额
      */
+    @Excel(name = "申请提现金额")
     @TableField("d_price")
     @ApiModelProperty("提现金额")
     private BigDecimal dPrice;
 
+    /**
+     * 驳回说明
+     */
+    @TableField("reject")
+    @ApiModelProperty("驳回说明")
+    private String reject;
+
     /**
      * 提现时间
      */
@@ -82,6 +92,7 @@ public class TTxRecord implements Serializable {
     /**
      * 姓名
      */
+    @Excel(name = "姓名")
     @TableField("c_name")
     @ApiModelProperty("姓名")
     private String cName;
@@ -89,6 +100,7 @@ public class TTxRecord implements Serializable {
     /**
      * 开户行
      */
+    @Excel(name = "开户行")
     @TableField("opening_bank")
     @ApiModelProperty("开户行")
     private String openingBank;
@@ -96,6 +108,7 @@ public class TTxRecord implements Serializable {
     /**
      * 银行账号
      */
+    @Excel(name = "银行账号")
     @TableField("bank_account")
     @ApiModelProperty("银行账号")
     private String bankAccount;
@@ -111,6 +124,7 @@ public class TTxRecord implements Serializable {
     /**
      * 审核中0 审核通过1
      */
+    @Excel(name = "状态")
     @TableField("n_status")
     @ApiModelProperty("审核中0, 审核通过1, 驳回2")
     private Integer nStatus;
@@ -118,6 +132,7 @@ public class TTxRecord implements Serializable {
     /**
      * 创建时间
      */
+    @Excel(name = "创建时间")
     @TableField("dt_create_time")
     @ApiModelProperty("创建时间")
     private LocalDateTime dtCreateTime;
@@ -126,6 +141,14 @@ public class TTxRecord implements Serializable {
     @TableLogic
     private Integer isDelete;
 
+    @TableField(exist = false)
+    @ApiModelProperty("开始时间")
+    private LocalDateTime startTime ;
+
+    @TableField(exist = false)
+    @ApiModelProperty("结束时间")
+    private LocalDateTime endTime;
+
     public String getcId() {
         return cId;
     }
@@ -197,4 +220,28 @@ public class TTxRecord implements Serializable {
     public void setDtCreateTime(LocalDateTime dtCreateTime) {
         this.dtCreateTime = dtCreateTime;
     }
+
+    public LocalDateTime getStartTime() {
+        return startTime;
+    }
+
+    public void setStartTime(LocalDateTime startTime) {
+        this.startTime = startTime;
+    }
+
+    public LocalDateTime getEndTime() {
+        return endTime;
+    }
+
+    public void setEndTime(LocalDateTime endTime) {
+        this.endTime = endTime;
+    }
+
+    public String getReject() {
+        return reject;
+    }
+
+    public void setReject(String reject) {
+        this.reject = reject;
+    }
 }

+ 56 - 0
nightFragrance-massage/src/main/java/com/ylx/massage/enums/OrderWStateEnum.java

@@ -0,0 +1,56 @@
+package com.ylx.massage.enums;
+
+import com.ylx.common.utils.StringUtils;
+import lombok.Getter;
+import org.apache.commons.compress.utils.Lists;
+
+import java.util.ArrayList;
+import java.util.List;
+
+/**
+ * @author lixl
+ * @date 2024-03-27 11:51
+ * 订单待结算枚举
+ */
+@Getter
+public enum OrderWStateEnum {
+
+    //进行中(待接单,已接单,已到达,服务中)
+    NO_ACCOUNT(0, "未结算"),
+
+    WAIT_ACCOUNT(1, "待结算"),
+
+    OK_ACCOUNT(2, "已结算");
+
+
+
+    private final Integer code;
+    private final String info;
+
+    OrderWStateEnum(Integer code, String info) {
+        this.code = code;
+        this.info = info;
+    }
+
+    public static List<Enumproject> getStatusEnum() {
+
+        ArrayList<Enumproject> objects = Lists.newArrayList();
+        for (OrderWStateEnum value : OrderWStateEnum.values()) {
+            Enumproject enumproject = new Enumproject();
+            enumproject.setInfo(value.getInfo());
+            enumproject.setCode(value.getCode());
+            objects.add(enumproject);
+        }
+        return objects;
+    }
+
+    public static String getDescByCode(Integer code) {
+        for (OrderWStateEnum value : OrderWStateEnum.values()) {
+            if(value.getCode().equals(code)){
+                return value.getInfo();
+            }
+        }
+        return StringUtils.EMPTY;
+    }
+
+}

+ 2 - 1
nightFragrance-massage/src/main/java/com/ylx/massage/enums/TTxRecordEnum.java

@@ -8,7 +8,8 @@ package com.ylx.massage.enums;
 public enum TTxRecordEnum {
 
     PASS_ING(0, "审核中"),
-    PASS(1, "审核通过");
+    PASS(1, "审核通过"),
+    NO_PASS(2, "驳回");
 
 
     private final Integer code;

+ 4 - 0
nightFragrance-massage/src/main/java/com/ylx/massage/mapper/TOrderMapper.java

@@ -33,4 +33,8 @@ public interface TOrderMapper extends BaseMapper<TOrder> {
     BigDecimal getTurnover(@Param("jsid") String jsid, @Param("startDate") Date startDate, @Param("endDate") Date endDate);
 
     List<HomeBlock> getBlock(@Param("start") Date start, @Param("end") Date end, @Param("deptId") String deptId);
+
+    //执行存储过程 大于48小时 订单状态更新为 已结算  自动分账  订单总金额*佣金比例划入用户余额
+    void callAutoAccount(@Param("hCount")int hCount, @Param("percent")BigDecimal percent);
+
 }

+ 39 - 0
nightFragrance-massage/src/main/java/com/ylx/massage/service/TOrderService.java

@@ -4,13 +4,16 @@ import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
 import com.baomidou.mybatisplus.extension.service.IService;
 import com.ylx.common.core.domain.R;
 import com.ylx.massage.domain.TOrder;
+import com.ylx.massage.domain.TWxUser;
 import com.ylx.massage.domain.vo.HomeBlock;
 import com.ylx.massage.domain.vo.OrderVerificationVo;
 import com.ylx.massage.domain.vo.TechnicianAvailabilityVo;
 
 import java.math.BigDecimal;
+import java.time.YearMonth;
 import java.util.Date;
 import java.util.List;
+import java.util.Map;
 
 
 /**
@@ -111,4 +114,40 @@ public interface TOrderService extends IService<TOrder> {
      * @return 操作结果
      */
     Boolean cancelApplyCancle(TOrder order);
+
+    /**
+     * PC收入明细
+     * @param page
+     * @param order
+     * @return
+     */
+    Page<TOrder> getPcOrderIncome(Page<TOrder> page, TOrder order);
+
+    /**
+     * 累计营业收入  累计平台佣金收入  累计商家收入
+     * @return
+     */
+    public Map<String, String> totalData();
+
+    /**
+     * 执行存储过程 大于48小时 订单状态更新为 已结算  自动分账  订单总金额划入用户余额
+     * @param hCount
+     * @param percent
+     */
+    void callAutoAccount(int hCount, BigDecimal percent);
+
+    /**
+     * 商户收益,总额,待结算,已结算
+     * @param user
+     * @return
+     */
+    public Map<String, String> myIncome(TWxUser user);
+
+    /**
+     * 商户收入明细
+     * @param user
+     * @param wStatus
+     * @return
+     */
+    public Map<YearMonth, List<TOrder>> myIncomeDetail(TWxUser user, Integer wStatus);
 }

+ 7 - 0
nightFragrance-massage/src/main/java/com/ylx/massage/service/TTxRecordService.java

@@ -1,8 +1,11 @@
 package com.ylx.massage.service;
 
+import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
 import com.baomidou.mybatisplus.extension.service.IService;
 import com.ylx.massage.domain.TTxRecord;
 
+import java.util.List;
+
 
 /**
  * 提现表 服务类
@@ -12,4 +15,8 @@ public interface TTxRecordService extends IService<TTxRecord> {
     TTxRecord applicationCash(TTxRecord record);
 
     Object auditing(TTxRecord record);
+
+    Page<TTxRecord> page(Page<TTxRecord> page, TTxRecord txRecord, Long deptId);
+
+    List<TTxRecord> tTxRecordList(String openId);
 }

+ 6 - 0
nightFragrance-massage/src/main/java/com/ylx/massage/service/TWxUserService.java

@@ -2,9 +2,15 @@ package com.ylx.massage.service;
 
 import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
 import com.baomidou.mybatisplus.extension.service.IService;
+import com.ylx.massage.domain.TOrder;
 import com.ylx.massage.domain.TWxUser;
 import com.ylx.massage.domain.vo.TWxUserVo;
 
+import java.math.BigDecimal;
+import java.time.YearMonth;
+import java.util.List;
+import java.util.Map;
+
 
 /**
  *  服务类

+ 216 - 10
nightFragrance-massage/src/main/java/com/ylx/massage/service/impl/TOrderServiceImpl.java

@@ -16,25 +16,21 @@ import com.ylx.common.exception.ServiceException;
 import com.ylx.common.utils.SecurityUtils;
 import com.ylx.massage.domain.*;
 import com.ylx.massage.domain.vo.*;
-import com.ylx.massage.enums.BillTypeEnum;
-import com.ylx.massage.enums.DiscountTypeEnum;
-import com.ylx.massage.enums.JsStatusEnum;
-import com.ylx.massage.enums.OrderStatusEnum;
+import com.ylx.massage.enums.*;
 import com.ylx.massage.mapper.TOrderMapper;
 import com.ylx.massage.service.*;
 import com.ylx.massage.utils.*;
 import lombok.extern.slf4j.Slf4j;
+import lombok.var;
 import org.apache.commons.compress.utils.Lists;
+import org.springframework.beans.factory.annotation.Value;
 import org.springframework.stereotype.Service;
 import org.springframework.transaction.annotation.Transactional;
 
 import javax.annotation.Resource;
 import java.math.BigDecimal;
 import java.math.RoundingMode;
-import java.time.Duration;
-import java.time.LocalDate;
-import java.time.LocalDateTime;
-import java.time.LocalTime;
+import java.time.*;
 import java.util.*;
 import java.util.stream.Collectors;
 
@@ -102,6 +98,15 @@ public class TOrderServiceImpl extends ServiceImpl<TOrderMapper, TOrder> impleme
     @Resource
     private CancelOrderApplicationService cancelOrderApplicationService;
 
+    @Resource
+    private TTxRecordService recordService;
+
+    @Value("${percent}")
+    private String percent;
+
+    @Value("${hPercent}")
+    private String hPercent;
+
     /**
      * 判断是否免车费
      * 时间段判断:
@@ -802,6 +807,9 @@ public class TOrderServiceImpl extends ServiceImpl<TOrderMapper, TOrder> impleme
         orderParam.setcId(orderNew.getcId());
         orderParam.setnStatus(OrderStatusEnum.REFUSE.getCode());
         orderParam.setReasonRefusal(order.getReasonRefusal());
+
+        // 订单结算状态:未结算  2026-03-27 lixl
+        orderParam.setwStatus(OrderWStateEnum.NO_ACCOUNT.getCode());
         updateJs(orderNew);
         return updateById(orderParam);
     }
@@ -876,6 +884,9 @@ public class TOrderServiceImpl extends ServiceImpl<TOrderMapper, TOrder> impleme
         // 订单状态:待评价
         orderNew.setnStatus(OrderStatusEnum.WAIT_EVALUATE.getCode());
         orderNew.setEndTime(LocalDateTime.now());
+
+        // 订单结算状态:待结算  2026-03-27 lixl
+        orderNew.setwStatus(OrderWStateEnum.WAIT_ACCOUNT.getCode());
         updateById(orderNew);
 
         // 添加订单完成消息通知(用户侧)
@@ -1137,6 +1148,10 @@ public class TOrderServiceImpl extends ServiceImpl<TOrderMapper, TOrder> impleme
             TOrder orderParam = new TOrder();
             orderParam.setcId(orderNew.getcId());
             orderParam.setnStatus(OrderStatusEnum.CANCEL.getCode());
+
+            // 订单结算状态:未结算  2026-03-27 lixl
+            orderParam.setwStatus(OrderWStateEnum.NO_ACCOUNT.getCode());
+
             //更新技师状态
             TJs tJs = new TJs();
             tJs.setId(orderNew.getcJsId());
@@ -1154,6 +1169,10 @@ public class TOrderServiceImpl extends ServiceImpl<TOrderMapper, TOrder> impleme
             TOrder orderParam = new TOrder();
             orderParam.setcId(orderNew.getcId());
             orderParam.setnStatus(OrderStatusEnum.CANCEL.getCode());
+
+            // 订单结算状态:未结算  2026-03-27 lixl
+            orderParam.setwStatus(OrderWStateEnum.NO_ACCOUNT.getCode());
+
             updateById(orderParam);
             // 添加取消订单通知
             orderNotificationService.sendCancelledNotification(orderNew);
@@ -1297,13 +1316,13 @@ public class TOrderServiceImpl extends ServiceImpl<TOrderMapper, TOrder> impleme
 
     /**
      * 申请取消订单(退单申请)
-     *
      * 业务流程:
      * 1. 校验订单状态(仅进行中的订单可申请退单)
      * 2. 创建退单申请记录
      * 3. 更新订单状态为"退单待审核"
      *
-     * @param order 订单对象
+     * @param cId 订单对象
+     * @param cancelReason 订单对象
      * @return Boolean 申请结果
      */
     @Override
@@ -1416,4 +1435,191 @@ public class TOrderServiceImpl extends ServiceImpl<TOrderMapper, TOrder> impleme
         return Boolean.TRUE;
     }
 
+    @Override
+    public Page<TOrder> getPcOrderIncome(Page<TOrder> page, TOrder o) {
+        Page<TOrder> orderPage = orderMapper.getAll(page, o);
+        if (orderPage != null && CollectionUtil.isNotEmpty(orderPage.getRecords())) {
+
+            ArrayList<TOrder> ordersList = Lists.newArrayList();
+            orderPage.getRecords().forEach(order -> {
+                order.setStatusName(OrderStatusEnum.getDescByCode(order.getnStatus()));
+                order.setJsPhone(order.getJs().getcPhone());
+                order.setJsName(order.getJs().getcName());
+                //订单金额
+                order.setOrderPrice(String.valueOf(order.getTotalPrice()));
+                //优惠券补贴
+                order.setCouponPrice(String.valueOf(order.getPreferential()));
+                //实付金额
+                order.setRealPayPrice(String.valueOf(order.getTotalPrice()));
+                //平台佣金比例
+                order.setPercent(percent.substring(percent.length() - 1)+"%");
+                //商户应收金额 不进行四舍五入
+                BigDecimal rp = order.getTotalPrice().multiply(new BigDecimal(hPercent)).
+                        setScale(2, RoundingMode.DOWN);
+                order.setrPrice(String.valueOf(rp));
+                //平台佣金
+                BigDecimal cp = order.getTotalPrice().subtract(rp).
+                        setScale(2, RoundingMode.DOWN);
+                order.setyPrice(String.valueOf(cp));
+                ordersList.add(order);
+
+            });
+            orderPage.setRecords(ordersList);
+        }
+        return orderPage;
+    }
+
+    /**
+     * 累计营业收入  累计平台佣金收入  累计商家收入
+     * @return
+     */
+    @Override
+    public Map<String, String> totalData() {
+        //订单状态(-1:待付款 0:待接单 1:已接单 6:已出发 2:已到达 3:服务中 4:待评价
+        //5:已完成 7:退单待审核 8:退单审核通过  -2:已取消 -3:已拒绝)
+
+        // 过滤 待付款 退单审核通过 已取消 已拒绝
+        List<TOrder> listOrder = baseMapper.selectList(new LambdaQueryWrapper<TOrder>().
+                ne(TOrder::getnStatus, OrderStatusEnum.WAIT_PAY).ne(TOrder::getnStatus, OrderStatusEnum.CANCEL_APPLICATION_PASS).
+                ne(TOrder::getnStatus, OrderStatusEnum.CANCEL).ne(TOrder::getnStatus, OrderStatusEnum.REFUSE));
+        Map<String, String> map = new HashMap<>();
+        final BigDecimal[] total1 = {BigDecimal.ZERO};
+        final BigDecimal[] total2 = {BigDecimal.ZERO};
+        BigDecimal total3 = BigDecimal.ZERO;
+        listOrder.forEach(order -> {
+            total1[0] = total1[0].add(null == order.getTotalPrice() ? BigDecimal.ZERO : order.getTotalPrice());
+            total2[0] = total2[0].add(null == order.getTotalPrice() ? BigDecimal.ZERO : order.getTotalPrice().
+                    multiply(new BigDecimal(hPercent)).setScale(2, RoundingMode.DOWN));
+        });
+        total3 = total1[0].subtract(total2[0]).setScale(2, RoundingMode.DOWN);
+        map.put("totalPrice", total1[0].toString());
+        map.put("merchantPrice", total2[0].toString());
+        map.put("platformPrice", total3.toString());
+        return map;
+    }
+
+    @Override
+    public void callAutoAccount(int hCount, BigDecimal percent) {
+        baseMapper.callAutoAccount(hCount, percent);
+    }
+
+    /**
+     * 商户收益,总额,待结算,已结算,已提现
+     * @param user
+     * @return
+     */
+    public Map<String, String> myIncome(TWxUser user) {
+        List<TOrder> orderList = getTOrders(user, null);
+        Map<String, String> result = new HashMap<>();
+        // 我的收益 = 待结算 + 已结算
+        if(CollectionUtil.isNotEmpty(orderList)){
+            // 所有订单的总金额
+            BigDecimal tAmount = orderList.stream()
+                    .map(TOrder::getTotalPrice)
+                    .reduce(BigDecimal.ZERO, BigDecimal::add);
+            tAmount = tAmount.multiply(new BigDecimal(hPercent)).setScale(2, RoundingMode.DOWN);
+            // 已结算订单的总金额
+            BigDecimal yAmount = orderList.stream()
+                    .filter(order -> OrderWStateEnum.OK_ACCOUNT.getCode().intValue() == order.getwStatus().intValue())
+                    .map(TOrder::getTotalPrice)
+                    .reduce(BigDecimal.ZERO, BigDecimal::add);
+            yAmount = yAmount.multiply(new BigDecimal(hPercent)).setScale(2, RoundingMode.DOWN);
+            // 待结算订单的总金额
+            BigDecimal wAmount = orderList.stream()
+                    .filter(order -> OrderWStateEnum.WAIT_ACCOUNT.getCode().intValue() == order.getwStatus().intValue())
+                    .map(TOrder::getTotalPrice)
+                    .reduce(BigDecimal.ZERO, BigDecimal::add);
+            wAmount = wAmount.multiply(new BigDecimal(hPercent)).setScale(2, RoundingMode.DOWN);
+            result.put("tAmount", tAmount.toPlainString());
+            result.put("yAmount", yAmount.toPlainString());
+            result.put("wAmount", wAmount.toPlainString());
+        }
+        List<TTxRecord> tTxRecords = recordService.tTxRecordList(user.getcOpenid());
+        if(CollectionUtil.isNotEmpty(tTxRecords)){
+            // 已提现
+            BigDecimal gAmount = tTxRecords.stream()
+                    .map(TTxRecord::getdPrice)
+                    .reduce(BigDecimal.ZERO, BigDecimal::add);
+            result.put("gAmount", gAmount.toPlainString());
+        }
+        return result;
+    }
+
+    /**
+     * 商户收入明细
+     * @param user
+     * @param wStatus
+     * @return
+     */
+    public Map<YearMonth, List<TOrder>> myIncomeDetail(TWxUser user, Integer wStatus) {
+        List<TOrder> orderList = getTOrders(user, wStatus);
+        Map<YearMonth, List<TOrder>> sortedMonthlyGroupedOrders = new HashMap<>();
+        if(CollectionUtil.isNotEmpty(orderList)){
+            orderList.forEach(item->{
+                //商户应收金额 不进行四舍五入
+                item.setrPrice(String.valueOf(item.getTotalPrice().multiply(new BigDecimal(hPercent)).
+                        setScale(2, RoundingMode.DOWN)));
+                item.setProjectNames(getProjectNames(item));
+            });
+
+//        Map<YearMonth, List<TOrder>> monthlyGroupedOrders = orderList.stream()
+//                .collect(Collectors.groupingBy(o -> YearMonth.from(o.getEndTime())));
+            Map<YearMonth, List<TOrder>> monthlyGroupedOrders = orderList.stream()
+                    .collect(Collectors.groupingBy(
+                            order -> YearMonth.from(order.getDtCreateTime()),
+                            Collectors.collectingAndThen(
+                                    Collectors.toList(),
+                                    list -> list.stream()
+                                            .sorted(Comparator.comparing(TOrder::getDtCreateTime).reversed())
+                                            .collect(Collectors.toList())
+                            )
+                    ));
+            sortedMonthlyGroupedOrders = new TreeMap<>(Comparator.reverseOrder());
+            sortedMonthlyGroupedOrders.putAll(monthlyGroupedOrders);
+            // Sort the map by YearMonth
+//            monthlyGroupedOrders.entrySet().stream()
+//                    .sorted(Map.Entry.comparingByKey());
+                    //.forEach(entry -> {
+                    //    System.out.println("Month: " + entry.getKey());
+                    //    entry.getValue().forEach(od ->
+                    //            System.out.println("  Order ID: " + od.getOrderNo() + ", Amount: " + od.getTotalPrice()));
+                    //});
+
+        }
+
+        return  sortedMonthlyGroupedOrders;
+    }
+
+    /**
+     * 查询待结算/已结算订单
+     * @param user
+     * @return
+     */
+    private List<TOrder> getTOrders(TWxUser user, Integer wStatus) {
+        LambdaQueryWrapper<TOrder> queryWrapper = new LambdaQueryWrapper<>();
+        queryWrapper.eq(TOrder::getIsDelete, 0).
+                eq(com.ylx.common.utils.StringUtils.isNotBlank(user.getcOpenid()),TOrder::getcOpenId, user.getcOpenid()).
+                eq(wStatus != null, TOrder::getwStatus, wStatus).
+                // 过滤 待付款 退单审核通过 已取消 已拒绝
+                ne(TOrder::getnStatus, OrderStatusEnum.WAIT_PAY).
+                ne(TOrder::getnStatus, OrderStatusEnum.CANCEL_APPLICATION_PASS).
+                ne(TOrder::getnStatus, OrderStatusEnum.CANCEL.getCode()).
+                ne(TOrder::getnStatus, OrderStatusEnum.REFUSE.getCode()).
+                orderByDesc(TOrder::getDtCreateTime);
+        return orderMapper.selectList(queryWrapper);
+    }
+
+    private String getProjectNames(TOrder order) {
+        List<TXiangmu> list = JSONObject.parseArray(order.getcGoods().toJSONString(), TXiangmu.class);
+        StringBuilder sb = new StringBuilder();
+        for (TXiangmu xiangmu : list) {
+            sb.append(xiangmu.getcTitle()).append(",");
+        }
+        // 移除最后一个逗号
+        if (sb.length() > 0) {
+            sb.setLength(sb.length() - 1);
+        }
+        return sb.toString();
+    }
+
 }

+ 31 - 0
nightFragrance-massage/src/main/java/com/ylx/massage/service/impl/TTxRecordServiceImpl.java

@@ -3,6 +3,7 @@ package com.ylx.massage.service.impl;
 import cn.hutool.core.collection.CollectionUtil;
 import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
 import com.baomidou.mybatisplus.core.conditions.update.UpdateWrapper;
+import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
 import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
 import com.ylx.common.exception.ServiceException;
 import com.ylx.massage.domain.TConsumptionLog;
@@ -101,6 +102,26 @@ public class TTxRecordServiceImpl extends ServiceImpl<TTxRecordMapper, TTxRecord
         return b;
     }
 
+    @Override
+    public Page<TTxRecord> page(Page<TTxRecord> page, TTxRecord txRecord, Long deptId) {
+        // 获取页数
+        LambdaQueryWrapper<TTxRecord> tTxRecordLambdaQueryWrapper = new LambdaQueryWrapper<>();
+        tTxRecordLambdaQueryWrapper.eq(null != txRecord.getnStatus(), TTxRecord::getnStatus, txRecord.getnStatus()).
+                eq(com.baomidou.mybatisplus.core.toolkit.StringUtils.isNotBlank(txRecord.getcPhone()), TTxRecord::getcPhone, txRecord.getcPhone()).
+                eq(com.baomidou.mybatisplus.core.toolkit.StringUtils.isNotBlank(txRecord.getcName()), TTxRecord::getcName, txRecord.getcName()).
+                eq(txRecord.getnStatus() != null, TTxRecord::getnStatus, txRecord.getnStatus()).
+                eq(com.baomidou.mybatisplus.core.toolkit.StringUtils.isNotBlank(txRecord.getcOpenId()), TTxRecord::getcOpenId, txRecord.getcOpenId());
+        if(txRecord.getStartTime() != null && txRecord.getEndTime() != null) {
+            tTxRecordLambdaQueryWrapper.ge(TTxRecord::getDtCreateTime, txRecord.getStartTime()).
+                    le(com.baomidou.mybatisplus.core.toolkit.StringUtils.isNotBlank(txRecord.getcOpenId()), TTxRecord::getcOpenId, txRecord.getcOpenId());
+        }
+        tTxRecordLambdaQueryWrapper.orderByDesc(TTxRecord::getDtCreateTime);
+        if(null != deptId && deptId != 100){
+            tTxRecordLambdaQueryWrapper.eq(TTxRecord::getDeptId,deptId);
+        }
+        return baseMapper.selectPage(page, tTxRecordLambdaQueryWrapper);
+    }
+
     private void extracted(TTxRecord record) {
         UpdateWrapper<TWxUser> businessUpdateWrapper = new UpdateWrapper<>();
         businessUpdateWrapper.lambda().eq(TWxUser::getcOpenid, record.getcOpenId());
@@ -117,4 +138,14 @@ public class TTxRecordServiceImpl extends ServiceImpl<TTxRecordMapper, TTxRecord
         tConsumptionLog.setNote("提现");
         consumptionLogService.save(tConsumptionLog);
     }
+
+    @Override
+    public List<TTxRecord> tTxRecordList(String openId) {
+        LambdaQueryWrapper<TTxRecord> tTxRecordLambdaQueryWrapper = new LambdaQueryWrapper<>();
+        tTxRecordLambdaQueryWrapper.eq(TTxRecord::getcOpenId, openId)
+                .eq(TTxRecord::getnStatus, TTxRecordEnum.PASS.getCode())
+                .orderByDesc(TTxRecord::getDtCreateTime);
+        return baseMapper.selectList(tTxRecordLambdaQueryWrapper);
+    }
+
 }

+ 24 - 0
nightFragrance-massage/src/main/java/com/ylx/massage/task/massageTask.java

@@ -11,6 +11,7 @@ import com.ylx.massage.domain.*;
 import com.ylx.massage.enums.BillTypeEnum;
 import com.ylx.massage.enums.JsStatusEnum;
 import com.ylx.massage.enums.OrderStatusEnum;
+import com.ylx.massage.enums.OrderWStateEnum;
 import com.ylx.massage.mapper.TConsumptionLogMapper;
 import com.ylx.massage.service.*;
 import com.ylx.massage.utils.DateTimeUtils;
@@ -18,7 +19,9 @@ import com.ylx.massage.utils.LocationUtil;
 import com.ylx.massage.utils.WeChatUtil;
 import com.ylx.system.service.ISysDeptService;
 import lombok.extern.slf4j.Slf4j;
+import lombok.val;
 import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.beans.factory.annotation.Value;
 import org.springframework.stereotype.Component;
 
 import javax.annotation.Resource;
@@ -66,6 +69,12 @@ public class massageTask {
     @Resource
     private WeChatUtil weChatUtil;
 
+    @Value("${hCount}")
+    private String hCount;
+
+    @Value("${percent}")
+    private String percent;
+
     /**
      * 取消超时未支付订单
      */
@@ -407,4 +416,19 @@ public class massageTask {
         log.info("结束执行同步技师二维码,{}", DateUtils.getNowDate());
     }
 
+    /**
+     * 1 <48小时 找到对应接口的方法根据时间判断
+     * 进行更新操作 订单状态为 5已完成  结算状态为待结算
+     * 2 >48小时 订单结算状态更新为 已结算  自动分账  订单总金额划入用户余额
+     */
+    public void autoAccount() {
+        log.info("开始执行同步自动分账,{}", DateUtils.getNowDate());
+        //执行存储过程
+        //>48小时 订单状态 [待结算] 更新为 [已结算]  自动分账  订单总金额划入用户余额
+        orderService.callAutoAccount(Integer.parseInt(hCount), new BigDecimal(percent));
+
+        log.info("开始执行同步自动分账,{}", DateUtils.getNowDate());
+
+    }
+
 }

+ 30 - 6
nightFragrance-massage/src/main/resources/mapper/massage/TOrderMapper.xml

@@ -166,6 +166,8 @@
         t_wx_user.c_openid = t_order.c_open_id
         <where>
             t_order.is_delete = 0 and t_js.is_delete = 0 and t_wx_user.is_delete = 0
+            and t_order.n_status != 8 and t_order.n_status != -2 and t_order.n_status != -3
+            and t_order.n_status != -1
             <if test="param.cId != null and param.cId != ''">
                 and t_order.c_id = #{ param.cId }
             </if>
@@ -187,15 +189,26 @@
             <if test="param.orderNo != null and param.orderNo != ''">
                 and t_order.order_no = #{ param.orderNo }
             </if>
-            <if test="param.nStatus != null and param.nStatus != 10 and param.nStatus != -10 and param.nStatus != 100">
+            <!-- 订单状态(-1:待付款 0:待接单 1:已接单 6:已出发 2:已到达 3:服务中 4:待评价 5:已完成
+                          7:退单待审核 8:退单审核通过  -2:已取消 -3:已拒绝) -->
+            <!--<if test="param.nStatus != null and param.nStatus != 10 and param.nStatus != -10 and param.nStatus != 100">-->
+            <!--    and t_order.n_status = #{ param.nStatus }-->
+            <!--</if>-->
+            <!--<if test="param.nStatus == 10">-->
+            <!--    and t_order.n_status in(0,1,2,3)-->
+            <!--</if>-->
+            <!--<if test="param.nStatus == -10">-->
+            <!--    and t_order.n_status in(-2,-3)-->
+            <!--</if>-->
+
+            <if test="param.nStatus != null">
                 and t_order.n_status = #{ param.nStatus }
             </if>
-            <if test="param.nStatus == 10">
-                and t_order.n_status in(0,1,2,3)
-            </if>
-            <if test="param.nStatus == -10">
-                and t_order.n_status in(-2,-3)
+
+            <if test="param.wStatus != null">
+                and t_order.w_status = #{ param.wStatus }
             </if>
+
             <if test="param.cJsId != null and param.cJsId != ''">
                 and t_order.c_js_id = #{ param.cJsId }
             </if>
@@ -205,6 +218,13 @@
             <if test="param.cOpenId != null and param.cOpenId != ''">
                 and t_order.c_open_id = #{ param.cOpenId }
             </if>
+            <if test="param.acceptanceTimeBegin != null and param.acceptanceTimeBegin != '' and param.acceptanceTimeEnd != null and param.acceptanceTimeEnd != ''">
+                and t_order.acceptance_time between #{ acceptanceTimeBegin } and #{ acceptanceTimeEnd }
+            </if>
+            <if test="param.payTimeBegin != null and param.payTimeBegin != '' and param.payTimeEnd != null and param.payTimeEnd != ''">
+                and t_order.pay_time between #{payTimeBegin} and #{payTimeEnd}
+            </if>
+
         </where>
         order by
         t_order.dt_create_time desc
@@ -267,4 +287,8 @@
             month;
 
     </select>
+
+    <select id="callAutoAccount" statementType="CALLABLE">
+        {call updateUserBalance(#{hCount, mode=IN, jdbcType=INTEGER}, #{percent, mode=IN, jdbcType=DECIMAL})}
+    </select>
 </mapper>