Your Name 3 년 전
부모
커밋
b9518cee5d

+ 8
- 0
src/main/java/com/yunzhi/marketing/common/CommConstant.java 파일 보기

494
      */
494
      */
495
     public static final String MESSAGE_CONTENT_OF_HOUSE = "house";
495
     public static final String MESSAGE_CONTENT_OF_HOUSE = "house";
496
 
496
 
497
+    /**
498
+     * 活动开启通知
499
+     * 必须存在表   td_miniapp_template_type 中
500
+     */
501
+    public static final String MESSAGE_ACTIVITY = "activity";
502
+
497
     /**
503
     /**
498
      * 合同签订通知
504
      * 合同签订通知
499
      * 必须存在表   td_miniapp_template_type 中
505
      * 必须存在表   td_miniapp_template_type 中
679
 
685
 
680
     public static final String RAISE_DETAIL_PATH = "/onlineSelling/pages/raiseProfile/index?id=%s";
686
     public static final String RAISE_DETAIL_PATH = "/onlineSelling/pages/raiseProfile/index?id=%s";
681
 
687
 
688
+    public static final String ACTIVITY_DETAIL_PATH = "/pages/index/activityDetail/index?id=%s";
689
+
682
     /**
690
     /**
683
      * 已锁定
691
      * 已锁定
684
      */
692
      */

+ 9
- 2
src/main/java/com/yunzhi/marketing/controller/TaBuildingDynamicController.java 파일 보기

12
 import com.yunzhi.marketing.base.BaseController;
12
 import com.yunzhi.marketing.base.BaseController;
13
 import com.yunzhi.marketing.base.ResponseBean;
13
 import com.yunzhi.marketing.base.ResponseBean;
14
 import com.yunzhi.marketing.common.CommConstant;
14
 import com.yunzhi.marketing.common.CommConstant;
15
+import com.yunzhi.marketing.common.StringUtils;
15
 import com.yunzhi.marketing.event.EventBus;
16
 import com.yunzhi.marketing.event.EventBus;
16
 import com.yunzhi.marketing.excel.HelpInitiateRecordSucceed;
17
 import com.yunzhi.marketing.excel.HelpInitiateRecordSucceed;
17
 import com.yunzhi.marketing.excel.TaActivityDynamicEnlistExport;
18
 import com.yunzhi.marketing.excel.TaActivityDynamicEnlistExport;
587
         // 如果是看房团发布,检验只能发布一次
588
         // 如果是看房团发布,检验只能发布一次
588
         if (dynamic.getType().equals("look")) {
589
         if (dynamic.getType().equals("look")) {
589
             LambdaQueryWrapper<TaBuildingDynamic> lambdaQueryWrapper = new LambdaQueryWrapper<>();
590
             LambdaQueryWrapper<TaBuildingDynamic> lambdaQueryWrapper = new LambdaQueryWrapper<>();
590
-            lambdaQueryWrapper.eq(TaBuildingDynamic::getStatus,1);
591
+            lambdaQueryWrapper.eq(TaBuildingDynamic::getStatus,CommConstant.IS_PUBLISH);
591
             lambdaQueryWrapper.eq(TaBuildingDynamic::getType,"look");
592
             lambdaQueryWrapper.eq(TaBuildingDynamic::getType,"look");
592
             lambdaQueryWrapper.eq(TaBuildingDynamic::getBuildingId,dynamic.getBuildingId());
593
             lambdaQueryWrapper.eq(TaBuildingDynamic::getBuildingId,dynamic.getBuildingId());
593
             List<TaBuildingDynamic> list = iBuildingDynamicService.list(lambdaQueryWrapper);
594
             List<TaBuildingDynamic> list = iBuildingDynamicService.list(lambdaQueryWrapper);
596
                 return responseBean;
597
                 return responseBean;
597
             }
598
             }
598
         }
599
         }
599
-        dynamic.setStatus(1);
600
+        dynamic.setStatus(CommConstant.IS_PUBLISH);
600
         dynamic.setPublishDate(LocalDateTime.now());
