Compare commits

...

4 Commits
dev ... frx

Author SHA1 Message Date
furongxin
585e2afe5a feat(bpm): 优化财务支付模块
- 升级 commons-io 版本至 2.16.1
- 修改财务支付相关逻辑:
  - 调整默认状态值
  -优化账目明细表格生成
- 新增 MergeSameRowCellsHandler用于合并相同行单元格
- 移除 easyexcel-core 依赖
2025-06-20 17:29:28 +08:00
furongxin
c512c25a50 feat(bpm): 导出支付信息 Excel 功能
- 新增导出支付信息的接口和实现
- 使用 EasyExcel 库进行 Excel 文件生成
- 对数据进行处理和格式化,支持公账和私账分别导出
- 优化了页面查询接口,增加对支付状态的处理
2025-06-20 15:59:41 +08:00
furongxin
d899fdf3d3 feat(smartfactory): 添加工厂和公司列表接口并优化参数接收- 在 FactoryInfoController 中添加 getList 方法,用于获取工厂和公司列表
- 在 FactoryInfoService 接口中添加 getList 方法
- 在 FactoryInfoServiceImpl 中实现 getList 方法
- 优化 StaffSalaryApi 中 updateIsGrant 方法的参数接收,允许 ids 参数为可选
- 在 StaffController 中为 exportStaffExcel 方法添加状态参数,以筛选有效员工
2025-06-20 15:57:01 +08:00
furongxin
b7cb164837 feat(smartfactory): 优化员工导出功能
- 为 CameraDeviceMapper 添加按 sort 字段升序排序
- 在 StaffController 中增加工种字典值和工厂信息的获取,并完善员工信息导出内容
- 更新 StaffRespVO,增加 factoryName 和 workTypeName 字段,修改 sex 字段为 sexStr
2025-06-04 16:55:05 +08:00
23 changed files with 495 additions and 26 deletions

View File

@ -73,7 +73,7 @@
<!-- 三方云服务相关 --> <!-- 三方云服务相关 -->
<okio.version>3.5.0</okio.version> <okio.version>3.5.0</okio.version>
<okhttp3.version>4.11.0</okhttp3.version> <okhttp3.version>4.11.0</okhttp3.version>
<commons-io.version>2.11.0</commons-io.version> <commons-io.version>2.16.1</commons-io.version>
<minio.version>8.5.6</minio.version> <minio.version>8.5.6</minio.version>
<aliyun-java-sdk-core.version>4.6.4</aliyun-java-sdk-core.version> <aliyun-java-sdk-core.version>4.6.4</aliyun-java-sdk-core.version>
<aliyun-java-sdk-dysmsapi.version>2.2.1</aliyun-java-sdk-dysmsapi.version> <aliyun-java-sdk-dysmsapi.version>2.2.1</aliyun-java-sdk-dysmsapi.version>

View File

@ -140,6 +140,16 @@
<version>2.0.0-jdk8-snapshot</version> <version>2.0.0-jdk8-snapshot</version>
<scope>compile</scope> <scope>compile</scope>
</dependency> </dependency>
<!-- <dependency>-->
<!-- <groupId>com.alibaba</groupId>-->
<!-- <artifactId>easyexcel-core</artifactId>-->
<!-- <version>4.0.3</version>-->
<!-- <scope>compile</scope>-->
<!-- </dependency>-->
<dependency>
<groupId>cn.iocoder.cloud</groupId>
<artifactId>yudao-spring-boot-starter-excel</artifactId>
</dependency>
</dependencies> </dependencies>
<build> <build>

View File

