feat(wages): 优化工资详情展示和导入功能

- 在 wages 静态页面中添加额外数据列,用于展示额外的工资信息
- 修改 wages 实体类,增加 additionalData 字段存储额外数据
- 更新 wages 映射文件,添加额外数据字段的数据库操作
- 优化 wages 服务实现类,处理导入时的额外数据
This commit is contained in:
jjLv 2025-01-16 20:01:18 +08:00
parent 2f34c8db5a
commit c830441eac
14 changed files with 145 additions and 42 deletions

View File

@ -16,4 +16,28 @@ public class PayAccountInfoBean {
*/
String accountNumber;
/**
* 账户名
*/
String accountName;
/**
* 农民工工资代发账户
*/
String specialAccountSuffix;
/**
* 专户属地
*/
String accountTerritory;
/**
* 开户行
*/
String openingBank;
/**
* 开户行地址
*/
String openingBankAddress;
}

View File

@ -93,30 +93,37 @@ public class PayAccountInfoServiceImpl implements PayAccountInfoService {
}
// 导出标题
ExcelWriter writer = cn.hutool.poi.excel.ExcelUtil.getWriter(true);
writer.merge(5, fileName,false);
writer.merge(7, fileName,false);
// 合并二级表头
writer.writeCellValue(0,1,"序号");
writer.setColumnWidth(0, 8);
writer.writeCellValue(1,1,"账户名称");
writer.writeCellValue(1,1,"账户名称");
writer.setColumnWidth(1, 25);
writer.writeCellValue(2,1,"账户");
writer.setColumnWidth(2, 35);
writer.writeCellValue(3,1,"备注");
writer.writeCellValue(3,1,"开户行");
writer.setColumnWidth(3, 35);
writer.writeCellValue(4,1,"操作人");
writer.setColumnWidth(4, 10);
writer.writeCellValue(5,1,"操作时间");
writer.setColumnWidth(5, 25);
writer.writeCellValue(4,1,"开户行地址");
writer.setColumnWidth(4, 35);
writer.writeCellValue(5,1,"备注");
writer.setColumnWidth(5, 35);
writer.writeCellValue(6,1,"操作人");
writer.setColumnWidth(6, 10);
writer.writeCellValue(7,1,"操作时间");
writer.setColumnWidth(7, 25);
// 设置表头高度单元格宽度
writer.setRowHeight(0, 35);
for (int i = 0; i < list.size(); i++) {
writer.writeCellValue(0, 2 + i, i + 1);
writer.writeCellValue(1, 2 + i, list.get(i).getName()==null?"":list.get(i).getName());
writer.writeCellValue(2, 2 + i, list.get(i).getAccountNumber()==null?"":list.get(i).getAccountNumber());
writer.writeCellValue(3, 2 + i, list.get(i).getRemarks()==null?"":list.get(i).getRemarks());
writer.writeCellValue(4, 2 + i, list.get(i).getCzyName()==null?"":list.get(i).getCzyName());
writer.writeCellValue(5, 2 + i, list.get(i).getCzsj()==null?"":list.get(i).getCzsj());
writer.writeCellValue(3, 2 + i, list.get(i).getOpeningBank()==null?"":list.get(i).getOpeningBank());
writer.writeCellValue(4, 2 + i, list.get(i).getOpeningBankAddress()==null?"":list.get(i).getOpeningBankAddress());
writer.writeCellValue(5, 2 + i, list.get(i).getRemarks()==null?"":list.get(i).getRemarks());
writer.writeCellValue(6, 2 + i, list.get(i).getCzyName()==null?"":list.get(i).getCzyName());
writer.writeCellValue(7, 2 + i, list.get(i).getCzsj()==null?"":list.get(i).getCzsj());
writer.setRowHeight(2 + i, 35);
}
response.setContentType("application/vnd.openxmlformats-officedocument.spreadsheetml.sheet;charset=utf-8");

View File

