fix: close admin channel test sms loop

This commit is contained in:
hectorzhao
2026-07-09 11:49:20 +08:00
parent a4a638208e
commit c58a010951
12 changed files with 582 additions and 17 deletions
+50 -1
View File
@@ -26,6 +26,7 @@ type SmsChannel = {
corpCode: string;
account: string;
accessNo: string;
cmppVersion: '2.0' | '3.0';
desiredConnections: number;
windowSize: number;
passwordCipher?: string;
@@ -68,6 +69,11 @@ const protocolOptions = [
{ label: 'SGIP', value: 'SGIP' },
];
const cmppVersionOptions = [
{ label: 'CMPP 2.0', value: '2.0' },
{ label: 'CMPP 3.0', value: '3.0' },
];
const regionOptions = [
{ label: '全国', value: '全国' },
...'北京,天津,河北,山西,内蒙古,辽宁,吉林,黑龙江,上海,江苏,浙江,安徽,福建,江西,山东,河南,湖北,湖南,广东,广西,海南,重庆,四川,贵州,云南,西藏,陕西,甘肃,青海,宁夏,新疆,香港,澳门,台湾'.split(',').map((province) => ({ label: province, value: province })),
@@ -145,6 +151,7 @@ function mapApiChannel(channel: AdminChannel, connections: CmppConnectionState[]
corpCode: channel.enterpriseCode ?? channel.code,
account: channel.account,
accessNo: channel.srcId,
cmppVersion: channel.cmppVersion === '3.0' ? '3.0' : '2.0',
desiredConnections: Number(channel.config?.desiredConnections ?? 1),
windowSize: Number(channel.config?.windowSize ?? 16),
};
@@ -165,6 +172,7 @@ function buildChannelPayload(channel: SmsChannel, passwordCipher?: string) {
account: channel.account,
passwordCipher: passwordCipher || undefined,
srcId: channel.accessNo,
cmppVersion: channel.cmppVersion,
rateLimitPerSecond: 100,
unitPrice: Math.round(channel.unitPrice),
desiredConnections: channel.desiredConnections,
@@ -201,6 +209,7 @@ function ChannelFormModal({
const [gatewayPort, setGatewayPort] = useState(channel?.gatewayPort ?? '17890');
const [corpCode, setCorpCode] = useState(channel?.corpCode ?? '');
const [account, setAccount] = useState(channel?.account ?? '');
const [cmppVersion, setCmppVersion] = useState<'2.0' | '3.0'>(channel?.cmppVersion ?? '2.0');
const [password, setPassword] = useState('');
const [accessNo, setAccessNo] = useState(channel?.accessNo ?? '');
const [extensionDigits, setExtensionDigits] = useState('0');
@@ -228,6 +237,7 @@ function ChannelFormModal({
corpCode,
account,
accessNo,
cmppVersion,
desiredConnections: Number(desiredConnections) || 1,
windowSize: Number(windowSize) || 16,
passwordCipher: password || undefined,
@@ -276,6 +286,7 @@ function ChannelFormModal({
</div>
<Input label="* 企业代码" onChange={(event) => setCorpCode(event.target.value)} placeholder="请输入企业代码" value={corpCode} />
<Input label="* 网关账号" onChange={(event) => setAccount(event.target.value)} placeholder="请输入网关账号" value={account} />
<Select label="* CMPP版本" onChange={(event) => setCmppVersion(event.target.value as '2.0' | '3.0')} options={cmppVersionOptions} value={cmppVersion} />
<Input label="* 网关密码" onChange={(event) => setPassword(event.target.value)} placeholder="请输入网关密码" type="password" value={password} />
<div className="sms-channel-inline-field">
<Input label="* 接入号" onChange={(event) => setAccessNo(event.target.value)} placeholder="请输入通道接入号" value={accessNo} />
@@ -301,14 +312,45 @@ function SmsTestModal({
const [phones, setPhones] = useState('');
const [content, setContent] = useState('');
const [accessNo, setAccessNo] = useState('');
const [submitting, setSubmitting] = useState(false);
const [error, setError] = useState('');
const [result, setResult] = useState('');
const billingCount = Math.max(1, Math.ceil(content.length / 67));
async function submitTestSms() {
if (!phones.trim()) {
setError('请输入测试手机号');
return;
}
if (!content.trim()) {
setError('请输入测试短信内容');
return;
}
setSubmitting(true);
setError('');
setResult('');
try {
const response = await adminApi.testChannel(channel.id, {
phones,
content,
accessNo: accessNo.trim() || undefined,
});
setResult(`已提交 ${response.submitted} 条测试短信,任务号 ${response.taskNo}`);
} catch (failure) {
setError(failure instanceof Error ? failure.message : '测试短信发送失败');
} finally {
setSubmitting(false);
}
}
return (
<Modal
footer={(
<>
<Button onClick={onClose} variant="ghost"></Button>
<Button icon={<Send size={16} />} onClick={onClose}></Button>
<Button disabled={submitting} icon={<Send size={16} />} onClick={submitTestSms}>
{submitting ? '发送中...' : '发送测试'}
</Button>
</>
)}
onClose={onClose}
@@ -358,6 +400,13 @@ function SmsTestModal({
<Info size={18} />
<span></span>
</div>
{error ? <p className="form-error">{error}</p> : null}
{result ? (
<div className="signature-alert sms-test-note">
<Info size={18} />
<span>{result}</span>
</div>
) : null}
</div>
</Modal>
);