Просмотр исходного кода

门禁进场短信功能开发完成

wuxw лет назад: 3
Родитель
Сommit
a24b724925

+ 24 - 0
java110-bean/src/main/java/com/java110/dto/marketRuleObj/MarketRuleObjDto.java

@@ -15,10 +15,18 @@ import java.util.Date;
  **/
 public class MarketRuleObjDto extends PageDto implements Serializable {
 
+    public static final String OBJ_TYPE_ACCESS_CONTROL = "1001";
+    public static final String OBJ_TYPE_BARRIER = "2002";
+    public static final String OBJ_TYPE_PAY_FINISH = "3003";
+    public static final String OBJ_TYPE_REPAIR_SUMMIT = "4004";
+    //对象类型 1001 门禁 2002 车辆道闸 3003 手机支付完成 4004 报修单提交
+
     private String objId;
     private String remark;
     private String ruleId;
+    private String[] ruleIds;
     private String objType;
+    private String[] objTypes;
     private String objTypeName;
 
 
@@ -83,4 +91,20 @@ public class MarketRuleObjDto extends PageDto implements Serializable {
     public void setObjTypeName(String objTypeName) {
         this.objTypeName = objTypeName;
     }
+
+    public String[] getRuleIds() {
+        return ruleIds;
+    }
+
+    public void setRuleIds(String[] ruleIds) {
+        this.ruleIds = ruleIds;
+    }
+
+    public String[] getObjTypes() {
+        return objTypes;
+    }
+
+    public void setObjTypes(String[] objTypes) {
+        this.objTypes = objTypes;
+    }
 }

+ 23 - 0
java110-bean/src/main/java/com/java110/dto/marketRuleWay/MarketRuleWayDto.java

@@ -15,12 +15,19 @@ import java.util.Date;
  **/
 public class MarketRuleWayDto extends PageDto implements Serializable {
 
+    public static final String WAY_TYPE_TEXT = "1001";
+    public static final String WAY_TYPE_PIC = "2002";
+    public static final String WAY_TYPE_GOODS = "3003";
+            //营销方式类型 1001 文本 2002 图片 3003 商品
+
     private String wayId;
     private String wayType;
+    private String[] wayTypes;
     private String wayTypeName;
     private String wayObjId;
     private String remark;
     private String ruleId;
+    private String[] ruleIds;
 
     private String textName;
     private String picName;
@@ -120,4 +127,20 @@ public class MarketRuleWayDto extends PageDto implements Serializable {
     public void setWayTypeName(String wayTypeName) {
         this.wayTypeName = wayTypeName;
     }
+
+    public String[] getWayTypes() {
+        return wayTypes;
+    }
+
+    public void setWayTypes(String[] wayTypes) {
+        this.wayTypes = wayTypes;
+    }
+
+    public String[] getRuleIds() {
+        return ruleIds;
+    }
+
+    public void setRuleIds(String[] ruleIds) {
+        this.ruleIds = ruleIds;
+    }
 }

+ 23 - 0
java110-bean/src/main/java/com/java110/dto/marketText/MarketTextDto.java

@@ -15,6 +15,11 @@ import java.util.Date;
  **/
 public class MarketTextDto extends PageDto implements Serializable {
 
+    public static final String SEND_RATE_DAY="1001";
+    public static final String SEND_RATE_MONTH="2002";
+    public static final String SEND_RATE_NO="3003";
+
+    private String ruleId;
     private String textId;
     private String sendRate;
     private String sendRateName;
@@ -23,6 +28,8 @@ public class MarketTextDto extends PageDto implements Serializable {
     private String smsId;
     private String smsName;
 
+    private String smsType;
+
 
     private Date createTime;
 
@@ -101,4 +108,20 @@ public class MarketTextDto extends PageDto implements Serializable {
     public void setSendRateName(String sendRateName) {
         this.sendRateName = sendRateName;
     }
+
+    public String getSmsType() {
+        return smsType;
+    }
+
+    public void setSmsType(String smsType) {
+        this.smsType = smsType;
+    }
+
+    public String getRuleId() {
+        return ruleId;
+    }
+
+    public void setRuleId(String ruleId) {
+        this.ruleId = ruleId;
+    }
 }

+ 25 - 0
java110-db/src/main/resources/mapper/common/MarketRuleObjV1ServiceDaoImplMapper.xml

@@ -34,9 +34,22 @@
         <if test="ruleId !=null and ruleId != ''">
             and t.rule_id= #{ruleId}
         </if>
+        <if test="ruleIds !=null ">
+            and t.rule_id in
+            <foreach collection="ruleIds" item="item" open="(" close=")" separator=",">
+                #{item}
+            </foreach>
+        </if>
         <if test="objType !=null and objType != ''">
             and t.obj_type= #{objType}
         </if>
+        <if test="objTypes !=null ">
+            and t.obj_type in
+            <foreach collection="objTypes" item="item" open="(" close=")" separator=",">
+                #{item}
+            </foreach>
+        </if>
+
         order by t.create_time desc
         <if test="page != -1 and page != null ">
             limit #{page}, #{row}
@@ -84,9 +97,21 @@
         <if test="ruleId !=null and ruleId != ''">
             and t.rule_id= #{ruleId}
         </if>
+        <if test="ruleIds !=null ">
+            and t.rule_id in
+            <foreach collection="ruleIds" item="item" open="(" close=")" separator=",">
+                #{item}
+            </foreach>
+        </if>
         <if test="objType !=null and objType != ''">
             and t.obj_type= #{objType}
         </if>
+        <if test="objTypes !=null ">
+            and t.obj_type in
+            <foreach collection="objTypes" item="item" open="(" close=")" separator=",">
+                #{item}
+            </foreach>
+        </if>
 
 
     </select>

+ 25 - 0
java110-db/src/main/resources/mapper/common/MarketRuleWayV1ServiceDaoImplMapper.xml

@@ -32,6 +32,12 @@
         <if test="wayType !=null and wayType != ''">
             and t.way_type= #{wayType}
         </if>
+        <if test="wayTypes !=null ">
+            and t.way_type in
+            <foreach collection="wayTypes" item="item" open="(" close=")" separator=",">
+                #{item}
+            </foreach>
+        </if>
         <if test="wayObjId !=null and wayObjId != ''">
             and t.way_obj_id= #{wayObjId}
         </if>
@@ -44,6 +50,13 @@
         <if test="ruleId !=null and ruleId != ''">
             and t.rule_id= #{ruleId}
         </if>
+        <if test="ruleIds !=null ">
+            and t.rule_id in
+            <foreach collection="ruleIds" item="item" open="(" close=")" separator=",">
+                #{item}
+            </foreach>
+        </if>
+
         order by t.create_time desc
         <if test="page != -1 and page != null ">
             limit #{page}, #{row}
@@ -88,6 +101,12 @@
         <if test="wayType !=null and wayType != ''">
             and t.way_type= #{wayType}
         </if>
+        <if test="wayTypes !=null ">
+            and t.way_type in
+            <foreach collection="wayTypes" item="item" open="(" close=")" separator=",">
+                #{item}
+            </foreach>
+        </if>
         <if test="wayObjId !=null and wayObjId != ''">
             and t.way_obj_id= #{wayObjId}
         </if>
@@ -100,6 +119,12 @@
         <if test="ruleId !=null and ruleId != ''">
             and t.rule_id= #{ruleId}
         </if>
+        <if test="ruleIds !=null ">
+            and t.rule_id in
+            <foreach collection="ruleIds" item="item" open="(" close=")" separator=",">
+                #{item}
+            </foreach>
+        </if>
 
 
     </select>

+ 2 - 1
java110-db/src/main/resources/mapper/common/MarketTextV1ServiceDaoImplMapper.xml

@@ -18,7 +18,8 @@
     <!-- 查询营销文本信息 add by wuxw 2018-07-03 -->
     <select id="getMarketTextInfo" parameterType="Map" resultType="Map">
         select t.text_id,t.text_id textId,t.send_rate,t.send_rate sendRate,t.name,t.text_content,t.text_content
-        textContent,t.status_cd,t.status_cd statusCd,t.sms_id smsId,ms.sms_name smsName,td.name sendRateName,t.create_time createTime
+        textContent,t.status_cd,t.status_cd statusCd,t.sms_id smsId,ms.sms_name smsName,td.name sendRateName,t.create_time createTime,
+        ms.sms_type smsType
         from market_text t
         left join market_sms ms on t.sms_id = ms.sms_id and ms.status_cd = '0'
         left join t_dict td on t.send_rate = td.status_cd and td.table_name = 'market_text' and td.table_columns = 'send_rate'

+ 17 - 0
java110-utils/src/main/java/com/java110/utils/util/DateUtil.java

@@ -465,6 +465,23 @@ public class DateUtil {
         return sf.format(c.getTime());
     }
 
+    public static String getAddDayStringA(Date date,int days) {
+        SimpleDateFormat sf = new SimpleDateFormat(DATE_FORMATE_STRING_A);
+        Calendar c = Calendar.getInstance();
+        c.setTime(date);
+        c.add(Calendar.DAY_OF_MONTH, days);
+        return sf.format(c.getTime());
+    }
+
+
+    public static String getAddMonthStringA(Date date,int month) {
+        SimpleDateFormat sf = new SimpleDateFormat(DATE_FORMATE_STRING_A);
+        Calendar c = Calendar.getInstance();
+        c.setTime(date);
+        c.add(Calendar.MONTH, month);
+        return sf.format(c.getTime());
+    }
+
     /**
      * 在给定的日期加上或减去指定月份后的日期
      *

+ 5 - 3
service-common/src/main/java/com/java110/common/cmd/machine/OpenDoorLogCmd.java

@@ -2,6 +2,7 @@ package com.java110.common.cmd.machine;
 
 import com.alibaba.fastjson.JSONObject;
 import com.java110.core.annotation.Java110Cmd;
+import com.java110.core.annotation.Java110Transactional;
 import com.java110.core.context.ICmdDataFlowContext;
 import com.java110.core.event.cmd.Cmd;
 import com.java110.core.event.cmd.CmdEvent;
@@ -103,6 +104,7 @@ public class OpenDoorLogCmd extends Cmd{
     }
 
     @Override
+    @Java110Transactional
     public void doCmd(CmdEvent event, ICmdDataFlowContext context, JSONObject reqJson) throws CmdException, ParseException {
 
         MachineRecordDto machineRecordDto = BeanConvertUtil.covertBean(reqJson, MachineRecordDto.class);
@@ -159,9 +161,9 @@ public class OpenDoorLogCmd extends Cmd{
         if (count < 1) {
             context.setResponseEntity(ResultVo.error("上传记录失败"));
         }
-        //传送databus
-        dataBusInnerServiceSMOImpl.customExchange(CustomBusinessDatabusDto.getInstance(
-                BusinessTypeConstant.BUSINESS_TYPE_DATABUS_SEND_OPEN_LOG, BeanConvertUtil.beanCovertJson(machineRecordPo)));
+//        //传送databus
+//        dataBusInnerServiceSMOImpl.customExchange(CustomBusinessDatabusDto.getInstance(
+//                BusinessTypeConstant.BUSINESS_TYPE_DATABUS_SEND_OPEN_LOG, BeanConvertUtil.beanCovertJson(machineRecordPo)));
         context.setResponseEntity(ResultVo.success());
     }
 }

+ 150 - 0
service-job/src/main/java/com/java110/job/adapt/market/DefaultSendExecutor.java

@@ -0,0 +1,150 @@
+package com.java110.job.adapt.market;
+
+import com.java110.core.factory.GenerateCodeFactory;
+import com.java110.dto.marketLog.MarketLogDto;
+import com.java110.dto.marketSmsValue.MarketSmsValueDto;
+import com.java110.dto.marketText.MarketTextDto;
+import com.java110.dto.owner.OwnerAppUserDto;
+import com.java110.dto.user.UserDto;
+import com.java110.intf.common.IMarketLogV1InnerServiceSMO;
+import com.java110.intf.user.IOwnerAppUserInnerServiceSMO;
+import com.java110.intf.user.IUserV1InnerServiceSMO;
+import com.java110.po.marketLog.MarketLogPo;
+import com.java110.utils.util.DateUtil;
+import com.java110.utils.util.StringUtil;
+import com.java110.vo.ResultVo;
+import org.springframework.beans.factory.annotation.Autowired;
+
+import java.util.Date;
+import java.util.List;
+
+public  abstract class DefaultSendExecutor implements ISendExecutor {
+
+    @Autowired
+    private IMarketLogV1InnerServiceSMO marketLogV1InnerServiceSMOImpl;
+
+
+    @Autowired
+    private IOwnerAppUserInnerServiceSMO ownerAppUserInnerServiceSMOImpl;
+
+    @Autowired
+    private IUserV1InnerServiceSMO userV1InnerServiceSMOImpl;
+
+
+    @Override
+    public void send(MarketTextDto marketTextDto,String tel,String communityId,String communityName) {
+
+        MarketLogDto marketLogDto = new MarketLogDto();
+        marketLogDto.setPersonTel(tel);
+        marketLogDto.setCommunityId(communityId);
+        long count = 0;
+        if(MarketTextDto.SEND_RATE_DAY.equals(marketTextDto.getSendRate())){
+            marketLogDto.setStartTime(DateUtil.getAddDayStringA(new Date(),-1));
+            marketLogDto.setEndTime(DateUtil.getNow(DateUtil.DATE_FORMATE_STRING_A));
+            count = marketLogV1InnerServiceSMOImpl.queryMarketLogsCount(marketLogDto);
+        }else if(MarketTextDto.SEND_RATE_MONTH.equals(marketTextDto.getSendRate())){
+            marketLogDto.setStartTime(DateUtil.getAddMonthStringA(new Date(),-1));
+            marketLogDto.setEndTime(DateUtil.getNow(DateUtil.DATE_FORMATE_STRING_A));
+            count = marketLogV1InnerServiceSMOImpl.queryMarketLogsCount(marketLogDto);
+        }
+
+        if(count > 0){
+            return ;
+        }
+
+
+        String openId = getOpenId(marketTextDto ,tel, communityId);
+        if(StringUtil.isEmpty(openId)){
+            return;
+        }
+
+
+        ResultVo resultVo = doSend(marketTextDto,tel,communityId);
+
+        String userName = "未知";
+
+        UserDto userDto = new UserDto();
+        userDto.setTel(tel);
+        List<UserDto> userDtos = userV1InnerServiceSMOImpl.queryUsers(userDto);
+        if(userDtos != null && userDtos.size()> 0){
+            userName = userDtos.get(0).getName();
+        }
+
+        String sendWay = "1001";
+
+        if(StringUtil.isNullOrNone(resultVo.getData())){
+            sendWay = resultVo.getData().toString();
+        }
+
+        MarketLogPo marketLogPo = new MarketLogPo();
+        marketLogPo.setBusinessType("1001");
+        marketLogPo.setCommunityId(communityId);
+        marketLogPo.setCommunityName(communityName);
+        marketLogPo.setLogId(GenerateCodeFactory.getGeneratorId("11"));
+        marketLogPo.setOpenId(openId);
+        marketLogPo.setPersonName(userName);
+        marketLogPo.setPersonTel(tel);
+        marketLogPo.setRemark(resultVo.getMsg());
+        marketLogPo.setRuleId(marketTextDto.getRuleId());
+        marketLogPo.setSendContent(marketTextDto.getTextContent());
+        marketLogPo.setSendWay(sendWay);
+        marketLogV1InnerServiceSMOImpl.saveMarketLog(marketLogPo);
+    }
+
+    /**
+     * 发送消息
+     * @param marketTextDto
+     * @param tel
+     * @param communityId
+     */
+    public abstract ResultVo doSend(MarketTextDto marketTextDto, String tel, String communityId);
+
+
+    private String getOpenId(MarketTextDto marketTextDto,String tel, String communityId) {
+        OwnerAppUserDto ownerAppUserDto = new OwnerAppUserDto();
+        ownerAppUserDto.setLink(tel);
+        ownerAppUserDto.setCommunityId(communityId);
+        ownerAppUserDto.setAppType(OwnerAppUserDto.APP_TYPE_WECHAT);
+        List<OwnerAppUserDto> ownerAppUserDtos = ownerAppUserInnerServiceSMOImpl.queryOwnerAppUsers(ownerAppUserDto);
+
+        if(ownerAppUserDtos == null || ownerAppUserDtos.size()<1){
+            return "-1";
+        }
+
+        String openId = ownerAppUserDtos.get(0).getOpenId();
+
+        if(StringUtil.isEmpty(openId)){
+            return "-1";
+        }
+
+        MarketLogDto marketLogDto = new MarketLogDto();
+        marketLogDto.setOpenId(openId);
+        marketLogDto.setCommunityId(communityId);
+        long count = 0;
+        if(MarketTextDto.SEND_RATE_DAY.equals(marketTextDto.getSendRate())){
+            marketLogDto.setStartTime(DateUtil.getAddDayStringA(new Date(),-1));
+            marketLogDto.setEndTime(DateUtil.getNow(DateUtil.DATE_FORMATE_STRING_A));
+            count = marketLogV1InnerServiceSMOImpl.queryMarketLogsCount(marketLogDto);
+        }else if(MarketTextDto.SEND_RATE_MONTH.equals(marketTextDto.getSendRate())){
+            marketLogDto.setStartTime(DateUtil.getAddMonthStringA(new Date(),-1));
+            marketLogDto.setEndTime(DateUtil.getNow(DateUtil.DATE_FORMATE_STRING_A));
+            count = marketLogV1InnerServiceSMOImpl.queryMarketLogsCount(marketLogDto);
+        }
+
+        if(count > 0){
+            return "";
+        }
+
+        return openId;
+    }
+
+    protected String getMarketValue(List<MarketSmsValueDto> marketSmsValueDtos,String specCd){
+        for(MarketSmsValueDto marketSmsValueDto : marketSmsValueDtos){
+            if(marketSmsValueDto.getSmsKey().equals(specCd)){
+                return marketSmsValueDto.getSmsValue();
+            }
+        }
+
+        return "";
+    }
+}

+ 13 - 0
service-job/src/main/java/com/java110/job/adapt/market/ISendExecutor.java

@@ -0,0 +1,13 @@
+package com.java110.job.adapt.market;
+
+
+import com.java110.dto.marketText.MarketTextDto;
+
+public interface ISendExecutor {
+
+    /**
+     * 发送信息
+     * @param marketTextDto
+     */
+    void send(MarketTextDto marketTextDto,String tel,String communityId,String communityName);
+}

+ 126 - 0
service-job/src/main/java/com/java110/job/adapt/market/SendMarketInfoAdapt.java

@@ -0,0 +1,126 @@
+package com.java110.job.adapt.market;
+
+import com.alibaba.fastjson.JSONArray;
+import com.alibaba.fastjson.JSONObject;
+import com.java110.dto.marketRuleCommunity.MarketRuleCommunityDto;
+import com.java110.dto.marketRuleObj.MarketRuleObjDto;
+import com.java110.dto.marketRuleWay.MarketRuleWayDto;
+import com.java110.dto.marketText.MarketTextDto;
+import com.java110.entity.order.Business;
+import com.java110.intf.common.*;
+import com.java110.job.adapt.DatabusAdaptImpl;
+import com.java110.po.machine.MachineRecordPo;
+import com.java110.utils.factory.ApplicationContextFactory;
+import com.java110.utils.util.BeanConvertUtil;
+import com.java110.utils.util.StringUtil;
+import org.springframework.beans.factory.annotation.Autowired;
+
+import java.util.ArrayList;
+import java.util.List;
+
+/**
+ * 发送营销信息
+ *
+ * 根据 admin账户下 营销配置 发送
+ *
+ *
+ */
+public class SendMarketInfoAdapt extends DatabusAdaptImpl {
+
+    @Autowired
+    private IMarketRuleCommunityV1InnerServiceSMO marketRuleCommunityV1InnerServiceSMOImpl;
+
+    @Autowired
+    private IMarketTextV1InnerServiceSMO marketTextV1InnerServiceSMOImpl;
+
+    @Autowired
+    private IMarketRuleObjV1InnerServiceSMO marketRuleObjV1InnerServiceSMOImpl;
+
+    @Autowired
+    private IMarketRuleWayV1InnerServiceSMO marketRuleWayV1InnerServiceSMOImpl;
+
+
+
+    @Override
+    public void execute(Business business, List<Business> businesses) {
+        JSONObject data = business.getData();
+        JSONArray businessMachineRecordPos = new JSONArray();
+
+        if (data instanceof JSONObject) {
+            businessMachineRecordPos.add(data);
+        }
+
+        //JSONObject businessCarBlackWhite = data.getJSONObject("businessCarBlackWhite");
+        for (int bMachineRecordPoIndex = 0; bMachineRecordPoIndex < businessMachineRecordPos.size(); bMachineRecordPoIndex++) {
+            JSONObject businessMachineRecordPo = businessMachineRecordPos.getJSONObject(bMachineRecordPoIndex);
+            doSendMarket(business, businessMachineRecordPo);
+        }
+    }
+
+    /**
+     * 发送营销信息
+     *
+     * @param business
+     * @param businessMachineRecordPo 开门记录信息
+     */
+    private void doSendMarket(Business business, JSONObject businessMachineRecordPo) {
+        MachineRecordPo machineRecordPo = BeanConvertUtil.covertBean(businessMachineRecordPo,MachineRecordPo.class);
+
+        //没有手机号 说明  没法发送营销信息 所以 放弃 不推送
+        if(StringUtil.isEmpty(machineRecordPo.getTel()) || "-1".equals(machineRecordPo.getTel())){
+            return ;
+        }
+
+        String communityId = machineRecordPo.getCommunityId();
+
+
+        MarketRuleCommunityDto marketRuleCommunityDto = new MarketRuleCommunityDto();
+        marketRuleCommunityDto.setCommunityId(communityId);
+        List<MarketRuleCommunityDto> marketRuleCommunityDtos = marketRuleCommunityV1InnerServiceSMOImpl.queryMarketRuleCommunitys(marketRuleCommunityDto);
+
+        if(marketRuleCommunityDtos == null || marketRuleCommunityDtos.size()<1){
+            return;
+        }
+
+        List<String> ruleIds = new ArrayList<>();
+        for(MarketRuleCommunityDto tmpMarketRuleCommunityDto: marketRuleCommunityDtos){
+            ruleIds.add(tmpMarketRuleCommunityDto.getRuleId());
+        }
+
+        MarketRuleObjDto marketRuleObjDto = new MarketRuleObjDto();
+        marketRuleObjDto.setRuleIds(ruleIds.toArray(new String[ruleIds.size()]));
+        marketRuleObjDto.setObjType(MarketRuleObjDto.OBJ_TYPE_ACCESS_CONTROL);
+        long count = marketRuleObjV1InnerServiceSMOImpl.queryMarketRuleObjsCount(marketRuleObjDto);
+
+        if(count <1){
+            return ;
+        }
+
+
+        MarketRuleWayDto marketRuleWayDto = new MarketRuleWayDto();
+        marketRuleWayDto.setRuleIds(ruleIds.toArray(new String[ruleIds.size()]));
+        marketRuleWayDto.setWayType(MarketRuleWayDto.WAY_TYPE_TEXT);
+        List<MarketRuleWayDto> marketRuleWayDtos = marketRuleWayV1InnerServiceSMOImpl.queryMarketRuleWays(marketRuleWayDto);
+
+        if(marketRuleWayDtos == null || marketRuleWayDtos.size()<1){
+            return;
+        }
+
+        MarketTextDto marketTextDto = new MarketTextDto();
+        marketTextDto.setTextId(marketRuleWayDto.getWayObjId());
+       List<MarketTextDto> marketTextDtos = marketTextV1InnerServiceSMOImpl.queryMarketTexts(marketTextDto);
+
+       if(marketTextDtos == null || marketTextDtos.size()<1){
+           return ;
+       }
+
+
+
+       ISendExecutor sendExecuter = ApplicationContextFactory.getBean("sendExecutor"+marketTextDtos.get(0).getSmsType(),ISendExecutor.class);
+        marketTextDtos.get(0).setRuleId(ruleIds.get(0));
+       sendExecuter.send(marketTextDtos.get(0),machineRecordPo.getTel(),communityId,marketRuleCommunityDtos.get(0).getCommunityName());
+
+
+
+    }
+}

+ 143 - 0
service-job/src/main/java/com/java110/job/adapt/market/executor/SendExecutorSMS.java

@@ -0,0 +1,143 @@
+package com.java110.job.adapt.market.executor;
+
+
+import com.alibaba.fastjson.JSONObject;
+import com.java110.core.client.OutRestTemplate;
+import com.java110.dto.marketSmsValue.MarketSmsValueDto;
+import com.java110.dto.marketText.MarketTextDto;
+import com.java110.intf.common.IMarketSmsValueV1InnerServiceSMO;
+import com.java110.job.adapt.market.DefaultSendExecutor;
+import com.java110.utils.util.DateUtil;
+import com.java110.vo.ResultVo;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.http.*;
+import org.springframework.stereotype.Service;
+
+import java.security.MessageDigest;
+import java.util.Arrays;
+import java.util.List;
+import java.util.Map;
+import java.util.Set;
+
+/**
+ * https://console.shlianlu.com/#/document/api_4_2
+ * <p>
+ * 联麓信息
+ */
+@Service("sendExecutorSMS")
+public class SendExecutorSMS extends DefaultSendExecutor {
+
+    //短信地址
+    private static final String SMS_URL = "https://api.shlianlu.com/sms/trade/normal/send";
+
+    private static final String APP_ID = "AppId";
+    private static final String APP_KEY = "AppKey";
+    private static final String MCH_ID = "MchId";
+    private static final String SIGN_NAME = "SignName";
+
+    public static String Version = "Version";
+    public static String FIELD_SIGN = "Signature";
+    public static String ContextParamSet = "ContextParamSet";
+    public static String TemplateParamSet = "TemplateParamSet";
+    public static String SessionContextSet = "SessionContextSet";
+    public static String PhoneNumberSet = "PhoneNumberSet";
+    public static String SessionContext = "SessionContext";
+
+    @Autowired
+    private IMarketSmsValueV1InnerServiceSMO marketSmsValueV1InnerServiceSMOImpl;
+
+    @Autowired
+    private OutRestTemplate outRestTemplate;
+
+    @Override
+    public ResultVo doSend(MarketTextDto marketTextDto, String tel, String communityId) {
+
+        MarketSmsValueDto marketSmsValueDto = new MarketSmsValueDto();
+        marketSmsValueDto.setSmsId(marketTextDto.getSmsId());
+        List<MarketSmsValueDto> marketSmsValueDtos = marketSmsValueV1InnerServiceSMOImpl.queryMarketSmsValues(marketSmsValueDto);
+
+        if (marketSmsValueDtos == null || marketSmsValueDtos.size() < 1) {
+            throw new IllegalArgumentException("未包含 sms 配置信息");
+        }
+
+        JSONObject param = new JSONObject();
+        param.put("Type", "1");
+        param.put("PhoneNumberSet", new String[]{tel});
+        param.put("AppId", getMarketValue(marketSmsValueDtos, APP_ID));
+        //param.put("ExtendCode","");
+        param.put("Version", "1.1.0");
+        param.put("MchId", getMarketValue(marketSmsValueDtos, MCH_ID));
+        param.put("SessionContext", marketTextDto.getTextContent());
+        param.put("SignType", "MD5");
+        param.put("TimeStamp", DateUtil.getCurrentDate().getTime());
+        param.put("SignName", getMarketValue(marketSmsValueDtos, SIGN_NAME));
+
+        param.put("Signature", generateSignature(param, getMarketValue(marketSmsValueDtos, APP_KEY)));
+
+        HttpEntity httpEntity = new HttpEntity(param.toJSONString(), getHeaders());
+        ResponseEntity<String> responseEntity = outRestTemplate.exchange(SMS_URL, HttpMethod.POST, httpEntity, String.class);
+        if (responseEntity.getStatusCode() != HttpStatus.OK) {
+            return new ResultVo(ResultVo.CODE_ERROR, responseEntity.getBody());
+        }
+
+        JSONObject result = JSONObject.parseObject(responseEntity.getBody());
+
+        if ("00".equals(result.getString("status"))) {
+            return new ResultVo(ResultVo.CODE_OK, "成功", "1001");
+        }
+        return new ResultVo(ResultVo.CODE_ERROR, result.getString("message"), "1001");
+
+
+    }
+
+    private HttpHeaders getHeaders() {
+        HttpHeaders httpHeaders = new HttpHeaders();
+        httpHeaders.add("Accept", "application/json");
+        httpHeaders.add("Content-Type", "application/json;charset=utf-8");
+        //httpHeaders.add("Content-Type", "application/x-www-form-urlencoded");
+        return httpHeaders;
+    }
+
+    /**
+     * 生成签名. 注意,若含有sign_type字段,必须和signType参数保持一致。
+     *
+     * @param data 待签名数据
+     * @param key  API密钥
+     * @return 签名
+     */
+    public static String generateSignature(final Map<String, Object> data, String key) {
+        Set<String> keySet = data.keySet();
+        String[] keyArray = keySet.toArray(new String[keySet.size()]);
+        Arrays.sort(keyArray);
+        StringBuilder sb = new StringBuilder();
+        for (String k : keyArray) {
+            if (k.equals(FIELD_SIGN) || k.equals(PhoneNumberSet) || k.equals(TemplateParamSet) || k.equals(SessionContext) || k.equals(SessionContextSet) || k.equals(ContextParamSet)) {
+                continue;
+            }
+            if (data.get(k) != null && data.get(k).toString().trim().length() > 0) // 参数值为空,则不参与签名
+                sb.append(k).append("=").append(data.get(k).toString().trim()).append("&");
+        }
+        sb.append("key=").append(key);
+        System.out.println(sb);
+        String sign = MD5(sb.toString()).toUpperCase();
+        System.out.println(sign);
+        return sign;
+
+    }
+
+    public static String MD5(String data) {
+        try {
+            java.security.MessageDigest md = MessageDigest.getInstance("MD5");
+            byte[] array = md.digest(data.getBytes("UTF-8"));
+            StringBuilder sb = new StringBuilder();
+            for (byte item : array) {
+                sb.append(Integer.toHexString((item & 0xFF) | 0x100).substring(1, 3));
+            }
+            return sb.toString().toUpperCase();
+        } catch (Exception e) {
+            e.printStackTrace();
+        }
+        return "";
+    }
+
+}