601
         dynamic.setPublishDate(LocalDateTime.now());
601
         dynamic.setOrgId(getOrgId(request));
602
         dynamic.setOrgId(getOrgId(request));
602
         iBuildingDynamicService.update(dynamic, dynamicQueryWrapper);
603
         iBuildingDynamicService.update(dynamic, dynamicQueryWrapper);
604
+
605
+        // 发送消息
606
+        if (CommConstant.IS_PUBLISH.equals(dynamic.getStatus()) && !StringUtils.isEmpty(dynamic.getBuildingId())) {
607
+            iBuildingDynamicService.sendMessageToSubscribers(dynamic);
608
+        }
609
+
603
         return responseBean;
610
         return responseBean;
604
     }
611
     }
605
     
612
     

+ 3
- 0
src/main/java/com/yunzhi/marketing/mapper/TaMiniappMessagePersonMapper.java 파일 보기

4
 import com.baomidou.mybatisplus.core.mapper.BaseMapper;
4
 import com.baomidou.mybatisplus.core.mapper.BaseMapper;
5
 import org.apache.ibatis.annotations.Mapper;
5
 import org.apache.ibatis.annotations.Mapper;
6
 
6
 
7
+import java.util.List;
8
+
7
 /**
9
 /**
8
  * <p>
10
  * <p>
9
  * 消息订阅人员 Mapper 接口
11
  * 消息订阅人员 Mapper 接口
15
 @Mapper
17
 @Mapper
16
 public interface TaMiniappMessagePersonMapper extends BaseMapper<TaMiniappMessagePerson> {
18
 public interface TaMiniappMessagePersonMapper extends BaseMapper<TaMiniappMessagePerson> {
17
 
19
 
20
+    List<TaMiniappMessagePerson> getPersonBy(Integer orgId, String buildingId, String messageType);
18
 }
21
 }

+ 2
- 0
src/main/java/com/yunzhi/marketing/service/IMiniAppService.java 파일 보기

31
 
31
 
32
     void sendCheckMessage(TaPerson toUser, String link, String name, String result, String programName, String failReason, String remark, LocalDateTime dt, Boolean isSuccess);
32
     void sendCheckMessage(TaPerson toUser, String link, String name, String result, String programName, String failReason, String remark, LocalDateTime dt, Boolean isSuccess);
33
 
33
 
34
+    void sendActivityMessage(TaPerson toUser, String link, String activityName, String address, LocalDateTime dt);
35
+
34
     ResponseBean getQrCode(String paramsStr, String appid);
36
     ResponseBean getQrCode(String paramsStr, String appid);
35
 
37
 
36
     String createQrCode(WxMaService service, String path) throws Exception;
38
     String createQrCode(WxMaService service, String path) throws Exception;

+ 2
- 0
src/main/java/com/yunzhi/marketing/service/ITaBuildingDynamicService.java 파일 보기

140
      * @return
140
      * @return
141
      */
141
      */
142
     ResponseBean iBuildingDynamicSelectedList(Integer pageNum, Integer pageSize, String name, String buildingId, Integer cityId, String isEnlist, LocalDateTime time, String title, Integer orgId, String activityStatus,List<TaPersonBuilding> personBuildingList);
142
     ResponseBean iBuildingDynamicSelectedList(Integer pageNum, Integer pageSize, String name, String buildingId, Integer cityId, String isEnlist, LocalDateTime time, String title, Integer orgId, String activityStatus,List<TaPersonBuilding> personBuildingList);
143
+
144
+    void sendMessageToSubscribers(TaBuildingDynamic dynamic);
143
 }
145
 }

+ 22
- 0
src/main/java/com/yunzhi/marketing/service/impl/MiniAppServiceImpl.java 파일 보기

309
         iTaPersonMessageRuleService.saveOrUpdateByPersonAndMessage(toUser.getPersonId(), messageType, contentType, toUser.getOrgId());
309
         iTaPersonMessageRuleService.saveOrUpdateByPersonAndMessage(toUser.getPersonId(), messageType, contentType, toUser.getOrgId());
310
     }
310
     }
311
 