@ -2,9 +2,11 @@ package cn.iocoder.yudao.module.bpm.controller.admin.financialpayment;
import cn.hutool.core.collection.CollectionUtil; import cn.hutool.core.collection.CollectionUtil;
import cn.iocoder.yudao.framework.common.pojo.CommonResult; import cn.iocoder.yudao.framework.common.pojo.CommonResult;
import cn.iocoder.yudao.framework.common.pojo.PageParam;
import cn.iocoder.yudao.framework.common.pojo.PageResult; import cn.iocoder.yudao.framework.common.pojo.PageResult;
import cn.iocoder.yudao.framework.common.pojo.UploadUserFile; import cn.iocoder.yudao.framework.common.pojo.UploadUserFile;
import cn.iocoder.yudao.framework.common.util.object.BeanUtils; import cn.iocoder.yudao.framework.common.util.object.BeanUtils;
import cn.iocoder.yudao.framework.operatelog.core.annotations.OperateLog;
import cn.iocoder.yudao.module.bpm.controller.admin.financialpayment.vo.FinancialPaymentPageReqVO; import cn.iocoder.yudao.module.bpm.controller.admin.financialpayment.vo.FinancialPaymentPageReqVO;
import cn.iocoder.yudao.module.bpm.controller.admin.financialpayment.vo.FinancialPaymentRespVO; import cn.iocoder.yudao.module.bpm.controller.admin.financialpayment.vo.FinancialPaymentRespVO;
import cn.iocoder.yudao.module.bpm.controller.admin.financialpayment.vo.FinancialPaymentSaveReqVO; import cn.iocoder.yudao.module.bpm.controller.admin.financialpayment.vo.FinancialPaymentSaveReqVO;
@ -17,15 +19,19 @@ import cn.iocoder.yudao.module.bpm.service.financialpaymentitem.FinancialPayment
import io.swagger.v3.oas.annotations.Operation; import io.swagger.v3.oas.annotations.Operation;
import io.swagger.v3.oas.annotations.Parameter; import io.swagger.v3.oas.annotations.Parameter;
import io.swagger.v3.oas.annotations.tags.Tag; import io.swagger.v3.oas.annotations.tags.Tag;
import org.apache.commons.lang3.StringUtils;
import org.springframework.validation.annotation.Validated; import org.springframework.validation.annotation.Validated;
import org.springframework.web.bind.annotation.*; import org.springframework.web.bind.annotation.*;
import javax.annotation.Resource; import javax.annotation.Resource;
import javax.servlet.http.HttpServletResponse;
import javax.validation.Valid; import javax.validation.Valid;
import java.io.IOException;
import java.util.ArrayList; import java.util.ArrayList;
import java.util.List; import java.util.List;
import static cn.iocoder.yudao.framework.common.pojo.CommonResult.success; import static cn.iocoder.yudao.framework.common.pojo.CommonResult.success;
import static cn.iocoder.yudao.framework.operatelog.core.enums.OperateTypeEnum.EXPORT;
@Tag(name = "管理后台 - 财务支付管理") @Tag(name = "管理后台 - 财务支付管理")
@RestController @RestController
@ -102,6 +108,11 @@ public class FinancialPaymentController {
@Operation(summary = "获得财务支付管理分页") @Operation(summary = "获得财务支付管理分页")
public CommonResult<PageResult<FinancialPaymentRespVO>> getFinancialPaymentPage(@Valid FinancialPaymentPageReqVO pageReqVO) { public CommonResult<PageResult<FinancialPaymentRespVO>> getFinancialPaymentPage(@Valid FinancialPaymentPageReqVO pageReqVO) {
PageResult<FinancialPaymentDO> pageResult = financialPaymentService.getFinancialPaymentPage(pageReqVO); PageResult<FinancialPaymentDO> pageResult = financialPaymentService.getFinancialPaymentPage(pageReqVO);
pageResult.getList().forEach(item -> {
if (StringUtils.isNotEmpty(item.getRecipientName())) {
item.setRecipientName(item.getRecipientName().split(",")[0]);
}
});
return success(BeanUtils.toBean(pageResult, FinancialPaymentRespVO.class)); return success(BeanUtils.toBean(pageResult, FinancialPaymentRespVO.class));
} }
@ -111,4 +122,14 @@ public class FinancialPaymentController {
FinancialPaymentDO paymentDO = financialPaymentService.getPaymentTotal(pageReqVO); FinancialPaymentDO paymentDO = financialPaymentService.getPaymentTotal(pageReqVO);
return success(BeanUtils.toBean(paymentDO, FinancialPaymentRespVO.class)); return success(BeanUtils.toBean(paymentDO, FinancialPaymentRespVO.class));
} }
@GetMapping("/export-excel")
@Operation(summary = "导出支付信息 Excel")
@OperateLog(type = EXPORT)
public void exportFactoryInfoExcel(@Valid FinancialPaymentPageReqVO pageReqVO,
HttpServletResponse response) throws IOException {
pageReqVO.setPageSize(PageParam.PAGE_SIZE_NONE);
financialPaymentService.exportList(response, pageReqVO);
}
} }

View File

@ -0,0 +1,42 @@
package cn.iocoder.yudao.module.bpm.controller.admin.financialpayment.vo;
import com.alibaba.excel.annotation.ExcelProperty;
import lombok.AllArgsConstructor;
import lombok.Builder;
import lombok.Data;
import lombok.NoArgsConstructor;
import lombok.experimental.Accessors;
import java.math.BigDecimal;
/**
* 用户 Excel 导入 VO
*/
@Data
@Builder
@AllArgsConstructor
@NoArgsConstructor
@Accessors(chain = false) // 设置 chain = false避免用户导入有问题
public class FinancialExportExcelVO {
@ExcelProperty("姓名")
private String nickName;
@ExcelProperty("报销部门")
private String deptName;
@ExcelProperty("事项")
private String detail;
@ExcelProperty("金额")
private BigDecimal amount;
@ExcelProperty("卡号")
private String bankNo;
@ExcelProperty("公账/私账")
private String type;
@ExcelProperty("备注")
private String note;
}

View File

