Переглянути джерело

活动抽奖及领奖修改

dongbw 8 роки тому
батько
коміт
6584c7fb1b
44 змінених файлів з 935 додано та 458 видалено
  1. 6 0
      donate-console/pom.xml
  2. 42 0
      donate-console/src/main/java/com/uas/console/donate/MessageConfiguration.java
  3. 1 1
      donate-console/src/main/java/com/uas/console/donate/SSOConfiguration.java
  4. 2 0
      donate-console/src/main/java/com/uas/console/donate/controller/ActivityController.java
  5. 0 16
      donate-console/src/main/java/com/uas/console/donate/controller/ActivityRecodeController.java
  6. 0 25
      donate-console/src/main/java/com/uas/console/donate/controller/SmsController.java
  7. 110 28
      donate-console/src/main/java/com/uas/console/donate/model/ActivityRecode.java
  8. 3 3
      donate-console/src/main/java/com/uas/console/donate/model/Message.java
  9. 3 3
      donate-console/src/main/java/com/uas/console/donate/model/MessageDetail.java
  10. 0 2
      donate-console/src/main/java/com/uas/console/donate/service/ActivityRecodeService.java
  11. 22 0
      donate-console/src/main/java/com/uas/console/donate/service/MessageService.java
  12. 0 55
      donate-console/src/main/java/com/uas/console/donate/service/impl/ActivityRecodeServiceImpl.java
  13. 90 5
      donate-console/src/main/java/com/uas/console/donate/service/impl/ActivityServiceImpl.java
  14. 70 0
      donate-console/src/main/java/com/uas/console/donate/service/impl/MessageServiceImpl.java
  15. 7 0
      donate-console/src/main/resources/config/application-dev.properties
  16. 10 3
      donate-console/src/main/resources/config/application-prod.properties
  17. 8 1
      donate-console/src/main/resources/config/application-test.properties
  18. 5 5
      donate-console/src/main/resources/dev/account.properties
  19. 1 1
      donate-console/src/main/resources/prod/account.properties
  20. 8 0
      donate-console/src/main/resources/spring/dubbo.xml
  21. 5 5
      donate-console/src/main/resources/test/account.properties
  22. 4 1
      donate-console/src/main/webapp/resources/js/index/app.js
  23. 21 40
      donate-service/src/main/java/com/uas/service/donate/MessageConfiguration.java
  24. 3 3
      donate-service/src/main/java/com/uas/service/donate/controller/ActivityController.java
  25. 52 0
      donate-service/src/main/java/com/uas/service/donate/controller/BaseController.java
  26. 13 5
      donate-service/src/main/java/com/uas/service/donate/controller/MessageSendController.java
  27. 2 2
      donate-service/src/main/java/com/uas/service/donate/dao/ProjectRecodeDao.java
  28. 27 13
      donate-service/src/main/java/com/uas/service/donate/model/ActivityRecode.java
  29. 3 3
      donate-service/src/main/java/com/uas/service/donate/model/Message.java
  30. 4 4
      donate-service/src/main/java/com/uas/service/donate/model/MessageDetail.java
  31. 18 3
      donate-service/src/main/java/com/uas/service/donate/service/MessageService.java
  32. 17 4
      donate-service/src/main/java/com/uas/service/donate/service/impl/ActivityServiceImpl.java
  33. 27 12
      donate-service/src/main/java/com/uas/service/donate/service/impl/MessageServiceImpl.java
  34. 7 0
      donate-service/src/main/resources/config/application-dev.properties
  35. 9 2
      donate-service/src/main/resources/config/application-prod.properties
  36. 8 1
      donate-service/src/main/resources/config/application-test.properties
  37. 10 2
      donate-service/src/main/webapp/resources/js/activity/app.js
  38. 32 18
      donate-service/src/main/webapp/resources/js/activity/controllers/ActivityDetailCtrl.js
  39. 12 0
      donate-service/src/main/webapp/resources/js/common/query/Public.js
  40. 14 0
      donate-service/src/main/webapp/resources/js/user/controllers/UserCtrl.js
  41. 71 186
      donate-service/src/main/webapp/resources/view/activity/activity_detail.html
  42. 177 0
      donate-service/src/main/webapp/resources/view/activity/award_over.html
  43. 1 1
      donate-service/src/main/webapp/resources/view/common/nav.html
  44. 10 5
      donate-service/src/main/webapp/resources/view/user/user_center.html

+ 6 - 0
donate-console/pom.xml

@@ -69,6 +69,12 @@
             <artifactId>platform-core</artifactId>
         </dependency>-->
 
+        <!-- 邮件 -->
+        <dependency>
+            <groupId>com.uas.message</groupId>
+            <artifactId>message-mail-api</artifactId>
+        </dependency>
+
         <!-- dfs on dubbo -->
         <dependency>
             <groupId>com.uas.dfs</groupId>

+ 42 - 0
donate-console/src/main/java/com/uas/console/donate/MessageConfiguration.java

@@ -0,0 +1,42 @@
+package com.uas.console.donate;
+
+import org.springframework.beans.factory.annotation.Value;
+import org.springframework.context.annotation.Configuration;
+
+@Configuration
+public class MessageConfiguration {
+
+	/**
+	 * 短信发送访问url
+	 */
+	@Value("${messageUrl}")
+	private String messageUrl;
+
+	//TODO 按需要修改
+	/**
+	 * 邮件模板id:获奖通知邮件模版id
+	 *
+	 * @return
+	 */
+	@Value("${mailGotPrize}")
+	private String mailGotPrize;
+
+	/**
+	 * 短信模板id:中奖通知短信模版id
+	 */
+	@Value("${messageGotPrize}")
+	private String messageGotPrize;
+
+
+	public String getMessageUrl() {
+		return messageUrl;
+	}
+
+	public String getMailGotPrize() {
+		return mailGotPrize;
+	}
+
+	public String getMessageGotPrize() {
+		return messageGotPrize;
+	}
+}

+ 1 - 1
donate-console/src/main/java/com/uas/console/donate/SSOConfiguration.java

@@ -34,7 +34,7 @@ public class SSOConfiguration extends WebMvcConfigurerAdapter {
          * SSO过滤
          */
         registry.addInterceptor(ssoInterceptor).addPathPatterns("/**").
-                excludePathPatterns("/WEB-INF/**","/**/static/**", "/**/login/**", "/**/logout/**", "/login/**", "/logout/**");
+                excludePathPatterns("/WEB-INF/**", "/**/static/**", "/**/login/**", "/**/logout/**", "/login/**", "/logout/**");
     }
 
     @Bean

+ 2 - 0
donate-console/src/main/java/com/uas/console/donate/controller/ActivityController.java

@@ -280,6 +280,8 @@ public class ActivityController {
 
     /**
      * 开奖
+     * @param id 活动id
+     * @return ModelMap 开奖反馈信息
      */
     @RequestMapping(value = "/openAward/{id}", method = RequestMethod.POST)
     @ResponseBody

+ 0 - 16
donate-console/src/main/java/com/uas/console/donate/controller/ActivityRecodeController.java

@@ -1,9 +1,7 @@
 package com.uas.console.donate.controller;
 
 import com.alibaba.fastjson.JSONObject;
-import com.uas.console.donate.model.Activity;
 import com.uas.console.donate.model.ActivityRecode;
-import com.uas.console.donate.model.Award;
 import com.uas.console.donate.service.ActivityRecodeService;
 import com.uas.console.donate.service.ActivityService;
 import com.uas.console.donate.service.AwardService;
@@ -12,8 +10,6 @@ import org.springframework.stereotype.Controller;
 import org.springframework.web.bind.annotation.RequestMapping;
 import org.springframework.web.bind.annotation.ResponseBody;
 
-import java.awt.*;
-import java.util.*;
 import java.util.List;
 
 @Controller
@@ -72,16 +68,4 @@ public class ActivityRecodeController {
 
         return activityRecodeService.joins(activityId);
     }
-
-    /**
-     * 抽奖
-     */
-    @ResponseBody
-    @RequestMapping("/extract")
-    public List<ActivityRecode> extract(Long activityId) {
-
-        List<ActivityRecode> activityRecodeList=new ArrayList<ActivityRecode>();
-        return activityRecodeList;
-    }
-
 }

+ 0 - 25
donate-console/src/main/java/com/uas/console/donate/controller/SmsController.java

@@ -1,25 +0,0 @@
-package com.uas.console.donate.controller;
-
-import com.alibaba.fastjson.JSONObject;
-import com.uas.console.donate.model.SmsMessage;
-import org.springframework.stereotype.Controller;
-import org.springframework.web.bind.annotation.RequestMapping;
-import org.springframework.web.bind.annotation.ResponseBody;
-
-@Controller
-@RequestMapping("/message")
-public class SmsController {
-
-
-
-    /**
-     * 发送给个人
-     * @param jsonStr
-     */
-    @ResponseBody
-    @RequestMapping("/")
-    public void sendMessage(String jsonStr){
-        SmsMessage smsMessage= JSONObject.parseObject(jsonStr,SmsMessage.class);
-
-    }
-}

+ 110 - 28
donate-console/src/main/java/com/uas/console/donate/model/ActivityRecode.java

@@ -1,8 +1,5 @@
 package com.uas.console.donate.model;
 
-import com.alibaba.fastjson.annotation.JSONField;
-import com.fasterxml.jackson.annotation.JsonIgnore;
-
 import javax.persistence.*;
 import java.util.Date;
 
@@ -10,65 +7,73 @@ import java.util.Date;
  * 活动参加记录
  */
 @Entity
