From 553ef3a2cda7bb93c49865327d0a53b298068a7f Mon Sep 17 00:00:00 2001
From: Jerry Yan <792602257@qq.com>
Date: Fri, 28 Feb 2025 10:12:19 +0800
Subject: [PATCH] =?UTF-8?q?=E6=8E=A8=E5=AE=A2=E7=9B=B4=E6=8E=A5=E6=94=B6?=
 =?UTF-8?q?=E7=9B=8A=EF=BC=8C=E8=B0=83=E6=95=B4=E9=A1=BA=E5=BA=8F?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit

---
 .../java/com/ycwl/basic/biz/BrokerBiz.java    | 29 ++++++++++++-------
 .../ycwl/basic/constant/StorageConstant.java  |  5 ++++
 .../extern/LyCompatibleController.java        | 19 ++++++++----
 .../basic/controller/pc/BrokerController.java |  8 ++---
 .../model/pc/broker/entity/BrokerRecord.java  |  1 +
 .../pc/broker/req/BrokerRecordReqQuery.java   |  3 ++
 .../pc/broker/resp/DailySummaryRespVO.java    |  6 +++-
 .../pc/scenic/entity/ScenicConfigEntity.java  |  4 +++
 .../impl/mobile/AppScenicServiceImpl.java     | 23 +++++++--------
 .../task/impl/TaskTaskServiceImpl.java        | 13 +++++++--
 src/main/resources/mapper/BrokerMapper.xml    |  8 +++--
 .../resources/mapper/BrokerRecordMapper.xml   | 13 +++++----
 src/main/resources/mapper/ScenicMapper.xml    |  5 +++-
 13 files changed, 94 insertions(+), 43 deletions(-)
 create mode 100644 src/main/java/com/ycwl/basic/constant/StorageConstant.java

diff --git a/src/main/java/com/ycwl/basic/biz/BrokerBiz.java b/src/main/java/com/ycwl/basic/biz/BrokerBiz.java
index 15ed83a..7586e6f 100644
--- a/src/main/java/com/ycwl/basic/biz/BrokerBiz.java
+++ b/src/main/java/com/ycwl/basic/biz/BrokerBiz.java
@@ -19,6 +19,7 @@ import java.util.ArrayList;
 import java.util.Date;
 import java.util.List;
 import java.util.Objects;
+import java.util.concurrent.atomic.AtomicBoolean;
 import java.util.stream.Collectors;
 
 @Component
