This commit is contained in:
=
2026-06-09 15:00:45 +08:00
parent e1a8679b89
commit 5b1e9cc85c
12 changed files with 378 additions and 35 deletions
@@ -161,8 +161,10 @@ public class TheRapyRecuperationSchoolUnionUserQueryController {
addTakePartInCondition(cnd, isTakePartIn);
// 工会可查询指定分工会
cnd.andEX("enroll.selfUnionId", "=", unionId);
// 工会为空时查询全部分工会,避免空字符串条件把历史年度数据过滤掉。
if (StrUtil.isNotBlank(unionId)) {
cnd.andEX("enroll.selfUnionId", "=", unionId);
}
// // 报名模式
// if (StrUtil.isNotBlank(signUpMode)) {
@@ -428,8 +430,10 @@ public class TheRapyRecuperationSchoolUnionUserQueryController {
addTakePartInCondition(cnd, isTakePartIn);
// 工会可查询指定分工会
cnd.andEX("enroll.selfUnionId", "=", unionId);
// 工会为空时导出全部分工会,保持和列表查询一致。
if (StrUtil.isNotBlank(unionId)) {
cnd.andEX("enroll.selfUnionId", "=", unionId);
}
// // 报名模式
// if (StrUtil.isNotBlank(signUpMode)) {
@@ -93,6 +93,12 @@ public class TheRapyRecuperationLineFragmentController {
@Param(value = "playStart") String playStart,
@Param(value = "playEnd") String playEnd,
@Param(value = "regionalNature", required = false) String regionalNature) {
if (StrUtil.isNotBlank(pageForm.getSearchKeyword())) {
// 输入姓名或工号时直接定位人员所在酒店和团期,便于快速打开对应团删除人员。
boolean selfOnly = !ShiroUtil.hasAnyRoles("sysadmin, SchoolUnionAdmin");
return enrollService.fragmentUserLocatePageData(pageForm, startYear, endYear, baseManagementId, travelAgencyId,
playStart, playEnd, regionalNature, selfOnly);
}
Sql sql = Sqls.create("""
SELECT
bm.*,
@@ -162,6 +168,8 @@ public class TheRapyRecuperationLineFragmentController {
@Param(value = "playStart", required = false) String playStart,
@Param(value = "playEnd", required = false) String playEnd,
@Param(value = "playCount", required = false) Integer playCount) {
return enrollService.fragmentSignUserPageData(pageForm, takePartInBaseManagementId, specificTime, playStart, playEnd, playCount);
/*
Sql sql = Sqls.create("""
SELECT
en.id,
@@ -183,13 +191,13 @@ 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);
return enrollService.listPageMap(pageForm.getPageNumber(), pageForm.getPageSize(), sql);
*/
}
@At
@@ -61,6 +61,16 @@ public class TheRapyRecuperationConfigController {
return configService.copyLastYear(year);
}
/**
* 沿用指定来源年度配置到目标年度。
*/
@At
@ViReturn
@RequiresAuthentication
public Object copyByYear(Integer sourceYear, Integer targetYear) {
return configService.copyByYear(sourceYear, targetYear);
}
/**
* 查使用该标段的线路和目的地
@@ -61,6 +61,15 @@ public interface TheRapyRecuperationConfigService extends ViService<TheRapyRecup
*/
TheRapyRecuperationConfig copyLastYear(Integer configYear);
/**
* 将指定来源年度配置复制为目标年度配置。
*
* @param sourceYear 来源配置年度
* @param targetYear 目标配置年度
* @return 复制后的目标年度配置
*/
TheRapyRecuperationConfig copyByYear(Integer sourceYear, Integer targetYear);
/**
* 查询使用该标段的线路和目的地。
*
@@ -37,6 +37,38 @@ public interface TheRapyRecuperationEnrollService extends ViService<TheRapyRecup
Object openSignUser(String id, String type, String searchKeyWord);
/**
* 分段式成团确认页面按姓名或工号定位报名人员所在酒店和团期。
*
* @param pageForm 分页和姓名/工号查询参数
* @param startYear 开始年度
* @param endYear 结束年度
* @param baseManagementId 酒店ID
* @param travelAgencyId 旅行社ID
* @param playStart 出行开始日期
* @param playEnd 出行结束日期
* @param regionalNature 出行类型
* @param selfOnly 是否只查询当前登录人报名记录
* @return 分页后的人员定位结果
*/
Pagination fragmentUserLocatePageData(PageForm pageForm, Integer startYear, Integer endYear, String baseManagementId,
String travelAgencyId, String playStart, String playEnd, String regionalNature,
boolean selfOnly);
/**
* 分段式成团确认报名人员弹窗分页数据。
*
* @param pageForm 分页和姓名/工号查询参数
* @param takePartInBaseManagementId 酒店ID
* @param specificTime 团期
* @param playStart 出行开始日期
* @param playEnd 出行结束日期
* @param playCount 出行批次
* @return 分页后的报名人员
*/
Pagination fragmentSignUserPageData(PageForm pageForm, String takePartInBaseManagementId, String specificTime,
String playStart, String playEnd, Integer playCount);
/**
* 线路报名
*
@@ -153,33 +153,56 @@ public class TheRapyRecuperationConfigServiceImpl extends ViServiceImpl<TheRapyR
@Override
@Aop(TransAop.READ_COMMITTED)
public TheRapyRecuperationConfig copyLastYear(Integer configYear) {
Integer year = getConfigYear(configYear);
TheRapyRecuperationConfig currentConfig = findByYear(year);
TheRapyRecuperationConfig lastConfig = findByYear(year - 1);
if (lastConfig == null) {
Integer targetYear = getConfigYear(configYear);
return copyConfigByYear(targetYear - 1, targetYear);
}
@Override
@Aop(TransAop.READ_COMMITTED)
public TheRapyRecuperationConfig copyByYear(Integer sourceYear, Integer targetYear) {
if (sourceYear == null || targetYear == null) {
throw new IllegalArgumentException("请选择来源年度和目标年度");
}
if (sourceYear.equals(targetYear)) {
throw new IllegalArgumentException("来源年度和目标年度不能相同");
}
return copyConfigByYear(sourceYear, targetYear);
}
/**
* 按指定来源年度复制配置到目标年度,目标年度已有配置时会覆盖并重建标段。
*
* @param sourceYear 来源配置年度
* @param targetYear 目标配置年度
* @return 复制后的目标年度配置
*/
private TheRapyRecuperationConfig copyConfigByYear(Integer sourceYear, Integer targetYear) {
TheRapyRecuperationConfig currentConfig = findByYear(targetYear);
TheRapyRecuperationConfig sourceConfig = findByYear(sourceYear);
if (sourceConfig == null) {
return null;
}
lastConfig.setId(currentConfig == null ? null : currentConfig.getId());
lastConfig.setConfigYear(year);
lastConfig.setLatestConfig(true);
resetConfigTimeYear(lastConfig, year);
resetUnlimitedGroupTravelAgencyIds(lastConfig);
sourceConfig.setId(currentConfig == null ? null : currentConfig.getId());
sourceConfig.setConfigYear(targetYear);
sourceConfig.setLatestConfig(true);
resetConfigTimeYear(sourceConfig, targetYear);
resetUnlimitedGroupTravelAgencyIds(sourceConfig);
resetLatestConfig(null);
if (currentConfig == null) {
copyLotsToNewConfig(lastConfig);
dao().insertWith(lastConfig, "lots");
copyLotsToNewConfig(sourceConfig);
dao().insertWith(sourceConfig, "lots");
} else {
dao().clear(TheRapyRecuperationLot.class, Cnd.where("configId", "=", currentConfig.getId()));
copyLotsToNewConfig(lastConfig);
dao().update(lastConfig);
for (TheRapyRecuperationLot lot : lastConfig.getLots()) {
copyLotsToNewConfig(sourceConfig);
dao().update(sourceConfig);
for (TheRapyRecuperationLot lot : sourceConfig.getLots()) {
lot.setConfigId(currentConfig.getId());
}
if (Lang.isNotEmpty(lastConfig.getLots())) {
dao().insert(lastConfig.getLots());
if (Lang.isNotEmpty(sourceConfig.getLots())) {
dao().insert(sourceConfig.getLots());
}
}
return findByYear(year);
return findByYear(targetYear);
}
/**
@@ -367,6 +367,121 @@ public class TheRapyRecuperationEnrollServiceImpl extends ViServiceImpl<TheRapyR
(oldValue, newValue) -> oldValue, LinkedHashMap::new));*/
}
@Override
public Pagination fragmentUserLocatePageData(PageForm pageForm, Integer startYear, Integer endYear, String baseManagementId,
String travelAgencyId, String playStart, String playEnd, String regionalNature,
boolean selfOnly) {
Sql sql = Sqls.create("""
SELECT
bm.*,
ta.travelAgencyName,
en.specificTime,
en.playDay,
su.loginname AS signLoginName,
su.username AS signUserName,
(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_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
LEFT JOIN user u ON u.id = bm.opBy
LEFT JOIN user su ON su.loginname = en.loginName
$condition
""");
sql.setVar("signCnd", buildFragmentPlayDateSql(playStart, playEnd));
sql.setParam("fragmentPlayStart", playStart);
sql.setParam("fragmentPlayEnd", playEnd);
Cnd cnd = Cnd.NEW();
cnd.and("en.takePartInBaseManagementId", "is not", null);
cnd.and("en.isNormal", "=", true);
cnd.andEX("bm.year", ">=", startYear);
cnd.andEX("bm.year", "<=", endYear);
cnd.andEX("bm.id", "=", baseManagementId);
cnd.andEX("bm.regionalNature", "=", regionalNature);
cnd.andEX("bm.travelAgencyId", "=", travelAgencyId);
addFragmentPlayDateCnd(cnd, "en.specificTime", playStart, playEnd);
if (selfOnly) {
cnd.and("en.loginName", "=", ShiroUtil.getPlatformLoginname());
}
if (StrUtil.isNotBlank(pageForm.getSearchKeyword())) {
String keyword = pageForm.getSearchKeyword().trim();
// 人员定位同时匹配报名记录和用户表,兼容历史报名记录姓名与用户表姓名不同步的情况。
cnd.and(Cnd.exps(Cnd.likeEX("en.userName", keyword))
.or(Cnd.likeEX("en.loginName", keyword))
.or(Cnd.likeEX("su.username", keyword))
.or(Cnd.likeEX("su.loginname", keyword)));
}
cnd.asc("bm.sortNumber * 1").desc("en.specificTime").asc("en.loginName");
sql.setCondition(cnd);
return listPageMap(pageForm.getPageNumber(), pageForm.getPageSize(), sql);
}
@Override
public Pagination fragmentSignUserPageData(PageForm pageForm, String takePartInBaseManagementId, String specificTime,
String playStart, String playEnd, 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,
u.mobile,
u.unionname,
u.unitname
FROM
the_rapy_recuperation_enroll en
LEFT JOIN user u ON en.loginName = u.loginname
$condition
""");
Cnd cnd = Cnd.NEW();
cnd.and("en.takePartInBaseManagementId", "is not", null);
cnd.and("en.isNormal", "=", true);
cnd.andEX("en.specificTime", "=", specificTime);
addFragmentPlayDateCnd(cnd, "en.specificTime", playStart, playEnd);
cnd.andEX("en.takePartInBaseManagementId", "=", takePartInBaseManagementId);
if (StrUtil.isNotBlank(pageForm.getSearchKeyword())) {
String keyword = pageForm.getSearchKeyword().trim();
// 弹窗按姓名或工号过滤,用于从人员定位结果直接锁定待删除人员。
cnd.and(Cnd.exps(Cnd.likeEX("en.userName", keyword))
.or(Cnd.likeEX("en.loginName", keyword))
.or(Cnd.likeEX("u.username", keyword))
.or(Cnd.likeEX("u.loginname", keyword)));
}
cnd.desc("en.specificTime");
sql.setCondition(cnd);
return listPageMap(pageForm.getPageNumber(), pageForm.getPageSize(), sql);
}
/**
* 分段式出行日期按 specificTime 起始日期过滤,页面传入格式为 MM-dd。
*/
private void addFragmentPlayDateCnd(Cnd cnd, String specificTimeColumn, String playStart, String playEnd) {
String playDateExpr = "REPLACE(REPLACE(SUBSTRING_INDEX(" + specificTimeColumn + ", '-', 1), '月', '-'), '日', '')";
cnd.andEX(playDateExpr, ">=", playStart);
cnd.andEX(playDateExpr, "<=", playEnd);
}
/**
* 分段式酒店列表统计人数时复用出行日期过滤,避免人员定位结果和列表统计口径不一致。
*/
private String buildFragmentPlayDateSql(String playStart, String playEnd) {
String playDateExpr = "REPLACE(REPLACE(SUBSTRING_INDEX(specificTime, '-', 1), '月', '-'), '日', '')";
if (StrUtil.isNotBlank(playStart) && StrUtil.isNotBlank(playEnd)) {
return " AND " + playDateExpr + " >= @fragmentPlayStart AND " + playDateExpr + " <= @fragmentPlayEnd";
} else if (StrUtil.isNotBlank(playStart)) {
return " AND " + playDateExpr + " >= @fragmentPlayStart";
} else if (StrUtil.isNotBlank(playEnd)) {
return " AND " + playDateExpr + " <= @fragmentPlayEnd";
}
return "";
}
/**
* 线路报名
*
@@ -269,7 +269,7 @@ layout("/layouts/platform.html"){
{prop: 'stateName', label: '审核状态'},
],
modifyConfig: {},
modifyConfig: {lots: []},
lineList: [],
unions: [],
signUpModeOptions: [
@@ -309,8 +309,10 @@ layout("/layouts/platform.html"){
const res = await $.post('/platform/theRapyRecuperation/TheRapyConfig/findOne', {
year: year || this.pageForm.startYear
})
if (res.code === 0) {
if (res.code === 0 && res.data) {
this.$set(this, 'modifyConfig', res.data)
} else {
this.$set(this, 'modifyConfig', {lots: []})
}
},
async selectTravelAgencyList() {
@@ -85,7 +85,7 @@ layout("/layouts/platform.html"){
type="year"
placeholder="选择年度"
value-format="yyyy"
@change="getConfig(pageForm.year);getLines()"
@change="yearChange"
style="width: 100%">
</el-date-picker>
</el-form-item>
@@ -766,12 +766,21 @@ layout("/layouts/platform.html"){
$.post('/platform/theRapyRecuperation/TheRapyConfig/findOne', {
year: year || this.pageForm.year
}).then((res) => {
if (res.code === 0) {
if (res.code === 0 && res.data) {
this.$set(this, 'config', res.data)
} else {
this.$set(this, 'config', {lots: []})
}
})
},
yearChange() {
// 年度变化后线路和标段都依赖旧年度配置,需要清空后重新查询。
this.$set(this.pageForm, 'takePartInLineId', '')
this.$set(this.pageForm, 'lotId', '')
this.doSearch()
},
signUpModeChange(val) {
this.pageForm.takePartInLineId = ''
this.getLines()
@@ -786,8 +795,9 @@ layout("/layouts/platform.html"){
regionalNature: this.pageForm.regionalNature
}).then(res => {
if (res.code === 0) {
this.takePartInLines = res.data
this.$set(this, 'takePartInLines', res.data || [])
} else {
this.$set(this, 'takePartInLines', [])
this.$message.error(res.msg)
}
})
@@ -112,6 +112,28 @@ layout("/layouts/platform.html"){
</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-input
:value="pageForm.searchKeyword"
@input="personKeywordChange"
@clear="clearPersonKeyword"
clearable
placeholder="请输入姓名或工号"
style="width: 80%">
</el-input>
</el-col>
<el-col :span="12">
<el-button icon="el-icon-search" size="small" type="primary" @click="doSearch()">查询</el-button>
<el-button icon="el-icon-refresh-left" size="small" @click="clearPersonKeyword">重置</el-button>
</el-col>
</el-row>
</el-col>
</el-row>
</el-card>
@@ -154,6 +176,7 @@ layout("/layouts/platform.html"){
align="center"
header-align="center"
v-for="column in tableColumns"
v-if="!column.personOnly || pageForm.searchKeyword"
show-overflow-tooltip
:label="column.label"
:prop="column.prop"
@@ -168,9 +191,12 @@ layout("/layouts/platform.html"){
{{row.stateName?row.stateName:'待成团'}}
</template>
</el-table-column>
<el-table-column label="操作" width="200px">
<el-table-column label="操作" width="300px">
<template scope="{row}">
<template>
<el-button v-if="row.signLoginName" @click="openMatchedUser(row)" size="mini" type="primary">
查看该团人员
</el-button>
<el-button @click="openView(row)" size="mini" type="primary">
查看团
</el-button>
@@ -250,6 +276,7 @@ layout("/layouts/platform.html"){
regionalNature: '',
baseManagementId: '',
travelAgencyId: '',
searchKeyword: '',
},
tableColumns: [
{prop: 'year', label: '年度', width: 60},
@@ -261,6 +288,10 @@ layout("/layouts/platform.html"){
{prop: 'baseContactNumber', label: '联系电话', sortable: true, checked: 0},
{prop: 'groupCount', label: '团数量'},
{prop: 'signCount', label: '报名人数'},
{prop: 'signUserName', label: '报名人员', personOnly: true},
{prop: 'signLoginName', label: '工号', personOnly: true},
{prop: 'specificTime', label: '报名团期', sortable: true, personOnly: true},
{prop: 'playDay', label: '出行天数', sortable: true, personOnly: true},
],
modifyConfig: {},
travelAgencyList: [],
@@ -275,6 +306,13 @@ layout("/layouts/platform.html"){
'sign-user': signUser
},
methods: {
personKeywordChange(value) {
this.$set(this.pageForm, 'searchKeyword', value)
},
clearPersonKeyword() {
this.$set(this.pageForm, 'searchKeyword', '')
this.doSearch()
},
oneKeyGroupSuccess(type) {
if (this.pageForm.startYear !== this.pageForm.endYear) {
this.$message.warning('请只选择一个年度操作')
@@ -305,7 +343,9 @@ layout("/layouts/platform.html"){
},
refreshChild() {
this.doSearch()
this.openView(this.baseRow)
if (this.groupVisible && this.baseRow && this.baseRow.id) {
this.openView(this.baseRow)
}
},
async sendSuccess(row, type) {
let message = '确定要成团吗?'
@@ -370,6 +410,12 @@ layout("/layouts/platform.html"){
this.$refs.signUser.initData(row.id, null, playStart, playEnd, null)
})
},
openMatchedUser(row) {
this.userVisible = true
this.$nextTick(() => {
this.$refs.signUser.initData(row.id, row.specificTime, this.pageForm.playStart, this.pageForm.playEnd, null, this.pageForm.searchKeyword)
})
},
openViewUser2(row) {
this.userVisible = true
this.$nextTick(() => {
@@ -57,23 +57,30 @@ const signUser = {
const resp = await $.post('/platform/theRapyRecuperation/statistics/deleteJoinUser', {id: row.id})
if (resp.code === 0) {
this.$message.success(resp.msg)
await this.initData(this.pageForm.takePartInBaseManagementId)
await this.pageData()
this.$emit("refresh", null)
} else {
this.$message.warning(resp.msg)
}
})
},
async initData(baseId, specificTime = null, playStart = null, playEnd = null, playCount = null) {
async initData(baseId, specificTime = null, playStart = null, playEnd = null, playCount = null, searchKeyword = '') {
this.$set(this.pageForm, 'pageNumber', 1)
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)
this.$set(this.pageForm, 'searchKeyword', searchKeyword)
await this.pageData()
},
async pageData() {
const res = await $.post('/platform/theRapyRecuperation/fragment/getSignUser', this.pageForm)
if (res.code === 0) {
this.tableData = res.data.list
this.pageForm.totalCount = res.data.totalCount
this.$set(this.pageForm, 'totalCount', res.data.totalCount)
} else {
this.$message.warning(res.msg)
}
},
},
@@ -34,7 +34,7 @@ layout("/layouts/platform.html"){
:label="item + '年度'"
:value="item"></el-option>
</el-select>
<el-button type="primary" plain @click="copyLastYear" :loading="copyLoading">沿用去年配置</el-button>
<el-button type="primary" plain @click="openCopyConfig" :loading="copyLoading">沿用配置</el-button>
</div>
<el-form ref="addForm" :model="formData" :rules="formRules" label-width="170px">
@@ -340,6 +340,35 @@ layout("/layouts/platform.html"){
<el-button type="primary" @click="deleteLotById">确 定</el-button>
</span>
</el-dialog>
<el-dialog
title="沿用年度配置"
:visible.sync="copyDialogVisible"
width="420px"
:close-on-click-modal="false">
<el-form label-width="100px">
<el-form-item label="来源年度">
<el-select v-model="copySourceYear" style="width: 100%">
<el-option v-for="item in yearOptions"
:key="'source-' + item"
:label="item + '年度'"
:value="item"></el-option>
</el-select>
</el-form-item>
<el-form-item label="目标年度">
<el-select v-model="copyTargetYear" style="width: 100%">
<el-option v-for="item in yearOptions"
:key="'target-' + item"
:label="item + '年度'"
:value="item"></el-option>
</el-select>
</el-form-item>
</el-form>
<span slot="footer" class="dialog-footer">
<el-button @click="closeCopyDialog">取 消</el-button>
<el-button type="primary" @click="doCopyConfig" :loading="copyLoading">确 定</el-button>
</span>
</el-dialog>
</guava>
<drawer-user-scope
@@ -353,9 +382,12 @@ layout("/layouts/platform.html"){
const vue = new Vue({
el: '#app',
data() {
const startYear = 2025
const yearOptions = [startYear, startYear + 1, startYear + 2, startYear + 3, startYear + 4]
const startYear = 2023
const nowYear = new Date().getFullYear()
const yearOptions = []
for (let year = startYear; year <= nowYear + 4; year++) {
yearOptions.push(year)
}
const currentYear = yearOptions.includes(nowYear) ? nowYear : startYear
return {
currentYear: currentYear,
@@ -364,6 +396,9 @@ layout("/layouts/platform.html"){
travelAgencyList: [],
subLoading: false,
copyLoading: false,
copyDialogVisible: false,
copySourceYear: 2025,
copyTargetYear: currentYear,
formData: {
configYear: currentYear,
isSnLine: 0,
@@ -448,6 +483,48 @@ layout("/layouts/platform.html"){
async changeYear() {
await this.findOne()
},
openCopyConfig() {
const sourceYear = this.yearOptions.includes(2025) ? 2025 : this.currentYear - 1
this.$set(this, 'copySourceYear', sourceYear)
this.$set(this, 'copyTargetYear', this.currentYear)
this.$set(this, 'copyDialogVisible', true)
},
closeCopyDialog() {
this.$set(this, 'copyDialogVisible', false)
},
async doCopyConfig() {
if (!this.copySourceYear || !this.copyTargetYear) {
this.$notify.warning({title: '提示', message: '请选择来源年度和目标年度'})
return
}
if (this.copySourceYear === this.copyTargetYear) {
this.$notify.warning({title: '提示', message: '来源年度和目标年度不能相同'})
return
}
const confirm = await this.$confirm('确定要将' + this.copySourceYear + '年度配置沿用到' + this.copyTargetYear + '年度吗?目标年度已有配置会被覆盖。', '提示', {
confirmButtonText: '确定',
cancelButtonText: '取消',
type: 'warning'
})
if (confirm !== 'confirm') return
this.$set(this, 'copyLoading', true)
try {
const resp = await $.post(loc() + '/copyByYear', {
sourceYear: this.copySourceYear,
targetYear: this.copyTargetYear
})
if (resp.code === 0 && resp.data) {
this.$notify.success({title: '成功', message: '已沿用年度配置'})
this.$set(this, 'copyDialogVisible', false)
this.$set(this, 'currentYear', this.copyTargetYear)
await this.findOne()
} else {
this.$notify.warning({title: '提示', message: resp.msg || '来源年度暂无可沿用配置'})
}
} finally {
this.$set(this, 'copyLoading', false)
}
},
async copyLastYear() {
if (this.formData.id) {
const confirm = await this.$confirm('当前年度已有配置,沿用去年配置会覆盖当前年度配置,是否继续?', '提示', {