| @@ -57,13 +57,13 @@ public class WxMsg implements Serializable { | |||
| private Date createtime; | |||
| /*预计发送数量**/ | |||
| @io.swagger.annotations.ApiModelProperty(value="预计发送数量",name="expectSendNumber") | |||
| private String expectSendNumber; | |||
| private Integer expectSendNumber; | |||
| /*成功数量**/ | |||
| @io.swagger.annotations.ApiModelProperty(value="成功数量",name="successNumber") | |||
| private String successNumber; | |||
| private Integer successNumber; | |||
| /*错误数量**/ | |||
| @io.swagger.annotations.ApiModelProperty(value="错误数量",name="errorNumber") | |||
| private String errorNumber; | |||
| private Integer errorNumber; | |||
| /***/ | |||
| @io.swagger.annotations.ApiModelProperty(value="",name="returnResult") | |||
| private String returnResult; | |||
| @@ -122,22 +122,22 @@ public class WxMsg implements Serializable { | |||
| public void setCreatetime(Date _createtime) { | |||
| createtime = _createtime; | |||
| } | |||
| public String getExpectSendNumber() { | |||
| public Integer getExpectSendNumber() { | |||
| return expectSendNumber; | |||
| } | |||
| public void setExpectSendNumber(String _expectSendNumber) { | |||
| public void setExpectSendNumber(Integer _expectSendNumber) { | |||
| expectSendNumber = _expectSendNumber; | |||
| } | |||
| public String getSuccessNumber() { | |||
| public Integer getSuccessNumber() { | |||
| return successNumber; | |||
| } | |||
| public void setSuccessNumber(String _successNumber) { | |||
| public void setSuccessNumber(Integer _successNumber) { | |||
| successNumber = _successNumber; | |||
| } | |||
| public String getErrorNumber() { | |||
| public Integer getErrorNumber() { | |||
| return errorNumber; | |||
| } | |||
| public void setErrorNumber(String _errorNumber) { | |||
| public void setErrorNumber(Integer _errorNumber) { | |||
| errorNumber = _errorNumber; | |||
| } | |||
| public String getReturnResult() { | |||
| @@ -1,11 +1,11 @@ | |||
| package com.iformall.domain.po; | |||
| import javax.persistence.*; | |||
| import java.util.*; | |||
| import javax.persistence.Transient; | |||
| import java.util.List; | |||
| import javax.persistence.Id; | |||
| import javax.persistence.Table; | |||
| import javax.persistence.Transient; | |||
| import java.io.Serializable; | |||
| import java.util.Date; | |||
| import java.util.List; | |||
| @Table(name = "wx_msg_callback") | |||
| public class WxMsgCallback implements Serializable { | |||
| @@ -37,9 +37,11 @@ public class WxMsgCallback implements Serializable { | |||
| public void setIds(List<String> ids) { | |||
| this.ids = ids; | |||
| } | |||
| @io.swagger.annotations.ApiModelProperty(value="回调ID",name="callbackId") | |||
| private Long callbackId; | |||
| /*租户id**/ | |||
| @io.swagger.annotations.ApiModelProperty(value="租户id",name="tenantId") | |||
| private String tenantId; | |||
| @@ -67,6 +69,23 @@ public class WxMsgCallback implements Serializable { | |||
| /*创建时间**/ | |||
| @io.swagger.annotations.ApiModelProperty(value="创建时间",name="createtime") | |||
| private Date createtime; | |||
| /*更新时间**/ | |||
| @io.swagger.annotations.ApiModelProperty(value="更新时间",name="updatetime") | |||
| private Date updatetime; | |||
| /*msgId**/ | |||
| @io.swagger.annotations.ApiModelProperty(value="msgId",name="msgId") | |||
| private Long msgId; | |||
| public Long getCallbackId() { | |||
| return callbackId; | |||
| } | |||
| public void setCallbackId(Long callbackId) { | |||
| this.callbackId = callbackId; | |||
| } | |||
| public String getTenantId() { | |||
| return tenantId; | |||
| } | |||
| @@ -123,6 +142,21 @@ public class WxMsgCallback implements Serializable { | |||
| } | |||
| public Date getUpdatetime() { | |||
| return updatetime; | |||
| } | |||
| public void setUpdatetime(Date updatetime) { | |||
| this.updatetime = updatetime; | |||
| } | |||
| public Long getMsgId() { | |||
| return msgId; | |||
| } | |||
| public void setMsgId(Long msgId) { | |||
| this.msgId = msgId; | |||
| } | |||
| public static enum Field | |||
| { | |||
| @@ -1,16 +1,18 @@ | |||
| package com.iformall.mapper; | |||
| import java.util.*; | |||
| import com.iformall.common.CommonMapper; | |||
| import com.iformall.domain.po.WxMsgCallback; | |||
| import java.util.List; | |||
| import java.util.Map; | |||
| public interface WxMsgCallbackMapper extends CommonMapper<WxMsgCallback, String> { | |||
| List<WxMsgCallback> findList(WxMsgCallback wxMsgCallback); | |||
| WxMsgCallback queryCallbackByBatchNoAndPhone(WxMsgCallback wxMsgCallback); | |||
| int queryMsgSendTotal(Map<String,String> params); | |||
| } | |||
| @@ -1,7 +1,6 @@ | |||
| package com.iformall.service.impl; | |||
| import com.alibaba.fastjson.JSONArray; | |||
| import com.alibaba.fastjson.JSONObject; | |||
| import com.github.pagehelper.PageHelper; | |||
| import com.github.pagehelper.PageInfo; | |||
| import com.iformall.common.IdWorker; | |||
| @@ -9,13 +8,10 @@ import com.iformall.domain.po.WxMsgCallback; | |||
| import com.iformall.domain.po.WxMsgConfig; | |||
| import com.iformall.domain.po.WxMsgModel; | |||
| import com.iformall.domain.po.WxMsgValidationcodeModel; | |||
| import com.iformall.mapper.WxMsgCallbackMapper; | |||
| import com.iformall.mapper.WxMsgConfigMapper; | |||
| import com.iformall.mapper.WxMsgModelMapper; | |||
| import com.iformall.mapper.WxMsgValidationcodeModelMapper; | |||
| import com.iformall.enums.EnumMsgStatus; | |||
| import com.iformall.mapper.*; | |||
| import com.iformall.service.WxMsgCallbackService; | |||
| import com.iformall.utils.HMACSHA256; | |||
| import org.slf4j.Logger; | |||
| import org.slf4j.LoggerFactory; | |||
| import org.springframework.beans.factory.annotation.Autowired; | |||
| @@ -39,6 +35,8 @@ public class WxMsgCallbackServiceImpl implements WxMsgCallbackService { | |||
| @Autowired | |||
| WxMsgValidationcodeModelMapper wxMsgValidationcodeModelMapper; | |||
| @Autowired | |||
| WxMsgMapper wxMsgMapper; | |||
| @Override | |||
| public PageInfo<WxMsgCallback> listAsPage(WxMsgCallback record, Integer pageIndex, Integer pageSize) { | |||
| @@ -91,17 +89,28 @@ public class WxMsgCallbackServiceImpl implements WxMsgCallbackService { | |||
| logger.info("短信SIGN校验成功"); | |||
| wxMsgConfig.setRemains(wxMsgConfig.getRemains() - wxMsgCallbacks.size()); | |||
| wxMsgConfigMapper.updateByPrimaryKeySelective(wxMsgConfig); | |||
| final IdWorker idWorker = IdWorker.get(); | |||
| for (WxMsgCallback wxMsgCallback : wxMsgCallbacks) { | |||
| WxMsgCallback callback = wxMsgCallbackMapper.selectByPrimaryKey(wxMsgCallback.getId()); | |||
| if(callback!=null){//有更新 | |||
| wxMsgCallbackMapper.updateByPrimaryKeySelective(wxMsgCallback); | |||
| }else{//无插入 | |||
| wxMsgCallback.setTenantId(wxMsgConfig.getTenantId()); | |||
| wxMsgCallback.setSign(sign); | |||
| WxMsgCallback callback=wxMsgCallbackMapper.queryCallbackByBatchNoAndPhone(wxMsgCallback); | |||
| if(callback!=null){//有更新,无插入 | |||
| callback.setSign(sign); | |||
| callback.setTenantId(tenantId); | |||
| callback.setStatus(wxMsgCallback.getStatus()); | |||
| callback.setStatusMsg(wxMsgCallback.getStatusMsg()); | |||
| callback.setBegintime(wxMsgCallback.getBegintime()); | |||
| callback.setEndtime(wxMsgCallback.getEndtime()); | |||
| callback.setCallbackId(wxMsgCallback.getId()); | |||
| callback.setUpdatetime(new Date()); | |||
| wxMsgCallbackMapper.updateByPrimaryKeySelective(callback); | |||
| }else{ | |||
| Long callbackId = wxMsgCallback.getId(); | |||
| wxMsgCallback.setId(idWorker.nextId()); | |||
| wxMsgCallback.setCallbackId(callbackId); | |||
| wxMsgCallback.setTenantId(tenantId); | |||
| wxMsgCallback.setStatus(EnumMsgStatus.MSG_SEND_FAIL.getCode()); | |||
| wxMsgCallback.setCreatetime(new Date()); | |||
| wxMsgCallbackMapper.insertSelective(wxMsgCallback); | |||
| } | |||
| } | |||
| }else{ | |||
| logger.info("短信SIGN校验失败"); | |||
| @@ -50,12 +50,38 @@ public class WxMsgServiceImpl implements WxMsgService { | |||
| @Override | |||
| public PageInfo<WxMsg> listAsPage(WxMsg record, Integer pageIndex, Integer pageSize) { | |||
| return PageHelper.startPage(pageIndex, pageSize).doSelectPageInfo(() -> wxMsgMapper.findList(record)); | |||
| PageHelper.startPage(pageIndex, pageSize); | |||
| List<WxMsg> templist = wxMsgMapper.findList(record); | |||
| for(WxMsg temp:templist){ | |||
| Map<String,String> params=new HashMap<>(); | |||
| params.put("msgId",temp.getId().toString()); | |||
| params.put("status","1"); | |||
| int success=wxMsgCallbackMapper.queryMsgSendTotal(params); | |||
| params.put("status","0"); | |||
| int error=wxMsgCallbackMapper.queryMsgSendTotal(params); | |||
| temp.setSuccessNumber(success); | |||
| temp.setErrorNumber(error); | |||
| } | |||
| PageInfo<WxMsg> pageInfo = new PageInfo<>(templist); | |||
| return pageInfo; | |||
| } | |||
| @Override | |||
| public WxMsg getById(Long id) { | |||
| return wxMsgMapper.selectByPrimaryKey(id); | |||
| WxMsg wxMsg = wxMsgMapper.selectByPrimaryKey(id); | |||
| Map<String,String> params=new HashMap<>(); | |||
| params.put("msgId",wxMsg.getId().toString()); | |||
| params.put("status","1"); | |||
| int success=wxMsgCallbackMapper.queryMsgSendTotal(params); | |||
| params.put("status","0"); | |||
| int error=wxMsgCallbackMapper.queryMsgSendTotal(params); | |||
| wxMsg.setSuccessNumber(success); | |||
| wxMsg.setErrorNumber(error); | |||
| return wxMsg; | |||
| } | |||
| @Override | |||
| @@ -82,6 +108,7 @@ public class WxMsgServiceImpl implements WxMsgService { | |||
| for(String phone:phoneSplit){ | |||
| phoneSet.add(phone); | |||
| } | |||
| wxMsg.setExpectSendNumber(phoneSet.size());//预计发送数量 | |||
| StringBuffer sb=new StringBuffer(); | |||
| for(String phone:phoneSet){ | |||
| sb.append(phone).append(","); | |||
| @@ -155,11 +182,6 @@ public class WxMsgServiceImpl implements WxMsgService { | |||
| return ""; | |||
| } | |||
| private String parseexcle(String tenantId, WxMsg excelpath) { | |||
| return null; | |||
| } | |||
| @Override | |||
| public void deleteById(Long id) { | |||
| wxMsgMapper.deleteByPrimaryKey(id); | |||
| @@ -167,6 +189,7 @@ public class WxMsgServiceImpl implements WxMsgService { | |||
| public ResultData sendmsg(WxMsg wxMsg) { | |||
| logger.info("发送短信开始..."); | |||
| //从短信配置中查询密钥 bid 等信息 | |||
| WxMsgConfig wxMsgConfig = new WxMsgConfig(); | |||
| wxMsgConfig.setTenantId(wxMsg.getTenantId()); | |||
| @@ -218,7 +241,7 @@ public class WxMsgServiceImpl implements WxMsgService { | |||
| String result = HttpUtil.doPost(requestUrl, params); | |||
| JSONObject jsonObjectResult = JSONObject.parseObject(result); | |||
| String ret = jsonObjectResult.get("ret").toString(); | |||
| String batchNo = jsonObjectResult.get("data").toString(); | |||
| if (ret.equals("1")) { | |||
| wxMsg.setSendstatus(EnumMsgStatus.MSG_SEND_SUCCESS.getCode()); | |||
| } else { | |||
| @@ -234,7 +257,9 @@ public class WxMsgServiceImpl implements WxMsgService { | |||
| wxMsgMapper.updateByPrimaryKeySelective(wxMsg); | |||
| } | |||
| logger.info("发送短信结束..."); | |||
| if (ret.equals("1")) { | |||
| addMsgCallback(wxMsg,batchNo); | |||
| return new ResultData(Result.SUCCESS, "短信发送中,您可在短信明细中查看发送状态"); | |||
| } else { | |||
| return new ResultData(ErrorCode.MSG_SEND_ERROR.getCode(), "短信发送发败"); | |||
| @@ -243,8 +268,8 @@ public class WxMsgServiceImpl implements WxMsgService { | |||
| } | |||
| public void addMsgCallback(WxMsg wxmsg){ | |||
| public void addMsgCallback(WxMsg wxmsg, String batchNo){ | |||
| logger.info("发送时主动添加回调记录开始..."); | |||
| String phones = wxmsg.getPhones(); | |||
| String[] split = phones.split(","); | |||
| final IdWorker idWorker = IdWorker.get(); | |||
| @@ -252,10 +277,14 @@ public class WxMsgServiceImpl implements WxMsgService { | |||
| WxMsgCallback wxMsgCallback = new WxMsgCallback(); | |||
| wxMsgCallback.setId(idWorker.nextId()); | |||
| wxMsgCallback.setPhone(phone); | |||
| //批次号或任务ID | |||
| wxMsgCallback.setTenantId(wxmsg.getTenantId()); | |||
| wxMsgCallback.setBatchNo(batchNo); | |||
| wxMsgCallback.setMsgId(wxmsg.getId()); | |||
| wxMsgCallback.setStatus(EnumMsgStatus.MSG_SEND_FAIL.getCode()); | |||
| wxMsgCallback.setCreatetime(new Date()); | |||
| wxMsgCallbackMapper.insertSelective(wxMsgCallback); | |||
| } | |||
| logger.info("发送时主动添加回调记录结束..."); | |||
| } | |||
| @@ -12,10 +12,14 @@ | |||
| <result column="status_msg" jdbcType="VARCHAR" property="statusMsg" /> | |||
| <result column="sign" jdbcType="VARCHAR" property="sign" /> | |||
| <result column="createtime" jdbcType="TIMESTAMP" property="createtime" /> | |||
| <result column="updatetime" jdbcType="TIMESTAMP" property="updatetime" /> | |||
| <result column="callback_id" jdbcType="BIGINT" property="callbackId" /> | |||
| <result column="msg_id" jdbcType="BIGINT" property="msgId" /> | |||
| </resultMap> | |||
| <sql id="allColumns"> | |||
| `id`,`tenant_id`,`batch_no`,`phone`,`begintime`,`endtime`,`status`,`status_msg`,`sign`,`createtime` | |||
| `id`,`tenant_id`,`batch_no`,`phone`,`begintime`,`endtime`,`status`,`status_msg`,`sign`,`createtime`,`updatetime`,`msg_id`,`callback_id` | |||
| </sql> | |||
| <sql id="dynamicWhereConditions"> | |||
| @@ -85,7 +89,16 @@ | |||
| </select> | |||
| <select id="queryCallbackByBatchNoAndPhone" parameterType="com.iformall.domain.po.WxMsgCallback"> | |||
| select * from wx_msg_callback where batch_no=#{batchNo} and phone=#{phone} | |||
| </select> | |||
| <select id="queryMsgSendTotal" parameterType="hashmap" resultType="int"> | |||
| select count(*) from wx_msg_callback where msg_id=#{msgId} and status=#{status} | |||
| </select> | |||