Procházet zdrojové kódy

新增商户表数据同步,实现水平分表功能

mac před 2 roky
rodič
revize
7ca56cee21
15 změnil soubory, kde provedl 326 přidání a 37 odebrání
  1. 40 0
      kxs-common/kxs-common-mybatis/src/main/java/com/kxs/common/mybatis/config/MybatisPlusConfig.java
  2. 46 0
      kxs-common/kxs-common-mybatis/src/main/java/com/kxs/common/mybatis/handler/MonthTableNameHandler.java
  3. 18 0
      kxs-product/kxs-product-api/src/main/java/com/kxs/product/api/model/KxsMachine.java
  4. 6 0
      kxs-product/kxs-product-api/src/main/java/com/kxs/product/api/model/KxsMachineRatio.java
  5. 21 14
      kxs-product/kxs-product-api/src/main/java/com/kxs/product/api/model/KxsMerchant.java
  6. 3 0
      kxs-product/kxs-product-biz/src/main/resources/mapper/KxsMachineMapper.xml
  7. 1 0
      kxs-product/kxs-product-biz/src/main/resources/mapper/KxsMachineRatioMapper.xml
  8. 3 2
      kxs-product/kxs-product-biz/src/main/resources/mapper/KxsMerchantMapper.xml
  9. 6 17
      kxs-transfer/src/main/java/com/kxs/transfer/api/controller/DtsController.java
  10. 19 0
      kxs-transfer/src/main/java/com/kxs/transfer/api/mapper/product/KxsMerchantMapper.java
  11. 17 0
      kxs-transfer/src/main/java/com/kxs/transfer/api/service/product/KxsMerchantService.java
  12. 4 0
      kxs-transfer/src/main/java/com/kxs/transfer/api/service/product/impl/KxsMachineRatioServiceImpl.java
  13. 12 0
      kxs-transfer/src/main/java/com/kxs/transfer/api/service/product/impl/KxsMachineServiceImpl.java
  14. 119 0
      kxs-transfer/src/main/java/com/kxs/transfer/api/service/product/impl/KxsMerchantServiceImpl.java
  15. 11 4
      kxs-transfer/src/main/resources/import.txt

+ 40 - 0
kxs-common/kxs-common-mybatis/src/main/java/com/kxs/common/mybatis/config/MybatisPlusConfig.java

@@ -0,0 +1,40 @@
+package com.kxs.common.mybatis.config;
+
+import com.baomidou.mybatisplus.extension.plugins.MybatisPlusInterceptor;
+import com.baomidou.mybatisplus.extension.plugins.inner.BlockAttackInnerInterceptor;
+import com.baomidou.mybatisplus.extension.plugins.inner.DynamicTableNameInnerInterceptor;
+import com.kxs.common.mybatis.handler.MonthTableNameHandler;
+import org.springframework.context.annotation.Bean;
+import org.springframework.context.annotation.Configuration;
+
+import java.util.Random;
+
+/**
+ * mybatis plus 配置
+ *
+ * @author 没秃顶的码农
+ * @date 2024-03-18
+ */
+@Configuration
+public class MybatisPlusConfig {
+
+    /**
+     * @return {@link MybatisPlusInterceptor}
+     */
+    @Bean
+    public MybatisPlusInterceptor mybatisPlusInterceptor() {
+        //针对 update 和 delete 语句 作用: 阻止恶意的全表更新删除
+        MybatisPlusInterceptor interceptor = new MybatisPlusInterceptor();
+        interceptor.addInnerInterceptor(new BlockAttackInnerInterceptor());
+
+        //动态分表
+        DynamicTableNameInnerInterceptor dynamicTableNameInnerInterceptor = new DynamicTableNameInnerInterceptor();
+        dynamicTableNameInnerInterceptor.setTableNameHandler(
+                new MonthTableNameHandler("kxs_user_amount_log")
+        );
+
+        interceptor.addInnerInterceptor(dynamicTableNameInnerInterceptor);
+        return interceptor;
+    }
+
+}

+ 46 - 0
kxs-common/kxs-common-mybatis/src/main/java/com/kxs/common/mybatis/handler/MonthTableNameHandler.java

