人员工资附件excel读取
This commit is contained in:
parent
5e97ee80f7
commit
01dbec485c
|
|
@ -0,0 +1,388 @@
|
||||||
|
package zcgj.zcdev.zcdev.fs.plugin.form;
|
||||||
|
|
||||||
|
import com.alibaba.fastjson.JSONArray;
|
||||||
|
import com.alibaba.fastjson.JSONObject;
|
||||||
|
import kd.bos.bill.AbstractBillPlugIn;
|
||||||
|
import kd.bos.bill.BillShowParameter;
|
||||||
|
import kd.bos.bill.OperationStatus;
|
||||||
|
import kd.bos.cache.CacheFactory;
|
||||||
|
import kd.bos.cache.tempfile.TempFileCacheDownloadable;
|
||||||
|
import kd.bos.dataentity.OperateOption;
|
||||||
|
import kd.bos.dataentity.entity.DynamicObject;
|
||||||
|
import kd.bos.dataentity.entity.DynamicObjectCollection;
|
||||||
|
import kd.bos.dataentity.utils.StringUtils;
|
||||||
|
import kd.bos.db.DB;
|
||||||
|
import kd.bos.db.DBRoute;
|
||||||
|
import kd.bos.db.ResultSetHandler;
|
||||||
|
import kd.bos.entity.datamodel.events.ChangeData;
|
||||||
|
import kd.bos.entity.datamodel.events.PropertyChangedArgs;
|
||||||
|
import kd.bos.entity.operate.result.OperationResult;
|
||||||
|
import kd.bos.fileservice.FileService;
|
||||||
|
import kd.bos.fileservice.FileServiceFactory;
|
||||||
|
import kd.bos.form.control.AttachmentPanel;
|
||||||
|
import kd.bos.form.control.Control;
|
||||||
|
import kd.bos.form.control.EntryGrid;
|
||||||
|
import kd.bos.form.control.Toolbar;
|
||||||
|
import kd.bos.form.control.events.ClickListener;
|
||||||
|
import kd.bos.form.control.events.UploadEvent;
|
||||||
|
import kd.bos.form.control.events.UploadListener;
|
||||||
|
import kd.bos.form.events.AfterDoOperationEventArgs;
|
||||||
|
import kd.bos.form.events.ClientCallBackEvent;
|
||||||
|
import kd.bos.id.ID;
|
||||||
|
import kd.bos.logging.Log;
|
||||||
|
import kd.bos.logging.LogFactory;
|
||||||
|
import kd.bos.servicehelper.AttachmentServiceHelper;
|
||||||
|
import kd.bos.servicehelper.operation.OperationServiceHelper;
|
||||||
|
import kd.bos.servicehelper.operation.SaveServiceHelper;
|
||||||
|
import kd.sdk.plugin.Plugin;
|
||||||
|
import org.apache.poi.ss.usermodel.*;
|
||||||
|
|
||||||
|
import java.io.IOException;
|
||||||
|
import java.io.InputStream;
|
||||||
|
import java.math.BigDecimal;
|
||||||
|
import java.net.URL;
|
||||||
|
import java.nio.charset.StandardCharsets;
|
||||||
|
import java.security.MessageDigest;
|
||||||
|
import java.util.*;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 人员工资附件excel读取,导入插件
|
||||||
|
*/
|
||||||
|
public class SalaryPlugin extends AbstractBillPlugIn implements Plugin, UploadListener {
|
||||||
|
private static final Log log = LogFactory.getLog(SalaryPlugin.class);
|
||||||
|
|
||||||
|
private static final String[] COLUMNKEYA = new String[]{"zcgj_name","zcgj_number","zcgj_personno","zcgj_persontype","zcgj_cbstype" ,"zcgj_yingfa" ,"zcgj_shebao" ,"zcgj_gongjijin" ,"zcgj_nianjin" ,"zcgj_geshui" ,"zcgj_shifa","zcgj_remark"};
|
||||||
|
|
||||||
|
private static final Set<String> storSet = new HashSet<String>();
|
||||||
|
static {
|
||||||
|
storSet.add("zcgj_yingfa");
|
||||||
|
storSet.add("zcgj_shebao");
|
||||||
|
storSet.add("zcgj_gongjijin");
|
||||||
|
storSet.add("zcgj_nianjin");
|
||||||
|
storSet.add("zcgj_geshui");
|
||||||
|
storSet.add("zcgj_shifa");
|
||||||
|
}
|
||||||
|
|
||||||
|
public void registerListener(EventObject e) {
|
||||||
|
super.registerListener(e);
|
||||||
|
AttachmentPanel toolbar = this.getControl("attachmentpanel");
|
||||||
|
toolbar.addUploadListener(this);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void afterUpload(UploadEvent evt) {
|
||||||
|
UploadListener.super.afterUpload(evt);
|
||||||
|
OperateOption option= OperateOption.create();
|
||||||
|
Object[] urls = evt.getUrls();
|
||||||
|
String url = (String)((Map)urls[0]).get("url");
|
||||||
|
OperationResult result = OperationServiceHelper.executeOperate("save", "zcgj_salary", new DynamicObject[]{ this.getModel().getDataEntity(true)}, option);
|
||||||
|
loadTextFileString(url);
|
||||||
|
sumData();
|
||||||
|
this.getView().addClientCallBack("auto_save",0);//附件上传后自动保存
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void clientCallBack(ClientCallBackEvent e) {
|
||||||
|
super.clientCallBack(e);
|
||||||
|
if(e.getName().equals("auto_save")) {
|
||||||
|
AttachmentPanel attachmentPanel = getControl("attachmentpanel");
|
||||||
|
List<Map<String, Object>> data = attachmentPanel.getAttachmentData();
|
||||||
|
if(data !=null && !data.isEmpty()) {
|
||||||
|
this.getView().invokeOperation("save");
|
||||||
|
this.getView().invokeOperation("refresh");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void afterRemove(UploadEvent evt) {
|
||||||
|
UploadListener.super.afterRemove(evt);
|
||||||
|
this.getView().invokeOperation("save");
|
||||||
|
this.getExcelData();
|
||||||
|
sumData();
|
||||||
|
this.getView().invokeOperation("refresh");
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 从临时文件缓存中获取文件,转为字符流导入
|
||||||
|
*/
|
||||||
|
private void loadTextFileString(String fileUrl){
|
||||||
|
|
||||||
|
long billId = this.getModel().getDataEntity().getLong("id");
|
||||||
|
|
||||||
|
TempFileCacheDownloadable downLoad = (TempFileCacheDownloadable) CacheFactory.getCommonCacheFactory().getTempFileCache();
|
||||||
|
|
||||||
|
InputStream inStream = null;
|
||||||
|
try {
|
||||||
|
String[] queryParams = new URL(fileUrl).getQuery().split("&");
|
||||||
|
Map<String, String> downloadFileParams = new HashMap<>();
|
||||||
|
for (String queryParam : queryParams) {
|
||||||
|
String[] p = queryParam.split("=");
|
||||||
|
downloadFileParams.put(p[0], p[1]);
|
||||||
|
}
|
||||||
|
TempFileCacheDownloadable.Content content = downLoad.get(downloadFileParams.get("configKey"), downloadFileParams.get("id"));
|
||||||
|
inStream = content.getInputStream();
|
||||||
|
|
||||||
|
//自动识别 XLS / XLSX,无需自己判断格式
|
||||||
|
Workbook workbook = WorkbookFactory.create(inStream);
|
||||||
|
//getSheetJsonArray,请保持不变
|
||||||
|
JSONArray sheetJsonArray = getSheetJsonArray(
|
||||||
|
stringArrayToMd5(COLUMNKEYA),
|
||||||
|
workbook,
|
||||||
|
0
|
||||||
|
);
|
||||||
|
List<Object[]> params = new ArrayList<>();
|
||||||
|
for (Object data : sheetJsonArray) {
|
||||||
|
System.out.println();
|
||||||
|
List<Object> insertData = new ArrayList<>();
|
||||||
|
long id = ID.genLongId();
|
||||||
|
insertData.add(billId);//fid
|
||||||
|
insertData.add(id);//fentryid
|
||||||
|
for (int i=0;i<12;i++){
|
||||||
|
String columnKey = ((JSONObject) ((JSONArray) data).get(i)).getString("columnKey");
|
||||||
|
if (storSet.contains(columnKey)) {
|
||||||
|
insertData.add( ((JSONObject) ((JSONArray) data).get(i)).getBigDecimal("value"));
|
||||||
|
}else{
|
||||||
|
insertData.add( ((JSONObject) ((JSONArray) data).get(i)).getString("value"));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
params.add(insertData.toArray());
|
||||||
|
}
|
||||||
|
DBRoute dbr = DBRoute.of("fi");
|
||||||
|
if(!params.isEmpty()){
|
||||||
|
String sql = "insert into tk_zcgj_salaryentry " +
|
||||||
|
"(fid,fentryid," +
|
||||||
|
"fk_zcgj_name,fk_zcgj_number,fk_zcgj_personno,fk_zcgj_persontype,fk_zcgj_cbstype,fk_zcgj_yingfa," +
|
||||||
|
"fk_zcgj_shebao,fk_zcgj_gongjijin,fk_zcgj_nianjin,fk_zcgj_geshui,fk_zcgj_shifa,fk_zcgj_remark) " +
|
||||||
|
"values(?,?,?,?,?,?,?,?,?,?,?,?,?,?)";
|
||||||
|
DB.executeBatch(dbr,sql, params);
|
||||||
|
}
|
||||||
|
}catch(Exception e){
|
||||||
|
log.info("SalaryPlugin:"+e.getMessage());
|
||||||
|
}finally{
|
||||||
|
try {
|
||||||
|
if (inStream != null){
|
||||||
|
inStream.close();
|
||||||
|
}
|
||||||
|
} catch (IOException e) {
|
||||||
|
log.info("SalaryPlugin:"+e.getMessage());
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 从附件面板中获取附件导入
|
||||||
|
*/
|
||||||
|
public void getExcelData(){
|
||||||
|
DBRoute dbr = DBRoute.of("fi");
|
||||||
|
|
||||||
|
BillShowParameter bsp=(BillShowParameter)this.getView().getFormShowParameter();
|
||||||
|
long billId = this.getModel().getDataEntity().getLong("id");
|
||||||
|
if(billId != 0){
|
||||||
|
List<Object[]> paramsdel = new ArrayList<>();
|
||||||
|
paramsdel.add(new Object[]{billId});
|
||||||
|
String delsql = "delete from tk_zcgj_salaryentry where fid = ?";
|
||||||
|
int[] ints = DB.executeBatch(dbr, delsql, paramsdel);
|
||||||
|
|
||||||
|
String[] COLUMNKEYA = new String[]{"zcgj_name","zcgj_number","zcgj_personno","zcgj_persontype","zcgj_cbstype" ,"zcgj_yingfa" ,"zcgj_shebao" ,"zcgj_gongjijin" ,"zcgj_nianjin" ,"zcgj_geshui" ,"zcgj_shifa","zcgj_remark"};
|
||||||
|
List<Map<String, Object>> attachments = AttachmentServiceHelper.getAttachments("zcgj_salary",billId, "attachmentpanel");
|
||||||
|
for (Map<String, Object> attachment : attachments) {
|
||||||
|
String url = (String)attachment.get("relativeUrl");
|
||||||
|
// JSONArray objects = POIHelperFast.newInputExcel(url, POIHelperFast.stringArrayToHash(COLUMNKEYA));
|
||||||
|
FileService service = FileServiceFactory.getAttachmentFileService();
|
||||||
|
InputStream in = service.getInputStream(url);
|
||||||
|
try {
|
||||||
|
//自动识别 XLS / XLSX,无需自己判断格式
|
||||||
|
Workbook workbook = WorkbookFactory.create(in);
|
||||||
|
//getSheetJsonArray,请保持不变
|
||||||
|
JSONArray sheetJsonArray = getSheetJsonArray(
|
||||||
|
stringArrayToMd5(COLUMNKEYA),
|
||||||
|
workbook,
|
||||||
|
0
|
||||||
|
);
|
||||||
|
List<Object[]> params = new ArrayList<>();
|
||||||
|
for (Object data : sheetJsonArray) {
|
||||||
|
System.out.println();
|
||||||
|
List<Object> insertData = new ArrayList<>();
|
||||||
|
long id = ID.genLongId();
|
||||||
|
insertData.add(billId);//fid
|
||||||
|
insertData.add(id);//fentryid
|
||||||
|
for (int i=0;i<12;i++){
|
||||||
|
String columnKey = ((JSONObject) ((JSONArray) data).get(i)).getString("columnKey");
|
||||||
|
if (storSet.contains(columnKey)) {
|
||||||
|
insertData.add( ((JSONObject) ((JSONArray) data).get(i)).getBigDecimal("value"));
|
||||||
|
}else{
|
||||||
|
insertData.add( ((JSONObject) ((JSONArray) data).get(i)).getString("value"));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
params.add(insertData.toArray());
|
||||||
|
}
|
||||||
|
|
||||||
|
if(!params.isEmpty()){
|
||||||
|
String sql = "insert into tk_zcgj_salaryentry " +
|
||||||
|
"(fid,fentryid," +
|
||||||
|
"fk_zcgj_name,fk_zcgj_number,fk_zcgj_personno,fk_zcgj_persontype,fk_zcgj_cbstype,fk_zcgj_yingfa," +
|
||||||
|
"fk_zcgj_shebao,fk_zcgj_gongjijin,fk_zcgj_nianjin,fk_zcgj_geshui,fk_zcgj_shifa,fk_zcgj_remark) " +
|
||||||
|
"values(?,?,?,?,?,?,?,?,?,?,?,?,?,?)";
|
||||||
|
DB.executeBatch(dbr,sql, params);
|
||||||
|
}
|
||||||
|
} catch (IOException ee) {
|
||||||
|
ee.printStackTrace();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
public void sumData(){
|
||||||
|
DBRoute dbr = DBRoute.of("fi");
|
||||||
|
long billId = this.getModel().getDataEntity().getLong("id");
|
||||||
|
if(billId != 0){
|
||||||
|
String sql = "select fk_zcgj_persontype persontype,fk_zcgj_cbstype cbstype,sum(fk_zcgj_yingfa) yingfa,"+
|
||||||
|
" sum(fk_zcgj_shebao) shebao,sum(fk_zcgj_gongjijin) gongjijin,sum(fk_zcgj_nianjin) nianjin," +
|
||||||
|
"sum(fk_zcgj_geshui) geshui,sum(fk_zcgj_shifa) shifa" +
|
||||||
|
" from tk_zcgj_salaryentry"+
|
||||||
|
" where fid = "+billId+
|
||||||
|
" group by fk_zcgj_persontype,fk_zcgj_cbstype";
|
||||||
|
List<Map<String, Object>> resultData = DB.query(dbr, sql,resultSet -> {
|
||||||
|
List<Map<String, Object>> rows = new ArrayList<>();
|
||||||
|
while (resultSet.next()) {
|
||||||
|
Map<String, Object> row = new HashMap<>();
|
||||||
|
row.put("persontype", resultSet.getString("persontype"));
|
||||||
|
row.put("cbstype", resultSet.getString("cbstype"));
|
||||||
|
row.put("yingfa", resultSet.getBigDecimal("yingfa"));
|
||||||
|
row.put("shebao", resultSet.getBigDecimal("shebao"));
|
||||||
|
row.put("gongjijin", resultSet.getBigDecimal("gongjijin"));
|
||||||
|
row.put("nianjin", resultSet.getBigDecimal("nianjin"));
|
||||||
|
row.put("geshui", resultSet.getBigDecimal("geshui"));
|
||||||
|
row.put("shifa", resultSet.getBigDecimal("shifa"));
|
||||||
|
rows.add(row);
|
||||||
|
}
|
||||||
|
|
||||||
|
return rows;
|
||||||
|
});
|
||||||
|
|
||||||
|
DynamicObjectCollection dynamicObjectCollection = this.getModel().getDataEntity(true).getDynamicObjectCollection("zcgj_entryentity");
|
||||||
|
dynamicObjectCollection.clear();
|
||||||
|
if(resultData != null){
|
||||||
|
for (Map<String, Object> resultDatum : resultData) {
|
||||||
|
DynamicObject dynamicObject = dynamicObjectCollection.addNew();
|
||||||
|
dynamicObject.set("zcgj_persontype2", resultDatum.get("persontype"));
|
||||||
|
dynamicObject.set("zcgj_cbstype2", resultDatum.get("cbstype"));
|
||||||
|
dynamicObject.set("zcgj_yingfa2", resultDatum.get("yingfa"));
|
||||||
|
dynamicObject.set("zcgj_shebao2", resultDatum.get("shebao"));
|
||||||
|
dynamicObject.set("zcgj_gongjijin2", resultDatum.get("gongjijin"));
|
||||||
|
dynamicObject.set("zcgj_nianjin2", resultDatum.get("nianjin"));
|
||||||
|
dynamicObject.set("zcgj_geshui2", resultDatum.get("geshui"));
|
||||||
|
dynamicObject.set("zcgj_shifa2", resultDatum.get("shifa"));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
this.getView().updateView("zcgj_entryentity");
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
private static JSONArray getSheetJsonArray(String columnHashCode, Workbook wb, int index) {
|
||||||
|
|
||||||
|
JSONArray jsonArray = new JSONArray();
|
||||||
|
Sheet sheet = wb.getSheetAt(index);
|
||||||
|
int rowNum = sheet.getLastRowNum();
|
||||||
|
|
||||||
|
Row columnKeyRow = sheet.getRow(1);
|
||||||
|
Row headerRow = sheet.getRow(2);
|
||||||
|
Row columnKeyHashRow = sheet.getRow(1);
|
||||||
|
|
||||||
|
if (columnKeyHashRow != null && columnKeyHashRow.getCell(0) != null) {
|
||||||
|
|
||||||
|
List<String> excelData = new ArrayList<String>();
|
||||||
|
for (int i = 0; i < 12; i++) {
|
||||||
|
columnKeyHashRow.getCell(i).setCellType(CellType.STRING);
|
||||||
|
excelData.add(columnKeyHashRow.getCell(i).getStringCellValue());
|
||||||
|
}
|
||||||
|
//columnKeyHashRow.getCell(0).setCellType(CellType.STRING);
|
||||||
|
String key = stringArrayToMd5(excelData.toArray(new String[0]));
|
||||||
|
//String columnKeyHashCellValue = columnKeyHashRow.getCell(0).getStringCellValue();
|
||||||
|
if (!StringUtils.equals(key, columnHashCode)) {
|
||||||
|
return jsonArray;
|
||||||
|
}
|
||||||
|
|
||||||
|
int columnNum = columnKeyRow.getLastCellNum();
|
||||||
|
|
||||||
|
// 计算真正的列数
|
||||||
|
for (int i = 0; i < columnNum; ++i) {
|
||||||
|
Cell cell = headerRow.getCell(i);
|
||||||
|
if (cell == null) break;
|
||||||
|
cell.setCellType(CellType.STRING);
|
||||||
|
String value = cell.getStringCellValue();
|
||||||
|
if (org.apache.commons.lang3.StringUtils.isEmpty(value)) {
|
||||||
|
columnNum = i;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// 解析数据行
|
||||||
|
for (int j = 3; j <= rowNum; ++j) {
|
||||||
|
JSONArray jsonRow = new JSONArray();
|
||||||
|
boolean isBlankRow = true;
|
||||||
|
|
||||||
|
Row irow = sheet.getRow(j);
|
||||||
|
if (irow == null) break;
|
||||||
|
|
||||||
|
for (int i = 0; i < columnNum; ++i) {
|
||||||
|
|
||||||
|
JSONObject jsonObject = new JSONObject();
|
||||||
|
|
||||||
|
// columnKey
|
||||||
|
Cell keyCell = columnKeyRow.getCell(i);
|
||||||
|
keyCell.setCellType(CellType.STRING);
|
||||||
|
|
||||||
|
// name
|
||||||
|
Cell nameCell = headerRow.getCell(i);
|
||||||
|
nameCell.setCellType(CellType.STRING);
|
||||||
|
|
||||||
|
jsonObject.put("columnKey", keyCell.getStringCellValue());
|
||||||
|
jsonObject.put("name", nameCell.getStringCellValue());
|
||||||
|
|
||||||
|
String value = "";
|
||||||
|
Cell cell = irow.getCell(i);
|
||||||
|
if (cell != null) {
|
||||||
|
cell.setCellType(CellType.STRING);
|
||||||
|
value = cell.getStringCellValue();
|
||||||
|
}
|
||||||
|
|
||||||
|
jsonObject.put("value", value);
|
||||||
|
isBlankRow = isBlankRow && org.apache.commons.lang3.StringUtils.isEmpty(value);
|
||||||
|
|
||||||
|
jsonRow.add(jsonObject);
|
||||||
|
}
|
||||||
|
|
||||||
|
if (isBlankRow) break;
|
||||||
|
|
||||||
|
jsonArray.add(jsonRow);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return jsonArray;
|
||||||
|
}
|
||||||
|
|
||||||
|
public static String stringArrayToMd5(String[] array) {
|
||||||
|
try {
|
||||||
|
MessageDigest md = MessageDigest.getInstance("MD5");
|
||||||
|
md.update(String.join(",", array).getBytes(StandardCharsets.UTF_8));
|
||||||
|
byte[] digest = md.digest();
|
||||||
|
|
||||||
|
StringBuilder sb = new StringBuilder();
|
||||||
|
for (byte b : digest) {
|
||||||
|
sb.append(String.format("%02x", b));
|
||||||
|
}
|
||||||
|
return sb.toString();
|
||||||
|
} catch (Exception e) {
|
||||||
|
throw new RuntimeException(e);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
Loading…
Reference in New Issue