Merge remote-tracking branch 'refs/remotes/origin/feature_洪启伟' into release_20260906
This commit is contained in:
Generated
+16
-1
@@ -1,6 +1,21 @@
|
|||||||
<?xml version="1.0" encoding="UTF-8"?>
|
<?xml version="1.0" encoding="UTF-8"?>
|
||||||
<project version="4">
|
<project version="4">
|
||||||
<component name="RemoteRepositoriesConfiguration">
|
<component name="RemoteRepositoriesConfiguration">
|
||||||
|
<remote-repository>
|
||||||
|
<option name="id" value="central" />
|
||||||
|
<option name="name" value="Central Repository" />
|
||||||
|
<option name="url" value="https://repo.maven.apache.org/maven2" />
|
||||||
|
</remote-repository>
|
||||||
|
<remote-repository>
|
||||||
|
<option name="id" value="nutz" />
|
||||||
|
<option name="name" value="nutz" />
|
||||||
|
<option name="url" value="https://jfrog.nutz.cn/artifactory/libs-release" />
|
||||||
|
</remote-repository>
|
||||||
|
<remote-repository>
|
||||||
|
<option name="id" value="nutz-snapshots" />
|
||||||
|
<option name="name" value="nutz-snapshots" />
|
||||||
|
<option name="url" value="https://jfrog.nutz.cn/artifactory/snapshots" />
|
||||||
|
</remote-repository>
|
||||||
<remote-repository>
|
<remote-repository>
|
||||||
<option name="id" value="central" />
|
<option name="id" value="central" />
|
||||||
<option name="name" value="Maven Central repository" />
|
<option name="name" value="Maven Central repository" />
|
||||||
@@ -27,4 +42,4 @@
|
|||||||
<option name="url" value="https://maven.aliyun.com/repository/public" />
|
<option name="url" value="https://maven.aliyun.com/repository/public" />
|
||||||
</remote-repository>
|
</remote-repository>
|
||||||
</component>
|
</component>
|
||||||
</project>
|
</project>
|
||||||
|
|||||||
Generated
+1
-2
@@ -1,7 +1,6 @@
|
|||||||
<?xml version="1.0" encoding="UTF-8"?>
|
<?xml version="1.0" encoding="UTF-8"?>
|
||||||
<project version="4">
|
<project version="4">
|
||||||
<component name="ExternalStorageConfigurationManager" enabled="true" />
|
<component name="ExternalStorageConfigurationManager" enabled="true" />
|
||||||
<component name="KubernetesApiProvider"><![CDATA[{}]]></component>
|
|
||||||
<component name="MavenProjectsManager">
|
<component name="MavenProjectsManager">
|
||||||
<option name="originalFiles">
|
<option name="originalFiles">
|
||||||
<list>
|
<list>
|
||||||
@@ -10,4 +9,4 @@
|
|||||||
</option>
|
</option>
|
||||||
</component>
|
</component>
|
||||||
<component name="ProjectRootManager" version="2" languageLevel="JDK_17" default="true" project-jdk-name="17" project-jdk-type="JavaSDK" />
|
<component name="ProjectRootManager" version="2" languageLevel="JDK_17" default="true" project-jdk-name="17" project-jdk-type="JavaSDK" />
|
||||||
</project>
|
</project>
|
||||||
|
|||||||
@@ -165,6 +165,60 @@ public class WelfareListController {
|
|||||||
welfareListService.exportXlsx(pageForm, response);
|
welfareListService.exportXlsx(pageForm, response);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 导出指定福利项目和套餐的报销表。
|
||||||
|
*
|
||||||
|
* @param projectId 福利项目 ID
|
||||||
|
* @param optionId 福利套餐 ID,必须属于 projectId 对应项目
|
||||||
|
* @param response XLSX 文件下载响应
|
||||||
|
*/
|
||||||
|
@At
|
||||||
|
@Ok("void")
|
||||||
|
@SaCheckPermission("welfare.list.mange")
|
||||||
|
@ApiOperation("导出福利报销表")
|
||||||
|
public void doExcelByOptionId(@Param("projectId") String projectId,
|
||||||
|
@Param("optionId") String optionId,
|
||||||
|
HttpServletResponse response) {
|
||||||
|
welfareListService.doExcelByOptionId(projectId, optionId, response);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 导出供货商使用的套餐选择数据,按套餐拆分工作表。
|
||||||
|
*
|
||||||
|
* @param projectId 福利项目 ID
|
||||||
|
* @param unionId 可选的分工会 ID;为空时按当前用户的数据权限导出
|
||||||
|
* @param response XLSX 文件下载响应
|
||||||
|
*/
|
||||||
|
@At
|
||||||
|
@Ok("void")
|
||||||
|
@SaCheckPermission("welfare.list.mange")
|
||||||
|
@ApiOperation("导出供货商选择数据")
|
||||||
|
public void exportSelectData(@Param("projectId") String projectId,
|
||||||
|
@Param("unionId") String unionId,
|
||||||
|
HttpServletResponse response) {
|
||||||
|
welfareListService.exportSelectData(projectId, unionId, response);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 导入供应商提供的快递单号文件。
|
||||||
|
*
|
||||||
|
* @param file XLS 或 XLSX 文件,包含工号与最多四个快递单号列
|
||||||
|
* @param projectId 福利项目 ID
|
||||||
|
* @param optionId 福利套餐 ID,必须属于 projectId 对应项目
|
||||||
|
* @return 导入结果;成功时返回成功提示,失败时返回具体原因
|
||||||
|
*/
|
||||||
|
@At
|
||||||
|
@Aop(TransAop.READ_COMMITTED)
|
||||||
|
@SaCheckPermission("welfare.list.mange")
|
||||||
|
@AdaptBy(type = UploadAdaptor.class, args = {"ioc:fileUpload"})
|
||||||
|
@SLog(tag = "福利名单管理", msg = "导入福利快递单号")
|
||||||
|
@ApiOperation("导入福利快递单号")
|
||||||
|
public Result importCourierNumber(@Param("file") TempFile file,
|
||||||
|
@Param("projectId") String projectId,
|
||||||
|
@Param("optionId") String optionId) {
|
||||||
|
return welfareListService.importCourierNumber(file, projectId, optionId);
|
||||||
|
}
|
||||||
|
|
||||||
@At
|
@At
|
||||||
@SaCheckPermission("welfare.list.mange")
|
@SaCheckPermission("welfare.list.mange")
|
||||||
@ApiOperation("编辑备注")
|
@ApiOperation("编辑备注")
|
||||||
|
|||||||
+2
-2
@@ -110,8 +110,8 @@ public class WelfareStatisticsController {
|
|||||||
@Ok("void")
|
@Ok("void")
|
||||||
@SaCheckPermission("welfare.statistics")
|
@SaCheckPermission("welfare.statistics")
|
||||||
@ApiOperation("按福利选项导出")
|
@ApiOperation("按福利选项导出")
|
||||||
public void exportByWelfareOptions(String projectId, HttpServletResponse response) {
|
public void exportByWelfareOptions(String projectId, String unionId, HttpServletResponse response) {
|
||||||
welfareStatisticsService.exportByWelfareOptions(projectId, response);
|
welfareStatisticsService.exportByWelfareOptions(projectId, unionId, response);
|
||||||
}
|
}
|
||||||
|
|
||||||
@At
|
@At
|
||||||
|
|||||||
@@ -30,9 +30,19 @@ public class WelfareExportEntityTc {
|
|||||||
@Excel(name = "已选福利", width = 80d)
|
@Excel(name = "已选福利", width = 80d)
|
||||||
private String optionName;
|
private String optionName;
|
||||||
|
|
||||||
@Excel(name = "收货信息", width = 100d)
|
// V4 原“收货信息”导出列保留字段,现按 V3 规则拆分为收货人、联系方式和收货地址。
|
||||||
|
// @Excel(name = "收货信息", width = 100d)
|
||||||
private String receiveAddress;
|
private String receiveAddress;
|
||||||
|
|
||||||
|
@Excel(name = "收货人", width = 15d)
|
||||||
|
private String recipient;
|
||||||
|
|
||||||
|
@Excel(name = "联系方式", width = 20d)
|
||||||
|
private String phone;
|
||||||
|
|
||||||
|
@Excel(name = "收货地址", width = 60d)
|
||||||
|
private String address;
|
||||||
|
|
||||||
@Excel(name = "快递单号", width = 40d)
|
@Excel(name = "快递单号", width = 40d)
|
||||||
private String courierNumber;
|
private String courierNumber;
|
||||||
|
|
||||||
|
|||||||
@@ -37,4 +37,10 @@ public class WelfareSelectionSituationPageForm extends PageForm {
|
|||||||
|
|
||||||
@ApiModelProperty("人员属性")
|
@ApiModelProperty("人员属性")
|
||||||
private String userAttribute;
|
private String userAttribute;
|
||||||
|
|
||||||
|
@ApiModelProperty("人员类型")
|
||||||
|
private String[] personTypes;
|
||||||
|
|
||||||
|
@ApiModelProperty("在职状态")
|
||||||
|
private String[] userStates;
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -13,10 +13,32 @@ import javax.servlet.http.HttpServletResponse;
|
|||||||
|
|
||||||
public interface WelfareListService extends BaseService<WelfareList> {
|
public interface WelfareListService extends BaseService<WelfareList> {
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 导出一个福利项目下指定套餐的报销表。
|
||||||
|
*
|
||||||
|
* @param projectId 福利项目 ID
|
||||||
|
* @param optionId 福利套餐 ID,必须属于指定福利项目
|
||||||
|
* @param response XLSX 文件下载响应
|
||||||
|
*/
|
||||||
void doExcelByOptionId(String projectId, String optionId, HttpServletResponse response);
|
void doExcelByOptionId(String projectId, String optionId, HttpServletResponse response);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 导出供应商所需的选择数据,并按套餐创建工作表。
|
||||||
|
*
|
||||||
|
* @param projectId 福利项目 ID
|
||||||
|
* @param unionId 可选的分工会 ID;为空时按当前登录人的数据范围导出
|
||||||
|
* @param response XLSX 文件下载响应
|
||||||
|
*/
|
||||||
void exportSelectData(String projectId, String unionId, HttpServletResponse response);
|
void exportSelectData(String projectId, String unionId, HttpServletResponse response);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 导入指定福利项目、套餐下的快递单号。
|
||||||
|
*
|
||||||
|
* @param file XLS 或 XLSX 文件,列为工号、姓名和最多四个快递单号
|
||||||
|
* @param projectId 福利项目 ID
|
||||||
|
* @param optionId 福利套餐 ID,必须属于指定福利项目
|
||||||
|
* @return 成功或失败的导入结果
|
||||||
|
*/
|
||||||
Result importCourierNumber(TempFile file, String projectId, String optionId);
|
Result importCourierNumber(TempFile file, String projectId, String optionId);
|
||||||
|
|
||||||
void doEditWelfareData(String editWelfareData, String welfareOptions);
|
void doEditWelfareData(String editWelfareData, String welfareOptions);
|
||||||
|
|||||||
@@ -62,7 +62,7 @@ public interface WelfareStatisticsService extends BaseService<WelfareProject> {
|
|||||||
* @param projectId
|
* @param projectId
|
||||||
* @param response
|
* @param response
|
||||||
*/
|
*/
|
||||||
void exportByWelfareOptions(String projectId, HttpServletResponse response);
|
void exportByWelfareOptions(String projectId, String unionId, HttpServletResponse response);
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* 导出汇总表
|
* 导出汇总表
|
||||||
|
|||||||
@@ -61,8 +61,17 @@ public class WelfareListServiceImpl extends BaseServiceImpl<WelfareList> impleme
|
|||||||
|
|
||||||
@Override
|
@Override
|
||||||
public void doExcelByOptionId(String projectId, String optionId, HttpServletResponse response) {
|
public void doExcelByOptionId(String projectId, String optionId, HttpServletResponse response) {
|
||||||
|
if (StrUtil.isBlank(projectId) || StrUtil.isBlank(optionId)) {
|
||||||
|
log.warn("导出报销表失败:福利项目或套餐不能为空");
|
||||||
|
return;
|
||||||
|
}
|
||||||
WelfareProject project = dao().fetch(WelfareProject.class, projectId);
|
WelfareProject project = dao().fetch(WelfareProject.class, projectId);
|
||||||
WelfareProjectSubjectOption subjectOption = dao().fetch(WelfareProjectSubjectOption.class, optionId);
|
WelfareProjectSubjectOption subjectOption = dao().fetch(WelfareProjectSubjectOption.class,
|
||||||
|
Cnd.where("id", "=", optionId).and("welfareId", "=", projectId));
|
||||||
|
if (project == null || subjectOption == null) {
|
||||||
|
log.warn("导出报销表失败:福利项目或套餐不存在,projectId={}, optionId={}", projectId, optionId);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
Sql sql = Sqls.create("""
|
Sql sql = Sqls.create("""
|
||||||
SELECT
|
SELECT
|
||||||
@@ -75,30 +84,35 @@ public class WelfareListServiceImpl extends BaseServiceImpl<WelfareList> impleme
|
|||||||
wpus.selectNum
|
wpus.selectNum
|
||||||
FROM
|
FROM
|
||||||
welfare_project_user_selection wpus
|
welfare_project_user_selection wpus
|
||||||
LEFT JOIN `welfare_list` wl ON wpus.selectUserId = wl.userId
|
INNER JOIN `welfare_list` wl ON wl.userId = wpus.selectUserId
|
||||||
|
AND wl.projectId = wpus.welfareId
|
||||||
LEFT JOIN `sys_user` u ON u.id = wl.userId
|
LEFT JOIN `sys_user` u ON u.id = wl.userId
|
||||||
LEFT JOIN sys_union un ON un.id = wl.welfareUnitId
|
LEFT JOIN sys_union un ON un.id = wl.welfareUnionId
|
||||||
LEFT JOIN sys_unit it ON it.id = wl.welfareSecondLevelUnitId
|
LEFT JOIN sys_unit it ON it.id = wl.welfareUnitId
|
||||||
WHERE
|
WHERE
|
||||||
wl.projectId = @welfareId
|
wpus.welfareId = @welfareId
|
||||||
AND wpus.selectOptionId = @selectOptionId and wpus.selectNum!=0
|
AND wpus.selectOptionId = @selectOptionId
|
||||||
|
AND IFNULL(wpus.selectNum, 0) <> 0
|
||||||
|
ORDER BY wl.welfareUnionName, wl.welfareUnitName, u.loginname
|
||||||
""").setParam("welfareId", projectId).setParam("selectOptionId", optionId);
|
""").setParam("welfareId", projectId).setParam("selectOptionId", optionId);
|
||||||
|
|
||||||
List<NutMap> mapList = listMap(sql);
|
List<NutMap> mapList = listMap(sql);
|
||||||
|
|
||||||
List<String> userId = mapList.stream().map(m -> m.getString("id")).collect(Collectors.toList());
|
List<String> userId = mapList.stream().map(m -> m.getString("id")).collect(Collectors.toList());
|
||||||
|
|
||||||
List<WelfareCourierNumber> courierNumberList = dao().query(WelfareCourierNumber.class,
|
List<WelfareCourierNumber> courierNumberList = userId.isEmpty()
|
||||||
|
? Collections.emptyList()
|
||||||
|
: dao().query(WelfareCourierNumber.class,
|
||||||
Cnd.where("selectUserId", "in", userId)
|
Cnd.where("selectUserId", "in", userId)
|
||||||
.and("welfareId", "=", projectId)
|
.and("welfareId", "=", projectId)
|
||||||
.and("selectOptionId", "=", optionId));
|
.and("selectOptionId", "=", optionId)
|
||||||
|
.asc("createdAt"));
|
||||||
|
|
||||||
List<String> nameList = List.of("one", "two", "three", "four");
|
List<String> nameList = List.of("one", "two", "three", "four");
|
||||||
for (NutMap map : mapList) {
|
for (NutMap map : mapList) {
|
||||||
List<WelfareCourierNumber> userCourierNumbers = courierNumberList.stream()
|
List<WelfareCourierNumber> userCourierNumbers = courierNumberList.stream()
|
||||||
.filter(c -> c.getSelectUserId().equals(map.getString("id"))).collect(Collectors.toList());
|
.filter(c -> c.getSelectUserId().equals(map.getString("id"))).collect(Collectors.toList());
|
||||||
for (int i = 0; i < userCourierNumbers.size(); i++) {
|
for (int i = 0; i < userCourierNumbers.size() && i < nameList.size(); i++) {
|
||||||
map.setv(nameList.get(i) + "CourierNumber", userCourierNumbers.get(i).getCourierNumber());
|
map.setv(nameList.get(i) + "CourierNumber", userCourierNumbers.get(i).getCourierNumber());
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -138,14 +152,13 @@ public class WelfareListServiceImpl extends BaseServiceImpl<WelfareList> impleme
|
|||||||
exportParams.setSheetName(un);
|
exportParams.setSheetName(un);
|
||||||
service.createSheetForMap(workbook, exportParams, exportEntities, v);
|
service.createSheetForMap(workbook, exportParams, exportEntities, v);
|
||||||
}*/
|
}*/
|
||||||
try {
|
ExportParams exportParams = new ExportParams();
|
||||||
ExportParams exportParams = new ExportParams();
|
exportParams.setType(ExcelType.XSSF);
|
||||||
exportParams.setType(ExcelType.XSSF);
|
exportParams.setTitle(project.getName() + subjectOption.getOptionName() + "报销表");
|
||||||
exportParams.setTitle(project.getName() + subjectOption.getOptionName() + "发放名单");
|
try (Workbook workbook = ExcelExportUtil.exportExcel(exportParams, exportEntities, mapList)) {
|
||||||
Workbook workbook = ExcelExportUtil.exportExcel(exportParams, exportEntities, mapList);
|
|
||||||
CommonDownloadUtil.download(project.getName() + subjectOption.getOptionName() + ".xlsx", workbook, response);
|
CommonDownloadUtil.download(project.getName() + subjectOption.getOptionName() + ".xlsx", workbook, response);
|
||||||
} catch (Exception e) {
|
} catch (Exception e) {
|
||||||
e.printStackTrace();
|
log.error("导出报销表失败,projectId={}, optionId={}", projectId, optionId, e);
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
@@ -153,6 +166,10 @@ public class WelfareListServiceImpl extends BaseServiceImpl<WelfareList> impleme
|
|||||||
@Override
|
@Override
|
||||||
public void exportSelectData(String projectId, String unionId, HttpServletResponse response) {
|
public void exportSelectData(String projectId, String unionId, HttpServletResponse response) {
|
||||||
WelfareProject welfareProject = dao().fetch(WelfareProject.class, Cnd.where("id", "=", projectId));
|
WelfareProject welfareProject = dao().fetch(WelfareProject.class, Cnd.where("id", "=", projectId));
|
||||||
|
if (welfareProject == null) {
|
||||||
|
log.warn("导出供货商选择数据失败:福利项目不存在,projectId={}", projectId);
|
||||||
|
return;
|
||||||
|
}
|
||||||
String projectName = welfareProject.getName();
|
String projectName = welfareProject.getName();
|
||||||
Cnd cnd = Cnd.NEW();
|
Cnd cnd = Cnd.NEW();
|
||||||
Sql sql = Sqls.create("""
|
Sql sql = Sqls.create("""
|
||||||
@@ -170,16 +187,18 @@ public class WelfareListServiceImpl extends BaseServiceImpl<WelfareList> impleme
|
|||||||
left join `sys_user` u on u.id = wpus.selectUserId
|
left join `sys_user` u on u.id = wpus.selectUserId
|
||||||
left join welfare_project_subject_option wpso on wpso.id = wpus.selectOptionId
|
left join welfare_project_subject_option wpso on wpso.id = wpus.selectOptionId
|
||||||
left join welfare_list wl on wl.userId = wpus.selectUserId and wl.projectId=wpus.welfareId
|
left join welfare_list wl on wl.userId = wpus.selectUserId and wl.projectId=wpus.welfareId
|
||||||
LEFT JOIN sys_union un ON un.id = wl.welfareUnitId
|
LEFT JOIN sys_union un ON un.id = wl.welfareUnionId
|
||||||
LEFT JOIN sys_unit it ON it.id = wl.welfareSecondLevelUnitId
|
LEFT JOIN sys_unit it ON it.id = wl.welfareUnitId
|
||||||
$condition
|
$condition
|
||||||
""");
|
""");
|
||||||
cnd.and("wpus.welfareId", "=", projectId);
|
cnd.and("wpus.welfareId", "=", projectId);
|
||||||
|
|
||||||
if (!AuthUtil.hasRoleOr(RoleConstant.SYSADMIN.name(), RoleConstant.SCHOOL_UNION_ADMIN.name(), RoleConstant.SCHOOL_UNION_WELFARE_ADMIN.name())) {
|
if (AuthUtil.hasRole(RoleConstant.BRANCH_UNION_CHAIRMAN.name())
|
||||||
cnd.and("wl.welfareUnitId", "=", SecurityUtil.getUnionId());
|
|| AuthUtil.hasRole(RoleConstant.BRANCH_UNION_ADMIN.name())
|
||||||
|
|| AuthUtil.hasRole(RoleConstant.BRANCH_UNION_WENTI_SPORTS.name())) {
|
||||||
|
cnd.and("wl.welfareUnionId", "=", SecurityUtil.getUnionId());
|
||||||
}
|
}
|
||||||
cnd.andEX("wl.welfareUnitId", "=", unionId);
|
cnd.andEX("wl.welfareUnionId", "=", unionId);
|
||||||
cnd.groupBy("wpus.selectUserId", "wpus.selectOptionId");
|
cnd.groupBy("wpus.selectUserId", "wpus.selectOptionId");
|
||||||
cnd.asc("it.unitcode");
|
cnd.asc("it.unitcode");
|
||||||
sql.setCondition(cnd);
|
sql.setCondition(cnd);
|
||||||
@@ -207,12 +226,21 @@ public class WelfareListServiceImpl extends BaseServiceImpl<WelfareList> impleme
|
|||||||
try {
|
try {
|
||||||
CommonDownloadUtil.download(projectName + ".xlsx", workbook, response);
|
CommonDownloadUtil.download(projectName + ".xlsx", workbook, response);
|
||||||
} catch (Exception e) {
|
} catch (Exception e) {
|
||||||
e.printStackTrace();
|
log.error("导出供货商选择数据失败,projectId={}", projectId, e);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
|
@Aop(TransAop.READ_COMMITTED)
|
||||||
public Result importCourierNumber(TempFile file, String projectId, String optionId) {
|
public Result importCourierNumber(TempFile file, String projectId, String optionId) {
|
||||||
|
if (StrUtil.isBlank(projectId) || StrUtil.isBlank(optionId)) {
|
||||||
|
return Result.error("福利项目和套餐不能为空");
|
||||||
|
}
|
||||||
|
WelfareProjectSubjectOption subjectOption = dao().fetch(WelfareProjectSubjectOption.class,
|
||||||
|
Cnd.where("id", "=", optionId).and("welfareId", "=", projectId));
|
||||||
|
if (subjectOption == null) {
|
||||||
|
return Result.error("福利套餐不存在或不属于当前福利项目");
|
||||||
|
}
|
||||||
if (Lang.isEmpty(file)) {
|
if (Lang.isEmpty(file)) {
|
||||||
return Result.error("上传的文件不能为空");
|
return Result.error("上传的文件不能为空");
|
||||||
}
|
}
|
||||||
@@ -226,7 +254,7 @@ public class WelfareListServiceImpl extends BaseServiceImpl<WelfareList> impleme
|
|||||||
ImportParams importParams = new ImportParams();
|
ImportParams importParams = new ImportParams();
|
||||||
excelList = ExcelImportUtil.importExcel(file.getFile(), CourierNumberExcelMode.class, importParams);
|
excelList = ExcelImportUtil.importExcel(file.getFile(), CourierNumberExcelMode.class, importParams);
|
||||||
} catch (Exception e) {
|
} catch (Exception e) {
|
||||||
e.printStackTrace();
|
log.warn("读取快递单号导入文件失败", e);
|
||||||
return Result.error("读取不到数据,请检查excel文件格式");
|
return Result.error("读取不到数据,请检查excel文件格式");
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -236,7 +264,7 @@ public class WelfareListServiceImpl extends BaseServiceImpl<WelfareList> impleme
|
|||||||
|
|
||||||
try {
|
try {
|
||||||
if (excelList.stream().anyMatch(v -> StrUtil.isBlank(v.getLoginName()))) {
|
if (excelList.stream().anyMatch(v -> StrUtil.isBlank(v.getLoginName()))) {
|
||||||
return Result.error("工号和快递单号不能为空");
|
return Result.error("工号不能为空");
|
||||||
}
|
}
|
||||||
|
|
||||||
List<CourierNumberExcelMode> filterExcelList = excelList.stream().collect(Collectors.collectingAndThen(
|
List<CourierNumberExcelMode> filterExcelList = excelList.stream().collect(Collectors.collectingAndThen(
|
||||||
@@ -249,6 +277,9 @@ public class WelfareListServiceImpl extends BaseServiceImpl<WelfareList> impleme
|
|||||||
Sql loginNameSql = Sqls.create("select id,loginname from sys_user where loginname in (@loginNameList)");
|
Sql loginNameSql = Sqls.create("select id,loginname from sys_user where loginname in (@loginNameList)");
|
||||||
loginNameSql.setParam("loginNameList", loginNameList);
|
loginNameSql.setParam("loginNameList", loginNameList);
|
||||||
List<NutMap> loginNameMaps = listMap(loginNameSql);
|
List<NutMap> loginNameMaps = listMap(loginNameSql);
|
||||||
|
if (loginNameMaps.isEmpty()) {
|
||||||
|
return Result.error("Excel中的工号均未匹配到系统用户");
|
||||||
|
}
|
||||||
|
|
||||||
List<String> userIds = loginNameMaps.stream().map(v -> v.getString("id")).collect(Collectors.toList());
|
List<String> userIds = loginNameMaps.stream().map(v -> v.getString("id")).collect(Collectors.toList());
|
||||||
|
|
||||||
@@ -291,12 +322,13 @@ public class WelfareListServiceImpl extends BaseServiceImpl<WelfareList> impleme
|
|||||||
welfareCourierNumbers.add(courierNumber);
|
welfareCourierNumbers.add(courierNumber);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
insert(welfareCourierNumbers);
|
if (!welfareCourierNumbers.isEmpty()) {
|
||||||
|
insert(welfareCourierNumbers);
|
||||||
|
}
|
||||||
|
|
||||||
return Result.success("导入成功");
|
return Result.success("导入成功");
|
||||||
} catch (Exception e) {
|
} catch (Exception e) {
|
||||||
|
log.error("导入快递单号失败,projectId={}, optionId={}", projectId, optionId, e);
|
||||||
e.printStackTrace();
|
|
||||||
return Result.error("导入快递单号失败");
|
return Result.error("导入快递单号失败");
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -685,12 +717,10 @@ public class WelfareListServiceImpl extends BaseServiceImpl<WelfareList> impleme
|
|||||||
t2.loginname,
|
t2.loginname,
|
||||||
t2.username,
|
t2.username,
|
||||||
t2.sex,
|
t2.sex,
|
||||||
DATE_FORMAT(t2.birthday, '%Y-%m-%d') AS birthday,
|
DATE_FORMAT(t2.birthday, '%Y-%m-%d') AS birthday
|
||||||
threeUnit.name AS threeUnitName
|
|
||||||
FROM
|
FROM
|
||||||
`welfare_list` t1
|
`welfare_list` t1
|
||||||
LEFT JOIN sys_user t2 ON t2.id = t1.userId
|
LEFT JOIN sys_user t2 ON t2.id = t1.userId
|
||||||
LEFT JOIN sys_unit threeUnit ON threeUnit.id = t2.threeUnitId
|
|
||||||
$condition
|
$condition
|
||||||
""");
|
""");
|
||||||
Cnd cnd = Cnd.NEW();
|
Cnd cnd = Cnd.NEW();
|
||||||
@@ -735,7 +765,6 @@ public class WelfareListServiceImpl extends BaseServiceImpl<WelfareList> impleme
|
|||||||
entities.add(new ExcelExportEntity("在职状态", "userState", 20));
|
entities.add(new ExcelExportEntity("在职状态", "userState", 20));
|
||||||
entities.add(new ExcelExportEntity("所属工会", "welfareUnionName", 20));
|
entities.add(new ExcelExportEntity("所属工会", "welfareUnionName", 20));
|
||||||
entities.add(new ExcelExportEntity("所属单位", "welfareUnitName", 20));
|
entities.add(new ExcelExportEntity("所属单位", "welfareUnitName", 20));
|
||||||
entities.add(new ExcelExportEntity("三级单位", "threeUnitName", 20));
|
|
||||||
entities.add(new ExcelExportEntity("备注", "remark", 20));
|
entities.add(new ExcelExportEntity("备注", "remark", 20));
|
||||||
|
|
||||||
// 设置导出参数
|
// 设置导出参数
|
||||||
|
|||||||
+22
-15
@@ -169,6 +169,8 @@ public class WelfareSelectionSituationServiceImpl extends BaseServiceImpl<Welfar
|
|||||||
cnd.andEX("t2.selectOptionId", "=", pageForm.getWelfareOptionId());
|
cnd.andEX("t2.selectOptionId", "=", pageForm.getWelfareOptionId());
|
||||||
cnd.andEX("t4.aidFundMemberUserType", "=", pageForm.getAidFundMemberUserType());
|
cnd.andEX("t4.aidFundMemberUserType", "=", pageForm.getAidFundMemberUserType());
|
||||||
cnd.andEX("t4.userAttribute", "=", pageForm.getUserAttribute());
|
cnd.andEX("t4.userAttribute", "=", pageForm.getUserAttribute());
|
||||||
|
cnd.andEX("t1.personType", "in", pageForm.getPersonTypes());
|
||||||
|
cnd.andEX("t1.userState", "in", pageForm.getUserStates());
|
||||||
if (StrUtil.isNotBlank(pageForm.getUserName())) {
|
if (StrUtil.isNotBlank(pageForm.getUserName())) {
|
||||||
cnd.where().andLike("t4.username", pageForm.getUserName());
|
cnd.where().andLike("t4.username", pageForm.getUserName());
|
||||||
}
|
}
|
||||||
@@ -221,6 +223,8 @@ public class WelfareSelectionSituationServiceImpl extends BaseServiceImpl<Welfar
|
|||||||
}
|
}
|
||||||
cnd.andEX("t1.welfareUnitId", "in", pageForm.getUnitIds());
|
cnd.andEX("t1.welfareUnitId", "in", pageForm.getUnitIds());
|
||||||
cnd.andEX("t1.welfareUnionId", "=", pageForm.getUnionId());
|
cnd.andEX("t1.welfareUnionId", "=", pageForm.getUnionId());
|
||||||
|
cnd.andEX("t1.personType", "in", pageForm.getPersonTypes());
|
||||||
|
cnd.andEX("t1.userState", "in", pageForm.getUserStates());
|
||||||
|
|
||||||
if (pageForm.getIsSelect() != null) {
|
if (pageForm.getIsSelect() != null) {
|
||||||
if (pageForm.getIsSelect()) {
|
if (pageForm.getIsSelect()) {
|
||||||
@@ -308,26 +312,29 @@ public class WelfareSelectionSituationServiceImpl extends BaseServiceImpl<Welfar
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
if (map.get("userSign") != null){
|
if (StrUtil.isNotBlank(map.getString("userSign"))){
|
||||||
|
String userSignPath = map.getString("userSign");
|
||||||
try {
|
try {
|
||||||
Sys_file file = dao().fetch(Sys_file.class, Cnd.where(Sys_file::getDownloadPath, "=", map.getString("userSign")));
|
Sys_file file = dao().fetch(Sys_file.class, Cnd.where(Sys_file::getDownloadPath, "=", userSignPath));
|
||||||
|
if (file == null) {
|
||||||
|
// 签字路径没有对应文件记录时保留人员数据,仅将签字单元格导出为空。
|
||||||
|
map.put("userSign", null);
|
||||||
|
log.warn("领取表导出未找到签字文件记录,userId={}, userSign={}", map.getString("userId"), userSignPath);
|
||||||
|
continue;
|
||||||
|
}
|
||||||
byte[] userSignBytes = SysFileMinIoUtil.getFileBytes(file.getBucket(), file.getStoragePath());
|
byte[] userSignBytes = SysFileMinIoUtil.getFileBytes(file.getBucket(), file.getStoragePath());
|
||||||
map.put("userSign", userSignBytes);
|
map.put("userSign", userSignBytes);
|
||||||
}catch (Exception e){
|
}catch (Exception e){
|
||||||
e.printStackTrace();
|
// 签字文件读取异常不能阻断整张领取表导出,当前人员签字留空。
|
||||||
log.error("下载图片失败", e);
|
map.put("userSign", null);
|
||||||
|
log.warn("领取表导出签字文件读取失败,userId={}", map.getString("userId"), e);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
List<Map<String, Object>> safeList = list.stream().map(nutMap -> {
|
// 保留 NutMap 数据结构,避免 EasyPOI 在 Java 17 下反射普通 HashMap 导致工作表创建失败。
|
||||||
Map<String, Object> map = new HashMap<>(nutMap);
|
Map<String, List<NutMap>> listMap = list.stream()
|
||||||
return map;
|
.collect(Collectors.groupingBy(n -> n.getString("welfareUnionName")));
|
||||||
}).toList();
|
|
||||||
|
|
||||||
// 分组
|
|
||||||
Map<String, List<Map<String, Object>>> listMap = safeList.stream()
|
|
||||||
.collect(Collectors.groupingBy(n -> (String) n.get("welfareUnionName")));
|
|
||||||
|
|
||||||
// 构建 Excel 列
|
// 构建 Excel 列
|
||||||
List<ExcelExportEntity> entities = new ArrayList<>();
|
List<ExcelExportEntity> entities = new ArrayList<>();
|
||||||
@@ -342,16 +349,16 @@ public class WelfareSelectionSituationServiceImpl extends BaseServiceImpl<Welfar
|
|||||||
entities.add(userSignEntity);
|
entities.add(userSignEntity);
|
||||||
|
|
||||||
// 导出
|
// 导出
|
||||||
Workbook workbook = new HSSFWorkbook();
|
Workbook workbook = new XSSFWorkbook();
|
||||||
listMap.forEach((k, v) -> {
|
listMap.forEach((k, v) -> {
|
||||||
ExcelExportService service = new ExcelExportService();
|
ExcelExportService service = new ExcelExportService();
|
||||||
ExportParams exportParams = new ExportParams();
|
ExportParams exportParams = new ExportParams();
|
||||||
exportParams.setSheetName(k);
|
exportParams.setSheetName(k);
|
||||||
exportParams.setType(ExcelType.HSSF);
|
exportParams.setType(ExcelType.XSSF);
|
||||||
service.createSheetForMap(workbook, exportParams, entities, v);
|
service.createSheetForMap(workbook, exportParams, entities, v);
|
||||||
});
|
});
|
||||||
|
|
||||||
CommonDownloadUtil.download("领取表.xls", workbook, response);
|
CommonDownloadUtil.download("领取表.xlsx", workbook, response);
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
|||||||
+158
-14
@@ -4,11 +4,14 @@ import cn.afterturn.easypoi.excel.ExcelExportUtil;
|
|||||||
import cn.afterturn.easypoi.excel.entity.ExportParams;
|
import cn.afterturn.easypoi.excel.entity.ExportParams;
|
||||||
import cn.afterturn.easypoi.excel.entity.enmus.ExcelType;
|
import cn.afterturn.easypoi.excel.entity.enmus.ExcelType;
|
||||||
import cn.afterturn.easypoi.excel.entity.params.ExcelExportEntity;
|
import cn.afterturn.easypoi.excel.entity.params.ExcelExportEntity;
|
||||||
|
import cn.afterturn.easypoi.excel.export.ExcelExportService;
|
||||||
import cn.hutool.core.util.StrUtil;
|
import cn.hutool.core.util.StrUtil;
|
||||||
import cn.hutool.json.JSONUtil;
|
import cn.hutool.json.JSONUtil;
|
||||||
import com.budwk.app.base.constant.RoleConstant;
|
import com.budwk.app.base.constant.RoleConstant;
|
||||||
import com.budwk.app.base.service.impl.BaseServiceImpl;
|
import com.budwk.app.base.service.impl.BaseServiceImpl;
|
||||||
import com.budwk.app.base.utils.CommonDownloadUtil;
|
import com.budwk.app.base.utils.CommonDownloadUtil;
|
||||||
|
import com.budwk.app.sys.models.Sys_file;
|
||||||
|
import com.budwk.app.sys.utils.SysFileMinIoUtil;
|
||||||
import com.budwk.app.web.commons.auth.utils.AuthUtil;
|
import com.budwk.app.web.commons.auth.utils.AuthUtil;
|
||||||
import com.budwk.app.web.commons.auth.utils.SecurityUtil;
|
import com.budwk.app.web.commons.auth.utils.SecurityUtil;
|
||||||
import com.budwk.app.zhgh.welfare.mode.WelfareExportEntityTc;
|
import com.budwk.app.zhgh.welfare.mode.WelfareExportEntityTc;
|
||||||
@@ -31,9 +34,7 @@ import org.nutz.lang.util.NutMap;
|
|||||||
|
|
||||||
import javax.servlet.http.HttpServletResponse;
|
import javax.servlet.http.HttpServletResponse;
|
||||||
import java.io.ByteArrayOutputStream;
|
import java.io.ByteArrayOutputStream;
|
||||||
import java.util.ArrayList;
|
import java.util.*;
|
||||||
import java.util.Date;
|
|
||||||
import java.util.List;
|
|
||||||
import java.util.stream.Collectors;
|
import java.util.stream.Collectors;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@@ -159,9 +160,10 @@ public class WelfareSingleServiceImpl extends BaseServiceImpl implements Welfare
|
|||||||
u.unitname AS unitName,
|
u.unitname AS unitName,
|
||||||
u.unionname AS unionName,
|
u.unionname AS unionName,
|
||||||
u.mobile,
|
u.mobile,
|
||||||
IF(LOCATE('undefined',wpus.receiveAddress)>0,NULL,wpus.receiveAddress) as receiveAddress,
|
IF(LOCATE('undefined',wpus.receiveAddress)>0,NULL,wpus.receiveAddress) as receiveAddress,
|
||||||
GROUP_CONCAT(DISTINCT wpso.optionName ,'(',wpus.selectNum,'份)') optionName,
|
GROUP_CONCAT(DISTINCT wpso.optionName ,'(',wpus.selectNum,'份)') optionName,
|
||||||
wpus.courierNumber
|
wpus.courierNumber,
|
||||||
|
MAX(wpus.userSign) userSign
|
||||||
FROM
|
FROM
|
||||||
welfare_project_user_selection wpus
|
welfare_project_user_selection wpus
|
||||||
LEFT JOIN `vw_user` u ON u.id = wpus.selectUserId
|
LEFT JOIN `vw_user` u ON u.id = wpus.selectUserId
|
||||||
@@ -183,6 +185,8 @@ public class WelfareSingleServiceImpl extends BaseServiceImpl implements Welfare
|
|||||||
|
|
||||||
@Override
|
@Override
|
||||||
public Workbook exportReceiveDetail(String projectId, String unionId) {
|
public Workbook exportReceiveDetail(String projectId, String unionId) {
|
||||||
|
// V4 原横向套餐签领表逻辑保留,当前按 V3 的“每个套餐一个工作表”格式执行。
|
||||||
|
if (false) {
|
||||||
|
|
||||||
Sql optionSql = Sqls.create("""
|
Sql optionSql = Sqls.create("""
|
||||||
SELECT w2.id, w2.optionName
|
SELECT w2.id, w2.optionName
|
||||||
@@ -282,9 +286,148 @@ public class WelfareSingleServiceImpl extends BaseServiceImpl implements Welfare
|
|||||||
Workbook workbook = ExcelExportUtil.exportExcel(exportParams, exportEntities, dataList);
|
Workbook workbook = ExcelExportUtil.exportExcel(exportParams, exportEntities, dataList);
|
||||||
|
|
||||||
return workbook;
|
return workbook;
|
||||||
|
}
|
||||||
|
return exportReceiveDetailV3(projectId, unionId);
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 生成参考项目格式的分工会福利签领表:一个工作表展示人员、套餐份数和签字,并在末行汇总套餐份数。
|
||||||
|
*
|
||||||
|
* @param projectId 福利项目ID
|
||||||
|
* @param unionId 分工会ID
|
||||||
|
* @return XLSX工作簿
|
||||||
|
*/
|
||||||
|
private Workbook exportReceiveDetailV3(String projectId, String unionId) {
|
||||||
|
Sql optionSql = Sqls.create("""
|
||||||
|
SELECT id, optionName
|
||||||
|
FROM welfare_project_subject_option
|
||||||
|
WHERE welfareId = @projectId
|
||||||
|
ORDER BY optionSort, id
|
||||||
|
""");
|
||||||
|
optionSql.setParam("projectId", projectId);
|
||||||
|
List<NutMap> options = listMap(optionSql);
|
||||||
|
|
||||||
|
Sql sql = Sqls.create("""
|
||||||
|
SELECT
|
||||||
|
wl.userId,
|
||||||
|
u.username AS userName,
|
||||||
|
u.loginname AS loginName,
|
||||||
|
wl.welfareUnitName AS unitName,
|
||||||
|
wpus.userSign,
|
||||||
|
wpus.selectOptionId,
|
||||||
|
wpus.selectNum
|
||||||
|
FROM welfare_list wl
|
||||||
|
LEFT JOIN sys_user u ON u.id = wl.userId
|
||||||
|
LEFT JOIN welfare_project_user_selection wpus ON wpus.selectUserId = wl.userId
|
||||||
|
AND wpus.welfareId = wl.projectId
|
||||||
|
WHERE wl.projectId = @projectId AND wl.welfareUnionId = @unionId
|
||||||
|
ORDER BY wl.welfareUnitName, u.loginname, wpus.selectOptionId
|
||||||
|
""");
|
||||||
|
sql.setParam("projectId", projectId);
|
||||||
|
sql.setParam("unionId", unionId);
|
||||||
|
List<NutMap> rows = listMap(sql);
|
||||||
|
rows.forEach(this::fillUserSign);
|
||||||
|
|
||||||
|
Map<String, List<NutMap>> userRows = rows.stream().collect(Collectors.groupingBy(
|
||||||
|
row -> row.getString("userId"), LinkedHashMap::new, Collectors.toList()));
|
||||||
|
List<NutMap> exportRows = new ArrayList<>();
|
||||||
|
int index = 1;
|
||||||
|
for (List<NutMap> selectedRows : userRows.values()) {
|
||||||
|
NutMap userRow = selectedRows.get(0);
|
||||||
|
NutMap exportRow = NutMap.NEW();
|
||||||
|
exportRow.put("no", index++);
|
||||||
|
exportRow.put("userName", userRow.getString("userName"));
|
||||||
|
exportRow.put("loginName", userRow.getString("loginName"));
|
||||||
|
exportRow.put("unitName", userRow.getString("unitName"));
|
||||||
|
exportRow.put("qzBytes", selectedRows.stream()
|
||||||
|
.map(row -> row.get("qzBytes"))
|
||||||
|
.filter(Objects::nonNull)
|
||||||
|
.findFirst()
|
||||||
|
.orElse(null));
|
||||||
|
for (NutMap option : options) {
|
||||||
|
int selectNum = selectedRows.stream()
|
||||||
|
.filter(row -> option.getString("id").equals(row.getString("selectOptionId")))
|
||||||
|
.mapToInt(row -> row.getInt("selectNum", 0))
|
||||||
|
.sum();
|
||||||
|
exportRow.put(option.getString("id"), selectNum);
|
||||||
|
}
|
||||||
|
exportRows.add(exportRow);
|
||||||
|
}
|
||||||
|
|
||||||
|
NutMap totalRow = NutMap.NEW();
|
||||||
|
totalRow.put("no", "合计");
|
||||||
|
for (NutMap option : options) {
|
||||||
|
int total = rows.stream()
|
||||||
|
.filter(row -> option.getString("id").equals(row.getString("selectOptionId")))
|
||||||
|
.mapToInt(row -> row.getInt("selectNum", 0))
|
||||||
|
.sum();
|
||||||
|
totalRow.put(option.getString("id"), total);
|
||||||
|
}
|
||||||
|
exportRows.add(totalRow);
|
||||||
|
|
||||||
|
List<ExcelExportEntity> entities = new ArrayList<>();
|
||||||
|
entities.add(new ExcelExportEntity("序号", "no", 10));
|
||||||
|
entities.add(new ExcelExportEntity("姓名", "userName", 15));
|
||||||
|
entities.add(new ExcelExportEntity("工号", "loginName", 18));
|
||||||
|
ExcelExportEntity unitEntity = new ExcelExportEntity("所在单位", "unitName", 25);
|
||||||
|
unitEntity.setWrap(true);
|
||||||
|
entities.add(unitEntity);
|
||||||
|
for (NutMap option : options) {
|
||||||
|
entities.add(new ExcelExportEntity(option.getString("optionName"), option.getString("id"), 12));
|
||||||
|
}
|
||||||
|
ExcelExportEntity signEntity = new ExcelExportEntity("签字", "qzBytes", 20);
|
||||||
|
signEntity.setType(2);
|
||||||
|
signEntity.setExportImageType(2);
|
||||||
|
entities.add(signEntity);
|
||||||
|
|
||||||
|
ExportParams exportParams = new ExportParams();
|
||||||
|
exportParams.setType(ExcelType.XSSF);
|
||||||
|
return ExcelExportUtil.exportExcel(exportParams, entities, exportRows);
|
||||||
|
}
|
||||||
|
|
||||||
|
/** 从 V4 文件存储读取签名图片,历史文件缺失时保留空白签字格。 */
|
||||||
|
private void fillUserSign(NutMap row) {
|
||||||
|
String userSign = row.getString("userSign");
|
||||||
|
if (StrUtil.isBlank(userSign)) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
try {
|
||||||
|
Sys_file file = dao().fetch(Sys_file.class, Cnd.where(Sys_file::getDownloadPath, "=", userSign));
|
||||||
|
if (file != null) {
|
||||||
|
row.put("qzBytes", SysFileMinIoUtil.getFileBytes(file.getBucket(), file.getStoragePath()));
|
||||||
|
}
|
||||||
|
} catch (Exception ignored) {
|
||||||
|
// 单个签名文件异常不能影响整份签领表导出。
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/** 身份证仅显示前段信息,保持 V3 签领表的脱敏规则。 */
|
||||||
|
private String maskIdCard(String idCard) {
|
||||||
|
if (StrUtil.isBlank(idCard) || idCard.length() <= 4) {
|
||||||
|
return idCard;
|
||||||
|
}
|
||||||
|
return idCard.substring(0, idCard.length() - 4) + "****";
|
||||||
|
}
|
||||||
|
|
||||||
|
/** 将历史收货信息拆为 V3 名单所需的收货人、联系方式和收货地址字段。 */
|
||||||
|
private void fillV3ReceiveAddress(NutMap row) {
|
||||||
|
String receiveAddress = row.getString("receiveAddress");
|
||||||
|
if (StrUtil.isBlank(receiveAddress)) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
Map<String, String> values = new HashMap<>();
|
||||||
|
for (String pair : receiveAddress.split("[,,]")) {
|
||||||
|
String[] keyValue = pair.split("[::]", 2);
|
||||||
|
if (keyValue.length == 2) {
|
||||||
|
values.put(keyValue[0].trim(), keyValue[1].trim());
|
||||||
|
}
|
||||||
|
}
|
||||||
|
row.put("recipient", values.get("收件人"));
|
||||||
|
row.put("phone", values.get("联系方式"));
|
||||||
|
row.put("address", values.get("收货地址"));
|
||||||
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public Object unclaimedData(String projectId, String unionId, Integer pageNumber, Integer pageSize) {
|
public Object unclaimedData(String projectId, String unionId, Integer pageNumber, Integer pageSize) {
|
||||||
|
|
||||||
@@ -333,6 +476,7 @@ public class WelfareSingleServiceImpl extends BaseServiceImpl implements Welfare
|
|||||||
}
|
}
|
||||||
|
|
||||||
List<NutMap> list2 = list.stream().filter(v -> Strings.isNotBlank(v.getString("unionName"))).collect(Collectors.toList());
|
List<NutMap> list2 = list.stream().filter(v -> Strings.isNotBlank(v.getString("unionName"))).collect(Collectors.toList());
|
||||||
|
list2.forEach(this::fillV3ReceiveAddress);
|
||||||
|
|
||||||
List<WelfareExportEntityTc> welfareExportEntityTcList = list2.stream()
|
List<WelfareExportEntityTc> welfareExportEntityTcList = list2.stream()
|
||||||
.map(map -> JSONUtil.toBean(Json.toJson(map), WelfareExportEntityTc.class))
|
.map(map -> JSONUtil.toBean(Json.toJson(map), WelfareExportEntityTc.class))
|
||||||
@@ -340,15 +484,15 @@ public class WelfareSingleServiceImpl extends BaseServiceImpl implements Welfare
|
|||||||
|
|
||||||
welfareExportEntityTcList.forEach(v -> {
|
welfareExportEntityTcList.forEach(v -> {
|
||||||
if (StrUtil.isNotBlank(v.getUserSign())) {
|
if (StrUtil.isNotBlank(v.getUserSign())) {
|
||||||
ByteArrayOutputStream signOs = new ByteArrayOutputStream();
|
try {
|
||||||
// ftpService.download(v.getUserSign(), signOs);
|
Sys_file file = dao().fetch(Sys_file.class,
|
||||||
byte[] imageBytes = signOs.toByteArray();
|
Cnd.where(Sys_file::getDownloadPath, "=", v.getUserSign()));
|
||||||
if (Lang.isNotEmpty(imageBytes)) {
|
if (file != null) {
|
||||||
v.setQzBytes(imageBytes);
|
v.setQzBytes(SysFileMinIoUtil.getFileBytes(file.getBucket(), file.getStoragePath()));
|
||||||
} else {
|
}
|
||||||
v.setQzBytes(null);
|
} catch (Exception ignored) {
|
||||||
|
// 签名文件缺失时保留空白,不中断名单导出。
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
ExportParams exportParams = new ExportParams();
|
ExportParams exportParams = new ExportParams();
|
||||||
|
|||||||
+168
-6
@@ -17,6 +17,7 @@ import com.budwk.app.web.commons.auth.utils.AuthUtil;
|
|||||||
import com.budwk.app.web.commons.auth.utils.SecurityUtil;
|
import com.budwk.app.web.commons.auth.utils.SecurityUtil;
|
||||||
import com.budwk.app.zhgh.welfare.model.WelfareProject;
|
import com.budwk.app.zhgh.welfare.model.WelfareProject;
|
||||||
import com.budwk.app.zhgh.welfare.model.WelfareProjectSubjectOption;
|
import com.budwk.app.zhgh.welfare.model.WelfareProjectSubjectOption;
|
||||||
|
import com.budwk.app.zhgh.welfare.service.WelfareSingleService;
|
||||||
import com.budwk.app.zhgh.welfare.service.WelfareStatisticsService;
|
import com.budwk.app.zhgh.welfare.service.WelfareStatisticsService;
|
||||||
import lombok.extern.slf4j.Slf4j;
|
import lombok.extern.slf4j.Slf4j;
|
||||||
import org.apache.poi.ss.usermodel.Workbook;
|
import org.apache.poi.ss.usermodel.Workbook;
|
||||||
@@ -32,14 +33,15 @@ import org.nutz.ioc.loader.annotation.IocBean;
|
|||||||
import org.nutz.lang.util.NutMap;
|
import org.nutz.lang.util.NutMap;
|
||||||
|
|
||||||
import javax.servlet.http.HttpServletResponse;
|
import javax.servlet.http.HttpServletResponse;
|
||||||
import java.util.ArrayList;
|
import java.util.*;
|
||||||
import java.util.List;
|
|
||||||
import java.util.Optional;
|
|
||||||
import java.util.stream.Collectors;
|
import java.util.stream.Collectors;
|
||||||
|
|
||||||
@IocBean(args = {"refer:dao"})
|
@IocBean(args = {"refer:dao"})
|
||||||
@Slf4j
|
@Slf4j
|
||||||
public class WelfareStatisticsServiceImpl extends BaseServiceImpl<WelfareProject> implements WelfareStatisticsService {
|
public class WelfareStatisticsServiceImpl extends BaseServiceImpl<WelfareProject> implements WelfareStatisticsService {
|
||||||
|
@org.nutz.ioc.loader.annotation.Inject
|
||||||
|
private WelfareSingleService welfareSingleService;
|
||||||
|
|
||||||
public WelfareStatisticsServiceImpl(Dao dao) {
|
public WelfareStatisticsServiceImpl(Dao dao) {
|
||||||
super(dao);
|
super(dao);
|
||||||
}
|
}
|
||||||
@@ -65,7 +67,7 @@ public class WelfareStatisticsServiceImpl extends BaseServiceImpl<WelfareProject
|
|||||||
}};
|
}};
|
||||||
|
|
||||||
// 选项数据
|
// 选项数据
|
||||||
List<WelfareProjectSubjectOption> welfareOptions = dao().query(WelfareProjectSubjectOption.class, Cnd.where(WelfareProjectSubjectOption::getWelfareId, "=", projectId));
|
List<WelfareProjectSubjectOption> welfareOptions = getNaturalSortedOptions(projectId);
|
||||||
|
|
||||||
for (WelfareProjectSubjectOption welfareOption : welfareOptions) {
|
for (WelfareProjectSubjectOption welfareOption : welfareOptions) {
|
||||||
dynamicTableColumns.add(NutMap.NEW().addv("label", welfareOption.getOptionName()).addv("prop", welfareOption.getId()));
|
dynamicTableColumns.add(NutMap.NEW().addv("label", welfareOption.getOptionName()).addv("prop", welfareOption.getId()));
|
||||||
@@ -176,6 +178,8 @@ public class WelfareStatisticsServiceImpl extends BaseServiceImpl<WelfareProject
|
|||||||
SqlExpressionGroup seg = new SqlExpressionGroup();
|
SqlExpressionGroup seg = new SqlExpressionGroup();
|
||||||
seg.orLike("u.loginname", pageForm.getSearchKeyword());
|
seg.orLike("u.loginname", pageForm.getSearchKeyword());
|
||||||
seg.orLike("u.username", pageForm.getSearchKeyword());
|
seg.orLike("u.username", pageForm.getSearchKeyword());
|
||||||
|
// 已选人员弹窗仅支持按工号或姓名筛选,需将 OR 条件加入查询条件后才会生效。
|
||||||
|
cnd.and(seg);
|
||||||
}
|
}
|
||||||
sql.setCondition(cnd);
|
sql.setCondition(cnd);
|
||||||
Pagination pagination = listPageMap(pageForm.getPageNumber(), pageForm.getPageSize(), sql);
|
Pagination pagination = listPageMap(pageForm.getPageNumber(), pageForm.getPageSize(), sql);
|
||||||
@@ -184,6 +188,8 @@ public class WelfareStatisticsServiceImpl extends BaseServiceImpl<WelfareProject
|
|||||||
|
|
||||||
@Override
|
@Override
|
||||||
public void exportSelectedUnionUser(String projectId, String unionId, HttpServletResponse response) {
|
public void exportSelectedUnionUser(String projectId, String unionId, HttpServletResponse response) {
|
||||||
|
// V4 原已选人员导出逻辑保留,当前按 V3 字段与格式执行。
|
||||||
|
if (false) {
|
||||||
Sql sql = Sqls.create("""
|
Sql sql = Sqls.create("""
|
||||||
SELECT
|
SELECT
|
||||||
u.loginname AS loginName,
|
u.loginname AS loginName,
|
||||||
@@ -245,6 +251,8 @@ public class WelfareStatisticsServiceImpl extends BaseServiceImpl<WelfareProject
|
|||||||
} catch (Exception e) {
|
} catch (Exception e) {
|
||||||
log.error("导出Excel失败", e);
|
log.error("导出Excel失败", e);
|
||||||
}
|
}
|
||||||
|
}
|
||||||
|
welfareSingleService.exportReceiveDetailByUnionId(projectId, unionId, true, response);
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
@@ -289,6 +297,8 @@ public class WelfareStatisticsServiceImpl extends BaseServiceImpl<WelfareProject
|
|||||||
|
|
||||||
@Override
|
@Override
|
||||||
public void exportUnSelectedUnionUser(String projectId, String unionId, HttpServletResponse response) {
|
public void exportUnSelectedUnionUser(String projectId, String unionId, HttpServletResponse response) {
|
||||||
|
// V4 原未选人员导出逻辑保留,当前按 V3 字段与格式执行。
|
||||||
|
if (false) {
|
||||||
Sql sql = Sqls.create("""
|
Sql sql = Sqls.create("""
|
||||||
SELECT
|
SELECT
|
||||||
u.loginname AS loginName,
|
u.loginname AS loginName,
|
||||||
@@ -344,6 +354,8 @@ public class WelfareStatisticsServiceImpl extends BaseServiceImpl<WelfareProject
|
|||||||
} catch (Exception e) {
|
} catch (Exception e) {
|
||||||
log.error("导出Excel失败", e);
|
log.error("导出Excel失败", e);
|
||||||
}
|
}
|
||||||
|
}
|
||||||
|
welfareSingleService.exportReceiveDetailByUnionId(projectId, unionId, false, response);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
@@ -377,7 +389,9 @@ public class WelfareStatisticsServiceImpl extends BaseServiceImpl<WelfareProject
|
|||||||
|
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public void exportByWelfareOptions(String projectId, HttpServletResponse response) {
|
public void exportByWelfareOptions(String projectId, String unionId, HttpServletResponse response) {
|
||||||
|
// V4 原按福利选项导出逻辑保留,当前按 V3 的品牌分表字段执行。
|
||||||
|
if (false) {
|
||||||
Workbook workbook = new XSSFWorkbook();
|
Workbook workbook = new XSSFWorkbook();
|
||||||
|
|
||||||
List<ExcelExportEntity> exportEntities = new ArrayList<>();
|
List<ExcelExportEntity> exportEntities = new ArrayList<>();
|
||||||
@@ -434,6 +448,8 @@ public class WelfareStatisticsServiceImpl extends BaseServiceImpl<WelfareProject
|
|||||||
} catch (Exception e) {
|
} catch (Exception e) {
|
||||||
log.error("导出Excel失败", e);
|
log.error("导出Excel失败", e);
|
||||||
}
|
}
|
||||||
|
}
|
||||||
|
exportByWelfareOptionsV3(projectId, unionId, response);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
@@ -456,7 +472,7 @@ public class WelfareStatisticsServiceImpl extends BaseServiceImpl<WelfareProject
|
|||||||
entities.add(unSelectedNumEntity);
|
entities.add(unSelectedNumEntity);
|
||||||
|
|
||||||
// 选项数据
|
// 选项数据
|
||||||
List<WelfareProjectSubjectOption> welfareOptions = dao().query(WelfareProjectSubjectOption.class, Cnd.where(WelfareProjectSubjectOption::getWelfareId, "=", projectId));
|
List<WelfareProjectSubjectOption> welfareOptions = getNaturalSortedOptions(projectId);
|
||||||
for (WelfareProjectSubjectOption welfareOption : welfareOptions) {
|
for (WelfareProjectSubjectOption welfareOption : welfareOptions) {
|
||||||
ExcelExportEntity entity = new ExcelExportEntity(welfareOption.getOptionName(), welfareOption.getId(), 20);
|
ExcelExportEntity entity = new ExcelExportEntity(welfareOption.getOptionName(), welfareOption.getId(), 20);
|
||||||
entity.setType(10);
|
entity.setType(10);
|
||||||
@@ -543,4 +559,150 @@ public class WelfareStatisticsServiceImpl extends BaseServiceImpl<WelfareProject
|
|||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 按 V3 品牌导出结构生成工作簿:每个福利选项独立工作表,人员多选时在每个对应选项表中均保留一行。
|
||||||
|
*
|
||||||
|
* @param projectId 福利项目ID
|
||||||
|
* @param unionId 当前筛选的分工会ID;为空时导出当前登录人权限范围内的全部分工会
|
||||||
|
* @param response HTTP响应,返回XLSX格式的品牌分表文件
|
||||||
|
*/
|
||||||
|
private void exportByWelfareOptionsV3(String projectId, String unionId, HttpServletResponse response) {
|
||||||
|
List<ExcelExportEntity> entities = new ArrayList<>();
|
||||||
|
entities.add(new ExcelExportEntity("工号", "loginName", 20));
|
||||||
|
entities.add(new ExcelExportEntity("姓名", "userName", 20));
|
||||||
|
entities.add(new ExcelExportEntity("电话号码", "mobile", 20));
|
||||||
|
entities.add(new ExcelExportEntity("在职状态", "userState", 20));
|
||||||
|
entities.add(new ExcelExportEntity("人员类型", "personType", 20));
|
||||||
|
entities.add(new ExcelExportEntity("所在分工会", "welfareUnionName", 30));
|
||||||
|
entities.add(new ExcelExportEntity("所在单位", "welfareUnitName", 50));
|
||||||
|
entities.add(new ExcelExportEntity("选择份数", "selectNum", 10));
|
||||||
|
entities.add(new ExcelExportEntity("收货人", "recipient", 15));
|
||||||
|
entities.add(new ExcelExportEntity("联系方式", "phone", 20));
|
||||||
|
entities.add(new ExcelExportEntity("收货地址", "address", 60));
|
||||||
|
|
||||||
|
Sql sql = Sqls.create("""
|
||||||
|
SELECT
|
||||||
|
u.loginname AS loginName,
|
||||||
|
u.username AS userName,
|
||||||
|
wpus.mobile,
|
||||||
|
wl.userState,
|
||||||
|
wl.personType,
|
||||||
|
wl.welfareUnionName,
|
||||||
|
wl.welfareUnitName,
|
||||||
|
wpus.receiveAddress,
|
||||||
|
wpus.selectNum,
|
||||||
|
wpus.selectOptionId
|
||||||
|
FROM welfare_project_user_selection wpus
|
||||||
|
LEFT JOIN welfare_list wl ON wl.userId = wpus.selectUserId AND wl.projectId = wpus.welfareId
|
||||||
|
LEFT JOIN sys_user u ON u.id = wpus.selectUserId
|
||||||
|
$condition
|
||||||
|
""");
|
||||||
|
Cnd cnd = Cnd.NEW();
|
||||||
|
cnd.and("wpus.welfareId", "=", projectId);
|
||||||
|
cnd.and("wpus.selectNum", "!=", 0);
|
||||||
|
cnd.andEX("wl.welfareUnionId", "=", resolveExportUnionId(unionId));
|
||||||
|
cnd.asc("wl.welfareUnionName").asc("wl.welfareUnitName").asc("u.loginname");
|
||||||
|
sql.setCondition(cnd);
|
||||||
|
List<NutMap> rows = listMap(sql);
|
||||||
|
rows.forEach(this::fillV3ReceiveAddress);
|
||||||
|
|
||||||
|
try (Workbook workbook = new XSSFWorkbook()) {
|
||||||
|
for (WelfareProjectSubjectOption option : getNaturalSortedOptions(projectId)) {
|
||||||
|
List<NutMap> optionRows = rows.stream()
|
||||||
|
.filter(row -> option.getId().equals(row.getString("selectOptionId")))
|
||||||
|
// EasyPOI 生成工作表时会移除已处理行,必须传入可修改列表。
|
||||||
|
.collect(Collectors.toCollection(ArrayList::new));
|
||||||
|
ExportParams exportParams = new ExportParams();
|
||||||
|
exportParams.setType(ExcelType.XSSF);
|
||||||
|
exportParams.setTitle(option.getOptionName() + "选择情况");
|
||||||
|
exportParams.setSheetName(option.getOptionName());
|
||||||
|
new ExcelExportService().createSheetForMap(workbook, exportParams, entities, optionRows);
|
||||||
|
}
|
||||||
|
CommonDownloadUtil.download("按品牌导出选择情况表.xlsx", workbook, response);
|
||||||
|
} catch (Exception e) {
|
||||||
|
log.error("按品牌导出Excel失败", e);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/** 分工会角色只能导出本人工会数据,校级角色可按页面筛选导出。 */
|
||||||
|
private String resolveExportUnionId(String unionId) {
|
||||||
|
if (AuthUtil.hasRole(RoleConstant.BRANCH_UNION_CHAIRMAN.name())
|
||||||
|
|| AuthUtil.hasRole(RoleConstant.BRANCH_UNION_ADMIN.name())
|
||||||
|
|| AuthUtil.hasRole(RoleConstant.BRANCH_UNION_WENTI_SPORTS.name())) {
|
||||||
|
return SecurityUtil.getUnionId();
|
||||||
|
}
|
||||||
|
return unionId;
|
||||||
|
}
|
||||||
|
|
||||||
|
/** 将历史收货信息拆为 V3 导出所需的收货人、联系方式和收货地址三列。 */
|
||||||
|
private void fillV3ReceiveAddress(NutMap row) {
|
||||||
|
String receiveAddress = row.getString("receiveAddress");
|
||||||
|
if (StrUtil.isBlank(receiveAddress)) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
Map<String, String> values = new HashMap<>();
|
||||||
|
for (String pair : receiveAddress.split("[,,]")) {
|
||||||
|
String[] keyValue = pair.split("[::]", 2);
|
||||||
|
if (keyValue.length == 2) {
|
||||||
|
values.put(keyValue[0].trim(), keyValue[1].trim());
|
||||||
|
}
|
||||||
|
}
|
||||||
|
row.put("recipient", values.get("收件人"));
|
||||||
|
row.put("phone", values.get("联系方式"));
|
||||||
|
row.put("address", values.get("收货地址"));
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 按套餐名称进行自然排序,数字片段按数值比较、英文字母忽略大小写比较,避免“套餐10”排在“套餐2”之前。
|
||||||
|
*/
|
||||||
|
private List<WelfareProjectSubjectOption> getNaturalSortedOptions(String projectId) {
|
||||||
|
List<WelfareProjectSubjectOption> options = dao().query(WelfareProjectSubjectOption.class,
|
||||||
|
Cnd.where(WelfareProjectSubjectOption::getWelfareId, "=", projectId));
|
||||||
|
options.sort(Comparator.comparing(WelfareProjectSubjectOption::getOptionName, this::compareOptionNames)
|
||||||
|
.thenComparing(option -> option.getOptionSort() == null ? Integer.MAX_VALUE : option.getOptionSort())
|
||||||
|
.thenComparing(WelfareProjectSubjectOption::getId));
|
||||||
|
return options;
|
||||||
|
}
|
||||||
|
|
||||||
|
private int compareOptionNames(String left, String right) {
|
||||||
|
String leftName = StrUtil.blankToDefault(left, "");
|
||||||
|
String rightName = StrUtil.blankToDefault(right, "");
|
||||||
|
int leftIndex = 0;
|
||||||
|
int rightIndex = 0;
|
||||||
|
while (leftIndex < leftName.length() && rightIndex < rightName.length()) {
|
||||||
|
char leftChar = leftName.charAt(leftIndex);
|
||||||
|
char rightChar = rightName.charAt(rightIndex);
|
||||||
|
if (Character.isDigit(leftChar) && Character.isDigit(rightChar)) {
|
||||||
|
int leftEnd = leftIndex;
|
||||||
|
int rightEnd = rightIndex;
|
||||||
|
while (leftEnd < leftName.length() && Character.isDigit(leftName.charAt(leftEnd))) {
|
||||||
|
leftEnd++;
|
||||||
|
}
|
||||||
|
while (rightEnd < rightName.length() && Character.isDigit(rightName.charAt(rightEnd))) {
|
||||||
|
rightEnd++;
|
||||||
|
}
|
||||||
|
String leftNumber = leftName.substring(leftIndex, leftEnd).replaceFirst("^0+(?!$)", "");
|
||||||
|
String rightNumber = rightName.substring(rightIndex, rightEnd).replaceFirst("^0+(?!$)", "");
|
||||||
|
int numberCompare = Integer.compare(leftNumber.length(), rightNumber.length());
|
||||||
|
if (numberCompare != 0) {
|
||||||
|
return numberCompare;
|
||||||
|
}
|
||||||
|
numberCompare = leftNumber.compareTo(rightNumber);
|
||||||
|
if (numberCompare != 0) {
|
||||||
|
return numberCompare;
|
||||||
|
}
|
||||||
|
leftIndex = leftEnd;
|
||||||
|
rightIndex = rightEnd;
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
int charCompare = String.valueOf(leftChar).compareToIgnoreCase(String.valueOf(rightChar));
|
||||||
|
if (charCompare != 0) {
|
||||||
|
return charCompare;
|
||||||
|
}
|
||||||
|
leftIndex++;
|
||||||
|
rightIndex++;
|
||||||
|
}
|
||||||
|
return Integer.compare(leftName.length(), rightName.length());
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -373,7 +373,6 @@ layout("/layouts/platform.html"){
|
|||||||
formRules: {
|
formRules: {
|
||||||
name: [{ required: true, message: "必填", trigger: ["blur", "change"] }],
|
name: [{ required: true, message: "必填", trigger: ["blur", "change"] }],
|
||||||
festival: [{ required: true, message: "必选", trigger: ["blur", "change"] }],
|
festival: [{ required: true, message: "必选", trigger: ["blur", "change"] }],
|
||||||
provideTime: [{ required: true, message: "必选", trigger: ["blur", "change"] }],
|
|
||||||
choiceTime: [{ required: true, message: "必选", trigger: ["blur", "change"] }],
|
choiceTime: [{ required: true, message: "必选", trigger: ["blur", "change"] }],
|
||||||
provideAddress: [{ required: true, message: "必选", trigger: ["blur", "change"] }],
|
provideAddress: [{ required: true, message: "必选", trigger: ["blur", "change"] }],
|
||||||
provideMode: [{ required: true, message: "必选", trigger: ["blur", "change"] }],
|
provideMode: [{ required: true, message: "必选", trigger: ["blur", "change"] }],
|
||||||
|
|||||||
@@ -29,8 +29,8 @@ layout("/layouts/platform.html"){
|
|||||||
</el-select>
|
</el-select>
|
||||||
</search-item>
|
</search-item>
|
||||||
|
|
||||||
<search-item label="福利选项">
|
<search-item label="所选套餐">
|
||||||
<el-select clearable filterable placeholder="请选择福利选项" style="width: 100%" v-model="pageForm.welfareOptionId">
|
<el-select clearable filterable placeholder="请选择所选套餐" style="width: 100%" v-model="pageForm.welfareOptionId">
|
||||||
<el-option :key="item.id" :label="item.optionName" :value="item.id" v-for="item in welfareOptions"></el-option>
|
<el-option :key="item.id" :label="item.optionName" :value="item.id" v-for="item in welfareOptions"></el-option>
|
||||||
</el-select>
|
</el-select>
|
||||||
</search-item>
|
</search-item>
|
||||||
@@ -66,10 +66,33 @@ layout("/layouts/platform.html"){
|
|||||||
<el-option :key="item.id" :label="item.name" :value="item.id" v-for="item in unitOptions"></el-option>
|
<el-option :key="item.id" :label="item.name" :value="item.id" v-for="item in unitOptions"></el-option>
|
||||||
</el-select>
|
</el-select>
|
||||||
</search-item>
|
</search-item>
|
||||||
<search-item label="人员分类">
|
<search-item label="人员类型">
|
||||||
<dict-select v-model="pageForm.aidFundMemberUserType" placeholder="请选择人员分类" @change="doSearch"
|
<dict-select
|
||||||
code="AIDFUND_MEMBER_USER_TYPE"></dict-select>
|
clearable
|
||||||
</search-item>
|
code="USER_PERSON_TYPE"
|
||||||
|
multiple
|
||||||
|
collapse-tags
|
||||||
|
placeholder="请选择人员类型"
|
||||||
|
v-model="pageForm.personTypes"
|
||||||
|
></dict-select>
|
||||||
|
</search-item>
|
||||||
|
|
||||||
|
<search-item label="在职状态">
|
||||||
|
<dict-select
|
||||||
|
clearable
|
||||||
|
code="USER_STATE"
|
||||||
|
multiple
|
||||||
|
collapse-tags
|
||||||
|
placeholder="请选择人员状态"
|
||||||
|
v-model="pageForm.userStates"
|
||||||
|
></dict-select>
|
||||||
|
</search-item>
|
||||||
|
|
||||||
|
<search-item label="人员分类">
|
||||||
|
<el-select clearable filterable placeholder="请选择人员分类" style="width: 100%" v-model="pageForm.aidFundMemberUserType">
|
||||||
|
<el-option :key="item.code" :label="item.name" :value="item.code" v-for="item in aidFundMemberUserTypeOptions"></el-option>
|
||||||
|
</el-select>
|
||||||
|
</search-item>
|
||||||
</search>
|
</search>
|
||||||
</el-card>
|
</el-card>
|
||||||
|
|
||||||
@@ -185,10 +208,13 @@ layout("/layouts/platform.html"){
|
|||||||
pageForm: {
|
pageForm: {
|
||||||
searchName: "username",
|
searchName: "username",
|
||||||
year: new Date().getFullYear().toString(),
|
year: new Date().getFullYear().toString(),
|
||||||
isSelect: null
|
isSelect: null,
|
||||||
|
personTypes: [],
|
||||||
|
userStates: []
|
||||||
},
|
},
|
||||||
unionOptions: [],
|
unionOptions: [],
|
||||||
unitOptions: [],
|
unitOptions: [],
|
||||||
|
aidFundMemberUserTypeOptions: [],
|
||||||
projectOptions: [],
|
projectOptions: [],
|
||||||
tableColumns: [
|
tableColumns: [
|
||||||
{ prop: "loginName", label: "工号" },
|
{ prop: "loginName", label: "工号" },
|
||||||
@@ -401,6 +427,9 @@ layout("/layouts/platform.html"){
|
|||||||
this.getWelfareList()
|
this.getWelfareList()
|
||||||
this.unionOptions = await this.$businessTool.listUnion()
|
this.unionOptions = await this.$businessTool.listUnion()
|
||||||
this.unitOptions = await this.$businessTool.listUnit()
|
this.unitOptions = await this.$businessTool.listUnit()
|
||||||
|
// 人员分类下拉仅在当前页面排除离退休人员,不影响全局字典及其他页面。
|
||||||
|
this.$set(this, "aidFundMemberUserTypeOptions", (await this.$businessTool.getDictOptions("AIDFUND_MEMBER_USER_TYPE"))
|
||||||
|
.filter((item) => item.code !== "离退休人员"))
|
||||||
}
|
}
|
||||||
})
|
})
|
||||||
</script>
|
</script>
|
||||||
|
|||||||
@@ -33,15 +33,21 @@ layout("/layouts/platform.html"){
|
|||||||
|
|
||||||
<el-card class="mt10" shadow="never" v-loading="tableLoading">
|
<el-card class="mt10" shadow="never" v-loading="tableLoading">
|
||||||
<table-tool label="工会列表">
|
<table-tool label="工会列表">
|
||||||
<el-button @click="exportByWelfareOptions" icon="el-icon-printer" size="small" type="primary">按福利选项导出</el-button>
|
<!-- V4 原导出按钮保留,不再作为当前页面入口。 -->
|
||||||
|
<!-- <el-button @click="exportByWelfareOptions" icon="el-icon-printer" size="small" type="primary">按福利选项导出</el-button> -->
|
||||||
<el-button :disabled="!pageForm.projectId" @click="remindUnSelectedPlaceholder" icon="el-icon-bell" size="small" type="primary">
|
<el-button :disabled="!pageForm.projectId" @click="remindUnSelectedPlaceholder" icon="el-icon-bell" size="small" type="primary">
|
||||||
提醒未选择人员
|
提醒未选择人员
|
||||||
</el-button>
|
</el-button>
|
||||||
<template v-if="$auth.hasRoleOr(['SYSADMIN','SCHOOL_UNION_ADMIN','SCHOOL_UNION_WELFARE_ADMIN'])">
|
<template v-if="$auth.hasRoleOr(['SYSADMIN','SCHOOL_UNION_ADMIN','SCHOOL_UNION_WELFARE_ADMIN'])">
|
||||||
<el-button :disabled="!pageForm.projectId" @click="exportSummary" icon="el-icon-printer" size="small" type="primary">
|
<!-- V4 原汇总导出按钮保留,不再作为当前页面入口。 -->
|
||||||
导出汇总表
|
<!-- <el-button :disabled="!pageForm.projectId" @click="exportSummary" icon="el-icon-printer" size="small" type="primary">导出汇总表</el-button> -->
|
||||||
|
<el-button :disabled="!pageForm.projectId" @click="allExportReceiveDetailByUnionIdWord" icon="el-icon-printer" size="small" type="primary">
|
||||||
|
导出各分工会福利签领表
|
||||||
</el-button>
|
</el-button>
|
||||||
</template>
|
</template>
|
||||||
|
<el-button :disabled="!pageForm.projectId" @click="exportByWelfareOptionsV3" icon="el-icon-printer" size="small" type="primary">按品牌导出</el-button>
|
||||||
|
<el-button :disabled="!pageForm.projectId" @click="exportReceiveDetailByUnionId(true)" icon="el-icon-printer" size="small" type="primary">导出已选名单</el-button>
|
||||||
|
<el-button :disabled="!pageForm.projectId" @click="exportReceiveDetailByUnionId(false)" icon="el-icon-printer" size="small" type="primary">导出未选名单</el-button>
|
||||||
</table-tool>
|
</table-tool>
|
||||||
<el-table
|
<el-table
|
||||||
:data="tableData"
|
:data="tableData"
|
||||||
@@ -74,6 +80,12 @@ layout("/layouts/platform.html"){
|
|||||||
<el-link @click="openUnSelected(row)" type="primary">{{row.unSelectedNum}}</el-link>
|
<el-link @click="openUnSelected(row)" type="primary">{{row.unSelectedNum}}</el-link>
|
||||||
</template>
|
</template>
|
||||||
</el-table-column>
|
</el-table-column>
|
||||||
|
<el-table-column align="center" fixed="right" header-align="center" label="操作" width="260">
|
||||||
|
<template slot-scope="{row}">
|
||||||
|
<el-button plain size="mini" type="primary" @click="exportReceiveDetailByUnionIdWord(row)">导出福利签领表</el-button>
|
||||||
|
<el-button size="mini" type="primary" @click="openSelected(row)">已选人员</el-button>
|
||||||
|
</template>
|
||||||
|
</el-table-column>
|
||||||
</el-table>
|
</el-table>
|
||||||
</el-card>
|
</el-card>
|
||||||
</template>
|
</template>
|
||||||
@@ -113,7 +125,7 @@ layout("/layouts/platform.html"){
|
|||||||
remindUnSelectedPlaceholder() {
|
remindUnSelectedPlaceholder() {
|
||||||
this.$message.info("提醒未选择人员功能待开发")
|
this.$message.info("提醒未选择人员功能待开发")
|
||||||
},
|
},
|
||||||
// 导出汇总表
|
// V4 原汇总表导出方法保留,页面已改用 V3 风格的导出入口。
|
||||||
exportSummary() {
|
exportSummary() {
|
||||||
this.$downLoad("/platform/welfare/statistics/exportSummary", {
|
this.$downLoad("/platform/welfare/statistics/exportSummary", {
|
||||||
projectId: this.pageForm.projectId
|
projectId: this.pageForm.projectId
|
||||||
@@ -129,7 +141,7 @@ layout("/layouts/platform.html"){
|
|||||||
this.$refs.unSelectedUserRef.onOpen(this.pageForm.projectId, row)
|
this.$refs.unSelectedUserRef.onOpen(this.pageForm.projectId, row)
|
||||||
},
|
},
|
||||||
|
|
||||||
// 按福利选项导出
|
// V4 原按福利选项导出方法保留,页面已改用 V3 的按品牌导出入口。
|
||||||
exportByWelfareOptions() {
|
exportByWelfareOptions() {
|
||||||
this.$downLoad("/platform/welfare/statistics/exportByWelfareOptions", {
|
this.$downLoad("/platform/welfare/statistics/exportByWelfareOptions", {
|
||||||
projectId: this.pageForm.projectId,
|
projectId: this.pageForm.projectId,
|
||||||
@@ -137,6 +149,38 @@ layout("/layouts/platform.html"){
|
|||||||
})
|
})
|
||||||
},
|
},
|
||||||
|
|
||||||
|
// V3 按品牌导出:按套餐拆分工作表,并传递当前分工会筛选范围。
|
||||||
|
exportByWelfareOptionsV3() {
|
||||||
|
this.$downLoad("/platform/welfare/statistics/exportByWelfareOptions", {
|
||||||
|
projectId: this.pageForm.projectId,
|
||||||
|
unionId: this.pageForm.unionId
|
||||||
|
})
|
||||||
|
},
|
||||||
|
|
||||||
|
// V3 已选、未选名单导出:未选择分工会时由后台导出当前数据权限内的全部人员。
|
||||||
|
exportReceiveDetailByUnionId(flag) {
|
||||||
|
this.$downLoad("/platform/welfare/statistics/exportReceiveDetailByUnionId", {
|
||||||
|
projectId: this.pageForm.projectId,
|
||||||
|
unionId: this.pageForm.unionId,
|
||||||
|
flag: flag
|
||||||
|
})
|
||||||
|
},
|
||||||
|
|
||||||
|
// V3 单个分工会福利签领表导出。
|
||||||
|
exportReceiveDetailByUnionIdWord(row) {
|
||||||
|
this.$downLoad("/platform/welfare/statistics/exportReceiveDetailByUnionIdWord", {
|
||||||
|
projectId: this.pageForm.projectId,
|
||||||
|
unionId: row.id
|
||||||
|
})
|
||||||
|
},
|
||||||
|
|
||||||
|
// V3 全部分工会福利签领表导出,后台生成 ZIP 文件。
|
||||||
|
allExportReceiveDetailByUnionIdWord() {
|
||||||
|
this.$downLoad("/platform/welfare/statistics/allExportReceiveDetailByUnionIdWord", {
|
||||||
|
projectId: this.pageForm.projectId
|
||||||
|
})
|
||||||
|
},
|
||||||
|
|
||||||
async pageData() {
|
async pageData() {
|
||||||
this.tableLoading = true
|
this.tableLoading = true
|
||||||
const resp = await this.$axios.post("/platform/welfare/statistics/pageData", this.pageForm)
|
const resp = await this.$axios.post("/platform/welfare/statistics/pageData", this.pageForm)
|
||||||
|
|||||||
@@ -6,7 +6,7 @@ const selectedUser = {
|
|||||||
<el-input
|
<el-input
|
||||||
v-model="pageForm.searchKeyword"
|
v-model="pageForm.searchKeyword"
|
||||||
placeholder="请输入姓名或工号"
|
placeholder="请输入姓名或工号"
|
||||||
style="width: 200px;"
|
style="width: 300px;"
|
||||||
size="small"
|
size="small"
|
||||||
clearable
|
clearable
|
||||||
@keyup.enter.native="doSearch"
|
@keyup.enter.native="doSearch"
|
||||||
@@ -51,7 +51,7 @@ const selectedUser = {
|
|||||||
{ label: "生日", prop: "birthday" },
|
{ label: "生日", prop: "birthday" },
|
||||||
{ prop: "userState", label: "在职状态", width: 120, sortable: true },
|
{ prop: "userState", label: "在职状态", width: 120, sortable: true },
|
||||||
{ prop: "personType", label: "人员类型", width: 120, sortable: true },
|
{ prop: "personType", label: "人员类型", width: 120, sortable: true },
|
||||||
{ prop: "postDoctoralJoinDate", label: "进站时间", sortable: true },
|
// { prop: "postDoctoralJoinDate", label: "进站时间", sortable: true },
|
||||||
{ label: "单位", prop: "welfareUnitName" },
|
{ label: "单位", prop: "welfareUnitName" },
|
||||||
{ label: "手机号", prop: "mobile" },
|
{ label: "手机号", prop: "mobile" },
|
||||||
{ label: "所选福利", prop: "selectOptionName" }
|
{ label: "所选福利", prop: "selectOptionName" }
|
||||||
|
|||||||
@@ -63,7 +63,7 @@ const addUser = {
|
|||||||
</search-item>
|
</search-item>
|
||||||
|
|
||||||
<search-item label="所属单位">
|
<search-item label="所属单位">
|
||||||
<el-select @change="unitChange" clearable
|
<el-select clearable
|
||||||
filterable
|
filterable
|
||||||
placeholder="请选择所属单位" style="width: 100%"
|
placeholder="请选择所属单位" style="width: 100%"
|
||||||
v-model="pageForm.unitId">
|
v-model="pageForm.unitId">
|
||||||
@@ -76,18 +76,6 @@ const addUser = {
|
|||||||
</el-select>
|
</el-select>
|
||||||
</search-item>
|
</search-item>
|
||||||
|
|
||||||
<search-item label="三级单位">
|
|
||||||
<el-select clearable filterable placeholder="请先选择所属单位" style="width: 100%"
|
|
||||||
v-model="pageForm.threeUnitId">
|
|
||||||
<el-option
|
|
||||||
:key="item.id"
|
|
||||||
:label="item.name"
|
|
||||||
:value="item.id"
|
|
||||||
v-for="item in threeUnitOptions">
|
|
||||||
</el-option>
|
|
||||||
</el-select>
|
|
||||||
</search-item>
|
|
||||||
|
|
||||||
<search-item label="人员类型:">
|
<search-item label="人员类型:">
|
||||||
<dict-select clearable code="USER_PERSON_TYPE"
|
<dict-select clearable code="USER_PERSON_TYPE"
|
||||||
multiple
|
multiple
|
||||||
@@ -163,7 +151,6 @@ const addUser = {
|
|||||||
birthMonths: [],
|
birthMonths: [],
|
||||||
unionId: null,
|
unionId: null,
|
||||||
unitId: null,
|
unitId: null,
|
||||||
threeUnitId: null,
|
|
||||||
personTypes: [],
|
personTypes: [],
|
||||||
preparedBys: [],
|
preparedBys: [],
|
||||||
userStates: [],
|
userStates: [],
|
||||||
@@ -172,7 +159,6 @@ const addUser = {
|
|||||||
sexOptions: ["男", "女"],
|
sexOptions: ["男", "女"],
|
||||||
unionOptions: [],
|
unionOptions: [],
|
||||||
unitOptions: [],
|
unitOptions: [],
|
||||||
threeUnitOptions: [],
|
|
||||||
tableColumns: [
|
tableColumns: [
|
||||||
{ prop: "loginname", label: "工号" },
|
{ prop: "loginname", label: "工号" },
|
||||||
{ prop: "username", label: "姓名" },
|
{ prop: "username", label: "姓名" },
|
||||||
@@ -181,8 +167,7 @@ const addUser = {
|
|||||||
{ prop: "personType", label: "人员类型", sortable: true },
|
{ prop: "personType", label: "人员类型", sortable: true },
|
||||||
{ prop: "userState", label: "在职状态", sortable: true },
|
{ prop: "userState", label: "在职状态", sortable: true },
|
||||||
{ prop: "unionName", label: "所属工会", sortable: true },
|
{ prop: "unionName", label: "所属工会", sortable: true },
|
||||||
{ prop: "unitName", label: "所属单位", sortable: true },
|
{ prop: "unitName", label: "所属单位", sortable: true }
|
||||||
{ prop: "threeUnitName", label: "三级单位", sortable: true }
|
|
||||||
]
|
]
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
@@ -204,8 +189,6 @@ const addUser = {
|
|||||||
this.$set(this.pageForm, "birthMonths", [])
|
this.$set(this.pageForm, "birthMonths", [])
|
||||||
this.$set(this.pageForm, "unionId", null)
|
this.$set(this.pageForm, "unionId", null)
|
||||||
this.$set(this.pageForm, "unitId", null)
|
this.$set(this.pageForm, "unitId", null)
|
||||||
this.$set(this.pageForm, "threeUnitId", null)
|
|
||||||
this.$set(this, "threeUnitOptions", [])
|
|
||||||
this.$set(this.pageForm, "personTypes", [])
|
this.$set(this.pageForm, "personTypes", [])
|
||||||
this.$set(this.pageForm, "preparedBys", [])
|
this.$set(this.pageForm, "preparedBys", [])
|
||||||
this.$set(this.pageForm, "userStates", [])
|
this.$set(this.pageForm, "userStates", [])
|
||||||
@@ -214,7 +197,6 @@ const addUser = {
|
|||||||
|
|
||||||
async unionIdChange(val) {
|
async unionIdChange(val) {
|
||||||
this.$set(this.pageForm, "unitId", null)
|
this.$set(this.pageForm, "unitId", null)
|
||||||
this.unitChange(null)
|
|
||||||
if (val) {
|
if (val) {
|
||||||
this.$set(this, "unitOptions", await this.$businessTool.listUnit(val))
|
this.$set(this, "unitOptions", await this.$businessTool.listUnit(val))
|
||||||
} else {
|
} else {
|
||||||
@@ -222,26 +204,6 @@ const addUser = {
|
|||||||
}
|
}
|
||||||
},
|
},
|
||||||
|
|
||||||
// 所属单位改变后,仅加载该单位直属的三级单位,避免跨单位筛选。
|
|
||||||
unitChange(unitId) {
|
|
||||||
this.$set(this.pageForm, "threeUnitId", null)
|
|
||||||
this.$set(this, "threeUnitOptions", [])
|
|
||||||
if (!unitId) {
|
|
||||||
return
|
|
||||||
}
|
|
||||||
this.$axios.post("/platform/sys/unit/child", { pid: unitId })
|
|
||||||
.then((res) => {
|
|
||||||
if (res.code === 0) {
|
|
||||||
this.$set(this, "threeUnitOptions", res.data || [])
|
|
||||||
} else {
|
|
||||||
this.$message.error(res.msg || "三级单位查询失败")
|
|
||||||
}
|
|
||||||
})
|
|
||||||
.catch(() => {
|
|
||||||
this.$message.error("三级单位查询失败,请稍后重试")
|
|
||||||
})
|
|
||||||
},
|
|
||||||
|
|
||||||
pageData() {
|
pageData() {
|
||||||
this.tableLoading = true
|
this.tableLoading = true
|
||||||
this.$axios
|
this.$axios
|
||||||
|
|||||||
@@ -25,7 +25,7 @@ layout("/layouts/platform.html"){
|
|||||||
</search-item>
|
</search-item>
|
||||||
|
|
||||||
<search-item label="福利项目">
|
<search-item label="福利项目">
|
||||||
<el-select :clearable="false" filterable placeholder="请选择福利项目" style="width: 100%" v-model="pageForm.projectId">
|
<el-select :clearable="false" filterable placeholder="请选择福利项目" style="width: 100%" v-model="pageForm.projectId" @change="projectChange">
|
||||||
<el-option :key="item.id" :label="item.name" :value="item.id" v-for="item in projectSelectOptions"></el-option>
|
<el-option :key="item.id" :label="item.name" :value="item.id" v-for="item in projectSelectOptions"></el-option>
|
||||||
</el-select>
|
</el-select>
|
||||||
</search-item>
|
</search-item>
|
||||||
@@ -133,11 +133,6 @@ layout("/layouts/platform.html"){
|
|||||||
<!-- <dict-select v-model="pageForm.aidFundMemberUserType" placeholder="请选择人员分类" @change="doSearch"-->
|
<!-- <dict-select v-model="pageForm.aidFundMemberUserType" placeholder="请选择人员分类" @change="doSearch"-->
|
||||||
<!-- code="AIDFUND_MEMBER_USER_TYPE"></dict-select>-->
|
<!-- code="AIDFUND_MEMBER_USER_TYPE"></dict-select>-->
|
||||||
<!-- </search-item>-->
|
<!-- </search-item>-->
|
||||||
<search-item label="人员属性">
|
|
||||||
<dict-select v-model="pageForm.userAttributes" placeholder="请选择人员属性" @change="doSearch"
|
|
||||||
code="USER_ATTRIBUTE" clearable multiple collapse-tags></dict-select>
|
|
||||||
</search-item>
|
|
||||||
|
|
||||||
<!-- <search-item label="所选福利:">-->
|
<!-- <search-item label="所选福利:">-->
|
||||||
<!-- <el-select clearable placeholder="请选择所选福利" style="width: 100%" v-model="pageForm.optionId">-->
|
<!-- <el-select clearable placeholder="请选择所选福利" style="width: 100%" v-model="pageForm.optionId">-->
|
||||||
<!-- <el-option :key="item.id" :label="item.optionName" :value="item.id" v-for="item in pageFormProject"></el-option>-->
|
<!-- <el-option :key="item.id" :label="item.optionName" :value="item.id" v-for="item in pageFormProject"></el-option>-->
|
||||||
@@ -148,6 +143,35 @@ layout("/layouts/platform.html"){
|
|||||||
|
|
||||||
<el-card class="mt10 welfare-list-card" shadow="never">
|
<el-card class="mt10 welfare-list-card" shadow="never">
|
||||||
<table-tool :app="this" label="福利名单">
|
<table-tool :app="this" label="福利名单">
|
||||||
|
<el-select
|
||||||
|
:disabled="!isExpressWelfareProject"
|
||||||
|
clearable
|
||||||
|
filterable
|
||||||
|
placeholder="请选择套餐"
|
||||||
|
size="small"
|
||||||
|
style="width: 180px"
|
||||||
|
v-model="pageForm.optionId"
|
||||||
|
>
|
||||||
|
<el-option :key="item.id" :label="item.optionName" :value="item.id" v-for="item in pageFormProject"></el-option>
|
||||||
|
</el-select>
|
||||||
|
<el-button
|
||||||
|
:disabled="!isExpressWelfareProject || !pageForm.optionId"
|
||||||
|
@click="doExcelByOptionId"
|
||||||
|
icon="el-icon-printer"
|
||||||
|
size="small"
|
||||||
|
type="primary"
|
||||||
|
>
|
||||||
|
导出报销表
|
||||||
|
</el-button>
|
||||||
|
<el-button
|
||||||
|
:disabled="!isExpressWelfareProject"
|
||||||
|
@click="openImportExpressExcel"
|
||||||
|
icon="el-icon-upload2"
|
||||||
|
size="small"
|
||||||
|
type="primary"
|
||||||
|
>
|
||||||
|
导入快递单号
|
||||||
|
</el-button>
|
||||||
<el-button :disabled="!pageForm.projectId" :loading="batchDeleteLoading" @click="deleteSearchUsers" icon="el-icon-delete" size="small" type="danger">
|
<el-button :disabled="!pageForm.projectId" :loading="batchDeleteLoading" @click="deleteSearchUsers" icon="el-icon-delete" size="small" type="danger">
|
||||||
删除人员
|
删除人员
|
||||||
</el-button>
|
</el-button>
|
||||||
@@ -254,6 +278,8 @@ layout("/layouts/platform.html"){
|
|||||||
width="700px"
|
width="700px"
|
||||||
:extra_params="{projectId:pageForm.projectId}"
|
:extra_params="{projectId:pageForm.projectId}"
|
||||||
></excel-import>
|
></excel-import>
|
||||||
|
|
||||||
|
<import-courier-number-dialog ref="importCourierNumberRef"></import-courier-number-dialog>
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
<script nonce="${cspNonce!}">
|
<script nonce="${cspNonce!}">
|
||||||
@@ -270,11 +296,15 @@ layout("/layouts/platform.html"){
|
|||||||
if (this.pageForm.projectId) {
|
if (this.pageForm.projectId) {
|
||||||
const projectInfo = this.projectSelectOptions.find((v) => v.id === this.pageForm.projectId)
|
const projectInfo = this.projectSelectOptions.find((v) => v.id === this.pageForm.projectId)
|
||||||
if (projectInfo) {
|
if (projectInfo) {
|
||||||
return projectInfo.optionList
|
return projectInfo.options || []
|
||||||
}
|
}
|
||||||
return null
|
return []
|
||||||
}
|
}
|
||||||
return null
|
return []
|
||||||
|
},
|
||||||
|
isExpressWelfareProject() {
|
||||||
|
const projectInfo = this.projectSelectOptions.find((v) => v.id === this.pageForm.projectId)
|
||||||
|
return projectInfo && projectInfo.provideMode === 3
|
||||||
},
|
},
|
||||||
canSyncUnion() {
|
canSyncUnion() {
|
||||||
const projectInfo = this.projectSelectOptions.find((v) => v.id === this.pageForm.projectId)
|
const projectInfo = this.projectSelectOptions.find((v) => v.id === this.pageForm.projectId)
|
||||||
@@ -288,7 +318,8 @@ layout("/layouts/platform.html"){
|
|||||||
add_welfare_list_by_select: ADD_WELFARE_LIST_BY_SELECT,
|
add_welfare_list_by_select: ADD_WELFARE_LIST_BY_SELECT,
|
||||||
"file-import": httpVueLoader("/components/plugins/sysImport/index.vue?v=" + new Date().getTime()),
|
"file-import": httpVueLoader("/components/plugins/sysImport/index.vue?v=" + new Date().getTime()),
|
||||||
"add-user": addUser,
|
"add-user": addUser,
|
||||||
"update-remark": updateRemark
|
"update-remark": updateRemark,
|
||||||
|
"import-courier-number-dialog": IMPORT_COURIER_NUMBER_DIALOG
|
||||||
},
|
},
|
||||||
data() {
|
data() {
|
||||||
return {
|
return {
|
||||||
@@ -326,6 +357,25 @@ layout("/layouts/platform.html"){
|
|||||||
}
|
}
|
||||||
},
|
},
|
||||||
methods: {
|
methods: {
|
||||||
|
// 切换福利项目后清空旧套餐,避免将上一个项目的套餐用于导出或导入。
|
||||||
|
projectChange() {
|
||||||
|
this.$set(this.pageForm, "optionId", null)
|
||||||
|
this.doSearch()
|
||||||
|
},
|
||||||
|
|
||||||
|
// 导出当前福利项目中指定套餐的报销表。
|
||||||
|
doExcelByOptionId() {
|
||||||
|
this.$downLoad("/platform/welfare/list/mange/doExcelByOptionId", {
|
||||||
|
projectId: this.pageForm.projectId,
|
||||||
|
optionId: this.pageForm.optionId
|
||||||
|
})
|
||||||
|
},
|
||||||
|
|
||||||
|
// 打开快递单号导入弹窗,并把当前福利项目的套餐列表传给弹窗选择。
|
||||||
|
openImportExpressExcel() {
|
||||||
|
this.$refs.importCourierNumberRef.openImportExpressExcel(this.pageForm.projectId, this.pageFormProject)
|
||||||
|
},
|
||||||
|
|
||||||
// 导出名单
|
// 导出名单
|
||||||
openExport() {
|
openExport() {
|
||||||
this.$downLoad("/platform/welfare/list/mange/exportXlsx", {
|
this.$downLoad("/platform/welfare/list/mange/exportXlsx", {
|
||||||
@@ -430,6 +480,7 @@ layout("/layouts/platform.html"){
|
|||||||
getWelfareList() {
|
getWelfareList() {
|
||||||
this.$axios.post("/platform/welfare/project/mange/getWelfareList", { year: this.pageForm.year }).then((res) => {
|
this.$axios.post("/platform/welfare/project/mange/getWelfareList", { year: this.pageForm.year }).then((res) => {
|
||||||
this.projectSelectOptions = res.data
|
this.projectSelectOptions = res.data
|
||||||
|
this.$set(this.pageForm, "optionId", null)
|
||||||
if (res.data && res.data.length > 0) {
|
if (res.data && res.data.length > 0) {
|
||||||
this.$set(this.pageForm, "projectId", res.data[0].id)
|
this.$set(this.pageForm, "projectId", res.data[0].id)
|
||||||
} else {
|
} else {
|
||||||
|
|||||||
Reference in New Issue
Block a user