@ -123,7 +123,7 @@ public class ImportNoPhotoExcelHelper {
case "CareerBean":
return colNum == 12;
case "WagesDetailsBean":
return colNum == 19;
return colNum >= 18;
case "VoucherDetailsBean":
return colNum == 28;
case "CCBWagesDetailsBean":
@ -351,7 +351,8 @@ public class ImportNoPhotoExcelHelper {
obj.put("suggest", row.getCell(11).getStringCellValue());
break;
case "WagesDetailsBean":
setExcleTString(19, row, 0);
int dynamicColumnCount = row.getLastCellNum();
setExcleTString(dynamicColumnCount, row, 0);
if (row.getCell(0) != null)
obj.put("zh", row.getCell(0).getStringCellValue());
if (row.getCell(1) != null)
@ -388,8 +389,24 @@ public class ImportNoPhotoExcelHelper {
obj.put("lx", row.getCell(16).getStringCellValue());
if (row.getCell(17) != null)
obj.put("qdbz", row.getCell(17).getStringCellValue());
if (row.getCell(18) != null)
obj.put("hnbz", row.getCell(18).getStringCellValue());
// if (row.getCell(18) != null)
// obj.put("hnbz", row.getCell(18).getStringCellValue());
// 处理第18列之后的所有列
StringBuilder additionalData = new StringBuilder();
for (int i = 18; i < dynamicColumnCount; i++) {
Cell cell = row.getCell(i);
if (cell != null) {
String columnName = sheet.getRow(5).getCell(i).getStringCellValue();
String cellValue = cell.getStringCellValue();
if (additionalData.length() > 0) {
additionalData.append("; ");
}
additionalData.append(columnName).append(": ").append(cellValue);
}
}
if (additionalData.length() > 0) {
obj.put("additionalData", additionalData.toString());
}
break;
case "CCBWagesDetailsBean":
setExcleTString(12, row, -1);

View File

@ -58,4 +58,6 @@ public class WagesDetailsBean {
private String cbi;
private String zc;
private String additionalData;
}

View File

@ -108,10 +108,10 @@ public class WagesServiceImpl implements WagesService {
lstError = lstError + "" + obj.getString("rowNo") + "行,用途不能为空;";
continue;
}
if (StringUtils.isBlank(ywckh)) {
lstError = lstError + "" + obj.getString("rowNo") + "行,业务参考号不能为空;";
continue;
}
// if (StringUtils.isBlank(ywckh)) {
// lstError = lstError + "" + obj.getString("rowNo") + "行,业务参考号不能为空;";
// continue;
// }
WagesDetailsBean bean = new WagesDetailsBean();
bean.setMonth(month);
@ -156,6 +156,7 @@ public class WagesServiceImpl implements WagesService {
bean.setYwckh(ywckh);
bean.setLx(obj.getString("lx"));
bean.setQdbz(obj.getString("qdbz"));
bean.setAdditionalData(obj.getString("additionalData"));
list.add(bean);
}
}else {
@ -433,6 +434,8 @@ public class WagesServiceImpl implements WagesService {
writer.setColumnWidth(23, 25);
writer.writeCellValue(24,1,"渠道标志");
writer.setColumnWidth(24, 25);
writer.writeCellValue(25,1,"额外数据");
writer.setColumnWidth(25, 25);
// 设置表头高度单元格宽度
writer.setRowHeight(0, 35);
for (int i = 0; i < list.size(); i++) {
@ -461,6 +464,7 @@ public class WagesServiceImpl implements WagesService {
writer.writeCellValue(22, 2 + i, list.get(i).getYwckh()==null?"":list.get(i).getYwckh());
writer.writeCellValue(23, 2 + i, list.get(i).getLx()==null?"":list.get(i).getLx());
writer.writeCellValue(24, 2 + i, list.get(i).getQdbz()==null?"":list.get(i).getQdbz());
writer.writeCellValue(25, 2 + i, list.get(i).getAdditionalData() == null ? "" : list.get(i).getAdditionalData().replace("; ", "\n"));
writer.setRowHeight(2 + i, 35);
}
response.setContentType("application/vnd.openxmlformats-officedocument.spreadsheetml.sheet;charset=utf-8");

View File

@ -113,6 +113,8 @@ public class WagesStaticsServiceImpl implements WagesStaticsService {
writer.setColumnWidth(23, 25);
writer.writeCellValue(24,1,"渠道标志");
writer.setColumnWidth(24, 25);
writer.writeCellValue(25,1,"额外数据");
writer.setColumnWidth(25, 25);
// 设置表头高度单元格宽度
writer.setRowHeight(0, 35);
for (int i = 0; i < list.size(); i++) {
@ -141,6 +143,8 @@ public class WagesStaticsServiceImpl implements WagesStaticsService {
writer.writeCellValue(22, 2 + i, list.get(i).getYwckh()==null?"":list.get(i).getYwckh());
writer.writeCellValue(23, 2 + i, list.get(i).getLx()==null?"":list.get(i).getLx());
writer.writeCellValue(24, 2 + i, list.get(i).getQdbz()==null?"":list.get(i).getQdbz());
writer.writeCellValue(25, 2 + i, list.get(i).getAdditionalData() == null ? "" : list.get(i).getAdditionalData().replace("; ", "\n"));
writer.setRowHeight(2 + i, 35);
}
response.setContentType("application/vnd.openxmlformats-officedocument.spreadsheetml.sheet;charset=utf-8");

View File

@ -1,4 +1,4 @@
server.port=2002
server.port=20003
#????·??
server.servlet.context-path=/yncw
#mysql?????????
@ -26,8 +26,8 @@ mybatis.configuration.map-underscore-to-camel-case=true
#spring.redis.password=
spring.redis.host=192.168.0.14
spring.redis.port=2001
spring.redis.password=Dszbns@Redis123!
spring.redis.port=2004
spring.redis.password=Plzbns@Redis123!
# ???
logging.config=classpath:logback-boot.xml
log.level.root=info

View File

@ -4,13 +4,14 @@
"http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="com.bonus.boot.manager.ca.bm.dao.PayAccountInfoDao">
<insert id="add">
insert into ca_bm_pay_account_info (name,remark,oper_user,oper_time,is_active, account_number)
values (#{name},#{remarks},#{czy},now(),'1', #{accountNumber})
insert into ca_bm_pay_account_info (name,remark,oper_user,oper_time,is_active, account_number,opening_bank,opening_bank_address)
values (#{name},#{remarks},#{czy},now(),'1', #{accountNumber},#{openingBank},#{openingBankAddress})
</insert>
<update id="update">
update ca_bm_pay_account_info
set name = #{name},remark = #{remarks},oper_user = #{czy},oper_time = now(), account_number = #{accountNumber}
set name = #{name},remark = #{remarks},oper_user = #{czy},oper_time = now(), account_number = #{accountNumber},
opening_bank = #{openingBank},opening_bank_address = #{openingBankAddress}
where id = #{id}
</update>
@ -30,15 +31,16 @@
</select>
<select id="getList" resultType="com.bonus.boot.manager.ca.bm.entity.PayAccountInfoBean">
select
cbpai.id,
cbpai.name,
cbpai.account_number as accountNumber,
cbpai.remark as remarks,
su.username as czyName,
cbpai.oper_time as czsj
select cbpai.id,
cbpai.name,
cbpai.account_number as accountNumber,
cbpai.opening_bank as openingBank,
cbpai.opening_bank_address as openingBankAddress,
cbpai.remark as remarks,
su.username as czyName,
cbpai.oper_time as czsj
from ca_bm_pay_account_info cbpai
left join sys_user su on su.is_active = '1' and cbpai.oper_user = su.id
left join sys_user su on su.is_active = '1' and cbpai.oper_user = su.id
where cbpai.is_active = '1'
<if test="params.name != null and params.name !='' ">
and cbpai.name like concat ('%',#{params.name},'%')
@ -46,9 +48,15 @@
order by cbpai.oper_time desc
</select>
<select id="getById" resultType="com.bonus.boot.manager.ca.bm.entity.PayAccountInfoBean">
select id,name,remark as remarks, account_number as accountNumber
select id,
name,
remark as remarks,
account_number as accountNumber,
opening_bank as openingBank,
opening_bank_address as openingBankAddress
from ca_bm_pay_account_info
where is_active = '1' and id = #{id}
where is_active = '1'
and id = #{id}
</select>
<select id="getIdByName" resultType="java.lang.String">
select id
@ -61,6 +69,8 @@
cbpai.id,
cbpai.name,
cbpai.account_number as accountNumber,
cbpai.opening_bank as openingBank,
cbpai.opening_bank_address as openingBankAddress,
cbpai.remark as remarks,
su.username as czyName,
cbpai.oper_time as czsj

View File

@ -71,10 +71,10 @@
</select>
<insert id="insertWagesDetails">
insert into vw_wages_details (ZH, HM, JE, SJDKJE, ZT, ZS, CKH, TS, KHH, KHD, JBR, QWR, SFKZHM, SFKZH, YT, YT_SZ, YWCKH, LX, QDBZ,VW_ID,MONTH)
insert into vw_wages_details (ZH, HM, JE, SJDKJE, ZT, ZS, CKH, TS, KHH, KHD, JBR, QWR, SFKZHM, SFKZH, YT, YT_SZ, YWCKH, LX, QDBZ,VW_ID,MONTH,additionalData)
VALUES
<foreach collection="list" item="bean" separator=",">
(#{bean.zh},#{bean.hm},#{bean.je},#{bean.sjdkje},#{bean.zt},#{bean.zs},#{bean.ckh},#{bean.ts},#{bean.khh},#{bean.khd},#{bean.jbr},#{bean.qwr},#{bean.sfkzhm},#{bean.sfkzh},#{bean.yt},#{bean.ytSz},#{bean.ywckh},#{bean.lx},#{bean.qdbz},#{bean.vwId},#{bean.month})
(#{bean.zh},#{bean.hm},#{bean.je},#{bean.sjdkje},#{bean.zt},#{bean.zs},#{bean.ckh},#{bean.ts},#{bean.khh},#{bean.khd},#{bean.jbr},#{bean.qwr},#{bean.sfkzhm},#{bean.sfkzh},#{bean.yt},#{bean.ytSz},#{bean.ywckh},#{bean.lx},#{bean.qdbz},#{bean.vwId},#{bean.month},#{bean.additionalData})
</foreach>
</insert>
@ -104,7 +104,8 @@
</select>
<select id="getWagesDetails" resultType="com.bonus.boot.manager.wages.entity.WagesDetailsBean">
select vwd.id,vwd.zh, vwd.hm, vwd.je, vwd.sjdkje, vwd.zt, vwd.zs, vwd.ckh, vwd.ts, vwd.khh, vwd.khd, vwd.jbr, vwd.qwr, vwd.sfkzhm, vwd.sfkzh, vwd.yt, vwd.yt_sz, vwd.ywckh, vwd.lx, vwd.qdbz, vvd.ZQ, vvd.PZBH, vvd.zy as summary, vvd.zgldx as sub, vvd.fzgldx1 as project, vvd.fzgldx2 as company
select vwd.id,vwd.zh, vwd.hm, vwd.je, vwd.sjdkje, vwd.zt, vwd.zs, vwd.ckh, vwd.ts, vwd.khh, vwd.khd, vwd.jbr, vwd.qwr, vwd.sfkzhm, vwd.sfkzh, vwd.yt, vwd.yt_sz, vwd.ywckh, vwd.lx, vwd.qdbz, vvd.ZQ, vvd.PZBH, vvd.zy as summary, vvd.zgldx as sub, vvd.fzgldx1 as project, vvd.fzgldx2 as company,
vwd.additionalData
from vw_wages_details vwd
left join vw_voucher_details vvd on vvd.PZBH_SZ = vwd.YT_SZ
where vwd.VW_ID = #{id}

View File

@ -11,7 +11,7 @@
vwd.sfkzhm, vwd.sfkzh, vwd.yt, vwd.ywckh, vwd.lx, vwd.qdbz,vwd.YT_SZ,
vvw1.title, vvw1.file_name, vvw1.file_url, vvw2.file_name as voucherFileName, vvw2.file_url as
voucherFileUrl,
vvd.zq, vvd.zy, vvd.zgldx, vvd.fzgldx1, vvd.fzgldx2
vvd.zq, vvd.zy, vvd.zgldx, vvd.fzgldx1, vvd.fzgldx2, vwd.additionalData
FROM vw_wages_details vwd
LEFT JOIN vw_voucher_wages vvw1 ON vvw1.ID = vwd.VW_ID
LEFT JOIN vw_voucher_details vvd ON vvd.PZBH_SZ = vwd.YT_SZ
@ -89,7 +89,7 @@
<select id="getWagesDetails" resultType="com.bonus.boot.manager.wages.entity.WagesDetailsBean">
select vwd.id,vwd.zh, vwd.hm, vwd.je, vwd.sjdkje, vwd.zt, vwd.zs, vwd.ckh, vwd.ts, vwd.khh, vwd.khd, vwd.jbr,
vwd.qwr, vwd.sfkzhm, vwd.sfkzh, vwd.yt, vwd.yt_sz, vwd.ywckh, vwd.lx, vwd.qdbz, vvd.ZQ, vvd.PZBH, vvd.zy as
summary, vvd.zgldx as sub, vvd.fzgldx1 as project, vvd.fzgldx2 as company
summary, vvd.zgldx as sub, vvd.fzgldx1 as project, vvd.fzgldx2 as company, vwd.additionalData
from vw_wages_details vwd
left join vw_voucher_details vvd on vvd.PZBH_SZ = vwd.YT_SZ
where 1=1

View File

@ -19,7 +19,7 @@
<form class="layui-form" action="" method="post" onsubmit="return false">
<input type="hidden" id="id" name="id">
<div class="layui-input-inline"style="float: left;width: 50%;margin-top: 2%;margin-left: 20%" >
<label class="layui-form-label" style="width: 30%"><i class="tip-required" style="color: red;font-size: 20px">*</i> 付款账户名称:</label>
<label class="layui-form-label" style="width: 30%"><i class="tip-required" style="color: red;font-size: 20px">*</i> 账户名称:</label>
<div class="layui-input-block">
<input style="width: 85%" type="text" name="name" id="name" maxlength="50" lay-verify="required" class="layui-input">
</div>
@ -32,6 +32,20 @@
</div>
</div>
<div class="layui-input-inline"style="float: left;width: 50%;margin-top: 2%;margin-left: 20%" >
<label class="layui-form-label" style="width: 30%">开户行:</label>
<div class="layui-input-block">
<input style="width: 85%" type="text" name="openingBank" id="openingBank" maxlength="50" class="layui-input">
</div>
</div>
<div class="layui-input-inline"style="float: left;width: 50%;margin-top: 2%;margin-left: 20%" >
<label class="layui-form-label" style="width: 30%">开户行地址:</label>
<div class="layui-input-block">
<input style="width: 85%" type="text" name="openingBankAddress" id="openingBankAddress" maxlength="50" class="layui-input">
</div>
</div>
<div class="layui-input-inline"style="float: left;width: 50%;margin-top: 2%;margin-left: 20%">
<label class="layui-form-label" style="width: 30%">备注:</label>
<div class="layui-input-block">
@ -74,6 +88,8 @@
$("#name").val(data.name);
$("#accountNumber").val(data.accountNumber);
$("#remarks").val(data.remarks);
$("#openingBank").val(data.openingBank);
$("#openingBankAddress").val(data.openingBankAddress);
}
});
}
@ -94,6 +110,8 @@
formdata.name = $("#name").val();
formdata.accountNumber = $("#accountNumber").val();
formdata.remarks = $("#remarks").val();
formdata.openingBank = $("#openingBank").val();
formdata.openingBankAddress = $("#openingBankAddress").val();
$.ajax({
type : 'post',
url : ctxPath + '/payAccountInfo',

View File

@ -48,7 +48,7 @@
添加
</button>
<button id="exportBt" class="layui-btn">
下载
模板下载
</button>
</div>
</form>
@ -109,12 +109,14 @@
, cellMinWidth: 80
, cols: [[ //表头
{field: 'number', width: 100, title: '序号', align: 'center', type: 'numbers'}
, {field: 'name', align: 'center', title: '付款账户名称'}
, {field: 'name', align: 'center', title: '账户名称'}
, {
field: 'accountNumber', align: 'center', title: '账户', templet: function (d) {
return maskAccountNumber(d.accountNumber);
}
}
, {field: 'openingBank', align: 'center', title: '开户行'}
, {field: 'openingBankAddress', align: 'center', title: '开户行地址'}
, {field: 'remarks', align: 'center', title: '备注'}
, {field: 'czyName', align: 'center', title: '操作人'}
, {field: 'czsj', align: 'center', title: '操作时间'}

View File

@ -164,6 +164,20 @@
, {field: 'ywckh', width: 200, align: 'center', title: '业务参考号'}
, {field: 'lx', width: 200, align: 'center', title: '类型'}
, {field: 'qdbz', width: 200, align: 'center', title: '渠道标志'}
, {field: 'additionalData', width: 200, align: 'center', title: '额外数据',templet: function (d) {
const additionalData = d.additionalData;
if (additionalData != null && additionalData !== '' && additionalData !== 'null') {
var additionalDataArr = additionalData.split(';');
var additionalDataHtml = '';
for (var i = 0; i < additionalDataArr.length; i++) {
additionalDataHtml += additionalDataArr[i] + '<br>';
}
return additionalDataHtml;
} else {
return '';
}
}}
, {width: 200, align: 'center',title:'凭证附件', templet: '#voucher'}
, {width: 200, align: 'center',title:'工资附件', templet: '#wages'}
]]