This commit is contained in:
@jyuhsin
2025-06-06 16:39:05 +08:00
parent 6576d17f58
commit 69b012a87c
38 changed files with 2618 additions and 1244 deletions
@@ -28,12 +28,9 @@ import java.util.List;
@Slf4j
public class MsgApi {
@Inject
private RedisService redisService;
/**
* @param msgTitle 消息标题
* @param msgContent 消息内容
@@ -702,6 +702,11 @@ public class Sys_user extends BaseModel implements Serializable {
@ColDefine(type = ColType.VARCHAR, width = 50)
private String basicDiseaseInfo;
@Column
@Comment("备注")
@ColDefine(type = ColType.VARCHAR, width = 255)
private String remark;
/**
* 前端菜单
*/
@@ -36,7 +36,7 @@ public enum TheRapyRecuperationType {
/**
* 酒店
*/
provinceInHotel("目的地疗休养", 3, TheRapyRecuperationProvinceType.provinceIn.getValue(), "/assets/mobile/img/therapyRecuperation/lxs.png");
provinceInHotel("分段疗休养", 3, TheRapyRecuperationProvinceType.provinceIn.getValue(), "/assets/mobile/img/therapyRecuperation/lxs.png");
/**
* 学校自由组织
@@ -230,6 +230,7 @@ public class TheRapyRecuperationBaseManagerController {
return Result.error("参数错误");
}
dao.delete(TheRapyRecuperationBaseManagement.class, id);
dao.clear(TheRapyRecuperationEnroll.class, Cnd.where("takePartInBaseManagementId", "=", id));
return null;
}
@@ -339,24 +340,10 @@ public class TheRapyRecuperationBaseManagerController {
currentDate = currentDate.plusDays(1);
}
Sql schoolTimeSql = Sqls.create("select schoolTime from sys_user where id=@id").setParam("id", ShiroUtil.getPlatformUid());
String schoolTime = (String) Daos.query(dao, schoolTimeSql.toString(), Sqls.callback.str());
String minDate = DateUtil.formatDate(config.getFragmentPlayStartTime());
//如果入职日期在活动开始时间之后的
try {
if (StrUtil.isNotBlank(schoolTime)
&& String.valueOf(DateUtil.thisYear() - 1).equals(DateUtil.format(DateUtil.parse(schoolTime), "yyyy"))
&& DateUtil.compare(DateUtil.parse(schoolTime), config.getFragmentPlayStartTime(), "MM") > 0) {
minDate = DateUtil.format(DateUtil.offset(DateUtil.parse(schoolTime), DateField.YEAR, 1), "yyyy-MM-dd");
}
} catch (Exception e) {
e.printStackTrace();
}
return Map.of("days", resultDates,
"holidays", holidays,
"lotValue", 0,
"minDate", minDate,
"minDate", DateUtil.formatDate(config.getFragmentPlayStartTime()),
"maxDate", DateUtil.formatDate(config.getFragmentPlayEndTime()));
}
@@ -10,6 +10,7 @@ import cn.hutool.core.lang.Assert;
import cn.hutool.core.util.StrUtil;
import cn.wizzer.framework.base.Result;
import io.v.nutz.base.annontation.ViReturn;
import io.v.nutz.base.model.Audit;
import io.v.nutz.base.utils.Vi;
import io.v.nutz.base.query.PageForm;
import io.v.nutz.sys.models.User;
@@ -35,6 +36,7 @@ import org.nutz.ioc.aop.Aop;
import org.nutz.ioc.loader.annotation.Inject;
import org.nutz.ioc.loader.annotation.IocBean;
import org.nutz.lang.Lang;
import org.nutz.lang.util.NutMap;
import org.nutz.mvc.annotation.*;
import org.nutz.mvc.upload.TempFile;
import org.nutz.mvc.upload.UploadAdaptor;
@@ -188,7 +190,17 @@ public class TheRapyRecuperationLineController {
@RequiresAuthentication
public Object selectLineInfoById(String id) {
Assert.notBlank(id);
return lineService.selectLineInfoById(id);
TheRapyRecuperationLine theRapyRecuperationLine = lineService.selectLineInfoById(id);
TheRapyRecuperationLot lot = dao.fetch(TheRapyRecuperationLot.class, theRapyRecuperationLine.getLotId());
NutMap nutMap = Lang.obj2map(theRapyRecuperationLine, NutMap.class);
nutMap.put("lotName", lot.getLotName());
if(StrUtil.isNotBlank(theRapyRecuperationLine.getSchoolAuditId())) {
Audit audit = dao.fetch(Audit.class, theRapyRecuperationLine.getSchoolAuditId());
nutMap.put("schoolAudit", audit);
}
return nutMap;
}
@@ -0,0 +1,105 @@
package io.v.nutz.zhgh.therapyRecuperation.controller.basicManage;
import cn.wizzer.framework.base.Result;
import cn.wizzer.framework.page.Pagination;
import io.v.nutz.base.annontation.ViReturn;
import io.v.nutz.base.model.Audit;
import io.v.nutz.base.query.PageForm;
import io.v.nutz.base.utils.Vi;
import io.v.nutz.web.commons.slog.annotation.SLog;
import io.v.nutz.web.commons.utils.ShiroUtil;
import io.v.nutz.zhgh.loveSubsidy.constant.LoveSubsidyAuditStateConstant;
import io.v.nutz.zhgh.loveSubsidy.model.LoveSubsidy;
import io.v.nutz.zhgh.therapyRecuperation.model.TheRapyRecuperationLine;
import io.v.nutz.zhgh.therapyRecuperation.service.TheRapyRecuperationLineService;
import lombok.extern.slf4j.Slf4j;
import org.apache.shiro.authz.annotation.Logical;
import org.apache.shiro.authz.annotation.RequiresPermissions;
import org.apache.shiro.authz.annotation.RequiresRoles;
import org.nutz.aop.interceptor.ioc.TransAop;
import org.nutz.dao.Chain;
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.mvc.annotation.At;
import org.nutz.mvc.annotation.Ok;
import org.nutz.mvc.annotation.POST;
import java.util.List;
/**
* @ClassName TheRapyRecuperationLineSchoolAuditController
* @Author JyuHsin
* @Date 2025/6/4 17:07
* @Version 1.0
* @Description TODO
*/
@IocBean
@At("/platform/theRapyRecuperation/line/schoolAudit")
@Ok("json:full")
@Slf4j
public class TheRapyRecuperationLineSchoolAuditController {
@Inject
private TheRapyRecuperationLineService lineService;
@Inject
private Dao dao;
@At("")
@Ok("beetl:/platform/theRapyRecuperation/basicManage/schoolAudit.html")
@RequiresPermissions("theRapyRecuperation.line.schoolAudit")
public void index() {
}
@At
@POST
@Ok("json:full")
@ViReturn
@RequiresPermissions("theRapyRecuperation.line.schoolAudit")
public Object pageData(PageForm pageForm, Integer startYear, Integer endYear, String travelAgencyId, String lineName, String lotId, Integer isAudit) {
Sql sql = Sqls.create("""
select
line.*,
lot.lotName,
ta.travelAgencyName,
u.username AS createUserName
from
the_rapy_recuperation_line line
LEFT JOIN the_rapy_recuperation_travel_agency ta ON ta.id = line.travelAgencyId
LEFT JOIN the_rapy_recuperation_lot lot on lot.id = line.lotId
LEFT JOIN sys_user u ON u.id = line.opBy
$condition
""");
Cnd cnd = Cnd.NEW();
if(isAudit == 1) {
cnd.and("line.stateId", ">", 1);
} else if(isAudit == 2) {
cnd.and("line.stateId", "=", 1);
}
cnd.andEX("line.`year`", ">=", startYear);
cnd.andEX("line.`year`", "<=", endYear);
cnd.andEX("line.travelAgencyId", "=", travelAgencyId);
cnd.andEX("line.lotId", "=", lotId);
cnd.and(Cnd.likeEX("line.lineName", lineName));
cnd.desc("year");
cnd.desc("regionalNature").asc("serialNumber").asc("line.opBy");
sql.setCondition(cnd);
return lineService.listPageMap(pageForm.getPageNumber(), pageForm.getPageSize(), sql);
}
@At
@Aop(TransAop.READ_COMMITTED)
@RequiresPermissions("theRapyRecuperation.line.schoolAudit")
public Result onAudit(Audit audit, String id, Integer auditType) {
dao.insert(audit);
dao.update(TheRapyRecuperationLine.class,
Chain.make("stateId", auditType)
.add("schoolAuditId", audit.getId()),
Cnd.where("id", "=", id));
return Result.success();
}
}
@@ -85,8 +85,8 @@ public class TheRapyRecuperationEnrollController {
@POST
@ViReturn
@RequiresAuthentication
public Object pageData(PageForm pageForm, Integer year, String unionId, int theRapyRecuperationType, Integer lineUnionType, String routeName, String lotId) {
return enrollService.enrollPageData(pageForm, year, unionId, theRapyRecuperationType, lineUnionType, routeName, lotId);
public Object pageData(PageForm pageForm, Integer year, String unionId, int theRapyRecuperationType, Integer lineUnionType, String routeName, String lotId, String searchKeyword, String playStartTime, String playEndTime) {
return enrollService.enrollPageData(pageForm, year, unionId, theRapyRecuperationType, lineUnionType, routeName, lotId, searchKeyword, playStartTime, playEndTime);
}
@At
@@ -144,6 +144,7 @@ public class TheRapyRecuperationLineUnionSelectController {
}
}
cnd.and("line.stateId", "=", 4);
cnd.and("line.isDisabled", "=", 0);
if (StrUtil.isNotBlank(keywords)) {
@@ -285,17 +286,21 @@ public class TheRapyRecuperationLineUnionSelectController {
try {
Assert.notBlank(lineId);
Assert.notBlank(unionId);
// Cnd enrollCnd = Cnd.where("takePartInUnionId", "=", unionId);
// enrollCnd.and("takePartInLineId", "=", lineId);
Cnd enrollCnd = Cnd.where("unionId", "=", unionId);
List<TheRapyRecuperationLineUnionSelect> unionSelects = dao.query(TheRapyRecuperationLineUnionSelect.class, Cnd.where("lineId", "=", lineId));
List<String> list = unionSelects.stream().map(TheRapyRecuperationLineUnionSelect::getId).toList();
dao.clear(TheRapyRecuperationLineUnionSelect.class, Cnd.where("lineId", "=", lineId));
dao.clear(TheRapyRecuperationEnroll.class, Cnd.where("takePartInLineId", "in", list));
/*Cnd enrollCnd = Cnd.where("unionId", "=", unionId);
enrollCnd.and("lineId", "=", lineId);
unionSelectService.clear(enrollCnd);
unionSelectService.clear(enrollCnd);*/
return Result.success();
} catch (Exception e) {
return Result.error(e.getMessage());
}
// unionSelectService.deSelect(usId);
}
/**
@@ -293,6 +293,7 @@ public class TheRapyRecuperationUserQueryController {
$condition
""");
Cnd cnd = Cnd.NEW();
cnd.and("rl.stateId", "=", 4);
cnd.and(Cnd.exps("rlus.isOpen","=",1).or("rlus.unionId","=",Vi.getUnionId()));
cnd.and("YEAR(rlus.selectTime)","=",DateUtil.thisYear());
// cnd.and("rlus.signUpMode","=",signUpMode);
@@ -357,6 +358,7 @@ public class TheRapyRecuperationUserQueryController {
LEFT JOIN the_rapy_recuperation_travel_agency lxs ON lxs.id = line.travelAgencyId
$condition
""");
cnd.and("line.stateId", "=", 4);
cnd.andEX("YEAR(enroll.signingUptime)", ">=", startYear);
cnd.andEX("YEAR(enroll.signingUptime)", "<=", endYear);
cnd.andEX("enroll.selfUnitId", "=", unitId);
@@ -59,6 +59,7 @@ public class TheRapyRecuperationLineQueryController {
line.regionalNature,
line.travelAgencyPlace,
lineu.auditState,
lineu.estimatedCost,
lineu.lineId,
lineu.id as lineUId,
lineu.signUpMode,
@@ -90,6 +91,7 @@ public class TheRapyRecuperationLineQueryController {
$condition
""");
Cnd cnd = Cnd.NEW();
cnd.and("line.stateId", "=", 4);
cnd.andEX("YEAR(lineu.selectTime)", ">=", startYear);
cnd.andEX("YEAR(lineu.selectTime)", "<=", endYear);
cnd.andEX("lineu.signUpMode", "=", signUpMode);
@@ -116,6 +116,9 @@ public class TheRapyRecuperationSchoolUnionUserQueryController {
cnd.orderBy(pageForm.getPageOrderName(), pageForm.getPageOrderBy().equalsIgnoreCase("ascending") ? "ASC" : "DESC");
}
cnd.and("line.stateId", "=", 4);
cnd.and("enroll.takePartInLineId", "is not", null);
// 年度
cnd.andEX("YEAR ( enroll.signingUptime )", "=", year);
if (StrUtil.isNotBlank(userName)) {
@@ -259,6 +262,7 @@ public class TheRapyRecuperationSchoolUnionUserQueryController {
$condition
""");
Cnd cnd = Cnd.NEW();
cnd.and("t3.stateId", "=", 4);
cnd.andEX("t1.selfUnionId", "=", unionId);
cnd.andEX("YEAR(t2.selectTime)", "=", year);
cnd.andEX("t3.regionalNature", "=", regionalNature);
@@ -304,6 +308,8 @@ public class TheRapyRecuperationSchoolUnionUserQueryController {
LEFT JOIN audit_state state ON state.stateId = enroll.stateId
$condition
""");
cnd.and("enroll.takePartInLineId", "is not", null);
cnd.and("line.stateId", "=", 4);
// 年度
cnd.andEX("YEAR ( enroll.signingUptime )", "=", year);
if (StrUtil.isNotBlank(userName)) {
@@ -86,6 +86,7 @@ public class TheRapyRecuperationSatisfactionEvaluateController {
$condition
""");
Cnd cnd = Cnd.NEW();
cnd.and("t2.stateId", "=", 4);
cnd.and("YEAR(t1.selectTime)", "=", year);
cnd.andEX("t1.lineId", "=", lineId);
sql.setCondition(cnd);
@@ -136,7 +137,7 @@ public class TheRapyRecuperationSatisfactionEvaluateController {
`the_rapy_recuperation_line_union_select` t1
LEFT JOIN the_rapy_recuperation_line t2 ON t2.id = t1.lineId
WHERE
YEAR(selectTime) = @year
YEAR(selectTime) = @year and t2.stateId = 4
GROUP BY
t1.id
""");
@@ -674,7 +675,7 @@ public class TheRapyRecuperationSatisfactionEvaluateController {
LEFT JOIN the_rapy_recuperation_line t3 ON t3.id = t2.lineId
LEFT JOIN the_rapy_recuperation_travel_agency t4 ON t4.id = t3.travelAgencyId
LEFT JOIN the_rapy_recuperation_enroll t5 on t5.id = t1.enrollId
where t1.selectLineId is not null and t1.selectLineId != '' and YEAR(t1.evaluateDate) = @year
where t1.selectLineId is not null and t1.selectLineId != '' and YEAR(t1.evaluateDate) = @year and t3.stateId = 4
""");
sql.setParam("year", year);
List<NutMap> list = enrollService.listMap(sql);
@@ -5,10 +5,17 @@ import cn.afterturn.easypoi.excel.entity.ExportParams;
import cn.afterturn.easypoi.excel.entity.params.ExcelExportEntity;
import cn.hutool.core.date.DateTime;
import cn.hutool.core.date.DateUtil;
import cn.hutool.core.util.StrUtil;
import cn.wizzer.framework.base.Result;
import com.deepoove.poi.XWPFTemplate;
import com.deepoove.poi.config.Configure;
import com.deepoove.poi.policy.HackLoopTableRenderPolicy;
import io.v.nutz.base.annontation.ViReturn;
import io.v.nutz.base.query.PageForm;
import io.v.nutz.base.utils.MsgApi;
import io.v.nutz.base.utils.OfficeTemplateUtil;
import io.v.nutz.web.commons.base.Globals;
import io.v.nutz.web.commons.utils.ShiroUtil;
import io.v.nutz.zhgh.therapyRecuperation.constant.TheRapyRecuperationState;
import io.v.nutz.zhgh.therapyRecuperation.model.*;
import io.v.nutz.zhgh.therapyRecuperation.service.TheRapyRecuperationEnrollService;
@@ -32,11 +39,17 @@ import org.nutz.mvc.annotation.Ok;
import org.nutz.mvc.annotation.Param;
import javax.servlet.http.HttpServletResponse;
import java.io.BufferedOutputStream;
import java.io.IOException;
import java.net.URLEncoder;
import java.nio.charset.StandardCharsets;
import java.util.ArrayList;
import java.util.Date;
import java.util.List;
import java.util.Map;
import java.util.stream.Collectors;
import java.util.zip.ZipEntry;
import java.util.zip.ZipOutputStream;
/**
* @ClassName TheRapyRecuperationLineFragmentController
@@ -57,6 +70,8 @@ public class TheRapyRecuperationLineFragmentController {
private MsgApi msgApi;
@Inject
private Dao dao;
@Inject
private OfficeTemplateUtil officeTemplateUtil;
@At("")
@Ok("beetl:/platform/theRapyRecuperation/statistics/fragment.html")
@@ -72,13 +87,15 @@ public class TheRapyRecuperationLineFragmentController {
@Param(value = "endYear", required = false) Integer endYear,
@Param(value = "baseManagementId") String baseManagementId,
@Param(value = "travelAgencyId") String travelAgencyId,
@Param(value = "playStart") String playStart,
@Param(value = "playEnd") String playEnd,
@Param(value = "regionalNature", required = false) String regionalNature) {
Sql sql = Sqls.create("""
SELECT
bm.*,
ta.travelAgencyName,
(select COUNT(DISTINCT specificTime) from the_rapy_recuperation_enroll where isNormal = true and takePartInBaseManagementId = bm.id) as groupCount,
(select COUNT(*) from the_rapy_recuperation_enroll where isNormal = true and takePartInBaseManagementId = bm.id) as signCount,
(select COUNT(DISTINCT specificTime, playDay) from the_rapy_recuperation_enroll where isNormal = true and takePartInBaseManagementId = bm.id $signCnd) as groupCount,
(select COUNT(*) from the_rapy_recuperation_enroll where isNormal = true and takePartInBaseManagementId = bm.id $signCnd) as signCount,
u.username
FROM
`the_rapy_recuperation_base_management` bm
@@ -86,7 +103,27 @@ public class TheRapyRecuperationLineFragmentController {
left join user u on u.id = bm.opBy
$condition
""");
if (StrUtil.isNotBlank(playStart) && StrUtil.isNotBlank(playEnd)) {
sql.setVar("signCnd", " and REPLACE(REPLACE(SUBSTRING_INDEX(specificTime, '-', 1), '月', '-'), '日', '') >= '%s' and REPLACE(REPLACE(SUBSTRING_INDEX(specificTime, '-', 1), '月', '-'), '日', '') <= '%s'".formatted(playStart, playEnd));
} else if (StrUtil.isNotBlank(playStart)) {
sql.setVar("signCnd", " and REPLACE(REPLACE(SUBSTRING_INDEX(specificTime, '-', 1), '月', '-'), '日', '') >= '%s'".formatted(playStart));
} else if (StrUtil.isNotBlank(playEnd)) {
sql.setVar("signCnd", " and REPLACE(REPLACE(SUBSTRING_INDEX(specificTime, '-', 1), '月', '-'), '日', '') <= '%s'".formatted(playEnd));
}
Cnd cnd = Cnd.NEW();
if (!ShiroUtil.hasAnyRoles("sysadmin, SchoolUnionAdmin")) {
//如果不是管理员,那么只查自己报名的酒店
Cnd enrollCnd = Cnd.where("takePartInBaseManagementId", "is not", null)
.and("isNormal", "=", true)
.and("stateId", "=", 2750)
.and("loginName", "=", ShiroUtil.getPlatformLoginname());
List<TheRapyRecuperationEnroll> enrolls = dao.query(TheRapyRecuperationEnroll.class, enrollCnd);
List<String> list = enrolls.stream()
.map(TheRapyRecuperationEnroll::getTakePartInBaseManagementId)
.distinct()
.toList();
cnd.and("bm.id", "in", list);
}
cnd.andEX("bm.year", ">=", startYear);
cnd.andEX("bm.year", "<=", endYear);
cnd.andEX("bm.id", "=", baseManagementId);
@@ -118,12 +155,17 @@ public class TheRapyRecuperationLineFragmentController {
@RequiresPermissions("theRapyRecuperation.fragment")
public Object getSignUser(PageForm pageForm,
@Param(value = "takePartInBaseManagementId", required = false) String takePartInBaseManagementId,
@Param(value = "specificTime", required = false) String specificTime) {
@Param(value = "specificTime", required = false) String specificTime,
@Param(value = "playStart", required = false) String playStart,
@Param(value = "playEnd", required = false) String playEnd,
@Param(value = "playCount", required = false) Integer playCount) {
Sql sql = Sqls.create("""
SELECT
en.id,
en.takePartInBaseManagementId,
en.specificTime,
en.playDay,
(en.playDay * 600) as money,
u.loginname,
u.username,
u.sex,
@@ -138,6 +180,9 @@ public class TheRapyRecuperationLineFragmentController {
Cnd cnd = Cnd.NEW();
cnd.and("en.takePartInBaseManagementId", "is not", null);
cnd.andEX("en.specificTime", "=", specificTime);
cnd.andEX("en.playCount", "=", playCount);
cnd.andEX("REPLACE(REPLACE(SUBSTRING_INDEX(specificTime, '-', 1), '月', '-'), '日', '')", ">=", playStart);
cnd.andEX("REPLACE(REPLACE(SUBSTRING_INDEX(specificTime, '-', 1), '月', '-'), '日', '')", "<=", playEnd);
cnd.andEX("en.takePartInBaseManagementId", "=", takePartInBaseManagementId);
cnd.desc("en.specificTime");
sql.setCondition(cnd);
@@ -148,12 +193,14 @@ public class TheRapyRecuperationLineFragmentController {
@ViReturn
@RequiresPermissions("theRapyRecuperation.fragment")
public Object getGroupInfo(PageForm pageForm,
@Param(value = "baseId", required = false) String baseId) {
@Param(value = "baseId", required = false) String baseId,
@Param(value = "playStart") String playStart,
@Param(value = "playEnd") String playEnd) {
Sql sql = Sqls.create("""
SELECT
en.takePartInBaseManagementId as id,
specificTime,
en.playDay,
count( specificTime ) as userCount,
en.hasLocked
FROM
@@ -163,7 +210,9 @@ public class TheRapyRecuperationLineFragmentController {
Cnd cnd = Cnd.NEW();
cnd.and("en.takePartInBaseManagementId", "=", baseId);
cnd.and("en.takePartInBaseManagementId", "is not", null);
cnd.groupBy("en.specificTime");
cnd.andEX("REPLACE(REPLACE(SUBSTRING_INDEX(specificTime, '-', 1), '月', '-'), '日', '')", ">=", playStart);
cnd.andEX("REPLACE(REPLACE(SUBSTRING_INDEX(specificTime, '-', 1), '月', '-'), '日', '')", "<=", playEnd);
cnd.groupBy("en.takePartInBaseManagementId,en.playDay,en.specificTime");
cnd.desc("en.specificTime");
sql.setCondition(cnd);
return enrollService.listMap(sql);
@@ -173,7 +222,7 @@ public class TheRapyRecuperationLineFragmentController {
@ViReturn
@Aop(TransAop.READ_COMMITTED)
@RequiresPermissions("theRapyRecuperation.fragment")
public Object sendSuccess(String baseId, Boolean type) {
public Object sendSuccess(String baseId, Boolean type, String specificTime, Integer playDay) {
TheRapyRecuperationConfig config = dao.fetch(TheRapyRecuperationConfig.class, Cnd.NEW());
if (DateUtil.compare(new Date(), config.getFragmentEndTime()) < 0) {
@@ -186,10 +235,12 @@ public class TheRapyRecuperationLineFragmentController {
List<TheRapyRecuperationEnroll> enrolls = dao.query(
TheRapyRecuperationEnroll.class,
Cnd.where("takePartInBaseManagementId", "=", baseId)
.and("specificTime", "=", specificTime)
.and("playDay", "=", playDay)
.and("isNormal", "=", true).and("year(signingUptime)", "=", DateUtil.thisYear())
.and("stateId", "not in", Lang.array(TheRapyRecuperationState.UNITFAIL, TheRapyRecuperationState.LINEUNITFAIL, TheRapyRecuperationState.SCHOOLFAIL)));
if(enrolls.size() < config.getFragmentCount()) {
if (enrolls.size() < config.getFragmentCount()) {
return Result.error("报名人数为%s人,未达到%s人的成团条件".formatted(enrolls.size(), config.getFragmentCount()));
}
@@ -198,7 +249,7 @@ public class TheRapyRecuperationLineFragmentController {
});
dao.update(enrolls);
//发短信
if(type) {
if (type) {
enrolls.forEach(item -> {
String content = "%s老师,您好!您报名的%s酒店,出行时间为%s,达到成团条件,请准时参加疗休养活动。".formatted(
item.getUserName(),
@@ -215,7 +266,7 @@ public class TheRapyRecuperationLineFragmentController {
@ViReturn
@Aop(TransAop.READ_COMMITTED)
@RequiresPermissions("theRapyRecuperation.fragment")
public Object sendFail(String baseId, Boolean type) {
public Object sendFail(String baseId, Boolean type, String specificTime, Integer playDay) {
TheRapyRecuperationConfig config = dao.fetch(TheRapyRecuperationConfig.class, Cnd.NEW());
@@ -229,6 +280,8 @@ public class TheRapyRecuperationLineFragmentController {
List<TheRapyRecuperationEnroll> enrolls = dao.query(
TheRapyRecuperationEnroll.class,
Cnd.where("takePartInBaseManagementId", "=", baseId)
.and("specificTime", "=", specificTime)
.and("playDay", "=", playDay)
.and("isNormal", "=", true).and("year(signingUptime)", "=", DateUtil.thisYear())
.and("stateId", "not in", Lang.array(TheRapyRecuperationState.UNITFAIL, TheRapyRecuperationState.LINEUNITFAIL, TheRapyRecuperationState.SCHOOLFAIL)));
@@ -242,7 +295,7 @@ public class TheRapyRecuperationLineFragmentController {
//msgApi.sendTextMsg(content, item.getLoginName());
});
if(!type) {
if (!type) {
List<String> enrollIds = enrolls.stream().map(TheRapyRecuperationEnroll::getId).collect(Collectors.toList());
List<String> bedIds = enrolls.stream().map(TheRapyRecuperationEnroll::getBedInfoId).collect(Collectors.toList());
dao.clear(TheRapyRecuperationEnroll.class, Cnd.where("takePartInBaseManagementId", "=", baseId));
@@ -255,6 +308,67 @@ public class TheRapyRecuperationLineFragmentController {
return null;
}
@At
@ViReturn
@Aop(TransAop.READ_COMMITTED)
@RequiresPermissions("theRapyRecuperation.fragment")
public Object oneKeyGroupSuccess(String travelAgencyId, String baseId, String playStart, String playEnd, Boolean type) {
TheRapyRecuperationConfig config = dao.fetch(TheRapyRecuperationConfig.class, Cnd.NEW());
Integer fragmentCount = config.getFragmentCount();
if (DateUtil.compare(new Date(), config.getFragmentEndTime()) < 0) {
return Result.error("报名还未结束");
}
List<TheRapyRecuperationBaseManagement> managements = dao.query(TheRapyRecuperationBaseManagement.class, Cnd.NEW());
Map<String, String> baseMap = managements.stream().collect(Collectors.toMap(TheRapyRecuperationBaseManagement::getId, TheRapyRecuperationBaseManagement::getBaseName));
Sql sql = Sqls.create("""
SELECT
en.takePartInBaseManagementId,
en.specificTime,
en.playDay,
count( specificTime ) as userCount
FROM
the_rapy_recuperation_enroll en
LEFT JOIN the_rapy_recuperation_base_management bm ON en.takePartInBaseManagementId = bm.id
$condition
""");
Cnd cnd = Cnd.NEW();
cnd.and("takePartInBaseManagementId", "is not", null);
cnd.and("isNormal", "=", true);
cnd.and("stateId", "=", 2750);
cnd.andEX("REPLACE(REPLACE(SUBSTRING_INDEX(specificTime, '-', 1), '月', '-'), '日', '')", ">=", playStart);
cnd.andEX("REPLACE(REPLACE(SUBSTRING_INDEX(specificTime, '-', 1), '月', '-'), '日', '')", "<=", playEnd);
cnd.andEX("bm.travelAgencyId", "=", travelAgencyId);
cnd.andEX("en.takePartInBaseManagementId", "=", baseId);
cnd.groupBy("en.takePartInBaseManagementId,en.playDay,en.specificTime");
cnd.having(Cnd.where("userCount", ">=", fragmentCount));
sql.setCondition(cnd);
List<NutMap> enrolls = enrollService.listMap(sql);
for (NutMap enroll : enrolls) {
List<TheRapyRecuperationEnroll> enrollList = dao.query(
TheRapyRecuperationEnroll.class,
Cnd.where("takePartInBaseManagementId", "=", enroll.getString("takePartInBaseManagementId"))
.and("playDay", "=", enroll.getString("playDay"))
.and("specificTime", "=", enroll.getString("specificTime"))
.and("isNormal", "=", true)
);
for (TheRapyRecuperationEnroll en : enrollList) {
en.setHasLocked(true);
if (type) {
String content = "%s老师,您好!您报名的%s酒店,出行时间为%s,达到成团条件,请准时参加疗休养活动。".formatted(
en.getUserName(),
baseMap.get(en.getTakePartInBaseManagementId()),
en.getSpecificTime()
);
//msgApi.sendTextMsg(content, item.getLoginName());
}
}
dao.update(enrollList);
}
return null;
}
@At
@Ok("void")
@RequiresPermissions("theRapyRecuperation.fragment")
@@ -263,13 +377,17 @@ public class TheRapyRecuperationLineFragmentController {
@Param(value = "baseManagementId") String baseManagementId,
@Param(value = "travelAgencyId") String travelAgencyId,
@Param(value = "regionalNature", required = false) String regionalNature,
@Param(value = "playStart", required = false) String playStart,
@Param(value = "playEnd", required = false) String playEnd,
HttpServletResponse response) {
Sql sql = Sqls.create("""
SELECT
en.*,
bm.baseName,
ta.travelAgencyName,
u.remark
u.remark,
(en.playDay * 600) as money,
'否' as useNextMoney
FROM
the_rapy_recuperation_enroll en
LEFT JOIN the_rapy_recuperation_base_management bm ON bm.id = en.takePartInBaseManagementId
@@ -285,31 +403,136 @@ public class TheRapyRecuperationLineFragmentController {
cnd.and("en.isNormal", "=", true);
cnd.and("en.stateId", "=", TheRapyRecuperationState.PASS);
cnd.and("en.takePartInBaseManagementId", "is not", null);
cnd.andEX("REPLACE(REPLACE(SUBSTRING_INDEX(specificTime, '-', 1), '月', '-'), '日', '')", ">=", playStart);
cnd.andEX("REPLACE(REPLACE(SUBSTRING_INDEX(specificTime, '-', 1), '月', '-'), '日', '')", "<=", playEnd);
sql.setCondition(cnd);
List<NutMap> list = enrollService.listMap(sql);
ArrayList<ExcelExportEntity> exportEntities = new ArrayList<>();
exportEntities.add(new ExcelExportEntity("部门", "unitName", 40));
exportEntities.add(new ExcelExportEntity("姓名", "userName", 20));
exportEntities.add(new ExcelExportEntity("工号", "loginName", 20));
exportEntities.add(new ExcelExportEntity("性别", "sex", 10));
exportEntities.add(new ExcelExportEntity("单位", "unitName", 20));
exportEntities.add(new ExcelExportEntity("工会", "unionName", 20));
exportEntities.add(new ExcelExportEntity("身份证号", "idCard", 30));
exportEntities.add(new ExcelExportEntity("手机号", "mobile", 15));
exportEntities.add(new ExcelExportEntity("酒店名称", "baseName", 20));
exportEntities.add(new ExcelExportEntity("旅行社", "agencyName", 20));
exportEntities.add(new ExcelExportEntity("报名时间", "signingUptime", 20));
exportEntities.add(new ExcelExportEntity("出行时间", "specificTime", 50));
exportEntities.add(new ExcelExportEntity("出行日期", "specificTime", 50));
exportEntities.add(new ExcelExportEntity("出行天数", "playDay", 10));
exportEntities.add(new ExcelExportEntity("出行地点", "baseName", 20));
exportEntities.add(new ExcelExportEntity("备注", "remark", 20));
exportEntities.add(new ExcelExportEntity("旅行社", "travelAgencyName", 20));
exportEntities.add(new ExcelExportEntity("费用(元)", "money", 20));
exportEntities.add(new ExcelExportEntity("使用下一年经费", "useNextMoney", 20));
try {
ExportParams exportParams = new ExportParams();
exportParams.setTitle("分段疗休养报名签到表");
response.setContentType("application/octet-stream");
response.setHeader("Content-Disposition", "attachment;filename=" + new String(("报名人员.xls").getBytes(StandardCharsets.UTF_8), StandardCharsets.ISO_8859_1));
Workbook workbook = ExcelExportUtil.exportExcel(new ExportParams(), exportEntities, list);
response.setHeader("Content-Disposition", "attachment;filename=" + new String(("分段疗休养报名签到表.xls").getBytes(StandardCharsets.UTF_8), StandardCharsets.ISO_8859_1));
Workbook workbook = ExcelExportUtil.exportExcel(exportParams, exportEntities, list);
workbook.write(response.getOutputStream());
workbook.close();
} catch (Exception e) {
e.printStackTrace();
}
}
@At
@Ok("void")
@RequiresPermissions("theRapyRecuperation.fragment")
public void exportGroup(@Param(value = "startYear", required = false) Integer startYear,
@Param(value = "endYear", required = false) Integer endYear,
@Param(value = "baseManagementId") String baseManagementId,
@Param(value = "travelAgencyId") String travelAgencyId,
@Param(value = "playStart", required = false) String playStart,
@Param(value = "playEnd", required = false) String playEnd,
HttpServletResponse response) throws IOException {
response.setContentType("application/octet-stream");
response.setHeader("content-disposition", "attachment;filename="
+ URLEncoder.encode("分段疗休养成团表.zip", StandardCharsets.UTF_8));
TheRapyRecuperationConfig rapyConfig = dao.fetch(TheRapyRecuperationConfig.class, Cnd.NEW());
Integer fragmentCount = rapyConfig.getFragmentCount();
Sql sql = Sqls.create("""
SELECT
en.takePartInBaseManagementId as baseId,
specificTime,
en.playDay,
count( specificTime ) as userCount,
en.hasLocked,
bm.baseName,
ta.travelAgencyName
FROM
the_rapy_recuperation_enroll en
left join the_rapy_recuperation_base_management bm on bm.id = en.takePartInBaseManagementId
left join the_rapy_recuperation_travel_agency ta on ta.id = bm.travelAgencyId
$condition
""");
Cnd cnd = Cnd.NEW();
cnd.andEX("en.takePartInBaseManagementId", "=", baseManagementId);
cnd.and("en.takePartInBaseManagementId", "is not", null);
cnd.andEX("REPLACE(REPLACE(SUBSTRING_INDEX(specificTime, '-', 1), '月', '-'), '日', '')", ">=", playStart);
cnd.andEX("REPLACE(REPLACE(SUBSTRING_INDEX(specificTime, '-', 1), '月', '-'), '日', '')", "<=", playEnd);
cnd.groupBy("en.takePartInBaseManagementId,en.playDay,en.specificTime");
cnd.having(Cnd.where("userCount", ">=", fragmentCount));
cnd.desc("en.specificTime");
sql.setCondition(cnd);
List<NutMap> listMap = enrollService.listMap(sql);
ZipOutputStream zipOutputStream = new ZipOutputStream(new BufferedOutputStream(response.getOutputStream()));
for (int i = 0; i < listMap.size(); i++) {
NutMap group = listMap.get(i);
Double playDay = group.getDouble("playDay");
Object dayCount = playDay % 1 == 0 ? String.valueOf(playDay.intValue()) : playDay;
group.put("playDay", dayCount);
Sql userSql = Sqls.create("""
select
userName as uName,
unitName,
idCard,
mobile
from
the_rapy_recuperation_enroll
$condition
""");
Cnd userCnd = Cnd.NEW();
userCnd.and("isNormal", "=", true);
userCnd.and("stateId", "=", 2750);
userCnd.and("hasLocked", "=", true);
userCnd.and("specificTime", "=", group.getString("specificTime"));
userCnd.and("playDay", "=", group.getString("playDay"));
userCnd.and("takePartInBaseManagementId", "=", group.getString("baseId"));
userCnd.asc("signingUptime");
userSql.setCondition(userCnd);
List<NutMap> userList = enrollService.listMap(userSql);
for (int u = 0; u < userList.size(); u++) {
userList.get(u).put("index", (u + 1));
}
NutMap data = new NutMap();
data.put("schoolName", Globals.schoolName);
data.put("address", group.getString("baseName"));
data.put("playTime", group.getString("specificTime"));
data.put("groupType", group.getString("playDay") + "");
data.put("travelName", group.getString("travelAgencyName"));
data.put("opinions", "同意");
data.put("applyTime", DateUtil.now());
data.put("auditTime", DateUtil.now());
if(Lang.isNotEmpty(userList)) {
data.put("deptName", userList.get(0).getString("unitName"));
data.put("leader", userList.get(0).getString("uName"));
data.put("mobile", userList.get(0).getString("mobile"));
}
data.put("list", userList);
HackLoopTableRenderPolicy policy = new HackLoopTableRenderPolicy();
Configure config = Configure.builder().bind("list", policy).build();
String fileName = (i + 1) + "." + group.getString("baseName") + "" + group.getString("specificTime") + "" + group.getString("playDay") + "天成团表.docx";
zipOutputStream.putNextEntry(new ZipEntry(fileName));
XWPFTemplate.compile(officeTemplateUtil.getPath("the_rapy_group"), config).render(data).write(zipOutputStream);
zipOutputStream.closeEntry();
}
zipOutputStream.flush();
zipOutputStream.close();
}
}
@@ -1,18 +1,27 @@
package io.v.nutz.zhgh.therapyRecuperation.controller.statistics;
import cn.afterturn.easypoi.excel.ExcelExportUtil;
import cn.afterturn.easypoi.excel.entity.ExportParams;
import cn.afterturn.easypoi.excel.entity.params.ExcelExportEntity;
import cn.hutool.core.date.DateTime;
import cn.hutool.core.date.DateUtil;
import cn.hutool.core.util.StrUtil;
import cn.wizzer.framework.base.Result;
import com.deepoove.poi.XWPFTemplate;
import com.deepoove.poi.config.Configure;
import com.deepoove.poi.policy.HackLoopTableRenderPolicy;
import io.v.nutz.base.annontation.ViReturn;
import io.v.nutz.base.query.PageForm;
import io.v.nutz.base.utils.MsgApi;
import io.v.nutz.base.utils.OfficeTemplateUtil;
import io.v.nutz.base.utils.Vi;
import io.v.nutz.web.commons.base.Globals;
import io.v.nutz.web.commons.utils.ShiroUtil;
import io.v.nutz.zhgh.therapyRecuperation.constant.TheRapyRecuperationState;
import io.v.nutz.zhgh.therapyRecuperation.model.*;
import io.v.nutz.zhgh.therapyRecuperation.service.TheRapyRecuperationEnrollService;
import lombok.extern.slf4j.Slf4j;
import org.apache.poi.ss.usermodel.Workbook;
import org.apache.shiro.authz.annotation.RequiresAuthentication;
import org.apache.shiro.authz.annotation.RequiresPermissions;
import org.nutz.aop.interceptor.ioc.TransAop;
@@ -26,14 +35,23 @@ import org.nutz.ioc.loader.annotation.Inject;
import org.nutz.ioc.loader.annotation.IocBean;
import org.nutz.lang.Lang;
import org.nutz.lang.Strings;
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 javax.servlet.http.HttpServletResponse;
import java.io.BufferedOutputStream;
import java.io.IOException;
import java.net.URLEncoder;
import java.nio.charset.StandardCharsets;
import java.util.ArrayList;
import java.util.Date;
import java.util.List;
import java.util.Map;
import java.util.stream.Collectors;
import java.util.zip.ZipEntry;
import java.util.zip.ZipOutputStream;
/**
* @version 1.0
@@ -54,6 +72,8 @@ public class TheRapyRecuperationLineStatisticsController {
private MsgApi msgApi;
@Inject
private Dao dao;
@Inject
private OfficeTemplateUtil officeTemplateUtil;
@At("")
@Ok("beetl:/platform/theRapyRecuperation/statistics/lineStatistics.html")
@@ -112,6 +132,7 @@ public class TheRapyRecuperationLineStatisticsController {
$condition
""");
Cnd cnd = Cnd.NEW();
cnd.and("line.stateId", "=", 4);
cnd.andEX("YEAR(lineu.selectTime)", ">=", startYear);
cnd.andEX("YEAR(lineu.selectTime)", "<=", endYear);
cnd.andEX("lineu.signUpMode","=",signUpMode);
@@ -308,4 +329,173 @@ public class TheRapyRecuperationLineStatisticsController {
}
return null;
}
@At
@Ok("void")
@RequiresPermissions("theRapyRecuperation.statistics")
public void doExport(@Param(value = "startYear", required = false) Integer startYear,
@Param(value = "endYear", required = false) Integer endYear,
@Param(value = "unionId", required = false) String unionId,
@Param(value = "takePartInLineId") String takePartInLineId,
@Param(value = "lotId", required = false) String lotId,
@Param(value = "selectId", required = false) String selectId,
@Param(value = "regionalNature", required = false) String regionalNature,
HttpServletResponse response) {
Sql sql = Sqls.create("""
SELECT
enroll.*,
line.lineName,
lxs.travelAgencyName,
u.remark,
lot.activityCost as money,
lot.lotValue as playDay,
if(enroll.moneyType = 2, '是' , '否') as useNextMoney,
CONCAT(DATE_FORMAT(lineu.playStartTime, '%m月%d日'), '-', DATE_FORMAT(lineu.playEndTime, '%m月%d日')) as specificTime
FROM
`the_rapy_recuperation_enroll` enroll
LEFT JOIN the_rapy_recuperation_line_union_select lineu ON lineu.id = enroll.takePartInLineId
LEFT JOIN the_rapy_recuperation_line line ON line.id = lineu.lineId
LEFT JOIN the_rapy_recuperation_lot lot ON lot.id = line.lotId
LEFT JOIN the_rapy_recuperation_travel_agency lxs ON line.travelAgencyId = lxs.id
LEFT JOIN sys_user u on u.loginname = enroll.loginName
$condition
""");
Cnd cnd = Cnd.NEW();
cnd.and("lineu.groupSuccess", "=", true);
cnd.and("line.stateId", "=", 4);
cnd.andEX("YEAR(lineu.selectTime)", ">=", startYear);
cnd.andEX("YEAR(lineu.selectTime)", "<=", endYear);
if (!ShiroUtil.hasAnyRoles("sysadmin, SchoolUnionAdmin")) {
cnd.and("lineu.selectUserId", "=", ShiroUtil.getUserId());
}
cnd.andEX("line.lotId", "=", lotId);
cnd.andEX("line.id", "=", takePartInLineId);
cnd.andEX("lineu.id", "=", selectId);
cnd.andEX("line.regionalNature", "=", regionalNature);
cnd.asc("enroll.signingUptime");
sql.setCondition(cnd);
List<NutMap> list = enrollService.listMap(sql);
ArrayList<ExcelExportEntity> exportEntities = new ArrayList<>();
exportEntities.add(new ExcelExportEntity("部门", "unitName", 40));
exportEntities.add(new ExcelExportEntity("姓名", "userName", 20));
exportEntities.add(new ExcelExportEntity("性别", "sex", 10));
exportEntities.add(new ExcelExportEntity("身份证号", "idCard", 30));
exportEntities.add(new ExcelExportEntity("手机号", "mobile", 15));
exportEntities.add(new ExcelExportEntity("出行日期", "specificTime", 50));
exportEntities.add(new ExcelExportEntity("出行天数", "playDay", 10));
exportEntities.add(new ExcelExportEntity("出行地点", "lineName", 20));
exportEntities.add(new ExcelExportEntity("备注", "remark", 20));
exportEntities.add(new ExcelExportEntity("旅行社", "travelAgencyName", 20));
exportEntities.add(new ExcelExportEntity("费用(元)", "money", 20));
exportEntities.add(new ExcelExportEntity("使用下一年经费", "useNextMoney", 20));
try {
ExportParams exportParams = new ExportParams();
exportParams.setTitle("集中疗休养报名签到表");
response.setContentType("application/octet-stream");
response.setHeader("Content-Disposition", "attachment;filename=" + new String(("集中疗休养报名签到表.xls").getBytes(StandardCharsets.UTF_8), StandardCharsets.ISO_8859_1));
Workbook workbook = ExcelExportUtil.exportExcel(exportParams, exportEntities, list);
workbook.write(response.getOutputStream());
workbook.close();
} catch (Exception e) {
e.printStackTrace();
}
}
@At
@Ok("void")
@RequiresPermissions("theRapyRecuperation.statistics")
public void exportGroup(@Param(value = "startYear", required = false) Integer startYear,
@Param(value = "endYear", required = false) Integer endYear,
@Param(value = "unionId", required = false) String unionId,
@Param(value = "takePartInLineId") String takePartInLineId,
@Param(value = "lotId", required = false) String lotId,
@Param(value = "selectId", required = false) String selectId,
@Param(value = "regionalNature", required = false) String regionalNature,
HttpServletResponse response) throws IOException {
response.setContentType("application/octet-stream");
response.setHeader("content-disposition", "attachment;filename="
+ URLEncoder.encode("集中疗休养成团表.zip", StandardCharsets.UTF_8));
Sql sql = Sqls.create("""
SELECT
us.id,
line.lineName,
CONCAT(DATE_FORMAT(us.playStartTime, '%m月%d日'), '-', DATE_FORMAT(us.playEndTime, '%m月%d日')) as specificTime,
IF
( line.groupType = 1, '常规团', '精品团' ) AS groupType,
ta.travelAgencyName
FROM
the_rapy_recuperation_line_union_select us
LEFT JOIN the_rapy_recuperation_line line ON us.lineId = line.id
LEFT JOIN the_rapy_recuperation_travel_agency ta ON ta.id = line.travelAgencyId
$condition
""");
Cnd cnd = Cnd.NEW();
cnd.and("us.groupSuccess", "=", true);
cnd.and("line.stateId", "=", 4);
cnd.andEX("YEAR(us.selectTime)", ">=", startYear);
cnd.andEX("YEAR(us.selectTime)", "<=", endYear);
if (!ShiroUtil.hasAnyRoles("sysadmin, SchoolUnionAdmin")) {
cnd.and("us.selectUserId", "=", ShiroUtil.getUserId());
}
cnd.andEX("line.lotId", "=", lotId);
cnd.andEX("line.id", "=", takePartInLineId);
cnd.andEX("us.id", "=", selectId);
cnd.andEX("line.regionalNature", "=", regionalNature);
sql.setCondition(cnd);
List<NutMap> listMap = enrollService.listMap(sql);
ZipOutputStream zipOutputStream = new ZipOutputStream(new BufferedOutputStream(response.getOutputStream()));
for (int i = 0; i < listMap.size(); i++) {
NutMap group = listMap.get(i);
Sql userSql = Sqls.create("""
select
userName as uName,
unitName,
idCard,
mobile
from
the_rapy_recuperation_enroll
$condition
""");
Cnd userCnd = Cnd.NEW();
userCnd.and("isNormal", "=", true);
userCnd.and("stateId", "=", 2750);
userCnd.and("takePartInLineId", "=", group.getString("id"));
userCnd.asc("signingUptime");
userSql.setCondition(userCnd);
List<NutMap> userList = enrollService.listMap(userSql);
for (int u = 0; u < userList.size(); u++) {
userList.get(u).put("index", (u + 1));
}
NutMap data = new NutMap();
data.put("schoolName", Globals.schoolName);
data.put("address", group.getString("lineName"));
data.put("playTime", group.getString("specificTime"));
data.put("groupType", group.getString("groupType"));
data.put("travelName", group.getString("travelAgencyName"));
data.put("opinions", "同意");
data.put("applyTime", DateUtil.now());
data.put("auditTime", DateUtil.now());
if(Lang.isNotEmpty(userList)) {
data.put("deptName", userList.get(0).getString("unitName"));
data.put("leader", userList.get(0).getString("uName"));
data.put("mobile", userList.get(0).getString("mobile"));
}
data.put("list", userList);
HackLoopTableRenderPolicy policy = new HackLoopTableRenderPolicy();
Configure config = Configure.builder().bind("list", policy).build();
String fileName = (i + 1) + "." + group.getString("lineName") + "" + group.getString("specificTime") + "" + "成团表.docx";
zipOutputStream.putNextEntry(new ZipEntry(fileName));
XWPFTemplate.compile(officeTemplateUtil.getPath("the_rapy_group"), config).render(data).write(zipOutputStream);
zipOutputStream.closeEntry();
}
zipOutputStream.flush();
zipOutputStream.close();
}
}
@@ -130,6 +130,16 @@ public class TheRapyRecuperationConfig {
@Comment("分段式最少成团人数")
private Integer fragmentCount;
@Column
@ColDefine(type = ColType.DATETIME)
@Comment("精品团创建线路开始日期")
private DateTime createLineStartTime;
@Column
@ColDefine(type = ColType.DATETIME)
@Comment("精品团创建线路结束日期")
private DateTime createLineEndTime;
@Column
@ColDefine(type = ColType.DATETIME)
@Comment("集中疗休养报名开始时间")
@@ -223,5 +223,11 @@ public class TheRapyRecuperationEnroll extends BaseModel {
@Comment("报酒店时选择的出行天数")
private Double playDay;
@Column
@ColDefine(type = ColType.INT)
@Comment("超出费用类型")
@Default("0")
private Integer moneyType;
private String firstLetter;
}
@@ -161,11 +161,27 @@ public class TheRapyRecuperationLine extends BaseModel {
@ColDefine(type = ColType.BOOLEAN)
@Comment("开放选择")
@Default("0")
private boolean openChoose;
private Boolean openChoose;
@Column
@ColDefine(type = ColType.BOOLEAN)
@Comment("工勤特定线路")
@Default("0")
private Boolean specialLine;
@Column
@ColDefine(type = ColType.INT)
@Comment("成团类型(1.常规团 2.精品团)")
private Integer groupType;
@Column
@ColDefine(type = ColType.INT)
@Comment("审核状态(1.待校工会审核,2.校工会退回修改,3.校工会拒绝,4.审核通过)")
private Integer stateId;
@Column
@ColDefine(type = ColType.VARCHAR, width = 32)
@Comment("校工会审核id")
private String schoolAuditId;
}
@@ -27,7 +27,7 @@ public interface TheRapyRecuperationEnrollService extends ViService<TheRapyRecup
* @param trrt trrt
* @return {@link Pagination}
*/
Pagination enrollPageData(PageForm pageForm, Integer year, String unionId, int trrt, Integer lineUnionType, String routeName, String lotId);
Pagination enrollPageData(PageForm pageForm, Integer year, String unionId, int trrt, Integer lineUnionType, String routeName, String lotId, String searchKeyword, String playStartTime, String playEndTime);
List<NutMap> getSelectLineById(String lineId, String unionId, int trrt, Integer lineUnionType);
@@ -9,6 +9,7 @@ import io.v.nutz.web.commons.utils.ShiroUtil;
import io.v.nutz.zhgh.therapyRecuperation.constant.TheRapyRecuperationLineCreateMode;
import io.v.nutz.zhgh.therapyRecuperation.constant.TheRapyRecuperationSignUpMode;
import io.v.nutz.zhgh.therapyRecuperation.constant.TheRapyRecuperationState;
import io.v.nutz.zhgh.therapyRecuperation.model.TheRapyRecuperationEnroll;
import io.v.nutz.zhgh.therapyRecuperation.model.TheRapyRecuperationEnrollCompanion;
import io.v.nutz.zhgh.therapyRecuperation.model.TheRapyRecuperationLine;
import io.v.nutz.zhgh.therapyRecuperation.model.TheRapyRecuperationLineUnionSelect;
@@ -49,8 +50,12 @@ public class TheRapyRecuperationLineServiceImpl extends ViServiceImpl<TheRapyRec
@Override
@Aop(TransAop.READ_COMMITTED)
public void deleteLine(String lineId) {
List<TheRapyRecuperationLineUnionSelect> unionSelects = dao().query(TheRapyRecuperationLineUnionSelect.class, Cnd.where("lineId", "=", lineId));
List<String> list = unionSelects.stream().map(TheRapyRecuperationLineUnionSelect::getId).toList();
delete(lineId);
dao().clear(TheRapyRecuperationLineUnionSelect.class, Cnd.where("lineId", "=", lineId));
dao().clear(TheRapyRecuperationEnroll.class, Cnd.where("takePartInLineId", "in", list));
deleteLineInfoCache(lineId);
}
@@ -62,9 +67,16 @@ public class TheRapyRecuperationLineServiceImpl extends ViServiceImpl<TheRapyRec
@Override
@Aop(TransAop.READ_COMMITTED)
public void addLine(TheRapyRecuperationLine line) {
if(ShiroUtil.hasAnyRoles("sysadmin, SchoolUnionAdmin")) {
line.setSignUpMode(2);
} else {
line.setSignUpMode(3);
}
if(line.getSignUpMode() == TheRapyRecuperationSignUpMode.UNION.getValue()) {
line.setCreateUnionId(Vi.getUnionId());
}
line.setOpenChoose(false);
line.setStateId(line.getGroupType() == 2 ? 1 : 4);
insert(line);
}
@@ -76,6 +88,7 @@ public class TheRapyRecuperationLineServiceImpl extends ViServiceImpl<TheRapyRec
@Override
@Aop(TransAop.READ_COMMITTED)
public void editLine(TheRapyRecuperationLine line) {
line.setStateId(line.getGroupType() == 2 ? 1 : 4);
update(line);
deleteLineInfoCache(line.getId());
}
@@ -103,6 +116,7 @@ public class TheRapyRecuperationLineServiceImpl extends ViServiceImpl<TheRapyRec
Sql sql = Sqls.create("""
SELECT
line.id,
line.stateId,
line.serialNumber,
line.lineName,
line.regionalNature,
@@ -81,7 +81,7 @@ public class TheRapyRecuperationTravelAgencyServiceImpl extends ViServiceImpl<Th
Sql sql = Sqls.create("""
select
*,
cast(files ->> '$[0].id' as char) as fileId
files as fileId
from
the_rapy_recuperation_travel_agency $condition
""");
@@ -0,0 +1,210 @@
<template>
<div>
<el-tabs tab-position="top" v-model="activeName" v-loading="loading">
<el-tab-pane label="路线信息" name="1">
<line-info ref="viewLineInfo"></line-info>
</el-tab-pane>
<el-tab-pane label="线路报名信息" name="2">
<el-card shadow="never">
<div class="search">
<div class="search-item">
<div class="search-item-label">工号姓名</div>
<div class="search-item-option">
<el-input v-model="userPageForm.searchKeyword" maxlength="10" clearable
placeholder="请输入工号或姓名查询"></el-input>
</div>
</div>
<div class="search-item">
<div class="search-item-label">所属工会</div>
<div class="search-item-option">
<el-select clearable
filterable
placeholder="请选择所属工会" style="width: 100%;"
v-model="userPageForm.unionId">
<el-option :label="item.unionname" :value="item.id" v-for="item in unions"></el-option>
</el-select>
</div>
</div>
<div class="search-query">
<el-button @click="getUserDataByLineId" icon="el-icon-search" type="primary">搜索</el-button>
</div>
</div>
</el-card>
<el-card shadow="never" class="mt10">
<el-table :data="userData">
<el-table-column
align="center"
header-align="center"
v-for="column in userDataTableColumns"
show-overflow-tooltip
:label="column.label"
:prop="column.prop"
:sortable="column.sortable"
>
<template scope="{row}" v-if="column.prop=='isFamily'">
<el-link v-if="!row.familyNumber" type="primary">
{{ row.isFamily ? '携带' : '未携带' }}{{ row.isFamily }}
</el-link>
<el-link v-else type="primary">
{{ row.familyNumber ? '携带' : '未携带' }}{{ row.familyNumber }}
</el-link>
</template>
<template scope="{row}" v-else-if="column.prop=='sign'">
<el-image v-if="row.sign"
style="width: 100px; height: 50px"
:src="'/file_server/fileStreamPreview?id=' +row.sign"
fit="contain"></el-image>
<span v-else>暂无</span>
</template>
</el-table-column>
</el-table>
<el-row class="el-pagination-container" style="margin-bottom: 0px">
<el-pagination
@size-change="userPageSizeChange"
@current-change="userPageNumberChange"
:current-page="userPageForm.pageNumber"
:page-sizes="[5,10, 20, 30, 50]"
:page-size="userPageForm.pageSize"
layout="total, sizes, prev, pager, next"
:total="userPageForm.totalCount">
</el-pagination>
</el-row>
</el-card>
</el-tab-pane>
<el-tab-pane label="分工会审核信息" name="3" v-if="viewData.unionAuditId">
<el-descriptions border class="descriptions-form" :column="2">
<el-descriptions-item label="审核人">
{{ viewData.unionAudit.username }}
</el-descriptions-item>
<el-descriptions-item label="审核时间">
{{ moment(viewData.unionAudit.auditTime).format('YYYY-MM-DD') }}
</el-descriptions-item>
<el-descriptions-item label="审核意见" :span="2">
{{ viewData.unionAudit.auditOpinion }}
</el-descriptions-item>
</el-descriptions>
</el-tab-pane>
<el-tab-pane label="单位领导审核信息" name="4" v-if="viewData.unitLeaderAuditId">
<el-descriptions border class="descriptions-form" :column="2">
<el-descriptions-item label="审核人">
{{ viewData.unitLeaderAudit.username }}
</el-descriptions-item>
<el-descriptions-item label="审核时间">
{{ moment(viewData.unitLeaderAudit.auditTime).format('YYYY-MM-DD') }}
</el-descriptions-item>
<el-descriptions-item label="审核意见" :span="2">
{{ viewData.unitLeaderAudit.auditOpinion }}
</el-descriptions-item>
</el-descriptions>
</el-tab-pane>
<el-tab-pane label="校工会审核信息" name="5" v-if="viewData.schoolAuditId">
<el-descriptions border class="descriptions-form" :column="2">
<el-descriptions-item label="审核人">
{{ viewData.schoolAudit.username }}
</el-descriptions-item>
<el-descriptions-item label="审核时间">
{{ moment(viewData.schoolAudit.auditTime).format('YYYY-MM-DD') }}
</el-descriptions-item>
<el-descriptions-item label="审核意见" :span="2">
{{ viewData.schoolAudit.auditOpinion }}
</el-descriptions-item>
</el-descriptions>
</el-tab-pane>
<el-tab-pane v-if="handle" :label="label" name="999">
<slot name="handle"></slot>
</el-tab-pane>
</el-tabs>
</div>
</template>
<script>
module.exports = {
props: {
handle: {
type: Boolean,
default: false,
},
label: {
type: String,
default: '审核'
},
panes: {
type: Array,
default: []
},
},
data() {
return {
activeName: "1",
viewData: {},
loading: true,
unions: {},
userDataTableColumns: [
{prop: 'loginName', label: '工号'},
{prop: 'userName', label: '姓名'},
{prop: 'unionName', label: '所属工会'},
{prop: 'unitName', label: '所属单位', sortable: true},
{prop: 'isFamily', label: '是否携带家属'},
{prop: 'linePlayTime', label: '出行时间', sortable: true},
{prop: 'sign', label: '签字', sortable: true}
],
userPageForm: {
pageNumber: 1,
pageSize: 10
},
lineId: null,
userData: []
}
},
components: {
'line-info': httpVueLoader('/components/theRapyRecuperation/LineInfo.vue')
},
methods: {
hasPane(name) {
if (!this.handle) {
return true
}
return this.panes.includes(name)
},
findOne(id) {
$.post("/platform/theRapyRecuperation/enrollAudit/commonAudit/findOne", {id}).then(resp => {
this.viewData = resp.data
})
},
userPageSizeChange(val) {
this.userPageForm.pageSize = val;
this.getUserDataByLineId();
},
userPageNumberChange(val) {
this.userPageForm.pageNumber = val;
this.getUserDataByLineId();
},
async getUserDataByLineId() {
const resp = await $.post('/platform/theRapyRecuperation/enrollAudit/commonAudit/getUserDateByLine', this.userPageForm)
if (resp.code === 0) {
this.userData = resp.data.list
this.userPageForm.totalCount = resp.data.totalCount
}
},
async init(row) {
this.unions = await getUnions()
this.$refs.viewLineInfo.findOne(row.lineId, null)
this.findOne(row.lineUId)
this.userPageForm.takePartLineId = row.lineUId
await this.getUserDataByLineId()
this.loading = false
this.activeName = this.handle ? "999" : "1"
}
}
}
</script>
@@ -1,90 +1,120 @@
<template>
<div>
<div class="panel panel-default mt20" style="border: none">
<div class="panel-heading" style="background: #fafafa;border:1px solid #ebeef5;border-bottom: none">
<h3 class="panel-title">
线路信息
</h3>
</div>
<el-descriptions :column="2" border class="viewTable">
<el-descriptions-item label="年度">{{ viewData.year }}</el-descriptions-item>
<el-descriptions-item label="编号">{{ viewData.serialNumber }}</el-descriptions-item>
<el-descriptions-item label="线路名称">{{ viewData.lineName }}</el-descriptions-item>
<el-descriptions-item label="区域性质">{{ viewData.regionalNature }}</el-descriptions-item>
<!-- <el-descriptions-item label="最少成团人数">{{ viewData.minimumGroupSize }}</el-descriptions-item>-->
<!-- 校工会创建AND自由模式 OR 分工会创建 -->
<!-- <template v-if="(viewData.createMode === 2 && viewData.signUpMode === 2 ) || viewData.createMode === 1">-->
<el-tabs tab-position="top" v-model="activeName">
<el-tab-pane label="路线信息" name="1">
<div>
<div class="panel panel-default mt20" style="border: none">
<div class="panel-heading" style="background: #fafafa;border:1px solid #ebeef5;border-bottom: none">
<h3 class="panel-title">
线路信息
</h3>
</div>
<el-descriptions :column="2" border class="viewTable">
<el-descriptions-item label="年度">{{ viewData.year }}</el-descriptions-item>
<el-descriptions-item label="编号">{{ viewData.serialNumber }}</el-descriptions-item>
<el-descriptions-item label="线路名称">{{ viewData.lineName }}</el-descriptions-item>
<el-descriptions-item label="成团类型">{{ viewData.groupType === 1 ? '常规团' : '精品团' }}</el-descriptions-item>
<el-descriptions-item label="线路类型">{{ viewData.regionalNature }}</el-descriptions-item>
<el-descriptions-item label="最少成团人数">{{ viewData.minimumGroupSize }}</el-descriptions-item>
<el-descriptions-item label="时间标段">{{ viewData.lotName }}</el-descriptions-item>
<el-descriptions-item label="预计费用">{{ viewData.estimatedCost }}</el-descriptions-item>
<el-descriptions-item label="联系人">{{ viewData.lineContact }}</el-descriptions-item>
<el-descriptions-item label="联系方式">{{ viewData.lineContactPhone }}</el-descriptions-item>
</el-descriptions>
</div>
<div class="panel panel-default mt20" style="border:none" v-if="showTravelTimePeriod">
<div class="panel-heading" style="background: #fafafa;border:1px solid #ebeef5;border-bottom: none">
<h3 class="panel-title">
出行时间段
</h3>
</div>
<el-table :data="times" border>
<el-table-column label="报名开始时间" prop="signUpStartTime"></el-table-column>
<el-table-column label="报名结束时间" prop="signUpEndTime"></el-table-column>
<el-table-column label="变更截至时间" prop="changeEndTime"></el-table-column>
<el-table-column label="出行开始时间" prop="playStartTime"></el-table-column>
<el-table-column label="出行结束时间" prop="playEndTime"></el-table-column>
<el-table-column label="联系人" prop="contact"></el-table-column>
<el-table-column label="联系方式" prop="contactPhone"></el-table-column>
</el-table>
<!-- <el-descriptions-item label="报名开始时间">{{ viewData.signUpStartTime }}</el-descriptions-item>
<el-descriptions-item label="报名结束时间">{{ viewData.signUpEndTime }}</el-descriptions-item>
<el-descriptions-item :span="2" label="变更截至时间">{{ viewData.changeEndTime }}</el-descriptions-item>
<el-descriptions-item label="出行开始时间">{{ viewData.playStartTime }}</el-descriptions-item>
<el-descriptions-item label="出行结束时间">{{ viewData.playEndTime }}</el-descriptions-item>-->
</div>
<div class="panel panel-default mt20" style="border: none">
<div class="panel-heading" style="background: #fafafa;border:1px solid #ebeef5;border-bottom: none">
<h3 class="panel-title">
旅行社信息
</h3>
</div>
<el-descriptions :column="2" border class="viewTable">
<el-descriptions-item :span="2" label="旅行社名称">{{
viewData.travelAgency.travelAgencyName
}}
</el-descriptions-item>
<el-descriptions-item label="联系人">{{ viewData.travelAgency.contact }}</el-descriptions-item>
<el-descriptions-item label="电话">{{ viewData.travelAgency.contactMobileNumber }}</el-descriptions-item>
<el-descriptions-item label="邮箱">{{ viewData.travelAgency.email }}</el-descriptions-item>
<el-descriptions-item label="官网">
<a :href="viewData.travelAgency.officialWebsite" class="text-primary" target="_blank">
{{ viewData.travelAgency.officialWebsite }}
</a>
</el-descriptions-item>
</el-descriptions>
</div>
<div class="panel panel-default mt20" style="border-color: #ebeef5">
<div class="panel-heading" style="background: #fafafa;border-color: #ebeef5">
<h3 class="panel-title">
线路内容
</h3>
</div>
<div class="panel-body">
<div v-html="viewData.content"></div>
</div>
</div>
</div>
</el-tab-pane>
<el-tab-pane label="校工会审核信息" name="2" v-if="viewData.schoolAuditId">
<el-descriptions border class="descriptions-form" :column="2">
<el-descriptions-item label="审核人">
{{ viewData.schoolAudit.username }}
</el-descriptions-item>
<el-descriptions-item label="审核时间">
{{ moment(viewData.schoolAudit.auditTime).format('YYYY-MM-DD') }}
</el-descriptions-item>
<el-descriptions-item label="审核意见" :span="2">
{{ viewData.schoolAudit.auditOpinion }}
</el-descriptions-item>
</el-descriptions>
</el-tab-pane>
<!-- <el-descriptions-item label="交通工具">{{ viewData.trafficTools }}</el-descriptions-item>-->
<!-- <el-descriptions-item label="预计费用(元)">{{ viewData.estimatedCost }}</el-descriptions-item>-->
<!-- <el-descriptions-item label="预计人数(含家属)">{{ viewData.estimatedFamilyNumbers }}</el-descriptions-item>-->
<!-- <el-descriptions-item label=""></el-descriptions-item>-->
</el-descriptions>
</div>
<div class="panel panel-default mt20" style="border:none" v-if="showTravelTimePeriod">
<div class="panel-heading" style="background: #fafafa;border:1px solid #ebeef5;border-bottom: none">
<h3 class="panel-title">
出行时间段
</h3>
</div>
<el-table :data="times" border>
<el-table-column label="报名开始时间" prop="signUpStartTime"></el-table-column>
<el-table-column label="报名结束时间" prop="signUpEndTime"></el-table-column>
<el-table-column label="变更截至时间" prop="changeEndTime"></el-table-column>
<el-table-column label="出行开始时间" prop="playStartTime"></el-table-column>
<el-table-column label="出行结束时间" prop="playEndTime"></el-table-column>
<el-table-column label="联系人" prop="contact"></el-table-column>
<el-table-column label="联系方式" prop="contactPhone"></el-table-column>
</el-table>
</div>
<div class="panel panel-default mt20" style="border: none">
<div class="panel-heading" style="background: #fafafa;border:1px solid #ebeef5;border-bottom: none">
<h3 class="panel-title">
旅行社信息
</h3>
</div>
<el-descriptions :column="2" border class="viewTable">
<el-descriptions-item :span="2" label="旅行社名称">{{
viewData.travelAgency.travelAgencyName
}}
</el-descriptions-item>
<el-descriptions-item label="联系人">{{ viewData.travelAgency.contact }}</el-descriptions-item>
<el-descriptions-item label="电话">{{ viewData.travelAgency.contactMobileNumber }}</el-descriptions-item>
<el-descriptions-item label="邮箱">{{ viewData.travelAgency.email }}</el-descriptions-item>
<el-descriptions-item label="官网">
<a :href="viewData.travelAgency.officialWebsite" class="text-primary" target="_blank">
{{ viewData.travelAgency.officialWebsite }}
</a>
</el-descriptions-item>
</el-descriptions>
</div>
<div class="panel panel-default mt20" style="border-color: #ebeef5">
<div class="panel-heading" style="background: #fafafa;border-color: #ebeef5">
<h3 class="panel-title">
线路内容
</h3>
</div>
<div class="panel-body">
<div v-html="viewData.content"></div>
</div>
</div>
<el-tab-pane v-if="handle" :label="label" name="999">
<slot name="handle"></slot>
</el-tab-pane>
</el-tabs>
</div>
</template>
<script>
module.exports = {
name: "LineInfo",
props: {
handle: {
type: Boolean,
default: false,
},
label: {
type: String,
default: '审核'
},
panes: {
type: Array,
default: []
},
},
data() {
return {
activeName: "1",
viewData: {
travelAgency:{}
},
@@ -122,7 +152,10 @@ module.exports = {
if (resp.code === 0 && resp.data) {
this.times = resp.data
}
}
},
},
created() {
this.activeName = this.handle ? "999" : "1"
}
}
</script>
@@ -723,7 +723,7 @@ layout("/mobile/platform.html"){
}),
})
if (re.code !== 0) {
vant.Toast(re.msg)
vant.Dialog.alert({title: '温馨提示', message: re.msg})
return
}
if (this.fromUrlByMy !== 'editDo') {
@@ -71,6 +71,13 @@ layout("/mobile/platform.html"){
<div v-else id="demo" class="pdf_div"></div>
</div>
<div>
<van-tabbar v-model="tarBarActive">
<van-tabbar-item icon="home-o" replace url="/platform/mobile/theRapyRecuperation/index">疗休养首页</van-tabbar-item>
<van-tabbar-item icon="search" replace url="/platform/mobile/theRapyRecuperation/mobileLineListPage">线路选择</van-tabbar-item>
<van-tabbar-item icon="manager-o" replace url="/platform/mobile/theRapyRecuperation/myRecuperation">我的报名</van-tabbar-item>
</van-tabbar>
</div>
</div>
<script>
let pdfh5 = null
@@ -79,6 +86,7 @@ layout("/mobile/platform.html"){
mixins: [mobileMixins],
data() {
return {
tarBarActive: 0,
chooseButton: [],
configData: {},
isPdf: false,
@@ -132,7 +132,7 @@ layout("/mobile/platform.html"){
}
.van-cell {
padding: 8px 16px;
padding: 8px 5px;
}
.van-tabs__wrap {
@@ -227,6 +227,15 @@ layout("/mobile/platform.html"){
.van-action-sheet {
max-height: 90%;
}
.van-cell--required::before {
left: -2px;
}
.van-radio__label {
margin-left: 0;
}
.van-radio--horizontal {
margin-right: 8px;
}
</style>
@@ -251,22 +260,22 @@ layout("/mobile/platform.html"){
<div style="margin-top: 10px">
<div>
<div>
<span class="line_label">最少成团人数</span>
<span>预计费用</span>
{{lineData.estimatedCost}}元
</div>
<div>
<span class="line_label">最少成团:</span>
<label v-if="lineData.minimumGroupSize">{{lineData.minimumGroupSize}}人</label>
<label v-else>不限制</label>
</div>
<!--<div>
<span>当前报名:</span>
{{lineData.signUpUserNum}}
</div>-->
<div v-if="configData.familyInfo == 2">
<!--<div v-if="configData.familyInfo == 2">
<span>当前报名:</span>
{{lineData.signUpUserNum + lineData.signUpUserFamilyNum + '(家属' + lineData.signUpUserFamilyNum + '人)'}}
</div>
<div v-else>
<span>当前报名:</span>
{{lineData.signUpUserNum + lineData.familyNumber + '(家属' + lineData.familyNumber + '人)'}}
</div>
</div>-->
</div>
<div>
@@ -324,6 +333,11 @@ layout("/mobile/platform.html"){
<!--报名弹出框-->
<van-popup v-model:show="joinPopup" position="right" class="joinPopup">
<van-nav-bar @click-left="joinPopup = false" fixed left-arrow placeholder title="疗休养报名"></van-nav-bar>
<van-notice-bar
v-if="Number(lineData.estimatedCost) > 3000"
left-icon="volume-o"
text="温馨提醒:您选择的线路预计费用超过3000元,需要选择超出费用类型"
></van-notice-bar>
<div class="join_content">
<van-form @submit="joinSubmit">
@@ -337,12 +351,20 @@ layout("/mobile/platform.html"){
<div class="van-card-body">
<van-field label="姓名" readonly v-model="formData.userName"></van-field>
<van-field label="一卡通号" readonly v-model="formData.loginName"></van-field>
<van-field label="身份证件" name="idCard" :rules="[{ required: true }]"
<van-field required label="身份证件" name="idCard" :rules="[{ required: true }]"
placeholder="请填写身份证号、护照、台胞证等" v-model="formData.idCard"></van-field>
<van-field label="手机号" name="mobile" :rules="[{ required: true }]"
<van-field required label="手机号" name="mobile" :rules="[{ required: true }]"
placeholder="请填写手机号" v-model="formData.mobile"></van-field>
<van-field label="所属工会" readonly v-model="formData.unionName"></van-field>
<van-field label="报名线路" readonly v-model="formData.lineName"></van-field>
<van-field v-if="Number(lineData.estimatedCost) > 3000" required name="moneyType" label="超出费用类型" :rules="[{ required: true, message: '请选择超出费用类型' }]">
<template #input>
<van-radio-group v-model="formData.moneyType" direction="horizontal">
<van-radio :name="1">自己承担</van-radio>
<van-radio :name="2">使用明年额度</van-radio>
</van-radio-group>
</template>
</van-field>
</div>
</div>
@@ -700,11 +722,7 @@ layout("/mobile/platform.html"){
}).catch(() => {
});
} else {
vant.Dialog.alert({
title: '温馨提示',
message: re.msg,
}).then(() => {
})
vant.Dialog.alert({title: '温馨提示', message: re.msg})
}
return
}
@@ -31,7 +31,7 @@ layout("/mobile/platform.html"){
}
.list-card > .content {
padding: 16px 10px;
padding: 16px 10px 0;
display: flex;
}
@@ -141,6 +141,31 @@ layout("/mobile/platform.html"){
[v-cloak] {
display: none;
}
.van-calendar__header-title {
display: none;
}
.van-dropdown-menu__bar {
height: 30px;
}
.van-dropdown-menu__bar {
border: none
}
.filter-footer {
height: 54px;
background: #FFF;
display: flex;
align-items: center;
justify-content: space-between;
padding: 0 20px;
box-sizing: border-box;
border-top: 1px solid #ededed;
column-gap: 20px;
}
.filter-footer button {
flex: 1;
height: 30px;
border-radius: 8px;
}
</style>
@@ -186,6 +211,9 @@ layout("/mobile/platform.html"){
个人组织
</van-button>
</div>
<div v-else>
<div style="text-align: center" @click="searchPopup = true">筛选</div>
</div>
</div>
@@ -196,18 +224,21 @@ layout("/mobile/platform.html"){
@load="onLoad"
v-model="loading">
<div @click.stop="clickLineRow(o)" class="list-card" v-for="o in tableData">
<div class="content">
<div class="content" :style="pageForm.theRapyRecuperationType != '2' && pageForm.theRapyRecuperationType != '3' ? 'padding-bottom: 16px' : ''">
<van-image
height="92"
radius="8"
:src="CREATE_PREVIEW_URL(o.fileId)"
width="130">
</van-image>
<!--线路-->
<div v-if="pageForm.theRapyRecuperationType != '2' && pageForm.theRapyRecuperationType != '3'"
class="content-right">
<div class="cr-title">
<span>{{o.lineName}}</span>
<div>
<van-tag color="#1867b0">{{o.groupType === 1 ? '常规团' : '精品团'}}</van-tag>
<van-tag color="#1867b0">{{o.travelAgencyPlace}}</van-tag>
<van-tag v-if="o.signUpMode === 1" color="#1867b0">{{o.usUnionName}}</van-tag>
<van-tag v-if="o.signUpMode === 2" color="#1867b0">{{'校工会'}}</van-tag>
@@ -215,30 +246,36 @@ layout("/mobile/platform.html"){
</div>
</div>
<div class="desc_info">
<!--<div class="union">
<span>组织形式</span>{{o.createMode === 2 && o.signUpMode === 2 ? '校工会' : o.usUnionName}}
</div>-->
<div class="concat" v-if="modifyConfig.familyInfo == 2">
<div class="concat">
<span>预计费用</span>
{{o.estimatedCost}}元
</div>
<div class="concat">
<span>出行时段:</span>
{{moment(o.playStartTime).format('MM-DD') + ' 至 ' + moment(o.playEndTime).format('MM-DD')}}
</div>
<!--<div class="concat" v-if="modifyConfig.familyInfo == 2">
<span>已报人数:</span>{{o.signUpUserNum + o.signUpUserFamilyNum + '(家属' +
o.signUpUserFamilyNum + '人)'}}
</div>
<div class="concat" v-else>
<!--<span>已报人数:</span>{{o.signUpUserNum + o.familyNumber + '(家属' +
o.familyNumber + '人)'}}-->
<span>&ensp;&ensp;人:</span>{{o.contact}}
</div>
<div class="mobile">
<!--<span>出行时间:</span>{{moment(o.playStartTime).format('YYYY-MM-DD')}}-->
<span>联系方式:</span>{{o.contactMobileNumber}}
</div>
</div>-->
<div class="mobile">
<span>&ensp;&ensp;社:</span>{{o.travelAgencyName}}
<span>&ensp;&ensp;社:</span>
{{o.travelAgencyName}}
</div>
</div>
</div>
<!--旅行社-->
<div v-if="pageForm.theRapyRecuperationType == '2'" class="content-right">
<div class="cr-title">
<span>{{o.travelAgencyName}}</span>
@@ -261,6 +298,7 @@ layout("/mobile/platform.html"){
</div>
</div>
<!--酒店-->
<div v-if="pageForm.theRapyRecuperationType == '3'" class="content-right">
<div class="cr-title">
<span>{{o.baseName}}</span>
@@ -281,14 +319,17 @@ layout("/mobile/platform.html"){
</div>
</div>
</div>
</div>
<!--酒店-->
<div v-if="pageForm.theRapyRecuperationType == '3'" style="text-align: right; padding-right: 10px; padding-bottom: 10px" class="sign_button">
<van-button @click.stop="clickLineRow(o)" size="mini"
type="info" color="#1867B0">点击报名</van-button>
<van-button @click.stop="openSignUser(o, 'baseManagement')" size="mini"
type="info" color="#1867B0">查看人员</van-button>
</div>
<!--旅行社-->
<div v-if="pageForm.theRapyRecuperationType == '2'">
<van-row gutter="20">
<van-col @click="" span="12" style="border-right: 1px lightgrey solid"></van-col>
@@ -340,22 +381,67 @@ layout("/mobile/platform.html"){
</button>
</van-action-sheet>
<!--<van-action-sheet v-model="searchSheet" title="查询条件">
<van-field v-model="pageForm.searchKeyword" label="报名人员" placeholder="请输入工号或姓名查询"></van-field>
<van-field v-model="pageForm.playStartTime" label="出行开始时间" placeholder="请点击选择出行开始时间" is-link readonly></van-field>
<van-field v-model="pageForm.playEndTime" label="出行结束时间" placeholder="请点击选择出行结束时间" is-link readonly></van-field>
</van-action-sheet>-->
<van-popup v-model="searchPopup" position="right"
closeable
close-icon="close"
close-icon-position="top-left"
:style="{ height: '100%',width:'90vw',background:'#f1f1f1' }">
<div style="background: #FFFFFF;height: 46px;display: flex;align-items: center;justify-content: center;font-weight: bold">
筛选条件
</div>
<van-field v-model="pageForm.searchKeyword" label="报名人员" placeholder="请输入姓名查询"></van-field>
<van-field v-model="pageForm.playStartTime" label="出行开始时间" placeholder="请点击选择出行开始时间" is-link readonly @click="playStartPicker=true"></van-field>
<van-field v-model="pageForm.playEndTime" label="出行结束时间" placeholder="请点击选择出行结束时间" is-link readonly @click="playEndPicker=true"></van-field>
<div class="filter-footer">
<van-button size="normal" type="danger" @click="reset">重置</van-button>
<van-button size="normal" type="info" @click="confirm">确定</van-button>
</div>
</van-popup>
<van-popup v-model="playStartPicker" position="bottom">
<van-datetime-picker
type="month-day"
:min-date="new Date(modifyConfig.fragmentPlayStartTime || '')"
:max-date="new Date(modifyConfig.fragmentPlayEndTime || '')"
@confirm="(val) => {pageForm.playStartTime=moment(val).format('MM-DD');playStartPicker=false}"
@cancel="playStartPicker = false"
></van-datetime-picker>
</van-popup>
<van-popup v-model="playEndPicker" position="bottom">
<van-datetime-picker
type="month-day"
:min-date="new Date(modifyConfig.fragmentPlayStartTime || '')"
:max-date="new Date(modifyConfig.fragmentPlayEndTime || '')"
@confirm="(val) => {pageForm.playEndTime=moment(val).format('MM-DD');playEndPicker=false}"
@cancel="playEndPicker = false"
></van-datetime-picker>
</van-popup>
<div>
<van-tabbar v-model="tarBarActive">
<van-tabbar-item icon="home-o" replace url="/platform/mobile/theRapyRecuperation/index">疗休养首页</van-tabbar-item>
<van-tabbar-item icon="search" replace url="/platform/mobile/theRapyRecuperation/mobileLineListPage">线路选择</van-tabbar-item>
<van-tabbar-item icon="manager-o" replace url="/platform/mobile/theRapyRecuperation/myRecuperation">我的报名</van-tabbar-item>
</van-tabbar>
</div>
</div>
<script>
function getQueryString(name) {
var reg = new RegExp("(^|&)" + name + "=([^&]*)(&|$)", "i");
var r = window.location.search.substr(1).match(reg);
if (r != null) return decodeURI(r[2]);
return null;
}
const vue = new Vue({
el: '#app',
mixins: [mobileMixins],
data() {
return {
playStartPicker: false,
playEndPicker: false,
searchPopup: false,
tarBarActive: 1,
yearArray: [],
unionColumns: [],
unionPop: false,
@@ -377,6 +463,17 @@ layout("/mobile/platform.html"){
}
},
methods: {
confirm() {
this.searchPopup = false
this.doSearch()
},
reset() {
this.$set(this.pageForm, 'searchKeyword', null)
this.$set(this.pageForm, 'playStartTime', null)
this.$set(this.pageForm, 'playEndTime', null)
this.searchPopup = false
this.doSearch()
},
async openSignUser(row, type) {
const id = type === 'line' ? row.usId : row.id
location.href = '/platform/mobile/theRapyRecuperation/userSignInfo?type=' + type + '&id=' + id
@@ -490,7 +587,6 @@ layout("/mobile/platform.html"){
},
async onLoad() {
const res = await $.post('/platform/theRapyRecuperation/line/enroll/pageData', this.pageForm)
if (res.code === 0 && res.data) {
this.tableData = this.tableData.concat(res.data.list)
if (this.tableData.length === res.data.totalCount) {
@@ -526,9 +622,6 @@ layout("/mobile/platform.html"){
const clickIndex = localStorage.getItem('clickIndex')
this.pageForm.theRapyRecuperationType = JSON.parse(clickIndex).clickIndex
}
/*if(this.pageForm.theRapyRecuperationType == 1){
this.$set(this.pageForm, 'lineUnionType', 3)
}*/
},
async created() {
this.createYear()
@@ -303,55 +303,31 @@ layout("/mobile/platform.html"){
width="130">
</van-image>
<div
v-if="pageForm.theRapyRecuperationType != '2' && pageForm.theRapyRecuperationType != '3'"
class="content-right"
>
<div v-if="pageForm.theRapyRecuperationType != '2' && pageForm.theRapyRecuperationType != '3'" class="content-right">
<div class="cr-title">
<span>{{o.lineName}}</span>
<div>
<van-tag color="#1867b0">{{o.lotName}}</van-tag>
<van-tag color="#1867b0"
>{{o.signUpMode === 2 ? '校工会' : o.signUpUnionName}}
</van-tag>
<van-tag color="#1867b0">{{o.groupType === 1 ? '常规团' : '精品团'}}</van-tag>
<van-tag color="#1867b0">{{o.travelAgencyPlace}}</van-tag>
<van-tag v-if="o.signUpMode === 1" color="#1867b0">{{o.usUnionName}}</van-tag>
<van-tag v-if="o.signUpMode === 2" color="#1867b0">{{'校工会'}}</van-tag>
<van-tag v-if="o.signUpMode === 3" color="#1867b0">{{o.selectUserName}}</van-tag>
</div>
</div>
<div class="desc_info">
<!--<div class="union">
<span>分工会:</span>{{o.signUpUnionName}}
</div>-->
<!--<div class="concat">
<span>时间:</span>{{o.YEAR}}
</div>-->
<!--<div class="concat">
<span>已报人数:</span>{{o.signUpUserNum + o.signUpUserFamilyNum + '(家属' + o.signUpUserFamilyNum + '人)'}}
</div>-->
<div class="mobile">
<span>&ensp;&ensp;社:</span>{{o.travelAgencyName}}
<div class="concat">
<span>&ensp;&ensp;人:</span>{{o.contact}}
</div>
<div class="mobile">
<span>联系方式:</span>{{o.contactMobileNumber}}
</div>
<!--<div class="mobile" v-if="![2715,2725,2735].includes(o.stateId)">
<span v-if="configData.familyInfo === 1">随行家属:</span>
{{o.companionUserNames ? o.companionUserNames : '无'}}
<span v-else>随行家属:</span>
{{o.familyNumber}}人
</div>
<div class="mobile" v-else>
<span>审核状态:</span>
<span :style="'color: ' + o.stateColor">{{o.stateName}}</span>
</div>-->
<div class="mobile">
<span>&ensp;&ensp;社:</span>{{o.travelAgencyName}}
</div>
</div>
</div>
<div
v-if="pageForm.theRapyRecuperationType == '2'"
class="content-right"
>
<div v-if="pageForm.theRapyRecuperationType == '2'" class="content-right">
<div class="cr-title">
<span>{{o.travelAgencyName}}</span>
</div>
@@ -374,10 +350,7 @@ layout("/mobile/platform.html"){
</div>
</div>
<div
v-if="pageForm.theRapyRecuperationType == '3'"
class="content-right"
>
<div v-if="pageForm.theRapyRecuperationType == '3'" class="content-right">
<div class="cr-title">
<span>{{o.baseName}}</span>
<div>
@@ -401,7 +374,7 @@ layout("/mobile/platform.html"){
<div class="operateDiv">
<van-button
v-if="pageForm.signUpStateId == 2"
v-if="o.isTakePartIn == true"
@click="openEvaluate(o)"
type="info"
size="small"
@@ -561,6 +534,14 @@ layout("/mobile/platform.html"){
</van-action-sheet>
<satisfaction-evaluate ref="satisfactionEvaluateRef"></satisfaction-evaluate>
<div>
<van-tabbar v-model="tarBarActive">
<van-tabbar-item icon="home-o" replace url="/platform/mobile/theRapyRecuperation/index">疗休养首页</van-tabbar-item>
<van-tabbar-item icon="search" replace url="/platform/mobile/theRapyRecuperation/mobileLineListPage">线路选择</van-tabbar-item>
<van-tabbar-item icon="manager-o" replace url="/platform/mobile/theRapyRecuperation/myRecuperation">我的报名</van-tabbar-item>
</van-tabbar>
</div>
</div>
<script>
<!--#include('SatisfactionEvaluate.js'){}#-->
@@ -580,6 +561,7 @@ layout("/mobile/platform.html"){
},
data() {
return {
tarBarActive: 2,
evaluateFormData: {},
evaluatePopup: false,
yearArray: [],
@@ -53,20 +53,6 @@ layout("/layouts/platform.html"){
</el-select>
</div>
</div>
<div class="search-item">
<div class="search-item-label">标段时间:</div>
<div class="search-item-option">
<el-select clearable filterable style="width: 100%"
v-model="pageForm.lotId"
@change="doSearch">
<el-option :key="item.id"
:label="item.lotName"
:value="item.id"
v-for="item in modifyBdList"
></el-option>
</el-select>
</div>
</div>
<div class="search-query">
<el-button @click="doSearch" icon="el-icon-search" type="primary">搜索</el-button>
</div>
@@ -76,7 +62,7 @@ layout("/layouts/platform.html"){
<el-card class="mt10" shadow="never">
<table-tool :app="this" label="目的地列表">
<template #func>
<el-button @click="openImport" size="medium" type="primary" style="margin-right: 10px">导入目的地
<el-button @click="openImport" size="medium" type="primary">导入目的地
</el-button>
<el-button @click="openAdd" size="medium" type="primary">新建目的地</el-button>
</template>
@@ -158,7 +144,7 @@ layout("/layouts/platform.html"){
</el-col>
<el-col :md="12" :sm="24" :xs="24">
<el-form-item label="旅行社名称" prop="travelAgencyId">
<el-select clearable filterable style="width: 100%" @change="$set(formData,'travelAgencyPlace','')"
<el-select clearable filterable style="width: 100%" @change="travelChange"
v-model="formData.travelAgencyId" placeholder="请选择旅行社名称">
<el-option :key="item.id"
:label="item.travelAgencyName+'('+ item.year +'年)'"
@@ -566,6 +552,12 @@ layout("/layouts/platform.html"){
}
},
methods: {
travelChange(val) {
this.$set(this.formData,'travelAgencyPlace','')
const travel = this.travelAgencyList.find(o => o.id === val)
this.$set(this.formData,'baseContactPerson', travel.contact)
this.$set(this.formData,'baseContactNumber', travel.contactMobileNumber)
},
weekChange(val) {
/*if (val === 1) {
this.formData.weekCheckIn = []
@@ -167,12 +167,18 @@ layout("/layouts/platform.html"){
查看详情
</el-button>
</template>
<template scope="{row:{stateId}}" v-else-if="column.prop==='stateId'">
<span v-if="stateId === 1">待校工会审核</span>
<span v-if="stateId === 2">校工会退回修改</span>
<span v-if="stateId === 3">校工会拒绝</span>
<span v-if="stateId === 4">审核通过</span>
</template>
</el-table-column>
<el-table-column label="操作" width="250px">
<template scope="{row}">
<el-button @click="openView(row.id)" size="mini" type="primary">查看</el-button>
<el-button @click="openEdit(row.id)" size="mini" type="primary">编辑</el-button>
<el-button @click="doDelete(row.id)" size="mini" type="danger">删除</el-button>
<el-button v-if="[1,2].includes(row.stateId)" @click="openEdit(row.id)" size="mini" type="primary">编辑</el-button>
<el-button v-if="[1,2,3].includes(row.stateId)" @click="doDelete(row.id)" size="mini" type="danger">删除</el-button>
</template>
</el-table-column>
</el-table>
@@ -181,16 +187,6 @@ layout("/layouts/platform.html"){
<template #edit>
<el-form :model="formData" :rules="rules" label-width="160px" ref="form">
<el-row :gutter="20" class="">
<el-col :md="24" :sm="24" :xs="24">
<el-form-item label="">
<span class="text-primary">
<i class="el-icon-warning"></i>
温馨提醒:校工会可以为基层工会或个人创建线路,基层工会或个人自行选择并设置活动相关时间。
</span>
</el-form-item>
</el-col>
</el-row>
<el-row :gutter="20">
<el-col :md="12" :sm="24" :xs="24">
@@ -258,45 +254,11 @@ layout("/layouts/platform.html"){
readonly></el-input>
</el-form-item>
</el-col>
<el-col :md="12" :sm="24" :xs="24">
<el-form-item label="成团类型" prop="groupType">
<el-select v-model="formData.groupType" style="width: 100%" @change="groupTypeChange" placeholder="请选择成团类型">
<el-option v-if="${@shiro.hasRole('sysadmin')||@shiro.hasRole('A06')}" label="常规团" :value="1"></el-option>
<el-option label="精品团" :value="2"></el-option>
</el-select>
</el-form-item>
</el-col>
</el-row>
<el-row :gutter="20">
<el-col :md="12" :sm="24" :xs="24">
<el-row :gutter="20">
<el-col :span="12">
<el-form-item label="线路类型" prop="regionalNature">
<el-radio-group class="mr0-radio" size="small" v-model="formData.regionalNature">
<el-radio :label="item.value"
border v-for="item in regionalNatureList">
{{item.label}}
</el-radio>
</el-radio-group>
</el-form-item>
</el-col>
<el-col span="12" v-if="${@shiro.hasRole('sysadmin')||@shiro.hasRole('SchoolUnionAdmin')}">
<el-form-item label="开放选择" prop="openChoose">
<el-radio-group class="mr0-radio" size="small" v-model="formData.openChoose">
<el-radio :label="true" border></el-radio>
<el-radio :label="false" border></el-radio>
</el-radio-group>
</el-form-item>
</el-col>
</el-row>
</el-col>
<el-col :md="12" :sm="24" :xs="24">
<el-form-item label="组织形式" prop="signUpMode">
<el-radio-group class="mr0-radio" size="small" v-model="formData.signUpMode">
<el-radio :label="item.value" v-if="isShow(item.roles)"
size="small"
border v-for="item in signUpModeList">
<el-col :span="12">
<el-form-item label="线路类型" prop="regionalNature">
<el-radio-group class="mr0-radio" size="small" v-model="formData.regionalNature">
<el-radio :label="item.value"
border v-for="item in regionalNatureList">
{{item.label}}
</el-radio>
</el-radio-group>
@@ -304,14 +266,46 @@ layout("/layouts/platform.html"){
</el-col>
</el-row>
<el-row :gutter="20">
<el-col :md="12" :sm="24" :xs="24">
<el-form-item label="成团类型" prop="groupType">
<el-select v-model="formData.groupType" style="width: 100%" @change="groupTypeChange" placeholder="请选择成团类型">
<el-option v-if="${@shiro.hasRole('sysadmin')||@shiro.hasRole('A06')}" label="常规团" :value="1"></el-option>
<el-option label="精品团" :value="2"></el-option>
</el-select>
</el-form-item>
</el-col>
<!--<el-col span="12" v-if="${@shiro.hasRole('sysadmin')||@shiro.hasRole('SchoolUnionAdmin')}">
<el-form-item label="开放选择" prop="openChoose">
<el-radio-group class="mr0-radio" size="small" v-model="formData.openChoose">
<el-radio :label="true" border></el-radio>
<el-radio :label="false" border></el-radio>
</el-radio-group>
</el-form-item>
</el-col>-->
<el-col :span="12">
<el-form-item label="最少成团人数" prop="minimumGroupSize">
<el-input v-model="formData.minimumGroupSize" placeholder="请选择成团类型" disabled></el-input>
</el-form-item>
</el-col>
<!--<el-col :md="12" :sm="24" :xs="24">
<el-form-item label="组织形式" prop="signUpMode">
<el-radio-group class="mr0-radio" size="small" v-model="formData.signUpMode">
<el-radio :label="item.value" v-if="isShow(item.roles)"
size="small"
border v-for="item in signUpModeList">
{{item.label}}
</el-radio>
</el-radio-group>
</el-form-item>
</el-col>-->
</el-row>
<el-row :gutter="20">
<el-col :md="12" :sm="24" :xs="24">
<el-row :gutter="20">
<el-col :span="24">
<el-form-item label="最少成团人数" prop="minimumGroupSize">
<el-input v-model="formData.minimumGroupSize" placeholder="请选择成团类型" disabled></el-input>
</el-form-item>
</el-col>
<!--<el-col :span="12">
<el-form-item label="成团人数包括家属" prop="estimatedFamilyNumbers">
<el-input-number :max="1000"
@@ -327,6 +321,7 @@ layout("/layouts/platform.html"){
<el-form-item label="时间标段" prop="lotId">
<el-select clearable filterable style="width: 100%"
placeholder="请选择时间标段"
@change="lotChange"
v-model="formData.lotId">
<el-option :key="item.id"
:label="item.lotName"
@@ -336,16 +331,25 @@ layout("/layouts/platform.html"){
</el-select>
</el-form-item>
</el-col>
</el-row>
<el-row :gutter="20">
<el-col :md="12" :sm="24" :xs="24">
<el-form-item label="预计费用(元/人次)" prop="estimatedCost">
<el-input clearable maxlength="50" v-model="formData.estimatedCost"
disabled
placeholder="请输入预计费用"></el-input>
</el-form-item>
</el-col>
<el-col :md="12" :sm="24" :xs="24">
</el-row>
<el-row :gutter="20">
<el-col :md="12" :sm="24" :xs="24" v-if="${@shiro.hasRole('sysadmin')||@shiro.hasRole('SchoolUnionAdmin')}">
<el-form-item label="工勤特定线路" prop="specialLine">
<el-radio-group class="mr0-radio" size="small" v-model="formData.specialLine">
<el-radio :label="true" border></el-radio>
<el-radio :label="false" border></el-radio>
</el-radio-group>
</el-form-item>
</el-col>
<!--<el-col :md="12" :sm="24" :xs="24">
<el-row :gutter="20">
<el-col :span="12">
<el-form-item label="联系人" prop="lineContact">
@@ -363,7 +367,7 @@ layout("/layouts/platform.html"){
</el-form-item>
</el-col>
</el-row>
</el-col>
</el-col>-->
</el-row>
<el-row :gutter="20">
@@ -547,7 +551,8 @@ layout("/layouts/platform.html"){
// {label: '创建模式', prop: 'createMode', sortable: true},
{label: '创建人', prop: 'createUserName', sortable: true},
//{label: '创建工会', prop: 'createUnionName', sortable: true},
{label: '是否启用', prop: 'isDisabled', sortable: true}
{label: '是否启用', prop: 'isDisabled', sortable: true},
{label: '审核状态', prop: 'stateId', sortable: true},
],
editDialogVisible: false,
rules: {
@@ -608,6 +613,7 @@ layout("/layouts/platform.html"){
lineContactPhone: null,
openChoose: false,
groupType: null,
specialLine: false,
},
pageForm: {
keywords: null,
@@ -632,6 +638,22 @@ layout("/layouts/platform.html"){
}
},
methods: {
validLineTime() {
//如果是校工会直接过
if ("${@shiro.hasRole('sysadmin')||@shiro.hasRole('A06')||@shiro.hasRole('SchoolUnionMemberAdmin')}" === 'true') {
return true
}
const {createLineStartTime, createLineEndTime} = this.modifyConfig
if(moment().unix() >= moment(createLineStartTime).unix() && moment().unix() <= moment(createLineEndTime).unix()) {
return true
}else {
return false
}
},
lotChange(val) {
const lot = this.lotList.find(o => o.id === val)
this.formData.estimatedCost = lot.activityCost
},
groupTypeChange(val) {
if (this.config) {
this.formData.minimumGroupSize = val === 1 ? this.config.conventionalCount : this.config.boutiqueCount
@@ -654,6 +676,13 @@ layout("/layouts/platform.html"){
}
},
async openAdd() {
if(!this.validLineTime()) {
this.$alert('抱歉,当前时间不能操作线路', '温馨提示', {
confirmButtonText: '确定',
type: 'warning'
})
return
}
this.$refs.guava.edit()
this.$nextTick(() => {
if (this.$refs['form']) {
@@ -669,6 +698,13 @@ layout("/layouts/platform.html"){
await this.getNumber()
},
async openEdit(id) {
if(!this.validLineTime()) {
this.$alert('抱歉,当前时间不能操作线路', '温馨提示', {
confirmButtonText: '确定',
type: 'warning'
})
return
}
const resp = await $.post(loc() + '/selectLineInfoById/' + id)
if (resp.code === 0) {
this.$refs.guava.edit()
@@ -0,0 +1,269 @@
<!--#
layout("/layouts/platform.html"){
#-->
<style>
</style>
<div id="app" v-cloak>
<guava ref="guava">
<template>
<el-card shadow="never">
<div class="search">
<div class="search-item">
<div class="search-item-label">年度范围:</div>
<div class="search-item-option">
<el-date-picker
v-model="pageForm.startYear"
type="year"
class="picker-year"
format="yyyy"
style="width: 46%"
value-format="yyyy"
@change="handleChangeYear"
>
</el-date-picker>
<span></span>
<el-date-picker
v-model="pageForm.endYear"
type="year"
class="picker-year"
format="yyyy"
style="width: 46%"
value-format="yyyy"
@change="handleChangeYear"
>
</el-date-picker>
</div>
</div>
<div class="search-item">
<div class="search-item-label">旅行社:</div>
<div class="search-item-option">
<el-select @change="doSearch"
clearable
filterable
style="width: 100%"
v-model="pageForm.travelAgencyId">
<el-option :key="item.id"
:label="item.travelAgencyName"
:value="item.id"
v-for="item in travelAgencyOptions"></el-option>
</el-select>
</div>
</div>
<div class="search-item">
<div class="search-item-label">线路名称:</div>
<div class="search-item-option">
<el-input @keyup.enter.native="doSearch" clearable clearable
placeholder="请输入内容"
style="width: 100%"
v-model="pageForm.lineName">
</el-input>
</div>
</div>
<div class="search-item">
<div class="search-item-label">时间标段:</div>
<div class="search-item-option">
<el-select @change="doSearch" clearable filterable
style="width: 100%"
v-model="pageForm.lotId">
<el-option :key="item.id"
:label="item.lotName"
:value="item.id"
v-for="item in lotList"
></el-option>
</el-select>
</div>
</div>
<div class="search-query">
<el-button @click="doSearch" icon="el-icon-search" type="primary">搜索</el-button>
</div>
</div>
</el-card>
<el-card class="mt10" shadow="never">
<table-tool :app="this" label="精品团列表">
<template #func>
<el-radio-group v-model="pageForm.isAudit" @change="doSearch" size="small">
<el-radio-button :label="0">全部</el-radio-button>
<el-radio-button :label="1">已审核</el-radio-button>
<el-radio-button :label="2">未审核</el-radio-button>
</el-radio-group>
</template>
</table-tool>
<el-table :data="tableData" :size="tableSize">
<el-table-column :index="indexMethod" align="center" header-align="center" label="序号" type="index"
width="80px"></el-table-column>
<el-table-column
:label="column.label"
:prop="column.prop"
:width="column.width"
:sortable="column.sortable"
align="center"
header-align="center"
show-overflow-tooltip
v-for="column in tableColumns"
>
<template scope="{row:{stateId}}" v-if="column.prop==='stateId'">
<span v-if="stateId === 1">待校工会审核</span>
<span v-if="stateId === 2">校工会退回修改</span>
<span v-if="stateId === 3">校工会拒绝</span>
<span v-if="stateId === 4">审核通过</span>
</template>
</el-table-column>
<el-table-column label="操作" width="250px">
<template scope="{row}">
<el-button @click="openView(row)" size="mini" type="primary">查看</el-button>
<el-button v-if="row.stateId == 1" @click="openAudit(row)" size="mini" type="primary">审核</el-button>
</template>
</el-table-column>
</el-table>
<!--#include("/layouts/pagination.html"){}#-->
</el-card>
</template>
<template #view>
<line-info ref="viewLineInfo"></line-info>
</template>
<template #edit>
<line-info ref="lineAuditInfo" label="校工会审核" handle>
<template #handle>
<el-form :model="formData" ref="form" label-width="120px">
<el-descriptions border class="descriptions-form" :column="2">
<el-descriptions-item label="审核人">
<el-form-item label-width="0">
<el-input value="${@shiro.getPrincipalProperty('username')}" readonly></el-input>
</el-form-item>
</el-descriptions-item>
<el-descriptions-item label="审核时间">
<el-form-item label-width="0">
<el-input :value="moment().format('YYYY-MM-DD')" readonly></el-input>
</el-form-item>
</el-descriptions-item>
<el-descriptions-item label="审核意见" :span="2">
<el-form-item label-width="0" prop="auditOpinion"
:rules="[{required:true,message:'必填',trigger:['change','blur']}]">
<el-input v-model="formData.auditOpinion" maxlength="500"
type="textarea"></el-input>
</el-form-item>
</el-descriptions-item>
</el-descriptions>
<el-row type="flex" justify="end" align="center" style="padding: 20px">
<el-button @click="$refs.guava.index()">取消</el-button>
<el-button @click="onAudit(2)" type="info">退回修改</el-button>
<el-button @click="onAudit(3)" type="info">拒绝</el-button>
<el-button @click="onAudit(4)" type="primary">通过</el-button>
</el-row>
</el-form>
</template>
</line-info>
</template>
</guava>
</div>
<script>
const vue = new Vue({
el: '#app',
mixins: [initTableMixins],
data() {
return {
lotList: [],
travelAgencyOptions: [],
tableColumns: [
{label: '年度', prop: 'year', sortable: true},
{label: '线路名称', prop: 'lineName', sortable: true, width: '200'},
{label: '时间标段', prop: 'lotName', sortable: true, sortProp: 'lotValue'},
{label: '承担旅行社', prop: 'travelAgencyName', sortable: true},
{label: '地点', prop: 'travelAgencyPlace', sortable: true},
{label: '线路类型', prop: 'regionalNature', sortable: true},
{label: '创建人', prop: 'createUserName', sortable: true},
{label: '审核状态', prop: 'stateId', sortable: true},
],
pageForm: {
endYear: moment().format('YYYY'),
lineName: null,
travelAgencyId: null,
startYear: null,
isAudit: 2
},
modifyConfig: {},
}
},
components: {
'line-info': httpVueLoader('/components/theRapyRecuperation/LineInfo.vue?v=' + new Date().getTime()),
},
methods: {
onAudit(auditType) {
this.$confirm('您确定要审核吗?', '提示', {
confirmButtonText: '确定',
cancelButtonText: '取消',
type: 'warning'
}).then(async () => {
this.formData.auditType = auditType
const resp = await $.post('/platform/theRapyRecuperation/line/schoolAudit/onAudit', this.formData)
if (resp.code === 0) {
this.$message.success(resp.msg)
this.pageData()
this.$refs.guava.index()
} else {
this.$message.warning(resp.msg)
}
})
},
openView(row) {
this.$refs.guava.view()
this.$refs.viewLineInfo.openView(row.id)
},
openAudit(row) {
this.$set(this.formData, 'id', row.id)
this.$set(this.formData, 'auditOpinion', null)
this.$refs.guava.edit()
this.$refs.lineAuditInfo.openView(row.id)
},
handleChangeYear() {
if (this.pageForm.startYear && this.pageForm.endYear) {
if (this.pageForm.startYear > this.pageForm.endYear) {
this.pageForm.endYear = '';
this.$message.error('起始年份需小于结束年份!');
}
}
},
async getLotList() {
const {data} = await $.post('/platform/theRapyRecuperation/TheRapyConfig/findOne')
this.lotList = data.lots
},
async getTravelAgencyOptions() {
const {data} = await $.get('/platform/theRapyRecuperation/line/getTravelAgencyOptions')
this.travelAgencyOptions = data
},
async getModifyConfig() {
const res = await $.post('/platform/theRapyRecuperation/TheRapyConfig/findOne')
if (res.code === 0) {
this.modifyConfig = res.data
}
},
async initPageData() {
await this.getLotList()
await this.getTravelAgencyOptions()
await this.getModifyConfig()
},
},
async created() {
await this.initPageData()
this.pageForm.startYear = this.modifyConfig.provinceStartYear + ''
this.pageData()
}
})
</script>
<!--#
}
#-->
@@ -263,7 +263,7 @@ layout("/layouts/platform.html"){
{prop: 'regionalNature', label: '线路类型', sortable: true},
{prop: 'username', label: '发起人', sortable: true},
{prop: 'unionname', label: '所属工会', sortable: true},
{prop: 'estimatedFamilyNumbers', label: '最少成团人数', width: 80},
{prop: 'minimumGroupSize', label: '最少成团人数', width: 80},
{prop: 'lineNum', label: '报名人数(家属)'},
{prop: 'stateName', label: '审核状态'},
],
@@ -327,8 +327,10 @@ layout("/layouts/platform.html"){
:rules="{required:true,message:'出行开始时间',trigger:['change','blur']}"
label-width="0">
<el-date-picker style="width: 100%"
@change="(val) => {platStartChange(val, row)}"
placeholder="请选择出行开始时间"
type="datetime"
:picker-options="pickerOptions"
type="date"
v-model="row.playStartTime"
value-format="yyyy-MM-dd HH:mm:ss">
</el-date-picker>
@@ -344,8 +346,9 @@ layout("/layouts/platform.html"){
:rules="{required:true,message:'出行结束时间',trigger:['change','blur']}"
label-width="0">
<el-date-picker style="width: 100%"
disabled=""
placeholder="请选择出行结束时间"
type="datetime"
type="date"
v-model="row.playEndTime"
value-format="yyyy-MM-dd HH:mm:ss">
</el-date-picker>
@@ -393,19 +396,19 @@ layout("/layouts/platform.html"){
</el-form-item>
</el-descriptions-item>
<el-descriptions-item label="交通工具">
<!--<el-descriptions-item label="交通工具">
<el-form-item :prop="'times.' + $index + '.trafficTools'"
:rules="{required:false,message:'交通工具',trigger:['change','blur']}"
label-width="0">
<el-input clearable v-model="row.trafficTools" placeholder="请输入交通工具"></el-input>
</el-form-item>
</el-descriptions-item>
</el-descriptions-item>-->
<el-descriptions-item label="预计费用(元/人次)">
<el-form-item :prop="'times.' + $index + '.estimatedCost'"
:rules="{required:true,message:'预计费用',trigger:['change','blur']}"
label-width="0">
<el-input placeholder="请输入预计费用" clearable v-model="row.estimatedCost"></el-input>
<el-input disabled placeholder="请输入预计费用" clearable v-model="row.estimatedCost"></el-input>
</el-form-item>
</el-descriptions-item>
@@ -451,7 +454,7 @@ layout("/layouts/platform.html"){
]">
<el-checkbox-group size="mini" v-model="row.signScope">
<el-checkbox :label="1" border>自己选择</el-checkbox>
<el-checkbox :label="2" border>本分工会</el-checkbox>
<!--<el-checkbox :label="2" border>本分工会</el-checkbox>-->
<el-checkbox :label="3" border>全校</el-checkbox>
</el-checkbox-group>
</el-form-item>
@@ -486,7 +489,7 @@ layout("/layouts/platform.html"){
</el-dialog>
<el-dialog :close-on-click-modal="false" :visible.sync="timeLotsDialogVisible" title="查看出行时间段信息"
width="80%">
width="80%" top="2%">
<div v-for="(row,$index) in timeLots" :key="row.id" class="panel panel-default mt20" style="border: none">
<div class="panel-heading"
style="background: #fafafa;border:1px solid #ebeef5;border-bottom: none;display: flex;align-items: center;justify-content: space-between">
@@ -495,50 +498,28 @@ layout("/layouts/platform.html"){
</h3>
</div>
<el-row class="playPeriod">
<el-descriptions border :column="3" class="playPeriodTable">
<el-descriptions-item label="报名开始时间">
{{row.signUpStartTime}}
</el-descriptions-item>
<el-descriptions-item label="报名结束时间">
{{row.signUpEndTime}}
</el-descriptions-item>
<el-descriptions-item label="变更截至时间">
{{row.changeEndTime}}
</el-descriptions-item>
<el-descriptions-item label="出行开始时间">
{{row.playStartTime}}
</el-descriptions-item>
<el-descriptions-item label="出行结束时间">
{{row.playEndTime}}
</el-descriptions-item>
<el-descriptions-item label="联系人">
{{row.contact}}
</el-descriptions-item>
<el-descriptions-item label="联系方式">
{{row.contactPhone}}
</el-descriptions-item>
<el-descriptions-item label="最少参与教工">
<el-descriptions-item label="最少成团人数">
{{row.minimumGroupSize}}
</el-descriptions-item>
<el-descriptions-item label="交通工具">
{{row.trafficTools}}
</el-descriptions-item>
<el-descriptions-item label="预计费用(元/人次)">
{{row.estimatedCost}}
</el-descriptions-item>
<el-descriptions-item label="成团人数包括家属">
{{row.estimatedFamilyNumbers}}
</el-descriptions-item>
<el-descriptions-item label="是否开启">
<el-switch
disabled
@@ -549,11 +530,6 @@ layout("/layouts/platform.html"){
inactive-color="#ff4949">
</el-switch>
</el-descriptions-item>
<el-descriptions-item label="组织形式">
{{signUpModeName(row.signUpMode)}}
</el-descriptions-item>
</el-descriptions>
</el-row>
@@ -787,7 +763,13 @@ layout("/layouts/platform.html"){
}
callback()
}
const that = this
return {
pickerOptions: {
disabledDate(time) {
return that.calPlayTime(time)
}
},
canChooseUserList: [],
chooseUserMultiple: [],
userDialogVisible: false,
@@ -872,6 +854,18 @@ layout("/layouts/platform.html"){
},
},
methods: {
calPlayTime(time) {
const year = new Date().getFullYear()
const lot = this.lotList.find(o => o.id === this.lineData.lotId)
const beforeTime = moment(year + '-10-01').add(-(Number(lot.lotValue)), 'days')
return !(time > new Date(year + '-06-30') && time < beforeTime)
},
platStartChange(time, row) {
const lot = this.lotList.find(o => o.id === this.lineData.lotId)
const afterTime = moment(time).add(Number(lot.lotValue), 'days')
row.playEndTime = afterTime.format('YYYY-MM-DD HH:mm:ss')
this.$forceUpdate()
},
addRow() {
this.formData.times.push({
enable:true,
@@ -1120,7 +1114,6 @@ layout("/layouts/platform.html"){
}
},
async doEditOpen(row){
console.log(row)
const resp = await $.get(loc() + '/doEditOpen',{id:row.usId})
if (resp.code === 0){
this.$message.success(resp.msg)
@@ -52,10 +52,37 @@ layout("/layouts/platform.html"){
v-model="pageForm.endYear"
type="year"
value-format="yyyy"
placeholder="选择年"
placeholder="选择年"
style="width: 38%" @change="doSearch">
</el-date-picker>
</el-col>
<el-col :span="12">
<span>出行时间:</span>
<el-date-picker
:clearable="true"
v-model="pageForm.playStart"
type="date"
value-format="MM-dd"
placeholder="请选择出行开始时间"
style="width: 38%" @change="doSearch()">
</el-date-picker>
<span></span>
<el-date-picker
:clearable="true"
v-model="pageForm.playEnd"
type="date"
value-format="MM-dd"
placeholder="请选择出行结束时间"
style="width: 38%" @change="doSearch">
</el-date-picker>
</el-col>
</el-row>
</el-col>
</el-row>
<el-row align="middle" class="query-row" type="flex">
<el-col class="query-row-title"></el-col>
<el-col class="query-row-content">
<el-row>
<el-col :span="12">
<span>酒店名称:</span>
<el-select v-model="pageForm.baseManagementId" placeholder="请选择酒店名称"
@@ -69,13 +96,6 @@ layout("/layouts/platform.html"){
</el-option>
</el-select>
</el-col>
</el-row>
</el-col>
</el-row>
<el-row align="middle" class="query-row" type="flex">
<el-col class="query-row-title"></el-col>
<el-col class="query-row-content">
<el-row>
<el-col :span="12">
<span>&ensp;&ensp;社:</span>
<el-select v-model="pageForm.travelAgencyId" placeholder="请选择旅行社"
@@ -89,16 +109,6 @@ layout("/layouts/platform.html"){
</el-option>
</el-select>
</el-col>
<el-col :span="12">
<span>路线类型:</span>
<el-select v-model="pageForm.regionalNature" filterable
placeholder="请选择线路"
style="width: 80%">
<el-option label="全部" value=""></el-option>
<el-option label="省内" value="省内"></el-option>
<el-option label="省外" value="省外"></el-option>
</el-select>
</el-col>
</el-row>
</el-col>
</el-row>
@@ -110,9 +120,24 @@ layout("/layouts/platform.html"){
ref="table_tool">
<template #func>
<el-button icon="el-icon-s-promotion" size="small" type="primary"
@click="doExport"
class="mr10">导出人员
@click="doExport">导出报名表
</el-button>
<el-button icon="el-icon-s-promotion" size="small" type="primary"
@click="exportGroup">导出成团表
</el-button>
<el-dropdown class="ml10 mr10" trigger="click">
<el-button size="small" type="primary">
一键成团<i class="el-icon-arrow-down el-icon--right"></i>
</el-button>
<el-dropdown-menu slot="dropdown">
<el-dropdown-item @click.native="oneKeyGroupSuccess(true)">
发送通知
</el-dropdown-item>
<el-dropdown-item @click.native="oneKeyGroupSuccess(false)">
不发送通知
</el-dropdown-item>
</el-dropdown-menu>
</el-dropdown>
</template>
</table-tool>
<el-table :data="tableData" style="width: 100%"
@@ -143,35 +168,15 @@ layout("/layouts/platform.html"){
{{row.stateName?row.stateName:'待成团'}}
</template>
</el-table-column>
<el-table-column label="操作" width="180px">
<el-table-column label="操作" width="200px">
<template scope="{row}">
<template>
<el-button @click="openView(row)" size="mini" type="primary">
查看
查看
</el-button>
<el-button @click="openViewUser(row)" size="mini" type="primary">
<el-button @click="openViewUser(row, pageForm.playStart, pageForm.playEnd)" size="mini" type="primary">
查看人员
</el-button>
<!--<el-dropdown class="ml10 mr10" trigger="click">
<el-button size="mini" type="primary">
成团确认<i class="el-icon-arrow-down el-icon&#45;&#45;right"></i>
</el-button>
<el-dropdown-menu slot="dropdown">
<el-dropdown-item @click.native="sendSuccess(row, true)"
:disabled="![null,7703,7710,7715].includes(row.auditState)">
发送通知
</el-dropdown-item>
<el-dropdown-item @click.native="sendSuccess(row, false)"
:disabled="![null,7703,7710,7715].includes(row.auditState)">
不发送通知
</el-dropdown-item>
</el-dropdown-menu>
</el-dropdown>
<el-button @click="sendFail(row, false)" size="mini" type="primary">
未成团确认
</el-button>-->
</template>
</template>
</el-table-column>
@@ -180,13 +185,10 @@ layout("/layouts/platform.html"){
</el-card>
</template>
<template #edit>
<sign-user></sign-user>
</template>
</guava>
<el-dialog :visible.sync="userVisible" top="2%" :close-on-click-modal="false" title="报名人员">
<sign-user ref="signUser"></sign-user>
<sign-user ref="signUser" @refresh="refreshChild"></sign-user>
<span slot="footer" class="dialog-footer">
<el-button @click="userVisible = false" type="primary">取 消</el-button>
</span>
@@ -195,6 +197,7 @@ layout("/layouts/platform.html"){
<el-dialog :visible.sync="groupVisible" top="2%" :close-on-click-modal="false" title="团信息">
<el-table :data="groupTableData" max-height="800">
<el-table-column label="序号" type="index" header-align="center" align="center" width="50"></el-table-column>
<el-table-column prop="playDay" label="出行天数" header-align="center" align="center" sortable></el-table-column>
<el-table-column prop="specificTime" label="出行时间" header-align="center" align="center" sortable></el-table-column>
<el-table-column prop="userCount" label="报名人数" header-align="center" align="center" sortable></el-table-column>
<el-table-column prop="hasLocked" label="状态" header-align="center" align="center" sortable>
@@ -205,7 +208,7 @@ layout("/layouts/platform.html"){
</el-table-column>
<el-table-column label="操作" width="380px">
<template scope="{row}">
<el-button @click="openViewUser(row)" size="mini" type="primary">查看人员</el-button>
<el-button @click="openViewUser2(row)" size="mini" type="primary">查看人员</el-button>
<el-dropdown class="ml10 mr10" trigger="click">
<el-button size="mini" type="primary">
成团确认<i class="el-icon-arrow-down el-icon--right"></i>
@@ -249,13 +252,13 @@ layout("/layouts/platform.html"){
},
tableColumns: [
{prop: 'year', label: '年度', width: 60},
{prop: 'baseName', label: '酒店名称', sortable: true, width: 200},
{prop: 'travelAgencyName', label: '承担旅行社', sortable: true, width: 180},
{prop: 'regionalNature', label: '出行类型', sortable: true},
{prop: 'username', label: '发起人', sortable: true},
{prop: 'baseContactPerson', label: '联系人', sortable: true},
{prop: 'baseContactNumber', label: '联系电话', sortable: true},
{prop: 'groupCount', label: '团数量', width: 80},
{prop: 'baseName', label: '酒店名称', sortable: true},
{prop: 'travelAgencyName', label: '承担旅行社', sortable: true},
{prop: 'regionalNature', label: '出行类型', sortable: true, checked: 0},
{prop: 'username', label: '发起人', sortable: true, checked: 0},
{prop: 'baseContactPerson', label: '联系人', sortable: true, checked: 0},
{prop: 'baseContactNumber', label: '联系电话', sortable: true, checked: 0},
{prop: 'groupCount', label: '团数量'},
{prop: 'signCount', label: '报名人数'},
],
modifyConfig: {},
@@ -271,6 +274,32 @@ layout("/layouts/platform.html"){
'sign-user': signUser
},
methods: {
oneKeyGroupSuccess(type) {
this.$confirm("您确定要一键成团吗?", "提示", {
confirmButtonText: "确定",
cancelButtonText: "取消",
type: "warning"
}).then(() => {
$.post("/platform/theRapyRecuperation/fragment/oneKeyGroupSuccess", {
travelAgencyId: this.pageForm.travelAgencyId,
baseId: this.pageForm.baseManagementId,
playStart: this.pageForm.playStart,
playEnd: this.pageForm.playEnd,
type: type,
}).then((res) => {
if (res.code === 0) {
this.$message.success(res.msg)
this.doSearch()
}else {
this.$message.warning(res.msg)
}
})
})
},
refreshChild() {
this.doSearch()
this.openView(this.baseRow)
},
async sendSuccess(row, type) {
let message = '确定要成团吗?'
if (type) {
@@ -284,7 +313,9 @@ layout("/layouts/platform.html"){
}).then(async () => {
const resp = await $.post('/platform/theRapyRecuperation/fragment/sendSuccess', {
baseId: row.id,
type: type
type: type,
specificTime: row.specificTime,
playDay: row.playDay,
})
if (resp.code === 0) {
await this.openView(this.baseRow)
@@ -303,9 +334,12 @@ layout("/layouts/platform.html"){
}).then(async () => {
const resp = await $.post('/platform/theRapyRecuperation/fragment/sendFail', {
baseId: row.id,
type: type
type: type,
specificTime: row.specificTime,
playDay: row.playDay,
})
if (resp.code === 0) {
this.doSearch()
await this.openView(this.baseRow)
this.$message.success(resp.msg)
} else {
@@ -316,15 +350,23 @@ layout("/layouts/platform.html"){
async openView(row) {
this.baseRow = row
const res = await $.post('/platform/theRapyRecuperation/fragment/getGroupInfo', {
baseId: row.id
baseId: row.id,
playStart: this.pageForm.playStart,
playEnd: this.pageForm.playEnd,
})
this.groupTableData = res.data
this.groupVisible = true
},
openViewUser(row) {
openViewUser(row, playStart, playEnd) {
this.userVisible = true
this.$nextTick(() => {
this.$refs.signUser.initData(row.id)
this.$refs.signUser.initData(row.id, null, playStart, playEnd, null)
})
},
openViewUser2(row) {
this.userVisible = true
this.$nextTick(() => {
this.$refs.signUser.initData(row.id, row.specificTime, this.pageForm.playStart, this.pageForm.playEnd, row.playCount)
})
},
async getTravelAgency() {
@@ -360,6 +402,15 @@ layout("/layouts/platform.html"){
"&regionalNature=" + this.pageForm.regionalNature
)
},
exportGroup() {
window.open("/platform/theRapyRecuperation/fragment/exportGroup?" +
"startYear=" + this.pageForm.startYear +
"&endYear=" + this.pageForm.endYear +
"&baseManagementId=" + this.pageForm.baseManagementId +
"&travelAgencyId=" + this.pageForm.travelAgencyId +
"&regionalNature=" + this.pageForm.regionalNature
)
},
},
async created() {
await this.getModifyConfig();
@@ -146,8 +146,10 @@ layout("/layouts/platform.html"){
ref="table_tool">
<template #func>
<el-button icon="el-icon-s-promotion" size="small" type="primary"
@click="doExport"
class="mr10">导出成团线路人员
@click="doExport">导出报名表
</el-button>
<el-button icon="el-icon-s-promotion" size="small" type="primary"
@click="exportGroup">导出成团表
</el-button>
</template>
</table-tool>
@@ -205,11 +207,11 @@ layout("/layouts/platform.html"){
</el-button>
<el-dropdown-menu slot="dropdown">
<el-dropdown-item @click.native="sendSuccess(row, true)"
:disabled="![null,7703,7710,7715].includes(row.auditState)">
>
发送通知
</el-dropdown-item>
<el-dropdown-item @click.native="sendSuccess(row, false)"
:disabled="![null,7703,7710,7715].includes(row.auditState)">
>
不发送通知
</el-dropdown-item>
</el-dropdown-menu>
@@ -355,13 +357,13 @@ layout("/layouts/platform.html"){
{prop: 'lineName', label: '线路名称', sortable: true, width: 200},
{prop: 'linePlayTime', label: '出行时间', width: 180},
{prop: 'travelAgencyName', label: '承担旅行社', sortable: true, width: 180},
{prop: 'signUpMode', label: '组织形式', sortable: true},
{prop: 'signUpMode', label: '组织形式', sortable: true, checked: 0},
{prop: 'regionalNature', label: '线路类型', sortable: true},
{prop: 'username', label: '发起人', sortable: true},
{prop: 'unionname', label: '所属工会', sortable: true},
{prop: 'unionname', label: '所属工会', sortable: true, checked: 0},
{prop: 'minimumGroupSize', label: '最少成团人数', width: 80},
{prop: 'lineNum', label: '报名人数(家属)'},
{prop: 'stateName', label: '审核状态'},
{prop: 'stateName', label: '状态'},
],
modifyConfig: {},
@@ -426,16 +428,32 @@ layout("/layouts/platform.html"){
linePlayTime,
regionalNature,
} = this.pageForm
window.open("/platform/theRapyRecuperation/user/query/doExport?" +
window.open("/platform/theRapyRecuperation/statistics/doExport?" +
"startYear=" + startYear +
"&endYear=" + endYear +
"&unionId=" + unionId +
"&takePartInLineId=" + takePartInLineId +
"&lotId=" + lotId +
"&regionalNature=" + regionalNature +
"&linePlayTime=" + linePlayTime)
},
exportGroup() {
const {
startYear,
endYear,
unionId,
takePartInLineId,
lotId,
linePlayTime,
regionalNature,
} = this.pageForm
window.open("/platform/theRapyRecuperation/statistics/exportGroup?" +
"startYear=" + startYear +
"&endYear=" + endYear +
"&unionId=" + unionId +
"&takePartInLineId=" + takePartInLineId +
"&lotId=" + lotId +
"&state=" + 1 +
"&regionalNature=" + regionalNature +
"&satisfyPeople=true" +
"&types=" + JSON.stringify(['line']) +
"&linePlayTime=" + linePlayTime)
},
async getLinePlayTimeByLineId(id) {
@@ -40,6 +40,8 @@ const signUser = {
{prop: 'mobile', label: '联系方式'},
{prop: 'unionname', label: '所属工会'},
{prop: 'unitname', label: '所属单位', sortable: true},
{prop: 'playDay', label: '出行天数', sortable: true},
{prop: 'money', label: '预计费用', sortable: true},
{prop: 'specificTime', label: '出行时间', sortable: true},
],
}
@@ -55,14 +57,19 @@ const signUser = {
const resp = await $.post('/platform/theRapyRecuperation/statistics/deleteJoinUser', {id: row.id})
if (resp.code === 0) {
this.$message.success(resp.msg)
this.doSearch()
await this.initData(this.pageForm.takePartInBaseManagementId)
this.$emit("refresh", null)
} else {
this.$message.warning(resp.msg)
}
})
},
async initData(baseId) {
this.pageForm.takePartInBaseManagementId = baseId
async initData(baseId, specificTime = null, playStart = null, playEnd = null, playCount = null) {
this.$set(this.pageForm, 'takePartInBaseManagementId', baseId)
this.$set(this.pageForm, 'specificTime', specificTime)
this.$set(this.pageForm, 'playStart', playStart)
this.$set(this.pageForm, 'playEnd', playEnd)
this.$set(this.pageForm, 'playCount', playCount)
const res = await $.post('/platform/theRapyRecuperation/fragment/getSignUser', this.pageForm)
if (res.code === 0) {
this.tableData = res.data.list
@@ -89,6 +89,18 @@ layout("/layouts/platform.html"){
v-model.number="formData.fragmentCount"></el-input>
</el-form-item>
<el-form-item label="精品团创建线路时间" prop="createLineTimes">
<el-date-picker
style="width: 100%"
v-model="formData.createLineTimes"
type="datetimerange"
range-separator="至"
value-format="yyyy-MM-dd HH:mm:ss"
start-placeholder="精品团创建线路开始日期"
end-placeholder="精品团创建线路结束日期">
</el-date-picker>
</el-form-item>
<el-form-item label="集中疗休养报名时间" prop="implodeTimes">
<el-date-picker
style="width: 100%"
@@ -354,6 +366,7 @@ layout("/layouts/platform.html"){
conventionalCount: [{required: true, message: '请输入常规团最少成团人数', trigger: ['change', 'blur']}],
boutiqueCount: [{required: true, message: '请输入精品团最少成团人数', trigger: ['change', 'blur']}],
fragmentCount: [{required: true, message: '请输入分段式最少成团人数', trigger: ['change', 'blur']}],
createLineTimes: [{required: true, message: '请选择精品团创建线路时间', trigger: ['change', 'blur']}],
implodeTimes: [{required: true, message: '请选择集中疗休养报名时间', trigger: ['change', 'blur']}],
fragmentTimes: [{required: true, message: '请选择分段疗休养报名时间', trigger: ['change', 'blur']}],
fragmentPlayTimes: [{required: true, message: '请选择分段疗休养活动时间', trigger: ['change', 'blur']}],
@@ -413,6 +426,11 @@ layout("/layouts/platform.html"){
})
const cloneData = clone(this.formData)
if(this.formData.createLineTimes && this.formData.createLineTimes.length > 0) {
cloneData.createLineStartTime = this.formData.createLineTimes[0]
cloneData.createLineEndTime = this.formData.createLineTimes[1]
}
if(this.formData.implodeTimes && this.formData.implodeTimes.length > 0) {
cloneData.implodeStartTime = this.formData.implodeTimes[0]
cloneData.implodeEndTime = this.formData.implodeTimes[1]
@@ -455,6 +473,10 @@ layout("/layouts/platform.html"){
if (data.outsideQuotaProportion) {
data.outsideQuotaProportion = data.outsideQuotaProportion * 1000 / 10
}
if(data.createLineStartTime && data.createLineEndTime) {
data.createLineTimes = [data.createLineStartTime, data.createLineEndTime]
}
if(data.implodeStartTime && data.implodeEndTime) {
data.implodeTimes = [data.implodeStartTime, data.implodeEndTime]
}
+11 -8
View File
@@ -5,7 +5,9 @@ import cn.afterturn.easypoi.excel.annotation.Excel;
import cn.afterturn.easypoi.excel.entity.ImportParams;
import cn.hutool.core.date.DateUnit;
import cn.hutool.core.date.DateUtil;
import io.v.nutz.base.model.msgUser;
import io.v.nutz.base.service.BaseService;
import io.v.nutz.base.utils.MsgApi;
import io.v.nutz.base.utils.Roles;
import io.v.nutz.sys.models.Sys_unit;
import io.v.nutz.sys.models.Sys_user;
@@ -494,16 +496,17 @@ public class JugTest {
dao.insert(insertList);
}
@Inject
private MsgApi msgApi;
@Test
public void t10(){
SourceChangeConfig config = dao.fetch(SourceChangeConfig.class, Cnd.NEW());
List<SourceChangeConfig.MemberSift> memberSiftList = config.getMemberSiftList();
for (SourceChangeConfig.MemberSift sift : memberSiftList) {
Object siftValue = sift.getSiftValue();
System.out.println(siftValue);
List<String> list = (List<String>) siftValue;
System.out.println(list);
}
msgUser msgUser = new msgUser();
msgUser.setName("User");
msgUser.setUserId("LSGH0001");
msgUser.setName("工会测试");
List<msgUser> users = new ArrayList<>();
users.add(msgUser);
msgApi.sendMsg("测试", "这是一条测试消息", 1, 1, "WeChat", users, "");
}
}