Merge #120 into master from cc_20250922_closeStore_w

fix:闭店中止新增审批记录

* cc_20250922_closeStore_w: (100 commits squashed)

  - fix:新管家应退实退金额字段修改

  - fix:启用禁用规则合并

  - Merge branch 'refs/heads/master' into cc_2021104_twelve_points

  - fix:惩处规则列表新增描述字段

  - fix:闭店支行测试环境mock

  - fix:新增用户管辖门店列表接口

  - fix:门店列表接口新增门店积分字段

  - fix:查询问题修复;新增草稿状态

  - fix:申请单审批补充审批人字段

  - fix:修改门店积分限制0-12

  - fix:积分流水接口修复;申请单查询接口添加日期筛选

  - fix:redis报错修复

  - fix:惩处单查询提供惩处待处理、惩处已处理状态筛选

  - fix:新管家关店原因字段补充

  - fix:惩处单复议申请查询异常修复

  - fix:小程序惩处单详情接口字段补充

  - fix:查询字段补充

  - fix

  - fix:转义

  - fix

  - fix:新增撤销复议申请单接口

  - fix:补充字段

  - fix:补充字段

  - fix:新增门店分数接口

  - fix:申请单新增筛选条件

  - fix:门店积分接口返回参数修改

  - fix:小程序规则分页查询接口改为Post

  - fix:问题修复

  - fix:十二分导入

  - fix:导入状态部分失败改为失败

  - fix:字段补充

  - fix:异步下Excel导入图片临时文件被清理的问题

  - fix:扣分申请导入图片路径修改并使用CDN

  - fix:导入图片上传oss文件类型修改为图片

  - fix:批量审批

  - fix:批量审批新增备注字段

  - fix:字段补充

  - Merge branch 'master' into cc_2021104_twelve_points
    
    # Conflicts:
    #	coolstore-partner-common/src/main/java/com/cool/store/constants/RedisConstant.java
    #	coolstore-partner-common/src/main/java/com/cool/store/enums/ErrorCodeEnum.java
    #	coolstore-partner-dao/src/main/java/com/cool/store/dao/StoreDao.java
    #	coolstore-partner-dao/src/main/java/com/cool/store/mapper/StoreMapper.java
    #	coolstore-partner-dao/src/main/resources/mapper/StoreMapper.xml
    #	coolstore-partner-web/src/main/java/com/cool/store/controller/webb/PCStoreController.java

  - fix:新增字段

  - fix:字段补充

  - fix:小程序新增接口根据闭店申请id获取闭店申请简单信息

  - fix:小程序退款信息列表修改

  - fix:闭店审批允许管理员审批

  - fix:字典项新增排序、编辑删除权限、关联字典项

  - Merge branch 'master' into cc_2021104_twelve_points

  - fix:十二分值-扣分列表申请复议截止日期格式

  - fix:去除appealEndDate格式校验

  - Merge remote-tracking branch 'origin/cc_20260128_dict_update' into cc_20260205_twelve_points_v2

  - fix:阶段名称修改

  - Merge branch 'refs/heads/master' into cc_20250922_closeStore_w
    
    # Conflicts:
    #	coolstore-partner-common/src/main/java/com/cool/store/enums/close/CloseStoreSubStageStatusEnum.java

  - fix:闭店记录列表补充审批id;仅在营门店允许发起闭店

  - fix:提交新管家字段取值逻辑修改

  - Merge branch 'cc_20260128_dict_update' into cc_2021104_twelve_points

  - fix:字典回显包含已删除字典项

  - Merge branch 'master' into cc_2021104_twelve_points

  - Merge remote-tracking branch 'origin/cc_20260205_twelve_points_v2' into cc_2021104_twelve_points

  - fix:去除惩处单审批阶段;复议申请单证明图片非必填

  - fix:复议拒绝后惩处单直接生效

  - fix:扣分申请单证明图片改为非必填

  - fix

  - fix:字段转义

  - fix:惩处待处理包含带生效数据

  - fix:字段转义

  - fix:警告单金额和积分初始化为0

  - fix

  - fix:小程序接口字段转义

  - Merge branch 'master' into cc_2021104_twelve_points

  - fix:十二分审批记录展示待审批人

  - fix

  - fix:惩处单复议申请逾期检查改为延时队列

  - Merge branch 'refs/heads/master' into cc_20250922_closeStore_w

  - fix:闭店定时任务过滤闭店状态补充

  - Merge branch 'refs/heads/master' into cc_2021104_twelve_points
    
    # Conflicts:
    #	coolstore-partner-common/src/main/java/com/cool/store/constants/RedisConstant.java

  - Merge branch 'master' into cc_20250922_closeStore_w

  - fix:闭店材料新增字段

  - fix

  - fix:小程序闭店材料详情新增字段

  - fix:闭店流程流转校验除授权书外是否已邮寄

  - fix:营帐通JWT生成

  - fix:营帐通JWT改为post

  - fix:修改secret

  - fix:配置

  - Merge branch 'master' into cc_2021104_twelve_points

  - fix:十二分流水导出;流水新增规则描述字段

  - fix

  - fix:闭店新管家接口错误信息返回

  - Merge branch 'master' into cc_20250922_closeStore_w

  - Merge branch 'cc_20260412_jwt_ge' into cc_20250922_closeStore_w

  - Merge branch 'master' into cc_20250922_closeStore_w

  - fix:闭店火码关闭账号不存在时忽略

  - Merge branch 'cc_2021104_twelve_points' into cc_20250922_closeStore_w

  - Merge branch 'master' into cc_20250922_closeStore_w
    
    # Conflicts:
    #	coolstore-partner-common/src/main/java/com/cool/store/constants/RedisConstant.java
    #	coolstore-partner-common/src/main/java/com/cool/store/enums/FileTypeEnum.java
    #	coolstore-partner-service/src/main/java/com/cool/store/service/ExportRealizeService.java
    #	coolstore-partner-service/src/main/java/com/cool/store/service/ExportService.java
    #	coolstore-partner-service/src/main/java/com/cool/store/service/impl/ExportRealizeServiceImpl.java
    #	coolstore-partner-service/src/main/java/com/cool/store/service/impl/ExportServiceImpl.java
    #	coolstore-partner-web/src/main/java/com/cool/store/controller/webb/ExportController.java

  - fix:闭店逻辑修改

  - fix:闭店待办列表新增字段

  - fix:计划闭店时间修改

  - fix:闭店信息新增初审、复审、终审时间字段;闭店管理列表新增返回字段

  - fix:删除字段

  - fix:字段名称修改

  - fix:闭店中止新增审批记录

  - Merge branch 'master' into cc_20250922_closeStore_w
    
    # Conflicts:
    #	coolstore-partner-common/src/main/java/com/cool/store/enums/UserRoleEnum.java

