Commit 1a06d676 authored by 赵啸非's avatar 赵啸非

Merge remote-tracking branch 'origin/master'

parents ac11ff46 202450cf
......@@ -11,4 +11,5 @@ VUE_APP_WEBSOCKET_API =127.0.0.1:18222/m
VUE_APP_PORTAL_URL = /portal_home
VUE_APP_PORTAL_PORT = 17300
VUE_APP_API_appName = '智慧政务绩效管理系统'
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<meta http-equiv="X-UA-Compatible" content="IE=edge">
<meta name="viewport" content="width=device-width,initial-scale=1.0">
<link rel="icon" href="<%= BASE_URL %>favicon.ico">
<meta charset="utf-8" />
<meta http-equiv="X-UA-Compatible" content="IE=edge" />
<meta name="viewport" content="width=device-width,initial-scale=1.0" />
<link rel="icon" href="<%= BASE_URL %>favicon.ico" />
<title>智慧政务绩效管理系统</title>
<link rel="stylesheet" href="https://unpkg.com/element-ui@2.15.5/lib/theme-chalk/index.css">
<link
rel="stylesheet"
href="https://unpkg.com/element-ui@2.15.5/lib/theme-chalk/index.css"
/>
</head>
<body>
<noscript>
<strong>We're sorry but app doesn't work properly without JavaScript enabled. Please enable it to continue.</strong>
<strong
>We're sorry but app doesn't work properly without JavaScript enabled.
Please enable it to continue.</strong
>
</noscript>
<div id="app"></div>
<!-- built files will be auto injected -->
......
......@@ -24,7 +24,8 @@ export default {
beforeCreate() {
Vue.prototype.$app = this;
},
created() {},
created() {
},
methods: {},
};
......@@ -32,7 +33,7 @@ export default {
<style lang="less" scoped>
#app {
height:100vh;
height: 100vh;
.loading {
display: flex;
align-items: center;
......
......@@ -10,13 +10,13 @@
</i>
<router-link to="/">
<img
src="../assets/images/logo.png"
:src="sysLogo ? sysLogo : require('../assets/images/logo.png')"
style="margin-bottom: 5px; margin-left: 24px"
height="40"
alt=""
/>
<b style="color: white; font-size: 20px">
&nbsp;&nbsp;&nbsp;智慧政务绩效管理系统
&nbsp;&nbsp;&nbsp;{{ sysName ? sysName : "智慧政务绩效管理系统" }}
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
</b>
</router-link>
......@@ -172,6 +172,12 @@ export default {
data() {
return {
showMobileMenu: false,
sysName: localStorage.getItem("sysName")
? localStorage.getItem("sysName")
: "",
sysLogo: localStorage.getItem("sysLogo")
? localStorage.getItem("sysLogo")
: "",
};
},
created() {},
......
......@@ -5,36 +5,47 @@
</template>
<script>
import jwt_decode from "jwt-decode";
export default {
name: 'sso',
created () {
},
name: "sso",
created() {},
mounted() {
let token = this.$route.query.token
console.log("token:"+token)
console.log("解析后的token:",jwt_decode(token))
let token = this.$route.query.token;
console.log("token:" + token);
console.log("解析后的token:", jwt_decode(token));
//const decode = jwt_decode(data.normal_login_token).accountId; // 解析
if(token) {
if (token) {
//本地登录后跳转
this.form.loginName=jwt_decode(token).userInfo.account
this.form.password=jwt_decode(token).userInfo.password
/* this.form.loginName="admin"
this.form.loginName = jwt_decode(token).userInfo.account;
this.form.password = jwt_decode(token).userInfo.password;
this.$route.query.sysName
? localStorage.setItem("sysName", this.$route.query.sysName)
: "";
this.$route.query.sysLogo
? localStorage.setItem("sysLogo", this.$route.query.sysLogo)
: "";
this.$route.query.sysName
? (document.title = this.$route.query.sysName)
: "";
/* this.form.loginName="admin"
this.form.password="scsmile"*/
this.login()
this.login();
//window.sessionStorage.setItem("token", token);
// this.$router.push('/index') // 有token直接跳转首页
}else{
} else {
this.$message({
message: '没有权限,正在跳转登录页面...',
center: true
message: "没有权限,正在跳转登录页面...",
center: true,
});
setTimeout(function(){
window.location.href=process.env.VUE_APP_PORTAL_URL=='undefined'?'http://192.168.0.98:11072':process.env.VUE_APP_PORTAL_URL
setTimeout(function() {
window.location.href =
process.env.VUE_APP_PORTAL_URL == "undefined"
? "http://192.168.0.98:11072"
: process.env.VUE_APP_PORTAL_URL;
//this.$router.push('/login')
},1000)
}, 1000);
}
},
methods: {
......@@ -47,8 +58,8 @@ export default {
loginSuccess({ data }) {
console.log("userData", data);
this.$store.commit("setUserData", data);
this.$router.push('/index') // 有token直接跳转首页
/* this.$router.replace({
this.$router.push("/index"); // 有token直接跳转首页
/* this.$router.replace({
path: this.redirect,
});*/
},
......@@ -60,15 +71,15 @@ export default {
data() {
return {
form: {
loginName: '',
password: '',
securityCode: '',
loginName: "",
password: "",
securityCode: "",
},
redirect: this.$route.query.redirect,
loading: true,
}
}
}
};
},
};
</script>
<style>
......
......@@ -3,39 +3,118 @@
<el-dialog :title="title" :visible.sync="open" width="90%" append-to-body>
<el-form ref="form" :model="form" :rules="rules" label-width="120px">
<el-row>
<Field label="员工ID" prop="staffId" v-model="form.staffId" placeholder="请输入员工ID"/>
<Field label="员工姓名" prop="staffName" v-model="form.staffName" placeholder="请输入员工姓名"/>
<Field label="工号" prop="workNum" v-model="form.workNum" placeholder="请输入工号"/>
<Field label="所属部门" prop="deptId" v-model="form.deptId" placeholder="请输入所属部门"/>
<Field label="所属部门名称" prop="deptName" v-model="form.deptName" placeholder="请输入所属部门名称"/>
<Field label="职位ID" prop="positionId" v-model="form.positionId" placeholder="请输入职位ID"/>
<Field label="职位名称" prop="positionName" v-model="form.positionName" placeholder="请输入职位名称"/>
<Field label="所属考勤组ID" prop="attendanceGroupId" v-model="form.attendanceGroupId" placeholder="请输入所属考勤组ID"/>
<Field label="所属考勤组名称" prop="attendanceGroupName" v-model="form.attendanceGroupName" placeholder="请输入所属考勤组名称"/>
<Field label="班次ID" prop="shiftsId" v-model="form.shiftsId" placeholder="请输入班次ID"/>
<Field label="班次名称" prop="shiftsName" v-model="form.shiftsName" placeholder="请输入班次名称"/>
<Field label="考勤日期" prop="attendanceDate" v-model="form.attendanceDate" type="date" />
<Field label="考勤点名称" prop="attendanceAddress" v-model="form.attendanceAddress" placeholder="请输入考勤点名称"/>
<Field label="事件源" prop="eventSource" v-model="form.eventSource" placeholder="请输入事件源"/>
<Field label="备注" prop="remark" v-model="form.remark" type="textarea" placeholder="请输入备注"/>
<Field
label="员工ID"
prop="staffId"
v-model="form.staffId"
placeholder="请输入员工ID"
/>
<Field
label="员工姓名"
prop="staffName"
v-model="form.staffName"
placeholder="请输入员工姓名"
/>
<Field
label="工号"
prop="workNum"
v-model="form.workNum"
placeholder="请输入工号"
/>
<Field
label="所属部门"
prop="deptId"
v-model="form.deptId"
placeholder="请输入所属部门"
/>
<Field
label="所属部门名称"
prop="deptName"
v-model="form.deptName"
placeholder="请输入所属部门名称"
/>
<Field
label="职位ID"
prop="positionId"
v-model="form.positionId"
placeholder="请输入职位ID"
/>
<Field
label="职位名称"
prop="positionName"
v-model="form.positionName"
placeholder="请输入职位名称"
/>
<Field
label="所属考勤组ID"
prop="attendanceGroupId"
v-model="form.attendanceGroupId"
placeholder="请输入所属考勤组ID"
/>
<Field
label="所属考勤组名称"
prop="attendanceGroupName"
v-model="form.attendanceGroupName"
placeholder="请输入所属考勤组名称"
/>
<Field
label="班次ID"
prop="shiftsId"
v-model="form.shiftsId"
placeholder="请输入班次ID"
/>
<Field
label="班次名称"
prop="shiftsName"
v-model="form.shiftsName"
placeholder="请输入班次名称"
/>
<Field
label="考勤日期"
prop="attendanceDate"
v-model="form.attendanceDate"
type="date"
/>
<Field
label="考勤点名称"
prop="attendanceAddress"
v-model="form.attendanceAddress"
placeholder="请输入考勤点名称"
/>
<Field
label="事件源"
prop="eventSource"
v-model="form.eventSource"
placeholder="请输入事件源"
/>
<Field
label="备注"
prop="remark"
v-model="form.remark"
type="textarea"
placeholder="请输入备注"
/>
</el-row>
</el-form>
<div slot="footer" class="dialog-footer">
<el-button type="primary" v-if="pageInfo.type !== 'view'" @click="submitForm">确 定</el-button>
<el-button
type="primary"
v-if="pageInfo.type !== 'view'"
@click="submitForm"
>确 定</el-button
>
<el-button @click="cancel">取 消</el-button>
</div>
</el-dialog>
</template>
<script>
import form from "@/assets/mixins/formdialog";
import dialogShow from "./dialogshow";
export default {
import form from "@/assets/mixins/formdialog";
import dialogShow from "./dialogshow";
export default {
mixins: [form],
components: {
dialogShow ,
dialogShow,
},
data() {
return {
......@@ -45,46 +124,43 @@
title: "海康考勤打卡记录汇总信息",
// 是否显示弹出层
open: false,
toString:[
],
toString: [],
// 表单校验
rules: {
staffName: [
{required: true,message: "请输入员工姓名", trigger: "blur" },
{max: 64,message: "最多只能录入64个字符",trigger: "blur",},
],
createTime: [
{required: true,message: "请选择创建时间" },
{ required: true, message: "请输入员工姓名", trigger: "blur" },
{ max: 64, message: "最多只能录入64个字符", trigger: "blur" },
],
}
createTime: [{ required: true, message: "请选择创建时间" }],
},
};
},
methods: {
/** 编辑 */
edit(row) {
this.reset()
this.reset();
this.query = { id: row.id };
this.urls.currUrl ="attendance/record/hik/edit";
this.urls.currUrl = "attendance/record/hik/edit";
this.getData();
this.pageInfo.type="edit"
this.pageInfo.type = "edit";
this.title = "修改海康考勤打卡记录汇总信息";
},
/** 新增 */
add(row) {
this.reset()
this.reset();
this.urls.currUrl = "attendance/record/hik/add";
this.getData();
this.pageInfo.type="add"
this.pageInfo.type = "add";
this.title = "新增海康考勤打卡记录汇总信息";
},
/** 查看*/
view(row) {
this.reset()
this.reset();
this.query = { id: row.id };
this.urls.currUrl ="attendance/record/hik/view";
this.urls.currUrl = "attendance/record/hik/view";
this.getData();
this.pageInfo.type="view"
this.pageInfo.type = "view";
this.title = "海康考勤打卡记录汇总信息详细";
},
/**取消按钮 */
......@@ -104,21 +180,21 @@
// 表单重置
reset() {
this.form = {
staffId : null,
staffName : "",
workNum : "",
deptId : null,
deptName : "",
positionId : null,
positionName : "",
attendanceGroupId : null,
attendanceGroupName : "",
shiftsId : null,
shiftsName : "",
attendanceDate : null,
attendanceAddress : "",
eventSource : "",
remark : "",
staffId: null,
staffName: "",
workNum: "",
deptId: null,
deptName: "",
positionId: null,
positionName: "",
attendanceGroupId: null,
attendanceGroupName: "",
shiftsId: null,
shiftsName: "",
attendanceDate: null,
attendanceAddress: "",
eventSource: "",
remark: "",
};
this.resetForm("form");
},
......@@ -128,5 +204,5 @@
}
},
},
};
};
</script>
......@@ -24,7 +24,9 @@
>
<el-col :span="12"
>违规类型:{{
form.irregularType ? form.irregularType : "--"
form.irregularType
? util_formatter("irregularType", form.irregularType)
: "--"
}}</el-col
>
</el-row>
......
......@@ -3,20 +3,43 @@
<template>
<div class="page page-login flex flex-v">
<div class="form-wrap flex flex-1">
<el-form @submit.prevent='onSubmit' ref="form" :model="form" label-width="0px" size="small">
<h1>智慧政务绩效管理系统</h1>
<el-form
@submit.prevent="onSubmit"
ref="form"
:model="form"
label-width="0px"
size="small"
>
<h1>{{ sysName ? sysName : "智慧政务绩效管理系统" }}</h1>
<div class="des">数据驱动绩效改善,强化从指标到目标全过程管理</div>
<el-form-item label="">
<el-input v-model="form.loginName" placeholder="请输入用户名" class="input"></el-input>
<el-input
v-model="form.loginName"
placeholder="请输入用户名"
class="input"
></el-input>
</el-form-item>
<el-form-item label="">
<el-input v-model="form.password" type='password' placeholder="请输入密码" class="input"></el-input>
<el-input
v-model="form.password"
type="password"
placeholder="请输入密码"
class="input"
></el-input>
</el-form-item>
<el-form-item size="large">
<el-button type="primary" native-type='submit' :loading='loading' @click='onSubmit'>登录</el-button>
<el-button
type="primary"
native-type="submit"
:loading="loading"
@click="onSubmit"
>登录</el-button
>
</el-form-item>
<div class="tips">温馨提示:请使用谷歌或火狐等非ie内核浏览器,观看效果更佳</div>
<div class="tips">
温馨提示:请使用谷歌或火狐等非ie内核浏览器,观看效果更佳
</div>
</el-form>
</div>
......@@ -31,7 +54,15 @@ import { createSocket } from "@/assets/utils/websocket";
export default {
name: "login",
created() {},
created() {
this.$route.query.sysName
? localStorage.setItem("sysName", this.$route.query.sysName)
: "";
this.$route.query.sysName
? (document.title = this.$route.query.sysName)
: "";
localStorage.setItem("sysLogo", this.$route.query.sysLogo);
},
methods: {
login() {
this.loading = true;
......@@ -41,11 +72,11 @@ export default {
},
loginSuccess({ data }) {
console.log("userData", data);
console.log("redirect",this.redirect)
console.log("redirect", this.redirect);
this.$store.commit("setUserData", data);
this.$router.replace({
path: this.redirect,
})
});
//成功 创建websocket连接 process.env.VUE_WEBSOCKET_BASE_API +
console.log("process", process.env);
......@@ -81,10 +112,11 @@ export default {
form: {
loginName: "",
password: "",
}
}
}
}
},
sysName: localStorage.getItem("sysName"),
};
},
};
</script>
<style lang="less">
......@@ -94,14 +126,15 @@ export default {
border-top: 2px solid #e8eaec;
}
.page-login {
background-image: url('~@/assets/images/login_bg.jpg');
background-image: url("~@/assets/images/login_bg.jpg");
background-repeat: no-repeat;
background-size: cover;
margin: 0;
height: 100%;
overflow: hidden;
text-align: center;
.des,.tips{
.des,
.tips {
font-size: 14px;
white-space: nowrap;
margin-bottom: 20px;
......@@ -123,33 +156,37 @@ export default {
margin-top: 10px;
width: 240px;
}
.el-form-item{
.el-form-item {
margin-bottom: 28px;
}
.el-input-group__append {
padding: 0;
font-size: 0;
}
.el-input{
.el-input {
width: 80%;
}
.el-input__inner{
border-color: #409EFF;
.el-input__inner {
border-color: #409eff;
border-radius: 20px;
}
.el-input--small .el-input__inner{
.el-input--small .el-input__inner {
height: 52px;
line-height: 1em;
font-size: 15px;
}
.el-input__inner::placeholder{
color: #409EFF;
.el-input__inner::placeholder {
color: #409eff;
}
button{
button {
width: 80%;
border-radius: 20px;
height: 52px;
background: linear-gradient(90deg, rgba(24, 69, 198, 1) 0%, rgba(41, 153, 255, 1) 100%);
background: linear-gradient(
90deg,
rgba(24, 69, 198, 1) 0%,
rgba(41, 153, 255, 1) 100%
);
}
}
.footer {
......@@ -168,4 +205,3 @@ export default {
// border-color: #409EFF;
// }
</style>
......@@ -37,7 +37,7 @@
: item.subAddType == 2
? "扣分方式:"
: "方式:"
}}{{ util_formatters("subMethod", item.subMethod) }}</span
}}{{ util_formatter("subMethod", item.subMethod) }}</span
>
</div>
<div class="user-info">
......
......@@ -47,6 +47,7 @@ import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.time.Duration;
import java.util.Date;
import java.util.List;
import java.util.Map;
import static cn.hutool.core.date.DatePattern.*;
......@@ -278,9 +279,10 @@ public class DingMessageController {
leaveRecordEntity.setProcessStatus(2);
}
if(result.getResult().compareToIgnoreCase("AGREE") == 0){
if(result.getTasks().size() > 1){
if(result.getTasks().get(1).getStatus().compareToIgnoreCase("CANCELED") == 0){
if(result.getTasks().get(1).getStatus().compareToIgnoreCase("CANCELED") != 0){
leaveRecordEntity.setAuditResult(4); //撤销审批完成
}else {
leaveRecordEntity.setAuditResult(1);
......@@ -288,7 +290,8 @@ public class DingMessageController {
}
}else if(result.equals("")){ //撤销假期审批中result会为空 撤销审批通过后result为AGREE
if(result.getTasks().size() > 1){
if(result.getTasks().get(1).getStatus().compareToIgnoreCase("CANCELED") == 0){
log.info("status"+result.getTasks().get(1).getStatus());
if(result.getTasks().get(1).getStatus().compareToIgnoreCase("CANCELED") != 0){
leaveRecordEntity.setAuditResult(3); //撤销审批中
}
}
......@@ -301,7 +304,7 @@ public class DingMessageController {
log.info("钉钉返回的result:"+result.getResult()+"---auditresult:"+leaveRecordEntity.getAuditResult());
leaveRecordEntity.setAuditDesc(result.getOperationRecords().get(0).getRemark());
leaveRecordEntity.setReason(result.getOperationRecords().get(0).getRemark());
//更新请假记录表
AttendanceLeaveRecordEntity recordEntity = attendanceLeaveRecordService.selectOne(new AttendanceLeaveRecordQuery().remark(processInstanceId));
if(ObjectUtils.isEmpty(recordEntity)){
......@@ -335,14 +338,22 @@ public class DingMessageController {
if(leaveRecordsResponseBodyResultRest.getCode() == Rest.SUCCESS){
OapiAttendanceVacationQuotaListResponse.OapiLeaveQuotaUserListVo result1 = leaveRecordsResponseBodyResultRest.getData();
double leaveBlance = 0;
//如果钉钉有假期余额就写入钉钉返回的余额 否则用数据库表数据减去当前请假的天数
if(result1.getLeaveQuotas() != null && result1.getLeaveQuotas().size() > 0){
if(leaveRecordEntity.getAuditResult() == 4) { //撤销休假 要把已经扣除的假期加回来
leaveBlance = (result1.getLeaveQuotas().get(0).getQuotaNumPerDay() + result1.getLeaveQuotas().get(0).getUsedNumPerDay())/100;
}else {
leaveBlance = (result1.getLeaveQuotas().get(0).getQuotaNumPerDay() - result1.getLeaveQuotas().get(0).getUsedNumPerDay())/100;
}
}
// //如果钉钉有假期余额就写入钉钉返回的余额 否则用数据库表数据减去当前请假的天数
// if(result1.getLeaveQuotas() != null && result1.getLeaveQuotas().size() > 0){
// if(leaveRecordEntity.getAuditResult() == 4) { //撤销休假 要把已经扣除的假期加回来
// if(!ObjectUtils.isEmpty(balanceEntity) && balanceEntity.getCompensatedLeaveDays() != null){
// leaveBlance = balanceEntity.getCompensatedLeaveDays().floatValue() + result1.getLeaveQuotas().get(0).getUsedNumPerDay()/100;
// }else {
// leaveBlance = result1.getLeaveQuotas().get(0).getUsedNumPerDay()/100; //秒转换为天
// }
// }else {
// if(!ObjectUtils.isEmpty(balanceEntity) && balanceEntity.getCompensatedLeaveDays() != null){
// leaveBlance = balanceEntity.getCompensatedLeaveDays().floatValue() - result1.getLeaveQuotas().get(0).getUsedNumPerDay()/100;
// }else {
// leaveBlance = - result1.getLeaveQuotas().get(0).getUsedNumPerDay()/100; //秒转换为天
// }
// }
// }
switch (leave_name) {
case "调休":
......
package com.mortals.xhx.module.attendance.service.impl;
import com.mortals.xhx.module.attendance.model.AttendanceVacationBalanceQuery;
import com.mortals.xhx.module.staff.model.StaffEntity;
import com.mortals.xhx.module.staff.service.StaffService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import com.mortals.framework.service.impl.AbstractCRUDServiceImpl;
import com.mortals.framework.exception.AppException;
......@@ -16,4 +20,41 @@ import com.mortals.xhx.module.attendance.service.AttendanceVacationBalanceServic
@Service("attendanceVacationBalanceService")
public class AttendanceVacationBalanceServiceImpl extends AbstractCRUDServiceImpl<AttendanceVacationBalanceDao, AttendanceVacationBalanceEntity, Long> implements AttendanceVacationBalanceService {
@Autowired
private StaffService staffService;
@Override
protected void saveBefore(AttendanceVacationBalanceEntity entity, Context context) throws AppException {
super.saveBefore(entity,context);
if(entity.getStaffId()==null){
throw new AppException("员工ID不能为空");
}
StaffEntity staff = staffService.get(entity.getStaffId());
if(staff==null){
throw new AppException("员工ID不正确");
}
entity.setStaffName(staff.getName());
entity.setDeptId(staff.getDeptId());
entity.setDeptName(staff.getDeptName());
}
@Override
public AttendanceVacationBalanceEntity save(AttendanceVacationBalanceEntity entity, Context context) throws AppException {
this.saveBefore(entity, context);
AttendanceVacationBalanceEntity temp = this.selectOne(new AttendanceVacationBalanceQuery().staffId(entity.getStaffId()));
int iRet = 0;
if(temp!=null){
entity.setId(temp.getId());
iRet = this.dao.update(entity);
}else {
iRet = this.dao.insert(entity);
}
if (iRet == 0) {
throw new AppException(-1001, "写入数据库失败!");
} else {
this.saveAfter(entity, context);
return entity;
}
}
}
\ No newline at end of file
......@@ -141,9 +141,9 @@ public class DingPersonServiceImpl extends AbstractDingTalkService implements ID
*/
public com.aliyun.teaopenapi.models.Config setConfig() {
com.aliyun.teaopenapi.models.Config config = new com.aliyun.teaopenapi.models.Config();
config.protocol = "http";
config.regionId = "central";
config.endpoint = oaUrl;
// config.protocol = "http";
// config.regionId = "central";
// config.endpoint = oaUrl;
return config;
}
......@@ -153,9 +153,9 @@ public class DingPersonServiceImpl extends AbstractDingTalkService implements ID
com.aliyun.dingtalkworkflow_1_0.Client client = new com.aliyun.dingtalkworkflow_1_0.Client(setConfig());
com.aliyun.dingtalkworkflow_1_0.models.GetProcessInstanceHeaders getProcessInstanceHeaders = new com.aliyun.dingtalkworkflow_1_0.models.GetProcessInstanceHeaders();
getProcessInstanceHeaders.xAcsDingtalkAccessToken = getToken();
HashMap<String, String> map = new HashMap<>();
getProcessInstanceHeaders.setCommonHeaders(map);
getProcessInstanceHeaders.getCommonHeaders().put("host", "172.15.28.113:8919");
// HashMap<String, String> map = new HashMap<>();
// getProcessInstanceHeaders.setCommonHeaders(map);
// getProcessInstanceHeaders.getCommonHeaders().put("host", "172.15.28.113:8919");
com.aliyun.dingtalkworkflow_1_0.models.GetProcessInstanceRequest getProcessInstanceRequest = new com.aliyun.dingtalkworkflow_1_0.models.GetProcessInstanceRequest()
.setProcessInstanceId(processInstanceId);
......
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