Zhiqim Account(前端账户管理台)是在ZhiqimManager基础上改造成用于前端注册登录的管理系统,增加组织结构和余额,开放注册组织和组织管理员,可以添加组织内的部门和角色和操作员。并增加该管理台上的一些组件,如充值支付等组件。适用于二级代理管理或该大型组织机构

森中灵 最后提交于9月前 整理为组织方式和替换新的jar
ZmrSmsDao.java9KB
/*
 * 版权所有 (C) 2015 知启蒙(ZHIQIM) 保留所有权利。[遇见知启蒙,邂逅框架梦]
 * 
 * https://zhiqim.org/project/zhiqim_components/zhiqim_account.htm
 *
 * Zhiqim Account is licensed under Mulan PSL v2.
 * You can use this software according to the terms and conditions of the Mulan PSL v2.
 * You may obtain a copy of Mulan PSL v2 at:
 *          http://license.coscl.org.cn/MulanPSL2
 * THIS SOFTWARE IS PROVIDED ON AN "AS IS" BASIS, WITHOUT WARRANTIES OF ANY KIND,
 * EITHER EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO NON-INFRINGEMENT,
 * MERCHANTABILITY OR FIT FOR A PARTICULAR PURPOSE.
 * See the Mulan PSL v2 for more details.
 */
package org.zhiqim.manager.dao;

import org.zhiqim.kernel.httpclient.HttpPost;
import org.zhiqim.kernel.json.Jsons;
import org.zhiqim.kernel.logging.Log;
import org.zhiqim.kernel.logging.LogFactory;
import org.zhiqim.kernel.model.codes.MD5;
import org.zhiqim.kernel.model.maps.HashMapSO;
import org.zhiqim.kernel.model.maps.TreeMapSO;
import org.zhiqim.kernel.model.results.RS;
import org.zhiqim.kernel.util.DateTimes;
import org.zhiqim.kernel.util.Ids;
import org.zhiqim.kernel.util.Longs;
import org.zhiqim.kernel.util.Randoms;
import org.zhiqim.kernel.util.Sqls;
import org.zhiqim.kernel.util.Strings;
import org.zhiqim.kernel.util.Urls;
import org.zhiqim.kernel.util.Validates;
import org.zhiqim.manager.ZmrConstants;
import org.zhiqim.manager.dbo.ZmrOperator;
import org.zhiqim.manager.dbo.ZmrOrg;
import org.zhiqim.manager.dbo.ZmrSms;
import org.zhiqim.orm.ORM;
import org.zhiqim.zml.Zmls;

/**
 * 短信数据访问对象
 *
 * @version v2023 @author zouzhigang 2023年5月27日 新建与整理
 */
public class ZmrSmsDao implements ZmrConstants
{
    private static Log log = LogFactory.getLog(ZmrSmsDao.class);
    
    /****
     * 发送短信
     * 
     * @param operatorCode  操作员
     * @param orgId         接受组织编号
     * @param smsContent    短信内容
     * @param smsRemark     短信备注
     * @throws Exception    可能的异常
     */
    public static void sendMsg(String operatorCode, long orgId, String smsContent, String smsRemark) throws Exception
    {
        ZmrOrg org = ZmrOrgDao.item(orgId);
        if (org == null)
        {
            log.error("短信接收者["+orgId+"]不存在");
            return;
        }
        
        ZmrOperator operator = ZmrOperatorDao.admin(orgId);
        if (operator == null)
        {
            log.error("短信接收者["+org.getOrgName()+"]没有管理员账号");
            return;
        }
        
        if (Validates.isEmptyBlank(operator.getOperatorMobile()))
        {
            log.error("短信接收者["+org.getOrgName()+"]未配置手机号");
            return;
        }
        
        String mobile = Strings.trim(operator.getOperatorMobile());
        if (!Validates.isIntegerPositive(mobile) || mobile.length() != 11)
        {
            log.error("短信接收者["+org.getOrgName()+"]手机号无效");
            return;
        }
        
        int sendResult = send(mobile, smsContent);
        
        ZmrSms sms = new ZmrSms();
        sms.setOperatorCode(operatorCode);
        sms.setSmsId(Ids.longId());
        sms.setSmsReceiver(orgId);
        sms.setSmsMobile(Longs.toLong(mobile));
        sms.setSmsContent(smsContent);
        sms.setSmsTime(Sqls.nowTimestamp());
        sms.setSmsResult(sendResult);
        sms.setSmsRemark(smsRemark);
        
        ORM.table().insert(sms);
    }
    
