@cainiaofe/cn-ui-m-lowcode
Version:
472 lines (459 loc) • 12.3 kB
text/typescript
import {
calculateTextExprValue,
condition,
getRealResponse,
handleSuccessMessage,
} from '../util/util';
import isPlainObject from 'lodash/isPlainObject';
import isFunction from 'lodash/isFunction'
import { request as requestInstance } from 'cn-request';
import { formUrlencoded } from '@/common/util/const';
import qs from 'query-string';
import { CnMessage, CnDialog } from '@cainiaofe/cn-ui-m';
import {
getButtonListByPosition,
getButtonPrototypeListByPosition,
} from '@/common/manager/button';
import { getJSExpressionPrototype } from '@/common/manager/common-style';
import { getJSXTemplate } from '@/common/manager/setter-snippet';
export const __urlParams__ = '__urlParams__';
export const __record__ = '__record__';
export const __ds__ = '__ds__';
export const __blank__ = '__blank__';
export const createRequestSuccessPrototype = (position, config) => {
const { afterRequestCondition } = config || {};
const buttonList = getButtonListByPosition(position);
const buttonPrototypeList = getButtonPrototypeListByPosition(position);
const configure = [
{
name: 'optType',
title: '请求成功后',
display: 'inline',
setter: {
componentName: 'CnSelectSetter',
props: {
options: buttonList,
selectProps: {
hasClear: true,
},
},
},
},
];
if (buttonPrototypeList?.length > 0) {
configure.push({
name: 'options',
display: 'plain',
title: '按钮配置项',
setter: {
componentName: 'ObjectSetter',
props: {
config: {
items: [...buttonPrototypeList],
},
},
},
});
}
const result = {
name: 'afterRequest',
title: '请求成功后',
display: 'plain',
setter: {
componentName: 'ObjectSetter',
props: {
config: {
items: configure,
},
},
},
};
if (afterRequestCondition) {
result.condition = afterRequestCondition;
}
return result;
};
export function handleRequestParams(params, config = {}) {
let result = {};
const { flexibleParams = false } = config;
if (params && params.length > 0) {
params.forEach((item) => {
if (item) {
const { label, value } = item;
if (label && value !== undefined) {
result[label] = calculateTextExprValue(value, config);
}
}
});
} else if (typeof params === 'function') {
const temp = calculateTextExprValue(params, config);
if (isPlainObject(temp) || (isFunction(temp) && flexibleParams)) {
result = temp;
}
}
return result;
}
export function makeRequest(config) {
const { needSuccessToast = true } = config;
const {
handleParams,
buttonConfig,
record,
state,
recordDataSource,
urlParamsDataSource,
onCancel,
extraParamList,
isDesign,
position = '',
noNeedHandleResult,
_context,
getExtraParam,
} = config;
return new Promise((resolve, reject) => {
if (buttonConfig) {
const { options = {} } = buttonConfig;
const {
requestConfig,
needConfirm,
confirmInfo = {},
afterRequest,
} = options;
const sendRequest = () => {
const realUrl = requestConfig?.url;
if (realUrl) {
requestInstance(
transRequestConfigToRemote({
requestConfig,
handleParams,
state,
urlParamsDataSource,
recordDataSource,
isDesign,
extraParamList,
getExtraParam,
}),
)
.then((res) => {
let result = getRealResponse(res);
if (!noNeedHandleResult) {
result = handleResultProcessFunc2(res, requestConfig, {
state,
});
}
const { success, errorCode, errorMsg } = result;
if (success) {
if (afterRequest?.optType) {
}
resolve(result);
if (needSuccessToast) {
handleSuccessMessage(result);
}
} else {
reject(result);
CnMessage.error(
errorMsg || errorCode || `${requestConfig?.url} 请求异常`,
);
}
})
.catch((err) => {
reject(err);
});
}
};
if (needConfirm) {
const title = calculateTextExprValue(confirmInfo.title, {
urlParamsDataSource,
recordDataSource,
state,
extraParamList,
});
const content = calculateTextExprValue(confirmInfo.content, {
urlParamsDataSource,
recordDataSource,
state,
extraParamList,
});
CnDialog.confirm({
title: title || '通知',
content: content || '',
messageProps: {
className: 'l2-dialog-message-content',
},
onOk: () => {
sendRequest();
},
onCancel: () => {
onCancel && onCancel();
},
onClose: (reason) => {
if (reason !== 'ok') {
onCancel && onCancel();
}
},
// cancelProps: {
// // children: '关闭弹窗',
// },
});
} else {
sendRequest();
}
}
});
}
export const createServiceSelectPrototype = (config) => {
const {
optType,
paramSetter,
position,
paramSelectSetter,
jsExpressionSetter,
paramTitleDom,
dynamicUrlTemplate,
} = config || {};
let confirmShowType;
const hoverTip = [];
const configure = [
{
name: 'requestConfig',
title: '查询服务',
display: 'inline',
setter: {
componentName: 'ServiceChoiceSetter',
props: {
paramTitleDom,
buttonText: '选择请求API',
params: {
env: 'pre',
pageSize: 999,
// serviceType: 'HSF',
},
paramSetter,
dynamicUrlTemplate,
},
},
condition(prop) {
return condition(prop, optType, 'optType');
},
},
{
name: 'needConfirm',
title: '二次确认',
display: 'inline',
setter: {
componentName: 'BoolSetter',
},
condition(prop) {
return condition(prop, optType, 'optType');
},
},
{
name: 'confirmInfo',
display: 'plain',
title: '按钮配置项',
condition(prop) {
return condition(prop, optType, 'optType');
},
setter: {
componentName: 'ObjectSetter',
props: {
config: {
items: [
{
name: 'title',
title: '二次确认标题',
display: 'inline',
// setter: {
// componentName: 'StringSetter',
// },
setter: {
componentName: 'MixedSetter',
props: {
setters: [
{
componentName: 'CnI18nSetter',
title: '字符串',
},
paramSelectSetter,
jsExpressionSetter ||
getJSExpressionPrototype({
type: 'tableRequest',
}),
],
},
},
condition(prop) {
return condition(prop, true, 'needConfirm');
},
},
{
name: 'content',
title: '二次确认内容',
display: 'inline',
// setter: {
// componentName: 'TextAreaSetter',
// },
setter: {
componentName: 'MixedSetter',
props: {
setters: [
{
componentName: 'CnI18nSetter',
title: '字符串',
},
paramSelectSetter,
jsExpressionSetter ||
getJSExpressionPrototype({
type: 'tableRequest',
}),
getJSXTemplate({ position }),
],
},
},
condition(prop) {
return condition(prop, true, 'needConfirm');
},
},
confirmShowType,
],
},
},
},
},
];
return configure;
};
export function transRequestConfigToRemote(config = {}) {
const {
requestConfig,
handleParams,
isDesign,
urlParamsDataSource,
recordDataSource,
state,
extraParamList,
getExtraParam,
formatParam,
needFormatResult,
} = config;
if (requestConfig) {
const realUrl = requestConfig?.url;
const {
url,
params = [],
serviceType,
method,
contentType,
} = requestConfig;
const temp = {
url,
method: 'post',
data: {},
};
if (realUrl) {
temp.url = realUrl;
}
if (serviceType === 'http') {
temp.withCredentials = true;
}
if (typeof handleParams === 'function') {
temp.data = handleParams(temp.data);
}
const realParams = handleRequestParams(params, {
urlParamsDataSource,
recordDataSource,
state,
extraParamList,
getExtraParam,
flexibleParams: true,
});
if (typeof realParams === 'function') {
temp.data = realParams();
} else if (Object.keys(realParams).length > 0) {
temp.data = { ...temp.data, ...realParams };
}
if (serviceType === 'http') {
if (method) {
temp.method = method;
}
if (contentType === formUrlencoded) {
temp.headers = {
'content-type': contentType,
};
if (temp.method === 'post' && isPlainObject(temp.data)) {
temp.data = qs.stringify(temp.data);
}
}
}
if (temp.method === 'get') {
temp.params = temp.data;
delete temp.data;
}
if (formatParam) {
temp.formatParam = formatParam;
}
if (needFormatResult === true) {
temp.formatResult = handleResultProcessFunc(requestConfig);
}
return temp;
} else {
return {};
}
}
export function handleResultProcessFunc(requestConfig) {
if (requestConfig) {
const { resultProcessFunc, serviceType, mockData } = requestConfig;
if (typeof resultProcessFunc === 'function') {
return (res, state) => {
let newRes = getRealResponse(res);
try {
const temp = resultProcessFunc(newRes, state);
if (temp && temp.data && temp.success !== undefined) {
newRes = temp.data;
} else {
newRes = temp;
}
} catch (e) {
console.error('请求结果回调执行失败', e);
}
return newRes;
};
} else if (serviceType === 'mock' && isPlainObject(mockData)) {
return () => {
return mockData?.data;
};
} else {
return (res) => {
if (res?.data) {
return res.data;
}
return res;
};
}
}
}
export function handleResultProcessFunc2(response, requestConfig, extra) {
const { state } = extra || {};
let newRes = getRealResponse(response);
if (requestConfig) {
const { resultProcessFunc, serviceType, mockData } = requestConfig;
if (
typeof resultProcessFunc === 'function' &&
(serviceType === 'mokelay' || serviceType === 'http')
) {
try {
if (isPlainObject(state)) {
newRes = resultProcessFunc(newRes, state);
} else {
newRes = resultProcessFunc(newRes);
}
} catch (e) {
console.error('请求结果回调执行失败', e);
}
return newRes;
} else if (serviceType === 'mock' && isPlainObject(mockData)) {
return mockData;
}
}
return newRes;
}