@ -0,0 +1,77 @@
package cn.iocoder.yudao.module.bpm.service.financialpayment;
import com.alibaba.excel.metadata.Head;
import com.alibaba.excel.metadata.data.WriteCellData;
import com.alibaba.excel.write.handler.CellWriteHandler;
import com.alibaba.excel.write.metadata.holder.WriteSheetHolder;
import com.alibaba.excel.write.metadata.holder.WriteTableHolder;
import org.apache.poi.ss.usermodel.*;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
public class CustomCellStyleHandler implements CellWriteHandler {
private final Map<String, CellStyle> styleCache = new HashMap<>();
@Override
public void afterCellDispose(
WriteSheetHolder writeSheetHolder,
WriteTableHolder writeTableHolder,
List<WriteCellData<?>> cellDataList,
Cell cell,
Head head,
Integer relativeRowIndex,
Boolean isHead) {
Workbook workbook = writeSheetHolder.getSheet().getWorkbook();
writeSheetHolder.getSheet().setColumnWidth(cell.getColumnIndex(), 7120);
// 获取或创建样式
CellStyle cellStyle = getOrCreateCellStyle(workbook, isHead, relativeRowIndex, cellDataList);
cell.setCellStyle(cellStyle);
}
private CellStyle getOrCreateCellStyle(Workbook workbook, Boolean isHead, Integer relativeRowIndex, List<WriteCellData<?>> cellDataList) {
String key = generateStyleKey(isHead, relativeRowIndex);
if (styleCache.containsKey(key)) {
return styleCache.get(key);
}
CellStyle cellStyle = workbook.createCellStyle();
cellStyle.setAlignment(HorizontalAlignment.CENTER);
cellStyle.setVerticalAlignment(VerticalAlignment.CENTER);
// if (isHead != null && isHead) {
// setHeaderStyle(workbook, cellStyle, relativeRowIndex, cellDataList);
// }
styleCache.put(key, cellStyle);
return cellStyle;
}
private void setHeaderStyle(Workbook workbook, CellStyle cellStyle, Integer relativeRowIndex, List<WriteCellData<?>> cellDataList) {
if (relativeRowIndex == 0 || relativeRowIndex == 1) {
applyStyle(workbook, cellStyle, IndexedColors.TURQUOISE.getIndex(), (short) 20, cellDataList);
} else if (relativeRowIndex == 2 || relativeRowIndex == 3) {
applyStyle(workbook, cellStyle, IndexedColors.LIGHT_YELLOW.getIndex(), (short) 20, cellDataList);
}
}
private void applyStyle(Workbook workbook, CellStyle cellStyle, short backgroundColor, short fontSize, List<WriteCellData<?>> cellDataList) {
cellStyle.setFillForegroundColor(backgroundColor);
cellStyle.setFillPattern(FillPatternType.SOLID_FOREGROUND);
Font font = workbook.createFont();
font.setFontHeightInPoints(fontSize);
cellStyle.setFont(font);
cellDataList.get(0).setWriteCellStyle(null);
}
private String generateStyleKey(Boolean isHead, Integer relativeRowIndex) {
return "isHead:" + isHead + ",rowIndex:" + relativeRowIndex;
}
}

View File

@ -6,6 +6,7 @@ import cn.iocoder.yudao.module.bpm.controller.admin.financialpayment.vo.Financia
import cn.iocoder.yudao.module.bpm.controller.admin.financialpayment.vo.FinancialPaymentSaveVO; import cn.iocoder.yudao.module.bpm.controller.admin.financialpayment.vo.FinancialPaymentSaveVO;
import cn.iocoder.yudao.module.bpm.dal.dataobject.financialpayment.FinancialPaymentDO; import cn.iocoder.yudao.module.bpm.dal.dataobject.financialpayment.FinancialPaymentDO;
import javax.servlet.http.HttpServletResponse;
import javax.validation.Valid; import javax.validation.Valid;
import java.util.List; import java.util.List;
@ -102,4 +103,11 @@ public interface FinancialPaymentService {
* @return 统计信息 * @return 统计信息
*/ */
FinancialPaymentDO getPaymentTotal(FinancialPaymentPageReqVO pageReqVO); FinancialPaymentDO getPaymentTotal(FinancialPaymentPageReqVO pageReqVO);
/**
* 导出支付信息
* @param response 响应
* @param pageReqVO 查询条件
*/
void exportList(HttpServletResponse response, FinancialPaymentPageReqVO pageReqVO);
} }

View File