    /**
     * 发送注册成功短信
     * 
     * @param orgId                商户号
     * @throws Exception
     */
    public static void sendRegisterSuccess(long orgId) throws Exception
    {
        String smsContent = ZmrParamDao.getString(G_SMS_NAME, P_SMS_SUCCESS_MSG);
        if (Validates.isEmpty(smsContent))
        {
            log.error("系统未配置注册成功短信内容");
            return;
        }
        
        ZmrOrg org = ZmrOrgDao.item(orgId);
        if (org == null)
        {
            log.error("短信接收者["+orgId+"]不存在");
            return;
        }
        
        ZmrOperator operator = ZmrOperatorDao.admin(orgId);
        if (operator == null)
        {
            log.error("短信接收者["+org.getOrgName()+"]没有管理员账号");
            return;
        }
        
        if (Validates.isEmptyBlank(operator.getOperatorMobile()))
        {
            log.error("短信接收者["+org.getOrgName()+"]未配置手机号");
            return;
        }
        
        String mobile = Strings.trim(operator.getOperatorMobile());
        if (!Validates.isIntegerPositive(mobile) || mobile.length() != 11)
        {
            log.error("短信接收者["+org.getOrgName()+"]手机号无效");
            return;
        }
        
        int smsResult = send(mobile, smsContent);
        
        ZmrSms sms = new ZmrSms();
        sms.setOperatorCode(SYSTEM_OPERATOR_CODE);
        sms.setSmsId(Ids.longId());
        sms.setSmsReceiver(orgId);
        sms.setSmsMobile(Longs.toLong(mobile));
        sms.setSmsContent(smsContent);
        sms.setSmsTime(Sqls.nowTimestamp());
        sms.setSmsResult(smsResult);
        sms.setSmsRemark("注册成功自动发送");
        
        ORM.table().insert(sms);
    }
    
    /**
     * 发送验证码
     * 
     * @param userNumber    手机号
     * @param type          验证码类型(0:注册,1:找回密码,2:修改手机号)
     * @return              RS<String>
     */
    public static RS<String> sendVcode(String userNumber, int type)
    {
        if (!Validates.isIntegerPositive(userNumber) || userNumber.length() != 11)
        {
            log.error("手机号无效");
            return RS.error("手机号无效");
        }
        
        String smsContent = ZmrParamDao.getString(G_SMS_NAME, P_SMS_VCODE_MSG);
        if (Validates.isEmpty(smsContent))
        {
            log.error("系统未配置验证码短信内容");
            return RS.error("系统未配置验证码短信内容");
        }
        
        String vcodeType = ZmrVcodeTypeDao.name(type);
        String vcodeValue = Randoms.digits(6);
        
        HashMapSO variableMap = new HashMapSO();
        variableMap.put("vcodeType", vcodeType);
        variableMap.put("vcodeValue", vcodeValue);
        
        try
        {
            smsContent = Zmls.parse(smsContent, variableMap);
        }
        catch (Exception e)
        {
            log.error("系统配置的验证码短信内容格式不正确");
            return RS.error("系统配置的验证码短信内容格式不正确");
        }
        
        int smsResult = send(userNumber, smsContent);
        
        ZmrSms sms = new ZmrSms();
        sms.setOperatorCode(SYSTEM_OPERATOR_CODE);
        sms.setSmsId(Ids.longId());
        sms.setSmsReceiver(ROOT_ORG_ID);
        sms.setSmsMobile(Longs.toLong(userNumber));
        sms.setSmsContent(smsContent);
        sms.setSmsTime(Sqls.nowTimestamp());
        sms.setSmsResult(smsResult);
        sms.setSmsRemark(vcodeType + "验证码");
        
        ORM.tabler().insert(sms);
        
        return (smsResult == 0)?RS.value(vcodeValue):RS.error("错误码:"+smsResult);
    }
    
    /**
     * 发送短信
     * 
     * @param userNumber    手机号
     * @param content       短信内容(不带签名)
     * @return              =0表示成功,!=0表示错误码
     */
    private static int send(String userNumber, String content)
    {
        String url = ZmrParamDao.getString(G_SMS_NAME, P_SMS_URL);
        String accountId = ZmrParamDao.getString(G_SMS_NAME, P_SMS_ACCOUNT_ID);
        String accountSecret = ZmrParamDao.getString(G_SMS_NAME, P_SMS_ACCOUNT_SECRET);
        String signature = ZmrParamDao.getString(G_SMS_NAME, P_SMS_SIGNATURE);
        
        if (Validates.isEmptyBlank(url) || Validates.isEmptyBlank(accountId) || Validates.isEmptyBlank(accountSecret) || Validates.isEmptyBlank(signature))
        {//配置不正确,不支持发送
            return 1;
        }
        
        String timestamp = DateTimes.getDateTimeString();
        String sign = MD5.encodeUTF8(accountId + timestamp + accountSecret);
        
        TreeMapSO paramMap = new TreeMapSO();
        paramMap.put("accountId", accountId);
        paramMap.put("timestamp", timestamp);
        paramMap.put("sign", sign);
        paramMap.put("userNumber", userNumber);
        paramMap.put("content", "【" + signature + "】" + content);
        
        HttpPost conn = new HttpPost(url);
        conn.setQueryString(Urls.toQueryString(paramMap), _UTF_8_);
        conn.execute();
        
        if (!conn.isResponseSuccess())
        {//HTTP错误
            return conn.getResponseStatus();
        }
        
        String responseText = conn.getResponseText();
        String error = Jsons.getString(responseText, "error");
        if (Validates.isNotEmptyBlank(error))
        {//短信平台返回错误
            return Jsons.getInt(error, "code");
        }
        
        return 0;
    }
}