From 867a45f1547dbb2c6552868d1e00aca4454ba90b Mon Sep 17 00:00:00 2001 From: wangff Date: Tue, 4 Nov 2025 13:22:49 +0800 Subject: [PATCH 01/10] =?UTF-8?q?feat:=E5=AD=97=E5=85=B8=E8=A1=A8?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../com/cool/store/common/InsertGroup.java | 12 + .../com/cool/store/common/UpdateGroup.java | 12 + .../cool/store/dao/dict/SysDictColumnDAO.java | 150 ++++++++++ .../cool/store/dao/dict/SysDictGroupDAO.java | 41 +++ .../cool/store/dao/dict/SysDictTableDAO.java | 129 +++++++++ .../mapper/dict/SysDictColumnMapper.java | 104 +++++++ .../store/mapper/dict/SysDictGroupMapper.java | 50 ++++ .../store/mapper/dict/SysDictTableMapper.java | 109 ++++++++ .../resources/dict/SysDictColumnMapper.xml | 259 ++++++++++++++++++ .../resources/dict/SysDictGroupMapper.xml | 122 +++++++++ .../resources/dict/SysDictTableMapper.xml | 237 ++++++++++++++++ .../store/entity/dict/SysDictColumnDO.java | 57 ++++ .../store/entity/dict/SysDictGroupDO.java | 45 +++ .../store/entity/dict/SysDictTableDO.java | 54 ++++ .../request/dict/DictColumnQueryRequest.java | 41 +++ .../request/dict/DictGroupQueryRequest.java | 25 ++ .../request/dict/DictTableQueryRequest.java | 31 +++ .../store/vo/dict/DictColumnSimpleVO.java | 24 ++ .../com/cool/store/vo/dict/DictColumnVO.java | 56 ++++ .../com/cool/store/vo/dict/DictGroupVO.java | 29 ++ .../com/cool/store/vo/dict/DictTableVO.java | 36 +++ .../store/service/dict/DictColumnService.java | 48 ++++ .../store/service/dict/DictGroupService.java | 31 +++ .../service/dict/DictTableInfoService.java | 31 +++ .../dict/impl/DictColumnServiceImpl.java | 83 ++++++ .../dict/impl/DictGroupServiceImpl.java | 61 +++++ .../dict/impl/DictTableInfoServiceImpl.java | 41 +++ .../webb/DictManagerController.java | 88 ++++++ 28 files changed, 2006 insertions(+) create mode 100644 coolstore-partner-common/src/main/java/com/cool/store/common/InsertGroup.java create mode 100644 coolstore-partner-common/src/main/java/com/cool/store/common/UpdateGroup.java create mode 100644 coolstore-partner-dao/src/main/java/com/cool/store/dao/dict/SysDictColumnDAO.java create mode 100644 coolstore-partner-dao/src/main/java/com/cool/store/dao/dict/SysDictGroupDAO.java create mode 100644 coolstore-partner-dao/src/main/java/com/cool/store/dao/dict/SysDictTableDAO.java create mode 100644 coolstore-partner-dao/src/main/java/com/cool/store/mapper/dict/SysDictColumnMapper.java create mode 100644 coolstore-partner-dao/src/main/java/com/cool/store/mapper/dict/SysDictGroupMapper.java create mode 100644 coolstore-partner-dao/src/main/java/com/cool/store/mapper/dict/SysDictTableMapper.java create mode 100644 coolstore-partner-dao/src/main/resources/dict/SysDictColumnMapper.xml create mode 100644 coolstore-partner-dao/src/main/resources/dict/SysDictGroupMapper.xml create mode 100644 coolstore-partner-dao/src/main/resources/dict/SysDictTableMapper.xml create mode 100644 coolstore-partner-model/src/main/java/com/cool/store/entity/dict/SysDictColumnDO.java create mode 100644 coolstore-partner-model/src/main/java/com/cool/store/entity/dict/SysDictGroupDO.java create mode 100644 coolstore-partner-model/src/main/java/com/cool/store/entity/dict/SysDictTableDO.java create mode 100644 coolstore-partner-model/src/main/java/com/cool/store/request/dict/DictColumnQueryRequest.java create mode 100644 coolstore-partner-model/src/main/java/com/cool/store/request/dict/DictGroupQueryRequest.java create mode 100644 coolstore-partner-model/src/main/java/com/cool/store/request/dict/DictTableQueryRequest.java create mode 100644 coolstore-partner-model/src/main/java/com/cool/store/vo/dict/DictColumnSimpleVO.java create mode 100644 coolstore-partner-model/src/main/java/com/cool/store/vo/dict/DictColumnVO.java create mode 100644 coolstore-partner-model/src/main/java/com/cool/store/vo/dict/DictGroupVO.java create mode 100644 coolstore-partner-model/src/main/java/com/cool/store/vo/dict/DictTableVO.java create mode 100644 coolstore-partner-service/src/main/java/com/cool/store/service/dict/DictColumnService.java create mode 100644 coolstore-partner-service/src/main/java/com/cool/store/service/dict/DictGroupService.java create mode 100644 coolstore-partner-service/src/main/java/com/cool/store/service/dict/DictTableInfoService.java create mode 100644 coolstore-partner-service/src/main/java/com/cool/store/service/dict/impl/DictColumnServiceImpl.java create mode 100644 coolstore-partner-service/src/main/java/com/cool/store/service/dict/impl/DictGroupServiceImpl.java create mode 100644 coolstore-partner-service/src/main/java/com/cool/store/service/dict/impl/DictTableInfoServiceImpl.java create mode 100644 coolstore-partner-web/src/main/java/com/cool/store/controller/webb/DictManagerController.java diff --git a/coolstore-partner-common/src/main/java/com/cool/store/common/InsertGroup.java b/coolstore-partner-common/src/main/java/com/cool/store/common/InsertGroup.java new file mode 100644 index 000000000..e97b4e698 --- /dev/null +++ b/coolstore-partner-common/src/main/java/com/cool/store/common/InsertGroup.java @@ -0,0 +1,12 @@ +package com.cool.store.common; + +/** + *

+ * 新增分组 + *

+ * + * @author wangff + * @since 2025/11/4 + */ +public interface InsertGroup { +} diff --git a/coolstore-partner-common/src/main/java/com/cool/store/common/UpdateGroup.java b/coolstore-partner-common/src/main/java/com/cool/store/common/UpdateGroup.java new file mode 100644 index 000000000..ead1d3ded --- /dev/null +++ b/coolstore-partner-common/src/main/java/com/cool/store/common/UpdateGroup.java @@ -0,0 +1,12 @@ +package com.cool.store.common; + +/** + *

+ * 更新分组 + *

+ * + * @author wangff + * @since 2025/11/4 + */ +public interface UpdateGroup { +} diff --git a/coolstore-partner-dao/src/main/java/com/cool/store/dao/dict/SysDictColumnDAO.java b/coolstore-partner-dao/src/main/java/com/cool/store/dao/dict/SysDictColumnDAO.java new file mode 100644 index 000000000..ab991bda6 --- /dev/null +++ b/coolstore-partner-dao/src/main/java/com/cool/store/dao/dict/SysDictColumnDAO.java @@ -0,0 +1,150 @@ +package com.cool.store.dao.dict; + +import cn.hutool.core.collection.CollStreamUtil; +import cn.hutool.core.collection.CollectionUtil; +import com.alibaba.excel.util.CollectionUtils; +import com.cool.store.entity.dict.SysDictColumnDO; +import com.cool.store.entity.dict.SysDictTableDO; +import com.cool.store.mapper.dict.SysDictColumnMapper; +import com.cool.store.request.dict.DictColumnQueryRequest; +import com.cool.store.utils.BeanUtil; +import com.cool.store.vo.dict.DictColumnSimpleVO; +import lombok.RequiredArgsConstructor; +import org.apache.commons.collections4.MapUtils; +import org.springframework.stereotype.Repository; + +import java.util.*; + +/** + *

+ * 字典项DAO + *

+ * + * @author wangff + * @since 2025/9/26 + */ +@Repository +@RequiredArgsConstructor +public class SysDictColumnDAO { + private final SysDictColumnMapper sysDictColumnMapper; + private final SysDictTableDAO sysDictTableDAO; + + + public List getList(DictColumnQueryRequest dto) { + return sysDictColumnMapper.selectList(dto); + } + + /** + * 根据id查询 + * + * @param id id + * @return 字典项信息表 + */ + public SysDictColumnDO getById(Long id) { + return sysDictColumnMapper.selectById(id); + } + + /** + * 根据字典表id查询字典项数量 + * + * @param tableIds 字典表id列表 + * @return <字典表id, 字典项数量> + */ + public Map getColumnNumMapByTableIds(List tableIds) { + if (CollectionUtil.isEmpty(tableIds)) { + return Collections.emptyMap(); + } + List> mapList = sysDictColumnMapper.selectColumnNumByTableIds(tableIds); + return CollStreamUtil.toMap(mapList, v -> MapUtils.getLong(v, "dict_table_id"), v -> MapUtils.getInteger(v, "num")); + } + + /** + * 过滤存在启用字典项的字典分组id + * @param groupIds 字典分组id列表 + * @return 字典分组id列表 + */ + public Set filterEnableColumnByGroupIds(List groupIds) { + if (CollectionUtil.isEmpty(groupIds)) { + return Collections.emptySet(); + } + List> list = sysDictColumnMapper.filterEnableColumnByGroupIds(groupIds); + return CollStreamUtil.toSet(list, v -> MapUtils.getLong(v, "dict_group_id")); + } + + /** + * 过滤存在启用字典项的字典表id + * @param tableIds 字典表id列表 + * @return 字典表id列表 + */ + public Set filterEnableColumnByTableIds(List tableIds) { + if (CollectionUtil.isEmpty(tableIds)) { + return Collections.emptySet(); + } + List> list = sysDictColumnMapper.filterEnableColumnByTableIds(tableIds); + return CollStreamUtil.toSet(list, v -> MapUtils.getLong(v, "dict_table_id")); + } + + /** + * 根据分组id删除 + * @param groupIds 分组id列表 + */ + public void deleteByGroupIds(List groupIds) { + if (CollectionUtil.isEmpty(groupIds)) { + return; + } + sysDictColumnMapper.deleteByGroupIds(groupIds); + } + + /** + * 根据字典表id删除 + * @param tableIds 字典表id列表 + */ + public void deleteByTableIds(List tableIds) { + if (CollectionUtil.isEmpty(tableIds)) { + return; + } + sysDictColumnMapper.deleteByTableIds(tableIds); + } + + /** + * 根据字典列编码查询已启用字典项信息 + * @param columnCode 字典列编码 + * @return 字典项信息 + */ + public SysDictColumnDO getOpenColumnByCode(String columnCode) { + return sysDictColumnMapper.selectOpenColumnByCode(columnCode); + } + + /** + * 根据字典列编码查询已启用字典名 + * @param columnCode 字典列编码 + * @return 字典名 + */ + public String getNameByCode(String columnCode) { + SysDictColumnDO sysDictColumnDO = sysDictColumnMapper.selectOpenColumnByCode(columnCode); + if (Objects.nonNull(sysDictColumnDO)) { + return sysDictColumnDO.getColumnName(); + } + return ""; + } + + /** + * 根据字典表编码查询启用状态的字典项 + * @param tableCodes 字典表编码列表 + * @return 字典项列表 + */ + public List getOpenColumnListByTableCode(List tableCodes) { + List tableList = sysDictTableDAO.getOpenTableListByTableCodes(tableCodes); + if (CollectionUtils.isEmpty(tableList)) { + return Collections.emptyList(); + } + List tableIds = CollStreamUtil.toList(tableList, SysDictTableDO::getId); + List columnList = sysDictColumnMapper.selectOpenColumnListByTableIds(tableIds); + Map tableCodeMap = CollStreamUtil.toMap(tableList, SysDictTableDO::getId, SysDictTableDO::getTableCode); + return CollStreamUtil.toList(columnList, v -> { + DictColumnSimpleVO vo = BeanUtil.toBean(v, DictColumnSimpleVO.class); + vo.setTableCode(tableCodeMap.get(v.getDictTableId())); + return vo; + }); + } +} diff --git a/coolstore-partner-dao/src/main/java/com/cool/store/dao/dict/SysDictGroupDAO.java b/coolstore-partner-dao/src/main/java/com/cool/store/dao/dict/SysDictGroupDAO.java new file mode 100644 index 000000000..9592aa409 --- /dev/null +++ b/coolstore-partner-dao/src/main/java/com/cool/store/dao/dict/SysDictGroupDAO.java @@ -0,0 +1,41 @@ +package com.cool.store.dao.dict; + +import com.cool.store.entity.dict.SysDictGroupDO; +import com.cool.store.mapper.dict.SysDictGroupMapper; +import com.cool.store.request.dict.DictGroupQueryRequest; +import lombok.RequiredArgsConstructor; +import org.springframework.stereotype.Repository; + +import java.util.List; + +/** + *

+ * 字典分组DAO + *

+ * + * @author wangff + * @since 2025/9/26 + */ +@Repository +@RequiredArgsConstructor +public class SysDictGroupDAO { + private final SysDictGroupMapper sysDictGroupMapper; + + /** + * 根据id查询 + * @param id id + * @return 字典分组表 + */ + public SysDictGroupDO getById(Long id) { + return sysDictGroupMapper.selectById(id); + } + + /** + * 查询列表 + * @param dto 字典分组查询DTO + * @return 字典分组表列表 + */ + public List getList(DictGroupQueryRequest dto) { + return sysDictGroupMapper.selectList(dto); + } +} diff --git a/coolstore-partner-dao/src/main/java/com/cool/store/dao/dict/SysDictTableDAO.java b/coolstore-partner-dao/src/main/java/com/cool/store/dao/dict/SysDictTableDAO.java new file mode 100644 index 000000000..64b25346b --- /dev/null +++ b/coolstore-partner-dao/src/main/java/com/cool/store/dao/dict/SysDictTableDAO.java @@ -0,0 +1,129 @@ +package com.cool.store.dao.dict; + +import cn.hutool.core.collection.CollStreamUtil; +import cn.hutool.core.collection.CollectionUtil; +import com.alibaba.excel.util.CollectionUtils; +import com.cool.store.entity.dict.SysDictTableDO; +import com.cool.store.mapper.dict.SysDictTableMapper; +import com.cool.store.request.dict.DictTableQueryRequest; +import lombok.RequiredArgsConstructor; +import org.apache.commons.collections4.MapUtils; +import org.springframework.stereotype.Repository; + +import java.util.*; + +/** + *

+ * 字典表DAO + *

+ * + * @author wangff + * @since 2025/9/25 + */ +@Repository +@RequiredArgsConstructor +public class SysDictTableDAO { + + private final SysDictTableMapper dictTableMapper; + + + /** + * 列表查询 + * @param dto 字典表查询DTO + * @return 字典表信息表列表 + */ + public List getList(DictTableQueryRequest dto) { + return dictTableMapper.selectList(dto); + } + + /** + * 根据id查询 + * @param id id + * @return 字典表信息表 + */ + public SysDictTableDO getById(Long id) { + return dictTableMapper.selectById(id); + } + + /** + * 根据id查询 + * @param ids id列表 + * @return 字典表列表 + */ + public List getByIds(List ids) { + if (CollectionUtils.isEmpty(ids)) { + return Collections.emptyList(); + } + return dictTableMapper.selectByIds(ids); + } + + /** + * 根据字典表id查询所属字典分组id + * @param dictTableId 字典表id + * @return 字典分组id + */ + public Long getGroupIdByTableId(Long dictTableId) { + SysDictTableDO tableInfoDO = getById(dictTableId); + if (Objects.nonNull(tableInfoDO)) { + return tableInfoDO.getDictGroupId(); + } + return null; + } + + /** + * 根据分组id查询字典表 + * @param groupIds 字典分组id列表 + * @return 字典表VO对象列表 + */ + public List getListByGroupIds(List groupIds, Integer openStatus) { + if (CollectionUtil.isEmpty(groupIds)) { + return Collections.emptyList(); + } + return dictTableMapper.selectByGroupIds(groupIds, openStatus); + } + + /** + * 过滤存在启用字典表的字典分组id + * @param groupIds 字典分组id + * @return 字典分组id列表 + */ + public Set filterEnableTableByGroupIds(List groupIds) { + if (CollectionUtil.isEmpty(groupIds)) { + return Collections.emptySet(); + } + List> maps = dictTableMapper.filterEnableTableByGroupIds(groupIds); + return CollStreamUtil.toSet(maps, v -> MapUtils.getLong(v, "dict_group_id")); + } + + /** + * 根据分组id删除 + * @param groupIds 分组id列表 + */ + public void deleteByGroupIds(List groupIds) { + if (CollectionUtil.isEmpty(groupIds)) { + return; + } + dictTableMapper.deleteByGroupIds(groupIds); + } + + /** + * 根据字典表编码查询 + * @param tableCode 字典表编码 + * @return 字典表 + */ + public SysDictTableDO getByTableCode(String tableCode) { + return dictTableMapper.selectByTableCode(tableCode); + } + + /** + * 根据字典表编码查询启用状态的字典表 + * @param tableCodes 字典表编码 + * @return 字典表列表 + */ + public List getOpenTableListByTableCodes(List tableCodes) { + if (CollectionUtils.isEmpty(tableCodes)) { + return Collections.emptyList(); + } + return dictTableMapper.selectOpenTableListByTableCodes(tableCodes); + } +} diff --git a/coolstore-partner-dao/src/main/java/com/cool/store/mapper/dict/SysDictColumnMapper.java b/coolstore-partner-dao/src/main/java/com/cool/store/mapper/dict/SysDictColumnMapper.java new file mode 100644 index 000000000..8f4fda280 --- /dev/null +++ b/coolstore-partner-dao/src/main/java/com/cool/store/mapper/dict/SysDictColumnMapper.java @@ -0,0 +1,104 @@ +package com.cool.store.mapper.dict; + +import com.cool.store.entity.dict.SysDictColumnDO; +import com.cool.store.request.dict.DictColumnQueryRequest; +import org.apache.ibatis.annotations.Param; + +import java.util.List; +import java.util.Map; + +/** + * @author zhangchenbiao + * @date 2025-09-25 06:34 + */ +public interface SysDictColumnMapper { + /** + * + * 默认插入方法,只会给有值的字段赋值 + * 会对传进来的字段做判空处理,如果字段为空,则使用数据库默认字段或者null + * dateTime:2025-09-25 06:34 + */ + int insertSelective(@Param("record") SysDictColumnDO record); + + /** + * + * 默认更新方法,根据主键更新,不会把null值更新到数据库,避免覆盖之前有值的 + * dateTime:2025-09-25 06:34 + */ + int updateByPrimaryKeySelective(@Param("record") SysDictColumnDO record); + + /** + * 查询已存在的字典项 + * @param columnCode 字典项编码 + * @return com.coolcollege.intelligent.model.dict.SysDictColumnDO + */ + SysDictColumnDO selectExistColumn(@Param("id") Long id, + @Param("columnCode") String columnCode); + + /** + * 根据id批量删除 + * @param ids id列表 + * @return int + */ + int deleteByIds(@Param("ids") List ids); + + /** + * 列表查询 + * @param dto 查询DTO + * @return 字典项列表 + */ + List selectList(@Param("dto") DictColumnQueryRequest dto); + + /** + * 根据id查询 + * @param id id + * @return 字典项 + */ + SysDictColumnDO selectById(@Param("id") Long id); + + /** + * 根据字典表id查询字典项数量 + * @param tableIds 字典表id列表 + */ + List> selectColumnNumByTableIds(@Param("tableIds") List tableIds); + + /** + * 过滤存在已启用字典项的字典表分组id + * @param groupIds 分组id列表 + */ + List> filterEnableColumnByGroupIds(@Param("groupIds") List groupIds); + + /** + * 过滤存在已启用字典项的字典表id + * @param tableIds 字典表id列表 + */ + List> filterEnableColumnByTableIds(@Param("tableIds") List tableIds); + + /** + * 根据分组id删除字典项 + * @param groupIds 分组id列表 + * @return int + */ + int deleteByGroupIds(@Param("groupIds") List groupIds); + + /** + * 根据字典表id删除字典项 + * @param tableIds 字典表id列表 + * @return int + */ + int deleteByTableIds(@Param("tableIds") List tableIds); + + /** + * 根据字典项编码查询字典项 + * @param columnCode 字典项编码 + * @return 字典项 + */ + SysDictColumnDO selectOpenColumnByCode(@Param("columnCode") String columnCode); + + /** + * 根据字典表id查询 + * @param tableIds 字典表id列表 + * @return 字典项列表 + */ + List selectOpenColumnListByTableIds(@Param("tableIds") List tableIds); +} \ No newline at end of file diff --git a/coolstore-partner-dao/src/main/java/com/cool/store/mapper/dict/SysDictGroupMapper.java b/coolstore-partner-dao/src/main/java/com/cool/store/mapper/dict/SysDictGroupMapper.java new file mode 100644 index 000000000..1febbce80 --- /dev/null +++ b/coolstore-partner-dao/src/main/java/com/cool/store/mapper/dict/SysDictGroupMapper.java @@ -0,0 +1,50 @@ +package com.cool.store.mapper.dict; + +import com.cool.store.entity.dict.SysDictGroupDO; +import com.cool.store.request.dict.DictGroupQueryRequest; +import org.apache.ibatis.annotations.Param; + +import java.util.List; + +/** + * @author zhangchenbiao + * @date 2025-09-25 06:35 + */ +public interface SysDictGroupMapper { + /** + * 默认插入方法,只会给有值的字段赋值 + * 会对传进来的字段做判空处理,如果字段为空,则使用数据库默认字段或者null + * dateTime:2025-09-25 06:35 + */ + int insertSelective(@Param("record") SysDictGroupDO record); + + /** + * 默认更新方法,根据主键更新,不会把null值更新到数据库,避免覆盖之前有值的 + * dateTime:2025-09-25 06:35 + */ + int updateByPrimaryKeySelective(@Param("record") SysDictGroupDO record); + + /** + * 根据id批量删除 + * + * @param ids id列表 + * @return int + */ + int deleteByIds(@Param("ids") List ids); + + /** + * 根据id查询 + * + * @param id id + * @return 字典分组 + */ + SysDictGroupDO selectById(@Param("id") Long id); + + /** + * 列表查询 + * + * @param dto 查询DTO + * @return 字典分组列表 + */ + List selectList(@Param("dto") DictGroupQueryRequest dto); +} \ No newline at end of file diff --git a/coolstore-partner-dao/src/main/java/com/cool/store/mapper/dict/SysDictTableMapper.java b/coolstore-partner-dao/src/main/java/com/cool/store/mapper/dict/SysDictTableMapper.java new file mode 100644 index 000000000..29846bde5 --- /dev/null +++ b/coolstore-partner-dao/src/main/java/com/cool/store/mapper/dict/SysDictTableMapper.java @@ -0,0 +1,109 @@ +package com.cool.store.mapper.dict; + +import com.cool.store.entity.dict.SysDictTableDO; +import com.cool.store.request.dict.DictTableQueryRequest; +import org.apache.ibatis.annotations.Param; + +import java.util.List; +import java.util.Map; + +/** + * @author zhangchenbiao + * @date 2025-09-25 06:30 + */ +public interface SysDictTableMapper { + /** + * 默认插入方法,只会给有值的字段赋值 + * 会对传进来的字段做判空处理,如果字段为空,则使用数据库默认字段或者null + * dateTime:2025-09-25 06:30 + */ + int insertSelective(@Param("record") SysDictTableDO record, @Param("enterpriseId") String enterpriseId); + + /** + * 默认更新方法,根据主键更新,不会把null值更新到数据库,避免覆盖之前有值的 + * dateTime:2025-09-25 06:30 + */ + int updateByPrimaryKeySelective(@Param("record") SysDictTableDO record, @Param("enterpriseId") String enterpriseId); + + /** + * 查询重复的字典表 + * + * @param id id + * @param tableCode 字典表code + * @return 字典表 + */ + SysDictTableDO selectExistTable(@Param("id") Long id, + @Param("tableCode") String tableCode); + + /** + * 根据id删除 + * + * @param ids id列表 + */ + int deleteByIds(@Param("ids") List ids); + + /** + * 列表查询 + * + * @param dto 查询DTO + * @return 字典表列表 + */ + List selectList(@Param("dto") DictTableQueryRequest dto); + + /** + * 根据id查询 + * + * @param id id + * @return 字典表 + */ + SysDictTableDO selectById(@Param("id") Long id); + + /** + * 根据id查询 + * + * @param ids id列表 + * @return 字典表列表 + */ + List selectByIds(@Param("ids") List ids); + + /** + * 根据分组id查询 + * + * @param groupIds 分组id列表 + * @param openStatus 启用状态 + * @return 字典表列表 + */ + List selectByGroupIds(@Param("groupIds") List groupIds, + @Param("openStatus") Integer openStatus); + + /** + * 根据分组id查询已启用的字典表 + * + * @param groupIds 分组id列表 + */ + List> filterEnableTableByGroupIds(@Param("groupIds") List groupIds); + + /** + * 根据分组id删除 + * + * @param groupIds 分组id列表 + * @return int + */ + int deleteByGroupIds(@Param("groupIds") List groupIds); + + /** + * 根据字典表编码查询 + * + * @param tableCode 字典表编码 + * @return 字典表 + */ + SysDictTableDO selectByTableCode(@Param("tableCode") String tableCode); + + /** + * 根据字典表编码查询启用状态的字典表 + * + * @param tableCodes 字典表编码 + * @return 字典表列表 + */ + List selectOpenTableListByTableCodes(@Param("tableCodes") List tableCodes); +} \ No newline at end of file diff --git a/coolstore-partner-dao/src/main/resources/dict/SysDictColumnMapper.xml b/coolstore-partner-dao/src/main/resources/dict/SysDictColumnMapper.xml new file mode 100644 index 000000000..59975c23e --- /dev/null +++ b/coolstore-partner-dao/src/main/resources/dict/SysDictColumnMapper.xml @@ -0,0 +1,259 @@ + + + + + + + + + + + + + + + + + + + id, dict_group_id, dict_table_id, column_name, column_code, open_status, remark, + deleted, create_user_id, update_user_id, create_time, update_time + + + insert into sys_dict_column_${enterpriseId} + + + dict_group_id, + + + dict_table_id, + + + column_name, + + + column_code, + + + open_status, + + + remark, + + + deleted, + + + create_user_id, + + + update_user_id, + + + create_time, + + + update_time, + + + + + #{record.dictGroupId}, + + + #{record.dictTableId}, + + + #{record.columnName}, + + + #{record.columnCode}, + + + #{record.openStatus}, + + + #{record.remark}, + + + #{record.deleted}, + + + #{record.createUserId}, + + + #{record.updateUserId}, + + + #{record.createTime}, + + + #{record.updateTime}, + + + + + update sys_dict_column_${enterpriseId} + + + dict_group_id = #{record.dictGroupId}, + + + dict_table_id = #{record.dictTableId}, + + + column_name = #{record.columnName}, + + + column_code = #{record.columnCode}, + + + open_status = #{record.openStatus}, + + + remark = #{record.remark}, + + + deleted = #{record.deleted}, + + + create_user_id = #{record.createUserId}, + + + update_user_id = #{record.updateUserId}, + + + create_time = #{record.createTime}, + + + update_time = #{record.updateTime}, + + + where id = #{record.id} + + + + + + UPDATE sys_dict_column_${enterpriseId} + SET deleted = 1 + WHERE id IN + + #{id} + + AND deleted = 0 + + + + + + + + + + + + + + UPDATE sys_dict_column_${enterpriseId} + SET deleted = 1 + WHERE dict_group_id IN + + #{groupId} + + AND deleted = 0 + + + + UPDATE sys_dict_column_${enterpriseId} + SET deleted = 1 + WHERE dict_table_id IN + + #{tableId} + + AND deleted = 0 + + + + + + \ No newline at end of file diff --git a/coolstore-partner-dao/src/main/resources/dict/SysDictGroupMapper.xml b/coolstore-partner-dao/src/main/resources/dict/SysDictGroupMapper.xml new file mode 100644 index 000000000..c15976c42 --- /dev/null +++ b/coolstore-partner-dao/src/main/resources/dict/SysDictGroupMapper.xml @@ -0,0 +1,122 @@ + + + + + + + + + + + + + + + id, group_name, remark, deleted, create_user_id, update_user_id, create_time, update_time + + + insert into sys_dict_group_${enterpriseId} + + + group_name, + + + remark, + + + deleted, + + + create_user_id, + + + update_user_id, + + + create_time, + + + update_time, + + + + + #{record.groupName}, + + + #{record.remark}, + + + #{record.deleted}, + + + #{record.createUserId}, + + + #{record.updateUserId}, + + + #{record.createTime}, + + + #{record.updateTime}, + + + + + update sys_dict_group_${enterpriseId} + + + group_name = #{record.groupName}, + + + remark = #{record.remark}, + + + deleted = #{record.deleted}, + + + create_user_id = #{record.createUserId}, + + + update_user_id = #{record.updateUserId}, + + + create_time = #{record.createTime}, + + + update_time = #{record.updateTime}, + + + where id = #{record.id} + + + + UPDATE sys_dict_group_${enterpriseId} + SET deleted = 1 + WHERE id IN + + #{id} + + AND deleted = 0 + + + + + + \ No newline at end of file diff --git a/coolstore-partner-dao/src/main/resources/dict/SysDictTableMapper.xml b/coolstore-partner-dao/src/main/resources/dict/SysDictTableMapper.xml new file mode 100644 index 000000000..27c0cc3f8 --- /dev/null +++ b/coolstore-partner-dao/src/main/resources/dict/SysDictTableMapper.xml @@ -0,0 +1,237 @@ + + + + + + + + + + + + + + + + + + id, dict_group_id, table_name, table_code, open_status, remark, deleted, create_user_id, + update_user_id, create_time, update_time + + + insert into sys_dict_table_${enterpriseId} + + + dict_group_id, + + + table_name, + + + table_code, + + + open_status, + + + remark, + + + deleted, + + + create_user_id, + + + update_user_id, + + + create_time, + + + update_time, + + + + + #{record.dictGroupId}, + + + #{record.tableName}, + + + #{record.tableCode}, + + + #{record.openStatus}, + + + #{record.remark}, + + + #{record.deleted}, + + + #{record.createUserId}, + + + #{record.updateUserId}, + + + #{record.createTime}, + + + #{record.updateTime}, + + + + + update sys_dict_table_${enterpriseId} + + + dict_group_id = #{record.dictGroupId}, + + + table_name = #{record.tableName}, + + + table_code = #{record.tableCode}, + + + open_status = #{record.openStatus}, + + + remark = #{record.remark}, + + + deleted = #{record.deleted}, + + + create_user_id = #{record.createUserId}, + + + update_user_id = #{record.updateUserId}, + + + create_time = #{record.createTime}, + + + update_time = #{record.updateTime}, + + + where id = #{record.id} + + + + + + UPDATE sys_dict_table_${enterpriseId} + SET deleted = 1 + WHERE id IN + + #{id} + + AND deleted = 0 + + + + + + + + + + + + + + UPDATE sys_dict_table_${enterpriseId} + SET deleted = 1 + WHERE dict_group_id IN + + #{groupId} + + AND deleted = 0 + + + + + + \ No newline at end of file diff --git a/coolstore-partner-model/src/main/java/com/cool/store/entity/dict/SysDictColumnDO.java b/coolstore-partner-model/src/main/java/com/cool/store/entity/dict/SysDictColumnDO.java new file mode 100644 index 000000000..08b53d610 --- /dev/null +++ b/coolstore-partner-model/src/main/java/com/cool/store/entity/dict/SysDictColumnDO.java @@ -0,0 +1,57 @@ +package com.cool.store.entity.dict; + +import io.swagger.annotations.ApiModelProperty; +import lombok.AllArgsConstructor; +import lombok.Builder; +import lombok.Data; +import lombok.NoArgsConstructor; + +import java.io.Serializable; +import java.util.Date; + +/** + * 字典项 + * @author wangff + * @date 2025-09-25 06:34 + */ +@Data +@Builder +@NoArgsConstructor +@AllArgsConstructor +public class SysDictColumnDO implements Serializable { + @ApiModelProperty("") + private Long id; + + @ApiModelProperty("merchant_dict_group.id 字典表分组id") + private Long dictGroupId; + + @ApiModelProperty("merchant_dict_table_info.id 字典表信息表id") + private Long dictTableId; + + @ApiModelProperty("字典项名称") + private String columnName; + + @ApiModelProperty("字典项编码") + private String columnCode; + + @ApiModelProperty("启用状态 0:不启用 1:启用") + private Integer openStatus; + + @ApiModelProperty("备注") + private String remark; + + @ApiModelProperty("删除标识") + private Boolean deleted; + + @ApiModelProperty("创建人") + private String createUserId; + + @ApiModelProperty("更新人") + private String updateUserId; + + @ApiModelProperty("创建时间") + private Date createTime; + + @ApiModelProperty("更新时间") + private Date updateTime; +} \ No newline at end of file diff --git a/coolstore-partner-model/src/main/java/com/cool/store/entity/dict/SysDictGroupDO.java b/coolstore-partner-model/src/main/java/com/cool/store/entity/dict/SysDictGroupDO.java new file mode 100644 index 000000000..21d6dc46c --- /dev/null +++ b/coolstore-partner-model/src/main/java/com/cool/store/entity/dict/SysDictGroupDO.java @@ -0,0 +1,45 @@ +package com.cool.store.entity.dict; + +import io.swagger.annotations.ApiModelProperty; +import lombok.AllArgsConstructor; +import lombok.Builder; +import lombok.Data; +import lombok.NoArgsConstructor; + +import java.io.Serializable; +import java.util.Date; + +/** + * 字典分组 + * @author wangff + * @date 2025-09-25 06:35 + */ +@Data +@Builder +@NoArgsConstructor +@AllArgsConstructor +public class SysDictGroupDO implements Serializable { + @ApiModelProperty("") + private Long id; + + @ApiModelProperty("分组名称") + private String groupName; + + @ApiModelProperty("备注") + private String remark; + + @ApiModelProperty("删除标识") + private Boolean deleted; + + @ApiModelProperty("创建人") + private String createUserId; + + @ApiModelProperty("更新人") + private String updateUserId; + + @ApiModelProperty("创建时间") + private Date createTime; + + @ApiModelProperty("更新时间") + private Date updateTime; +} \ No newline at end of file diff --git a/coolstore-partner-model/src/main/java/com/cool/store/entity/dict/SysDictTableDO.java b/coolstore-partner-model/src/main/java/com/cool/store/entity/dict/SysDictTableDO.java new file mode 100644 index 000000000..7b01b1baa --- /dev/null +++ b/coolstore-partner-model/src/main/java/com/cool/store/entity/dict/SysDictTableDO.java @@ -0,0 +1,54 @@ +package com.cool.store.entity.dict; + +import io.swagger.annotations.ApiModelProperty; +import lombok.AllArgsConstructor; +import lombok.Builder; +import lombok.Data; +import lombok.NoArgsConstructor; + +import java.io.Serializable; +import java.util.Date; + +/** + * 字典表 + * @author wangff + * @date 2025-09-25 06:30 + */ +@Data +@Builder +@NoArgsConstructor +@AllArgsConstructor +public class SysDictTableDO implements Serializable { + @ApiModelProperty("") + private Long id; + + @ApiModelProperty("merchant_dict_group.id 字典表分组id") + private Long dictGroupId; + + @ApiModelProperty("字典表名称") + private String tableName; + + @ApiModelProperty("字典表编码") + private String tableCode; + + @ApiModelProperty("启用状态 0:不启用 1:启用") + private Integer openStatus; + + @ApiModelProperty("备注") + private String remark; + + @ApiModelProperty("删除标识") + private Boolean deleted; + + @ApiModelProperty("创建人") + private String createUserId; + + @ApiModelProperty("更新人") + private String updateUserId; + + @ApiModelProperty("创建时间") + private Date createTime; + + @ApiModelProperty("更新时间") + private Date updateTime; +} \ No newline at end of file diff --git a/coolstore-partner-model/src/main/java/com/cool/store/request/dict/DictColumnQueryRequest.java b/coolstore-partner-model/src/main/java/com/cool/store/request/dict/DictColumnQueryRequest.java new file mode 100644 index 000000000..34d98dd54 --- /dev/null +++ b/coolstore-partner-model/src/main/java/com/cool/store/request/dict/DictColumnQueryRequest.java @@ -0,0 +1,41 @@ +package com.cool.store.request.dict; + +import com.cool.store.common.PageBasicInfo; +import io.swagger.annotations.ApiModelProperty; +import lombok.AllArgsConstructor; +import lombok.Builder; +import lombok.Data; +import lombok.NoArgsConstructor; + +/** + *