@ -25,7 +25,6 @@ import cn.iocoder.yudao.module.bpm.dal.mysql.oa.*;
import cn.iocoder.yudao.module.bpm.dal.mysql.task.BpmProcessInstanceExtMapper; import cn.iocoder.yudao.module.bpm.dal.mysql.task.BpmProcessInstanceExtMapper;
import cn.iocoder.yudao.module.bpm.enums.task.BpmProcessInstanceResultEnum; import cn.iocoder.yudao.module.bpm.enums.task.BpmProcessInstanceResultEnum;
import cn.iocoder.yudao.module.bpm.enums.task.BpmProcessInstanceStatusEnum; import cn.iocoder.yudao.module.bpm.enums.task.BpmProcessInstanceStatusEnum;
import cn.iocoder.yudao.module.bpm.service.oa.BpmOAExpensesService;
import cn.iocoder.yudao.module.system.api.auth.AdminOauthUserOtherInfoApi; import cn.iocoder.yudao.module.system.api.auth.AdminOauthUserOtherInfoApi;
import cn.iocoder.yudao.module.system.api.auth.dto.AdminOauthUserOtherInfoApiDTO; import cn.iocoder.yudao.module.system.api.auth.dto.AdminOauthUserOtherInfoApiDTO;
import cn.iocoder.yudao.module.system.api.auth.vo.AdminOauthUserOtherInfoApiVO; import cn.iocoder.yudao.module.system.api.auth.vo.AdminOauthUserOtherInfoApiVO;
@ -33,6 +32,9 @@ import cn.iocoder.yudao.module.system.api.dept.DeptApi;
import cn.iocoder.yudao.module.system.api.loan.LoanApi; import cn.iocoder.yudao.module.system.api.loan.LoanApi;
import cn.iocoder.yudao.module.system.api.loan.dto.LoanDTO; import cn.iocoder.yudao.module.system.api.loan.dto.LoanDTO;
import cn.iocoder.yudao.module.system.api.subscribe.SubscribeMessageSendApi; import cn.iocoder.yudao.module.system.api.subscribe.SubscribeMessageSendApi;
import cn.iocoder.yudao.module.system.api.user.AdminUserApi;
import com.alibaba.excel.EasyExcel;
import com.alibaba.excel.support.ExcelTypeEnum;
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.baomidou.mybatisplus.core.metadata.IPage; import com.baomidou.mybatisplus.core.metadata.IPage;
import lombok.extern.slf4j.Slf4j; import lombok.extern.slf4j.Slf4j;
@ -40,10 +42,13 @@ import org.springframework.stereotype.Service;
import org.springframework.validation.annotation.Validated; import org.springframework.validation.annotation.Validated;
import javax.annotation.Resource; import javax.annotation.Resource;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
import java.math.BigDecimal; import java.math.BigDecimal;
import java.util.ArrayList; import java.net.URLEncoder;
import java.util.Collections; import java.nio.charset.StandardCharsets;
import java.util.List; import java.util.*;
import java.util.stream.Collectors;
import static cn.iocoder.yudao.framework.web.core.util.WebFrameworkUtils.getLoginUserId; import static cn.iocoder.yudao.framework.web.core.util.WebFrameworkUtils.getLoginUserId;
@ -286,4 +291,121 @@ public class FinancialPaymentServiceImpl implements FinancialPaymentService {
pageReqVO.setReceiveUserId(getLoginUserId()); pageReqVO.setReceiveUserId(getLoginUserId());
return financialPaymentMapper.selectPaymentTotal(pageReqVO); return financialPaymentMapper.selectPaymentTotal(pageReqVO);
} }
@Override
public void exportList(HttpServletResponse response, FinancialPaymentPageReqVO pageReqVO) {
try {
if (pageReqVO.getStatus() == null) {
pageReqVO.setStatus(0);
}
// 获取支付信息数据
List<FinancialPaymentDO> list = this.getFinancialPaymentPage(pageReqVO).getList();
list.removeIf(item -> item.getCompanyId() == null);
// 根据付款公司进行分组
Map<Long, List<FinancialPaymentDO>> companyIdMap = list.stream().collect(Collectors.groupingBy(FinancialPaymentDO::getCompanyId));
List<List<String>> data = new ArrayList<>();
for (Map.Entry<Long, List<FinancialPaymentDO>> entry : companyIdMap.entrySet()) {
// 设置表头
data.add(Arrays.asList(entry.getValue().get(0).getCompanyName(), entry.getValue().get(0).getCompanyName(), entry.getValue().get(0).getCompanyName(),
entry.getValue().get(0).getCompanyName(), entry.getValue().get(0).getCompanyName(), entry.getValue().get(0).getCompanyName(), entry.getValue().get(0).getCompanyName()));
data.add(this.setTitle());
// 提取所有公账 支付信息
List<FinancialPaymentDO> publicAccount = entry.getValue().stream()
.filter(item -> item.getType() != 9)
.collect(Collectors.toList());
// 提取所有私账 支付信息
List<FinancialPaymentDO> privateAccount = entry.getValue().stream()
.filter(item -> item.getType() == 9)
.collect(Collectors.toList());
// 遍历公账信息
for (FinancialPaymentDO financialPaymentDO : publicAccount) {
List<String> row = new ArrayList<>();
// 设置姓名
row.add(financialPaymentDO.getNickname());
// 设置报销部门
row.add(financialPaymentDO.getDeptName());
// 添加事项
row.add(financialPaymentDO.getReason());
// 添加金额
row.add(financialPaymentDO.getActualPayment().toString());
// 添加卡号
row.add(financialPaymentDO.getRecipientName());
// 添加公账/私账
row.add("公账");
// 添加备注
row.add(financialPaymentDO.getNickname() + "报销");
data.add(row);
}
if (CollUtil.isNotEmpty(publicAccount)) {
// 添加公账合计数据
BigDecimal publicAccountTotal = publicAccount.stream().map(FinancialPaymentDO::getActualPayment).reduce(BigDecimal.ZERO, BigDecimal::add);
data.add(Arrays.asList("公账总计", "公账总计", "公账总计", publicAccountTotal.toString(), "", "公账"));
}
// 遍历私账信息
for (FinancialPaymentDO financialPaymentDO : privateAccount) {
List<String> row = new ArrayList<>();
// 设置姓名
row.add(financialPaymentDO.getNickname());
// 设置报销部门
row.add(financialPaymentDO.getDeptName());
// 添加事项
row.add(financialPaymentDO.getReason());
// 添加金额
row.add(financialPaymentDO.getActualPayment().toString());
// 添加卡号
row.add(financialPaymentDO.getRecipientName());
// 添加公账/私账
row.add("私账");
// 添加备注
row.add(financialPaymentDO.getNickname() + "报销");
data.add(row);
}
if (CollUtil.isNotEmpty(privateAccount)) {
// 添加私账合计数据
BigDecimal privateAccountTotal = privateAccount.stream().map(FinancialPaymentDO::getActualPayment).reduce(BigDecimal.ZERO, BigDecimal::add);
data.add(Arrays.asList("私账总计", "私账总计", "私账总计", privateAccountTotal.toString(), "", "私账"));
}
}
EasyExcel.write(response.getOutputStream())
.autoCloseStream(false)
.excelType(ExcelTypeEnum.XLSX)
.sheet("账目明细")
.registerWriteHandler(new CustomCellStyleHandler())
.registerWriteHandler(new MergeSameRowCellsHandler())
.doWrite(data);
response.addHeader("Content-Disposition", "attachment;filename=" + URLEncoder.encode("账目", StandardCharsets.UTF_8.name()));
response.setContentType("application/vnd.ms-excel;charset=UTF-8");
} catch (IOException e) {
log.error("[exportList][导出失败]", e);
throw new RuntimeException(e);
}
}
private List<String> setTitle() {
List<String> titleRow = new ArrayList<>();
titleRow.add("姓名");
titleRow.add("报销部门");
titleRow.add("事项");
titleRow.add("金额");
titleRow.add("卡号");
titleRow.add("公账/私账");
titleRow.add("备注");
return titleRow;
}
} }

