瀏覽代碼

补商城app的功能

三七 1 周之前
父節點
當前提交
c2ddfe44c0

+ 12 - 0
fs-company/src/main/java/com/fs/company/controller/company/CompanyProfileController.java

@@ -10,8 +10,10 @@ import com.fs.common.enums.ImTypeEnum;
 import com.fs.common.exception.file.OssException;
 import com.fs.common.utils.PatternUtils;
 import com.fs.common.utils.ServletUtils;
+import com.fs.common.utils.StringUtils;
 import com.fs.common.utils.file.FileUploadUtils;
 import com.fs.company.domain.CompanyUser;
+import com.fs.company.mapper.CompanyFsUserMapper;
 import com.fs.company.param.CompanyUserEditParam;
 import com.fs.company.service.ICompanyUserService;
 import com.fs.framework.security.LoginUser;
@@ -47,6 +49,10 @@ public class CompanyProfileController extends BaseController
 
     @Autowired
     private OpenIMService openIMService;
+
+    @Autowired
+    private CompanyFsUserMapper companyFsUserMapper;
+
     /**
      * 个人信息
      */
@@ -55,6 +61,12 @@ public class CompanyProfileController extends BaseController
     {
         LoginUser loginUser = tokenService.getLoginUser(ServletUtils.getRequest());
         CompanyUser user = loginUser.getUser();
+
+        String fsUser = companyFsUserMapper.selectUserListBySalesId(user.getUserId());
+        if(StringUtils.isNotEmpty(fsUser)){
+            user.setFsUserId(fsUser);
+        }
+
         AjaxResult ajax = AjaxResult.success(user);
         ajax.put("roleGroup", userService.selectUserRoleGroup(loginUser.getUsername()));
         ajax.put("postGroup", userService.selectUserPostGroup(loginUser.getUsername()));

+ 7 - 0
fs-service/src/main/java/com/fs/company/domain/CompanyUser.java

@@ -192,6 +192,13 @@ public class CompanyUser extends BaseEntity
     /** 绑定的公司用户ID */
     private Long bindCompanyUserId;
 
+    /** 邀请码 */
+    private String invitationCode;
+
+    /** 邀请人名称 */
+    @TableField(exist = false)
+    private String invitationName;
+
     @TableField(exist = false)
     private List<Long> deptList;
 

+ 4 - 0
fs-service/src/main/java/com/fs/company/mapper/CompanyUserMapper.java

@@ -37,6 +37,10 @@ public interface CompanyUserMapper
      */
     public CompanyUser selectCompanyUserById(Long userId);
 
+
+    @Select("select * from company_user where user_id=#{invitedSalesId} and del_flag=0")
+    CompanyUser getInviteCodeByCompanyUserIdAndUserId(@Param("invitedSalesId") Long invitedSalesId);
+
     /**
      * 查询物业公司管理员信息列表
      *

+ 11 - 0
fs-service/src/main/java/com/fs/company/service/ICompanyUserService.java

@@ -281,6 +281,12 @@ public interface ICompanyUserService {
 
 
 
+    /**
+     * 根据销售绑定关系获取销售邀请码
+     */
+    CompanyUser getInviteCodeByCompanyUserIdAndUserId( Long userId);
+
+
     /**
      * 绑定销售和fs_user 的关系(该销售绑定fs_user)
      */
@@ -299,4 +305,9 @@ public interface ICompanyUserService {
      * 获取销售绑定的fs_user
      */
     List<CompanyUserBindUserVO> getFsUserByCompanyUserId(FsUser fsUser);
+
+    /**
+     * 获取销售绑定的fs_user
+     */
+    int countCompanyUserByUserId(Long userId);
 }

+ 18 - 0
fs-service/src/main/java/com/fs/company/service/impl/CompanyUserServiceImpl.java

@@ -1135,6 +1135,15 @@ public class CompanyUserServiceImpl implements ICompanyUserService
 
     }
 
+    @Override
+    public CompanyUser getInviteCodeByCompanyUserIdAndUserId(Long userId) {
+        CompanyUser companyUser = companyUserMapper.getInviteCodeByCompanyUserIdAndUserId(userId);
+        if (companyUser != null) {
+            return companyUser;
+        }
+        return null;
+    }
+
 
     @Override
     @Transactional(rollbackFor = Exception.class)