+ * 字典项查询DTO + *

+ * + * @author wangff + * @since 2025/2/20 + */ +@Data +@AllArgsConstructor +@NoArgsConstructor +@Builder +public class DictColumnQueryRequest extends PageBasicInfo { + + @ApiModelProperty("字典表分组id") + private Long dictGroupId; + + @ApiModelProperty("字典表id") + private Long dictTableId; + + @ApiModelProperty("字典项名称") + private String columnName; + + @ApiModelProperty("字典项编码") + private String columnCode; + + @ApiModelProperty("启用状态 0:不启用 1:启用") + private Integer openStatus; + + @ApiModelProperty("备注") + private String remark; +} diff --git a/coolstore-partner-model/src/main/java/com/cool/store/request/dict/DictGroupQueryRequest.java b/coolstore-partner-model/src/main/java/com/cool/store/request/dict/DictGroupQueryRequest.java new file mode 100644 index 000000000..7b127357c --- /dev/null +++ b/coolstore-partner-model/src/main/java/com/cool/store/request/dict/DictGroupQueryRequest.java @@ -0,0 +1,25 @@ +package com.cool.store.request.dict; + +import com.cool.store.common.PageBasicInfo; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +/** + *

+ * 字典分组查询DTO + *

+ * + * @author wangff + * @since 2025/2/20 + */ +@Data +public class DictGroupQueryRequest extends PageBasicInfo { + @ApiModelProperty("字典分组名称") + private String groupName; + + @ApiModelProperty("备注") + private String remark; + + @ApiModelProperty("字典表启用状态") + private Integer dictTableOpenStatus; +} diff --git a/coolstore-partner-model/src/main/java/com/cool/store/request/dict/DictTableQueryRequest.java b/coolstore-partner-model/src/main/java/com/cool/store/request/dict/DictTableQueryRequest.java new file mode 100644 index 000000000..010c8d675 --- /dev/null +++ b/coolstore-partner-model/src/main/java/com/cool/store/request/dict/DictTableQueryRequest.java @@ -0,0 +1,31 @@ +package com.cool.store.request.dict; + +import com.cool.store.common.PageBasicInfo; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +/** + *

+ * 字典表查询DTO + *

+ * + * @author wangff + * @since 2025/2/20 + */ +@Data +public class DictTableQueryRequest extends PageBasicInfo { + @ApiModelProperty("字典分组id") + private Long dictGroupId; + + @ApiModelProperty("字典表名称") + private String tableName; + + @ApiModelProperty("字典表编码") + private String tableCode; + + @ApiModelProperty("启用状态 0:不启用 1:启用") + private Integer openStatus; + + @ApiModelProperty("备注") + private String remark; +} diff --git a/coolstore-partner-model/src/main/java/com/cool/store/vo/dict/DictColumnSimpleVO.java b/coolstore-partner-model/src/main/java/com/cool/store/vo/dict/DictColumnSimpleVO.java new file mode 100644 index 000000000..6d26fe816 --- /dev/null +++ b/coolstore-partner-model/src/main/java/com/cool/store/vo/dict/DictColumnSimpleVO.java @@ -0,0 +1,24 @@ +package com.cool.store.vo.dict; + +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +/** + *

+ * 字典项简单信息VO + *

+ * + * @author wangff + * @since 2025/9/26 + */ +@Data +public class DictColumnSimpleVO { + @ApiModelProperty("字典项名称") + private String columnName; + + @ApiModelProperty("字典项编码") + private String columnCode; + + @ApiModelProperty("字典表编码") + private String tableCode; +} diff --git a/coolstore-partner-model/src/main/java/com/cool/store/vo/dict/DictColumnVO.java b/coolstore-partner-model/src/main/java/com/cool/store/vo/dict/DictColumnVO.java new file mode 100644 index 000000000..b4ef6a9ff --- /dev/null +++ b/coolstore-partner-model/src/main/java/com/cool/store/vo/dict/DictColumnVO.java @@ -0,0 +1,56 @@ +package com.cool.store.vo.dict; + +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +import java.util.Date; + +/** + *

+ * 字典项VO + *

+ * + * @author wangff + * @since 2025/2/20 + */ +@Data +public class DictColumnVO { + @ApiModelProperty("id") + private Long id; + + @ApiModelProperty("字典表分组id") + private Long dictGroupId; + + @ApiModelProperty("字典表id") + private Long dictTableId; + + @ApiModelProperty("字典项名称") + private String columnName; + + @ApiModelProperty("字典项编码") + private String columnCode; + + @ApiModelProperty("启用状态 0:不启用 1:启用") + private Integer openStatus; + + @ApiModelProperty("备注") + private String remark; + + @ApiModelProperty("创建人") + private String createUserId; + + @ApiModelProperty("创建人姓名") + private String createUserName; + + @ApiModelProperty("更新人") + private String updateUserId; + + @ApiModelProperty("更新人姓名") + private String updateUserName; + + @ApiModelProperty("创建时间") + private Date createTime; + + @ApiModelProperty("更新时间") + private Date updateTime; +} diff --git a/coolstore-partner-model/src/main/java/com/cool/store/vo/dict/DictGroupVO.java b/coolstore-partner-model/src/main/java/com/cool/store/vo/dict/DictGroupVO.java new file mode 100644 index 000000000..f614f2176 --- /dev/null +++ b/coolstore-partner-model/src/main/java/com/cool/store/vo/dict/DictGroupVO.java @@ -0,0 +1,29 @@ +package com.cool.store.vo.dict; + +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +import java.util.List; + +/** + *

+ * 字典分组VO + *

+ * + * @author wangff + * @since 2025/2/19 + */ +@Data +public class DictGroupVO { + @ApiModelProperty("id") + private Long id; + + @ApiModelProperty("分组名称") + private String groupName; + + @ApiModelProperty("备注") + private String remark; + + @ApiModelProperty("字典表列表") + private List tableList; +} diff --git a/coolstore-partner-model/src/main/java/com/cool/store/vo/dict/DictTableVO.java b/coolstore-partner-model/src/main/java/com/cool/store/vo/dict/DictTableVO.java new file mode 100644 index 000000000..ea72f0df2 --- /dev/null +++ b/coolstore-partner-model/src/main/java/com/cool/store/vo/dict/DictTableVO.java @@ -0,0 +1,36 @@ +package com.cool.store.vo.dict; + +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +/** + *

+ * 字典表信息表VO + *

+ * + * @author wangff + * @since 2025/2/19 + */ +@Data +public class DictTableVO { + @ApiModelProperty("id") + private Long id; + + @ApiModelProperty("字典表分组id") + private Long dictGroupId; + + @ApiModelProperty("字典表名称") + private String tableName; + + @ApiModelProperty("字典表编码") + private String tableCode; + + @ApiModelProperty("启用状态 0:不启用 1:启用") + private Integer openStatus; + + @ApiModelProperty("备注") + private String remark; + + @ApiModelProperty("字典数量") + private Integer columnNum; +} diff --git a/coolstore-partner-service/src/main/java/com/cool/store/service/dict/DictColumnService.java b/coolstore-partner-service/src/main/java/com/cool/store/service/dict/DictColumnService.java new file mode 100644 index 000000000..5c086d87f --- /dev/null +++ b/coolstore-partner-service/src/main/java/com/cool/store/service/dict/DictColumnService.java @@ -0,0 +1,48 @@ +package com.cool.store.service.dict; + +import com.cool.store.request.dict.DictColumnQueryRequest; +import com.cool.store.vo.dict.DictColumnSimpleVO; +import com.cool.store.vo.dict.DictColumnVO; +import com.github.pagehelper.PageInfo; + +import java.util.List; +import java.util.Map; + +/** + *

+ * 字典项 + *

+ * + * @author wangff + * @since 2025/2/20 + */ +public interface DictColumnService { + + /** + * 根据id查询 + * @param id id + * @return 字典项VO + */ + DictColumnVO getById(Long id); + + /** + * 分页查询 + * @param dto 字典项查询DTO + * @return 字典项VO分页对象 + */ + PageInfo getPage(DictColumnQueryRequest dto); + + /** + * 根据编码查询已启用的字典项 + * @param columnCode 字典项编码 + * @return 字典项简单信息VO + */ + DictColumnSimpleVO getColumnByColumnCode(String columnCode); + + /** + * 根据表编码查询字典项 + * @param tableCodes 字典表编码列表 + * @return 字典项简单信息映射 + */ + Map> getMapListByTableCode(List tableCodes); +} diff --git a/coolstore-partner-service/src/main/java/com/cool/store/service/dict/DictGroupService.java b/coolstore-partner-service/src/main/java/com/cool/store/service/dict/DictGroupService.java new file mode 100644 index 000000000..64ae7dca6 --- /dev/null +++ b/coolstore-partner-service/src/main/java/com/cool/store/service/dict/DictGroupService.java @@ -0,0 +1,31 @@ +package com.cool.store.service.dict; + +import com.cool.store.request.dict.DictGroupQueryRequest; +import com.cool.store.vo.dict.DictGroupVO; + +import java.util.List; + +/** + *

+ * 字典分组 + *

+ * + * @author wangff + * @since 2025/2/20 + */ +public interface DictGroupService { + + /** + * 根据id查询 + * @param id id + * @return 字典分组VO + */ + DictGroupVO getById(Long id); + + /** + * 查询列表 + * @param queryDTO 字典分组查询DTO + * @return 字典分组实体列表 + */ + List getList(DictGroupQueryRequest queryDTO); +} diff --git a/coolstore-partner-service/src/main/java/com/cool/store/service/dict/DictTableInfoService.java b/coolstore-partner-service/src/main/java/com/cool/store/service/dict/DictTableInfoService.java new file mode 100644 index 000000000..c43438e71 --- /dev/null +++ b/coolstore-partner-service/src/main/java/com/cool/store/service/dict/DictTableInfoService.java @@ -0,0 +1,31 @@ +package com.cool.store.service.dict; + +import com.cool.store.request.dict.DictTableQueryRequest; +import com.cool.store.vo.dict.DictTableVO; + +import java.util.List; + +/** + *

+ * 字典表 + *

+ * + * @author wangff + * @since 2025/2/20 + */ +public interface DictTableInfoService { + + /** + * 根据id查询 + * @param id id + * @return 字典表信息表VO + */ + DictTableVO getById(Long id); + + /** + * VO列表查询 + * @param dto 字典表查询DTO + * @return 字典表信息表VO列表 + */ + List getList(DictTableQueryRequest dto); +} diff --git a/coolstore-partner-service/src/main/java/com/cool/store/service/dict/impl/DictColumnServiceImpl.java b/coolstore-partner-service/src/main/java/com/cool/store/service/dict/impl/DictColumnServiceImpl.java new file mode 100644 index 000000000..963e0ba64 --- /dev/null +++ b/coolstore-partner-service/src/main/java/com/cool/store/service/dict/impl/DictColumnServiceImpl.java @@ -0,0 +1,83 @@ +package com.cool.store.service.dict.impl; + +import cn.hutool.core.collection.CollStreamUtil; +import com.cool.store.dao.EnterpriseUserDAO; +import com.cool.store.dao.dict.SysDictColumnDAO; +import com.cool.store.dao.dict.SysDictTableDAO; +import com.cool.store.entity.dict.SysDictColumnDO; +import com.cool.store.entity.dict.SysDictTableDO; +import com.cool.store.request.dict.DictColumnQueryRequest; +import com.cool.store.service.dict.DictColumnService; +import com.cool.store.utils.BeanUtil; +import com.cool.store.vo.dict.DictColumnSimpleVO; +import com.cool.store.vo.dict.DictColumnVO; +import com.github.pagehelper.PageHelper; +import com.github.pagehelper.PageInfo; +import lombok.RequiredArgsConstructor; +import org.apache.commons.collections4.CollectionUtils; +import org.springframework.stereotype.Service; + +import java.util.*; + +/** + *

+ * 字典项 实现类 + *

+ * + * @author wangff + * @since 2025/2/20 + */ +@Service +@RequiredArgsConstructor +public class DictColumnServiceImpl implements DictColumnService { + private final SysDictColumnDAO columnDAO; + private final SysDictTableDAO tableDAO; + private final EnterpriseUserDAO userDAO; + + @Override + public DictColumnVO getById(Long id) { + SysDictColumnDO column = columnDAO.getById(id); + return BeanUtil.toBean(column, DictColumnVO.class); + } + + @Override + public PageInfo getPage(DictColumnQueryRequest dto) { + PageHelper.startPage(dto.getPageNum(), dto.getPageSize()); + List list = columnDAO.getList(dto); + PageInfo page = new PageInfo<>(list); + PageInfo result = BeanUtil.toPage(page, DictColumnVO.class); + Set userIds = new HashSet<>(); + result.getList().forEach(item -> { + userIds.add(item.getCreateUserId()); + userIds.add(item.getUpdateUserId()); + }); + if (CollectionUtils.isNotEmpty(userIds)) { + Map userNameMap = userDAO.getUserNameMap(new ArrayList<>(userIds)); + result.getList().forEach(v -> { + v.setCreateUserName(userNameMap.get(v.getCreateUserId())); + v.setUpdateUserName(userNameMap.get(v.getUpdateUserId())); + }); + } + return result; + } + + @Override + public DictColumnSimpleVO getColumnByColumnCode(String columnCode) { + SysDictColumnDO column = columnDAO.getOpenColumnByCode(columnCode); + SysDictTableDO table = tableDAO.getById(column.getDictTableId()); + DictColumnSimpleVO vo = BeanUtil.toBean(column, DictColumnSimpleVO.class); + if (Objects.nonNull(table)) { + vo.setTableCode(table.getTableCode()); + } + return vo; + } + + @Override + public Map> getMapListByTableCode(List tableCodes) { + if (CollectionUtils.isEmpty(tableCodes)) { + return Collections.emptyMap(); + } + List list = columnDAO.getOpenColumnListByTableCode(tableCodes); + return CollStreamUtil.groupByKey(list, DictColumnSimpleVO::getTableCode); + } +} diff --git a/coolstore-partner-service/src/main/java/com/cool/store/service/dict/impl/DictGroupServiceImpl.java b/coolstore-partner-service/src/main/java/com/cool/store/service/dict/impl/DictGroupServiceImpl.java new file mode 100644 index 000000000..56ad3b1bc --- /dev/null +++ b/coolstore-partner-service/src/main/java/com/cool/store/service/dict/impl/DictGroupServiceImpl.java @@ -0,0 +1,61 @@ +package com.cool.store.service.dict.impl; + +import cn.hutool.core.collection.CollStreamUtil; +import com.cool.store.dao.dict.SysDictColumnDAO; +import com.cool.store.dao.dict.SysDictGroupDAO; +import com.cool.store.dao.dict.SysDictTableDAO; +import com.cool.store.entity.dict.SysDictGroupDO; +import com.cool.store.entity.dict.SysDictTableDO; +import com.cool.store.request.dict.DictGroupQueryRequest; +import com.cool.store.service.dict.DictGroupService; +import com.cool.store.utils.BeanUtil; +import com.cool.store.vo.dict.DictGroupVO; +import com.cool.store.vo.dict.DictTableVO; +import lombok.RequiredArgsConstructor; +import org.springframework.stereotype.Service; + +import java.util.Collections; +import java.util.List; +import java.util.Map; + +/** + *

+ * 字典分组 实现类 + *

+ * + * @author wangff + * @since 2025/2/20 + */ +@Service +@RequiredArgsConstructor +public class DictGroupServiceImpl implements DictGroupService { + private final SysDictGroupDAO groupDAO; + private final SysDictTableDAO tableDAO; + private final SysDictColumnDAO columnDAO; + + @Override + public DictGroupVO getById(Long id) { + SysDictGroupDO group = groupDAO.getById(id); + return BeanUtil.toBean(group, DictGroupVO.class); + } + + + @Override + public List getList(DictGroupQueryRequest queryDTO) { + List list = groupDAO.getList(queryDTO); + List result = BeanUtil.toList(list, DictGroupVO.class); + // 查询字典表 + List groupIds = CollStreamUtil.toList(result, DictGroupVO::getId); + List tableList = tableDAO.getListByGroupIds(groupIds, queryDTO.getDictTableOpenStatus()); + List tableVOList = BeanUtil.toList(tableList, DictTableVO.class); + // 查询字典项数量 + List tableIds = CollStreamUtil.toList(tableVOList, DictTableVO::getId); + Map columnNumMap = columnDAO.getColumnNumMapByTableIds(tableIds); + + tableVOList.forEach(v -> v.setColumnNum(columnNumMap.getOrDefault(v.getId(), 0))); + + Map> tableMap = CollStreamUtil.groupByKey(tableVOList, DictTableVO::getDictGroupId); + result.forEach(v -> v.setTableList(tableMap.getOrDefault(v.getId(), Collections.emptyList()))); + return result; + } +} diff --git a/coolstore-partner-service/src/main/java/com/cool/store/service/dict/impl/DictTableInfoServiceImpl.java b/coolstore-partner-service/src/main/java/com/cool/store/service/dict/impl/DictTableInfoServiceImpl.java new file mode 100644 index 000000000..911855abf --- /dev/null +++ b/coolstore-partner-service/src/main/java/com/cool/store/service/dict/impl/DictTableInfoServiceImpl.java @@ -0,0 +1,41 @@ +package com.cool.store.service.dict.impl; + +import com.cool.store.dao.dict.SysDictColumnDAO; +import com.cool.store.dao.dict.SysDictTableDAO; +import com.cool.store.entity.dict.SysDictTableDO; +import com.cool.store.request.dict.DictTableQueryRequest; +import com.cool.store.service.dict.DictTableInfoService; +import com.cool.store.utils.BeanUtil; +import com.cool.store.vo.dict.DictTableVO; +import lombok.RequiredArgsConstructor; +import org.springframework.stereotype.Service; + +import java.util.List; + +/** + *

+ * 字典表 实现类 + *

+ * + * @author wangff + * @since 2025/2/20 + */ +@Service +@RequiredArgsConstructor +public class DictTableInfoServiceImpl implements DictTableInfoService { + private final SysDictTableDAO dictTableInfoDAO; + private final SysDictColumnDAO columnInfoDAO; + + + @Override + public DictTableVO getById(Long id) { + SysDictTableDO table = dictTableInfoDAO.getById(id); + return BeanUtil.toBean(table, DictTableVO.class); + } + + @Override + public List getList(DictTableQueryRequest dto) { + List list = dictTableInfoDAO.getList(dto); + return BeanUtil.toList(list, DictTableVO.class); + } +} diff --git a/coolstore-partner-web/src/main/java/com/cool/store/controller/webb/DictManagerController.java b/coolstore-partner-web/src/main/java/com/cool/store/controller/webb/DictManagerController.java new file mode 100644 index 000000000..280ba1548 --- /dev/null +++ b/coolstore-partner-web/src/main/java/com/cool/store/controller/webb/DictManagerController.java @@ -0,0 +1,88 @@ +package com.cool.store.controller.webb; + +import com.cool.store.request.dict.DictColumnQueryRequest; +import com.cool.store.request.dict.DictGroupQueryRequest; +import com.cool.store.request.dict.DictTableQueryRequest; +import com.cool.store.response.ResponseResult; +import com.cool.store.service.dict.DictColumnService; +import com.cool.store.service.dict.DictGroupService; +import com.cool.store.service.dict.DictTableInfoService; +import com.cool.store.vo.dict.DictColumnSimpleVO; +import com.cool.store.vo.dict.DictColumnVO; +import com.cool.store.vo.dict.DictGroupVO; +import com.cool.store.vo.dict.DictTableVO; +import com.github.pagehelper.PageInfo; +import io.swagger.annotations.Api; +import io.swagger.annotations.ApiOperation; +import lombok.RequiredArgsConstructor; +import org.springframework.web.bind.annotation.*; + +import javax.validation.constraints.NotBlank; +import java.util.List; +import java.util.Map; + +/** + *

+ * 字典管理 前端控制器 + *

+ * + * @author wangff + * @since 2025/2/20 + */ +@Api(tags = "字典管理") +@RestController +@RequestMapping("pc/sys/dict") +@RequiredArgsConstructor +public class DictManagerController { + private final DictGroupService groupService; + private final DictTableInfoService tableService; + private final DictColumnService columnService; + + @ApiOperation("字典分组-查询") + @GetMapping("/group/{groupId}") + public ResponseResult groupGet(@PathVariable("groupId") Long groupId) { + return ResponseResult.success(groupService.getById(groupId)); + } + + @ApiOperation("字典分组-列表") + @GetMapping("/group/list") + public ResponseResult> groupList(DictGroupQueryRequest dto) { + return ResponseResult.success(groupService.getList(dto)); + } + + @ApiOperation("字典表-查询") + @GetMapping("/table/{tableId}") + public ResponseResult tableGet(@PathVariable("tableId") Long tableId) { + return ResponseResult.success(tableService.getById(tableId)); + } + + @ApiOperation("字典表-列表") + @GetMapping("/table/list") + public ResponseResult> tableList(DictTableQueryRequest dto) { + return ResponseResult.success(tableService.getList(dto)); + } + + @ApiOperation("字典项-分页查询") + @GetMapping("/column/page") + public ResponseResult> columnPage(DictColumnQueryRequest dto) { + return ResponseResult.success(columnService.getPage(dto)); + } + + @ApiOperation("字典项-查询") + @GetMapping("/column/{columnId}") + public ResponseResult columnGet(@PathVariable("columnId") Long columnId) { + return ResponseResult.success(columnService.getById(columnId)); + } + + @ApiOperation("字典项-根据字典项code查询已启用的字典项") + @GetMapping("/column/getByColumnCode") + public ResponseResult getColumnByColumnCode(@NotBlank(message = "字典项编码不能为空") String columnCode) { + return ResponseResult.success(columnService.getColumnByColumnCode(columnCode)); + } + + @ApiOperation("字典项-根据字典表code查询已启用的字典项列表") + @PostMapping("/column/getMapByTableCodes") + public ResponseResult>> getColumnByTableCode(@RequestBody List tableCodes) { + return ResponseResult.success(columnService.getMapListByTableCode(tableCodes)); + } +} From 75a0ad467632bd76b823bd8e442540dc4639acf9 Mon Sep 17 00:00:00 2001 From: wangff Date: Tue, 4 Nov 2025 17:53:02 +0800 Subject: [PATCH 02/10] =?UTF-8?q?feat:=E5=8D=81=E4=BA=8C=E5=88=86=E5=88=B6?= =?UTF-8?q?-=E5=A5=96=E6=83=A9=E8=A7=84=E5=88=99?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../com/cool/store/annotation/DictField.java | 15 ++ .../java/com/cool/store/utils/TpHelper.java | 35 +++++ .../cool/store/dao/dict/SysDictColumnDAO.java | 13 ++ .../java/com/cool/store/dao/tp/TpRuleDAO.java | 95 ++++++++++++ .../mapper/dict/SysDictColumnMapper.java | 7 + .../store/mapper/tp/TpAppealFormMapper.java | 7 + .../store/mapper/tp/TpApplyFormMapper.java | 7 + .../store/mapper/tp/TpAuditRecordMapper.java | 7 + .../cool/store/mapper/tp/TpRuleMapper.java | 7 + .../store/mapper/tp/TpScoreJournalMapper.java | 7 + .../resources/dict/SysDictColumnMapper.xml | 10 ++ .../mapper/tp/TpAppealFormMapper.xml | 26 ++++ .../resources/mapper/tp/TpApplyFormMapper.xml | 30 ++++ .../mapper/tp/TpAuditRecordMapper.xml | 21 +++ .../main/resources/mapper/tp/TpRuleMapper.xml | 25 ++++ .../mapper/tp/TpScoreJournalMapper.xml | 29 ++++ .../cool/store/entity/tp/TpAppealFormDO.java | 117 +++++++++++++++ .../cool/store/entity/tp/TpApplyFormDO.java | 140 ++++++++++++++++++ .../cool/store/entity/tp/TpAuditRecordDO.java | 89 +++++++++++ .../com/cool/store/entity/tp/TpRuleDO.java | 113 ++++++++++++++ .../store/entity/tp/TpScoreJournalDO.java | 140 ++++++++++++++++++ .../tp/TpPenaltyRuleUpdateRequest.java | 62 ++++++++ .../request/tp/TpRewardRuleUpdateRequest.java | 49 ++++++ .../store/request/tp/TpRuleQueryRequest.java | 28 ++++ .../store/vo/tp/TpPenaltyRuleDetailVO.java | 59 ++++++++ .../cool/store/vo/tp/TpPenaltyRuleListVO.java | 44 ++++++ .../store/vo/tp/TpRewardRuleDetailVO.java | 46 ++++++ .../store/service/dict/impl/DictService.java | 101 +++++++++++++ .../cool/store/service/tp/TpRuleService.java | 93 ++++++++++++ .../service/tp/impl/TpRuleServiceImpl.java | 116 +++++++++++++++ .../controller/webb/TpRuleController.java | 106 +++++++++++++ 31 files changed, 1644 insertions(+) create mode 100644 coolstore-partner-common/src/main/java/com/cool/store/annotation/DictField.java create mode 100644 coolstore-partner-common/src/main/java/com/cool/store/utils/TpHelper.java create mode 100644 coolstore-partner-dao/src/main/java/com/cool/store/dao/tp/TpRuleDAO.java create mode 100644 coolstore-partner-dao/src/main/java/com/cool/store/mapper/tp/TpAppealFormMapper.java create mode 100644 coolstore-partner-dao/src/main/java/com/cool/store/mapper/tp/TpApplyFormMapper.java create mode 100644 coolstore-partner-dao/src/main/java/com/cool/store/mapper/tp/TpAuditRecordMapper.java create mode 100644 coolstore-partner-dao/src/main/java/com/cool/store/mapper/tp/TpRuleMapper.java create mode 100644 coolstore-partner-dao/src/main/java/com/cool/store/mapper/tp/TpScoreJournalMapper.java create mode 100644 coolstore-partner-dao/src/main/resources/mapper/tp/TpAppealFormMapper.xml create mode 100644 coolstore-partner-dao/src/main/resources/mapper/tp/TpApplyFormMapper.xml create mode 100644 coolstore-partner-dao/src/main/resources/mapper/tp/TpAuditRecordMapper.xml create mode 100644 coolstore-partner-dao/src/main/resources/mapper/tp/TpRuleMapper.xml create mode 100644 coolstore-partner-dao/src/main/resources/mapper/tp/TpScoreJournalMapper.xml create mode 100644 coolstore-partner-model/src/main/java/com/cool/store/entity/tp/TpAppealFormDO.java create mode 100644 coolstore-partner-model/src/main/java/com/cool/store/entity/tp/TpApplyFormDO.java create mode 100644 coolstore-partner-model/src/main/java/com/cool/store/entity/tp/TpAuditRecordDO.java create mode 100644 coolstore-partner-model/src/main/java/com/cool/store/entity/tp/TpRuleDO.java create mode 100644 coolstore-partner-model/src/main/java/com/cool/store/entity/tp/TpScoreJournalDO.java create mode 100644 coolstore-partner-model/src/main/java/com/cool/store/request/tp/TpPenaltyRuleUpdateRequest.java create mode 100644 coolstore-partner-model/src/main/java/com/cool/store/request/tp/TpRewardRuleUpdateRequest.java create mode 100644 coolstore-partner-model/src/main/java/com/cool/store/request/tp/TpRuleQueryRequest.java create mode 100644 coolstore-partner-model/src/main/java/com/cool/store/vo/tp/TpPenaltyRuleDetailVO.java create mode 100644 coolstore-partner-model/src/main/java/com/cool/store/vo/tp/TpPenaltyRuleListVO.java create mode 100644 coolstore-partner-model/src/main/java/com/cool/store/vo/tp/TpRewardRuleDetailVO.java create mode 100644 coolstore-partner-service/src/main/java/com/cool/store/service/dict/impl/DictService.java create mode 100644 coolstore-partner-service/src/main/java/com/cool/store/service/tp/TpRuleService.java create mode 100644 coolstore-partner-service/src/main/java/com/cool/store/service/tp/impl/TpRuleServiceImpl.java create mode 100644 coolstore-partner-web/src/main/java/com/cool/store/controller/webb/TpRuleController.java diff --git a/coolstore-partner-common/src/main/java/com/cool/store/annotation/DictField.java b/coolstore-partner-common/src/main/java/com/cool/store/annotation/DictField.java new file mode 100644 index 000000000..6559cb527 --- /dev/null +++ b/coolstore-partner-common/src/main/java/com/cool/store/annotation/DictField.java @@ -0,0 +1,15 @@ +package com.cool.store.annotation; + +import java.lang.annotation.ElementType; +import java.lang.annotation.Retention; +import java.lang.annotation.RetentionPolicy; +import java.lang.annotation.Target; + +/** + * 字典表填充字段 + */ +@Target(ElementType.FIELD) +@Retention(RetentionPolicy.RUNTIME) +public @interface DictField { + String sourceField() default ""; +} diff --git a/coolstore-partner-common/src/main/java/com/cool/store/utils/TpHelper.java b/coolstore-partner-common/src/main/java/com/cool/store/utils/TpHelper.java new file mode 100644 index 000000000..d8e5ab2f4 --- /dev/null +++ b/coolstore-partner-common/src/main/java/com/cool/store/utils/TpHelper.java @@ -0,0 +1,35 @@ +package com.cool.store.utils; + +import java.time.LocalDateTime; +import java.time.format.DateTimeFormatter; + +/** + *

+ * 十二分制 辅助工具类 + *

+ * + * @author wangff + * @since 2025/11/4 + */ +public class TpHelper { + private final static DateTimeFormatter dtf = DateTimeFormatter.ofPattern("yyMMddHHmmssSSS"); + + /** + * 生成惩处单号 + */ + public static String generatePenaltyRuleCode() { + return "CC" + generateCode(); + } + /** + * 生成加分单号 + */ + public static String generateRewardRuleCode() { + return "JF" + generateCode(); + } + + private static String generateCode() { + return LocalDateTime.now().format(dtf) + (int) (Math.random() * 900) + 100; + } + + +} diff --git a/coolstore-partner-dao/src/main/java/com/cool/store/dao/dict/SysDictColumnDAO.java b/coolstore-partner-dao/src/main/java/com/cool/store/dao/dict/SysDictColumnDAO.java index ab991bda6..e08265c78 100644 --- a/coolstore-partner-dao/src/main/java/com/cool/store/dao/dict/SysDictColumnDAO.java +++ b/coolstore-partner-dao/src/main/java/com/cool/store/dao/dict/SysDictColumnDAO.java @@ -128,6 +128,19 @@ public class SysDictColumnDAO { return ""; } + /** + * 根据字典列编码查询已启用字典项名称映射 + * @param columnCodes 字典列编码列表 + * @return <字典列编码, 字典项名称> + */ + public Map getNameMapByCodes(List columnCodes) { + if (CollectionUtils.isEmpty(columnCodes)) { + return Collections.emptyMap(); + } + List list = sysDictColumnMapper.selectOpenColumnByCodes(columnCodes); + return CollStreamUtil.toMap(list, SysDictColumnDO::getColumnCode, SysDictColumnDO::getColumnName); + } + /** * 根据字典表编码查询启用状态的字典项 * @param tableCodes 字典表编码列表 diff --git a/coolstore-partner-dao/src/main/java/com/cool/store/dao/tp/TpRuleDAO.java b/coolstore-partner-dao/src/main/java/com/cool/store/dao/tp/TpRuleDAO.java new file mode 100644 index 000000000..b84d59fde --- /dev/null +++ b/coolstore-partner-dao/src/main/java/com/cool/store/dao/tp/TpRuleDAO.java @@ -0,0 +1,95 @@ +package com.cool.store.dao.tp; + +import com.cool.store.entity.tp.TpRuleDO; +import com.cool.store.mapper.tp.TpRuleMapper; +import com.cool.store.request.tp.TpRuleQueryRequest; +import lombok.RequiredArgsConstructor; +import org.apache.commons.collections4.CollectionUtils; +import org.apache.commons.lang3.StringUtils; +import org.springframework.stereotype.Repository; +import tk.mybatis.mapper.entity.Example; + +import java.util.List; +import java.util.Objects; + +/** + *

+ * 十二分制-奖惩规则DAO + *

+ * + * @author wangff + * @since 2025/11/4 + */ +@Repository +@RequiredArgsConstructor +public class TpRuleDAO { + private final TpRuleMapper tpRuleMapper; + + /** + * 新增 + */ + public boolean insertSelective(TpRuleDO tpRuleDO) { + return tpRuleMapper.insertSelective(tpRuleDO) > 0; + } + + /** + * 编辑 + */ + public boolean updateSelective(TpRuleDO tpRuleDO) { + return tpRuleMapper.updateByPrimaryKeySelective(tpRuleDO) > 0; + } + + /** + * 删除 + */ + public boolean deleteByIds(List ids) { + if (CollectionUtils.isEmpty(ids)) { + return false; + } + Example example = new Example(TpRuleDO.class); + example.createCriteria().andIn("id", ids); + return tpRuleMapper.updateByExampleSelective(TpRuleDO.builder().deleted(1).build(), example) > 0; + } + + /** + * 根据id查询 + */ + public TpRuleDO getById(Long id) { + return tpRuleMapper.selectByPrimaryKey(id); + } + + public List getList(TpRuleQueryRequest request) { + Example example = new Example(TpRuleDO.class); + Example.Criteria criteria = example.createCriteria(); + if (StringUtils.isNotBlank(request.getProblemClassification())) { + criteria.andEqualTo("problemClassification", request.getProblemClassification()); + } + if (StringUtils.isNotBlank(request.getProjectCategory())) { + criteria.andEqualTo("projectCategory", request.getProjectCategory()); + } + if (StringUtils.isNotBlank(request.getProjectName())) { + criteria.andLike("projectName", request.getProjectName()); + } + if (Objects.nonNull(request.getStatus())) { + criteria.andEqualTo("status", request.getStatus()); + } + example.setOrderByClause("create_time DESC"); + return tpRuleMapper.selectByExample(example); + } + + /** + * 修改启用状态 + * @param ids id列表 + * @param status 启用状态 + * @return boolean + */ + public boolean updateStatus(List ids, Integer status) { + if (CollectionUtils.isEmpty(ids)) { + return false; + } + Example example = new Example(TpRuleDO.class); + example.createCriteria() + .andIn("id", ids); + return tpRuleMapper.updateByExampleSelective(TpRuleDO.builder().status(status).build(), example) > 0; + } +} diff --git a/coolstore-partner-dao/src/main/java/com/cool/store/mapper/dict/SysDictColumnMapper.java b/coolstore-partner-dao/src/main/java/com/cool/store/mapper/dict/SysDictColumnMapper.java index 8f4fda280..71b9ed08e 100644 --- a/coolstore-partner-dao/src/main/java/com/cool/store/mapper/dict/SysDictColumnMapper.java +++ b/coolstore-partner-dao/src/main/java/com/cool/store/mapper/dict/SysDictColumnMapper.java @@ -95,6 +95,13 @@ public interface SysDictColumnMapper { */ SysDictColumnDO selectOpenColumnByCode(@Param("columnCode") String columnCode); + /** + * 根据字典项编码查询字典项映射 + * @param columnCodes 字典项编码列表 + * @return 字典项列表 + */ + List selectOpenColumnByCodes(@Param("columnCodes") List columnCodes); + /** * 根据字典表id查询 * @param tableIds 字典表id列表 diff --git a/coolstore-partner-dao/src/main/java/com/cool/store/mapper/tp/TpAppealFormMapper.java b/coolstore-partner-dao/src/main/java/com/cool/store/mapper/tp/TpAppealFormMapper.java new file mode 100644 index 000000000..6104bef94 --- /dev/null +++ b/coolstore-partner-dao/src/main/java/com/cool/store/mapper/tp/TpAppealFormMapper.java @@ -0,0 +1,7 @@ +package com.cool.store.mapper.tp; + +import com.cool.store.entity.tp.TpAppealFormDO; +import tk.mybatis.mapper.common.Mapper; + +public interface TpAppealFormMapper extends Mapper { +} \ No newline at end of file diff --git a/coolstore-partner-dao/src/main/java/com/cool/store/mapper/tp/TpApplyFormMapper.java b/coolstore-partner-dao/src/main/java/com/cool/store/mapper/tp/TpApplyFormMapper.java new file mode 100644 index 000000000..94f82f2d6 --- /dev/null +++ b/coolstore-partner-dao/src/main/java/com/cool/store/mapper/tp/TpApplyFormMapper.java @@ -0,0 +1,7 @@ +package com.cool.store.mapper.tp; + +import com.cool.store.entity.tp.TpApplyFormDO; +import tk.mybatis.mapper.common.Mapper; + +public interface TpApplyFormMapper extends Mapper { +} \ No newline at end of file diff --git a/coolstore-partner-dao/src/main/java/com/cool/store/mapper/tp/TpAuditRecordMapper.java b/coolstore-partner-dao/src/main/java/com/cool/store/mapper/tp/TpAuditRecordMapper.java new file mode 100644 index 000000000..53a87894f --- /dev/null +++ b/coolstore-partner-dao/src/main/java/com/cool/store/mapper/tp/TpAuditRecordMapper.java @@ -0,0 +1,7 @@ +package com.cool.store.mapper.tp; + +import com.cool.store.entity.tp.TpAuditRecordDO; +import tk.mybatis.mapper.common.Mapper; + +public interface TpAuditRecordMapper extends Mapper { +} \ No newline at end of file diff --git a/coolstore-partner-dao/src/main/java/com/cool/store/mapper/tp/TpRuleMapper.java b/coolstore-partner-dao/src/main/java/com/cool/store/mapper/tp/TpRuleMapper.java new file mode 100644 index 000000000..a76ed7cae --- /dev/null +++ b/coolstore-partner-dao/src/main/java/com/cool/store/mapper/tp/TpRuleMapper.java @@ -0,0 +1,7 @@ +package com.cool.store.mapper.tp; + +import com.cool.store.entity.tp.TpRuleDO; +import tk.mybatis.mapper.common.Mapper; + +public interface TpRuleMapper extends Mapper { +} \ No newline at end of file diff --git a/coolstore-partner-dao/src/main/java/com/cool/store/mapper/tp/TpScoreJournalMapper.java b/coolstore-partner-dao/src/main/java/com/cool/store/mapper/tp/TpScoreJournalMapper.java new file mode 100644 index 000000000..0b746cdd9 --- /dev/null +++ b/coolstore-partner-dao/src/main/java/com/cool/store/mapper/tp/TpScoreJournalMapper.java @@ -0,0 +1,7 @@ +package com.cool.store.mapper.tp; + +import com.cool.store.entity.tp.TpScoreJournalDO; +import tk.mybatis.mapper.common.Mapper; + +public interface TpScoreJournalMapper extends Mapper { +} \ No newline at end of file diff --git a/coolstore-partner-dao/src/main/resources/dict/SysDictColumnMapper.xml b/coolstore-partner-dao/src/main/resources/dict/SysDictColumnMapper.xml index 59975c23e..156cf57ab 100644 --- a/coolstore-partner-dao/src/main/resources/dict/SysDictColumnMapper.xml +++ b/coolstore-partner-dao/src/main/resources/dict/SysDictColumnMapper.xml @@ -247,6 +247,16 @@ WHERE column_code = #{columnCode} AND deleted = 0 AND open_status = 1 LIMIT 1 + + + + + + + + + + + INSERT INTO store_extend_info_${enterpriseId} (store_id, score) VALUES (#{storeId}, #{score}) + ON DUPLICATE KEY UPDATE + score = values(score) + diff --git a/coolstore-partner-dao/src/main/resources/mapper/tp/TpAppealFormMapper.xml b/coolstore-partner-dao/src/main/resources/mapper/tp/TpAppealFormMapper.xml index b47867460..bdeae3a11 100644 --- a/coolstore-partner-dao/src/main/resources/mapper/tp/TpAppealFormMapper.xml +++ b/coolstore-partner-dao/src/main/resources/mapper/tp/TpAppealFormMapper.xml @@ -17,6 +17,7 @@ + diff --git a/coolstore-partner-dao/src/main/resources/mapper/tp/TpApplyFormMapper.xml b/coolstore-partner-dao/src/main/resources/mapper/tp/TpApplyFormMapper.xml index 840f8010f..c618c1544 100644 --- a/coolstore-partner-dao/src/main/resources/mapper/tp/TpApplyFormMapper.xml +++ b/coolstore-partner-dao/src/main/resources/mapper/tp/TpApplyFormMapper.xml @@ -9,17 +9,22 @@ - + + + + - + - + + + @@ -27,4 +32,49 @@ + + + id, type, apply_no, store_id, rule_id, rule_no, problem_classification, project_category, project_name, + is_full, score, remark, amount, appeal_end_date, status, pay_status, is_draft, source, apply_user_id, + apply_user_name, approve_user_id, approve_time, create_time, update_time, deleted, proof_urls + + + + \ No newline at end of file diff --git a/coolstore-partner-dao/src/main/resources/mapper/tp/TpAuditRecordMapper.xml b/coolstore-partner-dao/src/main/resources/mapper/tp/TpAuditRecordMapper.xml index 463a1a94b..09b1ab52b 100644 --- a/coolstore-partner-dao/src/main/resources/mapper/tp/TpAuditRecordMapper.xml +++ b/coolstore-partner-dao/src/main/resources/mapper/tp/TpAuditRecordMapper.xml @@ -12,6 +12,7 @@ + diff --git a/coolstore-partner-dao/src/main/resources/mapper/tp/TpRuleMapper.xml b/coolstore-partner-dao/src/main/resources/mapper/tp/TpRuleMapper.xml index 47692828c..ea4b8be9e 100644 --- a/coolstore-partner-dao/src/main/resources/mapper/tp/TpRuleMapper.xml +++ b/coolstore-partner-dao/src/main/resources/mapper/tp/TpRuleMapper.xml @@ -6,13 +6,13 @@ WARNING - @mbg.generated --> - + - + diff --git a/coolstore-partner-dao/src/main/resources/mapper/tp/TpScoreJournalMapper.xml b/coolstore-partner-dao/src/main/resources/mapper/tp/TpScoreJournalMapper.xml index 60bdbad78..e287d89b5 100644 --- a/coolstore-partner-dao/src/main/resources/mapper/tp/TpScoreJournalMapper.xml +++ b/coolstore-partner-dao/src/main/resources/mapper/tp/TpScoreJournalMapper.xml @@ -13,7 +13,7 @@ - + diff --git a/coolstore-partner-model/src/main/java/com/cool/store/entity/tp/TpAppealFormDO.java b/coolstore-partner-model/src/main/java/com/cool/store/entity/tp/TpAppealFormDO.java index 76bf8b2bf..51450546a 100644 --- a/coolstore-partner-model/src/main/java/com/cool/store/entity/tp/TpAppealFormDO.java +++ b/coolstore-partner-model/src/main/java/com/cool/store/entity/tp/TpAppealFormDO.java @@ -70,7 +70,7 @@ public class TpAppealFormDO { private Integer status; /** - * 来源,0crm 1小程序 + * 来源,0非小程序 1小程序 */ private Integer source; @@ -85,6 +85,12 @@ public class TpAppealFormDO { */ @Column(name = "approve_time") private Date approveTime; + + /** + * 是否为草稿 0否 1是 + */ + @Column(name = "is_draft") + private Integer isDraft; /** * 创建人id diff --git a/coolstore-partner-model/src/main/java/com/cool/store/entity/tp/TpApplyFormDO.java b/coolstore-partner-model/src/main/java/com/cool/store/entity/tp/TpApplyFormDO.java index 16d3485c2..669997010 100644 --- a/coolstore-partner-model/src/main/java/com/cool/store/entity/tp/TpApplyFormDO.java +++ b/coolstore-partner-model/src/main/java/com/cool/store/entity/tp/TpApplyFormDO.java @@ -1,8 +1,12 @@ package com.cool.store.entity.tp; +import lombok.AllArgsConstructor; +import lombok.Builder; import lombok.Data; +import lombok.NoArgsConstructor; import java.math.BigDecimal; +import java.time.LocalDate; import java.util.Date; import javax.persistence.*; @@ -16,6 +20,9 @@ import javax.persistence.*; */ @Table(name = "zxjp_tp_apply_form") @Data +@AllArgsConstructor +@NoArgsConstructor +@Builder public class TpApplyFormDO { /** * id @@ -41,6 +48,24 @@ public class TpApplyFormDO { @Column(name = "store_id") private String storeId; + /** + * 规则id(项目类型) + */ + @Column(name = "rule_id") + private Long ruleId; + + /** + * 规则编码 + */ + @Column(name = "rule_no") + private String ruleNo; + + /** + * 问题分类 + */ + @Column(name = "problem_classification") + private String problemClassification; + /** * 项目大类 */ @@ -48,10 +73,10 @@ public class TpApplyFormDO { private String projectCategory; /** - * 规则id(项目类型) + * 项目名称 */ - @Column(name = "rule_id") - private Long ruleId; + @Column(name = "project_name") + private String projectName; /** * 是否加满 @@ -62,7 +87,7 @@ public class TpApplyFormDO { /** * 分值 */ - private BigDecimal point; + private BigDecimal score; /** * 备注 @@ -70,7 +95,7 @@ public class TpApplyFormDO { private String remark; /** - * 罚款金额 + * 金额 */ private BigDecimal amount; @@ -78,12 +103,12 @@ public class TpApplyFormDO { * 申请复议截止日期 */ @Column(name = "appeal_end_date") - private Date appealEndDate; + private LocalDate appealEndDate; /** * 状态 */ - private Integer status; + private String status; /** * 缴费状态,0未缴费 1无需缴费 2已缴费 @@ -97,12 +122,24 @@ public class TpApplyFormDO { @Column(name = "is_draft") private Integer isDraft; + /** + * 来源,0非小程序 1小程序 + */ + @Column(name = "source") + private Integer source; + /** * 申请人id */ @Column(name = "apply_user_id") private String applyUserId; + /** + * 申请人名称 + */ + @Column(name = "apply_user_name") + private String applyUserName; + /** * 审批人id */ diff --git a/coolstore-partner-model/src/main/java/com/cool/store/entity/tp/TpAuditRecordDO.java b/coolstore-partner-model/src/main/java/com/cool/store/entity/tp/TpAuditRecordDO.java index bb948e5d2..43f18c97d 100644 --- a/coolstore-partner-model/src/main/java/com/cool/store/entity/tp/TpAuditRecordDO.java +++ b/coolstore-partner-model/src/main/java/com/cool/store/entity/tp/TpAuditRecordDO.java @@ -1,6 +1,9 @@ package com.cool.store.entity.tp; +import lombok.AllArgsConstructor; +import lombok.Builder; import lombok.Data; +import lombok.NoArgsConstructor; import java.util.Date; import javax.persistence.*; @@ -15,6 +18,9 @@ import javax.persistence.*; */ @Table(name = "zxjp_tp_audit_record") @Data +@AllArgsConstructor +@NoArgsConstructor +@Builder public class TpAuditRecordDO { /** * id @@ -24,7 +30,7 @@ public class TpAuditRecordDO { private Long id; /** - * 表单类型,0加分申请 1复议申请 + * 单据类型,0加分单 1警告书 2处罚书 */ @Column(name = "apply_type") private Integer applyType; @@ -58,6 +64,12 @@ public class TpAuditRecordDO { @Column(name = "handler_user_id") private String handlerUserId; + /** + * 处理人名称 + */ + @Column(name = "handler_user_name") + private String handlerUserName; + /** * 收到任务时间 */ diff --git a/coolstore-partner-model/src/main/java/com/cool/store/entity/tp/TpRuleDO.java b/coolstore-partner-model/src/main/java/com/cool/store/entity/tp/TpRuleDO.java index 828907322..509590c6a 100644 --- a/coolstore-partner-model/src/main/java/com/cool/store/entity/tp/TpRuleDO.java +++ b/coolstore-partner-model/src/main/java/com/cool/store/entity/tp/TpRuleDO.java @@ -30,8 +30,8 @@ public class TpRuleDO { /** * 规则编码 */ - @Column(name = "rule_code") - private String ruleCode; + @Column(name = "rule_no") + private String ruleNo; /** * 规则类型,0扣分 1加分 @@ -65,7 +65,7 @@ public class TpRuleDO { /** * 分值 */ - private BigDecimal point; + private BigDecimal score; /** * 罚款金额 diff --git a/coolstore-partner-model/src/main/java/com/cool/store/entity/tp/TpScoreJournalDO.java b/coolstore-partner-model/src/main/java/com/cool/store/entity/tp/TpScoreJournalDO.java index c6d97aca8..6baf44a98 100644 --- a/coolstore-partner-model/src/main/java/com/cool/store/entity/tp/TpScoreJournalDO.java +++ b/coolstore-partner-model/src/main/java/com/cool/store/entity/tp/TpScoreJournalDO.java @@ -1,6 +1,10 @@ package com.cool.store.entity.tp; +import com.cool.store.entity.StoreDO; +import com.cool.store.utils.TpHelper; +import lombok.AllArgsConstructor; import lombok.Data; +import lombok.NoArgsConstructor; import java.math.BigDecimal; import java.util.Date; @@ -16,6 +20,8 @@ import javax.persistence.*; */ @Table(name = "zxjp_tp_score_journal") @Data +@AllArgsConstructor +@NoArgsConstructor public class TpScoreJournalDO { /** * id @@ -70,7 +76,7 @@ public class TpScoreJournalDO { * 发生分值 */ @Column(name = "occur_score") - private BigDecimal occurScore; + private String occurScore; /** * 发生日期 @@ -91,7 +97,7 @@ public class TpScoreJournalDO { private BigDecimal occurAfterScore; /** - * 单据来源,0加分申请单 2惩处申请单 + * 单据类型,0加分单 1警告书 2处罚书 */ @Column(name = "apply_type") private Integer applyType; @@ -137,4 +143,24 @@ public class TpScoreJournalDO { */ @Column(name = "update_time") private Date updateTime; + + public TpScoreJournalDO(StoreDO storeDO, TpApplyFormDO formDO, String occurScore, BigDecimal occurBeforeScore, BigDecimal occurAfterScore) { + this.journalNo = TpHelper.generateScoreJournalNo(); + this.storeId = storeDO.getStoreId(); + this.storeNum = storeDO.getStoreNum(); + this.joinBrand = storeDO.getJoinBrand(); + this.joinModel = storeDO.getJoinModel(); + this.storeType = storeDO.getStoreType(); + this.storeName = storeDO.getStoreName(); + this.occurScore = occurScore; + this.occurDate = new Date(); + this.occurBeforeScore = occurBeforeScore; + this.occurAfterScore = occurAfterScore; + this.applyType = formDO.getType(); + this.applyNo = formDO.getApplyNo(); + this.projectCategory = formDO.getProjectCategory(); + this.projectName = formDO.getProjectName(); + this.ruleId = formDO.getRuleId(); + this.ruleNo = formDO.getRuleNo(); + } } \ No newline at end of file diff --git a/coolstore-partner-model/src/main/java/com/cool/store/request/tp/TpApplyAuditRequest.java b/coolstore-partner-model/src/main/java/com/cool/store/request/tp/TpApplyAuditRequest.java new file mode 100644 index 000000000..f98dca46d --- /dev/null +++ b/coolstore-partner-model/src/main/java/com/cool/store/request/tp/TpApplyAuditRequest.java @@ -0,0 +1,31 @@ +package com.cool.store.request.tp; + +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +import javax.validation.constraints.NotNull; + +/** + *

+ * 申请单审批Request + *

+ * + * @author wangff + * @since 2025/11/6 + */ +@Data +public class TpApplyAuditRequest { + @ApiModelProperty("申请单id") + @NotNull(message = "申请单id不能为空") + private Long applyId; + + @ApiModelProperty(value = "单据类型,0加分单 1警告书 2处罚书", hidden = true) + private Integer applyType; + + @ApiModelProperty("审批状态 1通过 2拒绝") + @NotNull(message = "审批状态不能为空") + private Integer auditStatus; + + @ApiModelProperty("备注") + private String remark; +} diff --git a/coolstore-partner-model/src/main/java/com/cool/store/request/tp/TpApplyQueryRequest.java b/coolstore-partner-model/src/main/java/com/cool/store/request/tp/TpApplyQueryRequest.java new file mode 100644 index 000000000..e832e6aff --- /dev/null +++ b/coolstore-partner-model/src/main/java/com/cool/store/request/tp/TpApplyQueryRequest.java @@ -0,0 +1,45 @@ +package com.cool.store.request.tp; + +import com.cool.store.common.PageBasicInfo; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +import java.math.BigDecimal; + +/** + *

+ * 申请单查询Request + *

+ * + * @author wangff + * @since 2025/11/6 + */ +@Data +public class TpApplyQueryRequest extends PageBasicInfo { + @ApiModelProperty("申请单号") + private String applyNo; + + @ApiModelProperty("门店名称或编码") + private String storeNameOrNum; + + @ApiModelProperty("项目大类") + private String projectCategory; + + @ApiModelProperty("规则id") + private String ruleId; + + @ApiModelProperty("状态") + private String status; + + @ApiModelProperty(value = "单据类型,0加分单 1警告书 2处罚书") + private Integer type; + + @ApiModelProperty("缴款状态,0未缴费 1无需缴费 2已缴费") + private Integer payStatus; + + @ApiModelProperty("分值") + private BigDecimal score; + + @ApiModelProperty(value = "是惩处单", hidden = true) + private Boolean isPenalty; +} diff --git a/coolstore-partner-model/src/main/java/com/cool/store/request/tp/TpApplyRequest.java b/coolstore-partner-model/src/main/java/com/cool/store/request/tp/TpApplyRequest.java new file mode 100644 index 000000000..51d46dea4 --- /dev/null +++ b/coolstore-partner-model/src/main/java/com/cool/store/request/tp/TpApplyRequest.java @@ -0,0 +1,49 @@ +package com.cool.store.request.tp; + +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +import javax.validation.constraints.NotBlank; +import javax.validation.constraints.NotNull; + +/** + *

+ * 奖惩申请Request + *

+ * + * @author wangff + * @since 2025/11/5 + */ +@Data +public class TpApplyRequest { + @ApiModelProperty("id") + private Long id; + + @ApiModelProperty("门店id") + @NotNull(message = "门店id不能为空") + private String storeId; + + @ApiModelProperty("规则id") + @NotNull(message = "规则id不能为空") + private Long ruleId; + + @ApiModelProperty("备注") + private String remark; + + @ApiModelProperty("是否为草稿 0否 1是") + @NotNull(message = "是否为草稿不能为空") + private Integer isDraft; + + @ApiModelProperty(value = "来源,0非小程序 1小程序", hidden = true) + private Integer source; + + @ApiModelProperty(value = "申请人id", hidden = true) + private String applyUserId; + + @ApiModelProperty(value = "申请人名称", hidden = true) + private String applyUserName; + + @ApiModelProperty("证明图片列表,逗号隔开") + @NotBlank(message = "证明图片列表不能为空") + private String proofUrls; +} diff --git a/coolstore-partner-model/src/main/java/com/cool/store/request/tp/TpPenaltyRuleUpdateRequest.java b/coolstore-partner-model/src/main/java/com/cool/store/request/tp/TpPenaltyRuleUpdateRequest.java index 4156d59ed..841a395d7 100644 --- a/coolstore-partner-model/src/main/java/com/cool/store/request/tp/TpPenaltyRuleUpdateRequest.java +++ b/coolstore-partner-model/src/main/java/com/cool/store/request/tp/TpPenaltyRuleUpdateRequest.java @@ -42,7 +42,7 @@ public class TpPenaltyRuleUpdateRequest { @ApiModelProperty("扣分值") @NotNull(message = "扣分值不能为空", groups = {InsertGroup.class, UpdateGroup.class}) - private BigDecimal point; + private BigDecimal score; @ApiModelProperty("罚款金额") @NotNull(message = "罚款金额不能为空", groups = {InsertGroup.class, UpdateGroup.class}) diff --git a/coolstore-partner-model/src/main/java/com/cool/store/request/tp/TpRewardRuleUpdateRequest.java b/coolstore-partner-model/src/main/java/com/cool/store/request/tp/TpRewardRuleUpdateRequest.java index ab91fc2fb..d80023ff9 100644 --- a/coolstore-partner-model/src/main/java/com/cool/store/request/tp/TpRewardRuleUpdateRequest.java +++ b/coolstore-partner-model/src/main/java/com/cool/store/request/tp/TpRewardRuleUpdateRequest.java @@ -37,7 +37,7 @@ public class TpRewardRuleUpdateRequest { private Integer isFull; @ApiModelProperty("加分值") - private BigDecimal point; + private BigDecimal score; @ApiModelProperty("启用状态,0未启用 1启用") @NotNull(message = "启用状态不能为空", groups = {InsertGroup.class, UpdateGroup.class}) diff --git a/coolstore-partner-model/src/main/java/com/cool/store/vo/tp/TpApplyListBaseVO.java b/coolstore-partner-model/src/main/java/com/cool/store/vo/tp/TpApplyListBaseVO.java new file mode 100644 index 000000000..e9b102144 --- /dev/null +++ b/coolstore-partner-model/src/main/java/com/cool/store/vo/tp/TpApplyListBaseVO.java @@ -0,0 +1,83 @@ +package com.cool.store.vo.tp; + +import com.cool.store.annotation.DictField; +import com.cool.store.enums.tp.TpFormStatusEnum; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +import java.math.BigDecimal; +import java.util.Date; + +/** + *

+ * 申请表单列表基础VO + *

+ * + * @author wangff + * @since 2025/11/6 + */ +@Data +public class TpApplyListBaseVO { + @ApiModelProperty("id") + private Long id; + + @ApiModelProperty("申请单号") + private String applyNo; + + @ApiModelProperty("规则id(项目类型)") + private Long ruleId; + + @ApiModelProperty("规则编码") + private String ruleNo; + + @ApiModelProperty("项目大类") + private String projectCategory; + + @ApiModelProperty("项目大类名称") + @DictField + private String projectCategoryName; + + @ApiModelProperty("分值") + private BigDecimal score; + + @ApiModelProperty("项目名称") + private String projectName; + + @ApiModelProperty("门店id") + private String storeId; + + @ApiModelProperty("门店编码") + private String storeNum; + + @ApiModelProperty("门店名称") + private String storeName; + + @ApiModelProperty("审批人") + private String approveUserId; + + @ApiModelProperty("审批人名称") + private String approveUserName; + + @ApiModelProperty("状态") + private String status; + + @ApiModelProperty("状态名称") + private String statusName; + + @ApiModelProperty("备注") + private String remark; + + @ApiModelProperty("申请人名称") + private String applyUserName; + + @ApiModelProperty("申请时间") + private Date createTime; + + @ApiModelProperty("审核时间") + private Date approveTime; + + public String getStatusName() { + return TpFormStatusEnum.getMsgByStatus(this.status); + } + +} diff --git a/coolstore-partner-model/src/main/java/com/cool/store/vo/tp/TpPenaltyApplyDetailVO.java b/coolstore-partner-model/src/main/java/com/cool/store/vo/tp/TpPenaltyApplyDetailVO.java new file mode 100644 index 000000000..0e81ab8d2 --- /dev/null +++ b/coolstore-partner-model/src/main/java/com/cool/store/vo/tp/TpPenaltyApplyDetailVO.java @@ -0,0 +1,79 @@ +package com.cool.store.vo.tp; + +import com.cool.store.annotation.DictField; +import com.cool.store.enums.tp.TpFormTypeEnum; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +import java.math.BigDecimal; +import java.time.LocalDate; + +/** + *

+ * 惩处申请详情VO + *

+ * + * @author wangff + * @since 2025/11/6 + */ +@Data +public class TpPenaltyApplyDetailVO { + @ApiModelProperty("id") + private Long id; + + @ApiModelProperty("申请单号") + private String applyNo; + + @ApiModelProperty("门店id") + private String storeId; + + @ApiModelProperty("门店编码") + private String storeNum; + + @ApiModelProperty("门店名称") + private String storeName; + + @ApiModelProperty("单据类型") + private Integer type; + + @ApiModelProperty("单据类型名称") + private String typeName; + + @ApiModelProperty("规则id(项目类型)") + private Long ruleId; + + @ApiModelProperty("项目大类") + private String projectCategory; + + @ApiModelProperty("项目大类名称") + @DictField + private String projectCategoryName; + + @ApiModelProperty("项目名称") + private String projectName; + + @ApiModelProperty("分值") + private BigDecimal score; + + @ApiModelProperty("金额") + private BigDecimal amount; + + @ApiModelProperty("申请复议截止日期") + private LocalDate appealEndDate; + + @ApiModelProperty("备注") + private String remark; + + @ApiModelProperty("是否为草稿 0否 1是") + private Integer isDraft; + + @ApiModelProperty("证明图片列表") + private String proofUrls; + + @ApiModelProperty("状态") + private String status; + + public String getTypeName() { + return TpFormTypeEnum.getMsgByType(this.type); + } +} diff --git a/coolstore-partner-model/src/main/java/com/cool/store/vo/tp/TpPenaltyApplyListVO.java b/coolstore-partner-model/src/main/java/com/cool/store/vo/tp/TpPenaltyApplyListVO.java new file mode 100644 index 000000000..b71ac95f4 --- /dev/null +++ b/coolstore-partner-model/src/main/java/com/cool/store/vo/tp/TpPenaltyApplyListVO.java @@ -0,0 +1,47 @@ +package com.cool.store.vo.tp; + +import com.cool.store.enums.tp.TpFormTypeEnum; +import com.cool.store.enums.tp.TpPayStatusEnum; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +import java.math.BigDecimal; +import java.time.LocalDate; + +/** + *

+ * 惩处申请单列表VO + *

+ * + * @author wangff + * @since 2025/11/6 + */ +@Data +public class TpPenaltyApplyListVO extends TpApplyListBaseVO { + + @ApiModelProperty("单据类型") + private Integer type; + + @ApiModelProperty("单据类型名称") + private String typeName; + + @ApiModelProperty("金额") + private BigDecimal amount; + + @ApiModelProperty("申请复议截止日期") + private LocalDate appealEndDate; + + @ApiModelProperty("缴费状态") + private Integer payStatus; + + @ApiModelProperty("缴费状态名称") + private String payStatusName; + + public String getTypeName() { + return TpFormTypeEnum.getMsgByType(this.type); + } + + public String getPayStatusName() { + return TpPayStatusEnum.getMsgByStatus(this.payStatus); + } +} diff --git a/coolstore-partner-model/src/main/java/com/cool/store/vo/tp/TpPenaltyRuleDetailVO.java b/coolstore-partner-model/src/main/java/com/cool/store/vo/tp/TpPenaltyRuleDetailVO.java index 4d955d746..b6ba3b59c 100644 --- a/coolstore-partner-model/src/main/java/com/cool/store/vo/tp/TpPenaltyRuleDetailVO.java +++ b/coolstore-partner-model/src/main/java/com/cool/store/vo/tp/TpPenaltyRuleDetailVO.java @@ -20,7 +20,7 @@ public class TpPenaltyRuleDetailVO { private Long id; @ApiModelProperty("规则编码") - private String ruleCode; + private String ruleNo; @ApiModelProperty("问题分类") private String problemClassification; @@ -43,7 +43,7 @@ public class TpPenaltyRuleDetailVO { private Integer warningLimit; @ApiModelProperty("扣分值") - private BigDecimal point; + private BigDecimal score; @ApiModelProperty("罚款金额") private BigDecimal amount; diff --git a/coolstore-partner-model/src/main/java/com/cool/store/vo/tp/TpPenaltyRuleListVO.java b/coolstore-partner-model/src/main/java/com/cool/store/vo/tp/TpPenaltyRuleListVO.java index 2b0c22079..b840d179a 100644 --- a/coolstore-partner-model/src/main/java/com/cool/store/vo/tp/TpPenaltyRuleListVO.java +++ b/coolstore-partner-model/src/main/java/com/cool/store/vo/tp/TpPenaltyRuleListVO.java @@ -20,7 +20,7 @@ public class TpPenaltyRuleListVO { private Long id; @ApiModelProperty("规则编码") - private String ruleCode; + private String ruleNo; @ApiModelProperty("问题分类") private String problemClassification; @@ -43,7 +43,7 @@ public class TpPenaltyRuleListVO { private Integer warningLimit; @ApiModelProperty("扣分值") - private BigDecimal point; + private BigDecimal score; @ApiModelProperty("罚款金额") private BigDecimal amount; diff --git a/coolstore-partner-model/src/main/java/com/cool/store/vo/tp/TpRewardApplyDetailVO.java b/coolstore-partner-model/src/main/java/com/cool/store/vo/tp/TpRewardApplyDetailVO.java new file mode 100644 index 000000000..012ab680e --- /dev/null +++ b/coolstore-partner-model/src/main/java/com/cool/store/vo/tp/TpRewardApplyDetailVO.java @@ -0,0 +1,64 @@ +package com.cool.store.vo.tp; + +import com.cool.store.annotation.DictField; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +import java.math.BigDecimal; + +/** + *

+ * 加分申请详情VO + *

+ * + * @author wangff + * @since 2025/11/6 + */ +@Data +public class TpRewardApplyDetailVO { + @ApiModelProperty("id") + private Long id; + + @ApiModelProperty("申请单号") + private String applyNo; + + @ApiModelProperty("门店id") + private String storeId; + + @ApiModelProperty("门店编码") + private String storeNum; + + @ApiModelProperty("门店名称") + private String storeName; + + @ApiModelProperty("规则id(项目类型)") + private Long ruleId; + + @ApiModelProperty("项目大类") + private String projectCategory; + + @ApiModelProperty("项目大类名称") + @DictField + private String projectCategoryName; + + @ApiModelProperty("项目名称") + private String projectName; + + @ApiModelProperty("是否加满") + private Integer isFull; + + @ApiModelProperty("分值") + private BigDecimal score; + + @ApiModelProperty("备注") + private String remark; + + @ApiModelProperty("是否为草稿 0否 1是") + private Integer isDraft; + + @ApiModelProperty("证明图片列表") + private String proofUrls; + + @ApiModelProperty("状态") + private String status; +} diff --git a/coolstore-partner-model/src/main/java/com/cool/store/vo/tp/TpRewardApplyListVO.java b/coolstore-partner-model/src/main/java/com/cool/store/vo/tp/TpRewardApplyListVO.java new file mode 100644 index 000000000..cafe4c86b --- /dev/null +++ b/coolstore-partner-model/src/main/java/com/cool/store/vo/tp/TpRewardApplyListVO.java @@ -0,0 +1,16 @@ +package com.cool.store.vo.tp; + +import lombok.Data; + +/** + *

+ * 加分申请单列表VO + *

+ * + * @author wangff + * @since 2025/11/6 + */ +@Data +public class TpRewardApplyListVO extends TpApplyListBaseVO { + +} diff --git a/coolstore-partner-model/src/main/java/com/cool/store/vo/tp/TpRewardRuleDetailVO.java b/coolstore-partner-model/src/main/java/com/cool/store/vo/tp/TpRewardRuleDetailVO.java index a0c21da2d..115e1e2cd 100644 --- a/coolstore-partner-model/src/main/java/com/cool/store/vo/tp/TpRewardRuleDetailVO.java +++ b/coolstore-partner-model/src/main/java/com/cool/store/vo/tp/TpRewardRuleDetailVO.java @@ -20,7 +20,7 @@ public class TpRewardRuleDetailVO { private Long id; @ApiModelProperty("规则编码") - private String ruleCode; + private String ruleNo; @ApiModelProperty("项目大类") private String projectCategory; @@ -36,7 +36,7 @@ public class TpRewardRuleDetailVO { private Integer isFull; @ApiModelProperty("加分值") - private BigDecimal point; + private BigDecimal score; @ApiModelProperty("启用状态,0未启用 1启用") private Integer status; diff --git a/coolstore-partner-service/src/main/java/com/cool/store/service/tp/TpApplyService.java b/coolstore-partner-service/src/main/java/com/cool/store/service/tp/TpApplyService.java new file mode 100644 index 000000000..b37851678 --- /dev/null +++ b/coolstore-partner-service/src/main/java/com/cool/store/service/tp/TpApplyService.java @@ -0,0 +1,77 @@ +package com.cool.store.service.tp; + +import com.cool.store.request.tp.TpApplyAuditRequest; +import com.cool.store.request.tp.TpApplyQueryRequest; +import com.cool.store.request.tp.TpApplyRequest; +import com.cool.store.vo.tp.TpPenaltyApplyDetailVO; +import com.cool.store.vo.tp.TpPenaltyApplyListVO; +import com.cool.store.vo.tp.TpRewardApplyDetailVO; +import com.cool.store.vo.tp.TpRewardApplyListVO; +import com.github.pagehelper.PageInfo; + +/** + *

+ * 十二分制-申请单 服务类 + *

+ * + * @author wangff + * @since 2025/11/5 + */ +public interface TpApplyService { + + /** + * 加分申请提交 + * @param request 奖惩申请Request + * @return 是否成功 + */ + Boolean rewardApplySubmit(TpApplyRequest request); + + /** + * 加分申请单详情 + * @param applyId 申请单id + * @return 加分申请详情VO + */ + TpRewardApplyDetailVO rewardDetail(Long applyId); + + /** + * 加分申请单分页查询 + * @param request 申请单查询Request + * @return 加分申请单VO列表 + */ + PageInfo rewardPage(TpApplyQueryRequest request); + + /** + * 扣分申请提交 + * @param request 奖惩申请Request + * @return 是否成功 + */ + Boolean penaltyApplySubmit(TpApplyRequest request); + + /** + * 惩处申请单详情 + * @param applyId 申请单id + * @return 惩处申请详情VO + */ + TpPenaltyApplyDetailVO penaltyDetail(Long applyId); + + /** + * 惩处申请单分页查询 + * @param request 申请单查询Request + * @return 惩处申请单列表VO列表 + */ + PageInfo penaltyPage(TpApplyQueryRequest request); + + /** + * 加分申请审批 + * @param request 申请单审批Request + * @return 是否成功 + */ + Boolean rewardAudit(TpApplyAuditRequest request); + + /** + * 惩处申请审批 + * @param request 申请单审批Request + * @return 是否成功 + */ + Boolean penaltyAudit(TpApplyAuditRequest request); +} diff --git a/coolstore-partner-service/src/main/java/com/cool/store/service/tp/impl/TpApplyServiceImpl.java b/coolstore-partner-service/src/main/java/com/cool/store/service/tp/impl/TpApplyServiceImpl.java new file mode 100644 index 000000000..61af644b6 --- /dev/null +++ b/coolstore-partner-service/src/main/java/com/cool/store/service/tp/impl/TpApplyServiceImpl.java @@ -0,0 +1,283 @@ +package com.cool.store.service.tp.impl; + +import cn.hutool.core.collection.CollStreamUtil; +import com.cool.store.constants.CommonConstants; +import com.cool.store.context.CurrentUserHolder; +import com.cool.store.context.LoginUserInfo; +import com.cool.store.dao.EnterpriseUserDAO; +import com.cool.store.dao.StoreDao; +import com.cool.store.dao.tp.TpApplyFormDAO; +import com.cool.store.dao.tp.TpAuditRecordDAO; +import com.cool.store.dao.tp.TpRuleDAO; +import com.cool.store.dao.tp.TpScoreJournalDAO; +import com.cool.store.entity.StoreDO; +import com.cool.store.entity.tp.TpApplyFormDO; +import com.cool.store.entity.tp.TpRuleDO; +import com.cool.store.entity.tp.TpScoreJournalDO; +import com.cool.store.enums.ErrorCodeEnum; +import com.cool.store.enums.tp.TpFormStatusEnum; +import com.cool.store.enums.tp.TpFormTypeEnum; +import com.cool.store.enums.tp.TpPayStatusEnum; +import com.cool.store.exception.ServiceException; +import com.cool.store.request.tp.TpApplyAuditRequest; +import com.cool.store.request.tp.TpApplyQueryRequest; +import com.cool.store.request.tp.TpApplyRequest; +import com.cool.store.service.dict.impl.DictService; +import com.cool.store.service.tp.TpApplyService; +import com.cool.store.utils.BeanUtil; +import com.cool.store.utils.TpHelper; +import com.cool.store.vo.tp.*; +import com.github.pagehelper.PageHelper; +import com.github.pagehelper.PageInfo; +import lombok.RequiredArgsConstructor; +import lombok.extern.slf4j.Slf4j; +import org.apache.commons.collections4.CollectionUtils; +import org.springframework.stereotype.Service; +import org.springframework.transaction.annotation.Transactional; + +import java.math.BigDecimal; +import java.math.RoundingMode; +import java.time.LocalDate; +import java.util.*; + +/** + *

+ * 十二分制-申请单 服务实现类 + *

+ * + * @author wangff + * @since 2025/11/5 + */ +@Service +@RequiredArgsConstructor +@Slf4j +public class TpApplyServiceImpl implements TpApplyService { + + private final TpRuleDAO tpRuleDAO; + private final TpApplyFormDAO tpApplyFormDAO; + private final StoreDao storeDao; + private final TpAuditRecordDAO tpAuditRecordDAO; + private final DictService dictService; + private final TpScoreJournalDAO tpScoreJournalDAO; + private final EnterpriseUserDAO enterpriseUserDAO; + + @Override + @Transactional + public Boolean rewardApplySubmit(TpApplyRequest request) { + // 1.每个门店一个月内相同加分项仅能申请一次 + // 2.门店分值=12时,所有加分项不允许申请 + boolean isDraft = CommonConstants.INDEX_ONE.equals(request.getIsDraft()); + if (!isDraft && tpApplyFormDAO.existPassRewardForm(request.getStoreId(), request.getRuleId())) { + throw new ServiceException(ErrorCodeEnum.TP_MONTH_EXIST_APPLY); + } + if (!isDraft && tpApplyFormDAO.existsPendingApply(request.getStoreId(), request.getRuleId(), true)) { + throw new ServiceException(ErrorCodeEnum.TP_EXISTS_PENDING_APPLY); + } + BigDecimal score = storeDao.getStoreScore(request.getStoreId()); + if (!isDraft && BigDecimal.valueOf(12.0).compareTo(score.setScale(1, RoundingMode.DOWN)) == 0) { + throw new ServiceException(ErrorCodeEnum.TP_SCORE_EQUAL_TWELVE); + } + TpApplyFormDO formDO = BeanUtil.toBean(request, TpApplyFormDO.class); + boolean isInsert = Objects.isNull(request.getId()); + if (isInsert) { + formDO.setApplyNo(TpHelper.generateApplyNo(TpFormTypeEnum.REWARD.getType())); + formDO.setType(TpFormTypeEnum.REWARD.getType()); + formDO.setStatus(TpFormStatusEnum.PENDING.getStatus()); + formDO.setPayStatus(TpPayStatusEnum.NO_NEED_PAY.getStatus()); + } + fillRuleFields(formDO); + tpApplyFormDAO.insertOrUpdate(formDO); + // 第一次提交后添加审批记录 + if (isInsert && !isDraft) { + tpAuditRecordDAO.addRecord(formDO.getId(), TpFormTypeEnum.REWARD.getType(), request.getApplyUserId(), request.getApplyUserName()); + } + return true; + } + + @Override + public TpRewardApplyDetailVO rewardDetail(Long applyId) { + TpApplyFormDO formDO = tpApplyFormDAO.getById(applyId); + if (Objects.nonNull(formDO)) { + TpRewardApplyDetailVO vo = BeanUtil.toBean(formDO, TpRewardApplyDetailVO.class); + dictService.fillDictField(vo); + StoreDO storeDO = storeDao.getByStoreId(vo.getStoreId()); + if (Objects.nonNull(storeDO)) { + vo.setStoreNum(storeDO.getStoreNum()); + vo.setStoreName(storeDO.getStoreName()); + } + return vo; + } + return null; + } + + @Override + public PageInfo rewardPage(TpApplyQueryRequest request) { + PageHelper.startPage(request.getPageNum(), request.getPageSize()); + List list = tpApplyFormDAO.getEffectiveList(request); + PageInfo page = new PageInfo<>(list); + PageInfo newPage = BeanUtil.toPage(page, TpRewardApplyListVO.class); + fillListFields(newPage.getList()); + return newPage; + } + + @Override + @Transactional + public Boolean penaltyApplySubmit(TpApplyRequest request) { + TpApplyFormDO formDO = BeanUtil.toBean(request, TpApplyFormDO.class); + // 如果存在审批中的申请,则不允许再次提交 + boolean isDraft = CommonConstants.INDEX_ONE.equals(request.getIsDraft()); + if (!isDraft && tpApplyFormDAO.existsPendingApply(request.getStoreId(), request.getRuleId(), false)) { + throw new ServiceException(ErrorCodeEnum.TP_EXISTS_PENDING_APPLY); + } + boolean isInsert = Objects.isNull(request.getId()); + fillRuleFields(formDO); + if (isInsert) { + formDO.setApplyNo(TpHelper.generateApplyNo(formDO.getType())); + formDO.setStatus(TpFormStatusEnum.PENDING.getStatus()); + } + tpApplyFormDAO.insertOrUpdate(formDO); + // 第一次提交后添加审批记录 + if (isInsert && !isDraft) { + tpAuditRecordDAO.addRecord(formDO.getId(), TpFormTypeEnum.PENALTY.getType(), request.getApplyUserId(), request.getApplyUserName()); + } + return true; + } + + @Override + public TpPenaltyApplyDetailVO penaltyDetail(Long applyId) { + TpApplyFormDO formDO = tpApplyFormDAO.getById(applyId); + if (Objects.nonNull(formDO)) { + TpPenaltyApplyDetailVO vo = BeanUtil.toBean(formDO, TpPenaltyApplyDetailVO.class); + dictService.fillDictField(vo); + StoreDO storeDO = storeDao.getByStoreId(vo.getStoreId()); + if (Objects.nonNull(storeDO)) { + vo.setStoreNum(storeDO.getStoreNum()); + vo.setStoreName(storeDO.getStoreName()); + } + return vo; + } + return null; + } + + @Override + public PageInfo penaltyPage(TpApplyQueryRequest request) { + request.setIsPenalty(true); + PageHelper.startPage(request.getPageNum(), request.getPageSize()); + List list = tpApplyFormDAO.getEffectiveList(request); + PageInfo page = new PageInfo<>(list); + PageInfo newPage = BeanUtil.toPage(page, TpPenaltyApplyListVO.class); + fillListFields(newPage.getList()); + return newPage; + } + + @Override + @Transactional + public Boolean rewardAudit(TpApplyAuditRequest request) { + TpApplyFormDO formDO = tpApplyFormDAO.getById(request.getApplyId()); + if (Objects.isNull(formDO)) { + throw new ServiceException(ErrorCodeEnum.TP_NOT_EXIST_APPLY_FORM); + } + if (!TpFormStatusEnum.PENDING.getStatus().equals(formDO.getStatus())) { + throw new ServiceException(ErrorCodeEnum.TP_APPLY_AUDIT_COMPLETED); + } + if (tpApplyFormDAO.existPassRewardForm(formDO.getStoreId(), formDO.getRuleId())) { + throw new ServiceException(ErrorCodeEnum.TP_MONTH_EXIST_APPLY); + } + Date now = new Date(); + // 修改申请单审批数据 + formDO.setStatus(CommonConstants.INDEX_ONE.equals(request.getAuditStatus()) ? TpFormStatusEnum.PASS.getStatus() : TpFormStatusEnum.REJECT.getStatus()); + formDO.setApproveTime(now); + tpApplyFormDAO.updateSelective(formDO); + LoginUserInfo user = CurrentUserHolder.getUser(); + // 处理审批记录 + tpAuditRecordDAO.auditPendingRecordByApplyId(request.getApplyId(), request.getApplyType(), user.getUserId(), user.getName(), request.getAuditStatus(), request.getRemark(), now); + // 审批通过后门店积分变动 + scoreChange(formDO); + return null; + } + + @Override + public Boolean penaltyAudit(TpApplyAuditRequest request) { + return null; + } + + /** + * 门店积分变动 + */ + private void scoreChange(TpApplyFormDO formDO) { + if (TpFormStatusEnum.PASS.getStatus().equals(formDO.getStatus())) { + BigDecimal occurBeforeScore = storeDao.getStoreScore(formDO.getStoreId()); + BigDecimal occurAfterScore = null; + String occurScore = ""; + if (TpFormTypeEnum.REWARD.getType().equals(formDO.getType())) { + // 加分 + if (CommonConstants.INDEX_ONE.equals(formDO.getIsFull())) { + occurAfterScore = BigDecimal.valueOf(12.0); + occurScore = "加满"; + } else { + occurAfterScore = occurBeforeScore.add(formDO.getScore()); + occurScore = "+" + formDO.getScore().toString(); + } + } else if (TpFormTypeEnum.PENALTY.getType().equals(formDO.getType())) { + occurAfterScore = occurBeforeScore.subtract(formDO.getScore()); + occurScore = "-" + formDO.getScore().toString(); + } + // 修改门店积分 + if (Objects.nonNull(occurAfterScore)) { + storeDao.updateStoreScore(formDO.getStoreId(), occurAfterScore); + } + StoreDO storeDO = storeDao.getEffectiveByStoreId(formDO.getStoreId()); + if (Objects.isNull(storeDO)) { + throw new ServiceException(ErrorCodeEnum.STORE_NOT_FIND); + } + // 添加积分流水 + tpScoreJournalDAO.insertSelective(new TpScoreJournalDO(storeDO, formDO, occurScore, occurBeforeScore, occurAfterScore)); + } + } + + /** + * 填充规则相关字段 + */ + private void fillRuleFields(TpApplyFormDO formDO) { + TpRuleDO ruleDO = tpRuleDAO.getById(formDO.getRuleId()); + if (Objects.isNull(ruleDO)) { + throw new ServiceException(ErrorCodeEnum.TP_NOT_EXIST_RULE); + } + formDO.setRuleNo(ruleDO.getRuleNo()); + formDO.setProblemClassification(ruleDO.getProblemClassification()); + formDO.setProjectCategory(ruleDO.getProjectCategory()); + formDO.setProjectName(ruleDO.getProjectName()); + formDO.setIsFull(ruleDO.getIsFull()); + formDO.setScore(ruleDO.getScore()); + formDO.setAmount(ruleDO.getAmount()); + formDO.setAppealEndDate(LocalDate.now().plusDays(ruleDO.getAppealDeadline())); + if (CommonConstants.INDEX_ZERO.equals(ruleDO.getType())) { + // 如果是扣分规则,判断警告次数 + int penaltyCount = tpApplyFormDAO.getPenaltyCount(formDO.getStoreId(), formDO.getRuleId()); + formDO.setType(ruleDO.getWarningLimit().compareTo(penaltyCount) <= 0 ? TpFormTypeEnum.PENALTY.getType() : TpFormTypeEnum.WARNING.getType()); + // 是否缴费 + formDO.setPayStatus(Objects.nonNull(ruleDO.getAmount()) && BigDecimal.ZERO.compareTo(ruleDO.getAmount()) < 0 ? TpPayStatusEnum.UNPAID.getStatus() : TpPayStatusEnum.NO_NEED_PAY.getStatus()); + } + } + + /** + * 填充列表相关字段 + */ + private void fillListFields(List list) { + if (CollectionUtils.isNotEmpty(list)) return; + dictService.fillDictField(list); + Set storeIds = CollStreamUtil.toSet(list, TpApplyListBaseVO::getStoreId); + Set approveUserIds = CollStreamUtil.toSet(list, TpApplyListBaseVO::getApproveUserId); + Map storeMap = storeDao.getStoreMapByStoreIds(new ArrayList<>(storeIds)); + Map userNameMap = enterpriseUserDAO.getUserNameMap(new ArrayList<>(approveUserIds)); + for (TpApplyListBaseVO vo : list) { + StoreDO storeDO = storeMap.get(vo.getStoreId()); + if (Objects.nonNull(storeDO)) { + vo.setStoreName(storeDO.getStoreName()); + vo.setStoreNum(storeDO.getStoreNum()); + } + vo.setApproveUserName(userNameMap.get(vo.getApproveUserId())); + } + } + +} diff --git a/coolstore-partner-service/src/main/java/com/cool/store/service/tp/impl/TpRuleServiceImpl.java b/coolstore-partner-service/src/main/java/com/cool/store/service/tp/impl/TpRuleServiceImpl.java index 60bba6d25..6e34280cb 100644 --- a/coolstore-partner-service/src/main/java/com/cool/store/service/tp/impl/TpRuleServiceImpl.java +++ b/coolstore-partner-service/src/main/java/com/cool/store/service/tp/impl/TpRuleServiceImpl.java @@ -37,7 +37,7 @@ public class TpRuleServiceImpl implements TpRuleService { @Override public Boolean insertPenaltyRule(TpPenaltyRuleUpdateRequest request) { TpRuleDO tpRuleDO = BeanUtil.toBean(request, TpRuleDO.class); - tpRuleDO.setRuleCode(TpHelper.generatePenaltyRuleCode()); + tpRuleDO.setRuleNo(TpHelper.generateRuleNo(false)); tpRuleDO.setType(0); return tpRuleDAO.insertSelective(tpRuleDO); } @@ -72,7 +72,7 @@ public class TpRuleServiceImpl implements TpRuleService { @Override public Boolean insertRewardRule(TpRewardRuleUpdateRequest request) { TpRuleDO tpRuleDO = BeanUtil.toBean(request, TpRuleDO.class); - tpRuleDO.setRuleCode(TpHelper.generateRewardRuleCode()); + tpRuleDO.setRuleNo(TpHelper.generateRuleNo(true)); tpRuleDO.setType(1); return tpRuleDAO.insertSelective(tpRuleDO); } diff --git a/coolstore-partner-web/src/main/java/com/cool/store/controller/webb/TpApplyController.java b/coolstore-partner-web/src/main/java/com/cool/store/controller/webb/TpApplyController.java new file mode 100644 index 000000000..66a264ff7 --- /dev/null +++ b/coolstore-partner-web/src/main/java/com/cool/store/controller/webb/TpApplyController.java @@ -0,0 +1,68 @@ +package com.cool.store.controller.webb; + +import com.cool.store.context.CurrentUserHolder; +import com.cool.store.context.LoginUserInfo; +import com.cool.store.enums.tp.TpFormTypeEnum; +import com.cool.store.request.tp.TpApplyAuditRequest; +import com.cool.store.request.tp.TpApplyQueryRequest; +import com.cool.store.request.tp.TpApplyRequest; +import com.cool.store.response.ResponseResult; +import com.cool.store.service.tp.TpApplyService; +import com.cool.store.vo.tp.TpRewardApplyDetailVO; +import com.cool.store.vo.tp.TpRewardApplyListVO; +import com.github.pagehelper.PageInfo; +import io.swagger.annotations.Api; +import io.swagger.annotations.ApiImplicitParam; +import io.swagger.annotations.ApiOperation; +import lombok.RequiredArgsConstructor; +import org.springframework.validation.annotation.Validated; +import org.springframework.web.bind.annotation.*; + +import javax.validation.constraints.NotNull; + +/** + *

+ * 十二分制-申请单 前端控制器 + *

+ * + * @author wangff + * @since 2025/11/6 + */ +@Api(tags = "十二分制-奖惩规则") +@RestController +@RequestMapping("/pc/tp/apply") +@RequiredArgsConstructor +public class TpApplyController { + private final TpApplyService tpApplyService; + + @ApiOperation("加分申请提交or保存") + @PostMapping("/rewardApplySubmit") + public ResponseResult rewardApplySubmit(@RequestBody @Validated TpApplyRequest request) { + LoginUserInfo user = CurrentUserHolder.getUser(); + request.setSource(0); + request.setApplyUserId(user.getUserId()); + request.setApplyUserName(user.getName()); + return ResponseResult.success(tpApplyService.rewardApplySubmit(request)); + } + + @ApiOperation("加分申请单详情") + @GetMapping("/rewardDetail") + @ApiImplicitParam(name = "applyId", value = "加分申请单id", required = true, dataType = "Long", paramType = "query") + public ResponseResult rewardDetail(@NotNull(message = "加分申请单id不能为空") Long applyId) { + return ResponseResult.success(tpApplyService.rewardDetail(applyId)); + } + + @ApiOperation("加分申请单分页查询") + @GetMapping("/rewardPage") + public ResponseResult > rewardPage(TpApplyQueryRequest request) { + request.setType(TpFormTypeEnum.REWARD.getType()); + return ResponseResult.success(tpApplyService.rewardPage(request)); + } + + @ApiOperation("加分申请审批") + @PostMapping("/rewardAudit") + public ResponseResult rewardAudit(@RequestBody @Validated TpApplyAuditRequest request) { + request.setApplyType(TpFormTypeEnum.REWARD.getType()); + return ResponseResult.success(tpApplyService.rewardAudit(request)); + } +} From bd64b33ebb6b729b156bd1d01a6d5973da16926f Mon Sep 17 00:00:00 2001 From: wangff Date: Mon, 10 Nov 2025 14:20:44 +0800 Subject: [PATCH 05/10] =?UTF-8?q?fix:=E5=8D=81=E4=BA=8C=E5=88=86=E5=88=B6-?= =?UTF-8?q?=E7=94=B3=E8=AF=B7=E5=8D=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../com/cool/store/enums/ErrorCodeEnum.java | 1 + .../cool/store/enums/tp/TpFormTypeEnum.java | 8 + .../java/com/cool/store/utils/TpHelper.java | 7 + .../com/cool/store/dao/tp/TpApplyFormDAO.java | 40 +++++ .../store/mapper/tp/TpAppealFormMapper.java | 7 - .../mapper/tp/TpAppealFormMapper.xml | 27 ---- .../resources/mapper/tp/TpApplyFormMapper.xml | 11 +- .../cool/store/entity/tp/TpAppealFormDO.java | 123 -------------- .../cool/store/entity/tp/TpApplyFormDO.java | 34 +++- .../request/tp/TpAppealApplyRequest.java | 63 ++++++++ .../store/request/tp/TpApplyAuditRequest.java | 3 - .../store/request/tp/TpApplyQueryRequest.java | 3 + .../cool/store/request/tp/TpApplyRequest.java | 15 +- .../store/vo/tp/TpAppealFormDetailVO.java | 59 +++++++ .../com/cool/store/vo/tp/TpAppealListVO.java | 38 +++++ .../cool/store/vo/tp/TpApplyListBaseVO.java | 2 +- .../cool/store/service/tp/TpApplyService.java | 34 +++- .../service/tp/impl/TpApplyServiceImpl.java | 152 +++++++++++++++--- .../controller/webb/TpApplyController.java | 68 +++++++- 19 files changed, 496 insertions(+), 199 deletions(-) delete mode 100644 coolstore-partner-dao/src/main/java/com/cool/store/mapper/tp/TpAppealFormMapper.java delete mode 100644 coolstore-partner-dao/src/main/resources/mapper/tp/TpAppealFormMapper.xml delete mode 100644 coolstore-partner-model/src/main/java/com/cool/store/entity/tp/TpAppealFormDO.java create mode 100644 coolstore-partner-model/src/main/java/com/cool/store/request/tp/TpAppealApplyRequest.java create mode 100644 coolstore-partner-model/src/main/java/com/cool/store/vo/tp/TpAppealFormDetailVO.java create mode 100644 coolstore-partner-model/src/main/java/com/cool/store/vo/tp/TpAppealListVO.java diff --git a/coolstore-partner-common/src/main/java/com/cool/store/enums/ErrorCodeEnum.java b/coolstore-partner-common/src/main/java/com/cool/store/enums/ErrorCodeEnum.java index 9fda6f917..62b8b194e 100644 --- a/coolstore-partner-common/src/main/java/com/cool/store/enums/ErrorCodeEnum.java +++ b/coolstore-partner-common/src/main/java/com/cool/store/enums/ErrorCodeEnum.java @@ -325,6 +325,7 @@ public enum ErrorCodeEnum { TP_NOT_EXIST_APPLY_FORM(1810004, "不存在申请单", null), TP_APPLY_AUDIT_COMPLETED(1810005, "该申请单已审批", null), TP_EXISTS_PENDING_APPLY(1810006, "存在待审批的申请单", null), + TP_PENALTY_APPLY_APPEAL_COMPLETED(1810007, "该处罚单已完成复议", null), ; diff --git a/coolstore-partner-common/src/main/java/com/cool/store/enums/tp/TpFormTypeEnum.java b/coolstore-partner-common/src/main/java/com/cool/store/enums/tp/TpFormTypeEnum.java index 695f035dc..3f62a2dec 100644 --- a/coolstore-partner-common/src/main/java/com/cool/store/enums/tp/TpFormTypeEnum.java +++ b/coolstore-partner-common/src/main/java/com/cool/store/enums/tp/TpFormTypeEnum.java @@ -18,6 +18,7 @@ public enum TpFormTypeEnum { REWARD(0, "加分申请单"), WARNING(1, "警告书"), PENALTY(2, "处罚书"), + APPEAL(3, "复议申请单"), ; private final Integer type; @@ -41,4 +42,11 @@ public enum TpFormTypeEnum { } return null; } + + /** + * 是惩处单 + */ + public static boolean isPenalty(Integer type) { + return PENALTY.getType().equals(type) || WARNING.getType().equals(type); + } } diff --git a/coolstore-partner-common/src/main/java/com/cool/store/utils/TpHelper.java b/coolstore-partner-common/src/main/java/com/cool/store/utils/TpHelper.java index f9c911e07..31a742437 100644 --- a/coolstore-partner-common/src/main/java/com/cool/store/utils/TpHelper.java +++ b/coolstore-partner-common/src/main/java/com/cool/store/utils/TpHelper.java @@ -43,6 +43,13 @@ public class TpHelper { return (TpFormTypeEnum.REWARD.equals(type) ? "JF" : TpFormTypeEnum.PENALTY.equals(type) ? "CF" : "JG") + generateCode(); } + /** + * 生成复议申请单号 + */ + public static String generateAppealNo() { + return "FY" + generateCode(); + } + private static String generateCode() { return LocalDateTime.now().format(dtf) + ((int) (Math.random() * 900) + 100); } diff --git a/coolstore-partner-dao/src/main/java/com/cool/store/dao/tp/TpApplyFormDAO.java b/coolstore-partner-dao/src/main/java/com/cool/store/dao/tp/TpApplyFormDAO.java index b3e70628a..cb5937e7a 100644 --- a/coolstore-partner-dao/src/main/java/com/cool/store/dao/tp/TpApplyFormDAO.java +++ b/coolstore-partner-dao/src/main/java/com/cool/store/dao/tp/TpApplyFormDAO.java @@ -1,5 +1,6 @@ package com.cool.store.dao.tp; +import com.alibaba.excel.util.CollectionUtils; import com.cool.store.entity.tp.TpApplyFormDO; import com.cool.store.enums.tp.TpFormStatusEnum; import com.cool.store.enums.tp.TpFormTypeEnum; @@ -11,6 +12,7 @@ import tk.mybatis.mapper.entity.Example; import java.time.LocalDate; import java.util.Arrays; +import java.util.Collections; import java.util.List; import java.util.Objects; @@ -73,6 +75,13 @@ public class TpApplyFormDAO { return tpApplyFormMapper.selectByPrimaryKey(id); } + /** + * 根据id查询有效申请单 + */ + public TpApplyFormDO getEffectiveById(Long id) { + return tpApplyFormMapper.selectOne(TpApplyFormDO.builder().id(id).deleted(0).build()); + } + /** * 查询有效记录列表 * @param request 申请单查询Request @@ -118,4 +127,35 @@ public class TpApplyFormDAO { } return tpApplyFormMapper.selectCountByExample(example) > 0; } + + /** + * 根据处罚单id查询申请单 + * @param penaltyId 处罚单id + * @return 申请单 + */ + public TpApplyFormDO getByPenaltyId(Long penaltyId) { + return tpApplyFormMapper.selectOne(TpApplyFormDO.builder().penaltyId(penaltyId).deleted(0).build()); + } + + /** + * 根据id列表查询 + */ + public List getByIds(List ids) { + if (CollectionUtils.isEmpty(ids)) { + return Collections.emptyList(); + } + Example example = new Example(TpApplyFormDO.class); + example.createCriteria().andIn("id", ids); + return tpApplyFormMapper.selectByExample(example); + } + + /** + * 申请单作废 + * @param applyId 申请单id + */ + public void cancelApply(Long applyId) { + Example example = new Example(TpApplyFormDO.class); + example.createCriteria().andEqualTo("id", applyId).andEqualTo("deleted", 0); + tpApplyFormMapper.updateByExampleSelective(TpApplyFormDO.builder().status(TpFormStatusEnum.CANCEL.getStatus()).build(), example); + } } diff --git a/coolstore-partner-dao/src/main/java/com/cool/store/mapper/tp/TpAppealFormMapper.java b/coolstore-partner-dao/src/main/java/com/cool/store/mapper/tp/TpAppealFormMapper.java deleted file mode 100644 index 6104bef94..000000000 --- a/coolstore-partner-dao/src/main/java/com/cool/store/mapper/tp/TpAppealFormMapper.java +++ /dev/null @@ -1,7 +0,0 @@ -package com.cool.store.mapper.tp; - -import com.cool.store.entity.tp.TpAppealFormDO; -import tk.mybatis.mapper.common.Mapper; - -public interface TpAppealFormMapper extends Mapper { -} \ No newline at end of file diff --git a/coolstore-partner-dao/src/main/resources/mapper/tp/TpAppealFormMapper.xml b/coolstore-partner-dao/src/main/resources/mapper/tp/TpAppealFormMapper.xml deleted file mode 100644 index bdeae3a11..000000000 --- a/coolstore-partner-dao/src/main/resources/mapper/tp/TpAppealFormMapper.xml +++ /dev/null @@ -1,27 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - \ No newline at end of file diff --git a/coolstore-partner-dao/src/main/resources/mapper/tp/TpApplyFormMapper.xml b/coolstore-partner-dao/src/main/resources/mapper/tp/TpApplyFormMapper.xml index c618c1544..5a88744a9 100644 --- a/coolstore-partner-dao/src/main/resources/mapper/tp/TpApplyFormMapper.xml +++ b/coolstore-partner-dao/src/main/resources/mapper/tp/TpApplyFormMapper.xml @@ -31,12 +31,18 @@ + + + + + id, type, apply_no, store_id, rule_id, rule_no, problem_classification, project_category, project_name, is_full, score, remark, amount, appeal_end_date, status, pay_status, is_draft, source, apply_user_id, - apply_user_name, approve_user_id, approve_time, create_time, update_time, deleted, proof_urls + apply_user_name, approve_user_id, approve_time, create_time, update_time, deleted, proof_urls, + penalty_id, applicant_name, phone, appeal_reason, appeal_detail_reason diff --git a/coolstore-partner-model/src/main/java/com/cool/store/entity/tp/TpAppealFormDO.java b/coolstore-partner-model/src/main/java/com/cool/store/entity/tp/TpAppealFormDO.java deleted file mode 100644 index 51450546a..000000000 --- a/coolstore-partner-model/src/main/java/com/cool/store/entity/tp/TpAppealFormDO.java +++ /dev/null @@ -1,123 +0,0 @@ -package com.cool.store.entity.tp; - -import lombok.Data; - -import java.util.Date; -import javax.persistence.*; - -/** - *

- * 十二分制-复议申请单 - *

- * - * @author wangff - * @since 2025/11/4 - */ -@Table(name = "zxjp_tp_appeal_form") -@Data -public class TpAppealFormDO { - /** - * id - */ - @Id - @GeneratedValue(strategy = GenerationType.IDENTITY) - private Long id; - - /** - * 申请单号 - */ - @Column(name = "apply_no") - private String applyNo; - - /** - * 处罚单id - */ - @Column(name = "punish_id") - private Long punishId; - - /** - * 门店id - */ - @Column(name = "store_id") - private String storeId; - - /** - * 申请人姓名 - */ - @Column(name = "applicant_name") - private String applicantName; - - /** - * 联系电话 - */ - private String phone; - - /** - * 复议理由 - */ - @Column(name = "appeal_reason") - private String appealReason; - - /** - * 详细理由 - */ - @Column(name = "detail_reason") - private String detailReason; - - /** - * 状态 - */ - private Integer status; - - /** - * 来源,0非小程序 1小程序 - */ - private Integer source; - - /** - * 审批人id - */ - @Column(name = "approve_user_id") - private String approveUserId; - - /** - * 审批时间 - */ - @Column(name = "approve_time") - private Date approveTime; - - /** - * 是否为草稿 0否 1是 - */ - @Column(name = "is_draft") - private Integer isDraft; - - /** - * 创建人id - */ - @Column(name = "create_user_id") - private String createUserId; - - /** - * 创建时间 - */ - @Column(name = "create_time") - private Date createTime; - - /** - * 更新时间 - */ - @Column(name = "update_time") - private Date updateTime; - - /** - * 是否删除 0否1是 - */ - private Integer deleted; - - /** - * 证明图片列表 - */ - @Column(name = "proof_urls") - private String proofUrls; -} \ No newline at end of file diff --git a/coolstore-partner-model/src/main/java/com/cool/store/entity/tp/TpApplyFormDO.java b/coolstore-partner-model/src/main/java/com/cool/store/entity/tp/TpApplyFormDO.java index 669997010..2e244dd1e 100644 --- a/coolstore-partner-model/src/main/java/com/cool/store/entity/tp/TpApplyFormDO.java +++ b/coolstore-partner-model/src/main/java/com/cool/store/entity/tp/TpApplyFormDO.java @@ -129,13 +129,13 @@ public class TpApplyFormDO { private Integer source; /** - * 申请人id + * 申请人(创建人)id */ @Column(name = "apply_user_id") private String applyUserId; /** - * 申请人名称 + * 申请人(创建人)名称 */ @Column(name = "apply_user_name") private String applyUserName; @@ -174,4 +174,34 @@ public class TpApplyFormDO { */ @Column(name = "proof_urls") private String proofUrls; + + /** + * 处罚单id + */ + @Column(name = "penalty_id") + private Long penaltyId; + + /** + * 申请人姓名(复议申请单) + */ + @Column(name = "applicant_name") + private String applicantName; + + /** + * 联系电话 + */ + @Column(name = "phone") + private String phone; + + /** + * 复议理由 + */ + @Column(name = "appeal_reason") + private String appealReason; + + /** + * 复议详细理由 + */ + @Column(name = "appeal_detail_reason") + private String appealDetailReason; } \ No newline at end of file diff --git a/coolstore-partner-model/src/main/java/com/cool/store/request/tp/TpAppealApplyRequest.java b/coolstore-partner-model/src/main/java/com/cool/store/request/tp/TpAppealApplyRequest.java new file mode 100644 index 000000000..8b7ed080d --- /dev/null +++ b/coolstore-partner-model/src/main/java/com/cool/store/request/tp/TpAppealApplyRequest.java @@ -0,0 +1,63 @@ +package com.cool.store.request.tp; + +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +import javax.validation.constraints.NotBlank; +import javax.validation.constraints.NotEmpty; +import javax.validation.constraints.NotNull; + +/** + *

+ * 复议申请Request + *

+ * + * @author wangff + * @since 2025/11/10 + */ +@Data +public class TpAppealApplyRequest { + @ApiModelProperty("id") + private Long id; + + @ApiModelProperty("门店id") + @NotBlank(message = "门店id不能为空") + private String storeId; + + @ApiModelProperty("是否为草稿 0否 1是") + @NotNull(message = "是否为草稿不能为空") + private Integer isDraft; + + @ApiModelProperty(value = "来源,0非小程序 1小程序", hidden = true) + private Integer source; + + @ApiModelProperty(value = "申请人(创建人)id", hidden = true) + private String applyUserId; + + @ApiModelProperty(value = "申请人(创建人)名称", hidden = true) + private String applyUserName; + + @ApiModelProperty("证明图片列表") + @NotEmpty(message = "证明图片列表不能为空") + private String proofUrls; + + @ApiModelProperty("处罚单id") + @NotNull(message = "处罚单id不能为空") + private Long penaltyId; + + @ApiModelProperty("申请人姓名") + @NotBlank(message = "申请人姓名不能为空") + private String applicantName; + + @ApiModelProperty("联系电话") + @NotBlank(message = "联系电话不能为空") + private String phone; + + @ApiModelProperty("复议理由") + @NotBlank(message = "复议理由不能为空") + private String appealReason; + + @ApiModelProperty("复议详细理由") + @NotBlank(message = "复议详细理由不能为空") + private String appealDetailReason; +} diff --git a/coolstore-partner-model/src/main/java/com/cool/store/request/tp/TpApplyAuditRequest.java b/coolstore-partner-model/src/main/java/com/cool/store/request/tp/TpApplyAuditRequest.java index f98dca46d..9df312896 100644 --- a/coolstore-partner-model/src/main/java/com/cool/store/request/tp/TpApplyAuditRequest.java +++ b/coolstore-partner-model/src/main/java/com/cool/store/request/tp/TpApplyAuditRequest.java @@ -19,9 +19,6 @@ public class TpApplyAuditRequest { @NotNull(message = "申请单id不能为空") private Long applyId; - @ApiModelProperty(value = "单据类型,0加分单 1警告书 2处罚书", hidden = true) - private Integer applyType; - @ApiModelProperty("审批状态 1通过 2拒绝") @NotNull(message = "审批状态不能为空") private Integer auditStatus; diff --git a/coolstore-partner-model/src/main/java/com/cool/store/request/tp/TpApplyQueryRequest.java b/coolstore-partner-model/src/main/java/com/cool/store/request/tp/TpApplyQueryRequest.java index e832e6aff..f0bcb9eb6 100644 --- a/coolstore-partner-model/src/main/java/com/cool/store/request/tp/TpApplyQueryRequest.java +++ b/coolstore-partner-model/src/main/java/com/cool/store/request/tp/TpApplyQueryRequest.java @@ -42,4 +42,7 @@ public class TpApplyQueryRequest extends PageBasicInfo { @ApiModelProperty(value = "是惩处单", hidden = true) private Boolean isPenalty; + + @ApiModelProperty("复议理由") + private String appealReason; } diff --git a/coolstore-partner-model/src/main/java/com/cool/store/request/tp/TpApplyRequest.java b/coolstore-partner-model/src/main/java/com/cool/store/request/tp/TpApplyRequest.java index 51d46dea4..b1987112d 100644 --- a/coolstore-partner-model/src/main/java/com/cool/store/request/tp/TpApplyRequest.java +++ b/coolstore-partner-model/src/main/java/com/cool/store/request/tp/TpApplyRequest.java @@ -5,6 +5,8 @@ import lombok.Data; import javax.validation.constraints.NotBlank; import javax.validation.constraints.NotNull; +import java.math.BigDecimal; +import java.time.LocalDate; /** *

@@ -37,13 +39,22 @@ public class TpApplyRequest { @ApiModelProperty(value = "来源,0非小程序 1小程序", hidden = true) private Integer source; - @ApiModelProperty(value = "申请人id", hidden = true) + @ApiModelProperty(value = "申请人(创建人)id", hidden = true) private String applyUserId; - @ApiModelProperty(value = "申请人名称", hidden = true) + @ApiModelProperty(value = "申请人(创建人)名称", hidden = true) private String applyUserName; @ApiModelProperty("证明图片列表,逗号隔开") @NotBlank(message = "证明图片列表不能为空") private String proofUrls; + + @ApiModelProperty("分值") + private BigDecimal score; + + @ApiModelProperty("金额") + private BigDecimal amount; + + @ApiModelProperty("申请复议截止日期,yyyy-MM-dd") + private LocalDate appealEndDate; } diff --git a/coolstore-partner-model/src/main/java/com/cool/store/vo/tp/TpAppealFormDetailVO.java b/coolstore-partner-model/src/main/java/com/cool/store/vo/tp/TpAppealFormDetailVO.java new file mode 100644 index 000000000..44de731c3 --- /dev/null +++ b/coolstore-partner-model/src/main/java/com/cool/store/vo/tp/TpAppealFormDetailVO.java @@ -0,0 +1,59 @@ +package com.cool.store.vo.tp; + +import com.cool.store.annotation.DictField; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +/** + *

+ * 复议申请单详情VO + *

+ * + * @author wangff + * @since 2025/11/10 + */ +@Data +public class TpAppealFormDetailVO { + @ApiModelProperty("id") + private Long id; + + @ApiModelProperty("门店id") + private String storeId; + + @ApiModelProperty("门店编码") + private String storeNum; + + @ApiModelProperty("门店名称") + private String storeName; + + @ApiModelProperty("是否为草稿 0否 1是") + private Integer isDraft; + + @ApiModelProperty("处罚单id") + private Long penaltyId; + + @ApiModelProperty("处罚单号") + private Long penaltyNo; + + @ApiModelProperty("证明图片列表") + private String proofUrls; + + @ApiModelProperty("申请人姓名") + private String applicantName; + + @ApiModelProperty("联系电话") + private String phone; + + @ApiModelProperty("复议理由") + private String appealReason; + + @ApiModelProperty("复议理由名称") + @DictField + private String appealReasonName; + + @ApiModelProperty("复议详细理由") + private String appealDetailReason; + + @ApiModelProperty("处罚单") + private TpPenaltyApplyDetailVO penaltyDetail; +} diff --git a/coolstore-partner-model/src/main/java/com/cool/store/vo/tp/TpAppealListVO.java b/coolstore-partner-model/src/main/java/com/cool/store/vo/tp/TpAppealListVO.java new file mode 100644 index 000000000..93aad75bf --- /dev/null +++ b/coolstore-partner-model/src/main/java/com/cool/store/vo/tp/TpAppealListVO.java @@ -0,0 +1,38 @@ +package com.cool.store.vo.tp; + +import com.cool.store.annotation.DictField; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +/** + *

+ * 复审列表VO + *

+ * + * @author wangff + * @since 2025/11/10 + */ +@Data +public class TpAppealListVO extends TpApplyListBaseVO { + @ApiModelProperty("处罚单id") + private Long penaltyId; + + @ApiModelProperty("处罚单号") + private String penaltyNo; + + @ApiModelProperty("申请人姓名") + private String applicantName; + + @ApiModelProperty("联系电话") + private String phone; + + @ApiModelProperty("复议理由") + private String appealReason; + + @ApiModelProperty("复议理由名称") + @DictField + private String appealReasonName; + + @ApiModelProperty("复议详细理由") + private String appealDetailReason; +} diff --git a/coolstore-partner-model/src/main/java/com/cool/store/vo/tp/TpApplyListBaseVO.java b/coolstore-partner-model/src/main/java/com/cool/store/vo/tp/TpApplyListBaseVO.java index e9b102144..5d225c066 100644 --- a/coolstore-partner-model/src/main/java/com/cool/store/vo/tp/TpApplyListBaseVO.java +++ b/coolstore-partner-model/src/main/java/com/cool/store/vo/tp/TpApplyListBaseVO.java @@ -67,7 +67,7 @@ public class TpApplyListBaseVO { @ApiModelProperty("备注") private String remark; - @ApiModelProperty("申请人名称") + @ApiModelProperty("申请人(创建人)名称") private String applyUserName; @ApiModelProperty("申请时间") diff --git a/coolstore-partner-service/src/main/java/com/cool/store/service/tp/TpApplyService.java b/coolstore-partner-service/src/main/java/com/cool/store/service/tp/TpApplyService.java index b37851678..3ee950054 100644 --- a/coolstore-partner-service/src/main/java/com/cool/store/service/tp/TpApplyService.java +++ b/coolstore-partner-service/src/main/java/com/cool/store/service/tp/TpApplyService.java @@ -1,12 +1,10 @@ package com.cool.store.service.tp; +import com.cool.store.request.tp.TpAppealApplyRequest; import com.cool.store.request.tp.TpApplyAuditRequest; import com.cool.store.request.tp.TpApplyQueryRequest; import com.cool.store.request.tp.TpApplyRequest; -import com.cool.store.vo.tp.TpPenaltyApplyDetailVO; -import com.cool.store.vo.tp.TpPenaltyApplyListVO; -import com.cool.store.vo.tp.TpRewardApplyDetailVO; -import com.cool.store.vo.tp.TpRewardApplyListVO; +import com.cool.store.vo.tp.*; import com.github.pagehelper.PageInfo; /** @@ -74,4 +72,32 @@ public interface TpApplyService { * @return 是否成功 */ Boolean penaltyAudit(TpApplyAuditRequest request); + + /** + * 复议申请提交 + * @param request 复议申请Request + * @return 是否成功 + */ + Boolean appealApplySubmit(TpAppealApplyRequest request); + + /** + * 复议申请单详情 + * @param applyId 复议申请单id + * @return 复议申请单详情VO + */ + TpAppealFormDetailVO appealDetail(Long applyId); + + /** + * 复议申请单分页查询 + * @param request 申请单查询Request + * @return 复审列表VO列表 + */ + PageInfo appealPage(TpApplyQueryRequest request); + + /** + * 复议申请审批 + * @param request 申请单审批Request + * @return 是否成功 + */ + Boolean appealAudit(TpApplyAuditRequest request); } diff --git a/coolstore-partner-service/src/main/java/com/cool/store/service/tp/impl/TpApplyServiceImpl.java b/coolstore-partner-service/src/main/java/com/cool/store/service/tp/impl/TpApplyServiceImpl.java index 61af644b6..3f6dfa931 100644 --- a/coolstore-partner-service/src/main/java/com/cool/store/service/tp/impl/TpApplyServiceImpl.java +++ b/coolstore-partner-service/src/main/java/com/cool/store/service/tp/impl/TpApplyServiceImpl.java @@ -6,10 +6,7 @@ import com.cool.store.context.CurrentUserHolder; import com.cool.store.context.LoginUserInfo; import com.cool.store.dao.EnterpriseUserDAO; import com.cool.store.dao.StoreDao; -import com.cool.store.dao.tp.TpApplyFormDAO; -import com.cool.store.dao.tp.TpAuditRecordDAO; -import com.cool.store.dao.tp.TpRuleDAO; -import com.cool.store.dao.tp.TpScoreJournalDAO; +import com.cool.store.dao.tp.*; import com.cool.store.entity.StoreDO; import com.cool.store.entity.tp.TpApplyFormDO; import com.cool.store.entity.tp.TpRuleDO; @@ -19,6 +16,7 @@ import com.cool.store.enums.tp.TpFormStatusEnum; import com.cool.store.enums.tp.TpFormTypeEnum; import com.cool.store.enums.tp.TpPayStatusEnum; import com.cool.store.exception.ServiceException; +import com.cool.store.request.tp.TpAppealApplyRequest; import com.cool.store.request.tp.TpApplyAuditRequest; import com.cool.store.request.tp.TpApplyQueryRequest; import com.cool.store.request.tp.TpApplyRequest; @@ -82,7 +80,6 @@ public class TpApplyServiceImpl implements TpApplyService { if (isInsert) { formDO.setApplyNo(TpHelper.generateApplyNo(TpFormTypeEnum.REWARD.getType())); formDO.setType(TpFormTypeEnum.REWARD.getType()); - formDO.setStatus(TpFormStatusEnum.PENDING.getStatus()); formDO.setPayStatus(TpPayStatusEnum.NO_NEED_PAY.getStatus()); } fillRuleFields(formDO); @@ -96,7 +93,7 @@ public class TpApplyServiceImpl implements TpApplyService { @Override public TpRewardApplyDetailVO rewardDetail(Long applyId) { - TpApplyFormDO formDO = tpApplyFormDAO.getById(applyId); + TpApplyFormDO formDO = tpApplyFormDAO.getEffectiveById(applyId); if (Objects.nonNull(formDO)) { TpRewardApplyDetailVO vo = BeanUtil.toBean(formDO, TpRewardApplyDetailVO.class); dictService.fillDictField(vo); @@ -130,11 +127,8 @@ public class TpApplyServiceImpl implements TpApplyService { throw new ServiceException(ErrorCodeEnum.TP_EXISTS_PENDING_APPLY); } boolean isInsert = Objects.isNull(request.getId()); + formDO.setApplyNo(isInsert ? TpHelper.generateApplyNo(formDO.getType()) : null); fillRuleFields(formDO); - if (isInsert) { - formDO.setApplyNo(TpHelper.generateApplyNo(formDO.getType())); - formDO.setStatus(TpFormStatusEnum.PENDING.getStatus()); - } tpApplyFormDAO.insertOrUpdate(formDO); // 第一次提交后添加审批记录 if (isInsert && !isDraft) { @@ -145,7 +139,7 @@ public class TpApplyServiceImpl implements TpApplyService { @Override public TpPenaltyApplyDetailVO penaltyDetail(Long applyId) { - TpApplyFormDO formDO = tpApplyFormDAO.getById(applyId); + TpApplyFormDO formDO = tpApplyFormDAO.getEffectiveById(applyId); if (Objects.nonNull(formDO)) { TpPenaltyApplyDetailVO vo = BeanUtil.toBean(formDO, TpPenaltyApplyDetailVO.class); dictService.fillDictField(vo); @@ -161,7 +155,6 @@ public class TpApplyServiceImpl implements TpApplyService { @Override public PageInfo penaltyPage(TpApplyQueryRequest request) { - request.setIsPenalty(true); PageHelper.startPage(request.getPageNum(), request.getPageSize()); List list = tpApplyFormDAO.getEffectiveList(request); PageInfo page = new PageInfo<>(list); @@ -173,8 +166,8 @@ public class TpApplyServiceImpl implements TpApplyService { @Override @Transactional public Boolean rewardAudit(TpApplyAuditRequest request) { - TpApplyFormDO formDO = tpApplyFormDAO.getById(request.getApplyId()); - if (Objects.isNull(formDO)) { + TpApplyFormDO formDO = tpApplyFormDAO.getEffectiveById(request.getApplyId()); + if (Objects.isNull(formDO) || !TpFormTypeEnum.REWARD.getType().equals(formDO.getType())) { throw new ServiceException(ErrorCodeEnum.TP_NOT_EXIST_APPLY_FORM); } if (!TpFormStatusEnum.PENDING.getStatus().equals(formDO.getStatus())) { @@ -183,6 +176,100 @@ public class TpApplyServiceImpl implements TpApplyService { if (tpApplyFormDAO.existPassRewardForm(formDO.getStoreId(), formDO.getRuleId())) { throw new ServiceException(ErrorCodeEnum.TP_MONTH_EXIST_APPLY); } + auditCommon(request, formDO); + return true; + } + + @Override + @Transactional + public Boolean penaltyAudit(TpApplyAuditRequest request) { + TpApplyFormDO formDO = tpApplyFormDAO.getEffectiveById(request.getApplyId()); + if (Objects.isNull(formDO) || !TpFormTypeEnum.isPenalty(formDO.getType())) { + throw new ServiceException(ErrorCodeEnum.TP_NOT_EXIST_APPLY_FORM); + } + if (!TpFormStatusEnum.PENDING.getStatus().equals(formDO.getStatus())) { + throw new ServiceException(ErrorCodeEnum.TP_APPLY_AUDIT_COMPLETED); + } + auditCommon(request, formDO); + return true; + } + + @Override + public Boolean appealApplySubmit(TpAppealApplyRequest request) { + TpApplyFormDO formDO = BeanUtil.toBean(request, TpApplyFormDO.class); + boolean isDraft = CommonConstants.INDEX_ONE.equals(request.getIsDraft()); + TpApplyFormDO punishFormDO = tpApplyFormDAO.getByPenaltyId(request.getPenaltyId()); + if (Objects.nonNull(punishFormDO) && !isDraft) { + if (TpFormStatusEnum.PENDING.getStatus().equals(punishFormDO.getStatus())) { + throw new ServiceException(ErrorCodeEnum.TP_EXISTS_PENDING_APPLY); + } + if (TpFormStatusEnum.PASS.getStatus().equals(punishFormDO.getStatus())) { + throw new ServiceException(ErrorCodeEnum.TP_PENALTY_APPLY_APPEAL_COMPLETED); + } + } + boolean isInsert = Objects.isNull(request.getId()); + formDO.setApplyNo(isInsert ? TpHelper.generateAppealNo() : null); + formDO.setRuleId(punishFormDO.getRuleId()); + formDO.setType(TpFormTypeEnum.APPEAL.getType()); + fillRuleFields(formDO); + tpApplyFormDAO.insertOrUpdate(formDO); + // 第一次提交后添加审批记录 + if (isInsert && !isDraft) { + tpAuditRecordDAO.addRecord(formDO.getId(), TpFormTypeEnum.APPEAL.getType(), request.getApplyUserId(), request.getApplyUserName()); + } + return true; + } + + @Override + public TpAppealFormDetailVO appealDetail(Long applyId) { + TpApplyFormDO formDO = tpApplyFormDAO.getEffectiveById(applyId); + if (Objects.nonNull(formDO)) { + TpAppealFormDetailVO vo = BeanUtil.toBean(formDO, TpAppealFormDetailVO.class); + dictService.fillDictField(vo); + StoreDO storeDO = storeDao.getByStoreId(vo.getStoreId()); + if (Objects.nonNull(storeDO)) { + vo.setStoreNum(storeDO.getStoreNum()); + vo.setStoreName(storeDO.getStoreName()); + } + vo.setPenaltyDetail(penaltyDetail(vo.getPenaltyId())); + return vo; + } + return null; + } + + @Override + public PageInfo appealPage(TpApplyQueryRequest request) { + PageHelper.startPage(request.getPageNum(), request.getPageSize()); + List list = tpApplyFormDAO.getEffectiveList(request); + PageInfo page = new PageInfo<>(list); + PageInfo newPage = BeanUtil.toPage(page, TpAppealListVO.class); + List penaltyIds = CollStreamUtil.toList(newPage.getList(), TpAppealListVO::getPenaltyId); + List penaltyList = tpApplyFormDAO.getByIds(penaltyIds); + Map penaltyNoMap = CollStreamUtil.toMap(penaltyList, TpApplyFormDO::getId, TpApplyFormDO::getApplyNo); + newPage.getList().forEach(vo -> { + vo.setPenaltyNo(penaltyNoMap.get(vo.getPenaltyId())); + }); + fillListFields(newPage.getList()); + return newPage; + } + + @Override + public Boolean appealAudit(TpApplyAuditRequest request) { + TpApplyFormDO formDO = tpApplyFormDAO.getEffectiveById(request.getApplyId()); + if (Objects.isNull(formDO) || !TpFormTypeEnum.APPEAL.getType().equals(formDO.getType())) { + throw new ServiceException(ErrorCodeEnum.TP_NOT_EXIST_APPLY_FORM); + } + if (!TpFormStatusEnum.PENDING.getStatus().equals(formDO.getStatus())) { + throw new ServiceException(ErrorCodeEnum.TP_APPLY_AUDIT_COMPLETED); + } + auditCommon(request, formDO); + return true; + } + + /** + * 审批通用方法 + */ + private void auditCommon(TpApplyAuditRequest request, TpApplyFormDO formDO) { Date now = new Date(); // 修改申请单审批数据 formDO.setStatus(CommonConstants.INDEX_ONE.equals(request.getAuditStatus()) ? TpFormStatusEnum.PASS.getStatus() : TpFormStatusEnum.REJECT.getStatus()); @@ -190,15 +277,23 @@ public class TpApplyServiceImpl implements TpApplyService { tpApplyFormDAO.updateSelective(formDO); LoginUserInfo user = CurrentUserHolder.getUser(); // 处理审批记录 - tpAuditRecordDAO.auditPendingRecordByApplyId(request.getApplyId(), request.getApplyType(), user.getUserId(), user.getName(), request.getAuditStatus(), request.getRemark(), now); - // 审批通过后门店积分变动 - scoreChange(formDO); - return null; + tpAuditRecordDAO.auditPendingRecordByApplyId(request.getApplyId(), formDO.getType(), user.getUserId(), user.getName(), request.getAuditStatus(), request.getRemark(), now); + if (TpFormTypeEnum.APPEAL.getType().equals(formDO.getType())) { + appealPassResolve(formDO); + } else { + // 审批通过后门店积分变动 + scoreChange(formDO); + } } - @Override - public Boolean penaltyAudit(TpApplyAuditRequest request) { - return null; + /** + * 复议申请通过时处罚单作废 + */ + private void appealPassResolve(TpApplyFormDO formDO) { + if (TpFormStatusEnum.PASS.getStatus().equals(formDO.getStatus())) { + // 申诉通过后,处罚单失效 + tpApplyFormDAO.cancelApply(formDO.getPenaltyId()); + } } /** @@ -248,11 +343,18 @@ public class TpApplyServiceImpl implements TpApplyService { formDO.setProjectCategory(ruleDO.getProjectCategory()); formDO.setProjectName(ruleDO.getProjectName()); formDO.setIsFull(ruleDO.getIsFull()); - formDO.setScore(ruleDO.getScore()); - formDO.setAmount(ruleDO.getAmount()); - formDO.setAppealEndDate(LocalDate.now().plusDays(ruleDO.getAppealDeadline())); + if (Objects.isNull(formDO.getScore())) { + formDO.setScore(ruleDO.getScore()); + } + if (Objects.isNull(formDO.getAmount())) { + formDO.setAmount(ruleDO.getAmount()); + } + // 扣分 if (CommonConstants.INDEX_ZERO.equals(ruleDO.getType())) { - // 如果是扣分规则,判断警告次数 + if (Objects.isNull(formDO.getAppealEndDate())) { + formDO.setAppealEndDate(LocalDate.now().plusDays(ruleDO.getAppealDeadline())); + } + // 超过警告次数的为处罚单,否则警告单 int penaltyCount = tpApplyFormDAO.getPenaltyCount(formDO.getStoreId(), formDO.getRuleId()); formDO.setType(ruleDO.getWarningLimit().compareTo(penaltyCount) <= 0 ? TpFormTypeEnum.PENALTY.getType() : TpFormTypeEnum.WARNING.getType()); // 是否缴费 diff --git a/coolstore-partner-web/src/main/java/com/cool/store/controller/webb/TpApplyController.java b/coolstore-partner-web/src/main/java/com/cool/store/controller/webb/TpApplyController.java index 66a264ff7..a48ac2cb4 100644 --- a/coolstore-partner-web/src/main/java/com/cool/store/controller/webb/TpApplyController.java +++ b/coolstore-partner-web/src/main/java/com/cool/store/controller/webb/TpApplyController.java @@ -3,13 +3,13 @@ package com.cool.store.controller.webb; import com.cool.store.context.CurrentUserHolder; import com.cool.store.context.LoginUserInfo; import com.cool.store.enums.tp.TpFormTypeEnum; +import com.cool.store.request.tp.TpAppealApplyRequest; import com.cool.store.request.tp.TpApplyAuditRequest; import com.cool.store.request.tp.TpApplyQueryRequest; import com.cool.store.request.tp.TpApplyRequest; import com.cool.store.response.ResponseResult; import com.cool.store.service.tp.TpApplyService; -import com.cool.store.vo.tp.TpRewardApplyDetailVO; -import com.cool.store.vo.tp.TpRewardApplyListVO; +import com.cool.store.vo.tp.*; import com.github.pagehelper.PageInfo; import io.swagger.annotations.Api; import io.swagger.annotations.ApiImplicitParam; @@ -28,7 +28,7 @@ import javax.validation.constraints.NotNull; * @author wangff * @since 2025/11/6 */ -@Api(tags = "十二分制-奖惩规则") +@Api(tags = "十二分制-申请单") @RestController @RequestMapping("/pc/tp/apply") @RequiredArgsConstructor @@ -62,7 +62,67 @@ public class TpApplyController { @ApiOperation("加分申请审批") @PostMapping("/rewardAudit") public ResponseResult rewardAudit(@RequestBody @Validated TpApplyAuditRequest request) { - request.setApplyType(TpFormTypeEnum.REWARD.getType()); return ResponseResult.success(tpApplyService.rewardAudit(request)); } + + + @ApiOperation("惩处申请提交or保存") + @PostMapping("/penaltyApplySubmit") + public ResponseResult penaltyApplySubmit(@RequestBody @Validated TpApplyRequest request) { + LoginUserInfo user = CurrentUserHolder.getUser(); + request.setSource(0); + request.setApplyUserId(user.getUserId()); + request.setApplyUserName(user.getName()); + return ResponseResult.success(tpApplyService.penaltyApplySubmit(request)); + } + + @ApiOperation("惩处申请单详情") + @GetMapping("/penaltyDetail") + @ApiImplicitParam(name = "applyId", value = "惩处申请单id", required = true, dataType = "Long", paramType = "query") + public ResponseResult penaltyDetail(@NotNull(message = "惩处申请单id不能为空") Long applyId) { + return ResponseResult.success(tpApplyService.penaltyDetail(applyId)); + } + + @ApiOperation("惩处申请单分页查询") + @GetMapping("/penaltyPage") + public ResponseResult > penaltyPage(TpApplyQueryRequest request) { + request.setIsPenalty(true); + return ResponseResult.success(tpApplyService.penaltyPage(request)); + } + + @ApiOperation("惩处申请审批") + @PostMapping("/penaltyAudit") + public ResponseResult penaltyAudit(@RequestBody @Validated TpApplyAuditRequest request) { + return ResponseResult.success(tpApplyService.penaltyAudit(request)); + } + + @ApiOperation("复议申请提交or保存") + @PostMapping("/appealApplySubmit") + public ResponseResult appealApplySubmit(@RequestBody @Validated TpAppealApplyRequest request) { + LoginUserInfo user = CurrentUserHolder.getUser(); + request.setSource(0); + request.setApplyUserId(user.getUserId()); + request.setApplyUserName(user.getName()); + return ResponseResult.success(tpApplyService.appealApplySubmit(request)); + } + + @ApiOperation("复议申请单详情") + @GetMapping("/appealDetail") + @ApiImplicitParam(name = "applyId", value = "复议申请单id", required = true, dataType = "Long", paramType = "query") + public ResponseResult appealDetail(@NotNull(message = "复议申请单id不能为空") Long applyId) { + return ResponseResult.success(tpApplyService.appealDetail(applyId)); + } + + @ApiOperation("复议申请单分页查询") + @GetMapping("/appealPage") + public ResponseResult > appealPage(TpApplyQueryRequest request) { + request.setType(TpFormTypeEnum.APPEAL.getType()); + return ResponseResult.success(tpApplyService.appealPage(request)); + } + + @ApiOperation("复议申请审批") + @PostMapping("/appealAudit") + public ResponseResult appealAudit(@RequestBody @Validated TpApplyAuditRequest request) { + return ResponseResult.success(tpApplyService.appealAudit(request)); + } } From 85de65cda63b2fdbceae8b04a8a446b16ad6ed4b Mon Sep 17 00:00:00 2001 From: wangff Date: Mon, 10 Nov 2025 15:12:19 +0800 Subject: [PATCH 06/10] =?UTF-8?q?fix:=E5=8D=81=E4=BA=8C=E5=88=86=E5=88=B6-?= =?UTF-8?q?=E7=A7=AF=E5=88=86=E6=B5=81=E6=B0=B4?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../com/cool/store/enums/JoinModeEnum.java | 9 ++ .../store/enums/master/BrandTypeEnum.java | 52 +++++++++ .../cool/store/enums/tp/TpFormTypeEnum.java | 10 +- .../cool/store/dao/tp/TpScoreJournalDAO.java | 40 +++++++ .../request/tp/TpAppealApplyRequest.java | 4 - .../tp/TpScoreJournalQueryRequest.java | 42 ++++++++ .../cool/store/vo/tp/TpScoreJournalVO.java | 100 ++++++++++++++++++ .../service/tp/TpScoreJournalService.java | 23 ++++ .../service/tp/impl/TpApplyServiceImpl.java | 1 + .../tp/impl/TpScoreJournalServiceImpl.java | 36 +++++++ .../webb/TpScoreJournalController.java | 35 ++++++ 11 files changed, 344 insertions(+), 8 deletions(-) create mode 100644 coolstore-partner-common/src/main/java/com/cool/store/enums/master/BrandTypeEnum.java create mode 100644 coolstore-partner-model/src/main/java/com/cool/store/request/tp/TpScoreJournalQueryRequest.java create mode 100644 coolstore-partner-model/src/main/java/com/cool/store/vo/tp/TpScoreJournalVO.java create mode 100644 coolstore-partner-service/src/main/java/com/cool/store/service/tp/TpScoreJournalService.java create mode 100644 coolstore-partner-service/src/main/java/com/cool/store/service/tp/impl/TpScoreJournalServiceImpl.java create mode 100644 coolstore-partner-web/src/main/java/com/cool/store/controller/webb/TpScoreJournalController.java diff --git a/coolstore-partner-common/src/main/java/com/cool/store/enums/JoinModeEnum.java b/coolstore-partner-common/src/main/java/com/cool/store/enums/JoinModeEnum.java index 0c4b24555..ed5f31062 100644 --- a/coolstore-partner-common/src/main/java/com/cool/store/enums/JoinModeEnum.java +++ b/coolstore-partner-common/src/main/java/com/cool/store/enums/JoinModeEnum.java @@ -44,4 +44,13 @@ public enum JoinModeEnum { public static boolean isFranchise(Integer code) { return code == FRANCHISE_DEPARTMENT.code || code == AFFILIATES.code; } + + public static String getDescByCode(Integer code) { + for (JoinModeEnum e : JoinModeEnum.values()) { + if (e.getCode() == code) { + return e.desc; + } + } + return null; + } } diff --git a/coolstore-partner-common/src/main/java/com/cool/store/enums/master/BrandTypeEnum.java b/coolstore-partner-common/src/main/java/com/cool/store/enums/master/BrandTypeEnum.java new file mode 100644 index 000000000..4dbe11852 --- /dev/null +++ b/coolstore-partner-common/src/main/java/com/cool/store/enums/master/BrandTypeEnum.java @@ -0,0 +1,52 @@ +package com.cool.store.enums.master; + +/** + * @Author suzhuhong + * @Date 2025/8/6 16:49 + * @Version 1.0 + */ +public enum BrandTypeEnum { + + JP(1, "正新鸡排"), + SMZ(2, "正新三明治"), + ZSJ(3, "正烧记"), + MX(4, "大鼓米线"), + CXM(5, "串小妹"), + MZG(6, "茂掌柜"); + + ; + private Integer code; + + private String desc; + + BrandTypeEnum(Integer code, String desc) { + this.code = code; + this.desc = desc; + } + + public Integer getCode() { + return code; + } + + public String getDesc() { + return desc; + } + + public static Integer getCodeByDesc(String desc) { + for (BrandTypeEnum value : values()) { + if (value.getDesc().equals(desc)) { + return value.getCode(); + } + } + return null; + } + + public static String getDescByCode(Integer code) { + for (BrandTypeEnum value : values()) { + if (value.getCode().equals(code)) { + return value.getDesc(); + } + } + return null; + } +} diff --git a/coolstore-partner-common/src/main/java/com/cool/store/enums/tp/TpFormTypeEnum.java b/coolstore-partner-common/src/main/java/com/cool/store/enums/tp/TpFormTypeEnum.java index 3f62a2dec..20f2bf2ee 100644 --- a/coolstore-partner-common/src/main/java/com/cool/store/enums/tp/TpFormTypeEnum.java +++ b/coolstore-partner-common/src/main/java/com/cool/store/enums/tp/TpFormTypeEnum.java @@ -15,16 +15,18 @@ import lombok.Getter; @AllArgsConstructor public enum TpFormTypeEnum { - REWARD(0, "加分申请单"), - WARNING(1, "警告书"), - PENALTY(2, "处罚书"), - APPEAL(3, "复议申请单"), + REWARD(0, "加分申请单", "加分申请单"), + WARNING(1, "警告书", "惩处申请单"), + PENALTY(2, "处罚书", "惩处申请单"), + APPEAL(3, "复议申请单", "复议申请单"), ; private final Integer type; private final String msg; + private final String alias; + public static String getMsgByType(Integer type) { for (TpFormTypeEnum value : values()) { if (value.type.equals(type)) { diff --git a/coolstore-partner-dao/src/main/java/com/cool/store/dao/tp/TpScoreJournalDAO.java b/coolstore-partner-dao/src/main/java/com/cool/store/dao/tp/TpScoreJournalDAO.java index db2ff465f..762b54193 100644 --- a/coolstore-partner-dao/src/main/java/com/cool/store/dao/tp/TpScoreJournalDAO.java +++ b/coolstore-partner-dao/src/main/java/com/cool/store/dao/tp/TpScoreJournalDAO.java @@ -2,8 +2,14 @@ package com.cool.store.dao.tp; import com.cool.store.entity.tp.TpScoreJournalDO; import com.cool.store.mapper.tp.TpScoreJournalMapper; +import com.cool.store.request.tp.TpScoreJournalQueryRequest; import lombok.RequiredArgsConstructor; +import org.apache.commons.lang3.StringUtils; import org.springframework.stereotype.Repository; +import tk.mybatis.mapper.entity.Example; + +import java.util.List; +import java.util.Objects; /** *

@@ -24,4 +30,38 @@ public class TpScoreJournalDAO { public void insertSelective(TpScoreJournalDO record) { tpScoreJournalMapper.insertSelective(record); } + + /** + * 列表查询 + */ + public List getList(TpScoreJournalQueryRequest request) { + Example example = new Example(TpScoreJournalDO.class); + Example.Criteria criteria = example.createCriteria(); + if (StringUtils.isNotBlank(request.getStoreNameOrNum())) { + criteria.andCondition("store_num LIKE '%" + request.getStoreNameOrNum() + "%' OR store_name LIKE '%" + request.getStoreNameOrNum() + "%'"); + } + if (Objects.nonNull(request.getJoinBrand())) { + criteria.andEqualTo("joinBrand", request.getJoinBrand()); + } + if (Objects.nonNull(request.getJoinModel())) { + criteria.andEqualTo("joinModel", request.getJoinModel()); + } + if (Objects.nonNull(request.getStoreType())) { + criteria.andEqualTo("storeType", request.getStoreType()); + } + if (Objects.nonNull(request.getStartDate())) { + criteria.andGreaterThanOrEqualTo("occurDate", request.getStartDate()); + } + if (Objects.nonNull(request.getEndDate())) { + criteria.andLessThanOrEqualTo("occurDate", request.getEndDate()); + } + if (Objects.nonNull(request.getApplyType())) { + criteria.andEqualTo("applyType", request.getApplyType()); + } + if (StringUtils.isNotBlank(request.getApplyNo())) { + criteria.andLike("applyNo", "%" + request.getApplyNo() + "%"); + } + example.setOrderByClause("createTime DESC"); + return tpScoreJournalMapper.selectByExample(example); + } } diff --git a/coolstore-partner-model/src/main/java/com/cool/store/request/tp/TpAppealApplyRequest.java b/coolstore-partner-model/src/main/java/com/cool/store/request/tp/TpAppealApplyRequest.java index 8b7ed080d..efeb96f2b 100644 --- a/coolstore-partner-model/src/main/java/com/cool/store/request/tp/TpAppealApplyRequest.java +++ b/coolstore-partner-model/src/main/java/com/cool/store/request/tp/TpAppealApplyRequest.java @@ -20,10 +20,6 @@ public class TpAppealApplyRequest { @ApiModelProperty("id") private Long id; - @ApiModelProperty("门店id") - @NotBlank(message = "门店id不能为空") - private String storeId; - @ApiModelProperty("是否为草稿 0否 1是") @NotNull(message = "是否为草稿不能为空") private Integer isDraft; diff --git a/coolstore-partner-model/src/main/java/com/cool/store/request/tp/TpScoreJournalQueryRequest.java b/coolstore-partner-model/src/main/java/com/cool/store/request/tp/TpScoreJournalQueryRequest.java new file mode 100644 index 000000000..6301339ca --- /dev/null +++ b/coolstore-partner-model/src/main/java/com/cool/store/request/tp/TpScoreJournalQueryRequest.java @@ -0,0 +1,42 @@ +package com.cool.store.request.tp; + +import com.cool.store.common.PageBasicInfo; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +import java.util.Date; + +/** + *

+ * 积分流水查询Request + *

+ * + * @author wangff + * @since 2025/11/10 + */ +@Data +public class TpScoreJournalQueryRequest extends PageBasicInfo { + @ApiModelProperty("门店名称或编码") + private String storeNameOrNum; + + @ApiModelProperty("加盟品牌") + private Integer joinBrand; + + @ApiModelProperty("加盟模式") + private Integer joinModel; + + @ApiModelProperty("门店类型") + private Integer storeType; + + @ApiModelProperty("开始发生日期") + private Date startDate; + + @ApiModelProperty("结束发生日期") + private Date endDate; + + @ApiModelProperty("来源单据,0加分申请单 2处罚申请单") + private Integer applyType; + + @ApiModelProperty("来源单号") + private String applyNo; +} diff --git a/coolstore-partner-model/src/main/java/com/cool/store/vo/tp/TpScoreJournalVO.java b/coolstore-partner-model/src/main/java/com/cool/store/vo/tp/TpScoreJournalVO.java new file mode 100644 index 000000000..59938de4c --- /dev/null +++ b/coolstore-partner-model/src/main/java/com/cool/store/vo/tp/TpScoreJournalVO.java @@ -0,0 +1,100 @@ +package com.cool.store.vo.tp; + +import com.cool.store.enums.JoinModeEnum; +import com.cool.store.enums.StoreTypeEnum; +import com.cool.store.enums.master.BrandTypeEnum; +import com.cool.store.enums.tp.TpFormTypeEnum; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +import java.math.BigDecimal; +import java.util.Date; +import java.util.Objects; + +/** + *

+ * 积分流水VO + *

+ * + * @author wangff + * @since 2025/11/10 + */ +@Data +public class TpScoreJournalVO { + @ApiModelProperty("流水号") + private String journalNo; + + @ApiModelProperty("门店编码") + private String storeNum; + + @ApiModelProperty("加盟品牌") + private Integer joinBrand; + + @ApiModelProperty("加盟品牌名称") + private String joinBrandName; + + @ApiModelProperty("加盟模式") + private Integer joinModel; + + @ApiModelProperty("加盟模式名称") + private String joinModelName; + + @ApiModelProperty("门店类型") + private Integer storeType; + + @ApiModelProperty("门店类型名称") + private String storeTypeName; + + @ApiModelProperty("门店名称") + private String storeName; + + @ApiModelProperty("发生分值") + private String occurScore; + + @ApiModelProperty("发生日期") + private Date occurDate; + + @ApiModelProperty("发生前分值") + private BigDecimal occurBeforeScore; + + @ApiModelProperty("发生后分值") + private BigDecimal occurAfterScore; + + @ApiModelProperty("单据类型") + private Integer applyType; + + @ApiModelProperty("单据类型名称") + private String applyTypeName; + + @ApiModelProperty("来源单号") + private String applyNo; + + @ApiModelProperty("项目大类") + private String projectCategory; + + @ApiModelProperty("项目名称") + private String projectName; + + @ApiModelProperty("规则编码") + private String ruleNo; + + @ApiModelProperty("创建时间") + private Date createTime; + + public String getJoinBrandName() { + return BrandTypeEnum.getDescByCode(this.joinBrand); + } + + public String getJoinModelNam() { + return JoinModeEnum.getDescByCode(this.joinModel); + } + + public String getStoreTypeName() { + return StoreTypeEnum.getMessage(this.storeType); + } + + public String getApplyTypeName() { + TpFormTypeEnum type = TpFormTypeEnum.getByType(this.applyType); + return Objects.nonNull(type) ? type.getAlias() : null; + } +} diff --git a/coolstore-partner-service/src/main/java/com/cool/store/service/tp/TpScoreJournalService.java b/coolstore-partner-service/src/main/java/com/cool/store/service/tp/TpScoreJournalService.java new file mode 100644 index 000000000..fa6a600a1 --- /dev/null +++ b/coolstore-partner-service/src/main/java/com/cool/store/service/tp/TpScoreJournalService.java @@ -0,0 +1,23 @@ +package com.cool.store.service.tp; + +import com.cool.store.request.tp.TpScoreJournalQueryRequest; +import com.cool.store.vo.tp.TpScoreJournalVO; +import com.github.pagehelper.PageInfo; + +/** + *

+ * 十二分制-积分流水 服务类 + *

+ * + * @author wangff + * @since 2025/11/10 + */ +public interface TpScoreJournalService { + + /** + * 积分流水分页查询 + * @param request 积分流水查询Request + * @return 积分流水VO列表 + */ + PageInfo getPage(TpScoreJournalQueryRequest request); +} diff --git a/coolstore-partner-service/src/main/java/com/cool/store/service/tp/impl/TpApplyServiceImpl.java b/coolstore-partner-service/src/main/java/com/cool/store/service/tp/impl/TpApplyServiceImpl.java index 3f6dfa931..8a5d2b5dd 100644 --- a/coolstore-partner-service/src/main/java/com/cool/store/service/tp/impl/TpApplyServiceImpl.java +++ b/coolstore-partner-service/src/main/java/com/cool/store/service/tp/impl/TpApplyServiceImpl.java @@ -211,6 +211,7 @@ public class TpApplyServiceImpl implements TpApplyService { formDO.setApplyNo(isInsert ? TpHelper.generateAppealNo() : null); formDO.setRuleId(punishFormDO.getRuleId()); formDO.setType(TpFormTypeEnum.APPEAL.getType()); + formDO.setStoreId(punishFormDO.getStoreId()); fillRuleFields(formDO); tpApplyFormDAO.insertOrUpdate(formDO); // 第一次提交后添加审批记录 diff --git a/coolstore-partner-service/src/main/java/com/cool/store/service/tp/impl/TpScoreJournalServiceImpl.java b/coolstore-partner-service/src/main/java/com/cool/store/service/tp/impl/TpScoreJournalServiceImpl.java new file mode 100644 index 000000000..0ec1b156f --- /dev/null +++ b/coolstore-partner-service/src/main/java/com/cool/store/service/tp/impl/TpScoreJournalServiceImpl.java @@ -0,0 +1,36 @@ +package com.cool.store.service.tp.impl; + +import com.cool.store.dao.tp.TpScoreJournalDAO; +import com.cool.store.entity.tp.TpScoreJournalDO; +import com.cool.store.request.tp.TpScoreJournalQueryRequest; +import com.cool.store.service.tp.TpScoreJournalService; +import com.cool.store.utils.BeanUtil; +import com.cool.store.vo.tp.TpScoreJournalVO; +import com.github.pagehelper.PageHelper; +import com.github.pagehelper.PageInfo; +import lombok.RequiredArgsConstructor; +import org.springframework.stereotype.Service; + +import java.util.List; + +/** + *

+ * 十二分制-积分流水 服务实现类 + *

+ * + * @author wangff + * @since 2025/11/10 + */ +@Service +@RequiredArgsConstructor +public class TpScoreJournalServiceImpl implements TpScoreJournalService { + private final TpScoreJournalDAO tpScoreJournalDAO; + + @Override + public PageInfo getPage(TpScoreJournalQueryRequest request) { + PageHelper.startPage(request.getPageNum(), request.getPageSize()); + List list = tpScoreJournalDAO.getList(request); + PageInfo page = new PageInfo<>(list); + return BeanUtil.toPage(page, TpScoreJournalVO.class); + } +} diff --git a/coolstore-partner-web/src/main/java/com/cool/store/controller/webb/TpScoreJournalController.java b/coolstore-partner-web/src/main/java/com/cool/store/controller/webb/TpScoreJournalController.java new file mode 100644 index 000000000..213c18d8f --- /dev/null +++ b/coolstore-partner-web/src/main/java/com/cool/store/controller/webb/TpScoreJournalController.java @@ -0,0 +1,35 @@ +package com.cool.store.controller.webb; + +import com.cool.store.request.tp.TpScoreJournalQueryRequest; +import com.cool.store.response.ResponseResult; +import com.cool.store.service.tp.TpScoreJournalService; +import com.cool.store.vo.tp.TpScoreJournalVO; +import com.github.pagehelper.PageInfo; +import io.swagger.annotations.Api; +import io.swagger.annotations.ApiOperation; +import lombok.RequiredArgsConstructor; +import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RestController; + +/** + *

+ * 十二分制-积分流水 前端控制器 + *

+ * + * @author wangff + * @since 2025/11/10 + */ +@Api(tags = "十二分制-积分流水") +@RestController +@RequestMapping("/pc/tp/journal") +@RequiredArgsConstructor +public class TpScoreJournalController { + private final TpScoreJournalService tpScoreJournalService; + + @ApiOperation("积分流水分页查询") + @GetMapping("/page") + public ResponseResult> getPage(TpScoreJournalQueryRequest request) { + return ResponseResult.success(tpScoreJournalService.getPage(request)); + } +} From b35903010c8122649f4ac96b519fd1816d5e27e8 Mon Sep 17 00:00:00 2001 From: wangff Date: Tue, 11 Nov 2025 13:58:24 +0800 Subject: [PATCH 07/10] =?UTF-8?q?fix:=E5=8D=81=E4=BA=8C=E5=88=86=E5=88=B6-?= =?UTF-8?q?=E7=A7=BB=E5=8A=A8=E7=AB=AF=E6=8E=A5=E5=8F=A3=EF=BC=9BPC?= =?UTF-8?q?=E7=AB=AF=E6=8E=A5=E5=8F=A3=E8=A1=A5=E5=85=85?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../com/cool/store/enums/ErrorCodeEnum.java | 4 + .../com/cool/store/dao/tp/TpApplyFormDAO.java | 81 ++++++++++-- .../cool/store/dao/tp/TpAuditRecordDAO.java | 101 +++++++++++--- .../resources/mapper/tp/TpApplyFormMapper.xml | 10 +- .../store/request/tp/TpApplyQueryRequest.java | 22 ++- .../store/response/AuditInfoResponse.java | 3 + .../cool/store/vo/tp/mini/MiniTpAppealVO.java | 38 ++++++ .../store/vo/tp/mini/MiniTpApplyListVO.java | 61 +++++++++ .../vo/tp/mini/MiniTpPenaltyApplyVO.java | 76 +++++++++++ .../store/vo/tp/mini/MiniTpRewardApplyVO.java | 55 ++++++++ .../store/vo/tp/mini/MiniTpRuleListVO.java | 53 ++++++++ .../store/service/dict/impl/DictService.java | 84 ++++++++++-- .../cool/store/service/tp/TpApplyService.java | 68 +++++++++- .../service/tp/impl/TpApplyServiceImpl.java | 125 ++++++++++++++++-- .../controller/webb/TpApplyController.java | 23 +++- .../webc/MiniTpApplyController.java | 115 ++++++++++++++++ .../com/cool/store/job/XxlJobHandler.java | 61 ++++++--- 17 files changed, 903 insertions(+), 77 deletions(-) create mode 100644 coolstore-partner-model/src/main/java/com/cool/store/vo/tp/mini/MiniTpAppealVO.java create mode 100644 coolstore-partner-model/src/main/java/com/cool/store/vo/tp/mini/MiniTpApplyListVO.java create mode 100644 coolstore-partner-model/src/main/java/com/cool/store/vo/tp/mini/MiniTpPenaltyApplyVO.java create mode 100644 coolstore-partner-model/src/main/java/com/cool/store/vo/tp/mini/MiniTpRewardApplyVO.java create mode 100644 coolstore-partner-model/src/main/java/com/cool/store/vo/tp/mini/MiniTpRuleListVO.java create mode 100644 coolstore-partner-web/src/main/java/com/cool/store/controller/webc/MiniTpApplyController.java diff --git a/coolstore-partner-common/src/main/java/com/cool/store/enums/ErrorCodeEnum.java b/coolstore-partner-common/src/main/java/com/cool/store/enums/ErrorCodeEnum.java index 62b8b194e..a06db83ad 100644 --- a/coolstore-partner-common/src/main/java/com/cool/store/enums/ErrorCodeEnum.java +++ b/coolstore-partner-common/src/main/java/com/cool/store/enums/ErrorCodeEnum.java @@ -326,6 +326,10 @@ public enum ErrorCodeEnum { TP_APPLY_AUDIT_COMPLETED(1810005, "该申请单已审批", null), TP_EXISTS_PENDING_APPLY(1810006, "存在待审批的申请单", null), TP_PENALTY_APPLY_APPEAL_COMPLETED(1810007, "该处罚单已完成复议", null), + TP_PENALTY_APPLY_EFFECTIVE(1810008, "该处罚单已生效", null), + TP_PENALTY_APPLY_UNABLE_ACCEPT(1810009, "该处罚单无法认缴", null), + TP_PENALTY_APPLY_INEFFECTIVE(1810010, "该处罚单未生效无法完成缴费", null), + TP_PENALTY_APPLY_NO_NEED_PAY(1810011, "该处罚单无需缴费", null), ; diff --git a/coolstore-partner-dao/src/main/java/com/cool/store/dao/tp/TpApplyFormDAO.java b/coolstore-partner-dao/src/main/java/com/cool/store/dao/tp/TpApplyFormDAO.java index cb5937e7a..32d681afa 100644 --- a/coolstore-partner-dao/src/main/java/com/cool/store/dao/tp/TpApplyFormDAO.java +++ b/coolstore-partner-dao/src/main/java/com/cool/store/dao/tp/TpApplyFormDAO.java @@ -1,9 +1,11 @@ package com.cool.store.dao.tp; +import cn.hutool.core.collection.CollStreamUtil; import com.alibaba.excel.util.CollectionUtils; import com.cool.store.entity.tp.TpApplyFormDO; import com.cool.store.enums.tp.TpFormStatusEnum; import com.cool.store.enums.tp.TpFormTypeEnum; +import com.cool.store.enums.tp.TpPayStatusEnum; import com.cool.store.mapper.tp.TpApplyFormMapper; import com.cool.store.request.tp.TpApplyQueryRequest; import lombok.RequiredArgsConstructor; @@ -11,10 +13,7 @@ import org.springframework.stereotype.Repository; import tk.mybatis.mapper.entity.Example; import java.time.LocalDate; -import java.util.Arrays; -import java.util.Collections; -import java.util.List; -import java.util.Objects; +import java.util.*; /** *

@@ -129,14 +128,47 @@ public class TpApplyFormDAO { } /** - * 根据处罚单id查询申请单 + * 根据处罚单id查询复议申请单 * @param penaltyId 处罚单id * @return 申请单 */ - public TpApplyFormDO getByPenaltyId(Long penaltyId) { + public TpApplyFormDO getAppealByPenaltyId(Long penaltyId) { return tpApplyFormMapper.selectOne(TpApplyFormDO.builder().penaltyId(penaltyId).deleted(0).build()); } + /** + * 根据处罚单id列表查询申请单 + * @param penaltyIds 处罚单id列表 + * @return 申请单列表 + */ + public List getByPenaltyIds(List penaltyIds) { + if (CollectionUtils.isEmpty(penaltyIds)) { + return Collections.emptyList(); + } + Example example = new Example(TpApplyFormDO.class); + example.createCriteria().andIn("penaltyId", penaltyIds).andEqualTo("deleted", 0); + return tpApplyFormMapper.selectByExample(example); + } + + /** + * 过滤存在正在复议的申请单 + * @param penaltyIds 处罚单id列表 + * @return 存在复议的处罚单id列表 + */ + public Set filterExistAppeal(List penaltyIds) { + if (CollectionUtils.isEmpty(penaltyIds)) { + return Collections.emptySet(); + } + Example example = new Example(TpApplyFormDO.class); + example.createCriteria().andIn("penaltyId", penaltyIds) + .andEqualTo("type", TpFormTypeEnum.APPEAL.getType()) + .andEqualTo("status", TpFormStatusEnum.PENDING.getStatus()) + .andEqualTo("deleted", 0); + example.selectProperties("penaltyId"); + List list = tpApplyFormMapper.selectByExample(example); + return CollStreamUtil.toSet(list, TpApplyFormDO::getPenaltyId); + } + /** * 根据id列表查询 */ @@ -150,12 +182,41 @@ public class TpApplyFormDAO { } /** - * 申请单作废 - * @param applyId 申请单id + * 修改申请单状态 */ - public void cancelApply(Long applyId) { + public void updateStatus(Long applyId, TpFormStatusEnum status) { Example example = new Example(TpApplyFormDO.class); example.createCriteria().andEqualTo("id", applyId).andEqualTo("deleted", 0); - tpApplyFormMapper.updateByExampleSelective(TpApplyFormDO.builder().status(TpFormStatusEnum.CANCEL.getStatus()).build(), example); + tpApplyFormMapper.updateByExampleSelective(TpApplyFormDO.builder().status(status.getStatus()).build(), example); + } + + public void updateStatusBatch(List applyIds, TpFormStatusEnum status) { + if (CollectionUtils.isEmpty(applyIds)) { + return ; + } + Example example = new Example(TpApplyFormDO.class); + example.createCriteria().andIn("id", applyIds).andEqualTo("deleted", 0); + tpApplyFormMapper.updateByExampleSelective(TpApplyFormDO.builder().status(status.getStatus()).build(), example); + } + + /** + * 修改缴费状态 + */ + public void updatePayStatus(Long applyId, TpPayStatusEnum payStatus) { + Example example = new Example(TpApplyFormDO.class); + example.createCriteria().andEqualTo("id", applyId).andEqualTo("deleted", 0); + tpApplyFormMapper.updateByExampleSelective(TpApplyFormDO.builder().payStatus(payStatus.getStatus()).build(), example); + } + + /** + * 根据id删除 + */ + public void deleteByIds(List ids) { + if (CollectionUtils.isEmpty(ids)) { + return; + } + Example example = new Example(TpApplyFormDO.class); + example.createCriteria().andIn("id", ids).andEqualTo("deleted", 0); + tpApplyFormMapper.updateByExampleSelective(TpApplyFormDO.builder().deleted(1).build(), example); } } diff --git a/coolstore-partner-dao/src/main/java/com/cool/store/dao/tp/TpAuditRecordDAO.java b/coolstore-partner-dao/src/main/java/com/cool/store/dao/tp/TpAuditRecordDAO.java index 1c2dfaded..85d6a8b7b 100644 --- a/coolstore-partner-dao/src/main/java/com/cool/store/dao/tp/TpAuditRecordDAO.java +++ b/coolstore-partner-dao/src/main/java/com/cool/store/dao/tp/TpAuditRecordDAO.java @@ -1,14 +1,18 @@ package com.cool.store.dao.tp; +import com.alibaba.excel.util.CollectionUtils; +import com.cool.store.constants.CommonConstants; import com.cool.store.entity.tp.TpAuditRecordDO; import com.cool.store.enums.ErrorCodeEnum; +import com.cool.store.enums.OperationLogAuditEnum; import com.cool.store.exception.ServiceException; import com.cool.store.mapper.tp.TpAuditRecordMapper; +import com.cool.store.response.AuditInfoResponse; import lombok.RequiredArgsConstructor; import org.springframework.stereotype.Repository; +import tk.mybatis.mapper.entity.Example; -import java.util.Date; -import java.util.Objects; +import java.util.*; /** *

@@ -25,10 +29,11 @@ public class TpAuditRecordDAO { /** * 新增提交记录 - * @param applyId 申请单id + * + * @param applyId 申请单id * @param applyType 单据类型,0加分单 1警告书 2处罚书 - * @param userId 申请人id - * @param userName 申请人名称 + * @param userId 申请人id + * @param userName 申请人名称 */ public void addSubmitRecord(Long applyId, Integer applyType, String userId, String userName) { Date now = new Date(); @@ -47,7 +52,8 @@ public class TpAuditRecordDAO { /** * 新增审批记录 - * @param applyId 申请单id + * + * @param applyId 申请单id * @param applyType 单据类型,0加分单 1警告书 2处罚书 */ public void addApproveRecord(Long applyId, Integer applyType) { @@ -65,10 +71,11 @@ public class TpAuditRecordDAO { /** * 首次发起流程 - * @param applyId 申请单id + * + * @param applyId 申请单id * @param applyType 单据类型,0加分单 1警告书 2处罚书 - * @param userId 申请人id - * @param userName 申请人名称 + * @param userId 申请人id + * @param userName 申请人名称 */ public void addRecord(Long applyId, Integer applyType, String userId, String userName) { addSubmitRecord(applyId, applyType, userId, userName); @@ -77,7 +84,8 @@ public class TpAuditRecordDAO { /** * 根据申请单id查询待审批记录 - * @param applyId 申请单id + * + * @param applyId 申请单id * @param applyType 单据类型,0加分单 1警告书 2处罚书 * @return 审批记录 */ @@ -92,13 +100,14 @@ public class TpAuditRecordDAO { /** * 根据申请单id审批待处理的审批记录 - * @param applyId 申请单id - * @param applyType 单据类型,0加分单 1警告书 2处罚书 - * @param userId 审批人id - * @param userName 审批人名称 + * + * @param applyId 申请单id + * @param applyType 单据类型,0加分单 1警告书 2处罚书 + * @param userId 审批人id + * @param userName 审批人名称 * @param auditStatus 审批状态 - * @param remark 备注 - * @param auditTime 审批时间 + * @param remark 备注 + * @param auditTime 审批时间 */ public void auditPendingRecordByApplyId(Long applyId, Integer applyType, String userId, String userName, Integer auditStatus, String remark, Date auditTime) { TpAuditRecordDO auditRecordDO = getPendingRecordByApplyId(applyId, applyType); @@ -119,4 +128,64 @@ public class TpAuditRecordDAO { public void updateKeySelective(TpAuditRecordDO recordDO) { tpAuditRecordMapper.updateByPrimaryKeySelective(recordDO); } + + /** + * 审批记录 + * @param applyId 申请单id + * @return 审批记录列表 + */ + public List getAuditRecordList(Long applyId) { + Example example = new Example(TpAuditRecordDO.class); + example.createCriteria() + .andEqualTo("applyId", applyId) + .andEqualTo("deleted", 0); + example.setOrderByClause("createTime ASC"); + List recordList = tpAuditRecordMapper.selectByExample(example); + List result = new ArrayList<>(); + for (TpAuditRecordDO auditRecordDO : recordList) { + AuditInfoResponse response = AuditInfoResponse.builder() + .type(getAuditInfoType(auditRecordDO)) + .execute(auditRecordDO.getRecordType() - 1) + .status(CommonConstants.INDEX_ZERO.equals(auditRecordDO.getAuditStatus()) ? 0 : 1) + .createTime(auditRecordDO.getReceiveTaskTime()) + .remark(auditRecordDO.getRemark()) + .actualUserId(auditRecordDO.getHandlerUserId()) + .build(); + List auditUserList = Collections.singletonList( + new AuditInfoResponse.AuditUserInfoVO(auditRecordDO.getHandlerUserId(), auditRecordDO.getHandlerUserName(), null) + ); + response.setList(auditUserList); + result.add(response); + } + return result; + } + + private Integer getAuditInfoType(TpAuditRecordDO auditRecordDO) { + if (CommonConstants.INDEX_ONE.equals(auditRecordDO.getRecordType())) { + return OperationLogAuditEnum.SUBMIT_AUDIT.getCode(); + } else { + switch (auditRecordDO.getAuditStatus()) { + case 0: + return OperationLogAuditEnum.WAIT_AUDIT.getCode(); + case 1: + return OperationLogAuditEnum.PASS.getCode(); + case 2: + return OperationLogAuditEnum.REFUSE.getCode(); + default: + return null; + } + } + } + + /** + * 根据申请单id删除 + */ + public void deleteByApplyIds(List applyIds) { + if (CollectionUtils.isEmpty(applyIds)) { + return; + } + Example example = new Example(TpAuditRecordDO.class); + example.createCriteria().andIn("applyId", applyIds).andEqualTo("deleted", 0); + tpAuditRecordMapper.updateByExampleSelective(TpAuditRecordDO.builder().deleted(1).build(), example); + } } diff --git a/coolstore-partner-dao/src/main/resources/mapper/tp/TpApplyFormMapper.xml b/coolstore-partner-dao/src/main/resources/mapper/tp/TpApplyFormMapper.xml index 5a88744a9..acb5380f6 100644 --- a/coolstore-partner-dao/src/main/resources/mapper/tp/TpApplyFormMapper.xml +++ b/coolstore-partner-dao/src/main/resources/mapper/tp/TpApplyFormMapper.xml @@ -61,8 +61,11 @@ AND a.rule_id = #{ruleId} - - AND a.status = #{status} + + AND a.status IN + + #{status} + AND a.type = #{type} @@ -83,6 +86,9 @@ AND b.appeal_reason LIKE CONCAT('%', #{appealReason}, '%') + + AND b.is_draft = #{isDraft} + diff --git a/coolstore-partner-model/src/main/java/com/cool/store/request/tp/TpApplyQueryRequest.java b/coolstore-partner-model/src/main/java/com/cool/store/request/tp/TpApplyQueryRequest.java index f0bcb9eb6..627f1e26b 100644 --- a/coolstore-partner-model/src/main/java/com/cool/store/request/tp/TpApplyQueryRequest.java +++ b/coolstore-partner-model/src/main/java/com/cool/store/request/tp/TpApplyQueryRequest.java @@ -1,10 +1,15 @@ package com.cool.store.request.tp; import com.cool.store.common.PageBasicInfo; +import com.cool.store.constants.CommonConstants; import io.swagger.annotations.ApiModelProperty; import lombok.Data; +import org.apache.commons.lang3.StringUtils; import java.math.BigDecimal; +import java.util.Arrays; +import java.util.List; +import java.util.stream.Collectors; /** *

@@ -28,9 +33,12 @@ public class TpApplyQueryRequest extends PageBasicInfo { @ApiModelProperty("规则id") private String ruleId; - @ApiModelProperty("状态") + @ApiModelProperty("状态,可多选逗号隔开") private String status; + @ApiModelProperty(value = "状态列表", hidden = true) + private List statusList; + @ApiModelProperty(value = "单据类型,0加分单 1警告书 2处罚书") private Integer type; @@ -45,4 +53,16 @@ public class TpApplyQueryRequest extends PageBasicInfo { @ApiModelProperty("复议理由") private String appealReason; + + @ApiModelProperty("是否为草稿") + private Integer isDraft; + + public List getStatusList() { + if (StringUtils.isNotBlank(this.status)) { + return null; + } + return Arrays.stream(this.status.split(CommonConstants.COMMA)) + .filter(StringUtils::isNotBlank) + .collect(Collectors.toList()); + } } diff --git a/coolstore-partner-model/src/main/java/com/cool/store/response/AuditInfoResponse.java b/coolstore-partner-model/src/main/java/com/cool/store/response/AuditInfoResponse.java index 5872edb27..303c58d9e 100644 --- a/coolstore-partner-model/src/main/java/com/cool/store/response/AuditInfoResponse.java +++ b/coolstore-partner-model/src/main/java/com/cool/store/response/AuditInfoResponse.java @@ -17,6 +17,9 @@ import java.util.List; * @注释: */ @Data +@AllArgsConstructor +@NoArgsConstructor +@Builder public class AuditInfoResponse { @ApiModelProperty("操作人集合") diff --git a/coolstore-partner-model/src/main/java/com/cool/store/vo/tp/mini/MiniTpAppealVO.java b/coolstore-partner-model/src/main/java/com/cool/store/vo/tp/mini/MiniTpAppealVO.java new file mode 100644 index 000000000..6124d7b5b --- /dev/null +++ b/coolstore-partner-model/src/main/java/com/cool/store/vo/tp/mini/MiniTpAppealVO.java @@ -0,0 +1,38 @@ +package com.cool.store.vo.tp.mini; + +import com.cool.store.annotation.DictField; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +/** + *

+ * Mini复议信息VO + *

+ * + * @author wangff + * @since 2025/11/10 + */ +@Data +public class MiniTpAppealVO { + @ApiModelProperty("id") + private Long id; + + @ApiModelProperty("申请人姓名") + private String applicantName; + + @ApiModelProperty("联系电话") + private String phone; + + @ApiModelProperty("复议理由") + private String appealReason; + + @ApiModelProperty("复议理由名称") + @DictField + private String appealReasonName; + + @ApiModelProperty("复议详细理由") + private String appealDetailReason; + + @ApiModelProperty("证明材料") + private String proofUrls; +} diff --git a/coolstore-partner-model/src/main/java/com/cool/store/vo/tp/mini/MiniTpApplyListVO.java b/coolstore-partner-model/src/main/java/com/cool/store/vo/tp/mini/MiniTpApplyListVO.java new file mode 100644 index 000000000..92aac1871 --- /dev/null +++ b/coolstore-partner-model/src/main/java/com/cool/store/vo/tp/mini/MiniTpApplyListVO.java @@ -0,0 +1,61 @@ +package com.cool.store.vo.tp.mini; + +import com.cool.store.enums.tp.TpFormStatusEnum; +import com.cool.store.enums.tp.TpFormTypeEnum; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +import java.math.BigDecimal; +import java.util.Date; + +/** + *

+ * Mini申请单列表VO + *

+ * + * @author wangff + * @since 2025/11/10 + */ +@Data +public class MiniTpApplyListVO { + @ApiModelProperty("id") + private Long id; + + @ApiModelProperty("单据类型,0加分单 1警告书 2处罚书") + private Integer type; + + @ApiModelProperty("单据类型名称") + private String typeName; + + @ApiModelProperty("项目名称") + private String projectName; + + @ApiModelProperty("创建时间") + private Date createTime; + + @ApiModelProperty("分值") + private BigDecimal score; + + @ApiModelProperty("金额") + private BigDecimal amount; + + @ApiModelProperty("状态") + private String status; + + @ApiModelProperty("状态名称") + private String statusName; + + @ApiModelProperty("是否为草稿") + private Integer isDraft; + + @ApiModelProperty("是否复议中") + private Integer isAppeal; + + public String getTypeName() { + return TpFormTypeEnum.getMsgByType(this.type); + } + + public String getStatusName() { + return TpFormStatusEnum.getMsgByStatus(this.status); + } +} diff --git a/coolstore-partner-model/src/main/java/com/cool/store/vo/tp/mini/MiniTpPenaltyApplyVO.java b/coolstore-partner-model/src/main/java/com/cool/store/vo/tp/mini/MiniTpPenaltyApplyVO.java new file mode 100644 index 000000000..36a2a4c39 --- /dev/null +++ b/coolstore-partner-model/src/main/java/com/cool/store/vo/tp/mini/MiniTpPenaltyApplyVO.java @@ -0,0 +1,76 @@ +package com.cool.store.vo.tp.mini; + +import com.cool.store.annotation.DictField; +import com.cool.store.enums.tp.TpFormStatusEnum; +import com.cool.store.enums.tp.TpPayStatusEnum; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +import java.math.BigDecimal; +import java.time.LocalDate; +import java.util.Date; + +/** + *

+ * Mini惩处申请单详情VO + *

+ * + * @author wangff + * @since 2025/11/10 + */ +@Data +public class MiniTpPenaltyApplyVO { + @ApiModelProperty("id") + private Long id; + + @ApiModelProperty("申请单号") + private String applyNo; + + @ApiModelProperty("项目名称") + private String projectName; + + @ApiModelProperty("项目大类") + private String projectCategory; + + @ApiModelProperty("项目大类名称") + @DictField + private String projectCategoryName; + + @ApiModelProperty("创建时间") + private Date createTime; + + @ApiModelProperty("申请人名称") + private String applyUserName; + + @ApiModelProperty("状态") + private String status; + + @ApiModelProperty("缴费状态") + private Integer payStatus; + + @ApiModelProperty("缴费状态名称") + private String payStatusName; + + @ApiModelProperty("状态名称") + private String statusName; + + @ApiModelProperty("分值") + private BigDecimal score; + + @ApiModelProperty("复议截止日期") + private LocalDate appealEndDate; + + @ApiModelProperty("证明图片列表") + private String proofUrls; + + @ApiModelProperty("复议申请") + private MiniTpAppealVO appeal; + + public String getStatusName() { + return TpFormStatusEnum.getMsgByStatus(this.status); + } + + public String getPayStatusName() { + return TpPayStatusEnum.getMsgByStatus(this.payStatus); + } +} diff --git a/coolstore-partner-model/src/main/java/com/cool/store/vo/tp/mini/MiniTpRewardApplyVO.java b/coolstore-partner-model/src/main/java/com/cool/store/vo/tp/mini/MiniTpRewardApplyVO.java new file mode 100644 index 000000000..99c309e7e --- /dev/null +++ b/coolstore-partner-model/src/main/java/com/cool/store/vo/tp/mini/MiniTpRewardApplyVO.java @@ -0,0 +1,55 @@ +package com.cool.store.vo.tp.mini; + +import com.cool.store.annotation.DictField; +import com.cool.store.enums.tp.TpFormStatusEnum; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +import java.math.BigDecimal; +import java.util.Date; + +/** + *

+ * Mini加分申请单详情VO + *

+ * + * @author wangff + * @since 2025/11/10 + */ +@Data +public class MiniTpRewardApplyVO { + @ApiModelProperty("id") + private Long id; + + @ApiModelProperty("申请单号") + private String applyNo; + + @ApiModelProperty("项目名称") + private String projectName; + + @ApiModelProperty("项目大类") + private String projectCategory; + + @ApiModelProperty("项目大类名称") + @DictField + private String projectCategoryName; + + @ApiModelProperty("创建时间") + private Date createTime; + + @ApiModelProperty("状态") + private String status; + + @ApiModelProperty("状态名称") + private String statusName; + + @ApiModelProperty("分值") + private BigDecimal score; + + @ApiModelProperty("证明图片列表") + private String proofUrls; + + public String getStatusName() { + return TpFormStatusEnum.getMsgByStatus(this.status); + } +} diff --git a/coolstore-partner-model/src/main/java/com/cool/store/vo/tp/mini/MiniTpRuleListVO.java b/coolstore-partner-model/src/main/java/com/cool/store/vo/tp/mini/MiniTpRuleListVO.java new file mode 100644 index 000000000..c2ac09666 --- /dev/null +++ b/coolstore-partner-model/src/main/java/com/cool/store/vo/tp/mini/MiniTpRuleListVO.java @@ -0,0 +1,53 @@ +package com.cool.store.vo.tp.mini; + +import com.cool.store.annotation.DictField; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +import java.math.BigDecimal; + +/** + *

+ * Mini奖惩规则列表VO + *

+ * + * @author wangff + * @since 2025/11/11 + */ +@Data +public class MiniTpRuleListVO { + @ApiModelProperty("id") + private Long id; + + @ApiModelProperty("问题分类") + private String problemClassification; + + @ApiModelProperty("问题分类名称") + @DictField + private String problemClassificationName; + + @ApiModelProperty("项目大类") + private String projectCategory; + + @ApiModelProperty("项目大类名称") + @DictField + private String projectCategoryName; + + @ApiModelProperty("项目名称") + private String projectName; + + @ApiModelProperty("警告上限次数") + private Integer warningLimit; + + @ApiModelProperty("分值") + private BigDecimal score; + + @ApiModelProperty("是否加满,0否 1是") + private Integer isFull; + + @ApiModelProperty("金额") + private BigDecimal amount; + + @ApiModelProperty("项目描述") + private String remark; +} diff --git a/coolstore-partner-service/src/main/java/com/cool/store/service/dict/impl/DictService.java b/coolstore-partner-service/src/main/java/com/cool/store/service/dict/impl/DictService.java index ee04a779b..906dca888 100644 --- a/coolstore-partner-service/src/main/java/com/cool/store/service/dict/impl/DictService.java +++ b/coolstore-partner-service/src/main/java/com/cool/store/service/dict/impl/DictService.java @@ -28,7 +28,11 @@ import java.util.concurrent.ConcurrentHashMap; public class DictService { private final SysDictColumnDAO columnDAO; private final Map, List>> dictFieldCache = new ConcurrentHashMap<>(); + private final Map, Field[]> fieldCache = new ConcurrentHashMap<>(); + /** + * 填充字典字段 + */ public void fillDictField(T obj) { fillDictField(Collections.singletonList(obj)); } @@ -41,12 +45,20 @@ public class DictService { return; } Class clazz = objs.get(0).getClass(); + fillDictField(objs, clazz, new HashSet<>()); + } + + private void fillDictField(List objs, Class clazz, Set processedObjects) { List> dictFields = getDictField(clazz); if (CollectionUtils.isEmpty(dictFields)) { return; } Set columnCodes = new HashSet<>(); + List validObjs = new ArrayList<>(); for (T obj : objs) { + if (obj == null || processedObjects.contains(obj)) continue; + processedObjects.add(obj); + validObjs.add(obj); for (Pair dictField : dictFields) { try { Object value = dictField.getValue().get(obj); @@ -58,19 +70,71 @@ public class DictService { } } } - if (columnCodes.isEmpty()) { - return; - } - Map nameMap = columnDAO.getNameMapByCodes(new ArrayList<>(columnCodes)); - for (T obj : objs) { - for (Pair dictField : dictFields) { - try { - dictField.getKey().set(obj, nameMap.get((String) dictField.getValue().get(obj))); - } catch (IllegalAccessException e) { - log.info("字典字段值填充失败", e); + if (!columnCodes.isEmpty()) { + Map nameMap = columnDAO.getNameMapByCodes(new ArrayList<>(columnCodes)); + for (T obj : objs) { + for (Pair dictField : dictFields) { + try { + dictField.getKey().set(obj, nameMap.get((String) dictField.getValue().get(obj))); + } catch (IllegalAccessException e) { + log.info("字典字段值填充失败", e); + } } } } + processNestedObjects(validObjs, clazz, processedObjects); + } + + private void processNestedObjects(List objs, Class clazz, Set processedObjects) { + Field[] fields = getFieldCache(clazz); + for (Field field : fields) { + if (isComplexObjectField(field)) { + field.setAccessible(true); + + for (T obj : objs) { + if (obj == null) continue; + + try { + Object fieldValue = field.get(obj); + if (fieldValue != null) { + if (fieldValue instanceof Collection) { + // 处理集合类型字段 + Collection collection = (Collection) fieldValue; + List nestedObjs = new ArrayList<>(); + for (Object item : collection) { + if (item != null && isComplexObject(item.getClass())) { + nestedObjs.add(item); + } + } + if (!nestedObjs.isEmpty()) { + fillDictField(nestedObjs, nestedObjs.get(0).getClass(), new HashSet<>(processedObjects)); + } + } else if (isComplexObject(fieldValue.getClass())) { + // 处理单一对象类型字段 + fillDictField(Collections.singletonList(fieldValue), fieldValue.getClass(), processedObjects); + } + } + } catch (IllegalAccessException e) { + log.info("嵌套对象字段获取失败", e); + } + } + } + } + } + + private boolean isComplexObjectField(Field field) { + Class fieldType = field.getType(); + return isComplexObject(fieldType); + } + + private boolean isComplexObject(Class clazz) { + return !clazz.isPrimitive() && + !clazz.getName().startsWith("java") && + !clazz.equals(String.class); + } + + private Field[] getFieldCache(Class clazz) { + return fieldCache.computeIfAbsent(clazz, Class::getDeclaredFields); } private List> getDictField(Class clazz) { diff --git a/coolstore-partner-service/src/main/java/com/cool/store/service/tp/TpApplyService.java b/coolstore-partner-service/src/main/java/com/cool/store/service/tp/TpApplyService.java index 3ee950054..dcb1709cf 100644 --- a/coolstore-partner-service/src/main/java/com/cool/store/service/tp/TpApplyService.java +++ b/coolstore-partner-service/src/main/java/com/cool/store/service/tp/TpApplyService.java @@ -1,12 +1,16 @@ package com.cool.store.service.tp; -import com.cool.store.request.tp.TpAppealApplyRequest; -import com.cool.store.request.tp.TpApplyAuditRequest; -import com.cool.store.request.tp.TpApplyQueryRequest; -import com.cool.store.request.tp.TpApplyRequest; +import com.cool.store.request.tp.*; +import com.cool.store.response.AuditInfoResponse; import com.cool.store.vo.tp.*; +import com.cool.store.vo.tp.mini.MiniTpApplyListVO; +import com.cool.store.vo.tp.mini.MiniTpPenaltyApplyVO; +import com.cool.store.vo.tp.mini.MiniTpRewardApplyVO; +import com.cool.store.vo.tp.mini.MiniTpRuleListVO; import com.github.pagehelper.PageInfo; +import java.util.List; + /** *

* 十二分制-申请单 服务类 @@ -100,4 +104,60 @@ public interface TpApplyService { * @return 是否成功 */ Boolean appealAudit(TpApplyAuditRequest request); + + /** + * 批量删除申请单 + * @param applyIds 申请单id列表 + * @return 是否成功 + */ + Boolean deleteBatch(List applyIds); + + /** + * 获取审批列表 + * @param applyId 申请单id + * @return 审批记录列表 + */ + List getAuditRecordList(Long applyId); + + /** + * Mini获取申请单列表 + * @param request 申请单查询Request + * @return Mini申请单列表VO列表 + */ + PageInfo getMiniApplyList(TpApplyQueryRequest request); + + /** + * Mini获取加分申请单详情 + * @param applyId 申请单id + * @return Mini加分申请单详情VO + */ + MiniTpRewardApplyVO getMiniRewardApplyDetail(Long applyId); + + /** + * Mini获取惩处申请单详情 + * @param applyId 申请单id + * @return Mini惩处申请单详情VO + */ + MiniTpPenaltyApplyVO getMiniPenaltyApplyDetail(Long applyId); + + /** + * Mini规则分页查询 + * @param request 规则查询Request + * @return Mini奖惩规则列表VO列表 + */ + PageInfo getMiniRulePage(TpRuleQueryRequest request); + + /** + * 认罚缴款 + * @param applyId 惩处申请单id + * @return java.lang.Boolean + */ + Boolean acceptPenalty(Long applyId); + + /** + * 完成缴费 + * @param applyId 惩处申请单id + * @return 是否成功 + */ + Boolean completePayment(Long applyId); } diff --git a/coolstore-partner-service/src/main/java/com/cool/store/service/tp/impl/TpApplyServiceImpl.java b/coolstore-partner-service/src/main/java/com/cool/store/service/tp/impl/TpApplyServiceImpl.java index 8a5d2b5dd..7adfa15a5 100644 --- a/coolstore-partner-service/src/main/java/com/cool/store/service/tp/impl/TpApplyServiceImpl.java +++ b/coolstore-partner-service/src/main/java/com/cool/store/service/tp/impl/TpApplyServiceImpl.java @@ -16,15 +16,14 @@ import com.cool.store.enums.tp.TpFormStatusEnum; import com.cool.store.enums.tp.TpFormTypeEnum; import com.cool.store.enums.tp.TpPayStatusEnum; import com.cool.store.exception.ServiceException; -import com.cool.store.request.tp.TpAppealApplyRequest; -import com.cool.store.request.tp.TpApplyAuditRequest; -import com.cool.store.request.tp.TpApplyQueryRequest; -import com.cool.store.request.tp.TpApplyRequest; +import com.cool.store.request.tp.*; +import com.cool.store.response.AuditInfoResponse; import com.cool.store.service.dict.impl.DictService; import com.cool.store.service.tp.TpApplyService; import com.cool.store.utils.BeanUtil; import com.cool.store.utils.TpHelper; import com.cool.store.vo.tp.*; +import com.cool.store.vo.tp.mini.*; import com.github.pagehelper.PageHelper; import com.github.pagehelper.PageInfo; import lombok.RequiredArgsConstructor; @@ -198,20 +197,31 @@ public class TpApplyServiceImpl implements TpApplyService { public Boolean appealApplySubmit(TpAppealApplyRequest request) { TpApplyFormDO formDO = BeanUtil.toBean(request, TpApplyFormDO.class); boolean isDraft = CommonConstants.INDEX_ONE.equals(request.getIsDraft()); - TpApplyFormDO punishFormDO = tpApplyFormDAO.getByPenaltyId(request.getPenaltyId()); - if (Objects.nonNull(punishFormDO) && !isDraft) { - if (TpFormStatusEnum.PENDING.getStatus().equals(punishFormDO.getStatus())) { - throw new ServiceException(ErrorCodeEnum.TP_EXISTS_PENDING_APPLY); + TpApplyFormDO penaltyFormDO = tpApplyFormDAO.getEffectiveById(request.getPenaltyId()); + if (Objects.isNull(penaltyFormDO)) { + throw new ServiceException(ErrorCodeEnum.TP_NOT_EXIST_APPLY_FORM); + } + if (!isDraft) { + TpApplyFormDO appealFormDO = tpApplyFormDAO.getAppealByPenaltyId(request.getPenaltyId()); + // 存在待审批或已审批的复议申请单 + if (Objects.nonNull(appealFormDO)) { + if (TpFormStatusEnum.PENDING.getStatus().equals(appealFormDO.getStatus())) { + throw new ServiceException(ErrorCodeEnum.TP_EXISTS_PENDING_APPLY); + } + if (TpFormStatusEnum.PASS.getStatus().equals(appealFormDO.getStatus())) { + throw new ServiceException(ErrorCodeEnum.TP_PENALTY_APPLY_APPEAL_COMPLETED); + } } - if (TpFormStatusEnum.PASS.getStatus().equals(punishFormDO.getStatus())) { - throw new ServiceException(ErrorCodeEnum.TP_PENALTY_APPLY_APPEAL_COMPLETED); + // 已生效的无法复议 + if (TpFormStatusEnum.EFFECTIVE.getStatus().equals(penaltyFormDO.getStatus())) { + throw new ServiceException(ErrorCodeEnum.TP_PENALTY_APPLY_EFFECTIVE); } } boolean isInsert = Objects.isNull(request.getId()); formDO.setApplyNo(isInsert ? TpHelper.generateAppealNo() : null); - formDO.setRuleId(punishFormDO.getRuleId()); + formDO.setRuleId(penaltyFormDO.getRuleId()); formDO.setType(TpFormTypeEnum.APPEAL.getType()); - formDO.setStoreId(punishFormDO.getStoreId()); + formDO.setStoreId(penaltyFormDO.getStoreId()); fillRuleFields(formDO); tpApplyFormDAO.insertOrUpdate(formDO); // 第一次提交后添加审批记录 @@ -267,6 +277,95 @@ public class TpApplyServiceImpl implements TpApplyService { return true; } + @Override + @Transactional + public Boolean deleteBatch(List applyIds) { + tpApplyFormDAO.deleteByIds(applyIds); + // 删除审批记录 + tpAuditRecordDAO.deleteByApplyIds(applyIds); + return true; + } + + @Override + public List getAuditRecordList(Long applyId) { + return tpAuditRecordDAO.getAuditRecordList(applyId); + } + + @Override + public PageInfo getMiniApplyList(TpApplyQueryRequest request) { + PageHelper.startPage(request.getPageNum(), request.getPageSize()); + List list = tpApplyFormDAO.getEffectiveList(request); + PageInfo page = new PageInfo<>(list); + PageInfo newPage = BeanUtil.toPage(page, MiniTpApplyListVO.class); + List applyList = newPage.getList(); + if (Boolean.TRUE.equals(request.getIsPenalty()) && CollectionUtils.isNotEmpty(applyList)) { + List applyIds = CollStreamUtil.toList(applyList, MiniTpApplyListVO::getId); + Set existAppealSet = tpApplyFormDAO.filterExistAppeal(applyIds); + applyList.forEach(v -> v.setIsAppeal(existAppealSet.contains(v.getId()) ? 1 : 0)); + } + return newPage; + } + + @Override + public MiniTpRewardApplyVO getMiniRewardApplyDetail(Long applyId) { + TpApplyFormDO formDO = tpApplyFormDAO.getEffectiveById(applyId); + return BeanUtil.toBean(formDO, MiniTpRewardApplyVO.class); + } + + @Override + public MiniTpPenaltyApplyVO getMiniPenaltyApplyDetail(Long applyId) { + TpApplyFormDO formDO = tpApplyFormDAO.getEffectiveById(applyId); + if (Objects.nonNull(formDO)) { + MiniTpPenaltyApplyVO vo = BeanUtil.toBean(formDO, MiniTpPenaltyApplyVO.class); + TpApplyFormDO appealForm = tpApplyFormDAO.getAppealByPenaltyId(formDO.getPenaltyId()); + vo.setAppeal(BeanUtil.toBean(appealForm, MiniTpAppealVO.class)); + dictService.fillDictField(vo); + return vo; + } + return null; + } + + @Override + public PageInfo getMiniRulePage(TpRuleQueryRequest request) { + PageHelper.startPage(request.getPageNum(), request.getPageSize()); + List list = tpRuleDAO.getEffectiveList(request); + PageInfo page = new PageInfo<>(list); + PageInfo newPage = BeanUtil.toPage(page, MiniTpRuleListVO.class); + dictService.fillDictField(newPage.getList()); + return newPage; + } + + @Override + public Boolean acceptPenalty(Long applyId) { + // 校验申请单状态是否为审批通过 + TpApplyFormDO formDO = tpApplyFormDAO.getEffectiveById(applyId); + if (Objects.isNull(formDO)) { + throw new ServiceException(ErrorCodeEnum.TP_NOT_EXIST_APPLY_FORM); + } + if (!TpFormStatusEnum.PASS.getStatus().equals(formDO.getStatus())) { + log.info("非审批通过状态无法认缴"); + throw new ServiceException(ErrorCodeEnum.TP_PENALTY_APPLY_UNABLE_ACCEPT); + } + tpApplyFormDAO.updateStatus(applyId, TpFormStatusEnum.EFFECTIVE); + return true; + } + + @Override + public Boolean completePayment(Long applyId) { + TpApplyFormDO formDO = tpApplyFormDAO.getEffectiveById(applyId); + if (Objects.isNull(formDO)) { + throw new ServiceException(ErrorCodeEnum.TP_NOT_EXIST_APPLY_FORM); + } + if (!TpFormStatusEnum.EFFECTIVE.getStatus().equals(formDO.getStatus())) { + throw new ServiceException(ErrorCodeEnum.TP_PENALTY_APPLY_INEFFECTIVE); + } + if (TpPayStatusEnum.NO_NEED_PAY.getStatus().equals(formDO.getPayStatus())) { + throw new ServiceException(ErrorCodeEnum.TP_PENALTY_APPLY_NO_NEED_PAY); + } + tpApplyFormDAO.updatePayStatus(applyId, TpPayStatusEnum.PAID); + return true; + } + /** * 审批通用方法 */ @@ -293,7 +392,7 @@ public class TpApplyServiceImpl implements TpApplyService { private void appealPassResolve(TpApplyFormDO formDO) { if (TpFormStatusEnum.PASS.getStatus().equals(formDO.getStatus())) { // 申诉通过后,处罚单失效 - tpApplyFormDAO.cancelApply(formDO.getPenaltyId()); + tpApplyFormDAO.updateStatus(formDO.getPenaltyId(), TpFormStatusEnum.CANCEL); } } diff --git a/coolstore-partner-web/src/main/java/com/cool/store/controller/webb/TpApplyController.java b/coolstore-partner-web/src/main/java/com/cool/store/controller/webb/TpApplyController.java index a48ac2cb4..e5c5e295f 100644 --- a/coolstore-partner-web/src/main/java/com/cool/store/controller/webb/TpApplyController.java +++ b/coolstore-partner-web/src/main/java/com/cool/store/controller/webb/TpApplyController.java @@ -7,6 +7,7 @@ import com.cool.store.request.tp.TpAppealApplyRequest; import com.cool.store.request.tp.TpApplyAuditRequest; import com.cool.store.request.tp.TpApplyQueryRequest; import com.cool.store.request.tp.TpApplyRequest; +import com.cool.store.response.AuditInfoResponse; import com.cool.store.response.ResponseResult; import com.cool.store.service.tp.TpApplyService; import com.cool.store.vo.tp.*; @@ -19,6 +20,7 @@ import org.springframework.validation.annotation.Validated; import org.springframework.web.bind.annotation.*; import javax.validation.constraints.NotNull; +import java.util.List; /** *

@@ -65,7 +67,6 @@ public class TpApplyController { return ResponseResult.success(tpApplyService.rewardAudit(request)); } - @ApiOperation("惩处申请提交or保存") @PostMapping("/penaltyApplySubmit") public ResponseResult penaltyApplySubmit(@RequestBody @Validated TpApplyRequest request) { @@ -125,4 +126,24 @@ public class TpApplyController { public ResponseResult appealAudit(@RequestBody @Validated TpApplyAuditRequest request) { return ResponseResult.success(tpApplyService.appealAudit(request)); } + + @ApiOperation("根据申请单id批量删除") + @PostMapping("/deleteBatch") + public ResponseResult deleteBatch(@RequestBody List applyIds) { + return ResponseResult.success(tpApplyService.deleteBatch(applyIds)); + } + + @ApiOperation("审批记录列表") + @GetMapping("/auditRecords") + @ApiImplicitParam(name = "applyId", value = "申请单id", required = true, dataType = "Long", paramType = "query") + public ResponseResult> auditRecords(@NotNull(message = "申请单id不能为空") Long applyId) { + return ResponseResult.success(tpApplyService.getAuditRecordList(applyId)); + } + + @ApiOperation("完成缴费") + @PostMapping("/completePayment") + @ApiImplicitParam(name = "applyId", value = "申请单id", required = true, dataType = "Long", paramType = "query") + public ResponseResult completePayment(@NotNull(message = "申请单id不能为空") Long applyId) { + return ResponseResult.success(tpApplyService.completePayment(applyId)); + } } diff --git a/coolstore-partner-web/src/main/java/com/cool/store/controller/webc/MiniTpApplyController.java b/coolstore-partner-web/src/main/java/com/cool/store/controller/webc/MiniTpApplyController.java new file mode 100644 index 000000000..60517a705 --- /dev/null +++ b/coolstore-partner-web/src/main/java/com/cool/store/controller/webc/MiniTpApplyController.java @@ -0,0 +1,115 @@ +package com.cool.store.controller.webc; + +import com.cool.store.context.PartnerUserHolder; +import com.cool.store.enums.tp.TpFormTypeEnum; +import com.cool.store.request.tp.TpAppealApplyRequest; +import com.cool.store.request.tp.TpApplyQueryRequest; +import com.cool.store.request.tp.TpApplyRequest; +import com.cool.store.request.tp.TpRuleQueryRequest; +import com.cool.store.response.AuditInfoResponse; +import com.cool.store.response.ResponseResult; +import com.cool.store.service.tp.TpApplyService; +import com.cool.store.vo.PartnerUserInfoVO; +import com.cool.store.vo.tp.mini.MiniTpApplyListVO; +import com.cool.store.vo.tp.mini.MiniTpPenaltyApplyVO; +import com.cool.store.vo.tp.mini.MiniTpRewardApplyVO; +import com.cool.store.vo.tp.mini.MiniTpRuleListVO; +import com.github.pagehelper.PageInfo; +import io.swagger.annotations.Api; +import io.swagger.annotations.ApiImplicitParam; +import io.swagger.annotations.ApiOperation; +import lombok.RequiredArgsConstructor; +import org.springframework.validation.annotation.Validated; +import org.springframework.web.bind.annotation.*; + +import javax.validation.constraints.NotNull; +import java.util.List; + +/** + *

+ * 十二分制-申请单 前端控制器 + *

+ * + * @author wangff + * @since 2025/11/10 + */ +@Api(tags = "十二分制-申请单") +@RestController +@RequestMapping("/mini/tp/apply") +@RequiredArgsConstructor +public class MiniTpApplyController { + private final TpApplyService tpApplyService; + + @ApiOperation("加分申请提交or保存") + @PostMapping("/rewardApplySubmit") + public ResponseResult rewardApplySubmit(@RequestBody @Validated TpApplyRequest request) { + PartnerUserInfoVO user = PartnerUserHolder.getUser(); + request.setSource(1); + request.setApplyUserId(user.getPartnerId()); + request.setApplyUserName(user.getUsername()); + return ResponseResult.success(tpApplyService.rewardApplySubmit(request)); + } + + @ApiOperation("加分申请单详情") + @GetMapping("/rewardDetail") + @ApiImplicitParam(name = "applyId", value = "加分申请单id", required = true, dataType = "Long", paramType = "query") + public ResponseResult rewardDetail(@NotNull(message = "加分申请单id不能为空") Long applyId) { + return ResponseResult.success(tpApplyService.getMiniRewardApplyDetail(applyId)); + } + + @ApiOperation("加分申请单分页查询") + @GetMapping("/rewardPage") + public ResponseResult> rewardPage(TpApplyQueryRequest request) { + request.setType(TpFormTypeEnum.REWARD.getType()); + return ResponseResult.success(tpApplyService.getMiniApplyList(request)); + } + + @ApiOperation("惩处申请单详情") + @GetMapping("/penaltyDetail") + @ApiImplicitParam(name = "applyId", value = "惩处申请单id", required = true, dataType = "Long", paramType = "query") + public ResponseResult penaltyDetail(@NotNull(message = "惩处申请单id不能为空") Long applyId) { + return ResponseResult.success(tpApplyService.getMiniPenaltyApplyDetail(applyId)); + } + + @ApiOperation("惩处申请单分页查询") + @GetMapping("/penaltyPage") + public ResponseResult> penaltyPage(TpApplyQueryRequest request) { + request.setIsPenalty(true); + request.setIsDraft(0); + return ResponseResult.success(tpApplyService.getMiniApplyList(request)); + } + + @ApiOperation("复议申请提交or保存") + @PostMapping("/appealApplySubmit") + public ResponseResult appealApplySubmit(@RequestBody @Validated TpAppealApplyRequest request) { + PartnerUserInfoVO user = PartnerUserHolder.getUser(); + request.setSource(1); + request.setApplyUserId(user.getPartnerId()); + request.setApplyUserName(user.getUsername()); + return ResponseResult.success(tpApplyService.appealApplySubmit(request)); + } + + @ApiOperation("审批记录列表") + @GetMapping("/auditRecords") + @ApiImplicitParam(name = "applyId", value = "申请单id", required = true, dataType = "Long", paramType = "query") + public ResponseResult> auditRecords(@NotNull(message = "申请单id不能为空") Long applyId) { + return ResponseResult.success(tpApplyService.getAuditRecordList(applyId)); + } + + @ApiOperation("规则分页查询") + @GetMapping("/rulePage") + @ApiImplicitParam(name = "type", value = "规则类型,0惩处 1加分", required = true, dataType = "Integer", paramType = "query") + public ResponseResult> rewardRulePage(@NotNull(message = "规则类型不能为空") Integer type) { + TpRuleQueryRequest request = new TpRuleQueryRequest(); + request.setType(type); + request.setStatus(1); + return ResponseResult.success(tpApplyService.getMiniRulePage(request)); + } + + @ApiOperation("认罚缴款") + @PostMapping("/acceptPenalty") + @ApiImplicitParam(name = "applyId", value = "惩处申请单id", required = true, dataType = "Long", paramType = "query") + public ResponseResult acceptPenalty(@NotNull(message = "惩处申请单id不能为空") Long applyId) { + return ResponseResult.success(tpApplyService.acceptPenalty(applyId)); + } +} diff --git a/coolstore-partner-web/src/main/java/com/cool/store/job/XxlJobHandler.java b/coolstore-partner-web/src/main/java/com/cool/store/job/XxlJobHandler.java index cce519796..b71f54cd3 100644 --- a/coolstore-partner-web/src/main/java/com/cool/store/job/XxlJobHandler.java +++ b/coolstore-partner-web/src/main/java/com/cool/store/job/XxlJobHandler.java @@ -1,20 +1,16 @@ package com.cool.store.job; import cn.hutool.core.collection.CollStreamUtil; -import cn.hutool.core.date.DateUtil; import com.alibaba.fastjson.JSONObject; import com.cool.store.constants.CommonConstants; import com.cool.store.dao.*; +import com.cool.store.dao.tp.TpApplyFormDAO; import com.cool.store.dto.*; -import com.cool.store.dto.decoration.ConstructionScheduleDTO; -import com.cool.store.dto.openPreparation.OpenPlanShopInfoDTO; import com.cool.store.dto.store.StoreOrderTimeDTO; import com.cool.store.entity.*; +import com.cool.store.entity.tp.TpApplyFormDO; import com.cool.store.enums.*; -import com.cool.store.enums.point.ShopStatusEnum; -import com.cool.store.enums.point.ShopSubStageEnum; -import com.cool.store.enums.point.ShopSubStageStatusEnum; -import com.cool.store.exception.ServiceException; +import com.cool.store.enums.tp.TpFormStatusEnum; import com.cool.store.mapper.ApplyLicenseMapper; import com.cool.store.mapper.LineInfoMapper; import com.cool.store.mapper.TrainingExperienceMapper; @@ -22,39 +18,28 @@ import com.cool.store.mq.producer.SimpleMessageService; import com.cool.store.mq.util.HttpRestTemplateService; import com.cool.store.request.ZxjpApiRequest; import com.cool.store.request.bigdata.LatestOrderDateRequest; -import com.cool.store.request.xfsgFirstOrderListRequest; +import com.cool.store.request.tp.TpApplyQueryRequest; import com.cool.store.response.bigdata.LatestOrderDateResponse; -import com.cool.store.response.xfsgFirstOderListResponse; import com.cool.store.service.*; import com.cool.store.service.impl.CommonService; -import com.cool.store.utils.CoolDateUtils; +import com.cool.store.service.tp.TpApplyService; import com.cool.store.utils.MDCUtils; -import com.cool.store.utils.NumberConverter; import com.cool.store.utils.poi.DateUtils; import com.cool.store.utils.poi.StringUtils; -import com.cool.store.utils.poi.constant.Constants; -import com.github.pagehelper.Page; import com.github.pagehelper.PageHelper; import com.xxl.job.core.context.XxlJobHelper; import com.xxl.job.core.handler.annotation.XxlJob; import lombok.extern.slf4j.Slf4j; import org.apache.commons.collections4.CollectionUtils; -import org.jetbrains.annotations.NotNull; import org.springframework.beans.factory.annotation.Value; import org.springframework.stereotype.Service; -import org.springframework.transaction.annotation.Transactional; import javax.annotation.Resource; import java.text.DateFormat; import java.text.ParseException; import java.text.SimpleDateFormat; -import java.time.Instant; import java.time.LocalDate; -import java.time.LocalDateTime; -import java.time.ZoneId; -import java.time.format.DateTimeFormatter; import java.util.*; -import java.util.function.Function; import java.util.stream.Collectors; @Slf4j @@ -121,6 +106,10 @@ public class XxlJobHandler { StoreDao storeDao; @Resource ThirdBigDataService thirdBigDataService; + @Resource + TpApplyFormDAO tpApplyFormDAO; + @Resource + TpApplyService tpApplyService; /** @@ -457,4 +446,36 @@ public class XxlJobHandler { } return null; } + + /** + * 十二分制惩处申请单复议逾期 + */ + @XxlJob("tpPenaltyAppealOverdue") + public void tpPenaltyAppealOverdue() { + MDCUtils.put(CommonConstants.REQUEST_ID, UUID.randomUUID().toString()); + log.info("------start tpPenaltyAppealOverdue------"); + boolean hasNext = true; + int pageNum = 1; + int pageSize = CommonConstants.BATCH_SIZE; + TpApplyQueryRequest request = new TpApplyQueryRequest(); + request.setStatus(TpFormStatusEnum.PASS.getStatus()); + request.setIsPenalty(true); + request.setIsDraft(0); + while (hasNext) { + PageHelper.startPage(pageNum, pageSize); + List list = tpApplyFormDAO.getEffectiveList(request); + if (CollectionUtils.isEmpty(list)) { + break; + } + hasNext = list.size() >= pageSize; + List applyIds = CollStreamUtil.toList(list, TpApplyFormDO::getId); + try { + tpApplyFormDAO.updateStatusBatch(applyIds, TpFormStatusEnum.EFFECTIVE); + } catch (Exception e) { + log.error("超过申诉期,更新申请单状态失败", e); + } + pageNum++; + } + log.info("------end tpPenaltyAppealOverdue------"); + } } From 13c44053c269e6054391417a9384f3517564de87 Mon Sep 17 00:00:00 2001 From: wangff Date: Thu, 13 Nov 2025 10:40:30 +0800 Subject: [PATCH 08/10] =?UTF-8?q?fix:=E9=97=AE=E9=A2=98=E4=BF=AE=E5=A4=8D?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../com/cool/store/utils/CoolDateUtils.java | 5 ++++ .../java/com/cool/store/dao/StoreDao.java | 2 +- .../com/cool/store/dao/tp/TpApplyFormDAO.java | 9 ++++-- .../cool/store/dao/tp/TpAuditRecordDAO.java | 9 ++++-- .../resources/mapper/tp/TpApplyFormMapper.xml | 2 ++ .../cool/store/entity/tp/TpApplyFormDO.java | 2 +- .../store/request/tp/TpApplyQueryRequest.java | 2 +- .../cool/store/request/tp/TpApplyRequest.java | 4 +-- .../cool/store/vo/tp/TpApplyListBaseVO.java | 3 ++ .../store/vo/tp/TpPenaltyApplyDetailVO.java | 4 +-- .../store/vo/tp/TpPenaltyApplyListVO.java | 4 +-- .../vo/tp/mini/MiniTpPenaltyApplyVO.java | 2 +- .../store/service/dict/impl/DictService.java | 13 +++++++-- .../service/tp/impl/TpApplyServiceImpl.java | 28 +++++++++++-------- .../webc/MiniTpApplyController.java | 2 +- 15 files changed, 61 insertions(+), 30 deletions(-) diff --git a/coolstore-partner-common/src/main/java/com/cool/store/utils/CoolDateUtils.java b/coolstore-partner-common/src/main/java/com/cool/store/utils/CoolDateUtils.java index 0507da90c..e66faa121 100644 --- a/coolstore-partner-common/src/main/java/com/cool/store/utils/CoolDateUtils.java +++ b/coolstore-partner-common/src/main/java/com/cool/store/utils/CoolDateUtils.java @@ -184,4 +184,9 @@ public class CoolDateUtils { Duration duration = Duration.between(start, end); return duration.toMinutes(); } + + public static Date localDate2Date(LocalDate localDate) { + ZonedDateTime zonedDateTime = localDate.atStartOfDay(ZoneId.systemDefault()); + return Date.from(zonedDateTime.toInstant()); + } } diff --git a/coolstore-partner-dao/src/main/java/com/cool/store/dao/StoreDao.java b/coolstore-partner-dao/src/main/java/com/cool/store/dao/StoreDao.java index 6e64fe69c..91b95e073 100644 --- a/coolstore-partner-dao/src/main/java/com/cool/store/dao/StoreDao.java +++ b/coolstore-partner-dao/src/main/java/com/cool/store/dao/StoreDao.java @@ -131,7 +131,7 @@ public class StoreDao { * @return 门店id->门店 */ public Map getStoreMapByStoreIds(List storeIds) { - if (CollectionUtils.isNotEmpty(storeIds)) { + if (CollectionUtils.isEmpty(storeIds)) { return Collections.emptyMap(); } List storeList = storeMapper.getStoreByStoreIds(storeIds); diff --git a/coolstore-partner-dao/src/main/java/com/cool/store/dao/tp/TpApplyFormDAO.java b/coolstore-partner-dao/src/main/java/com/cool/store/dao/tp/TpApplyFormDAO.java index 32d681afa..eb44a0f5e 100644 --- a/coolstore-partner-dao/src/main/java/com/cool/store/dao/tp/TpApplyFormDAO.java +++ b/coolstore-partner-dao/src/main/java/com/cool/store/dao/tp/TpApplyFormDAO.java @@ -101,8 +101,9 @@ public class TpApplyFormDAO { example.createCriteria() .andEqualTo("storeId", storeId) .andEqualTo("ruleId", ruleId) - .andIn("status", Arrays.asList(TpFormStatusEnum.PASS.getStatus(), TpFormStatusEnum.EFFECTIVE.getStatus())) - .andNotEqualTo("type", TpFormTypeEnum.REWARD.getType()); + .andNotEqualTo("status", TpFormStatusEnum.CANCEL.getStatus()) + .andIn("type", Arrays.asList(TpFormTypeEnum.WARNING.getType(), TpFormTypeEnum.PENALTY.getType())) + .andEqualTo("deleted", 0); return tpApplyFormMapper.selectCountByExample(example); } @@ -118,7 +119,9 @@ public class TpApplyFormDAO { Example.Criteria criteria = example.createCriteria() .andEqualTo("storeId", storeId) .andEqualTo("ruleId", ruleId) - .andEqualTo("status", TpFormStatusEnum.PENDING.getStatus()); + .andEqualTo("status", TpFormStatusEnum.PENDING.getStatus()) + .andEqualTo("isDraft", 0) + .andEqualTo("deleted", 0); if (isReward) { criteria.andEqualTo("type", TpFormTypeEnum.REWARD.getType()); } else { diff --git a/coolstore-partner-dao/src/main/java/com/cool/store/dao/tp/TpAuditRecordDAO.java b/coolstore-partner-dao/src/main/java/com/cool/store/dao/tp/TpAuditRecordDAO.java index 85d6a8b7b..0fd9c3464 100644 --- a/coolstore-partner-dao/src/main/java/com/cool/store/dao/tp/TpAuditRecordDAO.java +++ b/coolstore-partner-dao/src/main/java/com/cool/store/dao/tp/TpAuditRecordDAO.java @@ -77,9 +77,12 @@ public class TpAuditRecordDAO { * @param userId 申请人id * @param userName 申请人名称 */ - public void addRecord(Long applyId, Integer applyType, String userId, String userName) { - addSubmitRecord(applyId, applyType, userId, userName); - addApproveRecord(applyId, applyType); + public void firstAddRecord(Long applyId, Integer applyType, String userId, String userName) { + TpAuditRecordDO auditRecordDO = getPendingRecordByApplyId(applyId, applyType); + if (Objects.isNull(auditRecordDO)) { + addSubmitRecord(applyId, applyType, userId, userName); + addApproveRecord(applyId, applyType); + } } /** diff --git a/coolstore-partner-dao/src/main/resources/mapper/tp/TpApplyFormMapper.xml b/coolstore-partner-dao/src/main/resources/mapper/tp/TpApplyFormMapper.xml index acb5380f6..30da056b3 100644 --- a/coolstore-partner-dao/src/main/resources/mapper/tp/TpApplyFormMapper.xml +++ b/coolstore-partner-dao/src/main/resources/mapper/tp/TpApplyFormMapper.xml @@ -52,6 +52,7 @@ INNER JOIN store_${enterpriseId} b ON a.store_id = b.store_id AND b.is_delete = 'effective' + deleted = 0 AND a.apply_no LIKE CONCAT('%', #{applyNo}, '%') @@ -90,6 +91,7 @@ AND b.is_draft = #{isDraft} + ORDER BY a.create_time DESC \ No newline at end of file diff --git a/coolstore-partner-model/src/main/java/com/cool/store/entity/tp/TpApplyFormDO.java b/coolstore-partner-model/src/main/java/com/cool/store/entity/tp/TpApplyFormDO.java index 2e244dd1e..81e1f83b7 100644 --- a/coolstore-partner-model/src/main/java/com/cool/store/entity/tp/TpApplyFormDO.java +++ b/coolstore-partner-model/src/main/java/com/cool/store/entity/tp/TpApplyFormDO.java @@ -103,7 +103,7 @@ public class TpApplyFormDO { * 申请复议截止日期 */ @Column(name = "appeal_end_date") - private LocalDate appealEndDate; + private Date appealEndDate; /** * 状态 diff --git a/coolstore-partner-model/src/main/java/com/cool/store/request/tp/TpApplyQueryRequest.java b/coolstore-partner-model/src/main/java/com/cool/store/request/tp/TpApplyQueryRequest.java index 627f1e26b..77b2062e0 100644 --- a/coolstore-partner-model/src/main/java/com/cool/store/request/tp/TpApplyQueryRequest.java +++ b/coolstore-partner-model/src/main/java/com/cool/store/request/tp/TpApplyQueryRequest.java @@ -58,7 +58,7 @@ public class TpApplyQueryRequest extends PageBasicInfo { private Integer isDraft; public List getStatusList() { - if (StringUtils.isNotBlank(this.status)) { + if (StringUtils.isBlank(this.status)) { return null; } return Arrays.stream(this.status.split(CommonConstants.COMMA)) diff --git a/coolstore-partner-model/src/main/java/com/cool/store/request/tp/TpApplyRequest.java b/coolstore-partner-model/src/main/java/com/cool/store/request/tp/TpApplyRequest.java index b1987112d..e741f0913 100644 --- a/coolstore-partner-model/src/main/java/com/cool/store/request/tp/TpApplyRequest.java +++ b/coolstore-partner-model/src/main/java/com/cool/store/request/tp/TpApplyRequest.java @@ -6,7 +6,7 @@ import lombok.Data; import javax.validation.constraints.NotBlank; import javax.validation.constraints.NotNull; import java.math.BigDecimal; -import java.time.LocalDate; +import java.util.Date; /** *

@@ -56,5 +56,5 @@ public class TpApplyRequest { private BigDecimal amount; @ApiModelProperty("申请复议截止日期,yyyy-MM-dd") - private LocalDate appealEndDate; + private Date appealEndDate; } diff --git a/coolstore-partner-model/src/main/java/com/cool/store/vo/tp/TpApplyListBaseVO.java b/coolstore-partner-model/src/main/java/com/cool/store/vo/tp/TpApplyListBaseVO.java index 5d225c066..ed8798ada 100644 --- a/coolstore-partner-model/src/main/java/com/cool/store/vo/tp/TpApplyListBaseVO.java +++ b/coolstore-partner-model/src/main/java/com/cool/store/vo/tp/TpApplyListBaseVO.java @@ -76,6 +76,9 @@ public class TpApplyListBaseVO { @ApiModelProperty("审核时间") private Date approveTime; + @ApiModelProperty("是否为草稿 0否 1是") + private Integer isDraft; + public String getStatusName() { return TpFormStatusEnum.getMsgByStatus(this.status); } diff --git a/coolstore-partner-model/src/main/java/com/cool/store/vo/tp/TpPenaltyApplyDetailVO.java b/coolstore-partner-model/src/main/java/com/cool/store/vo/tp/TpPenaltyApplyDetailVO.java index 0e81ab8d2..236b0ba09 100644 --- a/coolstore-partner-model/src/main/java/com/cool/store/vo/tp/TpPenaltyApplyDetailVO.java +++ b/coolstore-partner-model/src/main/java/com/cool/store/vo/tp/TpPenaltyApplyDetailVO.java @@ -6,7 +6,7 @@ import io.swagger.annotations.ApiModelProperty; import lombok.Data; import java.math.BigDecimal; -import java.time.LocalDate; +import java.util.Date; /** *

@@ -59,7 +59,7 @@ public class TpPenaltyApplyDetailVO { private BigDecimal amount; @ApiModelProperty("申请复议截止日期") - private LocalDate appealEndDate; + private Date appealEndDate; @ApiModelProperty("备注") private String remark; diff --git a/coolstore-partner-model/src/main/java/com/cool/store/vo/tp/TpPenaltyApplyListVO.java b/coolstore-partner-model/src/main/java/com/cool/store/vo/tp/TpPenaltyApplyListVO.java index b71ac95f4..8846d7830 100644 --- a/coolstore-partner-model/src/main/java/com/cool/store/vo/tp/TpPenaltyApplyListVO.java +++ b/coolstore-partner-model/src/main/java/com/cool/store/vo/tp/TpPenaltyApplyListVO.java @@ -6,7 +6,7 @@ import io.swagger.annotations.ApiModelProperty; import lombok.Data; import java.math.BigDecimal; -import java.time.LocalDate; +import java.util.Date; /** *

@@ -29,7 +29,7 @@ public class TpPenaltyApplyListVO extends TpApplyListBaseVO { private BigDecimal amount; @ApiModelProperty("申请复议截止日期") - private LocalDate appealEndDate; + private Date appealEndDate; @ApiModelProperty("缴费状态") private Integer payStatus; diff --git a/coolstore-partner-model/src/main/java/com/cool/store/vo/tp/mini/MiniTpPenaltyApplyVO.java b/coolstore-partner-model/src/main/java/com/cool/store/vo/tp/mini/MiniTpPenaltyApplyVO.java index 36a2a4c39..687db2cb2 100644 --- a/coolstore-partner-model/src/main/java/com/cool/store/vo/tp/mini/MiniTpPenaltyApplyVO.java +++ b/coolstore-partner-model/src/main/java/com/cool/store/vo/tp/mini/MiniTpPenaltyApplyVO.java @@ -58,7 +58,7 @@ public class MiniTpPenaltyApplyVO { private BigDecimal score; @ApiModelProperty("复议截止日期") - private LocalDate appealEndDate; + private Date appealEndDate; @ApiModelProperty("证明图片列表") private String proofUrls; diff --git a/coolstore-partner-service/src/main/java/com/cool/store/service/dict/impl/DictService.java b/coolstore-partner-service/src/main/java/com/cool/store/service/dict/impl/DictService.java index 906dca888..34ee56693 100644 --- a/coolstore-partner-service/src/main/java/com/cool/store/service/dict/impl/DictService.java +++ b/coolstore-partner-service/src/main/java/com/cool/store/service/dict/impl/DictService.java @@ -134,7 +134,16 @@ public class DictService { } private Field[] getFieldCache(Class clazz) { - return fieldCache.computeIfAbsent(clazz, Class::getDeclaredFields); + return fieldCache.computeIfAbsent(clazz, this::getAllFields); + } + + private Field[] getAllFields(Class clazz) { + List fields = new ArrayList<>(); + while (clazz != null && !clazz.equals(Object.class)) { + Collections.addAll(fields, clazz.getDeclaredFields()); + clazz = clazz.getSuperclass(); + } + return fields.toArray(new Field[0]); } private List> getDictField(Class clazz) { @@ -142,7 +151,7 @@ public class DictService { } private List> computeDictFields(Class clazz) { - Field[] fields = clazz.getDeclaredFields(); + Field[] fields = getFieldCache(clazz); Map fieldMap = CollStreamUtil.toMap(Arrays.asList(fields), Field::getName, v -> v); List> dictFields = new ArrayList<>(); for (Field field : fields) { diff --git a/coolstore-partner-service/src/main/java/com/cool/store/service/tp/impl/TpApplyServiceImpl.java b/coolstore-partner-service/src/main/java/com/cool/store/service/tp/impl/TpApplyServiceImpl.java index 7adfa15a5..872a8c1f6 100644 --- a/coolstore-partner-service/src/main/java/com/cool/store/service/tp/impl/TpApplyServiceImpl.java +++ b/coolstore-partner-service/src/main/java/com/cool/store/service/tp/impl/TpApplyServiceImpl.java @@ -21,6 +21,7 @@ import com.cool.store.response.AuditInfoResponse; import com.cool.store.service.dict.impl.DictService; import com.cool.store.service.tp.TpApplyService; import com.cool.store.utils.BeanUtil; +import com.cool.store.utils.CoolDateUtils; import com.cool.store.utils.TpHelper; import com.cool.store.vo.tp.*; import com.cool.store.vo.tp.mini.*; @@ -75,8 +76,7 @@ public class TpApplyServiceImpl implements TpApplyService { throw new ServiceException(ErrorCodeEnum.TP_SCORE_EQUAL_TWELVE); } TpApplyFormDO formDO = BeanUtil.toBean(request, TpApplyFormDO.class); - boolean isInsert = Objects.isNull(request.getId()); - if (isInsert) { + if (Objects.isNull(request.getId())) { formDO.setApplyNo(TpHelper.generateApplyNo(TpFormTypeEnum.REWARD.getType())); formDO.setType(TpFormTypeEnum.REWARD.getType()); formDO.setPayStatus(TpPayStatusEnum.NO_NEED_PAY.getStatus()); @@ -84,8 +84,8 @@ public class TpApplyServiceImpl implements TpApplyService { fillRuleFields(formDO); tpApplyFormDAO.insertOrUpdate(formDO); // 第一次提交后添加审批记录 - if (isInsert && !isDraft) { - tpAuditRecordDAO.addRecord(formDO.getId(), TpFormTypeEnum.REWARD.getType(), request.getApplyUserId(), request.getApplyUserName()); + if (!isDraft) { + tpAuditRecordDAO.firstAddRecord(formDO.getId(), formDO.getType(), request.getApplyUserId(), request.getApplyUserName()); } return true; } @@ -126,12 +126,13 @@ public class TpApplyServiceImpl implements TpApplyService { throw new ServiceException(ErrorCodeEnum.TP_EXISTS_PENDING_APPLY); } boolean isInsert = Objects.isNull(request.getId()); + formDO.setType(isInsert ? TpFormTypeEnum.PENALTY.getType() : null); formDO.setApplyNo(isInsert ? TpHelper.generateApplyNo(formDO.getType()) : null); fillRuleFields(formDO); tpApplyFormDAO.insertOrUpdate(formDO); // 第一次提交后添加审批记录 - if (isInsert && !isDraft) { - tpAuditRecordDAO.addRecord(formDO.getId(), TpFormTypeEnum.PENALTY.getType(), request.getApplyUserId(), request.getApplyUserName()); + if (!isDraft) { + tpAuditRecordDAO.firstAddRecord(formDO.getId(), formDO.getType(), request.getApplyUserId(), request.getApplyUserName()); } return true; } @@ -225,8 +226,8 @@ public class TpApplyServiceImpl implements TpApplyService { fillRuleFields(formDO); tpApplyFormDAO.insertOrUpdate(formDO); // 第一次提交后添加审批记录 - if (isInsert && !isDraft) { - tpAuditRecordDAO.addRecord(formDO.getId(), TpFormTypeEnum.APPEAL.getType(), request.getApplyUserId(), request.getApplyUserName()); + if (!isDraft) { + tpAuditRecordDAO.firstAddRecord(formDO.getId(), formDO.getType(), request.getApplyUserId(), request.getApplyUserName()); } return true; } @@ -452,11 +453,16 @@ public class TpApplyServiceImpl implements TpApplyService { // 扣分 if (CommonConstants.INDEX_ZERO.equals(ruleDO.getType())) { if (Objects.isNull(formDO.getAppealEndDate())) { - formDO.setAppealEndDate(LocalDate.now().plusDays(ruleDO.getAppealDeadline())); + formDO.setAppealEndDate(CoolDateUtils.localDate2Date(LocalDate.now().plusDays(ruleDO.getAppealDeadline()))); } // 超过警告次数的为处罚单,否则警告单 int penaltyCount = tpApplyFormDAO.getPenaltyCount(formDO.getStoreId(), formDO.getRuleId()); - formDO.setType(ruleDO.getWarningLimit().compareTo(penaltyCount) <= 0 ? TpFormTypeEnum.PENALTY.getType() : TpFormTypeEnum.WARNING.getType()); + Integer type = ruleDO.getWarningLimit().compareTo(penaltyCount) <= 0 ? TpFormTypeEnum.PENALTY.getType() : TpFormTypeEnum.WARNING.getType(); + formDO.setType(type); + if (TpFormTypeEnum.WARNING.getType().equals(type)) { + formDO.setAmount(null); + formDO.setScore(null); + } // 是否缴费 formDO.setPayStatus(Objects.nonNull(ruleDO.getAmount()) && BigDecimal.ZERO.compareTo(ruleDO.getAmount()) < 0 ? TpPayStatusEnum.UNPAID.getStatus() : TpPayStatusEnum.NO_NEED_PAY.getStatus()); } @@ -466,7 +472,7 @@ public class TpApplyServiceImpl implements TpApplyService { * 填充列表相关字段 */ private void fillListFields(List list) { - if (CollectionUtils.isNotEmpty(list)) return; + if (CollectionUtils.isEmpty(list)) return; dictService.fillDictField(list); Set storeIds = CollStreamUtil.toSet(list, TpApplyListBaseVO::getStoreId); Set approveUserIds = CollStreamUtil.toSet(list, TpApplyListBaseVO::getApproveUserId); diff --git a/coolstore-partner-web/src/main/java/com/cool/store/controller/webc/MiniTpApplyController.java b/coolstore-partner-web/src/main/java/com/cool/store/controller/webc/MiniTpApplyController.java index 60517a705..9a4534ae0 100644 --- a/coolstore-partner-web/src/main/java/com/cool/store/controller/webc/MiniTpApplyController.java +++ b/coolstore-partner-web/src/main/java/com/cool/store/controller/webc/MiniTpApplyController.java @@ -33,7 +33,7 @@ import java.util.List; * @author wangff * @since 2025/11/10 */ -@Api(tags = "十二分制-申请单") +@Api(tags = "Mini十二分制-申请单") @RestController @RequestMapping("/mini/tp/apply") @RequiredArgsConstructor From 4e5c228974cee006392d4a37d6d6ec4cf948ec8c Mon Sep 17 00:00:00 2001 From: wangff Date: Thu, 20 Nov 2025 14:31:12 +0800 Subject: [PATCH 09/10] =?UTF-8?q?fix:=E5=8D=81=E4=BA=8C=E5=88=86=E6=8E=A5?= =?UTF-8?q?=E5=8F=A3=E9=80=BB=E8=BE=91=E5=AE=8C=E5=96=84?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../com/cool/store/dao/tp/TpApplyFormDAO.java | 12 ++--- .../cool/store/dao/tp/TpAuditRecordDAO.java | 3 +- .../cool/store/dao/tp/TpScoreJournalDAO.java | 2 +- .../resources/mapper/tp/TpApplyFormMapper.xml | 9 ++-- .../store/request/tp/TpApplyQueryRequest.java | 17 ++---- .../cool/store/service/tp/TpApplyService.java | 7 +++ .../service/tp/impl/TpApplyServiceImpl.java | 52 ++++++++++--------- .../controller/webb/TpApplyController.java | 12 ++--- .../controller/webb/TpRuleController.java | 8 +-- .../webb/TpScoreJournalController.java | 8 ++- .../webc/MiniTpApplyController.java | 8 +-- .../com/cool/store/job/XxlJobHandler.java | 11 +++- 12 files changed, 79 insertions(+), 70 deletions(-) diff --git a/coolstore-partner-dao/src/main/java/com/cool/store/dao/tp/TpApplyFormDAO.java b/coolstore-partner-dao/src/main/java/com/cool/store/dao/tp/TpApplyFormDAO.java index eb44a0f5e..dc3a459e1 100644 --- a/coolstore-partner-dao/src/main/java/com/cool/store/dao/tp/TpApplyFormDAO.java +++ b/coolstore-partner-dao/src/main/java/com/cool/store/dao/tp/TpApplyFormDAO.java @@ -1,7 +1,6 @@ package com.cool.store.dao.tp; import cn.hutool.core.collection.CollStreamUtil; -import com.alibaba.excel.util.CollectionUtils; import com.cool.store.entity.tp.TpApplyFormDO; import com.cool.store.enums.tp.TpFormStatusEnum; import com.cool.store.enums.tp.TpFormTypeEnum; @@ -9,6 +8,7 @@ import com.cool.store.enums.tp.TpPayStatusEnum; import com.cool.store.mapper.tp.TpApplyFormMapper; import com.cool.store.request.tp.TpApplyQueryRequest; import lombok.RequiredArgsConstructor; +import org.apache.commons.collections4.CollectionUtils; import org.springframework.stereotype.Repository; import tk.mybatis.mapper.entity.Example; @@ -111,10 +111,10 @@ public class TpApplyFormDAO { * 是否存在待审批的申请单 * @param storeId 门店id * @param ruleId 规则id - * @param isReward 是否是加分申请 + * @param types 单据类型 * @return 是否存在 */ - public boolean existsPendingApply(String storeId, Long ruleId, boolean isReward) { + public boolean existsPendingApply(String storeId, Long ruleId, List types) { Example example = new Example(TpApplyFormDO.class); Example.Criteria criteria = example.createCriteria() .andEqualTo("storeId", storeId) @@ -122,10 +122,8 @@ public class TpApplyFormDAO { .andEqualTo("status", TpFormStatusEnum.PENDING.getStatus()) .andEqualTo("isDraft", 0) .andEqualTo("deleted", 0); - if (isReward) { - criteria.andEqualTo("type", TpFormTypeEnum.REWARD.getType()); - } else { - criteria.andNotEqualTo("type", TpFormTypeEnum.REWARD.getType()); + if (CollectionUtils.isNotEmpty(types)) { + criteria.andIn("type", types); } return tpApplyFormMapper.selectCountByExample(example) > 0; } diff --git a/coolstore-partner-dao/src/main/java/com/cool/store/dao/tp/TpAuditRecordDAO.java b/coolstore-partner-dao/src/main/java/com/cool/store/dao/tp/TpAuditRecordDAO.java index 0fd9c3464..8299713ce 100644 --- a/coolstore-partner-dao/src/main/java/com/cool/store/dao/tp/TpAuditRecordDAO.java +++ b/coolstore-partner-dao/src/main/java/com/cool/store/dao/tp/TpAuditRecordDAO.java @@ -141,8 +141,9 @@ public class TpAuditRecordDAO { Example example = new Example(TpAuditRecordDO.class); example.createCriteria() .andEqualTo("applyId", applyId) + .andNotEqualTo("auditStatus", 0) .andEqualTo("deleted", 0); - example.setOrderByClause("createTime ASC"); + example.setOrderByClause("create_time ASC"); List recordList = tpAuditRecordMapper.selectByExample(example); List result = new ArrayList<>(); for (TpAuditRecordDO auditRecordDO : recordList) { diff --git a/coolstore-partner-dao/src/main/java/com/cool/store/dao/tp/TpScoreJournalDAO.java b/coolstore-partner-dao/src/main/java/com/cool/store/dao/tp/TpScoreJournalDAO.java index 762b54193..0d2951956 100644 --- a/coolstore-partner-dao/src/main/java/com/cool/store/dao/tp/TpScoreJournalDAO.java +++ b/coolstore-partner-dao/src/main/java/com/cool/store/dao/tp/TpScoreJournalDAO.java @@ -61,7 +61,7 @@ public class TpScoreJournalDAO { if (StringUtils.isNotBlank(request.getApplyNo())) { criteria.andLike("applyNo", "%" + request.getApplyNo() + "%"); } - example.setOrderByClause("createTime DESC"); + example.setOrderByClause("create_time DESC"); return tpScoreJournalMapper.selectByExample(example); } } diff --git a/coolstore-partner-dao/src/main/resources/mapper/tp/TpApplyFormMapper.xml b/coolstore-partner-dao/src/main/resources/mapper/tp/TpApplyFormMapper.xml index 30da056b3..441492861 100644 --- a/coolstore-partner-dao/src/main/resources/mapper/tp/TpApplyFormMapper.xml +++ b/coolstore-partner-dao/src/main/resources/mapper/tp/TpApplyFormMapper.xml @@ -78,17 +78,20 @@ AND a.score = #{score} - AND a.type != 0 + AND (a.type = 1 OR a.type = 2) AND (b.store_name LIKE CONCAT('%', #{storeNameOrNum}, '%') OR b.store_num LIKE CONCAT('%', #{storeNameOrNum}, '%') - AND b.appeal_reason LIKE CONCAT('%', #{appealReason}, '%') + AND a.appeal_reason LIKE CONCAT('%', #{appealReason}, '%') - AND b.is_draft = #{isDraft} + AND a.is_draft = #{isDraft} + + + AND a.appeal_end_date < CURRENT_DATE ORDER BY a.create_time DESC diff --git a/coolstore-partner-model/src/main/java/com/cool/store/request/tp/TpApplyQueryRequest.java b/coolstore-partner-model/src/main/java/com/cool/store/request/tp/TpApplyQueryRequest.java index 77b2062e0..e9d11ad19 100644 --- a/coolstore-partner-model/src/main/java/com/cool/store/request/tp/TpApplyQueryRequest.java +++ b/coolstore-partner-model/src/main/java/com/cool/store/request/tp/TpApplyQueryRequest.java @@ -33,10 +33,7 @@ public class TpApplyQueryRequest extends PageBasicInfo { @ApiModelProperty("规则id") private String ruleId; - @ApiModelProperty("状态,可多选逗号隔开") - private String status; - - @ApiModelProperty(value = "状态列表", hidden = true) + @ApiModelProperty(value = "状态列表") private List statusList; @ApiModelProperty(value = "单据类型,0加分单 1警告书 2处罚书") @@ -51,18 +48,12 @@ public class TpApplyQueryRequest extends PageBasicInfo { @ApiModelProperty(value = "是惩处单", hidden = true) private Boolean isPenalty; - @ApiModelProperty("复议理由") + @ApiModelProperty("复议理由,字典表") private String appealReason; @ApiModelProperty("是否为草稿") private Integer isDraft; - public List getStatusList() { - if (StringUtils.isBlank(this.status)) { - return null; - } - return Arrays.stream(this.status.split(CommonConstants.COMMA)) - .filter(StringUtils::isNotBlank) - .collect(Collectors.toList()); - } + @ApiModelProperty(value = "是否已逾期", hidden = true) + private Boolean overdue; } diff --git a/coolstore-partner-service/src/main/java/com/cool/store/service/tp/TpApplyService.java b/coolstore-partner-service/src/main/java/com/cool/store/service/tp/TpApplyService.java index dcb1709cf..0dfd11fd3 100644 --- a/coolstore-partner-service/src/main/java/com/cool/store/service/tp/TpApplyService.java +++ b/coolstore-partner-service/src/main/java/com/cool/store/service/tp/TpApplyService.java @@ -1,5 +1,6 @@ package com.cool.store.service.tp; +import com.cool.store.entity.tp.TpApplyFormDO; import com.cool.store.request.tp.*; import com.cool.store.response.AuditInfoResponse; import com.cool.store.vo.tp.*; @@ -160,4 +161,10 @@ public interface TpApplyService { * @return 是否成功 */ Boolean completePayment(Long applyId); + + /** + * 积分变动 + * @param formDO 申请单DO + */ + void scoreChange(TpApplyFormDO formDO); } diff --git a/coolstore-partner-service/src/main/java/com/cool/store/service/tp/impl/TpApplyServiceImpl.java b/coolstore-partner-service/src/main/java/com/cool/store/service/tp/impl/TpApplyServiceImpl.java index 872a8c1f6..b2a1e0232 100644 --- a/coolstore-partner-service/src/main/java/com/cool/store/service/tp/impl/TpApplyServiceImpl.java +++ b/coolstore-partner-service/src/main/java/com/cool/store/service/tp/impl/TpApplyServiceImpl.java @@ -68,7 +68,7 @@ public class TpApplyServiceImpl implements TpApplyService { if (!isDraft && tpApplyFormDAO.existPassRewardForm(request.getStoreId(), request.getRuleId())) { throw new ServiceException(ErrorCodeEnum.TP_MONTH_EXIST_APPLY); } - if (!isDraft && tpApplyFormDAO.existsPendingApply(request.getStoreId(), request.getRuleId(), true)) { + if (!isDraft && tpApplyFormDAO.existsPendingApply(request.getStoreId(), request.getRuleId(), Collections.singletonList(TpFormTypeEnum.REWARD.getType()))) { throw new ServiceException(ErrorCodeEnum.TP_EXISTS_PENDING_APPLY); } BigDecimal score = storeDao.getStoreScore(request.getStoreId()); @@ -122,13 +122,11 @@ public class TpApplyServiceImpl implements TpApplyService { TpApplyFormDO formDO = BeanUtil.toBean(request, TpApplyFormDO.class); // 如果存在审批中的申请,则不允许再次提交 boolean isDraft = CommonConstants.INDEX_ONE.equals(request.getIsDraft()); - if (!isDraft && tpApplyFormDAO.existsPendingApply(request.getStoreId(), request.getRuleId(), false)) { + if (!isDraft && tpApplyFormDAO.existsPendingApply(request.getStoreId(), request.getRuleId(), Arrays.asList(TpFormTypeEnum.PENALTY.getType(), TpFormTypeEnum.WARNING.getType()))) { throw new ServiceException(ErrorCodeEnum.TP_EXISTS_PENDING_APPLY); } - boolean isInsert = Objects.isNull(request.getId()); - formDO.setType(isInsert ? TpFormTypeEnum.PENALTY.getType() : null); - formDO.setApplyNo(isInsert ? TpHelper.generateApplyNo(formDO.getType()) : null); fillRuleFields(formDO); + formDO.setApplyNo(Objects.isNull(request.getId()) ? TpHelper.generateApplyNo(formDO.getType()) : null); tpApplyFormDAO.insertOrUpdate(formDO); // 第一次提交后添加审批记录 if (!isDraft) { @@ -218,8 +216,7 @@ public class TpApplyServiceImpl implements TpApplyService { throw new ServiceException(ErrorCodeEnum.TP_PENALTY_APPLY_EFFECTIVE); } } - boolean isInsert = Objects.isNull(request.getId()); - formDO.setApplyNo(isInsert ? TpHelper.generateAppealNo() : null); + formDO.setApplyNo(Objects.isNull(request.getId()) ? TpHelper.generateAppealNo() : null); formDO.setRuleId(penaltyFormDO.getRuleId()); formDO.setType(TpFormTypeEnum.APPEAL.getType()); formDO.setStoreId(penaltyFormDO.getStoreId()); @@ -337,6 +334,7 @@ public class TpApplyServiceImpl implements TpApplyService { } @Override + @Transactional public Boolean acceptPenalty(Long applyId) { // 校验申请单状态是否为审批通过 TpApplyFormDO formDO = tpApplyFormDAO.getEffectiveById(applyId); @@ -348,6 +346,7 @@ public class TpApplyServiceImpl implements TpApplyService { throw new ServiceException(ErrorCodeEnum.TP_PENALTY_APPLY_UNABLE_ACCEPT); } tpApplyFormDAO.updateStatus(applyId, TpFormStatusEnum.EFFECTIVE); + scoreChange(formDO); return true; } @@ -381,8 +380,8 @@ public class TpApplyServiceImpl implements TpApplyService { tpAuditRecordDAO.auditPendingRecordByApplyId(request.getApplyId(), formDO.getType(), user.getUserId(), user.getName(), request.getAuditStatus(), request.getRemark(), now); if (TpFormTypeEnum.APPEAL.getType().equals(formDO.getType())) { appealPassResolve(formDO); - } else { - // 审批通过后门店积分变动 + } else if (TpFormTypeEnum.REWARD.getType().equals(formDO.getType())) { + // 加分审批通过后门店积分变动 scoreChange(formDO); } } @@ -400,7 +399,8 @@ public class TpApplyServiceImpl implements TpApplyService { /** * 门店积分变动 */ - private void scoreChange(TpApplyFormDO formDO) { + @Override + public void scoreChange(TpApplyFormDO formDO) { if (TpFormStatusEnum.PASS.getStatus().equals(formDO.getStatus())) { BigDecimal occurBeforeScore = storeDao.getStoreScore(formDO.getStoreId()); BigDecimal occurAfterScore = null; @@ -421,13 +421,13 @@ public class TpApplyServiceImpl implements TpApplyService { // 修改门店积分 if (Objects.nonNull(occurAfterScore)) { storeDao.updateStoreScore(formDO.getStoreId(), occurAfterScore); + StoreDO storeDO = storeDao.getEffectiveByStoreId(formDO.getStoreId()); + if (Objects.isNull(storeDO)) { + throw new ServiceException(ErrorCodeEnum.STORE_NOT_FIND); + } + // 添加积分流水 + tpScoreJournalDAO.insertSelective(new TpScoreJournalDO(storeDO, formDO, occurScore, occurBeforeScore, occurAfterScore)); } - StoreDO storeDO = storeDao.getEffectiveByStoreId(formDO.getStoreId()); - if (Objects.isNull(storeDO)) { - throw new ServiceException(ErrorCodeEnum.STORE_NOT_FIND); - } - // 添加积分流水 - tpScoreJournalDAO.insertSelective(new TpScoreJournalDO(storeDO, formDO, occurScore, occurBeforeScore, occurAfterScore)); } } @@ -455,17 +455,19 @@ public class TpApplyServiceImpl implements TpApplyService { if (Objects.isNull(formDO.getAppealEndDate())) { formDO.setAppealEndDate(CoolDateUtils.localDate2Date(LocalDate.now().plusDays(ruleDO.getAppealDeadline()))); } - // 超过警告次数的为处罚单,否则警告单 - int penaltyCount = tpApplyFormDAO.getPenaltyCount(formDO.getStoreId(), formDO.getRuleId()); - Integer type = ruleDO.getWarningLimit().compareTo(penaltyCount) <= 0 ? TpFormTypeEnum.PENALTY.getType() : TpFormTypeEnum.WARNING.getType(); - formDO.setType(type); - if (TpFormTypeEnum.WARNING.getType().equals(type)) { - formDO.setAmount(null); - formDO.setScore(null); + if (Objects.isNull(formDO.getType())) { + // 超过警告次数的为处罚单,否则警告单 + int penaltyCount = tpApplyFormDAO.getPenaltyCount(formDO.getStoreId(), formDO.getRuleId()); + Integer type = ruleDO.getWarningLimit().compareTo(penaltyCount) <= 0 ? TpFormTypeEnum.PENALTY.getType() : TpFormTypeEnum.WARNING.getType(); + formDO.setType(type); + if (TpFormTypeEnum.WARNING.getType().equals(type)) { + formDO.setAmount(null); + formDO.setScore(null); + } } - // 是否缴费 - formDO.setPayStatus(Objects.nonNull(ruleDO.getAmount()) && BigDecimal.ZERO.compareTo(ruleDO.getAmount()) < 0 ? TpPayStatusEnum.UNPAID.getStatus() : TpPayStatusEnum.NO_NEED_PAY.getStatus()); } + // 是否缴费 + formDO.setPayStatus(Objects.nonNull(ruleDO.getAmount()) && BigDecimal.ZERO.compareTo(ruleDO.getAmount()) < 0 ? TpPayStatusEnum.UNPAID.getStatus() : TpPayStatusEnum.NO_NEED_PAY.getStatus()); } /** diff --git a/coolstore-partner-web/src/main/java/com/cool/store/controller/webb/TpApplyController.java b/coolstore-partner-web/src/main/java/com/cool/store/controller/webb/TpApplyController.java index e5c5e295f..be06ab8c6 100644 --- a/coolstore-partner-web/src/main/java/com/cool/store/controller/webb/TpApplyController.java +++ b/coolstore-partner-web/src/main/java/com/cool/store/controller/webb/TpApplyController.java @@ -55,8 +55,8 @@ public class TpApplyController { } @ApiOperation("加分申请单分页查询") - @GetMapping("/rewardPage") - public ResponseResult > rewardPage(TpApplyQueryRequest request) { + @PostMapping("/rewardPage") + public ResponseResult > rewardPage(@RequestBody TpApplyQueryRequest request) { request.setType(TpFormTypeEnum.REWARD.getType()); return ResponseResult.success(tpApplyService.rewardPage(request)); } @@ -85,8 +85,8 @@ public class TpApplyController { } @ApiOperation("惩处申请单分页查询") - @GetMapping("/penaltyPage") - public ResponseResult > penaltyPage(TpApplyQueryRequest request) { + @PostMapping("/penaltyPage") + public ResponseResult > penaltyPage(@RequestBody TpApplyQueryRequest request) { request.setIsPenalty(true); return ResponseResult.success(tpApplyService.penaltyPage(request)); } @@ -115,8 +115,8 @@ public class TpApplyController { } @ApiOperation("复议申请单分页查询") - @GetMapping("/appealPage") - public ResponseResult > appealPage(TpApplyQueryRequest request) { + @PostMapping("/appealPage") + public ResponseResult > appealPage(@RequestBody TpApplyQueryRequest request) { request.setType(TpFormTypeEnum.APPEAL.getType()); return ResponseResult.success(tpApplyService.appealPage(request)); } diff --git a/coolstore-partner-web/src/main/java/com/cool/store/controller/webb/TpRuleController.java b/coolstore-partner-web/src/main/java/com/cool/store/controller/webb/TpRuleController.java index 5137f8596..2cd12bb3b 100644 --- a/coolstore-partner-web/src/main/java/com/cool/store/controller/webb/TpRuleController.java +++ b/coolstore-partner-web/src/main/java/com/cool/store/controller/webb/TpRuleController.java @@ -56,8 +56,8 @@ public class TpRuleController { } @ApiOperation("惩处规则分页查询") - @GetMapping("/penaltyPage") - public ResponseResult> penaltyRulePage(TpRuleQueryRequest request) { + @PostMapping("/penaltyPage") + public ResponseResult> penaltyRulePage(@RequestBody TpRuleQueryRequest request) { request.setType(0); return ResponseResult.success(tpRuleService.penaltyRulePage(request)); } @@ -82,8 +82,8 @@ public class TpRuleController { } @ApiOperation("加分规则分页查询") - @GetMapping("/rewardPage") - public ResponseResult> rewardRulePage(TpRuleQueryRequest request) { + @PostMapping("/rewardPage") + public ResponseResult> rewardRulePage(@RequestBody TpRuleQueryRequest request) { request.setType(1); return ResponseResult.success(tpRuleService.rewardRulePage(request)); } diff --git a/coolstore-partner-web/src/main/java/com/cool/store/controller/webb/TpScoreJournalController.java b/coolstore-partner-web/src/main/java/com/cool/store/controller/webb/TpScoreJournalController.java index 213c18d8f..f1eaa73cb 100644 --- a/coolstore-partner-web/src/main/java/com/cool/store/controller/webb/TpScoreJournalController.java +++ b/coolstore-partner-web/src/main/java/com/cool/store/controller/webb/TpScoreJournalController.java @@ -8,9 +8,7 @@ import com.github.pagehelper.PageInfo; import io.swagger.annotations.Api; import io.swagger.annotations.ApiOperation; import lombok.RequiredArgsConstructor; -import org.springframework.web.bind.annotation.GetMapping; -import org.springframework.web.bind.annotation.RequestMapping; -import org.springframework.web.bind.annotation.RestController; +import org.springframework.web.bind.annotation.*; /** *

@@ -28,8 +26,8 @@ public class TpScoreJournalController { private final TpScoreJournalService tpScoreJournalService; @ApiOperation("积分流水分页查询") - @GetMapping("/page") - public ResponseResult> getPage(TpScoreJournalQueryRequest request) { + @PostMapping("/page") + public ResponseResult> getPage(@RequestBody TpScoreJournalQueryRequest request) { return ResponseResult.success(tpScoreJournalService.getPage(request)); } } diff --git a/coolstore-partner-web/src/main/java/com/cool/store/controller/webc/MiniTpApplyController.java b/coolstore-partner-web/src/main/java/com/cool/store/controller/webc/MiniTpApplyController.java index 9a4534ae0..8f83e8c51 100644 --- a/coolstore-partner-web/src/main/java/com/cool/store/controller/webc/MiniTpApplyController.java +++ b/coolstore-partner-web/src/main/java/com/cool/store/controller/webc/MiniTpApplyController.java @@ -58,8 +58,8 @@ public class MiniTpApplyController { } @ApiOperation("加分申请单分页查询") - @GetMapping("/rewardPage") - public ResponseResult> rewardPage(TpApplyQueryRequest request) { + @PostMapping("/rewardPage") + public ResponseResult> rewardPage(@RequestBody TpApplyQueryRequest request) { request.setType(TpFormTypeEnum.REWARD.getType()); return ResponseResult.success(tpApplyService.getMiniApplyList(request)); } @@ -72,8 +72,8 @@ public class MiniTpApplyController { } @ApiOperation("惩处申请单分页查询") - @GetMapping("/penaltyPage") - public ResponseResult> penaltyPage(TpApplyQueryRequest request) { + @PostMapping("/penaltyPage") + public ResponseResult> penaltyPage(@RequestBody TpApplyQueryRequest request) { request.setIsPenalty(true); request.setIsDraft(0); return ResponseResult.success(tpApplyService.getMiniApplyList(request)); diff --git a/coolstore-partner-web/src/main/java/com/cool/store/job/XxlJobHandler.java b/coolstore-partner-web/src/main/java/com/cool/store/job/XxlJobHandler.java index b71f54cd3..0fe2fe07b 100644 --- a/coolstore-partner-web/src/main/java/com/cool/store/job/XxlJobHandler.java +++ b/coolstore-partner-web/src/main/java/com/cool/store/job/XxlJobHandler.java @@ -458,9 +458,10 @@ public class XxlJobHandler { int pageNum = 1; int pageSize = CommonConstants.BATCH_SIZE; TpApplyQueryRequest request = new TpApplyQueryRequest(); - request.setStatus(TpFormStatusEnum.PASS.getStatus()); + request.setStatusList(Collections.singletonList(TpFormStatusEnum.PASS.getStatus())); request.setIsPenalty(true); request.setIsDraft(0); + request.setOverdue(true); while (hasNext) { PageHelper.startPage(pageNum, pageSize); List list = tpApplyFormDAO.getEffectiveList(request); @@ -471,6 +472,14 @@ public class XxlJobHandler { List applyIds = CollStreamUtil.toList(list, TpApplyFormDO::getId); try { tpApplyFormDAO.updateStatusBatch(applyIds, TpFormStatusEnum.EFFECTIVE); + list.forEach(form -> { + try { + tpApplyService.scoreChange(form); + } catch (Exception e) { + log.info("积分变动失败,formId:{}, storeId:{}", form.getId(), form.getStoreId()); + log.info("积分变动失败", e); + } + }); } catch (Exception e) { log.error("超过申诉期,更新申请单状态失败", e); } From 08f767142767aeb90e4366debe127de35e3f7dd2 Mon Sep 17 00:00:00 2001 From: wangff Date: Tue, 2 Dec 2025 19:35:17 +0800 Subject: [PATCH 10/10] fix --- .../src/main/java/com/cool/store/enums/ErrorCodeEnum.java | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) diff --git a/coolstore-partner-common/src/main/java/com/cool/store/enums/ErrorCodeEnum.java b/coolstore-partner-common/src/main/java/com/cool/store/enums/ErrorCodeEnum.java index 446014068..9cb364f57 100644 --- a/coolstore-partner-common/src/main/java/com/cool/store/enums/ErrorCodeEnum.java +++ b/coolstore-partner-common/src/main/java/com/cool/store/enums/ErrorCodeEnum.java @@ -324,6 +324,8 @@ public enum ErrorCodeEnum { WALLET_OPEN_ACCOUNT_FAIL(1620001,"钱包开通失败",null), WALLET_WITH_DRAWER_FAIL(1620002,"提现失败",null), WALLET_API_ERROR(1620003,"{0}",null), + CURRENT_BRAND_SORT_NUMBER_EXIST(16100007,"当前品牌已存在该排序数字!",null), + CONTRACT_CONFIG_NOT_EXIST(16100008,"合同配置不存在!",null), /** * 181 十二分制 */ @@ -339,10 +341,7 @@ public enum ErrorCodeEnum { TP_PENALTY_APPLY_UNABLE_ACCEPT(1810009, "该处罚单无法认缴", null), TP_PENALTY_APPLY_INEFFECTIVE(1810010, "该处罚单未生效无法完成缴费", null), TP_PENALTY_APPLY_NO_NEED_PAY(1810011, "该处罚单无需缴费", null), - ; - CURRENT_BRAND_SORT_NUMBER_EXIST(16100007,"当前品牌已存在该排序数字!",null), - CONTRACT_CONFIG_NOT_EXIST(16100008,"合同配置不存在!",null); ;