Signed-off-by: 王非凡 <accounts_67eba0c5fee9c49c80c8e2b4@mail.teambition.com>
Merged-by: 正新 <accounts_6964c7bcd2a2c377c5bbd01b@mail.teambition.com>

CR-link: https://codeup.aliyun.com/692ea314dec569489f6f167c/hangzhou/java/custom_zxjp/change/120
This commit is contained in:
王非凡
2026-05-10 13:41:41 +00:00
committed by 正新
parent b9b022a28d
commit a42a109b6c
18 changed files with 190 additions and 18 deletions

View File

@@ -441,4 +441,9 @@ public class RedisConstant {
public static final String PRE_ALLOCATION = "pre_allocation:{0}"; public static final String PRE_ALLOCATION = "pre_allocation:{0}";
public static final String STORE_ID_MAPPING = "store_id_mapping"; public static final String STORE_ID_MAPPING = "store_id_mapping";
/**
* 闭店审批拒绝原因-由分店订货
*/
public static final String CLOSE_REJECT_OTHER_STORE = "close_reject_other_store";
} }

View File

@@ -424,6 +424,7 @@ public enum ErrorCodeEnum {
CLOSE_STORE_REFUND_EXIST_EFFECTIVE_RECORD(1710017, "存在生效中的退款申请!", null), CLOSE_STORE_REFUND_EXIST_EFFECTIVE_RECORD(1710017, "存在生效中的退款申请!", null),
CLOSE_STORE_REFUND_TYPE_ERROR(1710018, "退款类型错误", null), CLOSE_STORE_REFUND_TYPE_ERROR(1710018, "退款类型错误", null),
CLOSE_STORE_ONLY_SUPPORT_OPEN(1710019, "仅支持在营或暂停营业的门店发起闭店申请", null), CLOSE_STORE_ONLY_SUPPORT_OPEN(1710019, "仅支持在营或暂停营业的门店发起闭店申请", null),
CLOSE_STORE_ONLY_APPROVAL_ENABLE_SUSPEND(1710020, "仅审批中申请允许中止", null),
/** /**
* 181 十二分制 * 181 十二分制

View File

@@ -6,15 +6,18 @@ package com.cool.store.enums.close;
* @Version 1.0 * @Version 1.0
*/ */
public enum CloseStoreStatusEnum { public enum CloseStoreStatusEnum {
// 督导审批中 // 运营顾问审批中
UNDER_APPROVAL(1, "审批中"), UNDER_APPROVAL(1, "审批中"),
// 大区老总审批中 // 运营片区总顾问审批中
MANAGER_UNDER_APPROVAL(2, "审批中"), MANAGER_UNDER_APPROVAL(2, "审批中"),
// 运营副总裁审批中
OPERATION_VICE_PRESIDENT_APPROVAL(3, "审批中"),
REVIEW_NOT_APPROVED(5, "审批拒绝"), REVIEW_NOT_APPROVED(5, "审批拒绝"),
CANCELED(10, "已取消"), CANCELED(10, "已取消"),
CLOSING(15, "闭店中"), CLOSING(15, "闭店中"),
COMPLETED(20, "已完成"), COMPLETED(20, "已完成"),
// 审批阶段由管理角色触发,用于区别审批前还是审批中结束
SUSPEND(25, "已终止"),
; ;
private Integer closeStoreStatus; private Integer closeStoreStatus;
@@ -66,6 +69,8 @@ public enum CloseStoreStatusEnum {
case UNDER_APPROVAL: case UNDER_APPROVAL:
return MANAGER_UNDER_APPROVAL.getCloseStoreStatus(); return MANAGER_UNDER_APPROVAL.getCloseStoreStatus();
case MANAGER_UNDER_APPROVAL: case MANAGER_UNDER_APPROVAL:
return OPERATION_VICE_PRESIDENT_APPROVAL.getCloseStoreStatus();
case OPERATION_VICE_PRESIDENT_APPROVAL:
return CLOSING.getCloseStoreStatus(); return CLOSING.getCloseStoreStatus();
case CLOSING: case CLOSING:
return COMPLETED.getCloseStoreStatus(); return COMPLETED.getCloseStoreStatus();
@@ -76,6 +81,7 @@ public enum CloseStoreStatusEnum {
public static boolean isApprove(Integer status) { public static boolean isApprove(Integer status) {
return CloseStoreStatusEnum.UNDER_APPROVAL.getCloseStoreStatus().equals(status) return CloseStoreStatusEnum.UNDER_APPROVAL.getCloseStoreStatus().equals(status)
|| CloseStoreStatusEnum.MANAGER_UNDER_APPROVAL.getCloseStoreStatus().equals(status); || CloseStoreStatusEnum.MANAGER_UNDER_APPROVAL.getCloseStoreStatus().equals(status)
|| CloseStoreStatusEnum.OPERATION_VICE_PRESIDENT_APPROVAL.getCloseStoreStatus().equals(status);
} }
} }

View File

@@ -14,8 +14,8 @@ import java.util.Objects;
*/ */
public enum CloseStoreSubStageEnum { public enum CloseStoreSubStageEnum {
CLOSE_STORE_SUB_STAGE_10(CloseStoreStageEnum.CLOSE_STORE_STAGE_1, 10, "关店所需材料上交", 1), CLOSE_STORE_SUB_STAGE_10(CloseStoreStageEnum.CLOSE_STORE_STAGE_1, 10, "关店所需材料上交", 7),
CLOSE_STORE_SUB_STAGE_20(CloseStoreStageEnum.CLOSE_STORE_STAGE_2, 20, "账号关闭", 2), CLOSE_STORE_SUB_STAGE_20(CloseStoreStageEnum.CLOSE_STORE_STAGE_2, 20, "账号关闭", 3),
CLOSE_STORE_SUB_STAGE_30(CloseStoreStageEnum.CLOSE_STORE_STAGE_3, 30, "押金退款", 3), CLOSE_STORE_SUB_STAGE_30(CloseStoreStageEnum.CLOSE_STORE_STAGE_3, 30, "押金退款", 3),
CLOSE_STORE_SUB_STAGE_40(CloseStoreStageEnum.CLOSE_STORE_STAGE_3, 40, "货款退款", 3), CLOSE_STORE_SUB_STAGE_40(CloseStoreStageEnum.CLOSE_STORE_STAGE_3, 40, "货款退款", 3),
; ;

View File

@@ -57,13 +57,32 @@ public class CloseStoreAuditRecordDAO {
* @param userIdList * @param userIdList
* @return * @return
*/ */
public int addApproveRecord(Long closeStoreId, List<String> userIdList) { public int addApproveRecord(Long closeStoreId, List<String> userIdList, Date planCompleteTime) {
CloseStoreAuditRecordDO closeStoreAuditRecordDO = CloseStoreAuditRecordDO.builder() CloseStoreAuditRecordDO closeStoreAuditRecordDO = CloseStoreAuditRecordDO.builder()
.closeStoreId(closeStoreId) .closeStoreId(closeStoreId)
.recordType(RecordTypeEnum.CLOSE_STORE_RECORD_TYPE_20.getRecordType()) .recordType(RecordTypeEnum.CLOSE_STORE_RECORD_TYPE_20.getRecordType())
.receiveTaskTime(new Date()) .receiveTaskTime(new Date())
.handlerUserIds(getUserIds(userIdList)) .handlerUserIds(getUserIds(userIdList))
.auditStatus(CloseStoreAuditStatusEnum.PENDING.getStatus()) .auditStatus(CloseStoreAuditStatusEnum.PENDING.getStatus())
.planCompleteTime(planCompleteTime)
.build();
return closeStoreAuditRecordMapper.insertSelective(closeStoreAuditRecordDO);
}
/**
* 新增中止操作记录
*/
public int addSuspendRecord(Long closeStoreId, String userId, String userName) {
CloseStoreAuditRecordDO closeStoreAuditRecordDO = CloseStoreAuditRecordDO.builder()
.closeStoreId(closeStoreId)
.recordType(RecordTypeEnum.CLOSE_STORE_RECORD_TYPE_20.getRecordType())
.actionRemark("中止")
.finishTaskTime(new Date())
.receiveTaskTime(new Date())
.handlerUserId(userId)
.handlerUserName(userName)
.auditStatus(CloseStoreAuditStatusEnum.PASS.getStatus())
.handlerUserIds(getUserIds(Collections.singletonList(userId)))
.build(); .build();
return closeStoreAuditRecordMapper.insertSelective(closeStoreAuditRecordDO); return closeStoreAuditRecordMapper.insertSelective(closeStoreAuditRecordDO);
} }
@@ -79,11 +98,11 @@ public class CloseStoreAuditRecordDAO {
/** /**
* 首次发起流程 添加审批记录 * 首次发起流程 添加审批记录
*/ */
public void addRecord(Long closeStoreId, String userId, String userName, List<String> userIdList) { public void addRecord(Long closeStoreId, String userId, String userName, List<String> userIdList, Date planCompleteTime) {
//新增提交审批 //新增提交审批
addSubmitRecord(closeStoreId, userId, userName); addSubmitRecord(closeStoreId, userId, userName);
//新增审批记录 //新增审批记录
addApproveRecord(closeStoreId, userIdList); addApproveRecord(closeStoreId, userIdList, planCompleteTime);
} }
/** /**

View File

@@ -52,6 +52,7 @@ public class CloseStoreInfoDAO {
example.createCriteria().andEqualTo("storeId", storeId) example.createCriteria().andEqualTo("storeId", storeId)
.andIn("closeStatus", Arrays.asList(CloseStoreStatusEnum.UNDER_APPROVAL.getCloseStoreStatus(), .andIn("closeStatus", Arrays.asList(CloseStoreStatusEnum.UNDER_APPROVAL.getCloseStoreStatus(),
CloseStoreStatusEnum.MANAGER_UNDER_APPROVAL.getCloseStoreStatus(), CloseStoreStatusEnum.MANAGER_UNDER_APPROVAL.getCloseStoreStatus(),
CloseStoreStatusEnum.OPERATION_VICE_PRESIDENT_APPROVAL.getCloseStoreStatus(),
CloseStoreStatusEnum.CLOSING.getCloseStoreStatus())); CloseStoreStatusEnum.CLOSING.getCloseStoreStatus()));
return closeStoreInfoMapper.selectCountByExample(example) > 0; return closeStoreInfoMapper.selectCountByExample(example) > 0;
} }
@@ -85,4 +86,15 @@ public class CloseStoreInfoDAO {
example.setOrderByClause("create_time DESC"); example.setOrderByClause("create_time DESC");
return closeStoreInfoMapper.selectByExample(example); return closeStoreInfoMapper.selectByExample(example);
} }
/**
* 查询最后一次拒绝的闭店申请
*/
public CloseStoreInfoDO getRejectByStoreId(String storeId) {
Example example = new Example(CloseStoreInfoDO.class);
example.createCriteria().andEqualTo("storeId", storeId)
.andEqualTo("closeStatus", CloseStoreStatusEnum.REVIEW_NOT_APPROVED.getCloseStoreStatus());
example.setOrderByClause("create_time DESC LIMIT 1");
return closeStoreInfoMapper.selectOneByExample(example);
}
} }

View File

@@ -29,7 +29,7 @@
</select> </select>
<select id="getCloseStoreAuditList" resultType="com.cool.store.vo.close.store.CloseStoreInfoListVO"> <select id="getCloseStoreAuditList" resultType="com.cool.store.vo.close.store.CloseStoreInfoListVO">
SELECT a.id audit_record_id, a.close_store_id, b.plan_close_data, b.close_type, b.close_status, b.close_store_no, b.store_id SELECT a.id audit_record_id, a.close_store_id, b.plan_close_data, b.close_type, b.close_status, b.close_store_no, b.store_id, a.plan_complete_time
<if test="request.queryStore"> <if test="request.queryStore">
, c.store_name, c.store_num, c.join_brand, c.store_address , c.store_name, c.store_num, c.join_brand, c.store_address
</if> </if>

View File

@@ -18,6 +18,8 @@
<result column="supervisor_user_id" jdbcType="VARCHAR" property="supervisorUserId" /> <result column="supervisor_user_id" jdbcType="VARCHAR" property="supervisorUserId" />
<result column="create_time" jdbcType="TIMESTAMP" property="createTime" /> <result column="create_time" jdbcType="TIMESTAMP" property="createTime" />
<result column="update_time" jdbcType="TIMESTAMP" property="updateTime" /> <result column="update_time" jdbcType="TIMESTAMP" property="updateTime" />
<result column="reject_reason" jdbcType="VARCHAR" property="rejectReason" />
<result column="reject_remark" jdbcType="VARCHAR" property="rejectRemark" />
</resultMap> </resultMap>
<select id="getCloseStoreInfoList" parameterType="java.util.List" resultType="com.cool.store.vo.close.store.CloseStoreInfoListVO"> <select id="getCloseStoreInfoList" parameterType="java.util.List" resultType="com.cool.store.vo.close.store.CloseStoreInfoListVO">
@@ -38,7 +40,7 @@
<if test="request.closeStatus != null"> <if test="request.closeStatus != null">
<choose> <choose>
<when test="request.closeStatus == 1"> <when test="request.closeStatus == 1">
AND (b.close_status = 1 OR b.close_status = 2) AND (b.close_status = 1 OR b.close_status = 2 OR b.close_status = 3)
</when> </when>
<otherwise> <otherwise>
AND b.close_status = #{request.closeStatus} AND b.close_status = #{request.closeStatus}

View File

@@ -88,5 +88,9 @@ public class CloseStoreAuditRecordDO {
@Column(name = "updated_time") @Column(name = "updated_time")
private Date updatedTime; private Date updatedTime;
/**
* 预估完成时间
*/
@Column(name = "plan_complete_time")
private Date planCompleteTime;
} }

View File

@@ -95,4 +95,16 @@ public class CloseStoreInfoDO {
*/ */
@Column(name = "apply_user_id") @Column(name = "apply_user_id")
private String applyUserId; private String applyUserId;
/**
* 审批拒绝原因
*/
@Column(name = "reject_reason")
private String rejectReason;
/**
* 审批拒绝备注
*/
@Column(name = "reject_remark")
private String rejectRemark;
} }

View File

@@ -28,4 +28,10 @@ public class CloseStoreAuditRequest {
@ApiModelProperty("闭店原因") @ApiModelProperty("闭店原因")
private Integer closeReason; private Integer closeReason;
@ApiModelProperty("未订货自动发起时拒绝原因字典表close_store_reject_reason")
private String rejectReason;
@ApiModelProperty("未订货自动发起时拒绝备注")
private String rejectRemark;
} }

View File

@@ -1,5 +1,6 @@
package com.cool.store.vo.close.store; package com.cool.store.vo.close.store;
import com.cool.store.annotation.DictField;
import com.cool.store.enums.close.CloseStoreStatusEnum; import com.cool.store.enums.close.CloseStoreStatusEnum;
import com.cool.store.enums.master.BrandTypeEnum; import com.cool.store.enums.master.BrandTypeEnum;
import com.cool.store.enums.master.StoreCloseReasonEnum; import com.cool.store.enums.master.StoreCloseReasonEnum;
@@ -81,6 +82,16 @@ public class CloseStoreInfoDetailVO {
@ApiModelProperty("闭店状态名称") @ApiModelProperty("闭店状态名称")
private String closeStatusName; private String closeStatusName;
@ApiModelProperty("未订货自动发起时拒绝原因字典表close_store_reject_reason")
private String rejectReason;
@ApiModelProperty("未订货自动发起时拒绝原因字典表close_store_reject_reason")
@DictField
private String rejectReasonName;
@ApiModelProperty("未订货自动发起时拒绝备注")
private String rejectRemark;
public String getCloseStatusName() { public String getCloseStatusName() {
return CloseStoreStatusEnum.getNameByStatus(closeStatus); return CloseStoreStatusEnum.getNameByStatus(closeStatus);

View File

@@ -74,6 +74,11 @@ public class CloseStoreInfoListVO {
@ApiModelProperty("总流程数量") @ApiModelProperty("总流程数量")
private Integer totalProcessNum; private Integer totalProcessNum;
@ApiModelProperty("预估完成时间")
private Date planCompleteTime;
@ApiModelProperty("创建时间")
private Date createTime;
public String getCloseStatusName() { public String getCloseStatusName() {
return CloseStoreStatusEnum.getNameByStatus(closeStatus); return CloseStoreStatusEnum.getNameByStatus(closeStatus);

View File

@@ -59,6 +59,13 @@ public interface CloseStoreService {
*/ */
Boolean cancelApply(Long closeStoreId); Boolean cancelApply(Long closeStoreId);
/**
* 中止闭店申请
* @param closeStoreId 闭店申请id
* @return 是否成功
*/
Boolean suspendApply(Long closeStoreId);
/** /**
* 查询权限下的闭店申请审批记录 * 查询权限下的闭店申请审批记录
* @param request 闭店申请查询Request * @param request 闭店申请查询Request

View File

@@ -22,8 +22,10 @@ import com.cool.store.response.AuditInfoResponse;
import com.cool.store.service.SysRoleService; import com.cool.store.service.SysRoleService;
import com.cool.store.service.UserAuthMappingService; import com.cool.store.service.UserAuthMappingService;
import com.cool.store.service.close.CloseStoreService; import com.cool.store.service.close.CloseStoreService;
import com.cool.store.service.dict.impl.DictService;
import com.cool.store.utils.BeanUtil; import com.cool.store.utils.BeanUtil;
import com.cool.store.utils.CoolDateUtils; import com.cool.store.utils.CoolDateUtils;
import com.cool.store.utils.poi.DateUtils;
import com.cool.store.utils.poi.StringUtils; import com.cool.store.utils.poi.StringUtils;
import com.cool.store.vo.PartnerUserInfoVO; import com.cool.store.vo.PartnerUserInfoVO;
import com.cool.store.vo.close.store.*; import com.cool.store.vo.close.store.*;
@@ -37,6 +39,7 @@ import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Service; import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional; import org.springframework.transaction.annotation.Transactional;
import java.time.LocalDate;
import java.util.*; import java.util.*;
import java.util.stream.Collectors; import java.util.stream.Collectors;
@@ -65,6 +68,7 @@ public class CloseStoreServiceImpl implements CloseStoreService {
private final CloseStoreRefundInfoDAO closeStoreRefundInfoDAO; private final CloseStoreRefundInfoDAO closeStoreRefundInfoDAO;
private final EnterpriseUserDAO enterpriseUserDAO; private final EnterpriseUserDAO enterpriseUserDAO;
private final SysRoleService sysRoleService; private final SysRoleService sysRoleService;
private final DictService dictService;
@Value("${mybatis.configuration.variables.enterpriseId}") @Value("${mybatis.configuration.variables.enterpriseId}")
private String enterpriseId; private String enterpriseId;
@@ -116,9 +120,9 @@ public class CloseStoreServiceImpl implements CloseStoreService {
closeStoreInfoDO.setCloseStatus(CloseStoreStatusEnum.UNDER_APPROVAL.getCloseStoreStatus()); closeStoreInfoDO.setCloseStatus(CloseStoreStatusEnum.UNDER_APPROVAL.getCloseStoreStatus());
closeStoreInfoDO.setApplyUserId(userId); closeStoreInfoDO.setApplyUserId(userId);
closeStoreInfoDAO.insertSelective(closeStoreInfoDO); closeStoreInfoDAO.insertSelective(closeStoreInfoDO);
// 查询督导 // 查询运营顾问
List<String> auditUserIds = getAuditUserIds(regionDO.getId(), UserRoleEnum.SUPERVISION); List<String> auditUserIds = getAuditUserIds(regionDO.getId(), UserRoleEnum.SUPERVISION);
closeStoreAuditRecordDAO.addRecord(closeStoreInfoDO.getId(), userId, userName, auditUserIds); closeStoreAuditRecordDAO.addRecord(closeStoreInfoDO.getId(), userId, userName, auditUserIds, DateUtils.addDays(new Date(), 7));
return Boolean.TRUE; return Boolean.TRUE;
} }
@@ -176,11 +180,15 @@ public class CloseStoreServiceImpl implements CloseStoreService {
auditRecordDO.setHandlerUserName(CurrentUserHolder.getUser().getName()); auditRecordDO.setHandlerUserName(CurrentUserHolder.getUser().getName());
auditRecordDO.setFinishTaskTime(new Date()); auditRecordDO.setFinishTaskTime(new Date());
closeStoreAuditRecordDAO.updateRecord(auditRecordDO); closeStoreAuditRecordDAO.updateRecord(auditRecordDO);
// 督导审批结束后为大区经理审批 // 运营顾问审批结束后为运营片区总顾问
if (CloseStoreStatusEnum.MANAGER_UNDER_APPROVAL.getCloseStoreStatus().equals(nextCloseStatus)) { if (CloseStoreStatusEnum.MANAGER_UNDER_APPROVAL.getCloseStoreStatus().equals(nextCloseStatus)) {
// 新增大区老总审批 // 新增运营片区总顾问审批
List<String> auditUserIds = getAuditUserIds(closeStoreInfoDO.getRegionId(), UserRoleEnum.OPERATION_GENERAL_CONSULTANT); List<String> auditUserIds = getAuditUserIds(closeStoreInfoDO.getRegionId(), UserRoleEnum.OPERATION_GENERAL_CONSULTANT);
closeStoreAuditRecordDAO.addApproveRecord(closeStoreInfoDO.getId(), auditUserIds); closeStoreAuditRecordDAO.addApproveRecord(closeStoreInfoDO.getId(), auditUserIds, DateUtils.addDays(new Date(), 7));
} else if (CloseStoreStatusEnum.OPERATION_VICE_PRESIDENT_APPROVAL.getCloseStoreStatus().equals(nextCloseStatus)) {
// 新增运营副总裁审批
List<String> auditUserIds = getAuditUserIds(closeStoreInfoDO.getRegionId(), UserRoleEnum.OPERATION_VICE_PRESIDENT);
closeStoreAuditRecordDAO.addApproveRecord(closeStoreInfoDO.getId(), auditUserIds, DateUtils.addDays(new Date(), 14));
} else { } else {
// 完成闭店,再进入闭店流程 // 完成闭店,再进入闭店流程
closeStoreFlowInit(closeStoreInfoDO, closeStoreInfoDO.getStoreId(), closeStoreInfoDO.getCloseReason()); closeStoreFlowInit(closeStoreInfoDO, closeStoreInfoDO.getStoreId(), closeStoreInfoDO.getCloseReason());
@@ -199,6 +207,14 @@ public class CloseStoreServiceImpl implements CloseStoreService {
throw new ServiceException(ErrorCodeEnum.CLOSE_STORE_INFO_NOT_EXIST); throw new ServiceException(ErrorCodeEnum.CLOSE_STORE_INFO_NOT_EXIST);
} }
closeStoreInfoDO.setCloseStatus(CloseStoreStatusEnum.REVIEW_NOT_APPROVED.getCloseStoreStatus()); closeStoreInfoDO.setCloseStatus(CloseStoreStatusEnum.REVIEW_NOT_APPROVED.getCloseStoreStatus());
// 如果是未订货自动发起的话,更新闭店申请信息中的拒绝信息
if (CloseTypeEnum.NO_ORDER_AUTO.getCloseType().equals(closeStoreInfoDO.getCloseType())) {
if (StringUtils.isBlank(request.getRejectReason())) {
throw new ServiceException(ErrorCodeEnum.ERROR_MESSAGE, "拒绝原因不能为空");
}
closeStoreInfoDO.setRejectReason(request.getRejectReason());
closeStoreInfoDO.setRejectRemark(request.getRejectRemark());
}
closeStoreInfoDAO.updateSelective(closeStoreInfoDO); closeStoreInfoDAO.updateSelective(closeStoreInfoDO);
// 修改闭店审批信息 // 修改闭店审批信息
auditRecordDO.setAuditStatus(CloseStoreAuditStatusEnum.REJECTED.getStatus()); auditRecordDO.setAuditStatus(CloseStoreAuditStatusEnum.REJECTED.getStatus());
@@ -236,6 +252,27 @@ public class CloseStoreServiceImpl implements CloseStoreService {
return true; return true;
} }
@Override
public Boolean suspendApply(Long closeStoreId) {
CloseStoreInfoDO closeStoreInfoDO = closeStoreInfoDAO.getById(closeStoreId);
if (Objects.isNull(closeStoreInfoDO)) {
throw new ServiceException(ErrorCodeEnum.CLOSE_STORE_INFO_NOT_EXIST);
}
// 仅审批中能够取消
if (!CloseStoreStatusEnum.isApprove(closeStoreInfoDO.getCloseStatus())) {
throw new ServiceException(ErrorCodeEnum.CLOSE_STORE_ONLY_APPROVAL_ENABLE_SUSPEND);
}
// 修改闭店申请信息
closeStoreInfoDO.setCloseStatus(CloseStoreStatusEnum.SUSPEND.getCloseStoreStatus());
closeStoreInfoDAO.updateSelective(closeStoreInfoDO);
// 删除待处理的审批记录
closeStoreAuditRecordDAO.deletePendingRecord(closeStoreId);
LoginUserInfo user = CurrentUserHolder.getUser();
// 新增中止操作记录
closeStoreAuditRecordDAO.addSuspendRecord(closeStoreId, user.getUserId(), user.getName());
return true;
}
@Override @Override
public PageInfo<CloseStoreInfoListVO> closeStoreAuditList(CloseStoreQueryRequest request) { public PageInfo<CloseStoreInfoListVO> closeStoreAuditList(CloseStoreQueryRequest request) {
closeStoreRecordQueryBefore(request); closeStoreRecordQueryBefore(request);
@@ -364,6 +401,7 @@ public class CloseStoreServiceImpl implements CloseStoreService {
vo.setAuditId(pendingAuditRecord.getId()); vo.setAuditId(pendingAuditRecord.getId());
} }
} }
dictService.fillDictField(vo);
return vo; return vo;
} }
@@ -422,7 +460,7 @@ public class CloseStoreServiceImpl implements CloseStoreService {
@Override @Override
public List<CloseStoreStatusVO> getCloseStoreStatusList() { public List<CloseStoreStatusVO> getCloseStoreStatusList() {
return Arrays.stream(CloseStoreStatusEnum.values()) return Arrays.stream(CloseStoreStatusEnum.values())
.filter(v -> v != CloseStoreStatusEnum.MANAGER_UNDER_APPROVAL) .filter(v -> v != CloseStoreStatusEnum.MANAGER_UNDER_APPROVAL && v != CloseStoreStatusEnum.OPERATION_VICE_PRESIDENT_APPROVAL)
.map(v -> new CloseStoreStatusVO(v.getCloseStoreStatus(), v.getCloseStoreStatusName())) .map(v -> new CloseStoreStatusVO(v.getCloseStoreStatus(), v.getCloseStoreStatusName()))
.collect(Collectors.toList()); .collect(Collectors.toList());
} }
@@ -486,6 +524,14 @@ public class CloseStoreServiceImpl implements CloseStoreService {
.id(stageInfoDO.getId()) .id(stageInfoDO.getId())
.shopSubStageStatus(openStageStatus.getShopSubStageStatus()) .shopSubStageStatus(openStageStatus.getShopSubStageStatus())
.build(); .build();
// 单独处理闭店资料待邮寄7天、闭店资料待审核14天、账号关闭3天
if (CloseStoreSubStageStatusEnum.CLOSE_STORE_SUB_STAGE_STATUS_15.equals(openStageStatus)) {
updateStageInfo.setPlanCompleteTime(LocalDate.now().plusDays(7).toString());
} else if (CloseStoreSubStageStatusEnum.CLOSE_STORE_SUB_STAGE_STATUS_16.equals(openStageStatus)) {
updateStageInfo.setPlanCompleteTime(LocalDate.now().plusDays(14).toString());
} else if (CloseStoreSubStageStatusEnum.CLOSE_STORE_SUB_STAGE_STATUS_25.equals(openStageStatus)) {
updateStageInfo.setPlanCompleteTime(LocalDate.now().plusDays(3).toString());
}
updateStageList.add(updateStageInfo); updateStageList.add(updateStageInfo);
} }
} }

View File

@@ -1,5 +1,6 @@
package com.cool.store.controller.webb; package com.cool.store.controller.webb;
import com.cool.store.request.close.store.CloseStoreCancelRequest;
import com.cool.store.request.close.store.CloseStoreQueryRequest; import com.cool.store.request.close.store.CloseStoreQueryRequest;
import com.cool.store.request.close.store.CloseStoreAuditRequest; import com.cool.store.request.close.store.CloseStoreAuditRequest;
import com.cool.store.response.AuditInfoResponse; import com.cool.store.response.AuditInfoResponse;
@@ -14,6 +15,7 @@ import lombok.RequiredArgsConstructor;
import org.springframework.validation.annotation.Validated; import org.springframework.validation.annotation.Validated;
import org.springframework.web.bind.annotation.*; import org.springframework.web.bind.annotation.*;
import javax.validation.Valid;
import javax.validation.constraints.NotNull; import javax.validation.constraints.NotNull;
import java.util.List; import java.util.List;
@@ -97,4 +99,10 @@ public class CloseStoreController {
public ResponseResult<List<CloseStoreStatusVO>> getCloseStoreStatusList() { public ResponseResult<List<CloseStoreStatusVO>> getCloseStoreStatusList() {
return ResponseResult.success(closeStoreService.getCloseStoreStatusList()); return ResponseResult.success(closeStoreService.getCloseStoreStatusList());
} }
@ApiOperation("中止")
@PostMapping("/suspend")
public ResponseResult<Boolean> suspendApply(@RequestBody @Valid CloseStoreCancelRequest request) {
return ResponseResult.success(closeStoreService.suspendApply(request.getCloseStoreId()));
}
} }

View File

@@ -152,6 +152,20 @@ public class PCTestController {
@Resource @Resource
BonusDistributionRuleDAO bonusRuleDAO; BonusDistributionRuleDAO bonusRuleDAO;
@PostMapping("/normalStoreApplyClose")
@Debounce(timeMs = 10000, diffUser = false)
public ResponseResult<Boolean> normalStoreApplyClose() {
xxlJobHandler.normalStoreApplyClose();
return ResponseResult.success(true);
}
@PostMapping("/schoolStoreApplyClose")
@Debounce(timeMs = 10000, diffUser = false)
public ResponseResult<Boolean> schoolStoreApplyClose() {
xxlJobHandler.schoolStoreApplyClose();
return ResponseResult.success(true);
}
@PostMapping("/processReceivedRule") @PostMapping("/processReceivedRule")
@Debounce(timeMs = 10000, diffUser = false) @Debounce(timeMs = 10000, diffUser = false)
public ResponseResult<Boolean> processReceivedRule(Long ruleId, String payMonth) { public ResponseResult<Boolean> processReceivedRule(Long ruleId, String payMonth) {

View File

@@ -1,8 +1,10 @@
package com.cool.store.job; package com.cool.store.job;
import cn.hutool.core.collection.CollStreamUtil; import cn.hutool.core.collection.CollStreamUtil;
import cn.hutool.core.date.DateUtil;
import com.alibaba.fastjson.JSONObject; import com.alibaba.fastjson.JSONObject;
import com.cool.store.constants.CommonConstants; import com.cool.store.constants.CommonConstants;
import com.cool.store.constants.RedisConstant;
import com.cool.store.dao.*; import com.cool.store.dao.*;
import com.cool.store.dao.bonus.BonusDistributionRuleDAO; import com.cool.store.dao.bonus.BonusDistributionRuleDAO;
import com.cool.store.dao.tp.TpApplyFormDAO; import com.cool.store.dao.tp.TpApplyFormDAO;
@@ -147,6 +149,8 @@ public class XxlJobHandler {
BonusDistributionRuleDAO ruleDAO; BonusDistributionRuleDAO ruleDAO;
@Resource @Resource
BonusService bonusService; BonusService bonusService;
@Resource
CloseStoreInfoDAO closeStoreInfoDAO;
private static final DateTimeFormatter MONTH_FORMATTER = DateTimeFormatter.ofPattern("yyyy-MM"); private static final DateTimeFormatter MONTH_FORMATTER = DateTimeFormatter.ofPattern("yyyy-MM");
private static final DateTimeFormatter DATE_FORMATTER = DateTimeFormatter.ofPattern("yyyy-MM-dd"); private static final DateTimeFormatter DATE_FORMATTER = DateTimeFormatter.ofPattern("yyyy-MM-dd");
@@ -525,6 +529,16 @@ public class XxlJobHandler {
hasNext = storeList.size() >= pageSize; hasNext = storeList.size() >= pageSize;
for (StoreDO storeDO : storeList) { for (StoreDO storeDO : storeList) {
try { try {
CloseStoreInfoDO lastRejectRecord = closeStoreInfoDAO.getRejectByStoreId(storeDO.getStoreId());
// 存在审批拒绝原因的闭店申请则根据拒绝原因判断要间隔多少天发起
// 原因为 由分店订货 的需要间隔21天否则间隔14天
if (Objects.nonNull(lastRejectRecord) && StringUtils.isNotBlank(lastRejectRecord.getRejectReason())) {
long betweenDays = DateUtil.betweenDay(new Date(), lastRejectRecord.getCreateTime(), true);
if (RedisConstant.CLOSE_REJECT_OTHER_STORE.equals(lastRejectRecord.getRejectReason()) && betweenDays < 21
|| betweenDays < 14) {
continue;
}
}
CloseStoreApplyRequest applyRequest = CloseStoreApplyRequest.builder() CloseStoreApplyRequest applyRequest = CloseStoreApplyRequest.builder()
.planCloseDate(DateUtils.parseDate(LocalDate.now().plusMonths(1).toString())) .planCloseDate(DateUtils.parseDate(LocalDate.now().plusMonths(1).toString()))
.closeReason(StoreCloseReasonEnum.REASON0.getCode()) .closeReason(StoreCloseReasonEnum.REASON0.getCode())