@@ -1200,4 +1209,13 @@ public class CompanyUserServiceImpl implements ICompanyUserService
         return fsUsers;
     }
 
+    @Override
+    public int countCompanyUserByUserId(Long userId) {
+        CompanyFsUser existingBinding = companyFsUserMapper.selectByFsUserId(userId);
+        if(existingBinding!=null){
+            return 1;
+        }
+        return 0;
+    }
+
 }

+ 11 - 0
fs-service/src/main/java/com/fs/company/vo/CompanyUserQwListVO.java

@@ -144,4 +144,15 @@ public class CompanyUserQwListVO extends BaseEntity {
      */
     private Long aiSipCallUserId;
 
+
+    /**
+     * 绑定会员昵称
+     */
+    private  String  bindUser;
+
+    /**
+     * 绑定会员状态
+     */
+    private  Integer bindStatus;
+
 }

+ 13 - 7
fs-service/src/main/java/com/fs/course/service/impl/FsUserCourseServiceImpl.java

@@ -139,8 +139,8 @@ public class FsUserCourseServiceImpl implements IFsUserCourseService
 
     private static final String userRealLink = "/pages/user/users/becomeVIP?";
 
-    private static final String appRealLink = "/#/pages_course/videovip?course=";
-    public static final String appShortLink = "/#/pages_course/videovip?s=";
+    private static final String appRealLink = "/courseH5/pages_course/videovip?course=";
+    public static final String appShortLink = "/courseH5/pages_course/videovip?s=";
 
     /**
      * 查询课程
@@ -593,7 +593,7 @@ public class FsUserCourseServiceImpl implements IFsUserCourseService
         BeanUtils.copyProperties(link, courseMap);
         courseMap.setProjectId(param.getProjectId());
         String courseJson = JSON.toJSONString(courseMap);
-        link.setRealLink(realLink + courseJson);
+        link.setRealLink(("1".equals(param.getType()) ?appRealLink:realLink) + courseJson);
 
         link.setCreateTime(new Date());
 
@@ -602,10 +602,16 @@ public class FsUserCourseServiceImpl implements IFsUserCourseService
         link.setUpdateTime(calendar.getTime());
         int i = fsCourseLinkMapper.insertFsCourseLink(link);
         if (i > 0){
-            String domainName = getDomainName(param.getCompanyUserId(), config);
-            String sortLink = domainName + shortLink + link.getLink();
-//            return R.ok().put("url", sortLink).put("link", random);
-            return R.ok().put("url", sortLink).put("link", random).put("linkId", link.getLinkId());
+            if ("1".equals(param.getType())){
+                String domainName = getDomainName(param.getCompanyUserId(), config);
+                String sortLink = domainName+ link.getRealLink().replace("/#","");
+                sortLink = sortLink.replaceAll("\\\\", "");
+                return R.ok().put("url", sortLink).put("link", random).put("linkId", link.getLinkId());
+            }else {
+                String domainName = getDomainName(param.getCompanyUserId(), config);
+                String sortLink = domainName + shortLink + link.getLink();
+                return R.ok().put("url", sortLink).put("link", random).put("linkId", link.getLinkId());
+            }
         }
         return R.error("生成链接失败!");
     }

+ 4 - 0
fs-service/src/main/java/com/fs/his/domain/FsUser.java

@@ -160,6 +160,8 @@ public class FsUser extends BaseEntity
     private Integer isAddQw;//是否添加企微客服
     private Integer isShow;//是否展示购买以及订单状态
 
+    private Boolean isCompanyUser;// 是否是销售
+
     private Long parentId; //邀请人id
 
     private String courseMaOpenId; //看课小程序openid
@@ -190,6 +192,8 @@ public class FsUser extends BaseEntity
     /** app登录后不为null(表示是否下载app) */
     private String historyApp;
 
+    private  Long invitedBySalesId;//邀请人销售id
+
     private String appOpenId;
 
     private String appleKey; // 苹果key登陆验证

+ 2 - 0
fs-service/src/main/java/com/fs/his/service/impl/FsPackageOrderServiceImpl.java

@@ -573,6 +573,7 @@ public class FsPackageOrderServiceImpl implements IFsPackageOrderService
 
         FsPackageOrder  order=new FsPackageOrder();
         String orderSn =  OrderCodeUtils.getOrderSn();
