实践站接口对接调试

parent 49359afc
......@@ -2,226 +2,37 @@
"1": {
"id": 1,
"姓名": "未知用户",
"操作时间": "2026-05-25",
"操作时间": "2026-06-03",
"操作动作": "系统访问",
"操作模块": "系统接口",
"操作描述": "访问系统接口: GET /ssk (11170ms)",
"操作描述": "访问系统接口: POST /secondPhase/workstation/popup (4804ms)",
"操作状态": "成功"
},
"2": {
"id": 2,
"姓名": "未知用户",
"操作时间": "2026-05-25",
"操作时间": "2026-06-03",
"操作动作": "系统访问",
"操作模块": "系统接口",
"操作描述": "访问系统接口: GET /ssk/jjxmz (1164ms)",
"操作描述": "访问系统接口: POST /secondPhase/workstation/popup (4969ms)",
"操作状态": "成功"
},
"3": {
"id": 3,
"姓名": "未知用户",
"操作时间": "2026-05-25",
"操作时间": "2026-06-03",
"操作动作": "系统访问",
"操作模块": "系统接口",
"操作描述": "访问系统接口: GET /ssk/gfjbqs (1263ms)",
"操作描述": "访问系统接口: POST /secondPhase/workstation/popup (4870ms)",
"操作状态": "成功"
},
"4": {
"id": 4,
"姓名": "未知用户",
"操作时间": "2026-05-25",
"操作时间": "2026-06-03",
"操作动作": "系统访问",
"操作模块": "系统接口",
"操作描述": "访问系统接口: POST /ssk/ybqkqs (1253ms)",
"操作状态": "成功"
},
"5": {
"id": 5,
"姓名": "未知用户",
"操作时间": "2026-05-25",
"操作动作": "系统访问",
"操作模块": "系统接口",
"操作描述": "访问系统接口: POST /ssk/jrsbxx (3216ms)",
"操作状态": "成功"
},
"6": {
"id": 6,
"姓名": "未知用户",
"操作时间": "2026-05-25",
"操作动作": "系统访问",
"操作模块": "系统接口",
"操作描述": "访问系统接口: GET /ssk/map (2046ms)",
"操作状态": "成功"
},
"7": {
"id": 7,
"姓名": "未知用户",
"操作时间": "2026-05-25",
"操作动作": "系统访问",
"操作模块": "系统接口",
"操作描述": "访问系统接口: GET /ssk/cityname (2147ms)",
"操作状态": "成功"
},
"8": {
"id": 8,
"姓名": "未知用户",
"操作时间": "2026-05-25",
"操作动作": "系统访问",
"操作模块": "系统接口",
"操作描述": "访问系统接口: POST /ssk/jrsbxx (628ms)",
"操作状态": "成功"
},
"9": {
"id": 9,
"姓名": "未知用户",
"操作时间": "2026-05-25",
"操作动作": "系统访问",
"操作模块": "系统接口",
"操作描述": "访问系统接口: POST /ssk/ybqkqs (1282ms)",
"操作状态": "成功"
},
"10": {
"id": 10,
"姓名": "未知用户",
"操作时间": "2026-05-25",
"操作动作": "系统访问",
"操作模块": "系统接口",
"操作描述": "访问系统接口: GET /qsnkjcxsjgzz (1227ms)",
"操作状态": "成功"
},
"11": {
"id": 11,
"姓名": "未知用户",
"操作时间": "2026-05-25",
"操作动作": "系统访问",
"操作模块": "系统接口",
"操作描述": "访问系统接口: GET /qsnkjcxsjgzz (1188ms)",
"操作状态": "成功"
},
"12": {
"id": 12,
"姓名": "未知用户",
"操作时间": "2026-05-25",
"操作动作": "系统访问",
"操作模块": "系统接口",
"操作描述": "访问系统接口: GET /qsnkjcxsjgzz (1225ms)",
"操作状态": "成功"
},
"13": {
"id": 13,
"姓名": "未知用户",
"操作时间": "2026-05-25",
"操作动作": "系统访问",
"操作模块": "系统接口",
"操作描述": "访问系统接口: POST /ssk/ybqkqs (1228ms)",
"操作状态": "成功"
},
"14": {
"id": 14,
"姓名": "未知用户",
"操作时间": "2026-05-25",
"操作动作": "系统访问",
"操作模块": "系统接口",
"操作描述": "访问系统接口: POST /ssk/jrsbxx (1296ms)",
"操作状态": "成功"
},
"15": {
"id": 15,
"姓名": "未知用户",
"操作时间": "2026-05-25",
"操作动作": "系统访问",
"操作模块": "系统接口",
"操作描述": "访问系统接口: POST /ssk/jrsbxx (620ms)",
"操作状态": "成功"
},
"16": {
"id": 16,
"姓名": "未知用户",
"操作时间": "2026-05-26",
"操作动作": "系统访问",
"操作模块": "系统接口",
"操作描述": "访问系统接口: GET /ssk (9939ms)",
"操作状态": "成功"
},
"17": {
"id": 17,
"姓名": "未知用户",
"操作时间": "2026-05-26",
"操作动作": "系统访问",
"操作模块": "系统接口",
"操作描述": "访问系统接口: POST /ssk/ybqkqs (1119ms)",
"操作状态": "成功"
},
"18": {
"id": 18,
"姓名": "未知用户",
"操作时间": "2026-05-26",
"操作动作": "系统访问",
"操作模块": "系统接口",
"操作描述": "访问系统接口: GET /ssk/jjxmz (655ms)",
"操作状态": "成功"
},
"19": {
"id": 19,
"姓名": "未知用户",
"操作时间": "2026-05-26",
"操作动作": "系统访问",
"操作模块": "系统接口",
"操作描述": "访问系统接口: GET /ssk/gfjbqs (565ms)",
"操作状态": "成功"
},
"20": {
"id": 20,
"姓名": "未知用户",
"操作时间": "2026-05-26",
"操作动作": "系统访问",
"操作模块": "系统接口",
"操作描述": "访问系统接口: POST /ssk/jrsbxx (2370ms)",
"操作状态": "成功"
},
"21": {
"id": 21,
"姓名": "未知用户",
"操作时间": "2026-05-26",
"操作动作": "系统访问",
"操作模块": "系统接口",
"操作描述": "访问系统接口: GET /ssk/map (1167ms)",
"操作状态": "成功"
},
"22": {
"id": 22,
"姓名": "未知用户",
"操作时间": "2026-05-26",
"操作动作": "系统访问",
"操作模块": "系统接口",
"操作描述": "访问系统接口: GET /ssk/cityname (1952ms)",
"操作状态": "成功"
},
"23": {
"id": 23,
"姓名": "未知用户",
"操作时间": "2026-05-26",
"操作动作": "系统访问",
"操作模块": "系统接口",
"操作描述": "访问系统接口: POST /ssk/jrsbxx (604ms)",
"操作状态": "成功"
},
"24": {
"id": 24,
"姓名": "未知用户",
"操作时间": "2026-05-26",
"操作动作": "系统访问",
"操作模块": "系统接口",
"操作描述": "访问系统接口: POST /ssk/ybqkqs (632ms)",
"操作状态": "成功"
},
"25": {
"id": 25,
"姓名": "未知用户",
"操作时间": "2026-05-26",
"操作动作": "系统访问",
"操作模块": "系统接口",
"操作描述": "访问系统接口: POST /ssk/ybqkqs (581ms)",
"操作描述": "访问系统接口: POST /secondPhase/workstation/popup (5001ms)",
"操作状态": "成功"
}
}
\ No newline at end of file
/**
* 上海市青少年科学创新实践工作站弹窗
* 有修改
*/
import { SysError } from "../../util/bizError";
import { SYSTEMERRORENUM } from "../../config/enum";
import { SJZENUM, SJZSIGNENUM } from "../../config/appIdConfig";
import { postDataDianXin } from "../../util/request";
export async function getData(req, res) {
let wsid = req.body.id || "";
if (!wsid) throw new SysError(SYSTEMERRORENUM.参数错误, '工作站id为空');
let ret:any = {};
// 地图弹窗相关
let jcsj: any = await postDataDianXin(SJZENUM.中间地图_地图弹窗工作站基本信息, SJZSIGNENUM.中间地图_地图弹窗工作站基本信息);
let jcsjsl: any = await postDataDianXin(SJZENUM.地图弹窗_老师数量和学生数量和课题数量, SJZSIGNENUM.地图弹窗_老师数量和学生数量和课题数量);
let xsxkjd: any = await postDataDianXin(SJZENUM.地图弹窗_已选课程学生数和未选课程学生数, SJZSIGNENUM.地图弹窗_已选课程学生数和未选课程学生数);
// 地图弹窗工作站基本信息
// "dataList":[{"key":"名称","value":"上海工程技术大学交通运输工程实践工作站"},{"key":"地址","value":"上海市松江区龙腾路333号"}
// ,{"key":"学科","value":"工程(机械)"},{"key":"所辖实践点","value":["上海市徐汇中学","上海市控江中学","上海市曹杨第二中学","上海晋元高级中学"]}]
let jcsjData: any = { "title": "工作站弹窗基础数据", "count": 4 };
let dataList = [];
let jcsjList = jcsj.data.filter((item: any) => item.gzzid === wsid);
let sjdmcList = jcsjList.map((item) => item.sjdmc);
let jcsjItem = jcsjList ? jcsjList[0] : {};
if (jcsjItem) {
dataList.push({ key: "名称", value: jcsjItem.gzzmc, unit: "" });
dataList.push({ key: "地址", value: jcsjItem.gzzdz, unit: "" });
dataList.push({ key: "学科", value: jcsjItem.xkmc, unit: "" });
dataList.push({ key: "所辖实践点", value: sjdmcList });
}
jcsjData.dataList = dataList;
ret["jcsj"] = jcsjData;
// 地图弹窗老师数量和学生数量和课题数量
// [{"gzzid":"06835EC20A6A93B558E72350D25E2C4E","gzzmc":"上海交通大学创新设计实践工作站","jssl":"23","xssl":"120","ktsl":"10"}]
// "jcsjsl":{"title":"基础数据数量","dataList":[{"key":"老师数量","value":"48"},{"key":"学生数量","value":0},{"key":"课题数量","value":0}],"count":3}
let jcsjslData: any = { "title": "基础数据数量", "count": 3 };
let jcsjslList = [];
let jcsjslItem = jcsjsl.data.find((item: any) => item.gzzid === wsid);
if (jcsjslItem) {
jcsjslList.push({ key: "老师数量", value: jcsjslItem.jssl, unit: "" });
jcsjslList.push({ key: "学生数量", value: jcsjslItem.xssl, unit: "" });
jcsjslList.push({ key: "课题数量", value: jcsjslItem.ktsl, unit: "" });
}
jcsjslData.dataList = jcsjslList;
ret["jcsjsl"] = jcsjslData;
// 已选课程学生数和未选课程学生数
// [{"gzzid":"069AA893808D4E379D55F8165AE52260","gzzmc":"华东师范大学地理科学实践工作站","yxkcxss":"12","wxkcxss":"108"}]
// "xsxkjd":{"title":"学生选课进度","dataList":[{"key":"已选课程学生数","value":99,"unit":""},{"key":"未选课程学生数","value":0,"unit":""}],"total":99,"count":2}
let xsxkjdData: any = { "title": "学生选课进度", "count": 2 };
let xsxkjdList = [];
let xsxkjdItem = xsxkjd.data.find((item: any) => item.gzzid === wsid);
if (xsxkjdItem) {
xsxkjdList.push({ key: "已选课程学生数", value: xsxkjdItem.yxkcxss, unit: "" });
xsxkjdList.push({ key: "未选课程学生数", value: xsxkjdItem.wxkcxss, unit: "" });
xsxkjdData.total = parseInt(xsxkjdItem.yxkcxss) + parseInt(xsxkjdItem.wxkcxss);
}
xsxkjdData.dataList = xsxkjdList;
ret["xsxkjd"] = xsxkjdData;
let xssjktyjjd: any = await postDataDianXin(SJZENUM.地图弹窗_市级课题研究进度_各工作站课题数, SJZSIGNENUM.地图弹窗_市级课题研究进度_各工作站课题数);
let ktgjdsl: any = await postDataDianXin(SJZENUM.地图弹窗_市级课题研究进度_课题各阶段数量, SJZSIGNENUM.地图弹窗_市级课题研究进度_课题各阶段数量);
// 各工作站课题数
// [{"gzzid":"06835EC20A6A93B558E72350D25E2C4E","gzzmc":"上海交通大学创新设计实践工作站","ktsl":"10"}]
// "gzzkts":{"title":"各工作站课题数","dataList":[{"key":"课题数量","value":10,"unit":""}],"count":1}
let gzzktsData: any = { "title": "各工作站课题数", "count": 1 };
let gzzktsList = [];
let gzzktsItem = xssjktyjjd.data.find((item: any) => item.gzzid === wsid);
if (gzzktsItem) {
gzzktsList.push({ key: "课题数量", value: gzzktsItem.ktsl, unit: "" });
}
gzzktsData.dataList = gzzktsList;
ret["gzzkts"] = gzzktsData;
// 课题各阶段数量
// [{"gzzid":"06835EC20A6A93B558E72350D25E2C4E","gzzmc":"上海交通大学创新设计实践工作站","ktjd1":"2","ktjd2":"3","ktjd3":"5"}]
// "ktgjdsl":{"title":"课题各阶段数量","dataList":[{"key":"第一阶段","value":2,"unit":""},{"key":"第二阶段","value":3,"unit":""},{"key":"第三阶段","value":5,"unit":""}],"count":3}
let ktgjdslData: any = { "title": "课题各阶段数量", "count": 3 };
let ktgjdslList = [];
let ktgjdslItem = ktgjdsl.data.find((item: any) => item.gzzid === wsid);
if (ktgjdslItem) {
ktgjdslList.push({ key: "第一阶段", value: ktgjdslItem.ktjd1, unit: "" });
ktgjdslList.push({ key: "第二阶段", value: ktgjdslItem.ktjd2, unit: "" });
ktgjdslList.push({ key: "第三阶段", value: ktgjdslItem.ktjd3, unit: "" });
}
ktgjdslData.dataList = ktgjdslList;
ret["ktgjdsl"] = ktgjdslData;
let gxkxsdf: any = await postDataDianXin(SJZENUM.地图弹窗_各学科学生得分, SJZSIGNENUM.地图弹窗_各学科学生得分);
let bqxxhgfx: any = await postDataDianXin(SJZENUM.地图弹窗_本期学生合格分析_合格人数和未合格人数, SJZSIGNENUM.地图弹窗_本期学生合格分析_合格人数和未合格人数);
let tcyyfx: any = await postDataDianXin(SJZENUM.地图弹窗_本期学生合格分析_退出原因分析, SJZSIGNENUM.地图弹窗_本期学生合格分析_退出原因分析);
// 各学科学生得分
// 无数据
// "gxkxsdf":{"title":"各学科学生得分","dataList":[{"type":"环境","list":[{"key":"冯**","value":"80"}]},{"type":"天文学","list":[{"key":"刘**","value":"80"}]}]}
let gxkxsdfData: any = { "title": "各学科学生得分" };
let gxkxsdfList = [];
if (gxkxsdf.data && gxkxsdf.data.length > 0) {
// 暂无数据时,返回空数组
}
gxkxsdfData.dataList = gxkxsdfList;
ret["gxkxsdf"] = gxkxsdfData;
// 本期学生合格分析_合格人数和未合格人数
// 无数据
// "bqxxhgfx":{"title":"本期学生合格分析","dataList":[{"key":"合格人数","value":0},{"key":"未合格人数","value":0}],"count":2}
let bqxxhgfxData: any = { "title": "本期学生合格分析", "count": 2 };
let bqxxhgfxList = [];
if (bqxxhgfx.data && bqxxhgfx.data.length > 0) {
let bqxxhgfxItem = bqxxhgfx.data.find((item: any) => item.gzzid === wsid);
bqxxhgfxList.push({ key: "合格人数", value: bqxxhgfxItem.hgrs });
bqxxhgfxList.push({ key: "未合格人数", value: bqxxhgfxItem.whgrs });
}
bqxxhgfxData.dataList = bqxxhgfxList;
ret["bqxxhgfx"] = bqxxhgfxData;
// 本期学生合格分析_退出原因分析
// 无数据
// "tcyyfx":{"title":"退出原因分析","dataList":[{"title":"退出原因分析","unit":"","total":51,"yMinValue":1,"yMaxValue":20,"yStepValue":2,"dataList":[{"key":"学业冲突","value":1,"unit":""}]}]}
let tcyyfxData: any = { "title": "本期学生合格分析_退出原因分析", "count": 1 };
let tcyyfxList = [];
if (tcyyfx.data && tcyyfx.data.length > 0) {
// 暂无数据时,返回空数组
}
tcyyfxData.dataList = tcyyfxList;
ret["tcyyfx"] = tcyyfxData;
let yjkt: any = await postDataDianXin(SJZENUM.地图弹窗_研究课题, SJZSIGNENUM.地图弹窗_研究课题);
// 研究课题
// 无数据
// "yjkt":{"title":"研究课题","total":0,"titleList":["年份","研究课题","结题学生数"],"valueList":[["2023","上海地区人群昆虫食用习惯调查及昆虫蛋白食品制作研究","3"]]}
let yjktData: any = { "title": "研究课题", "total": 0 };
let yjktList = [];
if (tcyyfx.data && tcyyfx.data.length > 0) {
yjktData.titleList = ["年份","研究课题","结题学生数"];
// 暂无数据
yjktData.valueList = yjktList;
}
ret["yjkt"] = yjktData;
res.send(ret);
}
import { SJZENUM, SJZSIGNENUM } from "../../config/appIdConfig";
import { fieldToKey, fieldToKey2, formatKey, formatKeyData, formatKtyjlbData, formatMapData, formatXbqkData, formatZypplfxData, readFileList } from "../../dataPackage/sjzFormatData";
import { postDataDianXin } from "../../util/request";
import { eccReqParamater } from "../../util/verificationParam";
/* 实践站 */
export async function getData(req, res) {
let reqConf = {yearly: 'String'};
const NotMustHaveKeys = ["faultDescription", "yearly"];
let { yearly } = eccReqParamater(reqConf, req.body, NotMustHaveKeys);
let ret: any = {};
// 选拔情况相关及处理
let xbqk: any = await postDataDianXin(SJZENUM.选拔情况列表, SJZSIGNENUM.选拔情况列表);
let lnzmxyqk: any = await postDataDianXin(SJZENUM.选拔情况趋势图_历年招募学员情况, SJZSIGNENUM.选拔情况趋势图_历年招募学员情况);
let xslyfb: any = await postDataDianXin(SJZENUM.选拔情况趋势图_学生来源趋势图, SJZSIGNENUM.选拔情况趋势图_学生来源趋势图);
// "xbqk":[{"name":"今年招生","value":117,"unit":""},{"name":"推荐生","value":80,"unit":""},{"name":"自荐生","value":47,"unit":""}]
ret["xbqk"] = formatXbqkData(xbqk.data, yearly);
// "lnzmxyqk":{"tjs":[{"name":"2024年","value":25,"unit":""},{"name":"2023年","value":20,"unit":""}], "zjs":[{"name":"2024年","value":25,"unit":""},{"name":"2023年","value":20,"unit":""}]}
let lnzmxyqkMap = formatKeyData(lnzmxyqk.data, "year", "tjsl", "zjsl");
let lnzmxyqkData = {
tjs: lnzmxyqkMap.dataList1,
zjs: lnzmxyqkMap.dataList2
};
ret["lnzmxyqk"] = lnzmxyqkData;
ret["xslyfb"] = fieldToKey(xslyfb.data, "", "xzq", "xssl", false, "");
// 学科老师分布
let xklssl: any = await postDataDianXin(SJZENUM.学科老师分布_老师和专家库数量, SJZSIGNENUM.学科老师分布_老师和专家库数量);
let xklsfb: any = await postDataDianXin(SJZENUM.学科老师分布_学科老师数量占比, SJZSIGNENUM.学科老师分布_学科老师数量占比);
ret["xklssl"] = fieldToKey(xklssl.data, "name", "", "nums", true, "");
ret["xklsfb"] = fieldToKey(xklsfb.data, "", "xkmc", "lssl", true, "个");
// 课程资源
let kczy: any = await postDataDianXin(SJZENUM.课程资源_课程资源数量和新增设课程数量, SJZSIGNENUM.课程资源_课程资源数量和新增设课程数量);
let kclnzys: any = await postDataDianXin(SJZENUM.课程资源_历年资源数趋势图, SJZSIGNENUM.课程资源_历年资源数趋势图);
let xzkczys: any = await postDataDianXin(SJZENUM.课程资源_新增设课程资源数和研究基础课程数量, SJZSIGNENUM.课程资源_新增设课程资源数和研究基础课程数量);
ret["kczy"] = fieldToKey(kczy.data, "name", "", "nums", false, "");
let kclnzysData = fieldToKey(kclnzys.data, "", "year", "kcsl", false, "");
ret["kclnzys"] = kclnzysData.map(event => {
return {
...event,
name: event.name + "年"
};
});
let nums = xzkczys.data.find(item => item.name === 'xzkczy')?.nums;
ret["xzkczys"] = nums ? Number(nums) : 0;
let kczylxs = xzkczys.data.filter(item => item.name !== 'xzkczy');
ret["kczylxs"] = fieldToKey(kczylxs, "name", "", "nums", true, "");
// 实践站整体汇总数据
let dbhz: any = await postDataDianXin(SJZENUM.实践站整体汇总数据, SJZSIGNENUM.实践站整体汇总数据);
ret["db"] = fieldToKey(dbhz.data, "name", "", "nums", true, "");
// 中间地图相关
let workstationMap: any = await postDataDianXin(SJZENUM.中间地图_工作站名称和所属区, SJZSIGNENUM.中间地图_工作站名称和所属区);
// "workstationMap": [{"wsid":"BE7","wsaddressy":"31.2859","wsaddressx":"121.2142","wsname":"工作站"},{"wsid":"060","wsaddressy":"31.2811","wsaddressx":"121.485","wsname":"实践工作站"}]
ret["workstationMap"] = formatMapData(workstationMap.data);
// 工作站分布
let gzzfbjz: any = await postDataDianXin(SJZENUM.工作站分布_统计信息, SJZSIGNENUM.工作站分布_统计信息);
let gzzlxfb: any = await postDataDianXin(SJZENUM.工作站分布_学科占比, SJZSIGNENUM.工作站分布_学科占比);
// "gzzfbjz": [{"name":"工作站数量","value":42,"unit":""},{"name":"工作站类型","value":65,"unit":""},{"name":"区域覆盖率","value":76,"unit":"%"}]
ret["gzzfbjz"] = formatKey(gzzfbjz.data, "gzzsl", "gzzlx", "qyfgl");
ret["gzzlxfb"] = fieldToKey(gzzlxfb.data, "", "zb", "xk", true, "");
// 历年工作站建设情况
let lngzzfbjz: any = await postDataDianXin(SJZENUM.历年工作站建设情况_统计信息, SJZSIGNENUM.历年工作站建设情况_统计信息);
let lngzzlxfb: any = await postDataDianXin(SJZENUM.历年工作站建设情况_学科占比, SJZSIGNENUM.历年工作站建设情况_学科占比);
ret["lngzzfbjz"] = formatKey(lngzzfbjz.data, "gzzsl", "gzzlx", "zb");
ret["lngzzlxfb"] = fieldToKey(lngzzlxfb.data, "", "xk", "zb", true, "");
// 各工作站学生数量
let ggzzxssl: any = await postDataDianXin(SJZENUM.各工作站学生数量_工作站数量, SJZSIGNENUM.各工作站学生数量_工作站数量);
let ggzzxsslfx: any = await postDataDianXin(SJZENUM.各工作站学生数量_工作站学生数量趋势, SJZSIGNENUM.各工作站学生数量_工作站学生数量趋势);
ret["ggzzxssl"] = formatKey(ggzzxssl.data, "dngzzs", "gzzzs", "");
ret["ggzzxsslfx"] = fieldToKey(ggzzxsslfx.data, "", "gzzmc", "xssl", true, "");
// 日常管理
let rcgl: any = await postDataDianXin(SJZENUM.日常管理_统计信息, SJZSIGNENUM.日常管理_统计信息);
ret["rcgl"] = fieldToKey(rcgl.data, "", "name", "nums", true, "");
// 课题研究
let ktyj: any = await postDataDianXin(SJZENUM.课题研究_统计数, SJZSIGNENUM.课题研究_统计数);
let ktyjlb: any = await postDataDianXin(SJZENUM.课题研究_列表, SJZSIGNENUM.课题研究_列表);
ret["ktyj"] = fieldToKey(ktyj.data, "", "name", "nums", true, "");
// "ktyjlb": {"titleList":["时间","学校","姓名","研究课题"],"valueList":[["2023-04-06","学校1","学生姓名1","论文《第一课星系是如何》"]]}
ret["ktyjlb"] = formatKtyjlbData(ktyjlb.data);
// 工作站优秀学员
let yxxy: any = await postDataDianXin(SJZENUM.工作站优秀学员_优秀学员姓名, SJZSIGNENUM.工作站优秀学员_优秀学员姓名);
let zypplfx: any = await postDataDianXin(SJZENUM.工作站优秀学员_专业匹配率分析, SJZSIGNENUM.工作站优秀学员_专业匹配率分析);
// "yxxy": [{"key":"名称1","value":"https://shsunshine-zp.shec.edu.cn/bi/platform/头像/1.png"}]
ret["yxxy"] = fieldToKey2(yxxy.data, "xsxm", "xb", "xsid");
// "zypplfx": {"学生数":[{"name":"学科类型","value":38,"unit":""}],"匹配率":[{"name":"学科类型","value":14,"unit":""}]}
ret["zypplfx"] = formatZypplfxData(zypplfx.data);
// 作品奖项
ret["zpjx"] = readFileList(`img/作品奖项/`, [], "png");
res.send(ret);
}
import { SJZENUM, SJZSIGNENUM } from '../../config/appIdConfig';
import { postDataDianXin } from '../../util/request';
import { eccReqParamater } from '../../util/verificationParam';
/* 优秀学生弹窗 */
export async function getData(req, res) {
let reqConf = {sid: 'String'};
const NotMustHaveKeys = [ ];
let { sid } = eccReqParamater(reqConf, req.body, NotMustHaveKeys);
let ret:any = {};
// 优秀学生弹窗
let yxxsxxb: any = await postDataDianXin(SJZENUM.优秀学生弹窗_优秀学生信息, SJZSIGNENUM.优秀学生弹窗_优秀学生信息);
let jdgx: any = await postDataDianXin(SJZENUM.优秀学生弹窗_阶段感想, SJZSIGNENUM.优秀学生弹窗_阶段感想);
let tcyyfx: any = await postDataDianXin(SJZENUM.优秀学生弹窗_参加课时总次数和退出原因分析, SJZSIGNENUM.优秀学生弹窗_参加课时总次数和退出原因分析);
let ktyjjd: any = await postDataDianXin(SJZENUM.优秀学生弹窗_课题研究进度, SJZSIGNENUM.优秀学生弹窗_课题研究进度);
// 优秀学生信息
// [{"xsid":"2E20","xsxm":"白*宇","age":"17","xb":"女","zdls":"张蕴晖","xkmc":"医学","njmc":"高一","bjmc":"02","ktmc":"干扰效应探究","gzzmc":"实践工作站","gzzdz":"东安路130号","sjdmc":"风华中学"}]
// "yxxsxxb":{"title":"优秀学生信息表","total":2045,"count":6,"dataList":[{"name":"导师","value":"李鑫鑫","unit":""},{"name":"年级","value":2023,"unit":"级"}
// ,{"name":"研究课题","value":"课题名称","unit":""},{"name":"年龄","value":20,"unit":""},{"name":"学科","value":"信息","unit":""},{"name":"班级","value":2,"unit":""}]}
let yxxsxxbData: any = {"title": "优秀学生信息表"};
let yxxsxxbList = yxxsxxb.data.filter((item: any) => item.xsid === sid);
yxxsxxbData.total = yxxsxxbList.length;
yxxsxxbData.count = 6;
let dataList = [];
let item = yxxsxxbList ? yxxsxxbList[0] : {};
dataList.push({ key: "导师", value: item.zdls, unit: "" });
dataList.push({ key: "年级", value: item.njmc, unit: "级" });
dataList.push({ key: "研究课题", value: item.ktmc, unit: "" });
dataList.push({ key: "年龄", value: item.age, unit: "" });
dataList.push({ key: "学科", value: item.xkmc, unit: "" });
dataList.push({ key: "班级", value: item.bjmc, unit: "" });
yxxsxxbData.dataList = dataList;
ret['yxxsxxb'] = yxxsxxbData;
// 工作信息
// "gzxxb":{"title":"工作信息表","dataList":[{"key":"工作站","value":"华东师范大学计算机与技术实践工作站","unit":""},{"key":"地址","value":"普陀区中山路","unit":""}
// ,{"key":"所辖事件点","value":["华东理工大学附属闵行科技高级中学","上海市建青实验中学","上海交通大学附属中学浦东实验高中"],"unit":""}]}
let gzxxbData: any = { "title": "工作信息表" };
let dataList2 = [];
// 所辖事件点
let sxsjd = yxxsxxbList.map((item: any) => item.sjdmc);
let { gzzmc, gzzdz } = yxxsxxbList[0];
dataList2.push({ key: "工作站", value: gzzmc, unit: "" });
dataList2.push({ key: "地址", value: gzzdz, unit: "" });
dataList2.push({ key: "所辖事件点", value: sxsjd, unit: "" });
gzxxbData.dataList = dataList2;
ret['gzxxb'] = gzxxbData;
// 阶段感想
let jdgxGx = jdgx.data.find((item: any) => item.xsid === sid)?.gx || '';
let gxList = [];
if (jdgxGx) gxList.push(jdgxGx);
ret['jdgx'] = {title: '阶段感想', dataList: gxList};
// 参加课时总次数和退出原因分析
let tcyyfxData = tcyyfx.data.find((item: any) => item.xsid === sid);
ret['tcyyfx'] = {title: '退出原因分析', total: tcyyfxData?.cjkszcs || 0, count: tcyyfxData?.tccs || 0, dataList: tcyyfxData && tcyyfxData.tcyy ? [tcyyfxData.tcyy] : []};
// 课题研究进度
let ktyjjdData: any = {"title": "课题研究进度", "titleList": [ "年份", "研究课题", "课题节点" ]};
let valueList = [];
let ktyjjdList = ktyjjd.data.filter((item: any) => item.xsid === sid);
ktyjjdData.total = ktyjjdList.length;
ktyjjdList.forEach((item: any) => {
valueList.push([item.year, item.ktmc, item.ktjd]);
});
ktyjjdData.valueList = valueList;
ret['ktyjjd'] = ktyjjdData;
res.send(ret);
}
......@@ -71,5 +71,79 @@ export enum SSKSIGNENUM { //sign
}
/**
* 实践站
*/
export enum SJZENUM {
选拔情况列表 = "2590505086537104040",
选拔情况趋势图_历年招募学员情况 = "2590505529060293306",
选拔情况趋势图_学生来源趋势图 = "2594684533301508364",
学科老师分布_老师和专家库数量 = "2590509593626081992",
学科老师分布_学科老师数量占比 = "2590517103392127699",
课程资源_课程资源数量和新增设课程数量 = "2590524367538682593",
课程资源_历年资源数趋势图 = "2590586740791245548",
课程资源_新增设课程资源数和研究基础课程数量 = "2590589814655089399",
实践站整体汇总数据 = "2590600227259087618",
中间地图_工作站名称和所属区 = "2590604667143781151",
中间地图_地图弹窗工作站基本信息 = "2590605312145947440",
地图弹窗_老师数量和学生数量和课题数量 = "2590872367201975135",
地图弹窗_已选课程学生数和未选课程学生数 = "2590873459140787059",
地图弹窗_市级课题研究进度_各工作站课题数 = "2590875263916243844",
地图弹窗_市级课题研究进度_课题各阶段数量 = "2590878720425393042",
地图弹窗_各学科学生得分 = "2590881059563568038",
地图弹窗_本期学生合格分析_合格人数和未合格人数 = "2590944119582030778",
地图弹窗_本期学生合格分析_退出原因分析 = "2590948534140468171",
地图弹窗_研究课题 = "2593420630618733532",
工作站分布_统计信息 = "2593506974124669936",
工作站分布_学科占比 = "2593507815471643646",
历年工作站建设情况_统计信息 = "2593588441300269065",
历年工作站建设情况_学科占比 = "2593590131083638807",
各工作站学生数量_工作站数量 = "2593592730373519394",
各工作站学生数量_工作站学生数量趋势 = "2594689218992339223",
日常管理_统计信息 = "2593600348275013677",
课题研究_统计数 = "2594135336125921386",
课题研究_列表 = "2594137005646608501",
工作站优秀学员_优秀学员姓名 = "2594140260700190854",
工作站优秀学员_专业匹配率分析 = "2594140934896810132",
优秀学生弹窗_优秀学生信息 = "2594147919337814181",
优秀学生弹窗_阶段感想 = "2594206041990428878",
优秀学生弹窗_参加课时总次数和退出原因分析 = "2594209502385600742",
优秀学生弹窗_课题研究进度 = "2594211063750916347",
}
export enum SJZSIGNENUM { //sign
选拔情况列表 = "d8e7ed36112c6e11ec8e69f979997f69",
选拔情况趋势图_历年招募学员情况 = "90c2c2a468fba6e2705c90a692e005ea",
选拔情况趋势图_学生来源趋势图 = "d55dc6b497b5dc1238f672f6123b5125",
学科老师分布_老师和专家库数量 = "cc2c837ceedf3ef701aa5ea02a0a92da",
学科老师分布_学科老师数量占比 = "2456c08b4540e9d836c55d1813811415",
课程资源_课程资源数量和新增设课程数量 = "bb7695bd8ca9aaa4f80dfe80520aeca2",
课程资源_历年资源数趋势图 = "507ead21797c542c643f7473701f8874",
课程资源_新增设课程资源数和研究基础课程数量 = "e3b279217485313d6124cfc9507aa571",
实践站整体汇总数据 = "0eabc9c51c5179f8123d9ead7a7885ad",
中间地图_工作站名称和所属区 = "0de7c776988c2425c057aa5ef54d9b99",
中间地图_地图弹窗工作站基本信息 = "63de40bce8887cf2948dabc939102150",
地图弹窗_老师数量和学生数量和课题数量 = "f16ff1780af1dac10b2a095cc371b321",
地图弹窗_已选课程学生数和未选课程学生数 = "a17c02f00a3f4c728cbe29effc17d019",
地图弹窗_市级课题研究进度_各工作站课题数 = "fff66606556bef0e50ac7792864b56b5",
地图弹窗_市级课题研究进度_课题各阶段数量 = "dde9ecf9d248610dfdc1e07b694a8b57",
地图弹窗_各学科学生得分 = "5348f2498fb152a1a1acf9fecd88c206",
地图弹窗_本期学生合格分析_合格人数和未合格人数 = "074d1758d328ef0501168946b698381b",
地图弹窗_本期学生合格分析_退出原因分析 = "1e1ea95be9f8d08ed19506f5543c55f5",
地图弹窗_研究课题 = "88839fada5e1a139aa50321bf6c904de",
工作站分布_统计信息 = "a8f84c48b48151726ce04bf354fdba16",
工作站分布_学科占比 = "dfb8828cce7be48d2eeb6370873923ff",
历年工作站建设情况_统计信息 = "c03fdb2afae9ca1861f00b810a0f4bba",
历年工作站建设情况_学科占比 = "847829106a77051a1caadf3fc3970e3c",
各工作站学生数量_工作站数量 = "f6b81faec4abf9e9d1fb5ad6dd233309",
各工作站学生数量_工作站学生数量趋势 = "9c02a2d83836cd2fb89355108d2178fa",
日常管理_统计信息 = "e74e82d6176acbcb32110fd7199a2b73",
课题研究_统计数 = "ed0d2e0ced359e1adc9ba98946679673",
课题研究_列表 = "7b35dcf116e194730492297d37c35ac5",
工作站优秀学员_优秀学员姓名 = "a3bd72605242c400495146c55280f27b",
工作站优秀学员_专业匹配率分析 = "f1dbeb8b649443f9326efdba7ac891b3",
优秀学生弹窗_优秀学生信息 = "bfca428b02f6a9bc3c35a4151d6ebfab",
优秀学生弹窗_阶段感想 = "8cfacb256a26fde06e8c57cdf6739cd8",
优秀学生弹窗_参加课时总次数和退出原因分析 = "9ef6d57d2390c0441088ae41ca788c1c",
优秀学生弹窗_课题研究进度 = "cfd3d6ff70c616bb6e94cf6a394634ae",
}
import { ImgPath } from "../serverConfig";
const fs = require("fs");
const path = require('path');
/**
* 选拔情况:按年过滤、维度转换
* @param initData
* @returns
*/
export function formatXbqkData(initData: any[], yearly: String) {
let xbqkTable = [];
// [{"year":"2016","jnzs":"2537","tjsl":"2330","zjsl":"207"},{"year":"2017","jnzs":"2530","tjsl":"2167","zjsl":"363"}]
initData.forEach((bean, index) => {
if(bean.year == yearly || (!yearly && index === 0)) {
xbqkTable.push({
"name": "推荐生",
"value": Number(bean.tjsl),
"unit": ""
});
xbqkTable.push({
"name": "自荐生",
"value": Number(bean.zjsl),
"unit": ""
});
xbqkTable.push({
"name": "今年招生",
"value": Number(bean.tjsl) + Number(bean.zjsl),
"unit": ""
});
}
})
return xbqkTable;
}
export function formatXslyfbData(initData: any[], yearly: String) {
let xbqkTable = [];
// [{"year":"2016","jnzs":"2537","tjsl":"2330","zjsl":"207"},{"year":"2017","jnzs":"2530","tjsl":"2167","zjsl":"363"}]
initData.forEach(bean => {
xbqkTable.push({
"name": "推荐生",
"value": Number(bean.tjsl),
"unit": ""
});
xbqkTable.push({
"name": "自荐生",
"value": Number(bean.zjsl),
"unit": ""
});
xbqkTable.push({
"name": "今年招生",
"value": Number(bean.tjsl) + Number(bean.zjsl),
"unit": ""
});
})
return xbqkTable;
}
/**
* 历年选拔情况:维度转换
* @param initData
* @param keyStr
* @param valueStr1
* @param valueStr2
*/
export function formatKeyData(initData: any[], keyStr, valueStr1, valueStr2) {
let tableMap: any = {};
let dataList1 = [];
let dataList2 = [];
// [{"year": "2016","tjsl": "2330","zjsl": "207"},{"year": "2017","tjsl": "2167","zjsl": "363"}]
initData.forEach(bean => {
dataList1.push({"name": bean[keyStr]+`年`, "value": Number(bean[valueStr1]), "unit": ""});
dataList2.push({"name": bean[keyStr]+`年`, "value": Number(bean[valueStr2]), "unit": ""});
})
tableMap.dataList1 = dataList1;
tableMap.dataList2 = dataList2;
return tableMap;
}
/**
* 学科分布情况\课程资源\实践站整体汇总数据:字段转换
* @param initData
* @param name
* @param field1
* @param field2
* @param ext
* @returns
*/
export function fieldToKey(initData: any[], name, field1, field2, ext, unit){
let dataList = [];
initData.forEach(bean => {
let beanData: any = {};
if (name) {
beanData.name = nameKeyMap[bean[name]];
}
if (field1) {
beanData.name = bean[field1];
}
if (field2) {
beanData.value = Number(bean[field2]);
}
if (ext) {
beanData.unit = unit;
}
dataList.push(beanData);
});
return dataList;
}
export function fieldToKey2(initData: any[], field1, field2, field3) {
// [{"xsid":"0D4DA32D3D8139DDBF522B3D54222E20","xsxm":"白*宇","xb":"女"}]
let dataList = [];
initData.forEach(bean => {
let beanData: any = {};
beanData.key = field1 ? bean[field1] : "";
beanData.value = field2 ? bean[field2] : "";
beanData.sid = field3 ? bean[field3] : "";
dataList.push(beanData);
});
return dataList;
}
/**
* 中间地图:key值转换
* @param initData
*/
export function formatMapData(initData: any[]) {
let dataList = [];
// [{"gzzid":"C4E","gzzmc":"实践工作站","xzb":"121.4369","yzb":"31.0257"},{"gzzid":"266","gzzmc":"工作站","xzb":"121.5955","yzb":"31.1937"}]
initData.forEach(bean => {
let beanData: any = {};
beanData.wsid = bean.gzzid;
beanData.wsname = bean.gzzmc;
beanData.wsaddressx = bean.xzb;
beanData.wsaddressy = bean.yzb;
dataList.push(beanData);
});
return dataList;
}
/**
* 工作站分布:key值、字段转换
* @param initData
* @param key1
* @param key2
* @param key3
*/
export function formatKey(initData: any[], key1, key2, key3) {
let dataList = [];
// [{"gzzsl":"40","gzzlx":"14","qyfgl":"100"}]
initData.forEach(bean => {
dataList.push({
name: nameKeyMap[key1],
value: Number(bean[key1]),
unit: ""
});
dataList.push({
name: nameKeyMap[key2],
value: Number(bean[key2]),
unit: ""
});
if (key3) {
dataList.push({
name: nameKeyMap[key3],
value: Number(bean[key3]),
unit: "%"
});
}
});
return dataList;
}
/**
* 课题研究列表:维度、结构转换
* @param initData
*/
export function formatKtyjlbData(initData: any[]) {
let resultMap: any = { "titleList": ["时间", "学校", "姓名", "研究课题"] };
let valueList = [];
// [{"year":"2026","xxmc":null,"xm":null,"yjkt":"绿色生活"},{"year":"2026","xxmc":null,"xm":null,"yjkt":"智慧农业"}]
initData.forEach(bean => {
let dataList = [];
dataList.push(bean.year);
dataList.push(bean.xxmc);
dataList.push(bean.xm);
dataList.push(bean.yjkt);
valueList.push(dataList);
});
resultMap.valueList = valueList;
return resultMap;
}
/**
* 专业匹配率分析:结构、字段转换
* @param initData
*/
export function formatZypplfxData(initData: any[]) {
let resultMap: any = {};
let dataList1 = []; // 学生数
let dataList2 = []; // 匹配率
// [{"name":"环境","total":772,"nums":11,"ratio":"1.42"},{"name":"化学","total":1245,"nums":54,"ratio":"4.34"}]
initData.forEach(bean => {
dataList1.push({"name": bean.name, "value": bean.nums, "unit":""});
dataList2.push({"name": bean.name, "value": bean.ratio, "unit":""});
});
resultMap["学生数"] = dataList1;
resultMap["匹配率"] = dataList2;
return resultMap;
}
/**
* 名词英文到中文的映射
*/
let nameKeyMap: { [key: string]: string } = {
"zjk": "专家库",
"lssl": "老师数量",
"kcsl": "课程资源数量",
"xzkcsl": "新增设课程数量",
"gzzsl": "工作站数量",
"xksl": "课题数",
"ktsl": "科创学科",
"zyppl": "专业匹配率",
"gzzlx": "工作站类型",
"qyfgl": "区域覆盖率",
"zb": "区域覆盖率",
"dngzzs": "当年工作站数",
"gzzzs": "工作站总数",
"jckc": "基础课程",
"yjkc": "研究课程"
};
/**
* 获取查询作品奖项图片
* @param dirPath 文件地址
* @param filesList 存放数据数组
* @param ext 文件类型
* @returns
*/
export function readFileList(dirPath, filesList, ext) {
let files = fs.readdirSync(dirPath);
// console.log(files);
for (let i = 0; i < files.length; i++) {
let itm = files[i];
let stat = fs.statSync(dirPath + itm);
if (stat.isDirectory()) { //判断文件是否是目录
//递归读取文件
readFileList(dirPath + itm + "/", filesList, ext)
} else if (path.extname(itm).toLowerCase() === `.${ext}`) {
let filePath = `${dirPath}${itm}`;
/**截取掉地址前面的pdf/ */
let pdfToRemove = filePath.replace(new RegExp(`^img/`), "");
let fileStr = `${ImgPath}/${pdfToRemove}`;
filesList.push(fileStr);
}
}
return filesList;
}
\ No newline at end of file
......@@ -20,6 +20,11 @@ import * as workstationBiz from '../biz/secondPhase/workstation';
import * as workstationPopupBiz from '../biz/secondPhase/workstationPopup';
import * as authBiz from '../biz/auth';
// 2026
import * as sjzBiz from '../biz/three/sjz';
import * as yxxsBiz from '../biz/three/yxxs';
import * as popupBiz from '../biz/secondPhase/popup';
export function setRouter(httpServer){
//数据治理体系
httpServer.get('/sjzltx', asyncHandler(sjzltxBiz.getData));
......@@ -48,8 +53,8 @@ export function setRouter(httpServer){
httpServer.get('/secondPhase/workstation', asyncHandler(workstationBiz.getData));
httpServer.post('/secondPhase/workstation', asyncHandler(workstationBiz.getData));
httpServer.get('/secondPhase/workstation/popup', asyncHandler(workstationPopupBiz.getData));
httpServer.post('/secondPhase/workstation/popup', asyncHandler(workstationPopupBiz.getData));
// httpServer.get('/secondPhase/workstation/popup', asyncHandler(workstationPopupBiz.getData));
// httpServer.post('/secondPhase/workstation/popup', asyncHandler(workstationPopupBiz.getData));
//三期
//周周播
......@@ -62,11 +67,11 @@ export function setRouter(httpServer){
//2024-12-28
//实践工作站 success
httpServer.post('/qsnkjcxsjgzz', asyncHandler(qsnkjcxsjgzzBiz.getData));
httpServer.get('/qsnkjcxsjgzz', asyncHandler(qsnkjcxsjgzzBiz.getData));
// httpServer.post('/qsnkjcxsjgzz', asyncHandler(qsnkjcxsjgzzBiz.getData));
// httpServer.get('/qsnkjcxsjgzz', asyncHandler(qsnkjcxsjgzzBiz.getData));
//一生一档案 success
httpServer.post('/ysysda', asyncHandler(ysysdaBiz.getData));
httpServer.get('/ysysda', asyncHandler(ysysdaBiz.getData));
// httpServer.post('/ysysda', asyncHandler(ysysdaBiz.getData));
// httpServer.get('/ysysda', asyncHandler(ysysdaBiz.getData));
//重要活动保障 error
httpServer.post('/zyhdbzlist', asyncHandler(zyhdbzListBiz.getData));
httpServer.get('/zyhdbzlist', asyncHandler(zyhdbzListBiz.getData));
......@@ -105,6 +110,16 @@ export function setRouter(httpServer){
httpServer.post('/ssk/ybqkqs', asyncHandler(sskBiz.getYbqkqs));
httpServer.get('/ssk/ybqkqs', asyncHandler(sskBiz.getYbqkqs));
// 实践站 2026
httpServer.post('/qsnkjcxsjgzz', asyncHandler(sjzBiz.getData));
httpServer.get('/qsnkjcxsjgzz', asyncHandler(sjzBiz.getData));
// 优秀学生- 一生一档案 2026
httpServer.post('/ysysda', asyncHandler(yxxsBiz.getData));
httpServer.get('/ysysda', asyncHandler(yxxsBiz.getData));
// 实践站地图弹窗 2026
httpServer.get('/secondPhase/workstation/popup', asyncHandler(popupBiz.getData));
httpServer.post('/secondPhase/workstation/popup', asyncHandler(popupBiz.getData));
//2025统一认证调整
httpServer.post('/auth/accesstoken', asyncHandler(authBiz.handleAuthCallback));
httpServer.get('/auth/accesstoken', asyncHandler(authBiz.handleAuthCallback));
......
......@@ -88,5 +88,5 @@ export let workstationConfig = {
}
// export const ImgPath = "http://192.168.0.71:30026"
export const ImgPath = "https://shsunshine-zp.shec.edu.cn/bi/platform"
export const ImgPath = "http://127.0.0.1:30026"
// export const ImgPath = "https://shsunshine-zp.shec.edu.cn/bi/platform"
/**
* 校验参数工具
*
*/
import { ERRORENUM } from "../config/errorEnum";
import { BizError } from "./bizError";
/**
* 通过config校验表单参数param
* 包括类型 String, Number, Boolean, [Number], [Object]
* 参数是必填
* 方法会校验表单中存在的多余字段
* @param name 被调用的方法名
* @param config 校验配置
* @param param 需要校验的参数
* @returns true 无需关注返回
*/
export function eccFormParam(name:string, keyTypeConf:object, param:object) {
/**校验多余字段 */
for (let key in param) {
if (!keyTypeConf[key]) throw new BizError(ERRORENUM.参数错误, name, `多余${key}字段`);
}
/**校验已填参数 */
for (let key in keyTypeConf ) {
let {type, notMustHave} = keyTypeConf[key];
let isError = false; //校验是否异常
let errorStr = "";//异常说明
let value = param[key];
let valueType = typeof value;
if ( value == null || value == undefined ) {
if (!notMustHave) throw new BizError(ERRORENUM.参数错误, name, `缺失${key}字段`);
} else {
switch(type) {
case 'Number':
if ( type.toLowerCase() != valueType ) {
isError = true;
} else {
if ((""+param[key]).indexOf('.') > -1) {
param[key] = parseInt(`${param[key] *1000}`)/1000;
}
}
break;
case 'String':
case 'Boolean':
if ( type.toLowerCase() != valueType ) isError = true;
break;
case '[Number]':
if ( !Array.isArray(param[key]) ) isError = true;
for (let i =0; i < param[key].length; i++) {
let item = param[key][i];
if ( typeof item != 'number' ) {
isError = true;
errorStr = `${key}应是number型数组其中下标${i}${typeof item}`;
}
}
break;
case '[Object]':
if ( !Array.isArray(param[key]) ) isError = true;
for (let i =0; i < param[key].length; i++) {
let item = param[key][i];
if ( typeof item != 'object' ) {
isError = true;
errorStr = `${key}应是object型数组其中下标${i}${typeof item}`;
}
}
break;
case 'Address':
/**地址类型 基本数据类型为数组字符串但是要判断层级关系 */
if ( !Array.isArray(param[key]) ) {
isError = true;
errorStr = `${key}应是数组形`;
}
if ( param[key].length != 4) {
isError = true;
errorStr = `${key}超过特定长度4 目前长度 ${param[key].length}`;
}
for (let i =0; i < param[key].length; i++) {
let item = param[key][i];
if ( typeof item != 'string' ) {
isError = true;
errorStr = `${key}应是string型数组其中下标${i}${typeof item}`;
}
}
/** 不符合规则的 */
let nullIndex = -1;
for (let i = 0; i < param[key].length; i++) {
if (nullIndex != -1) {//出现过空 第一次出现后的位置 都不能有值
if (param[key]) {
//做一个特化
throw new BizError(ERRORENUM.地址数据不完整, name, `${key} 下标 ${nullIndex} 为空 `);
}
}
if (nullIndex == -1 && !param[key][i]) {
/**按顺序第一次赋值 */
nullIndex = i;
}
}
break;
}
errorStr = isError && errorStr == "" ? `${key}应该是${type}型 而不是${valueType}`: errorStr;
if ( isError ) throw new BizError(ERRORENUM.请完善信息, name, errorStr);
}
}
return true;
}
/**
* 根据conf配置校验请求参数
* @param conf 配置
* @param param 表单
* @param skipKeys []不必填的字段
*/
export function eccReqParamater(conf:object, param, skipKeys?) {
skipKeys = skipKeys || [];
let skipMap = {};
skipKeys.forEach(keyName => {
skipMap[keyName] = 1;
});
/**校验多余字段 */
for (let key in param) {
if (!conf[key]) throw new BizError(ERRORENUM.参数错误, `多余${key}字段`);
}
/**校验必填和缺失字段 */
for (let key in conf) {
let confType = conf[key];
let value = param[key];
let valueType = typeof value;
if ( value == null || value == undefined ) {
if (!skipMap[key]) throw new BizError(ERRORENUM.参数错误, `缺失${key}字段`);
} else {
let isError = false;
let errorStr = "";
switch(confType) {
case 'Number':
if ( confType.toLowerCase() != valueType ) isError = true;
else {
if ((""+param[key]).indexOf('.') > -1) {
param[key] = parseInt(`${param[key] *100}`)/100;
}
}
break;
case 'String':
case 'Boolean':
if ( confType.toLowerCase() != valueType ) isError = true;
break;
case '[Number]':
if ( !Array.isArray(param[key]) ) isError = true;
for (let i =0; i < param[key].length; i++) {
let item = param[key][i];
if ( typeof item != 'number' ) {
isError = true;
errorStr = `${key}应是number型数组其中下标${i}${typeof item}`;
}
}
break;
case '[Object]':
if ( !Array.isArray(param[key]) ) isError = true;
for (let i =0; i < param[key].length; i++) {
let item = param[key][i];
if ( typeof item != 'object' ) {
isError = true;
errorStr = `${key}应是object型数组其中下标${i}${typeof item}`;
}
}
break;
case 'Address':
/**地址类型 基本数据类型为数组字符串但是要判断层级关系 */
if ( !Array.isArray(param[key]) ) {
isError = true;
errorStr = `${key}应是数组形`;
}
if ( param[key].length != 4) {
isError = true;
errorStr = `${key}超过特定长度4 目前长度 ${param[key].length}`;
}
for (let i =0; i < param[key].length; i++) {
let item = param[key][i];
if ( typeof item != 'string' ) {
isError = true;
errorStr = `${key}应是string型数组其中下标${i}${typeof item}`;
}
}
/** 不符合规则的 */
let nullIndex = -1;
for (let i = 0; i < param[key].length; i++) {
if (nullIndex != -1) {//出现过空 第一次出现后的位置 都不能有值
if (param[key]) {
//做一个特化
throw new BizError(ERRORENUM.地址数据不完整, `${key} 下标 ${nullIndex} 为空 `);
}
}
if (nullIndex == -1 && !param[key][i]) {
/**按顺序第一次赋值 */
nullIndex = i;
}
}
break;
}
errorStr = isError && errorStr == "" ? `${key}应该是${confType}型 而不是${valueType}`: errorStr;
if (isError) throw new BizError(ERRORENUM.参数错误, errorStr);
}
}
return param;
}
\ No newline at end of file
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment