This commit is contained in:
@jyuhsin
2025-09-29 08:59:18 +08:00
parent 67f1349024
commit 8f835e3fc7
19 changed files with 853 additions and 164 deletions
@@ -1,18 +1,32 @@
package com.budwk.app.zhgh.dayofficework.literacy.controller.manage;
import cn.dev33.satoken.annotation.SaCheckPermission;
import cn.hutool.core.util.StrUtil;
import com.budwk.app.base.annotation.SLog;
import com.budwk.app.base.page.Pagination;
import com.budwk.app.base.param.PageForm;
import com.budwk.app.base.result.Result;
import com.budwk.app.base.service.BaseService;
import com.budwk.app.base.utils.PageUtil;
import com.budwk.app.zhgh.dayofficework.literacy.models.LiteracySourceCourse;
import com.budwk.app.zhgh.dayofficework.literacy.models.LiteracyTeacher;
import io.swagger.annotations.Api;
import lombok.extern.slf4j.Slf4j;
import org.nutz.aop.interceptor.ioc.TransAop;
import org.nutz.dao.Cnd;
import org.nutz.dao.Dao;
import org.nutz.dao.Sqls;
import org.nutz.dao.sql.Sql;
import org.nutz.ioc.aop.Aop;
import org.nutz.ioc.loader.annotation.Inject;
import org.nutz.ioc.loader.annotation.IocBean;
import org.nutz.lang.util.NutMap;
import org.nutz.mvc.annotation.At;
import org.nutz.mvc.annotation.Ok;
import org.nutz.mvc.annotation.Param;
import java.util.List;
/**
* @ClassName LiteracyCourseController
* @Author JyuHsin
@@ -40,8 +54,76 @@ public class LiteracyCourseController {
@At
@SaCheckPermission("literacy.course")
public Result pageData(PageForm pageForm) {
public Result pageData(PageForm pageForm,
@Param("courseType") String courseType,
@Param("teacherId") String teacherId) {
Sql sql = Sqls.create("""
SELECT
sc.*,
t.typeName,
te.NAME AS teacherName
FROM
`literacy_source_course` sc
LEFT JOIN literacy_type t ON sc.courseType = t.id
LEFT JOIN literacy_teacher te ON sc.courseInstructor = te.id
$condition
""");
Cnd cnd = Cnd.NEW();
cnd.and(Cnd.likeEX("sc.courseName", pageForm.getSearchKeyword()));
cnd.andEX("sc.courseType", "=", courseType);
cnd.andEX("sc.courseInstructor", "=", teacherId);
if (StrUtil.isAllBlank(pageForm.getPageOrderName(), pageForm.getPageOrderBy())) {
cnd.desc("sc.createdAt");
} else {
cnd.orderBy(pageForm.getPageOrderName(), PageUtil.getOrder(pageForm.getPageOrderBy()));
}
sql.setCondition(cnd);
Pagination pagination = baseService.listPageMap(pageForm.getPageNumber(), pageForm.getPageSize(), sql);
return Result.success(pagination);
}
@At
@Aop(TransAop.READ_COMMITTED)
@SaCheckPermission("literacy.course")
@SLog(type = "职工素养-课程管理", tag = "新增/编辑", msg = "新增/编辑教师")
public Result submit(LiteracySourceCourse sourceCourse) {
if(StrUtil.isNotBlank(sourceCourse.getId())) {
dao.updateIgnoreNull(sourceCourse);
} else {
sourceCourse.setOpenOtherUnion(false);
dao.insert(sourceCourse);
}
return Result.success();
}
@At
@Aop(TransAop.READ_COMMITTED)
@SaCheckPermission("literacy.course")
@SLog(type = "职工素养-课程管理", tag = "删除", msg = "删除教师")
public Object delete(@Param(value = "id") String id) {
dao.clear(LiteracySourceCourse.class, Cnd.where("id", "=", id));
return Result.success();
}
@At
@Aop(TransAop.READ_COMMITTED)
@SaCheckPermission("literacy")
public Object querySourceCourses() {
Sql sql = Sqls.create("""
SELECT
sc.*,
t.typeName,
te.NAME AS teacherName,
te.NAME AS courseInstructor
FROM
`literacy_source_course` sc
LEFT JOIN literacy_type t ON sc.courseType = t.id
LEFT JOIN literacy_teacher te ON sc.courseInstructor = te.id
""");
List<NutMap> list = baseService.listMap(sql);
return Result.success(list);
}
}
@@ -21,8 +21,10 @@ import java.util.List;
@EqualsAndHashCode(callSuper = false)
public class LiteracyActivity extends BaseModel implements Serializable, SysHomeConvert {
@Name
@PrevInsert(uu32 = true)
@Name
@Comment("ID")
@ColDefine(type = ColType.VARCHAR, width = 32)
@PrevInsert(uu32 = true)
private String id;
@Column
@@ -15,8 +15,10 @@ import java.util.Date;
@EqualsAndHashCode(callSuper = false)
public class LiteracyActivityCourse {
@Name
@PrevInsert(uu32 = true)
@Name
@Comment("ID")
@ColDefine(type = ColType.VARCHAR, width = 32)
@PrevInsert(uu32 = true)
private String id;
@Column
@@ -13,9 +13,10 @@ import org.nutz.dao.interceptor.annotation.PrevInsert;
@EqualsAndHashCode(callSuper = false)
public class LiteracyBlackList {
@Name
@ColDefine(type = ColType.VARCHAR, width = 32)
@PrevInsert(uu32 = true)
@Name
@Comment("ID")
@ColDefine(type = ColType.VARCHAR, width = 32)
@PrevInsert(uu32 = true)
private String id;
@Column
@@ -16,10 +16,12 @@ import java.util.List;
@Comment("职工素养的子活动")
@Table
@EqualsAndHashCode(callSuper = false)
public class LiteracyCourse extends BaseModel implements Serializable {
public class LiteracyCourse extends LiteracySourceCourse implements Serializable {
@Name
@PrevInsert(uu32 = true)
@Name
@Comment("ID")
@ColDefine(type = ColType.VARCHAR, width = 32)
@PrevInsert(uu32 = true)
private String id;
@Column
@@ -27,137 +29,23 @@ public class LiteracyCourse extends BaseModel implements Serializable {
@Comment("活动ID")
private String activityId;
@Column
@ColDefine(type = ColType.VARCHAR, width = 50)
@Comment("课程名称")
private String courseName;
@Column
@ColDefine(type = ColType.INT)
@Comment("课程人数")
private int coursePeopleNumber;
@Column
@ColDefine(type = ColType.INT)
@Default(value = "0")
@Comment("预留名额")
private int courseReservedNumber;
@Column
@ColDefine(type = ColType.VARCHAR, width = 50)
@Comment("课程地点")
private String courseLocation;
@Column
@ColDefine(type = ColType.VARCHAR, width = 32)
@Comment("课程类型")
private String courseType;
@Column
@ColDefine(type = ColType.MYSQL_JSON)
@Comment("课程地点坐标")
private List<Double> courseLocationCoordinates;
@Column
@ColDefine(type = ColType.VARCHAR, width = 20)
@Comment("课程讲师")
private String courseInstructor;
@Column
@ColDefine(type = ColType.VARCHAR, width = 32)
@Comment("校区")
private String campus;
@Column
@ColDefine(type = ColType.BOOLEAN)
@Comment("报名人数是否限制")
private Boolean courseIsLimitApply;
@Column
@ColDefine(type = ColType.INT)
@Comment("序号")
private int orderNum;
@Column
@ColDefine(customType = "longtext")
@Comment("详细信息")
private String introduce;
@Many(field = "courseId")
private List<LiteracyActivityCourse> courseTimeList;
@Column
@Comment("分工会人数限制")
@ColDefine(type = ColType.MYSQL_JSON)
private List<NutMap> unionLimit;
//已报人数
private Integer hasRegisterNum;
private Boolean isBringFamily;
private Boolean isAddFamily;
//是否报过该课程
private Boolean isSign;
//还能报该类型的课程吗
private Boolean canSignThisCourseType;
@Column
@Comment("分工会人数限制")
@ColDefine(type = ColType.MYSQL_JSON)
private List<NutMap> unionLimit;
@Column
@ColDefine(type = ColType.BOOLEAN)
@Comment("移动端是否签到")
private boolean isMobileSign;
@Column
@ColDefine(type = ColType.INT)
@Comment("签到方式 1.扫描二维码签到 2.被扫 3.gps签到")
private Integer signType;
@Column
@ColDefine(type = ColType.BOOLEAN)
@Comment("移动端是否签收礼品")
private boolean isReceiveGift;
@Column
@ColDefine(type = ColType.INT)
@Comment("领取礼品方式 1.扫描二维码 2.线下")
private Integer giftType;
@Column
@ColDefine(type = ColType.INT)
@Comment("预留名额方式 1.报名人员减少模式 2.报名人数不变模式")
private Integer reserveMode;
@Column
@Comment("承办工会")
@ColDefine(type = ColType.VARCHAR, width = 32)
private String hostUnionId;
@Column
@Comment("对内报名时间")
@ColDefine(type = ColType.VARCHAR, width = 32)
private String interTime;
@Column
@Comment("是否开放给其他工会")
@ColDefine(type = ColType.BOOLEAN, width = 4)
private Boolean openOtherUnion;
@Column
@Comment("分类标识")
@ColDefine(type = ColType.VARCHAR, width = 30)
private String assort;
@Column
@ColDefine(type = ColType.INT)
@Default(value = "0")
@Comment("候补名额数")
private Integer waitingNum;
//候补已报人数
private Integer hasWaitingNum;
private String courseTimeName;
}
@@ -17,10 +17,10 @@ public class LiteracyMobileSignColumn {
private static final long serialVersionUID = 1L;
@Name
@Comment("id")
@ColDefine(type = ColType.VARCHAR, width = 32)
@PrevInsert(uu32 = true)
@Name
@Comment("ID")
@ColDefine(type = ColType.VARCHAR, width = 32)
@PrevInsert(uu32 = true)
private String id;
@Column
@@ -0,0 +1,145 @@
package com.budwk.app.zhgh.dayofficework.literacy.models;
import cn.hutool.json.JSONObject;
import com.budwk.app.base.model.BaseModel;
import lombok.Data;
import lombok.EqualsAndHashCode;
import lombok.experimental.Accessors;
import org.nutz.dao.entity.annotation.*;
import org.nutz.dao.interceptor.annotation.PrevInsert;
import org.nutz.lang.util.NutMap;
import java.util.List;
/**
* @ClassName LiteracySourceCourse
* @Author JyuHsin
* @Date 2025/9/28 14:46
* @Version 1.0
* @Description TODO
*/
@Data
@Accessors(chain = true)
@Comment("职工素养-课程管理")
@Table
@EqualsAndHashCode(callSuper = false)
public class LiteracySourceCourse extends BaseModel {
@Name
@Comment("ID")
@ColDefine(type = ColType.VARCHAR, width = 32)
@PrevInsert(uu32 = true)
private String id;
@Column
@ColDefine(type = ColType.VARCHAR, width = 50)
@Comment("课程名称")
private String courseName;
@Column
@ColDefine(type = ColType.INT)
@Comment("课程人数")
private int coursePeopleNumber;
@Column
@ColDefine(type = ColType.INT)
@Default(value = "0")
@Comment("预留名额")
private int courseReservedNumber;
@Column
@ColDefine(type = ColType.VARCHAR, width = 50)
@Comment("课程地点")
private String courseLocation;
@Column
@ColDefine(type = ColType.VARCHAR, width = 32)
@Comment("课程类型")
private String courseType;
@Column
@ColDefine(type = ColType.MYSQL_JSON)
@Comment("课程地点坐标")
private List<Double> courseLocationCoordinates;
@Column
@ColDefine(type = ColType.VARCHAR, width = 50)
@Comment("课程讲师")
private String courseInstructor;
@Column
@ColDefine(type = ColType.VARCHAR, width = 32)
@Comment("校区")
private String campus;
@Column
@ColDefine(type = ColType.BOOLEAN)
@Comment("报名人数是否限制")
private Boolean courseIsLimitApply;
@Column
@ColDefine(type = ColType.INT)
@Comment("序号")
private int orderNum;
@Column
@ColDefine(customType = "longtext")
@Comment("详细信息")
private String introduce;
@Column
@ColDefine(type = ColType.BOOLEAN)
@Comment("移动端是否签到")
private boolean isMobileSign;
@Column
@ColDefine(type = ColType.INT)
@Comment("签到方式 1.扫描二维码签到 2.被扫 3.gps签到")
private Integer signType;
@Column
@ColDefine(type = ColType.BOOLEAN)
@Comment("移动端是否签收礼品")
private boolean isReceiveGift;
@Column
@ColDefine(type = ColType.INT)
@Comment("领取礼品方式 1.扫描二维码 2.线下")
private Integer giftType;
@Column
@ColDefine(type = ColType.INT)
@Comment("预留名额方式 1.报名人员减少模式 2.报名人数不变模式")
private Integer reserveMode;
@Column
@Comment("承办工会")
@ColDefine(type = ColType.VARCHAR, width = 32)
private String hostUnionId;
@Column
@Comment("对内报名时间")
@ColDefine(type = ColType.VARCHAR, width = 32)
private String interTime;
@Column
@Comment("是否开放给其他工会")
@ColDefine(type = ColType.BOOLEAN, width = 4)
private Boolean openOtherUnion;
@Column
@Comment("分类标识")
@ColDefine(type = ColType.VARCHAR, width = 30)
private String assort;
@Column
@ColDefine(type = ColType.INT)
@Default(value = "0")
@Comment("候补名额数")
private Integer waitingNum;
@Column
@ColDefine(type = ColType.MYSQL_JSON)
@Comment("时间段")
private List<JSONObject> timeList;
}
@@ -20,10 +20,10 @@ public class LiteracyTeacher extends BaseModel implements Serializable {
@Serial
private static final long serialVersionUID = 1L;
@Name
@Comment("id")
@ColDefine(type = ColType.VARCHAR, width = 32)
@PrevInsert(uu32 = true)
@Name
@Comment("ID")
@ColDefine(type = ColType.VARCHAR, width = 32)
@PrevInsert(uu32 = true)
private String id;
@Column
@@ -21,10 +21,10 @@ public class LiteracyType extends BaseModel implements Serializable {
@Serial
private static final long serialVersionUID = 1L;
@Name
@Comment("id")
@ColDefine(type = ColType.VARCHAR, width = 32)
@PrevInsert(uu32 = true)
@Name
@Comment("ID")
@ColDefine(type = ColType.VARCHAR, width = 32)
@PrevInsert(uu32 = true)
private String id;
@Column
@@ -17,10 +17,10 @@ public class LiteracyTypeLimit implements Serializable {
private static final long serialVersionUID = 1L;
@Name
@Comment("id")
@ColDefine(type = ColType.VARCHAR, width = 32)
@PrevInsert(uu32 = true)
@Name
@Comment("ID")
@ColDefine(type = ColType.VARCHAR, width = 32)
@PrevInsert(uu32 = true)
private String id;
@Column
@@ -19,8 +19,10 @@ import java.util.List;
@TableIndexes({@Index(name = "INDEX_TRAIN_SIGN_UP_USER_COURSEID", fields = {"courseId"}, unique = false)})
public class LiteracyUser implements Serializable {
@Name
@PrevInsert(uu32 = true)
@Name
@Comment("ID")
@ColDefine(type = ColType.VARCHAR, width = 32)
@PrevInsert(uu32 = true)
private String id;
@Column
@@ -20,8 +20,10 @@ import java.util.Date;
})
public class LiteracyUserCourse implements Serializable {
@Name
@PrevInsert(uu32 = true)
@Name
@Comment("ID")
@ColDefine(type = ColType.VARCHAR, width = 32)
@PrevInsert(uu32 = true)
private String id;
@Column
@@ -3,7 +3,18 @@ layout("/layouts/platform.html"){
#-->
<style>
.el-drawer__body {
padding: 20px;
}
.my-drawer .el-col-4 {
text-align: right;
}
.my-drawer .el-row {
margin-bottom: 20px;
}
.courseTimeButton {
padding: 0 !important;
}
</style>
<div id="app" v-cloak>
@@ -0,0 +1,231 @@
<!--#include('courseTime.js'){}#-->
const basicForm = {
template: /*language=HTML*/ `
<div>
<el-form label-width="120px" :model="formData" ref="form" :rules="rules">
<el-row :gutter="20">
<el-col :span="12">
<el-form-item prop="courseName" label="课程名称">
<el-input v-model="formData.courseName" placeholder="请输入课程名称"></el-input>
</el-form-item>
</el-col>
<el-col :span="12">
<el-form-item prop="courseType" label="课程类型">
<el-select v-model="formData.courseType" placeholder="请选择课程类型" style="width: 100%" clearable filterable>
<el-option v-for="item in typeOptions" :key="item.id" :label="item.typeName"
:value="item.id"></el-option>
</el-select>
</el-form-item>
</el-col>
<el-col :span="12">
<el-form-item prop="coursePeopleNumber" label="课程人数">
<el-input v-model="formData.coursePeopleNumber" placeholder="请输入课程人数"></el-input>
</el-form-item>
</el-col>
<el-col :span="12">
<el-form-item prop="courseReservedNumber" label="预留名额">
<el-input v-model="formData.courseReservedNumber" placeholder="请输入预留名额" type="number"></el-input>
</el-form-item>
</el-col>
<el-col :span="12">
<el-form-item prop="campus" label="校区">
<el-select v-model="formData.campus" style="width: 100%" placeholder="请选择校区" clearable filterable>
<el-option :label="item.name" :value="item.name" :key="item.code" v-for="item in dict.type.USER_CAMPUS"></el-option>
</el-select>
</el-form-item>
</el-col>
<el-col :span="12">
<el-form-item prop="courseLocation" label="上课地点">
<el-input v-model="formData.courseLocation" placeholder="请输入上课地点"></el-input>
</el-form-item>
</el-col>
<el-col :span="12">
<el-form-item prop="courseInstructor" label="负责人">
<el-select v-model="formData.courseInstructor" placeholder="请选择负责人" style="width: 100%" clearable filterable>
<el-option v-for="item in teacherOptions" :key="item.id" :label="item.name"
:value="item.id"></el-option>
</el-select>
</el-form-item>
</el-col>
<el-col :span="12">
<el-form-item prop="assort" label="分类标识">
<el-input v-model="formData.assort" placeholder="请输入分类标识"></el-input>
</el-form-item>
</el-col>
<el-col :span="12">
<el-form-item prop="hostUnionId" label="承办工会">
<el-select v-model="formData.hostUnionId" placeholder="请选择承办工会" style="width: 100%" clearable filterable>
<el-option :label="item.name" :value="item.id" :key="item.id"
v-for="item in unionList"></el-option>
</el-select>
</el-form-item>
</el-col>
<el-col :span="12">
<el-form-item prop="interTime" label="对内报名时间">
<el-date-picker
placeholder="请选择对内报名时间"
style="width: 100%"
type="datetime"
v-model="formData.interTime"
format="yyyy-MM-dd HH:mm"
value-format="yyyy-MM-dd HH:mm"
></el-date-picker>
</el-form-item>
</el-col>
<el-col :span="12">
<el-form-item prop="timeList" label="课程时间">
<el-button type="primary" @click="openSetUpCourseTime" size="small">点击设置课程时间</el-button>
<span style="color: #c64120">您已设置{{ formData.timeList.length || 0 }}个课程时间</span>
</el-form-item>
</el-col>
<el-col :span="12">
<el-form-item prop="isMobileSign" label="是否签到">
<el-radio-group v-model="formData.isMobileSign" size="small">
<el-radio border :label="true">签到</el-radio>
<el-radio border :label="false">不签到</el-radio>
</el-radio-group>
</el-form-item>
</el-col>
<el-col :span="12">
<el-form-item prop="signType" label="签到方式" v-if="formData.isMobileSign === true">
<el-radio-group v-model="formData.signType" size="small">
<el-radio border :label="1">扫描二维码</el-radio>
<el-radio border :label="2">被扫</el-radio>
<el-radio border :label="3">GPS定位签到</el-radio>
</el-radio-group>
</el-form-item>
</el-col>
<el-col :span="12">
<el-form-item prop="courseLocationCoordinates" label="地点坐标" v-if="formData.isMobileSign === true && formData.signType === 3">
<el-button type="primary" @click="" size="small">点击设置地点坐标</el-button>
</el-form-item>
</el-col>
<el-col :span="12">
<el-form-item prop="isReceiveGift" label="是否领取礼品">
<el-radio-group v-model="formData.isReceiveGift" size="small">
<el-radio border :label="true">领取</el-radio>
<el-radio border :label="false">不领取</el-radio>
</el-radio-group>
</el-form-item>
</el-col>
<el-col :span="12">
<el-form-item prop="giftType" label="领取方式" v-if="formData.isReceiveGift === true">
<el-radio-group v-model="formData.giftType" size="small">
<el-radio border :label="1">扫描二维码</el-radio>
<el-radio border :label="2">面对面确认</el-radio>
</el-radio-group>
</el-form-item>
</el-col>
<el-col :span="12">
<el-form-item prop="reserveMode" label="报名方式">
<el-radio-group v-model="formData.reserveMode" size="small">
<el-radio border :label="1">报名人员减少模式</el-radio>
<el-radio border :label="2">候补模式</el-radio>
</el-radio-group>
</el-form-item>
</el-col>
<el-col :span="12">
<el-form-item prop="waitingNum" label="候补数量" v-if="formData.reserveMode === 2">
<el-input placeholder="请输入候补数量" v-model="formData.waitingNum" type="number"></el-input>
</el-form-item>
</el-col>
</el-row>
<el-form-item prop="introduce" label="详细信息">
<text-editor v-model="formData.introduce"></text-editor>
</el-form-item>
</el-form>
<div style="float: right; margin: 20px 0">
<el-button @click="$emit('refresh')">取 消</el-button>
<el-button type="primary" @click="submit">确 定</el-button>
</div>
<course-time ref="courseTimeRef"></course-time>
</div>
`,
dicts: ["USER_CAMPUS"],
data() {
return {
formData: {
courseReservedNumber: 0,
timeList: [],
unionLimit: [],
isMobileSign: false,
signType: 1,
isReceiveGift: false,
giftType: 1,
reserveMode: 1,
},
rules: {
courseName: [{ required: true, message: "必填", trigger: ["change", "blur"] }],
courseType: [{ required: true, message: "必填", trigger: ["change", "blur"] }],
coursePeopleNumber: [{ required: true, message: "必填", trigger: ["change", "blur"] }],
courseReservedNumber: [{ required: true, message: "必填", trigger: ["change", "blur"] }],
campus: [{ required: true, message: "必填", trigger: ["change", "blur"] }],
courseLocation: [{ required: true, message: "必填", trigger: ["change", "blur"] }],
courseInstructor: [{ required: true, message: "必填", trigger: ["change", "blur"] }],
timeList: [{ required: true, message: "必填", trigger: ["change", "blur"] }],
isMobileSign: [{ required: true, message: "必填", trigger: ["change", "blur"] }],
signType: [{ required: true, message: "必填", trigger: ["change", "blur"] }],
isReceiveGift: [{ required: true, message: "必填", trigger: ["change", "blur"] }],
giftType: [{ required: true, message: "必填", trigger: ["change", "blur"] }],
reserveMode: [{ required: true, message: "必填", trigger: ["change", "blur"] }],
waitingNum: [{ required: true, message: "必填", trigger: ["change", "blur"] }],
courseLocationCoordinates: [{ required: true, message: "必填", trigger: ["change", "blur"] }],
},
typeOptions: [],
teacherOptions: [],
unionList: [],
}
},
components: {
"course-time": courseTime,
},
methods: {
onOpen(row) {
if(row && row.timeList) {
row.timeList = JSON.parse(row.timeList)
}
this.formData = clone(row)
},
async submit() {
const valid = await this.$refs["form"].validate()
if (valid) {
this.$confirm("您确定要提交吗?", "提示", {
confirmButtonText: "确定",
cancelButtonText: "取消",
type: "warning"
}).then(() => {
const formData = clone(this.formData)
formData.timeList = JSON.stringify(formData.timeList)
this.$axios.post('/platform/literacy/course/submit', formData).then(res => {
if (res.code === 0) {
this.$message.success(res.msg)
this.$emit('refresh')
}
})
})
}
},
openSetUpCourseTime() {
this.$refs.courseTimeRef.onOpen(this.formData)
},
async getTypeOptions() {
const resp = await this.$axios.post("/platform/literacy/type/getAllType")
this.typeOptions = resp.data
},
async getTeacherOptions() {
const resp = await this.$axios.post("/platform/literacy/teacher/queryTeachers")
this.teacherOptions = resp.data
},
},
async created() {
await this.getTypeOptions()
await this.getTeacherOptions()
this.unionList = await this.$businessTool.listUnion()
},
style: /*language=CSS*/ `
`
}
@@ -0,0 +1,189 @@
const courseTime = {
template: /*language=HTML*/ `
<div>
<el-dialog :close-on-click-modal="false" :visible.sync="setUpCourseDialog" title="设置时间" width="60%" append-to-body>
<div style="color: red; margin-bottom: 10px">温馨提示:有人员报名后,禁止修改下列时间,如有修改,请联系管理员</div>
<div class="left-span-label">选择日期</div>
<el-date-picker
@change="setUpCourseDataChange"
placeholder="选择一个或多个日期"
style="width: 100%"
type="dates"
v-model="formData.setUpCourseData"
value-format="yyyy-MM-dd"
></el-date-picker>
<div class="left-span-label">设置时间</div>
<el-row style="margin-bottom: 10px">
<el-time-select
:picker-options="{
start: '08:30',
step: '00:05',
end: '23:30'
}"
placeholder="开始时间"
size="mini"
v-model="courseTimeOneKeySet.startTime"
></el-time-select>
<el-time-select
:picker-options="{
start: '08:30',
step: '00:05',
end: '23:30'
}"
placeholder="结束时间"
size="mini"
v-model="courseTimeOneKeySet.endTime"
></el-time-select>
<el-button @click="oneKeySetStartEndTime" size="mini" type="primary">一键设置开始/结束时间</el-button>
<span style="color: #ac3111">报名人数是否限制:</span>
<el-radio-group size="mini" v-model="formData.courseIsLimitApply">
<el-radio-button :label="true">是</el-radio-button>
<el-radio-button :label="false">否</el-radio-button>
</el-radio-group>
</el-row>
<el-table :data="formData.timeList">
<el-table-column label="日期">
<template v-slot="{row}">
<i class="el-icon-time"></i>
{{$moment(row.courseDate).format('YYYY-MM-DD')}}
</template>
</el-table-column>
<el-table-column label="开始时间">
<template v-slot="{row}">
<el-time-select
:picker-options="{
start: '08:30',
step: '00:05',
end: '23:30'
}"
placeholder="开始时间"
style="width: 100%"
v-model="row.courseStartTime"
></el-time-select>
</template>
</el-table-column>
<el-table-column label="结束时间">
<template v-slot="{row}">
<el-time-select
:picker-options="{
start: '08:30',
step: '00:05',
end: '23:30'
}"
placeholder="结束时间"
style="width: 100%"
v-model="row.courseEndTime"
></el-time-select>
</template>
</el-table-column>
<template v-if="formData.courseIsLimitApply">
<el-table-column label="人数限制">
<template v-slot="{row}">
<el-input-number v-model="row.courseLimitNum" :min="1" :max="1000"
style="width: 100%"
placeholder="限制报名个数"></el-input-number>
</template>
</el-table-column>
</template>
<el-table-column label="操作" width="260">
<template v-slot="{row,$index}">
<el-button
@click="formData.timeList.splice($index,0,{courseDate:row.courseDate,courseStartTime:'',courseEndTime:''})"
size="small"
>
新增同天时段
</el-button>
<el-button @click="removeSetUpTableCourseRow(row,$index)" size="small" type="danger">删除</el-button>
</template>
</el-table-column>
</el-table>
<el-row class="mt20" justify="end" type="flex">
<el-button @click="doConfirmSetUpCourse" type="primary">确定</el-button>
</el-row>
</el-dialog>
</div>
`,
data() {
return {
setUpCourseDialog: false,
formData: {},
courseTimeOneKeySet: {
startTime: "",
endTime: ""
},
}
},
methods: {
removeSetUpTableCourseRow(row, index) {
this.formData.timeList.splice(index, 1)
//培训时间列表日期数组
const courseDateArray = this.formData.timeList.map((v) =>
this.$moment(v.courseDate).format("YYYY-MM-DD")
)
//选择课程日期数组
const scdList = this.formData.setUpCourseData
this.formData.setUpCourseData = scdList.filter((v) => {
return courseDateArray.includes(this.$moment(v).format("YYYY-MM-DD"))
})
},
oneKeySetStartEndTime() {
const { startTime, endTime } = this.courseTimeOneKeySet
this.formData.timeList.forEach((v) => {
this.$set(v, "courseStartTime", startTime)
this.$set(v, "courseEndTime", endTime)
})
this.$forceUpdate()
},
setUpCourseDataChange(val) {
if (!val) {
this.formData.timeList = []
return
}
//培训时间日期Set
if (this.formData.timeList === undefined) {
this.$set(this.formData, "timeList", [])
}
const ctList = new Set(
this.formData.timeList.map((v) => this.$moment(v.courseDate).format("YYYY-MM-DD"))
)
val.forEach((v) => {
if (!ctList.has(v)) {
this.formData.timeList.push({
courseDate: v,
courseTime: null
})
}
})
this.formData.timeList = this.formData.timeList.filter((v) => {
return val.includes(this.$moment(v.courseDate).format("YYYY-MM-DD"))
})
this.formData.timeList.sort((a, b) => {
return Date.parse(a["courseDate"]) - Date.parse(b["courseDate"])
})
},
//设置课程时间确定
doConfirmSetUpCourse() {
const courseTableData = this.formData.timeList
if (courseTableData.length === 0) {
this.$message.warning("请填写时间!")
return
}
if (courseTableData && courseTableData.length > 0) {
const valid = courseTableData.every((v) => v.courseStartTime && v.courseEndTime && v.courseStartTime < v.courseEndTime)
if (!valid) {
this.$message.warning("时间填写不完整或者有误!")
return
}
this.setUpCourseDialog = false
}
},
onOpen(formData) {
this.formData = formData
this.setUpCourseDialog = true
},
},
style: /*language=CSS*/ `
`
}
@@ -12,7 +12,7 @@ layout("/layouts/platform.html"){
<el-card shadow="never">
<search @search="doSearch">
<search-item label="课程名称:">
<el-input clearable placeholder="请输入课程名称" v-model="pageForm.courseName"></el-input>
<el-input clearable placeholder="请输入课程名称" v-model="pageForm.searchKeyword"></el-input>
</search-item>
<search-item label="课程类型:">
<el-select clearable filterable placeholder="请选择课程类型" style="width: 100%"
@@ -50,8 +50,8 @@ layout("/layouts/platform.html"){
<el-table-column label="序号" type="index" :index="indexMethod" width="60"></el-table-column>
<el-table-column label="课程名称" prop="courseName"></el-table-column>
<el-table-column label="类型名称" prop="typeName"></el-table-column>
<el-table-column label="课程人数" prop="peopleNumber"></el-table-column>
<el-table-column label="预留人数" prop="reservedNumber"></el-table-column>
<el-table-column label="课程人数" prop="coursePeopleNumber"></el-table-column>
<el-table-column label="预留人数" prop="courseReservedNumber"></el-table-column>
<el-table-column label="上课地点" prop="courseLocation"></el-table-column>
<el-table-column label="课程讲师" prop="teacherName"></el-table-column>
<el-table-column label="操作" width="230px">
@@ -67,15 +67,17 @@ layout("/layouts/platform.html"){
</template>
<template #edit>
<basic-form ref="formRef" @refresh="refresh"></basic-form>
</template>
<template #view>
<info ref="infoRef"></info>
</template>
</guava>
</div>
<script>
<!--#include('basicForm.js'){}#-->
<!--#include('info.js'){}#-->
new Vue({
el: "#app",
mixins: [initTableMixins],
@@ -86,15 +88,47 @@ layout("/layouts/platform.html"){
}
},
components: {
"basic-form": basicForm,
"info": info,
},
methods: {
onAdd() {},
onView(row) {},
onEdit(row) {},
onDelete(row) {},
onAdd() {
this.$refs.guava.edit(() => {
this.$refs.formRef.onOpen()
})
},
onView(row) {
this.$refs.guava.view(() => {
this.$refs.infoRef.onOpen(row)
})
},
onEdit(row) {
this.$refs.guava.edit(() => {
this.$refs.formRef.onOpen(row)
})
},
onDelete(row) {
this.$confirm("您确定要删除吗?", "提示", {
confirmButtonText: "确定",
cancelButtonText: "取消",
type: "warning"
})
.then(() => {
$.post("/platform/literacy/course/delete", { id: row.id }).then((res) => {
if (res.code === 0) {
this.$message.success(res.msg)
this.pageData()
}
})
})
.catch(() => {})
},
refresh() {
this.pageData()
this.$refs.guava.index()
},
pageData() {
this.$axios.post("/platform/seniorUniversity/course/pageData", this.pageForm).then((res) => {
this.$axios.post("/platform/literacy/course/pageData", this.pageForm).then((res) => {
if (res.code === 0) {
this.tableData = res.data.list
this.pageForm.totalCount = res.data.totalCount
@@ -113,6 +147,7 @@ layout("/layouts/platform.html"){
async created() {
this.typeOptions = await this.queryTypes()
this.teacherOptions = await this.queryTeachers()
this.pageData()
}
})
</script>
@@ -0,0 +1,80 @@
const info = {
template: `
<div>
<el-descriptions :column="2" border class="mt20">
<el-descriptions-item label="课程名称">
{{viewData.courseName}}
</el-descriptions-item>
<el-descriptions-item label="课程类型">
{{viewData.typeName}}
</el-descriptions-item>
<el-descriptions-item label="课程人数">
{{viewData.coursePeopleNumber}}
</el-descriptions-item>
<el-descriptions-item label="预留人数">
{{viewData.courseReservedNumber}}
</el-descriptions-item>
<el-descriptions-item label="校区">
{{viewData.campus}}
</el-descriptions-item>
<el-descriptions-item label="上课地点">
{{viewData.courseLocation}}
</el-descriptions-item>
<el-descriptions-item label="负责人">
{{viewData.teacherName}}
</el-descriptions-item>
<el-descriptions-item label="分类标识">
{{viewData.assort}}
</el-descriptions-item>
<el-descriptions-item label="承办工会">
</el-descriptions-item>
<el-descriptions-item label="对内报名时间">
</el-descriptions-item>
<el-descriptions-item label="是否签到">
{{viewData.isMobileSign ? '签到' : '不签到'}}
</el-descriptions-item>
<el-descriptions-item v-if="viewData.isMobileSign === true" label="签到方式">
<span v-if="viewData.signType === 1">扫描二维码</span>
<span v-if="viewData.signType === 2">被扫</span>
<span v-if="viewData.signType === 3">GPS签到</span>
</el-descriptions-item>
<el-descriptions-item label="是否领取礼品">
{{viewData.isReceiveGift ? '领取' : '不领取'}}
</el-descriptions-item>
<el-descriptions-item v-if="viewData.isReceiveGift === true" label="领取方式">
<span v-if="viewData.giftType === 1">扫描二维码</span>
<span v-if="viewData.signType === 2">面对面确认</span>
</el-descriptions-item>
<el-descriptions-item label="报名方式">
{{viewData.reserveMode ? '报名人员减少模式' : '候补模式'}}
</el-descriptions-item>
<el-descriptions-item v-if="viewData.reserveMode === 2" label="候补数量">
{{viewData.waitingNum}}
</el-descriptions-item>
<el-descriptions-item label="时间列表" :span="2">
<el-table :data="viewData.timeList" max-height="500" size="mini">
<el-table-column type="index" label="序号" prop="index" width="60"></el-table-column>
<el-table-column label="课程日期" prop="courseDate"></el-table-column>
<el-table-column label="开始时间" prop="courseStartTime"></el-table-column>
<el-table-column label="结束时间" prop="courseEndTime"></el-table-column>
</el-table>
</el-descriptions-item>
</el-descriptions>
</div>
`,
data() {
return {
viewData: {},
}
},
methods: {
onOpen(row) {
if(row && row.timeList) {
row.timeList = JSON.parse(row.timeList)
}
this.viewData = clone(row)
}
}
}
@@ -158,7 +158,9 @@ const basicForm = {
<el-table-column :label="trainType + '名称'" prop="courseName">
<template v-slot="{row}">
<el-input size="small" v-model="row.courseName" :placeholder="'请输入' + trainType + '名称'"></el-input>
<el-select size="small" v-model="row.courseId" allow-create filterable>
<el-option :label="item.courseName" :value="item.id" :key="item.id" v-for="item in sourceCourseList"></el-option>
</el-select>
</template>
</el-table-column>
@@ -331,6 +333,7 @@ const basicForm = {
},
campusList: [],
courseTypeList: [],
sourceCourseList: [],
}
},
components: {
@@ -566,10 +569,15 @@ const basicForm = {
}
}
},
async querySourceCourses() {
const resp = await this.$axios.post("/platform/literacy/course/querySourceCourses", {})
return resp.data
},
async initData(row) {
this.activityGroupList = await this.getActivityGroup()
this.historicalActList = await this.getHistoricalActList()
this.courseTypeList = await this.getAllType()
this.sourceCourseList = await this.querySourceCourses()
await this.init(row)
},
},
@@ -3,7 +3,18 @@ layout("/layouts/platform.html"){
#-->
<style>
.el-drawer__body {
padding: 20px;
}
.my-drawer .el-col-4 {
text-align: right;
}
.my-drawer .el-row {
margin-bottom: 20px;
}
.courseTimeButton {
padding: 0 !important;
}
</style>
<div id="app" v-cloak>