@@ -0,0 +1,46 @@
+package com.kxs.common.mybatis.handler;
+
+import com.baomidou.mybatisplus.extension.plugins.handler.TableNameHandler;
+
+import java.util.Arrays;
+import java.util.List;
+
+/**
+ * 按月份参数,组成动态表名
+ *
+ * @author 没秃顶的码农
+ * @date 2024-03-18
+ */
+public class MonthTableNameHandler implements TableNameHandler {
+
+    //用于记录哪些表可以使用该月份动态表名处理器(即哪些表按月分表)
+    private List<String> tableNames;
+    //构造函数,构造动态表名处理器的时候,传递tableNames参数
+    public MonthTableNameHandler(String ...tableNames) {
+        this.tableNames = Arrays.asList(tableNames);
+    }
+
+    //每个请求线程维护一个month数据,避免多线程数据冲突。所以使用ThreadLocal
+    private static final ThreadLocal<String> MONTH_DATA = new ThreadLocal<>();
+    //设置请求线程的month数据
+    public static void setData(String month) {
+        MONTH_DATA.set(month);
+    }
+    //删除当前请求线程的month数据
+    public static void removeData() {
+        MONTH_DATA.remove();
+    }
+
+    //动态表名接口实现方法
+    @Override
+    public String dynamicTableName(String sql, String tableName) {
+        // 删除当前id
+        removeData();
+        if (this.tableNames.contains(tableName)){
+            return tableName + "_" + MONTH_DATA.get();  //表名增加月份后缀
+        }else{
+            return tableName;   //表名原样返回
+        }
+    }
+}
+

+ 18 - 0
kxs-product/kxs-product-api/src/main/java/com/kxs/product/api/model/KxsMachine.java

@@ -276,6 +276,24 @@ public class KxsMachine extends Model<KxsMachine> implements Serializable {
     @Schema(description = "业务批次号")
     private String batchNo;
 
+    /**
+     * 贷记卡交易额
+     */
+    @Schema(description = "贷记卡交易额")
+    private BigDecimal creditTrade;
+
+    /**
+     * 借记卡交易额
+     */
+    @Schema(description = "借记卡交易额")
+    private BigDecimal debitCardTrade;
+
+    /**
+     * 扫码交易额
+     */
+    @Schema(description = "扫码交易额")
+    private BigDecimal scanQrTrade;
+
 
 }
 

+ 6 - 0
kxs-product/kxs-product-api/src/main/java/com/kxs/product/api/model/KxsMachineRatio.java

@@ -79,6 +79,12 @@ public class KxsMachineRatio extends Model<KxsMachineRatio> implements Serializa
     @Schema(description = "用户ID")
     private Integer userId;
 
+    /**
+     * 机具所属人用户ID
+     */
+    @Schema(description = "机具所属人用户ID")
+    private Integer posUserId;
+
 
     /**
      * 机具

+ 21 - 14
kxs-product/kxs-product-api/src/main/java/com/kxs/product/api/model/KxsMerchant.java

@@ -116,13 +116,6 @@ public class KxsMerchant extends Model<KxsMerchant> implements Serializable {
     private Integer brandId;
 
 
-    /**
-     * 商户等级 0扶持期 1稳定期 2盈利期
-     */
-    @Schema(description = "商户等级 0扶持期 1稳定期 2盈利期")
-    private Integer merchantLevel;
-
-
     /**
      * 商户状态 0关闭 1正常 2冻结
      */
