From e7376d5b6e83129c837c290cd7dadd32278bcade Mon Sep 17 00:00:00 2001 From: aikai Date: Mon, 20 Jan 2025 10:28:36 +0800 Subject: [PATCH 1/3] =?UTF-8?q?feat(crm):=20=E6=B7=BB=E5=8A=A0=E8=B7=9F?= =?UTF-8?q?=E8=BF=9B=E8=AE=B0=E5=BD=95=E5=8A=9F=E8=83=BD=E5=B9=B6=E4=BC=98?= =?UTF-8?q?=E5=8C=96=E5=AD=97=E5=85=B8=E6=95=B0=E6=8D=AE=E7=9B=B8=E5=85=B3?= =?UTF-8?q?=E6=8E=A5=E5=8F=A3-=20=E6=96=B0=E5=A2=9E=E8=B7=9F=E8=BF=9B?= =?UTF-8?q?=E8=AE=B0=E5=BD=95=E7=9B=B8=E5=85=B3=E5=8A=9F=E8=83=BD=EF=BC=8C?= =?UTF-8?q?=E5=8C=85=E6=8B=AC=E5=88=9B=E5=BB=BA=E3=80=81=E7=BC=96=E8=BE=91?= =?UTF-8?q?=E3=80=81=E5=88=A0=E9=99=A4=E5=92=8C=E6=9F=A5=E8=AF=A2=E8=B7=9F?= =?UTF-8?q?=E8=BF=9B=E8=AE=B0=E5=BD=95=20-=20=E6=B7=BB=E5=8A=A0=E8=B7=9F?= =?UTF-8?q?=E8=BF=9B=E7=94=A8=E6=88=B7=E8=AE=B0=E5=BD=95=E7=9B=B8=E5=85=B3?= =?UTF-8?q?=E5=8A=9F=E8=83=BD=E5=92=8C=E6=8E=A5=E5=8F=A3=20-=20=E4=BC=98?= =?UTF-8?q?=E5=8C=96=E5=AD=97=E5=85=B8=E6=95=B0=E6=8D=AE=E7=9B=B8=E5=85=B3?= =?UTF-8?q?=E6=8E=A5=E5=8F=A3=EF=BC=8C=E6=94=AF=E6=8C=81=E6=89=B9=E9=87=8F?= =?UTF-8?q?=E8=8E=B7=E5=8F=96=E5=AD=97=E5=85=B8=E6=95=B0=E6=8D=AE=20-=20?= =?UTF-8?q?=E4=BF=AE=E5=A4=8D=E5=8A=A0=E7=8F=AD=E5=AE=9A=E6=97=B6=E4=BB=BB?= =?UTF-8?q?=E5=8A=A1=E7=9B=B8=E5=85=B3=E4=BB=A3=E7=A0=81=EF=BC=8C=E6=8F=90?= =?UTF-8?q?=E9=AB=98=E5=BC=82=E5=B8=B8=E5=A4=84=E7=90=86=E8=83=BD=E5=8A=9B?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../bpm/job/workovertime/WorkOvertimeJob.java | 13 +- .../admin/crmrecord/vo/CrmRecordRespVO.java | 6 + .../crmrecord/vo/CrmRecordSaveReqVO.java | 8 +- .../dal/dataobject/crmrecord/CrmRecordDO.java | 2 + .../crmrecorduser/CrmRecordUserDO.java | 38 +++++ .../dal/mysql/crmrecord/CrmRecordMapper.java | 3 + .../crmrecorduser/CrmRecordUserMapper.java | 16 ++ .../crmanalysis/CustomerServiceImpl.java | 14 +- .../crmrecord/CrmRecordServiceImpl.java | 153 +++++++++++++++--- .../crmrecorduser/CrmRecordUserService.java | 10 ++ .../CrmRecordUserServiceImpl.java | 22 +++ .../mapper/crmrecord/CrmRecordMapper.xml | 27 ++-- .../crmrecorduser/CrmRecordUserMapper.xml | 12 ++ .../module/system/api/dict/DictDataApi.java | 13 +- .../api/dict/dto/DictParameterRespDTO.java | 19 +++ .../system/api/dict/DictDataApiImpl.java | 8 + .../system/dal/mysql/dict/DictDataMapper.java | 1 + .../system/service/dict/DictDataService.java | 1 + .../service/user/AdminUserServiceImpl.java | 2 +- .../src/main/resources/application-local.yaml | 8 +- 20 files changed, 319 insertions(+), 57 deletions(-) create mode 100644 yudao-module-crm/yudao-module-crm-biz/src/main/java/cn/iocoder/yudao/module/crm/dal/dataobject/crmrecorduser/CrmRecordUserDO.java create mode 100644 yudao-module-crm/yudao-module-crm-biz/src/main/java/cn/iocoder/yudao/module/crm/dal/mysql/crmrecorduser/CrmRecordUserMapper.java create mode 100644 yudao-module-crm/yudao-module-crm-biz/src/main/java/cn/iocoder/yudao/module/crm/service/crmrecorduser/CrmRecordUserService.java create mode 100644 yudao-module-crm/yudao-module-crm-biz/src/main/java/cn/iocoder/yudao/module/crm/service/crmrecorduser/CrmRecordUserServiceImpl.java create mode 100644 yudao-module-crm/yudao-module-crm-biz/src/main/resources/mapper/crmrecorduser/CrmRecordUserMapper.xml create mode 100644 yudao-module-system/yudao-module-system-api/src/main/java/cn/iocoder/yudao/module/system/api/dict/dto/DictParameterRespDTO.java diff --git a/yudao-module-bpm/yudao-module-bpm-biz/src/main/java/cn/iocoder/yudao/module/bpm/job/workovertime/WorkOvertimeJob.java b/yudao-module-bpm/yudao-module-bpm-biz/src/main/java/cn/iocoder/yudao/module/bpm/job/workovertime/WorkOvertimeJob.java index 8031fae6..e9c468fe 100644 --- a/yudao-module-bpm/yudao-module-bpm-biz/src/main/java/cn/iocoder/yudao/module/bpm/job/workovertime/WorkOvertimeJob.java +++ b/yudao-module-bpm/yudao-module-bpm-biz/src/main/java/cn/iocoder/yudao/module/bpm/job/workovertime/WorkOvertimeJob.java @@ -44,15 +44,22 @@ public class WorkOvertimeJob { LocalDateTime now = LocalDateTime.now(); List bpmOAOvertimeDOS = overtimeMapper.selectList(new LambdaQueryWrapper() .eq(BpmOAOvertimeDO::getSettlementFlag, 0) - .eq(BpmOAOvertimeDO::getResult, BpmProcessInstanceResultEnum.APPROVE) - .ge(BpmOAOvertimeDO::getEndTime, now)); + .eq(BpmOAOvertimeDO::getResult, BpmProcessInstanceResultEnum.APPROVE.getResult()) + .le(BpmOAOvertimeDO::getEndTime, now)); if (CollectionUtil.isNotEmpty(bpmOAOvertimeDOS)) { List ids = bpmOAOvertimeDOS.stream().map(BpmOAOvertimeDO::getId).collect(Collectors.toList()); List items = overtimeItemService.getByOvertimeIds(ids); Map> map = items.stream().collect(Collectors.groupingBy(BpmOAOvertimeItemDO::getOaOvertimeId)); for (BpmOAOvertimeDO bpmOAOvertimeDO : bpmOAOvertimeDOS) { List bpmOAOvertimeItemDOS = map.get(bpmOAOvertimeDO.getId()); - overtimeService.handlingOvertime(bpmOAOvertimeDO, bpmOAOvertimeItemDOS, now); + if (CollectionUtil.isEmpty(bpmOAOvertimeItemDOS)) { + continue; + } + try { + overtimeService.handlingOvertime(bpmOAOvertimeDO, bpmOAOvertimeItemDOS, now); + } catch (Exception e) { + log.error("处理加班失败", e); + } } } log.info("结束 加班定时任务"); diff --git a/yudao-module-crm/yudao-module-crm-biz/src/main/java/cn/iocoder/yudao/module/crm/controller/admin/crmrecord/vo/CrmRecordRespVO.java b/yudao-module-crm/yudao-module-crm-biz/src/main/java/cn/iocoder/yudao/module/crm/controller/admin/crmrecord/vo/CrmRecordRespVO.java index 5f62b385..59f9683f 100644 --- a/yudao-module-crm/yudao-module-crm-biz/src/main/java/cn/iocoder/yudao/module/crm/controller/admin/crmrecord/vo/CrmRecordRespVO.java +++ b/yudao-module-crm/yudao-module-crm-biz/src/main/java/cn/iocoder/yudao/module/crm/controller/admin/crmrecord/vo/CrmRecordRespVO.java @@ -1,11 +1,13 @@ package cn.iocoder.yudao.module.crm.controller.admin.crmrecord.vo; +import cn.iocoder.yudao.module.system.api.user.dto.AdminUserRespDTO; import com.alibaba.excel.annotation.ExcelIgnoreUnannotated; import com.alibaba.excel.annotation.ExcelProperty; import io.swagger.v3.oas.annotations.media.Schema; import lombok.Data; import java.time.LocalDateTime; +import java.util.List; @Schema(description = "管理后台 - 跟进记录 Response VO") @Data @@ -58,4 +60,8 @@ public class CrmRecordRespVO { private String ownUserName; + + @Schema(description = "跟进用户列表") + @ExcelProperty("跟进用户列表") + private List adminUserRespDTOS; } diff --git a/yudao-module-crm/yudao-module-crm-biz/src/main/java/cn/iocoder/yudao/module/crm/controller/admin/crmrecord/vo/CrmRecordSaveReqVO.java b/yudao-module-crm/yudao-module-crm-biz/src/main/java/cn/iocoder/yudao/module/crm/controller/admin/crmrecord/vo/CrmRecordSaveReqVO.java index 4da90296..fdf3ea82 100644 --- a/yudao-module-crm/yudao-module-crm-biz/src/main/java/cn/iocoder/yudao/module/crm/controller/admin/crmrecord/vo/CrmRecordSaveReqVO.java +++ b/yudao-module-crm/yudao-module-crm-biz/src/main/java/cn/iocoder/yudao/module/crm/controller/admin/crmrecord/vo/CrmRecordSaveReqVO.java @@ -1,10 +1,13 @@ package cn.iocoder.yudao.module.crm.controller.admin.crmrecord.vo; import io.swagger.v3.oas.annotations.media.Schema; -import javax.validation.constraints.*; import lombok.Data; +import javax.validation.constraints.NotEmpty; +import javax.validation.constraints.NotNull; import java.time.LocalDateTime; +import java.util.ArrayList; +import java.util.List; @Schema(description = "管理后台 - 跟进记录新增/修改 Request VO") @Data @@ -40,4 +43,7 @@ public class CrmRecordSaveReqVO { @Schema(description = "跟进状态") private Integer followStatus; + @Schema(description = "跟进用户ids") + private List userIds = new ArrayList<>(); + } diff --git a/yudao-module-crm/yudao-module-crm-biz/src/main/java/cn/iocoder/yudao/module/crm/dal/dataobject/crmrecord/CrmRecordDO.java b/yudao-module-crm/yudao-module-crm-biz/src/main/java/cn/iocoder/yudao/module/crm/dal/dataobject/crmrecord/CrmRecordDO.java index b38cd8bb..8ab45f51 100644 --- a/yudao-module-crm/yudao-module-crm-biz/src/main/java/cn/iocoder/yudao/module/crm/dal/dataobject/crmrecord/CrmRecordDO.java +++ b/yudao-module-crm/yudao-module-crm-biz/src/main/java/cn/iocoder/yudao/module/crm/dal/dataobject/crmrecord/CrmRecordDO.java @@ -2,11 +2,13 @@ package cn.iocoder.yudao.module.crm.dal.dataobject.crmrecord; import cn.iocoder.yudao.framework.mybatis.core.dataobject.BaseDO; import com.baomidou.mybatisplus.annotation.KeySequence; +import com.baomidou.mybatisplus.annotation.TableField; import com.baomidou.mybatisplus.annotation.TableId; import com.baomidou.mybatisplus.annotation.TableName; import lombok.*; import java.time.LocalDateTime; +import java.util.List; /** * 跟进记录 DO diff --git a/yudao-module-crm/yudao-module-crm-biz/src/main/java/cn/iocoder/yudao/module/crm/dal/dataobject/crmrecorduser/CrmRecordUserDO.java b/yudao-module-crm/yudao-module-crm-biz/src/main/java/cn/iocoder/yudao/module/crm/dal/dataobject/crmrecorduser/CrmRecordUserDO.java new file mode 100644 index 00000000..88db8809 --- /dev/null +++ b/yudao-module-crm/yudao-module-crm-biz/src/main/java/cn/iocoder/yudao/module/crm/dal/dataobject/crmrecorduser/CrmRecordUserDO.java @@ -0,0 +1,38 @@ +package cn.iocoder.yudao.module.crm.dal.dataobject.crmrecorduser; + +import lombok.*; +import com.baomidou.mybatisplus.annotation.*; +import cn.iocoder.yudao.framework.mybatis.core.dataobject.BaseDO; +import lombok.experimental.Accessors; + +/** + * 跟进用户记录 DO + * + * @author 艾楷 + */ +@TableName("crm_record_user") +@KeySequence("crm_record_user_seq") // 用于 Oracle、PostgreSQL、Kingbase、DB2、H2 数据库的主键自增。如果是 MySQL 等数据库,可不写。 +@Data +@EqualsAndHashCode(callSuper = true) +@ToString(callSuper = true) +@Builder +@NoArgsConstructor +@AllArgsConstructor +@Accessors(chain = true) +public class CrmRecordUserDO extends BaseDO { + + /** + * id + */ + @TableId + private Long id; + /** + * 跟进记录id + */ + private Long recordId; + /** + * 跟进用户id + */ + private Long userId; + +} diff --git a/yudao-module-crm/yudao-module-crm-biz/src/main/java/cn/iocoder/yudao/module/crm/dal/mysql/crmrecord/CrmRecordMapper.java b/yudao-module-crm/yudao-module-crm-biz/src/main/java/cn/iocoder/yudao/module/crm/dal/mysql/crmrecord/CrmRecordMapper.java index 1743413e..dd4f0f7c 100644 --- a/yudao-module-crm/yudao-module-crm-biz/src/main/java/cn/iocoder/yudao/module/crm/dal/mysql/crmrecord/CrmRecordMapper.java +++ b/yudao-module-crm/yudao-module-crm-biz/src/main/java/cn/iocoder/yudao/module/crm/dal/mysql/crmrecord/CrmRecordMapper.java @@ -31,5 +31,8 @@ public interface CrmRecordMapper extends BaseMapperX { .orderByDesc(CrmRecordDO::getId)); } + + List selectStatistics(@Param("userIds") List userIds, @Param("createTime") LocalDateTime[] createTime); + } diff --git a/yudao-module-crm/yudao-module-crm-biz/src/main/java/cn/iocoder/yudao/module/crm/dal/mysql/crmrecorduser/CrmRecordUserMapper.java b/yudao-module-crm/yudao-module-crm-biz/src/main/java/cn/iocoder/yudao/module/crm/dal/mysql/crmrecorduser/CrmRecordUserMapper.java new file mode 100644 index 00000000..c082e160 --- /dev/null +++ b/yudao-module-crm/yudao-module-crm-biz/src/main/java/cn/iocoder/yudao/module/crm/dal/mysql/crmrecorduser/CrmRecordUserMapper.java @@ -0,0 +1,16 @@ +package cn.iocoder.yudao.module.crm.dal.mysql.crmrecorduser; + +import cn.iocoder.yudao.framework.mybatis.core.mapper.BaseMapperX; +import cn.iocoder.yudao.module.crm.dal.dataobject.crmrecorduser.CrmRecordUserDO; +import org.apache.ibatis.annotations.Mapper; + +/** + * 跟进用户记录 Mapper + * + * @author 艾楷 + */ +@Mapper +public interface CrmRecordUserMapper extends BaseMapperX { + + +} diff --git a/yudao-module-crm/yudao-module-crm-biz/src/main/java/cn/iocoder/yudao/module/crm/service/crmanalysis/CustomerServiceImpl.java b/yudao-module-crm/yudao-module-crm-biz/src/main/java/cn/iocoder/yudao/module/crm/service/crmanalysis/CustomerServiceImpl.java index fc3dedcd..16d3ef24 100644 --- a/yudao-module-crm/yudao-module-crm-biz/src/main/java/cn/iocoder/yudao/module/crm/service/crmanalysis/CustomerServiceImpl.java +++ b/yudao-module-crm/yudao-module-crm-biz/src/main/java/cn/iocoder/yudao/module/crm/service/crmanalysis/CustomerServiceImpl.java @@ -12,14 +12,8 @@ import cn.iocoder.yudao.module.crm.controller.admin.crmanalysis.vo.UserVolumeVO; import cn.iocoder.yudao.module.crm.controller.admin.crmcustomer.vo.CustomerStatisticRespVO; import cn.iocoder.yudao.module.crm.controller.admin.crmrecord.vo.RecordStatisticsRespVO; import cn.iocoder.yudao.module.crm.dal.dataobject.crmcustomer.CrmCustomerDO; -import cn.iocoder.yudao.module.crm.dal.mysql.crmachievement.CrmAchievementMapper; -import cn.iocoder.yudao.module.crm.dal.mysql.crmclues.CrmCluesMapper; -import cn.iocoder.yudao.module.crm.dal.mysql.crmcontract.CrmContractMapper; -import cn.iocoder.yudao.module.crm.dal.mysql.crmcontractreceivables.CrmContractReceivablesMapper; import cn.iocoder.yudao.module.crm.dal.mysql.crmcustomer.CrmCustomerMapper; -import cn.iocoder.yudao.module.crm.dal.mysql.crmrecord.CrmRecordMapper; import cn.iocoder.yudao.module.crm.service.crmrecord.CrmRecordService; -import cn.iocoder.yudao.module.system.api.dept.DeptApi; import cn.iocoder.yudao.module.system.api.dict.DictDataApi; import cn.iocoder.yudao.module.system.api.dict.dto.DictDataRespDTO; import cn.iocoder.yudao.module.system.api.user.AdminUserApi; @@ -148,7 +142,7 @@ public class CustomerServiceImpl implements CustomerService { v.setCustomerCount(0L); v.setSuccessCount(0L); v.setSuccessPer(per); - }else { + } else { v.setCustomerCount(Long.valueOf(customerMap.get(v.getId()).getCount())); v.setSuccessCount(Long.valueOf(customerMap.get(v.getId()).getDealsCount())); @@ -175,14 +169,11 @@ public class CustomerServiceImpl implements CustomerService { PageResult pageResult = adminUserApi.getUserPageByRole(dto).getCheckedData(); PageResult pageResult1 = BeanUtils.toBean(pageResult, UserRecordVO.class); if (CollectionUtil.isNotEmpty(pageResult1.getList())) { - // 获取所有用户跟进统计列表 List userIds = convertList(pageResult1.getList(), UserRecordVO::getId); List respVOS = recordService.getRecordStatistics(userIds, pageReqVO.getCreateTime()); Map recordMap = convertMap(respVOS, RecordStatisticsRespVO::getCreator); - pageResult1.getList().forEach(v -> { - RecordStatisticsRespVO respVO = recordMap.get(v.getId().toString()); if (respVO == null) { // 设置跟进总数量 @@ -193,7 +184,7 @@ public class CustomerServiceImpl implements CustomerService { v.setBusinessCount(0L); // 设置跟进线索数量 v.setCluesCount(0L); - }else { + } else { // 设置跟进总数量 v.setTotalCount(Long.valueOf(respVO.getCount())); // 设置跟进客户数量 @@ -205,7 +196,6 @@ public class CustomerServiceImpl implements CustomerService { } }); } - return pageResult1; } diff --git a/yudao-module-crm/yudao-module-crm-biz/src/main/java/cn/iocoder/yudao/module/crm/service/crmrecord/CrmRecordServiceImpl.java b/yudao-module-crm/yudao-module-crm-biz/src/main/java/cn/iocoder/yudao/module/crm/service/crmrecord/CrmRecordServiceImpl.java index 71fd6aa4..2fd205d8 100644 --- a/yudao-module-crm/yudao-module-crm-biz/src/main/java/cn/iocoder/yudao/module/crm/service/crmrecord/CrmRecordServiceImpl.java +++ b/yudao-module-crm/yudao-module-crm-biz/src/main/java/cn/iocoder/yudao/module/crm/service/crmrecord/CrmRecordServiceImpl.java @@ -1,6 +1,9 @@ package cn.iocoder.yudao.module.crm.service.crmrecord; +import cn.hutool.core.collection.CollUtil; +import cn.hutool.core.util.ObjectUtil; import cn.iocoder.yudao.framework.common.pojo.PageResult; +import cn.iocoder.yudao.framework.common.util.collection.CollectionUtils; import cn.iocoder.yudao.framework.common.util.object.BeanUtils; import cn.iocoder.yudao.framework.security.core.util.SecurityFrameworkUtils; import cn.iocoder.yudao.module.crm.controller.admin.crmrecord.vo.CrmRecordPageReqVO; @@ -11,16 +14,21 @@ import cn.iocoder.yudao.module.crm.dal.dataobject.crmbusiness.CrmBusinessDO; import cn.iocoder.yudao.module.crm.dal.dataobject.crmclues.CrmCluesDO; import cn.iocoder.yudao.module.crm.dal.dataobject.crmcustomer.CrmCustomerDO; import cn.iocoder.yudao.module.crm.dal.dataobject.crmrecord.CrmRecordDO; +import cn.iocoder.yudao.module.crm.dal.dataobject.crmrecorduser.CrmRecordUserDO; import cn.iocoder.yudao.module.crm.dal.mysql.crmbusiness.CrmBusinessMapper; import cn.iocoder.yudao.module.crm.dal.mysql.crmclues.CrmCluesMapper; import cn.iocoder.yudao.module.crm.dal.mysql.crmcustomer.CrmCustomerMapper; import cn.iocoder.yudao.module.crm.dal.mysql.crmrecord.CrmRecordMapper; +import cn.iocoder.yudao.module.crm.dal.mysql.crmrecorduser.CrmRecordUserMapper; import cn.iocoder.yudao.module.hrm.enums.RelationEnum; import cn.iocoder.yudao.module.hrm.enums.TypesEnum; import cn.iocoder.yudao.module.system.api.dict.DictDataApi; import cn.iocoder.yudao.module.system.api.dict.dto.DictDataRespDTO; +import cn.iocoder.yudao.module.system.api.dict.dto.DictParameterRespDTO; import cn.iocoder.yudao.module.system.api.user.AdminUserApi; import cn.iocoder.yudao.module.system.api.user.dto.AdminUserRespDTO; +import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; +import com.github.yulichang.wrapper.MPJLambdaWrapper; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; import org.springframework.validation.annotation.Validated; @@ -28,9 +36,13 @@ import org.springframework.validation.annotation.Validated; import javax.annotation.Resource; import java.time.LocalDateTime; import java.util.ArrayList; +import java.util.HashMap; import java.util.List; +import java.util.Map; +import java.util.stream.Collectors; import static cn.iocoder.yudao.framework.common.exception.util.ServiceExceptionUtil.exception; +import static cn.iocoder.yudao.framework.common.util.collection.CollectionUtils.convertList; import static cn.iocoder.yudao.module.hrm.enums.ErrorCodeConstants.RECORD_NOT_EXISTS; /** @@ -45,6 +57,8 @@ public class CrmRecordServiceImpl implements CrmRecordService { @Resource private CrmRecordMapper recordMapper; @Resource + private CrmRecordUserMapper crmRecordUserMapper; + @Resource private CrmCustomerMapper customerMapper; @Resource private AdminUserApi adminUserApi; @@ -61,7 +75,14 @@ public class CrmRecordServiceImpl implements CrmRecordService { // 插入 CrmRecordDO record = BeanUtils.toBean(createReqVO, CrmRecordDO.class); recordMapper.insert(record); - + // -- 插入跟进用户 + List recordUsers = new ArrayList<>(); + for (Long userId : createReqVO.getUserIds()) { + recordUsers.add(new CrmRecordUserDO().setRecordId(record.getId()).setUserId(userId)); + } + if (!recordUsers.isEmpty()) { + crmRecordUserMapper.insertBatch(recordUsers); + } //更新客户 if (TypesEnum.CUSTOMER.getValue().equals(createReqVO.getTypes())) { customerMapper.updateById(CrmCustomerDO.builder() @@ -89,8 +110,6 @@ public class CrmRecordServiceImpl implements CrmRecordService { .followTime(LocalDateTime.now()) .build()); } - - // 返回 return record.getId(); } @@ -102,14 +121,42 @@ public class CrmRecordServiceImpl implements CrmRecordService { // 更新 CrmRecordDO updateObj = BeanUtils.toBean(updateReqVO, CrmRecordDO.class); recordMapper.updateById(updateObj); + // -- 编辑更近用户的话 + List oldCrmRecordUsers = crmRecordUserMapper.selectList(new LambdaQueryWrapper() + .eq(CrmRecordUserDO::getRecordId, updateReqVO.getId())); + List oldUserIds = oldCrmRecordUsers.stream().map(CrmRecordUserDO::getUserId).collect(Collectors.toList()); + List userIds = updateReqVO.getUserIds(); + List> list = CollectionUtils.diffList(oldUserIds, userIds, + ObjectUtil::equal + ); + if (CollUtil.isNotEmpty(list.get(0))) { + List crmRecordUserDOS = new ArrayList<>(); + for (Long userId : list.get(0)) { + CrmRecordUserDO crmRecordUserDO = new CrmRecordUserDO(); + crmRecordUserDO.setRecordId(updateReqVO.getId()); + crmRecordUserDO.setUserId(userId); + crmRecordUserDOS.add(crmRecordUserDO); + } + crmRecordUserMapper.insertBatch(crmRecordUserDOS); + } + if (CollUtil.isNotEmpty(list.get(2))) { + crmRecordUserMapper.delete(new LambdaQueryWrapper() + .in(CrmRecordUserDO::getUserId, list.get(2))); + } } @Override public void deleteRecord(Long id) { // 校验存在 validateRecordExists(id); - // 删除 - recordMapper.deleteById(id); + // 删除该记录下的跟进用户 + Long adminId = SecurityFrameworkUtils.getLoginUserId(); + List crmRecordUserDOS = crmRecordUserMapper.selectList(new LambdaQueryWrapper().eq(CrmRecordUserDO::getRecordId, id)); + crmRecordUserMapper.delete(new LambdaQueryWrapper().eq(CrmRecordUserDO::getRecordId, id).eq(CrmRecordUserDO::getUserId, adminId)); + // 删除如果是最后一个的话删除一下 + if (crmRecordUserDOS.size() == 1 && adminId.equals(crmRecordUserDOS.get(0).getUserId())){ + recordMapper.deleteById(id); + } } private void validateRecordExists(Long id) { @@ -132,26 +179,88 @@ public class CrmRecordServiceImpl implements CrmRecordService { } else if (RelationEnum.SUB.getValue().equals(pageReqVO.getRelation())) { ids = adminUserApi.getUserListBySubordinateIds(adminId).getCheckedData(); } - PageResult pageResult = recordMapper.selectPage(pageReqVO, ids); + LocalDateTime beginTime = pageReqVO.getNextTime() != null && pageReqVO.getNextTime().length > 0 ? pageReqVO.getNextTime()[0] : null; + LocalDateTime endTime = pageReqVO.getNextTime() != null && pageReqVO.getNextTime().length > 0 ? pageReqVO.getNextTime()[1] : null; + MPJLambdaWrapper wrapper = new MPJLambdaWrapper() + .selectAll(CrmRecordDO.class) + .leftJoin(CrmRecordUserDO.class, CrmRecordUserDO::getRecordId, CrmRecordDO::getId) + .eqIfExists(CrmRecordDO::getTypes, pageReqVO.getTypes()) + .eqIfExists(CrmRecordDO::getTypesId, pageReqVO.getTypesId()) + .eqIfExists(CrmRecordDO::getContent, pageReqVO.getContent()) + .eqIfExists(CrmRecordDO::getRecordType, pageReqVO.getRecordType()) + .ge(beginTime != null, CrmRecordDO::getNextTime, beginTime) + .le(endTime != null, CrmRecordDO::getNextTime, endTime) + .in(CollUtil.isNotEmpty(ids), CrmRecordUserDO::getUserId, ids) + .groupBy(CrmRecordDO::getId) + .orderByDesc(CrmRecordDO::getId); + PageResult pageResult = recordMapper.selectJoinPage(pageReqVO, CrmRecordDO.class, wrapper); PageResult pageResult1 = BeanUtils.toBean(pageResult, CrmRecordRespVO.class); + List list = pageResult1.getList(); + Map> crmRecordUserMap = new HashMap<>(); + List crmRecordUserList = new ArrayList<>(); + if (CollUtil.isNotEmpty(list)) { + crmRecordUserList = crmRecordUserMapper.selectList(new LambdaQueryWrapper().in(CrmRecordUserDO::getRecordId, list.stream().map(CrmRecordRespVO::getId).collect(Collectors.toList()))); + crmRecordUserMap = crmRecordUserList.stream().collect(Collectors.groupingBy(CrmRecordUserDO::getRecordId)); + } - - for (CrmRecordRespVO crmRecordRespVO : pageResult1.getList()) { - DictDataRespDTO dto = dictDataApi.getDictData("follow_status", crmRecordRespVO.getRecordType().toString()).getCheckedData(); - crmRecordRespVO.setRecordTypeName(dto.getLabel()); - if (TypesEnum.CUSTOMER.getValue().equals(crmRecordRespVO.getTypes())) { - CrmCustomerDO customerDO = customerMapper.selectById(crmRecordRespVO.getTypesId()); - crmRecordRespVO.setTypesName(customerDO.getName()); - } else if (TypesEnum.BUSINESS.getValue().equals(crmRecordRespVO.getTypes())) { - CrmBusinessDO crmBusinessDO = crmBusinessMapper.selectById(crmRecordRespVO.getTypesId()); - crmRecordRespVO.setTypesName(crmBusinessDO.getName()); - } else if (TypesEnum.CLUES.getValue().equals(crmRecordRespVO.getTypes())) { - CrmCluesDO crmCluesDO = cluesMapper.selectById(crmRecordRespVO.getTypesId()); - crmRecordRespVO.setTypesName(crmCluesDO.getName()); + List recordTypes = list.stream().map(CrmRecordRespVO::getRecordType).map(String::valueOf).collect(Collectors.toList()); + List respDTOS = CollUtil.isNotEmpty(recordTypes) ? dictDataApi.getByValues(new DictParameterRespDTO().setDictType("follow_status").setValues(recordTypes)).getCheckedData() : new ArrayList<>(); + Map dictDataMap = CollectionUtils.convertMap(respDTOS, DictDataRespDTO::getValue); + Map> typeIdMap = list.stream().collect(Collectors.groupingBy(CrmRecordRespVO::getTypes, Collectors.mapping(CrmRecordRespVO::getTypesId, Collectors.toList()))); + // 批量查询客户、业务和线索数据 + Map customerMap = new HashMap<>(); + if (CollUtil.isNotEmpty(typeIdMap.get(TypesEnum.CUSTOMER.getValue()))) { + customerMap = customerMapper.selectBatchIds(typeIdMap.get(TypesEnum.CUSTOMER.getValue())).stream() + .collect(Collectors.toMap(CrmCustomerDO::getId, item -> item)); + } + Map businessMap = new HashMap<>(); + if (CollUtil.isNotEmpty(typeIdMap.get(TypesEnum.BUSINESS.getValue()))) { + businessMap = crmBusinessMapper.selectBatchIds(typeIdMap.get(TypesEnum.BUSINESS.getValue())).stream() + .collect(Collectors.toMap(CrmBusinessDO::getId, item -> item)); + } + Map cluesMap = new HashMap<>(); + if (CollUtil.isNotEmpty(typeIdMap.get(TypesEnum.CLUES.getValue()))) { + cluesMap = cluesMapper.selectBatchIds(typeIdMap.get(TypesEnum.CLUES.getValue())).stream() + .collect(Collectors.toMap(CrmCluesDO::getId, item -> item)); + } + List userIds = crmRecordUserList.stream().map(CrmRecordUserDO::getUserId).distinct().collect(Collectors.toList()); + Map userMap = adminUserApi.getUserList(userIds).getCheckedData().stream().collect(Collectors.toMap(AdminUserRespDTO::getId, item -> item)); + for (CrmRecordRespVO crmRecordRespVO : list) { + // 设置记录类型名称 + DictDataRespDTO dto = dictDataMap.get(crmRecordRespVO.getRecordType().toString()); + if (dto != null) { + crmRecordRespVO.setRecordTypeName(dto.getLabel()); } - AdminUserRespDTO adminUserRespDTO = adminUserApi.getUser(crmRecordRespVO.getCreator()).getCheckedData(); - crmRecordRespVO.setOwnUserName(adminUserRespDTO.getNickname()); - + // 根据类型设置名称 + String types = crmRecordRespVO.getTypes(); + if (TypesEnum.CUSTOMER.getValue().equals(types)) { + CrmCustomerDO customerDO = customerMap.get(crmRecordRespVO.getTypesId()); + if (customerDO != null) { + crmRecordRespVO.setTypesName(customerDO.getName()); + } + } else if (TypesEnum.BUSINESS.getValue().equals(types)) { + CrmBusinessDO crmBusinessDO = businessMap.get(crmRecordRespVO.getTypesId()); + if (crmBusinessDO != null) { + crmRecordRespVO.setTypesName(crmBusinessDO.getName()); + } + } else if (TypesEnum.CLUES.getValue().equals(types)) { + CrmCluesDO crmCluesDO = cluesMap.get(crmRecordRespVO.getTypesId()); + if (crmCluesDO != null) { + crmRecordRespVO.setTypesName(crmCluesDO.getName()); + } + } + // 获取创建者信息 + List crmRecordUserDOS = crmRecordUserMap.get(crmRecordRespVO.getId()); + List adminUserRespDTOS = new ArrayList<>(); + if (CollUtil.isEmpty(crmRecordUserDOS)) { + crmRecordRespVO.setAdminUserRespDTOS(adminUserRespDTOS); + continue; + } + for (CrmRecordUserDO crmRecordUserDO : crmRecordUserDOS) { + AdminUserRespDTO adminUserRespDTO = userMap.get(crmRecordUserDO.getUserId()); + adminUserRespDTOS.add(adminUserRespDTO); + } + crmRecordRespVO.setAdminUserRespDTOS(adminUserRespDTOS); } return pageResult1; } diff --git a/yudao-module-crm/yudao-module-crm-biz/src/main/java/cn/iocoder/yudao/module/crm/service/crmrecorduser/CrmRecordUserService.java b/yudao-module-crm/yudao-module-crm-biz/src/main/java/cn/iocoder/yudao/module/crm/service/crmrecorduser/CrmRecordUserService.java new file mode 100644 index 00000000..c2bd8003 --- /dev/null +++ b/yudao-module-crm/yudao-module-crm-biz/src/main/java/cn/iocoder/yudao/module/crm/service/crmrecorduser/CrmRecordUserService.java @@ -0,0 +1,10 @@ +package cn.iocoder.yudao.module.crm.service.crmrecorduser; + +/** + * 跟进用户记录 Service 接口 + * + * @author 艾楷 + */ +public interface CrmRecordUserService { + +} diff --git a/yudao-module-crm/yudao-module-crm-biz/src/main/java/cn/iocoder/yudao/module/crm/service/crmrecorduser/CrmRecordUserServiceImpl.java b/yudao-module-crm/yudao-module-crm-biz/src/main/java/cn/iocoder/yudao/module/crm/service/crmrecorduser/CrmRecordUserServiceImpl.java new file mode 100644 index 00000000..e48a2729 --- /dev/null +++ b/yudao-module-crm/yudao-module-crm-biz/src/main/java/cn/iocoder/yudao/module/crm/service/crmrecorduser/CrmRecordUserServiceImpl.java @@ -0,0 +1,22 @@ +package cn.iocoder.yudao.module.crm.service.crmrecorduser; + +import cn.iocoder.yudao.module.crm.dal.mysql.crmrecorduser.CrmRecordUserMapper; +import org.springframework.stereotype.Service; +import org.springframework.validation.annotation.Validated; + +import javax.annotation.Resource; + +/** + * 跟进用户记录 Service 实现类 + * + * @author 艾楷 + */ +@Service +@Validated +public class CrmRecordUserServiceImpl implements CrmRecordUserService { + + @Resource + private CrmRecordUserMapper crmRecordUserMapper; + + +} diff --git a/yudao-module-crm/yudao-module-crm-biz/src/main/resources/mapper/crmrecord/CrmRecordMapper.xml b/yudao-module-crm/yudao-module-crm-biz/src/main/resources/mapper/crmrecord/CrmRecordMapper.xml index 4f6b3d66..ffea7433 100644 --- a/yudao-module-crm/yudao-module-crm-biz/src/main/resources/mapper/crmrecord/CrmRecordMapper.xml +++ b/yudao-module-crm/yudao-module-crm-biz/src/main/resources/mapper/crmrecord/CrmRecordMapper.xml @@ -11,27 +11,30 @@ diff --git a/yudao-module-crm/yudao-module-crm-biz/src/main/resources/mapper/crmrecorduser/CrmRecordUserMapper.xml b/yudao-module-crm/yudao-module-crm-biz/src/main/resources/mapper/crmrecorduser/CrmRecordUserMapper.xml new file mode 100644 index 00000000..c61a9070 --- /dev/null +++ b/yudao-module-crm/yudao-module-crm-biz/src/main/resources/mapper/crmrecorduser/CrmRecordUserMapper.xml @@ -0,0 +1,12 @@ + + + + + + + \ No newline at end of file diff --git a/yudao-module-system/yudao-module-system-api/src/main/java/cn/iocoder/yudao/module/system/api/dict/DictDataApi.java b/yudao-module-system/yudao-module-system-api/src/main/java/cn/iocoder/yudao/module/system/api/dict/DictDataApi.java index d6bf4066..99c35481 100644 --- a/yudao-module-system/yudao-module-system-api/src/main/java/cn/iocoder/yudao/module/system/api/dict/DictDataApi.java +++ b/yudao-module-system/yudao-module-system-api/src/main/java/cn/iocoder/yudao/module/system/api/dict/DictDataApi.java @@ -2,6 +2,7 @@ package cn.iocoder.yudao.module.system.api.dict; import cn.iocoder.yudao.framework.common.pojo.CommonResult; import cn.iocoder.yudao.module.system.api.dict.dto.DictDataRespDTO; +import cn.iocoder.yudao.module.system.api.dict.dto.DictParameterRespDTO; import cn.iocoder.yudao.module.system.enums.ApiConstants; import io.swagger.v3.oas.annotations.Operation; import io.swagger.v3.oas.annotations.Parameter; @@ -9,6 +10,8 @@ import io.swagger.v3.oas.annotations.Parameters; import io.swagger.v3.oas.annotations.tags.Tag; import org.springframework.cloud.openfeign.FeignClient; import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.bind.annotation.PostMapping; +import org.springframework.web.bind.annotation.RequestBody; import org.springframework.web.bind.annotation.RequestParam; import java.util.Collection; @@ -23,8 +26,8 @@ public interface DictDataApi { @GetMapping(PREFIX + "/valid") @Operation(summary = "校验字典数据们是否有效") @Parameters({ - @Parameter(name = "dictType", description = "字典类型", example = "SEX", required = true), - @Parameter(name = "descriptions", description = "字典数据值的数组", example = "1,2", required = true) + @Parameter(name = "dictType", description = "字典类型", example = "SEX", required = true), + @Parameter(name = "descriptions", description = "字典数据值的数组", example = "1,2", required = true) }) CommonResult validateDictDataList(@RequestParam("dictType") String dictType, @RequestParam("values") Collection values); @@ -38,6 +41,12 @@ public interface DictDataApi { CommonResult getDictData(@RequestParam("dictType") String dictType, @RequestParam("value") String value); + + @PostMapping(PREFIX + "/getByValues") + @Operation(summary = "获得指定的字典数据-(值多选筛选)") + CommonResult> getByValues(@RequestBody DictParameterRespDTO dto); + + @GetMapping(PREFIX + "/parse") @Operation(summary = "解析获得指定的字典数据") @Parameters({ diff --git a/yudao-module-system/yudao-module-system-api/src/main/java/cn/iocoder/yudao/module/system/api/dict/dto/DictParameterRespDTO.java b/yudao-module-system/yudao-module-system-api/src/main/java/cn/iocoder/yudao/module/system/api/dict/dto/DictParameterRespDTO.java new file mode 100644 index 00000000..f93bc2e9 --- /dev/null +++ b/yudao-module-system/yudao-module-system-api/src/main/java/cn/iocoder/yudao/module/system/api/dict/dto/DictParameterRespDTO.java @@ -0,0 +1,19 @@ +package cn.iocoder.yudao.module.system.api.dict.dto; + +import io.swagger.v3.oas.annotations.media.Schema; +import lombok.Data; + +import java.util.List; + +@Schema(description = "RPC 服务 - 字典数据 Response DTO") +@Data +public class DictParameterRespDTO { + + @Schema(description = "字典值", requiredMode = Schema.RequiredMode.REQUIRED, example = "iocoder") + private List values; + + + @Schema(description = "字典类型", requiredMode = Schema.RequiredMode.REQUIRED, example = "sys_common_sex") + private String dictType; + +} diff --git a/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/api/dict/DictDataApiImpl.java b/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/api/dict/DictDataApiImpl.java index 4f45db08..f7ae7871 100644 --- a/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/api/dict/DictDataApiImpl.java +++ b/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/api/dict/DictDataApiImpl.java @@ -1,9 +1,11 @@ package cn.iocoder.yudao.module.system.api.dict; +import cn.hutool.core.bean.BeanUtil; import cn.iocoder.yudao.framework.common.enums.CommonStatusEnum; import cn.iocoder.yudao.framework.common.pojo.CommonResult; import cn.iocoder.yudao.framework.common.util.object.BeanUtils; import cn.iocoder.yudao.module.system.api.dict.dto.DictDataRespDTO; +import cn.iocoder.yudao.module.system.api.dict.dto.DictParameterRespDTO; import cn.iocoder.yudao.module.system.dal.dataobject.dict.DictDataDO; import cn.iocoder.yudao.module.system.service.dict.DictDataService; import org.springframework.validation.annotation.Validated; @@ -34,6 +36,12 @@ public class DictDataApiImpl implements DictDataApi { return success(BeanUtils.toBean(dictData, DictDataRespDTO.class)); } + @Override + public CommonResult> getByValues(DictParameterRespDTO dto) { + List list = dictDataService.getDictDataList(dto.getDictType(), dto.getValues()); + return success(BeanUtil.copyToList(list, DictDataRespDTO.class)); + } + @Override public CommonResult parseDictData(String dictType, String label) { DictDataDO dictData = dictDataService.parseDictData(dictType, label); diff --git a/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/dal/mysql/dict/DictDataMapper.java b/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/dal/mysql/dict/DictDataMapper.java index 87a05c63..9dd8d235 100644 --- a/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/dal/mysql/dict/DictDataMapper.java +++ b/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/dal/mysql/dict/DictDataMapper.java @@ -3,6 +3,7 @@ package cn.iocoder.yudao.module.system.dal.mysql.dict; import cn.iocoder.yudao.framework.common.pojo.PageResult; import cn.iocoder.yudao.framework.mybatis.core.mapper.BaseMapperX; import cn.iocoder.yudao.framework.mybatis.core.query.LambdaQueryWrapperX; +import cn.iocoder.yudao.module.system.api.dict.dto.DictParameterRespDTO; import cn.iocoder.yudao.module.system.controller.admin.dict.vo.data.DictDataPageReqVO; import cn.iocoder.yudao.module.system.dal.dataobject.dict.DictDataDO; import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; diff --git a/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/service/dict/DictDataService.java b/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/service/dict/DictDataService.java index 6ccf353e..f76af973 100644 --- a/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/service/dict/DictDataService.java +++ b/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/service/dict/DictDataService.java @@ -1,6 +1,7 @@ package cn.iocoder.yudao.module.system.service.dict; import cn.iocoder.yudao.framework.common.pojo.PageResult; +import cn.iocoder.yudao.module.system.api.dict.dto.DictParameterRespDTO; import cn.iocoder.yudao.module.system.controller.admin.dict.vo.data.DictDataPageReqVO; import cn.iocoder.yudao.module.system.controller.admin.dict.vo.data.DictDataSaveReqVO; import cn.iocoder.yudao.module.system.dal.dataobject.dict.DictDataDO; diff --git a/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/service/user/AdminUserServiceImpl.java b/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/service/user/AdminUserServiceImpl.java index ba90532d..eb72e112 100644 --- a/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/service/user/AdminUserServiceImpl.java +++ b/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/service/user/AdminUserServiceImpl.java @@ -854,7 +854,7 @@ public class AdminUserServiceImpl implements AdminUserService { List deptList = deptService.getAllList(); Map> map = deptList.stream().collect(Collectors.groupingBy(DeptDO::getParentId)); this.getSubordinateDeptIds(map, nextIds, ids); - + nextIds.add(dept.getId()); nextIds = nextIds.stream().distinct().collect(Collectors.toList()); // 2. 获取部门对应的用户信息 List users = this.getUserListByDeptIds(nextIds, null); diff --git a/yudao-module-system/yudao-module-system-biz/src/main/resources/application-local.yaml b/yudao-module-system/yudao-module-system-biz/src/main/resources/application-local.yaml index 9e1bf24b..e2b0c283 100644 --- a/yudao-module-system/yudao-module-system-biz/src/main/resources/application-local.yaml +++ b/yudao-module-system/yudao-module-system-biz/src/main/resources/application-local.yaml @@ -41,16 +41,16 @@ spring: datasource: master: name: ruoyi-vue-pro - url: jdbc:mysql://47.97.8.94:3306/${spring.datasource.dynamic.datasource.master.name}?allowMultiQueries=true&useUnicode=true&useSSL=false&characterEncoding=UTF-8&serverTimezone=Asia/Shanghai&autoReconnect=true&nullCatalogMeansCurrent=true # MySQL Connector/J 8.X 连接的示例 + url: jdbc:mysql://rm-bp1yloyj508qld78jno.mysql.rds.aliyuncs.com:3306/${spring.datasource.dynamic.datasource.slave.name}?allowMultiQueries=true&useUnicode=true&useSSL=false&characterEncoding=UTF-8&serverTimezone=Asia/Shanghai&autoReconnect=true&nullCatalogMeansCurrent=true # MySQL Connector/J 8.X 连接的示例 driver-class-name: com.mysql.jdbc.Driver username: root - password: yhtkj@2024! + password: Znalyrds2024 slave: # 模拟从库,可根据自己需要修改 # 模拟从库,可根据自己需要修改 name: ruoyi-vue-pro - url: jdbc:mysql://47.97.8.94:3306/${spring.datasource.dynamic.datasource.master.name}?allowMultiQueries=true&useUnicode=true&useSSL=false&characterEncoding=UTF-8&serverTimezone=Asia/Shanghai&autoReconnect=true&nullCatalogMeansCurrent=true # MySQL Connector/J 8.X 连接的示例 + url: jdbc:mysql://rm-bp1yloyj508qld78jno.mysql.rds.aliyuncs.com:3306/${spring.datasource.dynamic.datasource.slave.name}?allowMultiQueries=true&useUnicode=true&useSSL=false&characterEncoding=UTF-8&serverTimezone=Asia/Shanghai&autoReconnect=true&nullCatalogMeansCurrent=true # MySQL Connector/J 8.X 连接的示例 driver-class-name: com.mysql.jdbc.Driver username: root - password: yhtkj@2024! + password: Znalyrds2024 # Redis 配置。Redisson 默认的配置足够使用,一般不需要进行调优 redis: From b29d9a490d0002d881050adc033ee7c304a7ef74 Mon Sep 17 00:00:00 2001 From: aikai Date: Mon, 20 Jan 2025 16:45:19 +0800 Subject: [PATCH 2/3] =?UTF-8?q?=E8=BF=98=E5=8E=9F=E9=85=8D=E7=BD=AE?= =?UTF-8?q?=E6=96=87=E4=BB=B6?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../src/main/resources/application-local.yaml | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/yudao-module-system/yudao-module-system-biz/src/main/resources/application-local.yaml b/yudao-module-system/yudao-module-system-biz/src/main/resources/application-local.yaml index e2b0c283..9e1bf24b 100644 --- a/yudao-module-system/yudao-module-system-biz/src/main/resources/application-local.yaml +++ b/yudao-module-system/yudao-module-system-biz/src/main/resources/application-local.yaml @@ -41,16 +41,16 @@ spring: datasource: master: name: ruoyi-vue-pro - url: jdbc:mysql://rm-bp1yloyj508qld78jno.mysql.rds.aliyuncs.com:3306/${spring.datasource.dynamic.datasource.slave.name}?allowMultiQueries=true&useUnicode=true&useSSL=false&characterEncoding=UTF-8&serverTimezone=Asia/Shanghai&autoReconnect=true&nullCatalogMeansCurrent=true # MySQL Connector/J 8.X 连接的示例 + url: jdbc:mysql://47.97.8.94:3306/${spring.datasource.dynamic.datasource.master.name}?allowMultiQueries=true&useUnicode=true&useSSL=false&characterEncoding=UTF-8&serverTimezone=Asia/Shanghai&autoReconnect=true&nullCatalogMeansCurrent=true # MySQL Connector/J 8.X 连接的示例 driver-class-name: com.mysql.jdbc.Driver username: root - password: Znalyrds2024 + password: yhtkj@2024! slave: # 模拟从库,可根据自己需要修改 # 模拟从库,可根据自己需要修改 name: ruoyi-vue-pro - url: jdbc:mysql://rm-bp1yloyj508qld78jno.mysql.rds.aliyuncs.com:3306/${spring.datasource.dynamic.datasource.slave.name}?allowMultiQueries=true&useUnicode=true&useSSL=false&characterEncoding=UTF-8&serverTimezone=Asia/Shanghai&autoReconnect=true&nullCatalogMeansCurrent=true # MySQL Connector/J 8.X 连接的示例 + url: jdbc:mysql://47.97.8.94:3306/${spring.datasource.dynamic.datasource.master.name}?allowMultiQueries=true&useUnicode=true&useSSL=false&characterEncoding=UTF-8&serverTimezone=Asia/Shanghai&autoReconnect=true&nullCatalogMeansCurrent=true # MySQL Connector/J 8.X 连接的示例 driver-class-name: com.mysql.jdbc.Driver username: root - password: Znalyrds2024 + password: yhtkj@2024! # Redis 配置。Redisson 默认的配置足够使用,一般不需要进行调优 redis: From 425576ecd3f9755beca92f0c57a8796184d75261 Mon Sep 17 00:00:00 2001 From: aikai Date: Mon, 20 Jan 2025 18:53:06 +0800 Subject: [PATCH 3/3] =?UTF-8?q?feat(holiday):=20=E6=96=B0=E5=A2=9E?= =?UTF-8?q?=E5=91=98=E5=B7=A5=E5=8A=A0=E5=85=A5=E8=80=83=E5=8B=A4=E7=BB=84?= =?UTF-8?q?=E6=97=B6=E8=87=AA=E5=8A=A8=E5=8F=91=E6=94=BE=E5=81=87=E6=9C=9F?= =?UTF-8?q?=E4=BD=99=E9=A2=9D=E5=8A=9F=E8=83=BD?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - 在 AttendanceGroupUserServiceImpl 中添加新逻辑,为新加入考勤组的员工发放假期余额 - 修改 HolidayUserRecordService接口,增加 recordZero 参数控制是否记录零值假期 - 实现 HolidayUserRecordServiceImpl 中的 grant 方法,支持 recordZero 参数 - 优化 HolidaySettingService 接口,增加按 ID 列表获取假期设置的方法 - 实现 HolidaySettingServiceImpl 中的 getHolidaySettingByIds 方法 - 扩展 HolidaySettingRangeService 接口,增加按考勤组 ID 获取假期设置的方法 - 实现 HolidaySettingRangeServiceImpl 中的 getByGroupId 和 getHolidaySettingIdsByGroupId 方法 --- .../system/job/holiday/HolidayGrantJob.java | 6 ++-- .../AttendanceGroupUserServiceImpl.java | 36 ++++++++++++++++++- .../holidaysetting/HolidaySettingService.java | 8 +++++ .../HolidaySettingServiceImpl.java | 10 ++++++ .../HolidaySettingRangeService.java | 16 +++++++++ .../HolidaySettingRangeServiceImpl.java | 14 +++++++- .../HolidayUserRecordService.java | 2 +- .../HolidayUserRecordServiceImpl.java | 21 ++++++----- 8 files changed, 100 insertions(+), 13 deletions(-) diff --git a/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/job/holiday/HolidayGrantJob.java b/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/job/holiday/HolidayGrantJob.java index adbd0bf6..576ac142 100644 --- a/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/job/holiday/HolidayGrantJob.java +++ b/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/job/holiday/HolidayGrantJob.java @@ -80,7 +80,8 @@ public class HolidayGrantJob { editList.add(holidayBalanceSettingDO); Long holidaySettingId = holidayBalanceSettingDO.getHolidaySettingId(); // 发放假期 - holidayUserRecordService.grant(holidaySettingMap.get(holidaySettingId), holidaySettingRangeMap.get(holidaySettingId), holidayBalanceSettingDO, holidayWorkingAgeDOMap.get(holidaySettingId)); + holidayUserRecordService.grant(holidaySettingMap.get(holidaySettingId), holidaySettingRangeMap.get(holidaySettingId), + holidayBalanceSettingDO, holidayWorkingAgeDOMap.get(holidaySettingId), false); } } // -- // 按照员工入职日 每年员工入职日 @@ -91,7 +92,8 @@ public class HolidayGrantJob { for (HolidayBalanceSettingDO holidayBalanceSettingDO : employmentGrantList) { Long holidaySettingId = holidayBalanceSettingDO.getHolidaySettingId(); // 发放假期 - holidayUserRecordService.grant(holidaySettingMap.get(holidaySettingId), holidaySettingRangeMap.get(holidaySettingId), holidayBalanceSettingDO, holidayWorkingAgeDOMap.get(holidaySettingId)); + holidayUserRecordService.grant(holidaySettingMap.get(holidaySettingId), holidaySettingRangeMap.get(holidaySettingId), + holidayBalanceSettingDO, holidayWorkingAgeDOMap.get(holidaySettingId), false); } } if (CollectionUtil.isNotEmpty(editList)) { diff --git a/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/service/attendance/groupuser/AttendanceGroupUserServiceImpl.java b/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/service/attendance/groupuser/AttendanceGroupUserServiceImpl.java index 2426b9ed..c0f5f177 100644 --- a/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/service/attendance/groupuser/AttendanceGroupUserServiceImpl.java +++ b/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/service/attendance/groupuser/AttendanceGroupUserServiceImpl.java @@ -1,6 +1,8 @@ package cn.iocoder.yudao.module.system.service.attendance.groupuser; +import cn.hutool.core.collection.CollUtil; import cn.hutool.core.collection.CollectionUtil; +import cn.hutool.core.collection.ListUtil; import cn.hutool.core.date.LocalDateTimeUtil; import cn.iocoder.yudao.framework.common.Constants; import cn.iocoder.yudao.framework.common.pojo.PageResult; @@ -10,11 +12,17 @@ import cn.iocoder.yudao.module.system.controller.admin.groupuser.vo.AttendanceGr import cn.iocoder.yudao.module.system.controller.admin.groupuser.vo.AttendanceGroupUserSaveReqVO; import cn.iocoder.yudao.module.system.dal.dataobject.attendance.groupuser.AttendanceGroupUserDO; import cn.iocoder.yudao.module.system.dal.dataobject.attendance.punchrecord.AttendancePunchRecordDO; +import cn.iocoder.yudao.module.system.dal.dataobject.holiday.holidaysetting.HolidaySettingDO; +import cn.iocoder.yudao.module.system.dal.dataobject.holiday.holidaysettingrange.HolidaySettingRangeDO; import cn.iocoder.yudao.module.system.dal.mysql.attendance.groupuser.AttendanceGroupUserMapper; import cn.iocoder.yudao.module.system.dal.mysql.attendance.punchrecord.AttendancePunchRecordMapper; import cn.iocoder.yudao.module.system.service.attendance.punch.dto.AttendanceOnTheDayDTO; import cn.iocoder.yudao.module.system.service.attendance.punchrecord.AttendancePunchRecordService; +import cn.iocoder.yudao.module.system.service.holiday.holidaysetting.HolidaySettingService; +import cn.iocoder.yudao.module.system.service.holiday.holidaysettingrange.HolidaySettingRangeService; +import cn.iocoder.yudao.module.system.service.holiday.holidayuserrecord.HolidayUserRecordService; import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; +import org.springframework.context.annotation.Lazy; import org.springframework.data.redis.core.StringRedisTemplate; import org.springframework.stereotype.Service; import org.springframework.validation.annotation.Validated; @@ -25,6 +33,7 @@ import java.time.temporal.ChronoUnit; import java.util.ArrayList; import java.util.Collections; import java.util.List; +import java.util.Map; import java.util.stream.Collectors; import static cn.iocoder.yudao.framework.common.exception.util.ServiceExceptionUtil.exception; @@ -47,6 +56,13 @@ public class AttendanceGroupUserServiceImpl implements AttendanceGroupUserServic private AttendancePunchRecordMapper attendancePunchRecordMapper; @Resource private AttendancePunchRecordService attendancePunchRecordService; + @Resource + private HolidayUserRecordService holidayUserRecordService; + @Resource + private HolidaySettingRangeService holidaySettingRangeService; + @Resource + @Lazy + private HolidaySettingService holidaySettingService; @Override public AttendanceGroupUserCreateOrDelVO createOrDel(Long attendanceGroupId, List userIds) { @@ -66,10 +82,28 @@ public class AttendanceGroupUserServiceImpl implements AttendanceGroupUserServic .in(AttendanceGroupUserDO::getUserId, delIds)); } if (CollectionUtil.isNotEmpty(saveIds)) { + List items = new ArrayList<>(); for (Long userId : saveIds) { list.add(new AttendanceGroupUserDO().setUserId(userId).setAttendanceGroupId(attendanceGroupId)); + + HolidaySettingRangeDO item = new HolidaySettingRangeDO(); + item.setType(3); + item.setObjectId(userId); + items.add(item); } groupUserMapper.insertBatch(list); + // -- 新添加到考勤组的 需要同步更新员工假期余额 + // -- 获取当前用户所在的考勤组 - 再根据考勤组 查询对应的加班规则 + List holidaySettingIds = holidaySettingRangeService.getHolidaySettingIdsByGroupId(attendanceGroupId); + + if (CollUtil.isNotEmpty(holidaySettingIds)) { + List holidaySettings = holidaySettingService.getHolidaySettingByIds(holidaySettingIds); + Map holidaySettingMap = holidaySettings.stream().collect(Collectors.toMap(HolidaySettingDO::getId, holidaySettingDO -> holidaySettingDO)); + for (HolidaySettingDO holidaySetting : holidaySettings) { + holidayUserRecordService.grant(holidaySetting, + items, holidaySettingMap.get(holidaySetting.getId()).getHolidayBalanceSettingDO(), ListUtil.empty(), true); + } + } } vo.setAttendanceGroupId(attendanceGroupId); vo.setDelUserIds(delIds); @@ -151,4 +185,4 @@ public class AttendanceGroupUserServiceImpl implements AttendanceGroupUserServic .stream().map(AttendanceGroupUserDO::getUserId).collect(Collectors.toList()); } -} \ No newline at end of file +} diff --git a/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/service/holiday/holidaysetting/HolidaySettingService.java b/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/service/holiday/holidaysetting/HolidaySettingService.java index 0c341fbb..c948c6b5 100644 --- a/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/service/holiday/holidaysetting/HolidaySettingService.java +++ b/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/service/holiday/holidaysetting/HolidaySettingService.java @@ -102,4 +102,12 @@ public interface HolidaySettingService { * @return */ List getLimitBalanceHolidayList(); + + /** + * 根据ids获取 + * + * @param holidaySettingIds + * @return + */ + List getHolidaySettingByIds(List holidaySettingIds); } diff --git a/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/service/holiday/holidaysetting/HolidaySettingServiceImpl.java b/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/service/holiday/holidaysetting/HolidaySettingServiceImpl.java index f828ebca..d981c507 100644 --- a/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/service/holiday/holidaysetting/HolidaySettingServiceImpl.java +++ b/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/service/holiday/holidaysetting/HolidaySettingServiceImpl.java @@ -289,6 +289,16 @@ public class HolidaySettingServiceImpl implements HolidaySettingService { return holidaySettingMapper.getLimitBalanceHolidayList(); } + @Override + public List getHolidaySettingByIds(List holidaySettingIds) { + List holidaySettingDOS = holidaySettingMapper.selectBatchIds(holidaySettingIds); + Map map = holidayBalanceSettingService.selectBySettingIds(holidaySettingIds); + for (HolidaySettingDO holidaySettingDO : holidaySettingDOS) { + holidaySettingDO.setHolidayBalanceSettingDO(map.get(holidaySettingDO.getId())); + } + return holidaySettingDOS; + } + /** * 编辑假期设置 diff --git a/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/service/holiday/holidaysettingrange/HolidaySettingRangeService.java b/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/service/holiday/holidaysettingrange/HolidaySettingRangeService.java index 134eb400..7b6bace4 100644 --- a/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/service/holiday/holidaysettingrange/HolidaySettingRangeService.java +++ b/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/service/holiday/holidaysettingrange/HolidaySettingRangeService.java @@ -84,4 +84,20 @@ public interface HolidaySettingRangeService { * @return */ List getListByHolidaySettingIds(List holidaySettingIds); + + /** + * 根据考勤组id获取当前考勤组所在的假期 + * + * @param groupId + * @return + */ + List getByGroupId(Long groupId); + + /** + * 根据考勤组id 获取和考勤组关联的假期ids + * + * @param groupId + * @return + */ + List getHolidaySettingIdsByGroupId(Long groupId); } diff --git a/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/service/holiday/holidaysettingrange/HolidaySettingRangeServiceImpl.java b/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/service/holiday/holidaysettingrange/HolidaySettingRangeServiceImpl.java index 7277b5bb..81174ec2 100644 --- a/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/service/holiday/holidaysettingrange/HolidaySettingRangeServiceImpl.java +++ b/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/service/holiday/holidaysettingrange/HolidaySettingRangeServiceImpl.java @@ -101,11 +101,23 @@ public class HolidaySettingRangeServiceImpl implements HolidaySettingRangeServic @Override public List getListByHolidaySettingIds(List holidaySettingIds) { - if (CollUtil.isEmpty(holidaySettingIds)){ + if (CollUtil.isEmpty(holidaySettingIds)) { return Collections.emptyList(); } return holidaySettingRangeMapper.selectList(new LambdaQueryWrapper() .in(HolidaySettingRangeDO::getHolidaySettingId, holidaySettingIds)); } + @Override + public List getByGroupId(Long groupId) { + return holidaySettingRangeMapper.selectList(new LambdaQueryWrapper() + .eq(HolidaySettingRangeDO::getType, 1) + .eq(HolidaySettingRangeDO::getObjectId, groupId)); + } + + @Override + public List getHolidaySettingIdsByGroupId(Long groupId) { + return this.getByGroupId(groupId).stream().map(HolidaySettingRangeDO::getHolidaySettingId).collect(Collectors.toList()); + } + } diff --git a/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/service/holiday/holidayuserrecord/HolidayUserRecordService.java b/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/service/holiday/holidayuserrecord/HolidayUserRecordService.java index fdfc1220..795c580b 100644 --- a/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/service/holiday/holidayuserrecord/HolidayUserRecordService.java +++ b/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/service/holiday/holidayuserrecord/HolidayUserRecordService.java @@ -78,7 +78,7 @@ public interface HolidayUserRecordService { * @param holidayBalanceSettingDO * @param holidayWorkingAgeDOS */ - void grant(HolidaySettingDO holidaySetting, List holidaySettingRangeDOS, HolidayBalanceSettingDO holidayBalanceSettingDO, List holidayWorkingAgeDOS); + void grant(HolidaySettingDO holidaySetting, List holidaySettingRangeDOS, HolidayBalanceSettingDO holidayBalanceSettingDO, List holidayWorkingAgeDOS, Boolean recordZero); /** * 清空假期余额 diff --git a/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/service/holiday/holidayuserrecord/HolidayUserRecordServiceImpl.java b/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/service/holiday/holidayuserrecord/HolidayUserRecordServiceImpl.java index 25ebc8ad..abff318e 100644 --- a/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/service/holiday/holidayuserrecord/HolidayUserRecordServiceImpl.java +++ b/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/service/holiday/holidayuserrecord/HolidayUserRecordServiceImpl.java @@ -94,7 +94,8 @@ public class HolidayUserRecordServiceImpl implements HolidayUserRecordService { List newHolidayUserRecordDOList = new ArrayList<>(); List newHolidayUserDOList = new ArrayList<>(); String remark = myself.getNickname() + " 为" + targetUser.getNickname() + (createReqVO.getDirection() == 0 ? "增加" : "减去"); - this.calculateUserHolidays(userQuotaMap, userId, holidayUserDOMap, holidaySetting, holidayBalanceSettingDO, newHolidayUserRecordDOList, newHolidayUserDOList, now, remark, createReqVO.getDirection(), createReqVO.getReason()); + this.calculateUserHolidays(userQuotaMap, userId, holidayUserDOMap, holidaySetting, holidayBalanceSettingDO, newHolidayUserRecordDOList, + newHolidayUserDOList, now, remark, createReqVO.getDirection(), createReqVO.getReason(), false); if (CollUtil.isNotEmpty(newHolidayUserRecordDOList)) { holidayUserRecordMapper.insertBatch(newHolidayUserRecordDOList); @@ -184,7 +185,8 @@ public class HolidayUserRecordServiceImpl implements HolidayUserRecordService { List newHolidayUserRecordDOList = new ArrayList<>(); List newHolidayUserDOList = new ArrayList<>(); String remark = targetUser.getNickname() + "使用了 "; - this.calculateUserHolidays(userQuotaMap, dto.getUserId(), holidayUserDOMap, holidaySetting, holidayBalanceSettingDO, newHolidayUserRecordDOList, newHolidayUserDOList, now, remark, dto.getDirection(), dto.getReason()); + this.calculateUserHolidays(userQuotaMap, dto.getUserId(), holidayUserDOMap, holidaySetting, holidayBalanceSettingDO, + newHolidayUserRecordDOList, newHolidayUserDOList, now, remark, dto.getDirection(), dto.getReason(), false); List editList = new ArrayList<>(); if (dto.getDirection() == 1) { @@ -292,7 +294,8 @@ public class HolidayUserRecordServiceImpl implements HolidayUserRecordService { @Override - public void grant(HolidaySettingDO holidaySetting, List holidaySettingRangeDOS, HolidayBalanceSettingDO holidayBalanceSettingDO, List holidayWorkingAgeDOS) { + public void grant(HolidaySettingDO holidaySetting, List holidaySettingRangeDOS, + HolidayBalanceSettingDO holidayBalanceSettingDO, List holidayWorkingAgeDOS, Boolean recordZero) { // -- 先查询出所有用户 List users = this.getUsersByRange(holidaySetting, holidaySettingRangeDOS); // -- 计算获取每个人的假期额度 @@ -334,7 +337,8 @@ public class HolidayUserRecordServiceImpl implements HolidayUserRecordService { } for (Long userId : userIds) { String remark = "系统按照规则自动 增加"; - this.calculateUserHolidays(userQuotaMap, userId, holidayUserDOMap, holidaySetting, holidayBalanceSettingDO, newHolidayUserRecordDOList, newHolidayUserDOList, now, remark, 0, null); + this.calculateUserHolidays(userQuotaMap, userId, holidayUserDOMap, holidaySetting, holidayBalanceSettingDO, + newHolidayUserRecordDOList, newHolidayUserDOList, now, remark, 0, null, recordZero); } // TODO: 2024/10/23 这里可能还会慢 if (CollUtil.isNotEmpty(newHolidayUserRecordDOList)) { @@ -427,10 +431,10 @@ public class HolidayUserRecordServiceImpl implements HolidayUserRecordService { private void calculateUserHolidays(Map userQuotaMap, Long userId, Map holidayUserDOMap, HolidaySettingDO holidaySetting, HolidayBalanceSettingDO holidayBalanceSettingDO, List newHolidayUserRecordDOList, List newHolidayUserDOList, - LocalDateTime now, String remark, Integer direction, String reason) { + LocalDateTime now, String remark, Integer direction, String reason, Boolean recordZero) { BigDecimal quota = userQuotaMap.get(userId); - // -- 如果是0的话就不记录了 - if (quota == null || BigDecimal.ZERO.compareTo(quota) == 0) { + // -- 如果是0的话就不记录了 -- 如果不记录0 并且是0 直接return + if (quota == null || (BigDecimal.ZERO.compareTo(quota) == 0 && !recordZero)) { return; } HolidayUserDO holidayUserDO = holidayUserDOMap.get(userId); @@ -783,7 +787,8 @@ public class HolidayUserRecordServiceImpl implements HolidayUserRecordService { List newHolidayUserRecordDOList = new ArrayList<>(); List newHolidayUserDOList = new ArrayList<>(); String remark = "加班" + (dto.getDirection() == 0 ? "增加" : "减去"); - this.calculateUserHolidays(userQuotaMap, userId, holidayUserDOMap, holidaySetting, holidayBalanceSettingDO, newHolidayUserRecordDOList, newHolidayUserDOList, now, remark, dto.getDirection(), dto.getReason()); + this.calculateUserHolidays(userQuotaMap, userId, holidayUserDOMap, holidaySetting, holidayBalanceSettingDO, + newHolidayUserRecordDOList, newHolidayUserDOList, now, remark, dto.getDirection(), dto.getReason(), false); if (CollUtil.isNotEmpty(newHolidayUserRecordDOList)) { holidayUserRecordMapper.insertBatch(newHolidayUserRecordDOList); }