View File

@ -0,0 +1,141 @@
package cn.iocoder.yudao.module.bpm.service.financialpayment;
import com.alibaba.excel.metadata.Head;
import com.alibaba.excel.metadata.data.WriteCellData;
import com.alibaba.excel.write.handler.CellWriteHandler;
import com.alibaba.excel.write.metadata.holder.WriteSheetHolder;
import com.alibaba.excel.write.metadata.holder.WriteTableHolder;
import org.apache.poi.ss.usermodel.*;
import org.apache.poi.ss.util.CellRangeAddress;
import java.util.List;
public class MergeSameRowCellsHandler implements CellWriteHandler {
private int currentRowIndex = -1;
private Object lastValue = null;
private int startMergeColumnIndex = 0;
@Override
public void beforeCellCreate(WriteSheetHolder writeSheetHolder, WriteTableHolder writeTableHolder, Row row, Head head, Integer columnIndex, Integer relativeRowIndex, Boolean isHead) {
if (relativeRowIndex != null && relativeRowIndex != currentRowIndex) {
flushLastMerge(writeSheetHolder); // 处理上一行最后未合并的列
reset();
currentRowIndex = relativeRowIndex;
}
}
@Override
public void afterCellCreate(WriteSheetHolder writeSheetHolder, WriteTableHolder writeTableHolder, Cell cell, Head head, Integer relativeRowIndex, Boolean isHead) {
if (isHead != null && isHead) {
return;
}
Workbook workbook = writeSheetHolder.getSheet().getWorkbook();
Sheet sheet = writeSheetHolder.getSheet();
Object currentValue = getCellValue(cell);
// 确保是当前行才处理
if (relativeRowIndex != currentRowIndex) {
flushLastMerge(writeSheetHolder);
reset();
currentRowIndex = relativeRowIndex;
}
if (lastValue == null) {
startMergeColumnIndex = cell.getColumnIndex();
} else if (!currentValue.equals(lastValue)) {
int endMergeColumnIndex = cell.getColumnIndex() - 1;
if (startMergeColumnIndex < endMergeColumnIndex) {
try {
sheet.addMergedRegion(new CellRangeAddress(
currentRowIndex, currentRowIndex,
startMergeColumnIndex, endMergeColumnIndex
));
setCellStyle(workbook, sheet, currentRowIndex, startMergeColumnIndex, endMergeColumnIndex);
} catch (Exception ignored) {}
}
startMergeColumnIndex = cell.getColumnIndex();
}
lastValue = currentValue;
}
@Override
public void afterCellDispose(WriteSheetHolder writeSheetHolder, WriteTableHolder writeTableHolder, List<WriteCellData<?>> cellDataList, Cell cell, Head head, Integer relativeRowIndex, Boolean isHead) {
flushLastMerge(writeSheetHolder);
}
private void flushLastMerge(WriteSheetHolder writeSheetHolder) {
Sheet sheet = writeSheetHolder.getSheet();
Row row = sheet.getRow(currentRowIndex);
if (row == null || currentRowIndex < 0) {
return;
}
int lastCellNum = row.getLastCellNum();
if (lastCellNum <= 0) {
return;
}
int endMergeColumnIndex = lastCellNum - 1;
if (startMergeColumnIndex < endMergeColumnIndex) {
try {
sheet.addMergedRegion(new CellRangeAddress(
currentRowIndex, currentRowIndex,
startMergeColumnIndex, endMergeColumnIndex
));
setCellStyle(writeSheetHolder.getSheet().getWorkbook(), sheet, currentRowIndex, startMergeColumnIndex, endMergeColumnIndex);
} catch (Exception ignored) {}
}
}
private void setCellStyle(Workbook workbook, Sheet sheet, int rowIndex, int startCol, int endCol) {
CellStyle style = createMergedCellStyle(workbook);
Row row = sheet.getRow(rowIndex);
if (row != null) {
Cell firstCell = row.getCell(startCol);
if (firstCell != null) {
firstCell.setCellStyle(style);
}
}
}
private Object getCellValue(Cell cell) {
if (cell == null) {
return null;
}
switch (cell.getCellType()) {
case STRING:
return cell.getStringCellValue();
case NUMERIC:
if (DateUtil.isCellDateFormatted(cell)) {
return cell.getDateCellValue();
} else {
double value = cell.getNumericCellValue();
return value == (long) value ? (long) value : value;
}
case BOOLEAN:
return cell.getBooleanCellValue();
case FORMULA:
return cell.getCellFormula();
case BLANK:
return "";
default:
return null;
}
}
private CellStyle createMergedCellStyle(Workbook workbook) {
CellStyle style = workbook.createCellStyle();
style.setAlignment(HorizontalAlignment.CENTER);
style.setVerticalAlignment(VerticalAlignment.CENTER);
return style;
}
private void reset() {
lastValue = null;
startMergeColumnIndex = 0;
}
}