-@Table(name="donate$activityrecode")
+@Table(name = "donate$activityrecode")
 public class ActivityRecode {
 
-    private static final long serialVersionUID = 1L;
-
+    /**
+     * id
+     */
     @Id
     @GeneratedValue(strategy= GenerationType.IDENTITY)
-    @Column(name="ar_id")
+    @Column(name = "ar_id")
     private  Long id;
 
     /**
      * 活动编号
      */
-    @Column(name="ar_act_id")
+    @Column(name = "ar_act_id")
     private Long activityId;
 
     /**
      * 活动
      */
     @ManyToOne(cascade = CascadeType.REFRESH)
-    @JoinColumn(name="ar_act_id", insertable = false, updatable = false)
+    @JoinColumn(name = "ar_act_id", insertable = false, updatable = false)
     private Activity activity;
 
     /**
      * 优软云账号
      */
-    @Column(name="ar_uuid")
+    @Column(name = "ar_uuid")
     private Long uuid;
 
     /**
      * 用户
      */
     @OneToOne(cascade = CascadeType.REFRESH)
-    @JoinColumn(name="ar_uuid", insertable = false, updatable = false)
+    @JoinColumn(name = "ar_uuid", insertable = false, updatable = false)
     private User user;
 
     /**
      * 获奖的奖品编号
      */
-    @Column(name="ar_aw_id")
+    @Column(name = "ar_aw_id")
     private Long awardId;
 
     /**
-     * 领取状态 0:初始状态 1:未领取 2:已领取 3:奖品失效
+     * 奖品信息
+     */
+    @OneToOne(cascade = CascadeType.REFRESH)
+    @JoinColumn(name = "ar_aw_id", insertable = false, updatable = false)
+    private Award award;
+
+    /**
+     * 领取状态 0:初始状态 1:未领取 2:已领取 3:已完成
      */
-    @Column(name="ar_aw_status")
+    @Column(name = "ar_aw_status")
     private Integer status;
 
     /**
      * 用户参加时间
      */
-    @Column(name="ar_joined_time")
+    @Column(name = "ar_joined_time")
     private Date joinedTime;
 
 
     /**
      * 用户领奖时间
      */
-    @Column(name="ar_receive_time")
+    @Column(name = "ar_receive_time")
     private Date receiveTime;
 
     /**
@@ -79,11 +84,40 @@ public class ActivityRecode {
     private Integer isGetAward;
 
     /**
-     * 奖品等级
-     * @return
+     * 省
+     */
+    @Column(name = "ar_province")
+    private String province;
+
+    /**
+     * 市
+     */
+    @Column(name = "ar_city")
+    private String city;
+
+    /**
+     * 区
+     */
+    @Column(name = "ar_district")
+    private String district;
+
+    /**
+     * 详细地址
+     */
+    @Column(name = "ar_address")
+    private String address;
+
+    /**
+     * 领奖联系电话
      */
-    @Column(name = "ar_awardLeavel")
-    private String awardLeavel;
+    @Column(name = "ar_tel")
+    private String tel;
+
+    /**
+     * 领奖兑换码(用于短信通知领奖验证)
+     */
+    @Column(name = "ar_redeemcode")
+    private String redeemCode;
 
 
     public Long getId() {
@@ -118,6 +152,14 @@ public class ActivityRecode {
         this.awardId = awardId;
     }
 
+    public Award getAward() {
+        return award;
+    }
+
+    public void setAward(Award award) {
+        this.award = award;
+    }
+
     public Integer getStatus() {
         return status;
     }
@@ -142,14 +184,6 @@ public class ActivityRecode {
         this.isGetAward = isGetAward;
     }
 
-    public String getAwardLeavel() {
-        return awardLeavel;
-    }
-
-    public void setAwardLeavel(String awardLeavel) {
-        this.awardLeavel = awardLeavel;
-    }
-
     public Activity getActivity() {
         return activity;
     }
@@ -173,4 +207,52 @@ public class ActivityRecode {
     public void setJoinedTime(Date joinedTime) {
         this.joinedTime = joinedTime;
     }
+
+    public String getProvince() {
+        return province;
+    }
+
+    public void setProvince(String province) {
+        this.province = province;
+    }
+
+    public String getCity() {
+        return city;
+    }
+
+    public void setCity(String city) {
+        this.city = city;
+    }
+
+    public String getDistrict() {
+        return district;
+    }
+
+    public void setDistrict(String district) {
+        this.district = district;
+    }
+
+    public String getAddress() {
+        return address;
+    }
+
+    public void setAddress(String address) {
+        this.address = address;
+    }
+
+    public String getTel() {
+        return tel;
+    }
+
+    public void setTel(String tel) {
+        this.tel = tel;
+    }
+
+    public String getRedeemCode() {
+        return redeemCode;
+    }
+
+    public void setRedeemCode(String redeemCode) {
+        this.redeemCode = redeemCode;
+    }
 }

+ 3 - 3
donate-console/src/main/java/com/uas/console/donate/model/Message.java

@@ -205,12 +205,12 @@ public class Message implements Serializable {
 
     @JsonIgnore
     @JSONField(serialize = false)
-    public Set<MessageDetail> getNoticeDetails() {
+    public Set<MessageDetail> getMessageDetails() {
         return messageDetails;
     }
 
-    public void setNoticeDetails(Set<MessageDetail> noticeDetails) {
-        this.messageDetails = noticeDetails;
+    public void setMessageDetails(Set<MessageDetail> messageDetails) {
+        this.messageDetails = messageDetails;
     }
 
     public String getReceiver() {

+ 3 - 3
donate-console/src/main/java/com/uas/console/donate/model/MessageDetail.java

@@ -139,11 +139,11 @@ public class MessageDetail implements Serializable{
         this.totalStatus = totalStatus;
     }
 
-    public Message getNotice() {
+    public Message getMessage() {
         return message;
     }
 
-    public void setNotice(Message notice) {
-        this.message = notice;
+    public void setMessage(Message message) {
+        this.message = message;
     }
 }

+ 0 - 2
donate-console/src/main/java/com/uas/console/donate/service/ActivityRecodeService.java

@@ -17,6 +17,4 @@ public interface ActivityRecodeService {
     //查询某用户参与的活动记录
     List<ActivityRecode> queryOne(Long uuid);
 
-    //抽奖方法
-    List<ActivityRecode> extract(Long activityId);
 }

+ 22 - 0
donate-console/src/main/java/com/uas/console/donate/service/MessageService.java

@@ -4,6 +4,10 @@ import com.uas.console.donate.model.Message;
 import com.uas.console.donate.model.SearchFilter;
 import com.uas.platform.core.model.PageInfo;
 import org.springframework.data.domain.Page;
+import org.springframework.http.ResponseEntity;
+
+import java.util.List;
+import java.util.Map;
 
 /**
  * Created by dongbw
@@ -25,4 +29,22 @@ public interface MessageService {
      * @return 消息实体
      */
     Message getDetailById(Long id);
+
+    /**
+     * 发送邮件
+     * @param receivedEmail 接收邮箱
+     * @param model 发送实体
+     * @param tplId 模版id
+     * @return response
+     */
+    ResponseEntity<String> sendMail(String receivedEmail, Map<String, Object> model, String tplId);
+
+    /**
+     * 发送短信
+     * @param receiverTel 接收号码
+     * @param obj 发送内容
+     * @param msgId 短信模版id
+     * @return response
+     */
+    ResponseEntity<String> sendMessage(String receiverTel, List<Object> obj, String msgId);
 }

+ 0 - 55
donate-console/src/main/java/com/uas/console/donate/service/impl/ActivityRecodeServiceImpl.java

@@ -1,19 +1,14 @@
 package com.uas.console.donate.service.impl;
 
 import com.uas.console.donate.dao.ActivityRecodeDao;
-import com.uas.console.donate.model.Activity;
 import com.uas.console.donate.model.ActivityRecode;
-import com.uas.console.donate.model.Award;
 import com.uas.console.donate.service.ActivityRecodeService;
 import com.uas.console.donate.service.ActivityService;
 import com.uas.console.donate.service.AwardService;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.stereotype.Service;
 
-import java.util.Date;
-import java.util.HashSet;
 import java.util.List;
-import java.util.Set;
 
 @Service
 public class ActivityRecodeServiceImpl implements ActivityRecodeService {
@@ -49,54 +44,4 @@ public class ActivityRecodeServiceImpl implements ActivityRecodeService {
     public List<ActivityRecode> queryOne(Long uuid){
         return activityRecodeDao.findByUuid(uuid);
     }
-
-    //抽奖方法
-    public List<ActivityRecode> extract(Long activityId){
-        //根据活动id查询谁参与了抽奖
-        List<ActivityRecode> activityRecodeList = activityRecodeService.joins(activityId);
-
-        //根据活动id查询活动奖品
-        List<Award> awardList = awardService.findByActivityId(activityId);
-
-        Set<Integer> set = new HashSet<Integer>();
-
-        //抽奖方法
-        for (Award award : awardList) {
-            //奖品的总数量
-            int amount = award.getAmount();
-            //参与活动人数
-            int size = activityRecodeList.size();
-            //中奖数量
-            int list = (amount <= size) ? amount : size;
-            //得到奖品级别
-            String awardLeavel=award.getAwardLevel();
-
-            //设置随机抽奖
-            for (int i = 1; i <= list; i++) {
-                int random = (int) (Math.random() * size);
-                while (set.contains(random)) {
-                    random = (int) (Math.random() * size);
-                }
-                ActivityRecode activityRecode = activityRecodeList.get(random);
-
-                activityRecode.setAwardId(award.getId());
-                activityRecode.setIsGetAward(1);
-                activityRecode.setReceiveTime(new Date());
-                activityRecode.setStatus(0);
-                activityRecode.setAwardLeavel(awardLeavel);
-
-                activityRecodeService.save(activityRecode);
-                set.add(random);
-            }
-            //在活动表里面保存中奖数
-            Activity activity=activityService.findOne(activityId);
-            activity.setReceivePerson(list);
-
-            //计算出这个活动的中奖率,中奖数除以总人数
-            Double chance=(list*100.00)/size;
-
-            activityService.save(activity);
-        }
-        return activityRecodeList;
-    }
 }

+ 90 - 5
donate-console/src/main/java/com/uas/console/donate/service/impl/ActivityServiceImpl.java

@@ -1,10 +1,12 @@
 package com.uas.console.donate.service.impl;
 
+import com.uas.console.donate.MessageConfiguration;
 import com.uas.console.donate.core.support.SystemSession;
 import com.uas.console.donate.dao.*;
 import com.uas.console.donate.model.*;
 import com.uas.console.donate.service.ActivityService;
 import com.uas.console.donate.service.AttachService;
+import com.uas.console.donate.service.MessageService;
 import com.uas.console.donate.util.CollectionUtils;
 import com.uas.dfs.service.FileClient;
 import com.uas.platform.core.model.PageInfo;
@@ -24,10 +26,7 @@ import javax.persistence.criteria.Predicate;
 import javax.persistence.criteria.Root;
 import java.math.BigInteger;
 import java.text.SimpleDateFormat;
-import java.util.Date;
-import java.util.HashSet;
-import java.util.List;
-import java.util.Set;
+import java.util.*;
 
 
 @Service
@@ -53,6 +52,25 @@ public class ActivityServiceImpl implements ActivityService{
     @Autowired
     private FileClient fileClient;
 
+    @Autowired
+    private ActivityRecodeDao activityRecodeDao;
+
+    @Autowired
+    private MessageService messageService;
+
+    @Autowired
+    private MessageConfiguration messageConfiguration;
+
+    /**
+     * 已中奖
+     */
+    static final Integer IS_GET_AWARD = 1;
+
+    /**
+     * 奖品待领取
+     */
+    static final Integer TO_BE_ACCEPTED = 0;
+
 
     /**
      * 如果活动有草稿状态就取出草稿
@@ -220,15 +238,82 @@ public class ActivityServiceImpl implements ActivityService{
 
     @Override
     public ModelMap openAward(Long activityId) {
-        //TODO 开奖算法
         ModelMap map = new ModelMap();
         Activity activity = activityDao.findOne(activityId);
         if (activity.getActivityRecords().size() == 0) {
             map.put("error", "该活动暂时无人参加,无法开奖!");
             return map;
         }
+        return extract(activityId);
+    }
+
+    /**
+     * 抽奖方法
+     * @param activityId  活动id
+     * @return ModelMap 开奖信息
+     */
+    private ModelMap extract(Long activityId){
+        ModelMap map = new ModelMap();
+        //根据活动id查询谁参与了抽奖
+        List<ActivityRecode> activityRecodeList = activityRecodeDao.joins(activityId);
+        //参与活动人数
+        int size = activityRecodeList.size();
+        //根据活动id查询活动奖品
+        List<Award> awardList = awardDao.findByActivityId(activityId);
+        Activity activity = activityDao.findOne(activityId);
+        Set<Integer> set = new HashSet<Integer>();
+        List<ActivityRecode> activityRecodes = new ArrayList<>();
+        // 统计中奖总人数
+        Integer awardPersonNums = 0;
+        //抽奖方法
+        for (Award award : awardList) {
+            //奖品的总数量
+            int amount = award.getAmount();
+            //中奖数量
+            int list;
+            if (amount > size) {
+                list = size;
+            } else {
+                list = amount;
+                // 去掉已参与本奖品抽奖的人数
+                size = size - amount;
+            }
+            //设置随机抽奖
+            for (int i = 1; i <= list; i++) {
+                int random = (int) (Math.random() * size);
+                while (set.contains(random)) {
+                    random = (int) (Math.random() * size);
+                }
+                ActivityRecode activityRecode = activityRecodeList.get(random);
+
+                activityRecode.setAwardId(award.getId());
+                activityRecode.setIsGetAward(IS_GET_AWARD);
+                activityRecode.setReceiveTime(new Date());
+                activityRecode.setStatus(TO_BE_ACCEPTED);
+                activityRecodes.add(activityRecode);
+                set.add(random);
+                awardPersonNums = awardPersonNums + list;
+            }
+        }
+        activityRecodeDao.save(activityRecodes);
+        activity.setReceivePerson(awardPersonNums);
         activity.setLuckyTime(new Date());
+        //计算出这个活动的中奖率,中奖数除以总人数
+        Double chance = (double) (awardPersonNums / activityRecodeList.size());
+        activity.setChance(chance);
         activityDao.save(activity);
+        //TODO 发送短信通知中奖
+        try {
+            for (ActivityRecode activityRecode : activityRecodes) {
+                List<Object> obj = new ArrayList<>();
+                obj.add(activity.getName());
+                obj.add(activityRecode.getAward().getAwardLevel());
+                obj.add(activityRecode.getAward().getAwardName());
+                messageService.sendMessage(activityRecode.getTel(), obj, messageConfiguration.getMessageGotPrize());
+            }
+        } catch (RuntimeException e) {
+            throw new RuntimeException("开奖成功,但发送短信通知失败");
+        }
         map.put("success", "开奖成功!");
         return map;
     }

+ 70 - 0
donate-console/src/main/java/com/uas/console/donate/service/impl/MessageServiceImpl.java

@@ -1,15 +1,22 @@
 package com.uas.console.donate.service.impl;
 
+import com.uas.console.donate.MessageConfiguration;
 import com.uas.console.donate.dao.MessageDao;
 import com.uas.console.donate.dao.MessageDetailDao;
 import com.uas.console.donate.model.Message;
 import com.uas.console.donate.model.SearchFilter;
+import com.uas.console.donate.model.SmsMessage;
 import com.uas.console.donate.service.MessageService;
+import com.uas.message.mail.service.MailService;
 import com.uas.platform.core.model.PageInfo;
 import com.uas.platform.core.persistence.criteria.PredicateUtils;
+import com.uas.platform.core.util.HttpUtil;
+import com.uas.platform.core.util.serializer.FlexJsonUtils;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.data.domain.Page;
 import org.springframework.data.jpa.domain.Specification;
+import org.springframework.http.HttpStatus;
+import org.springframework.http.ResponseEntity;
 import org.springframework.stereotype.Service;
 import org.springframework.util.StringUtils;
 
@@ -17,6 +24,8 @@ import javax.persistence.criteria.CriteriaBuilder;
 import javax.persistence.criteria.CriteriaQuery;
 import javax.persistence.criteria.Predicate;
 import javax.persistence.criteria.Root;
+import java.util.List;
+import java.util.Map;
 
 /**
  * Created by dongbw
@@ -31,6 +40,12 @@ public class MessageServiceImpl implements MessageService {
     @Autowired
     private MessageDetailDao messageDetailDao;
 
+    @Autowired
+    private MailService mailService;
+
+    @Autowired
+    private MessageConfiguration messageConfiguration;
+
     /**
      * 获取所有消息
      *
@@ -71,4 +86,59 @@ public class MessageServiceImpl implements MessageService {
     public Message getDetailById(Long id) {
         return messageDao.findOne(id);
     }
+
+    /**
+     * 发送邮件
+     * @param receivedEmail 接收邮箱
+     * @param model 发送实体
+     * @param tplId 模版id
+     * @return response
+     */
+    @Override
+    public ResponseEntity<String> sendMail(String receivedEmail, Map<String, Object> model, String tplId) {
+        try {
+            if (!StringUtils.isEmpty(tplId)) {
+//                model.put("vendorusername", "");
+//                model.put("vendorname", "");
+//                model.put("custname", "");
+//                model.put("inviteuid", "");
+//                model.put("inviteUserCode", "");
+                mailService.send(tplId, receivedEmail, model);
+            }
+            return new ResponseEntity<String>(HttpStatus.OK);
+        } catch (Exception e) {
+            // TODO 添加日志
+            e.printStackTrace();
+            return new ResponseEntity<String>(HttpStatus.INTERNAL_SERVER_ERROR);
+        }
+    }
+
+    /**
+     * 发送短信
+     * @param receiverTel 接收号码
+     * @param obj 发送内容
+     * @param msgId 短信模版id
+     * @return response
+     */
+    @Override
+    public ResponseEntity<String> sendMessage(String receiverTel, List<Object> obj, String msgId) {
+        try {
+            if (!StringUtils.isEmpty(msgId)) {
+                SmsMessage sms = new SmsMessage();
+//            obj.add(record.getVendusername());
+//            obj.add(record.getVendname());
+//            obj.add(SystemSession.getUser().getUserName() + "("
+//                    + SystemSession.getUser().getEnterprise().getEnName() + ")");
+                sms.setParams(obj);
+                sms.setReceiver(receiverTel);
+                sms.setTemplateId(msgId);
+                HttpUtil.sendPost(messageConfiguration.getMessageUrl(), FlexJsonUtils.toJsonDeep(sms));
+            }
+            return new ResponseEntity<String>(HttpStatus.OK);
+        } catch (Exception e) {
+            // TODO 添加日志
+            e.printStackTrace();
+            return new ResponseEntity<String>(HttpStatus.INTERNAL_SERVER_ERROR);
+        }
+    }
 }

+ 7 - 0
donate-console/src/main/resources/config/application-dev.properties

@@ -38,3 +38,10 @@ spring.http.encoding.force=true
 spring.http.multipart.enabled=true
 spring.http.multipart.max-file-size=128MB
 spring.http.multipart.max-request-size=128MB
+
+# mailConfig
+mailGotPrize=
+
+## messageConfig
+messageGotPrize=
+messageUrl=http://message.ubtob.com/sms/send

+ 10 - 3
donate-console/src/main/resources/config/application-prod.properties

@@ -31,12 +31,19 @@ spring.jpa.hibernate.dialect=org.hibernate.dialect.5Dialect
 spring.jackson.serialization.indent_output=false  
 
 zk.url=zookeeper://10.10.100.11:2181
-dubbo.owner=dev
-dubbo.group=dev
+dubbo.owner=prod
+dubbo.group=prod
 
 spring.http.encoding.force=true
 spring.http.multipart.enabled=true
 spring.http.multipart.max-file-size=128MB
 spring.http.multipart.max-request-size=128MB
 
-server.tomcat.basedir=/tmp/test-tomcat
+server.tomcat.basedir=/tmp/test-tomcat
+
+# mailConfig
+mailGotPrize=
+
+## messageConfig
+messageGotPrize=
+messageUrl=http://message.ubtob.com/sms/send

+ 8 - 1
donate-console/src/main/resources/config/application-test.properties

@@ -39,4 +39,11 @@ spring.http.multipart.enabled=true
 spring.http.multipart.max-file-size=128MB
 spring.http.multipart.max-request-size=128MB
 
-server.tomcat.basedir=C:/Temp/test-tomcat
+server.tomcat.basedir=C:/Temp/test-tomcat
+
+# mailConfig
+mailGotPrize=
+
+## messageConfig
+messageGotPrize=
+messageUrl=http://message.ubtob.com/sms/send

+ 5 - 5
donate-console/src/main/resources/dev/account.properties

@@ -1,6 +1,6 @@
 ### sso config
 sso.app=donate
-token secretkey
+#token secretkey
 sso.secretkey=0taQcW073Z7G628g5H
 sso.cookie.secure=false
 
@@ -8,10 +8,10 @@ sso.cookie.secure=false
 sso.login.url=http://113.105.74.135:8001/sso/login
 
 ### account center config,
-account.us.save.url=http://10.10.100.133:8080/api/userspace
-account.user.save.url=http://10.10.100.133:8080/api/user
-account.user.getPartners.url = http://10.10.100.133:8080/api/partners
-account.user.getContactPage.url=https://account.ubtob.com/business/groups
+account.us.save.url=http://10.10.100.133/api/userspace
+account.user.save.url=http://10.10.100.133/api/user
+account.user.getPartners.url = http://10.10.100.133/api/partners
+account.user.getContactPage.url = http://113.105.74.135:8001/business/groups
 
 #cross domain
 sso.ask.url=http://113.105.74.135:8001/sso/login/ask

+ 1 - 1
donate-console/src/main/resources/prod/account.properties

@@ -1,6 +1,6 @@
 ### sso config
 sso.app=donate
-token secretkey
+#token secretkey
 sso.secretkey=0taQcW073Z7G628g5H
 sso.cookie.secure=false
 

+ 8 - 0
donate-console/src/main/resources/spring/dubbo.xml

@@ -11,4 +11,12 @@
     <!-- 分布式文件服务 -->
     <dubbo:reference id="fileClient" interface="com.uas.dfs.service.FileClient" timeout="100000"/>
 
+    <!-- 邮件服务 -->
+    <dubbo:reference id="mailService"
+                     interface="com.uas.message.mail.service.MailService" timeout="10000" />
+
+    <!-- 消费短信服务 -->
+    <dubbo:reference id="smsService"
+                     interface="com.uas.message.sms.service.SmsService" timeout="30000" />
+
 </beans>

+ 5 - 5
donate-console/src/main/resources/test/account.properties

@@ -1,6 +1,6 @@
 ### sso config
 sso.app=donate
-token secretkey
+#token secretkey
 sso.secretkey=0taQcW073Z7G628g5H
 sso.cookie.secure=false
 
@@ -8,10 +8,10 @@ sso.cookie.secure=false
 sso.login.url=http://113.105.74.135:8001/sso/login
 
 ### account center config,
-account.us.save.url=http://10.10.100.133:8080/api/userspace
-account.user.save.url=http://10.10.100.133:8080/api/user
-account.user.getPartners.url = http://10.10.100.133:8080/api/partners
-account.user.getContactPage.url=https://account.ubtob.com/business/groups
+account.us.save.url=http://10.10.100.133/api/userspace
+account.user.save.url=http://10.10.100.133/api/user
+account.user.getPartners.url = http://10.10.100.133/api/partners
+account.user.getContactPage.url = http://113.105.74.135:8001/business/groups
 
 #cross domain
 sso.ask.url=http://113.105.74.135:8001/sso/login/ask

+ 4 - 1
donate-console/src/main/webapp/resources/js/index/app.js

@@ -2352,7 +2352,9 @@ define([ 'angularAMD', 'ui.router', 'ui-bootstrap', 'ngLocal', 'ngTable', 'file-
 
             // 开奖
             $scope.openAward = function(id) {
+                $scope.loading = true;
                 Activity.openAward({id: id}, {}, function(data) {
+                    $scope.loading = false;
                     if (data.success) {
                         toaster.pop('success', data.success);
                         $scope.activityParams.reload();
@@ -2361,7 +2363,8 @@ define([ 'angularAMD', 'ui.router', 'ui-bootstrap', 'ngLocal', 'ngTable', 'file-
                         toaster.pop('warning', data.error);
                     }
                 }, function(response) {
-                    toaster.pop('error', '数据加载错误');
+                    $scope.loading = false;
+                    toaster.pop('error', '出现错误,开奖失败');
                 });
             };
 

+ 21 - 40
donate-service/src/main/java/com/uas/service/donate/MessageConfiguration.java

@@ -9,53 +9,34 @@ public class MessageConfiguration {
 	/**
 	 * 短信发送访问url
 	 */
-	@Value("${message.send.url}")
-	private String messageSendUrl;
+	@Value("${messageUrl}")
+	private String messageUrl;
 
 	//TODO 按需要修改
 	/**
-	 * 邮件模板id:邀请客户注册优软模板id
+	 * 邮件模板id:获奖通知邮件模版id
 	 *
 	 * @return
 	 */
-	@Value("${message.tplInvitationForB2B}")
-	private String tplInvitationForB2B;
+	@Value("${mailGotPrize}")
+	private String mailGotPrize;
 
 	/**
-	 * 短信模板id:邀请客户注册优软模板id
+	 * 短信模板id:中奖通知短信模版id
 	 */
-	@Value("${message.msgInvitationForB2B}")
-	private String msgInvitationForB2B;
-
-//	/**
-//	 * 邮件模板id: 平台添加人员后通知相关人员模板id
-//	 */
-//	@Value("${message.tplAfterBeAddedtoB2B}")
-//	private String tplAfterBeAddedtoB2B;
-//
-//	/**
-//	 * 短信模板id:发布招标单短信通知模版id
-//	 */
-//	@Value("${message.msgTenderForB2B}")
-//	private String msgTenderForB2B;
-
-    public String getMessageSendUrl() {
-        return messageSendUrl;
-    }
-
-    public String getTplInvitationForB2B() {
-        return tplInvitationForB2B;
-    }
-
-    public String getMsgInvitationForB2B() {
-        return msgInvitationForB2B;
-    }
-
-//    public String getTplAfterBeAddedtoB2B() {
-//        return tplAfterBeAddedtoB2B;
-//    }
-//
-//    public String getMsgTenderForB2B() {
-//        return msgTenderForB2B;
-//    }
+	@Value("${messageGotPrize}")
+	private String messageGotPrize;
+
+
+	public String getMessageUrl() {
+		return messageUrl;
+	}
+
+	public String getMailGotPrize() {
+		return mailGotPrize;
+	}
+
+	public String getMessageGotPrize() {
+		return messageGotPrize;
+	}
 }

+ 3 - 3
donate-service/src/main/java/com/uas/service/donate/controller/ActivityController.java

@@ -97,13 +97,13 @@ public class ActivityController {
 
     /**
      * 获取当前登录用户参加活动资格
-     * @param id
+     * @param id 活动id
      * @return 0无资格  1有已参加
      */
     @ResponseBody
-    @RequestMapping(value = "/record/{id}",method = RequestMethod.GET)
+    @RequestMapping(value = "/record/{id}", method = RequestMethod.GET)
     public ModelMap getActivityRecord(@PathVariable("id") Long id) {
-        return new ModelMap ("record", activityService.getActivityRecord(id));
+        return new ModelMap("record", activityService.getActivityRecord(id));
     }
 
     /**

+ 52 - 0
donate-service/src/main/java/com/uas/service/donate/controller/BaseController.java

@@ -0,0 +1,52 @@
+package com.uas.service.donate.controller;
+
+import com.uas.dfs.service.FileClient;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Controller;
+import org.springframework.ui.ModelMap;
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.RequestMethod;
+import org.springframework.web.bind.annotation.ResponseBody;
+import org.springframework.web.multipart.MultipartFile;
+
+import java.io.IOException;
+import java.util.Date;
+
+/**
+ * 部分基本接口
+ * @author dongbw
+ * 2017年12月29日 10:42:52
+ */
+@Controller
+@RequestMapping("/base")
+public class BaseController {
+
+    /**
+     * 文件服务器
+     */
+    @Autowired
+    private FileClient fileClient;
+
+    /**
+     * 上传图片
+     * @param file 上传的文件
+     * @return 文件保存路径
+     * @throws IOException 异常
+     */
+    @ResponseBody
+    @RequestMapping(value = "/upload", method = RequestMethod.POST)
+    public String ueditorUpload(MultipartFile file) throws IOException {
+        //上传图片
+        return  fileClient.upload(file.getBytes(), file.getSize(), "jpg", null);
+    }
+
+    /**
+     * 获取当前服务器时间
+     * @return 服务器当前时间
+     */
+    @ResponseBody
+    @RequestMapping(value = "/getServeTime", method = RequestMethod.GET)
+    public ModelMap getServeTime() {
+        return new ModelMap("serveTime", new Date());
+    }
+}

+ 13 - 5
donate-service/src/main/java/com/uas/service/donate/controller/MessageSendController.java

@@ -23,16 +23,24 @@ public class MessageSendController {
     private MessageService messageService;
 
     /**
-     * 发送邮件接口
+     * 发送邮件
+     * @param receivedMail 接收邮箱地址
+     * @param model 内容实体
+     * @param tplId 邮件模版id
+     * @return
      */
-    public ResponseEntity<String> sendMail(String receivedMail, Map<String, Object> model) {
-        return messageService.sendMail(receivedMail, model);
+    public ResponseEntity<String> sendMail(String receivedMail, Map<String, Object> model, String tplId) {
+        return messageService.sendMail(receivedMail, model, tplId);
     }
 
     /**
      * 发送短信接口
+     * @param receiverTel 接收号码
+     * @param obj 接受内容
+     * @param msgId 短信模版id
+     * @return
      */
-    public ResponseEntity<String> sendMessage(String receiverTel, List<Object> obj) {
-        return messageService.sendMessage(receiverTel, obj);
+    public ResponseEntity<String> sendMessage(String receiverTel, List<Object> obj, String msgId) {
+        return messageService.sendMessage(receiverTel, obj, msgId);
     }
 }

+ 2 - 2
donate-service/src/main/java/com/uas/service/donate/dao/ProjectRecodeDao.java

@@ -17,11 +17,11 @@ public interface ProjectRecodeDao extends JpaRepository<ProjectRecode,Long>,JpaS
     List<ProjectRecode> findByuuid(@Param("uuid") Long uuid);
 
     //计算某人参与项目的次数
-    @Query("select count(*) from ProjectRecode where uuid=:uuid and status=2")
+    @Query("select count(*) from ProjectRecode where uuid=:uuid and status = 2")
     Long sumJoin(@Param("uuid")Long uuid);
 
     //计算某人捐赠的总善款
-    @Query("select sum(amount) from ProjectRecode where uuid=:uuid and status=2")
+    @Query("select sum(amount) from ProjectRecode where uuid=:uuid and status = 2")
     Double sumMoney(@Param("uuid")Long uuid);
 
     //查询所有项目已筹集金额

+ 27 - 13
donate-service/src/main/java/com/uas/service/donate/model/ActivityRecode.java

@@ -5,73 +5,73 @@ import javax.persistence.*;
 import java.util.Date;
 
 @Entity
-@Table(name="donate$activityrecode")
+@Table(name = "donate$activityrecode")
 public class ActivityRecode {
 
     @Id
     @GeneratedValue(strategy= GenerationType.IDENTITY)
-    @Column(name="ar_id")
+    @Column(name = "ar_id")
     private  Long id;
 
     /**
      * 活动id
      */
-    @Column(name="ar_act_id")
+    @Column(name = "ar_act_id")
     private Long activityId;
 
     /**
      * 优软云账号
      */
-    @Column(name="ar_uuid")
+    @Column(name = "ar_uuid")
     private Long uuid;
 
     /**
      * 用户信息
      */
     @OneToOne(cascade = { CascadeType.REFRESH })
-    @JoinColumn(name="ar_uuid", insertable = false, updatable = false)
+    @JoinColumn(name= "ar_uuid", insertable = false, updatable = false)
     private User user;
 
     /**
      * 获奖的奖品id
      */
-    @Column(name="ar_aw_id")
+    @Column(name = "ar_aw_id")
     private Long awardId;
 
     /**
      * 奖品信息
      */
-    @OneToOne(cascade = { CascadeType.REFRESH, CascadeType.MERGE })
+    @OneToOne(cascade = CascadeType.REFRESH)
     @JoinColumn(name = "ar_aw_id", insertable = false, updatable = false)
     private Award award;
 
     /**
-     * 领取状态   0:初始状态 1:未领取 2:已领取 3:奖品失效
+     * 领取状态   0:初始状态 1:未领取 2:已领取 3:已完成
      */
-    @Column(name="ar_aw_status")
+    @Column(name = "ar_aw_status")
     private Integer status;
 
     /**
      * 用户领奖时间
      */
-    @Column(name="ar_receive_time")
+    @Column(name = "ar_receive_time")
     private Date receiveTime;
 
     /**
      * 参加活动时间
      */
-    @Column(name="ar_joined_time")
+    @Column(name = "ar_joined_time")
     private Date joinedTime;
 
     /**
      * 活动参与记录关联参与的活动
      */
     @ManyToOne(cascade = CascadeType.REFRESH)
-    @JoinColumn(name="ar_act_id", insertable = false, updatable = false)
+    @JoinColumn(name = "ar_act_id", insertable = false, updatable = false)
     private Activity activity;
 
     /**
-     * 是否获奖,1代表已获奖, 0表示未获奖
+     * 是否获奖,1代表已获奖, 0 或 空 表示未获奖
      * @return
      */
     @Column(name = "ar_getaward")
@@ -107,6 +107,12 @@ public class ActivityRecode {
     @Column(name = "ar_tel")
     private String tel;
 
+    /**
+     * 领奖兑换码(用于短信通知领奖验证)
+     */
+    @Column(name = "ar_redeemcode")
+    private String redeemCode;
+
     public Long getId() {
         return id;
     }
@@ -234,4 +240,12 @@ public class ActivityRecode {
     public void setJoinedTime(Date joinedTime) {
         this.joinedTime = joinedTime;
     }
+
+    public String getRedeemCode() {
+        return redeemCode;
+    }
+
+    public void setRedeemCode(String redeemCode) {
+        this.redeemCode = redeemCode;
+    }
 }

+ 3 - 3
donate-service/src/main/java/com/uas/service/donate/model/Message.java

@@ -205,12 +205,12 @@ public class Message implements Serializable {
 
     @JsonIgnore
     @JSONField(serialize = false)
-    public Set<MessageDetail> getNoticeDetails() {
+    public Set<MessageDetail> getMessageDetails() {
         return messageDetails;
     }
 
-    public void setNoticeDetails(Set<MessageDetail> noticeDetails) {
-        this.messageDetails = noticeDetails;
+    public void setMessageDetails(Set<MessageDetail> messageDetails) {
+        this.messageDetails = messageDetails;
     }
 
     public String getReceiver() {

+ 4 - 4
donate-service/src/main/java/com/uas/service/donate/model/MessageDetail.java

@@ -34,7 +34,7 @@ public class MessageDetail implements Serializable{
     /**
      * 关联接收人
      */
-    @OneToOne
+    @OneToOne(cascade = CascadeType.REFRESH)
     @JoinColumn(name = "dmd_receiveuseruu", insertable = false, updatable = false)
     private User receiveUser;
 
@@ -139,11 +139,11 @@ public class MessageDetail implements Serializable{
         this.totalStatus = totalStatus;
     }
 
-    public Message getNotice() {
+    public Message getMessage() {
         return message;
     }
 
-    public void setNotice(Message notice) {
-        this.message = notice;
+    public void setMessage(Message message) {
+        this.message = message;
     }
 }

+ 18 - 3
donate-service/src/main/java/com/uas/service/donate/service/MessageService.java

@@ -4,14 +4,29 @@ import org.springframework.http.ResponseEntity;
 import java.util.List;
 import java.util.Map;
 
-/*
+/**
+ * 发送通知接口
  * Created by dongbw
  * 17/09/27 16:25.
  **/
 
 public interface MessageService {
 
-    ResponseEntity<String> sendMail(String receivedEmail, Map<String, Object> model);
+    /**
+     * 发送邮件
+     * @param receivedEmail 接收邮箱
+     * @param model 发送实体
+     * @param tplId 模版id
+     * @return response
+     */
+    ResponseEntity<String> sendMail(String receivedEmail, Map<String, Object> model, String tplId);
 
-    ResponseEntity<String> sendMessage(String receiverTel, List<Object> obj);
+    /**
+     * 发送短信
+     * @param receiverTel 接收号码
+     * @param obj 发送内容
+     * @param msgId 短信模版id
+     * @return response
+     */
+    ResponseEntity<String> sendMessage(String receiverTel, List<Object> obj, String msgId);
 }

+ 17 - 4
donate-service/src/main/java/com/uas/service/donate/service/impl/ActivityServiceImpl.java

@@ -17,6 +17,7 @@ import org.springframework.ui.ModelMap;
 import java.util.ArrayList;
 import java.util.Date;
 import java.util.List;
+import java.util.Objects;
 
 @Service
 public class ActivityServiceImpl implements ActivityService {
@@ -30,6 +31,11 @@ public class ActivityServiceImpl implements ActivityService {
     @Autowired
     private ActivityRecodeDao activityRecodeDao;
 
+    /**
+     * 已领奖
+     */
+    static final Integer HAS_GOT_AWARD = 2;
+
     //搜索出所有进行中和已结束的活动
     public List<Activity> findAll(){
         //取得所有已开始和已结束的活动
@@ -96,11 +102,12 @@ public class ActivityServiceImpl implements ActivityService {
     public ModelMap takeAward(ActivityRecode record) {
         ModelMap map = new ModelMap();
         Long userUU = SystemSession.getUser().getUserUU();
-        if (userUU != record.getUuid()) {
+        ActivityRecode oldRecord = activityRecodeDao.findOne(record.getId());
+        if (!Objects.equals(userUU, record.getUuid())) {
             map.put("error", "当前登陆用户与领奖人不符!");
             return map;
         }
-        if (2 != record.getIsGetAward()) {
+        if (1 != record.getIsGetAward()) {
             map.put("error", "没有领取奖品资格!");
             return map;
         }
@@ -108,11 +115,17 @@ public class ActivityServiceImpl implements ActivityService {
             map.put("error", "奖品已失效!");
             return map;
         }
-        //TODO 领奖功能
-        record.setStatus(2);
+        // 短信通知,但是兑换码不匹配时返回
+//        if (2 == record.getAward().getWay() && !record.getRedeemCode().equals(oldRecord.getRedeemCode())) {
+//            map.put("error", "兑换码不匹配!");
+//            return map;
+//        }
+        // 短信模版:恭喜您获得优软一元捐感恩回馈活动二等奖(南山天虹购物礼券100元),兑换码123456,请登陆一元捐网站,进入活动中心激活领取
+        record.setStatus(HAS_GOT_AWARD);
         record.setReceiveTime(new Date());
         activityRecodeDao.save(record);
         map.put("success", "领奖成功!");
+        //TODO 领奖成功短信及消息
         return map;
     }
 

+ 27 - 12
donate-service/src/main/java/com/uas/service/donate/service/impl/MessageServiceImpl.java

@@ -6,6 +6,7 @@ import com.uas.platform.core.util.serializer.FlexJsonUtils;
 import com.uas.service.donate.MessageConfiguration;
 import com.uas.service.donate.model.SmsMessage;
 import com.uas.service.donate.service.MessageService;
+import com.uas.service.donate.util.StringUtils;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.http.HttpStatus;
 import org.springframework.http.ResponseEntity;
@@ -27,16 +28,23 @@ public class MessageServiceImpl implements MessageService {
     @Autowired
     private MessageConfiguration messageConfiguration;
 
+    /**
+     * 发送邮件
+     * @param receivedEmail 接收邮箱
+     * @param model 发送实体
+     * @param tplId 模版id
+     * @return response
+     */
     @Override
-    public ResponseEntity<String> sendMail(String receivedEmail, Map<String, Object> model) {
+    public ResponseEntity<String> sendMail(String receivedEmail, Map<String, Object> model, String tplId) {
         try {
-            if (null != messageConfiguration.getTplInvitationForB2B()) {
-                model.put("vendorusername", "");
-                model.put("vendorname", "");
-                model.put("custname", "");
-                model.put("inviteuid", "");
-                model.put("inviteUserCode", "");
-                mailService.send(messageConfiguration.getTplInvitationForB2B(), receivedEmail, model);
+            if (!StringUtils.isEmpty(tplId)) {
+//                model.put("vendorusername", "");
+//                model.put("vendorname", "");
+//                model.put("custname", "");
+//                model.put("inviteuid", "");
+//                model.put("inviteUserCode", "");
+                mailService.send(tplId, receivedEmail, model);
             }
             return new ResponseEntity<String>(HttpStatus.OK);
         } catch (Exception e) {
@@ -45,10 +53,17 @@ public class MessageServiceImpl implements MessageService {
         }
     }
 
+    /**
+     * 发送短信
+     * @param receiverTel 接收号码
+     * @param obj 发送内容
+     * @param msgId 短信模版id
+     * @return response
+     */
     @Override
-    public ResponseEntity<String> sendMessage(String receiverTel, List<Object> obj) {
+    public ResponseEntity<String> sendMessage(String receiverTel, List<Object> obj, String msgId) {
         try {
-            if (null != messageConfiguration.getMsgInvitationForB2B()) {
+            if (!StringUtils.isEmpty(msgId)) {
                 SmsMessage sms = new SmsMessage();
 //            obj.add(record.getVendusername());
 //            obj.add(record.getVendname());
@@ -56,8 +71,8 @@ public class MessageServiceImpl implements MessageService {
 //                    + SystemSession.getUser().getEnterprise().getEnName() + ")");
                 sms.setParams(obj);
                 sms.setReceiver(receiverTel);
-                sms.setTemplateId(messageConfiguration.getMsgInvitationForB2B());
-                HttpUtil.sendPost(messageConfiguration.getMessageSendUrl(), FlexJsonUtils.toJsonDeep(sms));
+                sms.setTemplateId(msgId);
+                HttpUtil.sendPost(messageConfiguration.getMessageUrl(), FlexJsonUtils.toJsonDeep(sms));
             }
             return new ResponseEntity<String>(HttpStatus.OK);
         } catch (Exception e) {

+ 7 - 0
donate-service/src/main/resources/config/application-dev.properties

@@ -56,3 +56,10 @@ spring.freemarker.template-loader-path=classpath:/templates
 #É趨¾²Ì¬Îļþ·¾¶£¬js,cssµÈ
 spring.mvc.static-path-pattern=/static/*
 spring.freemarker.cache=false
+
+# mailConfig
+mailGotPrize=
+
+## messageConfig
+messageGotPrize=
+messageUrl=http://message.ubtob.com/sms/send

+ 9 - 2
donate-service/src/main/resources/config/application-prod.properties

@@ -48,11 +48,18 @@ spring.jpa.hibernate.dialect=org.hibernate.dialect.5DiGlect
 spring.jackson.serialization.indent_output=false  
 
 zk.url=zookeeper://10.10.100.11:2181
-dubbo.owner=dev
-dubbo.group=dev
+dubbo.owner=prod
+dubbo.group=prod
 
 #设定ftl文件路径
 spring.freemarker.template-loader-path=classpath:/templates
 #设定静态文件路径,js,css等
 spring.mvc.static-path-pattern=/static/*
 spring.freemarker.cache=false
+
+# mailConfig
+mailGotPrize=
+
+## messageConfig
+messageGotPrize=
+messageUrl=http://message.ubtob.com/sms/send

+ 8 - 1
donate-service/src/main/resources/config/application-test.properties

@@ -41,4 +41,11 @@ sso.login.url=https://account.ubtob.com/sso/login
 ## dubbo cofig
 zk.url=zookeeper://10.10.100.11:2181
 dubbo.owner=dev
-dubbo.group=dev
+dubbo.group=dev
+
+# mailConfig
+mailGotPrize=
+
+## messageConfig
+messageGotPrize=
+messageUrl=http://message.ubtob.com/sms/send

+ 10 - 2
donate-service/src/main/webapp/resources/js/activity/app.js

@@ -2,9 +2,9 @@
  * activity
  *
  */
-define([ 'angularAMD', 'ngRoute', 'ui.router', 'ui-bootstrap', 'ngLocal', 'ngTable', 'common/services', 'angular-toaster', 'ngSanitize', 'common/query/Activity'], function(angularAMD) {
+define([ 'angularAMD', 'ngRoute', 'ui.router', 'ui-bootstrap', 'ngLocal', 'ngTable', 'common/services', 'angular-toaster', 'ngSanitize', 'common/query/Activity', 'common/query/Public'], function(angularAMD) {
 	'use strict';
-	var app = angular.module('myApp', [ 'ngRoute', 'ui.router', 'ui.bootstrap', 'ng.local', 'ngTable', 'common.services', 'toaster', 'ngSanitize', 'ActivityService']);
+	var app = angular.module('myApp', [ 'ngRoute', 'ui.router', 'ui.bootstrap', 'ng.local', 'ngTable', 'common.services', 'toaster', 'ngSanitize', 'ActivityService', 'PublicService']);
 	app.init = function() {
 		angularAMD.bootstrap(app);
 	};
@@ -46,5 +46,13 @@ define([ 'angularAMD', 'ngRoute', 'ui.router', 'ui-bootstrap', 'ngLocal', 'ngTab
 
 	}]);
 
+
+    app.controller('AwardOverCtrl', ['$scope', '$modalInstance', function($scope, $modalInstance) {
+
+        $scope.cancel = function() {
+            $modalInstance.dismiss();
+        }
+    }]);
+
 	return app;
 });

+ 32 - 18
donate-service/src/main/webapp/resources/js/activity/controllers/ActivityDetailCtrl.js

@@ -1,19 +1,44 @@
 define([ 'app/app' ], function(app) {
     'use strict';
-    app.register.controller('ActivityDetailCtrl', ['$scope', '$rootScope', 'Activity', '$stateParams', '$http', 'toaster', 'BaseService',
-        function ($scope, $rootScope, Activity, $stateParams, $http, toaster, BaseService) {
+    app.register.controller('ActivityDetailCtrl', ['$scope', '$rootScope', 'Activity', '$stateParams', '$http', 'toaster', 'BaseService', 'AuthenticationService', 'Public', '$modal',
+        function ($scope, $rootScope, Activity, $stateParams, $http, toaster, BaseService, AuthenticationService, Public, $modal) {
         $rootScope.page = 'activity';
         BaseService.scrollBackToTop();
+        $scope.loading = true;
         var init = function () {
             var id = $stateParams.id;
 
+            // 获取已登录的用户信息
+            AuthenticationService.getAuthentication().success(function(data) {
+                if(data && data.content) {
+                    $scope.user = data.content;
+                    // 登录用户验证活动资格
+                    Activity.getActivityRecord({id: id}, {}, function(data) {
+                        if (data && data.record) {
+                            $scope.activityRecord = data.record;
+                        }
+                        $scope.inActivity = data !== null && !angular.isUndefined(data.record);
+                    });
+                }
+                $scope.isAuthed = data !== null && !angular.isUndefined(data.content);
+            });
+            // 获取服务器当前时间
+            Public.getServeTime({}, {}, function(data) {
+                if (data && data.serveTime) {
+                    $scope.serveTime = data.serveTime;
+                }
+            });
+
             // 获取活动详情
             Activity.getDetailById({id: id}, {}, function(data) {
                 $scope.activity = data;
+                $scope.loading = false;
             }, function (error) {
                 console.log(error);
             });
 
+            // 验证当前用户状态
+
             // 获取活动关联的项目
             Activity.getRelatedProjects({id: id}, {}, function(data) {
                 $scope.projects = data;
@@ -23,21 +48,6 @@ define([ 'app/app' ], function(app) {
         };
         init();
 
-        // 验证领奖
-        $scope.verifyAward = function() {
-            Activity.getActivityRecord({id: $stateParams.id}, {}, function(data) {
-                if (!data.record) {
-                    $scope.modalStatus = 'fail';
-                } else {
-                    $scope.activityRecord = data.record;
-                    // 未领取
-                    if (data.record.status === 1) {
-                        $scope.modalStatus = 'layer';
-                    }
-                }
-            });
-        };
-
         // 获取地址信息
         $http.get('static/citydata/city.json', {
             "Accept": "application/json;charset=utf-8", "Accept-Charset": "charset=utf-8"
@@ -49,7 +59,11 @@ define([ 'app/app' ], function(app) {
         $scope.takeAward = function(record) {
             Activity.takeAward({}, record, function(data) {
                 if (data.success) {
-                    $scope.awardStatus = 'success';
+                    $modal.open({
+                        templateUrl: 'static/view/activity/award_over.html',
+                        controller: 'AwardOverCtrl',
+                        size: 'sm'
+                    });
                 }
                 if (data.error) {
                     toaster.pop("error", data.error);

+ 12 - 0
donate-service/src/main/webapp/resources/js/common/query/Public.js

@@ -0,0 +1,12 @@
+define ([ 'ngResource' ], function() {
+    angular.module('PublicService', ['ngResource'])
+        .factory('Public', ['$resource', function ($resource) {
+            return $resource ('base', {}, {
+                // 获取系统时间
+                getServeTime: {
+                    url: 'base/getServeTime',
+                    method: 'GET'
+                }
+            });
+        }]);
+});

+ 14 - 0
donate-service/src/main/webapp/resources/js/user/controllers/UserCtrl.js

@@ -95,5 +95,19 @@ define([ 'app/app' ], function(app) {
             });
         };
         loadData();
+
+        /**
+         * 查看详情
+         */
+        $scope.showDetail = function(label, id) {
+            switch (label) {
+                case 'project':
+                    window.location.href = '/project#/detail/' + id;
+                    break;
+                case 'activity':
+                    window.location.href = '/activity#/detail/' + id;
+                    break;
+            }
+        }
     }]);
 });

+ 71 - 186
donate-service/src/main/webapp/resources/view/activity/activity_detail.html

@@ -262,6 +262,7 @@
         /*display: none;*/
         width: 800px;
         height: 120px;
+        line-height: 120px;
         background: #fff9eb;
         text-align: center;
     }
@@ -290,6 +291,22 @@
         background: #be3b1b;
     }
 
+    /* 区域提示信息 */
+    .section2 .intro .prize .tip{
+        display: inline-block;
+        width: 180px;
+        height: 42px;
+        line-height: 42px;
+        font-size: 18px;
+        color: #fff;
+        letter-spacing: 10px;
+        background: #a0a0a0;
+    }
+
+    .section2 .intro .prize .hasGet{
+        background: #ce8152!important;
+    }
+
     /*领奖弹出窗*/
     .pop{
         margin: 0 auto;
@@ -423,153 +440,10 @@
         width: 480px;
         height: 400px;
     }
-    /*领奖成功系统提示*/
-    .modal-open .success {
-        width: 100%;
-        height: 100%;
-    }
-    .modal-open .success .modal-dialog{
-        width: 480px;
-        height: 300px;
-    }
-    .modal-open .success .modal-dialog .modal-content{
-        margin: 0 auto;
-        width: 480px;
-        height: 300px;
-        text-align: center;
-    }
-    .success .header{
-        padding: 0 20px;
-        width: 100%;
-        height: 44px;
-        line-height: 44px;
-        background: #eeeeee;
-    }
-    .success .header p{
-        font-size: 16px;
-        color: #313131;
-        font-weight: bold;
-    }
-    .success .header p span{
-        font-size: 16px;
-        color: #ef613b;
-    }
-    .success .header .close{
-        font-size: 38px;
-    }
-    .success .body{
-        margin: 0 auto;
-        text-align: center;
-    }
-    .success .body p{
-        margin: 35px 0 40px 0;
-        font-size: 30px;
-        color: #01a81c;
-    }
-    .success .body span{
-        display: inline-block;
-        margin-bottom: 45px;
-        font-size: 14px;
-        color: #4f4f4f;
-    }
-    .success .body .closeBtn{
-        position: relative;
-        height: 34px;
-        line-height: 34px;
-    }
-    .success .body .closeBtn a:first-child {
-        display: inline-block;
-        width: 110px;
-        height: 34px;
-        line-height: 34px;
-        font-size: 16px;
-        color: #4a4a4a;
-        text-align: center;
-        border: 1px solid #dcdcdc;
-    }
-    .success .body .closeBtn a:last-child {
-        position: absolute;
-        top: 0;
-        right: 95px;
-        font-size: 14px;
-        color: #0054bc;
-    }
-    /*未中奖系统提示*/
-    .modal-open .fail {
-        width: 100%;
-        height: 100%;
-    }
-    .modal-open .fail .modal-dialog{
-        width: 480px;
-        height: 220px;
-    }
-    .modal-open .fail .modal-dialog .modal-content{
-        margin: 0 auto;
-        width: 480px;
-        height: 220px;
-        text-align: center;
-    }
-    .fail .header{
-        padding: 0 20px;
-        width: 100%;
-        height: 44px;
-        line-height: 44px;
-        background: #eeeeee;
-    }
-    .fail .header p{
-        font-size: 16px;
-        color: #313131;
-        font-weight: bold;
-    }
-    .fail .header p span{
-        font-size: 16px;
-        color: #ef613b;
-    }
-    .fail .header .close{
-        font-size: 38px;
-    }
-    .fail .body{
-        margin: 0 auto;
-        text-align: center;
-    }
-    .fail .body p{
-        margin: 15px 0;
-        font-size: 18px;
-        color: #01a81c;
-    }
-    .fail .body span{
-        display: inline-block;
-        margin-bottom: 28px;
-        font-size: 14px;
-        color: #4f4f4f;
-    }
-    .fail .body .closeBtn{
-        position: relative;
-        height: 34px;
-        line-height: 34px;
-    }
-    .fail .body .closeBtn a:first-child {
-        display: inline-block;
-        width: 110px;
-        height: 34px;
-        line-height: 34px;
-        font-size: 16px;
-        color: #fff;
-        background: #ff7625;
-        text-align: center;
-    }
-    .fail .body .closeBtn a:first-child:hover{
-        background: #be3b1b;
-    }
-    .fail .body .closeBtn a:last-child {
-        position: absolute;
-        top: 0;
-        right: 95px;
-        margin-left: 15px;
-        font-size: 14px;
-        color: #0054bc;
-    }
 </style>
+<!-- loading start -->
+<div class="loading in" ng-class="{'in': loading}"><i></i></div>
+<!-- loading end -->
 <div class="main">
     <div class="container">
         <div class="section section1">
@@ -578,7 +452,7 @@
                 <span>&gt;</span>
                 <span ng-bind="activity.name ? activity.name : '优软一元捐感恩活动'"></span>
             </div>
-            <div class="img"><img src="{{activity.banner}}" alt="{{activity.name}}" title="activity.name"></div>
+            <div class="img"><img src="{{activity.banner}}" alt="{{activity.name}}" title="{{activity.name}}"></div>
         </div>
         <div class="section section2">
             <div class="fl intro">
@@ -588,14 +462,51 @@
                     </div>
                 </div>
                 <!--领奖页面-->
-                <div class="prize">
+                <!-- 1.未登录 -->
+                <div class="prize" ng-if="!isAuthed">
+                    <span class="tip" title="请登录查看活动资格">未登录</span>
+                </div>
+                <!-- 2.已登录,未参加活动 -->
+                <div class="prize" ng-if="isAuthed && !inActivity">
+                    <span class="tip" title="参加活动捐款且捐款超过一元即可参与活动">暂未参加活动</span>
+                </div>
+                <!-- 3.已登录,已参加活动 -->
+                <!-- 3.1 活动未到开始兑奖时间 -->
+                <div class="prize" ng-if="isAuthed && inActivity && serveTime < activity.receiveStartTime">
+                    <span class="tip" title="已参与活动,等待开奖">待开奖</span>
+                </div>
+                <!-- 3.2 活动在开始兑奖奖时间到结束兑奖时间之间 -->
+                <!-- 3.2.1.1 活动在开始兑奖奖时间到结束兑奖时间之间,中奖 -->
+                <!-- 3.2.1.1 活动在开始兑奖奖时间到结束兑奖时间之间,中奖 -未领取 -->
+                <div class="prize" ng-if="isAuthed && inActivity &&  serveTime > activity.receiveStartTime
+                && serveTime < activity.receiveEndTime && activityRecord.isGetAward == 1 && activityRecord.status == 1">
                     <p>兑奖日期
                         <span ng-bind="activity.receiveStartTime | date:'yyyy-MM-dd'"></span>至
                         <span ng-bind="activity.receiveEndTime | date:'yyyy-MM-dd'"></span>
                     </p>
-                    <!-- 处于待兑奖状态才显示领奖 -->
-                    <!--<a ng-if="activity.stage == 2" data-toggle="modal" data-target="#{{modalStatus}}" ng-click="verifyAward()">领奖</a>-->
-                    <a data-toggle="modal" data-target="#{{modalStatus}}" ng-click="verifyAward()">领奖</a>
+                    <a data-toggle="modal" data-target="#layer">领奖</a>
+                </div>
+                <!-- 3.2.1.2 活动在开始兑奖奖时间到结束兑奖时间之间,中奖 -已领取 -->
+                <div class="prize" ng-if="isAuthed && inActivity &&  serveTime > activity.receiveStartTime
+                && serveTime < activity.receiveEndTime && activityRecord.isGetAward == 1 && activityRecord.status == 2">
+                    <p>兑奖日期
+                        <span ng-bind="activity.receiveStartTime | date:'yyyy-MM-dd'"></span>至
+                        <span ng-bind="activity.receiveEndTime | date:'yyyy-MM-dd'"></span>
+                    </p>
+                    <span class="tip hasGet" title="奖品已领取">已领奖</span>
+                </div>
+                <!-- 3.2.2 活动在开始兑奖奖时间到结束兑奖时间之间,未中奖 -->
+                <div class="prize" ng-if="isAuthed && inActivity && serveTime > activity.receiveStartTime
+                && serveTime < activity.receiveEndTime && activityRecord.isGetAward != 1">
+                    <span class="tip" title="您未中奖,请期待下次活动">未中奖</span>
+                </div>
+                <!-- 3.3 活动在结束兑奖时间到结束时间之间 -->
+                <div class="prize" ng-if="isAuthed && inActivity && serveTime > activity.receiveEndTime && serveTime < activity.endTime">
+                    <span class="tip" title="领奖已结束,请期待下次活动">领奖已结束</span>
+                </div>
+                <!-- 3.3 活动在结束时间之后 -->
+                <div class="prize" ng-if="isAuthed && inActivity && serveTime > activity.endTime">
+                    <span class="tip" title="活动已结束,请期待下次活动">活动已结束</span>
                 </div>
                 <div class="intro-item">
                     <h3>奖品介绍</h3>
@@ -656,7 +567,7 @@
     <div class="modal-dialog">
         <div class="modal-content">
             <div class="header modal-header clearfix">
-                <p class="fl">恭喜你,获得本次活动
+                <p class="fl">恭喜你,获得本次活动奖品
                     <span ng-bind="activityRecord.award.awardLevel"></span>
                 </p>
                 <div class="close fr" data-dismiss="modal">&times;</div>
@@ -686,7 +597,13 @@
                     <span class="fl best">联系电话:</span>
                     <input type="text" ng-model="activityRecord.tel" class="fl form-control" required>
                 </div>
-                <div class="choose clearfix">
+                <!-- TODO 短信通知时,填写兑换码 -->
+                <div class="choose clearfix" ng-if="activityRecord.award.way == 2">
+                    <span class="fl best">兑换码:</span>
+                    <input type="text" ng-model="activityRecord.redeemCode" class="fl form-control" required>
+                </div>
+                <!-- 快递配送时,才填写地址 -->
+                <div class="choose clearfix" ng-if="activityRecord.award.way == 1">
                     <span class="fl best">接收地址:</span>
                     <div class="select fr">
                         <select required="" class="area-select" ng-model="activityRecord.province"
@@ -708,40 +625,8 @@
                     <input type="text" placeholder="请填写详细地址" ng-model="activityRecord.address" required class="form-control" style="margin-top: 50px;margin-left: 85px;">
                     <div class="tip">请填写联系电话和收货地址,便于奖品的发放。</div>
                 </div>
-                <button data-toggle="modal" data-target="#{{awardStatus}}" ng-click="takeAward(activityRecord)">确认领奖</button>
-            </div>
-        </div>
-    </div>
-</div>
-<!--领奖成功系统提示-->
-<div class="success modal" id="success" role="dialog">
-    <div class="modal-dialog">
-        <div class="modal-content">
-            <div class="header modal-header clearfix">
-                <p class="fl">系统提示</p>
-                <div class="close fr" data-dismiss="modal">&times;</div>
-            </div>
-            <div class="body modal-body">
-                <p>领奖成功!</p>
-                <span>感谢您一直以来对本平台和公益事业的关注和支持。</span>
-                <div class="closeBtn"><a href="" data-dismiss="modal">关闭</a><a href="/userCenter">个人中心</a></div>
+                <button data-toggle="modal" data-target="#success" ng-click="takeAward(activityRecord)">确认领奖</button>
             </div>
         </div>
     </div>
 </div>
-<!--未中奖系统提示-->
-<div class="fail modal" id="fail" role="dialog">
-    <div class="modal-dialog">
-        <div class="modal-content">
-            <div class="header modal-header clearfix">
-                <p class="fl">系统提示</p>
-                <div class="close fr" data-dismiss="modal">&times;</div>
-            </div>
-            <div class="body modal-body">
-                <p>很遗憾,您不满足领奖条件!</p>
-                <span>感谢您一直以来对本平台和公益事业的关注和支持。</span>
-                <div class="closeBtn"><a href="/activeCenter">其他活动</a><a href="/index">返回首页</a></div>
-            </div>
-        </div>
-    </div>
-</div>

+ 177 - 0
donate-service/src/main/webapp/resources/view/activity/award_over.html

@@ -0,0 +1,177 @@
+<!--领奖成功系统提示-->
+<style>
+    /*领奖成功系统提示*/
+    .modal-open .success {
+        width: 100%;
+        height: 100%;
+    }
+    .modal-open .success .modal-dialog{
+        width: 480px;
+        height: 300px;
+    }
+    .modal-open .success .modal-dialog .modal-content{
+        margin: 0 auto;
+        width: 480px;
+        height: 300px;
+        text-align: center;
+    }
+    .success .header{
+        padding: 0 20px;
+        width: 100%;
+        height: 44px;
+        line-height: 44px;
+        background: #eeeeee;
+    }
+    .success .header p{
+        font-size: 16px;
+        color: #313131;
+        font-weight: bold;
+    }
+    .success .header p span{
+        font-size: 16px;
+        color: #ef613b;
+    }
+    .success .header .close{
+        font-size: 38px;
+    }
+    .success .body{
+        margin: 0 auto;
+        text-align: center;
+    }
+    .success .body p{
+        margin: 35px 0 40px 0;
+        font-size: 30px;
+        color: #01a81c;
+    }
+    .success .body span{
+        display: inline-block;
+        margin-bottom: 45px;
+        font-size: 14px;
+        color: #4f4f4f;
+    }
+    .success .body .closeBtn{
+        position: relative;
+        height: 34px;
+        line-height: 34px;
+    }
+    .success .body .closeBtn a:first-child {
+        display: inline-block;
+        width: 110px;
+        height: 34px;
+        line-height: 34px;
+        font-size: 16px;
+        color: #4a4a4a;
+        text-align: center;
+        border: 1px solid #dcdcdc;
+    }
+    .success .body .closeBtn a:last-child {
+        position: absolute;
+        top: 0;
+        right: 95px;
+        font-size: 14px;
+        color: #0054bc;
+    }
+
+    /*未中奖系统提示*/
+    .modal-open .fail {
+        width: 100%;
+        height: 100%;
+    }
+    .modal-open .fail .modal-dialog{
+        width: 480px;
+        height: 220px;
+    }
+    .modal-open .fail .modal-dialog .modal-content{
+        margin: 0 auto;
+        width: 480px;
+        height: 220px;
+        text-align: center;
+    }
+    .fail .header{
+        padding: 0 20px;
+        width: 100%;
+        height: 44px;
+        line-height: 44px;
+        background: #eeeeee;
+    }
+    .fail .header p{
+        font-size: 16px;
+        color: #313131;
+        font-weight: bold;
+    }
+    .fail .header p span{
+        font-size: 16px;
+        color: #ef613b;
+    }
+    .fail .header .close{
+        font-size: 38px;
+    }
+    .fail .body{
+        margin: 0 auto;
+        text-align: center;
+    }
+    .fail .body p{
+        margin: 15px 0;
+        font-size: 18px;
+        color: #01a81c;
+    }
+    .fail .body span{
+        display: inline-block;
+        margin-bottom: 28px;
+        font-size: 14px;
+        color: #4f4f4f;
+    }
+    .fail .body .closeBtn{
+        position: relative;
+        height: 34px;
+        line-height: 34px;
+    }
+    .fail .body .closeBtn a:first-child {
+        display: inline-block;
+        width: 110px;
+        height: 34px;
+        line-height: 34px;
+        font-size: 16px;
+        color: #fff;
+        background: #ff7625;
+        text-align: center;
+    }
+    .fail .body .closeBtn a:first-child:hover{
+        background: #be3b1b;
+    }
+    .fail .body .closeBtn a:last-child {
+        position: absolute;
+        top: 0;
+        right: 95px;
+        margin-left: 15px;
+        font-size: 14px;
+        color: #0054bc;
+    }
+</style>
+<div class="success">
+    <div class="header modal-header clearfix">
+        <p class="fl">系统提示</p>
+        <div class="close fr" ng-click="cancel()">&times;</div>
+    </div>
+    <div class="body modal-body">
+        <p>领奖成功!</p>
+        <span>感谢您一直以来对本平台和公益事业的关注和支持。</span>
+        <div class="closeBtn"><a ng-click="cancel()">关闭</a><a href="/userCenter#/project">个人中心</a></div>
+    </div>
+</div>
+<!--未中奖系统提示(目前在加载时判断)-->
+<!--<div class="fail modal" id="fail" role="dialog">-->
+    <!--<div class="modal-dialog">-->
+        <!--<div class="modal-content">-->
+            <!--<div class="header modal-header clearfix">-->
+                <!--<p class="fl">系统提示</p>-->
+                <!--<div class="close fr" data-dismiss="modal">&times;</div>-->
+            <!--</div>-->
+            <!--<div class="body modal-body">-->
+                <!--<p>很遗憾,您不满足领奖条件!</p>-->
+                <!--<span>感谢您一直以来对本平台和公益事业的关注和支持。</span>-->
+                <!--<div class="closeBtn"><a href="/activeCenter">其他活动</a><a href="/index">返回首页</a></div>-->
+            <!--</div>-->
+        <!--</div>-->
+    <!--</div>-->
+<!--</div>-->

+ 1 - 1
donate-service/src/main/webapp/resources/view/common/nav.html

@@ -22,7 +22,7 @@
             <a href="http://www.ubtob.com" target="_blank">进入优软云</a>
         </div>
         <div class="fr" ng-if="isAuthed">
-            <a href="/userCenter"><span ng-bind="userInfo.name"></span><i class="fa fa-user fa-lg"></i></a>
+            <a href="/userCenter#/project"><span ng-bind="userInfo.name"></span><i class="fa fa-user fa-lg"></i></a>
             <a ng-click="logout()">退出</a>
             <a href="http://www.ubtob.com" target="_blank">进入优软云</a>
         </div>

+ 10 - 5
donate-service/src/main/webapp/resources/view/user/user_center.html

@@ -768,6 +768,11 @@
     .show-form{
         display: none;
     }
+
+    /* 2017年12月29日 15:04:15  dongbw */
+    div.personalCenter.clearfix > div.project-management.fl > div.active-detail.ng-scope.show > table > tbody tr:HOVER{
+        background-color: #e0e2e3;
+    }
 </style>
 <div class="main">
     <div class="container">
@@ -843,11 +848,11 @@
                             </tr>
                             </tbody>
                             <tbody ng-repeat="projectRecord in $data">
-                            <tr>
+                            <tr ng-click="showDetail('project', projectRecord.project.id)" title="查看详情">
                                 <td>{{$index + 1}}</td>
                                 <td>
                                     <div class="project-title">
-                                        <h3><a href="/project#/detail/{{projectRecord.proId}}">{{projectRecord.project.name}}</a></h3>
+                                        <h3><a>{{projectRecord.project.name}}</a></h3>
                                         <div class="time">
                                             <span>捐款时间:</span><span ng-bind="projectRecord.donateDate | date:'yyyy-MM-dd'"></span>
                                         </div>
@@ -895,9 +900,9 @@
                             </tr>
                             </tbody>
                             <tbody ng-repeat="activityRecord in $data">
-                            <tr>
+                            <tr ng-click="showDetail('activity', activityRecord.activityId)" title="查看详情">
                                 <td>{{$index + 1}}</td>
-                                <td><a href="/activity#/detail/{{activityRecord.activityId}}">{{activityRecord.activity.name}}</a></td>
+                                <td><a>{{activityRecord.activity.name}}</a></td>
                                 <td>{{activityRecord.activity.luckyTime | date:'yyyy-MM-dd'}}</td>
                                 <td>
                                     <span ng-if="activityRecord.activity.stage != '兑奖中'">
@@ -941,7 +946,7 @@
                             <tr class="news-list">
                                 <td class="read">{{$index + 1}}<em ng-class="{'red':messageDetail.message.readStatus != 1}"></em></td>
                                 <td>{{messageDetail.message.title}}</td>
-                                <td class="third"><span ng-bind-html="messageDetail.message.context"></span></td>
+                                <td class="third"><span ng-bind="messageDetail.message.context"></span></td>
                             </tr>
                             <tr class="news-detail" style="display: none;">
                                 <td colspan="3">