From 77c43e78ea8f4d4b750cfbc98dcf32d623e5fd85 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E9=92=B1=E6=B6=9B?= <15850646081@163.com> Date: Mon, 17 Nov 2025 16:03:12 +0800 Subject: [PATCH] =?UTF-8?q?=E7=BD=97=E5=BE=B7=E8=87=AA=E8=A1=8C=E4=BA=8C?= =?UTF-8?q?=E5=BC=80=E6=96=87=E4=BB=B6?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- resource/sqlupgrade/SQLServer/薪酬.sql | 3 + .../entity/datacollection/AddUpDeduction.java | 6 +- .../bo/SalarySobItemAggregateBO.java | 52 +- .../datacollection/AddUpDeductionMapper.xml | 27 +- .../impl/AddUpDeductionServiceImpl.java | 10 +- .../ldkj/sync/ModeRightDataThreadSync.java | 113 +++ src/com/ydh/ldkj/utils/CommonUtils.java | 669 ++++++++++++++++++ src/com/ydh/ldkj/utils/ThreadPoolUtils.java | 73 ++ 8 files changed, 941 insertions(+), 12 deletions(-) create mode 100644 resource/sqlupgrade/SQLServer/薪酬.sql create mode 100644 src/com/ydh/ldkj/sync/ModeRightDataThreadSync.java create mode 100644 src/com/ydh/ldkj/utils/CommonUtils.java create mode 100644 src/com/ydh/ldkj/utils/ThreadPoolUtils.java diff --git a/resource/sqlupgrade/SQLServer/薪酬.sql b/resource/sqlupgrade/SQLServer/薪酬.sql new file mode 100644 index 000000000..f38ac1e24 --- /dev/null +++ b/resource/sqlupgrade/SQLServer/薪酬.sql @@ -0,0 +1,3 @@ + +ALTER TABLE hrsa_add_up_deduction +ADD hiredate VARCHAR(255); \ No newline at end of file diff --git a/src/com/engine/salary/entity/datacollection/AddUpDeduction.java b/src/com/engine/salary/entity/datacollection/AddUpDeduction.java index 9a2213a0e..cf464108a 100644 --- a/src/com/engine/salary/entity/datacollection/AddUpDeduction.java +++ b/src/com/engine/salary/entity/datacollection/AddUpDeduction.java @@ -45,7 +45,6 @@ public class AddUpDeduction { */ @ElogTransform(name = "申报月份") private Date declareMonth; - /** * 累计子女教育 */ @@ -132,6 +131,11 @@ public class AddUpDeduction { @ElogTransform(name = "租户ID") private String tenantKey; + /** + * 入职日期 + */ + @ElogTransform(name = "入职日期") + private String hiredate; List employeeIds; Collection taxAgentIds; diff --git a/src/com/engine/salary/entity/salarysob/bo/SalarySobItemAggregateBO.java b/src/com/engine/salary/entity/salarysob/bo/SalarySobItemAggregateBO.java index b1a76a4a4..453a460b2 100644 --- a/src/com/engine/salary/entity/salarysob/bo/SalarySobItemAggregateBO.java +++ b/src/com/engine/salary/entity/salarysob/bo/SalarySobItemAggregateBO.java @@ -1,5 +1,6 @@ package com.engine.salary.entity.salarysob.bo; +import com.alibaba.fastjson.JSONObject; import com.engine.salary.annotation.SalaryFormulaVar; import com.engine.salary.entity.salaryformula.ExpressFormula; import com.engine.salary.entity.salaryformula.dto.SalaryFormulaEmployeeDTO; @@ -18,7 +19,9 @@ import lombok.NoArgsConstructor; import org.apache.commons.collections4.CollectionUtils; import org.apache.commons.lang3.StringUtils; import org.apache.commons.lang3.math.NumberUtils; +import weaver.conn.RecordSet; import weaver.general.BaseBean; +import weaver.general.Util; import java.lang.reflect.Field; import java.util.*; @@ -87,6 +90,10 @@ public class SalarySobItemAggregateBO { * @return */ public SalarySobItemAggregateDTO convert2AggregateDTO() { + // 2025-09-11 获取薪资项目若存在于账套则无法删除配置 + JSONObject itemConfig = getItemConfig(); + new BaseBean().writeLog("INFO","薪资账套id==>"+salarySob.getId()); + new BaseBean().writeLog("INFO","获取薪资项目若存在于账套则无法删除配置==>"+itemConfig); List itemsWithoutGroup = Lists.newArrayList(); // 薪资账套的薪资项目分类po转换成dto List salarySobItemGroupDTOS = salarySobItemGroups.stream() @@ -110,6 +117,7 @@ public class SalarySobItemAggregateBO { } } }); + new BaseBean().writeLog("INFO","薪资账套的薪资项目副本所关联的薪资项目,处理后==>"+salaryItems); Map salaryItemMap = SalaryEntityUtil.convert2Map(salaryItems, SalaryItemPO::getId); Map> salarySobItemMap = SalaryEntityUtil.group2Map(salarySobItems, SalarySobItemPO::getSalarySobItemGroupId); @@ -148,11 +156,32 @@ public class SalarySobItemAggregateBO { .build()); } } + new BaseBean().writeLog("INFO","薪资账套的薪资项目副本所关联的薪资项目,处理前==>"+items); + List itemsNew = Lists.newArrayList(); + for (int i = 0; i < items.size(); i++) { + SalarySobItemDTO item = items.get(i); + // 2025-09-11 获取薪资项目若存在于账套则无法删除配置 + String itemName = item.getName(); + boolean deleteMark = false; + new BaseBean().writeLog("INFO","薪资项目名称==>"+itemName); + if (itemConfig.containsKey(itemName)){ + String rczyztzwfsc = itemConfig.getString(itemName); + if ("0".equals(rczyztzwfsc)){ + deleteMark = true; + new BaseBean().writeLog("INFO","薪资项目名称,符合不可删除==>"); + } + } + if (deleteMark){ + item.setCanDelete(false); + } + itemsNew.add(item); + } + new BaseBean().writeLog("INFO","薪资账套的薪资项目副本所关联的薪资项目,处理后==>"+itemsNew); if (!salarySobItemGroupDTOMap.containsKey(k)) { - itemsWithoutGroup.addAll(items); + itemsWithoutGroup.addAll(itemsNew); } else { SalarySobItemGroupDTO salarySobItemGroupDTO = salarySobItemGroupDTOMap.get(k); - salarySobItemGroupDTO.setItems(sortItem(items)); + salarySobItemGroupDTO.setItems(sortItem(itemsNew)); } }); // 薪资账套的员工信息字段po转换成dto @@ -265,4 +294,23 @@ public class SalarySobItemAggregateBO { return group; }).sorted(Comparator.comparingInt(SalarySobItemGroupDTO::getSortedIndex)).collect(Collectors.toList()); } + + /** + * 2025-09-11 获取薪资项目若存在于账套则无法删除配置 + * @return + */ + public JSONObject getItemConfig(){ + RecordSet rs = new RecordSet(); + JSONObject data = new JSONObject(); + String sql = "select * from uf_xzxmpzb"; + rs.executeQuery(sql); + while (rs.next()){ + String name = Util.null2String(rs.getString("xzxmmc")); + String rczyztzwfsc = Util.null2String(rs.getString("rczyztzwfsc")); + if (!"".equals(name) && !"".equals(rczyztzwfsc)){ + data.put(name,rczyztzwfsc); + } + } + return data; + } } diff --git a/src/com/engine/salary/mapper/datacollection/AddUpDeductionMapper.xml b/src/com/engine/salary/mapper/datacollection/AddUpDeductionMapper.xml index 5393e4363..e3e2b7ed9 100644 --- a/src/com/engine/salary/mapper/datacollection/AddUpDeductionMapper.xml +++ b/src/com/engine/salary/mapper/datacollection/AddUpDeductionMapper.xml @@ -115,7 +115,7 @@ d.departmentname AS departmentName, e.mobile, e.workcode as job_num, - e.companystartdate as hiredate, + t1.hiredate as hiredate, t2.name AS taxAgentName, t2.id AS taxAgentId, t1.add_up_child_education, @@ -182,7 +182,7 @@ - AND (e.companystartdate BETWEEN #{param.hiredate[0]} AND #{param.hiredate[1]}) + AND (t1.hiredate BETWEEN #{param.hiredate[0]} AND #{param.hiredate[1]}) @@ -245,7 +245,7 @@ - AND (e.companystartdate BETWEEN #{param.hiredate[0]} AND #{param.hiredate[1]}) + AND (t1.hiredate BETWEEN #{param.hiredate[0]} AND #{param.hiredate[1]}) @@ -306,7 +306,7 @@ - AND (e.companystartdate BETWEEN #{param.hiredate[0]} AND #{param.hiredate[1]}) + AND (t1.hiredate BETWEEN #{param.hiredate[0]} AND #{param.hiredate[1]}) @@ -414,7 +414,8 @@ create_time, update_time, creator, - tenant_key + tenant_key, + hiredate ) VALUES @@ -432,7 +433,8 @@ #{item.createTime}, #{item.updateTime}, #{item.creator}, - #{item.tenantKey} + #{item.tenantKey}, + #{item.hiredate} ) @@ -489,7 +491,8 @@ create_time, update_time, creator, - tenant_key + tenant_key, + hiredate ) VALUES ( @@ -506,7 +509,8 @@ #{item.createTime}, #{item.updateTime}, #{item.creator}, - #{item.tenantKey} + #{item.tenantKey}, + #{item.hiredate} ) @@ -563,6 +567,13 @@ + + + + when id=#{item.id} then #{item.hiredate} + + + where id in diff --git a/src/com/engine/salary/service/impl/AddUpDeductionServiceImpl.java b/src/com/engine/salary/service/impl/AddUpDeductionServiceImpl.java index 2f79bb800..c25cdbec9 100644 --- a/src/com/engine/salary/service/impl/AddUpDeductionServiceImpl.java +++ b/src/com/engine/salary/service/impl/AddUpDeductionServiceImpl.java @@ -56,6 +56,7 @@ import com.engine.salary.util.page.PageInfo; import com.engine.salary.util.page.SalaryPageUtil; import com.google.common.collect.Lists; import com.google.common.collect.Maps; +import com.ydh.ldkj.utils.CommonUtils; import org.apache.commons.collections4.CollectionUtils; import org.apache.commons.lang3.StringUtils; import org.apache.commons.lang3.Validate; @@ -245,6 +246,12 @@ public class AddUpDeductionServiceImpl extends Service implements AddUpDeduction String mobile = dto.getMobile(); String workcode = dto.getJobNum(); String idNo = dto.getIdNo(); + // 2025-09-03 入职日期通过模板导入 + String hiredate = Util.null2String(dto.getHiredate()); + if (!StringUtils.isBlank(hiredate)) { + hiredate = CommonUtils.dateFormart(hiredate,"yyyy-MM-dd HH:mm:ss","yyyy-MM-dd"); + } + addUpDeduction.setHiredate(hiredate); //筛选导入人员信息可以在人力资源池中匹配到的人员信息 List employeeSameIds = getSalaryEmployeeService(user).matchImportEmployee(confValue, employees, userName, deparmentName, mobile, workcode, idNo, null); @@ -297,7 +304,8 @@ public class AddUpDeductionServiceImpl extends Service implements AddUpDeduction } else { Optional optionalTemp = taxAgentList.stream().filter(m -> m.getTaxAgentName().equals(taxAgentName)).findFirst(); if (optionalTemp.isPresent()) { - if (StringUtils.isNotEmpty(taxAgentId) && !optionalTemp.get().getTaxAgentId().equals(Long.valueOf(taxAgentId))) { + // 2025-10-09 个税扣缴义务人选择全部时,不校验 + if (StringUtils.isNotEmpty(taxAgentId) && !"-999".equals(taxAgentId)&& !optionalTemp.get().getTaxAgentId().equals(Long.valueOf(taxAgentId))) { //个税扣缴义务人与导入时选择的不一致 Map errorMessageMap = Maps.newHashMap(); errorMessageMap.put("message", rowIndex + "个税扣缴义务人与导入时选择的不一致"); diff --git a/src/com/ydh/ldkj/sync/ModeRightDataThreadSync.java b/src/com/ydh/ldkj/sync/ModeRightDataThreadSync.java new file mode 100644 index 000000000..6a64dac82 --- /dev/null +++ b/src/com/ydh/ldkj/sync/ModeRightDataThreadSync.java @@ -0,0 +1,113 @@ +package com.ydh.ldkj.sync; + +import com.ydh.ldkj.utils.ThreadPoolUtils; +import weaver.formmode.setup.ModeRightInfo; +import weaver.general.Util; + +import java.util.HashMap; +import java.util.List; +import java.util.Map; + +/** + * 建模权限重构 + * @author YDH + * CreateTime 2022年5月13日 下午12:16:57 + * @Description + * + */ +public class ModeRightDataThreadSync extends ModeRightInfo implements Runnable{ + private List dataList = null; + private int threadCount = 6; + private int currentCount = 0; + @Override + public void run() { + writeLog("线程启动了"); + ModeRightInfo localModeRightInfo = new ModeRightInfo(); + while (true) { + Map localObject1 = new HashMap(); + synchronized (this) { + this.currentCount += 1; + if (this.currentCount > this.dataList.size()) { + this.currentCount -= 1; + break; + } + localObject1 = (Map)this.dataList.get(this.currentCount - 1); + } + String billId = Util.null2String(localObject1.get("billid")); + String creator = Util.null2String(localObject1.get("creator")); + recreateNewModeRightByBillId(localModeRightInfo, Util.getIntValue(creator), getModeId(), Util.getIntValue(billId)); + rebuildModeRightByBillId(localModeRightInfo, Util.getIntValue(creator), getModeId(), Util.getIntValue(billId)); + } + + } + + + /** + * 新数据权限重构 + * @author YDH + * CreateTime 2022年5月11日 上午10:02:07 + * @param paraModeRightInfo + * @param paramInt1 + * @param paramInt2 + * @param paramInt3 + */ + public void recreateNewModeRightByBillId(ModeRightInfo paraModeRightInfo,int paramInt1,int paramInt2,int paramInt3) { + paraModeRightInfo.setNewRight(true); + paraModeRightInfo.editModeDataShare(paramInt1, paramInt2, paramInt3); + } + + /** + * 旧数据权限重构 + * @author YDH + * CreateTime 2022年5月11日 上午10:02:07 + * @param paraModeRightInfo + * @param paramInt1 + * @param paramInt2 + * @param paramInt3 + */ + public void recreateOldModeRightByBillId(ModeRightInfo paraModeRightInfo,int paramInt1,int paramInt2,int paramInt3) { + paraModeRightInfo.setNewRight(true); + paraModeRightInfo.rebuildModeDataShareByEdit(paramInt1, paramInt2, paramInt3); + } + /** + * 旧数据权限重构 + * @author YDH + * CreateTime 2022年5月13日 下午12:16:13 + * @param paraModeRightInfo + * @param paramInt1 + * @param paramInt2 + * @param paramInt3 + */ + public void rebuildModeRightByBillId(ModeRightInfo paraModeRightInfo,int paramInt1,int paramInt2,int paramInt3) { + paraModeRightInfo.rebuildModeDataShareByEdit(paramInt1, paramInt2, paramInt3); + } + + public void resetModeRightThread() { + try { + List maps = this.getDataList(); + if (maps == null || maps.size() == 0) { + return; + } + ModeRightDataThreadSync rightDataObject = new ModeRightDataThreadSync(); + rightDataObject.setModeId(this.getModeId()); + rightDataObject.setDataList(maps); + ThreadPoolUtils.getInstance().fixThreadPoolExecute((Runnable)rightDataObject); + } catch (Exception e) { + writeLog("resetModeRight:", e); + } + } + + /** + * @return dataList + */ + public List getDataList() { + return dataList; + } + + /** + * @param dataList 要设置的dataList + */ + public void setDataList(List dataList) { + this.dataList = dataList; + } +} diff --git a/src/com/ydh/ldkj/utils/CommonUtils.java b/src/com/ydh/ldkj/utils/CommonUtils.java new file mode 100644 index 000000000..aa42a8011 --- /dev/null +++ b/src/com/ydh/ldkj/utils/CommonUtils.java @@ -0,0 +1,669 @@ +package com.ydh.ldkj.utils; + +import com.ydh.ldkj.sync.ModeRightDataThreadSync; +import weaver.conn.RecordSet; +import weaver.conn.RecordSetTrans; +import weaver.docs.docs.DocManagerNoRequest; +import weaver.general.BaseBean; +import weaver.general.Util; +import weaver.soa.workflow.request.Property; +import weaver.wechat.util.Utils; + +import java.io.BufferedOutputStream; +import java.io.File; +import java.io.IOException; +import java.math.BigDecimal; +import java.math.BigInteger; +import java.math.RoundingMode; +import java.security.MessageDigest; +import java.text.ParseException; +import java.text.SimpleDateFormat; +import java.time.LocalDate; +import java.util.*; + + +/** + * 通用工具类 + * + * @author ydh + */ +public class CommonUtils { + + private static BaseBean basebean = new BaseBean(); + /** + * 获取下拉框值 + * + * @param selectvalue 下拉框值 + * @param billid 流程表单 + * @param fieldname 数据库字段名 + * @return + */ + public static String getSelectItme(Integer selectvalue, Integer billid, String fieldname) { + RecordSet rs = new RecordSet(); + String sql = "select selectname from workflow_selectitem where selectvalue = ? and fieldid in (select id from workflow_billfield where billid=? and fieldname=?)"; + rs.executeQuery(sql, selectvalue, billid, fieldname); + rs.next(); + return "" + rs.getString("selectname"); + } + + /** + * 新建流程字段赋值 + * + * @param fieldName + * @param value + * @return + */ + public static Property setField(String fieldName, String value) { + Property p = new Property(); + p.setName(fieldName); + p.setValue(value); + return p; + } + + /** + * 获取流程wfid + * + * @param requestId 流程请求id + * @return + */ + public static String getWorkflowidByRequestId(String requestId) { + String workflowId = ""; + String sql = " select workflowid from workflow_requestbase where requestid = ? "; + RecordSet rs = new RecordSet(); + rs.executeQuery(sql, requestId); + if (rs.next()) { + workflowId = Util.null2String(rs.getString("workflowid")); + } + return workflowId; + } + + /** + * 获取流程表名 + * + * @param workflowid 流程id + * @return + */ + public static String getTableNameByWorkflowid(String workflowid) { + String formid = ""; + String sql = "select formid from workflow_base where id =?"; + RecordSet rs = new RecordSet(); + rs.executeQuery(sql, workflowid); + if (rs.next()) { + formid = rs.getString("formid"); + } + formid = formid.replaceAll("-", ""); + String tablename = "formtable_main_" + formid; + return tablename; + } + + /** + * 字符串判断为空 + * + * @param str + * @return + */ + public static boolean isBlank(String str) { + int strLen; + if (str == null || (strLen = str.length()) == 0) { + return true; + } + for (int i = 0; i < strLen; i++) { + if (!Character.isWhitespace(str.charAt(i))) { + return false; + } + } + return true; + } + + /** + * 根据建模表名获取建模模块id + * + * @param tableName + * @return + * @author YDH CreateTime 2022年5月11日 上午9:48:52 + */ + public static int getModeId(String tableName) { + RecordSet rs = new RecordSet(); + String sql = " select id from modeinfo where formid = (select id from workflow_bill where tablename = ?) "; + rs.executeQuery(sql, tableName); + rs.next(); + int modeId = rs.getInt(1); + return modeId; + } + + + /** + * 根据人员id获取上级 + * + * @param id + * @return + */ + public static Integer getManagerByUserid(Integer id) { + RecordSet rs = new RecordSet(); + String sql = "select managerid from hrmresource where id = ?"; + rs.executeQuery(sql, id); + rs.next(); + return Utils.getIntValue(rs.getString("managerid"), 0); + } + + /** + * 获取人员名称 + * @param id + * @return + */ + public static String getUserNameByUserId(Integer id) { + String name = ""; + if (id == 1){ + name = "系统管理员"; + } else { + RecordSet rs = new RecordSet(); + String sql = " select lastname from HrmResource where id = ?"; + rs.executeQuery(sql, id); + if (rs.next()){ + name = Util.null2String(rs.getString("lastname")); + } + } + return name; + } + + /** + * 获取人员id + * @param workCode + * @return + */ + public static int getUserIdByWorkCode(String workCode) { + int userId = -1; + RecordSet rs = new RecordSet(); + String sql = " select id from HrmResource where workcode = ?"; + rs.executeQuery(sql, workCode); + if (rs.next()){ + userId = Util.getIntValue(rs.getString("id"),-1); + } + return userId; + } + + /** + * 获取人员id + * @param userId + * @return + */ + public static String getWorkCodeByUserId(int userId) { + String workCode = ""; + RecordSet rs = new RecordSet(); + String sql = " select workCode from HrmResource where id = ?"; + rs.executeQuery(sql, userId); + if (rs.next()){ + workCode = Util.null2String(rs.getString("workCode")); + } + return workCode; + } + /** + * 批量执行 + * + * @param parameters + * @param sql + * @param rs + */ + public static void batchSql(List> parameters, String sql, RecordSet rs) { + RecordSetTrans rst = new RecordSetTrans(); + rst.setAutoCommit(false); + try { + rst.executeBatchSql(sql, parameters); + rst.commit(); + } catch (Exception e) { + rs.writeLog(CommonUtils.class.getName() + ",执行批量操作异常:", e); + rst.rollback(); + } + } + + /** + * 数据权限重置 + * @author YDH + * CreateTime 2022年5月11日 上午10:32:18 + * @param uuid + * @param rs + * @param creator + * @param modeId + */ + public static void authorityReconfiguration(String uuid,RecordSet rs,String creator,int modeId,String tableName) { + List dataList = new ArrayList(); + StringBuilder sql = new StringBuilder(); + sql.append("select ID from ").append(tableName).append(" where modeUUID = ?"); + rs.executeQuery(sql.toString(), uuid); + while(rs.next()) { + HashMap localHashMap = new HashMap(); + localHashMap.put("billid", rs.getInt(1)); + localHashMap.put("creator", creator); + dataList.add(localHashMap); + } + if (!dataList.isEmpty()) { + ModeRightDataThreadSync sync = new ModeRightDataThreadSync(); + sync.setModeId(modeId); + sync.setDataList(dataList); + sync.resetModeRightThread(); + } + } + + + /** + * MD5加密 + * @param str + * @return + */ + public static String codeMD5(String str) { + try { + // 生成一个MD5加密计算摘要 + MessageDigest md = MessageDigest.getInstance("MD5"); + // 计算md5函数 + md.update(str.getBytes()); + // digest()最后确定返回md5 hash值,返回值为8位字符串。因为md5 hash值是16位的hex值,实际上就是8位的字符 + // BigInteger函数则将8位的字符串转换成16位hex值,用字符串来表示;得到字符串形式的hash值 + // 一个byte是八位二进制,也就是2位十六进制字符(2的8次方等于16的2次方) + return new BigInteger(1, md.digest()).toString(16); + } catch (Exception e) { + e.printStackTrace(); + return null; + } + } + /** + * sha256加密 + * @param originalString + * @return + */ + public static String codeSha256(String originalString) { + try { + // 获取SHA-256 MessageDigest 实例 + MessageDigest digest = MessageDigest.getInstance("SHA-256"); + // 对字符串进行编码 + byte[] encodedhash = digest.digest(originalString.getBytes(java.nio.charset.StandardCharsets.UTF_8)); + // 将字节转换为十六进制字符串 + StringBuilder hexString = new StringBuilder(); + for (byte b : encodedhash) { + String hex = Integer.toHexString(0xff & b); + if(hex.length() == 1) { + hexString.append('0'); + } + hexString.append(hex); + } + return hexString.toString(); + } catch (Exception e) { + e.printStackTrace(); + return null; + } + } + /** + * base64转文件 + * @param base64 + * @param fileName + * @param savePath + */ + public static boolean base64ToFile(String base64, String fileName, String savePath) { + boolean mark = false; + File file = null; + //创建文件目录 + String filePath = savePath; + File dir = new File(filePath); + if (!dir.exists() && !dir.isDirectory()) { + dir.mkdirs(); + } + BufferedOutputStream bos = null; + java.io.FileOutputStream fos = null; + try { + byte[] bytes = Base64.getDecoder().decode(base64); + file = new File(filePath + fileName); + fos = new java.io.FileOutputStream(file); + bos = new BufferedOutputStream(fos); + bos.write(bytes); + } catch (Exception e) { + basebean.writeLog("ERROR","base64转文件异常!"); + basebean.writeLog("ERROR",e); + } finally { + if (bos != null) { + try { + bos.close(); + } catch (IOException e) { + basebean.writeLog("ERROR","base64转文件关闭bos异常!"); + basebean.writeLog("ERROR",e); + } + } + if (fos != null) { + try { + fos.close(); + } catch (IOException e) { + basebean.writeLog("ERROR","base64转文件关闭fos异常!"); + basebean.writeLog("ERROR",e); + } + } + } + File file2 = new File(filePath + fileName); + if (file2.exists()){ + mark = true; + } + return mark; + } + + /** + * 附件id转文档id + * @param modeid 模块id + * @param userid + * @param imageid 附件id + * @return + */ + public static int buildFileForFile(int modeid,int userid,int imageid){ + RecordSet rs = new RecordSet(); + int retDocid = 0; + try { + int maincategory = 0; + int subcategory = 0; + int seccategory = 0; + if(modeid > 0){ + rs.executeQuery("select * from modeinfo where id="+modeid); + if(rs.next()){ + maincategory = Util.getIntValue(rs.getString("maincategory"),0); + subcategory = Util.getIntValue(rs.getString("subcategory"),0); + seccategory = Util.getIntValue(rs.getString("seccategory"),0); + } + } + String docsubject=""; + rs.executeQuery("select imagefilename from ImageFile if2 where imagefileid = ?",imageid); + if (rs.next()){ + docsubject = Util.null2String(rs.getString("imagefilename")); + } + Map dataMap=new HashMap(); + dataMap.put("docsubject",docsubject); + dataMap.put("doccreaterid",""+userid); + dataMap.put("docCreaterType","1"); + dataMap.put("maincategory",""+maincategory); + dataMap.put("subcategory",""+subcategory); + dataMap.put("seccategory",""+seccategory); + dataMap.put("fileids",""+imageid); + //文件FILEID处理 + DocManagerNoRequest docManagerNoRequest = new DocManagerNoRequest(); + docManagerNoRequest.UploadDocNoRequest(dataMap); + //文档ID + retDocid = docManagerNoRequest.getId(); + } catch (Exception e) { + basebean.writeLog("ERROR","附件id转文档异常!"); + basebean.writeLog("ERROR",e); + } + return retDocid; + } + + /** + * 获取其他月份 + * @param ny + * @param i + * @return + */ + public static String getLastMonth(String ny,int i){ + String lastMonth = ""; + try { + SimpleDateFormat simpleDateFormat = new SimpleDateFormat("yyyy-MM"); + Date newdate = simpleDateFormat.parse(ny); + Calendar calendar = Calendar.getInstance(); + calendar.setTime(newdate); + calendar.add(Calendar.MONTH,i); + lastMonth = simpleDateFormat.format(calendar.getTime()); + } catch (ParseException e) { + basebean.writeLog("ERROR","获取上月异常!"); + basebean.writeLog("ERROR",e); + } + return lastMonth; + } + + /** + * 获取随机正整数 + * @param offset + * @return + */ + public static int getRandomPositiveNumber(int offset) { + Random random = new Random(); + int randomNumber = random.nextInt(); + int positiveNumber = Math.abs(randomNumber); + int finalNumber = positiveNumber + offset; + return finalNumber; + } + + /** + * 日期格式化 + * @param date + * @return + */ + public static String dateFormart(String date) { + SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd"); + SimpleDateFormat sdf2 = new SimpleDateFormat("yyyyMM"); + Calendar gCalendar = Calendar.getInstance(); + try { + Date dateTime = sdf.parse(date); + gCalendar.setTime(dateTime); + } catch (ParseException e) { + basebean.writeLog("ERROR","日期格式化异常!"); + basebean.writeLog("ERROR",e); + } + return sdf2.format(gCalendar.getTime()); + } + + /** + * 获取当前系统日期及时间yyyy-MM-dd + * @return + */ + public static String getCurrentDate() { + SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd"); + return sdf.format(new Date()); + } + + /** + * 获取当前系统年月yyyy-MM + * @return + */ + public static String getCurrentMonth() { + SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM"); + return sdf.format(new Date()); + } + /** + * 获取当前系统年份 yyyy + * @return + */ + public static String getCurrentYear() { + SimpleDateFormat sdf = new SimpleDateFormat("yyyy"); + return sdf.format(new Date()); + } + + /** + * 计算2个日期月份差 + * @param dateString1 + * @param dateString2 + * @return + */ + public static int monthDiff(String dateString1, String dateString2){ + // 将字符串转换为 LocalDate 对象 + LocalDate date1 = LocalDate.parse(dateString1); + LocalDate date2 = LocalDate.parse(dateString2); + // 获软时间1的年份和月份 + int year1 = date1.getYear(); + int month1 = date1.getMonthValue(); + // 获取时间2的年份和月份 + int year2 = date2.getYear(); + int month2 = date2.getMonthValue(); + // 计算时间1的总月数 + int totalMonths1 = year1 * 12 + month1; + // 计算时间2的总月数 + int totalMonths2 = year2 * 12 + month2; + // 计算总月数差 + int monthsDiff = totalMonths2 - totalMonths1; + return monthsDiff; + } + + /** + * 获取上一天 + * @param date + * @return + */ + public static String getLastDate(String date){ + String lastMonth = ""; + try { + SimpleDateFormat simpleDateFormat = new SimpleDateFormat("yyyy-MM-dd"); + Date newdate = simpleDateFormat.parse(date); + Calendar calendar = Calendar.getInstance(); + calendar.setTime(newdate); + calendar.add(Calendar.DAY_OF_MONTH,-1); + lastMonth = simpleDateFormat.format(calendar.getTime()); + } catch (ParseException e) { + basebean.writeLog("ERROR","获取前一天异常!"); + basebean.writeLog("ERROR",e); + } + return lastMonth; + } + /** + * 日期格式化 + * @param date + * @return + */ + public static String dateFormart2(String date) { + SimpleDateFormat sdf = new SimpleDateFormat("yyyy/MM/dd"); + SimpleDateFormat sdf2 = new SimpleDateFormat("yyyy-MM-dd"); + Calendar gCalendar = Calendar.getInstance(); + try { + Date dateTime = sdf.parse(date); + gCalendar.setTime(dateTime); + } catch (ParseException e) { + basebean.writeLog("ERROR","日期格式化异常!"); + basebean.writeLog("ERROR",e); + } + return sdf2.format(gCalendar.getTime()); + } + + /** + * 比较日期是在区间内 + * + * @param orginDate 年月 + * @param startDate 开始日期 + * @param endDate 结束日期 + * @return + */ + public static boolean compareDate(String orginDate, String startDate, String endDate) { + boolean mark = false; + // 起始缴纳年月为空 + if (CommonUtils.isBlank(startDate)) { + // 停止缴纳年月为空 + if (CommonUtils.isBlank(endDate)) { + mark = true; + } else { + // 年月早于停止缴纳年月 + if (orginDate.compareTo(endDate) <= 0) { + mark = true; + } else { + mark = false; + } + } + } else { + // 起始缴纳年月为空 + if (CommonUtils.isBlank(endDate)) { + // 年月晚于起始缴纳年月 + if (orginDate.compareTo(startDate) >= 0) { + mark = true; + } else { + mark = false; + } + } else { + // 年月早于停止缴纳年月&&年月晚于起始缴纳年月 + if (orginDate.compareTo(startDate) >= 0 && orginDate.compareTo(endDate) <= 0) { + mark = true; + } else { + mark = false; + } + } + } + return mark; + } + + /** + * 四舍五入 + * @param orginData + * @return + */ + public static double mathRound(double orginData){ + double result1 = BigDecimal.valueOf(orginData).setScale(3, RoundingMode.HALF_UP).doubleValue(); + double result2 = BigDecimal.valueOf(result1).setScale(2, RoundingMode.HALF_UP).doubleValue(); + return result2; + } + /** + * 四舍五入 + * @param orginData + * @return + */ + public static double bigDecimalMultiply(double orginData,double orginData2){ + BigDecimal a = new BigDecimal(String.valueOf(orginData)); + BigDecimal b = new BigDecimal(String.valueOf(orginData2)); + BigDecimal result = a.multiply(b).setScale(2, RoundingMode.HALF_UP); + return result.doubleValue(); + } + /** + * 见角进元 + * @param orginData + * @return + */ + public static double roundUpToYuan(double orginData){ + if (orginData < 0) { + throw new IllegalArgumentException("金额不能为负数"); + } + // 使用BigDecimal精确处理 + BigDecimal bd = BigDecimal.valueOf(orginData); + // 获取元的整数部分 + BigInteger integerPart = bd.toBigInteger(); + // 计算小数部分(角、分等) + BigDecimal fractional = bd.subtract(new BigDecimal(integerPart)); + // 小数部分乘以10得到角(并截断分以下部分) + int jiao = fractional.multiply(BigDecimal.TEN).intValue(); + + // 若角≥1,则进位 + if (jiao >= 1) { + return integerPart.longValue() + 1; + } else { + return integerPart.longValue(); + } + } + /** + * 获取前几天 + * @param dateString + * @param dateFormat + * @param days + * @return + */ + public static String getDaysBefore(String dateString, String dateFormat,int days) { + try { + SimpleDateFormat sdf = new SimpleDateFormat(dateFormat); + Date date = sdf.parse(dateString); + Calendar calendar = Calendar.getInstance(); + calendar.setTime(date); + calendar.add(Calendar.DATE, days); + return sdf.format(calendar.getTime()); + } catch (Exception e) { + e.printStackTrace(); + return ""; + } + } + + /** + * 日期格式化 + * @param date + * @param pattern1 + * @param pattern2 + * @return + */ + public static String dateFormart(String date,String pattern1,String pattern2) { + SimpleDateFormat sdf = new SimpleDateFormat(pattern1); + SimpleDateFormat sdf2 = new SimpleDateFormat(pattern2); + Calendar gCalendar = Calendar.getInstance(); + try { + Date dateTime = sdf.parse(date); + gCalendar.setTime(dateTime); + } catch (ParseException e) { + basebean.writeLog("ERROR","日期格式化异常!"); + basebean.writeLog("ERROR",e); + } + return sdf2.format(gCalendar.getTime()); + } + + +} diff --git a/src/com/ydh/ldkj/utils/ThreadPoolUtils.java b/src/com/ydh/ldkj/utils/ThreadPoolUtils.java new file mode 100644 index 000000000..e8c1d0d7c --- /dev/null +++ b/src/com/ydh/ldkj/utils/ThreadPoolUtils.java @@ -0,0 +1,73 @@ +package com.ydh.ldkj.utils; + +import weaver.conn.RecordSet; + +import java.util.concurrent.*; +import java.util.concurrent.atomic.AtomicInteger; + +/** + * @author yuandonghui + */ +public class ThreadPoolUtils { + /** 线程池保持alive状态线程数 */ + public static final int CORE_POOL_SIZE = 10; + /** 线程池最大线程数 */ + public static final int MAX_POOL_SIZE = 40; + /** 空闲线程回收时间 */ + public static final int KEEP_ALIVE_TIME = 1000; + + private final static ThreadPoolUtils threadPoolUtils = new ThreadPoolUtils(); + /** 业务请求异步处理线程池 */ + private static final ThreadPoolExecutor processExecutor = new ThreadPoolExecutor(CORE_POOL_SIZE,MAX_POOL_SIZE,KEEP_ALIVE_TIME, + TimeUnit.MICROSECONDS,new LinkedBlockingQueue(),new NameThreadFactory(),new MyIgnorePolicy()); + /** 业务请求异步处理线程池 */ + private static final ExecutorService newFixExecutor = Executors.newFixedThreadPool(CORE_POOL_SIZE); + private ThreadPoolUtils() {}; + + public static ThreadPoolUtils getInstance() { + return threadPoolUtils; + } + + static class NameThreadFactory implements ThreadFactory { + private final AtomicInteger mThreadNum = new AtomicInteger(1); + @Override + public Thread newThread(Runnable r) { + Thread t = new Thread(r,"my-thread-"+mThreadNum.getAndIncrement()); + return t; + } + + } + + public static class MyIgnorePolicy implements RejectedExecutionHandler { + + @Override + public void rejectedExecution(Runnable r, ThreadPoolExecutor e) { + dolog(r,e); + } + + private void dolog(Runnable r, ThreadPoolExecutor e) { + RecordSet rs = new RecordSet(); + rs.writeLog("INFO", "com.hw.utils.ThreadPoolUtils"+r.toString()+" rejected"); + } + } + + /** + * 异步任务处理 线程池不需要关闭 + * @author YDH + * CreateTime 2022年5月11日 上午10:23:38 + * @param task + */ + public void execute(Runnable task) { + processExecutor.submit(task); + } + + /** + * + * @author YDH + * CreateTime 2022年5月11日 上午10:23:56 + * @param task + */ + public void fixThreadPoolExecute(Runnable task) { + newFixExecutor.submit(task); + } +}