feat: v3版疗休养优化5
This commit is contained in:
@@ -49,3 +49,4 @@ Thumbs.db
|
|||||||
.trae/pr-creator/SKILL.md
|
.trae/pr-creator/SKILL.md
|
||||||
.trae/update-docs/SKILL.md
|
.trae/update-docs/SKILL.md
|
||||||
.trae/webapp-testing/SKILL.md
|
.trae/webapp-testing/SKILL.md
|
||||||
|
outputs
|
||||||
Binary file not shown.
@@ -10,7 +10,6 @@ import org.nutz.ioc.loader.annotation.IocBean;
|
|||||||
import org.nutz.log.Log;
|
import org.nutz.log.Log;
|
||||||
import org.nutz.log.Logs;
|
import org.nutz.log.Logs;
|
||||||
import org.nutz.plugins.mvc.websocket.AbstractWsEndpoint;
|
import org.nutz.plugins.mvc.websocket.AbstractWsEndpoint;
|
||||||
import org.nutz.plugins.mvc.websocket.NutWsConfigurator;
|
|
||||||
import org.nutz.plugins.mvc.websocket.WsHandler;
|
import org.nutz.plugins.mvc.websocket.WsHandler;
|
||||||
import redis.clients.jedis.*;
|
import redis.clients.jedis.*;
|
||||||
|
|
||||||
@@ -21,7 +20,7 @@ import javax.websocket.server.ServerEndpoint;
|
|||||||
import java.util.ArrayList;
|
import java.util.ArrayList;
|
||||||
import java.util.List;
|
import java.util.List;
|
||||||
|
|
||||||
@ServerEndpoint(value = "/websocket", configurator = NutWsConfigurator.class)
|
@ServerEndpoint(value = "/websocket", configurator = WkWsConfigurator.class)
|
||||||
@IocBean(create = "init") // 使用NutWsConfigurator的必备条件
|
@IocBean(create = "init") // 使用NutWsConfigurator的必备条件
|
||||||
public class WkWebSocket extends AbstractWsEndpoint implements PubSub {
|
public class WkWebSocket extends AbstractWsEndpoint implements PubSub {
|
||||||
protected static final Log log = Logs.get();
|
protected static final Log log = Logs.get();
|
||||||
|
|||||||
@@ -0,0 +1,20 @@
|
|||||||
|
package com.budwk.app.web.commons.ext.websocket;
|
||||||
|
|
||||||
|
import org.nutz.plugins.mvc.websocket.NutWsConfigurator;
|
||||||
|
|
||||||
|
import javax.websocket.HandshakeResponse;
|
||||||
|
import javax.websocket.server.HandshakeRequest;
|
||||||
|
import javax.websocket.server.ServerEndpointConfig;
|
||||||
|
|
||||||
|
public class WkWsConfigurator extends NutWsConfigurator {
|
||||||
|
@Override
|
||||||
|
public void modifyHandshake(ServerEndpointConfig config, HandshakeRequest request, HandshakeResponse response) {
|
||||||
|
// WebSocket升级不一定经过Nutz请求链,只使用当前握手的会话,避免读取已回收的MVC请求。
|
||||||
|
Object session = request.getHttpSession();
|
||||||
|
if (session == null) {
|
||||||
|
config.getUserProperties().remove("HttpSession");
|
||||||
|
} else {
|
||||||
|
config.getUserProperties().put("HttpSession", session);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
+1
-1
@@ -42,7 +42,7 @@ public class TherapyWorkspaceController {
|
|||||||
if (!found) throw new IllegalArgumentException("未知的普惠疗休养V3页面");
|
if (!found) throw new IllegalArgumentException("未知的普惠疗休养V3页面");
|
||||||
}
|
}
|
||||||
List<String[]> tabs = new ArrayList<>();
|
List<String[]> tabs = new ArrayList<>();
|
||||||
String[][] groups = {{"line", "base"}, {"overview", "cluster", "adjustment"},
|
String[][] groups = {{"overview", "cluster", "adjustment"},
|
||||||
{"branchQuery", "branchAudit", "travelAudit"}, {"userQuery", "schoolAudit", "import"}};
|
{"branchQuery", "branchAudit", "travelAudit"}, {"userQuery", "schoolAudit", "import"}};
|
||||||
for (String[] group : groups) {
|
for (String[] group : groups) {
|
||||||
if (Arrays.asList(group).contains(screen)) {
|
if (Arrays.asList(group).contains(screen)) {
|
||||||
|
|||||||
+20
@@ -10,6 +10,8 @@ import cn.hutool.core.io.FileUtil;
|
|||||||
import cn.hutool.core.lang.Assert;
|
import cn.hutool.core.lang.Assert;
|
||||||
import cn.hutool.core.util.StrUtil;
|
import cn.hutool.core.util.StrUtil;
|
||||||
import com.budwk.app.base.result.Result;
|
import com.budwk.app.base.result.Result;
|
||||||
|
import com.budwk.app.base.utils.SysOfficeTemplateUtil;
|
||||||
|
import com.budwk.app.sys.models.Sys_office_template;
|
||||||
import com.budwk.app.zhgh.staffbenefit.therapyRecuperation.support.ViReturn;
|
import com.budwk.app.zhgh.staffbenefit.therapyRecuperation.support.ViReturn;
|
||||||
import com.budwk.app.zhgh.staffbenefit.therapyRecuperation.support.TherapyContext;
|
import com.budwk.app.zhgh.staffbenefit.therapyRecuperation.support.TherapyContext;
|
||||||
import com.budwk.app.base.param.PageForm;
|
import com.budwk.app.base.param.PageForm;
|
||||||
@@ -66,6 +68,7 @@ import javax.servlet.http.HttpServletResponse;
|
|||||||
import java.io.File;
|
import java.io.File;
|
||||||
import java.io.FileInputStream;
|
import java.io.FileInputStream;
|
||||||
import java.io.InputStream;
|
import java.io.InputStream;
|
||||||
|
import java.io.IOException;
|
||||||
import java.lang.reflect.Field;
|
import java.lang.reflect.Field;
|
||||||
import java.lang.reflect.InvocationHandler;
|
import java.lang.reflect.InvocationHandler;
|
||||||
import java.lang.reflect.Proxy;
|
import java.lang.reflect.Proxy;
|
||||||
@@ -104,6 +107,23 @@ public class TheRapyRecuperationLineController {
|
|||||||
private TheRapyRecuperationLineService lineService;
|
private TheRapyRecuperationLineService lineService;
|
||||||
@Inject
|
@Inject
|
||||||
private Dao dao;
|
private Dao dao;
|
||||||
|
@Inject
|
||||||
|
private SysOfficeTemplateUtil sysOfficeTemplateUtil;
|
||||||
|
|
||||||
|
@At
|
||||||
|
@Ok("void")
|
||||||
|
@SaCheckPermission("inclusiveTherapyV3.line")
|
||||||
|
public void downloadTemplate(HttpServletResponse response) throws IOException {
|
||||||
|
String templateCode = "inclusive_therapy_v3_line_import";
|
||||||
|
try (InputStream in = sysOfficeTemplateUtil.getTemplate(templateCode)) {
|
||||||
|
Sys_office_template template = dao.fetch(Sys_office_template.class, Cnd.where("templateCode", "=", templateCode));
|
||||||
|
TherapyDownload.excelResponse(response, template.getTemplateName());
|
||||||
|
if (template.getTemplateName().toLowerCase(Locale.ROOT).endsWith(".xls")) {
|
||||||
|
response.setContentType("application/vnd.ms-excel");
|
||||||
|
}
|
||||||
|
in.transferTo(response.getOutputStream());
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
@At("")
|
@At("")
|
||||||
@Ok("beetl:/platform/zhgh/staffbenefit/therapyRecuperation/basicManage/line.html")
|
@Ok("beetl:/platform/zhgh/staffbenefit/therapyRecuperation/basicManage/line.html")
|
||||||
|
|||||||
+163
-47
@@ -1,10 +1,11 @@
|
|||||||
package com.budwk.app.zhgh.staffbenefit.therapyRecuperation.controller.basicManage;
|
package com.budwk.app.zhgh.staffbenefit.therapyRecuperation.controller.basicManage;
|
||||||
|
|
||||||
import cn.afterturn.easypoi.excel.ExcelImportUtil;
|
|
||||||
import cn.afterturn.easypoi.excel.entity.ImportParams;
|
|
||||||
import cn.hutool.core.io.FileUtil;
|
import cn.hutool.core.io.FileUtil;
|
||||||
import cn.hutool.core.util.StrUtil;
|
import cn.hutool.core.util.StrUtil;
|
||||||
import com.budwk.app.base.result.Result;
|
import com.budwk.app.base.result.Result;
|
||||||
|
import com.budwk.app.base.utils.SysOfficeTemplateUtil;
|
||||||
|
import com.budwk.app.sys.models.Sys_office_template;
|
||||||
|
import com.budwk.app.zhgh.staffbenefit.therapyRecuperation.support.TherapyDownload;
|
||||||
import com.budwk.app.zhgh.staffbenefit.therapyRecuperation.support.ViReturn;
|
import com.budwk.app.zhgh.staffbenefit.therapyRecuperation.support.ViReturn;
|
||||||
import com.budwk.app.zhgh.staffbenefit.therapyRecuperation.support.PageUtil;
|
import com.budwk.app.zhgh.staffbenefit.therapyRecuperation.support.PageUtil;
|
||||||
import com.budwk.app.base.param.PageForm;
|
import com.budwk.app.base.param.PageForm;
|
||||||
@@ -14,13 +15,11 @@ import com.budwk.app.zhgh.staffbenefit.therapyRecuperation.service.TheRapyRecupe
|
|||||||
import lombok.extern.slf4j.Slf4j;
|
import lombok.extern.slf4j.Slf4j;
|
||||||
import cn.dev33.satoken.annotation.SaCheckLogin;
|
import cn.dev33.satoken.annotation.SaCheckLogin;
|
||||||
import cn.dev33.satoken.annotation.SaCheckPermission;
|
import cn.dev33.satoken.annotation.SaCheckPermission;
|
||||||
import org.nutz.aop.interceptor.ioc.TransAop;
|
|
||||||
import org.nutz.dao.Cnd;
|
import org.nutz.dao.Cnd;
|
||||||
import org.nutz.dao.Dao;
|
import org.nutz.dao.Dao;
|
||||||
import org.nutz.dao.Sqls;
|
import org.nutz.dao.Sqls;
|
||||||
import org.nutz.dao.sql.Sql;
|
import org.nutz.dao.sql.Sql;
|
||||||
import org.nutz.dao.util.cri.SqlExpressionGroup;
|
import org.nutz.dao.util.cri.SqlExpressionGroup;
|
||||||
import org.nutz.ioc.aop.Aop;
|
|
||||||
import org.nutz.ioc.loader.annotation.Inject;
|
import org.nutz.ioc.loader.annotation.Inject;
|
||||||
import org.nutz.ioc.loader.annotation.IocBean;
|
import org.nutz.ioc.loader.annotation.IocBean;
|
||||||
import org.nutz.lang.Lang;
|
import org.nutz.lang.Lang;
|
||||||
@@ -32,7 +31,20 @@ import org.nutz.mvc.upload.UploadAdaptor;
|
|||||||
import java.util.ArrayList;
|
import java.util.ArrayList;
|
||||||
import java.util.List;
|
import java.util.List;
|
||||||
import java.util.Map;
|
import java.util.Map;
|
||||||
import java.util.stream.Collectors;
|
import org.nutz.trans.Trans;
|
||||||
|
import org.apache.poi.ss.usermodel.Cell;
|
||||||
|
import org.apache.poi.ss.usermodel.CellType;
|
||||||
|
import org.apache.poi.ss.usermodel.CellValue;
|
||||||
|
import org.apache.poi.ss.usermodel.DataFormatter;
|
||||||
|
import org.apache.poi.ss.usermodel.FormulaEvaluator;
|
||||||
|
import org.apache.poi.ss.usermodel.Row;
|
||||||
|
import org.apache.poi.ss.usermodel.Sheet;
|
||||||
|
import org.apache.poi.ss.usermodel.Workbook;
|
||||||
|
import org.apache.poi.ss.usermodel.WorkbookFactory;
|
||||||
|
import java.math.BigDecimal;
|
||||||
|
import java.io.IOException;
|
||||||
|
import java.io.InputStream;
|
||||||
|
import javax.servlet.http.HttpServletResponse;
|
||||||
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@@ -51,6 +63,8 @@ public class TheRapyRecuperationTravelAgencyController {
|
|||||||
private TheRapyRecuperationTravelAgencyService travelAgencyService;
|
private TheRapyRecuperationTravelAgencyService travelAgencyService;
|
||||||
@Inject
|
@Inject
|
||||||
private Dao dao;
|
private Dao dao;
|
||||||
|
@Inject
|
||||||
|
private SysOfficeTemplateUtil sysOfficeTemplateUtil;
|
||||||
|
|
||||||
@At("")
|
@At("")
|
||||||
@Ok("beetl:/platform/zhgh/staffbenefit/therapyRecuperation/basicManage/travelAgency.html")
|
@Ok("beetl:/platform/zhgh/staffbenefit/therapyRecuperation/basicManage/travelAgency.html")
|
||||||
@@ -58,6 +72,21 @@ public class TheRapyRecuperationTravelAgencyController {
|
|||||||
public void index() {
|
public void index() {
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@At
|
||||||
|
@Ok("void")
|
||||||
|
@SaCheckPermission("inclusiveTherapyV3.travelAgency")
|
||||||
|
public void downloadTemplate(HttpServletResponse response) throws IOException {
|
||||||
|
String templateCode = "inclusive_therapy_v3_travel_agency_import";
|
||||||
|
try (InputStream in = sysOfficeTemplateUtil.getTemplate(templateCode)) {
|
||||||
|
Sys_office_template template = dao.fetch(Sys_office_template.class, Cnd.where("templateCode", "=", templateCode));
|
||||||
|
TherapyDownload.excelResponse(response, template.getTemplateName());
|
||||||
|
if (template.getTemplateName().toLowerCase(java.util.Locale.ROOT).endsWith(".xls")) {
|
||||||
|
response.setContentType("application/vnd.ms-excel");
|
||||||
|
}
|
||||||
|
in.transferTo(response.getOutputStream());
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* 页面数据
|
* 页面数据
|
||||||
*
|
*
|
||||||
@@ -211,9 +240,8 @@ public class TheRapyRecuperationTravelAgencyController {
|
|||||||
*/
|
*/
|
||||||
@At
|
@At
|
||||||
@ViReturn
|
@ViReturn
|
||||||
@SaCheckLogin
|
@SaCheckPermission("inclusiveTherapyV3.travelAgency")
|
||||||
@AdaptBy(type = UploadAdaptor.class, args = {"ioc:fileUpload"})
|
@AdaptBy(type = UploadAdaptor.class, args = {"ioc:fileUpload"})
|
||||||
@Aop(TransAop.READ_COMMITTED)
|
|
||||||
public Object travelAgencyImport(TempFile file) {
|
public Object travelAgencyImport(TempFile file) {
|
||||||
if (Lang.isEmpty(file)) {
|
if (Lang.isEmpty(file)) {
|
||||||
return Result.error("上传的文件不能为空");
|
return Result.error("上传的文件不能为空");
|
||||||
@@ -222,58 +250,146 @@ public class TheRapyRecuperationTravelAgencyController {
|
|||||||
if (!List.of("xls", "xlsx").contains(extName.toLowerCase())) {
|
if (!List.of("xls", "xlsx").contains(extName.toLowerCase())) {
|
||||||
return Result.error("请上传xls,xlsx文件");
|
return Result.error("请上传xls,xlsx文件");
|
||||||
}
|
}
|
||||||
List<TheRapyTravelAgencyExcelMode> excelList;
|
List<TheRapyTravelAgencyExcelMode> excelList = new ArrayList<>();
|
||||||
|
List<Integer> excelRowNumbers = new ArrayList<>();
|
||||||
|
|
||||||
try {
|
try (Workbook workbook = WorkbookFactory.create(file.getFile())) {
|
||||||
ImportParams importParams = new ImportParams();
|
Sheet sheet = workbook.getSheetAt(0);
|
||||||
// importParams.setTitleRows(1);
|
Row header = sheet.getRow(0);
|
||||||
excelList = ExcelImportUtil.importExcel(file.getFile(), TheRapyTravelAgencyExcelMode.class, importParams);
|
if (header == null) return Result.error("第一行必须是模板表头");
|
||||||
|
DataFormatter formatter = new DataFormatter();
|
||||||
|
FormulaEvaluator evaluator = workbook.getCreationHelper().createFormulaEvaluator();
|
||||||
|
Map<String, Integer> headers = new java.util.LinkedHashMap<>();
|
||||||
|
for (Cell cell : header) {
|
||||||
|
String name = formatter.formatCellValue(cell).trim().replace("(可填)", "").replace("(可填)", "");
|
||||||
|
if ("编号".equals(name)) name = "排序编号";
|
||||||
|
if ("是否启用".equals(name)) name = "是否启用(是/否)";
|
||||||
|
if (StrUtil.isBlank(name)) continue;
|
||||||
|
if (headers.putIfAbsent(name, cell.getColumnIndex()) != null) return Result.error("模板表头重复:" + name);
|
||||||
|
}
|
||||||
|
for (String name : List.of("年度", "排序编号", "旅行社名称", "是否自由组团(是/否)", "旅行社联系人", "联系电话")) {
|
||||||
|
if (!headers.containsKey(name)) return Result.error("模板缺少必填列:" + name);
|
||||||
|
}
|
||||||
|
for (int rowIndex = 1; rowIndex <= sheet.getLastRowNum(); rowIndex++) {
|
||||||
|
Row dataRow = sheet.getRow(rowIndex);
|
||||||
|
if (dataRow == null) continue;
|
||||||
|
Map<String, String> values = new java.util.HashMap<>();
|
||||||
|
for (Map.Entry<String, Integer> column : headers.entrySet()) {
|
||||||
|
Cell cell = dataRow.getCell(column.getValue());
|
||||||
|
String value = formatter.formatCellValue(cell, evaluator).trim();
|
||||||
|
if (cell != null && ("年度".equals(column.getKey()) || "最多承担人数".equals(column.getKey()))) {
|
||||||
|
CellValue evaluated = evaluator.evaluate(cell);
|
||||||
|
if (evaluated != null && evaluated.getCellType() == CellType.NUMERIC) {
|
||||||
|
value = BigDecimal.valueOf(evaluated.getNumberValue()).toPlainString();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
values.put(column.getKey(), value);
|
||||||
|
}
|
||||||
|
if (values.values().stream().allMatch(StrUtil::isBlank)) continue;
|
||||||
|
TheRapyTravelAgencyExcelMode travel = new TheRapyTravelAgencyExcelMode();
|
||||||
|
try {
|
||||||
|
if (StrUtil.isNotBlank(values.get("年度"))) {
|
||||||
|
travel.setYear(new BigDecimal(values.get("年度")).intValueExact());
|
||||||
|
}
|
||||||
|
} catch (NumberFormatException | ArithmeticException e) {
|
||||||
|
return Result.error("第" + (rowIndex + 1) + "行:年度须填写4位整数");
|
||||||
|
}
|
||||||
|
try {
|
||||||
|
if (StrUtil.isNotBlank(values.get("最多承担人数"))) {
|
||||||
|
travel.setMaxUndertakeNumber(new BigDecimal(values.get("最多承担人数")).intValueExact());
|
||||||
|
}
|
||||||
|
} catch (NumberFormatException | ArithmeticException e) {
|
||||||
|
return Result.error("第" + (rowIndex + 1) + "行:最多承担人数须填写有效整数");
|
||||||
|
}
|
||||||
|
travel.setSerialNumber(values.get("排序编号"));
|
||||||
|
travel.setTravelAgencyName(values.get("旅行社名称"));
|
||||||
|
travel.setSignUpTravelAgency(values.get("是否自由组团(是/否)"));
|
||||||
|
travel.setContact(values.get("旅行社联系人"));
|
||||||
|
travel.setContactMobileNumber(values.get("联系电话"));
|
||||||
|
travel.setEmail(values.get("邮箱"));
|
||||||
|
travel.setOfficialWebsite(values.get("官网"));
|
||||||
|
travel.setNote(values.get("备注"));
|
||||||
|
travel.setIsDisabled(values.get("是否启用(是/否)"));
|
||||||
|
excelList.add(travel);
|
||||||
|
excelRowNumbers.add(rowIndex + 1);
|
||||||
|
}
|
||||||
} catch (Exception e) {
|
} catch (Exception e) {
|
||||||
log.error(e.getMessage());
|
log.error("读取旅行社导入文件失败", e);
|
||||||
return Result.error("读取不到数据,请检查excel文件格式");
|
return Result.error("读取失败,请使用新模板;年度和最多承担人数须填写整数");
|
||||||
}
|
}
|
||||||
|
|
||||||
if (Lang.isEmpty(excelList)) {
|
if (Lang.isEmpty(excelList)) {
|
||||||
return Result.error("读取不到数据,请检查excel文件格式");
|
return Result.error("读取不到数据,请检查excel文件格式");
|
||||||
}
|
}
|
||||||
|
List<TheRapyRecuperationTravelAgency> list = new ArrayList<>();
|
||||||
|
Map<String, Integer> importedNumbers = new java.util.HashMap<>();
|
||||||
|
for (int index = 0; index < excelList.size(); index++) {
|
||||||
|
TheRapyTravelAgencyExcelMode travel = excelList.get(index);
|
||||||
|
String row = "第" + excelRowNumbers.get(index) + "行:";
|
||||||
|
travel.setSerialNumber(StrUtil.trim(travel.getSerialNumber()));
|
||||||
|
travel.setTravelAgencyName(StrUtil.trim(travel.getTravelAgencyName()));
|
||||||
|
travel.setContact(StrUtil.trim(travel.getContact()));
|
||||||
|
travel.setContactMobileNumber(StrUtil.trim(travel.getContactMobileNumber()));
|
||||||
|
travel.setSignUpTravelAgency(StrUtil.trim(travel.getSignUpTravelAgency()));
|
||||||
|
travel.setIsDisabled(StrUtil.trim(travel.getIsDisabled()));
|
||||||
|
travel.setEmail(StrUtil.trim(travel.getEmail()));
|
||||||
|
travel.setOfficialWebsite(StrUtil.trim(travel.getOfficialWebsite()));
|
||||||
|
if (travel.getYear() == null || travel.getYear() < 1000 || travel.getYear() > 9999) {
|
||||||
|
return Result.error(row + "年度须填写4位整数");
|
||||||
|
}
|
||||||
|
if (StrUtil.isBlank(travel.getSerialNumber()) || StrUtil.isBlank(travel.getTravelAgencyName())
|
||||||
|
|| StrUtil.isBlank(travel.getContact()) || StrUtil.isBlank(travel.getContactMobileNumber())) {
|
||||||
|
return Result.error(row + "编号、旅行社名称、旅行社联系人和联系电话不能为空");
|
||||||
|
}
|
||||||
|
if (!List.of("是", "否").contains(travel.getSignUpTravelAgency() == null ? "" : travel.getSignUpTravelAgency())) {
|
||||||
|
return Result.error(row + "是否自由组团须填写是或否");
|
||||||
|
}
|
||||||
|
if (StrUtil.isBlank(travel.getIsDisabled())) travel.setIsDisabled("是");
|
||||||
|
if (!List.of("是", "否").contains(travel.getIsDisabled())) return Result.error(row + "是否启用须填写是或否");
|
||||||
|
if (!travel.getContactMobileNumber().matches("^(13[0-9]|14[5|7]|15[0|1|2|3|5|6|7|8|9]|18[0|1|2|3|5|6|7|8|9])\\d{8}$")) {
|
||||||
|
return Result.error(row + "联系电话格式不正确");
|
||||||
|
}
|
||||||
|
if (travel.getSerialNumber().length() > 50 || travel.getTravelAgencyName().length() > 50
|
||||||
|
|| travel.getContact().length() > 10 || StrUtil.length(travel.getEmail()) > 50
|
||||||
|
|| StrUtil.length(travel.getOfficialWebsite()) > 100 || StrUtil.length(travel.getNote()) > 100) {
|
||||||
|
return Result.error(row + "字段长度超限:编号/名称/邮箱最多50字,联系人10字,官网/备注100字");
|
||||||
|
}
|
||||||
|
if (StrUtil.isNotBlank(travel.getEmail()) && !cn.hutool.core.lang.Validator.isEmail(travel.getEmail())) {
|
||||||
|
return Result.error(row + "邮箱格式不正确");
|
||||||
|
}
|
||||||
|
if (StrUtil.isNotBlank(travel.getOfficialWebsite()) && !cn.hutool.core.lang.Validator.isUrl(travel.getOfficialWebsite())) {
|
||||||
|
return Result.error(row + "官网须填写完整网址");
|
||||||
|
}
|
||||||
|
if (travel.getMaxUndertakeNumber() != null && travel.getMaxUndertakeNumber() < 0) {
|
||||||
|
return Result.error(row + "最多承担人数不能小于0");
|
||||||
|
}
|
||||||
|
Integer previousRow = importedNumbers.putIfAbsent(travel.getSerialNumber(), excelRowNumbers.get(index));
|
||||||
|
if (previousRow != null) return Result.error(row + "编号与第" + previousRow + "行重复");
|
||||||
|
List<TheRapyRecuperationTravelAgency> existing = dao.query(TheRapyRecuperationTravelAgency.class,
|
||||||
|
Cnd.where("serialNumber", "=", travel.getSerialNumber()));
|
||||||
|
if (existing.size() > 1) return Result.error(row + "数据库中该编号对应多条旅行社记录");
|
||||||
|
TheRapyRecuperationTravelAgency agency = existing.isEmpty() ? new TheRapyRecuperationTravelAgency() : existing.get(0);
|
||||||
|
agency.setDisabled("否".equals(travel.getIsDisabled()));
|
||||||
|
agency.setSignUpTravelAgency("是".equals(travel.getSignUpTravelAgency()));
|
||||||
|
agency.setContact(travel.getContact());
|
||||||
|
agency.setTravelAgencyName(travel.getTravelAgencyName());
|
||||||
|
agency.setSerialNumber(travel.getSerialNumber());
|
||||||
|
agency.setEmail(travel.getEmail());
|
||||||
|
agency.setMaxUndertakeNumber(travel.getMaxUndertakeNumber());
|
||||||
|
agency.setContactMobileNumber(travel.getContactMobileNumber());
|
||||||
|
agency.setNote(travel.getNote());
|
||||||
|
agency.setYear(travel.getYear());
|
||||||
|
agency.setOfficialWebsite(travel.getOfficialWebsite());
|
||||||
|
list.add(agency);
|
||||||
|
}
|
||||||
try {
|
try {
|
||||||
if (excelList.stream().anyMatch(v -> StrUtil.isBlank(v.getYear().toString())) || excelList.stream().anyMatch(v -> StrUtil.isBlank(v.getTravelAgencyName()))) {
|
Trans.exec(() -> dao.insertOrUpdate(list));
|
||||||
return Result.error("年度和旅行社名称不能为空");
|
|
||||||
}
|
|
||||||
List<TheRapyTravelAgencyExcelMode> travelAgency = ExcelImportUtil.importExcel(file.getFile(), TheRapyTravelAgencyExcelMode.class, new ImportParams());
|
|
||||||
|
|
||||||
List<TheRapyRecuperationTravelAgency> travelAgencyList = dao.query(TheRapyRecuperationTravelAgency.class, Cnd.NEW().desc("id"));
|
|
||||||
Map<String, String> map = travelAgencyList.stream().collect(Collectors.toMap(v -> v.getTravelAgencyName(), v -> v.getId()));
|
|
||||||
|
|
||||||
List<TheRapyRecuperationTravelAgency> list = new ArrayList<>();
|
|
||||||
for (TheRapyTravelAgencyExcelMode travel : travelAgency) {
|
|
||||||
TheRapyRecuperationTravelAgency agency = new TheRapyRecuperationTravelAgency();
|
|
||||||
if (Strings.isNotBlank(map.get(travel.getTravelAgencyName()))){
|
|
||||||
agency.setId(map.get(travel.getTravelAgencyName()));
|
|
||||||
}
|
|
||||||
if (travel.getIsDisabled().equals("是")) {
|
|
||||||
agency.setDisabled(false);
|
|
||||||
} else if (travel.getIsDisabled().equals("否")) {
|
|
||||||
agency.setDisabled(true);
|
|
||||||
}
|
|
||||||
agency.setContact(travel.getContact());
|
|
||||||
agency.setTravelAgencyName(travel.getTravelAgencyName());
|
|
||||||
agency.setSerialNumber(travel.getSerialNumber());
|
|
||||||
agency.setEmail(travel.getEmail());
|
|
||||||
agency.setMaxUndertakeNumber(travel.getMaxUndertakeNumber());
|
|
||||||
agency.setContactMobileNumber(travel.getContactMobileNumber());
|
|
||||||
agency.setNote(travel.getNote());
|
|
||||||
agency.setYear(travel.getYear());
|
|
||||||
agency.setOfficialWebsite(travel.getOfficialWebsite());
|
|
||||||
list.add(agency);
|
|
||||||
}
|
|
||||||
dao.insertOrUpdate(list);
|
|
||||||
} catch (Exception e) {
|
} catch (Exception e) {
|
||||||
log.error(e.getMessage());
|
log.error("导入旅行社失败", e);
|
||||||
return Result.error("导入旅行社失败");
|
return Result.error("导入旅行社失败");
|
||||||
}
|
}
|
||||||
|
|
||||||
return null;
|
return Result.success("成功导入" + list.size() + "条旅行社");
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|||||||
+3
@@ -16,6 +16,9 @@ public class TheRapyTravelAgencyExcelMode {
|
|||||||
@Excel(name = "旅行社名称")
|
@Excel(name = "旅行社名称")
|
||||||
private String travelAgencyName;
|
private String travelAgencyName;
|
||||||
|
|
||||||
|
@Excel(name = "是否自由组团(是/否)")
|
||||||
|
private String signUpTravelAgency;
|
||||||
|
|
||||||
@Excel(name = "旅行社联系人")
|
@Excel(name = "旅行社联系人")
|
||||||
private String contact;
|
private String contact;
|
||||||
|
|
||||||
|
|||||||
@@ -109,7 +109,7 @@ Vue.component('table-tool', {
|
|||||||
|
|
||||||
<div>
|
<div>
|
||||||
<el-checkbox-group v-model="checkedFields" @change="columnChange">
|
<el-checkbox-group v-model="checkedFields" @change="columnChange">
|
||||||
<el-checkbox v-for="field in columns" :label="field.prop" style="display: block">{{
|
<el-checkbox v-for="field in columns" :key="field.prop" :label="field.prop" style="display: block">{{
|
||||||
field.label
|
field.label
|
||||||
}}
|
}}
|
||||||
</el-checkbox>
|
</el-checkbox>
|
||||||
@@ -126,4 +126,4 @@ Vue.component('table-tool', {
|
|||||||
</div>
|
</div>
|
||||||
</el-row>
|
</el-row>
|
||||||
`,
|
`,
|
||||||
})
|
})
|
||||||
|
|||||||
+24
-15
@@ -153,9 +153,11 @@ layout("/platform/zhgh/staffbenefit/therapyRecuperation/layouts/platform.html"){
|
|||||||
header-align="center"
|
header-align="center"
|
||||||
show-overflow-tooltip
|
show-overflow-tooltip
|
||||||
v-for="column in tableColumns"
|
v-for="column in tableColumns"
|
||||||
|
:key="column.prop"
|
||||||
>
|
>
|
||||||
<template scope="{row}" v-if="column.prop==='isDisabled'">
|
<template slot-scope="{row}">
|
||||||
<el-switch
|
<el-switch
|
||||||
|
v-if="column.prop==='isDisabled'"
|
||||||
:active-value="false"
|
:active-value="false"
|
||||||
:inactive-value="true"
|
:inactive-value="true"
|
||||||
@change="(val)=>{lineStatusChange(row.id)}"
|
@change="(val)=>{lineStatusChange(row.id)}"
|
||||||
@@ -163,21 +165,20 @@ layout("/platform/zhgh/staffbenefit/therapyRecuperation/layouts/platform.html"){
|
|||||||
inactive-color="#ff4949"
|
inactive-color="#ff4949"
|
||||||
v-model="row.isDisabled">
|
v-model="row.isDisabled">
|
||||||
</el-switch>
|
</el-switch>
|
||||||
</template>
|
<span v-else-if="column.prop==='signUpMode'">
|
||||||
<template scope="{row:{signUpMode}}" v-else-if="column.prop==='signUpMode'">
|
{{signUpModeName(row.signUpMode)}}
|
||||||
{{signUpModeName(signUpMode)}}
|
</span>
|
||||||
</template>
|
<span v-else-if="column.prop==='createMode'">
|
||||||
<template scope="{row:{createMode}}" v-else-if="column.prop==='createMode'">
|
{{createModeName(row.createMode)}}
|
||||||
{{createModeName(createMode)}}
|
</span>
|
||||||
</template>
|
<span v-else-if="column.prop==='createUserName'">
|
||||||
<template scope="{row}" v-else-if="column.prop==='createUserName'">
|
|
||||||
{{row.createUserName + '(' + row.createUnionName + ')'}}
|
{{row.createUserName + '(' + row.createUnionName + ')'}}
|
||||||
</template>
|
</span>
|
||||||
<template scope="{row}" v-else-if="column.prop==='playTime'">
|
<el-button v-else-if="column.prop==='playTime'" @click="viewUnionSelectTimeInfo(row.id)"
|
||||||
<el-button @click="viewUnionSelectTimeInfo(row.id)"
|
|
||||||
type="text">
|
type="text">
|
||||||
查看详情
|
查看详情
|
||||||
</el-button>
|
</el-button>
|
||||||
|
<span v-else>{{row[column.prop]}}</span>
|
||||||
<!-- v-if="row.createMode===2 && row.signUpMode===1"-->
|
<!-- v-if="row.createMode===2 && row.signUpMode===1"-->
|
||||||
<!--<span v-else>
|
<!--<span v-else>
|
||||||
{{row.playStartTime + '至' + row.playEndTime}}
|
{{row.playStartTime + '至' + row.playEndTime}}
|
||||||
@@ -185,7 +186,7 @@ layout("/platform/zhgh/staffbenefit/therapyRecuperation/layouts/platform.html"){
|
|||||||
</template>
|
</template>
|
||||||
</el-table-column>
|
</el-table-column>
|
||||||
<el-table-column label="操作" width="250px">
|
<el-table-column label="操作" width="250px">
|
||||||
<template scope="{row}">
|
<template slot-scope="{row}">
|
||||||
<el-button @click="openView(row.id)" size="mini" type="primary">查看</el-button>
|
<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="openEdit(row.id)" size="mini" type="primary">编辑</el-button>
|
||||||
<el-button @click="doDelete(row.id)" size="mini" type="danger">删除</el-button>
|
<el-button @click="doDelete(row.id)" size="mini" type="danger">删除</el-button>
|
||||||
@@ -502,7 +503,7 @@ layout("/platform/zhgh/staffbenefit/therapyRecuperation/layouts/platform.html"){
|
|||||||
<el-timeline-item timestamp="下载模板" placement="top">
|
<el-timeline-item timestamp="下载模板" placement="top">
|
||||||
<el-card>
|
<el-card>
|
||||||
<el-button size="medium" type=""
|
<el-button size="medium" type=""
|
||||||
@click="location.href='/platform/inclusiveTherapyV3/line/exportTemplate'"
|
@click="downloadLegacyTemplate"
|
||||||
icon="el-icon-download">下载模板
|
icon="el-icon-download">下载模板
|
||||||
</el-button>
|
</el-button>
|
||||||
|
|
||||||
@@ -512,6 +513,7 @@ layout("/platform/zhgh/staffbenefit/therapyRecuperation/layouts/platform.html"){
|
|||||||
<el-card>
|
<el-card>
|
||||||
<el-form>
|
<el-form>
|
||||||
<el-upload
|
<el-upload
|
||||||
|
action="/platform/inclusiveTherapyV3/line/travelLineImport"
|
||||||
name="file"
|
name="file"
|
||||||
ref="upload"
|
ref="upload"
|
||||||
:on-remove="(file, fileList) => {
|
:on-remove="(file, fileList) => {
|
||||||
@@ -551,7 +553,7 @@ layout("/platform/zhgh/staffbenefit/therapyRecuperation/layouts/platform.html"){
|
|||||||
<el-timeline-item timestamp="下载模板" placement="top">
|
<el-timeline-item timestamp="下载模板" placement="top">
|
||||||
<el-card>
|
<el-card>
|
||||||
<el-button size="medium" type=""
|
<el-button size="medium" type=""
|
||||||
@click="location.href='/platform/inclusiveTherapyV3/line/exportPageFieldsTemplate'"
|
@click="downloadTemplate"
|
||||||
icon="el-icon-download">下载模板
|
icon="el-icon-download">下载模板
|
||||||
</el-button>
|
</el-button>
|
||||||
</el-card>
|
</el-card>
|
||||||
@@ -560,6 +562,7 @@ layout("/platform/zhgh/staffbenefit/therapyRecuperation/layouts/platform.html"){
|
|||||||
<el-card>
|
<el-card>
|
||||||
<el-form>
|
<el-form>
|
||||||
<el-upload
|
<el-upload
|
||||||
|
action="/platform/inclusiveTherapyV3/line/importLineByPageFields"
|
||||||
name="file"
|
name="file"
|
||||||
ref="lineImportUpload"
|
ref="lineImportUpload"
|
||||||
:on-remove="(file, fileList) => {
|
:on-remove="(file, fileList) => {
|
||||||
@@ -977,6 +980,12 @@ layout("/platform/zhgh/staffbenefit/therapyRecuperation/layouts/platform.html"){
|
|||||||
}
|
}
|
||||||
this.lineImportVisible = true
|
this.lineImportVisible = true
|
||||||
},
|
},
|
||||||
|
downloadTemplate() {
|
||||||
|
window.location.href = '/platform/inclusiveTherapyV3/line/downloadTemplate';
|
||||||
|
},
|
||||||
|
downloadLegacyTemplate() {
|
||||||
|
window.location.href = '/platform/inclusiveTherapyV3/line/exportTemplate';
|
||||||
|
},
|
||||||
async doLineImport() {
|
async doLineImport() {
|
||||||
if (this.lineImportData.fileList.length === 0) {
|
if (this.lineImportData.fileList.length === 0) {
|
||||||
this.notifyWarning("请选择文件")
|
this.notifyWarning("请选择文件")
|
||||||
|
|||||||
+30
-21
@@ -64,9 +64,11 @@ layout("/platform/zhgh/staffbenefit/therapyRecuperation/layouts/platform.html"){
|
|||||||
header-align="center"
|
header-align="center"
|
||||||
show-overflow-tooltip
|
show-overflow-tooltip
|
||||||
v-for="column in tableColumns"
|
v-for="column in tableColumns"
|
||||||
|
:key="column.prop"
|
||||||
>
|
>
|
||||||
<template scope="{row}" v-if="column.prop==='isDisabled'">
|
<template slot-scope="{row}">
|
||||||
<el-switch
|
<el-switch
|
||||||
|
v-if="column.prop==='isDisabled'"
|
||||||
:active-value="false"
|
:active-value="false"
|
||||||
:inactive-value="true"
|
:inactive-value="true"
|
||||||
@change="(val)=>{travelAgencyStatusChange(row.id)}"
|
@change="(val)=>{travelAgencyStatusChange(row.id)}"
|
||||||
@@ -74,15 +76,14 @@ layout("/platform/zhgh/staffbenefit/therapyRecuperation/layouts/platform.html"){
|
|||||||
inactive-color="#ff4949"
|
inactive-color="#ff4949"
|
||||||
v-model="row.isDisabled">
|
v-model="row.isDisabled">
|
||||||
</el-switch>
|
</el-switch>
|
||||||
</template>
|
<a v-else-if="column.prop==='officialWebsite'" :href="row.officialWebsite" class="text-primary" target="_blank">
|
||||||
<template scope="{row:{officialWebsite}}" v-else-if="column.prop==='officialWebsite'">
|
{{row.officialWebsite}}
|
||||||
<a :href="officialWebsite" class="text-primary" target="_blank">
|
|
||||||
{{officialWebsite}}
|
|
||||||
</a>
|
</a>
|
||||||
|
<span v-else>{{row[column.prop]}}</span>
|
||||||
</template>
|
</template>
|
||||||
</el-table-column>
|
</el-table-column>
|
||||||
<el-table-column label="操作" width="250px">
|
<el-table-column label="操作" width="250px">
|
||||||
<template scope="{row}">
|
<template slot-scope="{row}">
|
||||||
<el-button @click="openView(row)" size="mini" type="primary">查看</el-button>
|
<el-button @click="openView(row)" size="mini" type="primary">查看</el-button>
|
||||||
<el-button @click="openEdit(row)" size="mini" type="primary">编辑</el-button>
|
<el-button @click="openEdit(row)" size="mini" type="primary">编辑</el-button>
|
||||||
<el-button @click="doDelete(row.id)" size="mini" type="danger">删除</el-button>
|
<el-button @click="doDelete(row.id)" size="mini" type="danger">删除</el-button>
|
||||||
@@ -234,7 +235,7 @@ layout("/platform/zhgh/staffbenefit/therapyRecuperation/layouts/platform.html"){
|
|||||||
<el-timeline-item timestamp="下载模板" placement="top">
|
<el-timeline-item timestamp="下载模板" placement="top">
|
||||||
<el-card>
|
<el-card>
|
||||||
<el-button size="medium" type=""
|
<el-button size="medium" type=""
|
||||||
@click="location.href='/platform/inclusiveTherapyV3/common/downloadTemplate?filePath=travel/TravelAgencyImport.xlsx&fileName=旅行社导入模板.xls'"
|
@click="downloadTemplate"
|
||||||
icon="el-icon-download">下载模板
|
icon="el-icon-download">下载模板
|
||||||
</el-button>
|
</el-button>
|
||||||
|
|
||||||
@@ -244,6 +245,7 @@ layout("/platform/zhgh/staffbenefit/therapyRecuperation/layouts/platform.html"){
|
|||||||
<el-card>
|
<el-card>
|
||||||
<el-form>
|
<el-form>
|
||||||
<el-upload
|
<el-upload
|
||||||
|
action="/platform/inclusiveTherapyV3/travelAgency/travelAgencyImport"
|
||||||
name="file"
|
name="file"
|
||||||
ref="upload"
|
ref="upload"
|
||||||
:on-remove="(file, fileList) => {
|
:on-remove="(file, fileList) => {
|
||||||
@@ -353,6 +355,9 @@ layout("/platform/zhgh/staffbenefit/therapyRecuperation/layouts/platform.html"){
|
|||||||
}
|
}
|
||||||
},
|
},
|
||||||
methods: {
|
methods: {
|
||||||
|
downloadTemplate() {
|
||||||
|
window.location.href = '/platform/inclusiveTherapyV3/travelAgency/downloadTemplate';
|
||||||
|
},
|
||||||
openAdd() {
|
openAdd() {
|
||||||
this.editDialogVisible = true
|
this.editDialogVisible = true
|
||||||
this.$nextTick(() => {
|
this.$nextTick(() => {
|
||||||
@@ -442,20 +447,24 @@ layout("/platform/zhgh/staffbenefit/therapyRecuperation/layouts/platform.html"){
|
|||||||
});
|
});
|
||||||
this.importLoading = true
|
this.importLoading = true
|
||||||
|
|
||||||
const resp = await $.ajax({
|
try {
|
||||||
url: loc() + '/travelAgencyImport',
|
const resp = await $.ajax({
|
||||||
type: 'POST',
|
url: loc() + '/travelAgencyImport',
|
||||||
data: data,
|
type: 'POST',
|
||||||
processData: false,
|
data: data,
|
||||||
contentType: false
|
processData: false,
|
||||||
})
|
contentType: false
|
||||||
if (resp.code===0){
|
})
|
||||||
this.$message.success(resp.msg)
|
if (resp.code===0){
|
||||||
this.pageData();
|
this.$message.success(resp.msg)
|
||||||
this.importVisible = false
|
this.pageData();
|
||||||
this.importLoading = false
|
this.importVisible = false
|
||||||
}else {
|
}else {
|
||||||
this.notifyWarning("导入失败")
|
this.notifyWarning(resp.msg || "导入失败")
|
||||||
|
}
|
||||||
|
} catch (error) {
|
||||||
|
this.notifyWarning("导入请求失败,请重试")
|
||||||
|
} finally {
|
||||||
this.importLoading = false
|
this.importLoading = false
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
|
|||||||
@@ -1,7 +1,7 @@
|
|||||||
<!--#
|
<!--#
|
||||||
layout("/layouts/platform.html"){
|
layout("/layouts/platform.html"){
|
||||||
#-->
|
#-->
|
||||||
<!--# if(therapyShowTabs){ #-->
|
<!--# if(therapyShowTabs && therapyPageUrl != '/platform/inclusiveTherapyV3/line' && therapyPageUrl != '/platform/inclusiveTherapyV3/baseManagement'){ #-->
|
||||||
<div style="padding:10px;background:#fff;border-bottom:1px solid #eee">
|
<div style="padding:10px;background:#fff;border-bottom:1px solid #eee">
|
||||||
<!--# for(tab in therapyTabs){ #-->
|
<!--# for(tab in therapyTabs){ #-->
|
||||||
<a class="btn btn-default" href="/platform/inclusiveTherapyV3?screen=${tab[0],escape}">${tab[1],escape}</a>
|
<a class="btn btn-default" href="/platform/inclusiveTherapyV3?screen=${tab[0],escape}">${tab[1],escape}</a>
|
||||||
|
|||||||
Reference in New Issue
Block a user