+//        String orderSn =  IdUtil.getSnowflake(0, 0).nextIdStr();
         if(StringUtils.isEmpty(orderSn)){
             return R.error("订单生成失败,请重试");
         }
@@ -1231,6 +1232,7 @@ public class FsPackageOrderServiceImpl implements IFsPackageOrderService
         if(user!=null){
             if(fsPackageOrder.getPayMoney().compareTo(new BigDecimal(0))==1){
                 String payCode =  OrderCodeUtils.getOrderSn();
+//                String payCode =  IdUtil.getSnowflake(0, 0).nextIdStr();
                 if(StringUtils.isEmpty(payCode)){
                     return R.error("订单生成失败,请重试");
                 }

+ 1 - 1
fs-service/src/main/java/com/fs/hisStore/service/impl/FsStoreOrderScrmServiceImpl.java

@@ -968,7 +968,7 @@ public class FsStoreOrderScrmServiceImpl implements IFsStoreOrderScrmService {
                     if(param.getCompanyUserId()!=null){
                         if (ObjectUtil.isNotEmpty(fsuser.getCompanyUserId())&&!fsuser.getCompanyUserId().equals(param.getCompanyUserId())){
                             CompanyUser companyUser=companyUserService.selectCompanyUserById(fsuser.getCompanyUserId());
-                            return R.error(String.format("请联系%s销售进行购买商品!",companyUser.getNickName()));
+                            return R.error(String.format("请联系【%s】销售进行购买商品!",companyUser.getUserName()));
                         }else {
                             fsuser.setCompanyUserId(param.getCompanyUserId());
                             userService.updateFsUser(fsuser);

+ 9 - 5
fs-service/src/main/java/com/fs/hisStore/service/impl/FsStoreProductScrmServiceImpl.java

@@ -102,7 +102,7 @@ public class FsStoreProductScrmServiceImpl implements IFsStoreProductScrmService
 
     @Autowired
     private ConfigUtil configUtil;
-    
+
     @Autowired
     private com.fs.system.service.ISysConfigService configService;
 
@@ -738,7 +738,11 @@ public class FsStoreProductScrmServiceImpl implements IFsStoreProductScrmService
         if(param.getProductId() != null && param.getProductId() > 0){
             //对已上架的商品进行修改需要重新审核(益寿缘商城商品无需审核)
             if(!("益善缘".equals(cloudHostProper.getCompanyName()))){
-                if(1 == product.getIsShow() && "1".equals(product.getIsAudit())){
+//                if(1 == product.getIsShow() && "1".equals(product.getIsAudit())){
+//                    product.setIsAudit("0");
+//                }
+
+                if(1 == product.getIsShow()){
                     product.setIsAudit("0");
                 }
             } else{
@@ -1117,7 +1121,7 @@ public class FsStoreProductScrmServiceImpl implements IFsStoreProductScrmService
             String productName = product != null ? product.getProductName() : "商品";
             throw new CustomException(productName + "库存不足,当前库存:" + (productStock != null ? productStock : 0) + ",需要数量:" + cartNum);
         }
-        
+
         // 如果有规格,检查规格库存
         if (productAttrValueId != null) {
             Integer attrStock = fsStoreProductAttrValueMapper.selectProductAttrStockForUpdate(productAttrValueId);
@@ -1128,7 +1132,7 @@ public class FsStoreProductScrmServiceImpl implements IFsStoreProductScrmService
             }
         }
     }
-    
+
     @Override
     public void decProductStock(Long productId, Long productAttrValueId, Integer cartNum) {
         // 检查配置是否开启库存检查
@@ -1144,7 +1148,7 @@ public class FsStoreProductScrmServiceImpl implements IFsStoreProductScrmService
         } catch (Exception e) {
             log.error("检查库存配置失败", e);
         }
-        
+
         //处理属性sku
         fsStoreProductAttrValueMapper.decProductAttrStock(productAttrValueId,cartNum);
         fsStoreProductMapper.decProductAttrStock(productId,cartNum);

+ 1 - 1
fs-service/src/main/resources/application-common.yml

@@ -36,7 +36,7 @@ server:
 # 日志配置
 logging:
   level:
-    com.fs: DEBUG
+    com.fs: info
     org.springframework: warn
 
 express:

+ 70 - 4
fs-service/src/main/resources/mapper/company/CompanyUserMapper.xml

@@ -91,6 +91,7 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
         <result property="dataScope"     column="data_scope"    />
         <result property="status"       column="role_status"    />
     </resultMap>
+
     <select id="selectCompanyUserQwListVO" resultMap="CompanyUserQwListVOResult">
         select
         u.user_id, u.user_name, u.nick_name, u.company_id, u.status,
@@ -100,15 +101,17 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
         u.avatar,u.address_id,
         u.qw_user_id,
         u.doctor_id,
-        u.cid_server_id,
         d.dept_name,
         d.leader,
-        u.ai_sip_call_user_id
+        GROUP_CONCAT(fu.nick_name) bindUser,
+        cfu.`status` bindStatus
         from
         company_user u
         left join
         company_dept d on u.dept_id = d.dept_id
-
+        LEFT JOIN
+        company_fs_user cfu on u.user_id=cfu.company_user_id
+        LEFT JOIN fs_user fu on cfu.fs_user_id=fu.user_id
         where
         u.del_flag = '0'
         <if test="userId != null ">
@@ -149,11 +152,74 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
         <if test="deptId != null and deptId != 0">
             AND (u.dept_id = #{deptId} OR u.dept_id IN ( SELECT t.dept_id FROM company_dept t WHERE find_in_set(#{deptId}, ancestors) ))
         </if>
-
+        GROUP BY u.user_id
         <!-- 数据范围过滤 -->
         ${params.dataScope}
     </select>
 
+<!--    <select id="selectCompanyUserQwListVO" resultMap="CompanyUserQwListVOResult">-->
+<!--        select-->
+<!--        u.user_id, u.user_name, u.nick_name, u.company_id, u.status,-->
+<!--        u.qw_status, u.phonenumber, u.create_time, u.dept_id,-->
+<!--        u.qr_code_weixin, u.user_type, u.qr_code_wecom, u.jpush_id,-->
+<!--        u.is_need_register_member,u.is_allowed_all_register,-->
+<!--        u.avatar,u.address_id,-->
+<!--        u.qw_user_id,-->
+<!--        u.doctor_id,-->
+<!--        u.cid_server_id,-->
+<!--        d.dept_name,-->
+<!--        d.leader,-->
+<!--        u.ai_sip_call_user_id-->
+<!--        from-->
+<!--        company_user u-->
+<!--        left join-->
+<!--        company_dept d on u.dept_id = d.dept_id-->
+
+<!--        where-->
+<!--        u.del_flag = '0'-->
+<!--        <if test="userId != null ">-->
+<!--            AND u.user_id = #{userId}-->
+<!--        </if>-->
+<!--        <if test="userName != null and userName != ''">-->
+<!--            AND u.user_name like concat('%', #{userName}, '%')-->
+<!--        </if>-->
+
+<!--        <if test="nickName != null and nickName != ''">-->
+<!--            AND u.nick_name like concat( #{nickName}, '%')-->
+<!--        </if>-->
+
+<!--        <if test="companyId != null and companyId != ''">-->
+<!--            AND u.company_id = #{companyId}-->
+<!--        </if>-->
+
+<!--        <if test="status != null and status != ''">-->
+<!--            AND u.status = #{status}-->
+<!--        </if>-->
+
+<!--        <if test="qwStatus != null">-->
+<!--            AND u.qw_status = #{qwStatus}-->
+<!--        </if>-->
+
+<!--        <if test="phonenumber != null and phonenumber != ''">-->
+<!--            AND u.phonenumber like concat('%', #{phonenumber}, '%')-->
+<!--        </if>-->
+
+<!--        <if test="beginTime != null and beginTime != ''">-->
+<!--            AND date_format(u.create_time,'%y%m%d') &gt;= date_format(#{beginTime},'%y%m%d')-->
+<!--        </if>-->
+
+<!--        <if test="endTime != null and endTime != ''">-->
+<!--            AND date_format(u.create_time,'%y%m%d') &lt;= date_format(#{endTime},'%y%m%d')-->
+<!--        </if>-->
+
+<!--        <if test="deptId != null and deptId != 0">-->
+<!--            AND (u.dept_id = #{deptId} OR u.dept_id IN ( SELECT t.dept_id FROM company_dept t WHERE find_in_set(#{deptId}, ancestors) ))-->
+<!--        </if>-->
+
+<!--        &lt;!&ndash; 数据范围过滤 &ndash;&gt;-->
+<!--        ${params.dataScope}-->
+<!--    </select>-->
+
     <!-- 角色子查询 -->
     <select id="selectUserRoles" resultType="java.lang.String">
         SELECT cr.role_name

+ 1 - 0
fs-service/src/main/resources/mapper/hisStore/FsStoreScrmMapper.xml

@@ -77,6 +77,7 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
     <select id="selectFsStoreList" parameterType="FsStoreScrm" resultMap="FsStoreResult">
         <include refid="selectFsStoreVo"/>
         <where>
+            <if test="storeId != null  and storeId != ''"> and store_id = #{storeId}</if>
             <if test="storeName != null  and storeName != ''"> and store_name like concat('%', #{storeName}, '%')</if>
             <if test="address != null  and address != ''"> and address like concat('%', #{address}, '%')</if>
             <if test="phone != null  and phone != ''"> and phone = #{phone}</if>

+ 34 - 3
fs-user-app/src/main/java/com/fs/app/controller/UserController.java

@@ -16,6 +16,8 @@ import com.fs.common.core.page.TableDataInfo;
 import com.fs.common.exception.CustomException;
 import com.fs.common.utils.StringUtils;
 import com.fs.common.utils.sign.Md5Utils;
+import com.fs.company.domain.CompanyUser;
+import com.fs.company.service.ICompanyUserService;
 import com.fs.core.config.WxMaConfiguration;
 import com.fs.course.domain.FsCourseWatchLog;
 import com.fs.course.service.IFsCourseWatchLogService;
@@ -34,6 +36,8 @@ import com.fs.his.utils.PhoneUtil;
 import com.fs.his.vo.FsUserCouponCountUVO;
 import com.fs.his.vo.FsUserCouponListUVO;
 import com.fs.his.vo.UserVo;
+import com.fs.hisStore.domain.FsStoreOrderScrm;
+import com.fs.hisStore.service.IFsStoreOrderScrmService;
 import com.fs.qw.domain.QwExternalContact;
 import com.fs.qw.service.IQwAppContactWayService;
 import com.fs.qw.service.IQwExternalContactService;
@@ -97,6 +101,12 @@ public class UserController extends  AppBaseController {
     @Autowired
     private IFsUserService fsUserService;
 
+    @Autowired
+    IFsStoreOrderScrmService orderService;
+
+    @Autowired
+    private ICompanyUserService companyUserService;
+
     @Autowired
     private IQwExternalContactService qwExternalContactService;
     @Autowired
@@ -141,9 +151,30 @@ public class UserController extends  AppBaseController {
             if (user.getPhone()!=null&&user.getPhone().length()>11&&!user.getPhone().matches("\\d+")){
                 user.setPhone(decryptPhoneMk(user.getPhone()));
             }
-            Map<String,Object> map=new HashMap<>();
-            map.put("user",user);
-            return R.ok(map);
+            if (user.getIsShow() !=null && user.getIsShow() == 0){
+                FsStoreOrderScrm order = orderService.selectOrderByUserIdLimit1(user.getUserId());
+                if (order != null) {
+                    user.setIsShow(1);
+                }
+            }
+
+            user.setIsCompanyUser(false);
+            //判断该用户是否是销售
+            int i = companyUserService.countCompanyUserByUserId(user.getUserId());
+            if(i>0){
+                //是销售
+                user.setIsCompanyUser(true);
+            }
+
+            CompanyUser companyUser =new CompanyUser();
+            if(user.getInvitedBySalesId()!=null){
+                companyUser = companyUserService.getInviteCodeByCompanyUserIdAndUserId(user.getInvitedBySalesId());
+                if(companyUser!=null){
+                    companyUser.setInvitationName(StringUtils.isNotEmpty(companyUser.getNickName())?companyUser.getNickName():"");
+                }
+            }
+
+            return R.ok().put("user",user).put("inviteInfo",companyUser);
         } catch (Exception e){
             return R.error("操作异常");
         }

+ 0 - 105
fs-user-app/src/test/java/com/fs/test/StockDeductTest.java

@@ -1,105 +0,0 @@
-package com.fs.test;
-
-import com.fs.FsUserAppApplication;
-import com.fs.common.constant.RedisConstant;
-import com.fs.common.core.redis.service.StockDeductService;
-import lombok.RequiredArgsConstructor;
-import lombok.extern.slf4j.Slf4j;
-import org.junit.Test;
-import org.junit.runner.RunWith;
-import org.springframework.beans.factory.annotation.Autowired;
-import org.springframework.boot.test.context.SpringBootTest;
-import org.springframework.test.context.junit4.SpringRunner;
-
-import java.util.ArrayList;
-import java.util.List;
-import java.util.concurrent.*;
-
-/**
- * 50万高并发库存扣减测试
- */
-@RunWith(SpringRunner.class)
-@SpringBootTest(classes = FsUserAppApplication.class)
-@RequiredArgsConstructor
-@Slf4j
-public class StockDeductTest {
-
-    @Autowired
-    private StockDeductService stockDeductService;
-
-    // 商品ID
-    private static final Long PRODUCT_ID = 1001L;
-    // 初始库存(模拟5万库存,应对50万并发扣减)
-    private static final Integer INIT_STOCK = 5000;
-    // 总请求数(50万)
-    private static final int TOTAL_REQUESTS = 50000;
-
-    /**
-     * 模拟50万高并发库存扣减
-     */
-    @Test
-    public void testHighConcurrencyDeduct() throws InterruptedException, ExecutionException {
-        stockDeductService.initStock(PRODUCT_ID, 1L, INIT_STOCK);
-        // Java 8 ExecutorService 线程池(固定线程池,适配高并发)
-        ExecutorService executorService = createHighConcurrencyPool();
-
-        // 存储所有异步任务结果
-        List<CompletableFuture<Boolean>> futureList = new ArrayList<>();
-
-        // 提交50万请求
-        for (int i = 0; i < TOTAL_REQUESTS; i++) {
-//            futureList.add(stockDeductService.deductStockAsync(PRODUCT_ID, 1L, (long) i));
-        }
-
-        // 等待所有任务完成(Java 8 CompletableFuture 批量处理)
-        CompletableFuture<Void> allFutures = CompletableFuture.allOf(
-                futureList.toArray(new CompletableFuture[0])
-        );
-        allFutures.get();
-
-        // 统计结果
-        long successCount = futureList.stream()
-                .map(future -> {
-                    try {
-                        return future.get();
-                    } catch (Exception e) {
-                        return false;
-                    }
-                })
-                .filter(Boolean::booleanValue)
-                .count();
-
-        // 打印结果
-        System.out.println("======================================");
-        System.out.println("50万高并发库存扣减测试完成");
-        System.out.println("成功扣减次数:" + successCount);
-        System.out.println("失败扣减次数:" + (TOTAL_REQUESTS - successCount));
-        System.out.println("最终剩余库存:" + stockDeductService.redisTemplate.opsForValue().get(RedisConstant.STOCK_KEY_PREFIX + PRODUCT_ID));
-        System.out.println("======================================");
-
-        // 关闭线程池
-        executorService.shutdown();
-        executorService.awaitTermination(1, TimeUnit.MINUTES);
-    }
-
-
-
-    private static ExecutorService createHighConcurrencyPool() {
-        int corePoolSize = Runtime.getRuntime().availableProcessors() * 2; // CPU核心数*2
-        int maximumPoolSize = 200; // 最大线程数,根据服务器配置调整
-        long keepAliveTime = 60L;
-        // 用SynchronousQueue,直接提交任务,避免队列积压
-        BlockingQueue<Runnable> workQueue = new SynchronousQueue<>();
-        // 拒绝策略:丢弃最老的任务,避免OOM
-        RejectedExecutionHandler handler = new ThreadPoolExecutor.DiscardOldestPolicy();
-
-        return new ThreadPoolExecutor(
-                corePoolSize,
-                maximumPoolSize,
-                keepAliveTime,
-                TimeUnit.SECONDS,
-                workQueue,
-                new ThreadPoolExecutor.CallerRunsPolicy() // 兜底:主线程执行,避免任务丢失
-        );
-    }
-}