Преглед на файлове

Merge remote-tracking branch 'origin/master'

ct преди 6 дни
родител
ревизия
3b2baa9cb3

+ 25 - 1
fs-admin/src/main/java/com/fs/company/controller/CompanyMenuController.java

@@ -1,6 +1,11 @@
 package com.fs.company.controller;
 
 import java.util.List;
+
+import com.fs.common.core.domain.entity.SysMenu;
+import com.fs.common.utils.ServletUtils;
+import com.fs.core.security.LoginUser;
+import com.fs.core.web.service.TokenService;
 import org.springframework.security.access.prepost.PreAuthorize;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.web.bind.annotation.GetMapping;
@@ -22,7 +27,7 @@ import com.fs.common.core.page.TableDataInfo;
 
 /**
  * 菜单权限Controller
- * 
+ *
  * @author fs
  * @date 2021-10-04
  */
@@ -33,6 +38,9 @@ public class CompanyMenuController extends BaseController
     @Autowired
     private ICompanyMenuService companyMenuService;
 
+    @Autowired
+    private TokenService tokenService;
+
     /**
      * 查询菜单权限列表
      */
@@ -100,4 +108,20 @@ public class CompanyMenuController extends BaseController
     {
         return toAjax(companyMenuService.deleteCompanyMenuByIds(menuIds));
     }
+
+    /**
+     * 获取菜单下拉树列表
+     */
+    /**
+     * 获取菜单下拉树列表
+     */
+    @GetMapping("/treeselect")
+    public AjaxResult treeselect(CompanyMenu menu)
+    {
+        LoginUser loginUser = tokenService.getLoginUser(ServletUtils.getRequest());
+        Long userId = loginUser.getUser().getUserId();
+        List<CompanyMenu> menus = companyMenuService.selectMenuList(menu, userId,"00");
+        return AjaxResult.success(companyMenuService.buildMenuTreeSelect(menus));
+    }
+
 }

+ 40 - 12
fs-service-system/src/main/java/com/fs/company/service/impl/CompanyServiceImpl.java

@@ -1,12 +1,14 @@
 package com.fs.company.service.impl;
 
 import cn.hutool.json.JSONUtil;
+import com.alibaba.fastjson.JSON;
 import com.fs.common.core.domain.R;
 import com.fs.common.utils.DateUtils;
 import com.fs.company.domain.*;
 import com.fs.company.mapper.*;
 import com.fs.company.param.CompanyConfigParam;
 import com.fs.company.param.CompanyParam;
+import com.fs.company.service.ICompanyRoleService;
 import com.fs.company.service.ICompanyService;
 import com.fs.company.vo.CompanyCrmVO;
 import com.fs.company.vo.CompanyNameVO;
@@ -14,6 +16,7 @@ import com.fs.company.vo.CompanyVO;
 import com.fs.company.vo.DeptDataVO;
 import com.fs.course.mapper.FsCourseRedPacketLogMapper;
 import com.fs.his.vo.OptionsVO;
+import com.fs.store.config.CompanyMenuConfig;
 import com.fs.store.config.StoreConfig;
 import com.fs.store.domain.FsStoreOrder;
 import com.fs.store.domain.FsStorePayment;
@@ -22,7 +25,6 @@ import com.fs.system.service.ISysConfigService;
 import org.apache.commons.collections4.CollectionUtils;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
-import org.springframework.beans.BeanUtils;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.scheduling.annotation.Async;
 import org.springframework.stereotype.Service;
@@ -56,12 +58,18 @@ public class CompanyServiceImpl implements ICompanyService
     private CompanyPostMapper postMapper;
     @Autowired
     private CompanyUserMapper userMapper;
+
+    @Autowired
+    private CompanyRoleMenuMapper roleMenuMapper;
     @Autowired
     private CompanyUserRoleMapper userRoleMapper;
     @Autowired
     private CompanyUserPostMapper userPostMapper;
     @Autowired
     private ISysConfigService configService;
+
+    @Autowired
+    private ICompanyRoleService roleService;
     @Autowired
     private CompanyMoneyLogsMapper moneyLogsMapper;
     @Autowired
@@ -149,16 +157,33 @@ public class CompanyServiceImpl implements ICompanyService
             post.setPostSort(0);
             post.setStatus("0");
             postMapper.insertCompanyPost(post);
