558 lines
19 KiB
JavaScript
558 lines
19 KiB
JavaScript
/** 企业信息管理:前后端字段与分页格式适配 */
|
||
|
||
import { formatDate, formatDateTime, toApiDate, toApiDateTime } from "../../utils/dateFormat";
|
||
import { resolveUploadFileIds } from "../../utils/mockUpload";
|
||
import { asId, isIdFieldName, normalizeQueryIds } from "./idUtil";
|
||
import { withOrgId } from "./orgContext";
|
||
|
||
const GENDER_NAME = { 1: "男", 2: "女" };
|
||
const RESIGN_AUDIT_STATUS_NAME = { 0: "未审核", 1: "已审核", 2: "已退回" };
|
||
const ENTERPRISE_STATUS_CODE = { 正常: 1, 停业: 2, 注销: 3 };
|
||
const FILING_TYPE_CODE = { 审核备案: "1", 确认备案: "2" };
|
||
const FILING_RECORD_STATUS_CODE = { 已备案: 1, 未备案: 2 };
|
||
const PERSON_TYPE_CODE = { 基础人员: "1", 专职评价师: "2" };
|
||
|
||
function parseAttachmentUrls(urls, defaultName = "附件.pdf") {
|
||
if (!urls) {
|
||
return [];
|
||
}
|
||
return String(urls)
|
||
.split(",")
|
||
.map((url) => url.trim())
|
||
.filter(Boolean)
|
||
.map((url, index) => ({
|
||
name: `${defaultName.replace(".pdf", "")}${index + 1}.pdf`,
|
||
fileName: `${defaultName.replace(".pdf", "")}${index + 1}.pdf`,
|
||
url,
|
||
}));
|
||
}
|
||
|
||
/** 分页查询参数:子表 org_id → org_info.id;机构信息管理 getInfo 不走此方法 */
|
||
export function toPageQuery(params = {}, fieldMap = {}) {
|
||
const query = {
|
||
current: params.pageIndex ?? params.current ?? 1,
|
||
size: params.pageSize ?? params.size ?? 10,
|
||
};
|
||
Object.entries(fieldMap).forEach(([from, to]) => {
|
||
const value = params[from];
|
||
if (value !== undefined && value !== null && value !== "") {
|
||
query[to] = isIdFieldName(to) ? asId(value) : value;
|
||
}
|
||
});
|
||
return withOrgId(normalizeQueryIds(query));
|
||
}
|
||
|
||
export function fromPageResponse(res, mapItem) {
|
||
if (!res) {
|
||
return { success: false, data: [], totalCount: 0 };
|
||
}
|
||
const list = Array.isArray(res.data) ? res.data : [];
|
||
return {
|
||
...res,
|
||
data: mapItem ? list.map(mapItem) : list,
|
||
totalCount: res.totalCount ?? res.total ?? list.length,
|
||
};
|
||
}
|
||
|
||
export function fromSingleResponse(res, mapItem) {
|
||
if (!res) {
|
||
return { success: false, data: null };
|
||
}
|
||
return {
|
||
...res,
|
||
data: res.data && mapItem ? mapItem(res.data) : res.data,
|
||
};
|
||
}
|
||
|
||
function pick(obj, keys) {
|
||
const next = {};
|
||
keys.forEach((key) => {
|
||
if (obj[key] !== undefined) {
|
||
next[key] = isIdFieldName(key) ? asId(obj[key]) : obj[key];
|
||
}
|
||
});
|
||
return next;
|
||
}
|
||
|
||
// ─── 机构信息 ───
|
||
|
||
export function toOrgInfoForm(data = {}) {
|
||
return {
|
||
id: asId(data.id),
|
||
orgName: data.unitName,
|
||
creditCode: data.creditCode,
|
||
safetyIndustryCategory: data.safetyIndustryCategoryName,
|
||
regionCountyName: data.districtName,
|
||
regionStreetName: data.townStreet,
|
||
regionCommunityName: data.villageCommunity,
|
||
longitude: data.longitude,
|
||
latitude: data.latitude,
|
||
registerAddress: data.registerAddress,
|
||
businessAddress: data.businessAddress,
|
||
ownershipType: data.ownershipTypeName,
|
||
gbIndustryCode: data.economyIndustryCode,
|
||
legalRepresentative: data.legalRepresentative,
|
||
legalRepPhone: data.legalRepresentativePhone,
|
||
principal: data.principalName,
|
||
principalPhone: data.principalPhone,
|
||
safetyDeptHead: data.safetyDeptManager,
|
||
safetyDeptPhone: data.safetyDeptManagerPhone,
|
||
safetyVpPhone: data.safetyDeputyPhone,
|
||
productionDate: data.productionDate,
|
||
businessStatus: data.businessStatusName,
|
||
disclosureUrl: data.infoDisclosureUrl,
|
||
workplaceArea: data.workplaceArea,
|
||
archiveRoomArea: data.archiveRoomArea,
|
||
fullTimeEvaluatorCount: data.fulltimeEvaluatorCount,
|
||
registeredSafetyEngineerCount: data.registeredEngineerCount,
|
||
authStatusCode: data.authStatusCode,
|
||
enterpriseStatus: data.enterpriseStatusName,
|
||
enterpriseScale: data.enterpriseScaleName,
|
||
filingType: data.filingTypeName ?? "确认备案",
|
||
filingRecordStatus: data.filingRecordStatusName ?? "未备案",
|
||
attachments: parseAttachmentUrls(data.attachmentUrls),
|
||
};
|
||
}
|
||
|
||
export function fromOrgInfoForm(values = {}, options = {}) {
|
||
const { isDraft = false } = options;
|
||
const enterpriseStatus = values.enterpriseStatus;
|
||
const filingType = values.filingType ?? "确认备案";
|
||
const filingRecordStatus = values.filingRecordStatus ?? "未备案";
|
||
return {
|
||
...pick(values, ["id", "tenantId"]),
|
||
unitName: values.orgName,
|
||
creditCode: values.creditCode,
|
||
safetyIndustryCategoryName: values.safetyIndustryCategory,
|
||
districtCode: values.regionCountyName,
|
||
districtName: values.regionCountyName,
|
||
townStreet: values.regionStreetName,
|
||
villageCommunity: values.regionCommunityName,
|
||
longitude: values.longitude,
|
||
latitude: values.latitude,
|
||
registerAddress: values.registerAddress,
|
||
businessAddress: values.businessAddress,
|
||
ownershipTypeName: values.ownershipType,
|
||
economyIndustryCode: values.gbIndustryCode,
|
||
legalRepresentative: values.legalRepresentative,
|
||
legalRepresentativePhone: values.legalRepPhone,
|
||
principalName: values.principal,
|
||
principalPhone: values.principalPhone,
|
||
safetyDeptManager: values.safetyDeptHead,
|
||
safetyDeptManagerPhone: values.safetyDeptPhone,
|
||
safetyDeputyPhone: values.safetyVpPhone,
|
||
productionDate: values.productionDate,
|
||
businessStatusName: values.businessStatus,
|
||
infoDisclosureUrl: values.disclosureUrl,
|
||
workplaceArea: values.workplaceArea,
|
||
archiveRoomArea: values.archiveRoomArea,
|
||
fulltimeEvaluatorCount: values.fullTimeEvaluatorCount,
|
||
registeredEngineerCount: values.registeredSafetyEngineerCount,
|
||
authStatusCode: isDraft ? 0 : 1,
|
||
authStatusName: isDraft ? "草稿" : "已提交",
|
||
enterpriseStatusCode: ENTERPRISE_STATUS_CODE[enterpriseStatus],
|
||
enterpriseStatusName: enterpriseStatus,
|
||
enterpriseScaleCode: values.enterpriseScale,
|
||
enterpriseScaleName: values.enterpriseScale,
|
||
filingTypeCode: FILING_TYPE_CODE[filingType] ?? filingType,
|
||
filingTypeName: filingType,
|
||
filingRecordStatusCode: FILING_RECORD_STATUS_CODE[filingRecordStatus],
|
||
filingRecordStatusName: filingRecordStatus,
|
||
attachmentUrls: resolveUploadFileIds(values.attachments),
|
||
};
|
||
}
|
||
|
||
// ─── 部门 / 岗位 ───
|
||
|
||
export function toDepartmentForm(data = {}) {
|
||
return {
|
||
id: asId(data.id),
|
||
parentId: asId(data.parentId),
|
||
deptName: data.deptName,
|
||
leaderName: data.managerName,
|
||
leaderAccount: data.managerAccount,
|
||
deptLevel: data.deptLevelName ?? data.deptLevelCode,
|
||
};
|
||
}
|
||
|
||
export function fromDepartmentForm(values = {}) {
|
||
return {
|
||
...pick(values, ["id", "parentId", "tenantId"]),
|
||
deptName: values.deptName,
|
||
managerName: values.leaderName,
|
||
managerAccount: values.leaderAccount,
|
||
deptLevelName: values.deptLevel,
|
||
deptLevelCode: values.deptLevel,
|
||
};
|
||
}
|
||
|
||
export function buildDepartmentTree(departments = []) {
|
||
const map = new Map();
|
||
departments.forEach((item) => {
|
||
map.set(asId(item.id), { ...toDepartmentForm(item), children: [] });
|
||
});
|
||
const roots = [];
|
||
departments.forEach((item) => {
|
||
const node = map.get(asId(item.id));
|
||
const parentId = asId(item.parentId);
|
||
if (parentId != null && parentId !== "0" && map.has(parentId)) {
|
||
map.get(parentId).children.push(node);
|
||
}
|
||
else {
|
||
roots.push(node);
|
||
}
|
||
});
|
||
return roots;
|
||
}
|
||
|
||
export function toPositionForm(data = {}) {
|
||
return {
|
||
id: asId(data.id),
|
||
deptId: asId(data.deptId),
|
||
deptName: data.deptName,
|
||
positionName: data.positionName,
|
||
dutyDesc: data.dutyDesc,
|
||
remark: data.remark ?? data.remarks,
|
||
};
|
||
}
|
||
|
||
export function fromPositionForm(values = {}) {
|
||
return {
|
||
...pick(values, ["id", "tenantId"]),
|
||
deptId: asId(values.deptId),
|
||
positionName: values.positionName,
|
||
dutyDesc: values.dutyDesc,
|
||
remark: values.remark,
|
||
};
|
||
}
|
||
|
||
// ─── 人员 ───
|
||
|
||
export function toStaffForm(data = {}) {
|
||
return {
|
||
id: asId(data.id),
|
||
staffName: data.userName,
|
||
account: data.account,
|
||
gender: data.genderCode,
|
||
birthDate: data.birthDate,
|
||
deptId: asId(data.deptId),
|
||
positionId: asId(data.postId),
|
||
idCardNo: data.idCardNo,
|
||
homeAddress: data.currentAddress,
|
||
officeAddress: data.officeAddress,
|
||
educationType: data.educationTypeName,
|
||
educationLevel: data.educationLevelName,
|
||
education: data.educationName ?? data.educationCode,
|
||
graduateSchool: data.graduateSchool,
|
||
major: data.major,
|
||
employmentStatus: data.employmentStatusCode,
|
||
personType: data.personTypeName ?? "基础人员",
|
||
qualScope: data.qualScope,
|
||
professionalLevel: data.professionalLevelName,
|
||
evaluatorCertNo: data.evaluatorCertNo,
|
||
titleName: data.titleName,
|
||
registerEngineerFlag: data.registerEngineerFlag ?? 2,
|
||
publications: data.publications,
|
||
abilityDeclaration: data.abilityDeclaration,
|
||
workExperience: data.workExperience,
|
||
proofMaterials: parseAttachmentUrls(data.proofMaterialUrl, "专业能力证明.pdf"),
|
||
deptName: data.deptName,
|
||
positionName: data.postName ?? data.positionName,
|
||
certNames: data.certNames,
|
||
};
|
||
}
|
||
|
||
export function fromStaffForm(values = {}) {
|
||
const genderCode = values.gender;
|
||
const personType = values.personType ?? "基础人员";
|
||
const educationType = values.educationType;
|
||
const educationLevel = values.educationLevel;
|
||
const educationName = educationType && educationLevel
|
||
? `${educationType}-${educationLevel}`
|
||
: values.education;
|
||
return {
|
||
...pick(values, ["id", "tenantId"]),
|
||
userName: values.staffName,
|
||
account: values.account,
|
||
genderCode,
|
||
genderName: GENDER_NAME[genderCode] ?? values.genderName,
|
||
birthDate: toApiDate(values.birthDate),
|
||
deptId: asId(values.deptId),
|
||
postId: asId(values.positionId ?? values.postId),
|
||
idCardNo: values.idCardNo,
|
||
currentAddress: values.homeAddress,
|
||
officeAddress: values.officeAddress,
|
||
educationName,
|
||
educationCode: educationName,
|
||
educationTypeCode: educationType,
|
||
educationTypeName: educationType,
|
||
educationLevelCode: educationLevel,
|
||
educationLevelName: educationLevel,
|
||
graduateSchool: values.graduateSchool,
|
||
major: values.major,
|
||
employmentStatusCode: values.employmentStatus ?? 1,
|
||
employmentStatusName: values.employmentStatus === 2 ? "离职" : "在职",
|
||
personTypeCode: PERSON_TYPE_CODE[personType] ?? personType,
|
||
personTypeName: personType,
|
||
qualScope: values.qualScope,
|
||
professionalLevelCode: values.professionalLevel,
|
||
professionalLevelName: values.professionalLevel,
|
||
evaluatorCertNo: values.evaluatorCertNo,
|
||
titleName: values.titleName,
|
||
registerEngineerFlag: values.registerEngineerFlag ?? 2,
|
||
publications: values.publications,
|
||
abilityDeclaration: values.abilityDeclaration,
|
||
workExperience: values.workExperience,
|
||
proofMaterialUrl: resolveUploadFileIds(values.proofMaterials),
|
||
};
|
||
}
|
||
|
||
// ─── 人员证书 ───
|
||
|
||
export function toStaffCertForm(data = {}) {
|
||
const certImgs = data.certAttachmentUrl
|
||
? [{ url: data.certAttachmentUrl, fileName: data.certName }]
|
||
: data.certImgFiles || [];
|
||
return {
|
||
id: asId(data.id),
|
||
staffId: asId(data.personnelId),
|
||
certName: data.certName,
|
||
certCategory: data.certCategoryName ?? data.certCategoryCode,
|
||
certWorkCategory: data.operationCategoryName ?? data.operationCategoryCode,
|
||
certNo: data.certNo,
|
||
issueOrg: data.issueOrg,
|
||
validStartDate: data.validStartDate,
|
||
validEndDate: data.validEndDate,
|
||
reviewDate: data.reviewDate,
|
||
certImgFiles: certImgs,
|
||
certImgs,
|
||
};
|
||
}
|
||
|
||
export function fromStaffCertForm(values = {}) {
|
||
const certAttachmentUrl = values.certAttachmentUrl
|
||
|| values.certImgs?.[0]?.url
|
||
|| values.certImgFiles?.[0]?.url;
|
||
return {
|
||
...pick(values, ["id", "tenantId"]),
|
||
personnelId: asId(values.staffId),
|
||
certName: values.certName,
|
||
certCategoryName: values.certCategory,
|
||
certCategoryCode: values.certCategory,
|
||
operationCategoryName: values.certWorkCategory,
|
||
operationCategoryCode: values.certWorkCategory,
|
||
certNo: values.certNo,
|
||
issueOrg: values.issueOrg,
|
||
validStartDate: values.validStartDate,
|
||
validEndDate: values.validEndDate,
|
||
reviewDate: values.reviewDate,
|
||
certAttachmentUrl,
|
||
};
|
||
}
|
||
|
||
// ─── 机构资质证书 ───
|
||
|
||
/** 资质证书 enableFlag(1启用/2禁用) ↔ 前端 enableStatus(1启用/0禁用) */
|
||
export function mapQualificationEnableStatus(flag) {
|
||
return Number(flag) === 1 ? 1 : 0;
|
||
}
|
||
|
||
export function mapQualificationEnableFlag(status) {
|
||
return Number(status) === 1 ? 1 : 2;
|
||
}
|
||
|
||
/** 列表/表单统一判断:优先 enableFlag,兼容 enableStatus */
|
||
export function isQualificationEnabled(record = {}) {
|
||
const flag = record.enableFlag ?? record.enableStatus;
|
||
return mapQualificationEnableStatus(flag) === 1;
|
||
}
|
||
|
||
export function toQualificationForm(data = {}) {
|
||
const certImgs = data.certImageUrl
|
||
? [{ url: data.certImageUrl, fileName: data.certName }]
|
||
: data.certImgFiles || [];
|
||
return {
|
||
id: asId(data.id),
|
||
certType: data.licenseTypeName ?? data.licenseTypeCode,
|
||
certName: data.certName,
|
||
certNo: data.certNo,
|
||
issueOrg: data.issueOrg,
|
||
issueDate: data.issueDate,
|
||
validStartDate: data.validStartDate,
|
||
validEndDate: data.validEndDate,
|
||
remark: data.remark ?? data.remarks,
|
||
enableFlag: data.enableFlag,
|
||
enableStatus: mapQualificationEnableStatus(data.enableFlag),
|
||
issueDate: formatDate(data.issueDate),
|
||
validStartDate: formatDate(data.validStartDate),
|
||
validEndDate: formatDate(data.validEndDate),
|
||
certImgFiles: certImgs,
|
||
certImgs,
|
||
};
|
||
}
|
||
|
||
export function fromQualificationForm(values = {}) {
|
||
const certImageUrl = values.certImageUrl
|
||
|| values.certImgs?.[0]?.url
|
||
|| values.certImgFiles?.[0]?.url;
|
||
return {
|
||
...pick(values, ["id", "tenantId"]),
|
||
licenseTypeName: values.certType,
|
||
licenseTypeCode: values.certType,
|
||
certName: values.certName,
|
||
certNo: values.certNo,
|
||
issueOrg: values.issueOrg,
|
||
issueDate: toApiDate(values.issueDate),
|
||
validStartDate: toApiDate(values.validStartDate ?? values.validDate?.[0]),
|
||
validEndDate: toApiDate(values.validEndDate ?? values.validDate?.[1]),
|
||
certImageUrl,
|
||
remark: values.remark,
|
||
enableFlag: mapQualificationEnableFlag(values.enableStatus),
|
||
};
|
||
}
|
||
|
||
// ─── 装备 ───
|
||
|
||
/** 装备 enableFlag(1启用/2禁用) ↔ 前端 enableStatus(1启用/0禁用) */
|
||
export function mapEquipEnableStatus(flag) {
|
||
return Number(flag) === 1 ? 1 : 0;
|
||
}
|
||
|
||
export function mapEquipEnableFlag(status) {
|
||
return Number(status) === 1 ? 1 : 2;
|
||
}
|
||
|
||
export function isEquipEnabled(record = {}) {
|
||
const flag = record.enableFlag ?? record.enableStatus;
|
||
return mapEquipEnableStatus(flag) === 1;
|
||
}
|
||
|
||
export function toEquipForm(data = {}) {
|
||
const instrumentType = data.instrumentTypeName ?? data.instrumentTypeCode;
|
||
return {
|
||
id: asId(data.id),
|
||
instrumentType,
|
||
instrumentCategory: instrumentType,
|
||
deviceType: data.deviceTypeName ?? data.deviceTypeCode,
|
||
deviceName: data.deviceName,
|
||
model: data.deviceModel,
|
||
flowDesc: data.flowDesc,
|
||
manufacturer: data.manufacturer,
|
||
minFlow: data.minFlow,
|
||
maxFlow: data.maxFlow,
|
||
calibrationUnit: data.calibrationUnit,
|
||
calibrationInitialValue: data.calibrationInitValue,
|
||
onSiteCalibrationType: data.fieldCalibrationTypeName ?? data.fieldCalibrationTypeCode,
|
||
isDualChannel: data.dualChannelFlag,
|
||
enableFlag: data.enableFlag,
|
||
enableStatus: mapEquipEnableStatus(data.enableFlag),
|
||
};
|
||
}
|
||
|
||
export function fromEquipForm(values = {}) {
|
||
return {
|
||
...pick(values, ["id", "tenantId"]),
|
||
deviceName: values.deviceName,
|
||
deviceModel: values.model,
|
||
instrumentTypeName: values.instrumentCategory,
|
||
instrumentTypeCode: values.instrumentCategory,
|
||
deviceTypeName: values.deviceType,
|
||
deviceTypeCode: values.deviceType,
|
||
manufacturer: values.manufacturer,
|
||
flowDesc: values.flowDesc,
|
||
minFlow: values.minFlow,
|
||
maxFlow: values.maxFlow,
|
||
calibrationUnit: values.calibrationUnit,
|
||
calibrationInitValue: values.calibrationInitialValue,
|
||
fieldCalibrationTypeName: values.onSiteCalibrationType,
|
||
fieldCalibrationTypeCode: values.onSiteCalibrationType,
|
||
dualChannelFlag: values.isDualChannel,
|
||
enableFlag: mapEquipEnableFlag(values.enableStatus),
|
||
};
|
||
}
|
||
|
||
// ─── 人员变更 / 离职 ───
|
||
|
||
export function toChangeLogForm(data = {}) {
|
||
return {
|
||
id: asId(data.id),
|
||
staffId: asId(data.personnelId),
|
||
changeItem: data.changeItem,
|
||
changeTime: formatDateTime(data.changeTime),
|
||
createBy: data.operatorName,
|
||
};
|
||
}
|
||
|
||
export function toResignApplyForm(data = {}) {
|
||
const auditStatus = data.auditStatusCode ?? data.auditStatus ?? 0;
|
||
return {
|
||
id: asId(data.id),
|
||
personnelId: asId(data.personnelId),
|
||
applicantName: data.applicantName,
|
||
applyTime: formatDateTime(data.applyTime),
|
||
expectedLeaveDate: formatDate(data.expectedResignDate),
|
||
leaveReason: data.resignReason,
|
||
remark: data.remark ?? data.remarks,
|
||
rejectReason: data.rejectReason,
|
||
auditStatus,
|
||
auditStatusName: data.auditStatusName ?? RESIGN_AUDIT_STATUS_NAME[auditStatus] ?? "未审核",
|
||
attachmentId: data.reportFileUrl,
|
||
account: data.account,
|
||
deptName: data.deptName,
|
||
};
|
||
}
|
||
|
||
export function fromResignApplyForm(values = {}) {
|
||
return {
|
||
...pick(values, ["id", "tenantId"]),
|
||
personnelId: asId(values.personnelId),
|
||
applicantName: values.applicantName,
|
||
applyTime: toApiDateTime(values.applyTime),
|
||
expectedResignDate: toApiDate(values.expectedLeaveDate),
|
||
resignReason: values.leaveReason,
|
||
remark: values.remark,
|
||
reportFileUrl: values.attachmentId ?? values.reportFileUrl,
|
||
auditStatusCode: values.auditStatus ?? 0,
|
||
auditStatusName: values.auditStatus === 1 ? "已审核" : values.auditStatus === 2 ? "已退回" : "未审核",
|
||
};
|
||
}
|
||
|
||
export function fromResignAuditForm(values = {}) {
|
||
const auditStatus = values.auditStatus;
|
||
return {
|
||
id: asId(values.id),
|
||
personnelId: asId(values.personnelId),
|
||
auditStatusCode: auditStatus,
|
||
auditStatusName: auditStatus === 1 ? "已审核" : auditStatus === 2 ? "已退回" : "未审核",
|
||
rejectReason: values.rejectReason,
|
||
};
|
||
}
|
||
|
||
export function toStaffChangeSummary(personnel = {}) {
|
||
const employmentCode = Number(personnel.employmentStatusCode ?? personnel.employmentStatus ?? 1);
|
||
const hasResignApply = personnel.resignApplyId != null && personnel.resignApplyId !== "";
|
||
const resignStatusRaw = personnel.resignAuditStatus;
|
||
let resignStatus = null;
|
||
if (hasResignApply) {
|
||
resignStatus = resignStatusRaw === null || resignStatusRaw === undefined
|
||
? 0
|
||
: Number(resignStatusRaw);
|
||
}
|
||
return {
|
||
id: asId(personnel.id),
|
||
staffId: asId(personnel.id),
|
||
account: personnel.account,
|
||
staffName: personnel.userName ?? personnel.staffName,
|
||
deptName: personnel.deptName || "",
|
||
employmentStatus: employmentCode,
|
||
employmentStatusCode: employmentCode,
|
||
employmentStatusName: personnel.employmentStatusName
|
||
|| (employmentCode === 2 ? "离职" : "在职"),
|
||
changeCount: Number(personnel.changeCount ?? 0),
|
||
resignApplyId: asId(personnel.resignApplyId),
|
||
resignAuditStatus: resignStatus,
|
||
resignAuditStatusName: personnel.resignAuditStatusName
|
||
?? (resignStatus !== null ? RESIGN_AUDIT_STATUS_NAME[resignStatus] : undefined),
|
||
};
|
||
}
|