311
 
312
+    @Override
313
+    public void sendActivityMessage(TaPerson toUser, String link, String activityName, String address, LocalDateTime dt) {
314
+        TaMiniapp miniapp = taMiniappMapper.selectById(toUser.getMiniappId());
315
+        if (null == miniapp) {
316
+            log.error("小程序 {} 不存在", toUser.getMiniappId());
317
+            return;
318
+        }
319
+
320
+        // 消息内容类型
321
+        String contentType = CommConstant.MESSAGE_ACTIVITY;
322
+        TaMiniappTemplate tpl = getTplByType(contentType, toUser.getMiniappId());
323
+        if (tpl == null) {
324
+            log.error("小程序 {} 无通知消息模板 {}", toUser.getMiniappId(), contentType);
325
+            return;
326
+        }
327
+
328
+        String[] data = new String[]{activityName, DateUtils.cutSecond(dt), address, "点击下方【查看详情】, 查看活动参与方式"};
329
+
330
+        ResponseBean res = sendSubscribeMessage(tpl, toUser, link, data);
331
+        iTaPersonMessageRuleService.saveOrUpdateByPersonAndMessage(toUser.getPersonId(), CommConstant.MESSAGE_TYPE_OF_MINIAPP_SUBSCRIBE, contentType, toUser.getOrgId());
332
+    }
333
+
312
 
334
 
313
     @Override
335
     @Override