View File

@ -252,7 +252,7 @@ public class BpmOACashServiceImpl extends BpmOABaseService implements BpmOACashS
.setAmountPayable(isImprest == 1 ? amount.abs() : cash.getTotalMoney()) .setAmountPayable(isImprest == 1 ? amount.abs() : cash.getTotalMoney())
.setBeginTime(processInstance.getCreateTime()) .setBeginTime(processInstance.getCreateTime())
.setEndTime(processInstance.getEndTime()) .setEndTime(processInstance.getEndTime())
.setRecipientName(bankRespDTO.getNickname()) .setRecipientName(bankRespDTO != null ? bankRespDTO.getNickname() + "," + bankRespDTO.getBankNo() + "," + bankRespDTO.getBankName() : "")
.setCompanyId(deptRespDTO != null ? deptRespDTO.getId() : null) .setCompanyId(deptRespDTO != null ? deptRespDTO.getId() : null)
); );
} }

View File

@ -30,7 +30,6 @@ import cn.iocoder.yudao.module.system.api.loan.dto.LoanDTO;
import cn.iocoder.yudao.module.system.api.user.AdminUserApi; import cn.iocoder.yudao.module.system.api.user.AdminUserApi;
import cn.iocoder.yudao.module.system.api.user.dto.AdminUserRespDTO; import cn.iocoder.yudao.module.system.api.user.dto.AdminUserRespDTO;
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.baomidou.mybatisplus.core.conditions.update.LambdaUpdateWrapper;
import com.baomidou.mybatisplus.core.metadata.IPage; import com.baomidou.mybatisplus.core.metadata.IPage;
import org.flowable.engine.runtime.ProcessInstance; import org.flowable.engine.runtime.ProcessInstance;
import org.springframework.context.annotation.Lazy; import org.springframework.context.annotation.Lazy;
@ -289,7 +288,7 @@ public class BpmOAExpensesServiceImpl extends BpmOABaseService implements BpmOAE
.setProcessInstanceName(processInstance.getName()) .setProcessInstanceName(processInstance.getName())
.setBeginTime(processInstance.getCreateTime()) .setBeginTime(processInstance.getCreateTime())
.setEndTime(processInstance.getEndTime()) .setEndTime(processInstance.getEndTime())
.setRecipientName(bankRespDTO != null ? bankRespDTO.getNickname() : "") .setRecipientName(bankRespDTO != null ? bankRespDTO.getNickname() + "," + bankRespDTO.getBankNo() + "," + bankRespDTO.getBankName() : "")
.setCompanyFactoryId(dto.getId()) .setCompanyFactoryId(dto.getId())
); );
} }

View File

@ -143,7 +143,7 @@ public class BpmOAImprestServiceImpl extends BpmOABaseService implements BpmOAIm
.setProcessInstanceName(processInstance.getName()) .setProcessInstanceName(processInstance.getName())
.setBeginTime(processInstance.getCreateTime()) .setBeginTime(processInstance.getCreateTime())
.setEndTime(processInstance.getEndTime()) .setEndTime(processInstance.getEndTime())
.setRecipientName(bankRespDTO.getNickname()) .setRecipientName(bankRespDTO != null ? bankRespDTO.getNickname() + "," + bankRespDTO.getBankNo() + "," + bankRespDTO.getBankName() : "")
.setCompanyId(deptRespDTO != null ? deptRespDTO.getId() : null) .setCompanyId(deptRespDTO != null ? deptRespDTO.getId() : null)
); );
} }

View File

@ -174,7 +174,7 @@ public class BpmOALoanServiceImpl extends BpmOABaseService implements BpmOALoanS
.setProcessInstanceName(processInstance.getName()) .setProcessInstanceName(processInstance.getName())
.setBeginTime(processInstance.getCreateTime()) .setBeginTime(processInstance.getCreateTime())
.setEndTime(processInstance.getEndTime()) .setEndTime(processInstance.getEndTime())
.setRecipientName(bankRespDTO.getNickname()) .setRecipientName(bankRespDTO != null ? bankRespDTO.getNickname() + "," + bankRespDTO.getBankNo() + "," + bankRespDTO.getBankName() : "")
); );
} }
} }

View File

@ -147,7 +147,7 @@ public class BpmOAPaymentServiceImpl extends BpmOABaseService implements BpmOAPa
.setProcessInstanceName(processInstance.getName()) .setProcessInstanceName(processInstance.getName())
.setBeginTime(processInstance.getCreateTime()) .setBeginTime(processInstance.getCreateTime())
.setEndTime(processInstance.getEndTime()) .setEndTime(processInstance.getEndTime())
.setRecipientName(bankRespDTO.getNickname()) .setRecipientName(bankRespDTO != null ? bankRespDTO.getNickname() + "," + bankRespDTO.getBankNo() + "," + bankRespDTO.getBankName() : "")
.setCompanyId(deptRespDTO != null ? deptRespDTO.getId() : null) .setCompanyId(deptRespDTO != null ? deptRespDTO.getId() : null)
); );
} }