@@ -80,32 +81,40 @@ public class BrokerBiz {
             brokerRecord.setBrokerRate(broker.getBrokerRate());
             BigDecimal brokerRate = brokerRecord.getBrokerRate();
             BigDecimal brokerPrice = order.getPayPrice().multiply(brokerRate).divide(BigDecimal.valueOf(100), 2, RoundingMode.HALF_DOWN);
+            brokerRecord.setDirectPrice(order.getPayPrice());
             brokerRecord.setBrokerPrice(brokerPrice);
-            reason += "金额:" + order.getPayPrice() + "元,提成比例:" + brokerRate + ",提成金额:" + brokerPrice + "元";
+            reason += "金额:" + order.getPayPrice() + "元,提成比例:" + brokerRate + "%,提成金额:" + brokerPrice + "元";
             brokerRecord.setReason(reason);
             brokerRecordList.add(brokerRecord);
         } else {
-            BigDecimal totalRate = brokerInfoList.stream().map(BrokerRespVO::getBrokerRate).reduce(BigDecimal.ZERO, BigDecimal::add);
             BrokerRespVO broker = brokerInfoList.get(0);
-            BigDecimal firstRate = broker.getBrokerRate();
-            BigDecimal brokerPrice = order.getPayPrice().multiply(firstRate).divide(BigDecimal.valueOf(100), 2, RoundingMode.HALF_DOWN);
+            BigDecimal realRate = broker.getBrokerRate();
+            BigDecimal brokerPrice = order.getPayPrice().multiply(realRate).divide(BigDecimal.valueOf(100), 2, RoundingMode.HALF_DOWN);
+            AtomicBoolean isFirst = new AtomicBoolean(true);
+            // todo 需要计算实际提成比例
+            BigDecimal firstRate = BigDecimal.valueOf(50);
+            BigDecimal secondRate = BigDecimal.valueOf(100).subtract(firstRate).divide(BigDecimal.valueOf(brokerInfoList.size() - 1), 2, RoundingMode.HALF_DOWN);
             brokerInfoList.forEach(item -> {
-                String reason = "多人提成:支付金额:" + order.getPayPrice() + "元,可提成比例:" + firstRate + ",可提成金额:" + brokerPrice + ":";
+                String reason = "多人提成:支付金额:" + order.getPayPrice() + "元,可提成比例:" + realRate + "%,可提成金额:" + brokerPrice + ":";
                 BrokerRecord brokerRecord = new BrokerRecord();
                 brokerRecord.setBrokerId(item.getId());
                 brokerRecord.setOrderId(orderId);
-                if (item.getBrokerRate() == null) {
-                    reason += "提成比例为空!";
-                    brokerRecord.setBrokerRate(BigDecimal.ZERO);
+                BigDecimal interBrokerRate;
+                if (isFirst.get()) {
+                    interBrokerRate = firstRate;
+                    brokerRecord.setDirectPrice(order.getPayPrice());
+                } else {
+                    interBrokerRate = secondRate;
+                    brokerRecord.setDirectPrice(BigDecimal.ZERO);
                 }
                 brokerRecord.setOrderPrice(order.getPayPrice());
-                BigDecimal interBrokerRate = item.getBrokerRate().divide(totalRate, 2, RoundingMode.HALF_DOWN);
                 brokerRecord.setBrokerRate(interBrokerRate);
                 BigDecimal interBrokerPrice = order.getPayPrice().multiply(interBrokerRate).divide(BigDecimal.valueOf(100), 2, RoundingMode.HALF_DOWN);
                 brokerRecord.setBrokerPrice(interBrokerPrice);
-                reason += "提成比例:" + item.getBrokerRate() + ",实际提成比例:" + interBrokerRate + ",提成金额:" + interBrokerPrice + "元";
+                reason += "二次提成比例:" + interBrokerRate + "%,提成金额:" + interBrokerPrice + "元";
                 brokerRecord.setReason(reason);
                 brokerRecordList.add(brokerRecord);
+                isFirst.set(false);
             });
         }
         revokeOrder(orderId);
diff --git a/src/main/java/com/ycwl/basic/constant/StorageConstant.java b/src/main/java/com/ycwl/basic/constant/StorageConstant.java
new file mode 100644
index 0000000..9a1e732
--- /dev/null
+++ b/src/main/java/com/ycwl/basic/constant/StorageConstant.java
@@ -0,0 +1,5 @@
+package com.ycwl.basic.constant;
+
+public class StorageConstant {
+    public static final String VLOG_PATH = "vlog";
+}
diff --git a/src/main/java/com/ycwl/basic/controller/extern/LyCompatibleController.java b/src/main/java/com/ycwl/basic/controller/extern/LyCompatibleController.java
index d6ae6a5..0dc269f 100644
--- a/src/main/java/com/ycwl/basic/controller/extern/LyCompatibleController.java
+++ b/src/main/java/com/ycwl/basic/controller/extern/LyCompatibleController.java
@@ -1,5 +1,6 @@
 package com.ycwl.basic.controller.extern;
 
+import com.ycwl.basic.annotation.IgnoreToken;
 import com.ycwl.basic.mapper.FaceMapper;
 import com.ycwl.basic.mapper.MemberMapper;
 import com.ycwl.basic.mapper.VideoMapper;
@@ -23,7 +24,9 @@ import com.ycwl.basic.utils.ApiResponse;
 import com.ycwl.basic.utils.SnowFlakeUtil;
 import org.apache.commons.lang3.StringUtils;
 import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.web.bind.annotation.GetMapping;
 import org.springframework.web.bind.annotation.PostMapping;
+import org.springframework.web.bind.annotation.RequestMapping;
 import org.springframework.web.bind.annotation.RequestParam;
 import org.springframework.web.bind.annotation.RestController;
 import org.springframework.web.multipart.MultipartFile;
@@ -36,7 +39,8 @@ import java.util.List;
 import java.util.Map;
 import java.util.stream.Collectors;
 
-@RestController("/ly")
+@RestController
+@RequestMapping("/ly")
 public class LyCompatibleController {
     @Autowired
     private FaceService faceService;
@@ -57,6 +61,7 @@ public class LyCompatibleController {
     private TaskTaskServiceImpl taskTaskServiceImpl;
 
     @PostMapping("sendPhoto")
+    @IgnoreToken
     public R sendPhoto(@RequestParam(value = "file", required = false) MultipartFile file, HttpServletRequest request) {
         Map<String, String> headersMap = new HashMap<String, String>();
         Enumeration<String> headerNames = request.getHeaderNames();
@@ -72,12 +77,14 @@ public class LyCompatibleController {
             return R.error("请传入秘钥!");
         }
         String scid = request.getParameter("scid");
-        Long scenicId = 0L;
+        long scenicId;
         if (StringUtils.isBlank(scid)) {
             return R.error("景区ID为空!");
         }
         if (StringUtils.equals("288",scid)) {
-            // 正式景区
+            scenicId = 3955650120997015552L;
+        } else {
+            scenicId = 3946669713328836608L;
         }
         String openId = headersMap.get("client");
         MemberRespVO member = memberMapper.getByOpenId(openId);
@@ -104,7 +111,8 @@ public class LyCompatibleController {
         return R.ok().put("data", resp);
     }
 
-    @PostMapping("getIsVideo")
+    @RequestMapping("getIsVideo")
+    @IgnoreToken
     public R getIsVideo(HttpServletRequest request) {
         Map<String, String> headersMap = new HashMap<String, String>();
         Enumeration<String> headerNames = request.getHeaderNames();
@@ -140,7 +148,8 @@ public class LyCompatibleController {
         }
     }
 
-    @PostMapping("getNewVideo")
+    @RequestMapping("getNewVideo")
+    @IgnoreToken
     public R getNewVideo(HttpServletRequest request) {
         Map<String, String> headersMap = new HashMap<String, String>();
         Enumeration<String> headerNames = request.getHeaderNames();
diff --git a/src/main/java/com/ycwl/basic/controller/pc/BrokerController.java b/src/main/java/com/ycwl/basic/controller/pc/BrokerController.java
index 6644d67..258a9ae 100644
--- a/src/main/java/com/ycwl/basic/controller/pc/BrokerController.java
+++ b/src/main/java/com/ycwl/basic/controller/pc/BrokerController.java
@@ -99,11 +99,11 @@ public class BrokerController {
     }
 
     @ApiOperation("根据brokerId和时间范围查询每天的记录数量和orderPrice汇总")
-    @GetMapping("/record/dailySummary")
+    @GetMapping("/{id}/record/summary")
     public ApiResponse<List<DailySummaryRespVO>> getDailySummaryByBrokerId(
-            @RequestParam Long brokerId,
-            @RequestParam @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss") Date startTime,
-            @RequestParam @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss") Date endTime) {
+            @PathVariable("id") Long brokerId,
+            @RequestParam @DateTimeFormat(pattern = "yyyy-MM-dd") Date startTime,
+            @RequestParam @DateTimeFormat(pattern = "yyyy-MM-dd") Date endTime) {
         return ApiResponse.success(brokerRecordService.getDailySummaryByBrokerId(brokerId, startTime, endTime));
     }
 
diff --git a/src/main/java/com/ycwl/basic/model/pc/broker/entity/BrokerRecord.java b/src/main/java/com/ycwl/basic/model/pc/broker/entity/BrokerRecord.java
index 265150f..e214dd5 100644
--- a/src/main/java/com/ycwl/basic/model/pc/broker/entity/BrokerRecord.java
+++ b/src/main/java/com/ycwl/basic/model/pc/broker/entity/BrokerRecord.java
@@ -22,6 +22,7 @@ public class BrokerRecord {
     private BigDecimal orderPrice;
     private BigDecimal brokerRate;
     private BigDecimal brokerPrice;
+    private BigDecimal directPrice;
     private String reason;
     private Date createTime;
 }
\ No newline at end of file
diff --git a/src/main/java/com/ycwl/basic/model/pc/broker/req/BrokerRecordReqQuery.java b/src/main/java/com/ycwl/basic/model/pc/broker/req/BrokerRecordReqQuery.java
index d1dee00..ce77fda 100644
--- a/src/main/java/com/ycwl/basic/model/pc/broker/req/BrokerRecordReqQuery.java
+++ b/src/main/java/com/ycwl/basic/model/pc/broker/req/BrokerRecordReqQuery.java
@@ -1,6 +1,7 @@
 package com.ycwl.basic.model.pc.broker.req;
 
 import com.baomidou.mybatisplus.annotation.TableId;
+import com.fasterxml.jackson.annotation.JsonFormat;
 import com.ycwl.basic.model.common.BaseQueryParameterReq;
 import io.swagger.annotations.ApiModel;
 import io.swagger.annotations.ApiModelProperty;
@@ -18,7 +19,9 @@ public class BrokerRecordReqQuery extends BaseQueryParameterReq {
     private Long brokerId;
     private Long orderId;
     @ApiModelProperty("开始时间")
+    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8")
     private Date startTime;
     @ApiModelProperty("结束时间")
+    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8")
     private Date endTime;
 }
\ No newline at end of file
diff --git a/src/main/java/com/ycwl/basic/model/pc/broker/resp/DailySummaryRespVO.java b/src/main/java/com/ycwl/basic/model/pc/broker/resp/DailySummaryRespVO.java
index 0127abb..db57685 100644
--- a/src/main/java/com/ycwl/basic/model/pc/broker/resp/DailySummaryRespVO.java
+++ b/src/main/java/com/ycwl/basic/model/pc/broker/resp/DailySummaryRespVO.java
@@ -1,5 +1,6 @@
 package com.ycwl.basic.model.pc.broker.resp;
 
+import com.fasterxml.jackson.annotation.JsonFormat;
 import lombok.Data;
 
 import java.math.BigDecimal;
@@ -11,7 +12,10 @@ import java.util.Date;
  */
 @Data
 public class DailySummaryRespVO {
+    @JsonFormat(pattern = "yyyy-MM-dd", timezone = "GMT+8")
     private Date date;
-    private Long recordCount;
+    private Long scanCount;
+    private Long orderCount;
     private BigDecimal totalOrderPrice;
+    private BigDecimal totalBrokerPrice;
 }
\ No newline at end of file
diff --git a/src/main/java/com/ycwl/basic/model/pc/scenic/entity/ScenicConfigEntity.java b/src/main/java/com/ycwl/basic/model/pc/scenic/entity/ScenicConfigEntity.java
index 7051797..0bf1a72 100644
--- a/src/main/java/com/ycwl/basic/model/pc/scenic/entity/ScenicConfigEntity.java
+++ b/src/main/java/com/ycwl/basic/model/pc/scenic/entity/ScenicConfigEntity.java
@@ -3,6 +3,7 @@ package com.ycwl.basic.model.pc.scenic.entity;
 import com.baomidou.mybatisplus.annotation.TableId;
 import com.baomidou.mybatisplus.annotation.TableName;
 import com.fasterxml.jackson.annotation.JsonFormat;
+import com.ycwl.basic.storage.enums.StorageType;
 import lombok.Data;
 
 import java.math.BigDecimal;
@@ -65,4 +66,7 @@ public class ScenicConfigEntity {
      * 人脸识别阈值,是0~100的数值
      */
     private Float faceScoreThreshold;
+    private StorageType storeType;
+    private String storeConfigJson;
+    private BigDecimal brokerDirectRate;
 }
diff --git a/src/main/java/com/ycwl/basic/service/impl/mobile/AppScenicServiceImpl.java b/src/main/java/com/ycwl/basic/service/impl/mobile/AppScenicServiceImpl.java
index 94c77f2..b379f64 100644
--- a/src/main/java/com/ycwl/basic/service/impl/mobile/AppScenicServiceImpl.java
+++ b/src/main/java/com/ycwl/basic/service/impl/mobile/AppScenicServiceImpl.java
@@ -164,17 +164,6 @@ public class AppScenicServiceImpl implements AppScenicService {
         sourceVideoContent.setLockType(1);
         sourceImageContent.setLockType(1);
         ScenicConfigEntity scenicConfig = scenicRepository.getScenicConfig(faceRespVO.getScenicId());
-        if (!Integer.valueOf(1).equals(scenicConfig.getDisableSourceVideo())) {
-            IsBuyRespVO isBuyRespVO = orderBiz.isBuy(userId, faceRespVO.getScenicId(), 1, faceId);
-            sourceVideoContent.setSourceType(isBuyRespVO.getGoodsType());
-            sourceVideoContent.setContentId(isBuyRespVO.getGoodsId());
-            if (isBuyRespVO.isBuy()) {
-                sourceVideoContent.setIsBuy(1);
-            } else {
-                sourceVideoContent.setIsBuy(0);
-            }
-            contentList.add(sourceVideoContent);
-        }
         if (!Integer.valueOf(1).equals(scenicConfig.getDisableSourceImage())) {
             IsBuyRespVO isBuyRespVO = orderBiz.isBuy(userId, faceRespVO.getScenicId(), 2, faceId);
             sourceImageContent.setSourceType(isBuyRespVO.getGoodsType());
@@ -186,7 +175,17 @@ public class AppScenicServiceImpl implements AppScenicService {
             }
             contentList.add(sourceImageContent);
         }
-
+        if (!Integer.valueOf(1).equals(scenicConfig.getDisableSourceVideo())) {
+            IsBuyRespVO isBuyRespVO = orderBiz.isBuy(userId, faceRespVO.getScenicId(), 1, faceId);
+            sourceVideoContent.setSourceType(isBuyRespVO.getGoodsType());
+            sourceVideoContent.setContentId(isBuyRespVO.getGoodsId());
+            if (isBuyRespVO.isBuy()) {
+                sourceVideoContent.setIsBuy(1);
+            } else {
+                sourceVideoContent.setIsBuy(0);
+            }
+            contentList.add(sourceVideoContent);
+        }
         sourceList.stream().collect(Collectors.groupingBy(SourceRespVO::getType)).forEach((type, list) -> {
             ContentPageVO contentPageVO = new ContentPageVO();
             if (type == 1) {
diff --git a/src/main/java/com/ycwl/basic/service/task/impl/TaskTaskServiceImpl.java b/src/main/java/com/ycwl/basic/service/task/impl/TaskTaskServiceImpl.java
index b018b66..15a93fa 100644
--- a/src/main/java/com/ycwl/basic/service/task/impl/TaskTaskServiceImpl.java
+++ b/src/main/java/com/ycwl/basic/service/task/impl/TaskTaskServiceImpl.java
@@ -7,6 +7,7 @@ import com.alibaba.fastjson.JSONObject;
 import com.ycwl.basic.biz.OrderBiz;
 import com.ycwl.basic.biz.TaskStatusBiz;
 import com.ycwl.basic.biz.TemplateBiz;
+import com.ycwl.basic.constant.StorageConstant;
 import com.ycwl.basic.constant.TaskConstant;
 import com.ycwl.basic.mapper.FaceMapper;
 import com.ycwl.basic.mapper.FaceSampleMapper;
@@ -51,6 +52,7 @@ import com.ycwl.basic.repository.VideoTaskRepository;
 import com.ycwl.basic.service.task.TaskService;
 import com.ycwl.basic.storage.StorageFactory;
 import com.ycwl.basic.storage.adapters.IStorageAdapter;
+import com.ycwl.basic.storage.utils.StorageUtil;
 import com.ycwl.basic.task.VideoPieceGetter;
 import com.ycwl.basic.repository.TemplateRepository;
 import com.ycwl.basic.utils.SnowFlakeUtil;
@@ -635,8 +637,15 @@ public class TaskTaskServiceImpl implements TaskService {
         if (task == null) {
             return null;
         }
-        IStorageAdapter adapter = StorageFactory.use("video");
-        String filename = task.getId() + "_" + task.getScenicId() + ".mp4";
+        IStorageAdapter adapter;
+        ScenicConfigEntity scenicConfig = scenicRepository.getScenicConfig(task.getScenicId());
+        if (scenicConfig != null && scenicConfig.getStoreType() != null) {
+            adapter = StorageFactory.get(scenicConfig.getStoreType());
+            adapter.loadConfig(JSONObject.parseObject(scenicConfig.getStoreConfigJson(), Map.class));
+        } else {
+            adapter = StorageFactory.use("video");
+        }
+        String filename = StorageUtil.joinPath(StorageConstant.VLOG_PATH, task.getId() + "_" + task.getScenicId() + ".mp4");
         if (StringUtils.isBlank(task.getVideoUrl())) {
             // 生成
             String url = adapter.getUrl(filename);
diff --git a/src/main/resources/mapper/BrokerMapper.xml b/src/main/resources/mapper/BrokerMapper.xml
index bbc0b92..c038d90 100644
--- a/src/main/resources/mapper/BrokerMapper.xml
+++ b/src/main/resources/mapper/BrokerMapper.xml
@@ -2,7 +2,7 @@
 <!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
 <mapper namespace="com.ycwl.basic.mapper.BrokerMapper">
     <insert id="add">
-        insert into broker(scenic_id, `name`, phone, status, broker_enable, broker_rate, create_at, update_at) values (#{scenicId}, #{name}, #{phone}, 0, #{brokerEnable}, #{brokerRate}, now(), now())
+        insert into broker(scenic_id, `name`, phone, status, broker_enable, broker_rate, create_at, update_at) values (#{scenicId}, #{name}, #{phone}, 1, #{brokerEnable}, #{brokerRate}, now(), now())
     </insert>
     <update id="update">
         update broker set `name` = #{name}, phone = #{phone}, broker_enable = #{brokerEnable}, broker_rate = #{brokerRate}, update_at = now() where id = #{id}
@@ -35,11 +35,13 @@
         delete from broker where id = #{id}
     </delete>
     <select id="list" resultType="com.ycwl.basic.model.pc.broker.resp.BrokerRespVO">
-        select b.id, scenic_id, s.name as scenicName, b.`name`, b.phone, b.broker_enable, b.broker_rate, b.status, b.create_at, b.update_at,
+        select b.id, scenic_id, s.name as scenicName, b.`name`, b.phone, b.broker_enable, b.broker_rate, b.status,
                (select count(1) from statistics s where s.type = 20 and s.morph_id = b.id) as broker_scan_count,
                (select count(1) from broker_record r where r.broker_id = b.id) as broker_order_count,
                (select sum(order_price) from broker_record r where r.broker_id = b.id) as broker_order_amount,
-               create_at, update_at
+               (select min(r.create_time) from broker_record r where r.broker_id = b.id) as first_broker_date,
+               (select max(r.create_time) from broker_record r where r.broker_id = b.id) as last_broker_date,
+               b.create_at, b.update_at
         from broker b left join scenic s on b.scenic_id = s.id
         <where>
             <if test="scenicId!= null">
diff --git a/src/main/resources/mapper/BrokerRecordMapper.xml b/src/main/resources/mapper/BrokerRecordMapper.xml
index 4d4d972..c0993fd 100644
--- a/src/main/resources/mapper/BrokerRecordMapper.xml
+++ b/src/main/resources/mapper/BrokerRecordMapper.xml
@@ -31,23 +31,26 @@
 
     <select id="getDailySummaryByBrokerId" resultType="com.ycwl.basic.model.pc.broker.resp.DailySummaryRespVO">
         SELECT date_series.date AS date,
-               COALESCE(COUNT(br.id), 0) AS recordCount,
-               COALESCE(SUM(br.order_price), 0) AS totalOrderPrice
+               COALESCE(COUNT(s.id), 0) AS scanCount,
+               COALESCE(COUNT(br.id), 0) AS orderCount,
+               COALESCE(SUM(br.order_price), 0) AS totalOrderPrice,
+               COALESCE(SUM(br.broker_price), 0) AS totalBrokerPrice
         FROM (
             SELECT DATE_ADD(#{startTime}, INTERVAL (units.i + tens.i * 10 + hundreds.i * 100) DAY) AS date
             FROM (SELECT 0 AS i UNION ALL SELECT 1 UNION ALL SELECT 2 UNION ALL SELECT 3 UNION ALL SELECT 4 UNION ALL SELECT 5 UNION ALL SELECT 6 UNION ALL SELECT 7 UNION ALL SELECT 8 UNION ALL SELECT 9) units
             CROSS JOIN (SELECT 0 AS i UNION ALL SELECT 1 UNION ALL SELECT 2 UNION ALL SELECT 3 UNION ALL SELECT 4 UNION ALL SELECT 5 UNION ALL SELECT 6 UNION ALL SELECT 7 UNION ALL SELECT 8 UNION ALL SELECT 9) tens
             CROSS JOIN (SELECT 0 AS i UNION ALL SELECT 1 UNION ALL SELECT 2 UNION ALL SELECT 3 UNION ALL SELECT 4 UNION ALL SELECT 5 UNION ALL SELECT 6 UNION ALL SELECT 7 UNION ALL SELECT 8 UNION ALL SELECT 9) hundreds
-            WHERE DATE_ADD(#{startTime}, INTERVAL (units.i + tens.i * 10) DAY) &lt;= #{endTime}
+            WHERE DATE_ADD(#{startTime}, INTERVAL (units.i + tens.i * 10 + hundreds.i * 100) DAY) &lt;= #{endTime}
         ) date_series
         LEFT JOIN broker_record br ON DATE(br.create_time) = date_series.date AND br.broker_id = #{brokerId}
+        LEFT JOIN statistics s ON s.type = 20 and DATE(s.create_time) = date_series.date and s.morph_id = #{brokerId}
         GROUP BY date_series.date
         ORDER BY date_series.date
     </select>
 
     <insert id="add">
-        insert into broker_record(broker_id, order_id, order_price, broker_rate, broker_price, reason, create_time)
-        values (#{brokerId}, #{orderId}, #{orderPrice}, #{brokerRate}, #{brokerPrice}, #{reason}, now())
+        insert into broker_record(broker_id, order_id, order_price, broker_rate, broker_price, direct_price, reason, create_time)
+        values (#{brokerId}, #{orderId}, #{orderPrice}, #{brokerRate}, #{brokerPrice}, #{directPrice}, #{reason}, now())
     </insert>
 
     <delete id="deleteById">
diff --git a/src/main/resources/mapper/ScenicMapper.xml b/src/main/resources/mapper/ScenicMapper.xml
index 955c4b2..2fa8800 100644
--- a/src/main/resources/mapper/ScenicMapper.xml
+++ b/src/main/resources/mapper/ScenicMapper.xml
@@ -103,7 +103,10 @@
             image_source_store_day=#{imageSourceStoreDay},
             user_source_expire_day=#{userSourceExpireDay},
             face_score_threshold=#{faceScoreThreshold},
-            force_finish_time=#{forceFinishTime}
+            force_finish_time=#{forceFinishTime},
+            store_type=#{storeType},
+            store_config_json=#{storeConfigJson},
+            broker_direct_rate=#{brokerDirectRate}
         </set>
         where id = #{id}
     </update>