Skip to content
Projects
Groups
Snippets
Help
This project
Loading...
Sign in / Register
Toggle navigation
Y
yuyiAdminServer
Overview
Overview
Details
Activity
Cycle Analytics
Repository
Repository
Files
Commits
Branches
Tags
Contributors
Graph
Compare
Charts
Issues
0
Issues
0
List
Board
Labels
Milestones
Merge Requests
0
Merge Requests
0
CI / CD
CI / CD
Pipelines
Jobs
Schedules
Charts
Wiki
Wiki
Snippets
Snippets
Members
Members
Collapse sidebar
Close sidebar
Activity
Graph
Charts
Create a new issue
Jobs
Commits
Issue Boards
Open sidebar
node_server
yuyiAdminServer
Commits
52ff4ada
Commit
52ff4ada
authored
Jun 03, 2025
by
chenjinjing
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
no message
parent
5bf23800
Hide whitespace changes
Inline
Side-by-side
Showing
10 changed files
with
300 additions
and
73 deletions
+300
-73
fuWu.ts
src/biz/fuWu.ts
+17
-5
fuhua.ts
src/biz/fuhua.ts
+45
-6
mail.ts
src/biz/mail.ts
+61
-10
ruFu.ts
src/biz/ruFu.ts
+55
-10
enum.ts
src/config/enum/enum.ts
+49
-0
dataInterfaceWithCache.ts
src/data/dataInterfaceWithCache.ts
+2
-2
admin.ts
src/routers/admin.ts
+6
-6
public.ts
src/routers/public.ts
+2
-0
system.ts
src/tools/system.ts
+44
-0
verificationEnum.ts
src/util/verificationEnum.ts
+19
-34
No files found.
src/biz/fuWu.ts
View file @
52ff4ada
...
...
@@ -81,19 +81,31 @@ export async function enterpriseServiceOption(esId:string, fangKui:string) {
*/
export
async
function
enterpriseServiceEnd
(
esId
:
string
,
outcome
:
number
,
desc
:
string
)
{
let
selectParam
:
any
=
{
esId
};
let
filesList
=
[
"esId"
,
"eId"
];
let
filesList
=
[
"esId"
,
"eId"
,
"needCategory"
,
"applyTime"
];
let
resInfo
=
await
selectData
(
OPERATIONALDATATYPE
.
查询单个
,
TABLENAME
.
企业服务表
,
selectParam
,
filesList
);
if
(
!
resInfo
||
!
resInfo
.
esId
)
{
throw
new
BizError
(
ERRORENUM
.
数据不存在
);
}
let
updateInfo
=
{
outcome
,
followUpStatus
:
enumConfig
.
FOLLOWUPSTATUS
.
已完成
,
desc
,
resolveTime
:
getMySqlMs
()};
let
resolveTime
=
getMySqlMs
();
let
updateInfo
=
{
outcome
,
followUpStatus
:
enumConfig
.
FOLLOWUPSTATUS
.
已完成
,
desc
,
resolveTime
};
await
operationalData
(
OPERATIONALDATATYPE
.
修改
,
TABLENAME
.
企业服务表
,
updateInfo
,
{
esId
});
let
applyTime
=
moment
(
resInfo
.
applyTime
).
format
(
"YYYY-MM-DD"
);
let
needCategory
=
changeEnumValue
(
enumConfig
.
NEEDCATEGORY
,
resInfo
.
needCategory
);
let
resolveTimeStr
=
moment
(
resolveTime
).
format
(
"YYYY-MM-DD"
);
//发送邮件
let
mailStr
=
""
;
mailStr
+=
`<p>您的服务处理结果为:
${
changeEnumValue
(
enumConfig
.
OUTCOME
,
outcome
)}
</p>`
;
mailStr
+=
`<p>
${
desc
}
</p>`
;
mailStr
+=
`<p>贵公司提交的**
${
needCategory
}
**申请,已于
${
resolveTimeStr
}
办理完毕,相关结果如下:</p>`
;
mailStr
+=
`<p><span style='font-weight: 700;'>📌 办结事项详情:</span></p>`
;
mailStr
+=
`<ul>`
;
mailStr
+=
`<li><span style='font-weight: 700;'>服务事项名称:</span>
${
needCategory
}
</li>`
;
mailStr
+=
`<li><span style='font-weight: 700;'>提交时间:</span>
${
applyTime
}
</li>`
;
mailStr
+=
`<li><span style='font-weight: 700;'>办结时间:</span>
${
resolveTimeStr
}
</li>`
;
mailStr
+=
`<li><span style='font-weight: 700;'>办理结果:</span>
${
desc
}
</li>`
;
mailStr
+=
`</ul>`
;
mailStr
+=
`<p>如涉及提交实物材料(如:营业执照等),携带公司证明材料前往4-1201。</p>`
;
mailStr
+=
`<p>如您对上述办理情况有任何疑问或后续服务需求,欢迎随时与我们联系。</p>`
;
mailStr
+=
`<p>感谢贵公司对【羽翼孵化器】的信任与支持!</p>`
;
await
systemSendMail
(
resInfo
.
eId
,
enumConfig
.
MAILTYPE
.
结束企业服务
,
mailStr
);
return
{
isSuccess
:
true
};
...
...
src/biz/fuhua.ts
View file @
52ff4ada
...
...
@@ -6,7 +6,7 @@ import moment = require("moment");
import
{
OPERATIONALDATATYPE
,
TABLEID
,
TABLENAME
}
from
"../config/enum/dbEnum"
;
import
{
BUILDING
,
CHANGESTATE
,
CHANGETYPE
,
DEGREE
,
EMIGRATIONTYPE
,
FUHUASTATE
,
INCOME
,
INDUSTRY
,
OFFLINEPROMOTION
,
ONLINEPROMOTION
,
PROMOTIONTYPE
,
STATE
}
from
"../config/enum/enum"
;
import
{
operationalData
,
selectData
,
selectManyTableData
}
from
"../data/operationalData"
;
import
{
getMySqlMs
,
randomId
}
from
"../tools/system"
;
import
{
get
IntervalYear
,
get
MySqlMs
,
randomId
}
from
"../tools/system"
;
import
{
changeEnumValue
}
from
"../util/verificationEnum"
;
import
{
eccFormParam
}
from
"../util/verificationParam"
;
import
{
AdminRegisterAddConfig
,
YuYiBaseDataUpdateConfig
}
from
"../config/eccParam/enterprise"
;
...
...
@@ -116,8 +116,11 @@ export async function getBaseData() {
* 孵化器入驻信息
*/
let
entryList
=
await
selectData
(
OPERATIONALDATATYPE
.
查询多个
,
TABLENAME
.
入驻信息表
,
{},
[
`info_enterId`
,
`building`
,
`occupancyRate`
,
`enteredEnterprises`
]);
let
entryInfo
=
{
"1"
:{
"入驻率"
:
""
,
"入驻企业"
:
""
},
"3"
:{
"入驻率"
:
""
,
"入驻企业"
:
""
},
"4"
:{
"入驻率"
:
""
,
"入驻企业"
:
""
}};
let
入驻企业
=
await
get
入驻企业列表
();
let
entryInfo
=
{
"1"
:{
"入驻率"
:
""
,
"入驻企业"
:
入驻企业
[
BUILDING
[
"1号楼"
]].
length
},
"3"
:{
"入驻率"
:
""
,
"入驻企业"
:
入驻企业
[
BUILDING
[
"3号楼"
]].
length
},
"4"
:{
"入驻率"
:
""
,
"入驻企业"
:
入驻企业
[
BUILDING
[
"4号楼"
]].
length
}};
if
(
entryList
.
length
)
{
entryList
.
forEach
(
info
=>
{
// let building = changeEnumValue(BUILDING, info.building);
...
...
@@ -126,7 +129,7 @@ export async function getBaseData() {
entryInfo
[
building
]
=
{
"入驻率"
:
""
,
"入驻企业"
:
""
};
}
entryInfo
[
building
].
入驻率
=
info
.
occupancyRate
;
entryInfo
[
building
].
入驻企业
=
info
.
enteredEnterprises
;
entryInfo
[
building
].
入驻企业
=
入驻企业
[
building
].
length
;
})
}
...
...
@@ -169,6 +172,38 @@ export async function getBaseData() {
}
/**
* 获取各个楼栋的企业列表
* @returns
*/
export
async
function
get
入驻企业列表
()
{
// 获取当前时间
let
nowTime
=
moment
().
format
(
'YYYY-MM-DD HH:mm:ss'
);
let
fhColumn
=
[
"fId"
,
"eId"
,
"startTime"
,
"endTime"
,
"state"
,
"virtualCause"
,
"virtualCauseDes"
,
"moveOutType"
,
"moveOutTrace"
,
"moveOutCause"
,
"moveOutTime"
,
"graduationTime"
,
];
let
租赁
Column
=
[
"eId"
,
"year"
,
"alienPatent"
,
"classIPatent"
,
"secondClassPatent"
,
"thirdPentent"
];
let
在孵租赁联查
includeConf
=
{};
在孵租赁联查
includeConf
[
TABLENAME
.
企业孵化信息
]
=
{
cloum
:
fhColumn
,
where
:
{
state
:
{
"%between%"
:
[
FUHUASTATE
.
实体孵化
,
FUHUASTATE
.
虚拟孵化
]
}
}
};
在孵租赁联查
includeConf
[
TABLENAME
.
租赁信息
]
=
{
cloum
:
租赁
Column
,
where
:
{}
}
let
在孵租赁联查
dbList
=
await
selectManyTableData
(
OPERATIONALDATATYPE
.
多表联查
,
TABLENAME
.
企业基础信息表
,
{
state
:
CHANGESTATE
.
已通过
},
[
"enterpriseName"
,
"industry"
,
"qiYeGuiMo"
],
在孵租赁联查
includeConf
);
let
楼栋
Map
=
{};
在孵租赁联查
dbList
.
forEach
(
info
=>
{
let
{
enterprise_fuhuas
,
enterprise_leases
,
enterpriseName
,
industry
,
qiYeGuiMo
}
=
info
;
// let building = changeEnumValue(BUILDING, parseInt(enterprise_leases[0].building))
let
building
=
enterprise_leases
[
0
].
building
;
if
(
!
楼栋
Map
[
building
])
楼栋
Map
[
building
]
=
[];
// let intervalYear = getIntervalYear(new Date(enterprise_fuhuas[0].startTime), new Date(enterprise_fuhuas[0].endTime));
let
intervalYear
=
getIntervalYear
(
new
Date
(
enterprise_fuhuas
[
0
].
startTime
),
new
Date
());
let
industryStr
=
changeEnumValue
(
INDUSTRY
,
industry
)
||
"-"
;
楼栋
Map
[
building
].
push
([
enterpriseName
,
moment
(
enterprise_fuhuas
[
0
].
startTime
).
format
(
"YY/MM/DD"
),
intervalYear
,
industryStr
,
qiYeGuiMo
]);
})
return
楼栋
Map
;
}
export
async
function
getOperateData
(
year
)
{
let
yearTime
=
moment
(
year
,
"YYYY"
).
startOf
(
'year'
).
format
(
"YYYY-MM-DD"
);
console
.
log
(
"yearTime:"
,
yearTime
);
...
...
@@ -484,7 +519,11 @@ export async function getYuYiFuHua() {
// 2. 获取孵化器入驻信息
let
entryList
=
await
selectData
(
OPERATIONALDATATYPE
.
查询多个
,
TABLENAME
.
入驻信息表
,
{},
[
`info_enterId`
,
`building`
,
`occupancyRate`
,
`enteredEnterprises`
]);
let
entryInfo
=
{
"1"
:
{
"入驻率"
:
""
,
"入驻企业"
:
""
},
"3"
:
{
"入驻率"
:
""
,
"入驻企业"
:
""
},
"4"
:
{
"入驻率"
:
""
,
"入驻企业"
:
""
}};
let
入驻企业
=
await
get
入驻企业列表
();
let
entryInfo
=
{
"1"
:{
"入驻率"
:
""
,
"入驻企业"
:
入驻企业
[
BUILDING
[
"1号楼"
]].
length
},
"3"
:{
"入驻率"
:
""
,
"入驻企业"
:
入驻企业
[
BUILDING
[
"3号楼"
]].
length
},
"4"
:{
"入驻率"
:
""
,
"入驻企业"
:
入驻企业
[
BUILDING
[
"4号楼"
]].
length
}};
if
(
entryList
.
length
)
{
entryList
.
forEach
(
info
=>
{
...
...
@@ -494,7 +533,7 @@ export async function getYuYiFuHua() {
entryInfo
[
building
]
=
{
"入驻率"
:
""
,
"入驻企业"
:
""
};
}
entryInfo
[
building
].
入驻率
=
info
.
occupancyRate
;
entryInfo
[
building
].
入驻企业
=
info
.
enteredEnterprises
;
entryInfo
[
building
].
入驻企业
=
入驻企业
[
building
].
length
;
});
}
...
...
src/biz/mail.ts
View file @
52ff4ada
...
...
@@ -8,13 +8,25 @@ import { BizError } from "../util/bizError";
const
nodemailer
=
require
(
'nodemailer'
);
// 创建发送邮件的传输对象
// host: 'smtp.qq.com', // SMTP 服务器地址
// user: '1685675085@qq.com', // 你的邮箱地址
// pass: 'hppnsfvnzzhlbdfh' // 你的邮箱密码或应用专用密码
let
transporter
=
nodemailer
.
createTransport
({
host
:
'smtp.qq.com'
,
// SMTP 服务器地址
// logger: true,
// host: 'smtp.qq.com', // SMTP 服务器地址
// port: 465, // SMTP 服务器端口(通常是 465 或 587)
// secure: true, // 使用 SSL
// auth: {
// user: '1685675085@qq.com', // 你的邮箱地址
// pass: 'hppnsfvnzzhlbdfh' // 你的邮箱密码或应用专用密码
// }
host
:
'smtp.exmail.qq.com'
,
// SMTP 服务器地址
port
:
465
,
// SMTP 服务器端口(通常是 465 或 587)
secure
:
true
,
// 使用 SSL
auth
:
{
user
:
'
1685675085@qq.com
'
,
// 你的邮箱地址
pass
:
'
hppnsfvnzzhlbdfh
'
// 你的邮箱密码或应用专用密码
user
:
'
zhaoyue@tninnopark.cn
'
,
// 你的邮箱地址
pass
:
'
PrW7ucysg3ubvE7d
'
// 你的邮箱密码或应用专用密码
}
});
...
...
@@ -22,9 +34,10 @@ async function send(toMail, name, type, otherStr?, code?) {
let
{
title
,
mailStr
}
=
getModel
(
name
,
type
,
otherStr
,
code
);
// 设置邮件选项
let
mailOptions
=
{
from
:
'羽翼 <1685675085@qq.com>'
,
// 发送者地址
from
:
'羽翼 <zhaoyue@tninnopark.cn>'
,
// 发送者地址,需要同步发送邮箱的地址,否则发送邮箱会失败
// from: '羽翼 <1685675085@qq.com>', // 发送者地址,需要同步发送邮箱的地址,否则发送邮箱会失败
to
:
toMail
,
subject
:
`
羽翼的
${
title
}
通知
`
,
// 邮件主题
subject
:
`
【羽翼孵化器】
${
title
}
`
,
// 邮件主题
// text: 'Hello world?', // 邮件正文(纯文本)
html
:
mailStr
// 邮件正文(HTML 格式)
};
...
...
@@ -45,20 +58,58 @@ function getModel(name, type, otherStr?, code?) {
let
str
=
""
;
let
title
=
""
;
switch
(
type
)
{
case
MAILTYPE
.
通过入孵申请
:
str
=
"<p>感谢贵公司对【羽翼孵化器】的关注与信任。经我们初步审核,贵公司提交的入孵申请已通过<span style='font-weight: 700;'>初审</span>。为推进下一阶段工作,请贵方协助完成以下事项:</p>"
;
str
+=
"<p><span style='font-weight: 700;'>*电脑端:</span>通过点击链接上传入孵材料:</p>"
;
str
+=
"<p>https://fh.tninnopark.cn/incubatorApply</p>"
;
str
+=
"<p><span style='font-weight: 700;'>*手机端:</span>通过扫码上传入孵材料:</p>"
;
str
+=
"<p><img src='https://fh.tninnopark.cn/yuyi/files/域名访问.png' /></p>"
;
str
+=
"<p><span style='font-weight: 700;'>下一步事项:</span></p>"
;
str
+=
"<p>如涉及提交实物材料(如:入驻计划复印件、孵化协议等),携带公司证明材料前往4-1201。</p>"
;
str
+=
"<p>我们期待与贵公司的进一步合作,共同推动项目成长与落地</p>"
;
str
+=
"<p>再次感谢您的积极参与!</p>"
;
str
+=
"<p style='text-align: right;'>祝 商祺!</p>"
;
str
+=
"<p style='text-align: right;'>羽翼孵化器</p>"
;
title
=
"贵公司入孵申请初审已通过"
;
break
;
case
MAILTYPE
.
驳回入孵申请
:
str
=
otherStr
;
str
+=
"<p style='text-align: right;'>祝 商祺!</p>"
;
str
+=
"<p style='text-align: right;'>羽翼孵化器</p>"
;
title
=
"贵公司入孵申请初审未通过通知"
;
break
;
case
MAILTYPE
.
通过入孵材料审核
:
str
=
"您提交的企业材料审核成功,欢迎入驻羽翼孵化器。"
;
title
=
"审核通过"
;
str
=
"<p>感谢贵公司积极配合入孵流程。经审核,贵公司提交的入孵材料<span style='font-weight: 700;'>已审核通过:</span></p>"
;
str
+=
"<p>我们诚挚欢迎贵公司正式入驻,与我们共同开启创新发展新篇章!</p>"
;
str
+=
"<p>请搜索小程序“羽翼孵化器”,更多政策动态/消息任务将通过该小程序平台推送,请留心关注。</p>"
;
str
+=
"<p><img src='https://fh.tninnopark.cn/yuyi/files/小程序.jpg' /></p>"
;
str
+=
"<p style='text-align: right;'>祝 商祺!</p>"
;
str
+=
"<p style='text-align: right;'>羽翼孵化器</p>"
;
title
=
"贵公司入孵材料审核已通过"
;
break
;
case
MAILTYPE
.
驳回入孵材料申请
:
str
=
otherStr
;
str
+=
"<p style='text-align: right;'>祝 商祺!</p>"
;
str
+=
"<p style='text-align: right;'>羽翼孵化器</p>"
;
title
=
"贵公司入孵材料审核未通过通知"
;
break
;
case
MAILTYPE
.
结束企业服务
:
str
=
otherStr
;
title
=
"企业服务受理结果"
;
str
+=
"<p style='text-align: right;'>祝 商祺!</p>"
;
str
+=
"<p style='text-align: right;'>羽翼孵化器</p>"
;
title
=
"贵公司申请的企业服务已受理完毕"
;
break
;
}
let
mailStr
=
""
mailStr
+=
`<p>尊敬的
${
name
}
:</p>`
;
mailStr
+=
`<p>尊敬的
${
name
}
团队
:</p>`
;
mailStr
+=
`<p>您好!</p>`
;
mailStr
+=
`
<p>
${
str
}
</p>
`
;
mailStr
+=
`
${
str
}
`
;
return
{
mailStr
,
title
};
}
...
...
src/biz/ruFu.ts
View file @
52ff4ada
...
...
@@ -185,6 +185,9 @@ export async function settleInEnterprisePass(eId:string) {
}
await
operationalData
(
OPERATIONALDATATYPE
.
增加
,
TABLENAME
.
入孵申请审批表
,
addInfo
,
{}
);
//发送邮件
await
systemSendMail
(
eId
,
enumConfig
.
MAILTYPE
.
通过入孵申请
);
return
{
isSuccess
:
true
};
}
...
...
@@ -300,33 +303,50 @@ export async function settleInEnterpriseUpdate(eId:string, param) {
/**
* 入孵申请驳回
* @param eId
* @param descType 驳回类型 [1, 2]
* @param desc
* @returns
*/
export
async
function
settleInEnterpriseOut
(
eId
:
string
)
{
export
async
function
settleInEnterpriseOut
(
eId
:
string
,
descType
,
desc
:
string
)
{
let
filesList
=
[
"eId"
,
"enterpriseName"
,
"uscc"
,
"logonTime"
,
"state"
];
let
resInfo
=
await
selectData
(
OPERATIONALDATATYPE
.
查询单个
,
TABLENAME
.
企业基础信息表
,
{
eId
},
filesList
);
if
(
!
resInfo
||
!
resInfo
.
eId
)
{
throw
new
BizError
(
ERRORENUM
.
数据不存在
);
}
// if (resInfo.state) throw new BizError(ERRORENUM.该企业已通过审核);
// await operationalData(OPERATIONALDATATYPE.删除, TABLENAME.企业用户表, {}, {eId});//
// await operationalData(OPERATIONALDATATYPE.删除, TABLENAME.企业孵化信息, {}, {eId});
// await operationalData(OPERATIONALDATATYPE.删除, TABLENAME.租赁信息, {}, {eId});
// await operationalData(OPERATIONALDATATYPE.删除, TABLENAME.企业基础信息表, {}, {eId});
await
operationalData
(
OPERATIONALDATATYPE
.
修改
,
TABLENAME
.
企业基础信息表
,
{
register
:
enumConfig
.
CHANGESTATE
.
已驳回
},
{
eId
});
let
descStr
=
""
;
for
(
let
i
=
0
;
i
<
descType
.
length
;
i
++
)
{
if
(
descType
[
i
]
==
enumConfig
.
DESCTYPE
.
其他
)
{
if
(
desc
)
descStr
+=
`
${
desc
}
;`
}
else
{
descStr
+=
`
${
changeEnumValue
(
enumConfig
.
DESCTYPE
,
descType
[
i
])}
;`
;
}
}
let
descTypeStr
=
JSON
.
stringify
(
descType
)
||
'[]'
;
let
addInfo
=
{
approvalId
:
randomId
(
TABLEID
.
入孵申请审批表
),
eId
,
changeType
:
enumConfig
.
CHANGETYPE
.
入孵申请
,
changeState
:
enumConfig
.
CHANGESTATE
.
已驳回
,
createTimeMs
:
getMySqlMs
()
createTimeMs
:
getMySqlMs
(),
descType
:
descTypeStr
,
desc
:
descStr
,
}
await
operationalData
(
OPERATIONALDATATYPE
.
增加
,
TABLENAME
.
入孵申请审批表
,
addInfo
,
{}
);
/**发送邮件 */
let
mailStr
=
""
;
mailStr
+=
"<p>感谢贵公司对【羽翼孵化器】的关注与信任。经我们初步审核,遗憾地通知您,贵公司此次入孵申请<span style='font-weight: 700;'>未通过初审</span>。主要原因为:</p>"
;
mailStr
+=
`<ul>`
;
mailStr
+=
`<li>
${
descStr
}
</li>`
;
mailStr
+=
`</ul>`
;
mailStr
+=
`<p>以上内容仅作为此次审核意见供参考,您可根据反馈进行优化调整。如后续有相关优化材料或补充说明,欢迎重新提交申请。</p>`
;
mailStr
+=
`<p>我们期待未来与贵公司的合作机会,衷心祝愿贵公司业务发展顺利!</p>`
;
await
systemSendMail
(
resInfo
.
eId
,
enumConfig
.
MAILTYPE
.
驳回入孵申请
,
mailStr
);
return
{
isSuccess
:
true
};
}
...
...
@@ -501,9 +521,11 @@ export async function enterpriseRegisterExaminePass(eId:string) {
/**
* 入孵材料审核驳回
* @param eId
* @param descType 驳回类型 [1, 2]
* @param desc
* @returns
*/
export
async
function
enterpriseRegisterExamineOut
(
eId
:
string
)
{
export
async
function
enterpriseRegisterExamineOut
(
eId
:
string
,
descType
,
desc
:
string
)
{
if
(
!
eId
)
throw
new
BizError
(
ERRORENUM
.
参数错误
);
let
filesList
=
[
"eId"
,
"enterpriseName"
,
"uscc"
,
"logonTime"
,
"state"
];
let
resInfo
=
await
selectData
(
OPERATIONALDATATYPE
.
查询单个
,
TABLENAME
.
企业基础信息表
,
{
eId
},
filesList
);
...
...
@@ -520,15 +542,38 @@ export async function enterpriseRegisterExamineOut(eId:string) {
await
operationalData
(
OPERATIONALDATATYPE
.
修改
,
TABLENAME
.
租赁信息
,
updateLeaseInfo
,
{
eId
});
await
operationalData
(
OPERATIONALDATATYPE
.
修改
,
TABLENAME
.
企业基础信息表
,
{
state
:
enumConfig
.
CHANGESTATE
.
已驳回
},
{
eId
});
let
descStr
=
""
;
for
(
let
i
=
0
;
i
<
descType
.
length
;
i
++
)
{
if
(
descType
[
i
]
==
enumConfig
.
FILEDESCTYPE
.
其他
)
{
if
(
desc
)
descStr
+=
`
${
desc
}
;`
}
else
{
descStr
+=
`
${
changeEnumValue
(
enumConfig
.
FILEDESCTYPE
,
descType
[
i
])}
;`
;
}
}
let
descTypeStr
=
JSON
.
stringify
(
descType
)
||
'[]'
;
let
addInfo
=
{
approvalId
:
randomId
(
TABLEID
.
入孵申请审批表
),
eId
,
changeType
:
enumConfig
.
CHANGETYPE
.
入孵材料审批
,
changeState
:
enumConfig
.
CHANGESTATE
.
已驳回
,
createTimeMs
:
getMySqlMs
()
createTimeMs
:
getMySqlMs
(),
descType
:
descTypeStr
,
desc
:
descStr
,
}
await
operationalData
(
OPERATIONALDATATYPE
.
增加
,
TABLENAME
.
入孵申请审批表
,
addInfo
,
{}
);
/**发送邮件 */
let
mailStr
=
""
;
mailStr
+=
"<p>感谢贵公司积极配合入孵流程。经审核,贵公司提交的入孵材料<span style='font-weight: 700;'>暂未通过审核</span>,主要原因如下:</p>"
;
mailStr
+=
`<ul>`
;
mailStr
+=
`<li>
${
descStr
}
</li>`
;
mailStr
+=
`</ul>`
;
mailStr
+=
`<p>如贵司愿意继续推进入孵流程,可根据上述意见进行材料完善并重新提交。</p>`
;
mailStr
+=
`<p>我们期待贵公司尽快完善材料,并欢迎继续申请入驻。</p>`
;
mailStr
+=
`<p>感谢理解与配合!</p>`
;
await
systemSendMail
(
resInfo
.
eId
,
enumConfig
.
MAILTYPE
.
驳回入孵材料申请
,
mailStr
);
return
{
isSuccess
:
true
};
}
...
...
src/config/enum/enum.ts
View file @
52ff4ada
...
...
@@ -250,6 +250,52 @@ export enum CHANGETYPE {
}
/**
* 入孵申请审批驳回类型
*/
export
enum
DESCTYPE
{
企业信息填写内容有误
=
1
,
企业业务方向与孵化器定位不匹配
,
企业孵化阶段与孵化器不符
,
孵化器资源限制
,
其他
=
999
}
/**
* 入孵材料审批驳回类型
*/
export
enum
FILEDESCTYPE
{
"附件材料有误、不完整"
=
101
,
附件材料与填报信息不一致
,
附件材料模糊不清
,
其他
=
999
}
/**
* 入孵申请审批驳回类型
*/
export
enum
DESCTYPECLIENT
{
企业信息填写内容有误
=
1
,
企业业务方向与孵化器定位不匹配
,
企业孵化阶段与孵化器不符
,
孵化器资源限制
,
// 其他 = 999
}
/**
* 入孵材料审批驳回类型
*/
export
enum
FILEDESCTYPECLIENT
{
"附件材料有误、不完整"
=
101
,
附件材料与填报信息不一致
,
附件材料模糊不清
,
// 其他 = 999
}
export
enum
QUARTER
{
第一季度
=
1
,
第二季度
,
...
...
@@ -396,6 +442,9 @@ export enum RISKTYPE {
export
enum
MAILTYPE
{
通过入孵材料审核
=
1
,
结束企业服务
,
通过入孵申请
,
驳回入孵申请
,
驳回入孵材料申请
,
}
...
...
src/data/dataInterfaceWithCache.ts
View file @
52ff4ada
...
...
@@ -7,9 +7,9 @@ import { updateQCCDataTask } from "../biz/qccInit";
* 设置定时器,每天刷新一次数据
*/
export
async
function
initApiDataStorage
()
{
await
updateQCCDataTask
();
//
updateQCCDataTask();
setInterval
(
async
function
()
{
await
updateQCCDataTask
();
updateQCCDataTask
();
},
3600
*
1000
*
24
);
}
...
...
src/routers/admin.ts
View file @
52ff4ada
...
...
@@ -24,14 +24,14 @@ export function setRouter(httpServer) {
httpServer
.
post
(
'/admin/enterprise/settlein/pass'
,
checkUser
,
asyncHandler
(
settleInPass
));
httpServer
.
post
(
'/admin/enterprise/settlein/info'
,
checkUser
,
asyncHandler
(
settleInById
));
httpServer
.
post
(
'/admin/enterprise/settlein/update'
,
checkUser
,
asyncHandler
(
settleUpdate
));
httpServer
.
post
(
'/admin/enterprise/settlein/out'
,
checkUser
,
asyncHandler
(
settleInOut
));
httpServer
.
post
(
'/admin/enterprise/settlein/out'
,
checkUser
,
asyncHandler
(
settleInOut
));
//驳回
httpServer
.
post
(
'/admin/fuhua/rufu/add'
,
checkUser
,
asyncHandler
(
addRuFu
));
httpServer
.
post
(
'/admin/fuhua/rufu/info'
,
checkUser
,
asyncHandler
(
getRuFu
));
httpServer
.
post
(
'/admin/fuhua/rufu/update'
,
checkUser
,
asyncHandler
(
updateRuFu
));
//
//审核
httpServer
.
post
(
'/admin/enterprise/settlein/examine/list'
,
checkUser
,
asyncHandler
(
examineSettleIn
));
httpServer
.
post
(
'/admin/enterprise/settlein/examine/pass'
,
checkUser
,
asyncHandler
(
examineSettleInPass
));
//入孵材料审核 通过
httpServer
.
post
(
'/admin/enterprise/settlein/examine/out'
,
checkUser
,
asyncHandler
(
examineSettleInOut
));
httpServer
.
post
(
'/admin/enterprise/settlein/examine/out'
,
checkUser
,
asyncHandler
(
examineSettleInOut
));
//驳回
// //通知
httpServer
.
post
(
'/admin/notice/list'
,
checkUser
,
asyncHandler
(
noticeList
));
...
...
@@ -775,8 +775,8 @@ async function settleInById(req, res) {
*/
async
function
settleInOut
(
req
,
res
)
{
const
UserInfo
=
req
.
userInfo
;
let
{
eId
}
=
req
.
body
let
result
=
await
ruFuBiz
.
settleInEnterpriseOut
(
eId
);
let
{
eId
,
descType
,
desc
}
=
req
.
body
let
result
=
await
ruFuBiz
.
settleInEnterpriseOut
(
eId
,
descType
,
desc
);
res
.
success
(
result
);
}
...
...
@@ -870,8 +870,8 @@ async function examineSettleInPass(req, res) {
async
function
examineSettleInOut
(
req
,
res
)
{
const
UserInfo
=
req
.
userInfo
;
let
{
eId
}
=
req
.
body
;
let
result
=
await
ruFuBiz
.
enterpriseRegisterExamineOut
(
eId
);
let
{
eId
,
descType
,
desc
}
=
req
.
body
;
let
result
=
await
ruFuBiz
.
enterpriseRegisterExamineOut
(
eId
,
descType
,
desc
);
res
.
success
(
result
);
}
src/routers/public.ts
View file @
52ff4ada
...
...
@@ -29,6 +29,8 @@ const config = {
"/public/clientpolicytype"
:
enumConfig
.
CLIENTPOLICYTYPE
,
// 政策文件类型-前端用
"/public/building"
:
enumConfig
.
BUILDING
,
// 园区楼号
"/public/ipralltype"
:
enumConfig
.
IPRALLTYPE
,
//企查查知识产权类型
"/public/desctypeclient"
:
enumConfig
.
DESCTYPECLIENT
,
//入孵申请审批驳回
"/public/filedesctypeclient"
:
enumConfig
.
FILEDESCTYPECLIENT
,
//入孵材料审批驳回
// "/public/output/basedata":outputEnumConfig.BASEDATA,
// "/public/output/opreatdata":outputEnumConfig.OPERATIONDATA,
// "/public/output/financingdata":outputEnumConfig.FINANCINGDATA,
...
...
src/tools/system.ts
View file @
52ff4ada
...
...
@@ -123,3 +123,47 @@ export function getPinyinInitials(name) {
.
join
(
''
);
}
/**
* 计算间隔孵化时长
* @param startTime
* @param endTime
*/
export
function
getIntervalYear
(
startTime
,
endTime
)
{
// 提取开始日期的年、月、日(注意月份需+1)
const
startYear
=
startTime
.
getFullYear
();
const
startMonth
=
startTime
.
getMonth
()
+
1
;
const
startDay
=
startTime
.
getDate
();
// 提取结束日期的年、月、日
const
endYear
=
endTime
.
getFullYear
();
const
endMonth
=
endTime
.
getMonth
()
+
1
;
const
endDay
=
endTime
.
getDate
();
// 计算总月份差
let
totalMonths
=
(
endYear
-
startYear
)
*
12
+
(
endMonth
-
startMonth
);
// 处理天数不足的情况(未满整月)
if
(
endDay
<
startDay
)
{
totalMonths
--
;
}
// 处理时间倒流的情况
if
(
totalMonths
<
0
)
{
return
"0个月"
;
}
// 根据总月份判断输出年或月
if
(
totalMonths
>=
12
)
{
const
years
=
Math
.
floor
(
totalMonths
/
12
);
return
`
${
years
}
年`
;
}
else
{
return
`
${
totalMonths
}
个月`
;
}
}
src/util/verificationEnum.ts
View file @
52ff4ada
...
...
@@ -39,45 +39,30 @@ export function changeEnumValue(enumConf, value:any) {
if
(
!
value
)
return
''
;
if
(
typeof
value
==
'number'
)
{
let
str
=
enumConf
[
value
];
/** 特化处理 中文引号在枚举中不适用*/
if
(
str
==
"_投资__孵化_类型"
)
{
str
=
str
.
replace
(
"__"
,
"+"
);
str
=
str
.
replace
(
"_"
,
"“"
);
str
=
str
.
replace
(
"_"
,
"”"
);
}
if
(
str
==
"经营成本过高_场地成本或人员成本_"
||
str
==
"办公空间拓展_无合适办公空间_"
)
{
str
=
str
.
replace
(
"_"
,
"("
);
str
=
str
.
replace
(
"_"
,
")"
);
}
if
(
str
==
"迁出孵化器_仍在张江"
||
str
==
"迁出张江_仍在浦东"
||
str
==
"迁出浦东_仍在上海"
)
{
str
=
str
.
replace
(
"_"
,
","
);
}
if
(
str
==
"科技金融_风险投资_"
||
str
==
"科技金融_其他_"
||
str
==
"技术专家_法律专家_"
)
{
str
=
str
.
replace
(
"_"
,
"("
);
str
=
str
.
replace
(
"_"
,
")"
);
}
/**特化处理 */
if
(
/_dou/
.
test
(
str
))
str
=
str
.
replace
(
/_dou/gm
,
","
);
if
(
/_zyh/
.
test
(
str
))
str
=
str
.
replace
(
/_zyh/gm
,
"“"
);
if
(
/_yyh/
.
test
(
str
))
str
=
str
.
replace
(
/_yyh/gm
,
"”"
);
if
(
/_dun/
.
test
(
str
))
str
=
str
.
replace
(
/_dun/gm
,
"、"
);
if
(
/_ju/
.
test
(
str
))
str
=
str
.
replace
(
/_ju/gm
,
"。"
);
return
str
}
else
if
(
typeof
value
==
'string'
)
{
try
{
//兼容数据库 '[1,2,3]'
value
=
JSON
.
parse
(
value
);
}
catch
(
err
)
{
return
enumConf
[
parseInt
(
value
)];
}
}
let
str
=
""
;
value
.
forEach
((
item
,
index
)
=>
{
let
subStr
=
enumConf
[
item
];
/** 特化处理 中文引号在枚举中不适用*/
if
(
subStr
==
"_投资__孵化_类型"
)
{
subStr
=
subStr
.
replace
(
"__"
,
"+"
);
subStr
=
subStr
.
replace
(
"_"
,
"“"
);
subStr
=
subStr
.
replace
(
"_"
,
"”"
);
}
if
(
subStr
==
"经营成本过高_场地成本或人员成本_"
||
subStr
==
"办公空间拓展_无合适办公空间_"
)
{
subStr
=
subStr
.
replace
(
"_"
,
"("
);
subStr
=
subStr
.
replace
(
"_"
,
")"
);
}
if
(
subStr
==
"迁出孵化器_仍在张江"
||
subStr
==
"迁出张江_仍在浦东"
||
subStr
==
"迁出浦东_仍在上海"
)
{
subStr
=
subStr
.
replace
(
"_"
,
","
);
}
if
(
subStr
==
"科技金融_风险投资_"
||
subStr
==
"科技金融_其他_"
||
subStr
==
"技术专家_法律专家_"
)
{
subStr
=
subStr
.
replace
(
"_"
,
"("
);
subStr
=
subStr
.
replace
(
"_"
,
")"
);
}
/**特化处理 */
if
(
/_dou/
.
test
(
subStr
))
subStr
=
subStr
.
replace
(
/_dou/gm
,
","
);
if
(
/_zyh/
.
test
(
subStr
))
subStr
=
subStr
.
replace
(
/_zyh/gm
,
"“"
);
if
(
/_yyh/
.
test
(
subStr
))
subStr
=
subStr
.
replace
(
/_yyh/gm
,
"”"
);
if
(
/_dun/
.
test
(
subStr
))
subStr
=
subStr
.
replace
(
/_dun/gm
,
"、"
);
if
(
/_ju/
.
test
(
subStr
))
subStr
=
subStr
.
replace
(
/_ju/gm
,
"。"
);
str
+=
subStr
;
if
(
index
==
value
.
length
-
1
)
str
+=
""
;
else
str
+=
","
...
...
Write
Preview
Markdown
is supported
0%
Try again
or
attach a new file
Attach a file
Cancel
You are about to add
0
people
to the discussion. Proceed with caution.
Finish editing this message first!
Cancel
Please
register
or
sign in
to comment