View File

@ -251,7 +251,7 @@ public class BpmOAReimbursementServiceImpl extends BpmOABaseService implements B
.setProcessInstanceName(processInstance.getName()) .setProcessInstanceName(processInstance.getName())
.setBeginTime(processInstance.getCreateTime()) .setBeginTime(processInstance.getCreateTime())
.setEndTime(processInstance.getEndTime()) .setEndTime(processInstance.getEndTime())
.setRecipientName(bpmOAReimbursementDO.getNickname()) .setRecipientName(bpmOAReimbursementDO.getNickname() + "," + bpmOAReimbursementDO.getBankNo() + "," + bpmOAReimbursementDO.getBankName())
.setCompanyId(deptRespDTO != null ? deptRespDTO.getId() : null) .setCompanyId(deptRespDTO != null ? deptRespDTO.getId() : null)
); );
} }

View File

@ -14,7 +14,7 @@
a.type as type, a.type as type,
a.cost_section AS costSection, a.cost_section AS costSection,
a.dept_id AS deptId, a.dept_id AS deptId,
d.name AS deptName, d.short_name AS deptName,
a.total_money AS amount, a.total_money AS amount,
a.detail AS detail, a.detail AS detail,
b.user_id AS userId, b.user_id AS userId,
@ -30,7 +30,7 @@
FROM bpm_oa_expenses b FROM bpm_oa_expenses b
JOIN bpm_oa_expenses_item a ON a.expenses_id = b.id JOIN bpm_oa_expenses_item a ON a.expenses_id = b.id
JOIN bpm_process_instance_ext c ON c.process_instance_id = b.process_instance_id JOIN bpm_process_instance_ext c ON c.process_instance_id = b.process_instance_id
LEFT JOIN system_dept d ON d.factory_id = a.dept_id LEFT JOIN sf_factory_info d ON d.id = a.dept_id
LEFT JOIN system_users u ON u.id = b.user_id LEFT JOIN system_users u ON u.id = b.user_id
LEFT JOIN system_bank ub ON ub.id = b.bank_id LEFT JOIN system_bank ub ON ub.id = b.bank_id
WHERE WHERE

View File