@@ -137,13 +130,6 @@ public class KxsMerchant extends Model<KxsMerchant> implements Serializable {
     private String address;
 
 
-    /**
-     * 商户总交易额
-     */
-    @Schema(description = "商户总交易额")
-    private BigDecimal tradeTotal;
-
-
     /**
      * 是否商户型创客 0否 1是
      */
@@ -158,6 +144,27 @@ public class KxsMerchant extends Model<KxsMerchant> implements Serializable {
     private Integer makerUserId;
 
 
+    /**
+     * 退押达标状态 待处理=0 退还成功=1 退还失败=2 处理中=3 已达标=100 可退还=101
+     */
+    @Schema(description = "退押达标状态 待处理=0 退还成功=1 退还失败=2 处理中=3 已达标=100 可退还=101")
+    private Integer standardStatus;
+
+
+    /**
+     * 退押达标月数
+     */
+    @Schema(description = "退押达标月数")
+    private Integer standardMonths;
+
+
+    /**
+     * 备注
+     */
+    @Schema(description = "备注")
+    private String remark;
+
+
 
 
 }

+ 3 - 0
kxs-product/kxs-product-biz/src/main/resources/mapper/KxsMachineMapper.xml

@@ -36,6 +36,9 @@
         <result column="return_status" property="returnStatus"/>
         <result column="pre_user_id" property="preUserId"/>
         <result column="batch_no" property="batchNo"/>
+        <result column="credit_trade" property="creditTrade"/>
+        <result column="debit_card_trade" property="debitCardTrade"/>
+        <result column="scan_qr_trade" property="scanQrTrade"/>
 
     </resultMap>
     <select id="machineStoreList" resultType="com.kxs.product.api.vo.kxsapp.machine.MachineStoreListVO">

+ 1 - 0
kxs-product/kxs-product-biz/src/main/resources/mapper/KxsMachineRatioMapper.xml

@@ -9,6 +9,7 @@
         <result column="del_flag" property="delFlag" />
         <result column="version" property="version" />
         <result column="user_id" property="userId" />
+        <result column="posUserId" property="posUserId" />
         <result column="pos_sn" property="posSn" />
         <result column="merchant_id" property="merchantId" />
         <result column="machine_id" property="machineId" />

+ 3 - 2
kxs-product/kxs-product-biz/src/main/resources/mapper/KxsMerchantMapper.xml

@@ -15,12 +15,13 @@
         <result column="user_id" property="userId" />
         <result column="merchant_phone" property="merchantPhone" />
         <result column="brand_id" property="brandId" />
-        <result column="merchant_level" property="merchantLevel" />
         <result column="status" property="status" />
         <result column="address" property="address" />
-        <result column="trade_total" property="tradeTotal" />
         <result column="is_maker" property="isMaker" />
         <result column="maker_user_id" property="makerUserId" />
+        <result column="standard_status" property="standardStatus" />
+        <result column="standard_months" property="standardMonths" />
+        <result column="remark" property="remark" />
 
     </resultMap>
 

+ 6 - 17
kxs-transfer/src/main/java/com/kxs/transfer/api/controller/DtsController.java

@@ -3,6 +3,7 @@ package com.kxs.transfer.api.controller;
 import com.alibaba.fastjson.JSON;
 import com.aliyun.dts.subscribe.clients.record.DefaultUserRecord;
 import com.baomidou.mybatisplus.core.toolkit.Wrappers;
+import com.kxs.product.api.model.KxsMerchant;
 import com.kxs.system.api.model.KxsSchoolStudy;
 import com.kxs.transfer.api.annotation.DtsMsgListener;
 import com.kxs.transfer.api.model.KxsDtsErrorLog;
@@ -64,7 +65,7 @@ public class DtsController {
     private final KxsMachineRatioService kxsMachineRatioService;
     private final KxsTicketService kxsTicketService;
     private final KxsTicketTransferService kxsTicketTransferService;
-    private final KxsTicketTransferInfoService kxsTicketTransferInfoService;
+    private final KxsMerchantService kxsMerchantService;
 
     //仓库模块
     private final KxsWarehouseService kxsWarehouseService;
@@ -99,21 +100,6 @@ public class DtsController {
                     return;
                 }
             }
-            if ("PosMachinesTwo".equals(dmlData.getTableName())){
-                List<String> changeFieldList = dmlData.getChangeFieldList();
-                if (changeFieldList.size() == 1 && changeFieldList.contains("CreditTrade")) {
-                    record.commit(String.valueOf(record.getSourceTimestamp()));
-                    return;
-                }
-                if (changeFieldList.size() == 1 && changeFieldList.contains("DebitCardTrade")) {
-                    record.commit(String.valueOf(record.getSourceTimestamp()));
-                    return;
-                }
-                if (changeFieldList.size() == 1 && changeFieldList.contains("ScanQrTrade")) {
-                    record.commit(String.valueOf(record.getSourceTimestamp()));
-                    return;
-                }
-            }
             //去重数据
             KxsDtsLog dtsLog = kxsDtsLogService.getOne(Wrappers.<KxsDtsLog>lambdaQuery().eq(KxsDtsLog::getDataId, dataId));
             if (dtsLog != null) {
@@ -202,6 +188,10 @@ public class DtsController {
             if ("PosMachinesTwo".equals(dmlData.getTableName())) {
                 kxsMachineService.changeData(dmlData);
             }
+            //商户表
+            if ("PosMerchantInfo".equals(dmlData.getTableName())) {
+                kxsMerchantService.changeData(dmlData);
+            }
             //机具回收表
             if ("RecycMachineOrder".equals(dmlData.getTableName())) {
                 kxsMachineRecycleService.changeData(dmlData);
@@ -230,7 +220,6 @@ public class DtsController {
                 kxsTicketTransferService.changeInfoData(dmlData);
             }
 
-
             //存储历史数据
             KxsDtsLog kxsDtsLog = new KxsDtsLog();
             kxsDtsLog.setDataId(dataId);

+ 19 - 0
kxs-transfer/src/main/java/com/kxs/transfer/api/mapper/product/KxsMerchantMapper.java

@@ -0,0 +1,19 @@
+package com.kxs.transfer.api.mapper.product;
+
+import com.baomidou.dynamic.datasource.annotation.DS;
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+import com.kxs.product.api.model.KxsMerchant;
+import org.apache.ibatis.annotations.Mapper;
+
+/**
+ * 客小爽商户表(KxsMerchant)表数据库访问层
+ *
+ * @author 系统
+ * @since 2023-12-20 10:09:35
+ */
+@Mapper
+@DS("product")
+public interface KxsMerchantMapper extends BaseMapper<KxsMerchant> {
+
+}
+

+ 17 - 0
kxs-transfer/src/main/java/com/kxs/transfer/api/service/product/KxsMerchantService.java

@@ -0,0 +1,17 @@
+package com.kxs.transfer.api.service.product;
+
+import com.baomidou.mybatisplus.extension.service.IService;
+import com.kxs.product.api.model.KxsMerchant;
+import com.kxs.transfer.api.model.table.DMLData;
+
+/**
+ * 客小爽商户表(KxsMerchant)表服务接口
+ *
+ * @author 系统
+ * @since 2023-12-20 10:09:35
+ */
+public interface KxsMerchantService extends IService<KxsMerchant> {
+
+    void changeData(DMLData dmlData);
+}
+

+ 4 - 0
kxs-transfer/src/main/java/com/kxs/transfer/api/service/product/impl/KxsMachineRatioServiceImpl.java

@@ -45,6 +45,10 @@ public class KxsMachineRatioServiceImpl extends ServiceImpl<KxsMachineRatioMappe
                     int userId = Integer.parseInt(validFieldDataMap.get(field).toString());
                     machineRatio.setUserId(userId);
                     break;
+                case "PosUserId":
+                    int posUserId = Integer.parseInt(validFieldDataMap.get(field).toString());
+                    machineRatio.setPosUserId(posUserId);
+                    break;
                 case "Status":
                     int status = Integer.parseInt(validFieldDataMap.get(field).toString());
                     machineRatio.setStatus(status == -1 ? 0 : 1);

+ 12 - 0
kxs-transfer/src/main/java/com/kxs/transfer/api/service/product/impl/KxsMachineServiceImpl.java

@@ -148,6 +148,18 @@ public class KxsMachineServiceImpl extends ServiceImpl<KxsMachineMapper, KxsMach
                     machine.setMachineRatio(new BigDecimal(validFieldDataMap.get(field).toString()));
                     lambda.set(KxsMachine::getMachineRatio, new BigDecimal(validFieldDataMap.get(field).toString()));
                     break;
+                case "CreditTrade":
+                    machine.setCreditTrade(new BigDecimal(validFieldDataMap.get(field).toString()));
+                    lambda.set(KxsMachine::getCreditTrade, new BigDecimal(validFieldDataMap.get(field).toString()));
+                    break;
+                case "DebitCardTrade":
+                    machine.setDebitCardTrade(new BigDecimal(validFieldDataMap.get(field).toString()));
+                    lambda.set(KxsMachine::getDebitCardTrade, new BigDecimal(validFieldDataMap.get(field).toString()));
+                    break;
+                case "ScanQrTrade":
+                    machine.setScanQrTrade(new BigDecimal(validFieldDataMap.get(field).toString()));
+                    lambda.set(KxsMachine::getScanQrTrade, new BigDecimal(validFieldDataMap.get(field).toString()));
+                    break;
                 case "ActivationState":
                     machine.setIsAct(Integer.valueOf(validFieldDataMap.get(field).toString()));
                     lambda.set(KxsMachine::getIsAct, Integer.valueOf(validFieldDataMap.get(field).toString()));

+ 119 - 0
kxs-transfer/src/main/java/com/kxs/transfer/api/service/product/impl/KxsMerchantServiceImpl.java

@@ -0,0 +1,119 @@
+package com.kxs.transfer.api.service.product.impl;
+
+import cn.hutool.core.date.DatePattern;
+import cn.hutool.core.date.LocalDateTimeUtil;
+import com.aliyun.dts.subscribe.clients.record.OperationType;
+import com.baomidou.mybatisplus.core.toolkit.Wrappers;
+import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
+import com.kxs.product.api.model.KxsMachine;
+import com.kxs.product.api.model.KxsMachineRatio;
+import com.kxs.product.api.model.KxsMerchant;
+import com.kxs.transfer.api.mapper.product.KxsMerchantMapper;
+import com.kxs.transfer.api.model.table.DMLData;
+import com.kxs.transfer.api.service.product.KxsMachineRatioService;
+import com.kxs.transfer.api.service.product.KxsMachineService;
+import com.kxs.transfer.api.service.product.KxsMerchantService;
+import lombok.RequiredArgsConstructor;
+import org.springframework.stereotype.Service;
+
+import java.math.BigDecimal;
+import java.util.List;
+import java.util.Map;
+
+/**
+ * 客小爽商户表(KxsMerchant)表服务实现类
+ *
+ * @author 系统
+ * @since 2023-12-20 10:09:35
+ */
+@Service("kxsMerchantService")
+@RequiredArgsConstructor
+public class KxsMerchantServiceImpl extends ServiceImpl<KxsMerchantMapper, KxsMerchant> implements KxsMerchantService {
+
+    private final KxsMachineService kxsMachineService;
+    @Override
+    public void changeData(DMLData dmlData) {
+        //修改的字段值
+        Map<String, Object> validFieldDataMap = dmlData.getValidFieldDataMap();
+        //修改的字段
+        List<String> changeFieldList = dmlData.getChangeFieldList();
+        //操作的主键
+        int id = Integer.parseInt(dmlData.getId());
+
+        KxsMerchant merchant = new KxsMerchant();
+        merchant.setId(id);
+
+        OperationType operation = dmlData.getOperation();
+
+        if(operation.equals(OperationType.DELETE)){
+            baseMapper.deleteById(merchant.getId());
+            return;
+        }
+        for (String field : changeFieldList) {
+
+            switch (field) {
+                case "UserId":
+                    int userId = Integer.parseInt(validFieldDataMap.get(field).toString());
+                    merchant.setUserId(userId);
+                    break;
+                case "MerchantNo":
+                    merchant.setMerchantNo(validFieldDataMap.get(field).toString());
+                    break;
+                case "MerchantName":
+                    merchant.setMerchantName(validFieldDataMap.get(field).toString());
+                    break;
+                case "MerIdcardNo":
+                    merchant.setMerchantCard(validFieldDataMap.get(field).toString());
+                    break;
+                case "MerchantMobile":
+                    merchant.setMerchantPhone(validFieldDataMap.get(field).toString());
+                    break;
+                case "BrandId":
+                    merchant.setBrandId(Integer.valueOf(validFieldDataMap.get(field).toString()));
+                    break;
+                case "KqSnNo":
+                    String sn = validFieldDataMap.get(field).toString();
+                    KxsMachine kxsMachine = kxsMachineService.getOne(Wrappers.<KxsMachine>lambdaQuery().eq(KxsMachine::getPosSn, sn));
+                    if(kxsMachine != null){
+                        merchant.setMachineId(kxsMachine.getId());
+                    }
+                    break;
+                case "MerUserId":
+                    merchant.setMakerUserId(Integer.valueOf(validFieldDataMap.get(field).toString()));
+                    break;
+                case "MerUserType":
+                    merchant.setIsMaker(Integer.valueOf(validFieldDataMap.get(field).toString()));
+                    break;
+                case "StandardStatus":
+                    merchant.setStandardStatus(Integer.valueOf(validFieldDataMap.get(field).toString()));
+                    break;
+                case "StandardMonths":
+                    merchant.setStandardMonths(Integer.valueOf(validFieldDataMap.get(field).toString()));
+                    break;
+                case "Remark":
+                    merchant.setRemark(validFieldDataMap.get(field).toString());
+                    break;
+                case "CreateDate":
+                    merchant.setCreateTime(LocalDateTimeUtil.parse(validFieldDataMap.get(field).toString(), DatePattern.NORM_DATETIME_PATTERN));
+                    break;
+                case "UpdateDate":
+                    merchant.setUpdateTime(LocalDateTimeUtil.parse(validFieldDataMap.get(field).toString(), DatePattern.NORM_DATETIME_PATTERN));
+                    break;
+            }
+        }
+        KxsMerchant kxsMerchant = baseMapper.selectById(merchant.getId());
+
+        if(operation.equals(OperationType.INSERT)){
+            if(kxsMerchant == null){
+                baseMapper.insert(merchant);
+            }
+        }
+
+        if(operation.equals(OperationType.UPDATE)){
+
+            baseMapper.updateById(merchant);
+        }
+
+    }
+}
+

+ 11 - 4
kxs-transfer/src/main/resources/import.txt

@@ -140,8 +140,9 @@ a.PosSn as pos_sn, a.StoreId as warehouse_id, a.BindMerchantId as merchant_id, a
 a.PosSnType as machine_type, ifnull(a.PrizeParams, 299) as cash_pledge, case when a.SeoKeyword > 1000 then a.SeoKeyword / 100 ELSE a.SeoKeyword end as source_pledge,
 a.BindingTime as bind_time, a.ActivationTime as act_time, a.DownFee as machine_ratio, a.ActivationState as is_act, a.BindingState as bind_status,
 a.IsFirst as is_first, a.LeaderUserId as  leader_id, a.OpId as  partner_id, TransferTime as delivery_time, UpFeeFlag as up_fee_flag, DownFeeFlag as down_fee_flag,
-IsSupplement as is_supply, IsOpAct as is_op_act, case when a.UserId = 0 then 0  ELSE 1 end status,
-a.RecycStatus as return_status,
+IsSupplement as is_supply, IsOpAct as is_op_act, case when a.UserId = 0 then 0 when a.Status = -1 then -1 ELSE 1 end status,
+(case when a.IsPurchase = 0 && a.RecycEndDate < NOW() && a.BindingState = 0 then 1 ELSE 0 end) as return_status,
+a.CreditTrade as credit_trade, a.DebitCardTrade as debit_card_trade, a.ScanQrTrade as scan_qr_trade,
 b.StoreName as warehouse_name
 FROM PosMachinesTwo a LEFT JOIN StoreHouse b on  a.StoreId = b.id
 
@@ -195,7 +196,7 @@ FROM MerchantDepositSet a
 //费率调整记录
 SELECT  a.Id as id, a.UserId as user_id, a.CreateDate as create_time, a.UpdateDate as update_time,
 case a.status when -1 then 0 when 1 then 1 end as status, a.SeoDescription as remark, a.MerchantId as merchant_id,
- a.ChangeFee as ratio, a.sort as brand_id, a.PosId as machine_id,
+ a.ChangeFee as ratio, a.sort as brand_id, a.PosId as machine_id, a.PosUserId as pos_user_id,
 a.PosSn as pos_sn
 FROM PosMachinesFeeChangeRecord a
 //机具券
@@ -215,4 +216,10 @@ left join Users uu on uu.id = a.ToUserId
 //机具券划拨订单明细
 SELECT a.Id as id, a.CreateDate as create_time, a.UpdateDate as update_time,
 a.PosCouponId as ticket_id,a.OrderNo as order_sn, b.ExchangeCode as ticket_code
-FROM PosCouponRecord a left join PosCoupons b on a.PosCouponId = b.id
+FROM PosCouponRecord a left join PosCoupons b on a.PosCouponId = b.id
+//商户表
+SELECT a.Id as id, a.UserId as user_id, a.CreateDate as create_time, a.UpdateDate as update_time,
+a.MerchantNo as merchant_no, a.MerchantName as merchant_name, a.MerIdcardNo as merchant_card, a.MerchantMobile as merchant_phone,
+a.BrandId as brand_id, a.MerUserId as maker_user_id, a.MerUserType as is_maker, b.id as machine_id, a.StandardStatus as standard_status, a.StandardMonths as standard_months,
+a.Remark as remark
+FROM PosMerchantInfo a LEFT JOIN PosMachinesTwo b on a.KqSnNo = b.PosSn