314
     public ResponseBean getQrCode(String paramsStr, String appid) {
336
     public ResponseBean getQrCode(String paramsStr, String appid) {

+ 57
- 12
src/main/java/com/yunzhi/marketing/service/impl/TaBuildingDynamicServiceImpl.java 파일 보기

2
 
2
 
3
 
3
 
4
 import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
4
 import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
5
+import com.baomidou.mybatisplus.core.conditions.update.UpdateWrapper;
5
 import com.baomidou.mybatisplus.core.metadata.IPage;
6
 import com.baomidou.mybatisplus.core.metadata.IPage;
6
 import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
7
 import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
7
 import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
8
 import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
9
 import com.yunzhi.marketing.common.CommConstant;
10
 import com.yunzhi.marketing.common.CommConstant;
10
 import com.yunzhi.marketing.common.StringUtils;
11
 import com.yunzhi.marketing.common.StringUtils;
11
 import com.yunzhi.marketing.excel.HelpInitiateRecordSucceed;
12
 import com.yunzhi.marketing.excel.HelpInitiateRecordSucceed;
12
-import com.yunzhi.marketing.mapper.TaActivityDynamicEnlistMapper;
13
-import com.yunzhi.marketing.mapper.TaBuildingDynamicMapper;
14
-import com.yunzhi.marketing.mapper.TaBuildingMapper;
15
-import com.yunzhi.marketing.mapper.TaPersonMapper;
16
-import com.yunzhi.marketing.service.ITaBuildingDynamicService;
17
-import com.yunzhi.marketing.service.ITaSaveService;
18
-import com.yunzhi.marketing.service.TaPosterService;
19
-import com.yunzhi.marketing.service.TaShareContentService;
13
+import com.yunzhi.marketing.mapper.*;
14
+import com.yunzhi.marketing.service.*;
20
 import com.yunzhi.marketing.entity.*;
15
 import com.yunzhi.marketing.entity.*;
16
+import lombok.extern.log4j.Log4j;
17
+import lombok.extern.slf4j.Slf4j;
21
 import org.springframework.beans.factory.annotation.Autowired;
18
 import org.springframework.beans.factory.annotation.Autowired;
22
 import org.springframework.beans.propertyeditors.CustomDateEditor;
19
 import org.springframework.beans.propertyeditors.CustomDateEditor;
20
+import org.springframework.scheduling.annotation.Async;
23
 import org.springframework.stereotype.Service;
21
 import org.springframework.stereotype.Service;
24
 import org.springframework.web.bind.ServletRequestDataBinder;
22
 import org.springframework.web.bind.ServletRequestDataBinder;
25
 
23
 
43
  * @author jobob
41
  * @author jobob
44
  * @since 2019-03-21
42
  * @since 2019-03-21
45
  */
43
  */
44
+@Slf4j
46
 @Service
45
 @Service
47
 public class TaBuildingDynamicServiceImpl extends ServiceImpl<TaBuildingDynamicMapper, TaBuildingDynamic> implements ITaBuildingDynamicService {
46
 public class TaBuildingDynamicServiceImpl extends ServiceImpl<TaBuildingDynamicMapper, TaBuildingDynamic> implements ITaBuildingDynamicService {
48
 
47
 
67
     @Autowired
66
     @Autowired
68
     private TaShareContentService taShareContentService;
67
     private TaShareContentService taShareContentService;
69
 
68
 
69
+    @Autowired
70
+    private TaMiniappMessagePersonMapper taMiniappMessagePersonMapper;
71
+
72
+    @Autowired
73
+    private IMiniAppService iMiniAppService;
74
+
70
     protected void initBinder(HttpServletRequest request, ServletRequestDataBinder binder) throws Exception {
75
     protected void initBinder(HttpServletRequest request, ServletRequestDataBinder binder) throws Exception {
71
         DateFormat df = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
76
         DateFormat df = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
72
         CustomDateEditor editor = new CustomDateEditor(df, true);//true表示允许为空,false反之
77
         CustomDateEditor editor = new CustomDateEditor(df, true);//true表示允许为空,false反之
244
 
249
 
245
         // 当报名人数已满时,活动为已结束
250
         // 当报名人数已满时,活动为已结束
246
         if ((enlistCount + taActivityDynamicEnlist.getAttendNum()) > buildingDynamic.getPersonNum()) {
251
         if ((enlistCount + taActivityDynamicEnlist.getAttendNum()) > buildingDynamic.getPersonNum()) {
247
-            //taBuildingDynamic.setIsEnlist(2);
248
-            buildingDynamicMapper.updateById(taBuildingDynamic);
252
+//            UpdateWrapper<TaBuildingDynamic> updateWrapper = new UpdateWrapper<>();
253
+//            updateWrapper.set("is_enlist", 2);
254
+//            updateWrapper.eq("dynamic_id", taBuildingDynamic.getDynamicId());
255
+//            buildingDynamicMapper.update(taBuildingDynamic, updateWrapper);
249
             responseBean.addError("当前报名人数已满");
256
             responseBean.addError("当前报名人数已满");
250
             return responseBean;
257
             return responseBean;
251
         }
258
         }
273
                 .setBuildingId(taBuildingDynamic.getBuildingId());
280
                 .setBuildingId(taBuildingDynamic.getBuildingId());
274
         int state = taActivityDynamicEnlistMapper.insert(taActivityDynamicEnlist);
281
         int state = taActivityDynamicEnlistMapper.insert(taActivityDynamicEnlist);
275
         int joinNum = taBuildingDynamic.getEnlistNum() == null ? taActivityDynamicEnlist.getAttendNum():taBuildingDynamic.getEnlistNum()+taActivityDynamicEnlist.getAttendNum();
282
         int joinNum = taBuildingDynamic.getEnlistNum() == null ? taActivityDynamicEnlist.getAttendNum():taBuildingDynamic.getEnlistNum()+taActivityDynamicEnlist.getAttendNum();
276
-        taBuildingDynamic.setEnlistNum(joinNum);
277
-        buildingDynamicMapper.updateById(taBuildingDynamic);
283
+
284
+        UpdateWrapper<TaBuildingDynamic> updateWrapper = new UpdateWrapper<>();
285
+        updateWrapper.set("enlist_num", joinNum);
286
+        updateWrapper.eq("dynamic_id", taBuildingDynamic.getDynamicId());
287
+        buildingDynamicMapper.update(taBuildingDynamic, updateWrapper);
278
         return ResponseBean.success(state);
288
         return ResponseBean.success(state);
279
     }
289
     }
280
 
290
 
406
         return ResponseBean.success(hashMap);
416
         return ResponseBean.success(hashMap);
407
     }
417
     }
408
 
418
 
419
+    @Async
420
+    @Override
421
+    public void sendMessageToSubscribers(TaBuildingDynamic dynamic) {
422
+        try {
423
+            String buildingId = dynamic.getBuildingId();
424
+            String dynamicId = dynamic.getDynamicId();
425
+            String title = dynamic.getTitle();
426
+            String address = dynamic.getAddress();
427
+            LocalDateTime startDate = dynamic.getStartDate();
428
+
429
+            List<TaMiniappMessagePerson> personList = taMiniappMessagePersonMapper.getPersonBy(dynamic.getOrgId(), buildingId, CommConstant.MESSAGE_ACTIVITY);
430
+
431
+            for (TaMiniappMessagePerson item : personList) {
432
+                String personId = item.getPersonId();
433
+                TaPerson taPerson = taPersonMapper.getById(personId);
434
+
435
+                try {
436
+                    log.info("================ 发送活动 【{}】 开始信息给 {}({})", title, taPerson.getNickname(), personId);
437
+                    iMiniAppService.sendActivityMessage(taPerson,
438
+                            String.format(CommConstant.ACTIVITY_DETAIL_PATH, dynamicId),
439
+                            title,
440
+                            address,
441
+                            startDate);
442
+                } catch (Exception e) {
443
+                    e.printStackTrace();
444
+                }
445
+
446
+                // 每间隔1秒发送一次
447
+                Thread.sleep(1000);
448
+            }
449
+        } catch (Exception e) {
450
+            e.printStackTrace();
451
+        }
452
+    }
453
+
409
     @Override
454
     @Override
410
     public IPage<TaBuildingDynamic> getJoinedActivity(int pageNumber, int pageSize,String building,TaPerson person,Integer orgId){
455
     public IPage<TaBuildingDynamic> getJoinedActivity(int pageNumber, int pageSize,String building,TaPerson person,Integer orgId){
411
         QueryWrapper<TaActivityDynamicEnlist> activityDynamicEnlistQueryWrapper = new QueryWrapper<>();
456
         QueryWrapper<TaActivityDynamicEnlist> activityDynamicEnlistQueryWrapper = new QueryWrapper<>();

+ 1
- 1
src/main/resources/application-prod.yml 파일 보기

6
   datasource:
6
   datasource:
7
     username: marketing
7
     username: marketing
8
     password: u@cSFJ5*kS9hGP7a
8
     password: u@cSFJ5*kS9hGP7a
9
-    url: jdbc:mysql://localhost:3306/marketing-cloud?useUnicode=true&serverTimezone=Asia/Shanghai&characterEncoding=utf8&allowMultiQueries=true&autoReconnect=true&zeroDateTimeBehavior=convertToNull
9
+    url: jdbc:mysql://210.13.107.60:3306/marketing-cloud?useUnicode=true&serverTimezone=Asia/Shanghai&characterEncoding=utf8&allowMultiQueries=true&autoReconnect=true&zeroDateTimeBehavior=convertToNull
10
     driver-class-name: com.mysql.cj.jdbc.Driver
10
     driver-class-name: com.mysql.cj.jdbc.Driver
11
     initial-size: 10 # 初始化连接数
11
     initial-size: 10 # 初始化连接数
12
     max-active: 20 # 最大连接数
12
     max-active: 20 # 最大连接数

+ 5
- 0
src/main/resources/mapper/TaMiniappMessagePersonMapper.xml 파일 보기

2
 <!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
2
 <!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
3
 <mapper namespace="com.yunzhi.marketing.mapper.TaMiniappMessagePersonMapper">
3
 <mapper namespace="com.yunzhi.marketing.mapper.TaMiniappMessagePersonMapper">
4
 
4
 
5
+    <select id="getPersonBy" resultType="com.yunzhi.marketing.entity.TaMiniappMessagePerson">
6
+        select * from ta_miniapp_message_person
7
+        where org_id = #{orgId} and message_type = #{messageType} and building_id = #{buildingId}
8
+        order by create_date asc
9
+    </select>
5
 </mapper>
10
 </mapper>