-            //创建角色
-            CompanyRole role=new CompanyRole();
-            role.setCompanyId(company.getCompanyId());
-            role.setRoleName("管理员");
-            role.setRoleKey("admin");
-            role.setRoleSort(0);
-            role.setStatus("0");
-            roleMapper.insertCompanyRole(role);
-            //添加用户
-            CompanyUser user=new CompanyUser();
+
+            // 创建管理员角色(拥有全部权限)
+            CompanyRole adminRole = new CompanyRole();
+            adminRole.setCompanyId(company.getCompanyId());
+            adminRole.setRoleName("管理员");
+            adminRole.setRoleKey("admin");
+            adminRole.setRoleSort(0);
+            adminRole.setStatus("0");
+            roleMapper.insertCompanyRole(adminRole);
+
+            // 创建销售角色(新增部分,只有"我的"相关权限)
+            CompanyRole salesRole = new CompanyRole();
+            salesRole.setCompanyId(company.getCompanyId());
+            salesRole.setRoleName(company.getCompanyName() + "_销售");
+            salesRole.setRoleKey(company.getCompanyId()+"_sales");
+            salesRole.setRoleSort(1);
+            salesRole.setDataScope("5");
+            salesRole.setStatus("0");
+
+            //增加销售角色菜单权限
+            String json = configService.selectConfigByKey("companymenu.config");
+            CompanyMenuConfig config = JSONUtil.toBean(json, CompanyMenuConfig.class);
+            // 注意:此处需要额外处理销售角色的权限,设置为仅"我的"相关权限
+            salesRole.setMenuIds(config.getMenuIds());
+            roleService.insertRole(salesRole);
+            // 6. 创建管理员用户
+            CompanyUser user = new CompanyUser();
             user.setCompanyId(company.getCompanyId());
             user.setNickName("管理员");
 
@@ -173,9 +198,12 @@ public class CompanyServiceImpl implements ICompanyService
             user.setIsDel(0);
             user.setIsAudit(1);
             userMapper.insertCompanyUser(user);
+
+
+
             //添加用户角色表
             CompanyUserRole userRole=new CompanyUserRole();
-            userRole.setRoleId(role.getRoleId());
+            userRole.setRoleId(adminRole.getRoleId());
             userRole.setUserId(user.getUserId());
             userRoleMapper.insertCompanyUserRole(userRole);
             //添加用户岗位表

+ 4 - 3
fs-service-system/src/main/java/com/fs/course/service/impl/FsUserCourseServiceImpl.java

@@ -445,20 +445,21 @@ public class FsUserCourseServiceImpl implements IFsUserCourseService
     public R createCourseSortLink(FsCourseLinkCreateParam param) {
         String json = configService.selectConfigByKey("course.config");
         CourseConfig config = JSONUtil.toBean(json, CourseConfig.class);
+        //短链参数
+        String random = generateRandomString();
 
         //新增链接表信息
         FsCourseLink link = new FsCourseLink();
         BeanUtils.copyProperties(param, link);
         link.setLinkType(0);
         link.setIsRoom(0);
+        link.setLink(random);
 
         FsCourseRealLink courseMap = new FsCourseRealLink();
         BeanUtils.copyProperties(link, courseMap);
         String courseJson = JSON.toJSONString(courseMap);
-
         link.setRealLink(realLink + courseJson);
-        String random = generateRandomString();
-        link.setLink(random);
+
         link.setCreateTime(new Date());
 
         //获取过期时间

+ 13 - 0
fs-service-system/src/main/java/com/fs/store/config/CompanyMenuConfig.java

@@ -0,0 +1,13 @@
+package com.fs.store.config;
+
+import lombok.Data;
+
+import java.io.Serializable;
+
+@Data
+public class CompanyMenuConfig implements Serializable {
+
+    private Long [] menuIds;
+
+
+}

+ 3 - 3
fs-service-system/src/main/java/com/fs/store/mapper/FsStoreOrderMapper.java

@@ -161,9 +161,9 @@ public interface FsStoreOrderMapper
             " AND date_format(o.delivery_send_time,'%y%m%d') &gt;= date_format(#{maps.deliverySendTimeList[0]},'%y%m%d') " +
             " AND date_format(o.delivery_send_time,'%y%m%d') &lt;= date_format(#{maps.deliverySendTimeList[1]},'%y%m%d') " +
             "</if>" +
-//            "<if test = 'maps.paid != null    '> " +
-//            "and o.paid =#{maps.paid} " +
-//            "</if>" +
+            "<if test = 'maps.paidStatus != null    '> " +
+            "and o.paid =#{maps.paidStatus} " +
+            "</if>" +
             "<if test = 'maps.payTimeList != null    '> " +
             " AND date_format(o.pay_time,'%y%m%d') &gt;= date_format(#{maps.payTimeList[0]},'%y%m%d') " +
             " AND date_format(o.pay_time,'%y%m%d') &lt;= date_format(#{maps.payTimeList[1]},'%y%m%d') " +

+ 9 - 0
fs-service-system/src/main/java/com/fs/store/mapper/FsUserCourseCountMapper.java

@@ -1,7 +1,10 @@
 package com.fs.store.mapper;
 
 import java.util.List;
+import java.util.Set;
+
 import com.fs.store.domain.FsUserCourseCount;
+import com.fs.store.vo.FsUserLastCount;
 import org.apache.ibatis.annotations.Param;
 
 /**
@@ -79,4 +82,10 @@ public interface FsUserCourseCountMapper
      */
     void insertFsUserCourseCountTask(FsUserCourseCount fsUserCourseCount);
 
+    /**
+     * 查询会员最新的看课状态和心跳时间
+     * @return
+     */
+    List<FsUserLastCount> selectUserLastCount(@Param("userIds") Set<Long> userIds);
+
 }

