From 4be2276287d43b353d727824e1f295ee361c3b81 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E7=8E=8B=E9=9D=9E=E5=87=A1?= Date: Tue, 9 Dec 2025 08:55:47 +0000 Subject: [PATCH] Merge #8 into master from cc_20250922_closeStore_w MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 闭店 * cc_20250922_closeStore_w: (44 commits squashed) - feat:闭店流程init - feat:闭店流程接口 - feat:闭店 - Merge branch 'refs/heads/master' into cc_20250922_closeStore_w - fix:闭店材料模块 - fix:账号关闭流程 - feat:闭店审批流程(未测);字典表 - fix:闭店审批流程完善 - Merge branch 'master' into cc_20250922_closeStore_w - fix:闭店流程流转补充 - feat:闭店退款 - fix:字典表接口 - Merge branch 'master' into cc_20250922_closeStore_w - fix:闭店原因接口新增闭店发起方式字段 - fix:修改审批记录返回数据类型 feat:新增退款流程跳过 - fix - fix:新增字段 - feat:新增闭店退款提交人列表接口 - fix:闭店初始化数据来源修改;小程序闭店材料详情新增模板url字段 - fix:新增接口返回字段 - fix:闭店管理、审批待办类别所属品牌筛选改为多选 - fix:闭店管理列表新增完成阶段数量字段 - feat:新增第三方闭店申请接口 - Merge branch 'refs/heads/master' into cc_20250922_closeStore_w # Conflicts: # coolstore-partner-common/src/main/java/com/cool/store/constants/CommonConstants.java # coolstore-partner-common/src/main/java/com/cool/store/enums/ErrorCodeEnum.java # coolstore-partner-common/src/main/java/com/cool/store/utils/BeanUtil.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 - fix:自动发起闭店申请定时任务 - feat:火码账号关闭 - fix:闭店流程修改 - 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/ErrorCodeEnum.java # coolstore-partner-web/src/main/java/com/cool/store/controller/webb/OpenApiController.java - fix:删除云流水发起闭店接口 - fix:取消闭店申请入参修改 - fix:闭店申请列表赋值异常问题 - fix:闭店审批通过异常 - fix:普通方法参数校验 - fix:账号关闭时校验阶段状态 - fix:初始化 - fix:字段新增 - fix:接口补充 - fix - Merge branch 'refs/heads/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/ErrorCodeEnum.java # coolstore-partner-common/src/main/java/com/cool/store/enums/RocketMqGroupEnum.java # coolstore-partner-common/src/main/java/com/cool/store/enums/RocketMqTagEnum.java # coolstore-partner-web/src/main/java/com/cool/store/controller/webb/OpenApiController.java # coolstore-partner-web/src/main/java/com/cool/store/controller/webc/TestController.java - Merge branch 'refs/heads/master' into cc_20250922_closeStore_w # Conflicts: # coolstore-partner-common/src/main/java/com/cool/store/common/InsertGroup.java # coolstore-partner-common/src/main/java/com/cool/store/common/UpdateGroup.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/dao/dict/SysDictColumnDAO.java # coolstore-partner-dao/src/main/java/com/cool/store/mapper/StoreMapper.java # coolstore-partner-dao/src/main/java/com/cool/store/mapper/dict/SysDictColumnMapper.java # coolstore-partner-dao/src/main/resources/mapper/StoreMapper.xml # coolstore-partner-dao/src/main/resources/mapper/dict/SysDictColumnMapper.xml # coolstore-partner-web/src/main/java/com/cool/store/controller/webb/DictManagerController.java # coolstore-partner-web/src/main/java/com/cool/store/job/XxlJobHandler.java - fix:闭店流程修改 - fix:闭店流程修改 - fix:修改三方付款状态接口 - fix:闭店申请测试接口 Signed-off-by: 王非凡 Reviewed-by: 苏竹红 Merged-by: 苏竹红 CR-link: https://codeup.aliyun.com/692ea314dec569489f6f167c/hangzhou/java/custom_zxjp/change/8 --- .../com/cool/store/common/InsertGroup.java | 2 +- .../com/cool/store/common/UpdateGroup.java | 2 +- .../cool/store/constants/CommonConstants.java | 5 + .../cool/store/constants/RedisConstant.java | 27 +- .../com/cool/store/enums/ErrorCodeEnum.java | 24 +- .../cool/store/enums/RocketMqGroupEnum.java | 4 +- .../com/cool/store/enums/RocketMqTagEnum.java | 3 +- .../enums/close/AccountCloseTypeEnum.java | 25 + .../close/CloseStoreAccountStatusEnum.java | 26 + .../close/CloseStoreAccountTypeEnum.java | 34 + .../close/CloseStoreAuditStatusEnum.java | 27 + .../store/enums/close/CloseStoreFileEnum.java | 30 + .../enums/close/CloseStoreStageEnum.java | 49 ++ .../enums/close/CloseStoreStatusEnum.java | 81 +++ .../enums/close/CloseStoreSubStageEnum.java | 132 ++++ .../close/CloseStoreSubStageStatusEnum.java | 168 +++++ .../cool/store/enums/close/CloseTypeEnum.java | 30 + .../store/enums/close/FileStatusEnum.java | 38 ++ .../store/enums/close/RecordTypeEnum.java | 30 + .../enums/close/RefundPayStatusEnum.java | 37 ++ .../enums/close/XgjRefundPayStatusEnum.java | 29 + .../enums/master/StoreCloseNatureEnum.java | 39 ++ .../enums/master/StoreCloseReasonEnum.java | 57 ++ .../java/com/cool/store/utils/BeanUtil.java | 10 + .../com/cool/store/utils/CoolDateUtils.java | 7 + .../com/cool/store/utils/RocketMqUtil.java | 13 +- .../store/dao/CloseStoreAccountInfoDAO.java | 75 +++ .../store/dao/CloseStoreAuditRecordDAO.java | 170 +++++ .../store/dao/CloseStoreFileDetailDAO.java | 75 +++ .../cool/store/dao/CloseStoreFileInfoDAO.java | 87 +++ .../com/cool/store/dao/CloseStoreInfoDAO.java | 86 +++ .../store/dao/CloseStoreRefundInfoDAO.java | 124 ++++ .../store/dao/CloseStoreStageInfoDAO.java | 209 ++++++ .../java/com/cool/store/dao/StoreDao.java | 35 + .../dao/store/StoreMasterSignerInfoDAO.java | 7 + .../mapper/CloseStoreAccountInfoMapper.java | 16 + .../mapper/CloseStoreAuditRecordMapper.java | 32 + .../mapper/CloseStoreFileDetailMapper.java | 35 + .../mapper/CloseStoreFileInfoMapper.java | 37 ++ .../store/mapper/CloseStoreInfoMapper.java | 19 + .../mapper/CloseStoreRefundInfoMapper.java | 20 + .../mapper/CloseStoreStageInfoMapper.java | 23 + .../com/cool/store/mapper/StoreMapper.java | 32 + .../store/StoreMasterSignerInfoMapper.java | 3 +- .../mapper/CloseStoreAccountInfoMapper.xml | 26 + .../mapper/CloseStoreAuditRecordMapper.xml | 89 +++ .../mapper/CloseStoreFileDetailMapper.xml | 70 ++ .../mapper/CloseStoreFileInfoMapper.xml | 66 ++ .../resources/mapper/CloseStoreInfoMapper.xml | 74 +++ .../mapper/CloseStoreRefundInfoMapper.xml | 108 +++ .../mapper/CloseStoreStageInfoMapper.xml | 64 ++ .../src/main/resources/mapper/StoreMapper.xml | 42 ++ .../store/dto/close/CloseStoreMkUserDTO.java | 34 + .../store/dto/store/StoreMasterIssueDTO.java | 30 + .../cool/store/dto/xgj/XgjBranchBankDTO.java | 23 + .../store/dto/xgj/XgjPartnerAccountDTO.java | 32 + .../com/cool/store/dto/xgj/XgjPartnerDTO.java | 43 ++ .../cool/store/dto/xgj/XgjPartnerPageDTO.java | 25 + .../cool/store/dto/xgj/XgjPayResultDTO.java | 31 + .../com/cool/store/dto/xgj/XgjPaymentDTO.java | 33 + .../store/entity/CloseStoreAccountInfoDO.java | 70 ++ .../store/entity/CloseStoreAuditRecordDO.java | 92 +++ .../store/entity/CloseStoreFileDetailDO.java | 115 ++++ .../store/entity/CloseStoreFileInfoDO.java | 80 +++ .../cool/store/entity/CloseStoreInfoDO.java | 98 +++ .../store/entity/CloseStoreRefundInfoDO.java | 190 ++++++ .../store/entity/CloseStoreStageInfoDO.java | 92 +++ .../entity/store/StoreMasterSignerInfoDO.java | 1 + .../file/CloseStoreFileApproveRequest.java | 42 ++ .../file/CloseStoreFileAuditRequest.java | 28 + .../close/file/CloseStoreFileInfoRequest.java | 46 ++ .../file/CloseStoreFileSubmitRequest.java | 28 + .../file/CloseStoreMailAddressRequest.java | 30 + .../close/file/CloseStoreMailInfoRequest.java | 29 + .../refund/CloseStoreRefundAddRequest.java | 141 ++++ .../refund/CloseStoreRefundQueryRequest.java | 26 + .../refund/CloseStoreRefundSkipRequest.java | 21 + .../refund/CloseStoreRefundUpdateRequest.java | 100 +++ .../close/store/CloseStoreApplyRequest.java | 42 ++ .../close/store/CloseStoreAuditRequest.java | 31 + .../close/store/CloseStoreCancelRequest.java | 21 + .../close/store/CloseStoreQueryRequest.java | 51 ++ .../store/MiniCloseStoreQueryRequest.java | 19 + .../close/store/ReCloseStoreApplyRequest.java | 18 + .../store/ThirdCloseStoreApplyRequest.java | 47 ++ .../request/huoma/AccountCloseRequest.java | 24 + .../request/xgj/XgjAccountCloseRequest.java | 25 + .../request/xgj/XgjBankQueryRequest.java | 18 + .../request/xgj/XgjPartnerAccountRequest.java | 30 + .../request/xgj/XgjPartnerQueryRequest.java | 38 ++ .../store/request/xgj/XgjPaymentRequest.java | 22 + .../request/xgj/XgjReimburseFeeRequest.java | 41 ++ .../request/xgj/XgjReimburseRequest.java | 109 +++ .../request/xgj/XgjSavePartnerRequest.java | 40 ++ .../vo/close/account/CloseStoreAccountVO.java | 41 ++ .../file/CloseStoreFileDetailMiniVO.java | 45 ++ .../vo/close/file/CloseStoreFileDetailVO.java | 54 ++ .../close/file/CloseStoreFileInfoMiniVO.java | 47 ++ .../vo/close/file/CloseStoreFileInfoVO.java | 39 ++ .../refund/CloseStoreRefundDetailVO.java | 138 ++++ .../close/refund/CloseStoreRefundListVO.java | 46 ++ .../refund/CloseStoreRefundSimpleVO.java | 45 ++ .../close/store/CloseStoreAuditRecordVO.java | 30 + .../close/store/CloseStoreInfoDetailVO.java | 96 +++ .../vo/close/store/CloseStoreInfoListVO.java | 85 +++ .../vo/close/store/CloseStoreSimpleVO.java | 50 ++ .../vo/close/store/CloseStoreStatusVO.java | 25 + .../store/CloseStoreSubStageStatusVO.java | 49 ++ .../close/store/MiniCloseStoreSimpleVO.java | 52 ++ .../vo/close/store/StoreCloseReasonVO.java | 28 + .../com/cool/store/service/HuoMaService.java | 8 + .../cool/store/service/ThirdXgjService.java | 60 ++ .../service/close/AccountCloseFactory.java | 34 + .../service/close/AccountCloseStrategy.java | 23 + .../close/CloseStoreAccountService.java | 36 + .../service/close/CloseStoreFileService.java | 72 ++ .../close/CloseStoreRefundService.java | 82 +++ .../service/close/CloseStoreService.java | 130 ++++ .../close/impl/AbstractAccountClose.java | 37 ++ .../impl/CloseStoreAccountServiceImpl.java | 80 +++ .../close/impl/CloseStoreFileServiceImpl.java | 211 ++++++ .../impl/CloseStoreRefundServiceImpl.java | 225 +++++++ .../close/impl/CloseStoreServiceImpl.java | 621 ++++++++++++++++++ .../service/close/impl/HuomaAccountClose.java | 35 + .../close/impl/XinguanjiaAccountClose.java | 37 ++ .../service/impl/ThirdHuoMaServiceImpl.java | 9 + .../service/impl/ThirdXgjServiceImpl.java | 247 +++++++ .../webb/CloseStoreAccountController.java | 48 ++ .../controller/webb/CloseStoreController.java | 100 +++ .../webb/CloseStoreFileController.java | 69 ++ .../webb/CloseStoreRefundController.java | 82 +++ .../webb/DictManagerController.java | 2 + .../controller/webb/OpenApiController.java | 7 +- .../controller/webb/PCTestController.java | 46 ++ .../webc/MiniCloseStoreAccountController.java | 40 ++ .../webc/MiniCloseStoreController.java | 78 +++ .../webc/MiniCloseStoreFileController.java | 52 ++ .../webc/MiniCloseStoreRefundController.java | 38 ++ .../store/controller/webc/TestController.java | 24 +- .../com/cool/store/job/XxlJobHandler.java | 148 +++++ .../main/resources/application-ab.properties | 2 +- .../resources/application-local.properties | 2 +- 142 files changed, 8144 insertions(+), 20 deletions(-) create mode 100644 coolstore-partner-common/src/main/java/com/cool/store/enums/close/AccountCloseTypeEnum.java create mode 100644 coolstore-partner-common/src/main/java/com/cool/store/enums/close/CloseStoreAccountStatusEnum.java create mode 100644 coolstore-partner-common/src/main/java/com/cool/store/enums/close/CloseStoreAccountTypeEnum.java create mode 100644 coolstore-partner-common/src/main/java/com/cool/store/enums/close/CloseStoreAuditStatusEnum.java create mode 100644 coolstore-partner-common/src/main/java/com/cool/store/enums/close/CloseStoreFileEnum.java create mode 100644 coolstore-partner-common/src/main/java/com/cool/store/enums/close/CloseStoreStageEnum.java create mode 100644 coolstore-partner-common/src/main/java/com/cool/store/enums/close/CloseStoreStatusEnum.java create mode 100644 coolstore-partner-common/src/main/java/com/cool/store/enums/close/CloseStoreSubStageEnum.java create mode 100644 coolstore-partner-common/src/main/java/com/cool/store/enums/close/CloseStoreSubStageStatusEnum.java create mode 100644 coolstore-partner-common/src/main/java/com/cool/store/enums/close/CloseTypeEnum.java create mode 100644 coolstore-partner-common/src/main/java/com/cool/store/enums/close/FileStatusEnum.java create mode 100644 coolstore-partner-common/src/main/java/com/cool/store/enums/close/RecordTypeEnum.java create mode 100644 coolstore-partner-common/src/main/java/com/cool/store/enums/close/RefundPayStatusEnum.java create mode 100644 coolstore-partner-common/src/main/java/com/cool/store/enums/close/XgjRefundPayStatusEnum.java create mode 100644 coolstore-partner-common/src/main/java/com/cool/store/enums/master/StoreCloseNatureEnum.java create mode 100644 coolstore-partner-common/src/main/java/com/cool/store/enums/master/StoreCloseReasonEnum.java create mode 100644 coolstore-partner-dao/src/main/java/com/cool/store/dao/CloseStoreAccountInfoDAO.java create mode 100644 coolstore-partner-dao/src/main/java/com/cool/store/dao/CloseStoreAuditRecordDAO.java create mode 100644 coolstore-partner-dao/src/main/java/com/cool/store/dao/CloseStoreFileDetailDAO.java create mode 100644 coolstore-partner-dao/src/main/java/com/cool/store/dao/CloseStoreFileInfoDAO.java create mode 100644 coolstore-partner-dao/src/main/java/com/cool/store/dao/CloseStoreInfoDAO.java create mode 100644 coolstore-partner-dao/src/main/java/com/cool/store/dao/CloseStoreRefundInfoDAO.java create mode 100644 coolstore-partner-dao/src/main/java/com/cool/store/dao/CloseStoreStageInfoDAO.java create mode 100644 coolstore-partner-dao/src/main/java/com/cool/store/mapper/CloseStoreAccountInfoMapper.java create mode 100644 coolstore-partner-dao/src/main/java/com/cool/store/mapper/CloseStoreAuditRecordMapper.java create mode 100644 coolstore-partner-dao/src/main/java/com/cool/store/mapper/CloseStoreFileDetailMapper.java create mode 100644 coolstore-partner-dao/src/main/java/com/cool/store/mapper/CloseStoreFileInfoMapper.java create mode 100644 coolstore-partner-dao/src/main/java/com/cool/store/mapper/CloseStoreInfoMapper.java create mode 100644 coolstore-partner-dao/src/main/java/com/cool/store/mapper/CloseStoreRefundInfoMapper.java create mode 100644 coolstore-partner-dao/src/main/java/com/cool/store/mapper/CloseStoreStageInfoMapper.java create mode 100644 coolstore-partner-dao/src/main/resources/mapper/CloseStoreAccountInfoMapper.xml create mode 100644 coolstore-partner-dao/src/main/resources/mapper/CloseStoreAuditRecordMapper.xml create mode 100644 coolstore-partner-dao/src/main/resources/mapper/CloseStoreFileDetailMapper.xml create mode 100644 coolstore-partner-dao/src/main/resources/mapper/CloseStoreFileInfoMapper.xml create mode 100644 coolstore-partner-dao/src/main/resources/mapper/CloseStoreInfoMapper.xml create mode 100644 coolstore-partner-dao/src/main/resources/mapper/CloseStoreRefundInfoMapper.xml create mode 100644 coolstore-partner-dao/src/main/resources/mapper/CloseStoreStageInfoMapper.xml create mode 100644 coolstore-partner-model/src/main/java/com/cool/store/dto/close/CloseStoreMkUserDTO.java create mode 100644 coolstore-partner-model/src/main/java/com/cool/store/dto/store/StoreMasterIssueDTO.java create mode 100644 coolstore-partner-model/src/main/java/com/cool/store/dto/xgj/XgjBranchBankDTO.java create mode 100644 coolstore-partner-model/src/main/java/com/cool/store/dto/xgj/XgjPartnerAccountDTO.java create mode 100644 coolstore-partner-model/src/main/java/com/cool/store/dto/xgj/XgjPartnerDTO.java create mode 100644 coolstore-partner-model/src/main/java/com/cool/store/dto/xgj/XgjPartnerPageDTO.java create mode 100644 coolstore-partner-model/src/main/java/com/cool/store/dto/xgj/XgjPayResultDTO.java create mode 100644 coolstore-partner-model/src/main/java/com/cool/store/dto/xgj/XgjPaymentDTO.java create mode 100644 coolstore-partner-model/src/main/java/com/cool/store/entity/CloseStoreAccountInfoDO.java create mode 100644 coolstore-partner-model/src/main/java/com/cool/store/entity/CloseStoreAuditRecordDO.java create mode 100644 coolstore-partner-model/src/main/java/com/cool/store/entity/CloseStoreFileDetailDO.java create mode 100644 coolstore-partner-model/src/main/java/com/cool/store/entity/CloseStoreFileInfoDO.java create mode 100644 coolstore-partner-model/src/main/java/com/cool/store/entity/CloseStoreInfoDO.java create mode 100644 coolstore-partner-model/src/main/java/com/cool/store/entity/CloseStoreRefundInfoDO.java create mode 100644 coolstore-partner-model/src/main/java/com/cool/store/entity/CloseStoreStageInfoDO.java create mode 100644 coolstore-partner-model/src/main/java/com/cool/store/request/close/file/CloseStoreFileApproveRequest.java create mode 100644 coolstore-partner-model/src/main/java/com/cool/store/request/close/file/CloseStoreFileAuditRequest.java create mode 100644 coolstore-partner-model/src/main/java/com/cool/store/request/close/file/CloseStoreFileInfoRequest.java create mode 100644 coolstore-partner-model/src/main/java/com/cool/store/request/close/file/CloseStoreFileSubmitRequest.java create mode 100644 coolstore-partner-model/src/main/java/com/cool/store/request/close/file/CloseStoreMailAddressRequest.java create mode 100644 coolstore-partner-model/src/main/java/com/cool/store/request/close/file/CloseStoreMailInfoRequest.java create mode 100644 coolstore-partner-model/src/main/java/com/cool/store/request/close/refund/CloseStoreRefundAddRequest.java create mode 100644 coolstore-partner-model/src/main/java/com/cool/store/request/close/refund/CloseStoreRefundQueryRequest.java create mode 100644 coolstore-partner-model/src/main/java/com/cool/store/request/close/refund/CloseStoreRefundSkipRequest.java create mode 100644 coolstore-partner-model/src/main/java/com/cool/store/request/close/refund/CloseStoreRefundUpdateRequest.java create mode 100644 coolstore-partner-model/src/main/java/com/cool/store/request/close/store/CloseStoreApplyRequest.java create mode 100644 coolstore-partner-model/src/main/java/com/cool/store/request/close/store/CloseStoreAuditRequest.java create mode 100644 coolstore-partner-model/src/main/java/com/cool/store/request/close/store/CloseStoreCancelRequest.java create mode 100644 coolstore-partner-model/src/main/java/com/cool/store/request/close/store/CloseStoreQueryRequest.java create mode 100644 coolstore-partner-model/src/main/java/com/cool/store/request/close/store/MiniCloseStoreQueryRequest.java create mode 100644 coolstore-partner-model/src/main/java/com/cool/store/request/close/store/ReCloseStoreApplyRequest.java create mode 100644 coolstore-partner-model/src/main/java/com/cool/store/request/close/store/ThirdCloseStoreApplyRequest.java create mode 100644 coolstore-partner-model/src/main/java/com/cool/store/request/huoma/AccountCloseRequest.java create mode 100644 coolstore-partner-model/src/main/java/com/cool/store/request/xgj/XgjAccountCloseRequest.java create mode 100644 coolstore-partner-model/src/main/java/com/cool/store/request/xgj/XgjBankQueryRequest.java create mode 100644 coolstore-partner-model/src/main/java/com/cool/store/request/xgj/XgjPartnerAccountRequest.java create mode 100644 coolstore-partner-model/src/main/java/com/cool/store/request/xgj/XgjPartnerQueryRequest.java create mode 100644 coolstore-partner-model/src/main/java/com/cool/store/request/xgj/XgjPaymentRequest.java create mode 100644 coolstore-partner-model/src/main/java/com/cool/store/request/xgj/XgjReimburseFeeRequest.java create mode 100644 coolstore-partner-model/src/main/java/com/cool/store/request/xgj/XgjReimburseRequest.java create mode 100644 coolstore-partner-model/src/main/java/com/cool/store/request/xgj/XgjSavePartnerRequest.java create mode 100644 coolstore-partner-model/src/main/java/com/cool/store/vo/close/account/CloseStoreAccountVO.java create mode 100644 coolstore-partner-model/src/main/java/com/cool/store/vo/close/file/CloseStoreFileDetailMiniVO.java create mode 100644 coolstore-partner-model/src/main/java/com/cool/store/vo/close/file/CloseStoreFileDetailVO.java create mode 100644 coolstore-partner-model/src/main/java/com/cool/store/vo/close/file/CloseStoreFileInfoMiniVO.java create mode 100644 coolstore-partner-model/src/main/java/com/cool/store/vo/close/file/CloseStoreFileInfoVO.java create mode 100644 coolstore-partner-model/src/main/java/com/cool/store/vo/close/refund/CloseStoreRefundDetailVO.java create mode 100644 coolstore-partner-model/src/main/java/com/cool/store/vo/close/refund/CloseStoreRefundListVO.java create mode 100644 coolstore-partner-model/src/main/java/com/cool/store/vo/close/refund/CloseStoreRefundSimpleVO.java create mode 100644 coolstore-partner-model/src/main/java/com/cool/store/vo/close/store/CloseStoreAuditRecordVO.java create mode 100644 coolstore-partner-model/src/main/java/com/cool/store/vo/close/store/CloseStoreInfoDetailVO.java create mode 100644 coolstore-partner-model/src/main/java/com/cool/store/vo/close/store/CloseStoreInfoListVO.java create mode 100644 coolstore-partner-model/src/main/java/com/cool/store/vo/close/store/CloseStoreSimpleVO.java create mode 100644 coolstore-partner-model/src/main/java/com/cool/store/vo/close/store/CloseStoreStatusVO.java create mode 100644 coolstore-partner-model/src/main/java/com/cool/store/vo/close/store/CloseStoreSubStageStatusVO.java create mode 100644 coolstore-partner-model/src/main/java/com/cool/store/vo/close/store/MiniCloseStoreSimpleVO.java create mode 100644 coolstore-partner-model/src/main/java/com/cool/store/vo/close/store/StoreCloseReasonVO.java create mode 100644 coolstore-partner-service/src/main/java/com/cool/store/service/ThirdXgjService.java create mode 100644 coolstore-partner-service/src/main/java/com/cool/store/service/close/AccountCloseFactory.java create mode 100644 coolstore-partner-service/src/main/java/com/cool/store/service/close/AccountCloseStrategy.java create mode 100644 coolstore-partner-service/src/main/java/com/cool/store/service/close/CloseStoreAccountService.java create mode 100644 coolstore-partner-service/src/main/java/com/cool/store/service/close/CloseStoreFileService.java create mode 100644 coolstore-partner-service/src/main/java/com/cool/store/service/close/CloseStoreRefundService.java create mode 100644 coolstore-partner-service/src/main/java/com/cool/store/service/close/CloseStoreService.java create mode 100644 coolstore-partner-service/src/main/java/com/cool/store/service/close/impl/AbstractAccountClose.java create mode 100644 coolstore-partner-service/src/main/java/com/cool/store/service/close/impl/CloseStoreAccountServiceImpl.java create mode 100644 coolstore-partner-service/src/main/java/com/cool/store/service/close/impl/CloseStoreFileServiceImpl.java create mode 100644 coolstore-partner-service/src/main/java/com/cool/store/service/close/impl/CloseStoreRefundServiceImpl.java create mode 100644 coolstore-partner-service/src/main/java/com/cool/store/service/close/impl/CloseStoreServiceImpl.java create mode 100644 coolstore-partner-service/src/main/java/com/cool/store/service/close/impl/HuomaAccountClose.java create mode 100644 coolstore-partner-service/src/main/java/com/cool/store/service/close/impl/XinguanjiaAccountClose.java create mode 100644 coolstore-partner-service/src/main/java/com/cool/store/service/impl/ThirdXgjServiceImpl.java create mode 100644 coolstore-partner-web/src/main/java/com/cool/store/controller/webb/CloseStoreAccountController.java create mode 100644 coolstore-partner-web/src/main/java/com/cool/store/controller/webb/CloseStoreController.java create mode 100644 coolstore-partner-web/src/main/java/com/cool/store/controller/webb/CloseStoreFileController.java create mode 100644 coolstore-partner-web/src/main/java/com/cool/store/controller/webb/CloseStoreRefundController.java create mode 100644 coolstore-partner-web/src/main/java/com/cool/store/controller/webc/MiniCloseStoreAccountController.java create mode 100644 coolstore-partner-web/src/main/java/com/cool/store/controller/webc/MiniCloseStoreController.java create mode 100644 coolstore-partner-web/src/main/java/com/cool/store/controller/webc/MiniCloseStoreFileController.java create mode 100644 coolstore-partner-web/src/main/java/com/cool/store/controller/webc/MiniCloseStoreRefundController.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 index e97b4e698..4b315af7f 100644 --- 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 @@ -6,7 +6,7 @@ package com.cool.store.common; *

* * @author wangff - * @since 2025/11/4 + * @since 2025/3/6 */ 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 index ead1d3ded..779fc84c3 100644 --- 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 @@ -6,7 +6,7 @@ package com.cool.store.common; *

* * @author wangff - * @since 2025/11/4 + * @since 2025/3/6 */ public interface UpdateGroup { } diff --git a/coolstore-partner-common/src/main/java/com/cool/store/constants/CommonConstants.java b/coolstore-partner-common/src/main/java/com/cool/store/constants/CommonConstants.java index 8081b0051..47b9e1dba 100644 --- a/coolstore-partner-common/src/main/java/com/cool/store/constants/CommonConstants.java +++ b/coolstore-partner-common/src/main/java/com/cool/store/constants/CommonConstants.java @@ -209,6 +209,11 @@ public class CommonConstants { public static final String ONLINE_ENV = "online"; public static final String AMOUNT_KEY = "amount:{0}:{1}"; + /** + * 闭店状态 + */ + public static final String CLOSED = "closed"; + public static final String WX_SELF_AUTH_URL = "https://open.weixin.qq.com/connect/oauth2/authorize?appid=%s&redirect_uri=%s&response_type=code&scope=snsapi_base&state=1#wechat_redirect"; /** diff --git a/coolstore-partner-common/src/main/java/com/cool/store/constants/RedisConstant.java b/coolstore-partner-common/src/main/java/com/cool/store/constants/RedisConstant.java index e20a622be..f86343a8a 100644 --- a/coolstore-partner-common/src/main/java/com/cool/store/constants/RedisConstant.java +++ b/coolstore-partner-common/src/main/java/com/cool/store/constants/RedisConstant.java @@ -289,7 +289,7 @@ public class RedisConstant { public static final String HUO_MA_STORE_ID = "huo_ma_store_id"; public static final String HUO_MA_TOKEN= "huo_ma_token:{0}"; - + /** * 钱包开通失败/打标失败原因 wallet_open_fail:storeId:1/2 1平安/2网商 */ @@ -304,4 +304,29 @@ public class RedisConstant { * 网商账户是否已激活 */ public static final String WALLET_ONLINE_BANK_ACTIVATED = "wallet_online_bank_activated:{0}"; + + /** + * 闭店退款申请人 + */ + public static final String CLOSE_STORE_REFUND_SUBMIT_USER = "zxjp_refund_submit_user"; + + /** + * 闭店账号初始化 + */ + public static final String CLOSE_STORE_ACCOUNT_INIT = "zxjp_close_store_account"; + + /** + * 闭店资料初始化 + */ + public static final String CLOSE_STORE_FILE_INIT = "zxjp_close_store_file"; + + /** + * 闭店资料模板 + */ + public static final String CLOSE_STORE_FILE_TEMPLATE = "zxjp_close_store_file_template"; + + /** + * 每刻退款用户信息 + */ + public static final String MK_USER_MAPPING = "zxjp_mk_user_mapping"; } 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 426cd5a8a..87da1c8ec 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 @@ -321,12 +321,32 @@ public enum ErrorCodeEnum { SHOP_NAME_INVALID(1610014, "门店名称包含禁止关键词",null), //装修 TEAM_USED(1612001,"该装修团队有门店使用,无法删除,请确认!",null), + CURRENT_BRAND_SORT_NUMBER_EXIST(16100007,"当前品牌已存在该排序数字!",null), + CONTRACT_CONFIG_NOT_EXIST(16100008,"合同配置不存在!",null), 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), + + // 171闭店 + CLOSE_STORE_SUB_STAGE_ERROR(171002, "当前流程状态异常", null), + STORE_NOT_EXIST(1710003,"门店不存在!",null), + STORE_NOT_OPEN(1710004,"当期门店状态为已闭店!请确认!",null), + CLOSE_STORE_INFO_NOT_EXIST(1710005,"闭店申请信息不存在!",null), + CLOSE_STORE_EXIST_ONGOING_RECORD(1710006,"当前门店有进行中的闭店申请,请确认!",null), + CLOSE_STORE_HAS_BEEN_COMPLETED(1710007,"该审批已结束",null), + NO_APPROVAL_AUTHORITY(1710008,"您没有审批权限!",null), + CLOSE_STORE_AUDIT_RECORD_NOT_EXIST(1710009,"闭店审批记录不存在!",null), + CLOSE_STORE_CANCEL_ERROR(1710010,"该闭店申请已审批无法取消",null), + CLOSE_STORE_CANCELED(1710011,"该闭店申请已取消",null), + CLOSE_STORE_IS_NOT_APPLICANT(1710012, "非申请发起人无法取消!",null), + CLOSE_STORE_REFUND_INFO_NOT_EXIST(1710013,"退款信息不存在",null), + CLOSE_STORE_FILE_STATUS_ERROR(1710014, "材料上传状态错误,请检查材料上传情况", null), + CLOSE_STORE_FILE_NOT_EXIST(1710015, "闭店材料不存在", null), + CLOSE_STORE_REFUND_MK_USER_NOT_EXIST(1710016, "当前用户不存在每刻权限", null), + CLOSE_STORE_REFUND_EXIST_EFFECTIVE_RECORD(1710017, "存在生效中的退款申请!", null), + CLOSE_STORE_REFUND_TYPE_ERROR(1710018, "退款类型错误", null), + /** * 181 十二分制 */ diff --git a/coolstore-partner-common/src/main/java/com/cool/store/enums/RocketMqGroupEnum.java b/coolstore-partner-common/src/main/java/com/cool/store/enums/RocketMqGroupEnum.java index 68ebaf10f..73b600d3f 100644 --- a/coolstore-partner-common/src/main/java/com/cool/store/enums/RocketMqGroupEnum.java +++ b/coolstore-partner-common/src/main/java/com/cool/store/enums/RocketMqGroupEnum.java @@ -34,7 +34,9 @@ public enum RocketMqGroupEnum { STORE_USER_UPDATE("store_user_update", new ArrayList<>(Arrays.asList(RocketMqTagEnum.STORE_USER_UPDATE))), - SHOP_DECORATION_ASSIGN("shop_decoration_assign", new ArrayList<>(Arrays.asList(RocketMqTagEnum.DELAY_SHOP_DECORATION_ASSIGN))) + SHOP_DECORATION_ASSIGN("shop_decoration_assign", new ArrayList<>(Arrays.asList(RocketMqTagEnum.DELAY_SHOP_DECORATION_ASSIGN))), + + STORE_MASTER_ISSUE("store_master_issue", new ArrayList<>(Arrays.asList(RocketMqTagEnum.STORE_MASTER_ISSUE))), ; diff --git a/coolstore-partner-common/src/main/java/com/cool/store/enums/RocketMqTagEnum.java b/coolstore-partner-common/src/main/java/com/cool/store/enums/RocketMqTagEnum.java index b8b2bba54..f630aebb8 100644 --- a/coolstore-partner-common/src/main/java/com/cool/store/enums/RocketMqTagEnum.java +++ b/coolstore-partner-common/src/main/java/com/cool/store/enums/RocketMqTagEnum.java @@ -19,7 +19,8 @@ public enum RocketMqTagEnum { PARTNER_LICENSE_SYNC_QUEUE("partner_license_sync_queue", "招商证照信息同步"), BUSINESS_SYNC("business_sync", "工商食安信息同步"), STORE_USER_UPDATE("store_user_update", "门店信息人员变更同步菜品"), - DELAY_SHOP_DECORATION_ASSIGN("shop_decoration_assign","门店装修分配"); + DELAY_SHOP_DECORATION_ASSIGN("shop_decoration_assign","门店装修分配"), + STORE_MASTER_ISSUE("store_master_issue","门店主数据下发"), ; diff --git a/coolstore-partner-common/src/main/java/com/cool/store/enums/close/AccountCloseTypeEnum.java b/coolstore-partner-common/src/main/java/com/cool/store/enums/close/AccountCloseTypeEnum.java new file mode 100644 index 000000000..85b7deba0 --- /dev/null +++ b/coolstore-partner-common/src/main/java/com/cool/store/enums/close/AccountCloseTypeEnum.java @@ -0,0 +1,25 @@ +package com.cool.store.enums.close; + +import lombok.AllArgsConstructor; +import lombok.Getter; + +/** + *

+ * 闭店账号关闭类型枚举类 + *

+ * + * @author wangff + * @since 2025/10/9 + */ +@Getter +@AllArgsConstructor +public enum AccountCloseTypeEnum { + + DIRECT_CLOSE(0, "直接关闭"), + APPLY_CLOSE(1, "申请关闭"), + ; + + private final Integer type; + + private final String msg; +} diff --git a/coolstore-partner-common/src/main/java/com/cool/store/enums/close/CloseStoreAccountStatusEnum.java b/coolstore-partner-common/src/main/java/com/cool/store/enums/close/CloseStoreAccountStatusEnum.java new file mode 100644 index 000000000..ca06bc00f --- /dev/null +++ b/coolstore-partner-common/src/main/java/com/cool/store/enums/close/CloseStoreAccountStatusEnum.java @@ -0,0 +1,26 @@ +package com.cool.store.enums.close; + +import lombok.AllArgsConstructor; +import lombok.Getter; + +/** + *

+ * 闭店账号状态枚举类 + *

+ * + * @author wangff + * @since 2025/10/8 + */ +@Getter +@AllArgsConstructor +public enum CloseStoreAccountStatusEnum { + + IN_USE(1, "使用中"), + CLOSED(2, "已关闭"), + CLOSING(3, "关闭中"), + ; + + private final Integer status; + + private final String msg; +} diff --git a/coolstore-partner-common/src/main/java/com/cool/store/enums/close/CloseStoreAccountTypeEnum.java b/coolstore-partner-common/src/main/java/com/cool/store/enums/close/CloseStoreAccountTypeEnum.java new file mode 100644 index 000000000..4f1a90130 --- /dev/null +++ b/coolstore-partner-common/src/main/java/com/cool/store/enums/close/CloseStoreAccountTypeEnum.java @@ -0,0 +1,34 @@ +package com.cool.store.enums.close; + +import lombok.AllArgsConstructor; +import lombok.Getter; + +/** + *

+ * 闭店账号类型枚举类 + *

+ * + * @author wangff + * @since 2025/10/8 + */ +@Getter +@AllArgsConstructor +public enum CloseStoreAccountTypeEnum { + + IT_ACCOUNT(0, "IT账号"), + TAKE_OUT_ACCOUNT(1, "外卖账号"), + ; + + private final Integer type; + + private final String msg; + + public static String getMsgByType(Integer type) { + for (CloseStoreAccountTypeEnum value : CloseStoreAccountTypeEnum.values()) { + if (value.getType().equals(type)) { + return value.getMsg(); + } + } + return null; + } +} diff --git a/coolstore-partner-common/src/main/java/com/cool/store/enums/close/CloseStoreAuditStatusEnum.java b/coolstore-partner-common/src/main/java/com/cool/store/enums/close/CloseStoreAuditStatusEnum.java new file mode 100644 index 000000000..a609eed65 --- /dev/null +++ b/coolstore-partner-common/src/main/java/com/cool/store/enums/close/CloseStoreAuditStatusEnum.java @@ -0,0 +1,27 @@ +package com.cool.store.enums.close; + +import lombok.AllArgsConstructor; +import lombok.Getter; + +/** + *

+ * 闭店审批状态枚举类 + *

+ * + * @author wangff + * @since 2025/10/8 + */ +@Getter +@AllArgsConstructor +public enum CloseStoreAuditStatusEnum { + + PENDING(0, "待处理"), + PASS(1, "通过"), + REJECTED(2, "拒绝"), + + ; + + private final Integer status; + + private final String msg; +} diff --git a/coolstore-partner-common/src/main/java/com/cool/store/enums/close/CloseStoreFileEnum.java b/coolstore-partner-common/src/main/java/com/cool/store/enums/close/CloseStoreFileEnum.java new file mode 100644 index 000000000..d7eff679b --- /dev/null +++ b/coolstore-partner-common/src/main/java/com/cool/store/enums/close/CloseStoreFileEnum.java @@ -0,0 +1,30 @@ +package com.cool.store.enums.close; + +import lombok.AllArgsConstructor; +import lombok.Getter; + +/** + *

+ * 闭店材料 枚举类 + *

+ * + * @author wangff + * @since 2025/11/27 + */ +@Getter +@AllArgsConstructor +public enum CloseStoreFileEnum { + + HT("close_store_file_ht", "合同"), + YJT("close_store_file_yjt", "押金条"), + SQS("close_store_file_sqs", "授权书"), + MTZ("close_store_file_mtz", "门头字摧毁照片"), + TKD("close_store_file_tkd", "退款单"), + SFZ("close_store_file_sfz", "身份证复印件"), + YHK("close_store_file_yhk", "银行卡复印件"), + ; + + private final String code; + + private final String desc; +} diff --git a/coolstore-partner-common/src/main/java/com/cool/store/enums/close/CloseStoreStageEnum.java b/coolstore-partner-common/src/main/java/com/cool/store/enums/close/CloseStoreStageEnum.java new file mode 100644 index 000000000..0ada6c799 --- /dev/null +++ b/coolstore-partner-common/src/main/java/com/cool/store/enums/close/CloseStoreStageEnum.java @@ -0,0 +1,49 @@ +package com.cool.store.enums.close; + +/** + * @Author suzhuhong + * @Date 2025/9/22 11:21 + * @Version 1.0 + */ +public enum CloseStoreStageEnum { + + CLOSE_STORE_STAGE_1(1, "材料上交"), + CLOSE_STORE_STAGE_2(2, "账号关闭"), + CLOSE_STORE_STAGE_3(3, "退款"), + ; + + /** + * 闭店阶段 + */ + private Integer closeStoreStage; + + /** + * 闭店阶段名称 + */ + private String closeStoreName; + + + + CloseStoreStageEnum(Integer closeStoreStage, String closeStoreName) { + this.closeStoreStage = closeStoreStage; + this.closeStoreName = closeStoreName; + } + + public static CloseStoreStageEnum getCloseStoreStageEnum(Integer closeStoreStage) { + for (CloseStoreStageEnum closeStoreStageEnum : CloseStoreStageEnum.values()) { + if (closeStoreStageEnum.getCloseStoreStage().equals(closeStoreStage)) { + return closeStoreStageEnum; + } + } + return null; + } + + + public Integer getCloseStoreStage() { + return closeStoreStage; + } + + public String getCloseStoreName() { + return closeStoreName; + } +} diff --git a/coolstore-partner-common/src/main/java/com/cool/store/enums/close/CloseStoreStatusEnum.java b/coolstore-partner-common/src/main/java/com/cool/store/enums/close/CloseStoreStatusEnum.java new file mode 100644 index 000000000..a0b54e7fe --- /dev/null +++ b/coolstore-partner-common/src/main/java/com/cool/store/enums/close/CloseStoreStatusEnum.java @@ -0,0 +1,81 @@ +package com.cool.store.enums.close; + +/** + * @Author suzhuhong + * @Date 2025/9/22 18:57 + * @Version 1.0 + */ +public enum CloseStoreStatusEnum { + // 督导审批中 + UNDER_APPROVAL(1, "审批中"), + // 大区老总审批中 + MANAGER_UNDER_APPROVAL(2, "审批中"), + REVIEW_NOT_APPROVED(5, "审批拒绝"), + CANCELED(10, "已取消"), + CLOSING(15, "闭店中"), + COMPLETED(20, "已完成"), + + ; + private Integer closeStoreStatus; + + private String closeStoreStatusName; + + + CloseStoreStatusEnum(Integer closeStoreStatus, String closeStoreStatusName) { + this.closeStoreStatus = closeStoreStatus; + this.closeStoreStatusName = closeStoreStatusName; + } + + public Integer getCloseStoreStatus() { + return closeStoreStatus; + } + + public String getCloseStoreStatusName() { + return closeStoreStatusName; + } + + public static CloseStoreStatusEnum getByCloseStoreStatus(Integer closeStoreStatus){ + for (CloseStoreStatusEnum value : CloseStoreStatusEnum.values()) { + if (value.getCloseStoreStatus().equals(closeStoreStatus)){ + return value; + } + } + return null; + } + + public static String getNameByStatus(Integer closeStoreStatus) { + for (CloseStoreStatusEnum value : CloseStoreStatusEnum.values()) { + if (value.getCloseStoreStatus().equals(closeStoreStatus)){ + return value.getCloseStoreStatusName(); + } + } + return null; + } + + /** + * 获取下一个审批通过状态 + * @param status 审批状态 + * @return 审批状态 + */ + public static Integer getNextPassStatus(Integer status) { + CloseStoreStatusEnum currentStatus = getByCloseStoreStatus(status); + if (currentStatus == null) { + throw new IllegalArgumentException("闭店申请状态为空"); + } + switch (currentStatus) { + case UNDER_APPROVAL: + return MANAGER_UNDER_APPROVAL.getCloseStoreStatus(); + case MANAGER_UNDER_APPROVAL: + return CLOSING.getCloseStoreStatus(); + case CLOSING: + return COMPLETED.getCloseStoreStatus(); + default: + return null; + } + } + + public static boolean isApprove(Integer status) { + return CloseStoreStatusEnum.UNDER_APPROVAL.getCloseStoreStatus().equals(status) + || CloseStoreStatusEnum.MANAGER_UNDER_APPROVAL.getCloseStoreStatus().equals(status); + } +} diff --git a/coolstore-partner-common/src/main/java/com/cool/store/enums/close/CloseStoreSubStageEnum.java b/coolstore-partner-common/src/main/java/com/cool/store/enums/close/CloseStoreSubStageEnum.java new file mode 100644 index 000000000..37de0ec29 --- /dev/null +++ b/coolstore-partner-common/src/main/java/com/cool/store/enums/close/CloseStoreSubStageEnum.java @@ -0,0 +1,132 @@ +package com.cool.store.enums.close; + +import java.time.LocalDate; +import java.util.ArrayList; +import java.util.Arrays; +import java.util.List; +import java.util.Objects; + +/** + * @author zhangchenbiao + * @FileName: ShopStageEnum + * @Description:店铺阶段 + * @date 2024-04-10 17:34 + */ +public enum CloseStoreSubStageEnum { + + CLOSE_STORE_SUB_STAGE_10(CloseStoreStageEnum.CLOSE_STORE_STAGE_1, 10, "关店所需材料上交", 1), + CLOSE_STORE_SUB_STAGE_20(CloseStoreStageEnum.CLOSE_STORE_STAGE_2, 20, "账号关闭", 2), + CLOSE_STORE_SUB_STAGE_30(CloseStoreStageEnum.CLOSE_STORE_STAGE_3, 30, "押金退款", 3), + CLOSE_STORE_SUB_STAGE_40(CloseStoreStageEnum.CLOSE_STORE_STAGE_3, 40, "货款退款", 3), + ; + + /** + * 阶段 + */ + private CloseStoreStageEnum closeStoreStageEnum; + + /** + * 子阶段 + */ + private Integer closeStoreSubStage; + + /** + * 子阶段名称 + */ + private String closeStoreSubStageName; + + /** + * 计划完成天数 + */ + private Integer planCompleteDays; + + CloseStoreSubStageEnum(CloseStoreStageEnum closeStoreStageEnum, Integer closeStoreSubStage, String closeStoreSubStageName, Integer planCompleteDays) { + this.closeStoreStageEnum = closeStoreStageEnum; + this.closeStoreSubStage = closeStoreSubStage; + this.closeStoreSubStageName = closeStoreSubStageName; + this.planCompleteDays = planCompleteDays; + } + + + public static List getShopStageEnum(Integer closeStoreStage) { + List resultList = new ArrayList<>(); + for (CloseStoreSubStageEnum closeStoreSubStageEnum : CloseStoreSubStageEnum.values()) { + if (closeStoreSubStageEnum.getCloseStoreStageEnum().getCloseStoreStage().equals(closeStoreStage)) { + resultList.add(closeStoreSubStageEnum); + } + } + return resultList; + } + + public CloseStoreStageEnum getCloseStoreStageEnum() { + return closeStoreStageEnum; + } + + public Integer getCloseStoreSubStage() { + return closeStoreSubStage; + } + + public String getCloseStoreSubStageName() { + return closeStoreSubStageName; + } + + public Integer getPlanCompleteDays() { + return planCompleteDays; + } + + /** + * 获取各阶段的初始状态 + * + * @return + */ + public CloseStoreSubStageStatusEnum getInitStatus() { + switch (this) { + case CLOSE_STORE_SUB_STAGE_10: + return CloseStoreSubStageStatusEnum.CLOSE_STORE_SUB_STAGE_STATUS_10; + case CLOSE_STORE_SUB_STAGE_20: + case CLOSE_STORE_SUB_STAGE_30: + case CLOSE_STORE_SUB_STAGE_40: + return CloseStoreSubStageStatusEnum.CLOSE_STORE_SUB_STAGE_STATUS_00; + default: + return null; + } + } + + + public String getPlanCompleteTime(LocalDate planCompleteTime) { + switch (this) { + default: + return planCompleteTime.plusDays(getPlanCompleteDays()).toString(); + } + } + + /** + * 获取下一个开启的子阶段 + */ + public static List getNextSubStage(CloseStoreSubStageEnum currentSubStage) { + switch (currentSubStage) { + case CLOSE_STORE_SUB_STAGE_10: + return Arrays.asList(CLOSE_STORE_SUB_STAGE_20, CLOSE_STORE_SUB_STAGE_30, CLOSE_STORE_SUB_STAGE_40); + default: + return null; + } + } + + public static CloseStoreSubStageEnum getSubStageByStage(Integer subStage) { + for (CloseStoreSubStageEnum value : CloseStoreSubStageEnum.values()) { + if (value.getCloseStoreSubStage().equals(subStage)) { + return value; + } + } + return null; + } + + public static String getSubStageNameBySubStage(Integer subStage) { + for (CloseStoreSubStageEnum value : CloseStoreSubStageEnum.values()) { + if (value.getCloseStoreSubStage().equals(subStage)) { + return value.getCloseStoreSubStageName(); + } + } + return null; + } +} diff --git a/coolstore-partner-common/src/main/java/com/cool/store/enums/close/CloseStoreSubStageStatusEnum.java b/coolstore-partner-common/src/main/java/com/cool/store/enums/close/CloseStoreSubStageStatusEnum.java new file mode 100644 index 000000000..5b087da7f --- /dev/null +++ b/coolstore-partner-common/src/main/java/com/cool/store/enums/close/CloseStoreSubStageStatusEnum.java @@ -0,0 +1,168 @@ +package com.cool.store.enums.close; + +import java.util.ArrayList; +import java.util.List; +import java.util.Objects; + +/** + * @author zhangchenbiao + * @FileName: ShopStageStatusEnum + * @Description:店铺阶段状态 + * @date 2024-04-10 17:34 + */ +public enum CloseStoreSubStageStatusEnum { + + CLOSE_STORE_SUB_STAGE_STATUS_00(null, -100, "未开始", Boolean.FALSE), + + /** + * 材料上传 + */ + CLOSE_STORE_SUB_STAGE_STATUS_10(CloseStoreSubStageEnum.CLOSE_STORE_SUB_STAGE_10, 100, "待内勤填写地址", Boolean.FALSE), + CLOSE_STORE_SUB_STAGE_STATUS_15(CloseStoreSubStageEnum.CLOSE_STORE_SUB_STAGE_10, 110, "未提交", Boolean.FALSE), + CLOSE_STORE_SUB_STAGE_STATUS_16(CloseStoreSubStageEnum.CLOSE_STORE_SUB_STAGE_10, 120, "待督导审核", Boolean.FALSE), + CLOSE_STORE_SUB_STAGE_STATUS_17(CloseStoreSubStageEnum.CLOSE_STORE_SUB_STAGE_10, 130, "督导审批驳回", Boolean.FALSE), + CLOSE_STORE_SUB_STAGE_STATUS_18(CloseStoreSubStageEnum.CLOSE_STORE_SUB_STAGE_10, 140, "待内勤审核", Boolean.FALSE), + CLOSE_STORE_SUB_STAGE_STATUS_19(CloseStoreSubStageEnum.CLOSE_STORE_SUB_STAGE_10, 150, "内勤审批驳回", Boolean.FALSE), + CLOSE_STORE_SUB_STAGE_STATUS_20(CloseStoreSubStageEnum.CLOSE_STORE_SUB_STAGE_10, 160, "已完成", Boolean.TRUE), + + /** + * 账号关闭 + */ + CLOSE_STORE_SUB_STAGE_STATUS_25(CloseStoreSubStageEnum.CLOSE_STORE_SUB_STAGE_20, 200, "进行中", Boolean.FALSE), + CLOSE_STORE_SUB_STAGE_STATUS_30(CloseStoreSubStageEnum.CLOSE_STORE_SUB_STAGE_20, 210, "已完成", Boolean.TRUE), + + /** + * 押金退款 + */ + CLOSE_STORE_SUB_STAGE_STATUS_35(CloseStoreSubStageEnum.CLOSE_STORE_SUB_STAGE_30, 310, "待退款", Boolean.FALSE), + CLOSE_STORE_SUB_STAGE_STATUS_40(CloseStoreSubStageEnum.CLOSE_STORE_SUB_STAGE_30, 330, "已完成", Boolean.TRUE), + + /** + * 货款退款 + */ + CLOSE_STORE_SUB_STAGE_STATUS_45(CloseStoreSubStageEnum.CLOSE_STORE_SUB_STAGE_40, 410, "待退款", Boolean.FALSE), + CLOSE_STORE_SUB_STAGE_STATUS_50(CloseStoreSubStageEnum.CLOSE_STORE_SUB_STAGE_40, 430, "已完成", Boolean.TRUE), + + ; + + private CloseStoreSubStageEnum closeStoreSubStageEnum; + + private Integer shopSubStageStatus; + + private String shopSubStageStatusName; + + private boolean isTerminated; + + + CloseStoreSubStageStatusEnum(CloseStoreSubStageEnum closeStoreSubStageEnum, Integer shopSubStageStatus, String shopSubStageStatusName, Boolean isTerminated) { + this.closeStoreSubStageEnum = closeStoreSubStageEnum; + this.shopSubStageStatus = shopSubStageStatus; + this.shopSubStageStatusName = shopSubStageStatusName; + this.isTerminated = isTerminated; + } + + public static List getCloseStoreSubStageStatusEnum(CloseStoreSubStageEnum closeStoreSubStageEnum) { + List resultList = new ArrayList<>(); + for (CloseStoreSubStageStatusEnum stageStatusEnum : CloseStoreSubStageStatusEnum.values()) { + if (Objects.nonNull(stageStatusEnum.getCloseStoreSubStageEnum()) && stageStatusEnum.getCloseStoreSubStageEnum().equals(closeStoreSubStageEnum)) { + resultList.add(stageStatusEnum); + } + } + return resultList; + } + + public CloseStoreSubStageEnum getCloseStoreSubStageEnum() { + return closeStoreSubStageEnum; + } + + public Integer getShopSubStageStatus() { + return shopSubStageStatus; + } + + public String getShopSubStageStatusName() { + return shopSubStageStatusName; + } + + public String getShopSubStageName() { + return closeStoreSubStageEnum.getCloseStoreSubStageName(); + } + + public boolean isTerminated() { + return isTerminated; + } + + public static CloseStoreSubStageStatusEnum getCloseStoreSubStageStatusEnum(Integer CloseStoreSubStageStatus) { + for (CloseStoreSubStageStatusEnum storeSubStageStatusEnum : CloseStoreSubStageStatusEnum.values()) { + if (Objects.nonNull(storeSubStageStatusEnum.getShopSubStageStatus()) && storeSubStageStatusEnum.getShopSubStageStatus().equals(CloseStoreSubStageStatus)) { + return storeSubStageStatusEnum; + } + } + return CLOSE_STORE_SUB_STAGE_STATUS_00; + } + + public static CloseStoreSubStageStatusEnum getByStatus(Integer shopSubStageStatus) { + for (CloseStoreSubStageStatusEnum statusEnum : CloseStoreSubStageStatusEnum.values()) { + if (statusEnum.getShopSubStageStatus().equals(shopSubStageStatus)) { + return statusEnum; + } + } + return null; + } + + /** + * 获取下一个阶段状态 + * @param current 当前阶段状态 + * @return 阶段状态 + */ + public static CloseStoreSubStageStatusEnum getNextStageStatus(CloseStoreSubStageStatusEnum current) { + switch (current) { + case CLOSE_STORE_SUB_STAGE_STATUS_10: + return CLOSE_STORE_SUB_STAGE_STATUS_15; + case CLOSE_STORE_SUB_STAGE_STATUS_15: + case CLOSE_STORE_SUB_STAGE_STATUS_17: + return CLOSE_STORE_SUB_STAGE_STATUS_16; + case CLOSE_STORE_SUB_STAGE_STATUS_16: + case CLOSE_STORE_SUB_STAGE_STATUS_19: + return CLOSE_STORE_SUB_STAGE_STATUS_18; + case CLOSE_STORE_SUB_STAGE_STATUS_18: + return CLOSE_STORE_SUB_STAGE_STATUS_20; + case CLOSE_STORE_SUB_STAGE_STATUS_25: + return CLOSE_STORE_SUB_STAGE_STATUS_30; + case CLOSE_STORE_SUB_STAGE_STATUS_35: + return CLOSE_STORE_SUB_STAGE_STATUS_40; + case CLOSE_STORE_SUB_STAGE_STATUS_45: + return CLOSE_STORE_SUB_STAGE_STATUS_50; + default: + return null; + } + } + + /** + * 获取子流程的开始阶段状态 + * @param subStage 子流程 + * @return 阶段状态 + */ + public static CloseStoreSubStageStatusEnum getOpenStageStatus(CloseStoreSubStageEnum subStage) { + switch (subStage) { + case CLOSE_STORE_SUB_STAGE_10: + return CLOSE_STORE_SUB_STAGE_STATUS_10; + case CLOSE_STORE_SUB_STAGE_20: + return CLOSE_STORE_SUB_STAGE_STATUS_25; + case CLOSE_STORE_SUB_STAGE_30: + return CLOSE_STORE_SUB_STAGE_STATUS_35; + case CLOSE_STORE_SUB_STAGE_40: + return CLOSE_STORE_SUB_STAGE_STATUS_45; + default: + return null; + } + } + + public static String getStatusNameByStatus(Integer status) { + for (CloseStoreSubStageStatusEnum statusEnum : CloseStoreSubStageStatusEnum.values()) { + if (statusEnum.getShopSubStageStatus().equals(status)) { + return statusEnum.getShopSubStageStatusName(); + } + } + return null; + } +} diff --git a/coolstore-partner-common/src/main/java/com/cool/store/enums/close/CloseTypeEnum.java b/coolstore-partner-common/src/main/java/com/cool/store/enums/close/CloseTypeEnum.java new file mode 100644 index 000000000..fd4f64b35 --- /dev/null +++ b/coolstore-partner-common/src/main/java/com/cool/store/enums/close/CloseTypeEnum.java @@ -0,0 +1,30 @@ +package com.cool.store.enums.close; + +/** + * @Author suzhuhong + * @Date 2025/9/22 18:43 + * @Version 1.0 + */ +public enum CloseTypeEnum { + + INITIATE(1, "主动发起"), + NO_ORDER_AUTO(2, "未订货自动发起"), + ; + + CloseTypeEnum(Integer closeType, String closeTypeName) { + this.closeType = closeType; + this.closeTypeName = closeTypeName; + } + + private Integer closeType; + + private String closeTypeName; + + public Integer getCloseType() { + return closeType; + } + + public String getCloseTypeName() { + return closeTypeName; + } +} diff --git a/coolstore-partner-common/src/main/java/com/cool/store/enums/close/FileStatusEnum.java b/coolstore-partner-common/src/main/java/com/cool/store/enums/close/FileStatusEnum.java new file mode 100644 index 000000000..83afcd4c3 --- /dev/null +++ b/coolstore-partner-common/src/main/java/com/cool/store/enums/close/FileStatusEnum.java @@ -0,0 +1,38 @@ +package com.cool.store.enums.close; + +import lombok.AllArgsConstructor; +import lombok.Getter; + +/** + *

+ * 闭店材料状态 枚举类 + *

+ * + * @author wangff + * @since 2025/11/26 + */ +@Getter +@AllArgsConstructor +public enum FileStatusEnum { + + NOT_UPLOAD(0, "未上传"), + QUALIFIED(1, "合格"), + UNQUALIFIED(2, "不合格"), + UPLOADED(3, "已上传"), + APPROVING(4, "审批中"), + MODIFIED(5, "已修改"), + ; + + private final Integer status; + + private final String desc; + + public static String getDescByStatus(Integer status) { + for (FileStatusEnum value : FileStatusEnum.values()) { + if (value.status.equals(status)) { + return value.desc; + } + } + return null; + } +} diff --git a/coolstore-partner-common/src/main/java/com/cool/store/enums/close/RecordTypeEnum.java b/coolstore-partner-common/src/main/java/com/cool/store/enums/close/RecordTypeEnum.java new file mode 100644 index 000000000..16c9724ee --- /dev/null +++ b/coolstore-partner-common/src/main/java/com/cool/store/enums/close/RecordTypeEnum.java @@ -0,0 +1,30 @@ +package com.cool.store.enums.close; + +/** + * @Author suzhuhong + * @Date 2025/9/23 13:45 + * @Version 1.0 + */ +public enum RecordTypeEnum { + + CLOSE_STORE_RECORD_TYPE_10(1, "申请提交"), + CLOSE_STORE_RECORD_TYPE_20(2, "审批操作"), + ; + + private Integer recordType; + + private String recordTypeName; + + RecordTypeEnum(Integer recordType, String recordTypeName) { + this.recordType = recordType; + this.recordTypeName = recordTypeName; + } + + public Integer getRecordType() { + return recordType; + } + + public String getRecordTypeName() { + return recordTypeName; + } +} diff --git a/coolstore-partner-common/src/main/java/com/cool/store/enums/close/RefundPayStatusEnum.java b/coolstore-partner-common/src/main/java/com/cool/store/enums/close/RefundPayStatusEnum.java new file mode 100644 index 000000000..0f0dc5a2f --- /dev/null +++ b/coolstore-partner-common/src/main/java/com/cool/store/enums/close/RefundPayStatusEnum.java @@ -0,0 +1,37 @@ +package com.cool.store.enums.close; + +import lombok.AllArgsConstructor; +import lombok.Getter; + +/** + *

+ * 退款支付状态枚举类 + *

+ * + * @author wangff + * @since 2025/12/1 + */ +@Getter +@AllArgsConstructor +public enum RefundPayStatusEnum { + + APPROVING("APPROVING", "审批中"), + ABANDON("ABANDON", "作废"), + SETTLEMENT("SETTLEMENT", "结算中"), + PAY_SUCCESS("PAY_SUCCESS", "支付成功"), + PAY_FAIL("PAY_FAIL", "支付失败"), + ; + + private final String status; + + private final String desc; + + public static String getDescByStatus(String status) { + for (RefundPayStatusEnum value : values()) { + if (value.status.equals(status)) { + return value.desc; + } + } + return ""; + } +} diff --git a/coolstore-partner-common/src/main/java/com/cool/store/enums/close/XgjRefundPayStatusEnum.java b/coolstore-partner-common/src/main/java/com/cool/store/enums/close/XgjRefundPayStatusEnum.java new file mode 100644 index 000000000..47c8f179f --- /dev/null +++ b/coolstore-partner-common/src/main/java/com/cool/store/enums/close/XgjRefundPayStatusEnum.java @@ -0,0 +1,29 @@ +package com.cool.store.enums.close; + +import lombok.AllArgsConstructor; +import lombok.Getter; + +/** + *

+ * 新管家退管单支付状态枚举类 + *

+ * + * @author wangff + * @since 2025/11/28 + */ +@Getter +@AllArgsConstructor +public enum XgjRefundPayStatusEnum { + + APPROVING("APPROVING", "审批中"), + ABANDON("ABANDON", "作废"), + SETTLEMENT("SETTLEMENT", "结算中"), + PAY_SUCCESS("PAY_SUCCESS", "支付成功"), + PAY_FAIL("PAY_FAIL", "支付失败"), + REJECTED("REJECTED", "驳回") + ; + + private final String status; + + private final String desc; +} diff --git a/coolstore-partner-common/src/main/java/com/cool/store/enums/master/StoreCloseNatureEnum.java b/coolstore-partner-common/src/main/java/com/cool/store/enums/master/StoreCloseNatureEnum.java new file mode 100644 index 000000000..529bc58d9 --- /dev/null +++ b/coolstore-partner-common/src/main/java/com/cool/store/enums/master/StoreCloseNatureEnum.java @@ -0,0 +1,39 @@ +package com.cool.store.enums.master; + +import com.cool.store.enums.close.CloseTypeEnum; +import lombok.AllArgsConstructor; +import lombok.Getter; + +/** + *

+ * 门店闭店性质枚举类 + *

+ * + * @author wangff + * @since 2025/9/16 + */ +@Getter +@AllArgsConstructor +public enum StoreCloseNatureEnum { + // 这里的描述跟标品略微不同,但是描述不要改!!!跟每刻保持一致!!! + REQUIRE_CLOSE(0, "我们管理要求闭店", CloseTypeEnum.NO_ORDER_AUTO), + + ONESELF_CLOSE(1, "加盟商自行闭店", CloseTypeEnum.INITIATE), + ; + + + private final Integer code; + + private final String desc; + + private final CloseTypeEnum closeType; + + public static String getDescByCode(Integer code) { + for (StoreCloseNatureEnum value : StoreCloseNatureEnum.values()) { + if (value.code.equals(code)) { + return value.desc; + } + } + return null; + } +} diff --git a/coolstore-partner-common/src/main/java/com/cool/store/enums/master/StoreCloseReasonEnum.java b/coolstore-partner-common/src/main/java/com/cool/store/enums/master/StoreCloseReasonEnum.java new file mode 100644 index 000000000..79c3fe32f --- /dev/null +++ b/coolstore-partner-common/src/main/java/com/cool/store/enums/master/StoreCloseReasonEnum.java @@ -0,0 +1,57 @@ +package com.cool.store.enums.master; + +import lombok.AllArgsConstructor; +import lombok.Getter; + +/** + *

+ * 门店闭店原因枚举类 + *

+ * + * @author wangff + * @since 2025/9/16 + */ +@Getter +@AllArgsConstructor +public enum StoreCloseReasonEnum { + // 这里的描述跟标品略微不同,但是描述不要改!!!跟每刻保持一致!!! + REASON0(0, "不进货(外购)", StoreCloseNatureEnum.REQUIRE_CLOSE), + REASON1(1, "门店形象差(不升级)", StoreCloseNatureEnum.REQUIRE_CLOSE), + REASON2(2, "顾客投诉率高", StoreCloseNatureEnum.REQUIRE_CLOSE), + REASON3(3, "加盟老板失联", StoreCloseNatureEnum.REQUIRE_CLOSE), + REASON4(4, "其他严重违反加盟规定", StoreCloseNatureEnum.REQUIRE_CLOSE), + REASON5(5, "卫生操作不达标", StoreCloseNatureEnum.REQUIRE_CLOSE), + + REASON6(6, "人员不足", StoreCloseNatureEnum.ONESELF_CLOSE), + REASON7(7, "商圈转移或拆迁", StoreCloseNatureEnum.ONESELF_CLOSE), + REASON8(8, "生意差", StoreCloseNatureEnum.ONESELF_CLOSE), + REASON9(9, "房东不租", StoreCloseNatureEnum.ONESELF_CLOSE), + REASON19(10, "想转行或想长休", StoreCloseNatureEnum.ONESELF_CLOSE), + + ; + + + private final Integer code; + + private final String desc; + + private final StoreCloseNatureEnum closeNature; + + public static String getDescByCode(Integer code) { + for (StoreCloseReasonEnum value : StoreCloseReasonEnum.values()) { + if (value.code.equals(code)) { + return value.desc; + } + } + return null; + } + + public static StoreCloseReasonEnum getByCode(Integer code) { + for (StoreCloseReasonEnum value : StoreCloseReasonEnum.values()) { + if (value.code.equals(code)) { + return value; + } + } + return null; + } +} diff --git a/coolstore-partner-common/src/main/java/com/cool/store/utils/BeanUtil.java b/coolstore-partner-common/src/main/java/com/cool/store/utils/BeanUtil.java index 4d6936f79..60afd26c8 100644 --- a/coolstore-partner-common/src/main/java/com/cool/store/utils/BeanUtil.java +++ b/coolstore-partner-common/src/main/java/com/cool/store/utils/BeanUtil.java @@ -4,6 +4,7 @@ import cn.hutool.core.bean.copier.CopyOptions; import com.github.pagehelper.PageInfo; import java.util.ArrayList; +import java.util.Arrays; import java.util.Collections; import java.util.List; @@ -51,4 +52,13 @@ public class BeanUtil extends cn.hutool.core.bean.BeanUtil { newPage.setList(list); return newPage; } + + public static void copyPropertiesIgnoreId(Object source, Object target, String... ignoreProperties) { + if (source == null || target == null) { + return; + } + String[] mergedIgnoreProperties = Arrays.copyOf(ignoreProperties, ignoreProperties.length + 1); + mergedIgnoreProperties[ignoreProperties.length] = "id"; + copyProperties(source, target, mergedIgnoreProperties); + } } 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 e66faa121..df0471985 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 @@ -161,6 +161,13 @@ public class CoolDateUtils { return LocalDate.now().format(getDateFormatter(DATE_FORMAT_DAY)); } + /** + * 获取当前时间字符串 (yyyy-MM-dd HH:mm:ss) + */ + public static String getCurrentDateTime() { + return LocalDateTime.now().format(getDateFormatter(DATE_FORMAT_SEC)); + } + /** * 获取上月同一天的日期字符串 (yyyy-MM-dd) * 如果上个月没有同一天(如当前是3月31日,但2月没有31日),则返回上个月的最后一天 diff --git a/coolstore-partner-common/src/main/java/com/cool/store/utils/RocketMqUtil.java b/coolstore-partner-common/src/main/java/com/cool/store/utils/RocketMqUtil.java index 4ff5d3615..059983b81 100644 --- a/coolstore-partner-common/src/main/java/com/cool/store/utils/RocketMqUtil.java +++ b/coolstore-partner-common/src/main/java/com/cool/store/utils/RocketMqUtil.java @@ -22,16 +22,16 @@ import java.util.stream.Collectors; @Slf4j public class RocketMqUtil { - private static final String INSTANCE_ID = "MQ_INST_1947409023213164_BX3sLZnA"; + private static final String INSTANCE_ID = "MQ_INST_1748142459508127_BZfpFxuJ"; /** * 本地 */ private static final String LOCAL_INSTANCE_ID = "MQ_INST_1255228665351616_BX3wfyPO"; - private static final String INSTANCE_ID_ONLINE_HD_PRE = "MQ_INST_1947409023213164_BX5N7rwl"; - private static final String ACCESS_KEY = "LTAI5tJbgtyoHUvofTaeP1RP"; - private static final String ACCESS_SECRET = "myg755iCx0j4PyQkHMaUVeOr0bw1tA"; + private static final String INSTANCE_ID_ONLINE_HD_PRE = "MQ_INST_1748142459508127_BZegx2xc"; + private static final String ACCESS_KEY = "LTAI5tGBwmXwZkMuHK4MudMJ"; + private static final String ACCESS_SECRET = "bnZoUMRQ9834STgz5E291YrqlBu6yn"; /** * 使用AK&SK初始化账号Client * @param accessKeyId @@ -61,6 +61,11 @@ public class RocketMqUtil { return new Client(config); } + public static void main(String[] args) throws Exception { +// initGroup("local"); +// initOnlineAndHdAndPreGroup("online"); + } + /** * 新增测试、开发环境的group * @author chenyupeng diff --git a/coolstore-partner-dao/src/main/java/com/cool/store/dao/CloseStoreAccountInfoDAO.java b/coolstore-partner-dao/src/main/java/com/cool/store/dao/CloseStoreAccountInfoDAO.java new file mode 100644 index 000000000..48b65066e --- /dev/null +++ b/coolstore-partner-dao/src/main/java/com/cool/store/dao/CloseStoreAccountInfoDAO.java @@ -0,0 +1,75 @@ +package com.cool.store.dao; + +import com.alibaba.fastjson.JSONObject; +import com.cool.store.constants.RedisConstant; +import com.cool.store.entity.CloseStoreAccountInfoDO; +import com.cool.store.mapper.CloseStoreAccountInfoMapper; +import com.cool.store.utils.RedisUtilPool; +import lombok.RequiredArgsConstructor; +import org.springframework.stereotype.Repository; +import tk.mybatis.mapper.entity.Example; + +import java.util.List; + +/** + * @Author suzhuhong + * @Date 2025/9/22 16:54 + * @Version 1.0 + */ +@Repository +@RequiredArgsConstructor +public class CloseStoreAccountInfoDAO { + private final CloseStoreAccountInfoMapper closeStoreAccountInfoMapper; + private final RedisUtilPool redisUtilPool; + + /** + * 根据闭店申请id查询 + * @param closeStoreId 闭店申请id + * @return 账号列表 + */ + public List getByCloseStoreId(Long closeStoreId) { + return closeStoreAccountInfoMapper.select(CloseStoreAccountInfoDO.builder().closeStoreId(closeStoreId).build()); + } + + /** + * 根据主键id查询 + * @param id 主键id + * @return 账号信息 + */ + public CloseStoreAccountInfoDO getById(Long id) { + return closeStoreAccountInfoMapper.selectByPrimaryKey(id); + } + + /** + * 修改账号状态 + * @param id 主键id + * @param status 状态 + */ + public void updateStatus(Long id, Integer status) { + closeStoreAccountInfoMapper.updateByPrimaryKeySelective(CloseStoreAccountInfoDO.builder().id(id).status(status).build()); + } + + /** + * 初始化数据 + * @param closeStoreId 闭店申请id + */ + public void init(Long closeStoreId) { + String accountInitJson = redisUtilPool.getString(RedisConstant.CLOSE_STORE_ACCOUNT_INIT); + List accountList = JSONObject.parseArray(accountInitJson, CloseStoreAccountInfoDO.class); + accountList.forEach(v -> v.setCloseStoreId(closeStoreId)); + closeStoreAccountInfoMapper.insertBatch(accountList); + } + + /** + * 是否存在未关闭的账号 + * @param closeStoreId 闭店申请id + * @return 是否存在 + */ + public boolean existNotCloseAccount(Long closeStoreId) { + Example example = new Example(CloseStoreAccountInfoDO.class); + example.createCriteria() + .andEqualTo("closeStoreId", closeStoreId) + .andNotEqualTo("status", 2); + return closeStoreAccountInfoMapper.selectCountByExample(example) > 0; + } +} diff --git a/coolstore-partner-dao/src/main/java/com/cool/store/dao/CloseStoreAuditRecordDAO.java b/coolstore-partner-dao/src/main/java/com/cool/store/dao/CloseStoreAuditRecordDAO.java new file mode 100644 index 000000000..722b61a6e --- /dev/null +++ b/coolstore-partner-dao/src/main/java/com/cool/store/dao/CloseStoreAuditRecordDAO.java @@ -0,0 +1,170 @@ +package com.cool.store.dao; + +import com.cool.store.entity.CloseStoreAuditRecordDO; +import com.cool.store.enums.close.CloseStoreAuditStatusEnum; +import com.cool.store.enums.close.RecordTypeEnum; +import com.cool.store.mapper.CloseStoreAuditRecordMapper; +import com.cool.store.request.close.store.CloseStoreQueryRequest; +import com.cool.store.vo.close.store.CloseStoreInfoListVO; +import com.github.pagehelper.PageHelper; +import com.github.pagehelper.PageInfo; +import org.apache.commons.lang3.StringUtils; +import org.springframework.stereotype.Repository; +import tk.mybatis.mapper.entity.Example; + +import javax.annotation.Resource; +import java.util.*; +import java.util.stream.Collectors; + +/** + * @Author suzhuhong + * @Date 2025/9/22 16:52 + * @Version 1.0 + */ +@Repository +public class CloseStoreAuditRecordDAO { + + @Resource + private CloseStoreAuditRecordMapper closeStoreAuditRecordMapper; + + + /** + * 提交新增记录 + * @param closeStoreId + * @param userId + * @return + */ + public int addSubmitRecord(Long closeStoreId, String userId, String userName) { + CloseStoreAuditRecordDO closeStoreAuditRecordDO = CloseStoreAuditRecordDO.builder() + .closeStoreId(closeStoreId) + .recordType(RecordTypeEnum.CLOSE_STORE_RECORD_TYPE_10.getRecordType()) + .actionRemark("") + .finishTaskTime(new Date()) + .receiveTaskTime(new Date()) + .handlerUserId(userId) + .handlerUserName(userName) + .auditStatus(CloseStoreAuditStatusEnum.PASS.getStatus()) + .handlerUserIds(getUserIds(Collections.singletonList(userId))) + .build(); + return closeStoreAuditRecordMapper.insertSelective(closeStoreAuditRecordDO); + } + + /** + * 提交审批记录 + * @param closeStoreId + * @param userIdList + * @return + */ + public int addApproveRecord(Long closeStoreId, List userIdList) { + CloseStoreAuditRecordDO closeStoreAuditRecordDO = CloseStoreAuditRecordDO.builder() + .closeStoreId(closeStoreId) + .recordType(RecordTypeEnum.CLOSE_STORE_RECORD_TYPE_20.getRecordType()) + .receiveTaskTime(new Date()) + .handlerUserIds(getUserIds(userIdList)) + .auditStatus(CloseStoreAuditStatusEnum.PENDING.getStatus()) + .build(); + return closeStoreAuditRecordMapper.insertSelective(closeStoreAuditRecordDO); + } + + private String getUserIds(List userIds) { + String userIdStr = userIds.stream() + .filter(StringUtils::isNotBlank) + .distinct() + .collect(Collectors.joining(",")); + return "," + userIdStr + ","; + } + + /** + * 首次发起流程 添加审批记录 + */ + public void addRecord(Long closeStoreId, String userId, String userName, List userIdList) { + //新增提交审批 + addSubmitRecord(closeStoreId, userId, userName); + //新增审批记录 + addApproveRecord(closeStoreId, userIdList); + } + + /** + * 审批记录更新 + * @param closeStoreAuditRecordDO + */ + public void updateRecord(CloseStoreAuditRecordDO closeStoreAuditRecordDO) { + closeStoreAuditRecordMapper.updateByPrimaryKeySelective(closeStoreAuditRecordDO); + } + + + /** + * 流程记录列表 + * @param closeStoreId + * @return + */ + public List getRecordListByCloseStoreId(Long closeStoreId) { + if (closeStoreId == null){ + return new ArrayList<>(); + } + return closeStoreAuditRecordMapper.getRecordListByCloseStoreId(closeStoreId); + } + + /** + * 根据id查询审批记录 + * @param id 审批记录id + * @return 审批记录 + */ + public CloseStoreAuditRecordDO getById(Long id) { + return closeStoreAuditRecordMapper.selectByPrimaryKey(id); + } + + /** + * 删除待处理的审批记录 + * @param closeStoreId 闭店申请id + */ + public void deletePendingRecord(Long closeStoreId) { + Example example = new Example(CloseStoreAuditRecordDO.class); + example.createCriteria() + .andEqualTo("closeStoreId", closeStoreId) + .andEqualTo("auditStatus", CloseStoreAuditStatusEnum.PENDING.getStatus()) + .andEqualTo("deleted", 0); + closeStoreAuditRecordMapper.updateByExampleSelective(CloseStoreAuditRecordDO.builder().deleted(1).build(), example); + } + + /** + * 查询权限下的闭店申请审批记录 + * @param request 闭店申请查询Request + * @param userId 用户id + * @param isAdmin 是管理员权限 + * @return 闭店申请记录列表VO列表 + */ + public PageInfo getCloseStoreAuditList(CloseStoreQueryRequest request, String userId, Boolean isAdmin) { + PageHelper.startPage(request.getPageNum(), request.getPageSize()); + List list = closeStoreAuditRecordMapper.getCloseStoreAuditList(request, userId, isAdmin); + return new PageInfo<>(list); + } + + /** + * 根据闭店申请id查询审批记录 + * @param closeStoreId 闭店申请id + * @return 审批记录列表 + */ + public List getListByCloseStoreId(Long closeStoreId) { + Example example = new Example(CloseStoreAuditRecordDO.class); + example.createCriteria() + .andEqualTo("closeStoreId", closeStoreId) + .andEqualTo("deleted", 0); + example.setOrderByClause("id ASC"); + return closeStoreAuditRecordMapper.selectByExample(example); + } + + /** + * 获取待处理的审批记录 + * @param closeStoreId 闭店申请id + * @return 闭店申请审批记录 + */ + public CloseStoreAuditRecordDO getPendingAuditRecord(Long closeStoreId) { + Example example = new Example(CloseStoreAuditRecordDO.class); + example.createCriteria() + .andEqualTo("closeStoreId", closeStoreId) + .andEqualTo("auditStatus", CloseStoreAuditStatusEnum.PENDING.getStatus()) + .andEqualTo("deleted", 0); + return closeStoreAuditRecordMapper.selectOneByExample(example); + } +} diff --git a/coolstore-partner-dao/src/main/java/com/cool/store/dao/CloseStoreFileDetailDAO.java b/coolstore-partner-dao/src/main/java/com/cool/store/dao/CloseStoreFileDetailDAO.java new file mode 100644 index 000000000..9569a1e67 --- /dev/null +++ b/coolstore-partner-dao/src/main/java/com/cool/store/dao/CloseStoreFileDetailDAO.java @@ -0,0 +1,75 @@ +package com.cool.store.dao; + +import com.cool.store.request.close.file.CloseStoreMailAddressRequest; +import com.cool.store.entity.CloseStoreFileDetailDO; +import com.cool.store.mapper.CloseStoreFileDetailMapper; +import com.cool.store.request.close.file.CloseStoreFileApproveRequest; +import com.cool.store.request.close.file.CloseStoreMailInfoRequest; +import lombok.RequiredArgsConstructor; +import org.springframework.stereotype.Repository; +import tk.mybatis.mapper.entity.Example; + +/** + *

+ * 闭店资料详情DAO + *

+ * + * @author wangff + * @since 2025/10/7 + */ +@RequiredArgsConstructor +@Repository +public class CloseStoreFileDetailDAO { + private final CloseStoreFileDetailMapper closeStoreFileDetailMapper; + + /** + * 新增或编辑闭店资料邮寄地址信息 + * @param request 闭店资料邮寄地址信息Request + * @return boolean + */ + public boolean insertOrUpdateMailAddress(CloseStoreMailAddressRequest request) { + return closeStoreFileDetailMapper.insertOrUpdateMailAddress(request) > 0; + } + + /** + * 新增或编辑闭店资料邮寄信息 + * @param request 闭店资料邮寄信息Request + * @param mailStatus 邮寄状态 + */ + public void insertOrUpdateMailInfo(CloseStoreMailInfoRequest request, Boolean mailStatus) { + closeStoreFileDetailMapper.insertOrUpdateMailInfo(request, mailStatus); + } + + /** + * 新增或编辑闭店资料信息 + * + * @param request 闭店材料审批Request + */ + public void insertOrUpdateFileInfoSelective(CloseStoreFileApproveRequest request, Boolean approveComplete) { + closeStoreFileDetailMapper.insertOrUpdateFileInfoSelective(request, approveComplete); + } + + /** + * 根据闭店申请id查询 + * @param closeStoreId 闭店申请id + * @return 闭店资料详情 + */ + public CloseStoreFileDetailDO getByCloseStoreId(Long closeStoreId) { + return closeStoreFileDetailMapper.selectOne(CloseStoreFileDetailDO.builder().closeStoreId(closeStoreId).build()); + } + + /** + * 初始化数据 + * @param closeStoreId 闭店申请id + */ + public void init(Long closeStoreId) { + CloseStoreFileDetailDO detailDO = CloseStoreFileDetailDO.builder().closeStoreId(closeStoreId).build(); + closeStoreFileDetailMapper.insertSelective(detailDO); + } + + public void updateByCloseStoreIdSelective(CloseStoreFileDetailDO detailDO) { + Example example = new Example(CloseStoreFileDetailDO.class); + example.createCriteria().andEqualTo("closeStoreId", detailDO.getCloseStoreId()); + closeStoreFileDetailMapper.updateByExampleSelective(detailDO, example); + } +} diff --git a/coolstore-partner-dao/src/main/java/com/cool/store/dao/CloseStoreFileInfoDAO.java b/coolstore-partner-dao/src/main/java/com/cool/store/dao/CloseStoreFileInfoDAO.java new file mode 100644 index 000000000..6030f43d7 --- /dev/null +++ b/coolstore-partner-dao/src/main/java/com/cool/store/dao/CloseStoreFileInfoDAO.java @@ -0,0 +1,87 @@ +package com.cool.store.dao; + +import com.alibaba.fastjson.JSONObject; +import com.cool.store.constants.RedisConstant; +import com.cool.store.entity.CloseStoreFileInfoDO; +import com.cool.store.enums.close.FileStatusEnum; +import com.cool.store.mapper.CloseStoreFileInfoMapper; +import com.cool.store.utils.RedisUtilPool; +import lombok.RequiredArgsConstructor; +import org.springframework.stereotype.Repository; +import tk.mybatis.mapper.entity.Example; + +import java.util.List; + +/** + * @Author suzhuhong + * @Date 2025/9/22 16:53 + * @Version 1.0 + */ +@Repository +@RequiredArgsConstructor +public class CloseStoreFileInfoDAO { + private final CloseStoreFileInfoMapper closeStoreFileInfoMapper; + private final RedisUtilPool redisUtilPool; + + /** + * 批量更新 + * @param list 实体列表 + * @return boolean + */ + public boolean updateBatch(List list) { + return closeStoreFileInfoMapper.updateBatch(list) > 0; + } + + /** + * 根据闭店申请id查询 + * @param closeStoreId 闭店申请id + * @return 实体列表 + */ + public List getByCloseStoreId(Long closeStoreId) { + return closeStoreFileInfoMapper.select(CloseStoreFileInfoDO.builder().closeStoreId(closeStoreId).build()); + } + + /** + * 初始化数据 + * @param closeStoreId 闭店申请id + */ + public void init(Long closeStoreId) { + String fileInitJson = redisUtilPool.getString(RedisConstant.CLOSE_STORE_FILE_INIT); + List list = JSONObject.parseArray(fileInitJson, CloseStoreFileInfoDO.class); + list.forEach(v -> v.setCloseStoreId(closeStoreId)); + closeStoreFileInfoMapper.insertBatch(list); + } + + /** + * 提交材料 + */ + public Boolean updateFile(Long id, String urls) { + return closeStoreFileInfoMapper.updateFile(id, urls) > 0; + } + + /** + * 根据闭店申请id将所有资料状态改为审批中 + */ + public void updateAllFileStatus(Long closeStoreId) { + Example example = new Example(CloseStoreFileInfoDO.class); + example.createCriteria() + .andEqualTo("closeStoreId", closeStoreId); + closeStoreFileInfoMapper.updateByExampleSelective(CloseStoreFileInfoDO.builder().fileStatus(FileStatusEnum.APPROVING.getStatus()).build(), example); + } + + public void updateSelective(CloseStoreFileInfoDO closeStoreFileInfoDO) { + closeStoreFileInfoMapper.updateByPrimaryKeySelective(closeStoreFileInfoDO); + } + + public CloseStoreFileInfoDO getById(Long id) { + return closeStoreFileInfoMapper.selectByPrimaryKey(id); + } + + /** + * 更新材料状态为审批状态 + * @param closeStoreId 闭店申请id + */ + public void updateFileStatusToApproveStatus(Long closeStoreId) { + closeStoreFileInfoMapper.updateFileStatusToApproveStatus(closeStoreId); + } +} diff --git a/coolstore-partner-dao/src/main/java/com/cool/store/dao/CloseStoreInfoDAO.java b/coolstore-partner-dao/src/main/java/com/cool/store/dao/CloseStoreInfoDAO.java new file mode 100644 index 000000000..a47736dfe --- /dev/null +++ b/coolstore-partner-dao/src/main/java/com/cool/store/dao/CloseStoreInfoDAO.java @@ -0,0 +1,86 @@ +package com.cool.store.dao; + +import com.cool.store.entity.CloseStoreInfoDO; +import com.cool.store.enums.close.CloseStoreStatusEnum; +import com.cool.store.mapper.CloseStoreInfoMapper; +import com.cool.store.request.close.store.CloseStoreQueryRequest; +import com.cool.store.vo.close.store.CloseStoreInfoListVO; +import com.github.pagehelper.PageHelper; +import com.github.pagehelper.PageInfo; +import org.apache.commons.lang3.StringUtils; +import org.springframework.stereotype.Repository; +import tk.mybatis.mapper.entity.Example; + +import javax.annotation.Resource; +import java.util.Arrays; +import java.util.List; +import java.util.Objects; + +/** + * @Author suzhuhong + * @Date 2025/9/22 16:52 + * @Version 1.0 + */ +@Repository +public class CloseStoreInfoDAO { + @Resource + private CloseStoreInfoMapper closeStoreInfoMapper; + + public int insertSelective(CloseStoreInfoDO closeStoreInfoDO) { + return closeStoreInfoMapper.insertSelective(closeStoreInfoDO); + } + public int updateSelective(CloseStoreInfoDO closeStoreInfoDO) { + return closeStoreInfoMapper.updateByPrimaryKeySelective(closeStoreInfoDO); + } + + /** + * 根据id查询 + * @param id 主键id + * @return 闭店信息 + */ + public CloseStoreInfoDO getById(Long id) { + return closeStoreInfoMapper.selectByPrimaryKey(id); + } + + /** + * 是否存在进行中的闭店申请 + * @param storeId 门店id + * @return 是否存在 + */ + public boolean existOngoingRecord(String storeId) { + Example example = new Example(CloseStoreInfoDO.class); + example.createCriteria().andEqualTo("storeId", storeId) + .andIn("closeStatus", Arrays.asList(CloseStoreStatusEnum.UNDER_APPROVAL.getCloseStoreStatus(), CloseStoreStatusEnum.CLOSING.getCloseStoreStatus())); + return closeStoreInfoMapper.selectCountByExample(example) > 0; + } + + /** + * 查询闭店申请记录 + * @param request 闭店申请查询Request + * @return 闭店申请记录列表VO + */ + public PageInfo getCloseStoreInfoList(CloseStoreQueryRequest request, List regionIds) { + PageHelper.startPage(request.getPageNum(), request.getPageSize()); + List list = closeStoreInfoMapper.getCloseStoreInfoList(request, regionIds); + return new PageInfo<>(list); + } + + /** + * 根据申请人id查询闭店申请记录 + * @param applyUserId 申请人id + * @return 闭店申请记录列表 + */ + public List getListByApplyUserId(String applyUserId, Integer closeType, String storeId) { + Example example = new Example(CloseStoreInfoDO.class); + Example.Criteria criteria = example.createCriteria() + .andEqualTo("applyUserId", applyUserId); + if (StringUtils.isNotBlank(storeId)) { + criteria.andEqualTo("storeId", storeId); + } + if (Objects.nonNull(closeType)) { + criteria.andEqualTo("closeType", closeType); + } + example.setOrderByClause("create_time DESC"); + return closeStoreInfoMapper.selectByExample(example); + } +} diff --git a/coolstore-partner-dao/src/main/java/com/cool/store/dao/CloseStoreRefundInfoDAO.java b/coolstore-partner-dao/src/main/java/com/cool/store/dao/CloseStoreRefundInfoDAO.java new file mode 100644 index 000000000..7af58fc06 --- /dev/null +++ b/coolstore-partner-dao/src/main/java/com/cool/store/dao/CloseStoreRefundInfoDAO.java @@ -0,0 +1,124 @@ +package com.cool.store.dao; + +import com.cool.store.entity.CloseStoreRefundInfoDO; +import com.cool.store.enums.close.RefundPayStatusEnum; +import com.cool.store.mapper.CloseStoreRefundInfoMapper; +import lombok.RequiredArgsConstructor; +import org.springframework.stereotype.Repository; +import tk.mybatis.mapper.entity.Example; + +import java.util.Arrays; +import java.util.Date; +import java.util.List; +import java.util.Objects; + +/** + *

+ * 闭店退款信息DAO + *

+ * + * @author wangff + * @since 2025/10/13 + */ +@Repository +@RequiredArgsConstructor +public class CloseStoreRefundInfoDAO { + private final CloseStoreRefundInfoMapper closeStoreRefundInfoMapper; + + /** + * 根据id查询 + */ + public CloseStoreRefundInfoDO getById(Long id) { + return closeStoreRefundInfoMapper.selectByPrimaryKey(id); + } + + /** + * 更新退款状态 + * @param id id + * @param refundStatus 退款状态 + */ + public void updateRefundStatus(Long id, String refundStatus, Date refundTime) { + closeStoreRefundInfoMapper.updateByPrimaryKeySelective(CloseStoreRefundInfoDO.builder().id(id).refundStatus(refundStatus).refundTime(refundTime).build()); + } + + /** + * 根据id批量更新退款状态 + * @param list 退款信息列表 + */ + public void updateRefundStatusBatchById(List list) { + closeStoreRefundInfoMapper.updateRefundStatusBatchById(list); + } + + /** + * 编辑 + */ + public boolean updateSelective(CloseStoreRefundInfoDO closeStoreRefundInfoDO) { + return closeStoreRefundInfoMapper.updateByPrimaryKeySelective(closeStoreRefundInfoDO) > 0; + } + + /** + * 新增 + */ + public boolean insertSelective(CloseStoreRefundInfoDO closeStoreRefundInfoDO) { + return closeStoreRefundInfoMapper.insertSelective(closeStoreRefundInfoDO) > 0; + } + + /** + * 根据闭店申请id查询 + * @param closeStoreId 闭店申请id + * @param type 退款类型(闭店子阶段code) + * @return 退款信息 + */ + public CloseStoreRefundInfoDO getByCloseStoreId(Long closeStoreId, Integer type) { + return closeStoreRefundInfoMapper.selectOne(CloseStoreRefundInfoDO.builder().closeStoreId(closeStoreId).type(type).build()); + } + + /** + * 根据闭店申请id查询列表 + * @param closeStoreId 闭店申请id + * @return 退款信息列表 + */ + public List getListByCloseStoreId(Long closeStoreId, Integer type) { + Example example = new Example(CloseStoreRefundInfoDO.class); + Example.Criteria criteria = example.createCriteria() + .andEqualTo("closeStoreId", closeStoreId); + if (Objects.nonNull(type)) { + criteria.andEqualTo("type", type); + } + example.setOrderByClause("create_time DESC"); + return closeStoreRefundInfoMapper.selectByExample(example); + } + + /** + * 根据id删除 + */ + public void removeById(Long id) { + closeStoreRefundInfoMapper.deleteByPrimaryKey(id); + } + + /** + * 是否存在非作废状态的记录 + * @param closeStoreId 闭店申请id + * @param type 退款类型 + * @return 是否存在 + */ + public boolean existEffectiveRecord(Long closeStoreId, Integer type) { + Example example = new Example(CloseStoreRefundInfoDO.class); + example.createCriteria() + .andEqualTo("closeStoreId", closeStoreId) + .andNotEqualTo("refundStatus", RefundPayStatusEnum.ABANDON.getStatus()) + .andEqualTo("type", type); + return closeStoreRefundInfoMapper.selectCountByExample(example) > 0; + } + + /** + * 获取未完成的退款记录 + * @return 退款信息 + */ + public List getUnfinishedRecords() { + Example example = new Example(CloseStoreRefundInfoDO.class); + example.createCriteria() + .andNotIn("refundStatus", Arrays.asList(RefundPayStatusEnum.PAY_SUCCESS.getStatus(), RefundPayStatusEnum.ABANDON.getStatus())); + return closeStoreRefundInfoMapper.selectByExample(example); + } +} diff --git a/coolstore-partner-dao/src/main/java/com/cool/store/dao/CloseStoreStageInfoDAO.java b/coolstore-partner-dao/src/main/java/com/cool/store/dao/CloseStoreStageInfoDAO.java new file mode 100644 index 000000000..2f720169d --- /dev/null +++ b/coolstore-partner-dao/src/main/java/com/cool/store/dao/CloseStoreStageInfoDAO.java @@ -0,0 +1,209 @@ +package com.cool.store.dao; + +import cn.hutool.core.collection.CollStreamUtil; +import com.alibaba.excel.util.CollectionUtils; +import com.cool.store.entity.CloseStoreStageInfoDO; +import com.cool.store.enums.ErrorCodeEnum; +import com.cool.store.enums.close.CloseStoreStageEnum; +import com.cool.store.enums.close.CloseStoreSubStageEnum; +import com.cool.store.enums.close.CloseStoreSubStageStatusEnum; +import com.cool.store.exception.ServiceException; +import com.cool.store.mapper.CloseStoreStageInfoMapper; +import org.springframework.stereotype.Repository; +import tk.mybatis.mapper.entity.Example; + +import javax.annotation.Resource; +import java.time.LocalDate; +import java.util.*; +import java.util.stream.Collectors; + +/** + * @Author suzhuhong + * @Date 2025/9/22 16:54 + * @Version 1.0 + */ +@Repository +public class CloseStoreStageInfoDAO { + + @Resource + private CloseStoreStageInfoMapper closeStoreStageInfoMapper; + + /** + * 根据闭店阶段查询闭店阶段信息 + * @param closeStoreId 闭店申请id + * @param shopStage 闭店阶段 + * @param shopSubStage 闭店子阶段,非必填 + * @return 闭店阶段信息 + */ + public CloseStoreStageInfoDO getByStage(Long closeStoreId, Integer shopStage, Integer shopSubStage) { + Example example = new Example(CloseStoreStageInfoDO.class); + Example.Criteria criteria = example.createCriteria() + .andEqualTo("closeStoreId", closeStoreId) + .andEqualTo("shopStage", shopStage) + .andEqualTo("deleted", 0); + if (Objects.nonNull(shopSubStage)) { + criteria.andEqualTo("shopSubStage", shopSubStage); + } + return closeStoreStageInfoMapper.selectOneByExample(example); + } + + /** + * 根据子阶段查询闭店阶段信息 + * @param closeStoreId 闭店申请id + * @param subStageList 子阶段列表 + * @return 阶段信息列表 + */ + public List getBySubStage(Long closeStoreId, List subStageList) { + if (CollectionUtils.isEmpty(subStageList)) { + return Collections.emptyList(); + } + Example example = new Example(CloseStoreStageInfoDO.class); + example.createCriteria() + .andEqualTo("closeStoreId", closeStoreId) + .andIn("shopSubStage", subStageList) + .andEqualTo("deleted", 0); + return closeStoreStageInfoMapper.selectByExample(example); + } + + /** + * 查询闭店阶段信息 + * @param closeStoreId 闭店申请id + * @return 阶段信息列表 + */ + public List getList(Long closeStoreId) { + Example example = new Example(CloseStoreStageInfoDO.class); + example.createCriteria() + .andEqualTo("closeStoreId", closeStoreId) + .andEqualTo("deleted", 0); + example.setOrderByClause("shop_sub_stage ASC"); + return closeStoreStageInfoMapper.selectByExample(example); + } + + /** + * 存在未完成的闭店阶段 + * @param closeStoreId 闭店申请id + * @return boolean + */ + public boolean existUnfinishedStage(Long closeStoreId) { + return closeStoreStageInfoMapper.selectCount( + CloseStoreStageInfoDO.builder() + .closeStoreId(closeStoreId) + .isTerminated(0) + .deleted(0) + .build() + ) > 0; + } + + /** + * 校验闭店阶段流程是否为期望流程 + * @param closeStoreId 闭店申请id + * @param shopStage 闭店阶段 + * @param shopSubStage 闭店子阶段 + * @param expectedStageStatus 期望闭店子阶段状态 + */ + public void verifyStage(Long closeStoreId, CloseStoreStageEnum shopStage, CloseStoreSubStageEnum shopSubStage, CloseStoreSubStageStatusEnum... expectedStageStatus) { + CloseStoreStageInfoDO stageInfoDO = getByStage(closeStoreId, shopStage.getCloseStoreStage(), Objects.nonNull(shopSubStage) ? shopSubStage.getCloseStoreSubStage() : null); + if (Objects.isNull(stageInfoDO)) { + throw new RuntimeException("未查询到审批阶段信息"); + } + if (Objects.nonNull(expectedStageStatus) && expectedStageStatus.length > 0) { + for (CloseStoreSubStageStatusEnum stageStatus : expectedStageStatus) { + if (stageStatus.getShopSubStageStatus().equals(stageInfoDO.getShopSubStageStatus())) { + return; + } + } + throw new ServiceException(ErrorCodeEnum.CLOSE_STORE_SUB_STAGE_ERROR); + } + } + + /** + * 初始化闭店阶段信息 + * @param closeStoreId 闭店申请id + */ + public void initStageInfo(Long closeStoreId) { + List stageInfoList = new ArrayList<>(); + LocalDate now = LocalDate.now(); + for (CloseStoreSubStageEnum subStageEnum : CloseStoreSubStageEnum.values()) { + CloseStoreSubStageStatusEnum initStatus = subStageEnum.getInitStatus(); + CloseStoreStageInfoDO stageInfo = CloseStoreStageInfoDO.builder() + .closeStoreId(closeStoreId) + .shopStage(subStageEnum.getCloseStoreStageEnum().getCloseStoreStage()) + .shopSubStage(subStageEnum.getCloseStoreSubStage()) + .shopSubStageStatus(Objects.nonNull(initStatus) ? initStatus.getShopSubStageStatus() : CloseStoreSubStageStatusEnum.CLOSE_STORE_SUB_STAGE_STATUS_00.getShopSubStageStatus()) + .isTerminated(0) + .planCompleteTime(subStageEnum.getPlanCompleteTime(now)) + .build(); + stageInfoList.add(stageInfo); + } + closeStoreStageInfoMapper.insertBatch(stageInfoList); + } + + /** + * 批量更新Selective + * @param list 阶段信息列表 + * @return 是否成功 + */ + public Boolean updateBatchSelective(List list) { + if (CollectionUtils.isEmpty(list)) { + return false; + } + return closeStoreStageInfoMapper.updateBatchSelective(list) > 0; + } + + /** + * 更新Selective + * @param stageInfoDO 阶段信息 + * @return 是否成功 + */ + public Boolean updateSelective(CloseStoreStageInfoDO stageInfoDO) { + return closeStoreStageInfoMapper.updateByPrimaryKeySelective(stageInfoDO) > 0; + } + + /** + * 已完成阶段数 + * @param closeStoreId 闭店申请id + * @return 已完成阶段数 + */ + public int getCompleteCount(Long closeStoreId) { + Example example = new Example(CloseStoreStageInfoDO.class); + example.createCriteria() + .andEqualTo("closeStoreId", closeStoreId) + .andEqualTo("isTerminated", 1) + .andEqualTo("deleted", 0); + return closeStoreStageInfoMapper.selectCountByExample(example); + } + + /** + * 已完成阶段数 + * @param closeStoreIds 闭店申请id列表 + * @return 已完成阶段数 + */ + public Map getCompleteCountMap(List closeStoreIds) { + if (CollectionUtils.isEmpty(closeStoreIds)) { + return Collections.emptyMap(); + } + Example example = new Example(CloseStoreStageInfoDO.class); + example.createCriteria() + .andIn("closeStoreId", closeStoreIds) + .andEqualTo("isTerminated", 1) + .andEqualTo("deleted", 0); + example.selectProperties("closeStoreId"); + List list = closeStoreStageInfoMapper.selectByExample(example); + return CollStreamUtil.groupBy(list, CloseStoreStageInfoDO::getCloseStoreId, Collectors.counting()); + } + + /** + * 修改子阶段状态 + * @param closeStoreId 闭店申请id + * @param subStatus 子阶段状态枚举类 + */ + public void updateSubStageStatus(Long closeStoreId, CloseStoreSubStageStatusEnum subStatus) { + CloseStoreSubStageEnum subStage = subStatus.getCloseStoreSubStageEnum(); + Example example = new Example(CloseStoreStageInfoDO.class); + example.createCriteria() + .andEqualTo("closeStoreId", closeStoreId) + .andEqualTo("shopSubStage", subStage.getCloseStoreSubStage()) + .andEqualTo("deleted", 0); + closeStoreStageInfoMapper.updateByExampleSelective(CloseStoreStageInfoDO.builder().shopSubStageStatus(subStatus.getShopSubStageStatus()).build(), example); + } +} 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 91b95e073..20dab3b50 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 @@ -14,6 +14,10 @@ import org.springframework.stereotype.Repository; import javax.annotation.Resource; import java.math.BigDecimal; import java.util.*; +import java.time.LocalDate; +import java.util.ArrayList; +import java.util.Date; +import java.util.List; @Repository public class StoreDao { @@ -146,4 +150,35 @@ public class StoreDao { public boolean updateStoreScore(String storeId, BigDecimal score) { return storeMapper.updateStoreScore(storeId, score) > 0; } + /** + * 修改门店营业状态 + * @param storeId 门店id + * @param storeStatus 门店营业状态 + */ + public void updateStoreStatus(String storeId, String storeStatus) { + storeMapper.updateStoreStatus(storeId,storeStatus); + } + + /** + * 门店状态改为闭店 + * @param storeId 门店id + * @param closeReason 闭店原因 + * @param closeNature 闭店性质 + */ + public void closeStore(String storeId, Integer closeReason, Integer closeNature, Date actualCloseData) { + if (storeMapper.closeStore(storeId, actualCloseData) > 0) { + storeMapper.insertOrUpdateCloseInfo(storeId, closeReason, closeNature); + } + } + + /** + * 查询最近没有订货记录的门店 + * @param latestDate 最近订货时间 + * @param businessTypes 商圈类型 + * @param inBusinessType 在列表内 + * @return 门店列表 + */ + public List getNoOrderStore(LocalDate latestDate, List businessTypes, Boolean inBusinessType) { + return storeMapper.getNoOrderStore(latestDate, businessTypes, inBusinessType); + } } diff --git a/coolstore-partner-dao/src/main/java/com/cool/store/dao/store/StoreMasterSignerInfoDAO.java b/coolstore-partner-dao/src/main/java/com/cool/store/dao/store/StoreMasterSignerInfoDAO.java index 75a361452..b23f6492b 100644 --- a/coolstore-partner-dao/src/main/java/com/cool/store/dao/store/StoreMasterSignerInfoDAO.java +++ b/coolstore-partner-dao/src/main/java/com/cool/store/dao/store/StoreMasterSignerInfoDAO.java @@ -34,4 +34,11 @@ public class StoreMasterSignerInfoDAO { List list = storeMasterSignerInfoMapper.selectByStoreIds(storeIds); return CollStreamUtil.toMap(list, StoreMasterSignerInfoDO::getStoreId, v -> v); } + + /** + * 根据门店id查询 + */ + public StoreMasterSignerInfoDO getByStoreId(String storeId) { + return storeMasterSignerInfoMapper.selectOne(StoreMasterSignerInfoDO.builder().storeId(storeId).build()); + } } diff --git a/coolstore-partner-dao/src/main/java/com/cool/store/mapper/CloseStoreAccountInfoMapper.java b/coolstore-partner-dao/src/main/java/com/cool/store/mapper/CloseStoreAccountInfoMapper.java new file mode 100644 index 000000000..a86624df3 --- /dev/null +++ b/coolstore-partner-dao/src/main/java/com/cool/store/mapper/CloseStoreAccountInfoMapper.java @@ -0,0 +1,16 @@ +package com.cool.store.mapper; + +import com.cool.store.entity.CloseStoreAccountInfoDO; +import tk.mybatis.mapper.common.Mapper; + +import java.util.List; + +public interface CloseStoreAccountInfoMapper extends Mapper { + + /** + * 批量新增 + * @param list 账号列表 + * @return int + */ + int insertBatch(List list); +} \ No newline at end of file diff --git a/coolstore-partner-dao/src/main/java/com/cool/store/mapper/CloseStoreAuditRecordMapper.java b/coolstore-partner-dao/src/main/java/com/cool/store/mapper/CloseStoreAuditRecordMapper.java new file mode 100644 index 000000000..3d3d555dc --- /dev/null +++ b/coolstore-partner-dao/src/main/java/com/cool/store/mapper/CloseStoreAuditRecordMapper.java @@ -0,0 +1,32 @@ +package com.cool.store.mapper; + +import com.cool.store.entity.CloseStoreAuditRecordDO; +import com.cool.store.request.close.store.CloseStoreQueryRequest; +import com.cool.store.vo.close.store.CloseStoreInfoListVO; +import org.apache.ibatis.annotations.Param; +import tk.mybatis.mapper.common.Mapper; + +import java.util.List; + +public interface CloseStoreAuditRecordMapper extends Mapper { + + /** + * 根据closeStoreId查询记录 + * @param closeStoreId + * @return + */ + List getRecordListByCloseStoreId( @Param("closeStoreId") Long closeStoreId); + + + /** + * 查询权限下的闭店申请审批记录 + * @param request 闭店申请查询Request + * @param userId 用户id + * @param isAdmin 是管理员权限 + * @return 闭店申请记录列表VO列表 + */ + List getCloseStoreAuditList(@Param("request") CloseStoreQueryRequest request, + @Param("userId") String userId, + @Param("isAdmin") Boolean isAdmin); + +} \ No newline at end of file diff --git a/coolstore-partner-dao/src/main/java/com/cool/store/mapper/CloseStoreFileDetailMapper.java b/coolstore-partner-dao/src/main/java/com/cool/store/mapper/CloseStoreFileDetailMapper.java new file mode 100644 index 000000000..2124b2092 --- /dev/null +++ b/coolstore-partner-dao/src/main/java/com/cool/store/mapper/CloseStoreFileDetailMapper.java @@ -0,0 +1,35 @@ +package com.cool.store.mapper; + +import com.cool.store.request.close.file.CloseStoreMailAddressRequest; +import com.cool.store.entity.CloseStoreFileDetailDO; +import com.cool.store.request.close.file.CloseStoreFileApproveRequest; +import com.cool.store.request.close.file.CloseStoreMailInfoRequest; +import org.apache.ibatis.annotations.Param; +import tk.mybatis.mapper.common.Mapper; + +public interface CloseStoreFileDetailMapper extends Mapper { + + /** + * 新增或编辑闭店资料邮寄地址信息 + * @param request 闭店资料邮寄地址信息Request + * @return int + */ + int insertOrUpdateMailAddress(CloseStoreMailAddressRequest request); + + /** + * 新增或编辑闭店资料邮寄信息 + * @param request 闭店资料邮寄信息Request + * @param mailStatus 邮寄状态 + * @return int + */ + int insertOrUpdateMailInfo(@Param("request") CloseStoreMailInfoRequest request, + @Param("mailStatus") Boolean mailStatus); + + /** + * 新增或编辑闭店资料信息 + * @param request 闭店材料审批Request + * @return int + */ + int insertOrUpdateFileInfoSelective(@Param("request") CloseStoreFileApproveRequest request, + @Param("approveComplete") Boolean approveComplete); +} \ No newline at end of file diff --git a/coolstore-partner-dao/src/main/java/com/cool/store/mapper/CloseStoreFileInfoMapper.java b/coolstore-partner-dao/src/main/java/com/cool/store/mapper/CloseStoreFileInfoMapper.java new file mode 100644 index 000000000..68847b2f2 --- /dev/null +++ b/coolstore-partner-dao/src/main/java/com/cool/store/mapper/CloseStoreFileInfoMapper.java @@ -0,0 +1,37 @@ +package com.cool.store.mapper; + +import com.cool.store.entity.CloseStoreFileInfoDO; +import org.apache.ibatis.annotations.Param; +import tk.mybatis.mapper.common.Mapper; + +import java.util.List; + +public interface CloseStoreFileInfoMapper extends Mapper { + + /** + * 批量更新 + * @param list 实体列表 + * @return int + */ + int updateBatch(List list); + + /** + * 批量新增 + * @param list 实体列表 + * @return int + */ + int insertBatch(List list); + + /** + * 修改材料 + * @param id 主键id + * @param urls 图片列表 + */ + int updateFile(@Param("id") Long id, @Param("urls") String urls); + + /** + * 更新材料状态为审批状态 + * @param closeStoreId 闭店申请id + */ + void updateFileStatusToApproveStatus(@Param("closeStoreId") Long closeStoreId); +} \ No newline at end of file diff --git a/coolstore-partner-dao/src/main/java/com/cool/store/mapper/CloseStoreInfoMapper.java b/coolstore-partner-dao/src/main/java/com/cool/store/mapper/CloseStoreInfoMapper.java new file mode 100644 index 000000000..68a23b45b --- /dev/null +++ b/coolstore-partner-dao/src/main/java/com/cool/store/mapper/CloseStoreInfoMapper.java @@ -0,0 +1,19 @@ +package com.cool.store.mapper; + +import com.cool.store.entity.CloseStoreInfoDO; +import com.cool.store.request.close.store.CloseStoreQueryRequest; +import com.cool.store.vo.close.store.CloseStoreInfoListVO; +import org.apache.ibatis.annotations.Param; +import tk.mybatis.mapper.common.Mapper; + +import java.util.List; + +public interface CloseStoreInfoMapper extends Mapper { + + /** + * 查询闭店申请记录 + * @param request 闭店申请查询Request + * @return 闭店申请记录列表VO + */ + List getCloseStoreInfoList(@Param("request") CloseStoreQueryRequest request, @Param("regionIds") List regionIds); +} \ No newline at end of file diff --git a/coolstore-partner-dao/src/main/java/com/cool/store/mapper/CloseStoreRefundInfoMapper.java b/coolstore-partner-dao/src/main/java/com/cool/store/mapper/CloseStoreRefundInfoMapper.java new file mode 100644 index 000000000..37725f2b2 --- /dev/null +++ b/coolstore-partner-dao/src/main/java/com/cool/store/mapper/CloseStoreRefundInfoMapper.java @@ -0,0 +1,20 @@ +package com.cool.store.mapper; + +import com.cool.store.entity.CloseStoreRefundInfoDO; +import org.apache.ibatis.annotations.Param; +import tk.mybatis.mapper.common.Mapper; + +import java.util.List; + +public interface CloseStoreRefundInfoMapper extends Mapper { + + /** + * 批量新增 + */ + void insertBatch(@Param("list") List list); + + /** + * 根据id批量更新退款状态 + */ + void updateRefundStatusBatchById(@Param("list") List list); +} \ No newline at end of file diff --git a/coolstore-partner-dao/src/main/java/com/cool/store/mapper/CloseStoreStageInfoMapper.java b/coolstore-partner-dao/src/main/java/com/cool/store/mapper/CloseStoreStageInfoMapper.java new file mode 100644 index 000000000..db036551b --- /dev/null +++ b/coolstore-partner-dao/src/main/java/com/cool/store/mapper/CloseStoreStageInfoMapper.java @@ -0,0 +1,23 @@ +package com.cool.store.mapper; + +import com.cool.store.entity.CloseStoreStageInfoDO; +import tk.mybatis.mapper.common.Mapper; + +import java.util.List; + +public interface CloseStoreStageInfoMapper extends Mapper { + + /** + * 批量新增 + * @param list 阶段信息列表 + * @return int + */ + int insertBatch(List list); + + /** + * 批量更新Selective + * @param list 阶段信息列表 + * @return int + */ + int updateBatchSelective(List list); +} \ No newline at end of file diff --git a/coolstore-partner-dao/src/main/java/com/cool/store/mapper/StoreMapper.java b/coolstore-partner-dao/src/main/java/com/cool/store/mapper/StoreMapper.java index fef08b58a..2234439d5 100644 --- a/coolstore-partner-dao/src/main/java/com/cool/store/mapper/StoreMapper.java +++ b/coolstore-partner-dao/src/main/java/com/cool/store/mapper/StoreMapper.java @@ -8,6 +8,8 @@ import org.apache.ibatis.annotations.Mapper; import org.apache.ibatis.annotations.Param; import java.math.BigDecimal; +import java.time.LocalDate; +import java.util.Date; import java.util.List; @Mapper @@ -78,4 +80,34 @@ public interface StoreMapper { * @param score 积分 */ int updateStoreScore(String storeId, BigDecimal score); + /** + * 修改门店营业状态 + * @param storeId 门店id + * @param storeStatus 门店营业状态 + */ + void updateStoreStatus(@Param("storeId") String storeId, @Param("storeStatus") String storeStatus); + + /** + * 门店状态改为闭店 + * @param storeId 门店id + */ + int closeStore(@Param("storeId") String storeId, @Param("actualCloseData") Date actualCloseData); + + /** + * 新增或编辑闭店信息 + * @param storeId 门店id + * @param closeReason 闭店原因 + * @param closeNature 闭店性质 + * @return int + */ + int insertOrUpdateCloseInfo(@Param("storeId") String storeId, @Param("closeReason") Integer closeReason, @Param("closeNature") Integer closeNature); + + /** + * 查询最近没有订货记录的门店 + * @param latestDate 最近订货时间 + * @param businessTypes 商圈类型 + * @param inBusinessType 在列表内 + * @return 门店列表 + */ + List getNoOrderStore(@Param("latestDate") LocalDate latestDate, @Param("businessTypes") List businessTypes, @Param("inBusinessType") Boolean inBusinessType); } diff --git a/coolstore-partner-dao/src/main/java/com/cool/store/mapper/store/StoreMasterSignerInfoMapper.java b/coolstore-partner-dao/src/main/java/com/cool/store/mapper/store/StoreMasterSignerInfoMapper.java index 67e2231e3..546b29a2c 100644 --- a/coolstore-partner-dao/src/main/java/com/cool/store/mapper/store/StoreMasterSignerInfoMapper.java +++ b/coolstore-partner-dao/src/main/java/com/cool/store/mapper/store/StoreMasterSignerInfoMapper.java @@ -3,6 +3,7 @@ package com.cool.store.mapper.store; import com.cool.store.entity.store.StoreMasterSignerInfoDO; import org.apache.ibatis.annotations.Param; +import tk.mybatis.mapper.common.Mapper; import java.util.List; @@ -10,7 +11,7 @@ import java.util.List; * @author zhangchenbiao * @date 2025-09-23 11:32 */ -public interface StoreMasterSignerInfoMapper { +public interface StoreMasterSignerInfoMapper extends Mapper { /** * 根据门店id查询签约信息 diff --git a/coolstore-partner-dao/src/main/resources/mapper/CloseStoreAccountInfoMapper.xml b/coolstore-partner-dao/src/main/resources/mapper/CloseStoreAccountInfoMapper.xml new file mode 100644 index 000000000..7016be403 --- /dev/null +++ b/coolstore-partner-dao/src/main/resources/mapper/CloseStoreAccountInfoMapper.xml @@ -0,0 +1,26 @@ + + + + + + + + + + + + + + + + + + INSERT INTO zxjp_close_store_account_info (close_store_id, system_name, system_code, account_type, status, close_type) + VALUES + + (#{item.closeStoreId}, #{item.systemName}, #{item.systemCode}, #{item.accountType}, #{item.status}, #{item.closeType}) + + + \ No newline at end of file diff --git a/coolstore-partner-dao/src/main/resources/mapper/CloseStoreAuditRecordMapper.xml b/coolstore-partner-dao/src/main/resources/mapper/CloseStoreAuditRecordMapper.xml new file mode 100644 index 000000000..6d4e77299 --- /dev/null +++ b/coolstore-partner-dao/src/main/resources/mapper/CloseStoreAuditRecordMapper.xml @@ -0,0 +1,89 @@ + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/coolstore-partner-dao/src/main/resources/mapper/CloseStoreFileDetailMapper.xml b/coolstore-partner-dao/src/main/resources/mapper/CloseStoreFileDetailMapper.xml new file mode 100644 index 000000000..d502e058a --- /dev/null +++ b/coolstore-partner-dao/src/main/resources/mapper/CloseStoreFileDetailMapper.xml @@ -0,0 +1,70 @@ + + + + + + + + + + + + + + + + + + + + + + + INSERT INTO zxjp_close_store_file_detail + (close_store_id, mail_address, mail_addressee, mail_mobile) + VALUES + (#{closeStoreId}, #{mailAddress}, #{mailAddressee}, #{mailMobile}) + ON DUPLICATE KEY UPDATE + mail_address = VALUES(mail_address), + mail_addressee = VALUES(mail_addressee), + mail_mobile = VALUES(mail_mobile) + + + + INSERT INTO zxjp_close_store_file_detail + (close_store_id, mail_number, mail_company, mail_status) + VALUES + (#{request.closeStoreId}, #{request.mailNumber}, #{request.mailCompany}, #{mailStatus}) + ON DUPLICATE KEY UPDATE + mail_number = VALUES(mail_number), + mail_company = VALUES(mail_company), + mail_status = VALUES(mail_status) + + + + INSERT INTO zxjp_close_store_file_detail + + close_store_id, + bank_account, + bank_opening, + refund_account, + approve_complete, + + + #{request.closeStoreId}, + #{request.bankAccount}, + #{request.bankOpening}, + #{request.refundAccount}, + #{approveComplete}, + + ON DUPLICATE KEY UPDATE + + bank_account = VALUES(bank_account), + bank_opening = VALUES(bank_opening), + refund_account = VALUES(refund_account), + approve_complete = VALUES(approve_complete), + + + \ No newline at end of file diff --git a/coolstore-partner-dao/src/main/resources/mapper/CloseStoreFileInfoMapper.xml b/coolstore-partner-dao/src/main/resources/mapper/CloseStoreFileInfoMapper.xml new file mode 100644 index 000000000..ef6924f0a --- /dev/null +++ b/coolstore-partner-dao/src/main/resources/mapper/CloseStoreFileInfoMapper.xml @@ -0,0 +1,66 @@ + + + + + + + + + + + + + + + + + + + + UPDATE zxjp_close_store_file_info + + + + WHEN id = #{item.id} THEN #{item.mailStatus} + + + + + WHEN id = #{item.id} THEN #{item.approveStatus} + + + + + WHEN id = #{item.id} THEN #{item.approveOpinion} + + + + WHERE id IN + + #{item.id} + + + + + INSERT INTO zxjp_close_store_file_info (close_store_id, file_code, file_name, mail_status, approve_status, approve_opinion) + VALUES + + (#{item.closeStoreId}, #{item.fileCode}, #{item.fileName}, #{item.mailStatus}, #{item.approveStatus}, #{item.approveOpinion}) + + + + + UPDATE zxjp_close_store_file_info + SET urls = #{urls}, + file_status = CASE WHEN file_status = 2 THEN 5 WHEN file_status = 5 THEN 5 ELSE 3 END + WHERE id = #{id} AND file_status IN (0, 2, 3, 5) + + + + UPDATE zxjp_close_store_file_info + SET file_status = approve_status + WHERE close_store_id = #{closeStoreId} + + \ No newline at end of file diff --git a/coolstore-partner-dao/src/main/resources/mapper/CloseStoreInfoMapper.xml b/coolstore-partner-dao/src/main/resources/mapper/CloseStoreInfoMapper.xml new file mode 100644 index 000000000..0b79a0263 --- /dev/null +++ b/coolstore-partner-dao/src/main/resources/mapper/CloseStoreInfoMapper.xml @@ -0,0 +1,74 @@ + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/coolstore-partner-dao/src/main/resources/mapper/CloseStoreRefundInfoMapper.xml b/coolstore-partner-dao/src/main/resources/mapper/CloseStoreRefundInfoMapper.xml new file mode 100644 index 000000000..2a47b27c6 --- /dev/null +++ b/coolstore-partner-dao/src/main/resources/mapper/CloseStoreRefundInfoMapper.xml @@ -0,0 +1,108 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + INSERT INTO zxjp_close_store_refund_info ( + close_store_id, + refund_no, + type, + refund_status, + refund_order_no, + refund_time, + invoice_title, + submitter_id, + submitter_name, + refund_reason, + refund_type, + refund_project, + remark, + business_code, + business_name, + business_account, + expense_type_code, + expense_apply_time, + expected_amount, + actual_amount, + deduct_amount, + deduct_reason, + close_reason, + ) VALUES + + ( + #{item.closeStoreId,jdbcType=BIGINT}, + #{item.refundNo,jdbcType=VARCHAR}, + #{item.type,jdbcType=INTEGER}, + #{item.refundStatus,jdbcType=BIT}, + #{item.refundOrderNo,jdbcType=VARCHAR}, + #{item.refundTime,jdbcType=TIMESTAMP}, + #{item.invoiceTitle,jdbcType=VARCHAR}, + #{item.submitterId,jdbcType=VARCHAR}, + #{item.submitterName,jdbcType=VARCHAR}, + #{item.refundReason,jdbcType=VARCHAR}, + #{item.refundType,jdbcType=VARCHAR}, + #{item.refundProject,jdbcType=VARCHAR}, + #{item.remark,jdbcType=VARCHAR}, + #{item.businessCode,jdbcType=VARCHAR}, + #{item.businessName,jdbcType=VARCHAR}, + #{item.businessAccount,jdbcType=VARCHAR}, + #{item.expenseTypeCode,jdbcType=VARCHAR}, + #{item.expenseApplyTime,jdbcType=DATE}, + #{item.expectedAmount,jdbcType=DECIMAL}, + #{item.actualAmount,jdbcType=DECIMAL}, + #{item.deductAmount,jdbcType=DECIMAL}, + #{item.deductReason,jdbcType=VARCHAR}, + #{item.closeReason,jdbcType=TINYINT}, + ) + + + + + UPDATE zxjp_close_store_refund_info + + + + WHEN id = #{item.id} THEN #{item.refundStatus} + + + + WHERE id IN + + #{item.id} + + + \ No newline at end of file diff --git a/coolstore-partner-dao/src/main/resources/mapper/CloseStoreStageInfoMapper.xml b/coolstore-partner-dao/src/main/resources/mapper/CloseStoreStageInfoMapper.xml new file mode 100644 index 000000000..4c72c5023 --- /dev/null +++ b/coolstore-partner-dao/src/main/resources/mapper/CloseStoreStageInfoMapper.xml @@ -0,0 +1,64 @@ + + + + + + + + + + + + + + + + + + + + + + INSERT INTO zxjp_close_store_stage_info (close_store_id, shop_stage, shop_sub_stage, shop_sub_stage_status, is_terminated, plan_complete_time, actual_complete_time, remark, audit_id) + VALUES + + (#{item.closeStoreId}, #{item.shopStage}, #{item.shopSubStage}, #{item.shopSubStageStatus}, #{item.isTerminated}, #{item.planCompleteTime}, #{item.actualCompleteTime}, #{item.remark}, #{item.auditId}) + + + + + + UPDATE zxjp_close_store_stage_info + + + shop_stage = #{item.shopStage}, + + + shop_sub_stage = #{item.shopSubStage}, + + + shop_sub_stage_status = #{item.shopSubStageStatus}, + + + is_terminated = #{item.isTerminated}, + + + plan_complete_time = #{item.planCompleteTime}, + + + actual_complete_time = #{item.actualCompleteTime}, + + + remark = #{item.remark}, + + + audit_id = #{item.auditId}, + + update_time = NOW() + + WHERE id = #{item.id} + + + \ No newline at end of file diff --git a/coolstore-partner-dao/src/main/resources/mapper/StoreMapper.xml b/coolstore-partner-dao/src/main/resources/mapper/StoreMapper.xml index 8477b4708..1a974b618 100644 --- a/coolstore-partner-dao/src/main/resources/mapper/StoreMapper.xml +++ b/coolstore-partner-dao/src/main/resources/mapper/StoreMapper.xml @@ -285,4 +285,46 @@ ON DUPLICATE KEY UPDATE score = values(score) + + + UPDATE store_${enterpriseId} + SET store_status = #{storeStatus} + WHERE store_id = #{storeId} AND is_delete = 'effective' + + + + UPDATE store_${enterpriseId} + SET store_status = 'closed', + close_store_time = #{actualCloseData} + WHERE store_id = #{storeId} AND is_delete = 'effective' AND store_status != 'closed' + + + + INSERT INTO store_extend_info_${enterpriseId}(store_id, close_reason, close_nature) + VALUES(#{storeId}, #{closeReason}, #{closeNature}) + ON DUPLICATE KEY UPDATE + close_reason = VALUES(close_reason), + close_nature = VALUES(close_nature) + + + diff --git a/coolstore-partner-model/src/main/java/com/cool/store/dto/close/CloseStoreMkUserDTO.java b/coolstore-partner-model/src/main/java/com/cool/store/dto/close/CloseStoreMkUserDTO.java new file mode 100644 index 000000000..ff198278c --- /dev/null +++ b/coolstore-partner-model/src/main/java/com/cool/store/dto/close/CloseStoreMkUserDTO.java @@ -0,0 +1,34 @@ +package com.cool.store.dto.close; + +import lombok.Data; + +/** + *

+ * 每刻用户信息DTO + *

+ * + * @author wangff + * @since 2025/11/28 + */ +@Data +public class CloseStoreMkUserDTO { + /** + * 名称 + */ + private String name; + + /** + * 工号 + */ + private String jobnumber; + + /** + * 部门编码 + */ + private String depCode; + + /** + * 部门名称 + */ + private String depName; +} diff --git a/coolstore-partner-model/src/main/java/com/cool/store/dto/store/StoreMasterIssueDTO.java b/coolstore-partner-model/src/main/java/com/cool/store/dto/store/StoreMasterIssueDTO.java new file mode 100644 index 000000000..ce1562300 --- /dev/null +++ b/coolstore-partner-model/src/main/java/com/cool/store/dto/store/StoreMasterIssueDTO.java @@ -0,0 +1,30 @@ +package com.cool.store.dto.store; + +import lombok.AllArgsConstructor; +import lombok.Data; +import lombok.NoArgsConstructor; + +import java.util.List; + +/** + *

+ * 门店主数据下发DTO + *

+ * + * @author wangff + * @since 2025/10/10 + */ +@Data +@AllArgsConstructor +@NoArgsConstructor +public class StoreMasterIssueDTO { + /** + * 企业id + */ + private String enterpriseId; + + /** + * 门店id列表 + */ + private List storeIds; +} diff --git a/coolstore-partner-model/src/main/java/com/cool/store/dto/xgj/XgjBranchBankDTO.java b/coolstore-partner-model/src/main/java/com/cool/store/dto/xgj/XgjBranchBankDTO.java new file mode 100644 index 000000000..d27727998 --- /dev/null +++ b/coolstore-partner-model/src/main/java/com/cool/store/dto/xgj/XgjBranchBankDTO.java @@ -0,0 +1,23 @@ +package com.cool.store.dto.xgj; + +import com.fasterxml.jackson.annotation.JsonIgnoreProperties; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +/** + *

+ * 新管家支行DTO + *

+ * + * @author wangff + * @since 2025/12/1 + */ +@Data +@JsonIgnoreProperties(ignoreUnknown = true) +public class XgjBranchBankDTO { + @ApiModelProperty("银行名称") + private String matchBankName; + + @ApiModelProperty("支行号") + private String basBankNo; +} diff --git a/coolstore-partner-model/src/main/java/com/cool/store/dto/xgj/XgjPartnerAccountDTO.java b/coolstore-partner-model/src/main/java/com/cool/store/dto/xgj/XgjPartnerAccountDTO.java new file mode 100644 index 000000000..81bc3e8a0 --- /dev/null +++ b/coolstore-partner-model/src/main/java/com/cool/store/dto/xgj/XgjPartnerAccountDTO.java @@ -0,0 +1,32 @@ +package com.cool.store.dto.xgj; + +import com.fasterxml.jackson.annotation.JsonIgnoreProperties; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +/** + *

+ * 新管家供应商账户信息DTO + *

+ * + * @author wangff + * @since 2025/11/28 + */ +@Data +@JsonIgnoreProperties(ignoreUnknown = true) +public class XgjPartnerAccountDTO { + @ApiModelProperty("账户名称") + private String accountName; + + @ApiModelProperty("银行账号") + private String accountNumber; + + @ApiModelProperty("开户银行") + private String bankName; + + @ApiModelProperty("开户支行号") + private String bankBranchNo; + + @ApiModelProperty("账户类型") + private String accountType; +} diff --git a/coolstore-partner-model/src/main/java/com/cool/store/dto/xgj/XgjPartnerDTO.java b/coolstore-partner-model/src/main/java/com/cool/store/dto/xgj/XgjPartnerDTO.java new file mode 100644 index 000000000..ecda12762 --- /dev/null +++ b/coolstore-partner-model/src/main/java/com/cool/store/dto/xgj/XgjPartnerDTO.java @@ -0,0 +1,43 @@ +package com.cool.store.dto.xgj; + +import com.fasterxml.jackson.annotation.JsonIgnoreProperties; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +import java.util.List; + +/** + *

+ * 新管家供应商DTO + *

+ * + * @author wangff + * @since 2025/11/28 + */ +@Data +@JsonIgnoreProperties(ignoreUnknown = true) +public class XgjPartnerDTO { + @ApiModelProperty("父节点名称") + private String parentName; + + @ApiModelProperty("父节点编码") + private String parentBizCode; + + @ApiModelProperty("往来单位名称") + private String name; + + @ApiModelProperty("往来单位英文名") + private String nameEN; + + @ApiModelProperty("往来单位编码") + private String businessCode; + + @ApiModelProperty("往来单位关系") + private List partnerType; + + @ApiModelProperty("往来单位性质") + private List partnerProperty; + + @ApiModelProperty("账户信息") + private List accounts; +} diff --git a/coolstore-partner-model/src/main/java/com/cool/store/dto/xgj/XgjPartnerPageDTO.java b/coolstore-partner-model/src/main/java/com/cool/store/dto/xgj/XgjPartnerPageDTO.java new file mode 100644 index 000000000..5b7f9052c --- /dev/null +++ b/coolstore-partner-model/src/main/java/com/cool/store/dto/xgj/XgjPartnerPageDTO.java @@ -0,0 +1,25 @@ +package com.cool.store.dto.xgj; + +import com.fasterxml.jackson.annotation.JsonIgnoreProperties; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +import java.util.List; + +/** + *

+ * 新管家分页DTO + *

+ * + * @author wangff + * @since 2025/11/28 + */ +@Data +@JsonIgnoreProperties(ignoreUnknown = true) +public class XgjPartnerPageDTO { + @ApiModelProperty("是否有下一页") + private Boolean hasNextPage; + + @ApiModelProperty("列表") + private List dataList; +} diff --git a/coolstore-partner-model/src/main/java/com/cool/store/dto/xgj/XgjPayResultDTO.java b/coolstore-partner-model/src/main/java/com/cool/store/dto/xgj/XgjPayResultDTO.java new file mode 100644 index 000000000..4c5d97b48 --- /dev/null +++ b/coolstore-partner-model/src/main/java/com/cool/store/dto/xgj/XgjPayResultDTO.java @@ -0,0 +1,31 @@ +package com.cool.store.dto.xgj; + +import com.cool.store.enums.close.XgjRefundPayStatusEnum; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +/** + *

+ * 信管家支付结果DTO + *

+ * + * @author wangff + * @since 2025/12/3 + */ +@Data +public class XgjPayResultDTO { + /** + * {@link XgjRefundPayStatusEnum#getStatus()} + */ + @ApiModelProperty("支付状态") + private String status; + + @ApiModelProperty("msg") + private String message; + + @ApiModelProperty("每刻订单号") + private String outNo; + + @ApiModelProperty("支付成功时间,yyyy-MM-dd HH:mm:ss") + private String paySuccessTime; +} diff --git a/coolstore-partner-model/src/main/java/com/cool/store/dto/xgj/XgjPaymentDTO.java b/coolstore-partner-model/src/main/java/com/cool/store/dto/xgj/XgjPaymentDTO.java new file mode 100644 index 000000000..26e61b9d5 --- /dev/null +++ b/coolstore-partner-model/src/main/java/com/cool/store/dto/xgj/XgjPaymentDTO.java @@ -0,0 +1,33 @@ +package com.cool.store.dto.xgj; + +import com.cool.store.enums.close.XgjRefundPayStatusEnum; +import com.fasterxml.jackson.annotation.JsonIgnoreProperties; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +/** + *

+ * 新管家单据支付结果DTO + *

+ * + * @author wangff + * @since 2025/11/28 + */ +@Data +@JsonIgnoreProperties(ignoreUnknown = true) +public class XgjPaymentDTO { + @ApiModelProperty("每刻单号") + private String outNo; + + @ApiModelProperty("新管家单号") + private String orderNo; + + /** + * {@link XgjRefundPayStatusEnum#getStatus()} + */ + @ApiModelProperty("支付状态") + private String status; + + @ApiModelProperty("反馈信息") + private String message; +} diff --git a/coolstore-partner-model/src/main/java/com/cool/store/entity/CloseStoreAccountInfoDO.java b/coolstore-partner-model/src/main/java/com/cool/store/entity/CloseStoreAccountInfoDO.java new file mode 100644 index 000000000..15e466c21 --- /dev/null +++ b/coolstore-partner-model/src/main/java/com/cool/store/entity/CloseStoreAccountInfoDO.java @@ -0,0 +1,70 @@ +package com.cool.store.entity; + +import lombok.AllArgsConstructor; +import lombok.Builder; +import lombok.Data; +import lombok.NoArgsConstructor; + +import java.util.Date; +import javax.persistence.*; + +@Table(name = "zxjp_close_store_account_info") +@Data +@AllArgsConstructor +@NoArgsConstructor +@Builder +public class CloseStoreAccountInfoDO { + @Id + @GeneratedValue(strategy = GenerationType.IDENTITY) + private Long id; + + /** + * 闭店申请ID + */ + @Column(name = "close_store_id") + private Long closeStoreId; + + /** + * 系统名称 + */ + @Column(name = "system_name") + private String systemName; + + /** + * 系统code + */ + @Column(name = "system_code") + private String systemCode; + + /** + * 账号分类,0-IT账号,1-外卖账号 + */ + @Column(name = "account_type") + private Integer accountType; + + /** + * 状态:1-使用中, 2-已关闭, 3-关闭中 + */ + @Column(name = "status") + private Integer status; + + /** + * 关闭类型,0直接关闭,1申请关闭 + */ + @Column(name = "close_type") + private Integer closeType; + + /** + * 创建时间 + */ + @Column(name = "create_time") + private Date createTime; + + /** + * 更新时间 + */ + @Column(name = "update_time") + private Date updateTime; + + +} \ No newline at end of file diff --git a/coolstore-partner-model/src/main/java/com/cool/store/entity/CloseStoreAuditRecordDO.java b/coolstore-partner-model/src/main/java/com/cool/store/entity/CloseStoreAuditRecordDO.java new file mode 100644 index 000000000..71ae2a6c0 --- /dev/null +++ b/coolstore-partner-model/src/main/java/com/cool/store/entity/CloseStoreAuditRecordDO.java @@ -0,0 +1,92 @@ +package com.cool.store.entity; + +import lombok.AllArgsConstructor; +import lombok.Builder; +import lombok.Data; +import lombok.NoArgsConstructor; + +import java.util.Date; +import javax.persistence.*; + +@Table(name = "zxjp_close_store_audit_record") +@Data@Builder +@NoArgsConstructor +@AllArgsConstructor +public class CloseStoreAuditRecordDO { + @Id + @GeneratedValue(strategy = GenerationType.IDENTITY) + private Long id; + + /** + * 闭店申请ID + */ + @Column(name = "close_store_id") + private Long closeStoreId; + + /** + * 记录类型:1-申请提交,2-审批操作 + */ + @Column(name = "record_type") + private Integer recordType; + + /** + * 备注 + */ + @Column(name = "action_remark") + private String actionRemark; + + /** + * 实际处理人 + */ + @Column(name = "handler_user_id") + private String handlerUserId; + + /** + * 实际处理人名称 + */ + @Column(name = "handler_user_name") + private String handlerUserName; + + /** + * 处理人集合 + */ + @Column(name = "handler_user_ids") + private String handlerUserIds; + + /** + * 收到任务时间 + */ + @Column(name = "receive_task_time") + private Date receiveTaskTime; + + /** + * 完成任务时间 + */ + @Column(name = "finish_task_time") + private Date finishTaskTime; + + /** + * 审核状态 0待处理,1通过,2拒绝 + */ + @Column(name = "audit_status") + private Integer auditStatus; + + /** + * 删除标识 + */ + private Integer deleted; + + /** + * 创建时间 + */ + @Column(name = "create_time") + private Date createTime; + + /** + * 更新时间 + */ + @Column(name = "updated_time") + private Date updatedTime; + + +} \ No newline at end of file diff --git a/coolstore-partner-model/src/main/java/com/cool/store/entity/CloseStoreFileDetailDO.java b/coolstore-partner-model/src/main/java/com/cool/store/entity/CloseStoreFileDetailDO.java new file mode 100644 index 000000000..e2984f665 --- /dev/null +++ b/coolstore-partner-model/src/main/java/com/cool/store/entity/CloseStoreFileDetailDO.java @@ -0,0 +1,115 @@ +package com.cool.store.entity; + +import lombok.AllArgsConstructor; +import lombok.Builder; +import lombok.Data; +import lombok.NoArgsConstructor; + +import java.util.Date; +import javax.persistence.*; + +/** + *

+ * 闭店资料详情 + *

+ * + * @author wangff + * @since 2025/10/7 + */ +@Table(name = "zxjp_close_store_file_detail") +@Data +@AllArgsConstructor +@NoArgsConstructor +@Builder +public class CloseStoreFileDetailDO { + /** + * id + */ + @Id + @GeneratedValue(strategy = GenerationType.IDENTITY) + private Long id; + + /** + * 闭店申请ID + */ + @Column(name = "close_store_id") + private Long closeStoreId; + + /** + * 审批完成状态 + */ + @Column(name = "approve_complete") + private Integer approveComplete; + + /** + * 邮件单号 + */ + @Column(name = "mail_number") + private String mailNumber; + + /** + * 邮件状态,0未邮寄,1已邮寄 + */ + @Column(name = "mail_status") + private Integer mailStatus; + + /** + * 快递公司 + */ + @Column(name = "mail_company") + private String mailCompany; + + /** + * 材料邮寄地址 + */ + @Column(name = "mail_address") + private String mailAddress; + + /** + * 收件人 + */ + @Column(name = "mail_addressee") + private String mailAddressee; + + /** + * 收件人手机号 + */ + @Column(name = "mail_mobile") + private String mailMobile; + + /** + * 户名 + */ + @Column(name = "bank_account") + private String bankAccount; + + /** + * 开户行 + */ + @Column(name = "bank_opening") + private String bankOpening; + + /** + * 退款账号 + */ + @Column(name = "refund_account") + private String refundAccount; + + /** + * 创建时间 + */ + @Column(name = "create_time") + private Date createTime; + + /** + * 更新时间 + */ + @Column(name = "update_time") + private Date updateTime; + + /** + * 督导审批意见 + */ + @Column(name = "remark") + private String remark; +} \ No newline at end of file diff --git a/coolstore-partner-model/src/main/java/com/cool/store/entity/CloseStoreFileInfoDO.java b/coolstore-partner-model/src/main/java/com/cool/store/entity/CloseStoreFileInfoDO.java new file mode 100644 index 000000000..e511658f5 --- /dev/null +++ b/coolstore-partner-model/src/main/java/com/cool/store/entity/CloseStoreFileInfoDO.java @@ -0,0 +1,80 @@ +package com.cool.store.entity; + +import lombok.AllArgsConstructor; +import lombok.Builder; +import lombok.Data; +import lombok.NoArgsConstructor; + +import java.util.Date; +import javax.persistence.*; + +@Table(name = "zxjp_close_store_file_info") +@Data +@AllArgsConstructor +@NoArgsConstructor +@Builder +public class CloseStoreFileInfoDO { + @Id + @GeneratedValue(strategy = GenerationType.IDENTITY) + private Long id; + + /** + * 闭店申请ID + */ + @Column(name = "close_store_id") + private Long closeStoreId; + + /** + * 资料code + */ + @Column(name = "file_code") + private String fileCode; + + /** + * 资料名称 + */ + @Column(name = "file_name") + private String fileName; + + /** + * 邮件状态 + */ + @Column(name = "mail_status") + private Integer mailStatus; + + /** + * 材料审批状态 1-合格 2-不合格 + */ + @Column(name = "approve_status") + private Integer approveStatus; + + /** + * 材料状态 0-未上传 1-合格 2-不合格 3-已上传 4-审批中 5-已修改 + */ + @Column(name = "file_status") + private Integer fileStatus; + + /** + * 审批意见 + */ + @Column(name = "approve_opinion") + private String approveOpinion; + + /** + * 创建时间 + */ + @Column(name = "create_time") + private Date createTime; + + /** + * 更新时间 + */ + @Column(name = "update_time") + private Date updateTime; + + /** + * 图片列表 + */ + @Column(name = "urls") + private String urls; +} \ No newline at end of file diff --git a/coolstore-partner-model/src/main/java/com/cool/store/entity/CloseStoreInfoDO.java b/coolstore-partner-model/src/main/java/com/cool/store/entity/CloseStoreInfoDO.java new file mode 100644 index 000000000..b7ee3ee80 --- /dev/null +++ b/coolstore-partner-model/src/main/java/com/cool/store/entity/CloseStoreInfoDO.java @@ -0,0 +1,98 @@ +package com.cool.store.entity; + +import lombok.AllArgsConstructor; +import lombok.Builder; +import lombok.Data; +import lombok.NoArgsConstructor; + +import java.util.Date; +import javax.persistence.*; + +@Table(name = "zxjp_close_store_info") +@Data +@AllArgsConstructor +@NoArgsConstructor +@Builder +public class CloseStoreInfoDO { + @Id + @GeneratedValue(strategy = GenerationType.IDENTITY) + private Long id; + + /** + * 闭店申请单号 + */ + @Column(name = "close_store_no") + private String closeStoreNo; + + /** + * 门店ID + */ + @Column(name = "store_id") + private String storeId; + + /** + * 区域ID + */ + @Column(name = "region_id") + private Long regionId; + + /** + * 计划闭店日期 + */ + @Column(name = "plan_close_data") + private Date planCloseData; + + /** + * 实际闭店日期 + */ + @Column(name = "actual_close_data") + private Date actualCloseData; + + /** + * 闭店发起方式 1-主动发起 2-云流水发起 + */ + @Column(name = "close_type") + private Integer closeType; + + /** + * 闭店原因 + */ + @Column(name = "close_reason") + private Integer closeReason; + + /** + * 闭店原因说明 + */ + @Column(name = "reason_description") + private String reasonDescription; + + /** + * 闭店状态 1-审批中 5-审核未通过 10-进行中 15已完成 20-已取消 + */ + @Column(name = "close_status") + private Integer closeStatus; + + /** + * 督导 + */ + @Column(name = "supervisor_user_id") + private String supervisorUserId; + + /** + * 创建时间 + */ + @Column(name = "create_time") + private Date createTime; + + /** + * 更新时间 + */ + @Column(name = "update_time") + private Date updateTime; + + /** + * 发起人id + */ + @Column(name = "apply_user_id") + private String applyUserId; +} \ No newline at end of file diff --git a/coolstore-partner-model/src/main/java/com/cool/store/entity/CloseStoreRefundInfoDO.java b/coolstore-partner-model/src/main/java/com/cool/store/entity/CloseStoreRefundInfoDO.java new file mode 100644 index 000000000..83d37eee1 --- /dev/null +++ b/coolstore-partner-model/src/main/java/com/cool/store/entity/CloseStoreRefundInfoDO.java @@ -0,0 +1,190 @@ +package com.cool.store.entity; + +import lombok.AllArgsConstructor; +import lombok.Builder; +import lombok.Data; +import lombok.NoArgsConstructor; + +import java.math.BigDecimal; +import java.util.Date; +import javax.persistence.*; + +@Table(name = "zxjp_close_store_refund_info") +@Data +@AllArgsConstructor +@NoArgsConstructor +@Builder +public class CloseStoreRefundInfoDO { + /** + * id + */ + @Id + @GeneratedValue(strategy = GenerationType.IDENTITY) + private Long id; + + /** + * 闭店申请id + */ + @Column(name = "close_store_id") + private Long closeStoreId; + + /** + * 退款申请单号 + */ + @Column(name = "refund_no") + private String refundNo; + + /** + * 退款类型(闭店子阶段code) + */ + private Integer type; + + /** + * 退款状态 + */ + @Column(name = "refund_status") + private String refundStatus; + + /** + * 每刻退款单号 + */ + @Column(name = "refund_order_no") + private String refundOrderNo; + + /** + * 退款时间 + */ + @Column(name = "refund_time") + private Date refundTime; + + /** + * 公司抬头 + */ + @Column(name = "invoice_title") + private String invoiceTitle; + + /** + * 提交人id + */ + @Column(name = "submitter_id") + private String submitterId; + + /** + * 提交人名称 + */ + @Column(name = "submitter_name") + private String submitterName; + + /** + * 退款事由 + */ + @Column(name = "refund_reason") + private String refundReason; + + /** + * 退款类型,加盟部/加盟公司等 + */ + @Column(name = "refund_type") + private String refundType; + + /** + * 退款项目,加盟关店设备退款/加盟关店费用等 + */ + @Column(name = "refund_project") + private String refundProject; + + /** + * 其他说明 + */ + private String remark; + + /** + * 退款加盟商编码 + */ + @Column(name = "business_code") + private String businessCode; + + /** + * 退款加盟商名称 + */ + @Column(name = "business_name") + private String businessName; + + /** + * 退款加盟商收款账户 + */ + @Column(name = "business_account") + private String businessAccount; + + /** + * 费用类型code + */ + @Column(name = "expense_type_code") + private String expenseTypeCode; + + /** + * 费用申请日期 + */ + @Column(name = "expense_apply_time") + private Date expenseApplyTime; + + /** + * 应退金额 + */ + @Column(name = "expected_amount") + private BigDecimal expectedAmount; + + /** + * 实退金额 + */ + @Column(name = "actual_amount") + private BigDecimal actualAmount; + + /** + * 扣款金额 + */ + @Column(name = "deduct_amount") + private BigDecimal deductAmount; + + /** + * 扣款原因 + */ + @Column(name = "deduct_reason") + private String deductReason; + + /** + * 闭店原因 + */ + @Column(name = "close_reason") + private Integer closeReason; + + /** + * 创建时间 + */ + @Column(name = "create_time") + private Date createTime; + + /** + * 更新时间 + */ + @Column(name = "update_time") + private Date updateTime; + + /** + * 银行账户 + */ + @Column(name = "account_number") + private String accountNumber; + + /** + * 开户行 + */ + @Column(name = "bank_name") + private String bankName; + + /** + * 联行号 + */ + @Column(name = "bank_branch_no") + private String bankBranchNo; +} \ No newline at end of file diff --git a/coolstore-partner-model/src/main/java/com/cool/store/entity/CloseStoreStageInfoDO.java b/coolstore-partner-model/src/main/java/com/cool/store/entity/CloseStoreStageInfoDO.java new file mode 100644 index 000000000..0ead7337b --- /dev/null +++ b/coolstore-partner-model/src/main/java/com/cool/store/entity/CloseStoreStageInfoDO.java @@ -0,0 +1,92 @@ +package com.cool.store.entity; + +import lombok.AllArgsConstructor; +import lombok.Builder; +import lombok.Data; +import lombok.NoArgsConstructor; + +import java.util.Date; +import javax.persistence.*; + +@Table(name = "zxjp_close_store_stage_info") +@Data +@AllArgsConstructor +@NoArgsConstructor +@Builder +public class CloseStoreStageInfoDO { + @Id + @GeneratedValue(strategy = GenerationType.IDENTITY) + private Long id; + + /** + * 闭店申请ID + */ + @Column(name = "close_store_id") + private Long closeStoreId; + + /** + * 闭店阶段 + */ + @Column(name = "shop_stage") + private Integer shopStage; + + /** + * 闭店子阶段 + */ + @Column(name = "shop_sub_stage") + private Integer shopSubStage; + + /** + * 店铺阶段状态 + */ + @Column(name = "shop_sub_stage_status") + private Integer shopSubStageStatus; + + /** + * 当前阶段是否结束 0未结束 1已结束 + */ + @Column(name = "is_terminated") + private Integer isTerminated; + + /** + * 预估完成时间 + */ + @Column(name = "plan_complete_time") + private String planCompleteTime; + + /** + * 实际完成时间 + */ + @Column(name = "actual_complete_time") + private String actualCompleteTime; + + /** + * 备注 + */ + private String remark; + + /** + * xfsg_shop_audit_info.id + */ + @Column(name = "audit_id") + private Long auditId; + + /** + * 删除标识 + */ + private Integer deleted; + + /** + * 创建时间 + */ + @Column(name = "create_time") + private Date createTime; + + /** + * 更新时间 + */ + @Column(name = "update_time") + private Date updateTime; + + +} \ No newline at end of file diff --git a/coolstore-partner-model/src/main/java/com/cool/store/entity/store/StoreMasterSignerInfoDO.java b/coolstore-partner-model/src/main/java/com/cool/store/entity/store/StoreMasterSignerInfoDO.java index f3518fc6f..69f5450f5 100644 --- a/coolstore-partner-model/src/main/java/com/cool/store/entity/store/StoreMasterSignerInfoDO.java +++ b/coolstore-partner-model/src/main/java/com/cool/store/entity/store/StoreMasterSignerInfoDO.java @@ -18,6 +18,7 @@ import lombok.NoArgsConstructor; @Builder @NoArgsConstructor @AllArgsConstructor +@Table(name = "store_master_signer_info_${enterpriseId}") public class StoreMasterSignerInfoDO implements Serializable { @ApiModelProperty("主键") private Long id; diff --git a/coolstore-partner-model/src/main/java/com/cool/store/request/close/file/CloseStoreFileApproveRequest.java b/coolstore-partner-model/src/main/java/com/cool/store/request/close/file/CloseStoreFileApproveRequest.java new file mode 100644 index 000000000..bf08bca0c --- /dev/null +++ b/coolstore-partner-model/src/main/java/com/cool/store/request/close/file/CloseStoreFileApproveRequest.java @@ -0,0 +1,42 @@ +package com.cool.store.request.close.file; + +import io.swagger.annotations.ApiModelProperty; +import lombok.AllArgsConstructor; +import lombok.Builder; +import lombok.Data; +import lombok.NoArgsConstructor; + +import javax.validation.constraints.NotEmpty; +import javax.validation.constraints.NotNull; +import java.util.List; + +/** + *

+ * 闭店材料审批Request + *

+ * + * @author wangff + * @since 2025/10/7 + */ +@Data +@AllArgsConstructor +@NoArgsConstructor +@Builder +public class CloseStoreFileApproveRequest { + @ApiModelProperty(value = "闭店申请id", required = true) + @NotNull(message = "闭店申请id不能为空") + private Long closeStoreId; + + @ApiModelProperty("材料信息列表") + @NotEmpty(message = "材料信息列表不能为空") + private List fileList; + + @ApiModelProperty("户名") + private String bankAccount; + + @ApiModelProperty("开户行") + private String bankOpening; + + @ApiModelProperty("退款账号") + private String refundAccount; +} diff --git a/coolstore-partner-model/src/main/java/com/cool/store/request/close/file/CloseStoreFileAuditRequest.java b/coolstore-partner-model/src/main/java/com/cool/store/request/close/file/CloseStoreFileAuditRequest.java new file mode 100644 index 000000000..dbe814b64 --- /dev/null +++ b/coolstore-partner-model/src/main/java/com/cool/store/request/close/file/CloseStoreFileAuditRequest.java @@ -0,0 +1,28 @@ +package com.cool.store.request.close.file; + +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +import javax.validation.constraints.NotNull; + +/** + *

+ * 闭店审批Request + *

+ * + * @author wangff + * @since 2025/11/26 + */ +@Data +public class CloseStoreFileAuditRequest { + @ApiModelProperty("闭店申请id") + @NotNull(message = "闭店申请id不能为空") + private Long closeStoreId; + + @ApiModelProperty("审批状态 1通过 2拒绝") + @NotNull(message = "审批状态不能为空") + private Integer status; + + @ApiModelProperty("审批意见") + private String remark; +} diff --git a/coolstore-partner-model/src/main/java/com/cool/store/request/close/file/CloseStoreFileInfoRequest.java b/coolstore-partner-model/src/main/java/com/cool/store/request/close/file/CloseStoreFileInfoRequest.java new file mode 100644 index 000000000..cf5597712 --- /dev/null +++ b/coolstore-partner-model/src/main/java/com/cool/store/request/close/file/CloseStoreFileInfoRequest.java @@ -0,0 +1,46 @@ +package com.cool.store.request.close.file; + +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +import javax.validation.constraints.NotNull; + +/** + *

+ * 闭店材料信息Request + *

+ * + * @author wangff + * @since 2025/10/7 + */ +@Data +public class CloseStoreFileInfoRequest { + @ApiModelProperty("闭店申请id") + @NotNull(message = "闭店申请id不能为空") + private Long closeStoreId; + + @ApiModelProperty("闭店材料id") + @NotNull(message = "闭店材料id不能为空") + private Long id; + + @ApiModelProperty("邮件状态 0-未邮寄 1已邮寄") + private Integer mailStatus; + + @ApiModelProperty("材料审批状态 1-合格 2-不合格") + private Integer approveStatus; + + @ApiModelProperty("审批意见") + private String approveOpinion; + + @ApiModelProperty("图片列表") + private String urls; + + @ApiModelProperty("户名") + private String bankAccount; + + @ApiModelProperty("开户行") + private String bankOpening; + + @ApiModelProperty("退款账号") + private String refundAccount; +} diff --git a/coolstore-partner-model/src/main/java/com/cool/store/request/close/file/CloseStoreFileSubmitRequest.java b/coolstore-partner-model/src/main/java/com/cool/store/request/close/file/CloseStoreFileSubmitRequest.java new file mode 100644 index 000000000..4eec07d50 --- /dev/null +++ b/coolstore-partner-model/src/main/java/com/cool/store/request/close/file/CloseStoreFileSubmitRequest.java @@ -0,0 +1,28 @@ +package com.cool.store.request.close.file; + +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +import javax.validation.constraints.NotNull; + +/** + *

+ * 闭店材料提交Request + *

+ * + * @author wangff + * @since 2025/11/26 + */ +@Data +public class CloseStoreFileSubmitRequest { + @ApiModelProperty("闭店申请id") + @NotNull(message = "闭店申请id不能为空") + private Long closeStoreId; + + @ApiModelProperty("闭店材料id") + @NotNull(message = "闭店材料id不能为空") + private Long id; + + @ApiModelProperty("图片列表,逗号隔开") + private String urls; +} diff --git a/coolstore-partner-model/src/main/java/com/cool/store/request/close/file/CloseStoreMailAddressRequest.java b/coolstore-partner-model/src/main/java/com/cool/store/request/close/file/CloseStoreMailAddressRequest.java new file mode 100644 index 000000000..fe37770ed --- /dev/null +++ b/coolstore-partner-model/src/main/java/com/cool/store/request/close/file/CloseStoreMailAddressRequest.java @@ -0,0 +1,30 @@ +package com.cool.store.request.close.file; + +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +import javax.validation.constraints.NotNull; + +/** + *

+ * 闭店资料邮寄地址信息Request + *

+ * + * @author wangff + * @since 2025/10/7 + */ +@Data +public class CloseStoreMailAddressRequest { + @ApiModelProperty(value = "闭店申请ID", required = true) + @NotNull(message = "闭店申请ID不能为空") + private Long closeStoreId; + + @ApiModelProperty("材料邮寄地址") + private String mailAddress; + + @ApiModelProperty("收件人") + private String mailAddressee; + + @ApiModelProperty("收件人手机号") + private String mailMobile; +} diff --git a/coolstore-partner-model/src/main/java/com/cool/store/request/close/file/CloseStoreMailInfoRequest.java b/coolstore-partner-model/src/main/java/com/cool/store/request/close/file/CloseStoreMailInfoRequest.java new file mode 100644 index 000000000..72baeaf99 --- /dev/null +++ b/coolstore-partner-model/src/main/java/com/cool/store/request/close/file/CloseStoreMailInfoRequest.java @@ -0,0 +1,29 @@ +package com.cool.store.request.close.file; + +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +import javax.validation.constraints.NotBlank; +import javax.validation.constraints.NotNull; + +/** + *

+ * 闭店资料邮寄信息Request + *

+ * + * @author wangff + * @since 2025/10/7 + */ +@Data +public class CloseStoreMailInfoRequest { + @ApiModelProperty(value = "闭店申请ID", required = true) + @NotNull(message = "闭店申请ID不能为空") + private Long closeStoreId; + + @ApiModelProperty(value = "邮件单号", required = true) + @NotBlank(message = "邮件单号不能为空") + private String mailNumber; + + @ApiModelProperty("快递公司") + private String mailCompany; +} diff --git a/coolstore-partner-model/src/main/java/com/cool/store/request/close/refund/CloseStoreRefundAddRequest.java b/coolstore-partner-model/src/main/java/com/cool/store/request/close/refund/CloseStoreRefundAddRequest.java new file mode 100644 index 000000000..28c3bd644 --- /dev/null +++ b/coolstore-partner-model/src/main/java/com/cool/store/request/close/refund/CloseStoreRefundAddRequest.java @@ -0,0 +1,141 @@ +package com.cool.store.request.close.refund; + +import com.cool.store.dto.close.CloseStoreMkUserDTO; +import com.cool.store.entity.CloseStoreRefundInfoDO; +import com.cool.store.entity.StoreDO; +import com.cool.store.enums.master.StoreCloseReasonEnum; +import com.cool.store.request.xgj.XgjReimburseFeeRequest; +import com.cool.store.request.xgj.XgjReimburseRequest; +import com.cool.store.utils.CoolDateUtils; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +import javax.validation.constraints.NotBlank; +import javax.validation.constraints.NotNull; +import javax.validation.constraints.Pattern; +import java.math.BigDecimal; +import java.util.Collections; +import java.util.Date; + +/** + *

+ * 闭店退款新增Request + *

+ * + * @author wangff + * @since 2025/10/13 + */ +@Data +public class CloseStoreRefundAddRequest { + @ApiModelProperty("闭店申请id") + @NotNull(message = "闭店申请id不能为空") + private Long closeStoreId; + + @ApiModelProperty("退款类型") + @NotNull(message = "退款类型不能为空") + private Integer type; + + @ApiModelProperty("公司抬头,字典表close_store_invoice_title") + @NotBlank(message = "公司抬头") + private String invoiceTitle; + + @ApiModelProperty("提交人每刻工号") + private String submitterId; + + @ApiModelProperty("提交人名称") + private String submitterName; + + @ApiModelProperty("退款事由") + @NotBlank(message = "退款事由") + private String refundReason; + + @ApiModelProperty("退款类型,字典表编码close_store_refund_type") + @NotBlank(message = "退款类型不能为空") + private String refundType; + + @ApiModelProperty("其他说明") + private String remark; + + @ApiModelProperty("退款加盟商编码") + @NotBlank(message = "退款加盟商编码不能为空") + private String businessCode; + + @ApiModelProperty("退款加盟商名称") + @NotBlank(message = "退款加盟商名称不能为空") + private String businessName; + + @ApiModelProperty("退款加盟商收款账户") + @NotBlank(message = "退款加盟商收款账户不能为空") + private String businessAccount; + + @ApiModelProperty("退款项目,type=30固定为'加盟关店费用',type=40固定为'加盟关店贷款退款'") + @NotBlank(message = "退款项目不能为空") + private String refundProject; + + @ApiModelProperty("费用申请日期") + @NotNull(message = "费用申请日期不能为空") + private Date expenseApplyTime; + + @ApiModelProperty("费用类型code,测试环境目前写死'04.006'") + @NotBlank(message = "费用类型code不能为空") + private String expenseTypeCode; + + @ApiModelProperty("应退金额") + @NotNull(message = "应退金额不能为空") + private BigDecimal expectedAmount; + + @ApiModelProperty("实退金额") + @NotNull(message = "实退金额不能为空") + private BigDecimal actualAmount; + + @ApiModelProperty("扣款金额") + @NotNull(message = "扣款金额不能为空") + private BigDecimal deductAmount; + + @ApiModelProperty("扣款原因") + private String deductReason; + + @ApiModelProperty("银行账户") + @NotBlank(message = "银行账户不能为空") + private String accountNumber; + + @ApiModelProperty("开户行") + @NotBlank(message = "开户行不能为空") + private String bankName; + + @ApiModelProperty("联行号") + @NotBlank(message = "联行号不能为空") + private String bankBranchNo; + + public XgjReimburseRequest convertToXgjRequest(CloseStoreMkUserDTO mkUserDTO, Integer closeReason, StoreDO storeDO) { + StoreCloseReasonEnum closeReasonEnum = StoreCloseReasonEnum.getByCode(closeReason); + return XgjReimburseRequest.builder() + .legalEntity(invoiceTitle) + .coverUser(mkUserDTO.getJobnumber()) + .reimburseName(refundReason) + .cf175(refundType) + .cf176(refundProject) + .cf333(closeReasonEnum.getCloseNature().getDesc()) + .cf334(closeReasonEnum.getDesc()) + .cf177(storeDO.getStoreNum()) + .cf178(storeDO.getStoreName()) + .comments(remark) + .tradingPartner(businessCode) + .cf242("375|其他合法收入——资金退还") + .cf243("") + .bankAcctNumber(accountNumber) + .bankName(bankName) + .accountType("BANK") + .bankBranchNo(bankBranchNo) + .expenseList(Collections.singletonList( + XgjReimburseFeeRequest.builder() + .expenseTypeCode(expenseTypeCode) + .consumeAmount(expectedAmount) + .refundAmount(actualAmount) + .deductionAmount(deductAmount) + .consumeTime(CoolDateUtils.DateFormat(expenseApplyTime, "yyyy-MM-dd HH:mm:ss")) + .build() + )) + .build(); + } +} diff --git a/coolstore-partner-model/src/main/java/com/cool/store/request/close/refund/CloseStoreRefundQueryRequest.java b/coolstore-partner-model/src/main/java/com/cool/store/request/close/refund/CloseStoreRefundQueryRequest.java new file mode 100644 index 000000000..9092195a9 --- /dev/null +++ b/coolstore-partner-model/src/main/java/com/cool/store/request/close/refund/CloseStoreRefundQueryRequest.java @@ -0,0 +1,26 @@ +package com.cool.store.request.close.refund; + +import com.cool.store.common.PageBasicInfo; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +import javax.validation.constraints.NotNull; + +/** + *

+ * 闭店退款查询Request + *

+ * + * @author wangff + * @since 2025/12/2 + */ +@Data +public class CloseStoreRefundQueryRequest extends PageBasicInfo { + @ApiModelProperty("闭店申请id") + @NotNull(message = "闭店申请id不能为空") + private Long closeStoreId; + + @ApiModelProperty("退款类型,30/40") + @NotNull(message = "退款类型不能为空") + private Integer type; +} diff --git a/coolstore-partner-model/src/main/java/com/cool/store/request/close/refund/CloseStoreRefundSkipRequest.java b/coolstore-partner-model/src/main/java/com/cool/store/request/close/refund/CloseStoreRefundSkipRequest.java new file mode 100644 index 000000000..cadad4d37 --- /dev/null +++ b/coolstore-partner-model/src/main/java/com/cool/store/request/close/refund/CloseStoreRefundSkipRequest.java @@ -0,0 +1,21 @@ +package com.cool.store.request.close.refund; + +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +/** + *

+ * 退款流程跳过Request + *

+ * + * @author wangff + * @since 2025/12/3 + */ +@Data +public class CloseStoreRefundSkipRequest { + @ApiModelProperty("闭店申请id") + private Long closeStoreId; + + @ApiModelProperty("退款类型,30/40") + private Integer type; +} diff --git a/coolstore-partner-model/src/main/java/com/cool/store/request/close/refund/CloseStoreRefundUpdateRequest.java b/coolstore-partner-model/src/main/java/com/cool/store/request/close/refund/CloseStoreRefundUpdateRequest.java new file mode 100644 index 000000000..36dc140e4 --- /dev/null +++ b/coolstore-partner-model/src/main/java/com/cool/store/request/close/refund/CloseStoreRefundUpdateRequest.java @@ -0,0 +1,100 @@ +package com.cool.store.request.close.refund; + +import com.cool.store.dto.close.CloseStoreMkUserDTO; +import com.cool.store.entity.CloseStoreRefundInfoDO; +import com.cool.store.entity.StoreDO; +import com.cool.store.enums.master.StoreCloseReasonEnum; +import com.cool.store.request.xgj.XgjReimburseFeeRequest; +import com.cool.store.request.xgj.XgjReimburseRequest; +import com.cool.store.utils.CoolDateUtils; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +import javax.validation.constraints.NotBlank; +import javax.validation.constraints.NotNull; +import java.math.BigDecimal; +import java.util.Collections; +import java.util.Date; + +/** + *

+ * 闭店退款更新Request + *

+ * + * @author wangff + * @since 2025/10/13 + */ +@Data +public class CloseStoreRefundUpdateRequest { + @ApiModelProperty("退款记录id") + @NotNull(message = "退款记录id不能为空") + private Long id; + + @ApiModelProperty("闭店申请id") + @NotNull(message = "闭店申请id不能为空") + private Long closeStoreId; + + @ApiModelProperty("公司抬头,字典表close_store_invoice_title") + @NotBlank(message = "公司抬头") + private String invoiceTitle; + + @ApiModelProperty("提交人每刻工号") + private String submitterId; + + @ApiModelProperty("提交人名称") + private String submitterName; + + @ApiModelProperty("退款事由") + @NotBlank(message = "退款事由") + private String refundReason; + + @ApiModelProperty("退款类型,字典表编码close_store_refund_type") + @NotBlank(message = "退款类型不能为空") + private String refundType; + + @ApiModelProperty("其他说明") + private String remark; + + @ApiModelProperty("退款加盟商编码") + @NotBlank(message = "退款加盟商编码不能为空") + private String businessCode; + + @ApiModelProperty("退款加盟商名称") + @NotBlank(message = "退款加盟商名称不能为空") + private String businessName; + + @ApiModelProperty("费用申请日期") + @NotNull(message = "费用申请日期不能为空") + private Date expenseApplyTime; + + @ApiModelProperty("费用类型code,测试环境目前写死'04.006'") + @NotBlank(message = "费用类型code不能为空") + private String expenseTypeCode; + + @ApiModelProperty("应退金额") + @NotNull(message = "应退金额不能为空") + private BigDecimal expectedAmount; + + @ApiModelProperty("实退金额") + @NotNull(message = "实退金额不能为空") + private BigDecimal actualAmount; + + @ApiModelProperty("扣款金额") + @NotNull(message = "扣款金额不能为空") + private BigDecimal deductAmount; + + @ApiModelProperty("扣款原因") + private String deductReason; + + @ApiModelProperty("银行账户") + @NotBlank(message = "银行账户不能为空") + private String accountNumber; + + @ApiModelProperty("开户行") + @NotBlank(message = "开户行不能为空") + private String bankName; + + @ApiModelProperty("联行号") + @NotBlank(message = "联行号不能为空") + private String bankBranchNo; +} diff --git a/coolstore-partner-model/src/main/java/com/cool/store/request/close/store/CloseStoreApplyRequest.java b/coolstore-partner-model/src/main/java/com/cool/store/request/close/store/CloseStoreApplyRequest.java new file mode 100644 index 000000000..0185e93b8 --- /dev/null +++ b/coolstore-partner-model/src/main/java/com/cool/store/request/close/store/CloseStoreApplyRequest.java @@ -0,0 +1,42 @@ +package com.cool.store.request.close.store; + +import io.swagger.annotations.ApiModelProperty; +import lombok.AllArgsConstructor; +import lombok.Builder; +import lombok.Data; +import lombok.NoArgsConstructor; + +import javax.validation.constraints.NotBlank; +import javax.validation.constraints.NotNull; +import java.util.Date; + +/** + * @Author suzhuhong + * @Date 2025/9/23 15:57 + * @Version 1.0 + */ +@Data +@AllArgsConstructor +@NoArgsConstructor +@Builder +public class CloseStoreApplyRequest { + + @ApiModelProperty("计划关店时间") + @NotNull(message = "计划关店时间不能为空") + private Date planCloseDate; + + @ApiModelProperty("关店原因") + @NotNull(message = "闭店原因不能为空") + private Integer closeReason; + + @ApiModelProperty("闭店原因说明") + private String reasonDescription; + + @ApiModelProperty(value = "闭店发起方式", hidden = true) + private Integer closeType; + + @ApiModelProperty("门店id") + @NotBlank(message = "门店id不能为空") + private String storeId; + +} diff --git a/coolstore-partner-model/src/main/java/com/cool/store/request/close/store/CloseStoreAuditRequest.java b/coolstore-partner-model/src/main/java/com/cool/store/request/close/store/CloseStoreAuditRequest.java new file mode 100644 index 000000000..3c3a9f818 --- /dev/null +++ b/coolstore-partner-model/src/main/java/com/cool/store/request/close/store/CloseStoreAuditRequest.java @@ -0,0 +1,31 @@ +package com.cool.store.request.close.store; + +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +import javax.validation.constraints.NotNull; +import java.util.Date; + +/** + *

+ * 闭店申请审批Request + *

+ * + * @author wangff + * @since 2025/10/8 + */ +@Data +public class CloseStoreAuditRequest { + @ApiModelProperty("审批记录id") + @NotNull(message = "审批记录id不能为空") + private Long auditRecordId; + + @ApiModelProperty("审批意见") + private String remark; + + @ApiModelProperty("正式闭店时间") + private Date actualCloseData; + + @ApiModelProperty("闭店原因") + private Integer closeReason; +} diff --git a/coolstore-partner-model/src/main/java/com/cool/store/request/close/store/CloseStoreCancelRequest.java b/coolstore-partner-model/src/main/java/com/cool/store/request/close/store/CloseStoreCancelRequest.java new file mode 100644 index 000000000..5d479d15e --- /dev/null +++ b/coolstore-partner-model/src/main/java/com/cool/store/request/close/store/CloseStoreCancelRequest.java @@ -0,0 +1,21 @@ +package com.cool.store.request.close.store; + +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +import javax.validation.constraints.NotNull; + +/** + *

+ * 取消闭店申请Request + *

+ * + * @author wangff + * @since 2025/11/13 + */ +@Data +public class CloseStoreCancelRequest { + @ApiModelProperty("闭店申请id") + @NotNull(message = "闭店申请id不能为空") + private Long closeStoreId; +} diff --git a/coolstore-partner-model/src/main/java/com/cool/store/request/close/store/CloseStoreQueryRequest.java b/coolstore-partner-model/src/main/java/com/cool/store/request/close/store/CloseStoreQueryRequest.java new file mode 100644 index 000000000..0dd5360d9 --- /dev/null +++ b/coolstore-partner-model/src/main/java/com/cool/store/request/close/store/CloseStoreQueryRequest.java @@ -0,0 +1,51 @@ +package com.cool.store.request.close.store; + +import com.cool.store.common.PageBasicInfo; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +import java.util.List; + +/** + *

+ * 闭店申请查询Request + *

+ * + * @author wangff + * @since 2025/10/9 + */ +@Data +public class CloseStoreQueryRequest extends PageBasicInfo { + @ApiModelProperty("审核状态 0待处理,1通过,2拒绝") + private Integer auditStatus; + + @ApiModelProperty("门店名称/编号") + private String storeNameOrNum; + + @ApiModelProperty("所属品牌,逗号隔开") + private String joinBrandList; + + @ApiModelProperty("签约人姓名") + private String signerName; + + @ApiModelProperty("签约人电话") + private String signerMobile; + + @ApiModelProperty("闭店发起方式 1-主动发起 2-云流水发起") + private Integer closeType; + + @ApiModelProperty("闭店状态") + private Integer closeStatus; + + @ApiModelProperty("闭店申请单号") + private String closeStoreNo; + + @ApiModelProperty(value = "是否查询store表", hidden = true) + private Boolean queryStore = false; + + @ApiModelProperty(value = "是否查询signer表", hidden = true) + private Boolean querySigner = false; + + @ApiModelProperty(value = "所属品牌列表", hidden = true) + private List joinBrands; +} diff --git a/coolstore-partner-model/src/main/java/com/cool/store/request/close/store/MiniCloseStoreQueryRequest.java b/coolstore-partner-model/src/main/java/com/cool/store/request/close/store/MiniCloseStoreQueryRequest.java new file mode 100644 index 000000000..2f2e54209 --- /dev/null +++ b/coolstore-partner-model/src/main/java/com/cool/store/request/close/store/MiniCloseStoreQueryRequest.java @@ -0,0 +1,19 @@ +package com.cool.store.request.close.store; + +import com.cool.store.common.PageBasicInfo; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +/** + *

+ * mini闭店申请查询Request + *

+ * + * @author wangff + * @since 2025/10/9 + */ +@Data +public class MiniCloseStoreQueryRequest extends PageBasicInfo { + @ApiModelProperty("门店id") + private String storeId; +} diff --git a/coolstore-partner-model/src/main/java/com/cool/store/request/close/store/ReCloseStoreApplyRequest.java b/coolstore-partner-model/src/main/java/com/cool/store/request/close/store/ReCloseStoreApplyRequest.java new file mode 100644 index 000000000..31352da5d --- /dev/null +++ b/coolstore-partner-model/src/main/java/com/cool/store/request/close/store/ReCloseStoreApplyRequest.java @@ -0,0 +1,18 @@ +package com.cool.store.request.close.store; + +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +/** + * @Author suzhuhong + * @Date 2025/9/24 10:18 + * @Version 1.0 + */ +@Data +public class ReCloseStoreApplyRequest { + + @ApiModelProperty("闭店信息ID") + private Long closeStoreId; + + +} diff --git a/coolstore-partner-model/src/main/java/com/cool/store/request/close/store/ThirdCloseStoreApplyRequest.java b/coolstore-partner-model/src/main/java/com/cool/store/request/close/store/ThirdCloseStoreApplyRequest.java new file mode 100644 index 000000000..d2f5704f0 --- /dev/null +++ b/coolstore-partner-model/src/main/java/com/cool/store/request/close/store/ThirdCloseStoreApplyRequest.java @@ -0,0 +1,47 @@ +package com.cool.store.request.close.store; + +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +import javax.validation.constraints.NotBlank; +import javax.validation.constraints.NotNull; +import java.util.Date; + +/** + *

+ * 三方闭店申请Request + *

+ * + * @author wangff + * @since 2025/10/23 + */ +@Data +public class ThirdCloseStoreApplyRequest { + @ApiModelProperty("计划关店时间") + @NotNull(message = "计划关店时间不能为空") + private Date planCloseDate; + + @ApiModelProperty("关店原因") + @NotNull(message = "闭店原因不能为空") + private Integer closeReason; + + @ApiModelProperty("闭店原因说明") + private String reasonDescription; + + @ApiModelProperty("门店编码") + @NotBlank(message = "门店编码不能为空") + private String storeNum; + + @ApiModelProperty(value = "闭店发起方式", hidden = true) + private Integer closeType; + + public CloseStoreApplyRequest convert(String storeId) { + return CloseStoreApplyRequest.builder() + .planCloseDate(planCloseDate) + .closeReason(closeReason) + .reasonDescription(reasonDescription) + .storeId(storeId) + .closeType(closeType) + .build(); + } +} diff --git a/coolstore-partner-model/src/main/java/com/cool/store/request/huoma/AccountCloseRequest.java b/coolstore-partner-model/src/main/java/com/cool/store/request/huoma/AccountCloseRequest.java new file mode 100644 index 000000000..0685d282e --- /dev/null +++ b/coolstore-partner-model/src/main/java/com/cool/store/request/huoma/AccountCloseRequest.java @@ -0,0 +1,24 @@ +package com.cool.store.request.huoma; + +import lombok.Data; + +/** + *

+ * 火码账号关闭Request + *

+ * + * @author wangff + * @since 2025/11/5 + */ +@Data +public class AccountCloseRequest { + /** + * 门店编码 + */ + private String shop_sn; + + /** + * 门店开关 0关店 1开店 + */ + private Integer enable; +} diff --git a/coolstore-partner-model/src/main/java/com/cool/store/request/xgj/XgjAccountCloseRequest.java b/coolstore-partner-model/src/main/java/com/cool/store/request/xgj/XgjAccountCloseRequest.java new file mode 100644 index 000000000..4f6370e77 --- /dev/null +++ b/coolstore-partner-model/src/main/java/com/cool/store/request/xgj/XgjAccountCloseRequest.java @@ -0,0 +1,25 @@ +package com.cool.store.request.xgj; + +import io.swagger.annotations.ApiModelProperty; +import lombok.AllArgsConstructor; +import lombok.Data; +import lombok.NoArgsConstructor; + +/** + *

+ * 新管家账号关闭Request + *

+ * + * @author wangff + * @since 2025/11/27 + */ +@Data +@AllArgsConstructor +@NoArgsConstructor +public class XgjAccountCloseRequest { + @ApiModelProperty("门店编码") + private String storeCode; + + @ApiModelProperty("关店时间,yyyy-MM-dd HH:mm:ss") + private String closeTime; +} diff --git a/coolstore-partner-model/src/main/java/com/cool/store/request/xgj/XgjBankQueryRequest.java b/coolstore-partner-model/src/main/java/com/cool/store/request/xgj/XgjBankQueryRequest.java new file mode 100644 index 000000000..14b261d1a --- /dev/null +++ b/coolstore-partner-model/src/main/java/com/cool/store/request/xgj/XgjBankQueryRequest.java @@ -0,0 +1,18 @@ +package com.cool.store.request.xgj; + +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +/** + *

+ * 新管家支行查询Request + *

+ * + * @author wangff + * @since 2025/12/1 + */ +@Data +public class XgjBankQueryRequest { + @ApiModelProperty("支行行名") + private String openBankName; +} diff --git a/coolstore-partner-model/src/main/java/com/cool/store/request/xgj/XgjPartnerAccountRequest.java b/coolstore-partner-model/src/main/java/com/cool/store/request/xgj/XgjPartnerAccountRequest.java new file mode 100644 index 000000000..87ee14d04 --- /dev/null +++ b/coolstore-partner-model/src/main/java/com/cool/store/request/xgj/XgjPartnerAccountRequest.java @@ -0,0 +1,30 @@ +package com.cool.store.request.xgj; + +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +/** + *

+ * 新管家供应商账户信息Request + *

+ * + * @author wangff + * @since 2025/11/28 + */ +@Data +public class XgjPartnerAccountRequest { + @ApiModelProperty("账户名称") + private String accountName; + + @ApiModelProperty("银行账号") + private String accountNumber; + + @ApiModelProperty("开户银行") + private String bankName; + + @ApiModelProperty("开户支行号") + private String bankBranchNo; + + @ApiModelProperty("账户类型") + private String accountType; +} diff --git a/coolstore-partner-model/src/main/java/com/cool/store/request/xgj/XgjPartnerQueryRequest.java b/coolstore-partner-model/src/main/java/com/cool/store/request/xgj/XgjPartnerQueryRequest.java new file mode 100644 index 000000000..f8bd953ae --- /dev/null +++ b/coolstore-partner-model/src/main/java/com/cool/store/request/xgj/XgjPartnerQueryRequest.java @@ -0,0 +1,38 @@ +package com.cool.store.request.xgj; + +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +import java.util.List; + +/** + *

+ * 新管家往来单位查询Request + *

+ * + * @author wangff + * @since 2025/11/28 + */ +@Data +public class XgjPartnerQueryRequest { + @ApiModelProperty("查询开始(创建/更新)时间戳(包含、秒级)") + private Long startTime; + + @ApiModelProperty("查询结束时间戳") + private Long endTime; + + @ApiModelProperty("分页序号(默认为1)") + private Integer pageNo; + + @ApiModelProperty("分页大小(默认50,上限150)") + private Integer pageSize; + + @ApiModelProperty("往来单位编码") + private List bizCodes; + + @ApiModelProperty("分类的业务编码") + private String parentBizCode; + + @ApiModelProperty("往来单位编码/名字") + private String keyword; +} diff --git a/coolstore-partner-model/src/main/java/com/cool/store/request/xgj/XgjPaymentRequest.java b/coolstore-partner-model/src/main/java/com/cool/store/request/xgj/XgjPaymentRequest.java new file mode 100644 index 000000000..d0653a8b3 --- /dev/null +++ b/coolstore-partner-model/src/main/java/com/cool/store/request/xgj/XgjPaymentRequest.java @@ -0,0 +1,22 @@ +package com.cool.store.request.xgj; + +import io.swagger.annotations.ApiModelProperty; +import lombok.AllArgsConstructor; +import lombok.Data; +import lombok.NoArgsConstructor; + +/** + *

+ * 新管家获取单据支付结果Request + *

+ * + * @author wangff + * @since 2025/11/28 + */ +@Data +@AllArgsConstructor +@NoArgsConstructor +public class XgjPaymentRequest { + @ApiModelProperty("每刻单号") + private String outNo; +} diff --git a/coolstore-partner-model/src/main/java/com/cool/store/request/xgj/XgjReimburseFeeRequest.java b/coolstore-partner-model/src/main/java/com/cool/store/request/xgj/XgjReimburseFeeRequest.java new file mode 100644 index 000000000..8e432fef3 --- /dev/null +++ b/coolstore-partner-model/src/main/java/com/cool/store/request/xgj/XgjReimburseFeeRequest.java @@ -0,0 +1,41 @@ +package com.cool.store.request.xgj; + +import io.swagger.annotations.ApiModelProperty; +import lombok.AllArgsConstructor; +import lombok.Builder; +import lombok.Data; +import lombok.NoArgsConstructor; + +import java.math.BigDecimal; + +/** + *

+ * 新管家报销单费用明细Request + *

+ * + * @author wangff + * @since 2025/11/28 + */ +@Data +@AllArgsConstructor +@NoArgsConstructor +@Builder +public class XgjReimburseFeeRequest { + @ApiModelProperty(value = "费用类型编码", required = true) + private String expenseTypeCode; + + @ApiModelProperty(value = "应退金额", required = true) + private BigDecimal consumeAmount; + + @ApiModelProperty(value = "实退金额", required = true) + private BigDecimal refundAmount; + + @ApiModelProperty(value = "扣款金额", required = true) + private BigDecimal deductionAmount; + + @ApiModelProperty(value = "消费时间,yyyy-MM-dd HH:mm:ss", required = true) + private String consumeTime; + + @ApiModelProperty(value = "备注说明", required = false) + private String comments; +} diff --git a/coolstore-partner-model/src/main/java/com/cool/store/request/xgj/XgjReimburseRequest.java b/coolstore-partner-model/src/main/java/com/cool/store/request/xgj/XgjReimburseRequest.java new file mode 100644 index 000000000..f36d5d902 --- /dev/null +++ b/coolstore-partner-model/src/main/java/com/cool/store/request/xgj/XgjReimburseRequest.java @@ -0,0 +1,109 @@ +package com.cool.store.request.xgj; + +import com.alibaba.fastjson.annotation.JSONField; +import com.cool.store.utils.UUIDUtils; +import com.fasterxml.jackson.annotation.JsonProperty; +import io.swagger.annotations.ApiModelProperty; +import lombok.AllArgsConstructor; +import lombok.Builder; +import lombok.Data; +import lombok.NoArgsConstructor; + +import java.util.List; + +/** + *

+ * 新管家报销单Request + *

+ * + * @author wangff + * @since 2025/11/28 + */ +@Data +@AllArgsConstructor +@NoArgsConstructor +@Builder +public class XgjReimburseRequest { + + @ApiModelProperty("公司抬头") + private String legalEntity; + + @ApiModelProperty("提交人(编码)") + private String coverUser; + + @ApiModelProperty("退款事由") + private String reimburseName; + + @ApiModelProperty("退款类型(填提供的中文选项)") + @JsonProperty("CF175") + @JSONField(name = "CF175") + private String cf175; + + @ApiModelProperty("退款项目(填提供的中文选项)") + @JsonProperty("CF176") + @JSONField(name = "CF176") + private String cf176; + + @ApiModelProperty("关店分类(填提供的中文选项)") + @JsonProperty("CF333") + @JSONField(name = "CF333") + private String cf333; + + @ApiModelProperty("关店原因1(填提供的中文选项),管理要求闭店时填写") + @JsonProperty("CF334") + @JSONField(name = "CF334") + private String cf334; + + @ApiModelProperty("关店原因2(填提供的中文选项),加盟商自行闭店时填写") + @JsonProperty("CF335") + @JSONField(name = "CF335") + private String cf335; + + @ApiModelProperty("门店编码") + @JsonProperty("CF177") + @JSONField(name = "CF177") + private String cf177; + + @ApiModelProperty("门店名称") + @JsonProperty("CF178") + @JSONField(name = "CF178") + private String cf178; + + @ApiModelProperty("其他说明") + private String comments; + + @ApiModelProperty("退款加盟商编码") + private String tradingPartner; + + @ApiModelProperty("汇款用途(填提供的中文选项)") + @JsonProperty("CF242") + @JSONField(name = "CF242") + private String cf242; + + @ApiModelProperty("汇款备注(填提供的中文选项)") + @JsonProperty("CF243") + @JSONField(name = "CF243") + private String cf243; + + @ApiModelProperty("账户名") + private String bankAcctName; + + @ApiModelProperty("银行账户") + private String bankAcctNumber; + + @ApiModelProperty("开户行") + private String bankName; + + @ApiModelProperty("收款账户类型") + private String accountType; + + @ApiModelProperty("联行号") + private String bankBranchNo; + + @ApiModelProperty("费用明细") + private List expenseList; + + public static void main(String[] args) { + System.out.println(UUIDUtils.get32UUID()); + } +} diff --git a/coolstore-partner-model/src/main/java/com/cool/store/request/xgj/XgjSavePartnerRequest.java b/coolstore-partner-model/src/main/java/com/cool/store/request/xgj/XgjSavePartnerRequest.java new file mode 100644 index 000000000..def60728d --- /dev/null +++ b/coolstore-partner-model/src/main/java/com/cool/store/request/xgj/XgjSavePartnerRequest.java @@ -0,0 +1,40 @@ +package com.cool.store.request.xgj; + +import com.cool.store.utils.UUIDUtils; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +import java.util.List; + +/** + *

+ * 新管家同步供应商Request + *

+ * + * @author wangff + * @since 2025/11/28 + */ +@Data +public class XgjSavePartnerRequest { + @ApiModelProperty("往来单位名称") + private String name; + + @ApiModelProperty("往来单位编码") + private String businessCode; + + @ApiModelProperty("所属分类") + private String parentName; + + @ApiModelProperty("所属分类编码") + private String parentBizCode; + + @ApiModelProperty("往来关系") + private String partnerType; + + @ApiModelProperty("往来性质") + private String partnerProperty; + + @ApiModelProperty("往来单位账户列表") + private List accounts; +} + diff --git a/coolstore-partner-model/src/main/java/com/cool/store/vo/close/account/CloseStoreAccountVO.java b/coolstore-partner-model/src/main/java/com/cool/store/vo/close/account/CloseStoreAccountVO.java new file mode 100644 index 000000000..6fbc26241 --- /dev/null +++ b/coolstore-partner-model/src/main/java/com/cool/store/vo/close/account/CloseStoreAccountVO.java @@ -0,0 +1,41 @@ +package com.cool.store.vo.close.account; + +import com.cool.store.enums.close.CloseStoreAccountTypeEnum; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +/** + *

+ * 闭店账号VO + *

+ * + * @author wangff + * @since 2025/10/8 + */ +@Data +public class CloseStoreAccountVO { + @ApiModelProperty("id") + private Long id; + + @ApiModelProperty("账号名称") + private String systemName; + + @ApiModelProperty("系统code") + private String systemCode; + + @ApiModelProperty("账号分类,0-IT账号,1-外卖账号") + private Integer accountType; + + @ApiModelProperty("账号分类") + private String accountTypeName; + + @ApiModelProperty("账号状态,1-使用中, 2-已关闭, 3-关闭中") + private Integer status; + + @ApiModelProperty("关闭类型,0直接关闭,1申请关闭") + private Integer closeType; + + public String getAccountTypeName() { + return CloseStoreAccountTypeEnum.getMsgByType(accountType); + } +} diff --git a/coolstore-partner-model/src/main/java/com/cool/store/vo/close/file/CloseStoreFileDetailMiniVO.java b/coolstore-partner-model/src/main/java/com/cool/store/vo/close/file/CloseStoreFileDetailMiniVO.java new file mode 100644 index 000000000..de4e09003 --- /dev/null +++ b/coolstore-partner-model/src/main/java/com/cool/store/vo/close/file/CloseStoreFileDetailMiniVO.java @@ -0,0 +1,45 @@ +package com.cool.store.vo.close.file; + +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +import java.util.List; + +/** + *

+ * 小程序闭店资料详情VO + *

+ * + * @author wangff + * @since 2025/10/7 + */ +@Data +public class CloseStoreFileDetailMiniVO { + + @ApiModelProperty("闭店申请id") + private Long closeStoreId; + + @ApiModelProperty("邮件单号") + private String mailNumber; + + @ApiModelProperty("邮件状态,0未邮寄,1已邮寄") + private Integer mailStatus; + + @ApiModelProperty("快递公司") + private String mailCompany; + + @ApiModelProperty("材料邮寄地址") + private String mailAddress; + + @ApiModelProperty("收件人") + private String mailAddressee; + + @ApiModelProperty("收件人手机号") + private String mailMobile; + + @ApiModelProperty("材料信息列表") + private List fileList; + + @ApiModelProperty("督导审批意见") + private String remark; +} diff --git a/coolstore-partner-model/src/main/java/com/cool/store/vo/close/file/CloseStoreFileDetailVO.java b/coolstore-partner-model/src/main/java/com/cool/store/vo/close/file/CloseStoreFileDetailVO.java new file mode 100644 index 000000000..55604f868 --- /dev/null +++ b/coolstore-partner-model/src/main/java/com/cool/store/vo/close/file/CloseStoreFileDetailVO.java @@ -0,0 +1,54 @@ +package com.cool.store.vo.close.file; + +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +import java.util.List; + +/** + *

+ * 闭店资料详情VO + *

+ * + * @author wangff + * @since 2025/10/7 + */ +@Data +public class CloseStoreFileDetailVO { + + @ApiModelProperty("闭店申请id") + private Long closeStoreId; + + @ApiModelProperty("邮件单号") + private String mailNumber; + + @ApiModelProperty("邮件状态,0未邮寄,1已邮寄") + private Integer mailStatus; + + @ApiModelProperty("快递公司") + private String mailCompany; + + @ApiModelProperty("材料邮寄地址") + private String mailAddress; + + @ApiModelProperty("收件人") + private String mailAddressee; + + @ApiModelProperty("收件人手机号") + private String mailMobile; + + @ApiModelProperty("材料信息列表") + private List fileList; + + @ApiModelProperty("户名") + private String bankAccount; + + @ApiModelProperty("开户行") + private String bankOpening; + + @ApiModelProperty("退款账号") + private String refundAccount; + + @ApiModelProperty("督导审批意见") + private String remark; +} diff --git a/coolstore-partner-model/src/main/java/com/cool/store/vo/close/file/CloseStoreFileInfoMiniVO.java b/coolstore-partner-model/src/main/java/com/cool/store/vo/close/file/CloseStoreFileInfoMiniVO.java new file mode 100644 index 000000000..93dd1ac58 --- /dev/null +++ b/coolstore-partner-model/src/main/java/com/cool/store/vo/close/file/CloseStoreFileInfoMiniVO.java @@ -0,0 +1,47 @@ +package com.cool.store.vo.close.file; + +import com.cool.store.enums.close.FileStatusEnum; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +/** + *

+ * 小程序闭店材料信息VO + *

+ * + * @author wangff + * @since 2025/10/7 + */ +@Data +public class CloseStoreFileInfoMiniVO { + @ApiModelProperty("id") + private Long id; + + @ApiModelProperty("资料code") + private String fileCode; + + @ApiModelProperty("资料名称") + private String fileName; + + @ApiModelProperty("材料审批状态 1-合格 2-不合格") + private Integer approveStatus; + + @ApiModelProperty("材料状态 0-未上传 1-合格 2-不合格 3-已上传 4-审批中 5-已修改") + private Integer fileStatus; + + @ApiModelProperty("材料状态") + private String fileStatusName; + + @ApiModelProperty("审批意见") + private String approveOpinion; + + @ApiModelProperty("模板链接") + private String templateUrl; + + @ApiModelProperty("图片列表") + private String urls; + + public String getFileStatusName() { + return FileStatusEnum.getDescByStatus(this.fileStatus); + } +} diff --git a/coolstore-partner-model/src/main/java/com/cool/store/vo/close/file/CloseStoreFileInfoVO.java b/coolstore-partner-model/src/main/java/com/cool/store/vo/close/file/CloseStoreFileInfoVO.java new file mode 100644 index 000000000..7a3985304 --- /dev/null +++ b/coolstore-partner-model/src/main/java/com/cool/store/vo/close/file/CloseStoreFileInfoVO.java @@ -0,0 +1,39 @@ +package com.cool.store.vo.close.file; + +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +/** + *

+ * 闭店材料信息VO + *

+ * + * @author wangff + * @since 2025/10/7 + */ +@Data +public class CloseStoreFileInfoVO { + @ApiModelProperty("id") + private Long id; + + @ApiModelProperty("资料code") + private String fileCode; + + @ApiModelProperty("资料名称") + private String fileName; + + @ApiModelProperty("邮件状态 0-未邮寄 1已邮寄") + private Integer mailStatus; + + @ApiModelProperty("材料审批状态 1-合格 2-不合格") + private Integer approveStatus; + + @ApiModelProperty("材料状态 0-未上传 1-合格 2-不合格 3-已上传 4-审批中 5-已修改") + private Integer fileStatus; + + @ApiModelProperty("审批意见") + private String approveOpinion; + + @ApiModelProperty("图片列表") + private String urls; +} diff --git a/coolstore-partner-model/src/main/java/com/cool/store/vo/close/refund/CloseStoreRefundDetailVO.java b/coolstore-partner-model/src/main/java/com/cool/store/vo/close/refund/CloseStoreRefundDetailVO.java new file mode 100644 index 000000000..520c60837 --- /dev/null +++ b/coolstore-partner-model/src/main/java/com/cool/store/vo/close/refund/CloseStoreRefundDetailVO.java @@ -0,0 +1,138 @@ +package com.cool.store.vo.close.refund; + +import com.cool.store.annotation.DictField; +import com.cool.store.enums.close.RefundPayStatusEnum; +import com.cool.store.enums.master.StoreCloseReasonEnum; +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/10/13 + */ +@Data +public class CloseStoreRefundDetailVO { + // ===== 单据信息 ===== + @ApiModelProperty("退款单id") + private Long id; + + @ApiModelProperty("闭店申请id") + private Long closeStoreId; + + @ApiModelProperty("退款申请单号") + private String refundNo; + + @ApiModelProperty("退款类型(闭店子阶段code)") + private Integer type; + + @ApiModelProperty("退款状态") + private String refundStatus; + + @ApiModelProperty("退款状态名称") + @DictField + private String refundStatusName; + + @ApiModelProperty("每刻退款单号") + private String refundOrderNo; + + @ApiModelProperty("退款时间") + private Date refundTime; + + // ===== 基础信息 ===== + @ApiModelProperty("公司抬头") + private String invoiceTitle; + + @ApiModelProperty("公司抬头名称") + @DictField + private String invoiceTitleName; + + @ApiModelProperty("提交人id") + private String submitterId; + + @ApiModelProperty("提交人名称") + private String submitterName; + + // ===== 闭店信息 ===== + @ApiModelProperty("关店原因") + private Integer closeReason; + + @ApiModelProperty("关店原因名称") + private String closeReasonName; + + @ApiModelProperty("关店分类名称") + private String closeNatureName; + + // ===== 退款信息 ===== + @ApiModelProperty("退款事由") + private String refundReason; + + @ApiModelProperty("退款类型") + private String refundType; + + @ApiModelProperty("退款类型") + private String refundTypeName; + + @ApiModelProperty("退款项目") + private String refundProject; + + @ApiModelProperty("其他说明") + private String remark; + + @ApiModelProperty("退款加盟商编码") + private String businessCode; + + @ApiModelProperty("退款加盟商名称") + private String businessName; + + @ApiModelProperty("退款加盟商收款账户") + private String businessAccount; + + // ===== 费用信息 ===== + @ApiModelProperty("费用类型code") + private String expenseTypeCode; + + @ApiModelProperty("费用申请日期") + private Date expenseApplyTime; + + @ApiModelProperty("应退金额") + private BigDecimal expectedAmount; + + @ApiModelProperty("实退金额") + private BigDecimal actualAmount; + + @ApiModelProperty("扣款金额") + private BigDecimal deductAmount; + + @ApiModelProperty("扣款原因") + private String deductReason; + + @ApiModelProperty("银行账户") + private String accountNumber; + + @ApiModelProperty("开户行") + private String bankName; + + @ApiModelProperty("联行号") + private String bankBranchNo; + + public String getRefundStatusName() { + return RefundPayStatusEnum.getDescByStatus(refundStatus); + } + + public String getCloseNatureName() { + StoreCloseReasonEnum closeReasonEnum = StoreCloseReasonEnum.getByCode(closeReason); + return Objects.nonNull(closeReasonEnum) ? closeReasonEnum.getCloseNature().getDesc() : ""; + } + + public String getCloseReasonName() { + return StoreCloseReasonEnum.getDescByCode(closeReason); + } +} diff --git a/coolstore-partner-model/src/main/java/com/cool/store/vo/close/refund/CloseStoreRefundListVO.java b/coolstore-partner-model/src/main/java/com/cool/store/vo/close/refund/CloseStoreRefundListVO.java new file mode 100644 index 000000000..055b35c3a --- /dev/null +++ b/coolstore-partner-model/src/main/java/com/cool/store/vo/close/refund/CloseStoreRefundListVO.java @@ -0,0 +1,46 @@ +package com.cool.store.vo.close.refund; + +import com.cool.store.enums.close.RefundPayStatusEnum; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +import java.util.Date; + +/** + *

+ * 闭店退款列表VO + *

+ * + * @author wangff + * @since 2025/12/2 + */ +@Data +public class CloseStoreRefundListVO { + @ApiModelProperty("id") + private Long id; + + @ApiModelProperty("退款申请单号") + private String refundNo; + + @ApiModelProperty("退款状态") + private String refundStatus; + + @ApiModelProperty("退款状态名称") + private String refundStatusName; + + @ApiModelProperty("每刻退款单号") + private String refundOrderNo; + + @ApiModelProperty("退款时间") + private Date refundTime; + + @ApiModelProperty("退款加盟商名称") + private String businessName; + + @ApiModelProperty("退款加盟商收款账户") + private String businessAccount; + + public String getRefundStatusName() { + return RefundPayStatusEnum.getDescByStatus(this.refundStatus); + } +} diff --git a/coolstore-partner-model/src/main/java/com/cool/store/vo/close/refund/CloseStoreRefundSimpleVO.java b/coolstore-partner-model/src/main/java/com/cool/store/vo/close/refund/CloseStoreRefundSimpleVO.java new file mode 100644 index 000000000..5f481e8f2 --- /dev/null +++ b/coolstore-partner-model/src/main/java/com/cool/store/vo/close/refund/CloseStoreRefundSimpleVO.java @@ -0,0 +1,45 @@ +package com.cool.store.vo.close.refund; + +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +import java.math.BigDecimal; +import java.util.Date; + +/** + *

+ * 闭店退款简单信息VO + *

+ * + * @author wangff + * @since 2025/10/13 + */ +@Data +public class CloseStoreRefundSimpleVO { + @ApiModelProperty("id") + private Long id; + + @ApiModelProperty("退款类型(闭店子阶段code)") + private Integer type; + + @ApiModelProperty("闭店申请id") + private Long closeStoreId; + + @ApiModelProperty("退款申请单号") + private String refundNo; + + @ApiModelProperty("每刻退款单号") + private String refundOrderNo; + + @ApiModelProperty("退款项目") + private String refundProject; + + @ApiModelProperty("退款状态") + private String refundStatus; + + @ApiModelProperty("退款时间") + private Date refundTime; + + @ApiModelProperty("应退金额") + private BigDecimal expectedAmount; +} diff --git a/coolstore-partner-model/src/main/java/com/cool/store/vo/close/store/CloseStoreAuditRecordVO.java b/coolstore-partner-model/src/main/java/com/cool/store/vo/close/store/CloseStoreAuditRecordVO.java new file mode 100644 index 000000000..15a7bdba0 --- /dev/null +++ b/coolstore-partner-model/src/main/java/com/cool/store/vo/close/store/CloseStoreAuditRecordVO.java @@ -0,0 +1,30 @@ +package com.cool.store.vo.close.store; + +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +import java.util.Date; + +/** + *

+ * 审批记录VO + *

+ * + * @author wangff + * @since 2025/10/9 + */ +@Data +public class CloseStoreAuditRecordVO { + + @ApiModelProperty("实际处理人名称") + private String handlerUserName; + + @ApiModelProperty("完成任务时间") + private Date finishTaskTime; + + @ApiModelProperty("审核状态 0待处理,1通过,2拒绝") + private Integer auditStatus; + + @ApiModelProperty("备注") + private String actionRemark; +} diff --git a/coolstore-partner-model/src/main/java/com/cool/store/vo/close/store/CloseStoreInfoDetailVO.java b/coolstore-partner-model/src/main/java/com/cool/store/vo/close/store/CloseStoreInfoDetailVO.java new file mode 100644 index 000000000..c64c7d2b4 --- /dev/null +++ b/coolstore-partner-model/src/main/java/com/cool/store/vo/close/store/CloseStoreInfoDetailVO.java @@ -0,0 +1,96 @@ +package com.cool.store.vo.close.store; + +import com.cool.store.enums.close.CloseStoreStatusEnum; +import com.cool.store.enums.master.BrandTypeEnum; +import com.cool.store.enums.master.StoreCloseReasonEnum; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +import java.util.Date; + +/** + *

+ * 闭店申请详情VO + *

+ * + * @author wangff + * @since 2025/10/9 + */ +@Data +public class CloseStoreInfoDetailVO { + @ApiModelProperty("闭店申请id") + private Long id; + + @ApiModelProperty("审批记录id") + private Long auditId; + + @ApiModelProperty("闭店申请单号") + private String closeStoreNo; + + @ApiModelProperty("门店id") + private String storeId; + + @ApiModelProperty("门店名称") + private String storeName; + + @ApiModelProperty("门店编号") + private String storeNum; + + @ApiModelProperty("所属品牌") + private Integer joinBrand; + + @ApiModelProperty("所属品牌名称") + private Integer joinBrandName; + + @ApiModelProperty("详细地址") + private String storeAddress; + + @ApiModelProperty("签约人1姓名") + private String signer1Name; + + @ApiModelProperty("签约人1手机号") + private String signer1Mobile; + + @ApiModelProperty("签约人2姓名") + private String signer2Name; + + @ApiModelProperty("签约人2手机号") + private String signer2Mobile; + + @ApiModelProperty("计划闭店时间") + private Date planCloseData; + + @ApiModelProperty("正式闭店时间") + private Date actualCloseData; + + @ApiModelProperty("闭店发起方式 1-主动发起 2-云流水发起") + private Integer closeType; + + @ApiModelProperty("闭店原因") + private Integer closeReason; + + @ApiModelProperty("闭店原因名称") + private String closeReasonName; + + @ApiModelProperty("闭店原因说明") + private String reasonDescription; + + @ApiModelProperty("闭店状态") + private Integer closeStatus; + + @ApiModelProperty("闭店状态名称") + private String closeStatusName; + + + public String getCloseStatusName() { + return CloseStoreStatusEnum.getNameByStatus(closeStatus); + } + + public String getJoinBrandName() { + return BrandTypeEnum.getDescByCode(joinBrand); + } + + public String getCloseReasonName() { + return StoreCloseReasonEnum.getDescByCode(closeReason); + } +} diff --git a/coolstore-partner-model/src/main/java/com/cool/store/vo/close/store/CloseStoreInfoListVO.java b/coolstore-partner-model/src/main/java/com/cool/store/vo/close/store/CloseStoreInfoListVO.java new file mode 100644 index 000000000..198522069 --- /dev/null +++ b/coolstore-partner-model/src/main/java/com/cool/store/vo/close/store/CloseStoreInfoListVO.java @@ -0,0 +1,85 @@ +package com.cool.store.vo.close.store; + +import com.cool.store.enums.close.CloseStoreStatusEnum; +import com.cool.store.enums.master.BrandTypeEnum; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +import java.util.Date; + +/** + *

+ * 闭店申请记录列表VO + *

+ * + * @author wangff + * @since 2025/10/9 + */ +@Data +public class CloseStoreInfoListVO { + @ApiModelProperty("审批记录id") + private Long auditRecordId; + + @ApiModelProperty("闭店申请id") + private Long closeStoreId; + + @ApiModelProperty("闭店申请单号") + private String closeStoreNo; + + @ApiModelProperty("门店id") + private String storeId; + + @ApiModelProperty("门店名称") + private String storeName; + + @ApiModelProperty("门店编号") + private String storeNum; + + @ApiModelProperty("所属品牌") + private Integer joinBrand; + + @ApiModelProperty("所属品牌名称") + private String joinBrandName; + + @ApiModelProperty("详细地址") + private String storeAddress; + + @ApiModelProperty("签约人1姓名") + private String signer1Name; + + @ApiModelProperty("签约人1手机号") + private String signer1Mobile; + + @ApiModelProperty("签约人2姓名") + private String signer2Name; + + @ApiModelProperty("签约人2手机号") + private String signer2Mobile; + + @ApiModelProperty("计划闭店时间") + private Date planCloseData; + + @ApiModelProperty("闭店发起方式 1-主动发起 2-云流水发起") + private Integer closeType; + + @ApiModelProperty("闭店状态") + private Integer closeStatus; + + @ApiModelProperty("闭店状态名称") + private String closeStatusName; + + @ApiModelProperty("已完成流程数量") + private Integer completeProcessNum; + + @ApiModelProperty("总流程数量") + private Integer totalProcessNum; + + + public String getCloseStatusName() { + return CloseStoreStatusEnum.getNameByStatus(closeStatus); + } + + public String getJoinBrandName() { + return BrandTypeEnum.getDescByCode(joinBrand); + } +} diff --git a/coolstore-partner-model/src/main/java/com/cool/store/vo/close/store/CloseStoreSimpleVO.java b/coolstore-partner-model/src/main/java/com/cool/store/vo/close/store/CloseStoreSimpleVO.java new file mode 100644 index 000000000..d45251c05 --- /dev/null +++ b/coolstore-partner-model/src/main/java/com/cool/store/vo/close/store/CloseStoreSimpleVO.java @@ -0,0 +1,50 @@ +package com.cool.store.vo.close.store; + +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +import java.util.List; + +/** + *

+ * 闭店申请简单信息VO + *

+ * + * @author wangff + * @since 2025/10/9 + */ +@Data +public class CloseStoreSimpleVO { + @ApiModelProperty("门店id") + private String storeId; + + @ApiModelProperty("门店名称") + private String storeName; + + @ApiModelProperty("门店编号") + private String storeNum; + + @ApiModelProperty("闭店状态名称") + private String closeStatusName; + + @ApiModelProperty("签约人1姓名") + private String signer1Name; + + @ApiModelProperty("签约人1手机号") + private String signer1Mobile; + + @ApiModelProperty("签约人2姓名") + private String signer2Name; + + @ApiModelProperty("签约人2手机号") + private String signer2Mobile; + + @ApiModelProperty("已完成流程数量") + private Integer completeProcessNum; + + @ApiModelProperty("总流程数量") + private Integer totalProcessNum; + + @ApiModelProperty("闭店流程阶段信息") + private List stageList; +} diff --git a/coolstore-partner-model/src/main/java/com/cool/store/vo/close/store/CloseStoreStatusVO.java b/coolstore-partner-model/src/main/java/com/cool/store/vo/close/store/CloseStoreStatusVO.java new file mode 100644 index 000000000..acfc4dae5 --- /dev/null +++ b/coolstore-partner-model/src/main/java/com/cool/store/vo/close/store/CloseStoreStatusVO.java @@ -0,0 +1,25 @@ +package com.cool.store.vo.close.store; + +import io.swagger.annotations.ApiModelProperty; +import lombok.AllArgsConstructor; +import lombok.Data; +import lombok.NoArgsConstructor; + +/** + *

+ * 闭店状态VO + *

+ * + * @author wangff + * @since 2025/10/10 + */ +@Data +@AllArgsConstructor +@NoArgsConstructor +public class CloseStoreStatusVO { + @ApiModelProperty("闭店状态编码") + private Integer closeStatus; + + @ApiModelProperty("闭店状态") + private String closeStatusName; +} diff --git a/coolstore-partner-model/src/main/java/com/cool/store/vo/close/store/CloseStoreSubStageStatusVO.java b/coolstore-partner-model/src/main/java/com/cool/store/vo/close/store/CloseStoreSubStageStatusVO.java new file mode 100644 index 000000000..9f4d69832 --- /dev/null +++ b/coolstore-partner-model/src/main/java/com/cool/store/vo/close/store/CloseStoreSubStageStatusVO.java @@ -0,0 +1,49 @@ +package com.cool.store.vo.close.store; + +import com.cool.store.enums.close.CloseStoreSubStageEnum; +import com.cool.store.enums.close.CloseStoreSubStageStatusEnum; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +/** + *

+ * 闭店流程子阶段状态VO + *

+ * + * @author wangff + * @since 2025/10/16 + */ +@Data +public class CloseStoreSubStageStatusVO { + @ApiModelProperty("闭店阶段") + private Integer shopStage; + + @ApiModelProperty("闭店子阶段") + private Integer shopSubStage; + + @ApiModelProperty("闭店子阶段名称") + private String shopSubStageName; + + @ApiModelProperty("店铺阶段状态") + private Integer shopSubStageStatus; + + @ApiModelProperty("阶段状态名称") + private String shopSubStageStatusName; + + @ApiModelProperty("当前阶段是否结束 0未结束 1已结束") + private Integer isTerminated; + + @ApiModelProperty("预估完成时间") + private String planCompleteTime; + + @ApiModelProperty("实际完成时间") + private String actualCompleteTime; + + public String getShopSubStageName() { + return CloseStoreSubStageEnum.getSubStageNameBySubStage(shopSubStage); + } + + public String getShopSubStageStatusName() { + return CloseStoreSubStageStatusEnum.getStatusNameByStatus(shopSubStageStatus); + } +} diff --git a/coolstore-partner-model/src/main/java/com/cool/store/vo/close/store/MiniCloseStoreSimpleVO.java b/coolstore-partner-model/src/main/java/com/cool/store/vo/close/store/MiniCloseStoreSimpleVO.java new file mode 100644 index 000000000..7ebda0023 --- /dev/null +++ b/coolstore-partner-model/src/main/java/com/cool/store/vo/close/store/MiniCloseStoreSimpleVO.java @@ -0,0 +1,52 @@ +package com.cool.store.vo.close.store; + +import com.cool.store.enums.close.CloseStoreStatusEnum; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +import java.util.Date; + +/** + *

+ * mini闭店申请简单信息VO + *

+ * + * @author wangff + * @since 2025/10/9 + */ +@Data +public class MiniCloseStoreSimpleVO { + @ApiModelProperty("闭店申请id") + private Long id; + + @ApiModelProperty("闭店申请单号") + private String closeStoreNo; + + @ApiModelProperty("门店id") + private String storeId; + + @ApiModelProperty("门店名称") + private String storeName; + + @ApiModelProperty("门店编号") + private String storeNum; + + @ApiModelProperty("闭店状态") + private Integer closeStatus; + + @ApiModelProperty("闭店状态名称") + private String closeStatusName; + + @ApiModelProperty("闭店发起方式 1-主动发起 2-云流水发起") + private Integer closeType; + + @ApiModelProperty("计划闭店时间") + private Date planCloseData; + + @ApiModelProperty("申请日期") + private Date createTime; + + public String getCloseStatusName() { + return CloseStoreStatusEnum.getNameByStatus(closeStatus); + } +} diff --git a/coolstore-partner-model/src/main/java/com/cool/store/vo/close/store/StoreCloseReasonVO.java b/coolstore-partner-model/src/main/java/com/cool/store/vo/close/store/StoreCloseReasonVO.java new file mode 100644 index 000000000..4fbe4b55f --- /dev/null +++ b/coolstore-partner-model/src/main/java/com/cool/store/vo/close/store/StoreCloseReasonVO.java @@ -0,0 +1,28 @@ +package com.cool.store.vo.close.store; + +import io.swagger.annotations.ApiModelProperty; +import lombok.AllArgsConstructor; +import lombok.Data; +import lombok.NoArgsConstructor; + +/** + *

+ * 门店闭店原因VO + *

+ * + * @author wangff + * @since 2025/9/16 + */ +@Data +@AllArgsConstructor +@NoArgsConstructor +public class StoreCloseReasonVO { + @ApiModelProperty("闭店原因编码") + private Integer closeReasonCode; + + @ApiModelProperty("闭店原因描述") + private String closeReasonDesc; + + @ApiModelProperty("闭店发起方式") + private Integer closeType; +} diff --git a/coolstore-partner-service/src/main/java/com/cool/store/service/HuoMaService.java b/coolstore-partner-service/src/main/java/com/cool/store/service/HuoMaService.java index 7c764ccf9..fa7a0b9e5 100644 --- a/coolstore-partner-service/src/main/java/com/cool/store/service/HuoMaService.java +++ b/coolstore-partner-service/src/main/java/com/cool/store/service/HuoMaService.java @@ -1,6 +1,7 @@ package com.cool.store.service; import com.cool.store.request.OrderSummaryRequest; +import com.cool.store.request.huoma.AccountCloseRequest; import com.cool.store.request.huoma.ShopBasicInfoRequest; import com.cool.store.response.IncomeBaseResponse; import com.cool.store.response.IncomeSummaryResponse; @@ -53,4 +54,11 @@ public interface HuoMaService { * @description:获取店铺交易分析 */ IncomeSummaryResponse getIncomeSummary (OrderSummaryRequest requestBody); + + /** + * 账号关闭 + * @param requestBody 火码账号关闭Request + * @return 火码账号关闭Response + */ + Boolean accountClose(AccountCloseRequest requestBody); } diff --git a/coolstore-partner-service/src/main/java/com/cool/store/service/ThirdXgjService.java b/coolstore-partner-service/src/main/java/com/cool/store/service/ThirdXgjService.java new file mode 100644 index 000000000..6373d5519 --- /dev/null +++ b/coolstore-partner-service/src/main/java/com/cool/store/service/ThirdXgjService.java @@ -0,0 +1,60 @@ +package com.cool.store.service; + +import com.cool.store.dto.xgj.XgjBranchBankDTO; +import com.cool.store.dto.xgj.XgjPartnerPageDTO; +import com.cool.store.dto.xgj.XgjPayResultDTO; +import com.cool.store.request.xgj.*; + +import java.util.List; + +/** + *

+ * 新管家三方接口服务类 + *

+ * + * @author wangff + * @since 2025/11/28 + */ +public interface ThirdXgjService { + + /** + * 新管家账号关闭 + * @param request 新管家账号关闭Request + * @return 是否成功 + */ + String accountClose(XgjAccountCloseRequest request); + + /** + * 新管家报销单 + * @param request 新管家报销单Request + * @return 每刻单号 + */ + String reimburse(XgjReimburseRequest request); + + /** + * 新管家供应商同步 + * @param request 新管家同步供应商Request + * @return java.lang.String + */ + String savePartner(XgjSavePartnerRequest request); + + /** + * 获取单据支付结果 + * @param request 新管家获取单据支付结果Request + * @return 新管家单据支付结果DTO + */ + XgjPayResultDTO queryOrderStatus(XgjPaymentRequest request); + + /** + * 查询往来单位列表 + * @param request 新管家往来单位查询Request + * @return 新管家分页DTO + */ + XgjPartnerPageDTO queryPartnerPage(XgjPartnerQueryRequest request); + + /** + * 查询支行列表 + * @return 新管家支行列表 + */ + List queryBranchBankList(XgjBankQueryRequest request); +} diff --git a/coolstore-partner-service/src/main/java/com/cool/store/service/close/AccountCloseFactory.java b/coolstore-partner-service/src/main/java/com/cool/store/service/close/AccountCloseFactory.java new file mode 100644 index 000000000..33eb38fea --- /dev/null +++ b/coolstore-partner-service/src/main/java/com/cool/store/service/close/AccountCloseFactory.java @@ -0,0 +1,34 @@ +package com.cool.store.service.close; + +import lombok.RequiredArgsConstructor; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Service; + +import java.util.HashMap; +import java.util.Map; + +/** + *

+ * 账号关闭工厂 + *

+ * + * @author wangff + * @since 2025/10/8 + */ +@Service +@RequiredArgsConstructor +public class AccountCloseFactory { + private final Map map = new HashMap<>(); + + + @Autowired + public AccountCloseFactory(AccountCloseStrategy[] accountCloseStrategies) { + for (AccountCloseStrategy accountCloseStrategy : accountCloseStrategies) { + map.put(accountCloseStrategy.getSystemCode(), accountCloseStrategy); + } + } + + public AccountCloseStrategy getByCode(String systemCode) { + return map.get(systemCode); + } +} diff --git a/coolstore-partner-service/src/main/java/com/cool/store/service/close/AccountCloseStrategy.java b/coolstore-partner-service/src/main/java/com/cool/store/service/close/AccountCloseStrategy.java new file mode 100644 index 000000000..5a9eff2d9 --- /dev/null +++ b/coolstore-partner-service/src/main/java/com/cool/store/service/close/AccountCloseStrategy.java @@ -0,0 +1,23 @@ +package com.cool.store.service.close; + +/** + *

+ * 账号关闭 + *

+ * + * @author wangff + * @since 2025/10/8 + */ +public interface AccountCloseStrategy { + + /** + * 申请账号关闭 + * @return 是否成功 + */ + Boolean accountClose(String storeId); + + /** + * 获取系统code + */ + String getSystemCode(); +} diff --git a/coolstore-partner-service/src/main/java/com/cool/store/service/close/CloseStoreAccountService.java b/coolstore-partner-service/src/main/java/com/cool/store/service/close/CloseStoreAccountService.java new file mode 100644 index 000000000..ad35868a6 --- /dev/null +++ b/coolstore-partner-service/src/main/java/com/cool/store/service/close/CloseStoreAccountService.java @@ -0,0 +1,36 @@ +package com.cool.store.service.close; + +import com.cool.store.vo.close.account.CloseStoreAccountVO; + +import java.util.List; + +/** + *

+ * 闭店账号关闭 服务类 + *

+ * + * @author wangff + * @since 2025/10/8 + */ +public interface CloseStoreAccountService { + + /** + * 查询账号列表 + * @param closeStoreId 闭店申请id + * @return 闭店账号VO列表 + */ + List getAccountList(Long closeStoreId); + + /** + * 账号关闭 + * @param id 主键id + * @return 是否成功 + */ + Boolean closeAccount(Long id); + + /** + * 校验所有账号关闭状态并更新阶段 + * @param closeStoreId 闭店申请id + */ + void verifyAndUpdateStage(Long closeStoreId); +} diff --git a/coolstore-partner-service/src/main/java/com/cool/store/service/close/CloseStoreFileService.java b/coolstore-partner-service/src/main/java/com/cool/store/service/close/CloseStoreFileService.java new file mode 100644 index 000000000..d993765d4 --- /dev/null +++ b/coolstore-partner-service/src/main/java/com/cool/store/service/close/CloseStoreFileService.java @@ -0,0 +1,72 @@ +package com.cool.store.service.close; + +import com.cool.store.request.close.file.*; +import com.cool.store.vo.close.file.CloseStoreFileDetailMiniVO; +import com.cool.store.vo.close.file.CloseStoreFileDetailVO; + +/** + *

+ * 闭店资料 服务类 + *

+ * + * @author wangff + * @since 2025/10/7 + */ +public interface CloseStoreFileService { + + /** + * 更新材料邮寄地址 + * @param request 闭店资料邮寄地址信息Request + * @return 是否成功 + */ + Boolean updateMailAddress(CloseStoreMailAddressRequest request); + + /** + * 提交材料审批 + * @param request 闭店材料审批Request + * @return 是否成功 + */ + Boolean submitFileApprove(CloseStoreFileApproveRequest request); + + /** + * 单个材料提交审批 + * @param request 闭店材料信息Request + * @return 是否成功 + */ + Boolean submitFileApproveSingle(CloseStoreFileInfoRequest request); + + /** + * 查询闭店资料详情 + * @param closeStoreId 闭店申请id + * @return 闭店资料详情VO + */ + CloseStoreFileDetailVO getFileDetail(Long closeStoreId); + + /** + * 查询小程序闭店资料详情 + * @param closeStoreId 闭店申请id + * @return 小程序闭店资料详情VO + */ + CloseStoreFileDetailMiniVO getMiniFileDetail(Long closeStoreId); + + /** + * 提交材料 + * @param request 闭店资料邮寄信息Request + * @return 是否成功 + */ + Boolean submitFile(CloseStoreMailInfoRequest request); + + /** + * 修改材料 + * @param request 闭店材料提交Request + * @return 是否成功 + */ + Boolean updateFile(CloseStoreFileSubmitRequest request); + + /** + * 督导审批 + * @param request 审批Request + * @return 是否成功 + */ + Boolean supervisionAudit(CloseStoreFileAuditRequest request); +} diff --git a/coolstore-partner-service/src/main/java/com/cool/store/service/close/CloseStoreRefundService.java b/coolstore-partner-service/src/main/java/com/cool/store/service/close/CloseStoreRefundService.java new file mode 100644 index 000000000..e41223713 --- /dev/null +++ b/coolstore-partner-service/src/main/java/com/cool/store/service/close/CloseStoreRefundService.java @@ -0,0 +1,82 @@ +package com.cool.store.service.close; + +import com.cool.store.dto.close.CloseStoreMkUserDTO; +import com.cool.store.request.close.refund.CloseStoreRefundAddRequest; +import com.cool.store.request.close.refund.CloseStoreRefundQueryRequest; +import com.cool.store.request.close.refund.CloseStoreRefundSkipRequest; +import com.cool.store.request.close.refund.CloseStoreRefundUpdateRequest; +import com.cool.store.vo.close.refund.CloseStoreRefundDetailVO; +import com.cool.store.vo.close.refund.CloseStoreRefundListVO; +import com.cool.store.vo.close.refund.CloseStoreRefundSimpleVO; +import com.github.pagehelper.PageInfo; + +import java.util.Date; +import java.util.List; + +/** + *

+ * 闭店退款 服务类 + *

+ * + * @author wangff + * @since 2025/10/13 + */ +public interface CloseStoreRefundService { + + /** + * 新增退款记录 + * @param request 闭店退款新增Request + */ + Boolean addRefund(CloseStoreRefundAddRequest request); + + /** + * 编辑退款记录 + * @param request 闭店退款更新Request + */ + Boolean updateRefund(CloseStoreRefundUpdateRequest request); + + /** + * 获取当前用户的每刻用户信息 + * @return 每刻用户信息DTO + */ + CloseStoreMkUserDTO getCurrentMkUser(); + + /** + * 查询退款详情 + * @param id 退款信息id + * @return 闭店退款详情VO + */ + CloseStoreRefundDetailVO getRefundDetail(Long id); + + /** + * 完成退款 + */ + void completeRefund(Long refundId, Date refundTime); + + /** + * 查询退款简单信息列表 + * @param closeStoreId 闭店申请id + * @return 闭店退款简单信息VO列表 + */ + List getRefundSimpleList(Long closeStoreId); + + /** + * 跳过流程 + * @param request 退款流程跳过Request + */ + void skip(CloseStoreRefundSkipRequest request); + + /** + * 退款分页查询 + * @param request 闭店退款查询Request + * @return 闭店退款列表VO列表 + */ + PageInfo refundPage(CloseStoreRefundQueryRequest request); + + /** + * 刷新退款订单状态 + * @param request 闭店退款查询Request + * @return 是否成功 + */ + Boolean refreshRefundOrderStatus(CloseStoreRefundQueryRequest request); +} diff --git a/coolstore-partner-service/src/main/java/com/cool/store/service/close/CloseStoreService.java b/coolstore-partner-service/src/main/java/com/cool/store/service/close/CloseStoreService.java new file mode 100644 index 000000000..b48a7e148 --- /dev/null +++ b/coolstore-partner-service/src/main/java/com/cool/store/service/close/CloseStoreService.java @@ -0,0 +1,130 @@ +package com.cool.store.service.close; + + +import com.cool.store.enums.close.CloseStoreSubStageEnum; +import com.cool.store.request.close.store.*; +import com.cool.store.response.AuditInfoResponse; +import com.cool.store.vo.close.store.*; +import com.github.pagehelper.PageInfo; + +import java.util.List; + +/** + * @Author suzhuhong + * @Date 2025/9/23 15:48 + * @Version 1.0 + */ +public interface CloseStoreService { + + + /** + * 申请闭店 + * @param request 闭店申请Request + * @return 是否成功 + */ + Boolean applyCloseStore(CloseStoreApplyRequest request); + + /** + * 拒绝之后 重新提交申请 + * @param request 闭店申请Request + * @return 是否成功 + */ + Boolean reApplyCloseStore(ReCloseStoreApplyRequest request); + + /** + * 第三方申请闭店 + * @param request 三方闭店申请Request + * @return 是否成功 + */ + Boolean thirdApplyCloseStore(ThirdCloseStoreApplyRequest request); + + /** + * 审批通过 + * @param request 闭店申请审批Request + * @return 是否成功 + */ + Boolean auditPass(CloseStoreAuditRequest request); + + /** + * 审批拒绝 + * @param request 闭店申请审批Request + * @return 是否成功 + */ + Boolean auditReject(CloseStoreAuditRequest request); + + /** + * 取消闭店申请 + * @param closeStoreId 闭店申请id + * @return 是否成功 + */ + Boolean cancelApply(Long closeStoreId); + + /** + * 查询权限下的闭店申请审批记录 + * @param request 闭店申请查询Request + * @return 闭店申请记录列表VO列表 + */ + PageInfo closeStoreAuditList(CloseStoreQueryRequest request); + + /** + * 查询闭店申请列表 + * @param request 闭店申请查询Request + * @return 闭店申请记录列表VO列表 + */ + PageInfo closeStoreInfoList(CloseStoreQueryRequest request); + + /** + * 查询闭店审批记录 + * @param closeStoreId 闭店申请id + * @return 审批记录VO列表 + */ + List getAuditRecordList(Long closeStoreId); + + /** + * 获取闭店申请详情 + * @param closeStoreId 闭店申请id + * @return 闭店申请详情VO + */ + CloseStoreInfoDetailVO getCloseStoreInfoDetail(Long closeStoreId, Boolean queryAuditId); + + /** + * 根据审批id获取闭店申请详情 + * @param closeStoreAuditId 审批id + * @return 闭店申请详情VO + */ + CloseStoreInfoDetailVO getCloseStoreInfoDetailByAuditId(Long closeStoreAuditId); + + /** + * 闭店原因列表 + * @param closeType 闭店发起方式 + * @return 门店闭店原因VO + */ + List getStoreCloseReasonList(Integer closeType); + + /** + * 获取闭店申请简单信息 + * @param closeStoreId 闭店申请id + * 闭店申请简单信息VO + */ + CloseStoreSimpleVO getCloseStoreSimpleInfo(Long closeStoreId); + + /** + * mini分页查询 + * @param request 查询参数 + * @return mini闭店申请简单信息VO + */ + PageInfo getMiniCloseStoreSimpleInfoList(MiniCloseStoreQueryRequest request); + + /** + * 获取闭店状态列表 + * @return 闭店状态列表 + */ + List getCloseStoreStatusList(); + + /** + * 闭店流程流转 + * @param closeStoreId 闭店申请id + * @param currentStage 当前阶段 + */ + void closeStoreProcessFlow(Long closeStoreId, CloseStoreSubStageEnum currentStage); +} diff --git a/coolstore-partner-service/src/main/java/com/cool/store/service/close/impl/AbstractAccountClose.java b/coolstore-partner-service/src/main/java/com/cool/store/service/close/impl/AbstractAccountClose.java new file mode 100644 index 000000000..2bccfcd78 --- /dev/null +++ b/coolstore-partner-service/src/main/java/com/cool/store/service/close/impl/AbstractAccountClose.java @@ -0,0 +1,37 @@ +package com.cool.store.service.close.impl; + +import com.cool.store.dao.StoreDao; +import com.cool.store.entity.StoreDO; +import com.cool.store.enums.ErrorCodeEnum; +import com.cool.store.exception.ServiceException; +import com.cool.store.service.close.AccountCloseStrategy; + +import javax.annotation.Resource; +import java.util.Objects; + +/** + *

+ * 账号关闭 + *

+ * + * @author wangff + * @since 2025/10/8 + */ +public abstract class AbstractAccountClose implements AccountCloseStrategy { + @Resource + private StoreDao storeDao; + + @Override + public Boolean accountClose(String storeId) { + // 各平台待对接 + return true; + } + + protected StoreDO getStore(String storeId) { + StoreDO storeDO = storeDao.getByStoreId(storeId); + if (Objects.isNull(storeDO)) { + throw new ServiceException(ErrorCodeEnum.STORE_NOT_FIND); + } + return storeDO; + } +} diff --git a/coolstore-partner-service/src/main/java/com/cool/store/service/close/impl/CloseStoreAccountServiceImpl.java b/coolstore-partner-service/src/main/java/com/cool/store/service/close/impl/CloseStoreAccountServiceImpl.java new file mode 100644 index 000000000..38b440c4b --- /dev/null +++ b/coolstore-partner-service/src/main/java/com/cool/store/service/close/impl/CloseStoreAccountServiceImpl.java @@ -0,0 +1,80 @@ +package com.cool.store.service.close.impl; + +import com.cool.store.dao.CloseStoreAccountInfoDAO; +import com.cool.store.dao.CloseStoreInfoDAO; +import com.cool.store.dao.CloseStoreStageInfoDAO; +import com.cool.store.entity.CloseStoreAccountInfoDO; +import com.cool.store.entity.CloseStoreInfoDO; +import com.cool.store.enums.close.*; +import com.cool.store.service.close.AccountCloseFactory; +import com.cool.store.service.close.AccountCloseStrategy; +import com.cool.store.service.close.CloseStoreAccountService; +import com.cool.store.service.close.CloseStoreService; +import com.cool.store.utils.BeanUtil; +import com.cool.store.vo.close.account.CloseStoreAccountVO; +import lombok.RequiredArgsConstructor; +import org.springframework.stereotype.Service; + +import java.util.List; +import java.util.Objects; + +/** + *

+ * 闭店账号关闭 服务实现类 + *

+ * + * @author wangff + * @since 2025/10/8 + */ +@Service +@RequiredArgsConstructor +public class CloseStoreAccountServiceImpl implements CloseStoreAccountService { + private final CloseStoreAccountInfoDAO closeStoreAccountInfoDAO; + private final AccountCloseFactory accountCloseFactory; + private final CloseStoreStageInfoDAO closeStoreStageInfoDAO; + private final CloseStoreService closeStoreService; + private final CloseStoreInfoDAO closeStoreInfoDAO; + + @Override + public List getAccountList(Long closeStoreId) { + List list = closeStoreAccountInfoDAO.getByCloseStoreId(closeStoreId); + return BeanUtil.toList(list, CloseStoreAccountVO.class); + } + + @Override + public Boolean closeAccount(Long id) { + CloseStoreAccountInfoDO accountInfo = closeStoreAccountInfoDAO.getById(id); + if (Objects.nonNull(accountInfo)) { + closeStoreStageInfoDAO.verifyStage(accountInfo.getCloseStoreId(), CloseStoreStageEnum.CLOSE_STORE_STAGE_2, CloseStoreSubStageEnum.CLOSE_STORE_SUB_STAGE_20, CloseStoreSubStageStatusEnum.CLOSE_STORE_SUB_STAGE_STATUS_25); + if (AccountCloseTypeEnum.APPLY_CLOSE.getType().equals(accountInfo.getCloseType())) { + CloseStoreInfoDO closeStoreInfoDO = closeStoreInfoDAO.getById(accountInfo.getCloseStoreId()); + // 申请关闭 + AccountCloseStrategy accountClose = accountCloseFactory.getByCode(accountInfo.getSystemCode()); + if (Objects.nonNull(accountClose) && accountClose.accountClose(closeStoreInfoDO.getStoreId())) { + closeStoreAccountInfoDAO.updateStatus(id, CloseStoreAccountStatusEnum.CLOSED.getStatus()); + verifyAndUpdateStage(accountInfo.getCloseStoreId()); + return true; + } + } else { + // 直接关闭 + closeStoreAccountInfoDAO.updateStatus(id, CloseStoreAccountStatusEnum.CLOSED.getStatus()); + verifyAndUpdateStage(accountInfo.getCloseStoreId()); + return true; + } + } + return false; + } + + @Override + public void verifyAndUpdateStage(Long closeStoreId) { + if (!closeStoreAccountInfoDAO.existNotCloseAccount(closeStoreId)) { + // 所有账号已关闭,校验当前阶段 + CloseStoreStageEnum currentStage = CloseStoreStageEnum.CLOSE_STORE_STAGE_2; + CloseStoreSubStageEnum currentSubStage = CloseStoreSubStageEnum.CLOSE_STORE_SUB_STAGE_20; + CloseStoreSubStageStatusEnum currentExpectedSubStageStatus = CloseStoreSubStageStatusEnum.CLOSE_STORE_SUB_STAGE_STATUS_25; + closeStoreStageInfoDAO.verifyStage(closeStoreId, currentStage, currentSubStage, currentExpectedSubStageStatus); + // 流程流转 + closeStoreService.closeStoreProcessFlow(closeStoreId, currentSubStage); + } + } +} diff --git a/coolstore-partner-service/src/main/java/com/cool/store/service/close/impl/CloseStoreFileServiceImpl.java b/coolstore-partner-service/src/main/java/com/cool/store/service/close/impl/CloseStoreFileServiceImpl.java new file mode 100644 index 000000000..d44f77e00 --- /dev/null +++ b/coolstore-partner-service/src/main/java/com/cool/store/service/close/impl/CloseStoreFileServiceImpl.java @@ -0,0 +1,211 @@ +package com.cool.store.service.close.impl; + +import com.cool.store.constants.CommonConstants; +import com.cool.store.constants.RedisConstant; +import com.cool.store.dao.CloseStoreFileDetailDAO; +import com.cool.store.dao.CloseStoreFileInfoDAO; +import com.cool.store.dao.CloseStoreStageInfoDAO; +import com.cool.store.entity.CloseStoreFileInfoDO; +import com.cool.store.enums.ErrorCodeEnum; +import com.cool.store.enums.close.*; +import com.cool.store.exception.ServiceException; +import com.cool.store.request.close.file.*; +import com.cool.store.entity.CloseStoreFileDetailDO; +import com.cool.store.service.close.CloseStoreFileService; +import com.cool.store.service.close.CloseStoreService; +import com.cool.store.utils.BeanUtil; +import com.cool.store.utils.RedisUtilPool; +import com.cool.store.vo.close.file.CloseStoreFileDetailMiniVO; +import com.cool.store.vo.close.file.CloseStoreFileDetailVO; +import com.cool.store.vo.close.file.CloseStoreFileInfoVO; +import lombok.RequiredArgsConstructor; +import org.apache.commons.collections4.CollectionUtils; +import org.apache.commons.collections4.ListUtils; +import org.apache.commons.lang3.StringUtils; +import org.springframework.stereotype.Service; +import org.springframework.transaction.annotation.Transactional; + +import java.util.Arrays; +import java.util.List; +import java.util.Objects; +import java.util.stream.Stream; + +import static com.cool.store.enums.close.CloseStoreSubStageStatusEnum.*; + +/** + *

+ * 闭店资料 服务实现类 + *

+ * + * @author wangff + * @since 2025/10/7 + */ +@Service +@RequiredArgsConstructor +public class CloseStoreFileServiceImpl implements CloseStoreFileService { + private final CloseStoreFileDetailDAO closeStoreFileDetailDAO; + private final CloseStoreFileInfoDAO closeStoreFileInfoDAO; + private final CloseStoreStageInfoDAO closeStoreStageInfoDAO; + private final CloseStoreService closeStoreService; + private final RedisUtilPool redisUtilPool; + + private static final CloseStoreStageEnum STAGE = CloseStoreStageEnum.CLOSE_STORE_STAGE_1; + private static final CloseStoreSubStageEnum SUB_STAGE = CloseStoreSubStageEnum.CLOSE_STORE_SUB_STAGE_10; + + @Override + @Transactional + public Boolean updateMailAddress(CloseStoreMailAddressRequest request) { + closeStoreStageInfoDAO.verifyStage(request.getCloseStoreId(), STAGE, SUB_STAGE, CLOSE_STORE_SUB_STAGE_STATUS_10); + + closeStoreFileDetailDAO.insertOrUpdateMailAddress(request); + closeStoreService.closeStoreProcessFlow(request.getCloseStoreId(), SUB_STAGE); + return true; + } + + @Override + @Transactional + public Boolean submitFileApprove(CloseStoreFileApproveRequest request) { + // 校验流程是否在材料待审批阶段 + closeStoreStageInfoDAO.verifyStage(request.getCloseStoreId(), STAGE, SUB_STAGE, CLOSE_STORE_SUB_STAGE_STATUS_18); + // 修改材料详情 + boolean approveCompleted = ListUtils.emptyIfNull(request.getFileList()).stream().allMatch(v -> CommonConstants.INDEX_ONE.equals(v.getApproveStatus())); + closeStoreFileDetailDAO.insertOrUpdateFileInfoSelective(request, approveCompleted); + // 修改所有材料的审批状态 + if (CollectionUtils.isNotEmpty(request.getFileList())) { + List fileList = BeanUtil.toList(request.getFileList(), CloseStoreFileInfoDO.class); + closeStoreFileInfoDAO.updateBatch(fileList); + } + // 全部材料合格,流程流转 + if (approveCompleted) { + closeStoreService.closeStoreProcessFlow(request.getCloseStoreId(), SUB_STAGE); + } + return true; + } + + @Override + @Transactional + public Boolean submitFileApproveSingle(CloseStoreFileInfoRequest request) { + // 校验流程是否在材料待审批阶段 + closeStoreStageInfoDAO.verifyStage(request.getCloseStoreId(), STAGE, SUB_STAGE, CLOSE_STORE_SUB_STAGE_STATUS_18); + // 更新其他字段 + updateFileField(request); + // 更新材料审批信息 + CloseStoreFileInfoDO updateFileInfoDO = CloseStoreFileInfoDO.builder() + .id(request.getId()) + .approveStatus(request.getApproveStatus()) + .mailStatus(request.getMailStatus()) + .approveOpinion(request.getApproveOpinion()) + .urls(request.getUrls()) + .build(); + closeStoreFileInfoDAO.updateSelective(updateFileInfoDO); + // 校验所有材料是否审批完成,完成后流程流转 + verifyComplete(request); + return true; + } + + /** + * 校验所有材料是否全部完成邮寄和审批完成 + */ + private void verifyComplete(CloseStoreFileInfoRequest request) { + List fileList = closeStoreFileInfoDAO.getByCloseStoreId(request.getCloseStoreId()); + boolean completeApprove = fileList.stream().allMatch(v -> Objects.nonNull(v.getApproveStatus()) && CommonConstants.INDEX_ONE.equals(v.getMailStatus())); + if (completeApprove) { + closeStoreFileDetailDAO.insertOrUpdateFileInfoSelective(CloseStoreFileApproveRequest.builder().closeStoreId(request.getCloseStoreId()).build(), true); + boolean pass = fileList.stream().allMatch(v -> CommonConstants.INDEX_ONE.equals(v.getApproveStatus())); + // 更新材料状态为审批状态 + closeStoreFileInfoDAO.updateFileStatusToApproveStatus(request.getCloseStoreId()); + if (pass) { + closeStoreService.closeStoreProcessFlow(request.getCloseStoreId(), SUB_STAGE); + } else { + closeStoreStageInfoDAO.updateSubStageStatus(request.getCloseStoreId(), CLOSE_STORE_SUB_STAGE_STATUS_19); + } + } + } + + /** + * 更新其他字段 + */ + private void updateFileField(CloseStoreFileInfoRequest request) { + CloseStoreFileInfoDO fileInfoDO = closeStoreFileInfoDAO.getById(request.getId()); + if (Objects.isNull(fileInfoDO)) { + throw new ServiceException(ErrorCodeEnum.CLOSE_STORE_FILE_NOT_EXIST); + } + if (CloseStoreFileEnum.TKD.getCode().equals(fileInfoDO.getFileCode())) { + boolean f = Stream.of(request.getBankAccount(), request.getBankOpening(), request.getRefundAccount()).anyMatch(StringUtils::isNotBlank); + if (f) { + CloseStoreFileApproveRequest approveRequest = CloseStoreFileApproveRequest.builder() + .closeStoreId(request.getCloseStoreId()) + .bankAccount(request.getBankAccount()) + .bankOpening(request.getBankOpening()) + .refundAccount(request.getRefundAccount()) + .build(); + closeStoreFileDetailDAO.insertOrUpdateFileInfoSelective(approveRequest, false); + } + } + } + + @Override + public CloseStoreFileDetailVO getFileDetail(Long closeStoreId) { + CloseStoreFileDetailDO fileDetailDO = closeStoreFileDetailDAO.getByCloseStoreId(closeStoreId); + CloseStoreFileDetailVO detailVO = BeanUtil.toBean(fileDetailDO, CloseStoreFileDetailVO.class); + + List fileList = closeStoreFileInfoDAO.getByCloseStoreId(closeStoreId); + List fileVOList = BeanUtil.toList(fileList, CloseStoreFileInfoVO.class); + detailVO.setFileList(fileVOList); + + return detailVO; + } + + @Override + public CloseStoreFileDetailMiniVO getMiniFileDetail(Long closeStoreId) { + CloseStoreFileDetailVO fileDetail = getFileDetail(closeStoreId); + CloseStoreFileDetailMiniVO result = BeanUtil.toBean(fileDetail, CloseStoreFileDetailMiniVO.class); + if (CollectionUtils.isNotEmpty(result.getFileList())) { + result.getFileList().forEach(v -> v.setTemplateUrl(redisUtilPool.hashGet(RedisConstant.CLOSE_STORE_FILE_TEMPLATE, v.getFileCode()))); + } + return result; + } + + @Override + @Transactional + public Boolean submitFile(CloseStoreMailInfoRequest request) { + // 校验流程是否在材料待上传阶段 + CloseStoreSubStageStatusEnum[] conditions = {CLOSE_STORE_SUB_STAGE_STATUS_15, CLOSE_STORE_SUB_STAGE_STATUS_17, CLOSE_STORE_SUB_STAGE_STATUS_19}; + closeStoreStageInfoDAO.verifyStage(request.getCloseStoreId(), STAGE, SUB_STAGE, conditions); + // 修改邮寄信息 + closeStoreFileDetailDAO.insertOrUpdateMailInfo(request, true); + // 校验所有材料是否上传完成,完成后流程流转 + List files = closeStoreFileInfoDAO.getByCloseStoreId(request.getCloseStoreId()); + List verifyList = Arrays.asList(FileStatusEnum.UPLOADED.getStatus(), FileStatusEnum.MODIFIED.getStatus(), FileStatusEnum.QUALIFIED.getStatus()); + boolean verify = files.stream().allMatch(v -> verifyList.contains(v.getFileStatus())); + if (verify) { + closeStoreService.closeStoreProcessFlow(request.getCloseStoreId(), SUB_STAGE); + } + return true; + } + + @Override + public Boolean updateFile(CloseStoreFileSubmitRequest request) { + CloseStoreSubStageStatusEnum[] conditions = {CLOSE_STORE_SUB_STAGE_STATUS_15, CLOSE_STORE_SUB_STAGE_STATUS_17, CLOSE_STORE_SUB_STAGE_STATUS_19}; + closeStoreStageInfoDAO.verifyStage(request.getCloseStoreId(), STAGE, SUB_STAGE, conditions); + return closeStoreFileInfoDAO.updateFile(request.getId(), request.getUrls()); + } + + @Override + @Transactional + public Boolean supervisionAudit(CloseStoreFileAuditRequest request) { + closeStoreStageInfoDAO.verifyStage(request.getCloseStoreId(), STAGE, SUB_STAGE, CLOSE_STORE_SUB_STAGE_STATUS_16); + if (CommonConstants.INDEX_ONE.equals(request.getStatus())) { + // 所有资料状态改为审批中 + closeStoreFileInfoDAO.updateAllFileStatus(request.getCloseStoreId()); + // 流程流转 + closeStoreService.closeStoreProcessFlow(request.getCloseStoreId(), SUB_STAGE); + } else { + // 修改督导审批意见 + closeStoreFileDetailDAO.updateByCloseStoreIdSelective(CloseStoreFileDetailDO.builder().closeStoreId(request.getCloseStoreId()).remark(request.getRemark()).build()); + // 修改阶段状态 + closeStoreStageInfoDAO.updateSubStageStatus(request.getCloseStoreId(), CLOSE_STORE_SUB_STAGE_STATUS_17); + } + return true; + } +} diff --git a/coolstore-partner-service/src/main/java/com/cool/store/service/close/impl/CloseStoreRefundServiceImpl.java b/coolstore-partner-service/src/main/java/com/cool/store/service/close/impl/CloseStoreRefundServiceImpl.java new file mode 100644 index 000000000..ea6bf2555 --- /dev/null +++ b/coolstore-partner-service/src/main/java/com/cool/store/service/close/impl/CloseStoreRefundServiceImpl.java @@ -0,0 +1,225 @@ +package com.cool.store.service.close.impl; + +import com.alibaba.fastjson.JSONObject; +import com.cool.store.constants.RedisConstant; +import com.cool.store.context.CurrentUserHolder; +import com.cool.store.dao.*; +import com.cool.store.dto.close.CloseStoreMkUserDTO; +import com.cool.store.dto.xgj.XgjPayResultDTO; +import com.cool.store.entity.CloseStoreInfoDO; +import com.cool.store.entity.CloseStoreRefundInfoDO; +import com.cool.store.entity.EnterpriseUserDO; +import com.cool.store.entity.StoreDO; +import com.cool.store.enums.ErrorCodeEnum; +import com.cool.store.enums.close.CloseStoreSubStageEnum; +import com.cool.store.enums.close.CloseStoreSubStageStatusEnum; +import com.cool.store.enums.close.RefundPayStatusEnum; +import com.cool.store.enums.close.XgjRefundPayStatusEnum; +import com.cool.store.exception.ServiceException; +import com.cool.store.request.close.refund.CloseStoreRefundAddRequest; +import com.cool.store.request.close.refund.CloseStoreRefundQueryRequest; +import com.cool.store.request.close.refund.CloseStoreRefundSkipRequest; +import com.cool.store.request.close.refund.CloseStoreRefundUpdateRequest; +import com.cool.store.request.xgj.XgjPaymentRequest; +import com.cool.store.request.xgj.XgjReimburseRequest; +import com.cool.store.service.ThirdXgjService; +import com.cool.store.service.close.CloseStoreRefundService; +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.CoolDateUtils; +import com.cool.store.utils.RedisUtilPool; +import com.cool.store.vo.close.refund.CloseStoreRefundDetailVO; +import com.cool.store.vo.close.refund.CloseStoreRefundListVO; +import com.cool.store.vo.close.refund.CloseStoreRefundSimpleVO; +import com.github.pagehelper.PageHelper; +import com.github.pagehelper.PageInfo; +import lombok.RequiredArgsConstructor; +import org.apache.commons.collections4.CollectionUtils; +import org.apache.commons.lang3.StringUtils; +import org.springframework.stereotype.Service; +import org.springframework.transaction.annotation.Transactional; + +import java.util.ArrayList; +import java.util.Date; +import java.util.List; +import java.util.Objects; + +/** + *

+ * 闭店退款 服务实现类 + *

+ * + * @author wangff + * @since 2025/10/13 + */ +@Service +@RequiredArgsConstructor +public class CloseStoreRefundServiceImpl implements CloseStoreRefundService { + private final CloseStoreRefundInfoDAO closeStoreRefundInfoDAO; + private final CloseStoreInfoDAO closeStoreInfoDAO; + private final CloseStoreStageInfoDAO closeStoreStageInfoDAO; + private final CloseStoreService closeStoreService; + private final StoreDao storeDao; + private final RedisUtilPool redisUtilPool; + private final ThirdXgjService thirdXgjService; + private final EnterpriseUserDAO enterpriseUserDAO; + private final DictService dictService; + + @Override + public Boolean addRefund(CloseStoreRefundAddRequest request) { + if (!CloseStoreSubStageEnum.CLOSE_STORE_SUB_STAGE_30.getCloseStoreSubStage().equals(request.getType()) + && !CloseStoreSubStageEnum.CLOSE_STORE_SUB_STAGE_40.getCloseStoreSubStage().equals(request.getType())) { + throw new ServiceException(ErrorCodeEnum.CLOSE_STORE_REFUND_TYPE_ERROR); + } + CloseStoreMkUserDTO mkUser = getCurrentMkUser(); + // 校验是否有每刻权限 + if (Objects.isNull(mkUser)) { + throw new ServiceException(ErrorCodeEnum.CLOSE_STORE_REFUND_MK_USER_NOT_EXIST); + } + // 是否存在非作废状态的记录,则不能新增 + if (closeStoreRefundInfoDAO.existEffectiveRecord(request.getCloseStoreId(), request.getType())) { + throw new ServiceException(ErrorCodeEnum.CLOSE_STORE_REFUND_EXIST_EFFECTIVE_RECORD); + } + CloseStoreInfoDO closeStoreInfo = closeStoreInfoDAO.getById(request.getCloseStoreId()); + if (Objects.isNull(closeStoreInfo)) { + throw new ServiceException(ErrorCodeEnum.CLOSE_STORE_INFO_NOT_EXIST); + } + StoreDO storeDO = storeDao.getByStoreId(closeStoreInfo.getStoreId()); + if (Objects.isNull(storeDO)) { + throw new ServiceException(ErrorCodeEnum.STORE_NOT_FIND); + } + + CloseStoreSubStageEnum subStage = CloseStoreSubStageEnum.getSubStageByStage(request.getType()); + CloseStoreSubStageStatusEnum expectedStageStatus = CloseStoreSubStageEnum.CLOSE_STORE_SUB_STAGE_30.equals(subStage) ? CloseStoreSubStageStatusEnum.CLOSE_STORE_SUB_STAGE_STATUS_35 : CloseStoreSubStageStatusEnum.CLOSE_STORE_SUB_STAGE_STATUS_45; + assert subStage != null; + // 校验阶段状态 + closeStoreStageInfoDAO.verifyStage(request.getCloseStoreId(), subStage.getCloseStoreStageEnum(), subStage, expectedStageStatus); + + CloseStoreRefundInfoDO refundInfoDO = BeanUtil.toBean(request, CloseStoreRefundInfoDO.class); + refundInfoDO.setRefundNo(generateCloseStoreNo()); + // 提交新管家 + XgjReimburseRequest xgjReimburseRequest = request.convertToXgjRequest(mkUser, closeStoreInfo.getCloseReason(), storeDO); + String orderNo = thirdXgjService.reimburse(xgjReimburseRequest); + refundInfoDO.setRefundOrderNo(orderNo); + refundInfoDO.setRefundStatus(RefundPayStatusEnum.APPROVING.getStatus()); + refundInfoDO.setSubmitterId(StringUtils.isNotBlank(refundInfoDO.getSubmitterId()) ? refundInfoDO.getSubmitterId() : mkUser.getJobnumber()); + refundInfoDO.setSubmitterName(StringUtils.isNotBlank(refundInfoDO.getSubmitterName()) ? refundInfoDO.getSubmitterName() : mkUser.getName()); + return closeStoreRefundInfoDAO.insertSelective(refundInfoDO); + } + + @Override + public Boolean updateRefund(CloseStoreRefundUpdateRequest request) { + CloseStoreMkUserDTO mkUser = getCurrentMkUser(); + // 校验是否有每刻权限 + if (Objects.isNull(mkUser)) { + throw new ServiceException(ErrorCodeEnum.CLOSE_STORE_REFUND_MK_USER_NOT_EXIST); + } + CloseStoreRefundInfoDO old = closeStoreRefundInfoDAO.getById(request.getId()); + if (Objects.isNull(old)) { + throw new ServiceException(ErrorCodeEnum.CLOSE_STORE_REFUND_INFO_NOT_EXIST); + } + CloseStoreSubStageEnum subStage = CloseStoreSubStageEnum.getSubStageByStage(old.getType()); + CloseStoreSubStageStatusEnum expectedStageStatus = CloseStoreSubStageEnum.CLOSE_STORE_SUB_STAGE_30.equals(subStage) ? CloseStoreSubStageStatusEnum.CLOSE_STORE_SUB_STAGE_STATUS_35 : CloseStoreSubStageStatusEnum.CLOSE_STORE_SUB_STAGE_STATUS_45; + assert subStage != null; + // 校验阶段状态 + closeStoreStageInfoDAO.verifyStage(request.getCloseStoreId(), subStage.getCloseStoreStageEnum(), subStage, expectedStageStatus); + + CloseStoreRefundInfoDO refundInfoDO = BeanUtil.toBean(request, CloseStoreRefundInfoDO.class); + refundInfoDO.setSubmitterId(StringUtils.isNotBlank(refundInfoDO.getSubmitterId()) ? refundInfoDO.getSubmitterId() : mkUser.getJobnumber()); + refundInfoDO.setSubmitterName(StringUtils.isNotBlank(refundInfoDO.getSubmitterName()) ? refundInfoDO.getSubmitterName() : mkUser.getName()); + return closeStoreRefundInfoDAO.updateSelective(refundInfoDO); + } + + @Override + public CloseStoreMkUserDTO getCurrentMkUser() { + EnterpriseUserDO user = enterpriseUserDAO.getUserInfoById(CurrentUserHolder.getUserId()); + String mkUserStr = redisUtilPool.hashGet(RedisConstant.MK_USER_MAPPING, user.getJobnumber()); + if (StringUtils.isNotBlank(mkUserStr)) { + return JSONObject.parseObject(mkUserStr, CloseStoreMkUserDTO.class); + } + return null; + } + + @Override + public CloseStoreRefundDetailVO getRefundDetail(Long id) { + CloseStoreRefundInfoDO refundInfoDO = closeStoreRefundInfoDAO.getById(id); + if (Objects.nonNull(refundInfoDO)) { + CloseStoreRefundDetailVO vo = BeanUtil.toBean(refundInfoDO, CloseStoreRefundDetailVO.class); + CloseStoreInfoDO closeStoreInfoDO = closeStoreInfoDAO.getById(refundInfoDO.getCloseStoreId()); + if (Objects.nonNull(closeStoreInfoDO)) { + vo.setCloseReason(closeStoreInfoDO.getCloseReason()); + } + dictService.fillDictField(vo); + return vo; + } + return null; + } + + @Override + @Transactional + public void completeRefund(Long refundId, Date refundTime) { + CloseStoreRefundInfoDO refundInfoDO = closeStoreRefundInfoDAO.getById(refundId); + if (Objects.nonNull(refundInfoDO) && !RefundPayStatusEnum.PAY_SUCCESS.getStatus().equals(refundInfoDO.getRefundStatus())) { + CloseStoreSubStageEnum subStage = CloseStoreSubStageEnum.getSubStageByStage(refundInfoDO.getType()); + if (Objects.nonNull(subStage)) { + // 修改退款状态 + closeStoreRefundInfoDAO.updateRefundStatus(refundId, RefundPayStatusEnum.PAY_SUCCESS.getStatus(), refundTime); + // 流程流转 + closeStoreService.closeStoreProcessFlow(refundInfoDO.getCloseStoreId(), subStage); + } + } + } + + @Override + public List getRefundSimpleList(Long closeStoreId) { + List list = closeStoreRefundInfoDAO.getListByCloseStoreId(closeStoreId, null); + return BeanUtil.toList(list, CloseStoreRefundSimpleVO.class); + } + + @Override + @Transactional + public void skip(CloseStoreRefundSkipRequest request) { + CloseStoreSubStageEnum subStage = CloseStoreSubStageEnum.getSubStageByStage(request.getType()); + CloseStoreSubStageStatusEnum expectedStageStatus = CloseStoreSubStageEnum.CLOSE_STORE_SUB_STAGE_30.equals(subStage) ? CloseStoreSubStageStatusEnum.CLOSE_STORE_SUB_STAGE_STATUS_35 : CloseStoreSubStageStatusEnum.CLOSE_STORE_SUB_STAGE_STATUS_45; + assert subStage != null; + closeStoreStageInfoDAO.verifyStage(request.getCloseStoreId(), subStage.getCloseStoreStageEnum(), subStage, expectedStageStatus); + // 流程流转 + closeStoreService.closeStoreProcessFlow(request.getCloseStoreId(), subStage); + } + + @Override + public PageInfo refundPage(CloseStoreRefundQueryRequest request) { + PageHelper.startPage(request.getPageNum(), request.getPageSize()); + List list = closeStoreRefundInfoDAO.getListByCloseStoreId(request.getCloseStoreId(), request.getType()); + PageInfo page = new PageInfo<>(list); + return BeanUtil.toPage(page, CloseStoreRefundListVO.class); + } + + @Override + public Boolean refreshRefundOrderStatus(CloseStoreRefundQueryRequest request) { + List list = closeStoreRefundInfoDAO.getListByCloseStoreId(request.getCloseStoreId(), request.getType()); + List updateList = new ArrayList<>(); + for (CloseStoreRefundInfoDO refundInfoDO : list) { + if (StringUtils.isNotBlank(refundInfoDO.getRefundOrderNo())) { + XgjPayResultDTO xgjPayResultDTO = thirdXgjService.queryOrderStatus(new XgjPaymentRequest(refundInfoDO.getRefundOrderNo())); + String xgjStatus = xgjPayResultDTO.getStatus(); + String refundStatus = XgjRefundPayStatusEnum.REJECTED.getStatus().equals(xgjStatus) ? RefundPayStatusEnum.APPROVING.getStatus() : xgjStatus; + if (!refundInfoDO.getRefundStatus().equals(refundStatus)) { + updateList.add(CloseStoreRefundInfoDO.builder().id(refundInfoDO.getId()).refundStatus(refundStatus).build()); + } + } + } + if (CollectionUtils.isNotEmpty(updateList)) { + closeStoreRefundInfoDAO.updateRefundStatusBatchById(list); + } + return true; + } + + /** + * 生成退款申请单号 + */ + private String generateCloseStoreNo(){ + return "T" + CoolDateUtils.getTodayMillis(); + } +} diff --git a/coolstore-partner-service/src/main/java/com/cool/store/service/close/impl/CloseStoreServiceImpl.java b/coolstore-partner-service/src/main/java/com/cool/store/service/close/impl/CloseStoreServiceImpl.java new file mode 100644 index 000000000..4b0d37a32 --- /dev/null +++ b/coolstore-partner-service/src/main/java/com/cool/store/service/close/impl/CloseStoreServiceImpl.java @@ -0,0 +1,621 @@ +package com.cool.store.service.close.impl; + +import cn.hutool.core.collection.CollStreamUtil; +import cn.hutool.core.collection.CollectionUtil; +import com.alibaba.fastjson.JSONObject; +import com.cool.store.constants.CommonConstants; +import com.cool.store.context.CurrentUserHolder; +import com.cool.store.context.LoginUserInfo; +import com.cool.store.context.PartnerUserHolder; +import com.cool.store.dao.*; +import com.cool.store.dao.store.StoreMasterSignerInfoDAO; +import com.cool.store.dto.store.StoreMasterIssueDTO; +import com.cool.store.entity.*; +import com.cool.store.entity.store.StoreMasterSignerInfoDO; +import com.cool.store.enums.*; +import com.cool.store.enums.close.*; +import com.cool.store.enums.master.StoreCloseReasonEnum; +import com.cool.store.exception.ServiceException; +import com.cool.store.mq.producer.SimpleMessageService; +import com.cool.store.request.close.store.*; +import com.cool.store.response.AuditInfoResponse; +import com.cool.store.service.UserAuthMappingService; +import com.cool.store.service.close.CloseStoreService; +import com.cool.store.utils.BeanUtil; +import com.cool.store.utils.CoolDateUtils; +import com.cool.store.utils.poi.StringUtils; +import com.cool.store.vo.PartnerUserInfoVO; +import com.cool.store.vo.close.store.*; +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.apache.commons.collections4.ListUtils; +import org.springframework.beans.factory.annotation.Value; +import org.springframework.stereotype.Service; +import org.springframework.transaction.annotation.Transactional; + +import java.util.*; +import java.util.stream.Collectors; + +/** + * @Author suzhuhong + * @Date 2025/9/23 15:48 + * @Version 1.0 + */ +@Service +@RequiredArgsConstructor +@Slf4j +public class CloseStoreServiceImpl implements CloseStoreService { + + private final CloseStoreInfoDAO closeStoreInfoDAO; + private final CloseStoreAuditRecordDAO closeStoreAuditRecordDAO; + private final UserAuthMappingService userAuthMappingService; + private final CloseStoreFileInfoDAO closeStoreFileInfoDAO; + private final CloseStoreFileDetailDAO closeStoreFileDetailDAO; + private final CloseStoreAccountInfoDAO closeStoreAccountInfoDAO; + private final CloseStoreStageInfoDAO closeStoreStageInfoDAO; + private final StoreDao storeDao; + private final RegionDao regionDao; + private final EnterpriseUserRoleDao enterpriseUserRoleDao; + private final StoreMasterSignerInfoDAO storeMasterSignerInfoDAO; + private final SimpleMessageService simpleMessageService; + private final CloseStoreRefundInfoDAO closeStoreRefundInfoDAO; + private final EnterpriseUserDAO enterpriseUserDAO; + + @Value("${mybatis.configuration.variables.enterpriseId}") + private String enterpriseId; + + + @Override + @Transactional + public Boolean applyCloseStore(CloseStoreApplyRequest request) { + // 查询当前当前门店 校验门店状态 + StoreDO store = storeDao.getByStoreId(request.getStoreId()); + if (store == null){ + throw new ServiceException(ErrorCodeEnum.STORE_NOT_EXIST); + } + if (CommonConstants.CLOSED.equals(store.getStoreStatus())){ + throw new ServiceException(ErrorCodeEnum.STORE_NOT_OPEN); + } + // 校验是否有正在进行的申请 + if (closeStoreInfoDAO.existOngoingRecord(request.getStoreId())) { + throw new ServiceException(ErrorCodeEnum.CLOSE_STORE_EXIST_ONGOING_RECORD); + } + RegionDO regionDO = regionDao.getRegionByStoreId(store.getStoreId()); + if (Objects.isNull(regionDO)) { + throw new ServiceException(ErrorCodeEnum.REGION_NOT_EXIST); + } + String userId, userName; + if (CloseTypeEnum.INITIATE.getCloseType().equals(request.getCloseType())) { + // 主动发起的申请人为加盟商,从C端登录用户信息中获取 + PartnerUserInfoVO user = PartnerUserHolder.getUser(); + userId = user.getPartnerId(); + userName = user.getUsername(); + if (StringUtils.isBlank(userName)) { + userName = user.getMobile(); + } + } else { + userId = AIEnum.AI_ID.getCode(); + userName = AIEnum.AI_NAME.getCode(); + } + CloseStoreInfoDO closeStoreInfoDO = new CloseStoreInfoDO(); + closeStoreInfoDO.setCloseStoreNo(generateCloseStoreNo()); + closeStoreInfoDO.setStoreId(request.getStoreId()); + closeStoreInfoDO.setRegionId(regionDO.getId()); + closeStoreInfoDO.setPlanCloseData(request.getPlanCloseDate()); + closeStoreInfoDO.setCloseType(request.getCloseType()); + closeStoreInfoDO.setCloseReason(request.getCloseReason()); + closeStoreInfoDO.setReasonDescription(request.getReasonDescription()); + closeStoreInfoDO.setCloseStatus(CloseStoreStatusEnum.UNDER_APPROVAL.getCloseStoreStatus()); + closeStoreInfoDO.setApplyUserId(userId); + closeStoreInfoDAO.insertSelective(closeStoreInfoDO); + // 查询督导 + List auditUserIds = getAuditUserIds(regionDO.getId(), UserRoleEnum.SUPERVISION); + closeStoreAuditRecordDAO.addRecord(closeStoreInfoDO.getId(), userId, userName, auditUserIds); + return Boolean.TRUE; + } + + @Override + @Transactional + public Boolean reApplyCloseStore(ReCloseStoreApplyRequest request) { + CloseStoreInfoDO closeStoreInfoDO = closeStoreInfoDAO.getById(request.getCloseStoreId()); + if (Objects.isNull(closeStoreInfoDO)) { + throw new ServiceException(ErrorCodeEnum.CLOSE_STORE_INFO_NOT_EXIST); + } + CloseStoreApplyRequest applyRequest = CloseStoreApplyRequest.builder() + .planCloseDate(closeStoreInfoDO.getPlanCloseData()) + .closeReason(closeStoreInfoDO.getCloseReason()) + .reasonDescription(closeStoreInfoDO.getReasonDescription()) + .closeType(closeStoreInfoDO.getCloseType()) + .storeId(closeStoreInfoDO.getStoreId()) + .build(); + return applyCloseStore(applyRequest); + } + + @Override + @Transactional + public Boolean thirdApplyCloseStore(ThirdCloseStoreApplyRequest request) { + StoreDO storeDO = storeDao.getByStoreNum(request.getStoreNum()); + if (Objects.isNull(storeDO)) { + throw new ServiceException(ErrorCodeEnum.STORE_NOT_EXIST); + } + CloseStoreApplyRequest closeRequest = request.convert(storeDO.getStoreId()); + return applyCloseStore(closeRequest); + } + + @Override + @Transactional + public Boolean auditPass(CloseStoreAuditRequest request) { + CloseStoreAuditRecordDO auditRecordDO = closeStoreAuditRecordDAO.getById(request.getAuditRecordId()); + // 校验审批权限 + auditVerify(auditRecordDO); + CloseStoreInfoDO closeStoreInfoDO = closeStoreInfoDAO.getById(auditRecordDO.getCloseStoreId()); + if (Objects.isNull(closeStoreInfoDO)) { + throw new ServiceException(ErrorCodeEnum.CLOSE_STORE_INFO_NOT_EXIST); + } + // 修改闭店申请信息 + Integer currentCloseStatus = closeStoreInfoDO.getCloseStatus(); + Integer nextCloseStatus = CloseStoreStatusEnum.getNextPassStatus(currentCloseStatus); + if (Objects.nonNull(request.getCloseReason())) { + closeStoreInfoDO.setCloseReason(request.getCloseReason()); + } + closeStoreInfoDO.setActualCloseData(request.getActualCloseData()); + closeStoreInfoDO.setCloseStatus(nextCloseStatus); + closeStoreInfoDAO.updateSelective(closeStoreInfoDO); + // 修改闭店审批信息 + auditRecordDO.setAuditStatus(CloseStoreAuditStatusEnum.PASS.getStatus()); + auditRecordDO.setActionRemark(request.getRemark()); + auditRecordDO.setHandlerUserId(CurrentUserHolder.getUserId()); + auditRecordDO.setHandlerUserName(CurrentUserHolder.getUser().getName()); + auditRecordDO.setFinishTaskTime(new Date()); + closeStoreAuditRecordDAO.updateRecord(auditRecordDO); + // 督导审批结束后为大区经理审批 + if (CloseStoreStatusEnum.MANAGER_UNDER_APPROVAL.getCloseStoreStatus().equals(nextCloseStatus)) { + // 新增大区老总审批 + List auditUserIds = getAuditUserIds(closeStoreInfoDO.getRegionId(), UserRoleEnum.REGION_MANAGER); + closeStoreAuditRecordDAO.addApproveRecord(closeStoreInfoDO.getId(), auditUserIds); + } else { + // 完成闭店,再进入闭店流程 + closeStoreFlowInit(closeStoreInfoDO, closeStoreInfoDO.getStoreId(), closeStoreInfoDO.getCloseReason()); + } + return true; + } + + @Override + @Transactional + public Boolean auditReject(CloseStoreAuditRequest request) { + CloseStoreAuditRecordDO auditRecordDO = closeStoreAuditRecordDAO.getById(request.getAuditRecordId()); + // 校验审批权限 + auditVerify(auditRecordDO); + CloseStoreInfoDO closeStoreInfoDO = closeStoreInfoDAO.getById(auditRecordDO.getCloseStoreId()); + if (Objects.isNull(closeStoreInfoDO)) { + throw new ServiceException(ErrorCodeEnum.CLOSE_STORE_INFO_NOT_EXIST); + } + closeStoreInfoDO.setCloseStatus(CloseStoreStatusEnum.REVIEW_NOT_APPROVED.getCloseStoreStatus()); + closeStoreInfoDAO.updateSelective(closeStoreInfoDO); + // 修改闭店审批信息 + auditRecordDO.setAuditStatus(CloseStoreAuditStatusEnum.REJECTED.getStatus()); + auditRecordDO.setActionRemark(request.getRemark()); + auditRecordDO.setHandlerUserId(CurrentUserHolder.getUserId()); + auditRecordDO.setHandlerUserName(CurrentUserHolder.getUser().getName()); + auditRecordDO.setFinishTaskTime(new Date()); + closeStoreAuditRecordDAO.updateRecord(auditRecordDO); + return true; + } + + @Override + @Transactional + public Boolean cancelApply(Long closeStoreId) { + CloseStoreInfoDO closeStoreInfoDO = closeStoreInfoDAO.getById(closeStoreId); + if (Objects.isNull(closeStoreInfoDO)) { + throw new ServiceException(ErrorCodeEnum.CLOSE_STORE_INFO_NOT_EXIST); + } + if (CloseStoreStatusEnum.CANCELED.getCloseStoreStatus().equals(closeStoreInfoDO.getCloseStatus())) { + throw new ServiceException(ErrorCodeEnum.CLOSE_STORE_CANCELED); + } + // 未审批前能够取消 + if (!CloseStoreStatusEnum.UNDER_APPROVAL.getCloseStoreStatus().equals(closeStoreInfoDO.getCloseStatus())) { + throw new ServiceException(ErrorCodeEnum.CLOSE_STORE_CANCEL_ERROR); + } + // 非申请人无法取消 + if (!closeStoreInfoDO.getApplyUserId().equals(PartnerUserHolder.getUser().getPartnerId())) { + throw new ServiceException(ErrorCodeEnum.CLOSE_STORE_IS_NOT_APPLICANT); + } + // 修改闭店申请信息 + closeStoreInfoDO.setCloseStatus(CloseStoreStatusEnum.CANCELED.getCloseStoreStatus()); + closeStoreInfoDAO.updateSelective(closeStoreInfoDO); + // 删除待处理的审批记录 + closeStoreAuditRecordDAO.deletePendingRecord(closeStoreId); + return true; + } + + @Override + public PageInfo closeStoreAuditList(CloseStoreQueryRequest request) { + closeStoreRecordQueryBefore(request); + if (Objects.isNull(request.getAuditStatus())) { + request.setAuditStatus(CloseStoreAuditStatusEnum.PENDING.getStatus()); + } + LoginUserInfo user = CurrentUserHolder.getUser(); + Boolean isAdmin = enterpriseUserRoleDao.checkIsAdmin(user.getUserId()); + PageInfo pageInfo = closeStoreAuditRecordDAO.getCloseStoreAuditList(request, user.getUserId(), isAdmin); + fillCloseStoreRecord(request, pageInfo.getList()); + return pageInfo; + } + + @Override + public PageInfo closeStoreInfoList(CloseStoreQueryRequest request) { + closeStoreRecordQueryBefore(request); + request.setQueryStore(true); + String userId = CurrentUserHolder.getUserId(); + Boolean isAdmin = enterpriseUserRoleDao.checkIsAdmin(userId); + List regionIds = new ArrayList<>(); + if (!isAdmin) { + List userAuthMappingDOS = userAuthMappingService.listUserAuthMappingByUserId(userId); + if (CollectionUtils.isEmpty(userAuthMappingDOS)) { + return new PageInfo<>(); + } + regionIds = CollStreamUtil.toList(userAuthMappingDOS, UserAuthMappingDO::getMappingId); + } + PageInfo pageInfo = closeStoreInfoDAO.getCloseStoreInfoList(request, regionIds); + fillCloseStoreRecord(request, pageInfo.getList()); + List closeStoreIds = CollStreamUtil.toList(pageInfo.getList(), CloseStoreInfoListVO::getCloseStoreId); + Map completeCountMap = closeStoreStageInfoDAO.getCompleteCountMap(closeStoreIds); + pageInfo.getList().forEach(v -> { + v.setCompleteProcessNum(completeCountMap.getOrDefault(v.getCloseStoreId(), 0L).intValue()); + v.setTotalProcessNum(CloseStoreSubStageEnum.values().length); + }); + return pageInfo; + } + + @Override + public List getAuditRecordList(Long closeStoreId) { + CloseStoreInfoDO closeStoreInfoDO = closeStoreInfoDAO.getById(closeStoreId); + if (Objects.isNull(closeStoreInfoDO)) { + throw new ServiceException(ErrorCodeEnum.CLOSE_STORE_INFO_NOT_EXIST); + } + List list = closeStoreAuditRecordDAO.getListByCloseStoreId(closeStoreId); + Set userIds = new HashSet<>(); + list.forEach(v -> { + if (!CommonConstants.INDEX_ONE.equals(v.getRecordType()) || CloseTypeEnum.NO_ORDER_AUTO.getCloseType().equals(closeStoreInfoDO.getCloseType())) { + userIds.addAll(StringUtils.isNotBlank(v.getHandlerUserIds()) ? Arrays.asList(v.getHandlerUserIds().split(",")) : Collections.emptyList()); + } + }); + Map userMap = enterpriseUserDAO.getUserMap(new ArrayList<>(userIds)); + List result = new ArrayList<>(); + for (int i = 0; i < list.size(); i++) { + CloseStoreAuditRecordDO auditRecordDO = list.get(i); + AuditInfoResponse auditInfo = AuditInfoResponse.builder() + .type(getAuditInfoType(auditRecordDO)) + // 0加盟商发起 1云流水发起 2督导审批 3大区经理审批 + .execute(i == 0 ? (CloseTypeEnum.INITIATE.getCloseType().equals(closeStoreInfoDO.getCloseType()) ? 0 : 1) : i + 1) + .status(CommonConstants.INDEX_ZERO.equals(auditRecordDO.getAuditStatus()) ? 0 : 1) + .createTime(auditRecordDO.getCreateTime()) + .remark(auditRecordDO.getActionRemark()) + .actualUserId(auditRecordDO.getHandlerUserId()) + .build(); + List auditUserList = Arrays.stream(auditRecordDO.getHandlerUserIds().split(",")) + .filter(StringUtils::isNotBlank) + .map(v -> { + String userName = null, avatar = null; + if (CommonConstants.INDEX_ZERO.equals(auditInfo.getExecute())) { + userName = auditRecordDO.getHandlerUserName(); + } else { + EnterpriseUserDO user = userMap.get(v); + if (Objects.nonNull(user)) { + userName = user.getName(); + avatar = user.getAvatar(); + } + } + return new AuditInfoResponse.AuditUserInfoVO(v, userName, avatar); + }) + .collect(Collectors.toList()); + auditInfo.setList(auditUserList); + result.add(auditInfo); + } + return result; + } + + private Integer getAuditInfoType(CloseStoreAuditRecordDO 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; + } + } + } + + @Override + public CloseStoreInfoDetailVO getCloseStoreInfoDetail(Long closeStoreId, Boolean queryAuditId) { + CloseStoreInfoDO closeStoreInfoDO = closeStoreInfoDAO.getById(closeStoreId); + if (Objects.isNull(closeStoreInfoDO)) { + throw new ServiceException(ErrorCodeEnum.CLOSE_STORE_INFO_NOT_EXIST); + } + CloseStoreInfoDetailVO vo = new CloseStoreInfoDetailVO(); + BeanUtil.copyProperties(closeStoreInfoDO, vo); + + StoreDO storeDO = storeDao.getByStoreId(closeStoreInfoDO.getStoreId()); + if (Objects.nonNull(storeDO)) { + BeanUtil.copyPropertiesIgnoreId(storeDO, vo); + } + StoreMasterSignerInfoDO signerInfoDO = storeMasterSignerInfoDAO.getByStoreId(closeStoreInfoDO.getStoreId()); + if (Objects.nonNull(signerInfoDO)) { + BeanUtil.copyPropertiesIgnoreId(signerInfoDO, vo); + } + if (Boolean.TRUE.equals(queryAuditId)) { + CloseStoreAuditRecordDO pendingAuditRecord = closeStoreAuditRecordDAO.getPendingAuditRecord(closeStoreId); + if (Objects.nonNull(pendingAuditRecord)) { + vo.setAuditId(pendingAuditRecord.getId()); + } + } + return vo; + } + + @Override + public CloseStoreInfoDetailVO getCloseStoreInfoDetailByAuditId(Long closeStoreAuditId) { + CloseStoreAuditRecordDO auditRecordDO = closeStoreAuditRecordDAO.getById(closeStoreAuditId); + if (Objects.isNull(auditRecordDO)) { + throw new ServiceException(ErrorCodeEnum.CLOSE_STORE_AUDIT_RECORD_NOT_EXIST); + } + CloseStoreInfoDetailVO vo = getCloseStoreInfoDetail(auditRecordDO.getCloseStoreId(), null); + vo.setAuditId(auditRecordDO.getId()); + return vo; + } + + @Override + public List getStoreCloseReasonList(Integer closeType) { + return Arrays.stream(StoreCloseReasonEnum.values()) + .filter(v -> Objects.isNull(closeType) || v.getCloseNature().getCloseType().getCloseType().equals(closeType)) + .map(v -> new StoreCloseReasonVO(v.getCode(), v.getDesc(), v.getCloseNature().getCloseType().getCloseType())) + .collect(Collectors.toList()); + } + + @Override + public CloseStoreSimpleVO getCloseStoreSimpleInfo(Long closeStoreId) { + CloseStoreInfoDetailVO detail = getCloseStoreInfoDetail(closeStoreId, null); + CloseStoreSimpleVO vo = BeanUtil.toBean(detail, CloseStoreSimpleVO.class); + vo.setCompleteProcessNum(closeStoreStageInfoDAO.getCompleteCount(closeStoreId)); + vo.setTotalProcessNum(CloseStoreSubStageEnum.values().length); + List stageInfoList = closeStoreStageInfoDAO.getList(closeStoreId); + List subStageList = BeanUtil.toList(stageInfoList, CloseStoreSubStageStatusVO.class); + vo.setStageList(subStageList); + return vo; + } + + @Override + public PageInfo getMiniCloseStoreSimpleInfoList(MiniCloseStoreQueryRequest request) { + String userId = PartnerUserHolder.getUser().getPartnerId(); + PageHelper.startPage(request.getPageNum(), request.getPageSize()); + List list = closeStoreInfoDAO.getListByApplyUserId(userId, CloseTypeEnum.INITIATE.getCloseType(), request.getStoreId()); + PageInfo pageInfo = new PageInfo<>(list); + PageInfo voPage = BeanUtil.toPage(pageInfo, MiniCloseStoreSimpleVO.class); + + Set storeIds = CollStreamUtil.toSet(list, CloseStoreInfoDO::getStoreId); + List storeList = storeDao.getEffectiveStoreByStoreIds(new ArrayList<>(storeIds)); + Map storeMap = CollStreamUtil.toMap(storeList, StoreDO::getStoreId, v -> v); + + voPage.getList().forEach(v -> { + StoreDO storeDO = storeMap.get(v.getStoreId()); + if (Objects.nonNull(storeDO)) { + BeanUtil.copyPropertiesIgnoreId(storeDO, v, "createTime"); + } + }); + return voPage; + } + + @Override + public List getCloseStoreStatusList() { + return Arrays.stream(CloseStoreStatusEnum.values()) + .filter(v -> v != CloseStoreStatusEnum.MANAGER_UNDER_APPROVAL) + .map(v -> new CloseStoreStatusVO(v.getCloseStoreStatus(), v.getCloseStoreStatusName())) + .collect(Collectors.toList()); + } + + @Override + @Transactional + public void closeStoreProcessFlow(Long closeStoreId, CloseStoreSubStageEnum currentSubStage) { + CloseStoreStageInfoDO currentStage = closeStoreStageInfoDAO.getByStage(closeStoreId, currentSubStage.getCloseStoreStageEnum().getCloseStoreStage(), currentSubStage.getCloseStoreSubStage()); + CloseStoreSubStageStatusEnum stageStatus = CloseStoreSubStageStatusEnum.getByStatus(currentStage.getShopSubStageStatus()); + // 已结束或未开始的流程不流转 + if (Objects.nonNull(stageStatus) && !CloseStoreSubStageStatusEnum.CLOSE_STORE_SUB_STAGE_STATUS_00.equals(stageStatus) && !stageStatus.isTerminated()) { + // 下个子阶段状态 + CloseStoreSubStageStatusEnum nextStageStatus = CloseStoreSubStageStatusEnum.getNextStageStatus(stageStatus); + if (Objects.nonNull(nextStageStatus)) { + log.info("进入子阶段下一阶段:{}, status:{}[{}]", nextStageStatus.getShopSubStageName(), nextStageStatus.getShopSubStageStatusName(), nextStageStatus.getShopSubStageStatus()); + currentStage.setShopSubStageStatus(nextStageStatus.getShopSubStageStatus()); + currentStage.setIsTerminated(nextStageStatus.isTerminated() ? 1 : 0); + currentStage.setUpdateTime(new Date()); + if (nextStageStatus.isTerminated()) { + currentStage.setActualCompleteTime(CoolDateUtils.getCurrentDateTime()); + } + closeStoreStageInfoDAO.updateSelective(currentStage); + if (nextStageStatus.isTerminated()) { + // 当前子阶段结束,开始下一个子阶段 + log.info("当前子阶段结束,进入下一个子阶段"); + openNextSubStage(closeStoreId, currentSubStage); + } + } + } + + } + + /** + * 开启下一个子阶段 + * @param closeStoreId 闭店申请ID + * @param currentSubStage 当前子阶段 + */ + public void openNextSubStage(Long closeStoreId, CloseStoreSubStageEnum currentSubStage) { + // 根据当前子阶段获取下一个需要开启的子阶段列表 + List nextSubStages = CloseStoreSubStageEnum.getNextSubStage(currentSubStage); + if (CollectionUtils.isEmpty(nextSubStages)) { + // 不存在下一子阶段,校验当前所有子阶段状态,修改闭店申请状态 + log.info("当前子阶段结束,不存在下一子阶段"); + verifyAndUpdateCloseStoreStatus(closeStoreId); + return; + } + log.info("开启子阶段:{}", StringUtils.join(CollStreamUtil.toList(nextSubStages, CloseStoreSubStageEnum::getCloseStoreSubStageName), ",")); + List subStageList = CollStreamUtil.toList(nextSubStages, CloseStoreSubStageEnum::getCloseStoreSubStage); + List stageInfoList = closeStoreStageInfoDAO.getBySubStage(closeStoreId, subStageList); + Map> stageMap = CollStreamUtil.group2Map(stageInfoList, CloseStoreStageInfoDO::getShopStage, CloseStoreStageInfoDO::getShopSubStage); + + List updateStageList = new ArrayList<>(); + for (CloseStoreSubStageEnum nextSubStage : nextSubStages) { + CloseStoreStageInfoDO stageInfoDO = stageMap.getOrDefault(nextSubStage.getCloseStoreStageEnum().getCloseStoreStage(), Collections.emptyMap()) + .get(nextSubStage.getCloseStoreSubStage()); + if (Objects.nonNull(stageInfoDO)) { + // 获取子阶段开始的状态 + CloseStoreSubStageStatusEnum openStageStatus = CloseStoreSubStageStatusEnum.getOpenStageStatus(nextSubStage); + if (Objects.nonNull(openStageStatus)) { + CloseStoreStageInfoDO updateStageInfo = CloseStoreStageInfoDO.builder() + .id(stageInfoDO.getId()) + .shopSubStageStatus(openStageStatus.getShopSubStageStatus()) + .build(); + updateStageList.add(updateStageInfo); + } + } + } + if (CollectionUtils.isNotEmpty(updateStageList)) { + closeStoreStageInfoDAO.updateBatchSelective(updateStageList); + } + } + + /** + * 校验当前所有子阶段状态,修改闭店申请状态 + * @param closeStoreId 闭店申请ID + */ + public void verifyAndUpdateCloseStoreStatus(Long closeStoreId) { + if (!closeStoreStageInfoDAO.existUnfinishedStage(closeStoreId)) { + // 所有子阶段都完成,修改闭店申请状态为已完成 + CloseStoreInfoDO closeStoreInfoDO = closeStoreInfoDAO.getById(closeStoreId); + if (Objects.nonNull(closeStoreInfoDO)) { + log.info("所有子阶段完成"); + closeStoreInfoDAO.updateSelective(CloseStoreInfoDO.builder().id(closeStoreId).closeStatus(CloseStoreStatusEnum.COMPLETED.getCloseStoreStatus()).build()); + } + } + } + + + /** + * 查询前置处理 + */ + private void closeStoreRecordQueryBefore(CloseStoreQueryRequest request) { + request.setQueryStore(StringUtils.isNotBlank(request.getStoreNameOrNum()) || StringUtils.isNotBlank(request.getJoinBrandList())); + request.setQuerySigner(StringUtils.isNotBlank(request.getSignerName()) || StringUtils.isNotBlank(request.getSignerMobile())); + if (StringUtils.isNotBlank(request.getJoinBrandList())) { + request.setJoinBrands(Arrays.stream(request.getJoinBrandList().split(",")).map(Integer::parseInt).collect(Collectors.toList())); + } + } + + /** + * 补充字段 + */ + private void fillCloseStoreRecord(CloseStoreQueryRequest request, List list) { + Set storeIds = new HashSet<>(); + Set signerStoreIds = new HashSet<>(); + if (!request.getQueryStore() || !request.getQuerySigner()) { + for (CloseStoreInfoListVO v : list) { + if (!request.getQueryStore()) { + storeIds.add(v.getStoreId()); + } + if (!request.getQuerySigner()) { + signerStoreIds.add(v.getStoreId()); + } + } + } + Map storeMap = Collections.emptyMap(); + Map signerMap = Collections.emptyMap(); + if (CollectionUtil.isNotEmpty(storeIds)) { + List storeList = storeDao.getEffectiveStoreByStoreIds(new ArrayList<>(storeIds)); + storeMap = CollStreamUtil.toMap(storeList, StoreDO::getStoreId, v -> v); + } + if (CollectionUtil.isNotEmpty(signerStoreIds)) { + signerMap = storeMasterSignerInfoDAO.getSignerMapByStoreIds(new ArrayList<>(signerStoreIds)); + } + if (!request.getQueryStore() || !request.getQuerySigner()) { + for (CloseStoreInfoListVO v : list) { + StoreDO storeDO = storeMap.get(v.getStoreId()); + if (Objects.nonNull(storeDO)) { + BeanUtil.copyPropertiesIgnoreId(storeDO, v); + } + StoreMasterSignerInfoDO signerInfoDO = signerMap.get(v.getStoreId()); + if (Objects.nonNull(signerInfoDO)) { + BeanUtil.copyPropertiesIgnoreId(signerInfoDO, v); + } + } + } + } + + /** + * 进入闭店流程初始化 + */ + private void closeStoreFlowInit(CloseStoreInfoDO closeStoreInfoDO, String storeId, Integer closeReason) { + Long closeStoreId = closeStoreInfoDO.getId(); + // 闭店资料初始化 + closeStoreFileInfoDAO.init(closeStoreId); + closeStoreFileDetailDAO.init(closeStoreId); + // 闭店账号初始化 + closeStoreAccountInfoDAO.init(closeStoreId); + // 闭店流程初始化 + closeStoreStageInfoDAO.initStageInfo(closeStoreId); + // 门店改为闭店,闭店时间为当前时间 + StoreCloseReasonEnum closeReasonEnum = StoreCloseReasonEnum.getByCode(closeReason); + assert closeReasonEnum != null; + storeDao.closeStore(storeId, closeReasonEnum.getCode(), closeReasonEnum.getCloseNature().getCode(), closeStoreInfoDO.getActualCloseData()); + // 用mq通知主应用下发门店主数据 + try { + StoreMasterIssueDTO storeMasterIssueDTO = new StoreMasterIssueDTO(enterpriseId, Collections.singletonList(storeId)); + simpleMessageService.send(JSONObject.toJSONString(storeMasterIssueDTO), RocketMqTagEnum.STORE_MASTER_ISSUE); + } catch (Exception e) { + log.error("mq通知主应用下发门店主数据失败"); + } + } + + /** + * 审批校验 + * @param auditRecordDO 审批记录 + */ + private void auditVerify(CloseStoreAuditRecordDO auditRecordDO) { + if (Objects.isNull(auditRecordDO)) { + throw new ServiceException(ErrorCodeEnum.CLOSE_STORE_AUDIT_RECORD_NOT_EXIST); + } + if (!CloseStoreAuditStatusEnum.PENDING.getStatus().equals(auditRecordDO.getAuditStatus())) { + throw new ServiceException(ErrorCodeEnum.CLOSE_STORE_HAS_BEEN_COMPLETED); + } + // 是否有审批权限 + String currentUserId = CurrentUserHolder.getUserId(); + if (StringUtils.isBlank(auditRecordDO.getHandlerUserIds())) { + throw new ServiceException(ErrorCodeEnum.NO_APPROVAL_AUTHORITY); + } + List userIds = Arrays.asList(auditRecordDO.getHandlerUserIds().split(",")); + if (!userIds.contains(currentUserId)) { + throw new ServiceException(ErrorCodeEnum.NO_APPROVAL_AUTHORITY); + } + } + + /** + * 获取拥有区域管辖权限的指定角色用户 + * @param regionId 区域id + * @param userRoleEnum 角色枚举 + * @return 用户id列表 + */ + private List getAuditUserIds(Long regionId, UserRoleEnum userRoleEnum) { + List allUserByRoleEnumAndRegionId = userAuthMappingService.getAllUserByRoleEnumAndRegionId(userRoleEnum, regionId); + return ListUtils.emptyIfNull(allUserByRoleEnumAndRegionId).stream().map(EnterpriseUserDO::getUserId).distinct().collect(Collectors.toList()); + } + + /** + * 生成闭店申请单号 + */ + private String generateCloseStoreNo(){ + return "C" + CoolDateUtils.getTodayMillis(); + } +} diff --git a/coolstore-partner-service/src/main/java/com/cool/store/service/close/impl/HuomaAccountClose.java b/coolstore-partner-service/src/main/java/com/cool/store/service/close/impl/HuomaAccountClose.java new file mode 100644 index 000000000..64bc2a88e --- /dev/null +++ b/coolstore-partner-service/src/main/java/com/cool/store/service/close/impl/HuomaAccountClose.java @@ -0,0 +1,35 @@ +package com.cool.store.service.close.impl; + +import com.cool.store.entity.StoreDO; +import com.cool.store.request.huoma.AccountCloseRequest; +import com.cool.store.service.HuoMaService; +import lombok.RequiredArgsConstructor; +import org.springframework.stereotype.Service; + +/** + *

+ * 火码账号关闭 + *

+ * + * @author wangff + * @since 2025/10/8 + */ +@Service +@RequiredArgsConstructor +public class HuomaAccountClose extends AbstractAccountClose { + private final HuoMaService huoMaService; + + @Override + public String getSystemCode() { + return "huoma"; + } + + @Override + public Boolean accountClose(String storeId) { + StoreDO storeDO = getStore(storeId); + AccountCloseRequest request = new AccountCloseRequest(); + request.setShop_sn(storeDO.getStoreNum()); + request.setEnable(0); + return huoMaService.accountClose(request); + } +} diff --git a/coolstore-partner-service/src/main/java/com/cool/store/service/close/impl/XinguanjiaAccountClose.java b/coolstore-partner-service/src/main/java/com/cool/store/service/close/impl/XinguanjiaAccountClose.java new file mode 100644 index 000000000..279a514c9 --- /dev/null +++ b/coolstore-partner-service/src/main/java/com/cool/store/service/close/impl/XinguanjiaAccountClose.java @@ -0,0 +1,37 @@ +package com.cool.store.service.close.impl; + +import com.cool.store.entity.StoreDO; +import com.cool.store.request.xgj.XgjAccountCloseRequest; +import com.cool.store.service.ThirdXgjService; +import lombok.RequiredArgsConstructor; +import org.springframework.stereotype.Service; + +import java.time.LocalDateTime; +import java.time.format.DateTimeFormatter; + +/** + *

+ * 新掌柜账号关闭 + *

+ * + * @author wangff + * @since 2025/10/8 + */ +@Service +@RequiredArgsConstructor +public class XinguanjiaAccountClose extends AbstractAccountClose { + private final ThirdXgjService thirdXgjService; + + @Override + public String getSystemCode() { + return "xinguanjia"; + } + + @Override + public Boolean accountClose(String storeId) { + StoreDO storeDO = getStore(storeId); + String closeTime = LocalDateTime.now().format(DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss")); + thirdXgjService.accountClose(new XgjAccountCloseRequest(storeDO.getStoreNum(), closeTime)); + return true; + } +} diff --git a/coolstore-partner-service/src/main/java/com/cool/store/service/impl/ThirdHuoMaServiceImpl.java b/coolstore-partner-service/src/main/java/com/cool/store/service/impl/ThirdHuoMaServiceImpl.java index e782f319b..602e91bc7 100644 --- a/coolstore-partner-service/src/main/java/com/cool/store/service/impl/ThirdHuoMaServiceImpl.java +++ b/coolstore-partner-service/src/main/java/com/cool/store/service/impl/ThirdHuoMaServiceImpl.java @@ -5,6 +5,7 @@ import com.alibaba.fastjson.JSONObject; import com.cool.store.enums.ErrorCodeEnum; import com.cool.store.exception.ServiceException; import com.cool.store.request.OrderSummaryRequest; +import com.cool.store.request.huoma.AccountCloseRequest; import com.cool.store.request.huoma.ShopBasicInfoRequest; import com.cool.store.response.IncomeBaseResponse; import com.cool.store.response.IncomeSummaryResponse; @@ -22,6 +23,7 @@ import org.springframework.beans.factory.annotation.Value; import org.springframework.stereotype.Service; import javax.annotation.Resource; +import java.util.List; import java.util.Map; /** @@ -85,6 +87,13 @@ public class ThirdHuoMaServiceImpl implements HuoMaService { return executeApiCall(apiUrl,requestBody,IncomeSummaryResponse.class); } + @Override + public Boolean accountClose(AccountCloseRequest requestBody) { + String apiUrl = url + "/dzgV1/shop/setShopEnableSwitch"; + executeApiCall(apiUrl, requestBody, List.class); + return true; + } + private T executeApiCall(String url, Object requestBody, Class responseType) { // 1. 打印请求前日志 diff --git a/coolstore-partner-service/src/main/java/com/cool/store/service/impl/ThirdXgjServiceImpl.java b/coolstore-partner-service/src/main/java/com/cool/store/service/impl/ThirdXgjServiceImpl.java new file mode 100644 index 000000000..e64757871 --- /dev/null +++ b/coolstore-partner-service/src/main/java/com/cool/store/service/impl/ThirdXgjServiceImpl.java @@ -0,0 +1,247 @@ +package com.cool.store.service.impl; + +import com.alibaba.fastjson.JSONObject; +import com.cool.store.dto.xgj.XgjBranchBankDTO; +import com.cool.store.dto.xgj.XgjPartnerPageDTO; +import com.cool.store.dto.xgj.XgjPayResultDTO; +import com.cool.store.enums.ErrorCodeEnum; +import com.cool.store.exception.ServiceException; +import com.cool.store.request.xgj.*; +import com.cool.store.response.XgjAccessTokenDTO; +import com.cool.store.response.oppty.OpportunityApiResponse; +import com.cool.store.service.ThirdXgjService; +import com.cool.store.utils.HmacSigner; +import com.cool.store.utils.poi.StringUtils; +import com.fasterxml.jackson.core.JsonProcessingException; +import com.fasterxml.jackson.databind.JavaType; +import com.fasterxml.jackson.databind.ObjectMapper; +import lombok.RequiredArgsConstructor; +import lombok.extern.slf4j.Slf4j; +import okhttp3.*; +import org.springframework.beans.factory.annotation.Value; +import org.springframework.stereotype.Service; + +import javax.annotation.Resource; +import java.nio.charset.StandardCharsets; +import java.util.Base64; +import java.util.List; +import java.util.Map; + +/** + *

+ * 新管家三方接口 服务实现类 + *

+ * + * @author wangff + * @since 2025/11/28 + */ +@Service +@RequiredArgsConstructor +@Slf4j +public class ThirdXgjServiceImpl implements ThirdXgjService { + @Value("${xgj.api.auth.url}") + private String xgjUrl; + + @Value("${xgj.api.token.url}") + private String xgjTokenUrl; + + @Value("${xgj.api.auth.username}") + private String xgjUsername; + + @Value("${xgj.api.auth.secret}") + private String xgjSecret; + + @Resource + OkHttpClient okHttpClient; + @Resource + ObjectMapper objectMapper; + + @Override + public String accountClose(XgjAccountCloseRequest request) { + String apiUrl = xgjUrl + "/dmp/dmp-join/open/closeStore"; + return executePostApiCall(apiUrl, request, String.class); + } + + @Override + public String reimburse(XgjReimburseRequest request) { + String apiUrl = xgjUrl + "/dmp/dmp-join/open/dmpJoinCloseOpen"; + return executePostApiCall(apiUrl, request, String.class); + } + + @Override + public String savePartner(XgjSavePartnerRequest request) { + String apiUrl = xgjUrl + "/dmp/dmp-join/open/saveMKPartner"; + return executePostApiCall(apiUrl, request, String.class); + } + + @Override + public XgjPayResultDTO queryOrderStatus(XgjPaymentRequest request) { + String apiUrl = xgjUrl + "/dmp/dmp-join/open/quryOrderStatus"; + return executePostApiCall(apiUrl, request, XgjPayResultDTO.class); + } + + @Override + public XgjPartnerPageDTO queryPartnerPage(XgjPartnerQueryRequest request) { + String apiUrl = xgjUrl + "/dmp/dmp-join/open/partnerPage"; + return executePostApiCall(apiUrl, request, XgjPartnerPageDTO.class); + } + + @Override + public List queryBranchBankList(XgjBankQueryRequest request) { + String apiUrl = xgjUrl = "/dmp-payment/open/queryOpenBankNoByBankName"; + return executePostApiCall(apiUrl, request, List.class); + } + + private T executePostApiCall(String url, Object requestBody, Class responseType) { + // 1. 打印请求前日志 + logRequest(url, requestBody); + + try { + String accessToken = getXgjAccessToken().getAccess_token(); + + Request request = buildRequest(requestBody, url,accessToken); + + request.headers().names().forEach(x->{ + log.info(x+": {}",request.header(x)); + }); + + try (Response response = okHttpClient.newCall(request).execute()) { + // 2. 获取原始响应内容 + String responseBody = response.body().string(); + + // 3. 打印响应日志 + logResponse(url, response.code(), responseBody); + + if (!response.isSuccessful()) { + throw new ServiceException(ErrorCodeEnum.THIRD_API_ERROR, + "HTTP请求失败,状态码: " + response.code()); + } + + // 4. 解析响应 + JavaType javaType = objectMapper.getTypeFactory() + .constructParametricType(OpportunityApiResponse.class, responseType); + + OpportunityApiResponse apiResponse = objectMapper.readValue(responseBody, javaType); + + if (apiResponse.getCode() != 200) { + throw new ServiceException(ErrorCodeEnum.THIRD_API_ERROR,apiResponse.getMsg()); + } + return apiResponse.getData(); + } + } catch (ServiceException e) { + throw e; + } catch (Exception e) { + log.error("API调用异常 - URL: {}, 错误: {}", url, e.getMessage(), e); + throw new ServiceException(ErrorCodeEnum.THIRD_API_ERROR, "接口调用异常: " + e.getMessage()); + } + } + + private void logRequest(String url, Object requestBody) { + if (log.isInfoEnabled()) { + try { + log.info("\n======= 请求开始 =======\n" + + "API地址: {}\n" + + "请求参数: {}\n" + + "======= 请求结束 =======", + url, + objectMapper.writerWithDefaultPrettyPrinter() + .writeValueAsString(requestBody)); + } catch (JsonProcessingException e) { + log.warn("日志JSON序列化失败", e); + } + } + } + + public XgjAccessTokenDTO getXgjAccessToken() { + String apiUrl = xgjTokenUrl + "/oauth2/token?grant_type=client_credentials&scope=server"; + String clientId = "dmp-join"; + String clientSecret = "dmp20250528"; + String auth = clientId + ":" + clientSecret; + String encodedAuth = Base64.getEncoder().encodeToString(auth.getBytes(StandardCharsets.UTF_8)); + byte[] bytes = new byte[0]; + Request request = new Request.Builder() + .url(apiUrl) + .post(RequestBody.create(MediaType.parse("application/json; charset=UTF-8"),bytes)) + .header("Authorization", "Basic " + encodedAuth) + .build(); + try (Response response = okHttpClient.newCall(request).execute()) { + if (!response.isSuccessful()) { + throw new ServiceException(ErrorCodeEnum.THIRD_API_ERROR, + "HTTP请求失败,状态码: " + response.code()); + } + String responseBody = response.body().string(); + XgjAccessTokenDTO xgjAccessTokenDTO = objectMapper.readValue(responseBody, XgjAccessTokenDTO.class); + return xgjAccessTokenDTO; + } catch (ServiceException e) { + throw e; + } catch (Exception e) { + log.error("API调用异常 - URL: {}, 错误: {}", apiUrl, e.getMessage(), e); + throw new ServiceException(ErrorCodeEnum.THIRD_API_ERROR, "接口调用异常: " + e.getMessage()); + } + } + + private Request buildRequest(Object requestBody, String url,String accessToken) { + + try { + Map authHeaders = HmacSigner.generateHeaders( + xgjUsername, xgjSecret, JSONObject.toJSONString(requestBody)); + + log.debug("签名生成 - 签名结果: {}", JSONObject.toJSONString(authHeaders)); + + RequestBody body = RequestBody.create(MediaType.parse("application/json"), + JSONObject.toJSONString(requestBody) + ); + log.info(JSONObject.toJSONString(requestBody)); + Request.Builder builder = new Request.Builder() + .url(url) + .post(body) + .addHeader("Content-Type", "application/json") + .addHeader("Accept", "application/json") + .addHeader("x-Date", authHeaders.get("x-Date")) + .addHeader("Digest", authHeaders.get("Digest")); + if (!url.contains("get-token-byshopcode")&& StringUtils.isEmpty(accessToken)){ + builder.addHeader("Authorization", authHeaders.get("Authorization")); + } + //新管家特定接口 + if (StringUtils.isNotEmpty(accessToken)){ + builder.addHeader("Authorization", "Bearer "+accessToken); + } + return builder.build(); + } catch (Exception e) { + throw new ServiceException(ErrorCodeEnum.THIRD_API_SIGN_ERROR); + } + } + + /** + * 记录响应日志 + */ + private void logResponse(String url, int statusCode, String responseBody) { + if (log.isInfoEnabled()) { + try { + // 尝试美化JSON输出 + Object json = objectMapper.readValue(responseBody, Object.class); + String prettyResponse = objectMapper.writerWithDefaultPrettyPrinter() + .writeValueAsString(json); + + log.info("\n======= 响应开始 =======\n" + + "API地址: {}\n" + + "HTTP状态码: {}\n" + + "响应内容: {}\n" + + "======= 响应结束 =======", + url, + statusCode, + prettyResponse); + } catch (Exception e) { + // 非JSON响应或解析失败时直接输出原始内容 + log.info("\n======= 响应开始 =======\n" + + "API地址: {}\n" + + "HTTP状态码: {}\n" + + "原始响应: {}\n" + + "======= 响应结束 =======", + url, + statusCode, + responseBody); + } + } + } +} diff --git a/coolstore-partner-web/src/main/java/com/cool/store/controller/webb/CloseStoreAccountController.java b/coolstore-partner-web/src/main/java/com/cool/store/controller/webb/CloseStoreAccountController.java new file mode 100644 index 000000000..bc4cb2292 --- /dev/null +++ b/coolstore-partner-web/src/main/java/com/cool/store/controller/webb/CloseStoreAccountController.java @@ -0,0 +1,48 @@ +package com.cool.store.controller.webb; + +import com.cool.store.response.ResponseResult; +import com.cool.store.service.close.CloseStoreAccountService; +import com.cool.store.vo.close.account.CloseStoreAccountVO; +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.GetMapping; +import org.springframework.web.bind.annotation.PostMapping; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RestController; + +import javax.validation.constraints.NotNull; +import java.util.List; + +/** + *

+ * 闭店账号关闭 前端控制器 + *

+ * + * @author wangff + * @since 2025/10/8 + */ +@Api(tags = "闭店账号关闭") +@RestController +@RequestMapping("/pc/close/account") +@RequiredArgsConstructor +@Validated +public class CloseStoreAccountController { + private final CloseStoreAccountService closeStoreAccountService; + + @ApiOperation("获取账号列表") + @GetMapping("/accountList") + @ApiImplicitParam(name = "closeStoreId", value = "闭店申请id", required = true, dataType = "Long") + public ResponseResult> accountList(@NotNull(message = "闭店申请id不能为空") Long closeStoreId) { + return ResponseResult.success(closeStoreAccountService.getAccountList(closeStoreId)); + } + + @ApiOperation("账号关闭") + @PostMapping("/accountClose") + @ApiImplicitParam(name = "id", value = "列表接口中返回的id", required = true, dataType = "Long") + public ResponseResult accountClose(@NotNull(message = "id不能为空") Long id) { + return ResponseResult.success(closeStoreAccountService.closeAccount(id)); + } +} diff --git a/coolstore-partner-web/src/main/java/com/cool/store/controller/webb/CloseStoreController.java b/coolstore-partner-web/src/main/java/com/cool/store/controller/webb/CloseStoreController.java new file mode 100644 index 000000000..588c19ad0 --- /dev/null +++ b/coolstore-partner-web/src/main/java/com/cool/store/controller/webb/CloseStoreController.java @@ -0,0 +1,100 @@ +package com.cool.store.controller.webb; + +import com.cool.store.request.close.store.CloseStoreQueryRequest; +import com.cool.store.request.close.store.CloseStoreAuditRequest; +import com.cool.store.response.AuditInfoResponse; +import com.cool.store.response.ResponseResult; +import com.cool.store.service.close.CloseStoreService; +import com.cool.store.vo.close.store.*; +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/10/9 + */ +@Api(tags = "闭店管理") +@RestController +@RequestMapping("/pc/close/store") +@RequiredArgsConstructor +@Validated +public class CloseStoreController { + private final CloseStoreService closeStoreService; + + @ApiOperation("闭店审批待办") + @GetMapping("/todoPage") + public ResponseResult> getAuditTodoList(CloseStoreQueryRequest request) { + return ResponseResult.success(closeStoreService.closeStoreAuditList(request)); + } + + @ApiOperation("闭店管理列表") + @GetMapping("/recordPage") + public ResponseResult> getCloseStoreRecordList(CloseStoreQueryRequest request) { + return ResponseResult.success(closeStoreService.closeStoreInfoList(request)); + } + + @ApiOperation("审批通过") + @PostMapping("/audit/pass") + public ResponseResult auditPass(@RequestBody CloseStoreAuditRequest request) { + return ResponseResult.success(closeStoreService.auditPass(request)); + } + + @ApiOperation("审批拒绝") + @PostMapping("/audit/reject") + public ResponseResult auditReject(@RequestBody CloseStoreAuditRequest request) { + return ResponseResult.success(closeStoreService.auditReject(request)); + } + + @ApiOperation("查询闭店审批记录") + @GetMapping("/audit/list") + @ApiImplicitParam(name = "closeStoreId", value = "闭店申请id", required = true, dataType = "Long", paramType = "query") + public ResponseResult> getAuditList(@NotNull(message = "闭店申请id不能为空") Long closeStoreId) { + return ResponseResult.success(closeStoreService.getAuditRecordList(closeStoreId)); + } + + @ApiOperation("根据闭店申请id获取闭店申请详细") + @GetMapping("/detail") + @ApiImplicitParam(name = "closeStoreId", value = "闭店申请id", required = true, dataType = "Long", paramType = "query") + public ResponseResult getCloseStoreDetail(@NotNull(message = "闭店申请id不能为空") Long closeStoreId) { + return ResponseResult.success(closeStoreService.getCloseStoreInfoDetail(closeStoreId, true)); + } + + @ApiOperation("根据闭店申请id获取闭店申请简单信息") + @GetMapping("/simple") + @ApiImplicitParam(name = "closeStoreId", value = "闭店申请id", required = true, dataType = "Long", paramType = "query") + public ResponseResult getCloseStoreSimple(@NotNull(message = "闭店申请id不能为空") Long closeStoreId) { + return ResponseResult.success(closeStoreService.getCloseStoreSimpleInfo(closeStoreId)); + } + + @ApiOperation("根据审批id获取闭店申请详细") + @GetMapping("/detailByAudit") + @ApiImplicitParam(name = "closeStoreAuditId", value = "审批id", required = true, dataType = "Long", paramType = "query") + public ResponseResult getCloseStoreDetailByAuditId(@NotNull(message = "审批id不能为空") Long closeStoreAuditId) { + return ResponseResult.success(closeStoreService.getCloseStoreInfoDetailByAuditId(closeStoreAuditId)); + } + + @ApiOperation("闭店原因列表") + @GetMapping("/closeReasonList") + @ApiImplicitParam(name = "closeType", value = "闭店发起方式,1主动发起,2云流水发起", required = true, dataType = "Integer", paramType = "query") + public ResponseResult> getStoreCloseReasonList(Integer closeType) { + return ResponseResult.success(closeStoreService.getStoreCloseReasonList(closeType)); + } + + @ApiOperation("闭店状态列表") + @GetMapping("/closeStatusList") + public ResponseResult> getCloseStoreStatusList() { + return ResponseResult.success(closeStoreService.getCloseStoreStatusList()); + } +} diff --git a/coolstore-partner-web/src/main/java/com/cool/store/controller/webb/CloseStoreFileController.java b/coolstore-partner-web/src/main/java/com/cool/store/controller/webb/CloseStoreFileController.java new file mode 100644 index 000000000..48870fdb5 --- /dev/null +++ b/coolstore-partner-web/src/main/java/com/cool/store/controller/webb/CloseStoreFileController.java @@ -0,0 +1,69 @@ +package com.cool.store.controller.webb; + +import com.cool.store.request.close.file.*; +import com.cool.store.response.ResponseResult; +import com.cool.store.service.close.CloseStoreFileService; +import com.cool.store.vo.close.file.CloseStoreFileDetailVO; +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.Valid; +import javax.validation.constraints.NotNull; + +/** + *

+ * 闭店材料 前端控制器 + *

+ * + * @author wangff + * @since 2025/10/7 + */ +@Api(tags = "闭店材料") +@RestController +@RequestMapping("/pc/close/file") +@RequiredArgsConstructor +@Validated +public class CloseStoreFileController { + private final CloseStoreFileService closeStoreFileService; + + @ApiOperation("更新材料邮寄地址") + @PostMapping("/updateMailAddress") + public ResponseResult updateMailAddress(@RequestBody @Valid CloseStoreMailAddressRequest request) { + return ResponseResult.success(closeStoreFileService.updateMailAddress(request)); + } + + @ApiOperation("查询闭店材料详情") + @GetMapping("/detail") + @ApiImplicitParam(name = "closeStoreId", value = "闭店申请id", required = true, dataType = "Long") + public ResponseResult getFileDetail(@NotNull(message = "闭店申请id不能为空") Long closeStoreId) { + return ResponseResult.success(closeStoreFileService.getFileDetail(closeStoreId)); + } + + @ApiOperation("提交材料") + @PostMapping("/submitFile") + public ResponseResult submitFile(@RequestBody @Valid CloseStoreMailInfoRequest request) { + return ResponseResult.success(closeStoreFileService.submitFile(request)); + } + + @ApiOperation("修改单个材料") + @PostMapping("/updateFile") + public ResponseResult updateFile(@RequestBody @Valid CloseStoreFileSubmitRequest request) { + return ResponseResult.success(closeStoreFileService.updateFile(request)); + } + + @ApiOperation("单个材料提交审批") + @PostMapping("/submitFileApproveSingle") + public ResponseResult submitFileApproveSingle(@RequestBody @Valid CloseStoreFileInfoRequest request) { + return ResponseResult.success(closeStoreFileService.submitFileApproveSingle(request)); + } + + @ApiOperation("督导审批") + @PostMapping("/supervisionAudit") + public ResponseResult supervisionAudit(@RequestBody @Valid CloseStoreFileAuditRequest request) { + return ResponseResult.success(closeStoreFileService.supervisionAudit(request)); + } +} diff --git a/coolstore-partner-web/src/main/java/com/cool/store/controller/webb/CloseStoreRefundController.java b/coolstore-partner-web/src/main/java/com/cool/store/controller/webb/CloseStoreRefundController.java new file mode 100644 index 000000000..5c39e30da --- /dev/null +++ b/coolstore-partner-web/src/main/java/com/cool/store/controller/webb/CloseStoreRefundController.java @@ -0,0 +1,82 @@ +package com.cool.store.controller.webb; + +import com.cool.store.dto.close.CloseStoreMkUserDTO; +import com.cool.store.request.close.refund.CloseStoreRefundAddRequest; +import com.cool.store.request.close.refund.CloseStoreRefundQueryRequest; +import com.cool.store.request.close.refund.CloseStoreRefundSkipRequest; +import com.cool.store.request.close.refund.CloseStoreRefundUpdateRequest; +import com.cool.store.response.ResponseResult; +import com.cool.store.service.close.CloseStoreRefundService; +import com.cool.store.vo.close.refund.CloseStoreRefundDetailVO; +import com.cool.store.vo.close.refund.CloseStoreRefundListVO; +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.Valid; +import javax.validation.constraints.NotNull; + +/** + *

+ * 闭店退款 前端控制器 + *

+ * + * @author wangff + * @since 2025/10/13 + */ +@Api(tags = "闭店退款") +@RestController +@RequestMapping("/pc/close/refund") +@RequiredArgsConstructor +@Validated +public class CloseStoreRefundController { + private final CloseStoreRefundService closeStoreRefundService; + + @ApiOperation("获取当前用户的每刻用户信息") + @GetMapping("/getCurrentMkUser") + public ResponseResult getCurrentMkUser() { + return ResponseResult.success(closeStoreRefundService.getCurrentMkUser()); + } + + @ApiOperation("获取退款详细信息") + @GetMapping("/detail") + @ApiImplicitParam(name = "id", value = "退款信息id", required = true, dataType = "Long") + public ResponseResult detail(@NotNull(message = "退款信息id不能为空") Long id) { + return ResponseResult.success(closeStoreRefundService.getRefundDetail(id)); + } + + @ApiOperation("新增退款信息") + @PostMapping("/addRefund") + public ResponseResult addRefund(@RequestBody @Valid CloseStoreRefundAddRequest request) { + return ResponseResult.success(closeStoreRefundService.addRefund(request)); + } + + @ApiOperation("编辑退款信息") + @PostMapping("/updateRefund") + public ResponseResult updateRefund(@RequestBody @Valid CloseStoreRefundUpdateRequest request) { + return ResponseResult.success(closeStoreRefundService.updateRefund(request)); + } + + @ApiOperation("跳过") + @PostMapping("/skip") + public ResponseResult skip(@RequestBody @Validated CloseStoreRefundSkipRequest request) { + closeStoreRefundService.skip(request); + return ResponseResult.success(true); + } + + @ApiOperation("退款信息列表") + @GetMapping("/refundPage") + public ResponseResult> refundPage(@Validated CloseStoreRefundQueryRequest request) { + return ResponseResult.success(closeStoreRefundService.refundPage(request)); + } + + @ApiOperation("退款状态刷新") + @PostMapping("/refresh") + public ResponseResult refresh(@RequestBody @Validated CloseStoreRefundQueryRequest request) { + return ResponseResult.success(closeStoreRefundService.refreshRefundOrderStatus(request)); + } +} 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 index 280ba1548..1b05e4ce1 100644 --- 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 @@ -15,6 +15,7 @@ import com.github.pagehelper.PageInfo; import io.swagger.annotations.Api; import io.swagger.annotations.ApiOperation; import lombok.RequiredArgsConstructor; +import org.springframework.validation.annotation.Validated; import org.springframework.web.bind.annotation.*; import javax.validation.constraints.NotBlank; @@ -33,6 +34,7 @@ import java.util.Map; @RestController @RequestMapping("pc/sys/dict") @RequiredArgsConstructor +@Validated public class DictManagerController { private final DictGroupService groupService; private final DictTableInfoService tableService; diff --git a/coolstore-partner-web/src/main/java/com/cool/store/controller/webb/OpenApiController.java b/coolstore-partner-web/src/main/java/com/cool/store/controller/webb/OpenApiController.java index d062235ff..033ae4b55 100644 --- a/coolstore-partner-web/src/main/java/com/cool/store/controller/webb/OpenApiController.java +++ b/coolstore-partner-web/src/main/java/com/cool/store/controller/webb/OpenApiController.java @@ -1,15 +1,16 @@ package com.cool.store.controller.webb; import com.alibaba.fastjson.JSONObject; -import com.cool.store.context.PartnerUserHolder; import com.cool.store.dto.*; import com.cool.store.dto.store.StoreUserPositionDTO; import com.cool.store.dto.wallet.PaymentDTO; import com.cool.store.dto.wx.MiniProgramFreeLoginDTO; import com.cool.store.handler.WeChatHandler; +import com.cool.store.enums.close.CloseTypeEnum; import com.cool.store.request.OpenApiStoreRequest; import com.cool.store.request.StoreCodeDTO; import com.cool.store.request.*; +import com.cool.store.request.close.store.ThirdCloseStoreApplyRequest; import com.cool.store.request.notice.ThirdHandleMessageRequest; import com.cool.store.request.notice.ThirdMatterRequest; import com.cool.store.request.wallet.AccountTradeCallbackRequest; @@ -17,11 +18,11 @@ import com.cool.store.request.wallet.AddTagCallbackNoticeRequest; import com.cool.store.request.wallet.OnlineCommercialBankCallbackRequest; import com.cool.store.request.xgj.FranchiseFeeCallBackRequest; import com.cool.store.request.xgj.ReceiptCallBackRequest; -import com.cool.store.response.ResponseResult; import com.cool.store.response.bigdata.ApiResponse; import com.cool.store.service.*; import com.cool.store.service.wallet.WalletService; import com.cool.store.utils.poi.StringUtils; +import com.cool.store.service.close.CloseStoreService; import com.github.pagehelper.PageInfo; import io.swagger.annotations.Api; import io.swagger.annotations.ApiOperation; @@ -64,6 +65,8 @@ public class OpenApiController { WeChatHandler weChatHandler; @Resource WalletService walletService; + @Resource + CloseStoreService closeStoreService; @PostMapping("/statusRefresh") public ApiResponse statusRefresh(@RequestBody StatusRefreshDTO statusRefreshDTO){ diff --git a/coolstore-partner-web/src/main/java/com/cool/store/controller/webb/PCTestController.java b/coolstore-partner-web/src/main/java/com/cool/store/controller/webb/PCTestController.java index 3ddcb6d12..5987e8b9b 100644 --- a/coolstore-partner-web/src/main/java/com/cool/store/controller/webb/PCTestController.java +++ b/coolstore-partner-web/src/main/java/com/cool/store/controller/webb/PCTestController.java @@ -7,7 +7,10 @@ import com.cool.store.dto.*; import com.cool.store.dto.contract.ContractCallbackDTO; import com.cool.store.dto.*; import com.cool.store.dto.huoma.*; +import com.cool.store.dto.xgj.XgjBranchBankDTO; +import com.cool.store.dto.xgj.XgjPartnerPageDTO; import com.cool.store.dto.wallet.*; +import com.cool.store.dto.xgj.XgjPayResultDTO; import com.cool.store.entity.*; import com.cool.store.enums.DownSystemTypeEnum; import com.cool.store.enums.FranchiseBrandEnum; @@ -23,10 +26,12 @@ import com.cool.store.mapper.SignFranchiseMapper; import com.cool.store.mq.util.HttpRestTemplateService; import com.cool.store.request.*; import com.cool.store.request.bigdata.ProfitDataRequest; +import com.cool.store.request.close.store.CloseStoreApplyRequest; import com.cool.store.request.huoma.ShopBasicInfoRequest; import com.cool.store.request.oppty.*; import com.cool.store.request.wallet.*; import com.cool.store.request.xgj.PushFranchiseFeeRequest; +import com.cool.store.request.xgj.*; import com.cool.store.response.ResponseResult; import com.cool.store.response.bigdata.ActDataResponse; import com.cool.store.response.bigdata.ApiResponse; @@ -37,6 +42,7 @@ import com.cool.store.response.oppty.CityResponse; import com.cool.store.response.oppty.OpportunityDetailResponse; import com.cool.store.response.oppty.OpportunityInfoPageResponse; import com.cool.store.service.*; +import com.cool.store.service.close.CloseStoreService; import com.cool.store.service.impl.CommonService; import com.cool.store.service.impl.UserAuthMappingServiceImpl; import com.cool.store.service.wallet.WalletApiService; @@ -112,6 +118,46 @@ public class PCTestController { @Autowired WeChatHandler weChatHandler; + @Resource + ThirdXgjService thirdXgjService; + @Resource + CloseStoreService closeStoreService; + + @PostMapping("/applyCloseStore") + public ResponseResult applyCloseStore(@RequestBody @Valid CloseStoreApplyRequest request) { + return ResponseResult.success(closeStoreService.applyCloseStore(request)); + } + + @PostMapping("/reimburse") + public ResponseResult reimburse(@RequestBody XgjReimburseRequest request) { + return ResponseResult.success(thirdXgjService.reimburse(request)); + } + + @PostMapping("/savePartner") + public ResponseResult savePartner(@RequestBody XgjSavePartnerRequest request) { + return ResponseResult.success(thirdXgjService.savePartner(request)); + } + + @PostMapping("/queryOrderStatus") + public ResponseResult queryOrderStatus(@RequestBody XgjPaymentRequest request) { + return ResponseResult.success(thirdXgjService.queryOrderStatus(request)); + } + + @PostMapping("/queryPartnerPage") + public ResponseResult queryPartnerPage(@RequestBody XgjPartnerQueryRequest request) { + return ResponseResult.success(thirdXgjService.queryPartnerPage(request)); + } + + @PostMapping("/queryBranchBankList") + public ResponseResult> queryBranchBankList(@RequestBody XgjBankQueryRequest request) { + return ResponseResult.success(thirdXgjService.queryBranchBankList(request)); + } + + @PostMapping("/accountClose") + public ResponseResult accountClose(@RequestBody XgjAccountCloseRequest request) { + return ResponseResult.success(thirdXgjService.accountClose(request)); + } + @GetMapping("/syncStore") public ResponseResult syncStore(@RequestParam("shopId")Long shopId){ syncMainSysServer.syncStore(shopId); diff --git a/coolstore-partner-web/src/main/java/com/cool/store/controller/webc/MiniCloseStoreAccountController.java b/coolstore-partner-web/src/main/java/com/cool/store/controller/webc/MiniCloseStoreAccountController.java new file mode 100644 index 000000000..125890eec --- /dev/null +++ b/coolstore-partner-web/src/main/java/com/cool/store/controller/webc/MiniCloseStoreAccountController.java @@ -0,0 +1,40 @@ +package com.cool.store.controller.webc; + +import com.cool.store.response.ResponseResult; +import com.cool.store.service.close.CloseStoreAccountService; +import com.cool.store.vo.close.account.CloseStoreAccountVO; +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.GetMapping; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RestController; + +import javax.validation.constraints.NotNull; +import java.util.List; + +/** + *

+ * 闭店账号关闭 前端控制器 + *

+ * + * @author wangff + * @since 2025/10/8 + */ +@Api(tags = "mini账号关闭") +@RestController +@RequestMapping("/mini/close/account") +@RequiredArgsConstructor +@Validated +public class MiniCloseStoreAccountController { + private final CloseStoreAccountService closeStoreAccountService; + + @ApiOperation("获取账号列表") + @GetMapping("/accountList") + @ApiImplicitParam(name = "closeStoreId", value = "闭店申请id", required = true, dataType = "Long") + public ResponseResult> accountList(@NotNull(message = "闭店申请id不能为空") Long closeStoreId) { + return ResponseResult.success(closeStoreAccountService.getAccountList(closeStoreId)); + } +} diff --git a/coolstore-partner-web/src/main/java/com/cool/store/controller/webc/MiniCloseStoreController.java b/coolstore-partner-web/src/main/java/com/cool/store/controller/webc/MiniCloseStoreController.java new file mode 100644 index 000000000..8e2768be1 --- /dev/null +++ b/coolstore-partner-web/src/main/java/com/cool/store/controller/webc/MiniCloseStoreController.java @@ -0,0 +1,78 @@ +package com.cool.store.controller.webc; + +import com.cool.store.enums.close.CloseTypeEnum; +import com.cool.store.request.close.store.CloseStoreApplyRequest; +import com.cool.store.request.close.store.CloseStoreCancelRequest; +import com.cool.store.request.close.store.MiniCloseStoreQueryRequest; +import com.cool.store.request.close.store.ReCloseStoreApplyRequest; +import com.cool.store.response.AuditInfoResponse; +import com.cool.store.response.ResponseResult; +import com.cool.store.service.close.CloseStoreService; +import com.cool.store.vo.close.store.*; +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.Valid; +import javax.validation.constraints.NotNull; +import java.util.List; + +/** + *

+ * 闭店审批 前端控制器 + *

+ * + * @author wangff + * @since 2025/10/9 + */ +@Api(tags = "mini闭店管理") +@RestController +@RequestMapping("/mini/close/store") +@RequiredArgsConstructor +@Validated +public class MiniCloseStoreController { + private final CloseStoreService closeStoreService; + + @ApiOperation("申请闭店") + @PostMapping("/apply") + public ResponseResult applyCloseStore(@RequestBody @Valid CloseStoreApplyRequest request) { + request.setCloseType(CloseTypeEnum.INITIATE.getCloseType()); + return ResponseResult.success(closeStoreService.applyCloseStore(request)); + } + + @ApiOperation("拒绝后重新提交申请闭店") + @PostMapping("/reapply") + public ResponseResult reApplyCloseStore(@RequestBody @Valid ReCloseStoreApplyRequest request) { + return ResponseResult.success(closeStoreService.reApplyCloseStore(request)); + } + + @ApiOperation("闭店申请列表") + @GetMapping("/page") + public ResponseResult> closeStorePage(MiniCloseStoreQueryRequest request) { + return ResponseResult.success(closeStoreService.getMiniCloseStoreSimpleInfoList(request)); + } + + @ApiOperation("查询闭店审批记录") + @GetMapping("/audit/list") + @ApiImplicitParam(name = "closeStoreId", value = "闭店申请id", required = true, dataType = "Long", paramType = "query") + public ResponseResult> getAuditList(@NotNull(message = "闭店申请id不能为空") Long closeStoreId) { + return ResponseResult.success(closeStoreService.getAuditRecordList(closeStoreId)); + } + + @ApiOperation("闭店原因列表") + @GetMapping("/closeReasonList") + @ApiImplicitParam(name = "closeType", value = "闭店发起方式,1主动发起,2云流水发起", required = true, dataType = "Integer", paramType = "query") + public ResponseResult> getStoreCloseReasonList(Integer closeType) { + return ResponseResult.success(closeStoreService.getStoreCloseReasonList(closeType)); + } + + @ApiOperation("取消闭店申请") + @PostMapping("/cancel") + public ResponseResult cancelCloseStore(@RequestBody @Valid CloseStoreCancelRequest request) { + return ResponseResult.success(closeStoreService.cancelApply(request.getCloseStoreId())); + } +} diff --git a/coolstore-partner-web/src/main/java/com/cool/store/controller/webc/MiniCloseStoreFileController.java b/coolstore-partner-web/src/main/java/com/cool/store/controller/webc/MiniCloseStoreFileController.java new file mode 100644 index 000000000..b70c35832 --- /dev/null +++ b/coolstore-partner-web/src/main/java/com/cool/store/controller/webc/MiniCloseStoreFileController.java @@ -0,0 +1,52 @@ +package com.cool.store.controller.webc; + +import com.cool.store.request.close.file.CloseStoreFileSubmitRequest; +import com.cool.store.request.close.file.CloseStoreMailInfoRequest; +import com.cool.store.response.ResponseResult; +import com.cool.store.service.close.CloseStoreFileService; +import com.cool.store.vo.close.file.CloseStoreFileDetailMiniVO; +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.Valid; +import javax.validation.constraints.NotNull; + +/** + *

+ * 小程序闭店材料 前端控制器 + *

+ * + * @author wangff + * @since 2025/10/7 + */ +@Api(tags = "mini闭店材料") +@RestController +@RequestMapping("/mini/close/file") +@RequiredArgsConstructor +@Validated +public class MiniCloseStoreFileController { + private final CloseStoreFileService closeStoreFileService; + + @ApiOperation("查询闭店材料详情") + @GetMapping("/detail") + @ApiImplicitParam(name = "closeStoreId", value = "闭店申请id", required = true, dataType = "Long") + public ResponseResult getFileDetail(@NotNull(message = "闭店申请id不能为空") Long closeStoreId) { + return ResponseResult.success(closeStoreFileService.getMiniFileDetail(closeStoreId)); + } + + @ApiOperation("提交材料") + @PostMapping("/submitFile") + public ResponseResult submitFile(@RequestBody @Valid CloseStoreMailInfoRequest request) { + return ResponseResult.success(closeStoreFileService.submitFile(request)); + } + + @ApiOperation("修改单个材料") + @PostMapping("/updateFile") + public ResponseResult updateFile(@RequestBody @Valid CloseStoreFileSubmitRequest request) { + return ResponseResult.success(closeStoreFileService.updateFile(request)); + } +} diff --git a/coolstore-partner-web/src/main/java/com/cool/store/controller/webc/MiniCloseStoreRefundController.java b/coolstore-partner-web/src/main/java/com/cool/store/controller/webc/MiniCloseStoreRefundController.java new file mode 100644 index 000000000..a1b82ab6b --- /dev/null +++ b/coolstore-partner-web/src/main/java/com/cool/store/controller/webc/MiniCloseStoreRefundController.java @@ -0,0 +1,38 @@ +package com.cool.store.controller.webc; + +import com.cool.store.response.ResponseResult; +import com.cool.store.service.close.CloseStoreRefundService; +import com.cool.store.vo.close.refund.CloseStoreRefundSimpleVO; +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/10/13 + */ +@Api(tags = "mini闭店退款") +@RestController +@RequestMapping("/mini/close/refund") +@RequiredArgsConstructor +@Validated +public class MiniCloseStoreRefundController { + private final CloseStoreRefundService closeStoreRefundService; + + @ApiOperation("退款信息列表") + @GetMapping("/list") + @ApiImplicitParam(name = "closeStoreId", value = "闭店申请id", required = true, dataType = "Long") + public ResponseResult> list(@NotNull(message = "闭店申请id不能为空") Long closeStoreId) { + return ResponseResult.success(closeStoreRefundService.getRefundSimpleList(closeStoreId)); + } +} diff --git a/coolstore-partner-web/src/main/java/com/cool/store/controller/webc/TestController.java b/coolstore-partner-web/src/main/java/com/cool/store/controller/webc/TestController.java index 61bad4ad0..2d440997d 100644 --- a/coolstore-partner-web/src/main/java/com/cool/store/controller/webc/TestController.java +++ b/coolstore-partner-web/src/main/java/com/cool/store/controller/webc/TestController.java @@ -30,6 +30,8 @@ import com.cool.store.response.caipin.StoreUserResponse; import com.cool.store.response.xfsgFirstOderListResponse; import com.cool.store.service.*; import com.cool.store.service.wallet.WalletService; +import com.cool.store.service.close.CloseStoreAccountService; +import com.cool.store.service.close.CloseStoreRefundService; import com.cool.store.utils.poi.ExcelUtil; import com.cool.store.utils.poi.StringUtils; import com.cool.store.vo.RegionPathNameVO; @@ -49,10 +51,7 @@ import java.math.BigDecimal; import java.time.LocalDate; import java.time.LocalTime; import java.time.temporal.ChronoUnit; -import java.util.ArrayList; -import java.util.Arrays; -import java.util.HashMap; -import java.util.List; +import java.util.*; import java.util.concurrent.Future; import java.util.stream.Collectors; @@ -96,6 +95,11 @@ public class TestController { LinePayDAO linePayDAO; @Resource OpenApiService openApiService; + @Resource + private CloseStoreAccountService closeStoreAccountService; + @Resource + private CloseStoreRefundService closeStoreRefundService; + @PostMapping("/testXgjCallback") public ResponseResult testXgjCallback(Long linePayId) { @@ -114,6 +118,18 @@ public class TestController { return ResponseResult.success(true); } + @GetMapping("/completeRefund") + public ResponseResult completeRefund(Long refundId) { + closeStoreRefundService.completeRefund(refundId, new Date()); + return ResponseResult.success(true); + } + + @GetMapping("/verifyAndUpdateAccountClose") + public ResponseResult verifyAndUpdateAccountClose(Long closeStoreId) { + closeStoreAccountService.verifyAndUpdateStage(closeStoreId); + return ResponseResult.success(true); + } + @PostMapping("/getFirstOrders") public ResponseResult getFirstOrders(@RequestBody xfsgFirstOrderListRequest storeCodeList) { xfsgFirstOderListResponse firstOrderList = coolStoreStartFlowService.getFirstOrderList(storeCodeList); 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 0fe2fe07b..ee6ebb11b 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 @@ -7,10 +7,15 @@ import com.cool.store.dao.*; import com.cool.store.dao.tp.TpApplyFormDAO; import com.cool.store.dto.*; import com.cool.store.dto.store.StoreOrderTimeDTO; +import com.cool.store.dto.xgj.XgjPayResultDTO; import com.cool.store.entity.*; import com.cool.store.entity.tp.TpApplyFormDO; import com.cool.store.enums.*; import com.cool.store.enums.tp.TpFormStatusEnum; +import com.cool.store.enums.close.CloseTypeEnum; +import com.cool.store.enums.close.RefundPayStatusEnum; +import com.cool.store.enums.close.XgjRefundPayStatusEnum; +import com.cool.store.enums.master.StoreCloseReasonEnum; import com.cool.store.mapper.ApplyLicenseMapper; import com.cool.store.mapper.LineInfoMapper; import com.cool.store.mapper.TrainingExperienceMapper; @@ -19,14 +24,20 @@ 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.tp.TpApplyQueryRequest; +import com.cool.store.request.close.store.CloseStoreApplyRequest; +import com.cool.store.request.xgj.XgjPaymentRequest; import com.cool.store.response.bigdata.LatestOrderDateResponse; import com.cool.store.service.*; +import com.cool.store.service.close.CloseStoreRefundService; +import com.cool.store.service.close.CloseStoreService; import com.cool.store.service.impl.CommonService; import com.cool.store.service.tp.TpApplyService; +import com.cool.store.utils.CoolDateUtils; import com.cool.store.utils.MDCUtils; import com.cool.store.utils.poi.DateUtils; import com.cool.store.utils.poi.StringUtils; import com.github.pagehelper.PageHelper; +import com.google.common.collect.Lists; import com.xxl.job.core.context.XxlJobHelper; import com.xxl.job.core.handler.annotation.XxlJob; import lombok.extern.slf4j.Slf4j; @@ -110,6 +121,14 @@ public class XxlJobHandler { TpApplyFormDAO tpApplyFormDAO; @Resource TpApplyService tpApplyService; + @Resource + CloseStoreService closeStoreService; + @Resource + CloseStoreRefundInfoDAO closeStoreRefundInfoDAO; + @Resource + ThirdXgjService thirdXgjService; + @Resource + CloseStoreRefundService closeStoreRefundService; /** @@ -438,6 +457,68 @@ public class XxlJobHandler { log.info("------end latestOrderDate------"); } + /** + * 学校店自动发起闭店 + */ + @XxlJob("schoolStoreApplyClose") + public void schoolStoreApplyClose() { + MDCUtils.put(CommonConstants.REQUEST_ID, UUID.randomUUID().toString()); + log.info("------start schoolStoreApplyClose------"); + String param = XxlJobHelper.getJobParam(); + String monthQueryLimit = "3"; + if (StringUtils.isNotBlank(param)) { + monthQueryLimit = param; + } + autoApplyClose(monthQueryLimit, Arrays.asList("store_school_internal", "store_school_external"), true); + log.info("------end schoolStoreApplyClose------"); + } + + /** + * 普通店自动发起闭店 + */ + @XxlJob("normalStoreApplyClose") + public void normalStoreApplyClose() { + MDCUtils.put(CommonConstants.REQUEST_ID, UUID.randomUUID().toString()); + log.info("------start normalStoreApplyClose------"); + String param = XxlJobHelper.getJobParam(); + String monthQueryLimit = "1"; + if (StringUtils.isNotBlank(param)) { + monthQueryLimit = param; + } + autoApplyClose(monthQueryLimit, Arrays.asList("store_school_internal", "store_school_external"), false); + log.info("------end normalStoreApplyClose------"); + } + + private void autoApplyClose(String monthQueryLimit, List businessTypes, Boolean inBusinessType) { + boolean hasNext = true; + int pageNum = 1; + int pageSize = CommonConstants.BATCH_SIZE; + LocalDate latestDate = LocalDate.now().minusMonths(Long.parseLong(monthQueryLimit)).plusDays(1); + while (hasNext) { + PageHelper.startPage(pageNum, pageSize); + List storeList = storeDao.getNoOrderStore(latestDate, businessTypes, inBusinessType); + if (CollectionUtils.isEmpty(storeList)) { + break; + } + hasNext = storeList.size() >= pageSize; + for (StoreDO storeDO : storeList) { + try { + CloseStoreApplyRequest applyRequest = CloseStoreApplyRequest.builder() + .planCloseDate(DateUtils.parseDate(LocalDate.now().plusMonths(1).toString())) + .closeReason(StoreCloseReasonEnum.REASON0.getCode()) + .closeType(CloseTypeEnum.NO_ORDER_AUTO.getCloseType()) + .storeId(storeDO.getStoreId()) + .build(); + closeStoreService.applyCloseStore(applyRequest); + } catch (Exception e) { + log.info("自动闭店申请发起失败, storeId:{}, storeName:{}", storeDO.getStoreId(), storeDO.getStoreName()); + log.info("自动闭店申请发起失败", e); + } + } + pageNum++; + } + } + public Date parseDate(LatestOrderDateResponse v, DateFormat format) { try { return format.parse(v.getLatest_buy_date()); @@ -487,4 +568,71 @@ public class XxlJobHandler { } log.info("------end tpPenaltyAppealOverdue------"); } + + /** + * 退款订单状态更新 + */ + @XxlJob("refundOrderStatus") + public void refundOrderStatus() { + MDCUtils.put(CommonConstants.REQUEST_ID, UUID.randomUUID().toString()); + log.info("------start refundOrderStatus------"); + boolean hasNext = true; + int pageNum = 1; + int pageSize = CommonConstants.BATCH_SIZE; + List updateList = new ArrayList<>(); + List completeList = new ArrayList<>(); + while (hasNext) { + PageHelper.startPage(pageNum, pageSize); + List list = closeStoreRefundInfoDAO.getUnfinishedRecords(); + if (CollectionUtils.isEmpty(list)) { + break; + } + hasNext = list.size() >= pageSize; + for (CloseStoreRefundInfoDO refundInfoDO : list) { + try { + if (StringUtils.isNotBlank(refundInfoDO.getRefundOrderNo())) { + XgjPayResultDTO xgjPayResultDTO = thirdXgjService.queryOrderStatus(new XgjPaymentRequest(refundInfoDO.getRefundOrderNo())); + String xgjStatus = xgjPayResultDTO.getStatus(); + String refundStatus = XgjRefundPayStatusEnum.REJECTED.getStatus().equals(xgjStatus) ? RefundPayStatusEnum.APPROVING.getStatus() : xgjStatus; + if (!refundInfoDO.getRefundStatus().equals(refundStatus)) { + CloseStoreRefundInfoDO update = CloseStoreRefundInfoDO.builder() + .id(refundInfoDO.getId()) + .refundStatus(refundStatus) + .refundTime(CoolDateUtils.parseDate(xgjPayResultDTO.getPaySuccessTime(), "yyyy-MM-dd HH:mm:ss")) + .build(); + if (refundStatus.equals(RefundPayStatusEnum.PAY_SUCCESS.getStatus())) { + completeList.add(update); + } else { + updateList.add(update); + } + } + } + } catch (Exception e) { + log.info("退款状态查询失败, refundId:{}", refundInfoDO.getId()); + log.info("退款状态查询失败", e); + } + } + pageNum++; + } + if (CollectionUtils.isNotEmpty(updateList)) { + for (List list : Lists.partition(updateList, CommonConstants.BATCH_SIZE)) { + try { + closeStoreRefundInfoDAO.updateRefundStatusBatchById(list); + } catch (Exception e) { + log.error("退款状态更新失败"); + } + } + } + if (CollectionUtils.isNotEmpty(completeList)) { + for (CloseStoreRefundInfoDO refundInfoDO : completeList) { + try { + closeStoreRefundService.completeRefund(refundInfoDO.getId(), refundInfoDO.getRefundTime()); + } catch (Exception e) { + log.error("退款状态更新失败, refundId:{}", refundInfoDO.getId()); + log.error("退款状态更新失败", e); + } + } + } + log.info("------end refundOrderStatus------"); + } } diff --git a/coolstore-partner-web/src/main/resources/application-ab.properties b/coolstore-partner-web/src/main/resources/application-ab.properties index ba49de141..e26125f33 100644 --- a/coolstore-partner-web/src/main/resources/application-ab.properties +++ b/coolstore-partner-web/src/main/resources/application-ab.properties @@ -82,7 +82,7 @@ aliyun.sms.accessKeyId=LTAI5tAVZ3r9UtSpLGcmGoQn aliyun.sms.accessKeySecret=WIMjO4BjVg3YAHwmplq86yOyS2HMpa aliyun.sms.signName=酷店掌 -mybatis.configuration.variables.enterpriseId=e17cd2dc350541df8a8b0af9bd27f77d +mybatis.configuration.variables.enterpriseId=5558ce7a3aa84e3590392fcaa8697ffb enterprise.dingCorpId=dingef2502a50df74ccc35c2f4657eb6378f qywx.task.notice.url2=https://tstore-h5.coolstore.cn/?corpId=%s&appType=%s#/notice?target=%s¬iceType=zx&corpId=%s&appType=%s&eid=%s diff --git a/coolstore-partner-web/src/main/resources/application-local.properties b/coolstore-partner-web/src/main/resources/application-local.properties index 43af7137a..9487f444e 100644 --- a/coolstore-partner-web/src/main/resources/application-local.properties +++ b/coolstore-partner-web/src/main/resources/application-local.properties @@ -32,7 +32,7 @@ isv.domain=https://abstore-isv.coolstore.cn/isv #rocketmq \u914D\u7F6E rocketmq.accessKey=LTAI5tGBwmXwZkMuHK4MudMJ rocketmq.secretKey=bnZoUMRQ9834STgz5E291YrqlBu6yn -rocketmq.nameSrvAdder=http://MQ_INST_1748142459508127_BZfpFxuJ.cn-hangzhou.mq.aliyuncs.com:8080 +rocketmq.nameSrvAdder=http://MQ_INST_1748142459508127_BZfpFxuJ.cn-hangzhou.mq.aliyuncs.com:80 rocketmq.topic=zx_simple_message rocketmq.orderTopic=zx_order_message