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