diff --git a/lms/nladmin-system/src/main/java/org/nl/b_lms/pdm/subpackagerelation/service/impl/PdmBiSubpackagerelationServiceImpl.java b/lms/nladmin-system/src/main/java/org/nl/b_lms/pdm/subpackagerelation/service/impl/PdmBiSubpackagerelationServiceImpl.java index 667428fec..7f443bff0 100644 --- a/lms/nladmin-system/src/main/java/org/nl/b_lms/pdm/subpackagerelation/service/impl/PdmBiSubpackagerelationServiceImpl.java +++ b/lms/nladmin-system/src/main/java/org/nl/b_lms/pdm/subpackagerelation/service/impl/PdmBiSubpackagerelationServiceImpl.java @@ -483,17 +483,7 @@ public class PdmBiSubpackagerelationServiceImpl extends ServiceImpl { - try { - log.error("----回传子卷包装关系----"); - String isConnect2 = SpringContextHolder.getBean(SysParamServiceImpl.class).findByCode("IS_CONNECT_MES2").getValue(); - if ("1".equals(isConnect2)) { - transferBoxPackageToMes(false, whereJson, containerNameList, boxSn, weightTotal); - } - } catch (Exception e) { - log.error("子卷装箱异常,transferBoxPackageToMes给MES传输子卷包装关系异常,木箱号为:" + boxSn + ",异常信息:" + e); - } - }, pool); + transferBoxPackageToMes(false, whereJson, containerNameList, boxSn, weightTotal); } /** diff --git a/lms/nladmin-system/src/main/java/org/nl/b_lms/storage_manage/ios/service/iostorInv/impl/StIvtIostorinvOutServiceImpl.java b/lms/nladmin-system/src/main/java/org/nl/b_lms/storage_manage/ios/service/iostorInv/impl/StIvtIostorinvOutServiceImpl.java index e5eee6b8c..b9fdf4de4 100644 --- a/lms/nladmin-system/src/main/java/org/nl/b_lms/storage_manage/ios/service/iostorInv/impl/StIvtIostorinvOutServiceImpl.java +++ b/lms/nladmin-system/src/main/java/org/nl/b_lms/storage_manage/ios/service/iostorInv/impl/StIvtIostorinvOutServiceImpl.java @@ -10,7 +10,9 @@ import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; import com.baomidou.mybatisplus.core.conditions.update.UpdateWrapper; import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; +import lombok.SneakyThrows; import org.nl.b_lms.pdm_manage.enums.SUBEnum; +import org.nl.b_lms.sch.tasks.TwoExcepionalMoveTask; import org.nl.b_lms.sch.tasks.TwoOutExceptionalTask; import org.nl.b_lms.sch.tasks.TwoOutTask; import org.nl.b_lms.storage_manage.database.service.IBstIvtBoxinfoService; @@ -42,12 +44,15 @@ import org.nl.wms.basedata.st.service.dto.StorattrDto; import org.nl.wms.pda.mps.eum.RegionTypeEnum; import org.nl.wms.sch.manage.TaskStatusEnum; import org.nl.wms.util.TranUtil; +import org.redisson.api.RLock; +import org.redisson.api.RedissonClient; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; import java.math.BigDecimal; import java.util.*; +import java.util.concurrent.TimeUnit; import java.util.function.Consumer; import java.util.function.Function; import java.util.stream.Collector; @@ -130,6 +135,9 @@ public class StIvtIostorinvOutServiceImpl extends ServiceImpl disDaoList = new ArrayList<>(); + RLock lock = redissonClient.getLock("all_divTwo"); + boolean tryLock = lock.tryLock(0, 60,TimeUnit.SECONDS); + try { + if (tryLock) { + // 用于插入分配明细的集合 + List disDaoList = new ArrayList<>(); - for (int i = 0; i < dtlDaoList.size(); i++) { - StIvtIostorinvdtl dtlDao = dtlDaoList.get(i); + for (int i = 0; i < dtlDaoList.size(); i++) { + StIvtIostorinvdtl dtlDao = dtlDaoList.get(i); - // 调用分配库存公共方法 - List disArr = outBussManageService.divIvt(dtlDao,ivtList); + // 调用分配库存公共方法 + List disArr = outBussManageService.divIvt(dtlDao,ivtList); - disDaoList.addAll(disArr); + disDaoList.addAll(disArr); + } + + // 更新仓位 + List paramLockList = disDaoList.stream() + .map(StIvtIostorinvdis::getStruct_code) + .distinct() + .collect(Collectors.toList()); + + JSONObject jsonLockParam = new JSONObject(); + jsonLockParam.put("inv_type", mstDao.getBill_type()); + jsonLockParam.put("inv_id", mstDao.getIostorinv_id()); + jsonLockParam.put("inv_code", mstDao.getBill_code()); + jsonLockParam.put("lock_type", IOSEnum.LOCK_TYPE.code("出库锁")); + jsonLockParam.put("operate", IOSEnum.IO_TYPE.code("出库")); + + outBussManageService.lockStruct(paramLockList,jsonLockParam); + + // 插入分配明细 + iStIvtIostorinvdisService.saveBatch(disDaoList); + + // 更新主表状态 + updateMstStatus(mstDao.getIostorinv_id()); + } else { + throw new BadRequestException("其他出库单当前正在分配货位,请等待几秒再进行操作!"); + } + } finally { + if (lock.isLocked() && lock.isHeldByCurrentThread()) { + lock.unlock(); + } } - - // 更新仓位 - List paramLockList = disDaoList.stream() - .map(StIvtIostorinvdis::getStruct_code) - .distinct() - .collect(Collectors.toList()); - - JSONObject jsonLockParam = new JSONObject(); - jsonLockParam.put("inv_type", mstDao.getBill_type()); - jsonLockParam.put("inv_id", mstDao.getIostorinv_id()); - jsonLockParam.put("inv_code", mstDao.getBill_code()); - jsonLockParam.put("lock_type", IOSEnum.LOCK_TYPE.code("出库锁")); - jsonLockParam.put("operate", IOSEnum.IO_TYPE.code("出库")); - - outBussManageService.lockStruct(paramLockList,jsonLockParam); - - // 插入分配明细 - iStIvtIostorinvdisService.saveBatch(disDaoList); - - // 更新主表状态 - updateMstStatus(mstDao.getIostorinv_id()); - } @Override @@ -402,6 +422,7 @@ public class StIvtIostorinvOutServiceImpl extends ServiceImpl disList; + RLock lock = redissonClient.getLock("all_cancelDivTwo"); + boolean tryLock = lock.tryLock(0, TimeUnit.SECONDS); - JSONObject jsonDisParam = new JSONObject(); - jsonDisParam.put("work_status", IOSEnum.WORK_STATUS.code("生成")); - jsonDisParam.put("is_issued", IOSEnum.IS_NOTANDYES.code("否")); - jsonDisParam.put("iostorinv_id", whereJson.getString("iostorinv_id")); + try { + if (tryLock) { + List disList; - // 自动取消 - if (whereJson.getString("cancel_type").equals(IOSEnum.OUT_CANCEL_TYPE.code("自动取消"))) { - // 判断是否有箱号 - if (ObjectUtil.isEmpty(whereJson.getString("box_no"))) { - jsonDisParam.put("iostorinvdtl_id", whereJson.getString("iostorinvdtl_id")); + JSONObject jsonDisParam = new JSONObject(); + jsonDisParam.put("work_status", IOSEnum.WORK_STATUS.code("生成")); + jsonDisParam.put("is_issued", IOSEnum.IS_NOTANDYES.code("否")); + jsonDisParam.put("iostorinv_id", whereJson.getString("iostorinv_id")); + + // 自动取消 + if (whereJson.getString("cancel_type").equals(IOSEnum.OUT_CANCEL_TYPE.code("自动取消"))) { + // 判断是否有箱号 + if (ObjectUtil.isEmpty(whereJson.getString("box_no"))) { + jsonDisParam.put("iostorinvdtl_id", whereJson.getString("iostorinvdtl_id")); + } else { + jsonDisParam.put("box_no", whereJson.getString("box_no")); + } + } + + // 删除分配明细 + if (whereJson.getString("cancel_type").equals(IOSEnum.OUT_CANCEL_TYPE.code("删除一个"))) { + jsonDisParam.put("box_no", whereJson.getString("box_no")); + } + + disList = stIvtIostorinvdisMapper.getDivIosDisAll(jsonDisParam); + + if (ObjectUtil.isEmpty(disList)) { + throw new BadRequestException("不存在可以取消的出库分配明细"); + } + + //查询分配明细执行状态大于等于执行中,或任务状态大于等于下发时的记录 + List dtl_id_in = disList.stream() + .map(row -> row.getString("iostorinvdtl_id")) + .distinct() + .collect(Collectors.toList()); + + List disNumList = stIvtIostorinvdisMapper.getDivTaskDis(dtl_id_in); + + if (ObjectUtil.isNotEmpty(disNumList)) { + throw new BadRequestException("存在出库明细对应任务下发、执行中或完成,不可取消!"); + } + + /*删除分配记录*/ + List dis_id_in = disList.stream() + .map(row -> row.getLongValue("iostorinvdis_id")) + .collect(Collectors.toList()); + + iStIvtIostorinvdisService.remove( + new QueryWrapper().lambda() + .in(StIvtIostorinvdis::getIostorinvdis_id, dis_id_in) + ); + + /*更新库存*/ + outBussManageService.upateIvt(disList,mstDao,IOSEnum.IVT_CHANGE.code("减冻结")); + + /* + * 更新明细、主单据 + */ + // 明细集合 + List dtlDaoList = iStIvtIostorinvdtlService.list( + new QueryWrapper().lambda() + .eq(StIvtIostorinvdtl::getIostorinv_id, mstDao.getIostorinv_id()) + ); + + // 需要更新的明细集合 + List needUpdateList = new ArrayList<>(); + + // 根据明细分组 + Map> disListMap = disList.stream() + .collect(Collectors.groupingBy(row -> row.getString("iostorinvdtl_id"))); + + for (String iostorinvdtl_id : disListMap.keySet()) { + List disDaoList = disListMap.get(iostorinvdtl_id); + + // 过滤当前明细 + StIvtIostorinvdtl dtlDao = dtlDaoList.stream() + .filter(row -> row.getIostorinvdtl_id().toString().equals(iostorinvdtl_id)) + .collect(Collectors.toList()).get(0); + + // 需要减掉的数量 + double sub_qty = disDaoList.stream() + .map(row -> row.getBigDecimal("plan_qty")) + .reduce(BigDecimal.ZERO, BigDecimal::add) + .doubleValue(); + + dtlDao.setAssign_qty(NumberUtil.sub(dtlDao.getAssign_qty(), sub_qty)); + dtlDao.setUnassign_qty(NumberUtil.add(dtlDao.getUnassign_qty(), sub_qty)); + + // 已分配数量 > 0 则 = 0 + if (dtlDao.getAssign_qty().doubleValue() < 0) { + dtlDao.setAssign_qty(BigDecimal.valueOf(0)); + } + + // 未分配数量 > 计划数量 则 = 计划数量 + if (dtlDao.getUnassign_qty().doubleValue() > dtlDao.getPlan_qty().doubleValue()) { + dtlDao.setUnassign_qty(dtlDao.getPlan_qty()); + } + + // 未分配重量 = 计划重量 则 明细状态为生成 否则 为分配中 + if (dtlDao.getUnassign_qty().doubleValue() == dtlDao.getPlan_qty().doubleValue()){ + dtlDao.setBill_status(IOSEnum.BILL_STATUS.code("生成")); + } else { + dtlDao.setBill_status(IOSEnum.BILL_STATUS.code("分配中")); + } + + needUpdateList.add(dtlDao); + } + + // 更新明细 + iStIvtIostorinvdtlService.updateBatchById(needUpdateList); + + // 更新主表 + this.updateMstStatus(mstDao.getIostorinv_id()); + + /*删除出库任务*/ + String task_id_in = disList.stream() + .map(row -> row.getString("task_id")) + .distinct() + .collect(Collectors.joining("','")); + + + if (task_id_in.equals("null")) { + task_id_in = ""; + } + + JSONObject taskParam = new JSONObject(); + taskParam.put("is_delete", IOSEnum.IS_NOTANDYES.code("是")); + + taskService.update(taskParam,"task_id IN ('"+task_id_in+"')"); + + /* + * 删除移库单、移库任务 + */ + // TODO 调用移库服务处理 + + /* + * 更新仓位 + */ + // 更新仓位 + List paramLockList = disList.stream() + .map(row -> row.getString("struct_code")) + .distinct() + .collect(Collectors.toList()); + + JSONObject jsonLockParam = new JSONObject(); + jsonLockParam.put("inv_type", mstDao.getBill_type()); + jsonLockParam.put("inv_id", mstDao.getIostorinv_id()); + jsonLockParam.put("inv_code", mstDao.getBill_code()); + jsonLockParam.put("lock_type", IOSEnum.LOCK_TYPE.code("未锁定")); + jsonLockParam.put("operate", IOSEnum.IO_TYPE.code("出库")); + + outBussManageService.lockStruct(paramLockList,jsonLockParam); } else { - jsonDisParam.put("box_no", whereJson.getString("box_no")); + throw new BadRequestException("其他出库单当前正在取消分配,请等待几秒再进行操作!"); + } + + } finally { + if (lock.isLocked() && lock.isHeldByCurrentThread()) { + lock.unlock(); } } - // 删除分配明细 - if (whereJson.getString("cancel_type").equals(IOSEnum.OUT_CANCEL_TYPE.code("删除一个"))) { - jsonDisParam.put("box_no", whereJson.getString("box_no")); - } - - disList = stIvtIostorinvdisMapper.getDivIosDisAll(jsonDisParam); - - if (ObjectUtil.isEmpty(disList)) { - throw new BadRequestException("不存在可以取消的出库分配明细"); - } - - //查询分配明细执行状态大于等于执行中,或任务状态大于等于下发时的记录 - List dtl_id_in = disList.stream() - .map(row -> row.getString("iostorinvdtl_id")) - .distinct() - .collect(Collectors.toList()); - - List disNumList = stIvtIostorinvdisMapper.getDivTaskDis(dtl_id_in); - - if (ObjectUtil.isNotEmpty(disNumList)) { - throw new BadRequestException("存在出库明细对应任务下发、执行中或完成,不可取消!"); - } - - /*删除分配记录*/ - List dis_id_in = disList.stream() - .map(row -> row.getLongValue("iostorinvdis_id")) - .collect(Collectors.toList()); - - iStIvtIostorinvdisService.remove( - new QueryWrapper().lambda() - .in(StIvtIostorinvdis::getIostorinvdis_id, dis_id_in) - ); - - /*更新库存*/ - outBussManageService.upateIvt(disList,mstDao,IOSEnum.IVT_CHANGE.code("减冻结")); - - /* - * 更新明细、主单据 - */ - // 明细集合 - List dtlDaoList = iStIvtIostorinvdtlService.list( - new QueryWrapper().lambda() - .eq(StIvtIostorinvdtl::getIostorinv_id, mstDao.getIostorinv_id()) - ); - - // 需要更新的明细集合 - List needUpdateList = new ArrayList<>(); - - // 根据明细分组 - Map> disListMap = disList.stream() - .collect(Collectors.groupingBy(row -> row.getString("iostorinvdtl_id"))); - - for (String iostorinvdtl_id : disListMap.keySet()) { - List disDaoList = disListMap.get(iostorinvdtl_id); - - // 过滤当前明细 - StIvtIostorinvdtl dtlDao = dtlDaoList.stream() - .filter(row -> row.getIostorinvdtl_id().toString().equals(iostorinvdtl_id)) - .collect(Collectors.toList()).get(0); - - // 需要减掉的数量 - double sub_qty = disDaoList.stream() - .map(row -> row.getBigDecimal("plan_qty")) - .reduce(BigDecimal.ZERO, BigDecimal::add) - .doubleValue(); - - dtlDao.setAssign_qty(NumberUtil.sub(dtlDao.getAssign_qty(), sub_qty)); - dtlDao.setUnassign_qty(NumberUtil.add(dtlDao.getUnassign_qty(), sub_qty)); - - // 已分配数量 > 0 则 = 0 - if (dtlDao.getAssign_qty().doubleValue() < 0) { - dtlDao.setAssign_qty(BigDecimal.valueOf(0)); - } - - // 未分配数量 > 计划数量 则 = 计划数量 - if (dtlDao.getUnassign_qty().doubleValue() > dtlDao.getPlan_qty().doubleValue()) { - dtlDao.setUnassign_qty(dtlDao.getPlan_qty()); - } - - // 未分配重量 = 计划重量 则 明细状态为生成 否则 为分配中 - if (dtlDao.getUnassign_qty().doubleValue() == dtlDao.getPlan_qty().doubleValue()){ - dtlDao.setBill_status(IOSEnum.BILL_STATUS.code("生成")); - } else { - dtlDao.setBill_status(IOSEnum.BILL_STATUS.code("分配中")); - } - - needUpdateList.add(dtlDao); - } - - // 更新明细 - iStIvtIostorinvdtlService.updateBatchById(needUpdateList); - - // 更新主表 - this.updateMstStatus(mstDao.getIostorinv_id()); - - /*删除出库任务*/ - String task_id_in = disList.stream() - .map(row -> row.getString("task_id")) - .distinct() - .collect(Collectors.joining("','")); - - - if (task_id_in.equals("null")) { - task_id_in = ""; - } - - JSONObject taskParam = new JSONObject(); - taskParam.put("is_delete", IOSEnum.IS_NOTANDYES.code("是")); - - taskService.update(taskParam,"task_id IN ('"+task_id_in+"')"); - - /* - * 删除移库单、移库任务 - */ - // TODO 调用移库服务处理 - - /* - * 更新仓位 - */ - // 更新仓位 - List paramLockList = disList.stream() - .map(row -> row.getString("struct_code")) - .distinct() - .collect(Collectors.toList()); - - JSONObject jsonLockParam = new JSONObject(); - jsonLockParam.put("inv_type", mstDao.getBill_type()); - jsonLockParam.put("inv_id", mstDao.getIostorinv_id()); - jsonLockParam.put("inv_code", mstDao.getBill_code()); - jsonLockParam.put("lock_type", IOSEnum.LOCK_TYPE.code("未锁定")); - jsonLockParam.put("operate", IOSEnum.IO_TYPE.code("出库")); - - outBussManageService.lockStruct(paramLockList,jsonLockParam); } @Override @@ -764,7 +800,7 @@ public class StIvtIostorinvOutServiceImpl extends ServiceImpl needUpdateIvtList = new ArrayList<>(); @@ -1602,7 +1638,7 @@ public class StIvtIostorinvOutServiceImpl extends ServiceImpl row.getString("task_id").equals(json.getString("task_code"))) .collect(Collectors.toList()).get(0); - + // 完成 if (jsonTask.getString("task_status").equals(TaskStatusEnum.FINISHED.getCode())) { diff --git a/lms/nladmin-system/src/main/java/org/nl/b_lms/storage_manage/ios/service/iostorInv/util/impl/InBoxManageServiceImpl.java b/lms/nladmin-system/src/main/java/org/nl/b_lms/storage_manage/ios/service/iostorInv/util/impl/InBoxManageServiceImpl.java index ea00fbac5..a4e639629 100644 --- a/lms/nladmin-system/src/main/java/org/nl/b_lms/storage_manage/ios/service/iostorInv/util/impl/InBoxManageServiceImpl.java +++ b/lms/nladmin-system/src/main/java/org/nl/b_lms/storage_manage/ios/service/iostorInv/util/impl/InBoxManageServiceImpl.java @@ -104,13 +104,13 @@ public class InBoxManageServiceImpl implements InBoxManageService { .eq("task_type", "010702") .eq("is_delete", "0") .lt("task_status", TaskStatusEnum.FINISHED.getCode())); - if (count>0){ - throw new BadRequestException("当前木箱入库任务已存在"+ boxNo); + if (count > 0) { + throw new BadRequestException("当前木箱入库任务已存在" + boxNo); } //查询仓库是否存在相同木箱 JSONArray stIvtStructattr = WQLObject.getWQLObject("st_ivt_structattr").query("storagevehicle_code = '" + boxNo + "'").getResultJSONArray(0); - if (stIvtStructattr!=null && stIvtStructattr.size()>0){ - throw new BadRequestException("当前木箱已经存在库中"+stIvtStructattr.getJSONObject(0).getString("struct_code")); + if (stIvtStructattr != null && stIvtStructattr.size() > 0) { + throw new BadRequestException("当前木箱已经存在库中" + stIvtStructattr.getJSONObject(0).getString("struct_code")); } // 查询木箱信息 BstIvtBoxinfo boxDao = iBstIvtBoxinfoService.getOne( @@ -201,10 +201,10 @@ public class InBoxManageServiceImpl implements InBoxManageService { throw new BadRequestException("扫描的木箱个数和选择的木箱层数不一致!"); } Set collect = Arrays.stream(split).collect(Collectors.toSet()); - if (collect.size()!=split.length){ + if (collect.size() != split.length) { throw new BadRequestException("扫描的木箱条码不能相同"); } - if (split.length>3){ + if (split.length > 3) { throw new BadRequestException("堆叠木箱最大不能超过3层"); } // 校验是否有相同木箱号 @@ -218,8 +218,8 @@ public class InBoxManageServiceImpl implements InBoxManageService { //查询仓库是否存在相同木箱 for (String boxSn : split) { JSONArray stIvtStructattr = WQLObject.getWQLObject("st_ivt_structattr").query("storagevehicle_code = '" + boxSn + "'").getResultJSONArray(0); - if (stIvtStructattr!=null && stIvtStructattr.size()>0){ - throw new BadRequestException("当前木箱已经存在库中"+stIvtStructattr.getJSONObject(0).getString("struct_code")); + if (stIvtStructattr != null && stIvtStructattr.size() > 0) { + throw new BadRequestException("当前木箱已经存在库中" + stIvtStructattr.getJSONObject(0).getString("struct_code")); } } @@ -349,13 +349,13 @@ public class InBoxManageServiceImpl implements InBoxManageService { // 手工入库 if (whereJson.getString("bill_type").equals(IOSEnum.IN_TYPE.code("手工入库"))) { if (!ifFirst) { - throw new BadRequestException("此木箱【"+whereJson.getString("box_no")+"】未入过库,请选择【生产入库】!"); + throw new BadRequestException("此木箱【" + whereJson.getString("box_no") + "】未入过库,请选择【生产入库】!"); } } if (whereJson.getString("bill_type").equals(IOSEnum.IN_TYPE.code("生产入库"))) { if (ifFirst) { - throw new BadRequestException("此木箱【"+whereJson.getString("box_no")+"】已入过库,请选择【手工入库】!"); + throw new BadRequestException("此木箱【" + whereJson.getString("box_no") + "】已入过库,请选择【手工入库】!"); } } } @@ -368,15 +368,15 @@ public class InBoxManageServiceImpl implements InBoxManageService { JSONObject param = new JSONObject(); param.put("pcsn", ""); WQLObject.getWQLObject("md_pb_storagevehicleext") - .update(param,"pcsn = '"+whereJson.getString("box_no")+"'"); + .update(param, "pcsn = '" + whereJson.getString("box_no") + "'"); } // 更新子卷包装关系创建人 JSONObject param2 = new JSONObject(); - param2.put("create_id",SecurityUtils.getCurrentUserId()); - param2.put("create_name",SecurityUtils.getCurrentNickName()); + param2.put("create_id", SecurityUtils.getCurrentUserId()); + param2.put("create_name", SecurityUtils.getCurrentNickName()); WQLObject.getWQLObject("pdm_bi_subpackagerelation") - .update(param2,"package_box_sn = '"+whereJson.getString("box_no")+"'"); + .update(param2, "package_box_sn = '" + whereJson.getString("box_no") + "'"); /* * 查询mes木箱信息,插入木箱信息表 @@ -423,6 +423,12 @@ public class InBoxManageServiceImpl implements InBoxManageService { param.put("height", boxDao.getBox_high()); param.put("containerType", boxDao.getVehicle_type()); String type = whereJson.getString("bill_type"); + if (StrUtil.isEmpty(type)) { + throw new BadRequestException("入库类型不能为空!"); + } + if (type.length() < 4) { + throw new BadRequestException("入库类型字段长度不能少于4!"); + } param.put("barcode", whereJson.getString("box_no") + "-" + type.substring(3, 4)); //根据木箱高度,判断入库仓位的高度 diff --git a/lms/nladmin-system/src/main/java/org/nl/common/domain/query/BaseQuery.java b/lms/nladmin-system/src/main/java/org/nl/common/domain/query/BaseQuery.java index 42cb8cad3..c3887b1d5 100644 --- a/lms/nladmin-system/src/main/java/org/nl/common/domain/query/BaseQuery.java +++ b/lms/nladmin-system/src/main/java/org/nl/common/domain/query/BaseQuery.java @@ -32,8 +32,9 @@ public class BaseQuery { /** * 创建时间范围查询 */ - private Date start_time; - private Date end_time; + private String start_time; + private String begin_time; + private String end_time; /** @@ -44,8 +45,9 @@ public class BaseQuery { * 通过buid构建 */ public Map doP = MapOf.of("blurry", QParam.builder().k(new String[]{"name"}).type(QueryTEnum.LK).build() - , "startTime", QParam.builder().k(new String[]{"create_time"}).type(QueryTEnum.LT).build() - , "endTime", QParam.builder().k(new String[]{"create_time"}).type(QueryTEnum.LE).build() + , "start_time", QParam.builder().k(new String[]{"create_time"}).type(QueryTEnum.GT).build() + , "begin_time", QParam.builder().k(new String[]{"create_time"}).type(QueryTEnum.GT).build() + , "end_time", QParam.builder().k(new String[]{"create_time"}).type(QueryTEnum.LE).build() , "sort", QParam.builder().k(new String[]{"sort"}).type(QueryTEnum.BY).build() ); diff --git a/lms/nladmin-system/src/main/java/org/nl/common/enums/QueryTEnum.java b/lms/nladmin-system/src/main/java/org/nl/common/enums/QueryTEnum.java index 2275bb4f5..ef3680444 100644 --- a/lms/nladmin-system/src/main/java/org/nl/common/enums/QueryTEnum.java +++ b/lms/nladmin-system/src/main/java/org/nl/common/enums/QueryTEnum.java @@ -30,6 +30,9 @@ public enum QueryTEnum { LE((q, k, v) -> { q.le(k[0], v); }), + GT((q, k, v) -> { + q.gt(k[0], v); + }), BY((q, k, v) -> { q.orderByDesc(k[0], v); }), diff --git a/lms/nladmin-system/src/main/java/org/nl/config/DataBaseConfig.java b/lms/nladmin-system/src/main/java/org/nl/config/DataBaseConfig.java index f679d3b82..88e916df8 100644 --- a/lms/nladmin-system/src/main/java/org/nl/config/DataBaseConfig.java +++ b/lms/nladmin-system/src/main/java/org/nl/config/DataBaseConfig.java @@ -1,6 +1,7 @@ package org.nl.config; import com.alibaba.druid.pool.DruidDataSource; +import com.github.pagehelper.parser.CountSqlParser; import lombok.extern.slf4j.Slf4j; import org.springframework.boot.context.properties.ConfigurationProperties; import org.springframework.context.annotation.Bean; @@ -12,7 +13,7 @@ import javax.sql.DataSource; @Configuration @Slf4j public class DataBaseConfig { - + public static CountSqlParser countSqlParser = new CountSqlParser(); @Primary @Bean(name = "dataSource") @ConfigurationProperties(prefix = "spring.datasource.druid") diff --git a/lms/nladmin-system/src/main/java/org/nl/config/TlogIdGenerator.java b/lms/nladmin-system/src/main/java/org/nl/config/TlogIdGenerator.java index 90be04997..557fe91bc 100644 --- a/lms/nladmin-system/src/main/java/org/nl/config/TlogIdGenerator.java +++ b/lms/nladmin-system/src/main/java/org/nl/config/TlogIdGenerator.java @@ -1,11 +1,19 @@ package org.nl.config; +import cn.hutool.core.date.DateUtil; import cn.hutool.core.util.IdUtil; import com.yomahub.tlog.id.TLogIdGenerator; +import java.util.UUID; + public class TlogIdGenerator extends TLogIdGenerator { @Override public String generateTraceId() { - return IdUtil.getSnowflake(1, 1).nextIdStr(); + String idStr = String.valueOf(System.currentTimeMillis()); + try { + idStr = IdUtil.getSnowflake(1, 1).nextIdStr(); + }catch (Exception ex){ + } + return idStr; } } diff --git a/lms/nladmin-system/src/main/java/org/nl/modules/common/utils/FileUtil.java b/lms/nladmin-system/src/main/java/org/nl/modules/common/utils/FileUtil.java index df4af2968..e221f58f0 100644 --- a/lms/nladmin-system/src/main/java/org/nl/modules/common/utils/FileUtil.java +++ b/lms/nladmin-system/src/main/java/org/nl/modules/common/utils/FileUtil.java @@ -16,6 +16,7 @@ package org.nl.modules.common.utils;/* import cn.hutool.core.io.IoUtil; import cn.hutool.core.util.IdUtil; +import cn.hutool.core.util.ObjectUtil; import cn.hutool.poi.excel.BigExcelWriter; import cn.hutool.poi.excel.ExcelUtil; import org.apache.poi.util.IOUtils; @@ -203,26 +204,34 @@ public class FileUtil extends cn.hutool.core.io.FileUtil { * 导出excel */ public static void downloadExcel(List> list, HttpServletResponse response) throws IOException { - String tempPath = SYS_TEM_DIR + IdUtil.fastSimpleUUID() + ".xlsx"; - File file = new File(tempPath); - BigExcelWriter writer = ExcelUtil.getBigWriter(file); - // 一次性写出内容,使用默认样式,强制输出标题 - writer.write(list, true); - SXSSFSheet sheet = (SXSSFSheet)writer.getSheet(); - //上面需要强转SXSSFSheet 不然没有trackAllColumnsForAutoSizing方法 - sheet.trackAllColumnsForAutoSizing(); - //列宽自适应 - writer.autoSizeColumnAll(); - //response为HttpServletResponse对象 - response.setContentType("application/vnd.openxmlformats-officedocument.spreadsheetml.sheet;charset=utf-8"); - //test.xls是弹出下载对话框的文件名,不能为中文,中文请自行编码 - response.setHeader("Content-Disposition", "attachment;filename=file.xlsx"); - ServletOutputStream out = response.getOutputStream(); - // 终止后删除临时文件 - file.deleteOnExit(); - writer.flush(out, true); - //此处记得关闭输出Servlet流 - IoUtil.close(out); + ServletOutputStream out = null; + BigExcelWriter writer; + try { + String tempPath = SYS_TEM_DIR + IdUtil.fastSimpleUUID() + ".xlsx"; + File file = new File(tempPath); + writer = ExcelUtil.getBigWriter(file); + // 一次性写出内容,使用默认样式,强制输出标题 + writer.write(list, true); + SXSSFSheet sheet = (SXSSFSheet) writer.getSheet(); + //上面需要强转SXSSFSheet 不然没有trackAllColumnsForAutoSizing方法 + sheet.trackAllColumnsForAutoSizing(); + //列宽自适应 + writer.autoSizeColumnAll(); + //response为HttpServletResponse对象 + response.setContentType("application/vnd.openxmlformats-officedocument.spreadsheetml.sheet;charset=utf-8"); + //test.xls是弹出下载对话框的文件名,不能为中文,中文请自行编码 + response.setHeader("Content-Disposition", "attachment;filename=file.xlsx"); + out = response.getOutputStream(); + // 终止后删除临时文件 + file.deleteOnExit(); + writer.flush(out, true); + } finally { + //此处记得关闭输出Servlet流 + if (ObjectUtil.isNotEmpty(out)) { + IoUtil.close(out); + } + } + } public static String getFileType(String type) { diff --git a/lms/nladmin-system/src/main/java/org/nl/modules/logging/aspect/LogAspect.java b/lms/nladmin-system/src/main/java/org/nl/modules/logging/aspect/LogAspect.java index 2834719d2..c2bc6bc65 100644 --- a/lms/nladmin-system/src/main/java/org/nl/modules/logging/aspect/LogAspect.java +++ b/lms/nladmin-system/src/main/java/org/nl/modules/logging/aspect/LogAspect.java @@ -28,6 +28,7 @@ import org.nl.common.utils.BaseCode; import org.nl.common.utils.IdUtil; import org.nl.common.utils.SecurityUtils; import org.nl.config.lucene.LuceneAppender; +import org.nl.modules.common.exception.BadRequestException; import org.nl.modules.common.utils.RequestHolder; import org.nl.modules.common.utils.StringUtils; import org.nl.modules.common.utils.ThrowableUtil; @@ -42,8 +43,10 @@ import org.springframework.web.context.request.ServletRequestAttributes; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; +import java.lang.reflect.InvocationTargetException; import java.lang.reflect.Method; import java.lang.reflect.Parameter; +import java.lang.reflect.UndeclaredThrowableException; import java.util.ArrayList; import java.util.HashMap; import java.util.List; @@ -103,26 +106,32 @@ public class LogAspect { log.info("[--request--][请求接口:{}][请求参数:{}]", url, params); currentTime.set(System.currentTimeMillis()); result = joinPoint.proceed(); - SysLog log = new SysLog("INFO", System.currentTimeMillis() - currentTime.get()); - currentTime.remove(); - logService.save(getUsername(), StringUtils.getBrowser(request), StringUtils.getIp(request), joinPoint, log); - }catch (Exception ex) { + }catch (Throwable ex) { StringBuffer errorStack = new StringBuffer(); errorStack.append("
【异常堆栈:"); - String errorMsg = ex.getMessage(); int x = 0; + if (ex instanceof UndeclaredThrowableException){ + ex = ((UndeclaredThrowableException) ex).getUndeclaredThrowable(); + if (ex instanceof InvocationTargetException){ + ex = ((InvocationTargetException) ex).getTargetException(); + } + } StackTraceElement[] stackTrace = ex.getStackTrace(); if (stackTrace != null && stackTrace.length > 0) { for (StackTraceElement stack : stackTrace) { x++; errorStack.append(stack.toString().replaceAll("<", ">")).append("
"); - if (x > 10) { + if (x > 15) { break; } } } - log.error("[-requestError-][请求接口:{}]【异常信息:{}】[请求参数:{}] {}", url, errorMsg, params, errorStack.append("】").toString()); - throw ex; + log.error("[-requestError-][请求接口:{}]【异常信息:{}】[请求参数:{}] {}", url, ex.getMessage(), params, ThrowableUtil.getStackTrace(ex)); + if (ex instanceof BadRequestException){ + throw ex; + }else { + throw new BadRequestException("系统繁忙,请联系管理员确认,稍后再试"); + } } finally { log.info("[--response--][请求接口:{} 执行结束][耗时:{}s]", url, (System.currentTimeMillis() - comming) / 1000); MDC.clear(); @@ -170,7 +179,7 @@ public class LogAspect { * @param joinPoint join point for advice * @param e exception */ - @AfterThrowing(pointcut = "logPointcut()", throwing = "e") +// @AfterThrowing(pointcut = "logPointcut()", throwing = "e") public void logAfterThrowing(JoinPoint joinPoint, Throwable e) { SysLog log = new SysLog("ERROR", System.currentTimeMillis() - currentTime.get()); currentTime.remove(); diff --git a/lms/nladmin-system/src/main/java/org/nl/modules/logging/aspect/WhiteListLogAspect.java b/lms/nladmin-system/src/main/java/org/nl/modules/logging/aspect/WhiteListLogAspect.java index f1b75ceee..bf6e0dae7 100644 --- a/lms/nladmin-system/src/main/java/org/nl/modules/logging/aspect/WhiteListLogAspect.java +++ b/lms/nladmin-system/src/main/java/org/nl/modules/logging/aspect/WhiteListLogAspect.java @@ -1,126 +1,133 @@ -package org.nl.modules.logging.aspect; - -import cn.hutool.core.util.ObjectUtil; -import cn.hutool.json.JSONUtil; -import lombok.extern.slf4j.Slf4j; -import org.aspectj.lang.JoinPoint; -import org.aspectj.lang.ProceedingJoinPoint; -import org.aspectj.lang.annotation.*; -import org.aspectj.lang.reflect.MethodSignature; -import org.nl.common.utils.SecurityUtils; -import org.nl.modules.common.utils.RequestHolder; -import org.nl.modules.common.utils.StringUtils; -import org.nl.modules.common.utils.ThrowableUtil; -import org.nl.modules.logging.properties.LoggingProperties; -import org.nl.system.service.logging.ISysInterfaceLogService; -import org.nl.system.service.logging.dao.SysInterfaceLog; -import org.nl.system.service.logging.dao.SysLog; -import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.stereotype.Component; -import org.springframework.util.AntPathMatcher; -import org.springframework.web.context.request.RequestContextHolder; -import org.springframework.web.context.request.ServletRequestAttributes; -import org.springframework.web.multipart.support.MultipartFilter; - -import javax.servlet.http.HttpServletRequest; -import javax.servlet.http.HttpServletResponse; -import java.lang.reflect.Method; -import java.util.Arrays; -import java.util.List; -import java.util.Objects; -import java.util.stream.Collectors; - -/** - * @author by: zz - * @ClassName: WhiteListLogAspect - * @Description: 外部接口日志切面插入日志表 - * @Date: 2024/7/25 15:06 - */ -@Slf4j -//@Aspect -//@Component -public class WhiteListLogAspect { - - @Autowired - private LoggingProperties loggingProperties; - - @Autowired - private ISysInterfaceLogService interfaceLogService; - - private AntPathMatcher pathMatcher = new AntPathMatcher(); - - @Pointcut("execution(* org.nl.wms.ext..*Service.*(..)) || @annotation(org.nl.modules.logging.annotation.InterfaceLog)") - public void logPointcut() { - // 该方法无方法体,主要为了让同类中其他方法使用此切入点 - } - +//package org.nl.modules.logging.aspect; +// +//import cn.hutool.core.util.ObjectUtil; +//import cn.hutool.json.JSONUtil; +//import lombok.extern.slf4j.Slf4j; +//import org.aspectj.lang.JoinPoint; +//import org.aspectj.lang.ProceedingJoinPoint; +//import org.aspectj.lang.annotation.*; +//import org.aspectj.lang.reflect.MethodSignature; +//import org.nl.common.utils.SecurityUtils; +//import org.nl.modules.common.utils.RequestHolder; +//import org.nl.modules.common.utils.StringUtils; +//import org.nl.modules.common.utils.ThrowableUtil; +//import org.nl.modules.logging.properties.LoggingProperties; +//import org.nl.system.service.logging.ISysInterfaceLogService; +//import org.nl.system.service.logging.dao.SysInterfaceLog; +//import org.nl.system.service.logging.dao.SysLog; +//import org.springframework.beans.factory.annotation.Autowired; +//import org.springframework.scheduling.annotation.Async; +//import org.springframework.stereotype.Component; +//import org.springframework.util.AntPathMatcher; +//import org.springframework.web.context.request.RequestContextHolder; +//import org.springframework.web.context.request.ServletRequestAttributes; +//import org.springframework.web.multipart.support.MultipartFilter; +// +//import javax.servlet.http.HttpServletRequest; +//import javax.servlet.http.HttpServletResponse; +//import java.lang.reflect.Method; +//import java.util.Arrays; +//import java.util.List; +//import java.util.Objects; +//import java.util.stream.Collectors; +// +///** +// * @author by: zz +// * @ClassName: WhiteListLogAspect +// * @Description: 外部接口日志切面插入日志表 +// * @Date: 2024/7/25 15:06 +// */ +////@Slf4j +////@Aspect +////@Component +//public class WhiteListLogAspect { +// +//// @Autowired +// private LoggingProperties loggingProperties; +// +// @Autowired +// private ISysInterfaceLogService interfaceLogService; +// +// private AntPathMatcher pathMatcher = new AntPathMatcher(); +// +// @Pointcut("execution(* org.nl.wms.ext..*Service.*(..)) || @annotation(org.nl.modules.logging.annotation.InterfaceLog)") +// public void logPointcut() { +// // 该方法无方法体,主要为了让同类中其他方法使用此切入点 +// } +// // @Around("logPointcut()") - public Object doAround(ProceedingJoinPoint joinPoint) throws Throwable { - Object[] args = joinPoint.getArgs(); - Object result = null; - try { - long startTime = System.currentTimeMillis(); - result = joinPoint.proceed(args); - long endTime = System.currentTimeMillis(); - long time = endTime - startTime; - MethodSignature signature = (MethodSignature) joinPoint.getSignature(); - //黑名单接口不打印日志 - if (!shouldLog(signature.getName())){ - addLog(joinPoint, JSONUtil.toJsonStr(result), time); - } - } catch (Exception e) { - log.error("doAround日志记录异常,异常信息为:", e); - } - return result; - } - - /** - * 日志记录操作 - */ - public void addLog(ProceedingJoinPoint joinPoint, String outParams, long time) { - ServletRequestAttributes attributes = (ServletRequestAttributes) RequestContextHolder.getRequestAttributes(); - HttpServletRequest request = null; - if (ObjectUtil.isNotEmpty(attributes)) { - request = attributes.getRequest(); - } - // 方法路径 - SysInterfaceLog log = new SysInterfaceLog("INFO", time); - String borwser = ObjectUtil.isNotEmpty(attributes) ? StringUtils.getBrowser(request) : "定时器"; - String ip = ObjectUtil.isNotEmpty(attributes) ? StringUtils.getIp(request) : "定时器"; - interfaceLogService.save(getUsername(), outParams, borwser, ip, joinPoint, log); - } - - public String getUsername() { - try { - return SecurityUtils.getCurrentUsername(); - } catch (Exception e) { - return ""; - } - } - - @AfterThrowing(pointcut = "logPointcut()", throwing = "e") - public void logAfterThrowing(JoinPoint joinPoint, Throwable e) { - SysInterfaceLog log = new SysInterfaceLog("ERROR", 0L); - log.setException_detail(ThrowableUtil.getStackTrace(e).getBytes()); - HttpServletRequest request = RequestHolder.getHttpServletRequest(); - interfaceLogService.save(getUsername(), e.toString(), StringUtils.getBrowser(request), StringUtils.getIp(request), (ProceedingJoinPoint) joinPoint, log); - } - - /** - * 过滤参数 - * - * @param args - * @return - */ - private List filterArgs(Object[] args) { - return Arrays.stream(args).filter(object -> !(object instanceof MultipartFilter) - && !(object instanceof HttpServletRequest) - && !(object instanceof HttpServletResponse) - ).collect(Collectors.toList()); - } - - private boolean shouldLog(String requestURI) { - return loggingProperties.getIncludePaths().stream().anyMatch(pattern -> pathMatcher.match(pattern, requestURI)); - } -} - +// public Object doAround(ProceedingJoinPoint joinPoint) throws Throwable { +// Object[] args = joinPoint.getArgs(); +// long startTime = System.currentTimeMillis(); +// try { +// Object result = joinPoint.proceed(args); +// long endTime = System.currentTimeMillis(); +// long time = endTime - startTime; +// MethodSignature signature = (MethodSignature) joinPoint.getSignature(); +// //黑名单接口不打印日志 +// if (!shouldLog(signature.getName())){ +// addLog(joinPoint, JSONUtil.toJsonStr(result), time); +// } +// return result; +// } catch (Exception e) { +// log.error("doAround日志记录异常,异常信息为:", e); +// throw e; +// } +// +// } +// +// /** +// * 日志记录操作 +// */ +// public void addLog(ProceedingJoinPoint joinPoint, String outParams, long time) { +// ServletRequestAttributes attributes = (ServletRequestAttributes) RequestContextHolder.getRequestAttributes(); +// HttpServletRequest request = null; +// if (ObjectUtil.isNotEmpty(attributes)) { +// request = attributes.getRequest(); +// } +// // 方法路径 +// SysInterfaceLog log = new SysInterfaceLog("INFO", time); +// String borwser = ObjectUtil.isNotEmpty(attributes) ? StringUtils.getBrowser(request) : "定时器"; +// String ip = ObjectUtil.isNotEmpty(attributes) ? StringUtils.getIp(request) : "定时器"; +// interfaceLogService.save(getUsername(), outParams, borwser, ip, joinPoint, log); +// } +// +// public String getUsername() { +// try { +// return SecurityUtils.getCurrentUsername(); +// } catch (Exception e) { +// return ""; +// } +// } +// +// @AfterThrowing(pointcut = "logPointcut()", throwing = "e") +// public void logAfterThrowing(JoinPoint joinPoint, Throwable e) { +// try { +// SysInterfaceLog log = new SysInterfaceLog("ERROR", 0L); +// log.setException_detail(ThrowableUtil.getStackTrace(e).getBytes()); +// HttpServletRequest request = RequestHolder.getHttpServletRequest(); +// interfaceLogService.save(getUsername(), e.toString(), StringUtils.getBrowser(request), StringUtils.getIp(request), (ProceedingJoinPoint) joinPoint, log); +// }catch (Exception ex){ +// log.error("doAround日志记录异常,异常信息为:", ex); +// } +// +// } +// +// /** +// * 过滤参数 +// * +// * @param args +// * @return +// */ +// private List filterArgs(Object[] args) { +// return Arrays.stream(args).filter(object -> !(object instanceof MultipartFilter) +// && !(object instanceof HttpServletRequest) +// && !(object instanceof HttpServletResponse) +// ).collect(Collectors.toList()); +// } +// +// private boolean shouldLog(String requestURI) { +// return loggingProperties.getIncludePaths().stream().anyMatch(pattern -> pathMatcher.match(pattern, requestURI)); +// } +//} +// diff --git a/lms/nladmin-system/src/main/java/org/nl/modules/logging/service/impl/InterfaceLogServiceImpl.java b/lms/nladmin-system/src/main/java/org/nl/modules/logging/service/impl/InterfaceLogServiceImpl.java index bbcacb4f8..5841eaa48 100644 --- a/lms/nladmin-system/src/main/java/org/nl/modules/logging/service/impl/InterfaceLogServiceImpl.java +++ b/lms/nladmin-system/src/main/java/org/nl/modules/logging/service/impl/InterfaceLogServiceImpl.java @@ -71,8 +71,8 @@ public class InterfaceLogServiceImpl implements InterfaceLogService { map.put("log_dtl_info", whereJson.get("log_dtl_info")); map.put("log_type", whereJson.get("log_type")); map.put("method", whereJson.get("method")); - JSONObject json = WQL.getWO("QSCH_INTERFACE_LOGS").addParamMap(map).pageQuery(WqlUtil.getHttpContext(pageable), "create_time desc"); - return json; +// JSONObject json = WQL.getWO("QSCH_INTERFACE_LOGS").addParamMap(map).pageQuery(WqlUtil.getHttpContext(pageable), "create_time desc"); + return new HashMap<>(); } @Override diff --git a/lms/nladmin-system/src/main/java/org/nl/modules/wql/core/bean/ResultBean.java b/lms/nladmin-system/src/main/java/org/nl/modules/wql/core/bean/ResultBean.java index 62bb50fc1..6bf8ae107 100644 --- a/lms/nladmin-system/src/main/java/org/nl/modules/wql/core/bean/ResultBean.java +++ b/lms/nladmin-system/src/main/java/org/nl/modules/wql/core/bean/ResultBean.java @@ -7,7 +7,7 @@ * * 创 建 者 :yumeng * 创建时间:2014-07-01 14:25:35 - * 文件版本:v1.0 + * 文件版本:v1.0 * *******************************************************/ package org.nl.modules.wql.core.bean; @@ -110,7 +110,7 @@ public class ResultBean implements Serializable, Cloneable { // */ // public WQLData getWQLData(WQLObject wo,int value){ // if (value < rslist.size()) { -// +// // ArrayList list = getResultSet(value); // try{ // WQLData wd = null; @@ -127,7 +127,7 @@ public class ResultBean implements Serializable, Cloneable { // } // return null; // } -// +// // /** // * 返回普通dataset // * @param value @@ -256,7 +256,7 @@ public class ResultBean implements Serializable, Cloneable { int nTotalSize = 0; if (null != rows2 && rows2.size() > 0) { JSONObject jrow2 = this.row2jsonobject((BasicDynaBean) rows2.get(0)); - nTotalSize = jrow2.getInteger("page_totalrecordnum"); + nTotalSize = jrow2.getInteger("count(0)"); } jres.put("totalElements", nTotalSize); return jres; diff --git a/lms/nladmin-system/src/main/java/org/nl/modules/wql/core/engine/syntax/wqlSELECT.java b/lms/nladmin-system/src/main/java/org/nl/modules/wql/core/engine/syntax/wqlSELECT.java index 435359dc2..495a2f639 100644 --- a/lms/nladmin-system/src/main/java/org/nl/modules/wql/core/engine/syntax/wqlSELECT.java +++ b/lms/nladmin-system/src/main/java/org/nl/modules/wql/core/engine/syntax/wqlSELECT.java @@ -1,6 +1,8 @@ package org.nl.modules.wql.core.engine.syntax; +import com.github.pagehelper.parser.CountSqlParser; import lombok.extern.slf4j.Slf4j; +import org.nl.config.DataBaseConfig; import org.nl.modules.wql.WQLCore; import org.nl.modules.wql.core.DataType; import org.nl.modules.wql.core.bean.ErrorBean; @@ -410,7 +412,8 @@ public class wqlSELECT extends IWQL { //对sql进行特殊处理,找出和第一个select配对的from,并把中间全部换为1 // String page_sql = change_1(wo.wp.sSQL); String page_sql = wo.wp.sSQL; - wo.wp.sSQL = "select count(*) PAGE_TOTALRECORDNUM from ( " + page_sql + ") TOTALRECORDVIEW"; + String countSql = DataBaseConfig.countSqlParser.getSmartCountSql(page_sql, "0"); + wo.wp.sSQL = countSql; } } //2.3、加session并执行 @@ -658,7 +661,7 @@ public class wqlSELECT extends IWQL { // this.wo = wo; // this.cmdLine = cmdLine; // this.list = list; -// +// // } diff --git a/lms/nladmin-system/src/main/java/org/nl/system/controller/user/UserController.java b/lms/nladmin-system/src/main/java/org/nl/system/controller/user/UserController.java index ebbbdbd20..1f19f46cf 100644 --- a/lms/nladmin-system/src/main/java/org/nl/system/controller/user/UserController.java +++ b/lms/nladmin-system/src/main/java/org/nl/system/controller/user/UserController.java @@ -21,6 +21,8 @@ import com.alibaba.fastjson.JSONObject; import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; import com.baomidou.mybatisplus.core.conditions.update.UpdateWrapper; +import com.github.pagehelper.Page; +import com.github.pagehelper.PageHelper; import lombok.RequiredArgsConstructor; import org.nl.common.TableDataInfo; import org.nl.common.domain.query.PageQuery; @@ -32,6 +34,7 @@ import org.nl.modules.logging.annotation.Log; import org.nl.common.utils.SecurityUtils; import org.nl.system.service.user.ISysUserService; import org.nl.system.service.user.dao.SysUser; +import org.nl.system.service.user.dto.SysUserDetail; import org.nl.system.service.user.dto.UserQuery; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.http.HttpStatus; @@ -39,6 +42,7 @@ import org.springframework.http.ResponseEntity; import org.springframework.web.bind.annotation.*; import org.springframework.web.multipart.MultipartFile; +import java.util.List; import java.util.Map; import java.util.Set; @@ -58,7 +62,11 @@ public class UserController { @GetMapping public ResponseEntity query(UserQuery query, PageQuery page) { - return new ResponseEntity(TableDataInfo.build(userService.getUserDetail(query, page)), HttpStatus.OK); + Page startPage = PageHelper.startPage(page.getPage() + 1, page.getSize()); + List userDetail = userService.getUserDetail(query, page); + TableDataInfo build = TableDataInfo.build(userDetail); + build.setTotalElements(startPage.getTotal()); + return new ResponseEntity(build, HttpStatus.OK); } @Log("新增用户") diff --git a/lms/nladmin-system/src/main/java/org/nl/system/service/quartz/utils/QuartzManage.java b/lms/nladmin-system/src/main/java/org/nl/system/service/quartz/utils/QuartzManage.java index 7249dd404..0dd8b368b 100644 --- a/lms/nladmin-system/src/main/java/org/nl/system/service/quartz/utils/QuartzManage.java +++ b/lms/nladmin-system/src/main/java/org/nl/system/service/quartz/utils/QuartzManage.java @@ -1,5 +1,6 @@ package org.nl.system.service.quartz.utils; +import cn.hutool.core.net.NetUtil; import lombok.extern.slf4j.Slf4j; import org.nl.modules.common.exception.BadRequestException; import org.nl.system.service.quartz.dao.SysQuartzJob; @@ -26,6 +27,14 @@ public class QuartzManage { private Scheduler scheduler; public void addJob(SysQuartzJob quartzJob) { + + + //本机IP + String localIp = NetUtil.getLocalhostStr(); + System.out.println("本机ip:"+localIp); + if (!judgmentIp(quartzJob.getJob_ip())) { + throw new BadRequestException("本机ip与"+localIp+"调度ip"+quartzJob.getJob_ip()+"不同"); + } try { // 构建job信息 JobDetail jobDetail = JobBuilder.newJob(ExecutionJob.class). @@ -62,8 +71,16 @@ public class QuartzManage { * @param quartzJob / */ public void updateJobCron(SysQuartzJob quartzJob) { + + //本机IP + String localIp = NetUtil.getLocalhostStr(); + System.out.println("本机ip:"+localIp); + TriggerKey triggerKey = TriggerKey.triggerKey(JOB_NAME + quartzJob.getJob_id()); + + if (!judgmentIp(quartzJob.getJob_ip())) { + throw new BadRequestException("本机ip与"+localIp+"调度ip"+quartzJob.getJob_ip()+"不同"); + } try { - TriggerKey triggerKey = TriggerKey.triggerKey(JOB_NAME + quartzJob.getJob_id()); CronTrigger trigger = (CronTrigger) scheduler.getTrigger(triggerKey); // 如果不存在则创建一个定时任务 if (trigger == null) { @@ -93,8 +110,16 @@ public class QuartzManage { * @param quartzJob / */ public void resumeJob(SysQuartzJob quartzJob) { + + //本机IP + String localIp = NetUtil.getLocalhostStr(); + System.out.println("本机ip:"+localIp); + TriggerKey triggerKey = TriggerKey.triggerKey(JOB_NAME + quartzJob.getJob_id()); + + if (!judgmentIp(quartzJob.getJob_ip())) { + throw new BadRequestException("本机ip与"+localIp+"调度ip"+quartzJob.getJob_ip()+"不同"); + } try { - TriggerKey triggerKey = TriggerKey.triggerKey(JOB_NAME + quartzJob.getJob_id()); CronTrigger trigger = (CronTrigger) scheduler.getTrigger(triggerKey); // 如果不存在则创建一个定时任务 if (trigger == null) { @@ -129,9 +154,21 @@ public class QuartzManage { * @param quartzJob / */ public void runJobNow(SysQuartzJob quartzJob) { + + //本机IP + String localIp = NetUtil.getLocalhostStr(); + System.out.println("本机ip:"+localIp); + TriggerKey triggerKey = TriggerKey.triggerKey(JOB_NAME + quartzJob.getJob_id()); + + if (!judgmentIp(quartzJob.getJob_ip())) { + throw new BadRequestException("本机ip与"+localIp+"调度ip"+quartzJob.getJob_ip()+"不同"); + } + try { - TriggerKey triggerKey = TriggerKey.triggerKey(JOB_NAME + quartzJob.getJob_id()); CronTrigger trigger = (CronTrigger) scheduler.getTrigger(triggerKey); + log.info("定时任务:{}, 执行ip: {}, 定时任务开启", quartzJob.getJob_name(), localIp); + System.out.println("定时任务: " + quartzJob.getJob_name() + ", 执行ip: " + localIp + ", 定时任务开启"); + // 如果不存在则创建一个定时任务 if (trigger == null) { addJob(quartzJob); @@ -140,6 +177,7 @@ public class QuartzManage { dataMap.put(SysQuartzJob.JOB_KEY, quartzJob); JobKey jobKey = JobKey.jobKey(JOB_NAME + quartzJob.getJob_id()); scheduler.triggerJob(jobKey, dataMap); + } catch (Exception e) { log.error("定时任务执行失败", e); throw new BadRequestException("定时任务执行失败"); @@ -161,4 +199,9 @@ public class QuartzManage { throw new BadRequestException("删除定时任务失败"); } } + + public static Boolean judgmentIp(String ip) { + return NetUtil.localAddressList(null).stream() + .anyMatch(inet -> ip.equals(inet.getHostAddress())); + } } diff --git a/lms/nladmin-system/src/main/java/org/nl/system/service/tools/dao/ToolLocalStorage.java b/lms/nladmin-system/src/main/java/org/nl/system/service/tools/dao/ToolLocalStorage.java index 9498bf10b..d01afa4d1 100644 --- a/lms/nladmin-system/src/main/java/org/nl/system/service/tools/dao/ToolLocalStorage.java +++ b/lms/nladmin-system/src/main/java/org/nl/system/service/tools/dao/ToolLocalStorage.java @@ -80,13 +80,14 @@ public class ToolLocalStorage implements Serializable { */ private String update_time; - public ToolLocalStorage(String realName, String name, String suffix, String path, String type, String size) { + public ToolLocalStorage(String realName, String name, String suffix, String path, String type, String size, String create_time) { this.real_name = realName; this.name = name; this.suffix = suffix; this.path = path; this.type = type; this.size = size; + this.create_time = create_time; } diff --git a/lms/nladmin-system/src/main/java/org/nl/system/service/user/dao/mapper/SysUserMapper.xml b/lms/nladmin-system/src/main/java/org/nl/system/service/user/dao/mapper/SysUserMapper.xml index 413442aef..e073f6a82 100644 --- a/lms/nladmin-system/src/main/java/org/nl/system/service/user/dao/mapper/SysUserMapper.xml +++ b/lms/nladmin-system/src/main/java/org/nl/system/service/user/dao/mapper/SysUserMapper.xml @@ -25,36 +25,33 @@ sys_user.extuser_id as extuserId - INSERT INTO sys_user_data_permission(user_id, permission_scope_type, permission_id) - VALUES (#{dataPermission.user_id}, #{dataPermission.permission_scope_type}, #{dataPermission.permission_id}) + INSERT INTO sys_user_data_permission(user_id, permission_scope_type, permission_id) VALUES (#{dataPermission.user_id}, #{dataPermission.permission_scope_type}, #{dataPermission.permission_id}) - DELETE - FROM sys_user_data_permission - WHERE user_id = #{userId} + DELETE FROM sys_user_data_permission WHERE user_id = #{userId} - - - - - - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + + + + + @@ -83,13 +80,13 @@ and sys_user.is_used = #{query.is_used} - and sys_user.create_time >= #{query.startTime} + and and sys_user.create_time >= #{query.startTime} and #{query.end_time} >= sys_user.create_time - and (email like #{query.blurry} or username like concat('%',#{query.blurry},'%') or person_name like concat('%',#{query.blurry},'%')) + and (email like #{query.blurry} or username like #{query.blurry} or person_name like #{query.blurry}) @@ -126,15 +123,11 @@