@ -270,7 +270,7 @@ public class DeptServiceImpl implements DeptService {
@Override @Override
@DataPermission(enable = false) @DataPermission(enable = false)
@Cacheable(cacheNames = RedisKeyConstants.DEPT_CHILD_ID_LIST, key = "#id") @Cacheable(cacheNames = RedisKeyConstants.DEPT_CHILD_ID_LIST, key = "#id", condition = "#id != null")
public List<DeptDO> getChildDept(Long id) { public List<DeptDO> getChildDept(Long id) {
return deptMapper.selectList(new LambdaQueryWrapperX<DeptDO>() return deptMapper.selectList(new LambdaQueryWrapperX<DeptDO>()

View File

@ -19,6 +19,6 @@ public interface StaffSalaryApi {
@PutMapping(PREFIX + "/updateIsGrant") @PutMapping(PREFIX + "/updateIsGrant")
@Operation(summary = "更新是否已发放薪资") @Operation(summary = "更新是否已发放薪资")
CommonResult<Boolean> updateIsGrant(@RequestParam("ids") Collection<Long> ids, CommonResult<Boolean> updateIsGrant(@RequestParam(value = "ids", required = false) Collection<Long> ids,
@RequestParam("isGrant") Integer isGrant); @RequestParam("isGrant") Integer isGrant);
} }

View File

@ -96,6 +96,15 @@ public class FactoryInfoController {
return success(respVO); return success(respVO);
} }
@GetMapping("/list")
@Operation(summary = "获得工厂以及公司列表 | 用于前端下拉框")
@PreAuthorize("@ss.hasPermission('smartfactory:factory-info:query')")
public CommonResult<List<FactorySimpleRespVO>> getList() {
List<FactoryInfoDO> factoryInfo = factoryInfoService.getList();
return success(BeanUtils.toBean(factoryInfo, FactorySimpleRespVO.class));
}
@GetMapping("/simple-list") @GetMapping("/simple-list")
@Operation(summary = "获得工厂列表 | 用于前端下拉框") @Operation(summary = "获得工厂列表 | 用于前端下拉框")
@PreAuthorize("@ss.hasPermission('smartfactory:factory-info:query')") @PreAuthorize("@ss.hasPermission('smartfactory:factory-info:query')")

View File

@ -18,7 +18,6 @@ import io.swagger.v3.oas.annotations.Operation;
import io.swagger.v3.oas.annotations.Parameter; import io.swagger.v3.oas.annotations.Parameter;
import io.swagger.v3.oas.annotations.Parameters; import io.swagger.v3.oas.annotations.Parameters;
import io.swagger.v3.oas.annotations.tags.Tag; import io.swagger.v3.oas.annotations.tags.Tag;
import org.springframework.security.access.prepost.PreAuthorize;
import org.springframework.validation.annotation.Validated; import org.springframework.validation.annotation.Validated;
import org.springframework.web.bind.annotation.*; import org.springframework.web.bind.annotation.*;
import org.springframework.web.multipart.MultipartFile; import org.springframework.web.multipart.MultipartFile;
@ -140,10 +139,29 @@ public class StaffController {
public void exportStaffExcel(@Valid StaffPageReqVO pageReqVO, public void exportStaffExcel(@Valid StaffPageReqVO pageReqVO,
HttpServletResponse response) throws IOException { HttpServletResponse response) throws IOException {
pageReqVO.setPageSize(PageParam.PAGE_SIZE_NONE); pageReqVO.setPageSize(PageParam.PAGE_SIZE_NONE);
pageReqVO.setStatus(1);
List<StaffDO> list = staffService.getStaffPage(pageReqVO).getList(); List<StaffDO> list = staffService.getStaffPage(pageReqVO).getList();
// 获取工种字典值
List<DictDataRespDTO> dictDataRespDTOS = dictDataApi.getDictDataList("user_work_type").getCheckedData();
Map<String, String> workTypeMap = dictDataRespDTOS.stream().collect(Collectors.toMap(DictDataRespDTO::getValue, DictDataRespDTO::getLabel));
// 获取工厂信息Map
Map<Long, FactoryInfoDO> factoryInfoDOMap = convertMap(factoryInfoService.getFactoryList(), FactoryInfoDO::getId);
List<StaffRespVO> respVOS = BeanUtils.toBean(list, StaffRespVO.class);
respVOS.forEach(item -> {
if (item.getWorkTypeId() != null) {
item.setWorkTypeName(workTypeMap.getOrDefault(item.getWorkTypeId().toString(), ""));
}
// 设置性别
item.setSexStr(item.getSex() == null ? null : item.getSex() == 1 ? "" : "");
// 设置工厂名称
item.setFactoryName(factoryInfoDOMap.get(item.getFactoryId()) != null ? factoryInfoDOMap.get(item.getFactoryId()).getShortName() : null);
});
// 导出 Excel // 导出 Excel
ExcelUtils.write(response, "员工.xls", "数据", StaffRespVO.class, ExcelUtils.write(response, "员工.xls", "数据", StaffRespVO.class, respVOS);
BeanUtils.toBean(list, StaffRespVO.class));
} }
@GetMapping("/get-import-template") @GetMapping("/get-import-template")

View File

@ -20,27 +20,34 @@ public class StaffRespVO {
@ExcelProperty("姓名") @ExcelProperty("姓名")
private String nickName; private String nickName;
@Schema(description = "工厂名称", example = "6971")
@ExcelProperty("工厂名称")
private String factoryName;
@Schema(description = "年龄") @Schema(description = "年龄")
@ExcelProperty("年龄") @ExcelProperty("年龄")
private Integer age; private Integer age;
@Schema(description = "用户性别0男 1女 2未知") @Schema(description = "用户性别1男 2女")
@ExcelProperty("性别")
private Integer sex; private Integer sex;
@Schema(description = "用户性别1男 2女")
@ExcelProperty("性别")
private String sexStr;
@Schema(description = "工种id", example = "6971") @Schema(description = "工种id", example = "6971")
private Integer workTypeId; private Integer workTypeId;
@Schema(description = "工种名称", example = "6971")
@ExcelProperty("工种")
private String workTypeName;
@Schema(description = "所属业务类型") @Schema(description = "所属业务类型")
private Integer businessType; private Integer businessType;
@Schema(description = "工厂id", example = "6971") @Schema(description = "工厂id", example = "6971")
private Long factoryId; private Long factoryId;
@Schema(description = "工厂名称", example = "6971")
@ExcelProperty("工厂名称")
private String factoryName;
@Schema(description = "手机号") @Schema(description = "手机号")
@ExcelProperty("手机号") @ExcelProperty("手机号")
private String mobile; private String mobile;

View File

@ -39,6 +39,7 @@ public interface CameraDeviceMapper extends BaseMapperX<CameraDeviceDO> {
return selectList(new LambdaQueryWrapperX<CameraDeviceDO>() return selectList(new LambdaQueryWrapperX<CameraDeviceDO>()
.eq(factoryId != null, CameraDeviceDO::getFactoryId, factoryId) .eq(factoryId != null, CameraDeviceDO::getFactoryId, factoryId)
.eq(CameraDeviceDO::getStatus, CommonStatusEnum.ENABLE.getStatus()) .eq(CameraDeviceDO::getStatus, CommonStatusEnum.ENABLE.getStatus())
.eq(CameraDeviceDO::getIsShow, 1)); .eq(CameraDeviceDO::getIsShow, 1)
.orderByAsc(CameraDeviceDO::getSort));
} }
} }

View File

@ -158,4 +158,10 @@ public interface FactoryInfoService {
* @return 工厂列表 * @return 工厂列表
*/ */
List<FactoryInfoDO> getFactoryListByLoginUser(); List<FactoryInfoDO> getFactoryListByLoginUser();
/**
* 获得工厂以及公司列表
* @return 工厂列表
*/
List<FactoryInfoDO> getList();
} }

View File

@ -422,4 +422,12 @@ public class FactoryInfoServiceImpl implements FactoryInfoService {
return factoryInfoMapper.selectListByType(factoryIds); return factoryInfoMapper.selectListByType(factoryIds);
} }
@Override
public List<FactoryInfoDO> getList() {
return factoryInfoMapper.selectList(new LambdaQueryWrapperX<FactoryInfoDO>()
.eq(FactoryInfoDO::getStatus, CommonStatusEnum.ENABLE.getStatus())
.orderByAsc(FactoryInfoDO::getType));
}
} }