+ 1 - 1
fs-service-system/src/main/java/com/fs/store/param/FsStoreOrderParam.java

@@ -85,6 +85,6 @@ public class FsStoreOrderParam extends BaseEntity implements Serializable
     /**
      * 支付状态 待支付 1已支付
      */
-    private int paid;
+    private int paidStatus;
 
 }

+ 4 - 0
fs-service-system/src/main/java/com/fs/store/service/IFsStorePaymentService.java

@@ -108,4 +108,8 @@ public interface IFsStorePaymentService
     String transferNotify(String notifyData, HttpServletRequest request);
 
     String v3TransferNotify(String notifyData, HttpServletRequest request);
+
+
+    R sendRedPacketTest(WxSendRedPacketParam param);
+
 }

+ 68 - 0
fs-service-system/src/main/java/com/fs/store/service/impl/FsStorePaymentServiceImpl.java

@@ -478,6 +478,69 @@ public class FsStorePaymentServiceImpl implements IFsStorePaymentService
         }
     }
 
+
+    @Override
+    public R sendRedPacketTest(WxSendRedPacketParam param) {
+
+        RedPacketConfig config = new RedPacketConfig();
+        // 根据红包模式获取配置
+
+        String  json = configService.selectConfigByKey("redPacket.config");
+        config = JSONUtil.toBean(json, RedPacketConfig.class);
+
+        param.setSource(1);
+        param.setOpenId("ooXAA1Fw5ekSqCT-WLKpoA0cDVDo");
+        param.setAmount(new BigDecimal(0.1));
+
+
+        WxPayConfig payConfig = new WxPayConfig();
+        BeanUtils.copyProperties(config, payConfig);
+//        payConfig.setPublicKeyId(null);
+//        payConfig.setPublicKeyPath(null);
+//        payConfig.setCertSerialNo("63AC73F33E0A21973BB1DE533421A2337FD91C20");
+        WxPayService wxPayService = new WxPayServiceImpl();
+        wxPayService.setConfig(payConfig);
+        TransferService transferService = wxPayService.getTransferService();
+
+        TransferBillsRequest request = new TransferBillsRequest();
+        request.setAppid(config.getAppId());
+        System.out.println("appid:"+config.getAppId());
+        request.setOpenid(param.getOpenId());
+
+        String code = String.valueOf(IdUtil.getSnowflake(0, 0).nextId());
+        request.setOutBillNo("fsCourse" + code);
+
+        Integer amount = WxPayUnifiedOrderRequest.yuanToFen(param.getAmount() != null ? param.getAmount().toString() : "0.1");
+        request.setTransferAmount(amount);
+        request.setTransferRemark("活动奖励");
+        request.setUserRecvPerception("活动奖励");
+        request.setNotifyUrl(config.getNotifyUrl());
+        request.setTransferSceneId("1000");
+
+        // 设置场景信息
+        List<TransferBillsRequest.TransferSceneReportInfo> transferSceneReportInfos = new ArrayList<>();
+        TransferBillsRequest.TransferSceneReportInfo info1 = new TransferBillsRequest.TransferSceneReportInfo();
+        info1.setInfoType("活动名称");
+        info1.setInfoContent("新会员有礼");
+        transferSceneReportInfos.add(info1);
+
+        TransferBillsRequest.TransferSceneReportInfo info2 = new TransferBillsRequest.TransferSceneReportInfo();
+        info2.setInfoType("奖励说明");
+        info2.setInfoContent("注册会员抽奖一等奖");
+        transferSceneReportInfos.add(info2);
+        request.setTransferSceneReportInfos(transferSceneReportInfos);
+
+        try {
+            TransferBillsResult transferBillsResult = transferService.transferBills(request);
+            logger.info("商家转账支付完成:[msg:{}]", transferBillsResult);
+            return R.ok("发送红包成功").put("data", transferBillsResult);
+        } catch (WxPayException e) {
+            e.printStackTrace();
+            logger.info("商家转账支付失败:[msg:{}]", e.getMessage());
+            return R.error("发送失败");
+        }
+    }
+
     @Override
     public R sendRedPacketV3(WxSendRedPacketParam param) {
         return null;
@@ -529,9 +592,14 @@ public class FsStorePaymentServiceImpl implements IFsStorePaymentService
             //创建微信订单
             WxPayConfig payConfig = new WxPayConfig();
             BeanUtils.copyProperties(config,payConfig);
+//            payConfig.setCertSerialNo("63AC73F33E0A21973BB1DE533421A2337FD91C20");
             WxPayService wxPayService = new WxPayServiceImpl();
             wxPayService.setConfig(payConfig);
             SignatureHeader signatureHeader = new SignatureHeader();
+//            signatureHeader.setTimeStamp("1622450000");  // 时间戳(Unix时间戳)
+//            signatureHeader.setNonce("5K8264ILTKCH16CQ2502SI8ZNMTM67VS");  // 随机字符串
+//            signatureHeader.setSerial("63AC73F33E0A21973BB1DE533421A2337FD91C20");
+//            signatureHeader.setSignature("HbjssPzTBkM2iSCmxknS663zigo3gQ1jGQ4R6E6x9356bmV6Um4WfgGWZOH+fdCx5dxjHEiIci5kOYKl0ZdRfnexFFuM2riXLSqnRboOJZ+ew8FH4ZP/zCxtlDnmIYbARoIN46RegcRmGgfOznkLcD7ihr0JixgoZ0BOYk7YLhhcbLZaE2OJmwyyYIdJCH5lvg0mXyX1yfutNxPZz13i3OmZiU42xYr4bByJICWMFTwkzha9GVfOp67q/oVu0bEGIMgGdAVoEUJZXOijKdZdOrieXT07wMU31KITKcnizaUGl5peXejbJEd6CAQcX5e8KRlRSjY8DybHAm0JawVuAw==");
             signatureHeader.setTimeStamp(request.getHeader("Wechatpay-Timestamp"));
             signatureHeader.setNonce(request.getHeader("Wechatpay-Nonce"));
             signatureHeader.setSerial(request.getHeader("Wechatpay-Serial"));

+ 18 - 7
fs-service-system/src/main/java/com/fs/store/service/impl/FsUserServiceImpl.java

@@ -40,10 +40,7 @@ import com.fs.store.domain.*;
 import com.fs.store.dto.FsStoreCartDTO;
 import com.fs.store.dto.FsUserTransferParamDTO;
 import com.fs.store.enums.BillDetailEnum;
-import com.fs.store.mapper.FsStoreOrderMapper;
-import com.fs.store.mapper.FsStoreProductAttrValueMapper;
-import com.fs.store.mapper.FsUserCompanyUserMapper;
-import com.fs.store.mapper.FsUserMapper;
+import com.fs.store.mapper.*;
 import com.fs.store.param.SelectCusListPageParam;
 import com.fs.store.param.h5.CourseAnalysisParam;
 import com.fs.store.param.h5.FsUserPageListParam;
@@ -53,6 +50,7 @@ import com.fs.store.service.IFsUserService;
 import com.fs.store.service.cache.IFsUserCourseCountCacheService;
 import com.fs.store.vo.FSUserVO;
 import com.fs.store.vo.FsCompanyUserListQueryVO;
+import com.fs.store.vo.FsUserLastCount;
 import com.fs.store.vo.FsUserTuiVO;
 import com.fs.store.vo.h5.*;
 import com.github.pagehelper.PageHelper;
@@ -135,6 +133,9 @@ public class FsUserServiceImpl implements IFsUserService
     @Autowired
     private QwExternalContactMapper qwExternalContactMapper;
 
+    @Autowired
+    private FsUserCourseCountMapper fsUserCourseCountMapper;
+
     /**
      * 查询用户
      *
@@ -539,6 +540,11 @@ public class FsUserServiceImpl implements IFsUserService
 
         List<FsUserPageListVO> fsUserPageListVOS = fsUserMapper.selectFsUserPageListNew(param);
         Map<Long, CompanyTag> tagMap = companyTagCacheService.queryAllTagMap();
+        //获取会员的最新的看课状态和最后看课时间
+        Set<Long> userIds = fsUserPageListVOS.stream().map(FsUserPageListVO::getUserId).collect(Collectors.toSet());
+        List<FsUserLastCount> fsUserCourseCounts = fsUserCourseCountMapper.selectUserLastCount(userIds);
+        Map<Long, FsUserLastCount> countMap = fsUserCourseCounts.stream().collect(Collectors.toMap(FsUserLastCount::getUserId, Function.identity()));
+
         for (FsUserPageListVO item : fsUserPageListVOS) {
             if(item.getCompanyUserId() != null) {
                 String companyUserName = companyUserCacheService.selectCompanyUserNameUserById(item.getCompanyUserId());
@@ -562,11 +568,16 @@ public class FsUserServiceImpl implements IFsUserService
                     item.setMissCourseCount(byUserId.getMissCourseCount());
                     item.setMissCourseStatus(byUserId.getMissCourseStatus());
                     if(StringUtils.isNotEmpty(byUserId.getPartCourseCount())){
-                        item.setPartCourseCount(Long.valueOf(byUserId.getPartCourseCount()));
+                        item.setPartCourseCount(new BigDecimal(byUserId.getPartCourseCount()).longValue());
                     }
-                    item.setCourseCountStatus(byUserId.getStatus());
+//                    item.setCourseCountStatus(byUserId.getStatus());
                     item.setStopWatchDays(byUserId.getStopWatchDays());
                     item.setCompleteWatchDate(byUserId.getCompleteWatchDate());
+                    item.setLastWatchDate(byUserId.getLastWatchDate());
+                }
+                FsUserLastCount fsUserCourseCount = countMap.get(item.getUserId());
+                if(fsUserCourseCount != null){
+                    item.setCourseCountStatus(fsUserCourseCount.getStatus());
                 }
                 String userTagByUserId = companyTagCacheService
                         .findUserTagByUserId(item.getUserId(),item.getCompanyUserId());
@@ -903,7 +914,7 @@ public class FsUserServiceImpl implements IFsUserService
     @Transactional(rollbackFor = Exception.class)
     public ResponseResult<Boolean> becomeMember(FsUserCourseBeMemberParam param) {
         //查询用户
-         FsUser fsUser = fsUserMapper.selectFsUserById(param.getUserId());
+        FsUser fsUser = fsUserMapper.selectFsUserById(param.getUserId());
         if (Objects.isNull(fsUser)){
             return ResponseResult.fail(404,"当前用户信息不存在");
         }

+ 36 - 0
fs-service-system/src/main/java/com/fs/store/vo/FsUserLastCount.java

@@ -0,0 +1,36 @@
+package com.fs.store.vo;
+
+import com.fasterxml.jackson.annotation.JsonFormat;
+import com.fs.common.annotation.Excel;
+import lombok.Data;
+
+import java.util.Date;
+
+/**
+ * 用户看课统计对象 fs_user_course_count
+ *
+ * @author fs
+ * @date 2025-04-02
+ */
+@Data
+public class FsUserLastCount {
+    /**
+     * 用户id
+     */
+    @Excel(name = "用户id")
+    private Long userId;
+
+    /**
+     * 最后一次看课时间
+     */
+    @JsonFormat(pattern = "yyyy-MM-dd")
+    @Excel(name = "最后一次看课时间", width = 30, dateFormat = "yyyy-MM-dd")
+    private Date lastWatchDate;
+
+    /**
+     * 用户状态,1-正常;2-停止;3-未看
+     */
+    @Excel(name = "用户状态,1-正常;2-停止;3-未看")
+    private Long status;
+
+}

+ 3 - 3
fs-service-system/src/main/resources/mapper/course/FsCourseWatchLogMapper.xml

@@ -541,10 +541,10 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
                and o.company_id=#{companyId}
             </if>
             <if test= 'sTime != null '>
-                and o.create_time &gt;= #{startDate}
+                and o.create_time &gt;= #{sTime}
             </if>
             <if test='eTime != null '>
-                and o.create_time &lt;= #{endDate}
+                and o.create_time &lt;= #{eTime}
             </if>
             <if test ='courseId !=null'>
                 and o.course_id = #{courseId}
@@ -566,7 +566,7 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
         GROUP BY o.video_id,o.user_id,DATE(o.create_time),o.project,o.course_id
         ORDER BY o.video_id ,DATE(o.create_time)
 
-        limit ${(maps.pageNum-1)*maps.pageSize},${maps.pageSize}
+        limit ${(pageNum-1)*pageSize},${pageSize}
     </select>
     <select id="selectFsCourseWatchLogListVONew" resultType="com.fs.course.vo.FsCourseWatchLogListVO">
         SELECT

+ 27 - 1
fs-service-system/src/main/resources/mapper/store/FsUserCourseCountMapper.xml

@@ -55,7 +55,15 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
         where id = #{id}
     </select>
     <select id="findByUserId" resultType="com.fs.store.domain.FsUserCourseCount">
-        select * from fs_user_course_count where user_id = ${userId} limit 1
+        select
+            fs_user_course_count.user_id,
+            ifnull ( sum( fs_user_course_count.watch_course_count ), 0 ) AS watch_course_count,
+            ifnull ( sum( fs_user_course_count.miss_course_count ), 0 ) AS miss_course_count,
+            ifnull ( sum( fs_user_course_count.part_course_count ), 0 ) AS part_course_count,
+            Max( fs_user_course_count.last_watch_date ) AS last_watch_date,
+            ifnull ( sum( fs_user_course_count.stop_watch_days ), 0 ) AS stop_watch_days,
+            Max( fs_user_course_count.complete_watch_date) AS complete_watch_date
+            from fs_user_course_count where user_id = ${userId}
     </select>
 
     <insert id="insertFsUserCourseCount" parameterType="FsUserCourseCount">
@@ -245,5 +253,23 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
         </trim>
     </insert>
 
+    <select id="selectUserLastCount" resultType="FsUserLastCount">
+        SELECT
+            fs_user_course_count.user_id,
+            fs_user_course_count.`status`,
+            fs_user_course_count.last_watch_date
+        FROM
+            fs_user_course_count
+                INNER JOIN ( SELECT MAX( id ) AS id FROM fs_user_course_count
+                where fs_user_course_count.user_id in
+                <foreach item="userId" collection="userIds" open="(" separator="," close=")">
+                    #{userId}
+                </foreach>
+                GROUP BY user_id ) t2 ON fs_user_course_count.id = t2.id
+                where fs_user_course_count.user_id in
+                <foreach item="userId" collection="userIds" open="(" separator="," close=")">
+                    #{userId}
+                </foreach>
+    </select>
 
 </mapper>

+ 7 - 0
fs-user-app/src/main/java/com/fs/app/controller/WxPayController.java

@@ -111,6 +111,13 @@ public class WxPayController {
         }
     }
 
+    @PostMapping( "/test")
+    public R test() throws Exception {
+        WxSendRedPacketParam param  = new WxSendRedPacketParam();
+        storePaymentService.sendRedPacketTest(param);
+        return R.ok();
+    }
+
     @PostMapping( "/TransferNotify")
     public String TransferNotify(@RequestBody String notifyData, HttpServletRequest request, HttpServletResponse response) throws Exception {
         return storePaymentService.transferNotify(notifyData,request);