From 20f063dc55e37c4361cd84fd1525750e958b7798 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E6=AD=A3=E6=96=B0?= Date: Tue, 12 May 2026 09:01:35 +0000 Subject: [PATCH 1/2] Merge #128 into master from cc_20250512_uploadRentContract MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit feat:租赁合同新增审批记录 * cc_20250512_uploadRentContract: (100 commits squashed) - fix:计划闭店时间修改 - Merge branch 'cc_20250922_closeStore_w' into cc_20250514_common_bak - feat:新签调整 - Merge branch 'cc_20260506_newsign' into cc_20250514_common_bak # Conflicts: # coolstore-partner-common/src/main/java/com/cool/store/enums/UserRoleEnum.java - fix:闭店信息新增初审、复审、终审时间字段;闭店管理列表新增返回字段 - Merge branch 'cc_20250922_closeStore_w' into cc_20250514_common_bak - feat:招商 - Merge branch 'cc_20260506_newsign' into cc_20250514_common_bak # Conflicts: # coolstore-partner-common/src/main/java/com/cool/store/enums/UserRoleEnum.java - feat:招商 - feat:招商 - feat:招商 - fix:删除字段 - Merge branch 'cc_20250922_closeStore_w' into cc_20250514_common_bak - feat:招商 - Merge branch 'cc_20260506_newsign' into cc_20250514_common_bak - Merge remote-tracking branch 'origin/cc_20250514_common_bak' into cc_20250514_common_bak - feat:数据同步 名称新增MX 等前缀 - feat:上海魔盒未来食品有限公司 - fix:修改查询逻辑 - Merge branch 'cc_20260428_store_report' into cc_20250514_common_bak # Conflicts: # coolstore-partner-web/src/main/java/com/cool/store/job/XxlJobHandler.java - feat:id - Merge branch 'cc_20260506_newsign' into cc_20250514_common_bak - Merge remote-tracking branch 'origin/cc_20250514_common_bak' into cc_20250514_common_bak - Merge branch 'cc_20260507_smz' into cc_20250514_common_bak # Conflicts: # coolstore-partner-service/src/main/java/com/cool/store/service/impl/SyncDataServiceImpl.java - Merge remote-tracking branch 'origin/cc_20250514_common_bak' into cc_20250514_common_bak - feat:翻新 - feat:用户列表为空 - Merge branch 'cc_20260427_rnewal' into cc_20250514_common_bak - feat:用户列表为空 - Merge branch 'cc_20260427_rnewal' into cc_20250514_common_bak - feat:RenewalRenovateApprovalVO - Merge branch 'cc_20260427_rnewal' into cc_20250514_common_bak - feat:招商副总裁 - Merge branch 'cc_20260427_rnewal' into cc_20250514_common_bak # Conflicts: # coolstore-partner-common/src/main/java/com/cool/store/enums/point/ShopSubStageStatusEnum.java - feat:招商副总裁审核 - Merge branch 'cc_20260506_newsign' into cc_20250514_common_bak - feat:费用单调整 - feat:招商经理 - feat:招商经理 - Merge branch 'cc_20260506_newsign' into cc_20250514_common_bak - feat:费用调整 - Merge branch 'master' into cc_20260226_fix - fix:bug修复 - fix:未开业门店试营业日期 - Merge branch 'cc_20260508_open_store_req' into cc_20250514_common_bak # Conflicts: # coolstore-partner-dao/src/main/java/com/cool/store/dao/StoreDao.java # coolstore-partner-dao/src/main/java/com/cool/store/mapper/StoreMapper.java # coolstore-partner-dao/src/main/resources/mapper/StoreMapper.xml # coolstore-partner-web/src/main/java/com/cool/store/job/XxlJobHandler.java - feat:新增审批 - fix:开业日期报备不同步门店状态 - Merge branch 'cc_20260508_open_store_req' into cc_20250514_common_bak - fix:字段名称修改 - Merge branch 'cc_20250922_closeStore_w' into cc_20250514_common_bak - fix:闭店中止新增审批记录 - Merge branch 'cc_20250922_closeStore_w' into cc_20250514_common_bak - feat:费用调整单 - feat:招商大区总审核 或者 分部内勤审核 其他状态不能审核 - Merge branch 'cc_20260506_newsign' into cc_20250514_common_bak - feat:调整单 - feat:SHOP_SUB_STAGE_STATUS_150_5 - Merge branch 'cc_20260506_newsign' into cc_20250514_common_bak - fix:试营业测试接口 - Merge remote-tracking branch 'origin/cc_20250514_common_bak' into cc_20250514_common_bak - Merge branch 'master' into cc_20250514_common_bak - feat:page - feat:自动分账 - Merge branch 'master' into cc_20250514_common_bak - fix:私域二维码门店绑定关系缓存改为7天 - Merge branch 'cc_20260226_fix' into cc_20250514_common_bak - feat:getAuthRegionIdAndSubRegionIdExcludeStoreByUserId 优化开店管理查询 - Merge branch 'cc_20260509_fix' into cc_20250514_common_bak - fix:修改门店开业日期判断条件修改 - Merge branch 'cc_20260508_open_store_req' into cc_20250514_common_bak - feat:填写添加门店 - feat:建店代办处理 - Merge branch 'cc_20260506_newsign' into cc_20250514_common_bak - Merge branch 'cc_20260508_adjustment' into cc_20250514_common_bak - feat:userAuthMappingService - feat:addShopDecorationLog - Merge branch 'cc_20260506_newsign' into cc_20250514_common_bak - feat:待采购确认 审批流程 - feat:问题修复 - Merge branch 'cc_20260511_fix' into cc_20250514_common_bak # Conflicts: # coolstore-partner-dao/src/main/java/com/cool/store/dao/ShopStageInfoDAO.java # coolstore-partner-dao/src/main/java/com/cool/store/dao/StoreDao.java # coolstore-partner-dao/src/main/java/com/cool/store/mapper/ShopStageInfoMapper.java # coolstore-partner-dao/src/main/java/com/cool/store/mapper/StoreMapper.java # coolstore-partner-dao/src/main/resources/mapper/ShopStageInfoMapper.xml # coolstore-partner-dao/src/main/resources/mapper/StoreMapper.xml # coolstore-partner-service/src/main/java/com/cool/store/service/impl/PointServiceImpl.java # coolstore-partner-service/src/main/java/com/cool/store/service/impl/SignFranchiseServiceImpl.java # coolstore-partner-web/src/main/java/com/cool/store/job/XxlJobHandler.java - feat:问题修复 - feat:问题修复 - feat:流水查询条件 - Merge branch 'master' into cc_20260508_adjustment - feat:费用流水筛选条件 - fix:歇业管理逻辑修改 - Merge branch 'cc_20260508_adjustment' into cc_20250514_common_bak - feat:getAdjustAmount - Merge branch 'cc_20260511_close_up_modify' into cc_20260408_close_up # Conflicts: # 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-common/src/main/java/com/cool/store/enums/closeup/CloseUpPlatformEnum.java # coolstore-partner-dao/src/main/java/com/cool/store/dao/closeup/CloseUpPlatformDAO.java # coolstore-partner-dao/src/main/java/com/cool/store/mapper/StoreMapper.java # coolstore-partner-dao/src/main/java/com/cool/store/mapper/closeup/CloseUpPlatformMapper.java # coolstore-partner-dao/src/main/resources/mapper/StoreMapper.xml # coolstore-partner-dao/src/main/resources/mapper/closeup/CloseUpApplyFormMapper.xml # coolstore-partner-dao/src/main/resources/mapper/closeup/CloseUpPlatformMapper.xml # coolstore-partner-model/src/main/java/com/cool/store/entity/closeup/CloseUpApplyFormDO.java # coolstore-partner-model/src/main/java/com/cool/store/entity/closeup/CloseUpPlatformDO.java # coolstore-partner-service/src/main/java/com/cool/store/mq/consumer/ConsumerClient.java # coolstore-partner-service/src/main/java/com/cool/store/service/closeup/CloseUpService.java # coolstore-partner-service/src/main/java/com/cool/store/service/closeup/impl/CloseUpServiceImpl.java # coolstore-partner-web/src/main/java/com/cool/store/controller/webb/PCTestController.java # coolstore-partner-web/src/main/java/com/cool/store/job/XxlJobHandler.java # coolstore-partner-web/src/main/resources/application-ab.properties # coolstore-partner-web/src/main/resources/application-local.properties # coolstore-partner-web/src/main/resources/application-online.properties # coolstore-partner-web/src/main/resources/application-test.properties - fix:合并冲突 - Merge branch 'cc_20260408_close_up' into cc_20250514_common_bak # Conflicts: # 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-service/src/main/java/com/cool/store/service/closeup/impl/CloseUpServiceImpl.java # coolstore-partner-web/src/main/java/com/cool/store/controller/webb/PCTestController.java # coolstore-partner-web/src/main/java/com/cool/store/job/XxlJobHandler.java - fix:合并冲突 - Merge branch 'cc_20260508_adjustment' into cc_20250514_common_bak - Merge branch 'master' into cc_20260408_close_up - fix:火码歇业时机修改 - Merge branch 'cc_20260408_close_up' into cc_20250514_common_bak - feat:租赁合同新增审批记录 - Merge branch 'master' into cc_20250512_uploadRentContract # Conflicts: # coolstore-partner-service/src/main/java/com/cool/store/service/closeup/impl/CloseUpServiceImpl.java # coolstore-partner-service/src/main/java/com/cool/store/service/impl/PointServiceImpl.java # coolstore-partner-web/src/main/java/com/cool/store/controller/webb/PCTestController.java - feat:merge冲突 - feat:merge冲突 Signed-off-by: 正新 Merged-by: 正新 CR-link: https://codeup.aliyun.com/692ea314dec569489f6f167c/hangzhou/java/custom_zxjp/change/128 --- .../cool/store/constants/RedisConstant.java | 11 + .../com/cool/store/enums/ClaimStatusEnum.java | 3 +- .../com/cool/store/enums/ErrorCodeEnum.java | 49 +- .../store/enums/ExamAttemptStatusEnum.java | 32 + .../cool/store/enums/ExamInfoStatusEnum.java | 69 +++ .../com/cool/store/enums/FileTypeEnum.java | 3 + .../cool/store/enums/FranchiseBrandEnum.java | 12 + .../com/cool/store/enums/IsRefundEnum.java | 25 + .../com/cool/store/enums/PayStatusEnum.java | 31 + .../cool/store/enums/RocketMqGroupEnum.java | 2 + .../com/cool/store/enums/RocketMqTagEnum.java | 2 + .../enums/approval/ApprovalResultEnum.java | 28 + .../cool/store/enums/point/PayTypeEnum.java | 17 +- .../cool/store/enums/point/ShopStageEnum.java | 1 + .../store/enums/point/ShopSubStageEnum.java | 2 +- .../enums/point/ShopSubStageStatusEnum.java | 4 +- .../store/enums/renewal/RenewalNodeEnum.java | 55 ++ .../enums/renewal/RenewalStatusEnum.java | 68 +++ .../store/enums/wallet/DocStatusEnum.java | 8 + .../com/cool/store/utils/GenerateNoUtil.java | 5 + .../java/com/cool/store/utils/OssUtil.java | 42 ++ .../com/cool/store/utils/RealIpUtils.java | 66 +++ .../cool/store/utils/RedisConstantUtil.java | 13 +- .../cool/store/utils/SuperPaySignature.java | 113 ++++ .../com/cool/store/utils/hire/XbbAesUtil.java | 89 +++ .../store/utils/hire/XbbSignatureInfo.java | 146 +++++ .../java/com/cool/store/dao/BigRegionDAO.java | 14 +- .../java/com/cool/store/dao/LinePayDAO.java | 5 + .../store/dao/OpeningOperationPlanDAO.java | 8 + .../com/cool/store/dao/ReceivingBankDAO.java | 66 +++ .../java/com/cool/store/dao/StoreDao.java | 57 ++ .../cool/store/dao/ThirdPartyAccountDAO.java | 49 ++ .../cool/store/dao/ThirdPartyStoreDAO.java | 58 ++ .../dao/approval/CommonApprovalLogDAO.java | 122 ++++ .../store/dao/contract/ContractCostDAO.java | 23 + .../store/dao/contract/ContractMasterDAO.java | 62 ++ .../store/dao/exam/ExamAttemptAnswerDAO.java | 72 +++ .../cool/store/dao/exam/ExamAttemptDAO.java | 97 +++ .../com/cool/store/dao/exam/ExamInfoDAO.java | 112 ++++ .../com/cool/store/dao/exam/ExamPaperDAO.java | 98 +++ .../store/dao/exam/ExamPaperQuestionDAO.java | 80 +++ .../cool/store/dao/exam/ExamQuestionDAO.java | 88 +++ .../dao/renewal/RenewalApplicationDAO.java | 55 ++ .../RenewalApplicationSignerInfoDAO.java | 47 ++ .../renewal/RenewalRenovateApprovalDAO.java | 22 + .../dao/store/StoreBusinessReportDAO.java | 33 ++ .../cool/store/mapper/BigRegionMapper.java | 7 +- .../cool/store/mapper/FranchiseFeeMapper.java | 2 + .../com/cool/store/mapper/LinePayMapper.java | 3 + .../mapper/OpeningOperationPlanMapper.java | 2 + .../store/mapper/ReceivingBankMapper.java | 22 + .../com/cool/store/mapper/StoreMapper.java | 54 +- .../store/mapper/ThirdPartyAccountMapper.java | 20 + .../store/mapper/ThirdPartyStoreMapper.java | 25 + .../store/mapper/UserAuthMappingMapper.java | 9 + .../approval/CommonApprovalLogMapper.java | 25 + .../mapper/contract/ContractCostMapper.java | 15 + .../mapper/contract/ContractMasterMapper.java | 27 + .../mapper/exam/ExamAttemptAnswerMapper.java | 24 + .../store/mapper/exam/ExamAttemptMapper.java | 18 + .../store/mapper/exam/ExamInfoMapper.java | 12 + .../store/mapper/exam/ExamPaperMapper.java | 7 + .../mapper/exam/ExamPaperQuestionMapper.java | 20 + .../store/mapper/exam/ExamQuestionMapper.java | 7 + .../renewal/RenewalApplicationMapper.java | 18 + .../RenewalApplicationSignerInfoMapper.java | 13 + .../RenewalRenovateApprovalMapper.java | 13 + .../store/StoreBusinessReportMapper.java | 32 + .../mapper/AdjustmentOrderMapper.xml | 3 + .../main/resources/mapper/BigRegionMapper.xml | 14 + .../resources/mapper/FranchiseFeeMapper.xml | 5 + .../main/resources/mapper/InvoicingMapper.xml | 4 +- .../main/resources/mapper/LinePayMapper.xml | 14 +- .../mapper/OpeningOperationPlanMapper.xml | 21 +- .../resources/mapper/ReceivingBankMapper.xml | 68 +++ .../main/resources/mapper/ShopInfoMapper.xml | 6 + .../src/main/resources/mapper/StoreMapper.xml | 146 ++++- .../mapper/ThirdPartyAccountMapper.xml | 38 ++ .../resources/mapper/ThirdPartyMapper.xml | 30 + .../mapper/UserAuthMappingMapper.xml | 28 + .../mapper/WithdrawApplicationMapper.xml | 4 +- .../approval/CommonApprovalLogMapper.xml | 46 ++ .../mapper/contract/ContractCostMapper.xml | 27 + .../mapper/contract/ContractMasterMapper.xml | 74 +++ .../mapper/exam/ExamAttemptAnswerMapper.xml | 48 ++ .../mapper/exam/ExamAttemptMapper.xml | 33 ++ .../resources/mapper/exam/ExamInfoMapper.xml | 27 + .../resources/mapper/exam/ExamPaperMapper.xml | 19 + .../mapper/exam/ExamPaperQuestionMapper.xml | 44 ++ .../mapper/exam/ExamQuestionMapper.xml | 22 + .../renewal/RenewalApplicationMapper.xml | 61 ++ .../RenewalApplicationSignerInfoMapper.xml | 14 + .../renewal/RenewalRenovateApprovalMapper.xml | 22 + .../store/StoreBusinessReportMapper.xml | 128 ++++ .../com/cool/store/dto/BigRegionUserDTO.java | 21 + .../cool/store/dto/BigRegionUserListDTO.java | 22 + .../store/dto/ImportReceivingBankDTO.java | 43 ++ .../dto/ImportReceivingBankErrorDTO.java | 60 ++ .../cool/store/dto/StoreImageExportDTO.java | 27 + .../cool/store/dto/exam/ExamAnswerDTO.java | 19 + .../cool/store/dto/exam/ExamInfoAddDTO.java | 39 ++ .../cool/store/dto/exam/ExamInfoListDTO.java | 20 + .../store/dto/exam/ExamInfoUpdateDTO.java | 30 + .../cool/store/dto/exam/ExamOptionDTO.java | 21 + .../cool/store/dto/exam/ExamPaperAddDTO.java | 50 ++ .../cool/store/dto/exam/ExamPaperListDTO.java | 23 + .../store/dto/exam/ExamQuestionAddDTO.java | 70 +++ .../store/dto/exam/ExamQuestionListDTO.java | 26 + .../store/dto/exam/ExamStartAttemptDTO.java | 21 + .../store/dto/exam/ExamSubmitAnswerDTO.java | 25 + .../store/dto/exam/ExamSubmitPaperDTO.java | 31 + .../com/cool/store/dto/exam/ExamTokenDTO.java | 21 + .../com/cool/store/dto/food/DishesDTO.java | 22 + .../com/cool/store/dto/liepin/XbbAppInfo.java | 54 ++ .../store/dto/liepin/XbbEncryptedData.java | 24 + .../cool/store/dto/store/StoreReportDTO.java | 21 + .../dto/wallet/WithdrawApplicationDTO.java | 9 + .../cool/store/entity/AdjustmentOrderDO.java | 4 + .../com/cool/store/entity/FranchiseFeeDO.java | 8 + .../java/com/cool/store/entity/LinePayDO.java | 8 +- .../store/entity/OpeningOperationPlanDO.java | 41 ++ .../cool/store/entity/ReceivingBankDO.java | 65 ++ .../com/cool/store/entity/ShopInfoDO.java | 1 + .../store/entity/ThirdPartyAccountDO.java | 251 ++++++++ .../cool/store/entity/ThirdPartyStoreDO.java | 137 +++++ .../store/entity/WithdrawApplicationDO.java | 12 + .../entity/approval/CommonApprovalLogDO.java | 108 ++++ .../store/entity/contract/ContractCostDO.java | 109 ++++ .../entity/contract/ContractMasterDO.java | 139 +++++ .../entity/exam/ExamAttemptAnswerDO.java | 68 +++ .../cool/store/entity/exam/ExamAttemptDO.java | 103 ++++ .../cool/store/entity/exam/ExamInfoDO.java | 90 +++ .../cool/store/entity/exam/ExamPaperDO.java | 72 +++ .../entity/exam/ExamPaperQuestionDO.java | 92 +++ .../store/entity/exam/ExamQuestionDO.java | 86 +++ .../entity/renewal/RenewalApplicationDO.java | 108 ++++ .../RenewalApplicationSignerInfoDO.java | 58 ++ .../renewal/RenewalRenovateApprovalDO.java | 84 +++ .../entity/store/StoreBusinessReportDO.java | 51 ++ .../request/AddSignFranchiseRequest.java | 6 - .../request/AdjustmentApprovalRequest.java | 26 + .../request/AdjustmentOrderPageRequest.java | 3 + .../request/FranchiseFeePayOnlineRequest.java | 32 + .../store/request/FranchiseFeeRequest.java | 10 + .../store/request/LinePaySubmitRequest.java | 4 +- .../request/OpeningOperationPlanRequest.java | 24 +- .../request/ReceivingBankListRequest.java | 23 + .../store/request/ReceivingBankRequest.java | 48 ++ .../cool/store/request/StoreCodeRequest.java | 16 + .../request/WithdrawApplicationRequest.java | 6 + .../contract/ContractCostImportRowDTO.java | 31 + .../contract/ContractImportRowDTO.java | 85 +++ .../contract/ContractMasterQueryRequest.java | 50 ++ .../decoration/DecorationListRequest.java | 1 + .../request/liepin/AddStoreEmpRequest.java | 35 ++ .../store/request/liepin/AddStoreRequest.java | 35 ++ .../request/liepin/GetAccessTokenRequest.java | 23 + .../store/request/liepin/GetPathRequest.java | 22 + .../store/request/liepin/UploadRequest.java | 21 + .../store/request/liepin/XbbGetRequest.java | 115 ++++ .../store/request/liepin/XbbPostRequest.java | 148 +++++ .../RenewalApplicationCreateRequest.java | 20 + .../RenewalApplicationQueryRequest.java | 43 ++ .../renewal/RenewalApprovalRequest.java | 48 ++ .../RenewalFranchiseeConfirmRequest.java | 24 + .../wallet/CoolTradeRecodePageRequest.java | 5 + .../wallet/TradeRecodePageRequest.java | 2 + .../store/request/xgj/CancelPayRequest.java | 23 + .../request/xgj/OnlinePayInfoRequest.java | 35 ++ .../request/xgj/ReceiptCallBackRequest.java | 6 +- .../request/xgj/ReceiptOnlineRequest.java | 55 ++ .../request/xgj/XgjSavePartnerRequest.java | 1 - .../response/AddSignFranchiseResponse.java | 5 +- .../response/AdjustmentOrderResponse.java | 14 + .../response/FranchiseFeePayInfoResponse.java | 5 +- .../FranchiseFeePayOnlineResponse.java | 17 + .../store/response/FranchiseFeeResponse.java | 11 + .../store/response/OrderSummaryResponse.java | 39 +- .../store/response/ReceivingBankResponse.java | 58 ++ .../response/WithdrawApplicationResponse.java | 9 + .../store/response/liepin/FileResponse.java | 15 + .../response/liepin/LiePinApiResponse.java | 20 + .../response/liepin/LiePinTokenInfo.java | 18 + .../store/response/liepin/PathResponse.java | 17 + .../response/liepin/StoreEmpInfoResponse.java | 15 + .../response/liepin/StoreInfoResponse.java | 18 + .../store/response/liepin/TokenResponse.java | 40 ++ .../store/response/liepin/XbbResponse.java | 67 +++ .../cool/store/vo/OpeningOperationPlanVO.java | 10 + .../store/vo/approval/ApprovalBatchVO.java | 32 + .../store/vo/approval/ApprovalGroupedVO.java | 22 + .../store/vo/approval/ApprovalHandleVO.java | 45 ++ .../store/vo/contract/ContractCostVO.java | 67 +++ .../vo/contract/ContractMasterDetailVO.java | 57 ++ .../vo/contract/ContractMasterListVO.java | 98 +++ .../vo/desk/PreparationCommonPendingVO.java | 4 + .../store/vo/dict/DictColumnSimpleVO.java | 1 + .../com/cool/store/vo/exam/ExamAnswerVO.java | 19 + .../cool/store/vo/exam/ExamAttemptListVO.java | 47 ++ .../com/cool/store/vo/exam/ExamAttemptVO.java | 78 +++ .../cool/store/vo/exam/ExamInfoListVO.java | 46 ++ .../com/cool/store/vo/exam/ExamInfoVO.java | 46 ++ .../com/cool/store/vo/exam/ExamOptionVO.java | 17 + .../store/vo/exam/ExamPaperForAttemptVO.java | 59 ++ .../cool/store/vo/exam/ExamPaperListVO.java | 38 ++ .../com/cool/store/vo/exam/ExamPaperVO.java | 72 +++ .../store/vo/exam/ExamQuestionListVO.java | 35 ++ .../cool/store/vo/exam/ExamQuestionVO.java | 45 ++ .../com/cool/store/vo/exam/ExamResultVO.java | 31 + .../vo/renewal/ContractRelatedInfoVO.java | 31 + .../renewal/RenewalApplicationDetailVO.java | 93 +++ .../vo/renewal/RenewalApplicationListVO.java | 72 +++ .../vo/renewal/RenewalRenovateApprovalVO.java | 64 ++ .../config/weixin/WechatMpProperties.java | 1 + .../cool/store/handler/TitleWriteHandler.java | 55 ++ .../cool/store/http/WalletHttpClientRest.java | 4 +- .../java/com/cool/store/http/WechatRest.java | 47 ++ .../store/mq/consumer/ConsumerClient.java | 32 + .../listener/ExamAutoEndListener.java | 52 ++ .../listener/ExamAutoSubmitListener.java | 52 ++ .../store/service/AdjustmentOrderService.java | 6 + .../AuditOpeningOperationPlanService.java | 2 +- .../store/service/ExportRealizeService.java | 2 +- .../com/cool/store/service/ExportService.java | 2 + .../com/cool/store/service/ImportService.java | 27 + .../com/cool/store/service/LiePinService.java | 36 ++ .../cool/store/service/LinePayService.java | 9 + .../cool/store/service/OpenApiService.java | 19 +- .../service/OpeningOperationPlanService.java | 2 - .../store/service/OperationLogService.java | 9 + .../com/cool/store/service/PointService.java | 2 +- .../store/service/PreparationService.java | 5 + .../com/cool/store/service/PushService.java | 8 + .../store/service/ReceivingBankService.java | 22 + .../com/cool/store/service/StoreService.java | 4 + .../cool/store/service/ThirdFoodService.java | 15 + .../store/service/ThirdLiePinService.java | 53 ++ .../store/service/UserAuthMappingService.java | 8 + .../store/service/WechatMiniAppService.java | 9 + .../com/cool/store/service/XbbApiCaller.java | 270 +++++++++ .../approval/CommonApprovalLogService.java | 31 + .../impl/CommonApprovalLogServiceImpl.java | 222 +++++++ .../close/CloseStoreRefundService.java | 8 +- .../impl/CloseStoreRefundServiceImpl.java | 5 + .../closeup/impl/CloseUpServiceImpl.java | 3 +- .../contract/ContractMasterService.java | 16 + .../impl/ContractMasterServiceImpl.java | 237 ++++++++ .../listener/ContractImportListener.java | 132 +++++ .../service/exam/ExamAttemptService.java | 49 ++ .../store/service/exam/ExamInfoService.java | 57 ++ .../store/service/exam/ExamPaperService.java | 42 ++ .../service/exam/ExamQuestionService.java | 39 ++ .../exam/impl/ExamAttemptServiceImpl.java | 477 +++++++++++++++ .../exam/impl/ExamInfoServiceImpl.java | 236 ++++++++ .../exam/impl/ExamPaperServiceImpl.java | 173 ++++++ .../exam/impl/ExamQuestionServiceImpl.java | 88 +++ .../impl/AdjustmentOrderServiceImpl.java | 141 ++++- .../impl/AuditOpeningOperationPlanImpl.java | 14 +- .../service/impl/BigRegionServiceImpl.java | 2 +- .../impl/BuildInformationServiceImpl.java | 4 +- .../service/impl/DataHandlerServerImpl.java | 2 +- .../store/service/impl/DeskServiceImpl.java | 11 + .../service/impl/EnterpriseServiceImpl.java | 2 +- .../impl/ExportRealizeServiceImpl.java | 5 +- .../store/service/impl/ExportServiceImpl.java | 1 + .../store/service/impl/HqtAPIServiceImpl.java | 2 + .../store/service/impl/ImportServiceImpl.java | 197 +++++++ .../store/service/impl/LiePinServiceImpl.java | 131 ++++ .../store/service/impl/LineFlowService.java | 1 - .../service/impl/LinePayServiceImpl.java | 194 +++++- .../impl/MessageTemplateServiceImpl.java | 4 +- .../service/impl/OpenApiServiceImpl.java | 6 + .../impl/OpeningOperationPlanImpl.java | 111 ++-- .../service/impl/OperationLogServiceImpl.java | 24 + .../store/service/impl/PointServiceImpl.java | 66 ++- .../service/impl/PreparationServiceImpl.java | 22 + .../store/service/impl/PushServiceImpl.java | 10 +- .../impl/ReceivingBankServiceImpl.java | 139 +++++ .../store/service/impl/ShopServiceImpl.java | 3 +- .../impl/SignFranchiseServiceImpl.java | 6 + .../store/service/impl/StoreServiceImpl.java | 47 +- .../service/impl/ThirdFoodServiceImpl.java | 61 ++ .../service/impl/ThirdLiePinServiceImpl.java | 191 ++++++ .../impl/ThirdOpportunityServiceImpl.java | 5 +- .../impl/UserAuthMappingServiceImpl.java | 59 +- .../impl/WechatMiniAppServiceImpl.java | 46 ++ .../impl/WithdrawApplicationServiceImpl.java | 23 +- .../renewal/RenewalApplicationService.java | 29 + .../impl/RenewalApplicationServiceImpl.java | 557 ++++++++++++++++++ .../visit/impl/VisitRecordServiceImpl.java | 2 +- .../wallet/impl/WalletServiceImpl.java | 6 + .../store/utils/easyExcel/EasyExcelUtil.java | 2 +- .../easyExcel/StoreImageExcelExporter.java | 227 +++++++ .../com/cool/store/utils/poi/ExcelUtil.java | 18 +- .../store/config/OpenApiValidateFilter.java | 21 +- .../cool/store/config/SignValidateFilter.java | 2 + .../store/config/TokenValidateFilter.java | 2 + .../store/config/swagger/Swagger2Config.java | 2 +- .../webb/AdjustmentOrderController.java | 6 + .../webb/CloseStoreRefundController.java | 6 + .../webb/ContractMasterController.java | 46 ++ .../controller/webb/ExportController.java | 1 + .../controller/webb/ImportController.java | 73 +++ .../controller/webb/OpenApiController.java | 30 +- .../controller/webb/PCExamInfoController.java | 76 +++ .../webb/PCExamPaperController.java | 62 ++ .../webb/PCExamQuestionController.java | 64 ++ .../webb/PCOpenPreparationController.java | 2 +- .../controller/webb/PCStoreController.java | 1 + .../controller/webb/PCTestController.java | 168 +++++- .../controller/webb/PointController.java | 4 +- .../webb/ReceivingBankController.java | 46 ++ .../webb/RenewalApplicationController.java | 110 ++++ .../controller/webc/LinePayController.java | 14 + .../controller/webc/MiniExamController.java | 84 +++ .../webc/MiniOpenPreparationController.java | 7 +- .../webc/MiniReceivingBankController.java | 33 ++ .../MiniRenewalApplicationController.java | 48 ++ .../webc/MiniShopAccountController.java | 24 + .../controller/webc/MiniShopController.java | 6 +- .../store/controller/webc/TestController.java | 26 +- .../com/cool/store/job/XxlJobHandler.java | 58 +- .../main/resources/application-ab.properties | 44 +- .../resources/application-test.properties | 20 +- pom.xml | 2 +- 325 files changed, 14065 insertions(+), 264 deletions(-) create mode 100644 coolstore-partner-common/src/main/java/com/cool/store/enums/ExamAttemptStatusEnum.java create mode 100644 coolstore-partner-common/src/main/java/com/cool/store/enums/ExamInfoStatusEnum.java create mode 100644 coolstore-partner-common/src/main/java/com/cool/store/enums/IsRefundEnum.java create mode 100644 coolstore-partner-common/src/main/java/com/cool/store/enums/PayStatusEnum.java create mode 100644 coolstore-partner-common/src/main/java/com/cool/store/enums/approval/ApprovalResultEnum.java create mode 100644 coolstore-partner-common/src/main/java/com/cool/store/enums/renewal/RenewalNodeEnum.java create mode 100644 coolstore-partner-common/src/main/java/com/cool/store/enums/renewal/RenewalStatusEnum.java create mode 100644 coolstore-partner-common/src/main/java/com/cool/store/utils/OssUtil.java create mode 100644 coolstore-partner-common/src/main/java/com/cool/store/utils/RealIpUtils.java create mode 100644 coolstore-partner-common/src/main/java/com/cool/store/utils/SuperPaySignature.java create mode 100644 coolstore-partner-common/src/main/java/com/cool/store/utils/hire/XbbAesUtil.java create mode 100644 coolstore-partner-common/src/main/java/com/cool/store/utils/hire/XbbSignatureInfo.java create mode 100644 coolstore-partner-dao/src/main/java/com/cool/store/dao/ReceivingBankDAO.java create mode 100644 coolstore-partner-dao/src/main/java/com/cool/store/dao/ThirdPartyAccountDAO.java create mode 100644 coolstore-partner-dao/src/main/java/com/cool/store/dao/ThirdPartyStoreDAO.java create mode 100644 coolstore-partner-dao/src/main/java/com/cool/store/dao/approval/CommonApprovalLogDAO.java create mode 100644 coolstore-partner-dao/src/main/java/com/cool/store/dao/contract/ContractCostDAO.java create mode 100644 coolstore-partner-dao/src/main/java/com/cool/store/dao/contract/ContractMasterDAO.java create mode 100644 coolstore-partner-dao/src/main/java/com/cool/store/dao/exam/ExamAttemptAnswerDAO.java create mode 100644 coolstore-partner-dao/src/main/java/com/cool/store/dao/exam/ExamAttemptDAO.java create mode 100644 coolstore-partner-dao/src/main/java/com/cool/store/dao/exam/ExamInfoDAO.java create mode 100644 coolstore-partner-dao/src/main/java/com/cool/store/dao/exam/ExamPaperDAO.java create mode 100644 coolstore-partner-dao/src/main/java/com/cool/store/dao/exam/ExamPaperQuestionDAO.java create mode 100644 coolstore-partner-dao/src/main/java/com/cool/store/dao/exam/ExamQuestionDAO.java create mode 100644 coolstore-partner-dao/src/main/java/com/cool/store/dao/renewal/RenewalApplicationDAO.java create mode 100644 coolstore-partner-dao/src/main/java/com/cool/store/dao/renewal/RenewalApplicationSignerInfoDAO.java create mode 100644 coolstore-partner-dao/src/main/java/com/cool/store/dao/renewal/RenewalRenovateApprovalDAO.java create mode 100644 coolstore-partner-dao/src/main/java/com/cool/store/dao/store/StoreBusinessReportDAO.java create mode 100644 coolstore-partner-dao/src/main/java/com/cool/store/mapper/ReceivingBankMapper.java create mode 100644 coolstore-partner-dao/src/main/java/com/cool/store/mapper/ThirdPartyAccountMapper.java create mode 100644 coolstore-partner-dao/src/main/java/com/cool/store/mapper/ThirdPartyStoreMapper.java create mode 100644 coolstore-partner-dao/src/main/java/com/cool/store/mapper/approval/CommonApprovalLogMapper.java create mode 100644 coolstore-partner-dao/src/main/java/com/cool/store/mapper/contract/ContractCostMapper.java create mode 100644 coolstore-partner-dao/src/main/java/com/cool/store/mapper/contract/ContractMasterMapper.java create mode 100644 coolstore-partner-dao/src/main/java/com/cool/store/mapper/exam/ExamAttemptAnswerMapper.java create mode 100644 coolstore-partner-dao/src/main/java/com/cool/store/mapper/exam/ExamAttemptMapper.java create mode 100644 coolstore-partner-dao/src/main/java/com/cool/store/mapper/exam/ExamInfoMapper.java create mode 100644 coolstore-partner-dao/src/main/java/com/cool/store/mapper/exam/ExamPaperMapper.java create mode 100644 coolstore-partner-dao/src/main/java/com/cool/store/mapper/exam/ExamPaperQuestionMapper.java create mode 100644 coolstore-partner-dao/src/main/java/com/cool/store/mapper/exam/ExamQuestionMapper.java create mode 100644 coolstore-partner-dao/src/main/java/com/cool/store/mapper/renewal/RenewalApplicationMapper.java create mode 100644 coolstore-partner-dao/src/main/java/com/cool/store/mapper/renewal/RenewalApplicationSignerInfoMapper.java create mode 100644 coolstore-partner-dao/src/main/java/com/cool/store/mapper/renewal/RenewalRenovateApprovalMapper.java create mode 100644 coolstore-partner-dao/src/main/java/com/cool/store/mapper/store/StoreBusinessReportMapper.java create mode 100644 coolstore-partner-dao/src/main/resources/mapper/ReceivingBankMapper.xml create mode 100644 coolstore-partner-dao/src/main/resources/mapper/ThirdPartyAccountMapper.xml create mode 100644 coolstore-partner-dao/src/main/resources/mapper/ThirdPartyMapper.xml create mode 100644 coolstore-partner-dao/src/main/resources/mapper/approval/CommonApprovalLogMapper.xml create mode 100644 coolstore-partner-dao/src/main/resources/mapper/contract/ContractCostMapper.xml create mode 100644 coolstore-partner-dao/src/main/resources/mapper/contract/ContractMasterMapper.xml create mode 100644 coolstore-partner-dao/src/main/resources/mapper/exam/ExamAttemptAnswerMapper.xml create mode 100644 coolstore-partner-dao/src/main/resources/mapper/exam/ExamAttemptMapper.xml create mode 100644 coolstore-partner-dao/src/main/resources/mapper/exam/ExamInfoMapper.xml create mode 100644 coolstore-partner-dao/src/main/resources/mapper/exam/ExamPaperMapper.xml create mode 100644 coolstore-partner-dao/src/main/resources/mapper/exam/ExamPaperQuestionMapper.xml create mode 100644 coolstore-partner-dao/src/main/resources/mapper/exam/ExamQuestionMapper.xml create mode 100644 coolstore-partner-dao/src/main/resources/mapper/renewal/RenewalApplicationMapper.xml create mode 100644 coolstore-partner-dao/src/main/resources/mapper/renewal/RenewalApplicationSignerInfoMapper.xml create mode 100644 coolstore-partner-dao/src/main/resources/mapper/renewal/RenewalRenovateApprovalMapper.xml create mode 100644 coolstore-partner-dao/src/main/resources/mapper/store/StoreBusinessReportMapper.xml create mode 100644 coolstore-partner-model/src/main/java/com/cool/store/dto/BigRegionUserDTO.java create mode 100644 coolstore-partner-model/src/main/java/com/cool/store/dto/BigRegionUserListDTO.java create mode 100644 coolstore-partner-model/src/main/java/com/cool/store/dto/ImportReceivingBankDTO.java create mode 100644 coolstore-partner-model/src/main/java/com/cool/store/dto/ImportReceivingBankErrorDTO.java create mode 100644 coolstore-partner-model/src/main/java/com/cool/store/dto/StoreImageExportDTO.java create mode 100644 coolstore-partner-model/src/main/java/com/cool/store/dto/exam/ExamAnswerDTO.java create mode 100644 coolstore-partner-model/src/main/java/com/cool/store/dto/exam/ExamInfoAddDTO.java create mode 100644 coolstore-partner-model/src/main/java/com/cool/store/dto/exam/ExamInfoListDTO.java create mode 100644 coolstore-partner-model/src/main/java/com/cool/store/dto/exam/ExamInfoUpdateDTO.java create mode 100644 coolstore-partner-model/src/main/java/com/cool/store/dto/exam/ExamOptionDTO.java create mode 100644 coolstore-partner-model/src/main/java/com/cool/store/dto/exam/ExamPaperAddDTO.java create mode 100644 coolstore-partner-model/src/main/java/com/cool/store/dto/exam/ExamPaperListDTO.java create mode 100644 coolstore-partner-model/src/main/java/com/cool/store/dto/exam/ExamQuestionAddDTO.java create mode 100644 coolstore-partner-model/src/main/java/com/cool/store/dto/exam/ExamQuestionListDTO.java create mode 100644 coolstore-partner-model/src/main/java/com/cool/store/dto/exam/ExamStartAttemptDTO.java create mode 100644 coolstore-partner-model/src/main/java/com/cool/store/dto/exam/ExamSubmitAnswerDTO.java create mode 100644 coolstore-partner-model/src/main/java/com/cool/store/dto/exam/ExamSubmitPaperDTO.java create mode 100644 coolstore-partner-model/src/main/java/com/cool/store/dto/exam/ExamTokenDTO.java create mode 100644 coolstore-partner-model/src/main/java/com/cool/store/dto/food/DishesDTO.java create mode 100644 coolstore-partner-model/src/main/java/com/cool/store/dto/liepin/XbbAppInfo.java create mode 100644 coolstore-partner-model/src/main/java/com/cool/store/dto/liepin/XbbEncryptedData.java create mode 100644 coolstore-partner-model/src/main/java/com/cool/store/dto/store/StoreReportDTO.java create mode 100644 coolstore-partner-model/src/main/java/com/cool/store/entity/ReceivingBankDO.java create mode 100644 coolstore-partner-model/src/main/java/com/cool/store/entity/ThirdPartyAccountDO.java create mode 100644 coolstore-partner-model/src/main/java/com/cool/store/entity/ThirdPartyStoreDO.java create mode 100644 coolstore-partner-model/src/main/java/com/cool/store/entity/approval/CommonApprovalLogDO.java create mode 100644 coolstore-partner-model/src/main/java/com/cool/store/entity/contract/ContractCostDO.java create mode 100644 coolstore-partner-model/src/main/java/com/cool/store/entity/contract/ContractMasterDO.java create mode 100644 coolstore-partner-model/src/main/java/com/cool/store/entity/exam/ExamAttemptAnswerDO.java create mode 100644 coolstore-partner-model/src/main/java/com/cool/store/entity/exam/ExamAttemptDO.java create mode 100644 coolstore-partner-model/src/main/java/com/cool/store/entity/exam/ExamInfoDO.java create mode 100644 coolstore-partner-model/src/main/java/com/cool/store/entity/exam/ExamPaperDO.java create mode 100644 coolstore-partner-model/src/main/java/com/cool/store/entity/exam/ExamPaperQuestionDO.java create mode 100644 coolstore-partner-model/src/main/java/com/cool/store/entity/exam/ExamQuestionDO.java create mode 100644 coolstore-partner-model/src/main/java/com/cool/store/entity/renewal/RenewalApplicationDO.java create mode 100644 coolstore-partner-model/src/main/java/com/cool/store/entity/renewal/RenewalApplicationSignerInfoDO.java create mode 100644 coolstore-partner-model/src/main/java/com/cool/store/entity/renewal/RenewalRenovateApprovalDO.java create mode 100644 coolstore-partner-model/src/main/java/com/cool/store/entity/store/StoreBusinessReportDO.java create mode 100644 coolstore-partner-model/src/main/java/com/cool/store/request/AdjustmentApprovalRequest.java create mode 100644 coolstore-partner-model/src/main/java/com/cool/store/request/FranchiseFeePayOnlineRequest.java create mode 100644 coolstore-partner-model/src/main/java/com/cool/store/request/ReceivingBankListRequest.java create mode 100644 coolstore-partner-model/src/main/java/com/cool/store/request/ReceivingBankRequest.java create mode 100644 coolstore-partner-model/src/main/java/com/cool/store/request/StoreCodeRequest.java create mode 100644 coolstore-partner-model/src/main/java/com/cool/store/request/contract/ContractCostImportRowDTO.java create mode 100644 coolstore-partner-model/src/main/java/com/cool/store/request/contract/ContractImportRowDTO.java create mode 100644 coolstore-partner-model/src/main/java/com/cool/store/request/contract/ContractMasterQueryRequest.java create mode 100644 coolstore-partner-model/src/main/java/com/cool/store/request/liepin/AddStoreEmpRequest.java create mode 100644 coolstore-partner-model/src/main/java/com/cool/store/request/liepin/AddStoreRequest.java create mode 100644 coolstore-partner-model/src/main/java/com/cool/store/request/liepin/GetAccessTokenRequest.java create mode 100644 coolstore-partner-model/src/main/java/com/cool/store/request/liepin/GetPathRequest.java create mode 100644 coolstore-partner-model/src/main/java/com/cool/store/request/liepin/UploadRequest.java create mode 100644 coolstore-partner-model/src/main/java/com/cool/store/request/liepin/XbbGetRequest.java create mode 100644 coolstore-partner-model/src/main/java/com/cool/store/request/liepin/XbbPostRequest.java create mode 100644 coolstore-partner-model/src/main/java/com/cool/store/request/renewal/RenewalApplicationCreateRequest.java create mode 100644 coolstore-partner-model/src/main/java/com/cool/store/request/renewal/RenewalApplicationQueryRequest.java create mode 100644 coolstore-partner-model/src/main/java/com/cool/store/request/renewal/RenewalApprovalRequest.java create mode 100644 coolstore-partner-model/src/main/java/com/cool/store/request/renewal/RenewalFranchiseeConfirmRequest.java create mode 100644 coolstore-partner-model/src/main/java/com/cool/store/request/xgj/CancelPayRequest.java create mode 100644 coolstore-partner-model/src/main/java/com/cool/store/request/xgj/OnlinePayInfoRequest.java create mode 100644 coolstore-partner-model/src/main/java/com/cool/store/request/xgj/ReceiptOnlineRequest.java create mode 100644 coolstore-partner-model/src/main/java/com/cool/store/response/FranchiseFeePayOnlineResponse.java create mode 100644 coolstore-partner-model/src/main/java/com/cool/store/response/ReceivingBankResponse.java create mode 100644 coolstore-partner-model/src/main/java/com/cool/store/response/liepin/FileResponse.java create mode 100644 coolstore-partner-model/src/main/java/com/cool/store/response/liepin/LiePinApiResponse.java create mode 100644 coolstore-partner-model/src/main/java/com/cool/store/response/liepin/LiePinTokenInfo.java create mode 100644 coolstore-partner-model/src/main/java/com/cool/store/response/liepin/PathResponse.java create mode 100644 coolstore-partner-model/src/main/java/com/cool/store/response/liepin/StoreEmpInfoResponse.java create mode 100644 coolstore-partner-model/src/main/java/com/cool/store/response/liepin/StoreInfoResponse.java create mode 100644 coolstore-partner-model/src/main/java/com/cool/store/response/liepin/TokenResponse.java create mode 100644 coolstore-partner-model/src/main/java/com/cool/store/response/liepin/XbbResponse.java create mode 100644 coolstore-partner-model/src/main/java/com/cool/store/vo/approval/ApprovalBatchVO.java create mode 100644 coolstore-partner-model/src/main/java/com/cool/store/vo/approval/ApprovalGroupedVO.java create mode 100644 coolstore-partner-model/src/main/java/com/cool/store/vo/approval/ApprovalHandleVO.java create mode 100644 coolstore-partner-model/src/main/java/com/cool/store/vo/contract/ContractCostVO.java create mode 100644 coolstore-partner-model/src/main/java/com/cool/store/vo/contract/ContractMasterDetailVO.java create mode 100644 coolstore-partner-model/src/main/java/com/cool/store/vo/contract/ContractMasterListVO.java create mode 100644 coolstore-partner-model/src/main/java/com/cool/store/vo/exam/ExamAnswerVO.java create mode 100644 coolstore-partner-model/src/main/java/com/cool/store/vo/exam/ExamAttemptListVO.java create mode 100644 coolstore-partner-model/src/main/java/com/cool/store/vo/exam/ExamAttemptVO.java create mode 100644 coolstore-partner-model/src/main/java/com/cool/store/vo/exam/ExamInfoListVO.java create mode 100644 coolstore-partner-model/src/main/java/com/cool/store/vo/exam/ExamInfoVO.java create mode 100644 coolstore-partner-model/src/main/java/com/cool/store/vo/exam/ExamOptionVO.java create mode 100644 coolstore-partner-model/src/main/java/com/cool/store/vo/exam/ExamPaperForAttemptVO.java create mode 100644 coolstore-partner-model/src/main/java/com/cool/store/vo/exam/ExamPaperListVO.java create mode 100644 coolstore-partner-model/src/main/java/com/cool/store/vo/exam/ExamPaperVO.java create mode 100644 coolstore-partner-model/src/main/java/com/cool/store/vo/exam/ExamQuestionListVO.java create mode 100644 coolstore-partner-model/src/main/java/com/cool/store/vo/exam/ExamQuestionVO.java create mode 100644 coolstore-partner-model/src/main/java/com/cool/store/vo/exam/ExamResultVO.java create mode 100644 coolstore-partner-model/src/main/java/com/cool/store/vo/renewal/ContractRelatedInfoVO.java create mode 100644 coolstore-partner-model/src/main/java/com/cool/store/vo/renewal/RenewalApplicationDetailVO.java create mode 100644 coolstore-partner-model/src/main/java/com/cool/store/vo/renewal/RenewalApplicationListVO.java create mode 100644 coolstore-partner-model/src/main/java/com/cool/store/vo/renewal/RenewalRenovateApprovalVO.java create mode 100644 coolstore-partner-service/src/main/java/com/cool/store/handler/TitleWriteHandler.java create mode 100644 coolstore-partner-service/src/main/java/com/cool/store/mq/consumer/listener/ExamAutoEndListener.java create mode 100644 coolstore-partner-service/src/main/java/com/cool/store/mq/consumer/listener/ExamAutoSubmitListener.java create mode 100644 coolstore-partner-service/src/main/java/com/cool/store/service/ImportService.java create mode 100644 coolstore-partner-service/src/main/java/com/cool/store/service/LiePinService.java create mode 100644 coolstore-partner-service/src/main/java/com/cool/store/service/ReceivingBankService.java create mode 100644 coolstore-partner-service/src/main/java/com/cool/store/service/ThirdLiePinService.java create mode 100644 coolstore-partner-service/src/main/java/com/cool/store/service/XbbApiCaller.java create mode 100644 coolstore-partner-service/src/main/java/com/cool/store/service/approval/CommonApprovalLogService.java create mode 100644 coolstore-partner-service/src/main/java/com/cool/store/service/approval/impl/CommonApprovalLogServiceImpl.java create mode 100644 coolstore-partner-service/src/main/java/com/cool/store/service/contract/ContractMasterService.java create mode 100644 coolstore-partner-service/src/main/java/com/cool/store/service/contract/impl/ContractMasterServiceImpl.java create mode 100644 coolstore-partner-service/src/main/java/com/cool/store/service/contract/listener/ContractImportListener.java create mode 100644 coolstore-partner-service/src/main/java/com/cool/store/service/exam/ExamAttemptService.java create mode 100644 coolstore-partner-service/src/main/java/com/cool/store/service/exam/ExamInfoService.java create mode 100644 coolstore-partner-service/src/main/java/com/cool/store/service/exam/ExamPaperService.java create mode 100644 coolstore-partner-service/src/main/java/com/cool/store/service/exam/ExamQuestionService.java create mode 100644 coolstore-partner-service/src/main/java/com/cool/store/service/exam/impl/ExamAttemptServiceImpl.java create mode 100644 coolstore-partner-service/src/main/java/com/cool/store/service/exam/impl/ExamInfoServiceImpl.java create mode 100644 coolstore-partner-service/src/main/java/com/cool/store/service/exam/impl/ExamPaperServiceImpl.java create mode 100644 coolstore-partner-service/src/main/java/com/cool/store/service/exam/impl/ExamQuestionServiceImpl.java create mode 100644 coolstore-partner-service/src/main/java/com/cool/store/service/impl/ImportServiceImpl.java create mode 100644 coolstore-partner-service/src/main/java/com/cool/store/service/impl/LiePinServiceImpl.java create mode 100644 coolstore-partner-service/src/main/java/com/cool/store/service/impl/ReceivingBankServiceImpl.java create mode 100644 coolstore-partner-service/src/main/java/com/cool/store/service/impl/ThirdLiePinServiceImpl.java create mode 100644 coolstore-partner-service/src/main/java/com/cool/store/service/renewal/RenewalApplicationService.java create mode 100644 coolstore-partner-service/src/main/java/com/cool/store/service/renewal/impl/RenewalApplicationServiceImpl.java create mode 100644 coolstore-partner-service/src/main/java/com/cool/store/utils/easyExcel/StoreImageExcelExporter.java create mode 100644 coolstore-partner-web/src/main/java/com/cool/store/controller/webb/ContractMasterController.java create mode 100644 coolstore-partner-web/src/main/java/com/cool/store/controller/webb/ImportController.java create mode 100644 coolstore-partner-web/src/main/java/com/cool/store/controller/webb/PCExamInfoController.java create mode 100644 coolstore-partner-web/src/main/java/com/cool/store/controller/webb/PCExamPaperController.java create mode 100644 coolstore-partner-web/src/main/java/com/cool/store/controller/webb/PCExamQuestionController.java create mode 100644 coolstore-partner-web/src/main/java/com/cool/store/controller/webb/ReceivingBankController.java create mode 100644 coolstore-partner-web/src/main/java/com/cool/store/controller/webb/RenewalApplicationController.java create mode 100644 coolstore-partner-web/src/main/java/com/cool/store/controller/webc/MiniExamController.java create mode 100644 coolstore-partner-web/src/main/java/com/cool/store/controller/webc/MiniReceivingBankController.java create mode 100644 coolstore-partner-web/src/main/java/com/cool/store/controller/webc/MiniRenewalApplicationController.java 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 bbde7df68..da5667881 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 @@ -231,6 +231,11 @@ public class RedisConstant { public static final String PHONE_NUMBER= "phone_number_"; + public static final String ACCESS_TOKEN_CACHE_PREFIX = "liepin:access_token:{0}:{1}"; + + public static final String TOKEN_CACHE_PREFIX = "liepin:token:{0}:{1}"; + + public static final String LIE_PIN_EMP_PATH_PREFIX = "liepin:path:{0}:{1}"; /** * MDM 省市区数据缓存 */ @@ -352,6 +357,11 @@ public class RedisConstant { */ public static final String TP_PENALTY_APPLY_IMPORT_LOCK = "tp_penalty_apply_import_lock"; + /** + * 合同导入锁 + */ + public static final String CONTRACT_IMPORT_LOCK = "contract_import_lock"; + /** * 十二分审批按钮权限id */ @@ -360,6 +370,7 @@ public class RedisConstant { public static final String STANDARD_STORE_PAY_LOCK_KEY = "standard_store_pay_lock_key:{0}"; + /** * 拜访记录导出锁 */ diff --git a/coolstore-partner-common/src/main/java/com/cool/store/enums/ClaimStatusEnum.java b/coolstore-partner-common/src/main/java/com/cool/store/enums/ClaimStatusEnum.java index 0740e2282..406cd3a08 100644 --- a/coolstore-partner-common/src/main/java/com/cool/store/enums/ClaimStatusEnum.java +++ b/coolstore-partner-common/src/main/java/com/cool/store/enums/ClaimStatusEnum.java @@ -8,7 +8,8 @@ package com.cool.store.enums; */ public enum ClaimStatusEnum { TO_BE_CLAIMED(0,"待认领"), - CLAIMED(1,"已认领"); + CLAIMED(1,"已认领"), + CLAIMED_FAIL(2,"认领失败"); private Integer code; private String message; ClaimStatusEnum(Integer code,String message){ 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 15c16d20b..f51d02f23 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 @@ -224,6 +224,12 @@ public enum ErrorCodeEnum { SYSTEM_NAME_NOT__SUPPORT(109018, "请不要使用系统默认店名!", null), + BANK_INFO_IS_EXIST(109017, "该区域已存在相同品牌,付款方式的银行信息!", null), + SHOP_REGION_NOT_EXIST(109018, "门店未选择所属大区!", null), + SHOP_FRANCHISE_BRAND_NOT_EXITS(109019, "门店未选择所属品牌!", null), + PAY_TYPE_NOT_EXIST(109020, "付款方式异常!", null), + RECEIVING_BANK_NOT_EXIST(109021, "未查询到该门店对应的收款银行信息", null), + THERE_ARE_SEVERAL_RECEIVING_BANK(109022, "该门店已存在多个收款银行信息!", null), INSERT_OPENING_OPERATION_PLAN_AUDIT_FALSE(103001,"插入运营方案审核信息失败",null), INSERT_OPENING_OPERATION_PLAN_FALSE(103002,"插入运营方案失败",null), @@ -320,9 +326,13 @@ public enum ErrorCodeEnum { STORE_MESSAGE_REVOKE(1610003,"当前门店消息已撤销,请务重复操作",null), STORE_MESSAGE_HANDLED(1610004,"当前门店消息已处理,无法撤销!",null), MATTER_STORE_OR_USER_IS_NULL(1610005,"当前事项门店或者人员为空,发布失败,请确认!",null), - CONFIG_NOT_EXIST(1610006,"配置不存在或被禁用,请确认!",null), + CONFIG_NOT_EXIST(1016006,"配置不存在或被禁用,请确认!",null), MESSAGE_NOT_EXIST(1610007,"消息模板不存在或已被删除",null), MESSAGE_NOT_HANDLED(1610008,"当前消息无需处理,请确认消息处理类型!",null), + + FILE_ERROR(1610001,"文件解析失败",null), + + MESSAGE_PUBLISH(1610009,"您选择通知任务正在发布中,请稍后重试!",null), NOT_FLAGSHIP_STORE(16100005,"非直营店,无法跳过缴费阶段!",null), @@ -333,7 +343,6 @@ public enum ErrorCodeEnum { JOIN_MODE_NOT_ALLOW_OPERATE(1610012,"加盟部人员只能新建加盟店或联营店,请确认!",null), STORE_NOT_FIND(1610013,"门店不存在",null), SHOP_NAME_INVALID(1610014, "门店名称包含禁止关键词",null), - CONTRACT_STAGE_NO_COMPLETE(1610015, "当前阶段无法分配运营顾问!",null), CONFIG_OPTION_USED(1610015, "配置选项已被店型使用,无法删除", null), STORE_TYPE_OPTION_DEFAULT_DUPLICATE(1610016, "同一配置项下只能设置一个默认选项", null), @@ -371,6 +380,8 @@ public enum ErrorCodeEnum { + CONTRACT_STAGE_NO_COMPLETE(1610015, "当前阶段无法分配运营顾问!",null), + //装修 TEAM_USED(1612001,"该装修团队有门店使用,无法删除,请确认!",null), CURRENT_BRAND_SORT_NUMBER_EXIST(1612002,"已存在该排序数字!",null), @@ -399,6 +410,7 @@ public enum ErrorCodeEnum { WITHDRAW_APPLY_NOT_EXIST(1621011, "提现申请单不存在!", null), WITHDRAW_ING(1621012, "提现中,请勿重复分账!", null), WALLET_BALANCE_INSUFFICIENT(1621013, "钱包余额不足!", null), + WALLET_OPEN_ACCOUNT_NO_BALANCE(1621014,"认款失败,该门店钱包余额不足!",null), @@ -478,10 +490,7 @@ public enum ErrorCodeEnum { WALLET_PAY_CANNOT_CANCEL(1830020, "该交易无法取消", null), TOTAL_FEES_NEED_EQUAL(1830021, "分账总金额需与合计缴费金额一致", null), NOT_EXIST_WANG_SHANG_ACCOUNT(1830022, "当前门店未开通网商钱包账户,请先开通!", null), - SIGNER_NOT_EQUAL_LEGAL_PERSON(1840022, "法人与签约人不一致", null), - - IP_LIMIT(1840000, "IP访问次数超限", null), - + SIGNER_NOT_EQUAL_LEGAL_PERSON(1840023, "法人与签约人不一致", null), CLOSE_UP_CLOSED_DOWN(1840000, "门店已歇业", null), CLOSE_UP_ONLY_SUPPORT_OPEN(1840001, "仅支持在营门店发起歇业申请", null), @@ -495,12 +504,40 @@ public enum ErrorCodeEnum { CLOSE_UP_EXIST_OPEN_APPLY(1840009, "该歇业申请单已存在开业申请", null), CLOSE_UP_APPROVED(1840010, "该申请单已审批", null), + IP_LIMIT(1840000, "IP访问次数超限", null), + + // 考试模块 190xxx + EXAM_QUESTION_NOT_EXIST(190001, "题目不存在", null), + EXAM_PAPER_NOT_EXIST(190002, "试卷不存在", null), + EXAM_INFO_NOT_EXIST(190003, "考试不存在", null), + EXAM_PAPER_STARTED_CANNOT_EDIT(190004, "试卷已开始考试,不可修改", null), + EXAM_NOT_PUBLISHED(190005, "考试未发布", null), + EXAM_ALREADY_ENDED(190006, "考试已结束", null), + EXAM_ATTEMPT_NOT_EXIST(190007, "答卷不存在", null), + EXAM_ATTEMPT_ALREADY_SUBMITTED(190008, "试卷已提交,请勿重复提交", null), + EXAM_ATTEMPT_EXPIRED(190009, "考试时间已到,已自动提交", null), + EXAM_TOKEN_INVALID(190010, "考试链接无效", null), + EXAM_ATTEMPT_IN_PROGRESS(190011, "您有正在进行的考试,请先完成", null), + EXAM_ALREADY_PUBLISHED(190012, "考试已发布,无法重复发布", null), + EXAM_NOT_STARTED(190013, "考试未开始", null), + EXAM_TIME_ENDED(190014, "考试时间已结束", null), + EXAM_IN_PROGRESS_CANNOT_DELETE(190015, "当前考试进行中,请先结束考试", null), + EXAM_COMPLETED(190016, "已完成该考试", null), + BONUS_EXIST_OVERLAP_RULE(1850000, "门店该有效期范围内存在相同类型的启用规则", null), BONUS_RULE_NOT_EXIST(1850001, "不存在该奖金发放规则", null), BONUS_RULE_NOT_CONFIG(1850002, "奖金规则或分配规则未配置", null), BONUS_DISTRIBUTE_RATIO_OVER_100(1850003, "分配规则员工比例之和大于100", null), BONUS_PRODUCT_CONFIG_DUPLICATE(1850004, "奖金规则配置存在重复菜品", null), BONUS_RULE_CONFIG_ERROR(1850005, "规则配置异常", null), + + + //续签 + RENEWAL_CONTRACT_NOT_EXIST(1850000,"当前门店没有合同信息",null), + CURRENT_SHOP_EXIST_APPLY(1850002,"当前门店有正在续签的申请",null), + RENEWAL_APPLY_NOT_EXIST(1850003,"续签申请不存在",null), + + ; diff --git a/coolstore-partner-common/src/main/java/com/cool/store/enums/ExamAttemptStatusEnum.java b/coolstore-partner-common/src/main/java/com/cool/store/enums/ExamAttemptStatusEnum.java new file mode 100644 index 000000000..deec90b33 --- /dev/null +++ b/coolstore-partner-common/src/main/java/com/cool/store/enums/ExamAttemptStatusEnum.java @@ -0,0 +1,32 @@ +package com.cool.store.enums; + +import lombok.AllArgsConstructor; +import lombok.Getter; + +/** + * 答卷状态枚举 + */ +@Getter +@AllArgsConstructor +public enum ExamAttemptStatusEnum { + + IN_PROGRESS(0, "进行中"), + COMPLETED(1, "已完成"); + + private final Integer code; + private final String desc; + + /** + * 是否为进行中状态 + */ + public static boolean isInProgress(Integer code) { + return IN_PROGRESS.getCode().equals(code); + } + + /** + * 是否为已完成状态 + */ + public static boolean isCompleted(Integer code) { + return COMPLETED.getCode().equals(code); + } +} \ No newline at end of file diff --git a/coolstore-partner-common/src/main/java/com/cool/store/enums/ExamInfoStatusEnum.java b/coolstore-partner-common/src/main/java/com/cool/store/enums/ExamInfoStatusEnum.java new file mode 100644 index 000000000..5d5fc4043 --- /dev/null +++ b/coolstore-partner-common/src/main/java/com/cool/store/enums/ExamInfoStatusEnum.java @@ -0,0 +1,69 @@ +package com.cool.store.enums; + +import lombok.AllArgsConstructor; +import lombok.Getter; + +/** + * 考试信息状态枚举 + */ +@Getter +@AllArgsConstructor +public enum ExamInfoStatusEnum { + + UN_PUBLISHED(0, "未发布"), + PUBLISHED(1, "已发布"), + ENDED(2, "已结束"); + + private final Integer code; + private final String desc; + + /** + * 根据code获取枚举 + */ + public static ExamInfoStatusEnum getByCode(Integer code) { + if (code == null) { + return null; + } + for (ExamInfoStatusEnum statusEnum : values()) { + if (statusEnum.getCode().equals(code)) { + return statusEnum; + } + } + return null; + } + + /** + * 是否为未发布状态 + */ + public static boolean isUnPublished(Integer code) { + return UN_PUBLISHED.getCode().equals(code); + } + + /** + * 是否为已发布状态 + */ + public static boolean isPublished(Integer code) { + return PUBLISHED.getCode().equals(code); + } + + /** + * 是否为已结束状态 + */ + public static boolean isEnded(Integer code) { + return ENDED.getCode().equals(code); + } + + /** + * 是否可以发布(只有未发布状态可以发布) + */ + public static boolean canPublish(Integer code) { + return isUnPublished(code); + } + + /** + * 是否可以结束(只有已发布状态可以结束) + */ + public static boolean canEnd(Integer code) { + return isPublished(code); + } +} \ No newline at end of file diff --git a/coolstore-partner-common/src/main/java/com/cool/store/enums/FileTypeEnum.java b/coolstore-partner-common/src/main/java/com/cool/store/enums/FileTypeEnum.java index 184d17920..f53ea0190 100644 --- a/coolstore-partner-common/src/main/java/com/cool/store/enums/FileTypeEnum.java +++ b/coolstore-partner-common/src/main/java/com/cool/store/enums/FileTypeEnum.java @@ -27,6 +27,7 @@ public enum FileTypeEnum { IMPORT_FITMENT_SHOP_STAGE_DATA_ERROR_LIST("OaOldShopStageDataErrorList", "导入装修阶段完成数据错误列表 "), SELLING_DETAILS_REPORT("sellingDetailsReport", "开店明细报表"), PRE_FRY_QUALIFICATION_APPLY_EXPORT("preFryQualificationApplyExport", "预炸品资质申请导出"), + RECEIVING_BANK_IMPORT("Receiving_Bank_Import", "收款银行配置导入"), TP_PENALTY_IMPORT("tpPenaltyImport", "十二分惩处申请单导入"), TP_PENALTY_ERROR_EXPORT("tpPenaltyErrorExport", "十二分惩处申请单导入错误列表"), VISIT_RECORD_EXPORT("visitRecordExport", "拜访记录列表"), @@ -38,6 +39,8 @@ public enum FileTypeEnum { ADJUSTMENT_ORDER_EXPORT("adjustmentOrderExport", "费用调整单导出"), EXPENSE_ORDER_EXPORT("expenseOrderExport", "费用单导出"), SPLIT_ORDER_EXPORT("splitOrderExport", "分账单导出"), + CONTRACT_IMPORT("contractImport", "合同导入"), + CONTRACT_ERROR_EXPORT("contractErrorExport", "合同导入错误列表"), ; private String fileType; private String desc; diff --git a/coolstore-partner-common/src/main/java/com/cool/store/enums/FranchiseBrandEnum.java b/coolstore-partner-common/src/main/java/com/cool/store/enums/FranchiseBrandEnum.java index b231b5dc6..a3f80b144 100644 --- a/coolstore-partner-common/src/main/java/com/cool/store/enums/FranchiseBrandEnum.java +++ b/coolstore-partner-common/src/main/java/com/cool/store/enums/FranchiseBrandEnum.java @@ -104,4 +104,16 @@ public enum FranchiseBrandEnum { } return null; } + + public static Integer getCodeByDesc(String desc) { + if (StringUtils.isBlank(desc)){ + return null; + } + for (FranchiseBrandEnum e : FranchiseBrandEnum.values()) { + if (desc.equals(e.getDesc())) { + return e.getCode(); + } + } + return null; + } } diff --git a/coolstore-partner-common/src/main/java/com/cool/store/enums/IsRefundEnum.java b/coolstore-partner-common/src/main/java/com/cool/store/enums/IsRefundEnum.java new file mode 100644 index 000000000..b9b5ed0d6 --- /dev/null +++ b/coolstore-partner-common/src/main/java/com/cool/store/enums/IsRefundEnum.java @@ -0,0 +1,25 @@ +package com.cool.store.enums; + +/** + * @Author: WangShuo + * @Date: 2025/06/13/15:08 + * @Version 1.0 + * @注释: + */ +public enum IsRefundEnum { + + NOT_REFUND(0, "未退款"), + REFUND(1, "已退款"); + private Integer code; + private String message; + IsRefundEnum(Integer code, String message) { + this.code = code; + this.message = message; + } + public Integer getCode() { + return code; + } + public String getMessage() { + return message; + } +} diff --git a/coolstore-partner-common/src/main/java/com/cool/store/enums/PayStatusEnum.java b/coolstore-partner-common/src/main/java/com/cool/store/enums/PayStatusEnum.java new file mode 100644 index 000000000..07bcb1f38 --- /dev/null +++ b/coolstore-partner-common/src/main/java/com/cool/store/enums/PayStatusEnum.java @@ -0,0 +1,31 @@ +package com.cool.store.enums; + +/** + * @Author: WangShuo + * @Date: 2025/06/16/14:08 + * @Version 1.0 + * @注释: + */ +public enum PayStatusEnum { + + WAIT_PAY_45(45,"待支付"), + FEES_HAVE_BEEN_PAID_50(50,"已缴费"), + PAY_FAIL_55(55,"缴费失败"), + CANCELED(60,"已取消"); + private Integer code; + private String message; + + PayStatusEnum(Integer code, String message) { + this.code = code; + this.message = message; + } + + public Integer getCode() { + return code; + } + + public String getMessage() { + return message; + } + +} 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 1086d4a30..3f2c27147 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 @@ -39,6 +39,8 @@ public enum RocketMqGroupEnum { STORE_MASTER_ISSUE("store_master_issue", new ArrayList<>(Arrays.asList(RocketMqTagEnum.STORE_MASTER_ISSUE))), VISIT_RECORD_INVALID("visit_record_invalid", new ArrayList<>(Arrays.asList(RocketMqTagEnum.VISIT_RECORD_INVALID))), TP_PENALTY_APPEAL_OVERDUE("tp_penalty_appeal_overdue", new ArrayList<>(Arrays.asList(RocketMqTagEnum.TP_PENALTY_APPEAL_OVERDUE))), + EXAM_AUTO_SUBMIT("exam_auto_submit", new ArrayList<>(Arrays.asList(RocketMqTagEnum.EXAM_AUTO_SUBMIT))), + EXAM_AUTO_END("exam_auto_end", new ArrayList<>(Arrays.asList(RocketMqTagEnum.EXAM_AUTO_END))), CLOSE_UP_APPLY_STORE_UPDATE("close_up_apply_store_update", new ArrayList<>(Arrays.asList(RocketMqTagEnum.CLOSE_UP_APPLY_STORE_UPDATE))), CLOSE_UP_PLAN_OPEN_STORE("close_up_plan_open_store", new ArrayList<>(Arrays.asList(RocketMqTagEnum.CLOSE_UP_PLAN_OPEN_STORE))), ; 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 a3e7dae4b..face02781 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 @@ -23,6 +23,8 @@ public enum RocketMqTagEnum { STORE_MASTER_ISSUE("store_master_issue","门店主数据下发"), VISIT_RECORD_INVALID("visit_record_invalid", "拜访记录失效"), TP_PENALTY_APPEAL_OVERDUE("tp_penalty_appeal_overdue", "十二分惩处单复议逾期"), + EXAM_AUTO_SUBMIT("exam_auto_submit", "考试自动提交"), + EXAM_AUTO_END("exam_auto_end", "考试自动结束"), CLOSE_UP_APPLY_STORE_UPDATE("close_up_apply_store_update", "歇业申请修改门店状态"), CLOSE_UP_PLAN_OPEN_STORE("close_up_plan_open_store", "歇业申请计划开店"), ; diff --git a/coolstore-partner-common/src/main/java/com/cool/store/enums/approval/ApprovalResultEnum.java b/coolstore-partner-common/src/main/java/com/cool/store/enums/approval/ApprovalResultEnum.java new file mode 100644 index 000000000..7980e94c9 --- /dev/null +++ b/coolstore-partner-common/src/main/java/com/cool/store/enums/approval/ApprovalResultEnum.java @@ -0,0 +1,28 @@ +package com.cool.store.enums.approval; + +import lombok.AllArgsConstructor; +import lombok.Getter; + +/** + * 审批结果枚举 + */ +@Getter +@AllArgsConstructor +public enum ApprovalResultEnum { + + PASS("pass", "通过"), + REJECT("reject", "拒绝"), + ; + + private final String result; + private final String name; + + public static ApprovalResultEnum getByResult(String result) { + for (ApprovalResultEnum value : values()) { + if (value.getResult().equals(result)) { + return value; + } + } + return null; + } +} diff --git a/coolstore-partner-common/src/main/java/com/cool/store/enums/point/PayTypeEnum.java b/coolstore-partner-common/src/main/java/com/cool/store/enums/point/PayTypeEnum.java index ee61a5a26..b2b959efd 100644 --- a/coolstore-partner-common/src/main/java/com/cool/store/enums/point/PayTypeEnum.java +++ b/coolstore-partner-common/src/main/java/com/cool/store/enums/point/PayTypeEnum.java @@ -1,5 +1,8 @@ package com.cool.store.enums.point; +import com.cool.store.utils.StringUtil; +import org.apache.commons.lang3.StringUtils; + /** * @Auther: WangShuo * @Date: 2024/04/29/上午9:45 @@ -9,7 +12,7 @@ package com.cool.store.enums.point; public enum PayTypeEnum { WX_PAY(1,"微信支付"), BANK_PAY(2,"银行转账"), - ONLINE_PAY(3,"线上支付"), + ONLINE_PAY(3,"加盟付"), OFFLINE_PAY(4,"线下支付"); private Integer code; @@ -27,4 +30,16 @@ public enum PayTypeEnum { public String getDesc() { return desc; } + + public static Integer getCodeByDesc(String desc){ + if (StringUtils.isBlank(desc)){ + return null ; + } + for (PayTypeEnum value : PayTypeEnum.values()) { + if(value.getDesc().equals(desc)){ + return value.getCode(); + } + } + return null; + } } diff --git a/coolstore-partner-common/src/main/java/com/cool/store/enums/point/ShopStageEnum.java b/coolstore-partner-common/src/main/java/com/cool/store/enums/point/ShopStageEnum.java index 6c3b54273..ea3c0befe 100644 --- a/coolstore-partner-common/src/main/java/com/cool/store/enums/point/ShopStageEnum.java +++ b/coolstore-partner-common/src/main/java/com/cool/store/enums/point/ShopStageEnum.java @@ -12,6 +12,7 @@ public enum ShopStageEnum { SHOP_STAGE_1(1, "选址"), SHOP_STAGE_2(2, "筹建"), SHOP_STAGE_3(3, "平台建店"), + SHOP_STAGE_4(4, "开业筹备"), ; //店铺阶段 diff --git a/coolstore-partner-common/src/main/java/com/cool/store/enums/point/ShopSubStageEnum.java b/coolstore-partner-common/src/main/java/com/cool/store/enums/point/ShopSubStageEnum.java index a579dd55e..9d1576ad2 100644 --- a/coolstore-partner-common/src/main/java/com/cool/store/enums/point/ShopSubStageEnum.java +++ b/coolstore-partner-common/src/main/java/com/cool/store/enums/point/ShopSubStageEnum.java @@ -25,7 +25,7 @@ public enum ShopSubStageEnum { SHOP_STAGE_9(ShopStageEnum.SHOP_STAGE_2, 90, "设计阶段", 14), SHOP_STAGE_11(ShopStageEnum.SHOP_STAGE_2, 110, "施工阶段", 25), SHOP_STAGE_12(ShopStageEnum.SHOP_STAGE_2, 120, "装修验收", 27), - SHOP_STAGE_14(ShopStageEnum.SHOP_STAGE_2, 140, "开业运营方案", 28), + SHOP_STAGE_14(ShopStageEnum.SHOP_STAGE_4, 140, "开业运营方案", 28), SHOP_STAGE_15(ShopStageEnum.SHOP_STAGE_2, 150, "建店资料收集", 9), SHOP_STAGE_16(ShopStageEnum.SHOP_STAGE_2, 160, "POS开通", 10), diff --git a/coolstore-partner-common/src/main/java/com/cool/store/enums/point/ShopSubStageStatusEnum.java b/coolstore-partner-common/src/main/java/com/cool/store/enums/point/ShopSubStageStatusEnum.java index 3d4df4927..9be2012f2 100644 --- a/coolstore-partner-common/src/main/java/com/cool/store/enums/point/ShopSubStageStatusEnum.java +++ b/coolstore-partner-common/src/main/java/com/cool/store/enums/point/ShopSubStageStatusEnum.java @@ -84,9 +84,7 @@ public enum ShopSubStageStatusEnum { SHOP_SUB_STAGE_STATUS_123(ShopSubStageEnum.SHOP_STAGE_12, 1230, "已验收", Boolean.TRUE), //开业运营方案 - SHOP_SUB_STAGE_STATUS_140(ShopSubStageEnum.SHOP_STAGE_14, 1400, "待上传", Boolean.FALSE), - SHOP_SUB_STAGE_STATUS_141(ShopSubStageEnum.SHOP_STAGE_14, 1420, "待审核", Boolean.FALSE), - SHOP_SUB_STAGE_STATUS_142(ShopSubStageEnum.SHOP_STAGE_14, 1430,"审核不通过", Boolean.FALSE), + SHOP_SUB_STAGE_STATUS_140(ShopSubStageEnum.SHOP_STAGE_14, 1400, "待督导提交", Boolean.FALSE), SHOP_SUB_STAGE_STATUS_143(ShopSubStageEnum.SHOP_STAGE_14, 1440, "已完成", Boolean.TRUE), //平台资料提交 diff --git a/coolstore-partner-common/src/main/java/com/cool/store/enums/renewal/RenewalNodeEnum.java b/coolstore-partner-common/src/main/java/com/cool/store/enums/renewal/RenewalNodeEnum.java new file mode 100644 index 000000000..6fadcd241 --- /dev/null +++ b/coolstore-partner-common/src/main/java/com/cool/store/enums/renewal/RenewalNodeEnum.java @@ -0,0 +1,55 @@ +package com.cool.store.enums.renewal; + +import lombok.AllArgsConstructor; +import lombok.Getter; + +/** + * 续签审批节点枚举 + */ +@Getter +@AllArgsConstructor +public enum RenewalNodeEnum { + + FRANCHISEE_CONFIRM("10", "加盟商确认"), + OPS_CONSULTANT("20", "运营顾问审核"), + REGION_CONSULTANT("25", "片区顾问审核"), + GROUP_ENGINEERING("30", "集团工程部审核"), + ; + + private final String code; + private final String name; + + public static RenewalNodeEnum getByCode(String code) { + for (RenewalNodeEnum value : values()) { + if (value.getCode().equals(code)) { + return value; + } + } + return null; + } + + /** + * 获取下一个审批节点code + */ + public static String getNextNode(String currentCode) { + RenewalNodeEnum current = getByCode(currentCode); + if (current == null) { + return null; + } + switch (current) { + case FRANCHISEE_CONFIRM: + return OPS_CONSULTANT.getCode(); + case OPS_CONSULTANT: + return REGION_CONSULTANT.getCode(); + case REGION_CONSULTANT: + return GROUP_ENGINEERING.getCode(); + default: + return null; + } + } + + public static String getNameByCode(String code) { + RenewalNodeEnum e = getByCode(code); + return e != null ? e.getName() : null; + } +} diff --git a/coolstore-partner-common/src/main/java/com/cool/store/enums/renewal/RenewalStatusEnum.java b/coolstore-partner-common/src/main/java/com/cool/store/enums/renewal/RenewalStatusEnum.java new file mode 100644 index 000000000..64969e544 --- /dev/null +++ b/coolstore-partner-common/src/main/java/com/cool/store/enums/renewal/RenewalStatusEnum.java @@ -0,0 +1,68 @@ +package com.cool.store.enums.renewal; + +import lombok.AllArgsConstructor; +import lombok.Getter; + +/** + * 续签申请状态枚举 + */ +@Getter +@AllArgsConstructor +public enum RenewalStatusEnum { + + PENDING_FRANCHISEE(10, "待加盟商确认"), + PENDING_OPS(20, "待运营顾问审核"), + PENDING_REGION(25, "待片区顾问审核"), + PENDING_GROUP(30, "待集团工程部审核"), + REJECTED(40, "审批拒绝"), + RENEWAL_ING(50, "续签中"), + COMPLETED(60, "已完成"), + NOT_RENEWED(70, "不续签"), + ; + + private final Integer status; + private final String name; + + public static RenewalStatusEnum getByStatus(Integer status) { + for (RenewalStatusEnum value : values()) { + if (value.getStatus().equals(status)) { + return value; + } + } + return null; + } + + public static String getNameByStatus(Integer status) { + RenewalStatusEnum e = getByStatus(status); + return e != null ? e.getName() : null; + } + + /** + * 获取下一个审批通过状态 + */ + public static Integer getNextPassStatus(Integer status) { + RenewalStatusEnum current = getByStatus(status); + if (current == null) { + throw new IllegalArgumentException("续签申请状态为空"); + } + switch (current) { + case PENDING_FRANCHISEE: + return PENDING_OPS.getStatus(); + case PENDING_OPS: + return PENDING_REGION.getStatus(); + case PENDING_REGION: + return PENDING_GROUP.getStatus(); + case PENDING_GROUP: + return COMPLETED.getStatus(); + default: + return null; + } + } + + public static boolean isApprove(Integer status) { + return PENDING_FRANCHISEE.getStatus().equals(status) + || PENDING_OPS.getStatus().equals(status) + || PENDING_REGION.getStatus().equals(status) + || PENDING_GROUP.getStatus().equals(status); + } +} diff --git a/coolstore-partner-common/src/main/java/com/cool/store/enums/wallet/DocStatusEnum.java b/coolstore-partner-common/src/main/java/com/cool/store/enums/wallet/DocStatusEnum.java index c95e250ea..e67fd90f3 100644 --- a/coolstore-partner-common/src/main/java/com/cool/store/enums/wallet/DocStatusEnum.java +++ b/coolstore-partner-common/src/main/java/com/cool/store/enums/wallet/DocStatusEnum.java @@ -1,5 +1,8 @@ package com.cool.store.enums.wallet; +import java.util.Arrays; +import java.util.List; + /** * @Auther zx_szh * @Date 2026/4/9 09:35 @@ -8,7 +11,9 @@ package com.cool.store.enums.wallet; public enum DocStatusEnum { //10-待充值/20-已充值待认款/30-认款完成/40-分部分账/50-分账完成 + DOC_STATUS_05(5,"待审批"), DOC_STATUS_1(10,"待充值"), + DOC_STATUS_15(15,"审批未通过"), DOC_STATUS_2(20,"已充值待认款"), DOC_STATUS_3(30,"认款完成"), DOC_STATUS_4(40,"部分分账"), @@ -32,6 +37,9 @@ public enum DocStatusEnum { return desc; } + public static List getCanDeleteStatus(){ + return Arrays.asList(DOC_STATUS_05.getStatus(),DOC_STATUS_1.getStatus(),DOC_STATUS_2.getStatus()); + } public static DocStatusEnum fromStatus(Integer status) { for (DocStatusEnum item : values()) { diff --git a/coolstore-partner-common/src/main/java/com/cool/store/utils/GenerateNoUtil.java b/coolstore-partner-common/src/main/java/com/cool/store/utils/GenerateNoUtil.java index 7ec49fa5b..40b24abcc 100644 --- a/coolstore-partner-common/src/main/java/com/cool/store/utils/GenerateNoUtil.java +++ b/coolstore-partner-common/src/main/java/com/cool/store/utils/GenerateNoUtil.java @@ -50,4 +50,9 @@ public class GenerateNoUtil { return SPLIT_ORDER_PREFIX + GenerateNoUtil.generateMillsNoWithRandom(); } + + public static Long generateVersion() { + DateTimeFormatter dateFormatter = DateTimeFormatter.ofPattern(DATE_FORMAT_SEC_9); + return Long.valueOf(LocalDateTime.now().format(dateFormatter)); + } } diff --git a/coolstore-partner-common/src/main/java/com/cool/store/utils/OssUtil.java b/coolstore-partner-common/src/main/java/com/cool/store/utils/OssUtil.java new file mode 100644 index 000000000..cd602f631 --- /dev/null +++ b/coolstore-partner-common/src/main/java/com/cool/store/utils/OssUtil.java @@ -0,0 +1,42 @@ +package com.cool.store.utils; + +import org.apache.tika.io.IOUtils; + +import java.io.InputStream; +import java.net.URL; +import java.util.Base64; + +/** + * @Author suzhuhong + * @Date 2025/5/23 17:30 + * @Version 1.0 + */ +public class OssUtil { + + /** + * 公用oss链接转为base64 + * @param ossUrl + * @return + */ + public static String convertPublicOssUrlToBase64(String ossUrl) { + try (InputStream in = new URL(ossUrl).openStream()) { + byte[] fileBytes = IOUtils.toByteArray(in); + return Base64.getEncoder().encodeToString(fileBytes); + } catch (Exception e) { + throw new RuntimeException("Failed to convert OSS URL to Base64", e); + } + } + + /** + * 获取oss链接文件名 + * @param ossUrl + * @return + */ + public static String getUrlName(String ossUrl){ + if (StringUtil.isEmpty(ossUrl)){ + return ""; + } + return ossUrl.substring(ossUrl.lastIndexOf("/") + 1); + } + +} diff --git a/coolstore-partner-common/src/main/java/com/cool/store/utils/RealIpUtils.java b/coolstore-partner-common/src/main/java/com/cool/store/utils/RealIpUtils.java new file mode 100644 index 000000000..d5d88e94b --- /dev/null +++ b/coolstore-partner-common/src/main/java/com/cool/store/utils/RealIpUtils.java @@ -0,0 +1,66 @@ +package com.cool.store.utils; + +import javax.servlet.http.HttpServletRequest; +import java.util.Arrays; +import java.util.List; + +/** + * @Author suzhuhong + * @Date 2025/6/11 13:59 + * @Version 1.0 + */ +public class RealIpUtils { + + // 常见代理服务器IP头(按优先级排序) + private static final List IP_HEADERS = Arrays.asList( + "X-Real-IP", + "X-Forwarded-For", + "Proxy-Client-IP", + "WL-Proxy-Client-IP", + "HTTP_CLIENT_IP", + "HTTP_X_FORWARDED_FOR" + ); + + /** + * 获取客户端真实IP地址 + * @param request HttpServletRequest对象 + * @return 可能的最接近客户端的IP地址 + */ + public static String getRealClientIp(HttpServletRequest request) { + // 1. 检查所有可能的代理头 + for (String header : IP_HEADERS) { + String ip = request.getHeader(header); + if (isValidIp(ip)) { + return getFirstValidIp(ip); + } + } + + // 2. 没有代理头时使用remoteAddr + String remoteAddr = request.getRemoteAddr(); + + // 3. 处理IPv6本地地址 + if ("0:0:0:0:0:0:0:1".equals(remoteAddr) || "::1".equals(remoteAddr)) { + return "127.0.0.1"; + } + + return remoteAddr; + } + + private static boolean isValidIp(String ip) { + return ip != null && !ip.isEmpty() && !"unknown".equalsIgnoreCase(ip); + } + + private static String getFirstValidIp(String ipChain) { + if (ipChain.contains(",")) { + // 可能有多个IP(X-Forwarded-For: client,proxy1,proxy2) + String[] ips = ipChain.split(","); + for (String ip : ips) { + String trimmedIp = ip.trim(); + if (isValidIp(trimmedIp)) { + return trimmedIp; + } + } + } + return ipChain.trim(); + } +} \ No newline at end of file diff --git a/coolstore-partner-common/src/main/java/com/cool/store/utils/RedisConstantUtil.java b/coolstore-partner-common/src/main/java/com/cool/store/utils/RedisConstantUtil.java index 71152d693..b0f2d1906 100644 --- a/coolstore-partner-common/src/main/java/com/cool/store/utils/RedisConstantUtil.java +++ b/coolstore-partner-common/src/main/java/com/cool/store/utils/RedisConstantUtil.java @@ -19,7 +19,7 @@ import java.text.MessageFormat; public class RedisConstantUtil { @Value("${spring.profiles.active}") - private String active; + private String active; @Value("${mybatis.configuration.variables.enterpriseId}") private String eid; @@ -115,6 +115,17 @@ public class RedisConstantUtil { return active + "_" + RedisConstant.GET_AI_MODULE + eid; } + /** + * 获取key的通用方法 + * @param prefix + * @param args + * @return + */ + public String getKeyCommonMethod(String prefix,String... args){ + return active + "_" + MessageFormat.format(prefix,args) ; + } + + public String getPaymentReceiptCode(String today){ return active + "_" + MessageFormat.format(RedisConstant.REDIS_KEY_PREFIX, today); } diff --git a/coolstore-partner-common/src/main/java/com/cool/store/utils/SuperPaySignature.java b/coolstore-partner-common/src/main/java/com/cool/store/utils/SuperPaySignature.java new file mode 100644 index 000000000..e25e75b1b --- /dev/null +++ b/coolstore-partner-common/src/main/java/com/cool/store/utils/SuperPaySignature.java @@ -0,0 +1,113 @@ +package com.cool.store.utils; + +import cn.hutool.core.net.URLEncodeUtil; +import cn.hutool.core.net.url.UrlQuery; +import cn.hutool.core.util.ArrayUtil; +import cn.hutool.core.util.StrUtil; +import cn.hutool.crypto.digest.DigestAlgorithm; +import cn.hutool.crypto.digest.Digester; + +import java.nio.charset.StandardCharsets; +import java.util.TreeMap; +/** + * 猎聘薪超人 签名工具类 + * @Author suzhuhong + * @Date 2025/5/20 15:53 + * @Version 1.0 + */ +public class SuperPaySignature { + private static final Digester SHA256 = new Digester(DigestAlgorithm.SHA256); + + /** + * 生成请求签名 + * @param httpMethod 请求方法(大写)如:POST + * @param uri 接口路径 如:/api/v1/order + * @param queryString 原始查询字符串 如:name=张三&age=30 + * @param appId 应用ID 如:1724436445613182976 + * @param requestBody 请求体内容 + * @param nonce 随机数 如UUID + * @param timestamp 时间戳(毫秒) + * @param secretKey 密钥 + * @return 签名值 + */ + public static String generateSignature(String httpMethod, + String uri, + String queryString, + String appId, + byte[] requestBody, + String nonce, + long timestamp, + String secretKey) { + // 1. 规范化QueryString + String canonicalizedQuery = canonicalizeQueryString(queryString); + + // 2. 计算请求体哈希 + String payloadHash = calculatePayloadHash(requestBody); + + // 3. 构建签名字符串 + String signatureString = buildSignatureString( + httpMethod, + uri, + canonicalizedQuery, + appId, + payloadHash, + nonce, + timestamp, + secretKey); + + // 4. 计算SHA256签名 + return SHA256.digestHex(signatureString); + } + + private static String canonicalizeQueryString(String queryString) { + if (StrUtil.isBlank(queryString)) { + return ""; + } + + UrlQuery urlQuery = UrlQuery.of(queryString, StandardCharsets.UTF_8); + TreeMap sortedParams = new TreeMap<>(); + + urlQuery.getQueryMap().forEach((k, v) -> { + String encodedKey = URLEncodeUtil.encode(k.toString(), StandardCharsets.UTF_8); + String encodedValue = URLEncodeUtil.encode(v.toString(), StandardCharsets.UTF_8); + sortedParams.put(encodedKey, encodedValue); + }); + + StringBuilder sb = new StringBuilder(); + sortedParams.forEach((k, v) -> { + if (sb.length() > 0) { + sb.append("&"); + } + sb.append(k).append("=").append(v); + }); + + return sb.toString(); + } + + private static String calculatePayloadHash(byte[] requestBody) { + if (ArrayUtil.isEmpty(requestBody)) { + return ""; + } + return SHA256.digestHex(requestBody); + } + + private static String buildSignatureString(String httpMethod, + String uri, + String canonicalizedQuery, + String appId, + String payloadHash, + String nonce, + long timestamp, + String secretKey) { + return String.join("\n", + httpMethod.toUpperCase(), + uri, + canonicalizedQuery, + appId, + payloadHash, + nonce, + String.valueOf(timestamp), + secretKey + ); + } +} \ No newline at end of file diff --git a/coolstore-partner-common/src/main/java/com/cool/store/utils/hire/XbbAesUtil.java b/coolstore-partner-common/src/main/java/com/cool/store/utils/hire/XbbAesUtil.java new file mode 100644 index 000000000..8764c63c6 --- /dev/null +++ b/coolstore-partner-common/src/main/java/com/cool/store/utils/hire/XbbAesUtil.java @@ -0,0 +1,89 @@ +package com.cool.store.utils.hire; + +import cn.hutool.core.codec.Base64Decoder; +import cn.hutool.core.codec.Base64Encoder; +import cn.hutool.core.util.StrUtil; +import com.cool.store.exception.ServiceException; + +import javax.crypto.Cipher; +import javax.crypto.spec.SecretKeySpec; +import java.nio.charset.StandardCharsets; + +public class XbbAesUtil { + + /** + * 算法/加密模式/填充方式 + */ + private static final String AES_PKCS5P = "AES/ECB/PKCS5Padding"; + + /** + * 加密 + * + * @param str 需要加密的字符串 + * @param key 密钥 + * @return + * @throws Exception + */ + public static String encrypt(String str, String key) { + if (StrUtil.isEmpty(key)) { + throw new ServiceException("key不能为空"); + } + try { + if (str == null) { + return null; + } + // 判断Key是否为16位 + if (key.length() != 16) { + return null; + } + byte[] raw = key.getBytes(StandardCharsets.UTF_8); + SecretKeySpec skeySpec = new SecretKeySpec(raw, "AES"); + // "算法/模式/补码方式" + Cipher cipher = Cipher.getInstance(AES_PKCS5P); + cipher.init(Cipher.ENCRYPT_MODE, skeySpec); + byte[] encrypted = cipher.doFinal(str.getBytes(StandardCharsets.UTF_8)); + // 此处使用BASE64做转码功能,同时能起到2次加密的作用。 + return Base64Encoder.encode(encrypted); + } catch (Exception ex) { + return null; + } + + } + + /** + * 解密 + * + * @param str 需要解密的字符串 + * @param key 密钥 + * @return + */ + public static String decrypt(String str, String key) { + if (StrUtil.isEmpty(key)) { + throw new ServiceException("key不能为空"); + } + try { + if (str == null) { + return null; + } + // 判断Key是否为16位 + if (key.length() != 16) { + return null; + } + byte[] raw = key.getBytes(StandardCharsets.UTF_8); + SecretKeySpec skeySpec = new SecretKeySpec(raw, "AES"); + Cipher cipher = Cipher.getInstance(AES_PKCS5P); + cipher.init(Cipher.DECRYPT_MODE, skeySpec); + // 先用base64解密 + byte[] encrypted = Base64Decoder.decode(str); + try { + byte[] original = cipher.doFinal(encrypted); + return new String(original, StandardCharsets.UTF_8); + } catch (Exception e) { + return null; + } + } catch (Exception ex) { + return null; + } + } + +} \ No newline at end of file diff --git a/coolstore-partner-common/src/main/java/com/cool/store/utils/hire/XbbSignatureInfo.java b/coolstore-partner-common/src/main/java/com/cool/store/utils/hire/XbbSignatureInfo.java new file mode 100644 index 000000000..ebfde1924 --- /dev/null +++ b/coolstore-partner-common/src/main/java/com/cool/store/utils/hire/XbbSignatureInfo.java @@ -0,0 +1,146 @@ +package com.cool.store.utils.hire; + +import cn.hutool.core.net.url.UrlQuery; +import cn.hutool.core.util.ArrayUtil; +import cn.hutool.core.util.StrUtil; +import cn.hutool.crypto.digest.DigestAlgorithm; +import cn.hutool.crypto.digest.Digester; + +import java.nio.charset.StandardCharsets; +import java.util.Map; +import java.util.TreeMap; + +/** + * 签名信息 + * + * @author XBB-OpenAPI + * @since 2025-03-27 + */ +public class XbbSignatureInfo { + private String httpMethod; + private String uri; + private String queryString; + private String appId; + private byte[] requestPayload; + private String nonce; + private long timestamp; + private String aesSecretkey; + + public static XbbSignatureInfo createGet() { + return new XbbSignatureInfo().setHttpMethod("GET"); + } + + public static XbbSignatureInfo createPost() { + return new XbbSignatureInfo().setHttpMethod("POST"); + } + + public String toCanonicalizedQueryString(String queryString) { + if (StrUtil.isBlank(queryString)) { + return ""; + } + UrlQuery urlQuery = UrlQuery.of(queryString, StandardCharsets.UTF_8); + Map queryMap = urlQuery.getQueryMap(); + TreeMap sortedMap = new TreeMap<>(); + queryMap.forEach((k, v) -> sortedMap.put(k.toString(), v.toString())); + return new UrlQuery(sortedMap, true).build(StandardCharsets.UTF_8); + } + + public String toPayloadStr() { + if (ArrayUtil.isEmpty(requestPayload)) { + return ""; + } + return new Digester(DigestAlgorithm.SHA256).digestHex(requestPayload); + } + + public String toSignatureStr() { + return httpMethod + '\n' + + uri + '\n' + + toCanonicalizedQueryString(queryString) + '\n' + + appId + '\n' + + toPayloadStr() + '\n' + + nonce + '\n' + + timestamp + '\n' + + aesSecretkey; + } + + + // 生成放在请求头的签名 + public String toSignature() { + return new Digester(DigestAlgorithm.SHA256).digestHex(toSignatureStr()); + } + + + // getter setter + + public String getAppId() { + return appId; + } + + public XbbSignatureInfo setAppId(String appId) { + this.appId = appId; + return this; + } + + public String getHttpMethod() { + return httpMethod; + } + + public XbbSignatureInfo setHttpMethod(String httpMethod) { + this.httpMethod = httpMethod; + return this; + } + + public String getUri() { + return uri; + } + + public XbbSignatureInfo setUri(String uri) { + this.uri = uri; + return this; + } + + public String getQueryString() { + return queryString; + } + + public XbbSignatureInfo setQueryString(String queryString) { + this.queryString = queryString; + return this; + } + + public byte[] getRequestPayload() { + return requestPayload; + } + + public XbbSignatureInfo setRequestPayload(byte[] requestPayload) { + this.requestPayload = requestPayload; + return this; + } + + public String getNonce() { + return nonce; + } + + public XbbSignatureInfo setNonce(String nonce) { + this.nonce = nonce; + return this; + } + + public long getTimestamp() { + return timestamp; + } + + public XbbSignatureInfo setTimestamp(long timestamp) { + this.timestamp = timestamp; + return this; + } + + public String getAesSecretkey() { + return aesSecretkey; + } + + public XbbSignatureInfo setAesSecretkey(String aesSecretkey) { + this.aesSecretkey = aesSecretkey; + return this; + } +} diff --git a/coolstore-partner-dao/src/main/java/com/cool/store/dao/BigRegionDAO.java b/coolstore-partner-dao/src/main/java/com/cool/store/dao/BigRegionDAO.java index 96b92394e..5ca8a7945 100644 --- a/coolstore-partner-dao/src/main/java/com/cool/store/dao/BigRegionDAO.java +++ b/coolstore-partner-dao/src/main/java/com/cool/store/dao/BigRegionDAO.java @@ -12,8 +12,10 @@ import org.springframework.stereotype.Repository; import tk.mybatis.mapper.entity.Example; import javax.annotation.Resource; +import java.util.HashMap; import java.util.List; import java.util.Objects; +import java.util.Map; import java.util.stream.Collectors; /** @@ -27,8 +29,16 @@ public class BigRegionDAO { @Resource BigRegionMapper bigRegionMapper; - public List queryAllBigRegion(String keyword, Integer joinBrand,Integer type){ - return bigRegionMapper.queryAllBigRegion(keyword, joinBrand,type); + public List queryAllBigRegion(String keyword, Integer joinBrand,Integer type,Integer enable){ + return bigRegionMapper.queryAllBigRegion(keyword, joinBrand,type,enable); + } + + public Map getMapByRegionIds(List regionIdList){ + if (CollectionUtils.isEmpty(regionIdList)){ + return new HashMap<>(); + } + List bigRegionDOList = bigRegionMapper.getByRegionIdList(regionIdList); + return bigRegionDOList.stream().collect(Collectors.toMap(BigRegionDO::getRegionId, bigRegionDO -> bigRegionDO)); } public BigRegionDO queryOrgInfoByBigRegionAndJoinMode(Long regionId, Integer joinMode){ diff --git a/coolstore-partner-dao/src/main/java/com/cool/store/dao/LinePayDAO.java b/coolstore-partner-dao/src/main/java/com/cool/store/dao/LinePayDAO.java index 04b401288..4b5d4adf8 100644 --- a/coolstore-partner-dao/src/main/java/com/cool/store/dao/LinePayDAO.java +++ b/coolstore-partner-dao/src/main/java/com/cool/store/dao/LinePayDAO.java @@ -8,6 +8,7 @@ import org.springframework.stereotype.Repository; import tk.mybatis.mapper.entity.Example; import javax.annotation.Resource; +import java.math.BigDecimal; import java.util.*; import java.util.stream.Collectors; @@ -114,4 +115,8 @@ public class LinePayDAO { } return linePayMapper.deleteByShopId(shopIds); } + + public Integer updateAmountAndPayUserName(Long id, BigDecimal amount, String payUserName, String userId){ + return linePayMapper.updateAmountAndPayUserName(id,amount,payUserName,userId); + } } diff --git a/coolstore-partner-dao/src/main/java/com/cool/store/dao/OpeningOperationPlanDAO.java b/coolstore-partner-dao/src/main/java/com/cool/store/dao/OpeningOperationPlanDAO.java index ac59809bc..1efa9a631 100644 --- a/coolstore-partner-dao/src/main/java/com/cool/store/dao/OpeningOperationPlanDAO.java +++ b/coolstore-partner-dao/src/main/java/com/cool/store/dao/OpeningOperationPlanDAO.java @@ -5,10 +5,12 @@ import com.cool.store.entity.OpeningOperationPlanDO; import com.cool.store.mapper.OpeningOperationPlanMapper; import com.cool.store.request.PlanListRequest; import lombok.extern.slf4j.Slf4j; +import org.apache.commons.collections4.CollectionUtils; import org.apache.ibatis.annotations.Param; import org.springframework.stereotype.Repository; import javax.annotation.Resource; +import java.util.ArrayList; import java.util.List; /** @@ -52,5 +54,11 @@ public class OpeningOperationPlanDAO { return openingOperationPlanMapper.selectByShopId(shopId); } + public List selectByShopIds( List shopIds){ + if (CollectionUtils.isEmpty(shopIds)){ + return new ArrayList<>(); + } + return openingOperationPlanMapper.selectByShopIds(shopIds); + } } diff --git a/coolstore-partner-dao/src/main/java/com/cool/store/dao/ReceivingBankDAO.java b/coolstore-partner-dao/src/main/java/com/cool/store/dao/ReceivingBankDAO.java new file mode 100644 index 000000000..447daa5f9 --- /dev/null +++ b/coolstore-partner-dao/src/main/java/com/cool/store/dao/ReceivingBankDAO.java @@ -0,0 +1,66 @@ +package com.cool.store.dao; + +import com.cool.store.entity.ReceivingBankDO; +import com.cool.store.mapper.ReceivingBankMapper; +import lombok.extern.slf4j.Slf4j; +import org.apache.commons.collections4.CollectionUtils; +import org.springframework.stereotype.Repository; +import tk.mybatis.mapper.entity.Example; + +import javax.annotation.Resource; +import java.util.ArrayList; +import java.util.Collection; +import java.util.List; + +/** + * @Author: WangShuo + * @Date: 2025/06/18/17:34 + * @Version 1.0 + * @注释: + */ +@Slf4j +@Repository +public class ReceivingBankDAO { + @Resource + private ReceivingBankMapper receivingBankMapper; + + public Integer insertSelective(ReceivingBankDO receivingBankDO){ + return receivingBankMapper.insertSelective(receivingBankDO); + } + public List getByFranchiseBrandAndRegionId(List franchiseBrandList,List regionIdList){ + return receivingBankMapper.getByFranchiseBrandAndRegionId(franchiseBrandList,regionIdList); + } + public Integer updateByPrimaryKeySelective(ReceivingBankDO receivingBankDO){ + return receivingBankMapper.updateByPrimaryKeySelective(receivingBankDO); + } + + public Integer batchInsert(List list){ + return receivingBankMapper.batchInsert(list); + } + + public List queryAll(){ + Example example = new Example(ReceivingBankDO.class); + example.createCriteria().andEqualTo("deleted",false); + List receivingBankDOS = receivingBankMapper.selectByExample(example); + if (receivingBankDOS == null){ + return new ArrayList<>(); + } + return receivingBankDOS; + } + public List getByRegionAndFranchiseBrandAndPayType(Long regionId,Integer franchiseBrand,Integer payType){ + Example example = new Example(ReceivingBankDO.class); + example.createCriteria().andEqualTo("deleted",false) + .andEqualTo("regionId",regionId).andEqualTo("franchiseBrand",franchiseBrand) + .andEqualTo("payType",payType); + List receivingBankDOS = receivingBankMapper.selectByExample(example); + return receivingBankDOS; + + } + public Integer batchInsertOrUpdate(List receivingBankDOList){ + if (CollectionUtils.isEmpty(receivingBankDOList)){ + log.info("receivingBankDOList is empty"); + return 0; + } + return receivingBankMapper.batchInsertOrUpdate(receivingBankDOList); + } +} 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 a0110a69a..2eb762eb4 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 @@ -4,6 +4,7 @@ import cn.hutool.core.collection.CollStreamUtil; import com.cool.store.dto.store.StoreAddressDTO; import com.cool.store.dto.store.StoreExtendSoftOpenDTO; import com.cool.store.dto.store.StoreOrderTimeDTO; +import com.cool.store.dto.store.StoreReportDTO; import com.cool.store.entity.StoreDO; import com.cool.store.enums.StoreStatusEnum; import com.cool.store.mapper.StoreMapper; @@ -19,6 +20,7 @@ import javax.annotation.Resource; import java.math.BigDecimal; import java.util.*; import java.time.LocalDate; +import java.time.LocalDate; import java.util.ArrayList; import java.util.Date; import java.util.List; @@ -102,6 +104,18 @@ public class StoreDao { return storeMapper.getStoreNumByStoreCodes(storeCodeIds); } + + /** + * 门店状态改为闭店 + * @param storeId 门店id + * @param closeReason 闭店原因 + * @param closeNature 闭店性质 + */ + public void closeStore(String storeId, Integer closeReason, Integer closeNature) { + if (storeMapper.closeStore(storeId) > 0) { + storeMapper.insertOrUpdateCloseInfo(storeId, closeReason, closeNature); + } + } /** * 新增或编辑最新订货时间 * @param dtoList 门店最新订货时间DTO列表 @@ -295,6 +309,49 @@ public class StoreDao { return storeMapper.getPrivateSphereQrCode(storeId); } + /** + * 总营业门店数量统计 + */ + public Map totalOpenStoreReport(String date, Integer domestic, List joinBrandList) { + if (CollectionUtils.isEmpty(joinBrandList)) { + return Collections.emptyMap(); + } + List list = storeMapper.totalOpenStoreReport(date, domestic, joinBrandList); + return CollStreamUtil.toMap(list, StoreReportDTO::getJoinBrand, StoreReportDTO::getNum); + } + + /** + * 期初门店数 + */ + public Map periodBeginStoreReport(String date, Integer domestic, List joinBrandList) { + if (CollectionUtils.isEmpty(joinBrandList)) { + return Collections.emptyMap(); + } + List list = storeMapper.periodBeginStoreReport(date, domestic, joinBrandList); + return CollStreamUtil.toMap(list, StoreReportDTO::getJoinBrand, StoreReportDTO::getNum); + } + + /** + * 新开门店数 + */ + public Map newOpenStoreReport(String date, Integer domestic, List joinBrandList) { + if (CollectionUtils.isEmpty(joinBrandList)) { + return Collections.emptyMap(); + } + List list = storeMapper.newOpenStoreReport(date, domestic, joinBrandList); + return CollStreamUtil.toMap(list, StoreReportDTO::getJoinBrand, StoreReportDTO::getNum); + } + + /** + * 闭店门店数 + */ + public Map closeStoreReport(String date, Integer domestic, List joinBrandList) { + if (CollectionUtils.isEmpty(joinBrandList)) { + return Collections.emptyMap(); + } + List list = storeMapper.closeStoreReport(date, domestic, joinBrandList); + return CollStreamUtil.toMap(list, StoreReportDTO::getJoinBrand, StoreReportDTO::getNum); + } /** * 批量新增或编辑开始试营业日期 */ diff --git a/coolstore-partner-dao/src/main/java/com/cool/store/dao/ThirdPartyAccountDAO.java b/coolstore-partner-dao/src/main/java/com/cool/store/dao/ThirdPartyAccountDAO.java new file mode 100644 index 000000000..057a1193d --- /dev/null +++ b/coolstore-partner-dao/src/main/java/com/cool/store/dao/ThirdPartyAccountDAO.java @@ -0,0 +1,49 @@ +package com.cool.store.dao; + +import com.cool.store.entity.ThirdPartyAccountDO; +import com.cool.store.mapper.ThirdPartyAccountMapper; +import com.cool.store.utils.StringUtil; +import org.apache.ibatis.annotations.Param; +import org.springframework.stereotype.Repository; + +import javax.annotation.Resource; + +/** + * @Author suzhuhong + * @Date 2025/5/26 16:59 + * @Version 1.0 + */ +@Repository +public class ThirdPartyAccountDAO { + + @Resource + ThirdPartyAccountMapper thirdPartyAccountMapper; + + + /** + * 新增数据 + * @param thirdPartyAccountDO + * @return + */ + public int addPushRecord(ThirdPartyAccountDO thirdPartyAccountDO){ + return thirdPartyAccountMapper.insertSelective(thirdPartyAccountDO); + } + + + + public ThirdPartyAccountDO getByCodeAndMobile(String shopCode, String mobile){ + if (StringUtil.isAnyBlank(shopCode,mobile)){ + return null; + } + return thirdPartyAccountMapper.getByCodeAndMobile(shopCode,mobile); + } + + + + public boolean exists(String shopCode, String mobile){ + if (StringUtil.isAnyBlank(shopCode,mobile)){ + return Boolean.FALSE; + } + return thirdPartyAccountMapper.exists(shopCode,mobile); + } +} diff --git a/coolstore-partner-dao/src/main/java/com/cool/store/dao/ThirdPartyStoreDAO.java b/coolstore-partner-dao/src/main/java/com/cool/store/dao/ThirdPartyStoreDAO.java new file mode 100644 index 000000000..d29dd7228 --- /dev/null +++ b/coolstore-partner-dao/src/main/java/com/cool/store/dao/ThirdPartyStoreDAO.java @@ -0,0 +1,58 @@ +package com.cool.store.dao; + +import com.cool.store.entity.ThirdPartyStoreDO; +import com.cool.store.mapper.ThirdPartyStoreMapper; +import com.cool.store.utils.StringUtil; +import org.springframework.stereotype.Repository; + +import javax.annotation.Resource; + +/** + * @Author suzhuhong + * @Date 2025/5/26 16:58 + * @Version 1.0 + */ +@Repository +public class ThirdPartyStoreDAO { + + @Resource + ThirdPartyStoreMapper thirdPartyStoreMapper; + + + /** + * 新增推送数据记录 + * @param thirdPartyStoreDO + * @return + */ + public int addPushRecord(ThirdPartyStoreDO thirdPartyStoreDO){ + return thirdPartyStoreMapper.insertSelective(thirdPartyStoreDO); + } + + + /** + * 通过门店编码查询推送记录 + * @param storeCode + * @return + */ + public ThirdPartyStoreDO getByLocalStoreCode(String storeCode){ + if (StringUtil.isEmpty(storeCode)){ + return null; + } + return thirdPartyStoreMapper.getByLocalStoreCode(storeCode); + } + + /** + * 门店是否存在 + * @param localStoreCode + * @return + */ + public boolean exists(String localStoreCode){ + if (StringUtil.isEmpty(localStoreCode)){ + return Boolean.FALSE; + } + return thirdPartyStoreMapper.exists(localStoreCode); + } + + + +} diff --git a/coolstore-partner-dao/src/main/java/com/cool/store/dao/approval/CommonApprovalLogDAO.java b/coolstore-partner-dao/src/main/java/com/cool/store/dao/approval/CommonApprovalLogDAO.java new file mode 100644 index 000000000..2b46bfdb6 --- /dev/null +++ b/coolstore-partner-dao/src/main/java/com/cool/store/dao/approval/CommonApprovalLogDAO.java @@ -0,0 +1,122 @@ +package com.cool.store.dao.approval; + +import com.cool.store.entity.approval.CommonApprovalLogDO; +import com.cool.store.enums.approval.ApprovalResultEnum; +import com.cool.store.mapper.approval.CommonApprovalLogMapper; +import com.cool.store.utils.GenerateNoUtil; +import org.springframework.stereotype.Repository; +import tk.mybatis.mapper.entity.Example; + +import javax.annotation.Resource; +import java.util.Date; +import java.util.List; + +import static javassist.CtClass.version; + +@Repository +public class CommonApprovalLogDAO { + + @Resource + private CommonApprovalLogMapper commonApprovalLogMapper; + + /** + * 插入单条审批记录(提交场景:加盟商确认) + */ + public int addSubmitRecord(String applicationNo, String handleUserId, String handleUserName, String nodeCode, String nodeName) { + Long version = GenerateNoUtil.generateVersion(); + CommonApprovalLogDO record = CommonApprovalLogDO.builder() + .applicationNo(applicationNo) + .version(version) + .nodeCode(nodeCode) + .nodeName(nodeName) + .handleUserId(handleUserId) + .handleUserName(handleUserName) + .result(ApprovalResultEnum.PASS.getResult()) + .status("1") + .submitType(0) + .operateTime(new Date()) + .deleted(0) + .build(); + return commonApprovalLogMapper.insertSelective(record); + } + + /** + * 插入待处理审批记录(审批节点) + */ + public int addApproveRecord(String applicationNo, String nodeCode, String nodeName, String handleUserId, String handleUserName,Long version) { + if (version == null){ + version = GenerateNoUtil.generateVersion(); + } + CommonApprovalLogDO record = CommonApprovalLogDO.builder() + .applicationNo(applicationNo) + .version(version) + .nodeCode(nodeCode) + .nodeName(nodeName) + .handleUserId(handleUserId) + .handleUserName(handleUserName) + .status("2") + .submitType(1) + .operateTime(new Date()) + .deleted(0) + .build(); + return commonApprovalLogMapper.insertSelective(record); + } + + /** + * 批量插入审批记录 + */ + public int batchInsertApprovalRecords(List list) { + if (list == null || list.isEmpty()) { + return 0; + } + return commonApprovalLogMapper.batchInsert(list); + } + + public void updateRecord(CommonApprovalLogDO record) { + commonApprovalLogMapper.updateByPrimaryKeySelective(record); + } + + /** + * 批量更新审批记录 + */ + public int batchUpdateRecords(List list) { + if (list == null || list.isEmpty()) { + return 0; + } + return commonApprovalLogMapper.batchUpdate(list); + } + + public CommonApprovalLogDO getById(Long id) { + return commonApprovalLogMapper.selectByPrimaryKey(id); + } + + public List getByApplicationNo(String applicationNo) { + return commonApprovalLogMapper.getByApplicationNo(applicationNo); + } + + /** + * 获取指定申请号和节点的待处理记录 + */ + public List getPendingByApplicationNoAndNodeCode(String applicationNo, String nodeCode) { + Example example = new Example(CommonApprovalLogDO.class); + example.createCriteria() + .andEqualTo("applicationNo", applicationNo) + .andEqualTo("nodeCode", nodeCode) + .andEqualTo("status", "2") + .andEqualTo("deleted", 0); + return commonApprovalLogMapper.selectByExample(example); + } + + /** + * 获取指定申请号最新版本号的待处理记录 + */ + public List getLatestPendingRecords(String applicationNo, Integer version) { + Example example = new Example(CommonApprovalLogDO.class); + example.createCriteria() + .andEqualTo("applicationNo", applicationNo) + .andEqualTo("version", version) + .andEqualTo("status", "2") + .andEqualTo("deleted", 0); + return commonApprovalLogMapper.selectByExample(example); + } +} diff --git a/coolstore-partner-dao/src/main/java/com/cool/store/dao/contract/ContractCostDAO.java b/coolstore-partner-dao/src/main/java/com/cool/store/dao/contract/ContractCostDAO.java new file mode 100644 index 000000000..621a5628a --- /dev/null +++ b/coolstore-partner-dao/src/main/java/com/cool/store/dao/contract/ContractCostDAO.java @@ -0,0 +1,23 @@ +package com.cool.store.dao.contract; + +import com.cool.store.entity.contract.ContractCostDO; +import com.cool.store.mapper.contract.ContractCostMapper; +import org.springframework.stereotype.Repository; + +import javax.annotation.Resource; +import java.util.List; + +@Repository +public class ContractCostDAO { + + @Resource + private ContractCostMapper contractCostMapper; + + public int insertSelective(ContractCostDO record) { + return contractCostMapper.insertSelective(record); + } + + public List queryByContractNo(String contractNo) { + return contractCostMapper.queryByContractNo(contractNo); + } +} diff --git a/coolstore-partner-dao/src/main/java/com/cool/store/dao/contract/ContractMasterDAO.java b/coolstore-partner-dao/src/main/java/com/cool/store/dao/contract/ContractMasterDAO.java new file mode 100644 index 000000000..c22300e95 --- /dev/null +++ b/coolstore-partner-dao/src/main/java/com/cool/store/dao/contract/ContractMasterDAO.java @@ -0,0 +1,62 @@ +package com.cool.store.dao.contract; + +import com.cool.store.entity.contract.ContractMasterDO; +import com.cool.store.mapper.contract.ContractMasterMapper; +import com.cool.store.request.contract.ContractMasterQueryRequest; +import com.cool.store.vo.contract.ContractMasterListVO; +import org.springframework.stereotype.Repository; +import tk.mybatis.mapper.entity.Example; + +import javax.annotation.Resource; +import java.util.List; + +@Repository +public class ContractMasterDAO { + + @Resource + private ContractMasterMapper contractMasterMapper; + + public int insertSelective(ContractMasterDO record) { + return contractMasterMapper.insertSelective(record); + } + + public int updateByPrimaryKeySelective(ContractMasterDO record) { + return contractMasterMapper.updateByPrimaryKeySelective(record); + } + + public ContractMasterDO getById(Long id) { + return contractMasterMapper.selectByPrimaryKey(id); + } + + public List queryContractMasterList(ContractMasterQueryRequest request) { + return contractMasterMapper.queryContractMasterList(request); + } + + public List queryContractsNearExpiry(int days) { + return contractMasterMapper.queryContractsNearExpiry(days); + } + + public ContractMasterDO getLatestContractByStoreCode(String storeCode) { + return contractMasterMapper.getLatestContractByStoreCode(storeCode); + } + + /** + * 更新续签申请标记(乐观锁:仅当renewalCreated=0时更新) + */ + public int updateRenewalCreated(Long id, Integer renewalCreated) { + Example example = new Example(ContractMasterDO.class); + example.createCriteria() + .andEqualTo("id", id) + .andEqualTo("renewalCreated", 0); + ContractMasterDO update = new ContractMasterDO(); + update.setId(id); + update.setRenewalCreated(renewalCreated); + return contractMasterMapper.updateByPrimaryKeySelective(update); + } + + public ContractMasterDO getByContractNo(String contractNo) { + Example example = new Example(ContractMasterDO.class); + example.createCriteria().andEqualTo("contractNo", contractNo); + return contractMasterMapper.selectOneByExample(example); + } +} diff --git a/coolstore-partner-dao/src/main/java/com/cool/store/dao/exam/ExamAttemptAnswerDAO.java b/coolstore-partner-dao/src/main/java/com/cool/store/dao/exam/ExamAttemptAnswerDAO.java new file mode 100644 index 000000000..f342cdbf2 --- /dev/null +++ b/coolstore-partner-dao/src/main/java/com/cool/store/dao/exam/ExamAttemptAnswerDAO.java @@ -0,0 +1,72 @@ +package com.cool.store.dao.exam; + +import cn.hutool.core.collection.CollStreamUtil; +import com.cool.store.entity.exam.ExamAttemptAnswerDO; +import com.cool.store.mapper.exam.ExamAttemptAnswerMapper; +import lombok.RequiredArgsConstructor; +import org.apache.commons.collections4.CollectionUtils; +import org.springframework.stereotype.Repository; +import tk.mybatis.mapper.entity.Example; + +import java.util.List; +import java.util.Map; + +/** + * 答题记录DAO + */ +@Repository +@RequiredArgsConstructor +public class ExamAttemptAnswerDAO { + + private final ExamAttemptAnswerMapper examAttemptAnswerMapper; + + public int insertSelective(ExamAttemptAnswerDO record) { + return examAttemptAnswerMapper.insertSelective(record); + } + + public int updateByPrimaryKeySelective(ExamAttemptAnswerDO record) { + return examAttemptAnswerMapper.updateByPrimaryKeySelective(record); + } + + public ExamAttemptAnswerDO selectByPrimaryKey(Long id) { + return examAttemptAnswerMapper.selectByPrimaryKey(id); + } + + public List select(ExamAttemptAnswerDO record) { + return examAttemptAnswerMapper.select(record); + } + + public int insertOrUpdate(ExamAttemptAnswerDO record) { + return examAttemptAnswerMapper.insertOrUpdate(record); + } + + /** + * 根据答卷ID批量查询答案,返回Map(key: paperQuestionId) + */ + public Map getMapByAttemptId(Long attemptId) { + Example example = new Example(ExamAttemptAnswerDO.class); + example.createCriteria().andEqualTo("attemptId", attemptId); + List list = examAttemptAnswerMapper.selectByExample(example); + return CollStreamUtil.toMap(list, ExamAttemptAnswerDO::getPaperQuestionId, v -> v); + } + + /** + * 批量插入或更新答案 + */ + public void batchInsertOrUpdate(List list) { + if (CollectionUtils.isEmpty(list)) { + return; + } + examAttemptAnswerMapper.batchInsertOrUpdate(list); + } + + /** + * 批量更新分数 + */ + public void batchUpdateScore(List list) { + if (CollectionUtils.isEmpty(list)) { + return; + } + examAttemptAnswerMapper.batchUpdateScore(list); + } +} \ No newline at end of file diff --git a/coolstore-partner-dao/src/main/java/com/cool/store/dao/exam/ExamAttemptDAO.java b/coolstore-partner-dao/src/main/java/com/cool/store/dao/exam/ExamAttemptDAO.java new file mode 100644 index 000000000..6915ff197 --- /dev/null +++ b/coolstore-partner-dao/src/main/java/com/cool/store/dao/exam/ExamAttemptDAO.java @@ -0,0 +1,97 @@ +package com.cool.store.dao.exam; + +import cn.hutool.core.collection.CollStreamUtil; +import com.cool.store.entity.exam.ExamAttemptDO; +import com.cool.store.mapper.exam.ExamAttemptMapper; +import lombok.RequiredArgsConstructor; +import org.apache.commons.collections4.MapUtils; +import org.springframework.stereotype.Repository; +import tk.mybatis.mapper.entity.Example; + +import java.math.BigDecimal; +import java.util.Date; +import java.util.List; +import java.util.Map; + +/** + * 答卷DAO + */ +@Repository +@RequiredArgsConstructor +public class ExamAttemptDAO { + + private final ExamAttemptMapper examAttemptMapper; + + public int insertSelective(ExamAttemptDO record) { + return examAttemptMapper.insertSelective(record); + } + + public int updateByPrimaryKeySelective(ExamAttemptDO record) { + return examAttemptMapper.updateByPrimaryKeySelective(record); + } + + public ExamAttemptDO selectByPrimaryKey(Long id) { + return examAttemptMapper.selectByPrimaryKey(id); + } + + public List select(ExamAttemptDO record) { + return examAttemptMapper.select(record); + } + + /** + * 更新答卷状态和成绩 + */ + public void updateStatusAndScore(Long id, Integer status, Integer submitType, BigDecimal totalScore) { + ExamAttemptDO updateDO = new ExamAttemptDO(); + updateDO.setId(id); + updateDO.setStatus(status); + updateDO.setSubmitType(submitType); + updateDO.setTotalScore(totalScore); + updateDO.setEndTime(new Date()); + examAttemptMapper.updateByPrimaryKeySelective(updateDO); + } + + /** + * 根据考试ID和手机号查询进行中的答卷 + */ + public ExamAttemptDO selectInProgressByExamIdAndMobile(Long examId, String mobile) { + Example example = new Example(ExamAttemptDO.class); + example.createCriteria() + .andEqualTo("examId", examId) + .andEqualTo("mobile", mobile) + .andEqualTo("status", 0); + example.setOrderByClause("id desc"); + List list = examAttemptMapper.selectByExample(example); + return list.isEmpty() ? null : list.get(0); + } + + /** + * 根据手机号分页查询答卷列表 + */ + public List selectByMobile(String mobile) { + Example example = new Example(ExamAttemptDO.class); + example.createCriteria() + .andEqualTo("mobile", mobile); + example.setOrderByClause("id desc"); + return examAttemptMapper.selectByExample(example); + } + + /** + * 查询参考人数 + * @param examInfoIds 考试信息id列表 + * @return 考试id->参考人数 + */ + public Map getAttemptCount(List examInfoIds) { + List> list = examAttemptMapper.getAttemptCount(examInfoIds); + return CollStreamUtil.toMap(list, v -> MapUtils.getLong(v, "exam_id"), v -> MapUtils.getLong(v, "attempt_count")); + } + + public boolean existFinishAttempt(String mobile, Long examId) { + Example example = new Example(ExamAttemptDO.class); + example.createCriteria() + .andEqualTo("mobile", mobile) + .andEqualTo("examId", examId) + .andEqualTo("status", 1); + return examAttemptMapper.selectCountByExample(example) > 0; + } +} \ No newline at end of file diff --git a/coolstore-partner-dao/src/main/java/com/cool/store/dao/exam/ExamInfoDAO.java b/coolstore-partner-dao/src/main/java/com/cool/store/dao/exam/ExamInfoDAO.java new file mode 100644 index 000000000..421644907 --- /dev/null +++ b/coolstore-partner-dao/src/main/java/com/cool/store/dao/exam/ExamInfoDAO.java @@ -0,0 +1,112 @@ +package com.cool.store.dao.exam; + +import cn.hutool.core.collection.CollStreamUtil; +import com.cool.store.entity.exam.ExamInfoDO; +import com.cool.store.mapper.exam.ExamInfoMapper; +import lombok.RequiredArgsConstructor; +import org.apache.commons.collections4.CollectionUtils; +import org.springframework.stereotype.Repository; +import tk.mybatis.mapper.entity.Example; + +import java.util.Collections; +import java.util.Date; +import java.util.List; +import java.util.Map; +import java.util.Objects; + +/** + * 考试信息DAO + */ +@Repository +@RequiredArgsConstructor +public class ExamInfoDAO { + + private final ExamInfoMapper examInfoMapper; + + public int insertSelective(ExamInfoDO record) { + return examInfoMapper.insertSelective(record); + } + + public int updateByPrimaryKeySelective(ExamInfoDO record) { + return examInfoMapper.updateByPrimaryKeySelective(record); + } + + public ExamInfoDO selectByPrimaryKey(Long id) { + return examInfoMapper.selectByPrimaryKey(id); + } + + public List select(ExamInfoDO record) { + return examInfoMapper.select(record); + } + + public ExamInfoDO selectByToken(String token) { + return examInfoMapper.selectByToken(token); + } + + /** + * 条件查询列表 + */ + public List selectList(Integer status) { + Example example = new Example(ExamInfoDO.class); + Example.Criteria criteria = example.createCriteria() + .andEqualTo("deleted", 0); + if (Objects.nonNull(status)) { + criteria.andEqualTo("status", status); + } + example.setOrderByClause("create_time desc"); + return examInfoMapper.selectByExample(example); + } + + /** + * 更新状态 + */ + public void updateStatus(Long id, Integer status) { + ExamInfoDO examInfoDO = new ExamInfoDO(); + examInfoDO.setId(id); + examInfoDO.setStatus(status); + examInfoMapper.updateByPrimaryKeySelective(examInfoDO); + } + + /** + * 根据ID批量查询 + */ + public List selectByIds(List ids) { + if (CollectionUtils.isEmpty(ids)) { + return Collections.emptyList(); + } + Example example = new Example(ExamInfoDO.class); + example.createCriteria() + .andIn("id", ids) + .andEqualTo("deleted", 0); + return examInfoMapper.selectByExample(example); + } + + /** + * 根据ID批量查询,返回Map + */ + public Map getMapByIds(List ids) { + List list = selectByIds(ids); + return CollStreamUtil.toMap(list, ExamInfoDO::getId, v -> v); + } + + public Map getMapIncludeDeletedByIds(List ids) { + if (CollectionUtils.isEmpty(ids)) { + return Collections.emptyMap(); + } + Example example = new Example(ExamInfoDO.class); + example.createCriteria() + .andIn("id", ids); + List list = examInfoMapper.selectByExample(example); + return CollStreamUtil.toMap(list, ExamInfoDO::getId, v -> v); + } + + /** + * 根据ID删除(逻辑删除) + */ + public void deleteById(Long id) { + ExamInfoDO updateDO = new ExamInfoDO(); + updateDO.setId(id); + updateDO.setDeleted(1); + examInfoMapper.updateByPrimaryKeySelective(updateDO); + } +} \ No newline at end of file diff --git a/coolstore-partner-dao/src/main/java/com/cool/store/dao/exam/ExamPaperDAO.java b/coolstore-partner-dao/src/main/java/com/cool/store/dao/exam/ExamPaperDAO.java new file mode 100644 index 000000000..bbc09288d --- /dev/null +++ b/coolstore-partner-dao/src/main/java/com/cool/store/dao/exam/ExamPaperDAO.java @@ -0,0 +1,98 @@ +package com.cool.store.dao.exam; + +import cn.hutool.core.collection.CollStreamUtil; +import com.cool.store.entity.exam.ExamPaperDO; +import com.cool.store.mapper.exam.ExamPaperMapper; +import lombok.RequiredArgsConstructor; +import org.apache.commons.collections4.CollectionUtils; +import org.apache.commons.lang3.StringUtils; +import org.springframework.stereotype.Repository; +import tk.mybatis.mapper.entity.Example; + +import java.util.Collections; +import java.util.List; +import java.util.Map; +import java.util.Objects; + +/** + * 试卷DAO + */ +@Repository +@RequiredArgsConstructor +public class ExamPaperDAO { + + private final ExamPaperMapper examPaperMapper; + + public int insertSelective(ExamPaperDO record) { + return examPaperMapper.insertSelective(record); + } + + public int updateByPrimaryKeySelective(ExamPaperDO record) { + return examPaperMapper.updateByPrimaryKeySelective(record); + } + + public ExamPaperDO selectByPrimaryKey(Long id) { + return examPaperMapper.selectByPrimaryKey(id); + } + + public List select(ExamPaperDO record) { + return examPaperMapper.select(record); + } + + public int selectCount(ExamPaperDO record) { + return examPaperMapper.selectCount(record); + } + + /** + * 条件查询列表 + */ + public List selectList(String paperName, Integer enable, Integer startExam) { + Example example = new Example(ExamPaperDO.class); + Example.Criteria criteria = example.createCriteria() + .andEqualTo("deleted", 0); + if (StringUtils.isNotBlank(paperName)) { + criteria.andLike("paperName", "%" + paperName + "%"); + } + if (Objects.nonNull(enable)) { + criteria.andEqualTo("enable", enable); + } + if (Objects.nonNull(startExam)) { + criteria.andEqualTo("startExam", startExam); + } + example.setOrderByClause("create_time desc"); + return examPaperMapper.selectByExample(example); + } + + /** + * 根据ID删除(逻辑删除) + */ + public void deleteById(Long id) { + ExamPaperDO paperDO = new ExamPaperDO(); + paperDO.setId(id); + paperDO.setDeleted(1); + examPaperMapper.updateByPrimaryKeySelective(paperDO); + } + + /** + * 更新开始考试状态 + */ + public void updateStartExam(Long id, Integer startExam) { + ExamPaperDO paperDO = new ExamPaperDO(); + paperDO.setId(id); + paperDO.setStartExam(startExam); + examPaperMapper.updateByPrimaryKeySelective(paperDO); + } + + /** + * 根据ID列表批量查询,返回Map + */ + public Map getMapByIds(List ids) { + if (CollectionUtils.isEmpty(ids)) { + return Collections.emptyMap(); + } + Example example = new Example(ExamPaperDO.class); + example.createCriteria().andIn("id", ids); + List list = examPaperMapper.selectByExample(example); + return CollStreamUtil.toMap(list, ExamPaperDO::getId, v -> v); + } +} \ No newline at end of file diff --git a/coolstore-partner-dao/src/main/java/com/cool/store/dao/exam/ExamPaperQuestionDAO.java b/coolstore-partner-dao/src/main/java/com/cool/store/dao/exam/ExamPaperQuestionDAO.java new file mode 100644 index 000000000..eb62464f6 --- /dev/null +++ b/coolstore-partner-dao/src/main/java/com/cool/store/dao/exam/ExamPaperQuestionDAO.java @@ -0,0 +1,80 @@ +package com.cool.store.dao.exam; + +import com.cool.store.entity.exam.ExamPaperQuestionDO; +import com.cool.store.mapper.exam.ExamPaperQuestionMapper; +import lombok.RequiredArgsConstructor; +import org.apache.commons.collections4.CollectionUtils; +import org.springframework.stereotype.Repository; +import tk.mybatis.mapper.entity.Example; + +import java.util.List; + +/** + * 试卷题目DAO + */ +@Repository +@RequiredArgsConstructor +public class ExamPaperQuestionDAO { + + private final ExamPaperQuestionMapper examPaperQuestionMapper; + + public int insertSelective(ExamPaperQuestionDO record) { + return examPaperQuestionMapper.insertSelective(record); + } + + public int updateByPrimaryKeySelective(ExamPaperQuestionDO record) { + return examPaperQuestionMapper.updateByPrimaryKeySelective(record); + } + + public ExamPaperQuestionDO selectByPrimaryKey(Long id) { + return examPaperQuestionMapper.selectByPrimaryKey(id); + } + + public List select(ExamPaperQuestionDO record) { + return examPaperQuestionMapper.select(record); + } + + public int selectCount(ExamPaperQuestionDO record) { + return examPaperQuestionMapper.selectCount(record); + } + + /** + * 根据试卷ID查询题目数量 + */ + public int countByPaperId(Long paperId) { + Example example = new Example(ExamPaperQuestionDO.class); + example.createCriteria() + .andEqualTo("paperId", paperId) + .andEqualTo("deleted", 0); + return examPaperQuestionMapper.selectCountByExample(example); + } + + /** + * 批量插入 + */ + public int insertBatch(List list) { + if (CollectionUtils.isEmpty(list)) { + return 0; + } + return examPaperQuestionMapper.insertBatch(list); + } + + /** + * 根据试卷ID批量删除(逻辑删除) + */ + public int deleteByPaperId(Long paperId) { + return examPaperQuestionMapper.deleteByPaperId(paperId, new java.util.Date()); + } + + /** + * 根据试卷ID查询题目列表 + */ + public List selectByPaperId(Long paperId) { + Example example = new Example(ExamPaperQuestionDO.class); + example.createCriteria() + .andEqualTo("paperId", paperId) + .andEqualTo("deleted", 0); + example.setOrderByClause("id asc"); + return examPaperQuestionMapper.selectByExample(example); + } +} \ No newline at end of file diff --git a/coolstore-partner-dao/src/main/java/com/cool/store/dao/exam/ExamQuestionDAO.java b/coolstore-partner-dao/src/main/java/com/cool/store/dao/exam/ExamQuestionDAO.java new file mode 100644 index 000000000..23c015221 --- /dev/null +++ b/coolstore-partner-dao/src/main/java/com/cool/store/dao/exam/ExamQuestionDAO.java @@ -0,0 +1,88 @@ +package com.cool.store.dao.exam; + +import cn.hutool.core.collection.CollStreamUtil; +import com.cool.store.entity.exam.ExamQuestionDO; +import com.cool.store.mapper.exam.ExamQuestionMapper; +import lombok.RequiredArgsConstructor; +import org.apache.commons.collections4.CollectionUtils; +import org.apache.commons.lang3.StringUtils; +import org.springframework.stereotype.Repository; +import tk.mybatis.mapper.entity.Example; + +import java.util.Collections; +import java.util.List; +import java.util.Map; +import java.util.Objects; + +/** + * 题目DAO + */ +@Repository +@RequiredArgsConstructor +public class ExamQuestionDAO { + + private final ExamQuestionMapper examQuestionMapper; + + public int insertSelective(ExamQuestionDO record) { + return examQuestionMapper.insertSelective(record); + } + + public int updateByPrimaryKeySelective(ExamQuestionDO record) { + return examQuestionMapper.updateByPrimaryKeySelective(record); + } + + public ExamQuestionDO selectByPrimaryKey(Long id) { + return examQuestionMapper.selectByPrimaryKey(id); + } + + public Map getMapByIds(List ids) { + if (CollectionUtils.isEmpty(ids)){ + return Collections.emptyMap(); + } + Example example = new Example(ExamQuestionDO.class); + example.createCriteria() + .andIn("id", ids); + List list = examQuestionMapper.selectByExample(example); + return CollStreamUtil.toMap(list, ExamQuestionDO::getId, v -> v); + } + + public List selecList(Integer type, Integer difficulty, String questionStem, Integer enable) { + Example example = new Example(ExamQuestionDO.class); + Example.Criteria criteria = example.createCriteria() + .andEqualTo("deleted", 0); + if (Objects.nonNull(type)) { + criteria.andEqualTo("type", type); + } + if (Objects.nonNull(difficulty)) { + criteria.andEqualTo("difficulty", difficulty); + } + if (StringUtils.isNotBlank(questionStem)) { + criteria.andLike("questionStem", "%" + questionStem + "%"); + } + if (Objects.nonNull(enable)) { + criteria.andEqualTo("enable", enable); + } + example.setOrderByClause("create_time desc"); + return examQuestionMapper.selectByExample(example); + } + + public int selectCount(ExamQuestionDO record) { + return examQuestionMapper.selectCount(record); + } + + /** + * 批量逻辑删除 + */ + public void batchDeleteByIds(List ids) { + if (CollectionUtils.isEmpty(ids)) { + return ; + } + Example example = new Example(ExamQuestionDO.class); + example.createCriteria() + .andIn("id", ids) + .andEqualTo("deleted", 0); + ExamQuestionDO updateDO = new ExamQuestionDO(); + updateDO.setDeleted(1); + examQuestionMapper.updateByExampleSelective(updateDO, example); + } +} \ No newline at end of file diff --git a/coolstore-partner-dao/src/main/java/com/cool/store/dao/renewal/RenewalApplicationDAO.java b/coolstore-partner-dao/src/main/java/com/cool/store/dao/renewal/RenewalApplicationDAO.java new file mode 100644 index 000000000..d4e5a3893 --- /dev/null +++ b/coolstore-partner-dao/src/main/java/com/cool/store/dao/renewal/RenewalApplicationDAO.java @@ -0,0 +1,55 @@ +package com.cool.store.dao.renewal; + +import com.cool.store.entity.renewal.RenewalApplicationDO; +import com.cool.store.mapper.renewal.RenewalApplicationMapper; +import com.cool.store.request.renewal.RenewalApplicationQueryRequest; +import com.cool.store.vo.renewal.RenewalApplicationListVO; +import org.springframework.stereotype.Repository; +import tk.mybatis.mapper.entity.Example; + +import javax.annotation.Resource; +import java.util.Arrays; +import java.util.List; + +@Repository +public class RenewalApplicationDAO { + + @Resource + private RenewalApplicationMapper renewalApplicationMapper; + + public int insertSelective(RenewalApplicationDO record) { + return renewalApplicationMapper.insertSelective(record); + } + + public int updateByPrimaryKeySelective(RenewalApplicationDO record) { + return renewalApplicationMapper.updateByPrimaryKeySelective(record); + } + + public RenewalApplicationDO getById(Long id) { + return renewalApplicationMapper.selectByPrimaryKey(id); + } + + public List queryRenewalApplicationList(RenewalApplicationQueryRequest request, List regionIds) { + return renewalApplicationMapper.queryRenewalApplicationList(request, regionIds); + } + + public RenewalApplicationDO getByApplicationNo(String applicationNo) { + Example example = new Example(RenewalApplicationDO.class); + example.createCriteria() + .andEqualTo("applicationNo", applicationNo) + .andEqualTo("isDeleted", 0); + return renewalApplicationMapper.selectOneByExample(example); + } + + /** + * 查询门店是否有正在进行的续签申请 + */ + public boolean existOngoingRecord(String storeCode) { + Example example = new Example(RenewalApplicationDO.class); + example.createCriteria() + .andEqualTo("storeCode", storeCode) + .andEqualTo("isDeleted", 0) + .andNotIn("status", Arrays.asList(40, 60, 70)); + return renewalApplicationMapper.selectCountByExample(example) > 0; + } +} diff --git a/coolstore-partner-dao/src/main/java/com/cool/store/dao/renewal/RenewalApplicationSignerInfoDAO.java b/coolstore-partner-dao/src/main/java/com/cool/store/dao/renewal/RenewalApplicationSignerInfoDAO.java new file mode 100644 index 000000000..2a0affa12 --- /dev/null +++ b/coolstore-partner-dao/src/main/java/com/cool/store/dao/renewal/RenewalApplicationSignerInfoDAO.java @@ -0,0 +1,47 @@ +package com.cool.store.dao.renewal; + +import cn.hutool.core.collection.CollStreamUtil; +import com.cool.store.entity.renewal.RenewalApplicationSignerInfoDO; +import com.cool.store.mapper.renewal.RenewalApplicationSignerInfoMapper; +import lombok.RequiredArgsConstructor; +import org.apache.commons.collections4.CollectionUtils; +import org.springframework.stereotype.Repository; +import tk.mybatis.mapper.entity.Example; + +import java.util.*; + +/** + * 续签申请签约人信息快照DAO + * + * @author zx + * @date 2026-04-28 + */ +@Repository +@RequiredArgsConstructor +public class RenewalApplicationSignerInfoDAO { + + private final RenewalApplicationSignerInfoMapper mapper; + + public int insertSelective(RenewalApplicationSignerInfoDO record) { + return mapper.insertSelective(record); + } + + public RenewalApplicationSignerInfoDO getByApplicationNo(String applicationNo) { + Example example = new Example(RenewalApplicationSignerInfoDO.class); + example.createCriteria().andEqualTo("applicationNo", applicationNo); + return mapper.selectOneByExample(example); + } + + /** + * 批量查询签约人信息 + */ + public Map getByApplicationNos(Collection applicationNos) { + if (CollectionUtils.isEmpty(applicationNos)) { + return Collections.emptyMap(); + } + Example example = new Example(RenewalApplicationSignerInfoDO.class); + example.createCriteria().andIn("applicationNo", applicationNos); + List list = mapper.selectByExample(example); + return CollStreamUtil.toMap(list, RenewalApplicationSignerInfoDO::getApplicationNo, v -> v); + } +} \ No newline at end of file diff --git a/coolstore-partner-dao/src/main/java/com/cool/store/dao/renewal/RenewalRenovateApprovalDAO.java b/coolstore-partner-dao/src/main/java/com/cool/store/dao/renewal/RenewalRenovateApprovalDAO.java new file mode 100644 index 000000000..9daa87e91 --- /dev/null +++ b/coolstore-partner-dao/src/main/java/com/cool/store/dao/renewal/RenewalRenovateApprovalDAO.java @@ -0,0 +1,22 @@ +package com.cool.store.dao.renewal; + +import com.cool.store.entity.renewal.RenewalRenovateApprovalDO; +import com.cool.store.mapper.renewal.RenewalRenovateApprovalMapper; +import org.springframework.stereotype.Repository; + +import javax.annotation.Resource; + +@Repository +public class RenewalRenovateApprovalDAO { + + @Resource + private RenewalRenovateApprovalMapper renewalRenovateApprovalMapper; + + public int insertSelective(RenewalRenovateApprovalDO record) { + return renewalRenovateApprovalMapper.insertSelective(record); + } + + public RenewalRenovateApprovalDO getByApplicationNo(String applicationNo) { + return renewalRenovateApprovalMapper.getByApplicationNo(applicationNo); + } +} diff --git a/coolstore-partner-dao/src/main/java/com/cool/store/dao/store/StoreBusinessReportDAO.java b/coolstore-partner-dao/src/main/java/com/cool/store/dao/store/StoreBusinessReportDAO.java new file mode 100644 index 000000000..dc1811c74 --- /dev/null +++ b/coolstore-partner-dao/src/main/java/com/cool/store/dao/store/StoreBusinessReportDAO.java @@ -0,0 +1,33 @@ +package com.cool.store.dao.store; + +import com.alibaba.excel.util.CollectionUtils; +import com.cool.store.entity.store.StoreBusinessReportDO; +import com.cool.store.mapper.store.StoreBusinessReportMapper; +import lombok.RequiredArgsConstructor; +import org.springframework.stereotype.Repository; + +import java.util.List; + +/** + *

+ * 门店营业数据报表DAO + *

+ * + * @author wangff + * @since 2026/4/28 + */ +@Repository +@RequiredArgsConstructor +public class StoreBusinessReportDAO { + private final StoreBusinessReportMapper storeBusinessReportMapper; + + /** + * 批量新增或编辑 + */ + public void insertOrUpdateBatch(List list) { + if (CollectionUtils.isEmpty(list)) { + return; + } + storeBusinessReportMapper.insertOrUpdateBatch(list); + } +} diff --git a/coolstore-partner-dao/src/main/java/com/cool/store/mapper/BigRegionMapper.java b/coolstore-partner-dao/src/main/java/com/cool/store/mapper/BigRegionMapper.java index 9fa96d06b..2bb7bac55 100644 --- a/coolstore-partner-dao/src/main/java/com/cool/store/mapper/BigRegionMapper.java +++ b/coolstore-partner-dao/src/main/java/com/cool/store/mapper/BigRegionMapper.java @@ -15,7 +15,10 @@ public interface BigRegionMapper extends Mapper { * @param keyword * @return */ - List queryAllBigRegion(@Param("keyword") String keyword, @Param("joinBrand") Integer joinBrand, @Param("type") Integer type); + List queryAllBigRegion(@Param("keyword") String keyword, + @Param("joinBrand") Integer joinBrand, + @Param("type") Integer type, + @Param("enable") Integer enable); /** * 根据所属大区与加盟模式查询新管家信息 @@ -29,4 +32,6 @@ public interface BigRegionMapper extends Mapper { List queryBigRegion(@Param("request") QueryBigRegionRequest queryBigRegionRequest); Integer updateHqtDate(BigRegionDO bigRegionDO); + + List getByRegionIdList(@Param("list") List regionIdList); } \ No newline at end of file diff --git a/coolstore-partner-dao/src/main/java/com/cool/store/mapper/FranchiseFeeMapper.java b/coolstore-partner-dao/src/main/java/com/cool/store/mapper/FranchiseFeeMapper.java index a6ac258d7..9c93c23d6 100644 --- a/coolstore-partner-dao/src/main/java/com/cool/store/mapper/FranchiseFeeMapper.java +++ b/coolstore-partner-dao/src/main/java/com/cool/store/mapper/FranchiseFeeMapper.java @@ -29,4 +29,6 @@ public interface FranchiseFeeMapper extends Mapper { Integer batchUpdateXgjCollectionStatus(@Param("shopIds")List shopId, @Param("collectionStatus")Integer collectionStatus); Integer batchUpdateXgjCollectionStatusAndXgjFeesPaid( @Param("list") List franchiseFeeStageDateDTOList); + + Integer updatePayType(@Param("shopId") Long shopId, @Param("payType") Integer payType); } diff --git a/coolstore-partner-dao/src/main/java/com/cool/store/mapper/LinePayMapper.java b/coolstore-partner-dao/src/main/java/com/cool/store/mapper/LinePayMapper.java index 373c59980..7de507f64 100644 --- a/coolstore-partner-dao/src/main/java/com/cool/store/mapper/LinePayMapper.java +++ b/coolstore-partner-dao/src/main/java/com/cool/store/mapper/LinePayMapper.java @@ -4,6 +4,7 @@ import com.cool.store.entity.LinePayDO; import org.apache.ibatis.annotations.Param; import tk.mybatis.mapper.common.Mapper; +import java.math.BigDecimal; import java.util.List; /** @@ -71,5 +72,7 @@ public interface LinePayMapper { Integer deleteByShopId(@Param("list")List shopIds); + Integer updateAmountAndPayUserName(@Param("id") Long id, @Param("amount") BigDecimal amount, @Param("payUserName") String payUserName, @Param("userId") String userId); + LinePayDO getLastPay(@Param("shopId") Long shopId); } \ No newline at end of file diff --git a/coolstore-partner-dao/src/main/java/com/cool/store/mapper/OpeningOperationPlanMapper.java b/coolstore-partner-dao/src/main/java/com/cool/store/mapper/OpeningOperationPlanMapper.java index 3914d9568..fd7146ec5 100644 --- a/coolstore-partner-dao/src/main/java/com/cool/store/mapper/OpeningOperationPlanMapper.java +++ b/coolstore-partner-dao/src/main/java/com/cool/store/mapper/OpeningOperationPlanMapper.java @@ -14,6 +14,8 @@ public interface OpeningOperationPlanMapper extends Mapper selectByShopIds(@Param("shopIds") List shopIds); + Integer updateByShopId(@Param("shopId") Long shopId, @Param("auditId") Long auditId, @Param("resultType") Integer resultType); /** diff --git a/coolstore-partner-dao/src/main/java/com/cool/store/mapper/ReceivingBankMapper.java b/coolstore-partner-dao/src/main/java/com/cool/store/mapper/ReceivingBankMapper.java new file mode 100644 index 000000000..f929d3260 --- /dev/null +++ b/coolstore-partner-dao/src/main/java/com/cool/store/mapper/ReceivingBankMapper.java @@ -0,0 +1,22 @@ +package com.cool.store.mapper; + +import com.cool.store.entity.ReceivingBankDO; +import org.apache.ibatis.annotations.Param; +import tk.mybatis.mapper.common.Mapper; + +import java.util.List; + +/** + * @Author: WangShuo + * @Date: 2025/06/18/17:33 + * @Version 1.0 + * @注释: + */ +public interface ReceivingBankMapper extends Mapper { + + List getByFranchiseBrandAndRegionId(@Param("franchiseBrandList") List franchiseBrandList,@Param("regionIdList") List regionIdList); + + Integer batchInsert(@Param("list") List list); + + Integer batchInsertOrUpdate(@Param("list") List receivingBankDOList); +} 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 34ea507b0..e2261ac54 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 @@ -4,6 +4,7 @@ import com.cool.store.dto.store.StoreAddressDTO; import com.cool.store.dto.store.StoreAreaDTO; import com.cool.store.dto.store.StoreExtendSoftOpenDTO; import com.cool.store.dto.store.StoreOrderTimeDTO; +import com.cool.store.dto.store.StoreReportDTO; import com.cool.store.entity.StoreDO; import com.cool.store.response.MiniShopsResponse; import org.apache.ibatis.annotations.Mapper; @@ -145,6 +146,21 @@ public interface StoreMapper { */ List getNoOrderStore(@Param("latestDate") LocalDate latestDate, @Param("businessTypes") List businessTypes, @Param("inBusinessType") Boolean inBusinessType); + /** + * 门店状态改为闭店 + * @param storeId 门店id + */ + int closeStore(@Param("storeId") String storeId); + + + /** + * 根据区域id查询门店列表 + * @param regionIds 区域id + * @param keyword 门店名称或门店编码 + * @return 门店列表 + */ + List getStoreByRegionIds(@Param("regionIds") List regionIds, @Param("keyword") String keyword); + /** * 根据市统计门店数量 * @param cityNames 市列表 @@ -165,20 +181,42 @@ public interface StoreMapper { @Param("openStartTime") LocalDate openStartTime, @Param("openEndTime") LocalDate openEndTime); - /** - * 根据区域id查询门店列表 - * @param regionIds 区域id - * @param keyword 门店名称或门店编码 - * @return 门店列表 - */ - List getStoreByRegionIds(@Param("regionIds") List regionIds, @Param("keyword") String keyword); - List getStoreAddress(@Param("flag") Integer flag, @Param("storeCode") String storeCode); int batchUpdateAddress(@Param("list") List storeList); String getPrivateSphereQrCode(@Param("storeId") String storeId); + + /** + * 总营业门店数量统计 + */ + List totalOpenStoreReport(@Param("date") String date, + @Param("domestic") Integer domestic, + @Param("joinBrandList") List joinBrandList); + + /** + * 期初门店数 + */ + List periodBeginStoreReport(@Param("date") String date, + @Param("domestic") Integer domestic, + @Param("joinBrandList") List joinBrandList); + + /** + * 新开门店数 + */ + List newOpenStoreReport(@Param("date") String date, + @Param("domestic") Integer domestic, + @Param("joinBrandList") List joinBrandList); + + /** + * 闭店门店数 + */ + List closeStoreReport(@Param("date") String date, + @Param("domestic") Integer domestic, + @Param("joinBrandList") List joinBrandList); + + /** * 批量新增或编辑开始试营业日期 */ diff --git a/coolstore-partner-dao/src/main/java/com/cool/store/mapper/ThirdPartyAccountMapper.java b/coolstore-partner-dao/src/main/java/com/cool/store/mapper/ThirdPartyAccountMapper.java new file mode 100644 index 000000000..172770e01 --- /dev/null +++ b/coolstore-partner-dao/src/main/java/com/cool/store/mapper/ThirdPartyAccountMapper.java @@ -0,0 +1,20 @@ +package com.cool.store.mapper; + +import com.cool.store.entity.ThirdPartyAccountDO; +import org.apache.ibatis.annotations.Param; +import tk.mybatis.mapper.common.Mapper; + +public interface ThirdPartyAccountMapper extends Mapper { + + /** + * 通过门店编码与手机号获取人员是否推送到猎聘 + * @param shopCode + * @param mobile + * @return + */ + ThirdPartyAccountDO getByCodeAndMobile(@Param("shopCode") String shopCode, @Param("mobile") String mobile); + + + boolean exists(@Param("shopCode") String shopCode, @Param("mobile") String mobile); + +} \ No newline at end of file diff --git a/coolstore-partner-dao/src/main/java/com/cool/store/mapper/ThirdPartyStoreMapper.java b/coolstore-partner-dao/src/main/java/com/cool/store/mapper/ThirdPartyStoreMapper.java new file mode 100644 index 000000000..ddb6b68f9 --- /dev/null +++ b/coolstore-partner-dao/src/main/java/com/cool/store/mapper/ThirdPartyStoreMapper.java @@ -0,0 +1,25 @@ +package com.cool.store.mapper; + +import com.cool.store.entity.ThirdPartyStoreDO; +import org.apache.ibatis.annotations.Param; +import tk.mybatis.mapper.common.Mapper; + +public interface ThirdPartyStoreMapper extends Mapper { + + /** + * 根据门店code查询推送记录 + * @param storeCode + * @return + */ + ThirdPartyStoreDO getByLocalStoreCode(@Param("storeCode") String storeCode); + + /** + * 门店是否存在 + * @param localStoreCode + * @return + */ + boolean exists(@Param("localStoreCode") String localStoreCode); + + + +} \ No newline at end of file diff --git a/coolstore-partner-dao/src/main/java/com/cool/store/mapper/UserAuthMappingMapper.java b/coolstore-partner-dao/src/main/java/com/cool/store/mapper/UserAuthMappingMapper.java index a39b75a94..15c5e8f2c 100644 --- a/coolstore-partner-dao/src/main/java/com/cool/store/mapper/UserAuthMappingMapper.java +++ b/coolstore-partner-dao/src/main/java/com/cool/store/mapper/UserAuthMappingMapper.java @@ -1,5 +1,6 @@ package com.cool.store.mapper; +import com.cool.store.dto.BigRegionUserDTO; import com.cool.store.entity.UserAuthMappingDO; import org.apache.ibatis.annotations.Mapper; import org.apache.ibatis.annotations.Param; @@ -112,4 +113,12 @@ public interface UserAuthMappingMapper { List listByUserIdListAndSource(@Param("userIdList") List userIdList, @Param("source") String source); List getAllByUserIds(@Param("userIdsByRoleIdList") List userIdsByRoleIdList); + + /** + * 查询指定大区 且管辖该大区的指定角色的人 + * @param regionIds + * @param roleName + * @return + */ + List getBigRegionByUserId(List regionIds, String roleName); } \ No newline at end of file diff --git a/coolstore-partner-dao/src/main/java/com/cool/store/mapper/approval/CommonApprovalLogMapper.java b/coolstore-partner-dao/src/main/java/com/cool/store/mapper/approval/CommonApprovalLogMapper.java new file mode 100644 index 000000000..45226cd62 --- /dev/null +++ b/coolstore-partner-dao/src/main/java/com/cool/store/mapper/approval/CommonApprovalLogMapper.java @@ -0,0 +1,25 @@ +package com.cool.store.mapper.approval; + +import com.cool.store.entity.approval.CommonApprovalLogDO; +import org.apache.ibatis.annotations.Param; +import tk.mybatis.mapper.common.Mapper; + +import java.util.List; + +public interface CommonApprovalLogMapper extends Mapper { + + /** + * 根据申请编号查询所有审批记录 + */ + List getByApplicationNo(@Param("applicationNo") String applicationNo); + + /** + * 批量插入审批记录 + */ + int batchInsert(@Param("list") List list); + + /** + * 批量更新审批记录 + */ + int batchUpdate(@Param("list") List list); +} diff --git a/coolstore-partner-dao/src/main/java/com/cool/store/mapper/contract/ContractCostMapper.java b/coolstore-partner-dao/src/main/java/com/cool/store/mapper/contract/ContractCostMapper.java new file mode 100644 index 000000000..471b8702f --- /dev/null +++ b/coolstore-partner-dao/src/main/java/com/cool/store/mapper/contract/ContractCostMapper.java @@ -0,0 +1,15 @@ +package com.cool.store.mapper.contract; + +import com.cool.store.entity.contract.ContractCostDO; +import org.apache.ibatis.annotations.Param; +import tk.mybatis.mapper.common.Mapper; + +import java.util.List; + +public interface ContractCostMapper extends Mapper { + + /** + * 根据合同编号查询费用列表 + */ + List queryByContractNo(@Param("contractNo") String contractNo); +} diff --git a/coolstore-partner-dao/src/main/java/com/cool/store/mapper/contract/ContractMasterMapper.java b/coolstore-partner-dao/src/main/java/com/cool/store/mapper/contract/ContractMasterMapper.java new file mode 100644 index 000000000..420eae61d --- /dev/null +++ b/coolstore-partner-dao/src/main/java/com/cool/store/mapper/contract/ContractMasterMapper.java @@ -0,0 +1,27 @@ +package com.cool.store.mapper.contract; + +import com.cool.store.entity.contract.ContractMasterDO; +import com.cool.store.request.contract.ContractMasterQueryRequest; +import com.cool.store.vo.contract.ContractMasterListVO; +import org.apache.ibatis.annotations.Param; +import tk.mybatis.mapper.common.Mapper; + +import java.util.List; + +public interface ContractMasterMapper extends Mapper { + + /** + * 查询合同列表(关联门店表) + */ + List queryContractMasterList(@Param("request") ContractMasterQueryRequest request); + + /** + * 查询即将到期的合同(未生成续签申请) + */ + List queryContractsNearExpiry(@Param("days") int days); + + /** + * 根据门店编码查询最新合同 + */ + ContractMasterDO getLatestContractByStoreCode(@Param("storeCode") String storeCode); +} diff --git a/coolstore-partner-dao/src/main/java/com/cool/store/mapper/exam/ExamAttemptAnswerMapper.java b/coolstore-partner-dao/src/main/java/com/cool/store/mapper/exam/ExamAttemptAnswerMapper.java new file mode 100644 index 000000000..d1c9cad9b --- /dev/null +++ b/coolstore-partner-dao/src/main/java/com/cool/store/mapper/exam/ExamAttemptAnswerMapper.java @@ -0,0 +1,24 @@ +package com.cool.store.mapper.exam; + +import com.cool.store.entity.exam.ExamAttemptAnswerDO; +import tk.mybatis.mapper.common.Mapper; + +import java.util.List; + +public interface ExamAttemptAnswerMapper extends Mapper { + + /** + * 插入或更新答案 + */ + int insertOrUpdate(ExamAttemptAnswerDO record); + + /** + * 批量插入或更新答案 + */ + int batchInsertOrUpdate(List list); + + /** + * 批量更新分数 + */ + int batchUpdateScore(List list); +} \ No newline at end of file diff --git a/coolstore-partner-dao/src/main/java/com/cool/store/mapper/exam/ExamAttemptMapper.java b/coolstore-partner-dao/src/main/java/com/cool/store/mapper/exam/ExamAttemptMapper.java new file mode 100644 index 000000000..fa794cc77 --- /dev/null +++ b/coolstore-partner-dao/src/main/java/com/cool/store/mapper/exam/ExamAttemptMapper.java @@ -0,0 +1,18 @@ +package com.cool.store.mapper.exam; + +import com.cool.store.entity.exam.ExamAttemptDO; +import org.apache.ibatis.annotations.Param; +import tk.mybatis.mapper.common.Mapper; + +import java.util.List; +import java.util.Map; + +public interface ExamAttemptMapper extends Mapper { + + /** + * 查询参考人数 + * @param examInfoIds 考试信息id列表 + * @return 参考人数 + */ + List> getAttemptCount(@Param("examInfoIds") List examInfoIds); +} \ No newline at end of file diff --git a/coolstore-partner-dao/src/main/java/com/cool/store/mapper/exam/ExamInfoMapper.java b/coolstore-partner-dao/src/main/java/com/cool/store/mapper/exam/ExamInfoMapper.java new file mode 100644 index 000000000..4d0892624 --- /dev/null +++ b/coolstore-partner-dao/src/main/java/com/cool/store/mapper/exam/ExamInfoMapper.java @@ -0,0 +1,12 @@ +package com.cool.store.mapper.exam; + +import com.cool.store.entity.exam.ExamInfoDO; +import tk.mybatis.mapper.common.Mapper; + +public interface ExamInfoMapper extends Mapper { + + /** + * 通过token查询考试信息 + */ + ExamInfoDO selectByToken(String token); +} \ No newline at end of file diff --git a/coolstore-partner-dao/src/main/java/com/cool/store/mapper/exam/ExamPaperMapper.java b/coolstore-partner-dao/src/main/java/com/cool/store/mapper/exam/ExamPaperMapper.java new file mode 100644 index 000000000..c5d7cdf4f --- /dev/null +++ b/coolstore-partner-dao/src/main/java/com/cool/store/mapper/exam/ExamPaperMapper.java @@ -0,0 +1,7 @@ +package com.cool.store.mapper.exam; + +import com.cool.store.entity.exam.ExamPaperDO; +import tk.mybatis.mapper.common.Mapper; + +public interface ExamPaperMapper extends Mapper { +} \ No newline at end of file diff --git a/coolstore-partner-dao/src/main/java/com/cool/store/mapper/exam/ExamPaperQuestionMapper.java b/coolstore-partner-dao/src/main/java/com/cool/store/mapper/exam/ExamPaperQuestionMapper.java new file mode 100644 index 000000000..60604188d --- /dev/null +++ b/coolstore-partner-dao/src/main/java/com/cool/store/mapper/exam/ExamPaperQuestionMapper.java @@ -0,0 +1,20 @@ +package com.cool.store.mapper.exam; + +import com.cool.store.entity.exam.ExamPaperQuestionDO; +import org.apache.ibatis.annotations.Param; +import tk.mybatis.mapper.common.Mapper; + +import java.util.List; + +public interface ExamPaperQuestionMapper extends Mapper { + + /** + * 批量插入试卷题目 + */ + int insertBatch(@Param("list") List list); + + /** + * 根据试卷ID批量删除(逻辑删除) + */ + int deleteByPaperId(@Param("paperId") Long paperId, @Param("updateTime") java.util.Date updateTime); +} \ No newline at end of file diff --git a/coolstore-partner-dao/src/main/java/com/cool/store/mapper/exam/ExamQuestionMapper.java b/coolstore-partner-dao/src/main/java/com/cool/store/mapper/exam/ExamQuestionMapper.java new file mode 100644 index 000000000..b19c95ab4 --- /dev/null +++ b/coolstore-partner-dao/src/main/java/com/cool/store/mapper/exam/ExamQuestionMapper.java @@ -0,0 +1,7 @@ +package com.cool.store.mapper.exam; + +import com.cool.store.entity.exam.ExamQuestionDO; +import tk.mybatis.mapper.common.Mapper; + +public interface ExamQuestionMapper extends Mapper { +} \ No newline at end of file diff --git a/coolstore-partner-dao/src/main/java/com/cool/store/mapper/renewal/RenewalApplicationMapper.java b/coolstore-partner-dao/src/main/java/com/cool/store/mapper/renewal/RenewalApplicationMapper.java new file mode 100644 index 000000000..daba67d6c --- /dev/null +++ b/coolstore-partner-dao/src/main/java/com/cool/store/mapper/renewal/RenewalApplicationMapper.java @@ -0,0 +1,18 @@ +package com.cool.store.mapper.renewal; + +import com.cool.store.entity.renewal.RenewalApplicationDO; +import com.cool.store.request.renewal.RenewalApplicationQueryRequest; +import com.cool.store.vo.renewal.RenewalApplicationListVO; +import org.apache.ibatis.annotations.Param; +import tk.mybatis.mapper.common.Mapper; + +import java.util.List; + +public interface RenewalApplicationMapper extends Mapper { + + /** + * 查询续签申请列表(关联门店、签约人表) + */ + List queryRenewalApplicationList(@Param("request") RenewalApplicationQueryRequest request, + @Param("regionIds") List regionIds); +} diff --git a/coolstore-partner-dao/src/main/java/com/cool/store/mapper/renewal/RenewalApplicationSignerInfoMapper.java b/coolstore-partner-dao/src/main/java/com/cool/store/mapper/renewal/RenewalApplicationSignerInfoMapper.java new file mode 100644 index 000000000..88e46c961 --- /dev/null +++ b/coolstore-partner-dao/src/main/java/com/cool/store/mapper/renewal/RenewalApplicationSignerInfoMapper.java @@ -0,0 +1,13 @@ +package com.cool.store.mapper.renewal; + +import com.cool.store.entity.renewal.RenewalApplicationSignerInfoDO; +import tk.mybatis.mapper.common.Mapper; + +/** + * 续签申请签约人信息快照Mapper + * + * @author zx + * @date 2026-04-28 + */ +public interface RenewalApplicationSignerInfoMapper extends Mapper { +} \ No newline at end of file diff --git a/coolstore-partner-dao/src/main/java/com/cool/store/mapper/renewal/RenewalRenovateApprovalMapper.java b/coolstore-partner-dao/src/main/java/com/cool/store/mapper/renewal/RenewalRenovateApprovalMapper.java new file mode 100644 index 000000000..cc30f4ecd --- /dev/null +++ b/coolstore-partner-dao/src/main/java/com/cool/store/mapper/renewal/RenewalRenovateApprovalMapper.java @@ -0,0 +1,13 @@ +package com.cool.store.mapper.renewal; + +import com.cool.store.entity.renewal.RenewalRenovateApprovalDO; +import org.apache.ibatis.annotations.Param; +import tk.mybatis.mapper.common.Mapper; + +public interface RenewalRenovateApprovalMapper extends Mapper { + + /** + * 根据申请编号查询翻新信息 + */ + RenewalRenovateApprovalDO getByApplicationNo(@Param("applicationNo") String applicationNo); +} diff --git a/coolstore-partner-dao/src/main/java/com/cool/store/mapper/store/StoreBusinessReportMapper.java b/coolstore-partner-dao/src/main/java/com/cool/store/mapper/store/StoreBusinessReportMapper.java new file mode 100644 index 000000000..a53130539 --- /dev/null +++ b/coolstore-partner-dao/src/main/java/com/cool/store/mapper/store/StoreBusinessReportMapper.java @@ -0,0 +1,32 @@ +package com.cool.store.mapper.store; + +import com.cool.store.entity.store.StoreBusinessReportDO; +import org.apache.ibatis.annotations.Param; + +import java.util.List; + +/** + * @author zhangchenbiao + * @date 2026-04-28 06:58 + */ +public interface StoreBusinessReportMapper { + /** + * + * 默认插入方法,只会给有值的字段赋值 + * 会对传进来的字段做判空处理,如果字段为空,则使用数据库默认字段或者null + * dateTime:2026-04-28 06:58 + */ + int insertSelective(@Param("record") StoreBusinessReportDO record, @Param("enterpriseId") String enterpriseId); + + /** + * + * 默认更新方法,根据主键更新,不会把null值更新到数据库,避免覆盖之前有值的 + * dateTime:2026-04-28 06:58 + */ + int updateByPrimaryKeySelective(@Param("record") StoreBusinessReportDO record, @Param("enterpriseId") String enterpriseId); + + /** + * 批量新增或编辑 + */ + void insertOrUpdateBatch(@Param("list") List list); +} \ No newline at end of file diff --git a/coolstore-partner-dao/src/main/resources/mapper/AdjustmentOrderMapper.xml b/coolstore-partner-dao/src/main/resources/mapper/AdjustmentOrderMapper.xml index fbb41db38..98d1b8ae0 100644 --- a/coolstore-partner-dao/src/main/resources/mapper/AdjustmentOrderMapper.xml +++ b/coolstore-partner-dao/src/main/resources/mapper/AdjustmentOrderMapper.xml @@ -97,6 +97,9 @@ and a.expense_sheet_type = #{request.expenseSheetType} + + and a.create_user_id = #{request.createUserId} + AND b.region_path LIKE CONCAT('%/', #{regionId}, '/%') diff --git a/coolstore-partner-dao/src/main/resources/mapper/BigRegionMapper.xml b/coolstore-partner-dao/src/main/resources/mapper/BigRegionMapper.xml index d3047d0a1..2966333c4 100644 --- a/coolstore-partner-dao/src/main/resources/mapper/BigRegionMapper.xml +++ b/coolstore-partner-dao/src/main/resources/mapper/BigRegionMapper.xml @@ -45,6 +45,9 @@ and type = #{type} + + and enable_flag = #{enable} + order by enable_flag desc, @@ -96,4 +99,15 @@ + \ No newline at end of file diff --git a/coolstore-partner-dao/src/main/resources/mapper/FranchiseFeeMapper.xml b/coolstore-partner-dao/src/main/resources/mapper/FranchiseFeeMapper.xml index 7c60ff89b..0e14b50c7 100644 --- a/coolstore-partner-dao/src/main/resources/mapper/FranchiseFeeMapper.xml +++ b/coolstore-partner-dao/src/main/resources/mapper/FranchiseFeeMapper.xml @@ -48,6 +48,11 @@ where shop_id = #{item.shopId} + + update xfsg_franchise_fee + set pay_type = #{payType} + where shop_id = #{shopId} + select @@ -399,7 +400,7 @@ + + + select * from xfsg_receiving_bank + where deleted=0 + + + #{item} + + + + + #{item} + + + + \ No newline at end of file diff --git a/coolstore-partner-dao/src/main/resources/mapper/ShopInfoMapper.xml b/coolstore-partner-dao/src/main/resources/mapper/ShopInfoMapper.xml index 0d1b0e11c..abd9966d0 100644 --- a/coolstore-partner-dao/src/main/resources/mapper/ShopInfoMapper.xml +++ b/coolstore-partner-dao/src/main/resources/mapper/ShopInfoMapper.xml @@ -397,6 +397,12 @@ ) + + and a.invest_region_id in + + #{investRegionId} + + and d.actual_complete_time between #{request.signStageStartTime} and #{request.signStageEndTime} diff --git a/coolstore-partner-dao/src/main/resources/mapper/StoreMapper.xml b/coolstore-partner-dao/src/main/resources/mapper/StoreMapper.xml index 9504c76a8..4677e8486 100644 --- a/coolstore-partner-dao/src/main/resources/mapper/StoreMapper.xml +++ b/coolstore-partner-dao/src/main/resources/mapper/StoreMapper.xml @@ -378,6 +378,23 @@ + + - + + + + + + + + + + INSERT INTO store_extend_info_${enterpriseId}(store_id, soft_open_date) VALUES diff --git a/coolstore-partner-dao/src/main/resources/mapper/ThirdPartyAccountMapper.xml b/coolstore-partner-dao/src/main/resources/mapper/ThirdPartyAccountMapper.xml new file mode 100644 index 000000000..86df2f74a --- /dev/null +++ b/coolstore-partner-dao/src/main/resources/mapper/ThirdPartyAccountMapper.xml @@ -0,0 +1,38 @@ + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/coolstore-partner-dao/src/main/resources/mapper/ThirdPartyMapper.xml b/coolstore-partner-dao/src/main/resources/mapper/ThirdPartyMapper.xml new file mode 100644 index 000000000..a47d8e2a4 --- /dev/null +++ b/coolstore-partner-dao/src/main/resources/mapper/ThirdPartyMapper.xml @@ -0,0 +1,30 @@ + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/coolstore-partner-dao/src/main/resources/mapper/UserAuthMappingMapper.xml b/coolstore-partner-dao/src/main/resources/mapper/UserAuthMappingMapper.xml index cd1909ba9..1d44a3675 100644 --- a/coolstore-partner-dao/src/main/resources/mapper/UserAuthMappingMapper.xml +++ b/coolstore-partner-dao/src/main/resources/mapper/UserAuthMappingMapper.xml @@ -214,4 +214,32 @@ + + + + + \ No newline at end of file diff --git a/coolstore-partner-dao/src/main/resources/mapper/WithdrawApplicationMapper.xml b/coolstore-partner-dao/src/main/resources/mapper/WithdrawApplicationMapper.xml index 0c2e64556..3c5d449e4 100644 --- a/coolstore-partner-dao/src/main/resources/mapper/WithdrawApplicationMapper.xml +++ b/coolstore-partner-dao/src/main/resources/mapper/WithdrawApplicationMapper.xml @@ -15,7 +15,9 @@ fail_reason AS failReason, create_user_id AS createUserId, create_time AS createTime, - update_time AS updateTime + update_time AS updateTime, + relate_store_id AS relateStoreId, + remark FROM zxjp_withdraw_application WHERE 1=1 diff --git a/coolstore-partner-dao/src/main/resources/mapper/approval/CommonApprovalLogMapper.xml b/coolstore-partner-dao/src/main/resources/mapper/approval/CommonApprovalLogMapper.xml new file mode 100644 index 000000000..71b684709 --- /dev/null +++ b/coolstore-partner-dao/src/main/resources/mapper/approval/CommonApprovalLogMapper.xml @@ -0,0 +1,46 @@ + + + + + + + + + + + + + + + + + + + + + + + + INSERT INTO zxjp_common_approval_log (application_no, node_code, node_name, handle_user_id, handle_user_name, result, status, version, comment, operate_time) + VALUES + + (#{item.applicationNo}, #{item.nodeCode}, #{item.nodeName}, #{item.handleUserId}, #{item.handleUserName}, #{item.result}, #{item.status}, #{item.version}, #{item.comment}, #{item.operateTime}) + + + + + + UPDATE zxjp_common_approval_log + SET status = #{item.status}, + comment = #{item.comment}, + operate_time = #{item.operateTime} + , result = #{item.result} + WHERE id = #{item.id} + + + diff --git a/coolstore-partner-dao/src/main/resources/mapper/contract/ContractCostMapper.xml b/coolstore-partner-dao/src/main/resources/mapper/contract/ContractCostMapper.xml new file mode 100644 index 000000000..5574b0ea1 --- /dev/null +++ b/coolstore-partner-dao/src/main/resources/mapper/contract/ContractCostMapper.xml @@ -0,0 +1,27 @@ + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/coolstore-partner-dao/src/main/resources/mapper/contract/ContractMasterMapper.xml b/coolstore-partner-dao/src/main/resources/mapper/contract/ContractMasterMapper.xml new file mode 100644 index 000000000..424238e78 --- /dev/null +++ b/coolstore-partner-dao/src/main/resources/mapper/contract/ContractMasterMapper.xml @@ -0,0 +1,74 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/coolstore-partner-dao/src/main/resources/mapper/exam/ExamAttemptAnswerMapper.xml b/coolstore-partner-dao/src/main/resources/mapper/exam/ExamAttemptAnswerMapper.xml new file mode 100644 index 000000000..4e019098d --- /dev/null +++ b/coolstore-partner-dao/src/main/resources/mapper/exam/ExamAttemptAnswerMapper.xml @@ -0,0 +1,48 @@ + + + + + + + + + + + + + + + + + + INSERT INTO zxjp_exam_attempt_answer (attempt_id, paper_id, paper_question_id, answer, score, create_user_id) + VALUES (#{attemptId}, #{paperId}, #{paperQuestionId}, #{answer}, #{score}, #{createUserId}) + ON DUPLICATE KEY UPDATE + answer = #{answer}, score = #{score} + + + + INSERT INTO zxjp_exam_attempt_answer (attempt_id, paper_id, paper_question_id, answer, score, create_user_id) + VALUES + + (#{item.attemptId}, #{item.paperId}, #{item.paperQuestionId}, #{item.answer}, #{item.score}, #{item.createUserId}) + + ON DUPLICATE KEY UPDATE + answer = VALUES(answer), score = VALUES(score) + + + + UPDATE zxjp_exam_attempt_answer SET + score = CASE id + + WHEN #{item.id} THEN #{item.score} + + END + WHERE id IN + + #{item.id} + + + \ No newline at end of file diff --git a/coolstore-partner-dao/src/main/resources/mapper/exam/ExamAttemptMapper.xml b/coolstore-partner-dao/src/main/resources/mapper/exam/ExamAttemptMapper.xml new file mode 100644 index 000000000..69feec170 --- /dev/null +++ b/coolstore-partner-dao/src/main/resources/mapper/exam/ExamAttemptMapper.xml @@ -0,0 +1,33 @@ + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/coolstore-partner-dao/src/main/resources/mapper/exam/ExamInfoMapper.xml b/coolstore-partner-dao/src/main/resources/mapper/exam/ExamInfoMapper.xml new file mode 100644 index 000000000..4c32e3a50 --- /dev/null +++ b/coolstore-partner-dao/src/main/resources/mapper/exam/ExamInfoMapper.xml @@ -0,0 +1,27 @@ + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/coolstore-partner-dao/src/main/resources/mapper/exam/ExamPaperMapper.xml b/coolstore-partner-dao/src/main/resources/mapper/exam/ExamPaperMapper.xml new file mode 100644 index 000000000..fb07732a5 --- /dev/null +++ b/coolstore-partner-dao/src/main/resources/mapper/exam/ExamPaperMapper.xml @@ -0,0 +1,19 @@ + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/coolstore-partner-dao/src/main/resources/mapper/exam/ExamPaperQuestionMapper.xml b/coolstore-partner-dao/src/main/resources/mapper/exam/ExamPaperQuestionMapper.xml new file mode 100644 index 000000000..19dcd545f --- /dev/null +++ b/coolstore-partner-dao/src/main/resources/mapper/exam/ExamPaperQuestionMapper.xml @@ -0,0 +1,44 @@ + + + + + + + + + + + + + + + + + + + + + + + + INSERT INTO zxjp_exam_paper_question ( + paper_id, question_id, type, difficulty, answer, score, + question_stem, analysis, options, deleted, create_user_id, create_time, update_time + ) VALUES + + ( + #{item.paperId}, #{item.questionId}, #{item.type}, #{item.difficulty}, #{item.answer}, #{item.score}, + #{item.questionStem}, #{item.analysis}, #{item.options}, #{item.deleted}, #{item.createUserId}, #{item.createTime}, #{item.updateTime} + ) + + + + + + UPDATE zxjp_exam_paper_question + SET deleted = 1, update_time = #{updateTime} + WHERE paper_id = #{paperId} AND deleted = 0 + + \ No newline at end of file diff --git a/coolstore-partner-dao/src/main/resources/mapper/exam/ExamQuestionMapper.xml b/coolstore-partner-dao/src/main/resources/mapper/exam/ExamQuestionMapper.xml new file mode 100644 index 000000000..d7061eb68 --- /dev/null +++ b/coolstore-partner-dao/src/main/resources/mapper/exam/ExamQuestionMapper.xml @@ -0,0 +1,22 @@ + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/coolstore-partner-dao/src/main/resources/mapper/renewal/RenewalApplicationMapper.xml b/coolstore-partner-dao/src/main/resources/mapper/renewal/RenewalApplicationMapper.xml new file mode 100644 index 000000000..fa7d20df2 --- /dev/null +++ b/coolstore-partner-dao/src/main/resources/mapper/renewal/RenewalApplicationMapper.xml @@ -0,0 +1,61 @@ + + + + + + + + + + + + + + + + + + + + + + + diff --git a/coolstore-partner-dao/src/main/resources/mapper/renewal/RenewalApplicationSignerInfoMapper.xml b/coolstore-partner-dao/src/main/resources/mapper/renewal/RenewalApplicationSignerInfoMapper.xml new file mode 100644 index 000000000..4294173ce --- /dev/null +++ b/coolstore-partner-dao/src/main/resources/mapper/renewal/RenewalApplicationSignerInfoMapper.xml @@ -0,0 +1,14 @@ + + + + + + + + + + + + + + diff --git a/coolstore-partner-dao/src/main/resources/mapper/renewal/RenewalRenovateApprovalMapper.xml b/coolstore-partner-dao/src/main/resources/mapper/renewal/RenewalRenovateApprovalMapper.xml new file mode 100644 index 000000000..b2153b916 --- /dev/null +++ b/coolstore-partner-dao/src/main/resources/mapper/renewal/RenewalRenovateApprovalMapper.xml @@ -0,0 +1,22 @@ + + + + + + + + + + + + + + + + + + + diff --git a/coolstore-partner-dao/src/main/resources/mapper/store/StoreBusinessReportMapper.xml b/coolstore-partner-dao/src/main/resources/mapper/store/StoreBusinessReportMapper.xml new file mode 100644 index 000000000..c4c93e505 --- /dev/null +++ b/coolstore-partner-dao/src/main/resources/mapper/store/StoreBusinessReportMapper.xml @@ -0,0 +1,128 @@ + + + + + + + + + + + + + + + + + id, join_brand, domestic, date, open_total_num, period_begin_num, new_open_num, close_num, + period_end_num, create_time + + + insert into store_business_report_${enterpriseId} + + + join_brand, + + + domestic, + + + date, + + + open_total_num, + + + period_begin_num, + + + new_open_num, + + + close_num, + + + period_end_num, + + + create_time, + + + + + #{record.joinBrand}, + + + #{record.domestic}, + + + #{record.date}, + + + #{record.openTotalNum}, + + + #{record.periodBeginNum}, + + + #{record.newOpenNum}, + + + #{record.closeNum}, + + + #{record.periodEndNum}, + + + #{record.createTime}, + + + + + update store_business_report_${enterpriseId} + + + join_brand = #{record.joinBrand}, + + + domestic = #{record.domestic}, + + + date = #{record.date}, + + + open_total_num = #{record.openTotalNum}, + + + period_begin_num = #{record.periodBeginNum}, + + + new_open_num = #{record.newOpenNum}, + + + close_num = #{record.closeNum}, + + + period_end_num = #{record.periodEndNum}, + + + create_time = #{record.createTime}, + + + where id = #{record.id} + + + + INSERT INTO store_business_report_${enterpriseId} (join_brand,domestic,date,open_total_num,period_begin_num,new_open_num,close_num,period_end_num) VALUES + + (#{item.joinBrand},#{item.domestic},#{item.date},#{item.openTotalNum},#{item.periodBeginNum},#{item.newOpenNum},#{item.closeNum},#{item.periodEndNum}) + + ON DUPLICATE KEY UPDATE + domestic = VALUES(domestic), + open_total_num = VALUES(open_total_num), + period_begin_num = VALUES(period_begin_num), + new_open_num = VALUES(new_open_num), + close_num = VALUES(close_num), + period_end_num = VALUES(period_end_num) + + \ No newline at end of file diff --git a/coolstore-partner-model/src/main/java/com/cool/store/dto/BigRegionUserDTO.java b/coolstore-partner-model/src/main/java/com/cool/store/dto/BigRegionUserDTO.java new file mode 100644 index 000000000..d6a027c6b --- /dev/null +++ b/coolstore-partner-model/src/main/java/com/cool/store/dto/BigRegionUserDTO.java @@ -0,0 +1,21 @@ +package com.cool.store.dto; + +import lombok.Data; + +/** + * @Auther zx_szh + * @Date 2026/1/7 11:28 + * @Version 1.0 + */ +@Data +public class BigRegionUserDTO { + + private String name; + + private String mobile; + + private String regionName; + + private Long regionId; + +} diff --git a/coolstore-partner-model/src/main/java/com/cool/store/dto/BigRegionUserListDTO.java b/coolstore-partner-model/src/main/java/com/cool/store/dto/BigRegionUserListDTO.java new file mode 100644 index 000000000..78578910f --- /dev/null +++ b/coolstore-partner-model/src/main/java/com/cool/store/dto/BigRegionUserListDTO.java @@ -0,0 +1,22 @@ +package com.cool.store.dto; + +import lombok.Data; + +import java.util.List; + +/** + * @Auther zx_szh + * @Date 2026/1/7 14:01 + * @Version 1.0 + */ +@Data +public class BigRegionUserListDTO { + + private Long regionId; + + private String regionName; + + private List specialRoleUserList; + + +} diff --git a/coolstore-partner-model/src/main/java/com/cool/store/dto/ImportReceivingBankDTO.java b/coolstore-partner-model/src/main/java/com/cool/store/dto/ImportReceivingBankDTO.java new file mode 100644 index 000000000..801170aef --- /dev/null +++ b/coolstore-partner-model/src/main/java/com/cool/store/dto/ImportReceivingBankDTO.java @@ -0,0 +1,43 @@ +package com.cool.store.dto; + +import com.cool.store.annotation.Excel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +/** + * @Author suzhuhong + * @Date 2025/6/19 19:29 + * @Version 1.0 + */ +@Data +public class ImportReceivingBankDTO { + + @ApiModelProperty(value = "品牌") + @Excel(name = "品牌") + private String franchiseBrand; + + @ApiModelProperty(value = "大区") + @Excel(name = "大区") + private String regionName; + + @ApiModelProperty(value = "付款方式") + @Excel(name = "付款方式") + private String payType; + + @ApiModelProperty(value = "收款人") + @Excel(name = "收款人") + private String payee; + + @ApiModelProperty(value = "收款账户") + @Excel(name = "收款账户") + private String receivingAccount; + + @ApiModelProperty(value = "收款银行") + @Excel(name = "收款银行") + private String bankName; + + @ApiModelProperty(value = "收款银行开户行") + @Excel(name = "收款银行开户行") + private String branchBankName; + +} diff --git a/coolstore-partner-model/src/main/java/com/cool/store/dto/ImportReceivingBankErrorDTO.java b/coolstore-partner-model/src/main/java/com/cool/store/dto/ImportReceivingBankErrorDTO.java new file mode 100644 index 000000000..a279f1b90 --- /dev/null +++ b/coolstore-partner-model/src/main/java/com/cool/store/dto/ImportReceivingBankErrorDTO.java @@ -0,0 +1,60 @@ +package com.cool.store.dto; + +import com.alibaba.excel.annotation.ExcelProperty; +import com.alibaba.excel.annotation.write.style.ColumnWidth; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +import javax.validation.constraints.NotBlank; +import javax.validation.constraints.NotNull; + +/** + * @Author: WangShuo + * @Date: 2025/06/19/10:42 + * @Version 1.0 + * @注释: + */ +@Data +public class ImportReceivingBankErrorDTO { + + + @ApiModelProperty(value = "品牌") + @ExcelProperty(value = "品牌",order = 1) + @ColumnWidth(30) + private String franchiseBrand; + + + @ApiModelProperty(value = "大区") + @ExcelProperty(value = "大区",order = 2) + @ColumnWidth(30) + private String regionName; + + @ApiModelProperty(value = "付款方式") + @ExcelProperty(value = "付款方式",order = 3) + @ColumnWidth(30) + private String payType; + + @ApiModelProperty(value = "收款人") + @ExcelProperty(value = "收款人",order = 4) + @ColumnWidth(30) + private String payee; + + @ApiModelProperty(value = "收款账户") + @ExcelProperty(value = "收款账户",order = 5) + @ColumnWidth(30) + private String receivingAccount; + + @ApiModelProperty(value = "收款银行") + @ExcelProperty(value = "收款银行",order = 6) + @ColumnWidth(30) + private String bankName; + + @ApiModelProperty(value = "收款银行开户行") + @ExcelProperty(value = "收款银行开户行",order = 7) + @ColumnWidth(30) + private String branchBankName; + + @ExcelProperty(value = "失败原因",order = 8) + @ColumnWidth(30) + private String errorMsg; +} diff --git a/coolstore-partner-model/src/main/java/com/cool/store/dto/StoreImageExportDTO.java b/coolstore-partner-model/src/main/java/com/cool/store/dto/StoreImageExportDTO.java new file mode 100644 index 000000000..585c441db --- /dev/null +++ b/coolstore-partner-model/src/main/java/com/cool/store/dto/StoreImageExportDTO.java @@ -0,0 +1,27 @@ +package com.cool.store.dto; + +import com.cool.store.annotation.Excel; +import lombok.Data; + +/** + * @Author suzhuhong + * @Date 2025/11/20 18:56 + * @Version 1.0 + */ +@Data +public class StoreImageExportDTO { + /** + * 门店编码 + */ + @Excel(name = "门店编码") + private String storeCode; + + @Excel(name = "门店名称") + private String storeName; + + /** + * 图片URL(OSS公网地址) + */ + @Excel(name = "图片") + private String imageUrl; +} diff --git a/coolstore-partner-model/src/main/java/com/cool/store/dto/exam/ExamAnswerDTO.java b/coolstore-partner-model/src/main/java/com/cool/store/dto/exam/ExamAnswerDTO.java new file mode 100644 index 000000000..7c5a8d92b --- /dev/null +++ b/coolstore-partner-model/src/main/java/com/cool/store/dto/exam/ExamAnswerDTO.java @@ -0,0 +1,19 @@ +package com.cool.store.dto.exam; + +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +import java.util.List; + +/** + * 题目答案DTO + */ +@Data +public class ExamAnswerDTO { + + @ApiModelProperty(value = "正确答案选项列表,如[\"A\",\"B\"]") + private List options; + + @ApiModelProperty(value = "判断题答案,true-正确 false-错误") + private Boolean judgment; +} \ No newline at end of file diff --git a/coolstore-partner-model/src/main/java/com/cool/store/dto/exam/ExamInfoAddDTO.java b/coolstore-partner-model/src/main/java/com/cool/store/dto/exam/ExamInfoAddDTO.java new file mode 100644 index 000000000..6f97fd7b2 --- /dev/null +++ b/coolstore-partner-model/src/main/java/com/cool/store/dto/exam/ExamInfoAddDTO.java @@ -0,0 +1,39 @@ +package com.cool.store.dto.exam; + +import com.cool.store.common.InsertGroup; +import com.cool.store.common.UpdateGroup; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +import javax.validation.constraints.NotBlank; +import javax.validation.constraints.NotNull; +import java.util.Date; + +/** + * 考试DTO(新增/修改) + */ +@Data +public class ExamInfoAddDTO { + + @ApiModelProperty(value = "考试ID") + @NotNull(message = "考试ID不能为空", groups = {UpdateGroup.class}) + private Long id; + + @ApiModelProperty(value = "试卷ID", required = true) + @NotNull(message = "试卷ID不能为空", groups = {InsertGroup.class}) + private Long paperId; + + @ApiModelProperty(value = "考试名称", required = true) + @NotBlank(message = "考试名称不能为空", groups = {InsertGroup.class}) + private String examName; + + @ApiModelProperty(value = "开始时间") + private Date startTime; + + @ApiModelProperty(value = "结束时间") + private Date endTime; + + @ApiModelProperty(value = "考试时长(分钟)", required = true) + @NotNull(message = "考试时长不能为空", groups = {InsertGroup.class}) + private Integer durationMinutes; +} \ No newline at end of file diff --git a/coolstore-partner-model/src/main/java/com/cool/store/dto/exam/ExamInfoListDTO.java b/coolstore-partner-model/src/main/java/com/cool/store/dto/exam/ExamInfoListDTO.java new file mode 100644 index 000000000..ac341aa8a --- /dev/null +++ b/coolstore-partner-model/src/main/java/com/cool/store/dto/exam/ExamInfoListDTO.java @@ -0,0 +1,20 @@ +package com.cool.store.dto.exam; + +import com.cool.store.common.PageBasicInfo; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; +import lombok.EqualsAndHashCode; + +/** + * 考试列表查询DTO + */ +@EqualsAndHashCode(callSuper = true) +@Data +public class ExamInfoListDTO extends PageBasicInfo { + + @ApiModelProperty(value = "考试名称") + private String examName; + + @ApiModelProperty(value = "状态,0-未发布 1-已发布 2-已结束") + private Integer status; +} \ No newline at end of file diff --git a/coolstore-partner-model/src/main/java/com/cool/store/dto/exam/ExamInfoUpdateDTO.java b/coolstore-partner-model/src/main/java/com/cool/store/dto/exam/ExamInfoUpdateDTO.java new file mode 100644 index 000000000..8f9d3c6bc --- /dev/null +++ b/coolstore-partner-model/src/main/java/com/cool/store/dto/exam/ExamInfoUpdateDTO.java @@ -0,0 +1,30 @@ +package com.cool.store.dto.exam; + +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +import javax.validation.constraints.NotNull; +import java.util.Date; + +/** + * 更新考试DTO + */ +@Data +public class ExamInfoUpdateDTO { + + @ApiModelProperty(value = "考试ID", required = true) + @NotNull(message = "考试ID不能为空") + private Long id; + + @ApiModelProperty(value = "考试名称") + private String examName; + + @ApiModelProperty(value = "开始时间") + private Date startTime; + + @ApiModelProperty(value = "结束时间") + private Date endTime; + + @ApiModelProperty(value = "考试时长(分钟)") + private Integer durationMinutes; +} \ No newline at end of file diff --git a/coolstore-partner-model/src/main/java/com/cool/store/dto/exam/ExamOptionDTO.java b/coolstore-partner-model/src/main/java/com/cool/store/dto/exam/ExamOptionDTO.java new file mode 100644 index 000000000..6f081533d --- /dev/null +++ b/coolstore-partner-model/src/main/java/com/cool/store/dto/exam/ExamOptionDTO.java @@ -0,0 +1,21 @@ +package com.cool.store.dto.exam; + +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +import javax.validation.constraints.NotBlank; + +/** + * 题目选项DTO + */ +@Data +public class ExamOptionDTO { + + @ApiModelProperty(value = "选项标签,如A、B、C、D", required = true) + @NotBlank(message = "选项标签不能为空") + private String label; + + @ApiModelProperty(value = "选项内容", required = true) + @NotBlank(message = "选项内容不能为空") + private String content; +} \ No newline at end of file diff --git a/coolstore-partner-model/src/main/java/com/cool/store/dto/exam/ExamPaperAddDTO.java b/coolstore-partner-model/src/main/java/com/cool/store/dto/exam/ExamPaperAddDTO.java new file mode 100644 index 000000000..a28469dcc --- /dev/null +++ b/coolstore-partner-model/src/main/java/com/cool/store/dto/exam/ExamPaperAddDTO.java @@ -0,0 +1,50 @@ +package com.cool.store.dto.exam; + +import com.cool.store.common.InsertGroup; +import com.cool.store.common.UpdateGroup; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +import javax.validation.Valid; +import javax.validation.constraints.NotBlank; +import javax.validation.constraints.NotEmpty; +import javax.validation.constraints.NotNull; +import java.math.BigDecimal; +import java.util.List; + +/** + * 新增试卷DTO + */ +@Data +public class ExamPaperAddDTO { + @ApiModelProperty(value = "试卷ID") + @NotNull(message = "试卷ID不能为空", groups = {UpdateGroup.class}) + private Long id; + + @ApiModelProperty(value = "试卷名称") + @NotBlank(message = "试卷名称不能为空", groups = {InsertGroup.class, UpdateGroup.class}) + private String paperName; + + @ApiModelProperty(value = "试卷描述") + private String description; + + @ApiModelProperty(value = "题目列表") + @NotEmpty(message = "题目列表不能为空", groups = {InsertGroup.class, UpdateGroup.class}) + @Valid + private List questions; + + @ApiModelProperty(value = "是否启用,0-否 1-是") + @NotNull(message = "是否启用不能为空", groups = {InsertGroup.class, UpdateGroup.class}) + private Integer enable; + + @Data + public static class PaperQuestionItemDTO { + @ApiModelProperty(value = "题目ID") + @NotNull(message = "题目ID不能为空", groups = {InsertGroup.class, UpdateGroup.class}) + private Long questionId; + + @ApiModelProperty(value = "分值") + @NotNull(message = "分值不能为空", groups = {InsertGroup.class, UpdateGroup.class}) + private BigDecimal score; + } +} \ No newline at end of file diff --git a/coolstore-partner-model/src/main/java/com/cool/store/dto/exam/ExamPaperListDTO.java b/coolstore-partner-model/src/main/java/com/cool/store/dto/exam/ExamPaperListDTO.java new file mode 100644 index 000000000..d0af10374 --- /dev/null +++ b/coolstore-partner-model/src/main/java/com/cool/store/dto/exam/ExamPaperListDTO.java @@ -0,0 +1,23 @@ +package com.cool.store.dto.exam; + +import com.cool.store.common.PageBasicInfo; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; +import lombok.EqualsAndHashCode; + +/** + * 试卷列表查询DTO + */ +@EqualsAndHashCode(callSuper = true) +@Data +public class ExamPaperListDTO extends PageBasicInfo { + + @ApiModelProperty(value = "试卷名称") + private String paperName; + + @ApiModelProperty(value = "是否启用,0-否 1-是") + private Integer enable; + + @ApiModelProperty(value = "是否已开始考试,0-否 1-是") + private Integer startExam; +} \ No newline at end of file diff --git a/coolstore-partner-model/src/main/java/com/cool/store/dto/exam/ExamQuestionAddDTO.java b/coolstore-partner-model/src/main/java/com/cool/store/dto/exam/ExamQuestionAddDTO.java new file mode 100644 index 000000000..bef489760 --- /dev/null +++ b/coolstore-partner-model/src/main/java/com/cool/store/dto/exam/ExamQuestionAddDTO.java @@ -0,0 +1,70 @@ +package com.cool.store.dto.exam; + +import com.alibaba.fastjson.JSON; +import com.cool.store.common.InsertGroup; +import com.cool.store.common.UpdateGroup; +import com.cool.store.entity.exam.ExamQuestionDO; +import com.cool.store.utils.BeanUtil; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +import javax.validation.Valid; +import javax.validation.constraints.NotBlank; +import javax.validation.constraints.NotNull; +import java.math.BigDecimal; +import java.util.List; + +/** + * 新增题目DTO + */ +@Data +public class ExamQuestionAddDTO { + @ApiModelProperty(value = "题目ID") + @NotNull(message = "题目id不能为空", groups = {UpdateGroup.class}) + private Long id; + + @ApiModelProperty(value = "题目类型,1-单选 2-多选 3-判断", required = true) + @NotNull(message = "题目类型不能为空", groups = {InsertGroup.class, UpdateGroup.class}) + private Integer type; + + @ApiModelProperty(value = "难度,1-简单 2-中等 3-困难") + @NotNull(message = "难度不能为空", groups = {InsertGroup.class, UpdateGroup.class}) + private Integer difficulty; + + @ApiModelProperty(value = "题干", required = true) + @NotBlank(message = "题干不能为空", groups = {InsertGroup.class, UpdateGroup.class}) + private String questionStem; + + @ApiModelProperty(value = "题目选项") + @Valid + private List options; + + @ApiModelProperty(value = "答案", required = true) + @NotNull(message = "答案不能为空", groups = {InsertGroup.class, UpdateGroup.class}) + @Valid + private ExamAnswerDTO answer; + + @ApiModelProperty(value = "分值", required = true) + @NotNull(message = "分值不能为空", groups = {InsertGroup.class, UpdateGroup.class}) + private BigDecimal score; + + @ApiModelProperty(value = "解析") + private String analysis; + + @ApiModelProperty(value = "是否启用,0-否 1-是") + @NotNull(message = "是否启用不能为空", groups = {InsertGroup.class, UpdateGroup.class}) + private Integer enable; + + public ExamQuestionDO convert() { + ExamQuestionDO questionDO = BeanUtil.toBean(this, ExamQuestionDO.class); + // 将答案对象转为JSON字符串存储 + if (answer != null) { + questionDO.setAnswer(JSON.toJSONString(answer)); + } + // 将选项对象转为JSON字符串存储 + if (options != null) { + questionDO.setOptions(JSON.toJSONString(options)); + } + return questionDO; + } +} \ No newline at end of file diff --git a/coolstore-partner-model/src/main/java/com/cool/store/dto/exam/ExamQuestionListDTO.java b/coolstore-partner-model/src/main/java/com/cool/store/dto/exam/ExamQuestionListDTO.java new file mode 100644 index 000000000..0c647fab6 --- /dev/null +++ b/coolstore-partner-model/src/main/java/com/cool/store/dto/exam/ExamQuestionListDTO.java @@ -0,0 +1,26 @@ +package com.cool.store.dto.exam; + +import com.cool.store.common.PageBasicInfo; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; +import lombok.EqualsAndHashCode; + +/** + * 题目列表查询DTO + */ +@EqualsAndHashCode(callSuper = true) +@Data +public class ExamQuestionListDTO extends PageBasicInfo { + + @ApiModelProperty(value = "题目类型,1-单选 2-多选 3-判断") + private Integer type; + + @ApiModelProperty(value = "难度,1-简单 2-中等 3-困难") + private Integer difficulty; + + @ApiModelProperty(value = "题干关键词") + private String questionStem; + + @ApiModelProperty(value = "是否启用,0-否 1-是") + private Integer enable; +} \ No newline at end of file diff --git a/coolstore-partner-model/src/main/java/com/cool/store/dto/exam/ExamStartAttemptDTO.java b/coolstore-partner-model/src/main/java/com/cool/store/dto/exam/ExamStartAttemptDTO.java new file mode 100644 index 000000000..d54e28a97 --- /dev/null +++ b/coolstore-partner-model/src/main/java/com/cool/store/dto/exam/ExamStartAttemptDTO.java @@ -0,0 +1,21 @@ +package com.cool.store.dto.exam; + +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +import javax.validation.constraints.NotBlank; + +/** + * 开始考试DTO + */ +@Data +public class ExamStartAttemptDTO { + + @ApiModelProperty(value = "考试入口token", required = true) + @NotBlank(message = "考试入口token不能为空") + private String entryToken; + + @ApiModelProperty(value = "考生姓名") + @NotBlank(message = "考生姓名不能为空") + private String name; +} \ No newline at end of file diff --git a/coolstore-partner-model/src/main/java/com/cool/store/dto/exam/ExamSubmitAnswerDTO.java b/coolstore-partner-model/src/main/java/com/cool/store/dto/exam/ExamSubmitAnswerDTO.java new file mode 100644 index 000000000..0f220eb3b --- /dev/null +++ b/coolstore-partner-model/src/main/java/com/cool/store/dto/exam/ExamSubmitAnswerDTO.java @@ -0,0 +1,25 @@ +package com.cool.store.dto.exam; + +import com.cool.store.vo.exam.ExamAnswerVO; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +import javax.validation.constraints.NotNull; + +/** + * 提交答案DTO + */ +@Data +public class ExamSubmitAnswerDTO { + + @ApiModelProperty(value = "答卷ID", required = true) + @NotNull(message = "答卷ID不能为空") + private Long attemptId; + + @ApiModelProperty(value = "试卷题目ID", required = true) + @NotNull(message = "试卷题目ID不能为空") + private Long paperQuestionId; + + @ApiModelProperty(value = "答案") + private ExamAnswerVO answer; +} \ No newline at end of file diff --git a/coolstore-partner-model/src/main/java/com/cool/store/dto/exam/ExamSubmitPaperDTO.java b/coolstore-partner-model/src/main/java/com/cool/store/dto/exam/ExamSubmitPaperDTO.java new file mode 100644 index 000000000..308bafecb --- /dev/null +++ b/coolstore-partner-model/src/main/java/com/cool/store/dto/exam/ExamSubmitPaperDTO.java @@ -0,0 +1,31 @@ +package com.cool.store.dto.exam; + +import com.cool.store.vo.exam.ExamAnswerVO; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +import javax.validation.constraints.NotNull; +import java.util.List; + +/** + * 提交试卷DTO + */ +@Data +public class ExamSubmitPaperDTO { + + @ApiModelProperty(value = "答卷ID", required = true) + @NotNull(message = "答卷ID不能为空") + private Long attemptId; + + @ApiModelProperty(value = "答案列表") + private List answers; + + @Data + public static class AnswerItem { + @ApiModelProperty(value = "试卷题目ID") + private Long paperQuestionId; + + @ApiModelProperty(value = "答案") + private ExamAnswerVO answer; + } +} \ No newline at end of file diff --git a/coolstore-partner-model/src/main/java/com/cool/store/dto/exam/ExamTokenDTO.java b/coolstore-partner-model/src/main/java/com/cool/store/dto/exam/ExamTokenDTO.java new file mode 100644 index 000000000..f1f6e3642 --- /dev/null +++ b/coolstore-partner-model/src/main/java/com/cool/store/dto/exam/ExamTokenDTO.java @@ -0,0 +1,21 @@ +package com.cool.store.dto.exam; + +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +import javax.validation.constraints.NotBlank; + +/** + *

+ * 考试tokenDTO + *

+ * + * @author wangff + * @since 2026/3/24 + */ +@Data +public class ExamTokenDTO { + @ApiModelProperty("token") + @NotBlank(message = "token不能为空") + private String token; +} diff --git a/coolstore-partner-model/src/main/java/com/cool/store/dto/food/DishesDTO.java b/coolstore-partner-model/src/main/java/com/cool/store/dto/food/DishesDTO.java new file mode 100644 index 000000000..a8e4ddfe5 --- /dev/null +++ b/coolstore-partner-model/src/main/java/com/cool/store/dto/food/DishesDTO.java @@ -0,0 +1,22 @@ +package com.cool.store.dto.food; + +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +/** + * 菜品DTP 已购菜品/我研发的菜品 + * @Author suzhuhong + * @Date 2025/6/17 9:53 + * @Version 1.0 + */ +@Data +public class DishesDTO { + @ApiModelProperty("ID") + private String id; + @ApiModelProperty("菜品CODE") + private String recipeCode; + @ApiModelProperty("菜品名称") + private String recipeName; + @ApiModelProperty("菜品图片") + private String imageUrl; +} diff --git a/coolstore-partner-model/src/main/java/com/cool/store/dto/liepin/XbbAppInfo.java b/coolstore-partner-model/src/main/java/com/cool/store/dto/liepin/XbbAppInfo.java new file mode 100644 index 000000000..4af2afa41 --- /dev/null +++ b/coolstore-partner-model/src/main/java/com/cool/store/dto/liepin/XbbAppInfo.java @@ -0,0 +1,54 @@ +package com.cool.store.dto.liepin; + +/** + * @author sha.li + * @since 2025-03-28 14:54 + */ +public class XbbAppInfo { + private String domain; + private String appId; + private String secretKey; + private String aesSecretKey; + + public String getDomain() { + return domain; + } + + public void setDomain(String domain) { + this.domain = domain; + } + + public String getAppId() { + return appId; + } + + public void setAppId(String appId) { + this.appId = appId; + } + + public String getSecretKey() { + return secretKey; + } + + public void setSecretKey(String secretKey) { + this.secretKey = secretKey; + } + + public String getAesSecretKey() { + return aesSecretKey; + } + + public void setAesSecretKey(String aesSecretKey) { + this.aesSecretKey = aesSecretKey; + } + + @Override + public String toString() { + return "XbbAppInfo{" + + "secretKey='" + secretKey + '\'' + + ", domain='" + domain + '\'' + + ", appId='" + appId + '\'' + + ", aesSecretKey='" + aesSecretKey + '\'' + + '}'; + } +} diff --git a/coolstore-partner-model/src/main/java/com/cool/store/dto/liepin/XbbEncryptedData.java b/coolstore-partner-model/src/main/java/com/cool/store/dto/liepin/XbbEncryptedData.java new file mode 100644 index 000000000..88389b18b --- /dev/null +++ b/coolstore-partner-model/src/main/java/com/cool/store/dto/liepin/XbbEncryptedData.java @@ -0,0 +1,24 @@ +package com.cool.store.dto.liepin; + +/** + * @author sha.li + * @since 2025-03-28 15:38 + */ +public class XbbEncryptedData { + private String encryptData; + + public String getEncryptData() { + return encryptData; + } + + public void setEncryptData(String encryptData) { + this.encryptData = encryptData; + } + + @Override + public String toString() { + return "XbbEncryptedData{" + + "encryptData='" + encryptData + '\'' + + '}'; + } +} diff --git a/coolstore-partner-model/src/main/java/com/cool/store/dto/store/StoreReportDTO.java b/coolstore-partner-model/src/main/java/com/cool/store/dto/store/StoreReportDTO.java new file mode 100644 index 000000000..0b350e75a --- /dev/null +++ b/coolstore-partner-model/src/main/java/com/cool/store/dto/store/StoreReportDTO.java @@ -0,0 +1,21 @@ +package com.cool.store.dto.store; + +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +/** + *

+ * 门店报表DTO + *

+ * + * @author wangff + * @since 2026/4/28 + */ +@Data +public class StoreReportDTO { + @ApiModelProperty("门店品牌") + private Integer joinBrand; + + @ApiModelProperty("数量") + private Integer num; +} diff --git a/coolstore-partner-model/src/main/java/com/cool/store/dto/wallet/WithdrawApplicationDTO.java b/coolstore-partner-model/src/main/java/com/cool/store/dto/wallet/WithdrawApplicationDTO.java index 64769a070..06094174a 100644 --- a/coolstore-partner-model/src/main/java/com/cool/store/dto/wallet/WithdrawApplicationDTO.java +++ b/coolstore-partner-model/src/main/java/com/cool/store/dto/wallet/WithdrawApplicationDTO.java @@ -52,4 +52,13 @@ public class WithdrawApplicationDTO { @ApiModelProperty("更新时间") private Date updateTime; + @ApiModelProperty("门店ID") + private String relateStoreId; + + @ApiModelProperty("门店名称") + private String relateStoreName; + + @ApiModelProperty("备注") + private String remark; + } diff --git a/coolstore-partner-model/src/main/java/com/cool/store/entity/AdjustmentOrderDO.java b/coolstore-partner-model/src/main/java/com/cool/store/entity/AdjustmentOrderDO.java index 874fba71c..d6d463c03 100644 --- a/coolstore-partner-model/src/main/java/com/cool/store/entity/AdjustmentOrderDO.java +++ b/coolstore-partner-model/src/main/java/com/cool/store/entity/AdjustmentOrderDO.java @@ -104,4 +104,8 @@ public class AdjustmentOrderDO { @ApiModelProperty("支付时间") @Column(name = "pay_time") private Date payTime; + + @ApiModelProperty("拒绝原因") + @Column(name = "reject_reason") + private String rejectReason; } diff --git a/coolstore-partner-model/src/main/java/com/cool/store/entity/FranchiseFeeDO.java b/coolstore-partner-model/src/main/java/com/cool/store/entity/FranchiseFeeDO.java index 4b003902f..eafc87d9d 100644 --- a/coolstore-partner-model/src/main/java/com/cool/store/entity/FranchiseFeeDO.java +++ b/coolstore-partner-model/src/main/java/com/cool/store/entity/FranchiseFeeDO.java @@ -72,6 +72,14 @@ public class FranchiseFeeDO { @ApiModelProperty("新管家已缴金额") private BigDecimal xgjFeesPaid; + @Column(name = "intended_signatory_first") + @ApiModelProperty("意向签约人1") + private String intendedSignatoryFirst; + + @Column(name = "intended_signatory_second") + @ApiModelProperty("意向签约人2") + private String intendedSignatorySecond; + @Column(name = "cashier_fee") @ApiModelProperty("收银费(系统费)") private String cashierFee; diff --git a/coolstore-partner-model/src/main/java/com/cool/store/entity/LinePayDO.java b/coolstore-partner-model/src/main/java/com/cool/store/entity/LinePayDO.java index 8376a28b1..91af3f3fc 100644 --- a/coolstore-partner-model/src/main/java/com/cool/store/entity/LinePayDO.java +++ b/coolstore-partner-model/src/main/java/com/cool/store/entity/LinePayDO.java @@ -34,10 +34,10 @@ public class LinePayDO implements Serializable { @ApiModelProperty("line_info.id") private Long lineId; - @ApiModelProperty("支付状态 45:待缴费 50:已缴费 55缴费失败") + @ApiModelProperty("支付状态 45:待支付 50:已缴费 55缴费失败,60-已取消") private Integer payStatus; - @ApiModelProperty("支付方式 1微信 2银行转账 3-线下支付,4-线上支付") + @ApiModelProperty("支付方式 1微信 2银行转账 3-线上支付,4-线下支付") private Integer payType; @ApiModelProperty("付款人姓名") @@ -105,4 +105,8 @@ public class LinePayDO implements Serializable { @Column(name = "remark") private String remark; + @Column(name = "xgj_fail_reason") + @ApiModelProperty("新管家收款单失败原因") + private String xgjFailReason; + } \ No newline at end of file diff --git a/coolstore-partner-model/src/main/java/com/cool/store/entity/OpeningOperationPlanDO.java b/coolstore-partner-model/src/main/java/com/cool/store/entity/OpeningOperationPlanDO.java index 77b82d341..ea3ccbaa8 100644 --- a/coolstore-partner-model/src/main/java/com/cool/store/entity/OpeningOperationPlanDO.java +++ b/coolstore-partner-model/src/main/java/com/cool/store/entity/OpeningOperationPlanDO.java @@ -109,8 +109,49 @@ public class OpeningOperationPlanDO { @Column(name = "result_type") private Integer resultType; + /** + * 开业时间 + */ + @Column(name = "open_time") + private Date openTime; + @Column(name = "first_day_income") + private String firstDayIncome; + @Column(name = "second_day_income") + private String secondDayIncome; + @Column(name = "third_day_income") + private String thirdDayIncome; + public Date getOpenTime() { + return openTime; + } + public void setOpenTime(Date openTime) { + this.openTime = openTime; + } + + public String getFirstDayIncome() { + return firstDayIncome; + } + + public String getSecondDayIncome() { + return secondDayIncome; + } + + public String getThirdDayIncome() { + return thirdDayIncome; + } + + public void setFirstDayIncome(String firstDayIncome) { + this.firstDayIncome = firstDayIncome; + } + + public void setSecondDayIncome(String secondDayIncome) { + this.secondDayIncome = secondDayIncome; + } + + public void setThirdDayIncome(String thirdDayIncome) { + this.thirdDayIncome = thirdDayIncome; + } public Integer getResultType() { return resultType; diff --git a/coolstore-partner-model/src/main/java/com/cool/store/entity/ReceivingBankDO.java b/coolstore-partner-model/src/main/java/com/cool/store/entity/ReceivingBankDO.java new file mode 100644 index 000000000..77f777bc9 --- /dev/null +++ b/coolstore-partner-model/src/main/java/com/cool/store/entity/ReceivingBankDO.java @@ -0,0 +1,65 @@ +package com.cool.store.entity; + +import lombok.Data; + +import javax.persistence.*; +import java.util.Date; +import java.util.Objects; + +/** + * @Author: WangShuo + * @Date: 2025/06/18/17:31 + * @Version 1.0 + * @注释: + */ +@Table(name = "xfsg_receiving_bank") +@Data +public class ReceivingBankDO { + @Id + @GeneratedValue(strategy = GenerationType.IDENTITY) + private Long id; + @Column(name = "region_id") + private Long regionId; + @Column(name = "franchise_brand") + private Integer franchiseBrand; + @Column(name = "pay_type") + private Integer payType; + @Column(name = "payee") + private String payee; + @Column(name = "receiving_account") + private String receivingAccount; + @Column(name = "bank_name") + private String bankName; + @Column(name = "branch_bank_name") + private String branchBankName; + @Column(name = "create_time") + private Date createTime; + @Column(name = "update_time") + private Date updateTime; + @Column(name = "create_user") + private String createUser; + @Column(name = "update_user") + private String updateUser; + @Column(name = "deleted") + private Boolean deleted; + + public ReceivingBankDO(Long regionId, Integer franchiseBrand, Integer payType) { + this.regionId = regionId; + this.franchiseBrand = franchiseBrand; + this.payType = payType; + } + public ReceivingBankDO(){} + @Override + public boolean equals(Object o) { + if (this == o) return true; + if (!(o instanceof ReceivingBankDO)) return false; + ReceivingBankDO that = (ReceivingBankDO) o; + return Objects.equals(regionId, that.regionId) && + Objects.equals(franchiseBrand, that.franchiseBrand) && + Objects.equals(payType, that.payType); + } + @Override + public int hashCode() { + return Objects.hash(regionId, franchiseBrand, payType); + } +} diff --git a/coolstore-partner-model/src/main/java/com/cool/store/entity/ShopInfoDO.java b/coolstore-partner-model/src/main/java/com/cool/store/entity/ShopInfoDO.java index 7be007bb2..c7d9bcea6 100644 --- a/coolstore-partner-model/src/main/java/com/cool/store/entity/ShopInfoDO.java +++ b/coolstore-partner-model/src/main/java/com/cool/store/entity/ShopInfoDO.java @@ -206,4 +206,5 @@ public class ShopInfoDO { */ @Column(name = "special_instruction") private String specialInstruction; + } \ No newline at end of file diff --git a/coolstore-partner-model/src/main/java/com/cool/store/entity/ThirdPartyAccountDO.java b/coolstore-partner-model/src/main/java/com/cool/store/entity/ThirdPartyAccountDO.java new file mode 100644 index 000000000..4bf7efcb1 --- /dev/null +++ b/coolstore-partner-model/src/main/java/com/cool/store/entity/ThirdPartyAccountDO.java @@ -0,0 +1,251 @@ +package com.cool.store.entity; + +import lombok.Builder; + +import java.util.Date; +import javax.persistence.*; + +@Table(name = "xfsg_third_party_account") +@Builder +public class ThirdPartyAccountDO { + /** + * 主键ID + */ + @Id + @GeneratedValue(strategy = GenerationType.IDENTITY) + private Long id; + + /** + * 手机号 + */ + @Column(name = "mobile") + private String mobile; + + /** + * 本地门店编码 + */ + @Column(name = "local_store_code") + private String localStoreCode; + + /** + * 第三方平台账号ID + */ + @Column(name = "third_party_account_id") + private String thirdPartyAccountId; + + /** + * 所属第三方门店ID(xfsg_third_party_store) + */ + @Column(name = "third_party_store_id") + private String thirdPartyStoreId; + + /** + * 角色 1超管 2普通 + */ + @Column(name = "account_type") + private Integer accountType; + + /** + * 职务 1店长 2人事专员 3经理 4职员 + */ + @Column(name = "position_id") + private Long positionId; + + /** + * 账号是否有效:0-无效,1-有效 + */ + @Column(name = "is_valid") + private Integer isValid; + + /** + * 创建时间 + */ + @Column(name = "create_time") + private Date createTime; + + /** + * 更新时间 + */ + @Column(name = "update_time") + private Date updateTime; + + /** + * 获取主键ID + * + * @return id - 主键ID + */ + public Long getId() { + return id; + } + + /** + * 设置主键ID + * + * @param id 主键ID + */ + public void setId(Long id) { + this.id = id; + } + + /** + * 获取手机号 + * + * @return mobile - 手机号 + */ + public String getMobile() { + return mobile; + } + + /** + * 设置手机号 + * + * @param mobile 手机号 + */ + public void setMobile(String mobile) { + this.mobile = mobile; + } + + /** + * 获取本地门店编码 + * + * @return local_store_code - 本地门店编码 + */ + public String getLocalStoreCode() { + return localStoreCode; + } + + /** + * 设置本地门店编码 + * + * @param localStoreCode 本地门店编码 + */ + public void setLocalStoreCode(String localStoreCode) { + this.localStoreCode = localStoreCode; + } + + /** + * 获取第三方平台账号ID + * + * @return third_party_account_id - 第三方平台账号ID + */ + public String getThirdPartyAccountId() { + return thirdPartyAccountId; + } + + /** + * 设置第三方平台账号ID + * + * @param thirdPartyAccountId 第三方平台账号ID + */ + public void setThirdPartyAccountId(String thirdPartyAccountId) { + this.thirdPartyAccountId = thirdPartyAccountId; + } + + /** + * 获取所属第三方门店ID(xfsg_third_party_store) + * + * @return third_party_store_id - 所属第三方门店ID(xfsg_third_party_store) + */ + public String getThirdPartyStoreId() { + return thirdPartyStoreId; + } + + /** + * 设置所属第三方门店ID(xfsg_third_party_store) + * + * @param thirdPartyStoreId 所属第三方门店ID(xfsg_third_party_store) + */ + public void setThirdPartyStoreId(String thirdPartyStoreId) { + this.thirdPartyStoreId = thirdPartyStoreId; + } + + /** + * 获取角色 1超管 2普通 + * + * @return account_type - 角色 1超管 2普通 + */ + public Integer getAccountType() { + return accountType; + } + + /** + * 设置角色 1超管 2普通 + * + * @param accountType 角色 1超管 2普通 + */ + public void setAccountType(Integer accountType) { + this.accountType = accountType; + } + + /** + * 获取职务 1店长 2人事专员 3经理 4职员 + * + * @return position_id - 职务 1店长 2人事专员 3经理 4职员 + */ + public Long getPositionId() { + return positionId; + } + + /** + * 设置职务 1店长 2人事专员 3经理 4职员 + * + * @param positionId 职务 1店长 2人事专员 3经理 4职员 + */ + public void setPositionId(Long positionId) { + this.positionId = positionId; + } + + /** + * 获取账号是否有效:0-无效,1-有效 + * + * @return is_valid - 账号是否有效:0-无效,1-有效 + */ + public Integer getIsValid() { + return isValid; + } + + /** + * 设置账号是否有效:0-无效,1-有效 + * + * @param isValid 账号是否有效:0-无效,1-有效 + */ + public void setIsValid(Integer isValid) { + this.isValid = isValid; + } + + /** + * 获取创建时间 + * + * @return create_time - 创建时间 + */ + public Date getCreateTime() { + return createTime; + } + + /** + * 设置创建时间 + * + * @param createTime 创建时间 + */ + public void setCreateTime(Date createTime) { + this.createTime = createTime; + } + + /** + * 获取更新时间 + * + * @return update_time - 更新时间 + */ + public Date getUpdateTime() { + return updateTime; + } + + /** + * 设置更新时间 + * + * @param updateTime 更新时间 + */ + public void setUpdateTime(Date updateTime) { + this.updateTime = updateTime; + } +} \ No newline at end of file diff --git a/coolstore-partner-model/src/main/java/com/cool/store/entity/ThirdPartyStoreDO.java b/coolstore-partner-model/src/main/java/com/cool/store/entity/ThirdPartyStoreDO.java new file mode 100644 index 000000000..37f93147f --- /dev/null +++ b/coolstore-partner-model/src/main/java/com/cool/store/entity/ThirdPartyStoreDO.java @@ -0,0 +1,137 @@ +package com.cool.store.entity; + +import lombok.Builder; + +import java.util.Date; +import javax.persistence.*; + +@Table(name = "xfsg_third_party_store") +@Builder +public class ThirdPartyStoreDO { + /** + * 主键ID + */ + @Id + @GeneratedValue(strategy = GenerationType.IDENTITY) + private Long id; + + /** + * 本地门店编码 + */ + @Column(name = "local_store_code") + private String localStoreCode; + + /** + * 第三方平台门店ID + */ + @Column(name = "third_party_store_id") + private String thirdPartyStoreId; + + /** + * 第三方平台门店门头照图片url + */ + @Column(name = "third_party_store_url") + private String thirdPartyStoreUrl; + + /** + * 创建时间 + */ + @Column(name = "create_time") + private Date createTime; + + /** + * 更新时间 + */ + @Column(name = "update_time") + private Date updateTime; + + /** + * 获取主键ID + * + * @return id - 主键ID + */ + public Long getId() { + return id; + } + + /** + * 设置主键ID + * + * @param id 主键ID + */ + public void setId(Long id) { + this.id = id; + } + + /** + * 获取本地门店编码 + * + * @return local_store_code - 本地门店编码 + */ + public String getLocalStoreCode() { + return localStoreCode; + } + + /** + * 设置本地门店编码 + * + * @param localStoreCode 本地门店编码 + */ + public void setLocalStoreCode(String localStoreCode) { + this.localStoreCode = localStoreCode; + } + + /** + * 获取第三方平台门店ID + * + * @return third_party_store_id - 第三方平台门店ID + */ + public String getThirdPartyStoreId() { + return thirdPartyStoreId; + } + + /** + * 设置第三方平台门店ID + * + * @param thirdPartyStoreId 第三方平台门店ID + */ + public void setThirdPartyStoreId(String thirdPartyStoreId) { + this.thirdPartyStoreId = thirdPartyStoreId; + } + + /** + * 获取创建时间 + * + * @return create_time - 创建时间 + */ + public Date getCreateTime() { + return createTime; + } + + /** + * 设置创建时间 + * + * @param createTime 创建时间 + */ + public void setCreateTime(Date createTime) { + this.createTime = createTime; + } + + /** + * 获取更新时间 + * + * @return update_time - 更新时间 + */ + public Date getUpdateTime() { + return updateTime; + } + + /** + * 设置更新时间 + * + * @param updateTime 更新时间 + */ + public void setUpdateTime(Date updateTime) { + this.updateTime = updateTime; + } +} \ No newline at end of file diff --git a/coolstore-partner-model/src/main/java/com/cool/store/entity/WithdrawApplicationDO.java b/coolstore-partner-model/src/main/java/com/cool/store/entity/WithdrawApplicationDO.java index ebd4cb8f6..23e9db3de 100644 --- a/coolstore-partner-model/src/main/java/com/cool/store/entity/WithdrawApplicationDO.java +++ b/coolstore-partner-model/src/main/java/com/cool/store/entity/WithdrawApplicationDO.java @@ -88,4 +88,16 @@ public class WithdrawApplicationDO implements Serializable { */ @Column(name = "update_time") private Date updateTime; + + /** + * 门店ID + */ + @Column(name = "relate_store_id") + private String relateStoreId; + + /** + * 备注 + */ + @Column(name = "remark") + private String remark; } diff --git a/coolstore-partner-model/src/main/java/com/cool/store/entity/approval/CommonApprovalLogDO.java b/coolstore-partner-model/src/main/java/com/cool/store/entity/approval/CommonApprovalLogDO.java new file mode 100644 index 000000000..3576d0d02 --- /dev/null +++ b/coolstore-partner-model/src/main/java/com/cool/store/entity/approval/CommonApprovalLogDO.java @@ -0,0 +1,108 @@ +package com.cool.store.entity.approval; + +import lombok.AllArgsConstructor; +import lombok.Builder; +import lombok.Data; +import lombok.NoArgsConstructor; + +import javax.persistence.*; +import java.util.Date; + +/** + * 通用审批流程记录表 + */ +@Table(name = "zxjp_common_approval_log") +@Data +@Builder +@NoArgsConstructor +@AllArgsConstructor +public class CommonApprovalLogDO { + + @Id + @GeneratedValue(strategy = GenerationType.IDENTITY) + private Long id; + + /** + * 申请编号 + */ + @Column(name = "application_no") + private String applicationNo; + + /** + * 审批节点代码 + */ + @Column(name = "node_code") + private String nodeCode; + + /** + * 审批节点名称 + */ + @Column(name = "node_name") + private String nodeName; + + /** + * 处理人ID + */ + @Column(name = "handle_user_id") + private String handleUserId; + + /** + * 处理人名称 + */ + @Column(name = "handle_user_name") + private String handleUserName; + + /** + * 审批结果:pass-通过,reject-拒绝 + */ + @Column(name = "result") + private String result; + + /** + * 审批状态:1-已处理,2-待处理 + */ + @Column(name = "status") + private String status; + + /** + * 版本号 + */ + @Column(name = "version") + private Long version; + + /** + * 审批意见 + */ + @Column(name = "comment") + private String comment; + + /** + * 审批操作时间 + */ + @Column(name = "operate_time") + private Date operateTime; + + /** + * 创建时间 + */ + @Column(name = "create_time") + private Date createTime; + + /** + * 更新时间 + */ + @Column(name = "update_time") + private Date updateTime; + + /** + * 删除标识:0-未删除,1-已删除 + */ + @Column(name = "deleted") + private Integer deleted; + + /** + * 提交类型:0-提交,1-审批 + */ + @Column(name = "submit_type") + private Integer submitType; +} diff --git a/coolstore-partner-model/src/main/java/com/cool/store/entity/contract/ContractCostDO.java b/coolstore-partner-model/src/main/java/com/cool/store/entity/contract/ContractCostDO.java new file mode 100644 index 000000000..41e02438f --- /dev/null +++ b/coolstore-partner-model/src/main/java/com/cool/store/entity/contract/ContractCostDO.java @@ -0,0 +1,109 @@ +package com.cool.store.entity.contract; + +import lombok.AllArgsConstructor; +import lombok.Builder; +import lombok.Data; +import lombok.NoArgsConstructor; + +import javax.persistence.*; +import java.math.BigDecimal; +import java.util.Date; + +/** + * 合同费用表 + */ +@Table(name = "zxjp_contract_cost") +@Data +@Builder +@NoArgsConstructor +@AllArgsConstructor +public class ContractCostDO { + + @Id + @GeneratedValue(strategy = GenerationType.IDENTITY) + private Long id; + + /** + * 合同编号(关联主表) + */ + @Column(name = "contract_no") + private String contractNo; + + /** + * 加盟费金额(元) + */ + @Column(name = "join_fee_amount") + private BigDecimal joinFeeAmount; + + /** + * 加盟费收费频率计数(年) + */ + @Column(name = "join_fee_frequency_years") + private BigDecimal joinFeeFrequencyYears; + + /** + * 加盟费优惠总折扣金额(元) + */ + @Column(name = "join_fee_discount_amount") + private BigDecimal joinFeeDiscountAmount; + + /** + * 加盟费优惠原因 + */ + @Column(name = "join_fee_discount_reason") + private String joinFeeDiscountReason; + + /** + * 品牌使用费金额(元) + */ + @Column(name = "brand_usage_fee_amount") + private BigDecimal brandUsageFeeAmount; + + /** + * 品牌使用费收费频率计数(年) + */ + @Column(name = "brand_usage_fee_frequency_years") + private BigDecimal brandUsageFeeFrequencyYears; + + /** + * 品牌管理费金额(元) + */ + @Column(name = "brand_management_fee_amount") + private BigDecimal brandManagementFeeAmount; + + /** + * 品牌管理费收费频率计数(年) + */ + @Column(name = "brand_management_fee_frequency_years") + private BigDecimal brandManagementFeeFrequencyYears; + + /** + * 设计费金额(元) + */ + @Column(name = "design_fee_amount") + private BigDecimal designFeeAmount; + + /** + * 系统使用费金额(元) + */ + @Column(name = "system_usage_fee_amount") + private BigDecimal systemUsageFeeAmount; + + /** + * 履约保证金金额(元) + */ + @Column(name = "performance_bond_amount") + private BigDecimal performanceBondAmount; + + /** + * 创建时间 + */ + @Column(name = "created_time") + private Date createdTime; + + /** + * 更新时间 + */ + @Column(name = "updated_time") + private Date updatedTime; +} diff --git a/coolstore-partner-model/src/main/java/com/cool/store/entity/contract/ContractMasterDO.java b/coolstore-partner-model/src/main/java/com/cool/store/entity/contract/ContractMasterDO.java new file mode 100644 index 000000000..bbf29504f --- /dev/null +++ b/coolstore-partner-model/src/main/java/com/cool/store/entity/contract/ContractMasterDO.java @@ -0,0 +1,139 @@ +package com.cool.store.entity.contract; + +import lombok.AllArgsConstructor; +import lombok.Builder; +import lombok.Data; +import lombok.NoArgsConstructor; + +import javax.persistence.*; +import java.math.BigDecimal; +import java.util.Date; + +/** + * 合同主表 + */ +@Table(name = "zxjp_contract_master") +@Data +@Builder +@NoArgsConstructor +@AllArgsConstructor +public class ContractMasterDO { + + @Id + @GeneratedValue(strategy = GenerationType.IDENTITY) + private Long id; + + /** + * 合同类型(新签/续签/变更) + */ + @Column(name = "contract_type") + private String contractType; + + /** + * 合同编号 + */ + @Column(name = "contract_no") + private String contractNo; + + /** + * 门店ID + */ + @Column(name = "store_id") + private String storeId; + + /** + * 门店编码 + */ + @Column(name = "store_code") + private String storeCode; + + /** + * 加盟品牌 + */ + @Column(name = "brand_name") + private String brandName; + + /** + * 加盟来源 + */ + @Column(name = "source") + private String source; + + /** + * 签约形式 + */ + @Column(name = "sign_form") + private String signForm; + + /** + * 合同时长(年) + */ + @Column(name = "contract_years") + private BigDecimal contractYears; + + /** + * 合同开始日期 + */ + @Column(name = "start_date") + private Date startDate; + + /** + * 合同结束日期 + */ + @Column(name = "end_date") + private Date endDate; + + /** + * 合同状态(1-生效中/2-已终止/3-已到期) + */ + @Column(name = "contract_status") + private String contractStatus; + + /** + * 货币单位 + */ + @Column(name = "currency") + private String currency; + + /** + * 合同签订日期 + */ + @Column(name = "sign_date") + private Date signDate; + + /** + * 关联合同编号(原合同编号) + */ + @Column(name = "related_contract_no") + private String relatedContractNo; + + /** + * 合同备注说明 + */ + @Column(name = "remark") + private String remark; + + /** + * 是否已生成续签申请(0-否,1-是) + */ + @Column(name = "renewal_created") + private Integer renewalCreated; + + /** + * 创建人 + */ + @Column(name = "create_user_id") + private String createUserId; + + /** + * 创建时间 + */ + @Column(name = "created_time") + private Date createdTime; + + /** + * 更新时间 + */ + @Column(name = "updated_time") + private Date updatedTime; +} diff --git a/coolstore-partner-model/src/main/java/com/cool/store/entity/exam/ExamAttemptAnswerDO.java b/coolstore-partner-model/src/main/java/com/cool/store/entity/exam/ExamAttemptAnswerDO.java new file mode 100644 index 000000000..31d67f215 --- /dev/null +++ b/coolstore-partner-model/src/main/java/com/cool/store/entity/exam/ExamAttemptAnswerDO.java @@ -0,0 +1,68 @@ +package com.cool.store.entity.exam; + +import lombok.Data; + +import java.math.BigDecimal; +import java.util.Date; +import javax.persistence.*; + +/** + * 考试答卷答题记录 + */ +@Data +@Table(name = "zxjp_exam_attempt_answer") +public class ExamAttemptAnswerDO { + /** + * id + */ + @Id + @GeneratedValue(strategy = GenerationType.IDENTITY) + private Long id; + + /** + * 答卷id + */ + @Column(name = "attempt_id") + private Long attemptId; + + /** + * 试卷id + */ + @Column(name = "paper_id") + private Long paperId; + + /** + * 试卷题目id + */ + @Column(name = "paper_question_id") + private Long paperQuestionId; + + /** + * 答案 + */ + private String answer; + + /** + * 得分 + */ + private BigDecimal score; + + /** + * 创建人id + */ + @Column(name = "create_user_id") + private String createUserId; + + /** + * 创建时间 + */ + @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/exam/ExamAttemptDO.java b/coolstore-partner-model/src/main/java/com/cool/store/entity/exam/ExamAttemptDO.java new file mode 100644 index 000000000..74573829f --- /dev/null +++ b/coolstore-partner-model/src/main/java/com/cool/store/entity/exam/ExamAttemptDO.java @@ -0,0 +1,103 @@ +package com.cool.store.entity.exam; + +import lombok.Data; + +import java.math.BigDecimal; +import java.util.Date; +import javax.persistence.*; + +/** + * 考试答卷 + */ +@Data +@Table(name = "zxjp_exam_attempt") +public class ExamAttemptDO { + /** + * id + */ + @Id + @GeneratedValue(strategy = GenerationType.IDENTITY) + private Long id; + + /** + * 考试id + */ + @Column(name = "exam_id") + private Long examId; + + /** + * 试卷id + */ + @Column(name = "paper_id") + private Long paperId; + + /** + * 考生姓名 + */ + private String name; + + /** + * 考生手机号 + */ + private String mobile; + + /** + * 用户id + */ + @Column(name = "user_id") + private String userId; + + /** + * 考试开始时间 + */ + @Column(name = "start_time") + private Date startTime; + + /** + * 考试结束时间 + */ + @Column(name = "end_time") + private Date endTime; + + /** + * 考试截止时间 + */ + @Column(name = "deadline_time") + private Date deadlineTime; + + /** + * 状态,0-进行中 1-已完成 + */ + private Integer status; + + /** + * 提交类型,0-主动提交 1-超时自动提交 + */ + @Column(name = "submit_type") + private Integer submitType; + + /** + * 总得分 + */ + @Column(name = "total_score") + private BigDecimal totalScore; + + /** + * 创建人id + */ + @Column(name = "create_user_id") + private String createUserId; + + /** + * 创建时间 + */ + @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/exam/ExamInfoDO.java b/coolstore-partner-model/src/main/java/com/cool/store/entity/exam/ExamInfoDO.java new file mode 100644 index 000000000..38dc6e3a4 --- /dev/null +++ b/coolstore-partner-model/src/main/java/com/cool/store/entity/exam/ExamInfoDO.java @@ -0,0 +1,90 @@ +package com.cool.store.entity.exam; + +import lombok.Data; + +import java.util.Date; +import javax.persistence.*; + +/** + * 考试信息 + */ +@Data +@Table(name = "zxjp_exam_info") +public class ExamInfoDO { + /** + * id + */ + @Id + @GeneratedValue(strategy = GenerationType.IDENTITY) + private Long id; + + /** + * 试卷id + */ + @Column(name = "paper_id") + private Long paperId; + + /** + * 考试名称 + */ + @Column(name = "exam_name") + private String examName; + + /** + * 开始时间 + */ + @Column(name = "start_time") + private Date startTime; + + /** + * 结束时间 + */ + @Column(name = "end_time") + private Date endTime; + + /** + * 持续时间 + */ + @Column(name = "duration_minutes") + private Integer durationMinutes; + + /** + * 状态,0-未发布 1-已发布 2-已结束 + */ + private Integer status; + + /** + * 链接令牌 + */ + @Column(name = "entry_token") + private String entryToken; + + /** + * 二维码地址 + */ + @Column(name = "qrcode_url") + private String qrcodeUrl; + + /** + * 创建人id + */ + @Column(name = "create_user_id") + private String createUserId; + + /** + * 创建时间 + */ + @Column(name = "create_time") + private Date createTime; + + /** + * 更新时间 + */ + @Column(name = "update_time") + private Date updateTime; + + /** + * 是否删除 0否1是 + */ + private Integer deleted; +} \ No newline at end of file diff --git a/coolstore-partner-model/src/main/java/com/cool/store/entity/exam/ExamPaperDO.java b/coolstore-partner-model/src/main/java/com/cool/store/entity/exam/ExamPaperDO.java new file mode 100644 index 000000000..3ad8d3c90 --- /dev/null +++ b/coolstore-partner-model/src/main/java/com/cool/store/entity/exam/ExamPaperDO.java @@ -0,0 +1,72 @@ +package com.cool.store.entity.exam; + +import lombok.Data; + +import java.math.BigDecimal; +import java.util.Date; +import javax.persistence.*; + +/** + * 考试试卷 + */ +@Data +@Table(name = "zxjp_exam_paper") +public class ExamPaperDO { + /** + * id + */ + @Id + @GeneratedValue(strategy = GenerationType.IDENTITY) + private Long id; + + /** + * 试卷名称 + */ + @Column(name = "paper_name") + private String paperName; + + /** + * 描述 + */ + private String description; + + /** + * 总分 + */ + @Column(name = "total_score") + private BigDecimal totalScore; + + /** + * 是否启用,0-否 1-是 + */ + private Integer enable; + + /** + * 是否已开始考试,0-否 1-是 + */ + @Column(name = "start_exam") + private Integer startExam; + + /** + * 创建人id + */ + @Column(name = "create_user_id") + private String createUserId; + + /** + * 创建时间 + */ + @Column(name = "create_time") + private Date createTime; + + /** + * 更新时间 + */ + @Column(name = "update_time") + private Date updateTime; + + /** + * 是否删除 0否1是 + */ + private Integer deleted; +} \ No newline at end of file diff --git a/coolstore-partner-model/src/main/java/com/cool/store/entity/exam/ExamPaperQuestionDO.java b/coolstore-partner-model/src/main/java/com/cool/store/entity/exam/ExamPaperQuestionDO.java new file mode 100644 index 000000000..8f656a37e --- /dev/null +++ b/coolstore-partner-model/src/main/java/com/cool/store/entity/exam/ExamPaperQuestionDO.java @@ -0,0 +1,92 @@ +package com.cool.store.entity.exam; + +import lombok.Data; + +import java.math.BigDecimal; +import java.util.Date; +import javax.persistence.*; + +/** + * 考试试卷题目 + */ +@Data +@Table(name = "zxjp_exam_paper_question") +public class ExamPaperQuestionDO { + /** + * id + */ + @Id + @GeneratedValue(strategy = GenerationType.IDENTITY) + private Long id; + + /** + * 试卷id + */ + @Column(name = "paper_id") + private Long paperId; + + /** + * 题目id + */ + @Column(name = "question_id") + private Long questionId; + + /** + * 题目类型,1-单选 2-多选 3-判断 + */ + private Integer type; + + /** + * 难度 + */ + private Integer difficulty; + + /** + * 答案 + */ + private String answer; + + /** + * 分值 + */ + private BigDecimal score; + + /** + * 创建人id + */ + @Column(name = "create_user_id") + private String createUserId; + + /** + * 创建时间 + */ + @Column(name = "create_time") + private Date createTime; + + /** + * 更新时间 + */ + @Column(name = "update_time") + private Date updateTime; + + /** + * 是否删除 0否1是 + */ + private Integer deleted; + + /** + * 题干 + */ + @Column(name = "question_stem") + private String questionStem; + + /** + * 解析 + */ + private String analysis; + + /** + * 题目选项(JSON格式) + */ + private String options; +} \ No newline at end of file diff --git a/coolstore-partner-model/src/main/java/com/cool/store/entity/exam/ExamQuestionDO.java b/coolstore-partner-model/src/main/java/com/cool/store/entity/exam/ExamQuestionDO.java new file mode 100644 index 000000000..d365a8c43 --- /dev/null +++ b/coolstore-partner-model/src/main/java/com/cool/store/entity/exam/ExamQuestionDO.java @@ -0,0 +1,86 @@ +package com.cool.store.entity.exam; + +import lombok.Data; + +import java.math.BigDecimal; +import java.util.Date; +import javax.persistence.*; + +/** + * 考试题目 + */ +@Data +@Table(name = "zxjp_exam_question") +public class ExamQuestionDO { + /** + * id + */ + @Id + @GeneratedValue(strategy = GenerationType.IDENTITY) + private Long id; + + /** + * 题目类型,1-单选 2-多选 3-判断 + */ + private Integer type; + + /** + * 难度 + */ + private Integer difficulty; + + /** + * 是否启用,0-否 1-是 + */ + private Integer enable; + + /** + * 答案 + */ + private String answer; + + /** + * 分值 + */ + private BigDecimal score; + + /** + * 创建人id + */ + @Column(name = "create_user_id") + private String createUserId; + + /** + * 创建时间 + */ + @Column(name = "create_time") + private Date createTime; + + /** + * 更新时间 + */ + @Column(name = "update_time") + private Date updateTime; + + /** + * 是否删除 0否1是 + */ + private Integer deleted; + + /** + * 题干 + */ + @Column(name = "question_stem") + private String questionStem; + + /** + * 解析 + */ + private String analysis; + + /** + * 题目选项(JSON格式) + * 格式: [{"label":"A","content":"选项内容"},{"label":"B","content":"选项内容"}] + */ + private String options; +} diff --git a/coolstore-partner-model/src/main/java/com/cool/store/entity/renewal/RenewalApplicationDO.java b/coolstore-partner-model/src/main/java/com/cool/store/entity/renewal/RenewalApplicationDO.java new file mode 100644 index 000000000..2a082d6fd --- /dev/null +++ b/coolstore-partner-model/src/main/java/com/cool/store/entity/renewal/RenewalApplicationDO.java @@ -0,0 +1,108 @@ +package com.cool.store.entity.renewal; + +import lombok.AllArgsConstructor; +import lombok.Builder; +import lombok.Data; +import lombok.NoArgsConstructor; + +import javax.persistence.*; +import java.util.Date; + +/** + * 续签申请表 + */ +@Table(name = "zxjp_renewal_application") +@Data +@Builder +@NoArgsConstructor +@AllArgsConstructor +public class RenewalApplicationDO { + + @Id + @GeneratedValue(strategy = GenerationType.IDENTITY) + private Long id; + + /** + * 申请编号 + */ + @Column(name = "application_no") + private String applicationNo; + + /** + * 门店编号 + */ + @Column(name = "store_code") + private String storeCode; + + /** + * 原合同编号 + */ + @Column(name = "original_contract_no") + private String originalContractNo; + + /** + * 原合同到期时间 + */ + @Column(name = "contract_expire_date") + private Date contractExpireDate; + + /** + * 是否删除(0-否,1-是) + */ + @Column(name = "is_deleted") + private Integer isDeleted; + + /** + * 状态 + */ + @Column(name = "status") + private Integer status; + + /** + * 其他方式 1-返回加盟商确认节点 2-转让 3-闭店 + */ + @Column(name = "other_method") + private Integer otherMethod; + + /** + * 是否翻新(0-否,1-是) + */ + @Column(name = "is_renovate") + private Integer isRenovate; + + /** + * 申请时间 + */ + @Column(name = "apply_time") + private Date applyTime; + + /** + * 备注 + */ + @Column(name = "remark") + private String remark; + + /** + * 创建人名称 + */ + @Column(name = "create_user_name") + private String createUserName; + + /** + * 创建人 + */ + @Column(name = "create_user_id") + private String createUserId; + + /** + * 创建时间 + */ + @Column(name = "created_time") + private Date createdTime; + + /** + * 更新时间 + */ + @Column(name = "updated_time") + private Date updatedTime; +} diff --git a/coolstore-partner-model/src/main/java/com/cool/store/entity/renewal/RenewalApplicationSignerInfoDO.java b/coolstore-partner-model/src/main/java/com/cool/store/entity/renewal/RenewalApplicationSignerInfoDO.java new file mode 100644 index 000000000..16b411d07 --- /dev/null +++ b/coolstore-partner-model/src/main/java/com/cool/store/entity/renewal/RenewalApplicationSignerInfoDO.java @@ -0,0 +1,58 @@ +package com.cool.store.entity.renewal; + +import io.swagger.annotations.ApiModelProperty; +import lombok.AllArgsConstructor; +import lombok.Builder; +import lombok.Data; +import lombok.NoArgsConstructor; + +import javax.persistence.Column; +import javax.persistence.Table; +import java.io.Serializable; +import java.util.Date; + +/** + * 续签申请签约人信息快照表 + * + * @author zx + * @date 2026-04-28 + */ +@Data +@Builder +@NoArgsConstructor +@AllArgsConstructor +@Table(name = "zxjp_renewal_application_signer_info") +public class RenewalApplicationSignerInfoDO implements Serializable { + + @ApiModelProperty("主键ID") + @Column(name = "id") + private Long id; + + @ApiModelProperty("续约申请编号") + @Column(name = "application_no") + private String applicationNo; + + @ApiModelProperty("签约人1姓名") + @Column(name = "signer1_name") + private String signer1Name; + + @ApiModelProperty("签约人1手机号") + @Column(name = "signer1_mobile") + private String signer1Mobile; + + @ApiModelProperty("签约人2姓名") + @Column(name = "signer2_name") + private String signer2Name; + + @ApiModelProperty("签约人2手机号") + @Column(name = "signer2_mobile") + private String signer2Mobile; + + @ApiModelProperty("创建时间") + @Column(name = "created_time") + private Date createdTime; + + @ApiModelProperty("更新时间") + @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/renewal/RenewalRenovateApprovalDO.java b/coolstore-partner-model/src/main/java/com/cool/store/entity/renewal/RenewalRenovateApprovalDO.java new file mode 100644 index 000000000..4697f3cb5 --- /dev/null +++ b/coolstore-partner-model/src/main/java/com/cool/store/entity/renewal/RenewalRenovateApprovalDO.java @@ -0,0 +1,84 @@ +package com.cool.store.entity.renewal; + +import lombok.AllArgsConstructor; +import lombok.Builder; +import lombok.Data; +import lombok.NoArgsConstructor; + +import javax.persistence.*; +import java.util.Date; + +/** + * 续签翻新信息表 + */ +@Table(name = "zxjp_renewal_renovate_approval") +@Data +@Builder +@NoArgsConstructor +@AllArgsConstructor +public class RenewalRenovateApprovalDO { + + @Id + @GeneratedValue(strategy = GenerationType.IDENTITY) + private Long id; + + /** + * 续签申请编号 + */ + @Column(name = "application_no") + private String applicationNo; + + /** + * 门店所在区域 + */ + @Column(name = "shop_area_id") + private Long shopAreaId; + + /** + * 装修属性 + */ + @Column(name = "decoration_attributes") + private String decorationAttributes; + + /** + * 装修等级 + */ + @Column(name = "decoration_level") + private String decorationLevel; + + /** + * 装修设计要求 + */ + @Column(name = "decoration_requirement") + private String decorationRequirement; + + /** + * 特殊情况说明 + */ + @Column(name = "special_instruction") + private String specialInstruction; + + /** + * 店内360°视频URL + */ + @Column(name = "video_url") + private String videoUrl; + + /** + * 店铺门头照片URL + */ + @Column(name = "shop_front_photo_url") + private String shopFrontPhotoUrl; + + /** + * 创建时间 + */ + @Column(name = "created_time") + private Date createdTime; + + /** + * 更新时间 + */ + @Column(name = "updated_time") + private Date updatedTime; +} diff --git a/coolstore-partner-model/src/main/java/com/cool/store/entity/store/StoreBusinessReportDO.java b/coolstore-partner-model/src/main/java/com/cool/store/entity/store/StoreBusinessReportDO.java new file mode 100644 index 000000000..0be56ca11 --- /dev/null +++ b/coolstore-partner-model/src/main/java/com/cool/store/entity/store/StoreBusinessReportDO.java @@ -0,0 +1,51 @@ +package com.cool.store.entity.store; + +import io.swagger.annotations.ApiModelProperty; +import lombok.AllArgsConstructor; +import lombok.Builder; +import lombok.Data; +import lombok.NoArgsConstructor; + +import java.io.Serializable; +import java.util.Date; + +/** + * 门店营业数据报表 + * @author wangff + * @date 2026-04-28 06:58 + */ +@Data +@Builder +@NoArgsConstructor +@AllArgsConstructor +public class StoreBusinessReportDO implements Serializable { + @ApiModelProperty("id") + private Long id; + + @ApiModelProperty("加盟品牌:1-正新鸡排,2-正新三明治,3-正烧记,4-大鼓米线,5-串小妹,6-茂掌柜") + private Integer joinBrand; + + @ApiModelProperty("1-境内 2-境外") + private Integer domestic; + + @ApiModelProperty("月份") + private String date; + + @ApiModelProperty("营业门店总数") + private Integer openTotalNum;; + + @ApiModelProperty("期初门店数") + private Integer periodBeginNum; + + @ApiModelProperty("新开门店数") + private Integer newOpenNum; + + @ApiModelProperty("闭店门店数") + private Integer closeNum; + + @ApiModelProperty("期末门店数") + private Integer periodEndNum; + + @ApiModelProperty("创建时间") + private Date createTime; +} \ No newline at end of file diff --git a/coolstore-partner-model/src/main/java/com/cool/store/request/AddSignFranchiseRequest.java b/coolstore-partner-model/src/main/java/com/cool/store/request/AddSignFranchiseRequest.java index d1cca7ba5..f2975ae3c 100644 --- a/coolstore-partner-model/src/main/java/com/cool/store/request/AddSignFranchiseRequest.java +++ b/coolstore-partner-model/src/main/java/com/cool/store/request/AddSignFranchiseRequest.java @@ -154,42 +154,36 @@ public class AddSignFranchiseRequest { private String oldShopCode; @ApiModelProperty("合同加盟费") - @NotBlank(message = "合同加盟费不能为空") private String contractFranchiseFee; /** * 合同管理费 */ @ApiModelProperty("合同管理费") - @NotBlank(message = "合同管理费不能为空") private String contractManageFee; /** * 合同品牌使用费 */ @ApiModelProperty("合同品牌使用费") - @NotBlank(message = "合同品牌使用费不能为空") private String contractBrandUseFee; /** * 合同设计费 */ @ApiModelProperty("合同设计费") - @NotBlank(message = "合同设计费不能为空") private String contractPerformanceBond; /** * 合同保证金 */ @ApiModelProperty("合同保证金") - @NotBlank(message = "合同保证金不能为空") private String contractLoanMargin; /** * 合同系统使用费 */ @ApiModelProperty("合同系统使用费") - @NotBlank(message = "合同系统使用费不能为空") private String contractSysUserFee; /** diff --git a/coolstore-partner-model/src/main/java/com/cool/store/request/AdjustmentApprovalRequest.java b/coolstore-partner-model/src/main/java/com/cool/store/request/AdjustmentApprovalRequest.java new file mode 100644 index 000000000..bc31b89a7 --- /dev/null +++ b/coolstore-partner-model/src/main/java/com/cool/store/request/AdjustmentApprovalRequest.java @@ -0,0 +1,26 @@ +package com.cool.store.request; + +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +import javax.validation.constraints.NotBlank; +import javax.validation.constraints.NotNull; +import java.io.Serializable; + +/** + * 调整单审批请求 + */ +@Data +public class AdjustmentApprovalRequest implements Serializable { + + @ApiModelProperty("调整单ID") + @NotNull(message = "调整单ID不能为空") + private Long id; + + @ApiModelProperty("审批结果 1-通过 2-拒绝") + @NotNull(message = "审批结果不能为空") + private Integer approvalResult; + + @ApiModelProperty("拒绝原因(拒绝时必填)") + private String rejectReason; +} diff --git a/coolstore-partner-model/src/main/java/com/cool/store/request/AdjustmentOrderPageRequest.java b/coolstore-partner-model/src/main/java/com/cool/store/request/AdjustmentOrderPageRequest.java index b316000fe..f17da0614 100644 --- a/coolstore-partner-model/src/main/java/com/cool/store/request/AdjustmentOrderPageRequest.java +++ b/coolstore-partner-model/src/main/java/com/cool/store/request/AdjustmentOrderPageRequest.java @@ -43,6 +43,9 @@ public class AdjustmentOrderPageRequest extends PageBasicInfo implements Seriali @ApiModelProperty("认领结束时间") private Date claimEndTime; + @ApiModelProperty("创建人ID") + private String createUserId; + private String storeId; private List regionIds; diff --git a/coolstore-partner-model/src/main/java/com/cool/store/request/FranchiseFeePayOnlineRequest.java b/coolstore-partner-model/src/main/java/com/cool/store/request/FranchiseFeePayOnlineRequest.java new file mode 100644 index 000000000..23afe71aa --- /dev/null +++ b/coolstore-partner-model/src/main/java/com/cool/store/request/FranchiseFeePayOnlineRequest.java @@ -0,0 +1,32 @@ +package com.cool.store.request; + +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +import javax.validation.constraints.NotBlank; +import javax.validation.constraints.NotNull; +import java.math.BigDecimal; + +/** + * @Author: WangShuo + * @Date: 2025/06/13/14:44 + * @Version 1.0 + * @注释: + */ +@Data +public class FranchiseFeePayOnlineRequest { + + @ApiModelProperty("修改时候传") + private Long id; + @NotNull + private Long lineId; + @NotNull + private Long shopId; + @ApiModelProperty("付款人") + @NotBlank + private String payUserName; + @NotNull + @ApiModelProperty("本次缴费金额") + private BigDecimal amount; + +} diff --git a/coolstore-partner-model/src/main/java/com/cool/store/request/FranchiseFeeRequest.java b/coolstore-partner-model/src/main/java/com/cool/store/request/FranchiseFeeRequest.java index ed56f9c61..f6fe54489 100644 --- a/coolstore-partner-model/src/main/java/com/cool/store/request/FranchiseFeeRequest.java +++ b/coolstore-partner-model/src/main/java/com/cool/store/request/FranchiseFeeRequest.java @@ -6,6 +6,7 @@ import io.swagger.annotations.ApiModelProperty; import lombok.Data; import javax.validation.constraints.NotEmpty; +import javax.persistence.Column; import java.util.Date; import java.util.List; @@ -46,6 +47,13 @@ public class FranchiseFeeRequest { @ApiModelProperty("加盟费优惠原因") private String discountReason; + @ApiModelProperty("意向签约人1") + private String intendedSignatoryFirst; + + @ApiModelProperty("意向签约人2") + private String intendedSignatorySecond; + + @ApiModelProperty("收银费(系统费)(三明治使用)") private String cashierFee; @@ -71,6 +79,8 @@ public class FranchiseFeeRequest { franchiseFeeDO.setThirdYearFee(this.thirdYearFee); franchiseFeeDO.setPerformanceBond(this.performanceBond); franchiseFeeDO.setDiscountReason(this.discountReason); + franchiseFeeDO.setIntendedSignatoryFirst(this.intendedSignatoryFirst); + franchiseFeeDO.setIntendedSignatorySecond(this.intendedSignatorySecond); franchiseFeeDO.setCashierFee(this.cashierFee); return franchiseFeeDO; } diff --git a/coolstore-partner-model/src/main/java/com/cool/store/request/LinePaySubmitRequest.java b/coolstore-partner-model/src/main/java/com/cool/store/request/LinePaySubmitRequest.java index 83bdbf047..c2b465d38 100644 --- a/coolstore-partner-model/src/main/java/com/cool/store/request/LinePaySubmitRequest.java +++ b/coolstore-partner-model/src/main/java/com/cool/store/request/LinePaySubmitRequest.java @@ -2,6 +2,7 @@ package com.cool.store.request; import com.cool.store.entity.LinePayDO; import com.cool.store.enums.ClaimStatusEnum; +import com.cool.store.enums.PayStatusEnum; import com.fasterxml.jackson.annotation.JsonFormat; import io.swagger.annotations.ApiModel; import io.swagger.annotations.ApiModelProperty; @@ -15,7 +16,6 @@ import java.text.SimpleDateFormat; import java.util.Date; import java.util.Objects; -import static com.cool.store.enums.WorkflowSubStageStatusEnum.PAY_DEPOSIT_50; @Data public class LinePaySubmitRequest { @@ -88,7 +88,7 @@ public class LinePaySubmitRequest { linePayDO.setPartnerId(request.getPartnerId()); linePayDO.setShopId(request.getShopId()); linePayDO.setLineId(request.getLineId()); - linePayDO.setPayStatus(PAY_DEPOSIT_50.getCode()); + linePayDO.setPayStatus(PayStatusEnum.FEES_HAVE_BEEN_PAID_50.getCode()); linePayDO.setXgjClaimStatus(ClaimStatusEnum.TO_BE_CLAIMED.getCode()); linePayDO.setPayType(request.getPayType()); linePayDO.setPayUserName(request.getPayUserName()); diff --git a/coolstore-partner-model/src/main/java/com/cool/store/request/OpeningOperationPlanRequest.java b/coolstore-partner-model/src/main/java/com/cool/store/request/OpeningOperationPlanRequest.java index 5dbf632e3..5a1cd1371 100644 --- a/coolstore-partner-model/src/main/java/com/cool/store/request/OpeningOperationPlanRequest.java +++ b/coolstore-partner-model/src/main/java/com/cool/store/request/OpeningOperationPlanRequest.java @@ -6,6 +6,7 @@ import lombok.Data; import org.apache.commons.collections4.CollectionUtils; import org.apache.commons.lang3.StringUtils; +import java.util.Date; import java.util.List; /** @@ -17,45 +18,28 @@ import java.util.List; @Data public class OpeningOperationPlanRequest { - @ApiModelProperty("店铺id") private Long shopId; - @ApiModelProperty("0-新增/1-同步") - private Boolean planSource; - - @ApiModelProperty("调研结果") - private String surveyResult; - - @ApiModelProperty("调研结果url") - private String surveyResultUrl; - @ApiModelProperty("活动主题") private String activityTheme; - @ApiModelProperty("活动主题url") - private String activityThemeUrl; - @ApiModelProperty("筹备人员ids") private List preparationUserIds; - @ApiModelProperty("是否完成排车路线0未完成,1完成") - private Byte routeCompleted; + @ApiModelProperty("开业时间") + private Date openTime; public OpeningOperationPlanDO toOpeningOperationPlanDO() { OpeningOperationPlanDO openingOperationPlanDO = new OpeningOperationPlanDO(); openingOperationPlanDO.setShopId(this.shopId); - openingOperationPlanDO.setPlanSource(this.planSource); - openingOperationPlanDO.setSurveyResult(this.surveyResult); - openingOperationPlanDO.setSurveyResultUrl(this.surveyResultUrl); - openingOperationPlanDO.setActivityThemeUrl(this.activityThemeUrl); + openingOperationPlanDO.setOpenTime(this.getOpenTime()); openingOperationPlanDO.setPreparationUserIds(""); if (CollectionUtils.isNotEmpty(this.preparationUserIds)) { openingOperationPlanDO.setPreparationUserIds(String.join(",", this.preparationUserIds)); } openingOperationPlanDO.setActivityTheme(this.activityTheme); - openingOperationPlanDO.setRouteCompleted(this.routeCompleted); return openingOperationPlanDO; } } diff --git a/coolstore-partner-model/src/main/java/com/cool/store/request/ReceivingBankListRequest.java b/coolstore-partner-model/src/main/java/com/cool/store/request/ReceivingBankListRequest.java new file mode 100644 index 000000000..0575254f8 --- /dev/null +++ b/coolstore-partner-model/src/main/java/com/cool/store/request/ReceivingBankListRequest.java @@ -0,0 +1,23 @@ +package com.cool.store.request; + +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +import java.util.List; + +/** + * @Author: WangShuo + * @Date: 2025/06/18/18:12 + * @Version 1.0 + * @注释: + */ +@Data +public class ReceivingBankListRequest { + + @ApiModelProperty(value = "品牌") + private List franchiseBrandList; + @ApiModelProperty(value = "区域id") + private List regionIdList; + private Integer pageNum; + private Integer pageSize; +} diff --git a/coolstore-partner-model/src/main/java/com/cool/store/request/ReceivingBankRequest.java b/coolstore-partner-model/src/main/java/com/cool/store/request/ReceivingBankRequest.java new file mode 100644 index 000000000..bd21f8025 --- /dev/null +++ b/coolstore-partner-model/src/main/java/com/cool/store/request/ReceivingBankRequest.java @@ -0,0 +1,48 @@ +package com.cool.store.request; + +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +import javax.validation.constraints.NotBlank; +import javax.validation.constraints.NotNull; + +/** + * @Author: WangShuo + * @Date: 2025/06/18/17:57 + * @Version 1.0 + * @注释: + */ +@Data +public class ReceivingBankRequest { + @ApiModelProperty(value = "修改时候传") + private Long id; + + @NotNull + @ApiModelProperty(value = "区域id") + private Long regionId; + + @NotNull + @ApiModelProperty(value = "付款方式") + private Integer payType; + + @ApiModelProperty(value = "品牌") + @NotBlank + private String franchiseBrand; + + @NotBlank + @ApiModelProperty(value = "收款人") + private String payee; + + @NotBlank + @ApiModelProperty(value = "收款账户") + private String receivingAccount; + + @NotBlank + @ApiModelProperty(value = "收款银行") + private String bankName; + + @NotBlank + @ApiModelProperty(value = "收款银行开户行") + private String branchBankName; + +} diff --git a/coolstore-partner-model/src/main/java/com/cool/store/request/StoreCodeRequest.java b/coolstore-partner-model/src/main/java/com/cool/store/request/StoreCodeRequest.java new file mode 100644 index 000000000..bfa74066d --- /dev/null +++ b/coolstore-partner-model/src/main/java/com/cool/store/request/StoreCodeRequest.java @@ -0,0 +1,16 @@ +package com.cool.store.request; + +import lombok.Data; + + +/** + * @Auther zx_szh + * @Date 2026/1/7 15:23 + * @Version 1.0 + */ +@Data +public class StoreCodeRequest { + + private String storeCode; + +} diff --git a/coolstore-partner-model/src/main/java/com/cool/store/request/WithdrawApplicationRequest.java b/coolstore-partner-model/src/main/java/com/cool/store/request/WithdrawApplicationRequest.java index ffce97b24..e67b2fbac 100644 --- a/coolstore-partner-model/src/main/java/com/cool/store/request/WithdrawApplicationRequest.java +++ b/coolstore-partner-model/src/main/java/com/cool/store/request/WithdrawApplicationRequest.java @@ -35,4 +35,10 @@ public class WithdrawApplicationRequest implements Serializable { @ApiModelProperty(value = "提现账户", required = true) @NotBlank(message = "提现账户不能为空") private String accountNo; + + @ApiModelProperty(value = "门店ID") + private String relateStoreId; + + @ApiModelProperty(value = "备注") + private String remark; } diff --git a/coolstore-partner-model/src/main/java/com/cool/store/request/contract/ContractCostImportRowDTO.java b/coolstore-partner-model/src/main/java/com/cool/store/request/contract/ContractCostImportRowDTO.java new file mode 100644 index 000000000..f9448859f --- /dev/null +++ b/coolstore-partner-model/src/main/java/com/cool/store/request/contract/ContractCostImportRowDTO.java @@ -0,0 +1,31 @@ +package com.cool.store.request.contract; + +import com.alibaba.excel.annotation.ExcelProperty; +import lombok.Data; + +import java.math.BigDecimal; + +/** + * 合同费用导入行DTO + */ +@Data +public class ContractCostImportRowDTO { + + @ExcelProperty(value = "合同编号") + private String contractNo; + + @ExcelProperty(value = "费用类型") + private String feeType; + + @ExcelProperty(value = "费用金额") + private BigDecimal amount; + + @ExcelProperty(value = "收费频率(年)") + private BigDecimal chargeFrequencyYears; + + @ExcelProperty(value = "优惠折扣金额") + private BigDecimal discountAmount; + + @ExcelProperty(value = "优惠原因") + private String discountReason; +} diff --git a/coolstore-partner-model/src/main/java/com/cool/store/request/contract/ContractImportRowDTO.java b/coolstore-partner-model/src/main/java/com/cool/store/request/contract/ContractImportRowDTO.java new file mode 100644 index 000000000..1b9a48fd8 --- /dev/null +++ b/coolstore-partner-model/src/main/java/com/cool/store/request/contract/ContractImportRowDTO.java @@ -0,0 +1,85 @@ +package com.cool.store.request.contract; + +import com.alibaba.excel.annotation.ExcelProperty; +import lombok.Data; + +import java.math.BigDecimal; + +/** + * 合同导入行DTO + */ +@Data +public class ContractImportRowDTO { + + @ExcelProperty(value = "合同类型") + private String contractType; + + @ExcelProperty(value = "合同编号") + private String contractNo; + + @ExcelProperty(value = "门店编码") + private String storeCode; + + @ExcelProperty(value = "加盟品牌") + private String brandName; + + @ExcelProperty(value = "加盟来源") + private String source; + + @ExcelProperty(value = "签约形式") + private String signForm; + + @ExcelProperty(value = "合同时长(年)") + private BigDecimal contractYears; + + @ExcelProperty(value = "合同开始日期") + private String startDate; + + @ExcelProperty(value = "合同结束日期") + private String endDate; + + @ExcelProperty(value = "合同状态") + private String contractStatus; + + @ExcelProperty(value = "备注") + private String remark; + + @ExcelProperty(value = "关联合同编号") + private String relatedContractNo; + + @ExcelProperty(value = "签订日期") + private String signDate; + + @ExcelProperty(value = "加盟费金额") + private BigDecimal joinFeeAmount; + + @ExcelProperty(value = "加盟费收费频率(年)") + private BigDecimal joinFeeFrequencyYears; + + @ExcelProperty(value = "加盟费优惠折扣金额") + private BigDecimal joinFeeDiscountAmount; + + @ExcelProperty(value = "加盟费优惠原因") + private String joinFeeDiscountReason; + + @ExcelProperty(value = "品牌使用费金额") + private BigDecimal brandUsageFeeAmount; + + @ExcelProperty(value = "品牌使用费收费频率(年)") + private BigDecimal brandUsageFeeFrequencyYears; + + @ExcelProperty(value = "品牌管理费金额") + private BigDecimal brandManagementFeeAmount; + + @ExcelProperty(value = "品牌管理费收费频率(年)") + private BigDecimal brandManagementFeeFrequencyYears; + + @ExcelProperty(value = "设计费金额") + private BigDecimal designFeeAmount; + + @ExcelProperty(value = "系统使用费金额") + private BigDecimal systemUsageFeeAmount; + + @ExcelProperty(value = "履约保证金金额") + private BigDecimal performanceBondAmount; +} \ No newline at end of file diff --git a/coolstore-partner-model/src/main/java/com/cool/store/request/contract/ContractMasterQueryRequest.java b/coolstore-partner-model/src/main/java/com/cool/store/request/contract/ContractMasterQueryRequest.java new file mode 100644 index 000000000..bd8ba399a --- /dev/null +++ b/coolstore-partner-model/src/main/java/com/cool/store/request/contract/ContractMasterQueryRequest.java @@ -0,0 +1,50 @@ +package com.cool.store.request.contract; + +import com.cool.store.common.PageBasicInfo; +import lombok.Data; +import lombok.EqualsAndHashCode; + +import java.util.Date; + +/** + * 合同列表查询请求 + */ +@Data +@EqualsAndHashCode(callSuper = true) +public class ContractMasterQueryRequest extends PageBasicInfo { + + /** + * 合同编号(模糊) + */ + private String contractNo; + + /** + * 门店名称/门店编码(模糊) + */ + private String storeNameOrCode; + + /** + * 合同结束日期范围-开始 + */ + private Date endDateStart; + + /** + * 合同结束日期范围-结束 + */ + private Date endDateEnd; + + /** + * 加盟品牌 + */ + private String brandName; + + /** + * 合同类型 + */ + private String contractType; + + /** + * 是否查询门店信息(内部使用,控制SQL JOIN) + */ + private Boolean queryStore = false; +} diff --git a/coolstore-partner-model/src/main/java/com/cool/store/request/decoration/DecorationListRequest.java b/coolstore-partner-model/src/main/java/com/cool/store/request/decoration/DecorationListRequest.java index bed84411c..1a0f792fe 100644 --- a/coolstore-partner-model/src/main/java/com/cool/store/request/decoration/DecorationListRequest.java +++ b/coolstore-partner-model/src/main/java/com/cool/store/request/decoration/DecorationListRequest.java @@ -2,6 +2,7 @@ package com.cool.store.request.decoration; import com.cool.store.common.PageBasicInfo; import io.swagger.annotations.ApiModelProperty; +import io.swagger.models.auth.In; import lombok.Data; import java.util.List; diff --git a/coolstore-partner-model/src/main/java/com/cool/store/request/liepin/AddStoreEmpRequest.java b/coolstore-partner-model/src/main/java/com/cool/store/request/liepin/AddStoreEmpRequest.java new file mode 100644 index 000000000..21b09e41d --- /dev/null +++ b/coolstore-partner-model/src/main/java/com/cool/store/request/liepin/AddStoreEmpRequest.java @@ -0,0 +1,35 @@ +package com.cool.store.request.liepin; + +import io.swagger.annotations.ApiModelProperty; +import lombok.Builder; +import lombok.Data; + +/** + * @Author suzhuhong + * @Date 2025/5/23 15:16 + * @Version 1.0 + */ +@Data +@Builder +public class AddStoreEmpRequest { + + + @ApiModelProperty("企业id") + private Long tenant_id; + + @ApiModelProperty("门店id") + private Long store_id; + + @ApiModelProperty("手机号码") + private String mobile; + + @ApiModelProperty("名字") + private String nick_name; + + @ApiModelProperty("角色 1超管 2普通") + private Integer account_type; + + @ApiModelProperty("职务 1店长 2人事专员 3经理 4职员") + private Long position_id; + +} diff --git a/coolstore-partner-model/src/main/java/com/cool/store/request/liepin/AddStoreRequest.java b/coolstore-partner-model/src/main/java/com/cool/store/request/liepin/AddStoreRequest.java new file mode 100644 index 000000000..6fe5bee5e --- /dev/null +++ b/coolstore-partner-model/src/main/java/com/cool/store/request/liepin/AddStoreRequest.java @@ -0,0 +1,35 @@ +package com.cool.store.request.liepin; + +import io.swagger.annotations.ApiModelProperty; +import lombok.Builder; +import lombok.Data; + +/** + * @Author suzhuhong + * @Date 2025/5/22 19:33 + * @Version 1.0 + */ +@Data +@Builder +public class AddStoreRequest { + + @ApiModelProperty("企业ID") + private Long tenant_id; + @ApiModelProperty("门店名称") + private String store_name; + @ApiModelProperty("门店地址") + private String address; + @ApiModelProperty("门店联系人姓名") + private String contact_person_name; + @ApiModelProperty("门店联系人手机号") + private String contact_person_mobile; + @ApiModelProperty("紧急手机号") + private String exigency_mobile; + @ApiModelProperty("门头照") + private String doorplate_picture; + @ApiModelProperty("经度") + private String longitude; + @ApiModelProperty("维度") + private String latitude; + +} diff --git a/coolstore-partner-model/src/main/java/com/cool/store/request/liepin/GetAccessTokenRequest.java b/coolstore-partner-model/src/main/java/com/cool/store/request/liepin/GetAccessTokenRequest.java new file mode 100644 index 000000000..ef67a3cc2 --- /dev/null +++ b/coolstore-partner-model/src/main/java/com/cool/store/request/liepin/GetAccessTokenRequest.java @@ -0,0 +1,23 @@ +package com.cool.store.request.liepin; + +import lombok.Data; + +/** + * @Author suzhuhong + * @Date 2025/5/20 19:15 + * @Version 1.0 + */ +@Data +public class GetAccessTokenRequest { + + private Long tenant_id; + + private String mobile; + + public GetAccessTokenRequest(){} + + public GetAccessTokenRequest(Long tenant_id, String mobile) { + this.tenant_id = tenant_id; + this.mobile = mobile; + } +} diff --git a/coolstore-partner-model/src/main/java/com/cool/store/request/liepin/GetPathRequest.java b/coolstore-partner-model/src/main/java/com/cool/store/request/liepin/GetPathRequest.java new file mode 100644 index 000000000..c997889cc --- /dev/null +++ b/coolstore-partner-model/src/main/java/com/cool/store/request/liepin/GetPathRequest.java @@ -0,0 +1,22 @@ +package com.cool.store.request.liepin; + +import lombok.Builder; +import lombok.Data; + +/** + * @Author suzhuhong + * @Date 2025/5/23 16:37 + * @Version 1.0 + */ +@Data +@Builder +public class GetPathRequest { + + private String mobile; + + private Long tenant_id; + + private String store_id; + + +} diff --git a/coolstore-partner-model/src/main/java/com/cool/store/request/liepin/UploadRequest.java b/coolstore-partner-model/src/main/java/com/cool/store/request/liepin/UploadRequest.java new file mode 100644 index 000000000..7012ca146 --- /dev/null +++ b/coolstore-partner-model/src/main/java/com/cool/store/request/liepin/UploadRequest.java @@ -0,0 +1,21 @@ +package com.cool.store.request.liepin; + +import lombok.Data; + +/** + * @Author suzhuhong + * @Date 2025/5/23 17:52 + * @Version 1.0 + */ +@Data +public class UploadRequest { + + private String file_name; + + private String base64_content; + + public UploadRequest(String fileName, String base64Content) { + this.file_name = fileName; + this.base64_content = base64Content; + } +} diff --git a/coolstore-partner-model/src/main/java/com/cool/store/request/liepin/XbbGetRequest.java b/coolstore-partner-model/src/main/java/com/cool/store/request/liepin/XbbGetRequest.java new file mode 100644 index 000000000..6c46f9bfd --- /dev/null +++ b/coolstore-partner-model/src/main/java/com/cool/store/request/liepin/XbbGetRequest.java @@ -0,0 +1,115 @@ +package com.cool.store.request.liepin; + +import java.util.Map; +import java.util.concurrent.TimeUnit; + +/** + * 薪班班GET请求 + * @author sha.li + * @since 2025-03-28 15:19 + */ +public class XbbGetRequest { + /** + * 请求路径 + */ + private final String uri; + /** + * 请求参数 + */ + private final Map queryParam; + /** + * 是否需要解密响应 + */ + private final boolean responseDecrypt; + /** + * 请求超时时间,单位:毫秒, 默认30秒 + */ + private final int requestTimeout; + + public static Builder newBuilder() { + return new Builder(); + } + + private XbbGetRequest(String uri, Map queryParam, boolean responseDecrypt, int requestTimeout) { + this.uri = uri; + this.queryParam = queryParam; + this.responseDecrypt = responseDecrypt; + this.requestTimeout = requestTimeout; + } + + public String getUri() { + return uri; + } + + public Map getQueryParam() { + return queryParam; + } + + public boolean isResponseDecrypt() { + return responseDecrypt; + } + + public int getRequestTimeout() { + return requestTimeout; + } + + @Override + public String toString() { + return "XbbGetRequest{" + + "uri='" + uri + '\'' + + ", queryParam=" + queryParam + + ", responseDecrypt=" + responseDecrypt + + ", requestTimeout=" + requestTimeout + + '}'; + } + + public static final class Builder { + private String uri; + private Map queryParam; + private boolean responseDecrypt; + // 默认30秒 + private int requestTimeout = (int) TimeUnit.SECONDS.toMillis(30); + + private Builder() { + } + + public static Builder aXbbGetRequest() { + return new Builder(); + } + + public Builder uri(String uri) { + this.uri = uri; + return this; + } + + public Builder queryParam(Map queryParam) { + this.queryParam = queryParam; + return this; + } + + public Builder responseDecrypt(boolean responseDecrypt) { + this.responseDecrypt = responseDecrypt; + return this; + } + + public Builder requestTimeout(int requestTimeout) { + this.requestTimeout = requestTimeout; + return this; + } + + public XbbGetRequest build() { + return new XbbGetRequest(uri, queryParam, responseDecrypt, requestTimeout); + } + + + @Override + public String toString() { + return "Builder{" + + "uri='" + uri + '\'' + + ", queryParam=" + queryParam + + ", responseDecrypt=" + responseDecrypt + + ", requestTimeout=" + requestTimeout + + '}'; + } + } +} diff --git a/coolstore-partner-model/src/main/java/com/cool/store/request/liepin/XbbPostRequest.java b/coolstore-partner-model/src/main/java/com/cool/store/request/liepin/XbbPostRequest.java new file mode 100644 index 000000000..0484dd666 --- /dev/null +++ b/coolstore-partner-model/src/main/java/com/cool/store/request/liepin/XbbPostRequest.java @@ -0,0 +1,148 @@ +package com.cool.store.request.liepin; + +import java.util.Map; + +/** + * @author sha.li + * @since 2025-04-01 09:39 + */ +public class XbbPostRequest { + /** + * 请求路径 + */ + private final String uri; + /** + * 请求参数 + */ + private final Map queryParam; + /** + * 请求是否需要加密 + */ + private final boolean requestEncrypt; + /** + * 是否需要解密响应 + */ + private final boolean responseDecrypt; + /** + * 请求超时时间,单位:毫秒, 默认30秒 + */ + private final int requestTimeout; + /** + * 请求body + */ + private final String jsonString; + + public static Builder newBuilder() { + return new Builder().requestEncrypt(Boolean.FALSE). + responseDecrypt(Boolean.FALSE).requestTimeout(30000); + } + + + private XbbPostRequest(String uri, + Map queryParam, + boolean requestEncrypt, + boolean responseDecrypt, + int requestTimeout, + String jsonString) { + this.uri = uri; + this.queryParam = queryParam; + this.requestEncrypt = requestEncrypt; + this.responseDecrypt = responseDecrypt; + this.requestTimeout = requestTimeout; + this.jsonString = jsonString; + } + + public String getUri() { + return uri; + } + + public Map getQueryParam() { + return queryParam; + } + + public boolean isRequestEncrypt() { + return requestEncrypt; + } + + public boolean isResponseDecrypt() { + return responseDecrypt; + } + + public int getRequestTimeout() { + return requestTimeout; + } + + public String getJsonString() { + return jsonString; + } + + @Override + public String toString() { + return "XbbPostRequest{" + + "uri='" + uri + '\'' + + ", queryParam=" + queryParam + + ", requestEncrypt=" + requestEncrypt + + ", responseDecrypt=" + responseDecrypt + + ", requestTimeout=" + requestTimeout + + ", jsonString='" + jsonString + '\'' + + '}'; + } + + public static final class Builder { + private String uri; + private Map queryParam; + private boolean requestEncrypt; + private boolean responseDecrypt; + private int requestTimeout; + private String jsonString; + + private Builder() { + } + + public Builder uri(String uri) { + this.uri = uri; + return this; + } + + public Builder queryParam(Map queryParam) { + this.queryParam = queryParam; + return this; + } + + public Builder requestEncrypt(boolean requestEncrypt) { + this.requestEncrypt = requestEncrypt; + return this; + } + + public Builder responseDecrypt(boolean responseDecrypt) { + this.responseDecrypt = responseDecrypt; + return this; + } + + public Builder requestTimeout(int requestTimeout) { + this.requestTimeout = requestTimeout; + return this; + } + + public Builder jsonString(String jsonString) { + this.jsonString = jsonString; + return this; + } + + public XbbPostRequest build() { + return new XbbPostRequest(uri, queryParam, requestEncrypt, responseDecrypt, requestTimeout, jsonString); + } + + @Override + public String toString() { + return "Builder{" + + "uri='" + uri + '\'' + + ", queryParam=" + queryParam + + ", requestEncrypt=" + requestEncrypt + + ", responseDecrypt=" + responseDecrypt + + ", requestTimeout=" + requestTimeout + + ", jsonString='" + jsonString + '\'' + + '}'; + } + } +} diff --git a/coolstore-partner-model/src/main/java/com/cool/store/request/renewal/RenewalApplicationCreateRequest.java b/coolstore-partner-model/src/main/java/com/cool/store/request/renewal/RenewalApplicationCreateRequest.java new file mode 100644 index 000000000..fb35fa5b0 --- /dev/null +++ b/coolstore-partner-model/src/main/java/com/cool/store/request/renewal/RenewalApplicationCreateRequest.java @@ -0,0 +1,20 @@ +package com.cool.store.request.renewal; + +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +import javax.validation.constraints.NotBlank; + +/** + * 新增续签申请请求 + */ +@Data +public class RenewalApplicationCreateRequest { + + @ApiModelProperty("门店ID") + @NotBlank(message = "门店ID不能为空") + private String storeId; + + @ApiModelProperty("备注") + private String remark; +} diff --git a/coolstore-partner-model/src/main/java/com/cool/store/request/renewal/RenewalApplicationQueryRequest.java b/coolstore-partner-model/src/main/java/com/cool/store/request/renewal/RenewalApplicationQueryRequest.java new file mode 100644 index 000000000..12ef7f840 --- /dev/null +++ b/coolstore-partner-model/src/main/java/com/cool/store/request/renewal/RenewalApplicationQueryRequest.java @@ -0,0 +1,43 @@ +package com.cool.store.request.renewal; + +import com.cool.store.common.PageBasicInfo; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; +import lombok.EqualsAndHashCode; + +import java.util.Date; + +/** + * 续签申请列表查询请求 + */ +@Data +@EqualsAndHashCode(callSuper = true) +public class RenewalApplicationQueryRequest extends PageBasicInfo { + + @ApiModelProperty("关键字模糊查询(门店名称/门店编码)") + private String keyword; + + @ApiModelProperty("所属运营大区") + private Long regionId; + + @ApiModelProperty("合同开始时间范围-开始") + private Date contractStartDateStart; + + @ApiModelProperty("合同开始时间范围-结束") + private Date contractStartDateEnd; + + @ApiModelProperty("合同结束时间范围-开始") + private Date contractEndDateStart; + + @ApiModelProperty("合同结束时间范围-结束") + private Date contractEndDateEnd; + + @ApiModelProperty("是否翻新") + private Integer isRenovate; + + @ApiModelProperty("状态") + private Integer status; + + @ApiModelProperty("是否查询门店信息(内部使用)") + private Boolean queryStore = false; +} diff --git a/coolstore-partner-model/src/main/java/com/cool/store/request/renewal/RenewalApprovalRequest.java b/coolstore-partner-model/src/main/java/com/cool/store/request/renewal/RenewalApprovalRequest.java new file mode 100644 index 000000000..efc5cf8b8 --- /dev/null +++ b/coolstore-partner-model/src/main/java/com/cool/store/request/renewal/RenewalApprovalRequest.java @@ -0,0 +1,48 @@ +package com.cool.store.request.renewal; + +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +import javax.validation.constraints.NotNull; + +/** + * 续签审批请求(运营顾问/片区顾问/集团工程部共用) + */ +@Data +public class RenewalApprovalRequest { + + @ApiModelProperty("续签申请ID") + @NotNull(message = "续签申请ID不能为空") + private Long renewalId; + + @ApiModelProperty("是否通过") + @NotNull(message = "审批结果不能为空") + private Boolean pass; + + @ApiModelProperty("审批意见/原因") + private String remark; + + @ApiModelProperty("是否翻新(仅运营顾问审批时使用) 1-翻新 0不翻新") + private Integer isRenovate; + + @ApiModelProperty("门店所在区域(翻新时使用)") + private Long shopAreaId; + + @ApiModelProperty("装修属性(翻新时使用)") + private String decorationAttributes; + + @ApiModelProperty("装修等级(翻新时使用)") + private String decorationLevel; + + @ApiModelProperty("装修设计要求(翻新时使用)") + private String decorationRequirement; + + @ApiModelProperty("特殊情况说明(翻新时使用)") + private String specialInstruction; + + @ApiModelProperty("店内360°视频URL(翻新时使用)") + private String videoUrl; + + @ApiModelProperty("店铺门头照片URL(翻新时使用)") + private String shopFrontPhotoUrl; +} diff --git a/coolstore-partner-model/src/main/java/com/cool/store/request/renewal/RenewalFranchiseeConfirmRequest.java b/coolstore-partner-model/src/main/java/com/cool/store/request/renewal/RenewalFranchiseeConfirmRequest.java new file mode 100644 index 000000000..682622b6d --- /dev/null +++ b/coolstore-partner-model/src/main/java/com/cool/store/request/renewal/RenewalFranchiseeConfirmRequest.java @@ -0,0 +1,24 @@ +package com.cool.store.request.renewal; + +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +import javax.validation.constraints.NotNull; + +/** + * 加盟商确认续签请求 + */ +@Data +public class RenewalFranchiseeConfirmRequest { + + @ApiModelProperty("续签申请ID") + @NotNull(message = "续签申请ID不能为空") + private Long renewalId; + + @ApiModelProperty("是否确认续签(true-确认,false-不续签)") + @NotNull(message = "确认结果不能为空") + private Boolean confirmed; + + @ApiModelProperty("备注") + private String remark; +} diff --git a/coolstore-partner-model/src/main/java/com/cool/store/request/wallet/CoolTradeRecodePageRequest.java b/coolstore-partner-model/src/main/java/com/cool/store/request/wallet/CoolTradeRecodePageRequest.java index a0b45d602..8c6d7899c 100644 --- a/coolstore-partner-model/src/main/java/com/cool/store/request/wallet/CoolTradeRecodePageRequest.java +++ b/coolstore-partner-model/src/main/java/com/cool/store/request/wallet/CoolTradeRecodePageRequest.java @@ -20,10 +20,14 @@ public class CoolTradeRecodePageRequest extends PageBasicInfo { private Integer walletType; @ApiModelProperty(value = "关键字(账户名称,账户编号,业务系统付款单号,提现银行卡号)",required = true) private String keyword; + @ApiModelProperty(value = "1.转账 2.提现 3.充值",required = false) + private Integer tradeType; @ApiModelProperty(value = "关键字(门店编号,门店名称)",required = true) private String storeKeyword; @ApiModelProperty(value = "费用科目",required = true) private Integer feeItemId; + @ApiModelProperty(value = "费用科目Code",required = false) + private String expenseTypeCode; @ApiModelProperty(value = "组织ID",required = false,hidden = true) private Long orgId; @@ -37,6 +41,7 @@ public class CoolTradeRecodePageRequest extends PageBasicInfo { target.setFeeItemId(this.getFeeItemId()); target.setCurrentPage(this.getPageNum()); target.setPageSize(this.getPageSize()); + target.setTradeType(this.getTradeType()); return target; } diff --git a/coolstore-partner-model/src/main/java/com/cool/store/request/wallet/TradeRecodePageRequest.java b/coolstore-partner-model/src/main/java/com/cool/store/request/wallet/TradeRecodePageRequest.java index a5e16cad1..922a6d1d6 100644 --- a/coolstore-partner-model/src/main/java/com/cool/store/request/wallet/TradeRecodePageRequest.java +++ b/coolstore-partner-model/src/main/java/com/cool/store/request/wallet/TradeRecodePageRequest.java @@ -21,6 +21,8 @@ public class TradeRecodePageRequest { private String keyword; @ApiModelProperty(value = "关键字(门店编号,门店名称)",required = true) private String storeKeyword; + @ApiModelProperty(value = "1.转账 2.提现 3.充值",required = false) + private Integer tradeType; @ApiModelProperty(value = "费用科目",required = true) private Integer feeItemId; @ApiModelProperty(value = "当前页码",required = true) diff --git a/coolstore-partner-model/src/main/java/com/cool/store/request/xgj/CancelPayRequest.java b/coolstore-partner-model/src/main/java/com/cool/store/request/xgj/CancelPayRequest.java new file mode 100644 index 000000000..19421750c --- /dev/null +++ b/coolstore-partner-model/src/main/java/com/cool/store/request/xgj/CancelPayRequest.java @@ -0,0 +1,23 @@ +package com.cool.store.request.xgj; + +import lombok.Data; + +/** + * @Author suzhuhong + * @Date 2025/6/16 15:40 + * @Version 1.0 + */ +@Data +public class CancelPayRequest { + + private Long shopId; + + private String ReceiptId; + + public CancelPayRequest(){} + + public CancelPayRequest(Long shopId, String receiptId) { + this.shopId = shopId; + ReceiptId = receiptId; + } +} diff --git a/coolstore-partner-model/src/main/java/com/cool/store/request/xgj/OnlinePayInfoRequest.java b/coolstore-partner-model/src/main/java/com/cool/store/request/xgj/OnlinePayInfoRequest.java new file mode 100644 index 000000000..1b643bf8c --- /dev/null +++ b/coolstore-partner-model/src/main/java/com/cool/store/request/xgj/OnlinePayInfoRequest.java @@ -0,0 +1,35 @@ +package com.cool.store.request.xgj; + +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +import javax.validation.constraints.Max; +import javax.validation.constraints.Min; +import javax.validation.constraints.NotNull; +import java.math.BigDecimal; +import java.util.Date; + +/** + * 线上支付 加盟费回调 + * @Author suzhuhong + * @Date 2025/6/16 15:51 + * @Version 1.0 + */ +@Data +public class OnlinePayInfoRequest { + @ApiModelProperty("门店ID") + private Long shopId; + @ApiModelProperty("收款单ID") + private String receiptId; + @ApiModelProperty("支付状态 45-待支付 50-已缴费 55-缴费失败 60-已取消") + private Integer paymentStatus; + @Max(1)@Min(0)@NotNull + private Integer claimStatus; + @ApiModelProperty("缴费时间") + private Date payTime; + @ApiModelProperty("支付交易流水号") + private String paySerialNumber; + @ApiModelProperty("实际缴纳金额") + private BigDecimal actAmount; + +} diff --git a/coolstore-partner-model/src/main/java/com/cool/store/request/xgj/ReceiptCallBackRequest.java b/coolstore-partner-model/src/main/java/com/cool/store/request/xgj/ReceiptCallBackRequest.java index 35a5780e2..e248a0305 100644 --- a/coolstore-partner-model/src/main/java/com/cool/store/request/xgj/ReceiptCallBackRequest.java +++ b/coolstore-partner-model/src/main/java/com/cool/store/request/xgj/ReceiptCallBackRequest.java @@ -1,5 +1,6 @@ package com.cool.store.request.xgj; +import io.swagger.annotations.ApiModelProperty; import lombok.Data; import javax.validation.constraints.Max; @@ -18,9 +19,12 @@ public class ReceiptCallBackRequest { @NotBlank private String receiptId; - @Max(1)@Min(0)@NotNull + @Max(2)@Min(0)@NotNull private Integer claimStatus; + @ApiModelProperty("新管家收款单失败原因") + private String failReason; + /** * 支付方式,线下支付-0,网商钱包支付-2 */ diff --git a/coolstore-partner-model/src/main/java/com/cool/store/request/xgj/ReceiptOnlineRequest.java b/coolstore-partner-model/src/main/java/com/cool/store/request/xgj/ReceiptOnlineRequest.java new file mode 100644 index 000000000..8e8d8a710 --- /dev/null +++ b/coolstore-partner-model/src/main/java/com/cool/store/request/xgj/ReceiptOnlineRequest.java @@ -0,0 +1,55 @@ +package com.cool.store.request.xgj; + +import com.cool.store.entity.LinePayDO; +import lombok.Data; + +import java.math.BigDecimal; + +/** + * @Author suzhuhong + * @Date 2025/6/26 15:29 + * @Version 1.0 + */ +@Data +public class ReceiptOnlineRequest { + + private Long shopId; + + private Integer billId; + + private String receiptId; + + private String payer1; + + private BigDecimal paymentAmount; + + private Integer payWay ; + + private Integer claimStatus; + + private Integer paymentStatus; + + //收款方 + private String payee; + //收款方账户 + private String receivingAccount; + //收款银行 + private String bankName; + //收款银行开户行 + private String branchBankName; + + public ReceiptOnlineRequest() { + } + public ReceiptOnlineRequest(Long shopId, Integer billId, LinePayDO payDO) { + this.shopId = shopId; + this.billId = billId; + this.receiptId = payDO.getPaymentReceiptCode(); + this.payer1 = payDO.getPayUserName(); + this.paymentAmount = payDO.getAmount(); + this.payWay = payDO.getPayType()==3?1:0; + this.claimStatus = payDO.getXgjClaimStatus(); + this.paymentStatus = payDO.getPayStatus(); + } + +} + 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 index 953dac111..b6d7209ee 100644 --- 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 @@ -1,6 +1,5 @@ package com.cool.store.request.xgj; -import com.cool.store.utils.UUIDUtils; import io.swagger.annotations.ApiModelProperty; import lombok.Data; diff --git a/coolstore-partner-model/src/main/java/com/cool/store/response/AddSignFranchiseResponse.java b/coolstore-partner-model/src/main/java/com/cool/store/response/AddSignFranchiseResponse.java index f317cfea7..cf85e77ac 100644 --- a/coolstore-partner-model/src/main/java/com/cool/store/response/AddSignFranchiseResponse.java +++ b/coolstore-partner-model/src/main/java/com/cool/store/response/AddSignFranchiseResponse.java @@ -250,6 +250,9 @@ public class AddSignFranchiseResponse { @ApiModelProperty("老店编码 签约类型选择老店转加盟时有") private String oldShopCode; + @ApiModelProperty("收银费(系统费)大写") + private String bigCashierFee; + @ApiModelProperty("合同加盟费") @NotBlank(message = "合同加盟费不能为空") private String contractFranchiseFee; @@ -326,8 +329,6 @@ public class AddSignFranchiseResponse { */ @ApiModelProperty("加盟费折扣金额") private String discountAmount; - @ApiModelProperty("收银费(系统费)大写") - private String bigCashierFee; @Column(name = "currency") private String currency; diff --git a/coolstore-partner-model/src/main/java/com/cool/store/response/AdjustmentOrderResponse.java b/coolstore-partner-model/src/main/java/com/cool/store/response/AdjustmentOrderResponse.java index 166ca2074..e71b801ec 100644 --- a/coolstore-partner-model/src/main/java/com/cool/store/response/AdjustmentOrderResponse.java +++ b/coolstore-partner-model/src/main/java/com/cool/store/response/AdjustmentOrderResponse.java @@ -8,6 +8,7 @@ import com.cool.store.annotation.DictField; import com.cool.store.converter.StringListConverter; import com.cool.store.enums.wallet.AdjustTypeEnum; import com.cool.store.enums.wallet.DocStatusEnum; +import com.cool.store.utils.BigDecimalUtils; import io.swagger.annotations.ApiModelProperty; import lombok.Data; @@ -157,6 +158,11 @@ public class AdjustmentOrderResponse implements Serializable { @ColumnWidth(30) private Date payTime; + @ApiModelProperty("拒绝原因") + @ExcelProperty(value = "拒绝原因", order = 21) + @ColumnWidth(30) + private String rejectReason; + @ApiModelProperty("费用单类型 1-费用单 2-调整单") @ExcelIgnore private Integer expenseSheetType; @@ -170,4 +176,12 @@ public class AdjustmentOrderResponse implements Serializable { DocStatusEnum docStatusEnum = DocStatusEnum.fromStatus(this.status); return docStatusEnum!=null?docStatusEnum.getDesc():""; } + + public BigDecimal getAdjustAmount() { + if (this.adjustType!=null && this.adjustType==2){ + return BigDecimal.ZERO.subtract(this.adjustAmount); + } + return this.adjustAmount; + } + } diff --git a/coolstore-partner-model/src/main/java/com/cool/store/response/FranchiseFeePayInfoResponse.java b/coolstore-partner-model/src/main/java/com/cool/store/response/FranchiseFeePayInfoResponse.java index 107da5836..33a2589fa 100644 --- a/coolstore-partner-model/src/main/java/com/cool/store/response/FranchiseFeePayInfoResponse.java +++ b/coolstore-partner-model/src/main/java/com/cool/store/response/FranchiseFeePayInfoResponse.java @@ -66,7 +66,7 @@ public class FranchiseFeePayInfoResponse { @ApiModelProperty("提交时间") private Date createTime; - @ApiModelProperty("认领状态 0-待认领 1-已认领") + @ApiModelProperty("认领状态 0-待认领 1-已认领,2-认领失败") private Integer xgjClaimStatus; @ApiModelProperty("支付状态 45:待缴费 50:已缴费") @@ -74,4 +74,7 @@ public class FranchiseFeePayInfoResponse { @ApiModelProperty("付款单编号") private String paymentReceiptCode; + + @ApiModelProperty("新管家认领失败原因") + private String xgjFailReason; } diff --git a/coolstore-partner-model/src/main/java/com/cool/store/response/FranchiseFeePayOnlineResponse.java b/coolstore-partner-model/src/main/java/com/cool/store/response/FranchiseFeePayOnlineResponse.java new file mode 100644 index 000000000..a07522637 --- /dev/null +++ b/coolstore-partner-model/src/main/java/com/cool/store/response/FranchiseFeePayOnlineResponse.java @@ -0,0 +1,17 @@ +package com.cool.store.response; + +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +/** + * @Author: WangShuo + * @Date: 2025/06/16/16:09 + * @Version 1.0 + * @注释: + */ +@Data +public class FranchiseFeePayOnlineResponse { + private Long shopId; + @ApiModelProperty("付款单编码(系统生成)") + private String paymentReceiptCode; +} diff --git a/coolstore-partner-model/src/main/java/com/cool/store/response/FranchiseFeeResponse.java b/coolstore-partner-model/src/main/java/com/cool/store/response/FranchiseFeeResponse.java index 0028073cb..f57014b18 100644 --- a/coolstore-partner-model/src/main/java/com/cool/store/response/FranchiseFeeResponse.java +++ b/coolstore-partner-model/src/main/java/com/cool/store/response/FranchiseFeeResponse.java @@ -65,6 +65,13 @@ public class FranchiseFeeResponse { @ApiModelProperty("新管家已缴金额") private BigDecimal xgjFeesPaid; + @ApiModelProperty("意向签约人1") + private String intendedSignatoryFirst; + + @ApiModelProperty("意向签约人2") + private String intendedSignatorySecond; + + @ApiModelProperty("收银费(系统费)") private String cashierFee; @@ -218,6 +225,10 @@ public class FranchiseFeeResponse { franchiseFeeResponse.setXgjCollectionStatus(franchiseFeeDO.getXgjCollectionStatus()); franchiseFeeResponse.setXgjRemainderPayableAmount(franchiseFeeDO.getXgjRemainderPayableAmount()); franchiseFeeResponse.setXgjFeesPaid(franchiseFeeDO.getXgjFeesPaid()); + franchiseFeeResponse.setPayType(franchiseFeeDO.getPayType()); + franchiseFeeResponse.setIntendedSignatoryFirst(franchiseFeeDO.getIntendedSignatoryFirst()); + franchiseFeeResponse.setIntendedSignatorySecond(franchiseFeeDO.getIntendedSignatorySecond()); + franchiseFeeResponse.setIsRefund(franchiseFeeDO.getIsRefund()); franchiseFeeResponse.setCashierFee(franchiseFeeDO.getCashierFee()); franchiseFeeResponse.setPayType(franchiseFeeDO.getPayType()); franchiseFeeResponse.setIsRefund(franchiseFeeDO.getIsRefund()); diff --git a/coolstore-partner-model/src/main/java/com/cool/store/response/OrderSummaryResponse.java b/coolstore-partner-model/src/main/java/com/cool/store/response/OrderSummaryResponse.java index 774d3ba0b..96669cedf 100644 --- a/coolstore-partner-model/src/main/java/com/cool/store/response/OrderSummaryResponse.java +++ b/coolstore-partner-model/src/main/java/com/cool/store/response/OrderSummaryResponse.java @@ -33,6 +33,43 @@ public class OrderSummaryResponse { private Boolean is_cache; @ApiModelProperty("废弃") private Integer cache_refresh_time; + + + public static BigDecimal calculateExpectedIncome(OrderSummaryResponse response) { + BigDecimal posIncome = calculatePosIncome(response.getPos_data()); + BigDecimal takeawayIncome = response.getTakeaway_data() != null && response.getTakeaway_data().getTotal_pre_income() != null + ? response.getTakeaway_data().getTotal_pre_income() + : BigDecimal.ZERO; + BigDecimal appIncome = response.getWenma_app_data() != null && response.getWenma_app_data().getTotal_pre_income() != null + ? response.getWenma_app_data().getTotal_pre_income() + : BigDecimal.ZERO; + + return posIncome.add(takeawayIncome).add(appIncome); + } + + private static BigDecimal calculatePosIncome(PosData posData) { + if (posData == null) { + return BigDecimal.ZERO; + } + + BigDecimal profitTotalAmount = posData.getProfit_total_amount() != null + ? posData.getProfit_total_amount() + : BigDecimal.ZERO; + BigDecimal merchantContribute = posData.getOut_discount_merchant_contribute_total_amount() != null + ? posData.getOut_discount_merchant_contribute_total_amount() + : BigDecimal.ZERO; + BigDecimal logisticsCost = posData.getLogistics_cost_price_total_amount() != null + ? posData.getLogistics_cost_price_total_amount() + : BigDecimal.ZERO; + BigDecimal subsidy = posData.getSubsidy_total_amount() != null + ? posData.getSubsidy_total_amount() + : BigDecimal.ZERO; + + return profitTotalAmount + .subtract(merchantContribute) + .subtract(logisticsCost) + .add(subsidy); + } } // POS数据实体类 @@ -83,7 +120,7 @@ class TakeawayData { @ApiModelProperty("废弃") private BigDecimal total_deliver_fee; @ApiModelProperty("预计收入 统计时间内,今日下单订单的预收之和,不包含已取消和全额退款订单") - private BigDecimal total_pre_income; + public BigDecimal total_pre_income; @ApiModelProperty("营业额 统计时间内,包含商品销售额、餐盒费、自配送费之和") private BigDecimal total_sales_price; @ApiModelProperty("有效订单笔数 统计时间内,今日下单订单数量,不包含取消订单与全部退款订单") diff --git a/coolstore-partner-model/src/main/java/com/cool/store/response/ReceivingBankResponse.java b/coolstore-partner-model/src/main/java/com/cool/store/response/ReceivingBankResponse.java new file mode 100644 index 000000000..ff179233b --- /dev/null +++ b/coolstore-partner-model/src/main/java/com/cool/store/response/ReceivingBankResponse.java @@ -0,0 +1,58 @@ +package com.cool.store.response; + +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +import javax.validation.constraints.NotBlank; +import javax.validation.constraints.NotNull; +import java.util.Date; + +/** + * @Author: WangShuo + * @Date: 2025/06/18/18:06 + * @Version 1.0 + * @注释: + */ +@Data +public class ReceivingBankResponse { + private Long id; + + @ApiModelProperty(value = "品牌") + private String franchiseBrand; + + @ApiModelProperty(value = "加盟集团") + private String group; + + @ApiModelProperty(value = "大区id") + private Long regionId; + + @ApiModelProperty(value = "大区名字") + private String regionName; + + @ApiModelProperty(value = "付款方式") + private Integer payType; + + @ApiModelProperty(value = "收款人") + private String payee; + + @ApiModelProperty(value = "收款账户") + private String receivingAccount; + + @ApiModelProperty(value = "收款银行") + private String bankName; + + @ApiModelProperty(value = "收款银行开户行") + private String branchBankName; + + @ApiModelProperty(value = "创建时间") + private Date createTime; + + @ApiModelProperty(value = "创建人") + private String createUserName; + + @ApiModelProperty(value = "更新时间") + private Date updateTime; + + @ApiModelProperty(value = "更新人") + private String updateUserName; +} diff --git a/coolstore-partner-model/src/main/java/com/cool/store/response/WithdrawApplicationResponse.java b/coolstore-partner-model/src/main/java/com/cool/store/response/WithdrawApplicationResponse.java index 387841ca5..3992e9a4c 100644 --- a/coolstore-partner-model/src/main/java/com/cool/store/response/WithdrawApplicationResponse.java +++ b/coolstore-partner-model/src/main/java/com/cool/store/response/WithdrawApplicationResponse.java @@ -50,4 +50,13 @@ public class WithdrawApplicationResponse implements Serializable { @ApiModelProperty("更新时间") private Date updateTime; + + @ApiModelProperty("门店ID") + private String relateStoreId; + + @ApiModelProperty("门店名称") + private String relateStoreName; + + @ApiModelProperty("备注") + private String remark; } diff --git a/coolstore-partner-model/src/main/java/com/cool/store/response/liepin/FileResponse.java b/coolstore-partner-model/src/main/java/com/cool/store/response/liepin/FileResponse.java new file mode 100644 index 000000000..0d23d01d0 --- /dev/null +++ b/coolstore-partner-model/src/main/java/com/cool/store/response/liepin/FileResponse.java @@ -0,0 +1,15 @@ +package com.cool.store.response.liepin; + +import lombok.Data; + +/** + * @Author suzhuhong + * @Date 2025/5/23 17:56 + * @Version 1.0 + */ +@Data +public class FileResponse { + + private String file_id; + +} diff --git a/coolstore-partner-model/src/main/java/com/cool/store/response/liepin/LiePinApiResponse.java b/coolstore-partner-model/src/main/java/com/cool/store/response/liepin/LiePinApiResponse.java new file mode 100644 index 000000000..e788cc68b --- /dev/null +++ b/coolstore-partner-model/src/main/java/com/cool/store/response/liepin/LiePinApiResponse.java @@ -0,0 +1,20 @@ +package com.cool.store.response.liepin; + +import com.fasterxml.jackson.annotation.JsonIgnoreProperties; +import lombok.Data; +import org.apache.poi.ss.formula.functions.T; + +/** + * @Author suzhuhong + * @Date 2025/5/20 19:00 + * @Version 1.0 + */ +@Data +@JsonIgnoreProperties(ignoreUnknown = true) +public class LiePinApiResponse { + + private String msg; + private int code; + private Boolean is_success; + private T data; +} diff --git a/coolstore-partner-model/src/main/java/com/cool/store/response/liepin/LiePinTokenInfo.java b/coolstore-partner-model/src/main/java/com/cool/store/response/liepin/LiePinTokenInfo.java new file mode 100644 index 000000000..7df1dfdb3 --- /dev/null +++ b/coolstore-partner-model/src/main/java/com/cool/store/response/liepin/LiePinTokenInfo.java @@ -0,0 +1,18 @@ +package com.cool.store.response.liepin; + +import lombok.Data; + +/** + * @Author suzhuhong + * @Date 2025/5/20 19:01 + * @Version 1.0 + */ +@Data +public class LiePinTokenInfo { + + private String access_token; + + private Long expire; + + +} diff --git a/coolstore-partner-model/src/main/java/com/cool/store/response/liepin/PathResponse.java b/coolstore-partner-model/src/main/java/com/cool/store/response/liepin/PathResponse.java new file mode 100644 index 000000000..d00c54c79 --- /dev/null +++ b/coolstore-partner-model/src/main/java/com/cool/store/response/liepin/PathResponse.java @@ -0,0 +1,17 @@ +package com.cool.store.response.liepin; + +import lombok.Data; + +/** + * @Author suzhuhong + * @Date 2025/5/23 16:39 + * @Version 1.0 + */ +@Data +public class PathResponse { + + private String account_id; + + private String path; + +} diff --git a/coolstore-partner-model/src/main/java/com/cool/store/response/liepin/StoreEmpInfoResponse.java b/coolstore-partner-model/src/main/java/com/cool/store/response/liepin/StoreEmpInfoResponse.java new file mode 100644 index 000000000..d3b27c1de --- /dev/null +++ b/coolstore-partner-model/src/main/java/com/cool/store/response/liepin/StoreEmpInfoResponse.java @@ -0,0 +1,15 @@ +package com.cool.store.response.liepin; + +import lombok.Data; + +/** + * @Author suzhuhong + * @Date 2025/5/23 15:20 + * @Version 1.0 + */ +@Data +public class StoreEmpInfoResponse { + + private Long account_id; + +} diff --git a/coolstore-partner-model/src/main/java/com/cool/store/response/liepin/StoreInfoResponse.java b/coolstore-partner-model/src/main/java/com/cool/store/response/liepin/StoreInfoResponse.java new file mode 100644 index 000000000..7673a23e7 --- /dev/null +++ b/coolstore-partner-model/src/main/java/com/cool/store/response/liepin/StoreInfoResponse.java @@ -0,0 +1,18 @@ +package com.cool.store.response.liepin; + +import lombok.Data; + +/** + * @Author suzhuhong + * @Date 2025/5/22 19:41 + * @Version 1.0 + */ +@Data +public class StoreInfoResponse { + + /** + * 员工账号ID + */ + private Long store_id; + +} diff --git a/coolstore-partner-model/src/main/java/com/cool/store/response/liepin/TokenResponse.java b/coolstore-partner-model/src/main/java/com/cool/store/response/liepin/TokenResponse.java new file mode 100644 index 000000000..be16d53bb --- /dev/null +++ b/coolstore-partner-model/src/main/java/com/cool/store/response/liepin/TokenResponse.java @@ -0,0 +1,40 @@ +package com.cool.store.response.liepin; + +/** + * @author sha.li + * @since 2025-03-28 13:49 + */ +public class TokenResponse extends XbbResponse { + + public static class TokenData { + private String token; + + private Long expire; + + public String getToken() { + return token; + } + + public void setToken(String token) { + this.token = token; + } + + public Long getExpire() { + return expire; + } + + public void setExpire(Long expire) { + this.expire = expire; + } + } + + @Override + public String toString() { + return "TokenResponse{" + + "data=" + data + + ", code=" + code + + ", msg='" + msg + '\'' + + ", success=" + success + + '}'; + } +} diff --git a/coolstore-partner-model/src/main/java/com/cool/store/response/liepin/XbbResponse.java b/coolstore-partner-model/src/main/java/com/cool/store/response/liepin/XbbResponse.java new file mode 100644 index 000000000..442138da6 --- /dev/null +++ b/coolstore-partner-model/src/main/java/com/cool/store/response/liepin/XbbResponse.java @@ -0,0 +1,67 @@ +package com.cool.store.response.liepin; + +/** + * @author sha.li + * @since 2025-03-28 13:49 + */ +public class XbbResponse { + protected int code; + protected String msg; + protected T data; + protected boolean success; + protected boolean is_success; + + public String getMsg() { + return msg; + } + + public XbbResponse setMsg(String msg) { + this.msg = msg; + return this; + } + + public int getCode() { + return code; + } + + public XbbResponse setCode(int code) { + this.code = code; + return this; + } + + public T getData() { + return data; + } + + public XbbResponse setData(T data) { + this.data = data; + return this; + } + + public boolean isIs_success() { + return is_success; + } + + public void setIs_success(boolean is_success) { + this.is_success = is_success; + } + + public boolean isSuccess() { + return success; + } + + public XbbResponse setSuccess(boolean success) { + this.success = success; + return this; + } + + @Override + public String toString() { + return "XbbResponse{" + + "code=" + code + + ", msg='" + msg + '\'' + + ", data=" + data + + ", success=" + success + + '}'; + } +} diff --git a/coolstore-partner-model/src/main/java/com/cool/store/vo/OpeningOperationPlanVO.java b/coolstore-partner-model/src/main/java/com/cool/store/vo/OpeningOperationPlanVO.java index 7a5cbf35e..1d3ed96dc 100644 --- a/coolstore-partner-model/src/main/java/com/cool/store/vo/OpeningOperationPlanVO.java +++ b/coolstore-partner-model/src/main/java/com/cool/store/vo/OpeningOperationPlanVO.java @@ -7,6 +7,7 @@ import io.swagger.annotations.ApiModelProperty; import lombok.Data; import org.apache.commons.lang3.StringUtils; +import javax.persistence.Column; import java.util.Arrays; import java.util.Date; import java.util.List; @@ -58,7 +59,15 @@ public class OpeningOperationPlanVO { private String approver; @ApiModelProperty("提交人") private String submiter; + @ApiModelProperty("开业时间") + private Date openTime; + @ApiModelProperty("第一天收入") + private String firstDayIncome; + @ApiModelProperty("第二天收入") + private String secondDayIncome; + @ApiModelProperty("第三天收入") + private String thirdDayIncome; public OpeningOperationPlanVO() { } @@ -72,5 +81,6 @@ public class OpeningOperationPlanVO { this.surveyResultUrl = openingOperationPlanDO.getSurveyResultUrl(); this.activityTheme = openingOperationPlanDO.getActivityTheme(); this.surveyResult = openingOperationPlanDO.getSurveyResult(); + this.openTime = openingOperationPlanDO.getOpenTime(); } } diff --git a/coolstore-partner-model/src/main/java/com/cool/store/vo/approval/ApprovalBatchVO.java b/coolstore-partner-model/src/main/java/com/cool/store/vo/approval/ApprovalBatchVO.java new file mode 100644 index 000000000..4bbb5e8f3 --- /dev/null +++ b/coolstore-partner-model/src/main/java/com/cool/store/vo/approval/ApprovalBatchVO.java @@ -0,0 +1,32 @@ +package com.cool.store.vo.approval; + +import lombok.Data; + +import java.util.List; + +/** + * 审批批次VO(同一版本下的节点) + */ +@Data +public class ApprovalBatchVO { + + /** + * 版本号 + */ + private Long version; + + /** + * 节点名称 + */ + private String nodeName; + + /** + * 节点代码 + */ + private String nodeCode; + + /** + * 处理人列表 + */ + private List handleUserIdList; +} diff --git a/coolstore-partner-model/src/main/java/com/cool/store/vo/approval/ApprovalGroupedVO.java b/coolstore-partner-model/src/main/java/com/cool/store/vo/approval/ApprovalGroupedVO.java new file mode 100644 index 000000000..a91c89641 --- /dev/null +++ b/coolstore-partner-model/src/main/java/com/cool/store/vo/approval/ApprovalGroupedVO.java @@ -0,0 +1,22 @@ +package com.cool.store.vo.approval; + +import lombok.Data; + +import java.util.List; + +/** + * 按版本分组的审批记录VO + */ +@Data +public class ApprovalGroupedVO { + + /** + * 申请编号 + */ + private String applicationNo; + + /** + * 审批批次列表 + */ + private List batches; +} diff --git a/coolstore-partner-model/src/main/java/com/cool/store/vo/approval/ApprovalHandleVO.java b/coolstore-partner-model/src/main/java/com/cool/store/vo/approval/ApprovalHandleVO.java new file mode 100644 index 000000000..e9b59d171 --- /dev/null +++ b/coolstore-partner-model/src/main/java/com/cool/store/vo/approval/ApprovalHandleVO.java @@ -0,0 +1,45 @@ +package com.cool.store.vo.approval; + +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +/** + * 审批处理人VO + */ +@Data +public class ApprovalHandleVO { + + /** + * 处理人ID + */ + private String handleUserId; + + /** + * 处理人名称 + */ + private String handleUserName; + + /** + * 审批状态:1-已处理,2-待处理 + */ + @ApiModelProperty("审批状态:1-已处理,2-待处理") + private String status; + + /** + * 审批结果:pass-通过,reject-拒绝 + */ + @ApiModelProperty("审批结果:pass-通过,reject-拒绝") + private String result; + + /** + * 审批意见 + */ + @ApiModelProperty("审批意见") + private String comment; + + @ApiModelProperty("操作时间") + private String operateTime; + + @ApiModelProperty("提交类型 0-提交 1-审批") + private Integer submitType; +} diff --git a/coolstore-partner-model/src/main/java/com/cool/store/vo/contract/ContractCostVO.java b/coolstore-partner-model/src/main/java/com/cool/store/vo/contract/ContractCostVO.java new file mode 100644 index 000000000..d4e1bab04 --- /dev/null +++ b/coolstore-partner-model/src/main/java/com/cool/store/vo/contract/ContractCostVO.java @@ -0,0 +1,67 @@ +package com.cool.store.vo.contract; + +import lombok.Data; + +import java.math.BigDecimal; + +/** + * 合同费用VO + */ +@Data +public class ContractCostVO { + + /** + * 加盟费金额(元) + */ + private BigDecimal joinFeeAmount; + + /** + * 加盟费收费频率计数(年) + */ + private BigDecimal joinFeeFrequencyYears; + + /** + * 加盟费优惠总折扣金额(元) + */ + private BigDecimal joinFeeDiscountAmount; + + /** + * 加盟费优惠原因 + */ + private String joinFeeDiscountReason; + + /** + * 品牌使用费金额(元) + */ + private BigDecimal brandUsageFeeAmount; + + /** + * 品牌使用费收费频率计数(年) + */ + private BigDecimal brandUsageFeeFrequencyYears; + + /** + * 品牌管理费金额(元) + */ + private BigDecimal brandManagementFeeAmount; + + /** + * 品牌管理费收费频率计数(年) + */ + private BigDecimal brandManagementFeeFrequencyYears; + + /** + * 设计费金额(元) + */ + private BigDecimal designFeeAmount; + + /** + * 系统使用费金额(元) + */ + private BigDecimal systemUsageFeeAmount; + + /** + * 履约保证金金额(元) + */ + private BigDecimal performanceBondAmount; +} \ No newline at end of file diff --git a/coolstore-partner-model/src/main/java/com/cool/store/vo/contract/ContractMasterDetailVO.java b/coolstore-partner-model/src/main/java/com/cool/store/vo/contract/ContractMasterDetailVO.java new file mode 100644 index 000000000..5d74dc69c --- /dev/null +++ b/coolstore-partner-model/src/main/java/com/cool/store/vo/contract/ContractMasterDetailVO.java @@ -0,0 +1,57 @@ +package com.cool.store.vo.contract; + +import lombok.Data; + +import java.math.BigDecimal; +import java.util.Date; +import java.util.List; + +/** + * 合同详情响应VO + */ +@Data +public class ContractMasterDetailVO { + + private Long contractId; + + private String contractType; + + private String contractNo; + + private String storeId; + + private String storeCode; + + private String storeName; + + private String brandName; + + private String source; + + private String signForm; + + private BigDecimal contractYears; + + private Date startDate; + + private Date endDate; + + private String contractStatus; + + private String currency; + + private Date signDate; + + private String relatedContractNo; + + private String remark; + + private String createUserName; + + private Date createdTime; + + /** + * 合同费用列表 + */ + private List costList; +} diff --git a/coolstore-partner-model/src/main/java/com/cool/store/vo/contract/ContractMasterListVO.java b/coolstore-partner-model/src/main/java/com/cool/store/vo/contract/ContractMasterListVO.java new file mode 100644 index 000000000..d66b73acd --- /dev/null +++ b/coolstore-partner-model/src/main/java/com/cool/store/vo/contract/ContractMasterListVO.java @@ -0,0 +1,98 @@ +package com.cool.store.vo.contract; + +import lombok.Data; + +import java.math.BigDecimal; +import java.util.Date; + +/** + * 合同列表响应VO + */ +@Data +public class ContractMasterListVO { + + /** + * 合同ID + */ + private Long contractId; + + /** + * 合同类型 + */ + private String contractType; + + /** + * 合同编号 + */ + private String contractNo; + + /** + * 门店编码 + */ + private String storeCode; + + /** + * 门店名称(从store表JOIN) + */ + private String storeName; + + /** + * 加盟品牌 + */ + private String brandName; + + /** + * 加盟来源 + */ + private String source; + + /** + * 签约形式 + */ + private String signForm; + + /** + * 合同时长 + */ + private BigDecimal contractYears; + + /** + * 合同开始日期 + */ + private Date startDate; + + /** + * 合同结束日期 + */ + private Date endDate; + + /** + * 合同状态 + */ + private String contractStatus; + + /** + * 合同备注 + */ + private String remark; + + /** + * 关联合同编号 + */ + private String relatedContractNo; + + /** + * 创建人姓名 + */ + private String createUserName; + + /** + * 创建时间 + */ + private Date createdTime; + + /** + * 创建人ID(用于关联查询用户名,不返回前端) + */ + private String createUserId; +} diff --git a/coolstore-partner-model/src/main/java/com/cool/store/vo/desk/PreparationCommonPendingVO.java b/coolstore-partner-model/src/main/java/com/cool/store/vo/desk/PreparationCommonPendingVO.java index 6347734da..25a6f0319 100644 --- a/coolstore-partner-model/src/main/java/com/cool/store/vo/desk/PreparationCommonPendingVO.java +++ b/coolstore-partner-model/src/main/java/com/cool/store/vo/desk/PreparationCommonPendingVO.java @@ -53,6 +53,10 @@ public class PreparationCommonPendingVO { private Integer signType; @ApiModelProperty("业务备注") private String businessRemark; + @ApiModelProperty("开业时间") + private Date openTime; + @ApiModelProperty("活动主题") + private String activityTheme; @ApiModelProperty("签约人2姓名") private String partnershipSignatorySecond; diff --git a/coolstore-partner-model/src/main/java/com/cool/store/vo/dict/DictColumnSimpleVO.java b/coolstore-partner-model/src/main/java/com/cool/store/vo/dict/DictColumnSimpleVO.java index 0e2f848db..9c15e6f65 100644 --- a/coolstore-partner-model/src/main/java/com/cool/store/vo/dict/DictColumnSimpleVO.java +++ b/coolstore-partner-model/src/main/java/com/cool/store/vo/dict/DictColumnSimpleVO.java @@ -32,6 +32,7 @@ public class DictColumnSimpleVO { DictColumnSimpleVO vo = new DictColumnSimpleVO(); vo.setColumnName(columnDO.getColumnName()); vo.setColumnCode(columnDO.getColumnCode()); + vo.setRemark(columnDO.getRemark()); vo.setTableCode(tableCode); vo.setRemark(columnDO.getRemark()); return vo; diff --git a/coolstore-partner-model/src/main/java/com/cool/store/vo/exam/ExamAnswerVO.java b/coolstore-partner-model/src/main/java/com/cool/store/vo/exam/ExamAnswerVO.java new file mode 100644 index 000000000..aaa492ce4 --- /dev/null +++ b/coolstore-partner-model/src/main/java/com/cool/store/vo/exam/ExamAnswerVO.java @@ -0,0 +1,19 @@ +package com.cool.store.vo.exam; + +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +import java.util.List; + +/** + * 题目答案VO + */ +@Data +public class ExamAnswerVO { + + @ApiModelProperty(value = "正确答案选项列表,如[\"A\",\"B\"]") + private List options; + + @ApiModelProperty(value = "判断题答案,true-正确 false-错误") + private Boolean judgment; +} \ No newline at end of file diff --git a/coolstore-partner-model/src/main/java/com/cool/store/vo/exam/ExamAttemptListVO.java b/coolstore-partner-model/src/main/java/com/cool/store/vo/exam/ExamAttemptListVO.java new file mode 100644 index 000000000..984875281 --- /dev/null +++ b/coolstore-partner-model/src/main/java/com/cool/store/vo/exam/ExamAttemptListVO.java @@ -0,0 +1,47 @@ +package com.cool.store.vo.exam; + +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +import java.math.BigDecimal; +import java.util.Date; + +/** + * 答卷列表VO + */ +@Data +public class ExamAttemptListVO { + + @ApiModelProperty(value = "答卷ID") + private Long id; + + @ApiModelProperty(value = "考试名称") + private String examName; + + @ApiModelProperty(value = "考试时长(分钟)") + private Integer durationMinutes; + + @ApiModelProperty(value = "开始时间") + private Date startTime; + + @ApiModelProperty(value = "结束时间") + private Date endTime; + + @ApiModelProperty(value = "状态,0-进行中 1-已完成") + private Integer status; + + @ApiModelProperty(value = "状态描述") + private String statusDesc; + + @ApiModelProperty(value = "总得分") + private BigDecimal totalScore; + + @ApiModelProperty(value = "试卷总分") + private BigDecimal fullScore; + + @ApiModelProperty(value = "是否通过") + private Boolean passed; + + @ApiModelProperty(value = "考试token") + private String entryToken; +} \ No newline at end of file diff --git a/coolstore-partner-model/src/main/java/com/cool/store/vo/exam/ExamAttemptVO.java b/coolstore-partner-model/src/main/java/com/cool/store/vo/exam/ExamAttemptVO.java new file mode 100644 index 000000000..d496223a5 --- /dev/null +++ b/coolstore-partner-model/src/main/java/com/cool/store/vo/exam/ExamAttemptVO.java @@ -0,0 +1,78 @@ +package com.cool.store.vo.exam; + +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +import java.math.BigDecimal; +import java.util.Date; +import java.util.List; + +/** + * 答卷详情VO + */ +@Data +public class ExamAttemptVO { + + @ApiModelProperty(value = "答卷ID") + private Long id; + + @ApiModelProperty(value = "考试名称") + private String examName; + + @ApiModelProperty(value = "考生姓名") + private String name; + + @ApiModelProperty(value = "考生手机号") + private String mobile; + + @ApiModelProperty(value = "考试开始时间") + private Date startTime; + + @ApiModelProperty(value = "考试结束时间") + private Date endTime; + + @ApiModelProperty(value = "状态,0-进行中 1-已完成") + private Integer status; + + @ApiModelProperty(value = "提交类型,0-主动提交 1-超时自动提交") + private Integer submitType; + + @ApiModelProperty(value = "总得分") + private BigDecimal totalScore; + + @ApiModelProperty(value = "答题详情列表") + private List answers; + + @Data + public static class AnswerDetail { + @ApiModelProperty(value = "试卷题目ID") + private Long paperQuestionId; + + @ApiModelProperty(value = "题目类型") + private Integer type; + + @ApiModelProperty(value = "题干") + private String questionStem; + + @ApiModelProperty(value = "选项") + private List options; + + @ApiModelProperty(value = "正确答案") + private ExamAnswerVO correctAnswer; + + @ApiModelProperty(value = "考生答案") + private ExamAnswerVO userAnswer; + + @ApiModelProperty(value = "是否正确") + private Boolean isCorrect; + + @ApiModelProperty(value = "得分") + private BigDecimal score; + + @ApiModelProperty(value = "分值") + private BigDecimal totalScore; + + @ApiModelProperty(value = "解析") + private String analysis; + } +} \ No newline at end of file diff --git a/coolstore-partner-model/src/main/java/com/cool/store/vo/exam/ExamInfoListVO.java b/coolstore-partner-model/src/main/java/com/cool/store/vo/exam/ExamInfoListVO.java new file mode 100644 index 000000000..11f60ae99 --- /dev/null +++ b/coolstore-partner-model/src/main/java/com/cool/store/vo/exam/ExamInfoListVO.java @@ -0,0 +1,46 @@ +package com.cool.store.vo.exam; + +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +import java.util.Date; + +/** + * 考试列表项VO + */ +@Data +public class ExamInfoListVO { + + @ApiModelProperty(value = "考试ID") + private Long id; + + @ApiModelProperty(value = "试卷ID") + private Long paperId; + + @ApiModelProperty(value = "考试名称") + private String examName; + + @ApiModelProperty(value = "试卷名称") + private String paperName; + + @ApiModelProperty(value = "开始时间") + private Date startTime; + + @ApiModelProperty(value = "结束时间") + private Date endTime; + + @ApiModelProperty(value = "考试时长(分钟)") + private Integer durationMinutes; + + @ApiModelProperty(value = "状态,0-未发布 1-已发布 2-已结束") + private Integer status; + + @ApiModelProperty(value = "参考人数") + private Integer attemptCount; + + @ApiModelProperty(value = "创建时间") + private Date createTime; + + @ApiModelProperty("二维码地址") + private String qrcodeUrl; +} \ No newline at end of file diff --git a/coolstore-partner-model/src/main/java/com/cool/store/vo/exam/ExamInfoVO.java b/coolstore-partner-model/src/main/java/com/cool/store/vo/exam/ExamInfoVO.java new file mode 100644 index 000000000..a977f4856 --- /dev/null +++ b/coolstore-partner-model/src/main/java/com/cool/store/vo/exam/ExamInfoVO.java @@ -0,0 +1,46 @@ +package com.cool.store.vo.exam; + +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +import java.util.Date; + +/** + * 考试详情VO + */ +@Data +public class ExamInfoVO { + + @ApiModelProperty(value = "考试ID") + private Long id; + + @ApiModelProperty(value = "试卷ID") + private Long paperId; + + @ApiModelProperty(value = "试卷名称") + private String paperName; + + @ApiModelProperty(value = "考试名称") + private String examName; + + @ApiModelProperty(value = "开始时间") + private Date startTime; + + @ApiModelProperty(value = "结束时间") + private Date endTime; + + @ApiModelProperty(value = "考试时长(分钟)") + private Integer durationMinutes; + + @ApiModelProperty(value = "状态,0-未发布 1-已发布 2-已结束") + private Integer status; + + @ApiModelProperty(value = "入口token") + private String entryToken; + + @ApiModelProperty("二维码地址") + private String qrcodeUrl; + + @ApiModelProperty(value = "创建时间") + private Date createTime; +} \ No newline at end of file diff --git a/coolstore-partner-model/src/main/java/com/cool/store/vo/exam/ExamOptionVO.java b/coolstore-partner-model/src/main/java/com/cool/store/vo/exam/ExamOptionVO.java new file mode 100644 index 000000000..a2425db10 --- /dev/null +++ b/coolstore-partner-model/src/main/java/com/cool/store/vo/exam/ExamOptionVO.java @@ -0,0 +1,17 @@ +package com.cool.store.vo.exam; + +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +/** + * 题目选项VO + */ +@Data +public class ExamOptionVO { + + @ApiModelProperty(value = "选项标签,如A、B、C、D") + private String label; + + @ApiModelProperty(value = "选项内容") + private String content; +} \ No newline at end of file diff --git a/coolstore-partner-model/src/main/java/com/cool/store/vo/exam/ExamPaperForAttemptVO.java b/coolstore-partner-model/src/main/java/com/cool/store/vo/exam/ExamPaperForAttemptVO.java new file mode 100644 index 000000000..143aa3b62 --- /dev/null +++ b/coolstore-partner-model/src/main/java/com/cool/store/vo/exam/ExamPaperForAttemptVO.java @@ -0,0 +1,59 @@ +package com.cool.store.vo.exam; + +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +import java.math.BigDecimal; +import java.util.List; + +/** + * 答题时试卷展示VO(不含答案) + */ +@Data +public class ExamPaperForAttemptVO { + + @ApiModelProperty(value = "答卷ID") + private Long attemptId; + + @ApiModelProperty(value = "考试名称") + private String examName; + + @ApiModelProperty(value = "考试时长(分钟)") + private Integer durationMinutes; + + @ApiModelProperty(value = "开始时间") + private Long startTime; + + @ApiModelProperty(value = "截止时间") + private Long deadlineTime; + + @ApiModelProperty(value = "剩余时间(秒)") + private Long remainingTime; + + @ApiModelProperty(value = "题目列表") + private List questions; + + @Data + public static class QuestionItem { + @ApiModelProperty(value = "试卷题目ID") + private Long id; + + @ApiModelProperty(value = "题目类型,1-单选 2-多选 3-判断") + private Integer type; + + @ApiModelProperty(value = "题干") + private String questionStem; + + @ApiModelProperty(value = "选项") + private List options; + + @ApiModelProperty(value = "分值") + private BigDecimal score; + + @ApiModelProperty(value = "排序号") + private Integer sortNo; + + @ApiModelProperty(value = "用户答案(恢复考试时返回)") + private ExamAnswerVO userAnswer; + } +} \ No newline at end of file diff --git a/coolstore-partner-model/src/main/java/com/cool/store/vo/exam/ExamPaperListVO.java b/coolstore-partner-model/src/main/java/com/cool/store/vo/exam/ExamPaperListVO.java new file mode 100644 index 000000000..1f7941cf1 --- /dev/null +++ b/coolstore-partner-model/src/main/java/com/cool/store/vo/exam/ExamPaperListVO.java @@ -0,0 +1,38 @@ +package com.cool.store.vo.exam; + +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +import java.math.BigDecimal; +import java.util.Date; + +/** + * 试卷列表项VO + */ +@Data +public class ExamPaperListVO { + + @ApiModelProperty(value = "试卷ID") + private Long id; + + @ApiModelProperty(value = "试卷名称") + private String paperName; + + @ApiModelProperty(value = "试卷描述") + private String description; + + @ApiModelProperty(value = "总分") + private BigDecimal totalScore; + + @ApiModelProperty(value = "是否启用,0-否 1-是") + private Integer enable; + + @ApiModelProperty(value = "是否已开始考试,0-否 1-是") + private Integer startExam; + + @ApiModelProperty(value = "题目数量") + private Integer questionCount; + + @ApiModelProperty(value = "创建时间") + private Date createTime; +} \ No newline at end of file diff --git a/coolstore-partner-model/src/main/java/com/cool/store/vo/exam/ExamPaperVO.java b/coolstore-partner-model/src/main/java/com/cool/store/vo/exam/ExamPaperVO.java new file mode 100644 index 000000000..8662ca9fe --- /dev/null +++ b/coolstore-partner-model/src/main/java/com/cool/store/vo/exam/ExamPaperVO.java @@ -0,0 +1,72 @@ +package com.cool.store.vo.exam; + +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +import java.math.BigDecimal; +import java.util.Date; +import java.util.List; + +/** + * 试卷详情VO + */ +@Data +public class ExamPaperVO { + + @ApiModelProperty(value = "试卷ID") + private Long id; + + @ApiModelProperty(value = "试卷名称") + private String paperName; + + @ApiModelProperty(value = "试卷描述") + private String description; + + @ApiModelProperty(value = "总分") + private BigDecimal totalScore; + + @ApiModelProperty(value = "是否启用,0-否 1-是") + private Integer enable; + + @ApiModelProperty(value = "是否已开始考试,0-否 1-是") + private Integer startExam; + + @ApiModelProperty(value = "题目数量") + private Integer questionCount; + + @ApiModelProperty(value = "创建时间") + private Date createTime; + + @ApiModelProperty(value = "题目列表") + private List questions; + + @Data + public static class PaperQuestionVO { + @ApiModelProperty(value = "试卷题目ID") + private Long id; + + @ApiModelProperty(value = "题目ID") + private Long questionId; + + @ApiModelProperty(value = "题目类型") + private Integer type; + + @ApiModelProperty(value = "题干") + private String questionStem; + + @ApiModelProperty(value = "选项") + private List options; + + @ApiModelProperty(value = "答案") + private String answer; + + @ApiModelProperty(value = "分值") + private BigDecimal score; + + @ApiModelProperty(value = "解析") + private String analysis; + + @ApiModelProperty(value = "排序号") + private Integer sortNo; + } +} \ No newline at end of file diff --git a/coolstore-partner-model/src/main/java/com/cool/store/vo/exam/ExamQuestionListVO.java b/coolstore-partner-model/src/main/java/com/cool/store/vo/exam/ExamQuestionListVO.java new file mode 100644 index 000000000..d59ca252b --- /dev/null +++ b/coolstore-partner-model/src/main/java/com/cool/store/vo/exam/ExamQuestionListVO.java @@ -0,0 +1,35 @@ +package com.cool.store.vo.exam; + +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +import java.math.BigDecimal; +import java.util.Date; + +/** + * 题目列表项VO + */ +@Data +public class ExamQuestionListVO { + + @ApiModelProperty(value = "题目ID") + private Long id; + + @ApiModelProperty(value = "题目类型,1-单选 2-多选 3-判断") + private Integer type; + + @ApiModelProperty(value = "难度,1-简单 2-中等 3-困难") + private Integer difficulty; + + @ApiModelProperty(value = "题干") + private String questionStem; + + @ApiModelProperty(value = "分值") + private BigDecimal score; + + @ApiModelProperty(value = "是否启用,0-否 1-是") + private Integer enable; + + @ApiModelProperty(value = "创建时间") + private Date createTime; +} \ No newline at end of file diff --git a/coolstore-partner-model/src/main/java/com/cool/store/vo/exam/ExamQuestionVO.java b/coolstore-partner-model/src/main/java/com/cool/store/vo/exam/ExamQuestionVO.java new file mode 100644 index 000000000..f2a3407a6 --- /dev/null +++ b/coolstore-partner-model/src/main/java/com/cool/store/vo/exam/ExamQuestionVO.java @@ -0,0 +1,45 @@ +package com.cool.store.vo.exam; + +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +import java.math.BigDecimal; +import java.util.Date; +import java.util.List; + +/** + * 题目详情VO + */ +@Data +public class ExamQuestionVO { + + @ApiModelProperty(value = "题目ID") + private Long id; + + @ApiModelProperty(value = "题目类型,1-单选 2-多选 3-判断") + private Integer type; + + @ApiModelProperty(value = "难度,1-简单 2-中等 3-困难") + private Integer difficulty; + + @ApiModelProperty(value = "题干") + private String questionStem; + + @ApiModelProperty(value = "题目选项") + private List options; + + @ApiModelProperty(value = "答案") + private ExamAnswerVO answer; + + @ApiModelProperty(value = "分值") + private BigDecimal score; + + @ApiModelProperty(value = "解析") + private String analysis; + + @ApiModelProperty(value = "是否启用,0-否 1-是") + private Integer enable; + + @ApiModelProperty(value = "创建时间") + private Date createTime; +} \ No newline at end of file diff --git a/coolstore-partner-model/src/main/java/com/cool/store/vo/exam/ExamResultVO.java b/coolstore-partner-model/src/main/java/com/cool/store/vo/exam/ExamResultVO.java new file mode 100644 index 000000000..ba5c9b272 --- /dev/null +++ b/coolstore-partner-model/src/main/java/com/cool/store/vo/exam/ExamResultVO.java @@ -0,0 +1,31 @@ +package com.cool.store.vo.exam; + +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +import java.math.BigDecimal; + +/** + * 考试结果VO + */ +@Data +public class ExamResultVO { + + @ApiModelProperty(value = "答卷ID") + private Long attemptId; + + @ApiModelProperty(value = "总得分") + private BigDecimal totalScore; + + @ApiModelProperty(value = "总分") + private BigDecimal fullScore; + + @ApiModelProperty(value = "正确题数") + private Integer correctCount; + + @ApiModelProperty(value = "总题数") + private Integer totalCount; + + @ApiModelProperty(value = "是否及格") + private Boolean passed; +} \ No newline at end of file diff --git a/coolstore-partner-model/src/main/java/com/cool/store/vo/renewal/ContractRelatedInfoVO.java b/coolstore-partner-model/src/main/java/com/cool/store/vo/renewal/ContractRelatedInfoVO.java new file mode 100644 index 000000000..844538fce --- /dev/null +++ b/coolstore-partner-model/src/main/java/com/cool/store/vo/renewal/ContractRelatedInfoVO.java @@ -0,0 +1,31 @@ +package com.cool.store.vo.renewal; + +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +import java.util.Date; + +/** + * 关联合同信息VO + */ +@Data +public class ContractRelatedInfoVO { + + @ApiModelProperty("合同编号") + private String contractNo; + + @ApiModelProperty("加盟品牌") + private String brandName; + + @ApiModelProperty("签约日期") + private Date signDate; + + @ApiModelProperty("合同类型") + private String contractType; + + @ApiModelProperty("合同开始日期") + private Date startDate; + + @ApiModelProperty("合同结束日期") + private Date endDate; +} diff --git a/coolstore-partner-model/src/main/java/com/cool/store/vo/renewal/RenewalApplicationDetailVO.java b/coolstore-partner-model/src/main/java/com/cool/store/vo/renewal/RenewalApplicationDetailVO.java new file mode 100644 index 000000000..1f67f95cd --- /dev/null +++ b/coolstore-partner-model/src/main/java/com/cool/store/vo/renewal/RenewalApplicationDetailVO.java @@ -0,0 +1,93 @@ +package com.cool.store.vo.renewal; + +import com.cool.store.vo.approval.ApprovalGroupedVO; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +import java.util.Date; + +/** + * 续签申请详情响应VO + */ +@Data +public class RenewalApplicationDetailVO { + + @ApiModelProperty("续签ID") + private Long renewalId; + + @ApiModelProperty("续签申请单号") + private String applicationNo; + + @ApiModelProperty("门店编号") + private String storeCode; + + @ApiModelProperty("门店名称") + private String storeName; + + @ApiModelProperty("门店状态") + private String storeStatus; + + @ApiModelProperty("门店地址") + private String storeAddress; + + @ApiModelProperty("品牌名称") + private String brandName; + + @ApiModelProperty("招商经理") + private String recruitmentManager; + + @ApiModelProperty("所属加盟大区或者分部") + private String branchName; + + @ApiModelProperty("所属运营分组") + private String regionName; + + @ApiModelProperty("签约人1姓名") + private String signer1Name; + + private String signer1Mobile; + + @ApiModelProperty("签约人2姓名") + private String signer2Name; + + private String signer2Mobile; + + @ApiModelProperty("合同到期时间") + private Date contractExpireDate; + + @ApiModelProperty("是否翻新") + private Integer isRenovate; + + @ApiModelProperty("状态") + private Integer status; + + @ApiModelProperty("状态名称") + private String statusName; + + @ApiModelProperty("备注") + private String remark; + + @ApiModelProperty("原合同编号") + private String originalContractNo; + + @ApiModelProperty("创建人姓名") + private String createUserName; + + @ApiModelProperty("创建时间") + private Date createdTime; + + /** + * 关联合同信息 + */ + private ContractRelatedInfoVO contractInfo; + + /** + * 审批记录(按版本分组) + */ + private ApprovalGroupedVO approvalBatches; + + /** + * 装修信息 + */ + private RenewalRenovateApprovalVO renewalRenovateApprovalVO; +} diff --git a/coolstore-partner-model/src/main/java/com/cool/store/vo/renewal/RenewalApplicationListVO.java b/coolstore-partner-model/src/main/java/com/cool/store/vo/renewal/RenewalApplicationListVO.java new file mode 100644 index 000000000..711fca41a --- /dev/null +++ b/coolstore-partner-model/src/main/java/com/cool/store/vo/renewal/RenewalApplicationListVO.java @@ -0,0 +1,72 @@ +package com.cool.store.vo.renewal; + +import com.cool.store.enums.master.BrandTypeEnum; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +import java.util.Date; + +/** + * 续签申请列表响应VO + */ +@Data +public class RenewalApplicationListVO { + + @ApiModelProperty("续签ID") + private Long renewalId; + + @ApiModelProperty("续签申请单号") + private String applicationNo; + + @ApiModelProperty("门店编号") + private String storeCode; + + @ApiModelProperty("门店名称") + private String storeName; + + @ApiModelProperty("门店地址") + private String storeAddress; + + @ApiModelProperty("加盟品牌") + private Integer joinBrand; + + @ApiModelProperty("加盟品牌") + private String brandName; + + @ApiModelProperty("招商经理") + private String recruitmentManager; + + @ApiModelProperty("所属加盟大区") + private String branchName; + + @ApiModelProperty("所属运营分组") + private String regionName; + + @ApiModelProperty("签约人1手机号") + private String signer1Mobile; + + @ApiModelProperty("签约人1姓名") + private String signer1Name; + + @ApiModelProperty("签约人2姓名") + private String signer2Name; + + @ApiModelProperty("签约人1手机号") + private String signer2Mobile; + + @ApiModelProperty("合同到期时间") + private Date contractExpireDate; + + @ApiModelProperty("是否翻新") + private Integer isRenovate; + + @ApiModelProperty("状态") + private Integer status; + + @ApiModelProperty("状态名称") + private String statusName; + + public String getBrandName() { + return BrandTypeEnum.getDescByCode(this.getJoinBrand()); + } +} diff --git a/coolstore-partner-model/src/main/java/com/cool/store/vo/renewal/RenewalRenovateApprovalVO.java b/coolstore-partner-model/src/main/java/com/cool/store/vo/renewal/RenewalRenovateApprovalVO.java new file mode 100644 index 000000000..3636346e5 --- /dev/null +++ b/coolstore-partner-model/src/main/java/com/cool/store/vo/renewal/RenewalRenovateApprovalVO.java @@ -0,0 +1,64 @@ +package com.cool.store.vo.renewal; + +import lombok.Data; + +import javax.persistence.Column; + +/** + * @Auther zx_szh + * @Date 2026/5/7 15:45 + * @Version 1.0 + */ +@Data +public class RenewalRenovateApprovalVO { + + /** + * 续签申请编号 + */ + @Column(name = "application_no") + private String applicationNo; + + /** + * 门店所在区域 + */ + @Column(name = "shop_area_id") + private Long shopAreaId; + + /** + * 装修属性 + */ + @Column(name = "decoration_attributes") + private String decorationAttributes; + + /** + * 装修等级 + */ + @Column(name = "decoration_level") + private String decorationLevel; + + /** + * 装修设计要求 + */ + @Column(name = "decoration_requirement") + private String decorationRequirement; + + /** + * 特殊情况说明 + */ + @Column(name = "special_instruction") + private String specialInstruction; + + /** + * 店内360°视频URL + */ + @Column(name = "video_url") + private String videoUrl; + + /** + * 店铺门头照片URL + */ + @Column(name = "shop_front_photo_url") + private String shopFrontPhotoUrl; + + +} diff --git a/coolstore-partner-service/src/main/java/com/cool/store/config/weixin/WechatMpProperties.java b/coolstore-partner-service/src/main/java/com/cool/store/config/weixin/WechatMpProperties.java index 10acc5f25..123869660 100644 --- a/coolstore-partner-service/src/main/java/com/cool/store/config/weixin/WechatMpProperties.java +++ b/coolstore-partner-service/src/main/java/com/cool/store/config/weixin/WechatMpProperties.java @@ -34,4 +34,5 @@ public class WechatMpProperties { * 发送模板消息的URL */ private String sendTemplateMessageUrl = "https://api.weixin.qq.com/cgi-bin/message/template/send"; + } diff --git a/coolstore-partner-service/src/main/java/com/cool/store/handler/TitleWriteHandler.java b/coolstore-partner-service/src/main/java/com/cool/store/handler/TitleWriteHandler.java new file mode 100644 index 000000000..e64d0f832 --- /dev/null +++ b/coolstore-partner-service/src/main/java/com/cool/store/handler/TitleWriteHandler.java @@ -0,0 +1,55 @@ +package com.cool.store.handler; + +import com.alibaba.excel.write.handler.RowWriteHandler; +import com.alibaba.excel.write.handler.WriteHandler; +import com.alibaba.excel.write.metadata.holder.WriteSheetHolder; +import com.alibaba.excel.write.metadata.holder.WriteTableHolder; +import org.apache.poi.ss.usermodel.*; +import org.apache.poi.ss.util.CellRangeAddress; +import org.apache.poi.xssf.usermodel.XSSFWorkbook; + +public class TitleWriteHandler implements RowWriteHandler { + + private final String title; + + public TitleWriteHandler(String title) { + this.title = title; + } + + @Override + public void beforeRowCreate(WriteSheetHolder writeSheetHolder, WriteTableHolder writeTableHolder, Integer rowIndex, Integer relativeRowIndex, Boolean isHead) { + if (rowIndex == 0 && !isHead) { + // 创建第一行(index=0) + Sheet sheet = writeSheetHolder.getSheet(); + Row row = sheet.createRow(0); + + // 创建单元格并设置标题内容 + Cell cell = row.createCell(0); + cell.setCellValue(title); + + // 合并第一行的所有列(假设最多有10列) + sheet.addMergedRegion(new CellRangeAddress(0, 0, 0, 9)); + + // 设置字体样式(可选) + Workbook workbook = writeSheetHolder.getSheet().getWorkbook(); + CellStyle cellStyle = workbook.createCellStyle(); + Font font = workbook.createFont(); + font.setBold(true); + font.setFontHeightInPoints((short) 16); + cellStyle.setFont(font); + cellStyle.setAlignment(HorizontalAlignment.CENTER); + cellStyle.setVerticalAlignment(VerticalAlignment.CENTER); + cell.setCellStyle(cellStyle); + } + } + + @Override + public void afterRowCreate(WriteSheetHolder writeSheetHolder, WriteTableHolder writeTableHolder, Row row, Integer integer, Boolean aBoolean) { + + } + + @Override + public void afterRowDispose(WriteSheetHolder writeSheetHolder, WriteTableHolder writeTableHolder, Row row, Integer integer, Boolean aBoolean) { + + } +} \ No newline at end of file diff --git a/coolstore-partner-service/src/main/java/com/cool/store/http/WalletHttpClientRest.java b/coolstore-partner-service/src/main/java/com/cool/store/http/WalletHttpClientRest.java index 078814b1c..56e4576eb 100644 --- a/coolstore-partner-service/src/main/java/com/cool/store/http/WalletHttpClientRest.java +++ b/coolstore-partner-service/src/main/java/com/cool/store/http/WalletHttpClientRest.java @@ -174,7 +174,9 @@ public class WalletHttpClientRest { throw new ServiceException(ErrorCodeEnum.WALLET_API_ERROR, msg); } else if (code == 610 || msg.equals("支付密码不正确")) { throw new ServiceException(ErrorCodeEnum.PASSWORD_ERROR); - } else { + } else if (code == 611) { + throw new ServiceException(ErrorCodeEnum.WALLET_OPEN_ACCOUNT_NO_BALANCE); + }else { throw new ServiceException(ErrorCodeEnum.THIRD_API_ERROR, "code: " + code + ", msg: " + msg); } diff --git a/coolstore-partner-service/src/main/java/com/cool/store/http/WechatRest.java b/coolstore-partner-service/src/main/java/com/cool/store/http/WechatRest.java index 766b63225..d61d41fd9 100644 --- a/coolstore-partner-service/src/main/java/com/cool/store/http/WechatRest.java +++ b/coolstore-partner-service/src/main/java/com/cool/store/http/WechatRest.java @@ -8,6 +8,7 @@ import com.cool.store.dto.wx.PhoneInfoDTO; import com.cool.store.enums.ErrorCodeEnum; import com.cool.store.exception.ServiceException; import com.cool.store.mq.util.HttpRestTemplateService; +import com.cool.store.utils.CommonContextUtil; import com.cool.store.utils.RedisUtilPool; import lombok.extern.slf4j.Slf4j; import org.apache.commons.lang3.StringUtils; @@ -16,6 +17,7 @@ import org.springframework.stereotype.Service; import javax.annotation.Resource; import java.util.HashMap; +import java.util.Map; /** * @author zhangchenbiao @@ -47,6 +49,11 @@ public class WechatRest { String GET_MINIAPP_URL_LINK = "https://api.weixin.qq.com/wxa/generate_urllink?access_token=%s"; + /** + * 生成小程序二维码 + */ + String GET_MINIAPP_QR_CODE = "https://api.weixin.qq.com/wxa/getwxacodeunlimit?access_token=%s"; + public CodeSessionDTO miniProgramJsCodeSession(String appId, String secret, String jsCode){ log.info("WechatRest#miniProgramJsCodeSession, jsCode:{}", jsCode); @@ -138,4 +145,44 @@ public class WechatRest { return null; } + public byte[] createQrCode(String accessToken, String page, String scene, String width) { + String reqUrl = String.format(GET_MINIAPP_QR_CODE, accessToken); + Map body = new HashMap<>(); + body.put("page", page); + body.put("scene", scene); + body.put("env_version", CommonContextUtil.getProfileName().equals("online") ? "release" : "trial"); + if (StringUtils.isNotBlank(width)) { + body.put("width", width); + } + try { + // 直接使用 byte[] 接收二进制图片数据 + byte[] result = httpRestTemplateService.postForObject(reqUrl, body, byte[].class); + if (result == null || result.length == 0) { + log.error("二维码生成失败, 返回数据为空"); + return null; + } + // 检查是否是图片格式:PNG开头是 89 50 4E 47,JPEG开头是 FF D8 FF + boolean isImage = (result.length > 4 && + // PNG: 89 50 4E 47 (即 0x89 'P' 'N' 'G') + (result[0] == (byte) 0x89 && result[1] == 0x50 && result[2] == 0x4E && result[3] == 0x47) || + // JPEG: FF D8 FF + (result[0] == (byte) 0xFF && result[1] == (byte) 0xD8 && result[2] == (byte) 0xFF)); + if (!isImage) { + // 不是图片,说明返回的是错误JSON + String response = new String(result); + log.error("二维码生成失败, response:{}", response); + JSONObject jsonObject = JSONObject.parseObject(response); + if ("40001".equals(jsonObject.getString("errcode"))) { + throw new ServiceException(ErrorCodeEnum.WX_ACCESS_TOKEN_INVALID); + } + return null; + } + return result; + } catch (ServiceException e) { + throw e; + } catch (Exception e) { + log.error("二维码生成失败", e); + } + return null; + } } diff --git a/coolstore-partner-service/src/main/java/com/cool/store/mq/consumer/ConsumerClient.java b/coolstore-partner-service/src/main/java/com/cool/store/mq/consumer/ConsumerClient.java index 527789f8a..dc867614c 100644 --- a/coolstore-partner-service/src/main/java/com/cool/store/mq/consumer/ConsumerClient.java +++ b/coolstore-partner-service/src/main/java/com/cool/store/mq/consumer/ConsumerClient.java @@ -12,6 +12,7 @@ import com.cool.store.mq.consumer.listener.*; import com.google.common.collect.Maps; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; +import org.springframework.context.annotation.Lazy; import javax.annotation.Resource; import java.util.Map; @@ -24,6 +25,7 @@ import java.util.Properties; * @date 2021-12-21 11:35 */ @Configuration +@Lazy public class ConsumerClient { @Resource @@ -41,6 +43,10 @@ public class ConsumerClient { @Resource private TpPenaltyAppealListener tpPenaltyAppealListener; @Resource + private ExamAutoSubmitListener examAutoSubmitListener; + @Resource + private ExamAutoEndListener examAutoEndListener; + @Resource private CloseUpApplyStoreUpdateListener closeUpApplyStoreUpdateListener; @Resource private CloseUpPlanOpenStoreListener closeUpPlanOpenStoreListener; @@ -149,6 +155,32 @@ public class ConsumerClient { return consumerBean; } + @Bean(initMethod = "start", destroyMethod = "shutdown") + public ConsumerBean examAutoSubmit() { + RocketMqGroupEnum groupEnum = RocketMqGroupEnum.EXAM_AUTO_SUBMIT; + ConsumerBean consumerBean = new ConsumerBean(); + //配置文件 + Properties properties = getCommonProperties(groupEnum); + consumerBean.setProperties(properties); + Map commonSubscriptionTable = getCommonSubscriptionTable(groupEnum, examAutoSubmitListener); + //订阅多个topic如上面设置 + consumerBean.setSubscriptionTable(commonSubscriptionTable); + return consumerBean; + } + + @Bean(initMethod = "start", destroyMethod = "shutdown") + public ConsumerBean examAutoEnd() { + RocketMqGroupEnum groupEnum = RocketMqGroupEnum.EXAM_AUTO_END; + ConsumerBean consumerBean = new ConsumerBean(); + //配置文件 + Properties properties = getCommonProperties(groupEnum); + consumerBean.setProperties(properties); + Map commonSubscriptionTable = getCommonSubscriptionTable(groupEnum, examAutoEndListener); + //订阅多个topic如上面设置 + consumerBean.setSubscriptionTable(commonSubscriptionTable); + return consumerBean; + } + @Bean(initMethod = "start", destroyMethod = "shutdown") public ConsumerBean closeUpApplyStoreUpdate() { RocketMqGroupEnum groupEnum = RocketMqGroupEnum.CLOSE_UP_APPLY_STORE_UPDATE; diff --git a/coolstore-partner-service/src/main/java/com/cool/store/mq/consumer/listener/ExamAutoEndListener.java b/coolstore-partner-service/src/main/java/com/cool/store/mq/consumer/listener/ExamAutoEndListener.java new file mode 100644 index 000000000..dcd66b423 --- /dev/null +++ b/coolstore-partner-service/src/main/java/com/cool/store/mq/consumer/listener/ExamAutoEndListener.java @@ -0,0 +1,52 @@ +package com.cool.store.mq.consumer.listener; + +import com.aliyun.openservices.ons.api.Action; +import com.aliyun.openservices.ons.api.ConsumeContext; +import com.aliyun.openservices.ons.api.Message; +import com.aliyun.openservices.ons.api.MessageListener; +import com.cool.store.constants.CommonConstants; +import com.cool.store.service.exam.ExamInfoService; +import com.cool.store.utils.RedisUtilPool; +import lombok.extern.slf4j.Slf4j; +import org.apache.commons.lang3.StringUtils; +import org.springframework.stereotype.Service; + +import javax.annotation.Resource; + +/** + * 考试自动结束消费者监听器 + */ +@Slf4j +@Service +public class ExamAutoEndListener implements MessageListener { + + @Resource + private RedisUtilPool redisUtilPool; + @Resource + private ExamInfoService examInfoService; + + @Override + public Action consume(Message message, ConsumeContext context) { + String text = new String(message.getBody()); + if (StringUtils.isBlank(text)) { + log.info("消息体为空,tag:{},messageId:{}", message.getTag(), message.getMsgID()); + return Action.CommitMessage; + } + String lockKey = "ExamAutoEndListener:" + message.getMsgID(); + boolean lock = redisUtilPool.setNxExpire(lockKey, message.getMsgID(), CommonConstants.NORMAL_LOCK_TIMES); + if (lock) { + try { + Long examId = Long.valueOf(text); + examInfoService.autoEndExam(examId); + } catch (Exception e) { + log.error("ExamAutoEndListener consume error", e); + return Action.ReconsumeLater; + } finally { + redisUtilPool.delKey(lockKey); + } + log.info("消费成功,tag:{},messageId:{},examId={}", message.getTag(), message.getMsgID(), text); + return Action.CommitMessage; + } + return Action.ReconsumeLater; + } +} \ No newline at end of file diff --git a/coolstore-partner-service/src/main/java/com/cool/store/mq/consumer/listener/ExamAutoSubmitListener.java b/coolstore-partner-service/src/main/java/com/cool/store/mq/consumer/listener/ExamAutoSubmitListener.java new file mode 100644 index 000000000..e183afaa4 --- /dev/null +++ b/coolstore-partner-service/src/main/java/com/cool/store/mq/consumer/listener/ExamAutoSubmitListener.java @@ -0,0 +1,52 @@ +package com.cool.store.mq.consumer.listener; + +import com.aliyun.openservices.ons.api.Action; +import com.aliyun.openservices.ons.api.ConsumeContext; +import com.aliyun.openservices.ons.api.Message; +import com.aliyun.openservices.ons.api.MessageListener; +import com.cool.store.constants.CommonConstants; +import com.cool.store.service.exam.ExamAttemptService; +import com.cool.store.utils.RedisUtilPool; +import lombok.extern.slf4j.Slf4j; +import org.apache.commons.lang3.StringUtils; +import org.springframework.stereotype.Service; + +import javax.annotation.Resource; + +/** + * 考试自动提交消费者监听器 + */ +@Slf4j +@Service +public class ExamAutoSubmitListener implements MessageListener { + + @Resource + private RedisUtilPool redisUtilPool; + @Resource + private ExamAttemptService examAttemptService; + + @Override + public Action consume(Message message, ConsumeContext context) { + String text = new String(message.getBody()); + if (StringUtils.isBlank(text)) { + log.info("消息体为空,tag:{},messageId:{}", message.getTag(), message.getMsgID()); + return Action.CommitMessage; + } + String lockKey = "ExamAutoSubmitListener:" + message.getMsgID(); + boolean lock = redisUtilPool.setNxExpire(lockKey, message.getMsgID(), CommonConstants.NORMAL_LOCK_TIMES); + if (lock) { + try { + Long attemptId = Long.valueOf(text); + examAttemptService.autoSubmit(attemptId); + } catch (Exception e) { + log.error("ExamAutoSubmitListener consume error", e); + return Action.ReconsumeLater; + } finally { + redisUtilPool.delKey(lockKey); + } + log.info("消费成功,tag:{},messageId:{},attemptId={}", message.getTag(), message.getMsgID(), text); + return Action.CommitMessage; + } + return Action.ReconsumeLater; + } +} \ No newline at end of file diff --git a/coolstore-partner-service/src/main/java/com/cool/store/service/AdjustmentOrderService.java b/coolstore-partner-service/src/main/java/com/cool/store/service/AdjustmentOrderService.java index 1a8f51163..b3e459a37 100644 --- a/coolstore-partner-service/src/main/java/com/cool/store/service/AdjustmentOrderService.java +++ b/coolstore-partner-service/src/main/java/com/cool/store/service/AdjustmentOrderService.java @@ -87,5 +87,11 @@ public interface AdjustmentOrderService { */ Long pageCount(AdjustmentOrderPageRequest request,LoginUserInfo user); + /** + * 审批调整单 + * @param request 审批请求 + * @return 是否成功 + */ + Boolean approval(AdjustmentApprovalRequest request); } diff --git a/coolstore-partner-service/src/main/java/com/cool/store/service/AuditOpeningOperationPlanService.java b/coolstore-partner-service/src/main/java/com/cool/store/service/AuditOpeningOperationPlanService.java index 4ed913cd4..d1f0002b8 100644 --- a/coolstore-partner-service/src/main/java/com/cool/store/service/AuditOpeningOperationPlanService.java +++ b/coolstore-partner-service/src/main/java/com/cool/store/service/AuditOpeningOperationPlanService.java @@ -18,7 +18,7 @@ public interface AuditOpeningOperationPlanService { * @Date: 2024/4/23 * @description:审核方案 */ - + @Deprecated Boolean auditPlan(OpeningOperationPlanAuditRequest openingOperationPlanAuditRequest, LoginUserInfo user); diff --git a/coolstore-partner-service/src/main/java/com/cool/store/service/ExportRealizeService.java b/coolstore-partner-service/src/main/java/com/cool/store/service/ExportRealizeService.java index 920d3f61c..ffbb2d2a7 100644 --- a/coolstore-partner-service/src/main/java/com/cool/store/service/ExportRealizeService.java +++ b/coolstore-partner-service/src/main/java/com/cool/store/service/ExportRealizeService.java @@ -6,7 +6,6 @@ import com.cool.store.request.*; import com.cool.store.request.order.PCStoreOrderQueryRequest; import com.cool.store.request.tp.TpScoreJournalQueryRequest; import com.cool.store.request.visit.VisitRecordQueryRequest; -import com.cool.store.request.visit.VisitRecordQueryRequest; import com.cool.store.response.BranchShopResponse; import com.cool.store.response.FranchiseReportResponse; import com.cool.store.response.ShopReportResponse; @@ -42,6 +41,7 @@ public interface ExportRealizeService { void exportVisitRecord(VisitRecordQueryRequest request, ImportTaskDO importTaskDO); void exportOrderRecord(PCStoreOrderQueryRequest request, ImportTaskDO importTaskDO); + void exportPoint(AllPointPageRequest request, ImportTaskDO importTaskDO); void myExportPoint(PointPageRequest request, String userId, ImportTaskDO importTaskDO); diff --git a/coolstore-partner-service/src/main/java/com/cool/store/service/ExportService.java b/coolstore-partner-service/src/main/java/com/cool/store/service/ExportService.java index 34c93869c..933fcb347 100644 --- a/coolstore-partner-service/src/main/java/com/cool/store/service/ExportService.java +++ b/coolstore-partner-service/src/main/java/com/cool/store/service/ExportService.java @@ -9,6 +9,8 @@ import com.cool.store.request.order.PCStoreOrderQueryRequest; import com.cool.store.request.tp.TpScoreJournalQueryRequest; import com.cool.store.request.visit.VisitRecordQueryRequest; import com.cool.store.request.visit.VisitRecordQueryRequest; +import com.cool.store.request.order.PCStoreOrderQueryRequest; +import com.cool.store.request.visit.VisitRecordQueryRequest; /** * @Author: WangShuo diff --git a/coolstore-partner-service/src/main/java/com/cool/store/service/ImportService.java b/coolstore-partner-service/src/main/java/com/cool/store/service/ImportService.java new file mode 100644 index 000000000..dbcdb2db5 --- /dev/null +++ b/coolstore-partner-service/src/main/java/com/cool/store/service/ImportService.java @@ -0,0 +1,27 @@ +package com.cool.store.service; + +import com.cool.store.context.LoginUserInfo; +import com.cool.store.dto.ImportReceivingBankDTO; +import com.cool.store.entity.ImportTaskDO; + +import java.util.List; +import java.util.Map; + +/** + * @Author: WangShuo + * @Date: 2025/06/19/10:29 + * @Version 1.0 + * @注释: + */ +public interface ImportService { + /** + * 导入银行配置信息 + * @param list + * @param originalFilename + * @param userId + * @param task + * @return + */ + Boolean importReceivingBank(List list, String originalFilename, String userId, + ImportTaskDO task); +} diff --git a/coolstore-partner-service/src/main/java/com/cool/store/service/LiePinService.java b/coolstore-partner-service/src/main/java/com/cool/store/service/LiePinService.java new file mode 100644 index 000000000..2d4a2ae89 --- /dev/null +++ b/coolstore-partner-service/src/main/java/com/cool/store/service/LiePinService.java @@ -0,0 +1,36 @@ +package com.cool.store.service; + +/** + * 猎聘-招商 业务servive + * @Author suzhuhong + * @Date 2025/5/26 19:26 + * @Version 1.0 + */ +public interface LiePinService { + + + /** + * 获取小程序跳转链接 + * @param shopCode + * @return mobile 当前登录人手机号 + */ + String getJumpUrl(String shopCode,String mobile,String userName); + + /** + * 推送门店到猎聘 + * @param shopCode + * @return + */ + Long pushStoreToLiePin(String shopCode); + + /** + * 推送门店人员到对应门店 + * @param shopCode + * @param mobile + * @param userName + * @return + */ + Long pushStoreEmpToLiePin(String shopCode,String mobile,String userName); + + +} diff --git a/coolstore-partner-service/src/main/java/com/cool/store/service/LinePayService.java b/coolstore-partner-service/src/main/java/com/cool/store/service/LinePayService.java index 98d1c581d..faee3687b 100644 --- a/coolstore-partner-service/src/main/java/com/cool/store/service/LinePayService.java +++ b/coolstore-partner-service/src/main/java/com/cool/store/service/LinePayService.java @@ -4,9 +4,12 @@ import com.cool.store.context.CurrentUserHolder; import com.cool.store.context.LoginUserInfo; import com.cool.store.dto.AmountDTO; import com.cool.store.entity.LinePayDO; +import com.cool.store.request.FranchiseFeePayOnlineRequest; import com.cool.store.request.LinePaySubmitRequest; +import com.cool.store.request.xgj.OnlinePayInfoRequest; import com.cool.store.request.xgj.ReceiptCallBackRequest; import com.cool.store.response.FranchiseFeePayInfoResponse; +import com.cool.store.response.FranchiseFeePayOnlineResponse; import com.cool.store.response.bigdata.ApiResponse; import com.cool.store.vo.LinePayVO; import com.cool.store.vo.PartnerUserInfoVO; @@ -51,7 +54,13 @@ public interface LinePayService { */ Boolean pushPayInfo(Long shopId, LinePayDO linePayDO); + Boolean onlinePushPayInfo(Long shopId, LinePayDO linePayDO); + ApiResponse ReceiptCallBack(ReceiptCallBackRequest request); + FranchiseFeePayOnlineResponse franchiseFeePayOnline(FranchiseFeePayOnlineRequest request, String userId); + ApiResponse changeOnlinePayInfo(OnlinePayInfoRequest onlinePayInfoRequest); + + Boolean cancelFranchiseFeePayOnline(Long id,String userId); } diff --git a/coolstore-partner-service/src/main/java/com/cool/store/service/OpenApiService.java b/coolstore-partner-service/src/main/java/com/cool/store/service/OpenApiService.java index c60ad7e3e..3de031115 100644 --- a/coolstore-partner-service/src/main/java/com/cool/store/service/OpenApiService.java +++ b/coolstore-partner-service/src/main/java/com/cool/store/service/OpenApiService.java @@ -3,6 +3,7 @@ package com.cool.store.service; import com.cool.store.dto.BatchStatusRefreshDTO; import com.cool.store.dto.StatusRefreshDTO; import com.cool.store.request.xgj.FranchiseFeeCallBackRequest; +import com.cool.store.request.xgj.OnlinePayInfoRequest; import com.cool.store.request.xgj.ReceiptCallBackRequest; import com.cool.store.response.bigdata.ApiResponse; @@ -21,9 +22,25 @@ public interface OpenApiService { */ Boolean statusRefresh(StatusRefreshDTO statusRefreshDTO); - + /** + * 线下支付收款单 回调 + * @param request + * @return + */ ApiResponse changeReceiptStatus(ReceiptCallBackRequest request); + /** + * 账单收款状态及缴款金额 + * @param request + * @return + */ ApiResponse changePaymentStatus(FranchiseFeeCallBackRequest request); + /** + * 线上支付 回调收款单信息 包括交易流水号 支付时间等 + * @param onlinePayInfoRequest + * @return + */ + ApiResponse changeOnlinePayInfo(OnlinePayInfoRequest onlinePayInfoRequest); + } diff --git a/coolstore-partner-service/src/main/java/com/cool/store/service/OpeningOperationPlanService.java b/coolstore-partner-service/src/main/java/com/cool/store/service/OpeningOperationPlanService.java index 219b9bab2..27d1455f7 100644 --- a/coolstore-partner-service/src/main/java/com/cool/store/service/OpeningOperationPlanService.java +++ b/coolstore-partner-service/src/main/java/com/cool/store/service/OpeningOperationPlanService.java @@ -7,8 +7,6 @@ import com.cool.store.vo.OpeningOperationPlanListVO; import com.cool.store.vo.OpeningOperationPlanVO; import com.github.pagehelper.PageInfo; -import java.time.LocalDate; -import java.util.List; /** * @Auther: WangShuo diff --git a/coolstore-partner-service/src/main/java/com/cool/store/service/OperationLogService.java b/coolstore-partner-service/src/main/java/com/cool/store/service/OperationLogService.java index 78fc3b7ee..88dbb9304 100644 --- a/coolstore-partner-service/src/main/java/com/cool/store/service/OperationLogService.java +++ b/coolstore-partner-service/src/main/java/com/cool/store/service/OperationLogService.java @@ -21,4 +21,13 @@ public interface OperationLogService { List getAuditInfo(Long shopId,List shopSubStageList); Boolean batchUpdateProcessed( List operationLogs,Long audit , String userId, String reason); + + /** + * 后期新增的阶段数据 对于处在阶段中的数据 可能没有提前生成审批记录 直接插入数据 且是审批完成状态 + * @param subStageStatusEnum + * @param audit + * @param userId + * @param reason + */ + Boolean handleApproveTimeNoDate(Long shopId,ShopSubStageStatusEnum subStageStatusEnum,Long audit , String userId, String reason); } diff --git a/coolstore-partner-service/src/main/java/com/cool/store/service/PointService.java b/coolstore-partner-service/src/main/java/com/cool/store/service/PointService.java index 434aa05cf..6df49961b 100644 --- a/coolstore-partner-service/src/main/java/com/cool/store/service/PointService.java +++ b/coolstore-partner-service/src/main/java/com/cool/store/service/PointService.java @@ -304,7 +304,7 @@ public interface PointService { * @param request * @return */ - Integer uploadRentContract(AddRentContractRequest request); + Integer uploadRentContract(AddRentContractRequest request,String userId,String userName); /** * 获取租赁合同详情 diff --git a/coolstore-partner-service/src/main/java/com/cool/store/service/PreparationService.java b/coolstore-partner-service/src/main/java/com/cool/store/service/PreparationService.java index 368196ac2..f42167a66 100644 --- a/coolstore-partner-service/src/main/java/com/cool/store/service/PreparationService.java +++ b/coolstore-partner-service/src/main/java/com/cool/store/service/PreparationService.java @@ -42,6 +42,11 @@ public interface PreparationService { */ void contractAndBuildStoreCompletion(Long shopId); + /** + * 装修完成 + * @param shopId + */ + void decorationCompletion(Long shopId) ; /** * 建店完成 diff --git a/coolstore-partner-service/src/main/java/com/cool/store/service/PushService.java b/coolstore-partner-service/src/main/java/com/cool/store/service/PushService.java index f9444f0a8..28905defb 100644 --- a/coolstore-partner-service/src/main/java/com/cool/store/service/PushService.java +++ b/coolstore-partner-service/src/main/java/com/cool/store/service/PushService.java @@ -4,7 +4,9 @@ import com.cool.store.dto.*; import com.cool.store.dto.contract.ContractCallbackDTO; import com.cool.store.request.AuditRequest; import com.cool.store.request.ZxjpApiRequest; +import com.cool.store.request.xgj.CancelPayRequest; import com.cool.store.request.xgj.PushFranchiseFeeRequest; +import com.cool.store.request.xgj.ReceiptOnlineRequest; import com.cool.store.request.xgj.ReceiptRequest; import com.cool.store.response.XgjAccessTokenDTO; @@ -38,6 +40,12 @@ public interface PushService { * @return */ Boolean pushReceiptToXGJ(ReceiptRequest receiptRequest); + /** + * 推送线上支付 收款单到新管家 + * @param receiptRequest + * @return + */ + Boolean pushOnlineReceiptToXGJ(ReceiptOnlineRequest receiptRequest); /** * 推送数据到下游系统 POS diff --git a/coolstore-partner-service/src/main/java/com/cool/store/service/ReceivingBankService.java b/coolstore-partner-service/src/main/java/com/cool/store/service/ReceivingBankService.java new file mode 100644 index 000000000..d05140dae --- /dev/null +++ b/coolstore-partner-service/src/main/java/com/cool/store/service/ReceivingBankService.java @@ -0,0 +1,22 @@ +package com.cool.store.service; + +import com.cool.store.request.ReceivingBankListRequest; +import com.cool.store.request.ReceivingBankRequest; +import com.cool.store.response.ReceivingBankResponse; +import com.github.pagehelper.PageInfo; + +/** + * @Author: WangShuo + * @Date: 2025/06/18/17:53 + * @Version 1.0 + * @注释: + */ +public interface ReceivingBankService { + + Integer submit(ReceivingBankRequest request,String userId); + + PageInfo getByFranchiseBrandAndRegionId(ReceivingBankListRequest request); + + //获取该门店的收款方信息 + ReceivingBankResponse getByShopId(Long shopId); +} diff --git a/coolstore-partner-service/src/main/java/com/cool/store/service/StoreService.java b/coolstore-partner-service/src/main/java/com/cool/store/service/StoreService.java index e1422a652..9551511ff 100644 --- a/coolstore-partner-service/src/main/java/com/cool/store/service/StoreService.java +++ b/coolstore-partner-service/src/main/java/com/cool/store/service/StoreService.java @@ -62,4 +62,8 @@ public interface StoreService { */ List getStoreUserPositionList(String storeId, String userName); + /** + * 处理门店报表 + */ + void saveStoreReport(String date); } diff --git a/coolstore-partner-service/src/main/java/com/cool/store/service/ThirdFoodService.java b/coolstore-partner-service/src/main/java/com/cool/store/service/ThirdFoodService.java index 2a4ae9ffa..ef4aacebb 100644 --- a/coolstore-partner-service/src/main/java/com/cool/store/service/ThirdFoodService.java +++ b/coolstore-partner-service/src/main/java/com/cool/store/service/ThirdFoodService.java @@ -2,6 +2,11 @@ package com.cool.store.service; import com.cool.store.dto.FoodTokenDTO; import com.cool.store.dto.recipe.RecipeSpLaunchDTO; +import com.cool.store.dto.GetAccessTokenDTO; +import com.cool.store.dto.food.DishesDTO; + +import java.util.List; +import com.cool.store.dto.store.StoreUserPositionDTO; import com.cool.store.dto.store.StoreUserUpdateDTO; import com.cool.store.request.recipe.RevenueDataRequest; import com.cool.store.request.recipe.SalesVolumeDayRequest; @@ -26,6 +31,16 @@ public interface ThirdFoodService { */ String getFoodToken(FoodTokenDTO dto); + /** + * 查询已购菜品 + * @param dto + * @return + */ + List getPurchasedDishesList(FoodTokenDTO dto); + + List getMyDesignDishesList(FoodTokenDTO dto); + + /** * 推送门店人员信息 * @param storeUserUpdateDTOList diff --git a/coolstore-partner-service/src/main/java/com/cool/store/service/ThirdLiePinService.java b/coolstore-partner-service/src/main/java/com/cool/store/service/ThirdLiePinService.java new file mode 100644 index 000000000..9dfeaeb61 --- /dev/null +++ b/coolstore-partner-service/src/main/java/com/cool/store/service/ThirdLiePinService.java @@ -0,0 +1,53 @@ +package com.cool.store.service; + +import com.cool.store.request.liepin.AddStoreEmpRequest; +import com.cool.store.request.liepin.AddStoreRequest; +import com.cool.store.request.liepin.GetAccessTokenRequest; +import com.cool.store.request.liepin.GetPathRequest; +import com.cool.store.response.liepin.PathResponse; + +/** + * @Author suzhuhong + * @Date 2025/5/20 15:33 + * @Version 1.0 + */ +public interface ThirdLiePinService { + + + /** + * 有效期30天,调用接口时拼接在链接后面 + * @param request + * @return + */ + String getAccessToken(GetAccessTokenRequest request); + + /** + * 新增门店 + * @param addStoreRequest + * @return + */ + Long addStoreToLiePin(AddStoreRequest addStoreRequest); + + /** + * 新增门店成员 + * @param addStoreEmpRequest + * @return + */ + Long addStoreEmp(AddStoreEmpRequest addStoreEmpRequest); + + /** + * 获取小程序调整链接 + * @param getPathRequest + * @return + */ + PathResponse getPath(GetPathRequest getPathRequest); + + /** + * 上传图片返回地址 只有该地址薪超人能解析 + * @param ossUrl + * @return + */ + String getFilePath(String ossUrl); + + +} diff --git a/coolstore-partner-service/src/main/java/com/cool/store/service/UserAuthMappingService.java b/coolstore-partner-service/src/main/java/com/cool/store/service/UserAuthMappingService.java index 988140566..ae411c5e5 100644 --- a/coolstore-partner-service/src/main/java/com/cool/store/service/UserAuthMappingService.java +++ b/coolstore-partner-service/src/main/java/com/cool/store/service/UserAuthMappingService.java @@ -1,10 +1,12 @@ package com.cool.store.service; +import com.cool.store.dto.BigRegionUserListDTO; import com.cool.store.dto.UserDTO; import com.cool.store.entity.EnterpriseUserDO; import com.cool.store.entity.UserAuthMappingDO; import com.cool.store.enums.UserRoleEnum; import com.cool.store.request.SysRoleRequest; +import com.cool.store.response.bigdata.ApiResponse; import com.github.pagehelper.PageInfo; import java.util.List; @@ -132,4 +134,10 @@ public interface UserAuthMappingService { * @return */ List findUserListByRole(SysRoleRequest request,Boolean flag); + + /** + * 查询所有大区指定角色的 用户 + * @return + */ + ApiResponse> getAllBigRegionSpecialRoleUserList(String storeCode, UserRoleEnum userRoleEnum); } diff --git a/coolstore-partner-service/src/main/java/com/cool/store/service/WechatMiniAppService.java b/coolstore-partner-service/src/main/java/com/cool/store/service/WechatMiniAppService.java index d77703d46..7d1cd5ad4 100644 --- a/coolstore-partner-service/src/main/java/com/cool/store/service/WechatMiniAppService.java +++ b/coolstore-partner-service/src/main/java/com/cool/store/service/WechatMiniAppService.java @@ -43,4 +43,13 @@ public interface WechatMiniAppService { * @return 用户信息VO */ PartnerUserInfoVO getUserInfoByShortTermToken(String token); + + /** + * 生成微信小程序二维码 + * @param page 页面路径,路径前不带/ + * @param scene 参数,必填 + * @param width 二维码的宽度 + * @return 二维码图片路径 + */ + String createQrCode(String page, String scene, String width); } diff --git a/coolstore-partner-service/src/main/java/com/cool/store/service/XbbApiCaller.java b/coolstore-partner-service/src/main/java/com/cool/store/service/XbbApiCaller.java new file mode 100644 index 000000000..c915c3bc2 --- /dev/null +++ b/coolstore-partner-service/src/main/java/com/cool/store/service/XbbApiCaller.java @@ -0,0 +1,270 @@ +package com.cool.store.service; + +import cn.hutool.core.lang.Dict; +import cn.hutool.core.lang.TypeReference; +import cn.hutool.core.lang.UUID; +import cn.hutool.core.net.url.UrlQuery; +import cn.hutool.core.util.StrUtil; +import cn.hutool.http.HttpRequest; +import cn.hutool.http.HttpResponse; +import cn.hutool.http.HttpUtil; +import cn.hutool.json.JSONUtil; +import com.alibaba.fastjson.JSONObject; +import com.cool.store.dto.liepin.XbbAppInfo; +import com.cool.store.dto.liepin.XbbEncryptedData; +import com.cool.store.enums.ErrorCodeEnum; +import com.cool.store.exception.ServiceException; +import com.cool.store.request.liepin.XbbGetRequest; +import com.cool.store.request.liepin.XbbPostRequest; +import com.cool.store.response.liepin.XbbResponse; +import com.cool.store.response.oppty.OpportunityApiResponse; +import com.cool.store.utils.hire.XbbAesUtil; +import com.cool.store.utils.hire.XbbSignatureInfo; +import com.fasterxml.jackson.core.JsonProcessingException; +import com.fasterxml.jackson.databind.JavaType; +import com.fasterxml.jackson.databind.ObjectMapper; +import lombok.extern.slf4j.Slf4j; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Service; + +import javax.annotation.Resource; +import java.nio.charset.StandardCharsets; +import java.util.List; +import java.util.Map; + +/** + * @author sha.li + * @since 2025-03-28 14:53 + */ +@Slf4j +public class XbbApiCaller { + + private ObjectMapper objectMapper; + private final String domain; + private final String appId; + private final String secretKey; + private final String aesSecretKey; + + public XbbApiCaller(String domain, String appId, String secretKey, String aesSecretKey,ObjectMapper objectMapper) { + this.domain = domain; + this.appId = appId; + this.secretKey = secretKey; + this.aesSecretKey = aesSecretKey; + this.objectMapper = objectMapper; + } + + /** + * 发送get请求 + */ + public XbbResponse get(XbbGetRequest request, + Class responseDataType,String token) { + + XbbSignatureInfo xbbSignatureInfo = XbbSignatureInfo.createGet(); + xbbSignatureInfo.setAppId(getAppId()); + xbbSignatureInfo.setUri(request.getUri()); + xbbSignatureInfo.setQueryString(UrlQuery.of(request.getQueryParam()).toString()); + xbbSignatureInfo.setRequestPayload(null); + xbbSignatureInfo.setNonce(UUID.randomUUID().toString(true)); + xbbSignatureInfo.setTimestamp(System.currentTimeMillis()); + xbbSignatureInfo.setAesSecretkey(getAesSecretKey()); + + String getUrlTemplate = "{domain}{uri}{queryString}"; + String url = StrUtil.format(getUrlTemplate, Dict.of( + "domain", getDomain(), + "uri", request.getUri(), + "queryString", StrUtil.isBlank(xbbSignatureInfo.getQueryString()) ? "" : "?" + xbbSignatureInfo.getQueryString() + )); + HttpRequest httpRequest = HttpUtil.createGet(url).timeout(request.getRequestTimeout()); + return sendRequest("",token, responseDataType, httpRequest, xbbSignatureInfo, request.isResponseDecrypt()); + } + + /** + * 发送post请求 + */ + public XbbResponse post(XbbPostRequest request, Class responseDataType,String token) { + + String requestBody; + if (request.isRequestEncrypt()) { + Dict encryptData = Dict.of("encrypt_data", XbbAesUtil.encrypt(request.getJsonString(), getAesSecretKey())); + requestBody = JSONUtil.toJsonStr(encryptData); + } else { + requestBody = request.getJsonString(); + } + XbbSignatureInfo xbbSignatureInfo = XbbSignatureInfo.createPost(); + xbbSignatureInfo.setAppId(getAppId()); + xbbSignatureInfo.setUri(request.getUri()); + xbbSignatureInfo.setQueryString(UrlQuery.of(request.getQueryParam()).toString()); + xbbSignatureInfo.setRequestPayload(requestBody.getBytes(StandardCharsets.UTF_8)); + xbbSignatureInfo.setNonce(UUID.randomUUID().toString(true)); + xbbSignatureInfo.setTimestamp(System.currentTimeMillis()); + xbbSignatureInfo.setAesSecretkey(getAesSecretKey()); + + String postUrlTemplate = "{domain}{uri}{queryString}"; + String url = StrUtil.format(postUrlTemplate, Dict.of( + "domain", getDomain(), + "uri", request.getUri(), + "queryString", StrUtil.isBlank(xbbSignatureInfo.getQueryString()) ? "" : "?" + xbbSignatureInfo.getQueryString() + )); + HttpRequest httpRequest = HttpUtil.createPost(url).timeout(request.getRequestTimeout()); + httpRequest.body(requestBody); + log.info("url:{} , body:{} ", url,JSONObject.toJSONString(requestBody)); + return sendRequest(requestBody,token, responseDataType, httpRequest, xbbSignatureInfo, request.isResponseDecrypt()); + } + + + private XbbResponse sendRequest(String requestBody, + String token, + Class responseDataType, + HttpRequest httpRequest, + XbbSignatureInfo xbbSignatureInfo, + boolean responseDecrypt) { + httpRequest.header("Authorization", "Bearer " + token); + httpRequest.header("Content-Type", "application/json"); + httpRequest.header("X-App-Id", xbbSignatureInfo.getAppId()); + httpRequest.header("X-Signature", xbbSignatureInfo.toSignature()); + httpRequest.header("X-SignatureMethod", "SHA256"); + httpRequest.header("X-Nonce", xbbSignatureInfo.getNonce()); + httpRequest.header("X-Timestamp", String.valueOf(xbbSignatureInfo.getTimestamp())); + log.info("heads:{} ", JSONObject.toJSONString(httpRequest.headers())); +// String post = generateCurlCommand("POST", httpRequest.getUrl(), httpRequest.headers(), requestBody); +// log.info("===={}",post); + try (HttpResponse httpResponse = httpRequest.execute()) { + int httpResponseStatus = httpResponse.getStatus(); + //状态码校验 + if (httpResponseStatus != 200) { + throw new ServiceException(ErrorCodeEnum.THIRD_API_ERROR,"状态码"+httpResponseStatus); + } + String responseBody = httpResponse.body(); + logResponse(httpRequest.getUrl(),httpResponse.getStatus(),responseBody); + if (responseDecrypt) { + XbbResponse response = JSONUtil.toBean(responseBody, new TypeReference>() { + }, false); + String dataStr = decrypt(response.getData().getEncryptData()); + T data = JSONUtil.toBean(dataStr, responseDataType); + return new XbbResponse() + .setCode(response.getCode()) + .setMsg(response.getMsg()) + .setSuccess(response.isSuccess()) + .setData(data); + } + JavaType javaType = objectMapper.getTypeFactory() + .constructParametricType(XbbResponse.class, responseDataType); + XbbResponse apiResponse = null; + try { + apiResponse = objectMapper.readValue(responseBody, javaType); + } catch (Exception e) { + log.info("数据转换异常:{}",e.getMessage()); + } + //业务码校验 + if (apiResponse.getCode() != 2000) { + throw new ServiceException(ErrorCodeEnum.THIRD_API_ERROR,apiResponse.getMsg()); + } + return apiResponse; + } + } + + + public static String generateCurlCommand(String method, + String url, + Map> headers, + String body) { + StringBuilder curlCommand = new StringBuilder("curl -X ").append(method.toUpperCase()).append(" \\\n"); + + // Add URL + curlCommand.append(" '").append(url).append("' \\\n"); + + // Add headers + for (Map.Entry> entry : headers.entrySet()) { + curlCommand.append(" -H '") + .append(entry.getKey()) + .append(": ") + .append(entry.getValue().get((0))) + .append("' \\\n"); + } + + // Add body if present + if (body != null && !body.isEmpty()) { + // Escape single quotes in the body + String escapedBody = body.replace("'", "'\\''"); + curlCommand.append(" -d '").append(escapedBody).append("'"); + } + + return curlCommand.toString(); + } + + /** + * 记录请求日志 + */ + 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); + } + } + } + + /** + * 记录响应日志 + */ + 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); + } + } + } + + private String encrypt(String data) { + return XbbAesUtil.encrypt(data, getAesSecretKey()); + } + + private String decrypt(String encryptData) { + return XbbAesUtil.decrypt(encryptData, getAesSecretKey()); + } + + public String getDomain() { + return domain; + } + + public String getAppId() { + return appId; + } + + public String getSecretKey() { + return secretKey; + } + + public String getAesSecretKey() { + return aesSecretKey; + } +} diff --git a/coolstore-partner-service/src/main/java/com/cool/store/service/approval/CommonApprovalLogService.java b/coolstore-partner-service/src/main/java/com/cool/store/service/approval/CommonApprovalLogService.java new file mode 100644 index 000000000..7452da534 --- /dev/null +++ b/coolstore-partner-service/src/main/java/com/cool/store/service/approval/CommonApprovalLogService.java @@ -0,0 +1,31 @@ +package com.cool.store.service.approval; + +import com.cool.store.entity.approval.CommonApprovalLogDO; +import com.cool.store.vo.approval.ApprovalGroupedVO; + +import java.util.List; + +public interface CommonApprovalLogService { + + /** + * 插入单条审批记录(提交场景) + */ + void insertSingleRecord(String applicationNo, String handleUserId, String handleUserName, String nodeCode, String nodeName); + + /** + * 批量插入审批记录(同一批次) + */ + void batchInsertApprovalRecords(String applicationNo, List records); + + /** + * 更新节点审批状态(权限校验 + 可选生成下一节点) + */ + void updateNodeApprovalStatus(String applicationNo, String currentNodeCode, + String result, String handleUserId, String handleUserName, + String comment, boolean generateNextNode, Long regionId); + + /** + * 查询某个申请的所有审批记录(按版本号分组) + */ + ApprovalGroupedVO getApprovalRecordsGroupedByVersion(String applicationNo); +} diff --git a/coolstore-partner-service/src/main/java/com/cool/store/service/approval/impl/CommonApprovalLogServiceImpl.java b/coolstore-partner-service/src/main/java/com/cool/store/service/approval/impl/CommonApprovalLogServiceImpl.java new file mode 100644 index 000000000..698c1bec2 --- /dev/null +++ b/coolstore-partner-service/src/main/java/com/cool/store/service/approval/impl/CommonApprovalLogServiceImpl.java @@ -0,0 +1,222 @@ +package com.cool.store.service.approval.impl; + +import com.cool.store.dao.approval.CommonApprovalLogDAO; +import com.cool.store.dao.EnterpriseUserDAO; +import com.cool.store.entity.EnterpriseUserDO; +import com.cool.store.entity.approval.CommonApprovalLogDO; +import com.cool.store.enums.UserRoleEnum; +import com.cool.store.enums.approval.ApprovalResultEnum; +import com.cool.store.enums.renewal.RenewalNodeEnum; +import com.cool.store.exception.ServiceException; +import com.cool.store.service.UserAuthMappingService; +import com.cool.store.service.approval.CommonApprovalLogService; +import com.cool.store.utils.GenerateNoUtil; +import com.cool.store.utils.poi.DateUtils; +import com.cool.store.vo.approval.ApprovalBatchVO; +import com.cool.store.vo.approval.ApprovalGroupedVO; +import com.cool.store.vo.approval.ApprovalHandleVO; +import lombok.RequiredArgsConstructor; +import lombok.extern.slf4j.Slf4j; +import org.apache.commons.collections4.CollectionUtils; +import org.apache.commons.collections4.ListUtils; +import org.springframework.stereotype.Service; +import org.springframework.transaction.annotation.Transactional; + +import java.util.*; +import java.util.stream.Collectors; + +@Service +@RequiredArgsConstructor +@Slf4j +public class CommonApprovalLogServiceImpl implements CommonApprovalLogService { + + private final CommonApprovalLogDAO commonApprovalLogDAO; + private final UserAuthMappingService userAuthMappingService; + private final EnterpriseUserDAO enterpriseUserDAO; + + @Override + public void insertSingleRecord(String applicationNo, String handleUserId, String handleUserName, String nodeCode, String nodeName) { + commonApprovalLogDAO.addSubmitRecord(applicationNo, handleUserId, handleUserName, nodeCode, nodeName); + } + + @Override + public void batchInsertApprovalRecords(String applicationNo, List records) { + if (CollectionUtils.isEmpty(records)) { + return; + } + Long version = GenerateNoUtil.generateVersion(); + records.forEach(r -> { + r.setApplicationNo(applicationNo); + r.setVersion(version); + r.setStatus("2"); + r.setSubmitType(1); + r.setOperateTime(new Date()); + r.setDeleted(0); + }); + commonApprovalLogDAO.batchInsertApprovalRecords(records); + } + + @Override + @Transactional + public void updateNodeApprovalStatus(String applicationNo, String currentNodeCode, + String result, String handleUserId, String handleUserName, + String comment, boolean generateNextNode, Long regionId) { + // 获取当前节点所有待处理记录 + List pendingRecords = commonApprovalLogDAO.getPendingByApplicationNoAndNodeCode(applicationNo, currentNodeCode); + + // 检查当前操作人是否在审批列表中,如果不在则新增 + boolean isCurrentUserInList = false; + if (CollectionUtils.isNotEmpty(pendingRecords)) { + isCurrentUserInList = pendingRecords.stream() + .anyMatch(record -> handleUserId.equals(record.getHandleUserId())); + } + + if (!isCurrentUserInList) { + // 新增当前操作人的审批记录 + String currentNodeCodeName = RenewalNodeEnum.getNameByCode(currentNodeCode); + Long version = null ; + if (CollectionUtils.isNotEmpty(pendingRecords)){ + version = pendingRecords.get(0).getVersion(); + } + + CommonApprovalLogDO newRecord = CommonApprovalLogDO.builder() + .applicationNo(applicationNo) + .nodeCode(currentNodeCode) + .nodeName(currentNodeCodeName) + .handleUserId(handleUserId) + .handleUserName(handleUserName) + .status("2") + .submitType(1) + .deleted(0) + .operateTime(new Date()) + .build(); + commonApprovalLogDAO.addApproveRecord(newRecord.getApplicationNo(), newRecord.getNodeCode(), + newRecord.getNodeName(), newRecord.getHandleUserId(), newRecord.getHandleUserName(),version); + // 重新获取待处理记录 + pendingRecords = commonApprovalLogDAO.getPendingByApplicationNoAndNodeCode(applicationNo, currentNodeCode); + } + + // 当前节点所有审批人标记为已处理 + if (CollectionUtils.isNotEmpty(pendingRecords)) { + Date now = new Date(); + for (CommonApprovalLogDO record : pendingRecords) { + record.setStatus("1"); + record.setComment(comment); + record.setOperateTime(now); + // 仅当前操作人记录实际处理人信息 + if (record.getHandleUserId() != null && record.getHandleUserId().equals(handleUserId)) { + record.setResult(result); + } + } + commonApprovalLogDAO.batchUpdateRecords(pendingRecords); + } + + // 通过时生成下一节点 + if (generateNextNode && ApprovalResultEnum.PASS.getResult().equals(result)) { + String nextNodeCode = RenewalNodeEnum.getNextNode(currentNodeCode); + if (nextNodeCode != null) { + RenewalNodeEnum nextNode = RenewalNodeEnum.getByCode(nextNodeCode); + if (nextNode != null) { + // 获取下一节点审批人 + List auditUserIds = getAuditUserIds(regionId, nextNodeCode); + List nextRecords = new ArrayList<>(); + for (String userId : auditUserIds) { + EnterpriseUserDO user = enterpriseUserDAO.getUserInfoById(userId); + String userName = user != null ? user.getName() : ""; + CommonApprovalLogDO record = CommonApprovalLogDO.builder() + .nodeCode(nextNodeCode) + .nodeName(nextNode.getName()) + .handleUserId(userId) + .handleUserName(userName) + .build(); + nextRecords.add(record); + } + if (CollectionUtils.isNotEmpty(nextRecords)) { + batchInsertApprovalRecords(applicationNo, nextRecords); + } + } + } + } + } + + @Override + public ApprovalGroupedVO getApprovalRecordsGroupedByVersion(String applicationNo) { + List allRecords = commonApprovalLogDAO.getByApplicationNo(applicationNo); + ApprovalGroupedVO result = new ApprovalGroupedVO(); + result.setApplicationNo(applicationNo); + + if (CollectionUtils.isEmpty(allRecords)) { + result.setBatches(new ArrayList<>()); + return result; + } + + // 按version分组 + Map> versionGroups = allRecords.stream() + .collect(Collectors.groupingBy(CommonApprovalLogDO::getVersion, LinkedHashMap::new, Collectors.toList())); + + // 按nodeCode分组构建批次 + List batches = new ArrayList<>(); + for (Map.Entry> versionEntry : versionGroups.entrySet()) { + Long version = versionEntry.getKey(); + List versionRecords = versionEntry.getValue(); + + // 按nodeCode分组 + Map> nodeGroups = versionRecords.stream() + .collect(Collectors.groupingBy(CommonApprovalLogDO::getNodeCode, LinkedHashMap::new, Collectors.toList())); + + for (Map.Entry> nodeEntry : nodeGroups.entrySet()) { + String nodeCode = nodeEntry.getKey(); + List nodeRecords = nodeEntry.getValue(); + + ApprovalBatchVO batchVO = new ApprovalBatchVO(); + batchVO.setVersion(version); + batchVO.setNodeCode(nodeCode); + // 取第一个记录的nodeName + batchVO.setNodeName(nodeRecords.get(0).getNodeName()); + + List handleList = nodeRecords.stream().map(r -> { + ApprovalHandleVO handleVO = new ApprovalHandleVO(); + handleVO.setHandleUserId(r.getHandleUserId()); + handleVO.setHandleUserName(r.getHandleUserName()); + handleVO.setStatus(r.getStatus()); + handleVO.setResult(r.getResult()); + handleVO.setComment(r.getComment()); + handleVO.setSubmitType(r.getSubmitType()); + handleVO.setOperateTime(DateUtils.parseDateToStr(DateUtils.YYYY_MM_DD_HH_MM_SS,r.getOperateTime())); + return handleVO; + }).collect(Collectors.toList()); + + batchVO.setHandleUserIdList(handleList); + batches.add(batchVO); + } + } + + result.setBatches(batches); + return result; + } + + /** + * 根据节点code获取对应的审批人ID列表 + */ + private List getAuditUserIds(Long regionId, String nodeCode) { + UserRoleEnum roleEnum; + switch (nodeCode) { + case "20": + roleEnum = UserRoleEnum.SUPERVISION; + break; + case "25": + roleEnum = UserRoleEnum.OPERATION_GENERAL_CONSULTANT; + break; + case "30": + roleEnum = UserRoleEnum.ENGINEER_DEP_MANAGER; + break; + default: + return new ArrayList<>(); + } + List users = userAuthMappingService.getAllUserByRoleEnumAndRegionId(roleEnum, regionId); + return ListUtils.emptyIfNull(users).stream() + .map(EnterpriseUserDO::getUserId) + .distinct() + .collect(Collectors.toList()); + } +} 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 index a28037408..ba346f607 100644 --- 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 @@ -2,14 +2,14 @@ package com.cool.store.service.close; import com.cool.store.dto.close.CloseStoreMkUserDTO; import com.cool.store.dto.xgj.XgjBranchBankDTO; -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.dto.xgj.XgjPartnerPageDTO; import com.cool.store.entity.CloseStoreRefundInfoDO; import com.cool.store.request.close.refund.*; import com.cool.store.request.xgj.XgjBankQueryRequest; +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; 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 index 522842eaa..4e0f55323 100644 --- 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 @@ -20,6 +20,11 @@ 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.*; +import com.cool.store.request.xgj.XgjPartnerQueryRequest; +import com.cool.store.request.xgj.XgjPaymentRequest; +import com.cool.store.request.xgj.XgjReimburseRequest; +import com.cool.store.request.xgj.XgjSavePartnerRequest; import com.cool.store.request.close.refund.CloseStoreRefundAddRequest; import com.cool.store.request.close.refund.CloseStoreRefundQueryRequest; import com.cool.store.request.close.refund.CloseStoreRefundSkipRequest; diff --git a/coolstore-partner-service/src/main/java/com/cool/store/service/closeup/impl/CloseUpServiceImpl.java b/coolstore-partner-service/src/main/java/com/cool/store/service/closeup/impl/CloseUpServiceImpl.java index 02f4b10ac..8c17b6b50 100644 --- a/coolstore-partner-service/src/main/java/com/cool/store/service/closeup/impl/CloseUpServiceImpl.java +++ b/coolstore-partner-service/src/main/java/com/cool/store/service/closeup/impl/CloseUpServiceImpl.java @@ -503,7 +503,8 @@ public class CloseUpServiceImpl implements CloseUpService { List unClosePlatformList = list.stream() .filter(platformDO -> platformDO.getStatus().equals(0) && platformDO.getType().equals(1) - && !(new Date()).before(platformDO.getTaskStartDate())) + && !(new Date()).before(platformDO.getTaskStartDate()) + && Objects.nonNull(CloseUpPlatformEnum.getPlatformCodeByCode(platformDO.getCode()))) .collect(Collectors.toList()); if (CollectionUtils.isEmpty(unClosePlatformList)) { log.info("未处理的自动关闭平台为空"); diff --git a/coolstore-partner-service/src/main/java/com/cool/store/service/contract/ContractMasterService.java b/coolstore-partner-service/src/main/java/com/cool/store/service/contract/ContractMasterService.java new file mode 100644 index 000000000..63934a387 --- /dev/null +++ b/coolstore-partner-service/src/main/java/com/cool/store/service/contract/ContractMasterService.java @@ -0,0 +1,16 @@ +package com.cool.store.service.contract; + +import com.cool.store.request.contract.ContractMasterQueryRequest; +import com.cool.store.vo.contract.ContractMasterDetailVO; +import com.cool.store.vo.contract.ContractMasterListVO; +import com.github.pagehelper.PageInfo; +import org.springframework.web.multipart.MultipartFile; + +public interface ContractMasterService { + + PageInfo queryContractMasterList(ContractMasterQueryRequest request); + + ContractMasterDetailVO getContractMasterDetail(Long contractId); + + Boolean importContractAndCost(MultipartFile file); +} diff --git a/coolstore-partner-service/src/main/java/com/cool/store/service/contract/impl/ContractMasterServiceImpl.java b/coolstore-partner-service/src/main/java/com/cool/store/service/contract/impl/ContractMasterServiceImpl.java new file mode 100644 index 000000000..fb681df43 --- /dev/null +++ b/coolstore-partner-service/src/main/java/com/cool/store/service/contract/impl/ContractMasterServiceImpl.java @@ -0,0 +1,237 @@ +package com.cool.store.service.contract.impl; + +import com.alibaba.excel.EasyExcel; +import com.cool.store.constants.RedisConstant; +import com.cool.store.context.CurrentUserHolder; +import com.cool.store.context.LoginUserInfo; +import com.cool.store.dao.EnterpriseUserDAO; +import com.cool.store.dao.StoreDao; +import com.cool.store.dao.contract.ContractCostDAO; +import com.cool.store.dao.contract.ContractMasterDAO; +import com.cool.store.entity.ImportTaskDO; +import com.cool.store.entity.EnterpriseUserDO; +import com.cool.store.entity.StoreDO; +import com.cool.store.entity.contract.ContractCostDO; +import com.cool.store.entity.contract.ContractMasterDO; +import com.cool.store.enums.FileTypeEnum; +import com.cool.store.enums.ImportTaskStatusEnum; +import com.cool.store.exception.ServiceException; +import com.cool.store.mapper.ImportTaskMapper; +import com.cool.store.request.contract.ContractImportRowDTO; +import com.cool.store.request.contract.ContractMasterQueryRequest; +import com.cool.store.service.contract.ContractMasterService; +import com.cool.store.service.contract.listener.ContractImportListener; +import com.cool.store.utils.RedisUtilPool; +import com.cool.store.utils.UUIDUtils; +import com.cool.store.utils.easyExcel.EasyExcelUtil; +import com.cool.store.utils.poi.DateUtils; +import com.cool.store.utils.poi.StringUtils; +import com.cool.store.vo.contract.ContractCostVO; +import com.cool.store.vo.contract.ContractMasterDetailVO; +import com.cool.store.vo.contract.ContractMasterListVO; +import com.github.pagehelper.PageHelper; +import com.github.pagehelper.PageInfo; +import lombok.RequiredArgsConstructor; +import lombok.extern.slf4j.Slf4j; +import org.apache.commons.collections4.CollectionUtils; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.beans.factory.annotation.Value; +import javax.annotation.Resource; +import org.springframework.scheduling.concurrent.ThreadPoolTaskExecutor; +import org.springframework.stereotype.Service; +import org.springframework.transaction.annotation.Transactional; +import org.springframework.web.multipart.MultipartFile; + +import java.io.ByteArrayInputStream; +import java.util.*; +import java.util.concurrent.atomic.AtomicInteger; +import java.util.stream.Collectors; + +import static com.cool.store.utils.poi.DateUtils.SPECIAL_DATE_START_1; + +@Service +@RequiredArgsConstructor +@Slf4j +public class ContractMasterServiceImpl implements ContractMasterService { + + private final ContractMasterDAO contractMasterDAO; + private final ContractCostDAO contractCostDAO; + private final EnterpriseUserDAO enterpriseUserDAO; + private final ImportTaskMapper importTaskMapper; + private final RedisUtilPool redisUtilPool; + private final EasyExcelUtil easyExcelUtil; + private final StoreDao storeDao; + @Resource(name = "generalThreadPool") + private ThreadPoolTaskExecutor executor; + + @Value("${mybatis.configuration.variables.enterpriseId}") + private String eid; + + @Override + public PageInfo queryContractMasterList(ContractMasterQueryRequest request) { + // 门店名称/编码模糊查询时需要JOIN门店表 + if (request.getStoreNameOrCode() != null && !request.getStoreNameOrCode().isEmpty()) { + request.setQueryStore(true); + } + PageHelper.startPage(request.getPageNum(), request.getPageSize()); + List list = contractMasterDAO.queryContractMasterList(request); + PageInfo pageInfo = new PageInfo<>(list); + + // 批量查询创建人姓名 + fill(pageInfo.getList()); + return pageInfo; + } + + @Override + public ContractMasterDetailVO getContractMasterDetail(Long contractId) { + ContractMasterDO contractDO = contractMasterDAO.getById(contractId); + if (contractDO == null) { + throw new ServiceException(500, "合同不存在"); + } + ContractMasterDetailVO detailVO = new ContractMasterDetailVO(); + detailVO.setContractId(contractDO.getId()); + detailVO.setContractType(contractDO.getContractType()); + detailVO.setContractNo(contractDO.getContractNo()); + detailVO.setStoreId(contractDO.getStoreId()); + detailVO.setStoreCode(contractDO.getStoreCode()); + detailVO.setBrandName(contractDO.getBrandName()); + detailVO.setSource(contractDO.getSource()); + detailVO.setSignForm(contractDO.getSignForm()); + detailVO.setContractYears(contractDO.getContractYears()); + detailVO.setStartDate(contractDO.getStartDate()); + detailVO.setEndDate(contractDO.getEndDate()); + detailVO.setContractStatus(contractDO.getContractStatus()); + detailVO.setCurrency(contractDO.getCurrency()); + detailVO.setSignDate(contractDO.getSignDate()); + detailVO.setRelatedContractNo(contractDO.getRelatedContractNo()); + detailVO.setRemark(contractDO.getRemark()); + detailVO.setCreatedTime(contractDO.getCreatedTime()); + + // 查询创建人姓名 + if (contractDO.getCreateUserId() != null) { + EnterpriseUserDO user = enterpriseUserDAO.getUserInfoById(contractDO.getCreateUserId()); + if (user != null) { + detailVO.setCreateUserName(user.getName()); + } + } + + // 查询费用信息 + List costList = contractCostDAO.queryByContractNo(contractDO.getContractNo()); + if (CollectionUtils.isNotEmpty(costList)) { + ContractCostDO cost = costList.get(0); + ContractCostVO costVO = new ContractCostVO(); + costVO.setJoinFeeAmount(cost.getJoinFeeAmount()); + costVO.setJoinFeeFrequencyYears(cost.getJoinFeeFrequencyYears()); + costVO.setJoinFeeDiscountAmount(cost.getJoinFeeDiscountAmount()); + costVO.setJoinFeeDiscountReason(cost.getJoinFeeDiscountReason()); + costVO.setBrandUsageFeeAmount(cost.getBrandUsageFeeAmount()); + costVO.setBrandUsageFeeFrequencyYears(cost.getBrandUsageFeeFrequencyYears()); + costVO.setBrandManagementFeeAmount(cost.getBrandManagementFeeAmount()); + costVO.setBrandManagementFeeFrequencyYears(cost.getBrandManagementFeeFrequencyYears()); + costVO.setDesignFeeAmount(cost.getDesignFeeAmount()); + costVO.setSystemUsageFeeAmount(cost.getSystemUsageFeeAmount()); + costVO.setPerformanceBondAmount(cost.getPerformanceBondAmount()); + detailVO.setCostList(Collections.singletonList(costVO)); + } + return detailVO; + } + + @Override + @Transactional + public Boolean importContractAndCost(MultipartFile file) { + final String lockKey = RedisConstant.CONTRACT_IMPORT_LOCK; + boolean lock = redisUtilPool.setNxExpire(lockKey, UUIDUtils.get32UUID(), 30 * 60 * 1000); + if (!lock) { + throw new ServiceException(500, "存在正在进行的导入任务"); + } + ImportTaskDO importTaskDO = new ImportTaskDO(); + importTaskDO.setFileName(file.getOriginalFilename()); + importTaskDO.setFileType(FileTypeEnum.CONTRACT_IMPORT.getFileType()); + importTaskDO.setIsImport(true); + importTaskDO.setStatus(ImportTaskStatusEnum.PROGRESS.getCode()); + importTaskDO.setCreateUserId(CurrentUserHolder.getUserId()); + importTaskDO.setCreateName(CurrentUserHolder.getUser().getName()); + importTaskDO.setCreateTime(System.currentTimeMillis()); + importTaskMapper.insert(eid, importTaskDO); + LoginUserInfo user = CurrentUserHolder.getUser(); + try { + byte[] excelBytes = file.getBytes(); + executor.execute(() -> importContract(excelBytes, importTaskDO, user)); + } catch (Exception e) { + log.error("导入失败", e); + } + return true; + } + + private void importContract(byte[] excelBytes, ImportTaskDO importTaskDO, LoginUserInfo user) { + List errorList = new ArrayList<>(); + AtomicInteger successNum = new AtomicInteger(); + AtomicInteger totalNum = new AtomicInteger(); + try { + // 合同导入(包含费用) + EasyExcel.read(new ByteArrayInputStream(excelBytes), ContractImportRowDTO.class, + new ContractImportListener(contractMasterDAO, contractCostDAO, totalNum, successNum, errorList)) + .sheet(0) + .doRead(); + } catch (Exception e) { + log.error("合同导入失败", e); + } finally { + try { + final String lockKey = RedisConstant.CONTRACT_IMPORT_LOCK; + String value = redisUtilPool.getString(lockKey); + if (org.apache.commons.lang3.StringUtils.isNotBlank(value)) { + redisUtilPool.delKey(lockKey); + } + } catch (Exception ex) { + log.error("释放合同导入锁异常", ex); + } + } + importTaskDO.setStatus(totalNum.get() == successNum.get() ? ImportTaskStatusEnum.SUCCESS.getCode() : ImportTaskStatusEnum.PART_ERROR.getCode()); + importTaskDO.setTotalNum(totalNum.get()); + importTaskDO.setSuccessNum(successNum.get()); + if (CollectionUtils.isNotEmpty(errorList)) { + try { + String url = easyExcelUtil.exportExcel(String.class, errorList, null, + FileTypeEnum.CONTRACT_ERROR_EXPORT.getDesc() + DateUtils.parseDateToStr(SPECIAL_DATE_START_1, new Date()), + FileTypeEnum.CONTRACT_ERROR_EXPORT.getDesc() + DateUtils.parseDateToStr(SPECIAL_DATE_START_1, new Date())); + importTaskDO.setFileUrl(url); + } catch (Exception e) { + log.info("导出失败列表失败 errorList:{}", errorList); + } + } + importTaskMapper.update(eid, importTaskDO); + } + + /** + * 批量填充 + */ + private void fill(List list) { + if (CollectionUtils.isEmpty(list)) { + return; + } + List userIds = list.stream() + .map(ContractMasterListVO::getCreateUserId) + .filter(Objects::nonNull) + .distinct() + .collect(Collectors.toList()); + List users = enterpriseUserDAO.getUserInfoByUserIds(userIds); + Map userNameMap = users.stream() + .collect(Collectors.toMap(EnterpriseUserDO::getUserId, EnterpriseUserDO::getName, (a, b) -> a)); + List storeCodes = list.stream().filter(x-> StringUtils.isNotBlank(x.getStoreCode())) + .map(ContractMasterListVO::getStoreCode) + .filter(Objects::nonNull) + .distinct() + .collect(Collectors.toList()); + List storeList = storeDao.getStoreNumByStoreCodes(storeCodes); + Map storeMap = storeList.stream().collect(Collectors.toMap(StoreDO::getStoreNum, data -> data, (a, b) -> a)); + list.forEach(vo -> { + if (vo.getCreateUserId() != null) { + vo.setCreateUserName(userNameMap.get(vo.getCreateUserId())); + } + StoreDO storeDO = storeMap.get(vo.getStoreCode()); + if (storeDO!=null){ + vo.setStoreName(storeDO.getStoreName()); + } + }); + } +} diff --git a/coolstore-partner-service/src/main/java/com/cool/store/service/contract/listener/ContractImportListener.java b/coolstore-partner-service/src/main/java/com/cool/store/service/contract/listener/ContractImportListener.java new file mode 100644 index 000000000..662011432 --- /dev/null +++ b/coolstore-partner-service/src/main/java/com/cool/store/service/contract/listener/ContractImportListener.java @@ -0,0 +1,132 @@ +package com.cool.store.service.contract.listener; + +import com.alibaba.excel.context.AnalysisContext; +import com.alibaba.excel.metadata.CellData; +import com.alibaba.excel.metadata.CellExtra; +import com.alibaba.excel.read.listener.ReadListener; +import com.cool.store.dao.contract.ContractCostDAO; +import com.cool.store.dao.contract.ContractMasterDAO; +import com.cool.store.entity.contract.ContractCostDO; +import com.cool.store.entity.contract.ContractMasterDO; +import com.cool.store.request.contract.ContractImportRowDTO; +import lombok.RequiredArgsConstructor; +import lombok.extern.slf4j.Slf4j; +import org.apache.commons.lang3.StringUtils; + +import java.text.SimpleDateFormat; +import java.util.Date; +import java.util.List; +import java.util.Map; +import java.util.concurrent.atomic.AtomicInteger; + +/** + * 合同导入监听器 + */ +@RequiredArgsConstructor +@Slf4j +public class ContractImportListener implements ReadListener { + + private final ContractMasterDAO contractMasterDAO; + private final ContractCostDAO contractCostDAO; + private final AtomicInteger totalNum; + private final AtomicInteger successNum; + private final List errorList; + + private final SimpleDateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd"); + + @Override + public void onException(Exception e, AnalysisContext analysisContext) { + log.error("合同导入失败", e); + } + + @Override + public void invokeHead(Map map, AnalysisContext analysisContext) { + + } + + @Override + public void invoke(ContractImportRowDTO data, AnalysisContext context) { + totalNum.incrementAndGet(); + int rowIndex = context.readRowHolder().getRowIndex(); + + if (data == null || StringUtils.isBlank(data.getContractNo())) { + errorList.add("第" + rowIndex + "行:合同编号为空"); + return; + } + if (StringUtils.isBlank(data.getStoreCode())) { + errorList.add("第" + rowIndex + "行:门店编码为空"); + return; + } + + ContractMasterDO contractDO = new ContractMasterDO(); + contractDO.setContractType(data.getContractType()); + contractDO.setContractNo(data.getContractNo()); + contractDO.setStoreCode(data.getStoreCode()); + contractDO.setBrandName(data.getBrandName()); + contractDO.setSource(data.getSource()); + contractDO.setSignForm(data.getSignForm()); + contractDO.setContractYears(data.getContractYears()); + contractDO.setContractStatus(data.getContractStatus()); + contractDO.setRemark(data.getRemark()); + contractDO.setRelatedContractNo(data.getRelatedContractNo()); + contractDO.setRenewalCreated(0); + + try { + if (StringUtils.isNotBlank(data.getStartDate())) { + contractDO.setStartDate(dateFormat.parse(data.getStartDate())); + } + if (StringUtils.isNotBlank(data.getEndDate())) { + contractDO.setEndDate(dateFormat.parse(data.getEndDate())); + } + if (StringUtils.isNotBlank(data.getSignDate())) { + contractDO.setSignDate(dateFormat.parse(data.getSignDate())); + } + } catch (Exception e) { + errorList.add("第" + rowIndex + "行:日期格式错误"); + return; + } + + try { + contractMasterDAO.insertSelective(contractDO); + + // 插入费用数据 + ContractCostDO costDO = ContractCostDO.builder() + .contractNo(data.getContractNo()) + .joinFeeAmount(data.getJoinFeeAmount()) + .joinFeeFrequencyYears(data.getJoinFeeFrequencyYears()) + .joinFeeDiscountAmount(data.getJoinFeeDiscountAmount()) + .joinFeeDiscountReason(data.getJoinFeeDiscountReason()) + .brandUsageFeeAmount(data.getBrandUsageFeeAmount()) + .brandUsageFeeFrequencyYears(data.getBrandUsageFeeFrequencyYears()) + .brandManagementFeeAmount(data.getBrandManagementFeeAmount()) + .brandManagementFeeFrequencyYears(data.getBrandManagementFeeFrequencyYears()) + .designFeeAmount(data.getDesignFeeAmount()) + .systemUsageFeeAmount(data.getSystemUsageFeeAmount()) + .performanceBondAmount(data.getPerformanceBondAmount()) + .createdTime(new Date()) + .updatedTime(new Date()) + .build(); + contractCostDAO.insertSelective(costDO); + + successNum.incrementAndGet(); + } catch (Exception e) { + log.error("合同导入插入失败: contractNo={}", data.getContractNo(), e); + errorList.add("第" + rowIndex + "行:插入失败-" + e.getMessage()); + } + } + + @Override + public void extra(CellExtra cellExtra, AnalysisContext analysisContext) { + + } + + @Override + public void doAfterAllAnalysed(AnalysisContext context) { + log.info("合同导入完成,总数:{}, 成功:{}", totalNum.get(), successNum.get()); + } + + @Override + public boolean hasNext(AnalysisContext analysisContext) { + return true; + } +} \ No newline at end of file diff --git a/coolstore-partner-service/src/main/java/com/cool/store/service/exam/ExamAttemptService.java b/coolstore-partner-service/src/main/java/com/cool/store/service/exam/ExamAttemptService.java new file mode 100644 index 000000000..53def34b4 --- /dev/null +++ b/coolstore-partner-service/src/main/java/com/cool/store/service/exam/ExamAttemptService.java @@ -0,0 +1,49 @@ +package com.cool.store.service.exam; + +import com.cool.store.dto.exam.*; +import com.cool.store.vo.exam.ExamAttemptListVO; +import com.cool.store.vo.exam.ExamAttemptVO; +import com.cool.store.vo.exam.ExamPaperForAttemptVO; +import com.cool.store.vo.exam.ExamResultVO; +import com.github.pagehelper.PageInfo; + +/** + * 答卷服务接口 + */ +public interface ExamAttemptService { + + /** + * 开始考试 + */ + ExamPaperForAttemptVO startAttempt(ExamStartAttemptDTO dto); + + /** + * 保存答案 + */ + void saveAnswer(ExamSubmitAnswerDTO dto); + + /** + * 提交试卷 + */ + ExamResultVO submitPaper(ExamSubmitPaperDTO dto); + + /** + * 超时自动提交 + */ + void autoSubmit(Long attemptId); + + /** + * 查看答卷详情 + */ + ExamAttemptVO getAttemptDetail(Long attemptId); + + /** + * 查看考试结果 + */ + ExamResultVO getResult(Long attemptId); + + /** + * 根据手机号分页查询答卷列表 + */ + PageInfo listByMobile(String mobile, Integer pageNum, Integer pageSize); +} \ No newline at end of file diff --git a/coolstore-partner-service/src/main/java/com/cool/store/service/exam/ExamInfoService.java b/coolstore-partner-service/src/main/java/com/cool/store/service/exam/ExamInfoService.java new file mode 100644 index 000000000..f7e152a08 --- /dev/null +++ b/coolstore-partner-service/src/main/java/com/cool/store/service/exam/ExamInfoService.java @@ -0,0 +1,57 @@ +package com.cool.store.service.exam; + +import com.cool.store.dto.exam.*; +import com.cool.store.vo.exam.ExamInfoListVO; +import com.cool.store.vo.exam.ExamInfoVO; +import com.github.pagehelper.PageInfo; + +/** + * 考试服务接口 + */ +public interface ExamInfoService { + + /** + * 创建考试 + */ + void addExam(ExamInfoAddDTO dto); + + /** + * 更新考试 + */ + void updateExam(ExamInfoAddDTO dto); + + /** + * 发布考试 + */ + void publishExam(Long id); + + /** + * 结束考试 + */ + void endExam(Long id); + + /** + * 查询考试列表 + */ + PageInfo getExamList(ExamInfoListDTO dto); + + /** + * 查询考试详情 + */ + ExamInfoVO getExamDetail(Long id); + + /** + * 通过token获取考试信息 + */ + ExamInfoVO getExamByToken(String token); + + /** + * 删除考试 + */ + void deleteExam(Long id); + + /** + * 自动结束考试(由延时消息触发) + */ + void autoEndExam(Long id); +} \ No newline at end of file diff --git a/coolstore-partner-service/src/main/java/com/cool/store/service/exam/ExamPaperService.java b/coolstore-partner-service/src/main/java/com/cool/store/service/exam/ExamPaperService.java new file mode 100644 index 000000000..4a7d6c5af --- /dev/null +++ b/coolstore-partner-service/src/main/java/com/cool/store/service/exam/ExamPaperService.java @@ -0,0 +1,42 @@ +package com.cool.store.service.exam; + +import com.cool.store.dto.exam.*; +import com.cool.store.vo.exam.ExamPaperListVO; +import com.cool.store.vo.exam.ExamPaperVO; +import com.github.pagehelper.PageInfo; + +/** + * 试卷服务接口 + */ +public interface ExamPaperService { + + /** + * 新增试卷 + */ + void addPaper(ExamPaperAddDTO dto); + + /** + * 更新试卷 + */ + void updatePaper(ExamPaperAddDTO dto); + + /** + * 删除试卷 + */ + void deletePaper(Long id); + + /** + * 查询试卷列表 + */ + PageInfo getPaperList(ExamPaperListDTO dto); + + /** + * 查询试卷详情 + */ + ExamPaperVO getPaperDetail(Long id); + + /** + * 检查试卷是否已开始考试 + */ + boolean hasStartedExam(Long paperId); +} \ No newline at end of file diff --git a/coolstore-partner-service/src/main/java/com/cool/store/service/exam/ExamQuestionService.java b/coolstore-partner-service/src/main/java/com/cool/store/service/exam/ExamQuestionService.java new file mode 100644 index 000000000..4ddeb14cb --- /dev/null +++ b/coolstore-partner-service/src/main/java/com/cool/store/service/exam/ExamQuestionService.java @@ -0,0 +1,39 @@ +package com.cool.store.service.exam; + +import com.cool.store.dto.exam.*; +import com.cool.store.vo.exam.ExamQuestionListVO; +import com.cool.store.vo.exam.ExamQuestionVO; +import com.github.pagehelper.PageInfo; + +import java.util.List; + +/** + * 题目服务接口 + */ +public interface ExamQuestionService { + + /** + * 新增题目 + */ + void addQuestion(ExamQuestionAddDTO dto); + + /** + * 更新题目 + */ + void updateQuestion(ExamQuestionAddDTO dto); + + /** + * 批量删除题目 + */ + void deleteQuestions(List ids); + + /** + * 查询题目列表 + */ + PageInfo getQuestionList(ExamQuestionListDTO dto); + + /** + * 查询题目详情 + */ + ExamQuestionVO getQuestionDetail(Long id); +} \ No newline at end of file diff --git a/coolstore-partner-service/src/main/java/com/cool/store/service/exam/impl/ExamAttemptServiceImpl.java b/coolstore-partner-service/src/main/java/com/cool/store/service/exam/impl/ExamAttemptServiceImpl.java new file mode 100644 index 000000000..8718a3b51 --- /dev/null +++ b/coolstore-partner-service/src/main/java/com/cool/store/service/exam/impl/ExamAttemptServiceImpl.java @@ -0,0 +1,477 @@ +package com.cool.store.service.exam.impl; + +import cn.hutool.core.collection.CollStreamUtil; +import com.alibaba.fastjson.JSON; +import com.cool.store.constants.CommonConstants; +import com.cool.store.context.PartnerUserHolder; +import com.cool.store.dao.exam.*; +import com.cool.store.dto.exam.*; +import com.cool.store.entity.exam.*; +import com.cool.store.enums.ErrorCodeEnum; +import com.cool.store.enums.ExamAttemptStatusEnum; +import com.cool.store.enums.ExamInfoStatusEnum; +import com.cool.store.enums.RocketMqTagEnum; +import com.cool.store.exception.ServiceException; +import com.cool.store.mq.producer.SimpleMessageService; +import com.cool.store.service.exam.ExamAttemptService; +import com.cool.store.utils.BeanUtil; +import com.cool.store.vo.exam.ExamAttemptListVO; +import com.cool.store.vo.exam.ExamAttemptVO; +import com.cool.store.vo.exam.ExamAnswerVO; +import com.cool.store.vo.exam.ExamOptionVO; +import com.cool.store.vo.exam.ExamPaperForAttemptVO; +import com.cool.store.vo.exam.ExamResultVO; +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.lang3.StringUtils; +import org.springframework.stereotype.Service; +import org.springframework.transaction.annotation.Transactional; + +import java.math.BigDecimal; +import java.util.*; +import java.util.stream.Collectors; + +/** + * 答卷服务实现 + */ +@Service +@Slf4j +@RequiredArgsConstructor +public class ExamAttemptServiceImpl implements ExamAttemptService { + + private final ExamInfoDAO examInfoDAO; + private final ExamPaperDAO examPaperDAO; + private final ExamPaperQuestionDAO examPaperQuestionDAO; + private final ExamAttemptDAO examAttemptDAO; + private final ExamAttemptAnswerDAO examAttemptAnswerDAO; + private final SimpleMessageService simpleMessageService; + + @Override + @Transactional(rollbackFor = Exception.class) + public ExamPaperForAttemptVO startAttempt(ExamStartAttemptDTO dto) { + // 获取当前登录用户信息 + String mobile = PartnerUserHolder.getUser().getMobile(); + // 验证考试信息 + ExamInfoDO examInfoDO = examInfoDAO.selectByToken(dto.getEntryToken()); + if (examInfoDO == null || CommonConstants.INDEX_ONE.equals(examInfoDO.getDeleted())) { + throw new ServiceException(ErrorCodeEnum.EXAM_TOKEN_INVALID); + } + + // 检查是否有进行中的答卷 + ExamAttemptDO existingAttempt = examAttemptDAO.selectInProgressByExamIdAndMobile(examInfoDO.getId(), mobile); + if (existingAttempt != null) { + // 检查是否已超时 + if (existingAttempt.getDeadlineTime() != null && new Date().before(existingAttempt.getDeadlineTime())) { + // 返回继续考试的试卷信息(包含已保存的答案) + return buildPaperForAttemptWithAnswers(examInfoDO, existingAttempt); + } + throw new ServiceException(ErrorCodeEnum.EXAM_ATTEMPT_EXPIRED); + } + + // 已参加考试 + if (examAttemptDAO.existFinishAttempt(mobile, examInfoDO.getId())) { + throw new ServiceException(ErrorCodeEnum.EXAM_COMPLETED); + } + + // 校验考试时间范围 + Date now = new Date(); + Date startTime = examInfoDO.getStartTime(); + Date endTime = examInfoDO.getEndTime(); + + // 如果开始时间不为空,校验当前时间是否已到开始时间 + if (startTime != null && now.before(startTime)) { + throw new ServiceException(ErrorCodeEnum.EXAM_NOT_STARTED); + } + + // 如果结束时间不为空,校验当前时间是否早于结束时间 + if (endTime != null && !now.before(endTime)) { + throw new ServiceException(ErrorCodeEnum.EXAM_TIME_ENDED); + } + + // 检查考试状态 + if (!ExamInfoStatusEnum.isPublished(examInfoDO.getStatus())) { + throw new ServiceException(ErrorCodeEnum.EXAM_NOT_PUBLISHED); + } + + // 创建新答卷 + ExamAttemptDO attemptDO = new ExamAttemptDO(); + attemptDO.setExamId(examInfoDO.getId()); + attemptDO.setPaperId(examInfoDO.getPaperId()); + attemptDO.setName(dto.getName()); + attemptDO.setMobile(mobile); + attemptDO.setStartTime(new Date()); + Date deadline = new Date(System.currentTimeMillis() + examInfoDO.getDurationMinutes() * 60 * 1000L); + attemptDO.setDeadlineTime(deadline); + examAttemptDAO.insertSelective(attemptDO); + + // 加入延时队列 + simpleMessageService.send(String.valueOf(attemptDO.getId()), RocketMqTagEnum.EXAM_AUTO_SUBMIT, deadline.getTime()); + + // 返回试卷信息 + return buildPaperForAttempt(examInfoDO, attemptDO); + } + + @Override + public void saveAnswer(ExamSubmitAnswerDTO dto) { + ExamAttemptDO attemptDO = getAndCheckAttempt(dto.getAttemptId()); + checkAttemptInProgress(attemptDO); + String partnerId = PartnerUserHolder.getUser().getPartnerId(); + + // 保存或更新答案 + ExamAttemptAnswerDO answerDO = new ExamAttemptAnswerDO(); + answerDO.setAttemptId(dto.getAttemptId()); + answerDO.setPaperId(attemptDO.getPaperId()); + answerDO.setPaperQuestionId(dto.getPaperQuestionId()); + answerDO.setCreateUserId(partnerId); + // 将答案对象转为JSON字符串存储 + if (dto.getAnswer() != null) { + answerDO.setAnswer(JSON.toJSONString(dto.getAnswer())); + } + examAttemptAnswerDAO.insertOrUpdate(answerDO); + } + + @Override + @Transactional(rollbackFor = Exception.class) + public ExamResultVO submitPaper(ExamSubmitPaperDTO dto) { + ExamAttemptDO attemptDO = getAndCheckAttempt(dto.getAttemptId()); + checkAttemptInProgress(attemptDO); + String partnerId = PartnerUserHolder.getUser().getPartnerId(); + + // 批量保存答案 + if (CollectionUtils.isNotEmpty(dto.getAnswers())) { + List answerList = CollStreamUtil.toList(dto.getAnswers(), item -> { + ExamAttemptAnswerDO answerDO = new ExamAttemptAnswerDO(); + answerDO.setAttemptId(dto.getAttemptId()); + answerDO.setPaperId(attemptDO.getPaperId()); + answerDO.setPaperQuestionId(item.getPaperQuestionId()); + answerDO.setCreateUserId(partnerId); + // 将答案对象转为JSON字符串存储 + if (item.getAnswer() != null) { + answerDO.setAnswer(JSON.toJSONString(item.getAnswer())); + } + return answerDO; + }); + examAttemptAnswerDAO.batchInsertOrUpdate(answerList); + } + + // 自动评分 + return doScoring(attemptDO, 0); + } + + @Override + @Transactional(rollbackFor = Exception.class) + public void autoSubmit(Long attemptId) { + ExamAttemptDO attemptDO = examAttemptDAO.selectByPrimaryKey(attemptId); + if (attemptDO == null || ExamAttemptStatusEnum.isCompleted(attemptDO.getStatus())) { + return; + } + + doScoring(attemptDO, 1); + } + + @Override + public ExamAttemptVO getAttemptDetail(Long attemptId) { + ExamAttemptDO attemptDO = getAndCheckAttempt(attemptId); + + ExamAttemptVO vo = BeanUtil.toBean(attemptDO, ExamAttemptVO.class); + + // 查询考试名称 + ExamInfoDO examInfoDO = examInfoDAO.selectByPrimaryKey(attemptDO.getExamId()); + if (examInfoDO != null) { + vo.setExamName(examInfoDO.getExamName()); + } + + // 查询题目和答案(批量查询) + List questions = examPaperQuestionDAO.selectByPaperId(attemptDO.getPaperId()); + Map answerMap = examAttemptAnswerDAO.getMapByAttemptId(attemptId); + + List answers = CollStreamUtil.toList(questions, pq -> { + ExamAttemptVO.AnswerDetail detail = new ExamAttemptVO.AnswerDetail(); + detail.setPaperQuestionId(pq.getId()); + detail.setType(pq.getType()); + detail.setQuestionStem(pq.getQuestionStem()); + if (pq.getOptions() != null) { + detail.setOptions(JSON.parseArray(pq.getOptions(), ExamOptionVO.class)); + } + // 将正确答案JSON字符串转为对象 + if (StringUtils.isNotBlank(pq.getAnswer())) { + detail.setCorrectAnswer(JSON.parseObject(pq.getAnswer(), ExamAnswerVO.class)); + } + detail.setTotalScore(pq.getScore()); + detail.setAnalysis(pq.getAnalysis()); + + ExamAttemptAnswerDO userAnswer = answerMap.get(pq.getId()); + if (userAnswer != null) { + // 将用户答案JSON字符串转为对象 + if (StringUtils.isNotBlank(userAnswer.getAnswer())) { + detail.setUserAnswer(JSON.parseObject(userAnswer.getAnswer(), ExamAnswerVO.class)); + } + detail.setScore(userAnswer.getScore()); + detail.setIsCorrect(isCorrect(pq.getAnswer(), userAnswer.getAnswer(), pq.getType())); + } + return detail; + }); + + vo.setAnswers(answers); + return vo; + } + + @Override + public ExamResultVO getResult(Long attemptId) { + ExamAttemptDO attemptDO = getAndCheckAttempt(attemptId); + + // 查询试卷总分 + ExamPaperDO paperDO = examPaperDAO.selectByPrimaryKey(attemptDO.getPaperId()); + BigDecimal fullScore = paperDO != null ? paperDO.getTotalScore() : BigDecimal.ZERO; + + // 批量查询题目和答案 + List questions = examPaperQuestionDAO.selectByPaperId(attemptDO.getPaperId()); + Map answerMap = examAttemptAnswerDAO.getMapByAttemptId(attemptId); + + int totalCount = questions.size(); + int correctCount = 0; + for (ExamPaperQuestionDO pq : questions) { + ExamAttemptAnswerDO answer = answerMap.get(pq.getId()); + if (answer != null && isCorrect(pq.getAnswer(), answer.getAnswer(), pq.getType())) { + correctCount++; + } + } + + ExamResultVO vo = new ExamResultVO(); + vo.setAttemptId(attemptId); + vo.setTotalScore(attemptDO.getTotalScore() != null ? attemptDO.getTotalScore() : BigDecimal.ZERO); + vo.setFullScore(fullScore); + vo.setCorrectCount(correctCount); + vo.setTotalCount(totalCount); + vo.setPassed(isPassed(attemptDO.getTotalScore(), fullScore)); + + return vo; + } + + @Override + public PageInfo listByMobile(String mobile, Integer pageNum, Integer pageSize) { + PageHelper.startPage(pageNum, pageSize); + List attemptList = examAttemptDAO.selectByMobile(mobile); + PageInfo pageInfo = new PageInfo<>(attemptList); + + if (CollectionUtils.isEmpty(attemptList)) { + return new PageInfo<>(); + } + + // 批量查询考试信息,包含被删除的考试 + List examIds = CollStreamUtil.toList(attemptList, ExamAttemptDO::getExamId); + Map examInfoMap = examInfoDAO.getMapIncludeDeletedByIds(examIds); + + // 批量查询试卷信息 + List paperIds = CollStreamUtil.toList(attemptList, ExamAttemptDO::getPaperId); + Map paperMap = examPaperDAO.getMapByIds(paperIds); + + List voList = CollStreamUtil.toList(attemptList, attempt -> { + ExamAttemptListVO vo = BeanUtil.toBean(attempt, ExamAttemptListVO.class); + ExamInfoDO examInfoDO = examInfoMap.get(attempt.getExamId()); + if (examInfoDO != null) { + vo.setExamName(examInfoDO.getExamName()); + vo.setDurationMinutes(examInfoDO.getDurationMinutes()); + vo.setEntryToken(examInfoDO.getEntryToken()); + } + ExamPaperDO paperDO = paperMap.get(attempt.getPaperId()); + if (paperDO != null) { + vo.setFullScore(paperDO.getTotalScore()); + } + vo.setStatusDesc(ExamAttemptStatusEnum.isCompleted(attempt.getStatus()) ? "已完成" : "进行中"); + if (ExamAttemptStatusEnum.isCompleted(attempt.getStatus()) && paperDO != null) { + vo.setPassed(isPassed(attempt.getTotalScore(), paperDO.getTotalScore())); + } + return vo; + }); + + // 构建分页结果 + PageInfo resultPage = new PageInfo<>(); + resultPage.setList(voList); + resultPage.setTotal(pageInfo.getTotal()); + resultPage.setPageNum(pageInfo.getPageNum()); + resultPage.setPageSize(pageInfo.getPageSize()); + resultPage.setPages(pageInfo.getPages()); + return resultPage; + } + + // ==================== 私有方法 ==================== + + /** + * 获取并校验答卷 + */ + private ExamAttemptDO getAndCheckAttempt(Long attemptId) { + ExamAttemptDO attemptDO = examAttemptDAO.selectByPrimaryKey(attemptId); + if (attemptDO == null) { + throw new ServiceException(ErrorCodeEnum.EXAM_ATTEMPT_NOT_EXIST); + } + return attemptDO; + } + + /** + * 校验答卷是否进行中 + */ + private void checkAttemptInProgress(ExamAttemptDO attemptDO) { + // 检查是否已提交 + if (ExamAttemptStatusEnum.isCompleted(attemptDO.getStatus())) { + throw new ServiceException(ErrorCodeEnum.EXAM_ATTEMPT_ALREADY_SUBMITTED); + } + + // 检查是否超时 + if (attemptDO.getDeadlineTime() != null && new Date().after(attemptDO.getDeadlineTime())) { + throw new ServiceException(ErrorCodeEnum.EXAM_ATTEMPT_EXPIRED); + } + } + + /** + * 执行评分 + */ + private ExamResultVO doScoring(ExamAttemptDO attemptDO, Integer submitType) { + // 批量查询题目和答案 + List questions = examPaperQuestionDAO.selectByPaperId(attemptDO.getPaperId()); + Map answerMap = examAttemptAnswerDAO.getMapByAttemptId(attemptDO.getId()); + + BigDecimal totalScore = BigDecimal.ZERO; + List updateList = new ArrayList<>(); + + // 计算每道题得分 + for (ExamPaperQuestionDO pq : questions) { + ExamAttemptAnswerDO answerDO = answerMap.get(pq.getId()); + if (answerDO != null) { + BigDecimal score = calculateScore(pq, answerDO.getAnswer()); + answerDO.setScore(score); + updateList.add(answerDO); + totalScore = totalScore.add(score); + } + } + + // 批量更新分数 + if (CollectionUtils.isNotEmpty(updateList)) { + examAttemptAnswerDAO.batchUpdateScore(updateList); + } + + // 更新答卷状态 + examAttemptDAO.updateStatusAndScore(attemptDO.getId(), + ExamAttemptStatusEnum.COMPLETED.getCode(), submitType, totalScore); + + return getResult(attemptDO.getId()); + } + + /** + * 计算单题得分 + */ + private BigDecimal calculateScore(ExamPaperQuestionDO pq, String userAnswer) { + if (userAnswer == null || userAnswer.isEmpty()) { + return BigDecimal.ZERO; + } + boolean correct = isCorrect(pq.getAnswer(), userAnswer, pq.getType()); + return correct ? pq.getScore() : BigDecimal.ZERO; + } + + /** + * 判断答案是否正确 + */ + private boolean isCorrect(String correctAnswer, String userAnswer, Integer type) { + if (correctAnswer == null || userAnswer == null) { + return false; + } + // 单选和判断题直接比较 (type: 1=单选, 2=多选, 3=判断) + if (type == null || type == 1 || type == 3) { + return correctAnswer.trim().equalsIgnoreCase(userAnswer.trim()); + } + // 多选题需要比较所有选项 + Set correctSet = Arrays.stream(correctAnswer.split(",")) + .map(String::trim) + .collect(Collectors.toSet()); + Set userSet = Arrays.stream(userAnswer.split(",")) + .map(String::trim) + .collect(Collectors.toSet()); + return correctSet.equals(userSet); + } + + /** + * 判断是否通过(60%及格) + */ + private boolean isPassed(BigDecimal totalScore, BigDecimal fullScore) { + if (totalScore == null || fullScore == null || fullScore.compareTo(BigDecimal.ZERO) <= 0) { + return false; + } + return totalScore.compareTo(fullScore.multiply(new BigDecimal("0.6"))) >= 0; + } + + /** + * 构建答题试卷VO + */ + private ExamPaperForAttemptVO buildPaperForAttempt(ExamInfoDO examInfoDO, ExamAttemptDO attemptDO) { + ExamPaperForAttemptVO vo = new ExamPaperForAttemptVO(); + vo.setAttemptId(attemptDO.getId()); + vo.setExamName(examInfoDO.getExamName()); + vo.setDurationMinutes(examInfoDO.getDurationMinutes()); + vo.setStartTime(attemptDO.getStartTime().getTime()); + vo.setDeadlineTime(attemptDO.getDeadlineTime().getTime()); + vo.setRemainingTime(attemptDO.getDeadlineTime().getTime() - System.currentTimeMillis()); + + // 查询试卷题目(不含答案) + List questions = examPaperQuestionDAO.selectByPaperId(examInfoDO.getPaperId()); + + int[] sortNo = {1}; + List items = CollStreamUtil.toList(questions, pq -> { + ExamPaperForAttemptVO.QuestionItem item = new ExamPaperForAttemptVO.QuestionItem(); + item.setId(pq.getId()); + item.setType(pq.getType()); + item.setQuestionStem(pq.getQuestionStem()); + if (pq.getOptions() != null) { + item.setOptions(JSON.parseArray(pq.getOptions(), ExamOptionVO.class)); + } + item.setScore(pq.getScore()); + item.setSortNo(sortNo[0]++); + return item; + }); + vo.setQuestions(items); + + return vo; + } + + /** + * 构建答题试卷VO(包含已保存的答案,用于恢复考试) + */ + private ExamPaperForAttemptVO buildPaperForAttemptWithAnswers(ExamInfoDO examInfoDO, ExamAttemptDO attemptDO) { + ExamPaperForAttemptVO vo = new ExamPaperForAttemptVO(); + vo.setAttemptId(attemptDO.getId()); + vo.setExamName(examInfoDO.getExamName()); + vo.setDurationMinutes(examInfoDO.getDurationMinutes()); + vo.setStartTime(attemptDO.getStartTime().getTime()); + vo.setDeadlineTime(attemptDO.getDeadlineTime().getTime()); + vo.setRemainingTime(attemptDO.getDeadlineTime().getTime() - System.currentTimeMillis()); + + // 查询试卷题目 + List questions = examPaperQuestionDAO.selectByPaperId(examInfoDO.getPaperId()); + // 查询已保存的答案 + Map answerMap = examAttemptAnswerDAO.getMapByAttemptId(attemptDO.getId()); + + int[] sortNo = {1}; + List items = CollStreamUtil.toList(questions, pq -> { + ExamPaperForAttemptVO.QuestionItem item = new ExamPaperForAttemptVO.QuestionItem(); + item.setId(pq.getId()); + item.setType(pq.getType()); + item.setQuestionStem(pq.getQuestionStem()); + if (pq.getOptions() != null) { + item.setOptions(JSON.parseArray(pq.getOptions(), ExamOptionVO.class)); + } + item.setScore(pq.getScore()); + item.setSortNo(sortNo[0]++); + // 设置已保存的答案 + ExamAttemptAnswerDO savedAnswer = answerMap.get(pq.getId()); + if (savedAnswer != null && StringUtils.isNotBlank(savedAnswer.getAnswer())) { + item.setUserAnswer(JSON.parseObject(savedAnswer.getAnswer(), ExamAnswerVO.class)); + } + return item; + }); + vo.setQuestions(items); + + return vo; + } +} \ No newline at end of file diff --git a/coolstore-partner-service/src/main/java/com/cool/store/service/exam/impl/ExamInfoServiceImpl.java b/coolstore-partner-service/src/main/java/com/cool/store/service/exam/impl/ExamInfoServiceImpl.java new file mode 100644 index 000000000..6ac14ed9b --- /dev/null +++ b/coolstore-partner-service/src/main/java/com/cool/store/service/exam/impl/ExamInfoServiceImpl.java @@ -0,0 +1,236 @@ +package com.cool.store.service.exam.impl; + +import cn.hutool.core.collection.CollStreamUtil; +import com.aliyun.core.utils.StringUtils; +import com.cool.store.constants.CommonConstants; +import com.cool.store.context.CurrentUserHolder; +import com.cool.store.dao.exam.ExamAttemptDAO; +import com.cool.store.dao.exam.ExamInfoDAO; +import com.cool.store.dao.exam.ExamPaperDAO; +import com.cool.store.dto.exam.*; +import com.cool.store.entity.exam.ExamInfoDO; +import com.cool.store.entity.exam.ExamPaperDO; +import com.cool.store.enums.ErrorCodeEnum; +import com.cool.store.enums.ExamInfoStatusEnum; +import com.cool.store.enums.RocketMqTagEnum; +import com.cool.store.exception.ServiceException; +import com.cool.store.mq.producer.SimpleMessageService; +import com.cool.store.service.WechatMiniAppService; +import com.cool.store.service.exam.ExamInfoService; +import com.cool.store.utils.BeanUtil; +import com.cool.store.utils.UUIDUtils; +import com.cool.store.vo.exam.ExamInfoListVO; +import com.cool.store.vo.exam.ExamInfoVO; +import com.github.pagehelper.PageHelper; +import com.github.pagehelper.PageInfo; +import lombok.RequiredArgsConstructor; +import lombok.extern.slf4j.Slf4j; +import org.springframework.beans.factory.annotation.Value; +import org.springframework.stereotype.Service; +import org.springframework.transaction.annotation.Transactional; + +import java.util.Date; +import java.util.List; +import java.util.Map; + +/** + * 考试服务实现 + */ +@Service +@Slf4j +@RequiredArgsConstructor +public class ExamInfoServiceImpl implements ExamInfoService { + + private final ExamInfoDAO examInfoDAO; + private final ExamPaperDAO examPaperDAO; + private final WechatMiniAppService wechatMiniAppService; + private final SimpleMessageService simpleMessageService; + private final ExamAttemptDAO examAttemptDAO; + + @Value("${exam.qrcode.page:twelvePoints/exam/indexCode}") + private String examQrcodePage; + + @Override + public void addExam(ExamInfoAddDTO dto) { + // 检查试卷是否存在 + ExamPaperDO paperDO = examPaperDAO.selectByPrimaryKey(dto.getPaperId()); + if (paperDO == null || CommonConstants.INDEX_ONE.equals(paperDO.getDeleted())) { + throw new ServiceException(ErrorCodeEnum.EXAM_PAPER_NOT_EXIST); + } + + ExamInfoDO examInfoDO = BeanUtil.toBean(dto, ExamInfoDO.class); + examInfoDO.setEntryToken(UUIDUtils.get8UUID()); + examInfoDO.setCreateUserId(CurrentUserHolder.getUserId()); + examInfoDAO.insertSelective(examInfoDO); + } + + @Override + public void updateExam(ExamInfoAddDTO dto) { + ExamInfoDO existExam = examInfoDAO.selectByPrimaryKey(dto.getId()); + if (existExam == null || CommonConstants.INDEX_ONE.equals(existExam.getDeleted())) { + throw new ServiceException(ErrorCodeEnum.EXAM_INFO_NOT_EXIST); + } + // 已发布的考试不能修改 + if (ExamInfoStatusEnum.isPublished(existExam.getStatus())) { + throw new ServiceException(ErrorCodeEnum.EXAM_ALREADY_PUBLISHED); + } + // 已结束的考试不能修改 + if (ExamInfoStatusEnum.isEnded(existExam.getStatus())) { + throw new ServiceException(ErrorCodeEnum.EXAM_ALREADY_ENDED); + } + ExamInfoDO examInfoDO = BeanUtil.toBean(dto, ExamInfoDO.class); + examInfoDAO.updateByPrimaryKeySelective(examInfoDO); + } + + @Override + @Transactional + public void publishExam(Long id) { + ExamInfoDO existExam = examInfoDAO.selectByPrimaryKey(id); + if (existExam == null || CommonConstants.INDEX_ONE.equals(existExam.getDeleted())) { + throw new ServiceException(ErrorCodeEnum.EXAM_INFO_NOT_EXIST); + } + // 只有未发布状态可以发布 + if (!ExamInfoStatusEnum.canPublish(existExam.getStatus())) { + if (ExamInfoStatusEnum.isPublished(existExam.getStatus())) { + throw new ServiceException(ErrorCodeEnum.EXAM_ALREADY_PUBLISHED); + } + if (ExamInfoStatusEnum.isEnded(existExam.getStatus())) { + throw new ServiceException(ErrorCodeEnum.EXAM_ALREADY_ENDED); + } + } + // 标记试卷已开始考试 + examPaperDAO.updateStartExam(existExam.getPaperId(), 1); + + // 生成小程序二维码 + String qrcodeUrl = null; + try { + qrcodeUrl = wechatMiniAppService.createQrCode(examQrcodePage, "entryToken=" + existExam.getEntryToken(), "430"); + if (StringUtils.isBlank(qrcodeUrl)) { + log.warn("考试发布成功,但生成二维码失败,examId:{}", id); + } + } catch (Exception e) { + log.error("考试发布成功,但生成二维码异常,examId:{}", id, e); + } + // 合并更新状态和二维码URL + Date now = new Date(); + ExamInfoDO update = new ExamInfoDO(); + update.setId(id); + update.setQrcodeUrl(qrcodeUrl); + update.setStatus(ExamInfoStatusEnum.PUBLISHED.getCode()); + update.setUpdateTime(now); + update.setStartTime(now); + examInfoDAO.updateByPrimaryKeySelective(update); + + // 如果设置了结束时间,发送延时消息自动结束考试 + if (existExam.getEndTime() != null && existExam.getEndTime().after(new Date())) { + simpleMessageService.send(String.valueOf(id), RocketMqTagEnum.EXAM_AUTO_END, existExam.getEndTime().getTime()); + log.info("考试发布成功,已设置自动结束延时消息,examId:{}, endTime:{}", id, existExam.getEndTime()); + } + } + + @Override + public void endExam(Long id) { + ExamInfoDO existExam = examInfoDAO.selectByPrimaryKey(id); + if (existExam == null || CommonConstants.INDEX_ONE.equals(existExam.getDeleted())) { + throw new ServiceException(ErrorCodeEnum.EXAM_INFO_NOT_EXIST); + } + // 只有已发布状态可以结束 + if (!ExamInfoStatusEnum.canEnd(existExam.getStatus())) { + if (ExamInfoStatusEnum.isEnded(existExam.getStatus())) { + throw new ServiceException(ErrorCodeEnum.EXAM_ALREADY_ENDED); + } + throw new ServiceException(ErrorCodeEnum.EXAM_NOT_PUBLISHED); + } + ExamInfoDO update = new ExamInfoDO(); + update.setId(id); + update.setStatus(ExamInfoStatusEnum.ENDED.getCode()); + update.setEndTime(new Date()); + examInfoDAO.updateByPrimaryKeySelective(update); + } + + @Override + public PageInfo getExamList(ExamInfoListDTO dto) { + PageHelper.startPage(dto.getPageNum(), dto.getPageSize()); + List list = examInfoDAO.selectList(dto.getStatus()); + PageInfo pageInfo = BeanUtil.toPage(new PageInfo<>(list), ExamInfoListVO.class); + // 批量查询试卷信息 + List paperIds = CollStreamUtil.toList(list, ExamInfoDO::getPaperId); + Map paperMap = examPaperDAO.getMapByIds(paperIds); + List examIds = CollStreamUtil.toList(list, ExamInfoDO::getId); + Map attemptCountMap = examAttemptDAO.getAttemptCount(examIds); + pageInfo.getList().forEach(vo -> { + ExamPaperDO paperDO = paperMap.get(vo.getPaperId()); + if (paperDO != null) { + vo.setPaperName(paperDO.getPaperName()); + } + vo.setAttemptCount(attemptCountMap.getOrDefault(vo.getId(), 0L).intValue()); + }); + return pageInfo; + } + + @Override + public ExamInfoVO getExamDetail(Long id) { + ExamInfoDO examInfoDO = examInfoDAO.selectByPrimaryKey(id); + if (examInfoDO == null || CommonConstants.INDEX_ONE.equals(examInfoDO.getDeleted())) { + throw new ServiceException(ErrorCodeEnum.EXAM_INFO_NOT_EXIST); + } + ExamInfoVO vo = BeanUtil.toBean(examInfoDO, ExamInfoVO.class); + ExamPaperDO paperDO = examPaperDAO.selectByPrimaryKey(examInfoDO.getPaperId()); + if (paperDO != null) { + vo.setPaperName(paperDO.getPaperName()); + } + return vo; + } + + @Override + public ExamInfoVO getExamByToken(String token) { + ExamInfoDO examInfoDO = examInfoDAO.selectByToken(token); + if (examInfoDO == null || CommonConstants.INDEX_ONE.equals(examInfoDO.getDeleted())) { + throw new ServiceException(ErrorCodeEnum.EXAM_TOKEN_INVALID); + } + if (!ExamInfoStatusEnum.isPublished(examInfoDO.getStatus())) { + throw new ServiceException(ErrorCodeEnum.EXAM_NOT_PUBLISHED); + } + ExamInfoVO vo = BeanUtil.toBean(examInfoDO, ExamInfoVO.class); + ExamPaperDO paperDO = examPaperDAO.selectByPrimaryKey(examInfoDO.getPaperId()); + if (paperDO != null) { + vo.setPaperName(paperDO.getPaperName()); + } + return vo; + } + + @Override + @Transactional + public void deleteExam(Long id) { + ExamInfoDO existExam = examInfoDAO.selectByPrimaryKey(id); + if (existExam == null || CommonConstants.INDEX_ONE.equals(existExam.getDeleted())) { + throw new ServiceException(ErrorCodeEnum.EXAM_INFO_NOT_EXIST); + } + // 检查是否在考试中(已发布状态) + if (ExamInfoStatusEnum.isPublished(existExam.getStatus())) { + throw new ServiceException(ErrorCodeEnum.EXAM_IN_PROGRESS_CANNOT_DELETE); + } + examInfoDAO.deleteById(id); + } + + @Override + public void autoEndExam(Long id) { + log.info("考试自动结束, id:{}", id); + ExamInfoDO existExam = examInfoDAO.selectByPrimaryKey(id); + if (existExam == null || CommonConstants.INDEX_ONE.equals(existExam.getDeleted())) { + log.warn("自动结束考试失败,考试不存在,examId:{}", id); + return; + } + // 只有已发布状态才自动结束 + if (!ExamInfoStatusEnum.isPublished(existExam.getStatus())) { + log.info("考试非已发布状态,跳过自动结束,examId:{}, status:{}", id, existExam.getStatus()); + return; + } + ExamInfoDO update = new ExamInfoDO(); + update.setId(id); + update.setStatus(ExamInfoStatusEnum.ENDED.getCode()); + update.setUpdateTime(new Date()); + examInfoDAO.updateByPrimaryKeySelective(update); + log.info("考试自动结束成功,examId:{}", id); + } +} \ No newline at end of file diff --git a/coolstore-partner-service/src/main/java/com/cool/store/service/exam/impl/ExamPaperServiceImpl.java b/coolstore-partner-service/src/main/java/com/cool/store/service/exam/impl/ExamPaperServiceImpl.java new file mode 100644 index 000000000..9f4f3ae14 --- /dev/null +++ b/coolstore-partner-service/src/main/java/com/cool/store/service/exam/impl/ExamPaperServiceImpl.java @@ -0,0 +1,173 @@ +package com.cool.store.service.exam.impl; + +import cn.hutool.core.collection.CollStreamUtil; +import com.alibaba.fastjson.JSON; +import com.cool.store.constants.CommonConstants; +import com.cool.store.context.CurrentUserHolder; +import com.cool.store.dao.exam.ExamPaperDAO; +import com.cool.store.dao.exam.ExamPaperQuestionDAO; +import com.cool.store.dao.exam.ExamQuestionDAO; +import com.cool.store.dto.exam.*; +import com.cool.store.entity.exam.ExamPaperDO; +import com.cool.store.entity.exam.ExamPaperQuestionDO; +import com.cool.store.entity.exam.ExamQuestionDO; +import com.cool.store.enums.ErrorCodeEnum; +import com.cool.store.exception.ServiceException; +import com.cool.store.service.exam.ExamPaperService; +import com.cool.store.utils.BeanUtil; +import com.cool.store.vo.exam.ExamOptionVO; +import com.cool.store.vo.exam.ExamPaperListVO; +import com.cool.store.vo.exam.ExamPaperVO; +import com.github.pagehelper.PageHelper; +import com.github.pagehelper.PageInfo; +import lombok.RequiredArgsConstructor; +import lombok.extern.slf4j.Slf4j; +import org.apache.commons.collections4.CollectionUtils; +import org.springframework.beans.BeanUtils; +import org.springframework.stereotype.Service; +import org.springframework.transaction.annotation.Transactional; + +import java.math.BigDecimal; +import java.util.ArrayList; +import java.util.Date; +import java.util.List; +import java.util.Map; +import java.util.stream.Collectors; + +/** + * 试卷服务实现 + */ +@Service +@Slf4j +@RequiredArgsConstructor +public class ExamPaperServiceImpl implements ExamPaperService { + + private final ExamPaperDAO examPaperDAO; + private final ExamPaperQuestionDAO examPaperQuestionDAO; + private final ExamQuestionDAO examQuestionDAO; + + @Override + @Transactional(rollbackFor = Exception.class) + public void addPaper(ExamPaperAddDTO dto) { + // 创建试卷 + ExamPaperDO paperDO = BeanUtil.toBean(dto, ExamPaperDO.class); + paperDO.setCreateUserId(CurrentUserHolder.getUserId()); + examPaperDAO.insertSelective(paperDO); + // 保存试卷题目 + BigDecimal totalScore = insertQuestionAndComputeTotalScore(dto.getQuestions(), paperDO.getId()); + // 更新总分 + ExamPaperDO updateDO = new ExamPaperDO(); + updateDO.setId(paperDO.getId()); + updateDO.setTotalScore(totalScore); + examPaperDAO.updateByPrimaryKeySelective(updateDO); + } + + @Override + @Transactional(rollbackFor = Exception.class) + public void updatePaper(ExamPaperAddDTO dto) { + ExamPaperDO existPaper = examPaperDAO.selectByPrimaryKey(dto.getId()); + if (existPaper == null || CommonConstants.INDEX_ONE.equals(existPaper.getDeleted())) { + throw new ServiceException(ErrorCodeEnum.EXAM_PAPER_NOT_EXIST); + } + // 检查是否已开始考试 + if (CommonConstants.INDEX_ONE.equals(existPaper.getStartExam())) { + throw new ServiceException(ErrorCodeEnum.EXAM_PAPER_STARTED_CANNOT_EDIT); + } + ExamPaperDO paperDO = BeanUtil.toBean(dto, ExamPaperDO.class); + // 如果有题目列表,更新题目 + if (CollectionUtils.isNotEmpty(dto.getQuestions())) { + // 删除原有题目 + examPaperQuestionDAO.deleteByPaperId(dto.getId()); + // 重新添加题目(批量插入) + BigDecimal totalScore = insertQuestionAndComputeTotalScore(dto.getQuestions(), dto.getId()); + // 更新总分 + paperDO.setTotalScore(totalScore); + } + examPaperDAO.updateByPrimaryKeySelective(paperDO); + } + + public BigDecimal insertQuestionAndComputeTotalScore(List questions, Long paperId) { + BigDecimal totalScore = BigDecimal.ZERO; + List questionIds = CollStreamUtil.toList(questions, ExamPaperAddDTO.PaperQuestionItemDTO::getQuestionId); + Map questionMap = examQuestionDAO.getMapByIds(questionIds); + List pqDOs = new ArrayList<>(); + for (ExamPaperAddDTO.PaperQuestionItemDTO item : questions) { + ExamQuestionDO questionDO = questionMap.get(item.getQuestionId()); + if (questionDO == null || CommonConstants.INDEX_ONE.equals(questionDO.getDeleted())) { + throw new ServiceException(ErrorCodeEnum.EXAM_QUESTION_NOT_EXIST); + } + ExamPaperQuestionDO pqDO = BeanUtil.toBean(questionDO, ExamPaperQuestionDO.class); + pqDO.setPaperId(paperId); + pqDO.setQuestionId(item.getQuestionId()); + pqDO.setScore(item.getScore() != null ? item.getScore() : questionDO.getScore()); + pqDO.setCreateUserId(CurrentUserHolder.getUserId()); + pqDOs.add(pqDO); + totalScore = totalScore.add(pqDO.getScore()); + } + examPaperQuestionDAO.insertBatch(pqDOs); + return totalScore; + } + + @Override + @Transactional + public void deletePaper(Long id) { + ExamPaperDO existPaper = examPaperDAO.selectByPrimaryKey(id); + if (existPaper == null || CommonConstants.INDEX_ONE.equals(existPaper.getDeleted())) { + throw new ServiceException(ErrorCodeEnum.EXAM_PAPER_NOT_EXIST); + } + // 检查是否已开始考试 + if (CommonConstants.INDEX_ONE.equals(existPaper.getStartExam())) { + throw new ServiceException(ErrorCodeEnum.EXAM_PAPER_STARTED_CANNOT_EDIT); + } + examPaperDAO.deleteById(id); + examPaperQuestionDAO.deleteByPaperId(id); + } + + @Override + public PageInfo getPaperList(ExamPaperListDTO dto) { + PageHelper.startPage(dto.getPageNum(), dto.getPageSize()); + List list = examPaperDAO.selectList(dto.getPaperName(), dto.getEnable(), dto.getStartExam()); + PageInfo pageInfo = BeanUtil.toPage(new PageInfo<>(list), ExamPaperListVO.class); + pageInfo.getList().forEach(vo -> vo.setQuestionCount(examPaperQuestionDAO.countByPaperId(vo.getId()))); + return pageInfo; + } + + @Override + public ExamPaperVO getPaperDetail(Long id) { + ExamPaperDO paperDO = examPaperDAO.selectByPrimaryKey(id); + if (paperDO == null || CommonConstants.INDEX_ONE.equals(paperDO.getDeleted())) { + throw new ServiceException(ErrorCodeEnum.EXAM_PAPER_NOT_EXIST); + } + + ExamPaperVO vo = new ExamPaperVO(); + BeanUtils.copyProperties(paperDO, vo); + + // 查询题目列表 + ExamPaperQuestionDO pqQuery = new ExamPaperQuestionDO(); + pqQuery.setPaperId(id); + pqQuery.setDeleted(0); + List questions = examPaperQuestionDAO.select(pqQuery); + List questionVOList = new ArrayList<>(); + int sortNo = 1; + for (ExamPaperQuestionDO pq : questions) { + ExamPaperVO.PaperQuestionVO qvo = new ExamPaperVO.PaperQuestionVO(); + BeanUtils.copyProperties(pq, qvo); + // 将JSON字符串转为选项对象列表 + if (pq.getOptions() != null) { + qvo.setOptions(JSON.parseArray(pq.getOptions(), ExamOptionVO.class)); + } + qvo.setSortNo(sortNo++); + questionVOList.add(qvo); + } + vo.setQuestions(questionVOList); + vo.setQuestionCount(questionVOList.size()); + + return vo; + } + + @Override + public boolean hasStartedExam(Long paperId) { + ExamPaperDO paperDO = examPaperDAO.selectByPrimaryKey(paperId); + return paperDO != null && CommonConstants.INDEX_ONE.equals(paperDO.getStartExam()); + } +} \ No newline at end of file diff --git a/coolstore-partner-service/src/main/java/com/cool/store/service/exam/impl/ExamQuestionServiceImpl.java b/coolstore-partner-service/src/main/java/com/cool/store/service/exam/impl/ExamQuestionServiceImpl.java new file mode 100644 index 000000000..ab93d1af3 --- /dev/null +++ b/coolstore-partner-service/src/main/java/com/cool/store/service/exam/impl/ExamQuestionServiceImpl.java @@ -0,0 +1,88 @@ +package com.cool.store.service.exam.impl; + +import com.alibaba.fastjson.JSON; +import com.cool.store.constants.CommonConstants; +import com.cool.store.context.CurrentUserHolder; +import com.cool.store.dao.exam.ExamQuestionDAO; +import com.cool.store.dto.exam.*; +import com.cool.store.entity.exam.ExamQuestionDO; +import com.cool.store.enums.ErrorCodeEnum; +import com.cool.store.exception.ServiceException; +import com.cool.store.service.exam.ExamQuestionService; +import com.cool.store.utils.BeanUtil; +import com.cool.store.vo.exam.ExamAnswerVO; +import com.cool.store.vo.exam.ExamOptionVO; +import com.cool.store.vo.exam.ExamQuestionListVO; +import com.cool.store.vo.exam.ExamQuestionVO; +import com.github.pagehelper.PageHelper; +import com.github.pagehelper.PageInfo; +import lombok.RequiredArgsConstructor; +import lombok.extern.slf4j.Slf4j; +import org.springframework.beans.BeanUtils; +import org.springframework.stereotype.Service; + +import java.util.List; + +/** + * 题目服务实现 + */ +@Service +@Slf4j +@RequiredArgsConstructor +public class ExamQuestionServiceImpl implements ExamQuestionService { + + private final ExamQuestionDAO examQuestionDAO; + + @Override + public void addQuestion(ExamQuestionAddDTO dto) { + ExamQuestionDO questionDO = dto.convert(); + questionDO.setCreateUserId(CurrentUserHolder.getUserId()); + examQuestionDAO.insertSelective(questionDO); + } + + @Override + public void updateQuestion(ExamQuestionAddDTO dto) { + ExamQuestionDO existQuestion = examQuestionDAO.selectByPrimaryKey(dto.getId()); + if (existQuestion == null || CommonConstants.INDEX_ONE.equals(existQuestion.getDeleted())) { + throw new ServiceException(ErrorCodeEnum.EXAM_QUESTION_NOT_EXIST); + } + ExamQuestionDO questionDO = dto.convert(); + examQuestionDAO.updateByPrimaryKeySelective(questionDO); + } + + @Override + public void deleteQuestions(List ids) { + examQuestionDAO.batchDeleteByIds(ids); + } + + @Override + public PageInfo getQuestionList(ExamQuestionListDTO dto) { + PageHelper.startPage(dto.getPageNum(), dto.getPageSize()); + List list = examQuestionDAO.selecList(dto.getType(), dto.getDifficulty(), dto.getQuestionStem(), dto.getEnable()); + PageInfo page = new PageInfo<>(list); + return BeanUtil.toPage(page, ExamQuestionListVO.class); + } + + @Override + public ExamQuestionVO getQuestionDetail(Long id) { + ExamQuestionDO questionDO = examQuestionDAO.selectByPrimaryKey(id); + if (questionDO == null || CommonConstants.INDEX_ONE.equals(questionDO.getDeleted())) { + throw new ServiceException(ErrorCodeEnum.EXAM_QUESTION_NOT_EXIST); + } + return convertToVO(questionDO); + } + + private ExamQuestionVO convertToVO(ExamQuestionDO questionDO) { + ExamQuestionVO vo = new ExamQuestionVO(); + BeanUtils.copyProperties(questionDO, vo); + // 将JSON字符串转为答案对象 + if (questionDO.getAnswer() != null) { + vo.setAnswer(JSON.parseObject(questionDO.getAnswer(), ExamAnswerVO.class)); + } + // 将JSON字符串转为选项对象列表 + if (questionDO.getOptions() != null) { + vo.setOptions(JSON.parseArray(questionDO.getOptions(), ExamOptionVO.class)); + } + return vo; + } +} \ No newline at end of file diff --git a/coolstore-partner-service/src/main/java/com/cool/store/service/impl/AdjustmentOrderServiceImpl.java b/coolstore-partner-service/src/main/java/com/cool/store/service/impl/AdjustmentOrderServiceImpl.java index 112f213d0..e0374cef4 100644 --- a/coolstore-partner-service/src/main/java/com/cool/store/service/impl/AdjustmentOrderServiceImpl.java +++ b/coolstore-partner-service/src/main/java/com/cool/store/service/impl/AdjustmentOrderServiceImpl.java @@ -1,5 +1,6 @@ package com.cool.store.service.impl; +import com.alibaba.fastjson.JSONObject; import com.cool.store.context.CurrentUserHolder; import com.cool.store.context.LoginUserInfo; import com.cool.store.dao.*; @@ -10,6 +11,7 @@ import com.cool.store.entity.SplitOrderDO; import com.cool.store.entity.StoreDO; import com.cool.store.enums.ErrorCodeEnum; import com.cool.store.enums.ExpenseSheetTypeEnum; +import com.cool.store.enums.wallet.AdjustTypeEnum; import com.cool.store.enums.wallet.DocStatusEnum; import com.cool.store.enums.wallet.SplitSourceEnum; import com.cool.store.enums.wallet.SplitTypeEnum; @@ -19,11 +21,11 @@ import com.cool.store.request.wallet.ConfirmRechargeRequest; import com.cool.store.request.wallet.OutStoreIdRequest; import com.cool.store.response.AdjustmentOrderResponse; import com.cool.store.service.AdjustmentOrderService; +import com.cool.store.service.SplitOrderService; import com.cool.store.service.UserAuthMappingService; import com.cool.store.service.dict.impl.DictService; import com.cool.store.service.wallet.WalletApiService; import com.cool.store.utils.GenerateNoUtil; -import com.cool.store.vo.login.UserLoginVO; import com.github.pagehelper.PageHelper; import com.github.pagehelper.PageInfo; import lombok.extern.slf4j.Slf4j; @@ -39,6 +41,7 @@ import java.util.stream.Collectors; import java.util.stream.Stream; import static com.cool.store.enums.fees.AllocationPayStatusEnum.*; +import static com.cool.store.enums.fees.WalletFeeItemEnum.*; import static com.cool.store.enums.wallet.DocStatusEnum.*; /** @@ -69,8 +72,17 @@ public class AdjustmentOrderServiceImpl implements AdjustmentOrderService { @Resource DictService dictService; - private static final String ADJUSTMENT_ORDER_PREFIX = "TZ"; - private static final String EXPENSE_SHEET_PREFIX = "FY"; + @Resource + SplitOrderService splitOrderService; + @Resource + UserAuthMappingService userAuthMappingService; + @Resource + EnterpriseUserRoleDao enterpriseUserRoleDao; + + + + private static final String PAYEE_ACCOUNT_NAME = "上海立规装饰设计工程有限公司"; + private static final String PAYEE_ACCOUNT_NO = "422011940168069"; @Override @Transactional(rollbackFor = Exception.class) @@ -82,7 +94,10 @@ public class AdjustmentOrderServiceImpl implements AdjustmentOrderService { if (store == null) { throw new ServiceException(ErrorCodeEnum.STORE_IS_EXIST); } - + Integer status = DOC_STATUS_1.getStatus(); + if (request.getAdjustType()!=null && request.getAdjustType()==2){ + status = DOC_STATUS_05.getStatus(); + } AdjustmentOrderDO adjustmentOrder = AdjustmentOrderDO.builder() .adjustmentNo(GenerateNoUtil.generateAdjustmentNo(request.getExpenseSheetType())) .storeId(request.getStoreId()) @@ -97,7 +112,7 @@ public class AdjustmentOrderServiceImpl implements AdjustmentOrderService { .expenseSheetType(request.getExpenseSheetType()) .settledAmount(new BigDecimal("0")) .pendingSettlementAmount(request.getAdjustAmount()) - .status(DOC_STATUS_1.getStatus()) + .status(status) .createUserId(userId) .createTime(new Date()) .build(); @@ -119,7 +134,7 @@ public class AdjustmentOrderServiceImpl implements AdjustmentOrderService { } // 只有待确认缴费状态才能编辑 - if (!DOC_STATUS_1.getStatus().equals(existing.getStatus())) { + if (!(DOC_STATUS_1.getStatus().equals(existing.getStatus())||DOC_STATUS_05.getStatus().equals(existing.getStatus()))) { throw new ServiceException(ErrorCodeEnum.NOT_SUPPORT_OPERATION); } @@ -156,7 +171,7 @@ public class AdjustmentOrderServiceImpl implements AdjustmentOrderService { } // 只有待确认缴费状态才能删除 - if (!DOC_STATUS_1.getStatus().equals(existing.getStatus())) { + if (!DocStatusEnum.getCanDeleteStatus().contains(existing.getStatus())) { throw new ServiceException(ErrorCodeEnum.NOT_SUPPORT_OPERATION); } existing.setDeleted(1); @@ -177,10 +192,6 @@ public class AdjustmentOrderServiceImpl implements AdjustmentOrderService { return buildResponse(adjustmentOrder); } - @Resource - UserAuthMappingService userAuthMappingService; - @Resource - EnterpriseUserRoleDao enterpriseUserRoleDao; @Override public PageInfo page(AdjustmentOrderPageRequest request, String userId) { @@ -371,9 +382,68 @@ public class AdjustmentOrderServiceImpl implements AdjustmentOrderService { log.info("费用调整单认款成功,单号:{},交易流水号:{}", adjustmentOrder.getAdjustmentNo(), request.getTradeNos()); + //查看当前门店是否有账户 + OutStoreIdRequest outStoreIdRequest = new OutStoreIdRequest(); + outStoreIdRequest.setOutStoreId(adjustmentOrder.getStoreId()); + AccountInfoDTO onlineAccountInfo = walletApiService.getOnlineAccountInfo(outStoreIdRequest); + if (onlineAccountInfo==null){ + log.info("费用调整单认款成功_当前门店无网商钱包账户"); + return Boolean.TRUE; + } + //费用单:费用类型为“灯箱广告类(立规) ”、“监控设备类(立规)” ,认款完成自动分账,默认分账到“上海立规装饰设计工程有限公司” + if (autoSplitOrder(adjustmentOrder.getExpenseSheetType(),adjustmentOrder.getExpenseTypeCode(),adjustmentOrder.getAdjustType())){ + StoreDO store = storeDao.getByStoreId(adjustmentOrder.getStoreId()); + GenerateSplitOrderRequest generateSplitOrderRequest = new GenerateSplitOrderRequest(); + generateSplitOrderRequest.setId(update.getId()); + generateSplitOrderRequest.setRemark(store.getStoreName()+adjustmentOrder.getRemark()); + // + generateSplitOrderRequest.setSplitType(SplitTypeEnum.ADD_BY_HAND.getStatus()); + generateSplitOrderRequest.setSplitAmount(adjustmentOrder.getPendingSettlementAmount()); + //收款账户 + generateSplitOrderRequest.setPayeeAccountName(PAYEE_ACCOUNT_NAME); + generateSplitOrderRequest.setPayeeAccountNo(PAYEE_ACCOUNT_NO); + //付款账户 + generateSplitOrderRequest.setPayerAccountName(onlineAccountInfo.getAccountName()); + generateSplitOrderRequest.setPayerAccountNo(onlineAccountInfo.getAccountNo()); + //生成分账单 + String splitOrder = generateSplitOrder(generateSplitOrderRequest); + + SplitOrderDO adjustDO = splitOrderDAO.getBySplitNo(splitOrder); + //确认分账 + splitOrderService.confirmSplitOrder(adjustDO.getId(),userInfo); + } return Boolean.TRUE; } + /** + * 是否自动分账 + * 费用单 广告费或者视频设备费 + * 调整单 广告费或者视频设备费 且是调增 + * @param expenseSheetType + * @param expenseType + * @param adjustType + * @return + */ + private Boolean autoSplitOrder(Integer expenseSheetType, String expenseType, Integer adjustType) { + // 广告费或者视频设备费 + boolean flag = ADVERTISEMENT_FEE.getExpenseType().equals(expenseType) + || VIDEO_DEVICE_FEE.getExpenseType().equals(expenseType); + + if (expenseSheetType == ExpenseSheetTypeEnum.EXPENSE_SHEET.getCode()) { + // 广告费或者视频设备费 自动分账 返回true,其他费用类型手动分账 + return flag; + } + + // 调整单逻辑 + if (expenseSheetType == ExpenseSheetTypeEnum.ADJUSTMENT_SHEET.getCode()) { + // 调整单逻辑:调增 且 广告费/视频设备费 才自动分账 + return adjustType == AdjustTypeEnum.ADJUST_TYPE_1.getCode()&& flag; + } + + // 其他单据类型不分账 + return Boolean.FALSE; + } + @Override public Boolean calculateAmount(String no, String transferAmount) { AdjustmentOrderDO adjustmentOrderDO = adjustmentOrderDAO.getByAdjustmentNo(no); @@ -410,9 +480,57 @@ public class AdjustmentOrderServiceImpl implements AdjustmentOrderService { @Override public Long pageCount(AdjustmentOrderPageRequest request,LoginUserInfo user) { + List regionIds = new ArrayList<>(); + Boolean isAdmin = enterpriseUserRoleDao.checkIsAdmin(user.getUserId()); + //非管理员根据管辖权限查询 管理员查所有 + if (StringUtils.isNotEmpty(user.getUserId())&&!isAdmin){ + regionIds = userAuthMappingService.getAuthRegionIdAndSubRegionIdByUserId(user.getUserId()); + request.setRegionIds(regionIds); + } return adjustmentOrderDAO.pageCount(request); } + @Override + @Transactional(rollbackFor = Exception.class) + public Boolean approval(AdjustmentApprovalRequest request) { + if (request.getId() == null) { + throw new ServiceException(ErrorCodeEnum.CHANGE_ID_NOT_NULL); + } + + AdjustmentOrderDO adjustmentOrder = adjustmentOrderDAO.getById(request.getId()); + if (adjustmentOrder == null) { + throw new ServiceException(ErrorCodeEnum.CHANGE_NOT_NULL); + } + + // 只有待审批状态才能审批 + if (!DOC_STATUS_05.getStatus().equals(adjustmentOrder.getStatus())) { + throw new ServiceException(ErrorCodeEnum.NOT_SUPPORT_OPERATION); + } + + // 拒绝时必须填写拒绝原因 + if (request.getApprovalResult() == 2 && StringUtils.isBlank(request.getRejectReason())) { + throw new ServiceException(ErrorCodeEnum.ERROR_MESSAGE, "拒绝原因不能为空"); + } + + Integer newStatus; + if (request.getApprovalResult() == 1) { + // 审批通过,状态变为待充值 + newStatus = DOC_STATUS_1.getStatus(); + } else { + // 审批拒绝,状态变为审批未通过 + newStatus = DOC_STATUS_15.getStatus(); + } + + AdjustmentOrderDO update = AdjustmentOrderDO.builder() + .id(request.getId()) + .status(newStatus) + .rejectReason(request.getRejectReason()) + .build(); + + int result = adjustmentOrderDAO.update(update); + return result > 0; + } + /** * 构建响应对象 */ @@ -437,6 +555,7 @@ public class AdjustmentOrderServiceImpl implements AdjustmentOrderService { response.setClaimTime(adjustmentOrder.getClaimTime()); response.setContractAttachmentInfo(adjustmentOrder.getContractAttachmentInfo()); response.setPayTime(adjustmentOrder.getPayTime()); + response.setRejectReason(adjustmentOrder.getRejectReason()); // 设置门店信息 if (StringUtils.isNotBlank(adjustmentOrder.getStoreId())) { diff --git a/coolstore-partner-service/src/main/java/com/cool/store/service/impl/AuditOpeningOperationPlanImpl.java b/coolstore-partner-service/src/main/java/com/cool/store/service/impl/AuditOpeningOperationPlanImpl.java index 1532dfbf7..ff3f5be7e 100644 --- a/coolstore-partner-service/src/main/java/com/cool/store/service/impl/AuditOpeningOperationPlanImpl.java +++ b/coolstore-partner-service/src/main/java/com/cool/store/service/impl/AuditOpeningOperationPlanImpl.java @@ -52,14 +52,14 @@ public class AuditOpeningOperationPlanImpl implements AuditOpeningOperationPlanS @Transactional(rollbackFor = Exception.class) public Boolean auditPlan(OpeningOperationPlanAuditRequest request, LoginUserInfo user) { log.info("auditPlan request:{}", JSONObject.toJSONString(request)); - if (Objects.isNull(request)) { + if (Boolean.TRUE) { log.error("auditPlan request is null"); - throw new ServiceException("auditPlan request is null"); + throw new ServiceException("接口废弃"); } ShopStageInfoDO shopStageInfo = shopStageInfoDAO.getShopSubStageInfo(request.getShopId(), ShopSubStageEnum.SHOP_STAGE_14); - if (!shopStageInfo.getShopSubStageStatus().equals(ShopSubStageStatusEnum.SHOP_SUB_STAGE_STATUS_141.getShopSubStageStatus())){ - throw new ServiceException(ErrorCodeEnum.NOT_ALLOW_OPERATE); - } +// if (!shopStageInfo.getShopSubStageStatus().equals(ShopSubStageStatusEnum.SHOP_SUB_STAGE_STATUS_141.getShopSubStageStatus())){ +// throw new ServiceException(ErrorCodeEnum.NOT_ALLOW_OPERATE); +// } try { ShopAuditInfoDO shopAuditInfoDO = request.toShopAuditInfoDO(); shopAuditInfoDO.setSubmittedUserId(user.getUserId()); @@ -73,12 +73,12 @@ public class AuditOpeningOperationPlanImpl implements AuditOpeningOperationPlanS ShopSubStageStatusEnum shopSubStageStatusEnum = null; Boolean flag = Boolean.FALSE; if(OpeningOperationPlanResultTypeEnum.PASS_AUDIT.getCode().equals(request.getResultType())){ - shopSubStageStatusEnum = ShopSubStageStatusEnum.SHOP_SUB_STAGE_STATUS_143; + //shopSubStageStatusEnum = ShopSubStageStatusEnum.SHOP_SUB_STAGE_STATUS_143; flag = Boolean.TRUE; }else { ShopInfoDO shopInfo = shopInfoDAO.getShopInfo(request.getShopId()); LineInfoDO lineInfoDO = lineInfoDAO.getLineInfo(shopInfo.getLineId()); - shopSubStageStatusEnum = ShopSubStageStatusEnum.SHOP_SUB_STAGE_STATUS_142; + //shopSubStageStatusEnum = ShopSubStageStatusEnum.SHOP_SUB_STAGE_STATUS_142; HashMap map = new HashMap<>(); map.put("partnerUsername",lineInfoDO.getUsername()); map.put("partnerMobile",lineInfoDO.getMobile()); diff --git a/coolstore-partner-service/src/main/java/com/cool/store/service/impl/BigRegionServiceImpl.java b/coolstore-partner-service/src/main/java/com/cool/store/service/impl/BigRegionServiceImpl.java index 5f27e4dd4..2e3adb58c 100644 --- a/coolstore-partner-service/src/main/java/com/cool/store/service/impl/BigRegionServiceImpl.java +++ b/coolstore-partner-service/src/main/java/com/cool/store/service/impl/BigRegionServiceImpl.java @@ -26,7 +26,7 @@ public class BigRegionServiceImpl implements BigRegionService { @Override public List queryAllBigRegion(String keyword, Integer joinBrand,Integer type) { - return bigRegionDAO.queryAllBigRegion(keyword, joinBrand,type); + return bigRegionDAO.queryAllBigRegion(keyword, joinBrand,type,null); } @Override diff --git a/coolstore-partner-service/src/main/java/com/cool/store/service/impl/BuildInformationServiceImpl.java b/coolstore-partner-service/src/main/java/com/cool/store/service/impl/BuildInformationServiceImpl.java index 55679ed64..b572cf997 100644 --- a/coolstore-partner-service/src/main/java/com/cool/store/service/impl/BuildInformationServiceImpl.java +++ b/coolstore-partner-service/src/main/java/com/cool/store/service/impl/BuildInformationServiceImpl.java @@ -51,11 +51,11 @@ import static com.cool.store.enums.point.ShopSubStageStatusEnum.SHOP_SUB_STAGE_S @Service @Slf4j public class BuildInformationServiceImpl implements BuildInformationService { - @Resource - private PlatformBuildDAO platformBuildDAO; @Resource private EnumInfoService enumInfoService; @Resource + private PlatformBuildDAO platformBuildDAO; + @Resource private RedisConstantUtil redisConstantUtil; @Resource private RedisUtilPool redisUtilPool; diff --git a/coolstore-partner-service/src/main/java/com/cool/store/service/impl/DataHandlerServerImpl.java b/coolstore-partner-service/src/main/java/com/cool/store/service/impl/DataHandlerServerImpl.java index a41d91f17..e82d2d62b 100644 --- a/coolstore-partner-service/src/main/java/com/cool/store/service/impl/DataHandlerServerImpl.java +++ b/coolstore-partner-service/src/main/java/com/cool/store/service/impl/DataHandlerServerImpl.java @@ -1170,7 +1170,7 @@ public class DataHandlerServerImpl implements DataHandlerServer { shopInfoDO.setManagerRegionId(isCreateStoreDTO.getPid()); updateList.add(shopInfoDO); } - List bigRegionDTOS = bigRegionDAO.queryAllBigRegion(null, null,null); + List bigRegionDTOS = bigRegionDAO.queryAllBigRegion(null, null,null,null); Map bigRegionDTOMap = bigRegionDTOS.stream().collect(Collectors.toMap(BigRegionDTO::getRegionId, x -> x)); //XX大区 正烧鸡 List storeManageIds = bigRegionDTOS.stream().filter(x -> x.getStoreManageRegionId() != null).map(BigRegionDTO::getStoreManageRegionId).collect(Collectors.toList()); diff --git a/coolstore-partner-service/src/main/java/com/cool/store/service/impl/DeskServiceImpl.java b/coolstore-partner-service/src/main/java/com/cool/store/service/impl/DeskServiceImpl.java index 52a9f0347..6faa1bad4 100644 --- a/coolstore-partner-service/src/main/java/com/cool/store/service/impl/DeskServiceImpl.java +++ b/coolstore-partner-service/src/main/java/com/cool/store/service/impl/DeskServiceImpl.java @@ -1,5 +1,6 @@ package com.cool.store.service.impl; +import com.alibaba.fastjson.JSONObject; import com.cool.store.context.LoginUserInfo; import com.cool.store.dao.*; import com.cool.store.dto.DeskStageDTO; @@ -30,6 +31,7 @@ import com.cool.store.vo.LabelBaseInfoVO; import com.cool.store.vo.desk.*; import com.github.pagehelper.PageHelper; import com.github.pagehelper.PageInfo; +import lombok.extern.slf4j.Slf4j; import org.apache.commons.collections4.CollectionUtils; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; @@ -50,6 +52,7 @@ import static com.cool.store.utils.poi.DateUtils.YYYY_MM_DD_HH_MM_SS; * @Date 2024/3/26 15:15 * @Version 1.0 */ +@Slf4j @Service public class DeskServiceImpl implements DeskService { @@ -96,6 +99,8 @@ public class DeskServiceImpl implements DeskService { @Autowired private ShopStageRemarkInfoDAO shopStageRemarkInfoDAO; @Resource + OpeningOperationPlanDAO openingOperationPlanDAO; + @Resource ShopAccountDAO shopAccountDAO; @Resource OperationsConsultantAssignDAO operationsConsultantAssignDAO; @@ -999,6 +1004,9 @@ public class DeskServiceImpl implements DeskService { List remarkInfoDOList = shopStageRemarkInfoDAO.getByShopIdsAndStage(shopIds, subStageStatusList); Map> remarkInfoMap = remarkInfoDOList.stream().collect(Collectors.groupingBy(ShopStageRemarkInfoDO::getShopId)); + List openingOperationPlanDOS = openingOperationPlanDAO.selectByShopIds(shopIds); + Map planDOMap = openingOperationPlanDOS.stream().collect(Collectors.toMap(OpeningOperationPlanDO::getShopId, Function.identity())); + List list = new ArrayList<>(); specialShopStageInfo.forEach(x -> { PreparationCommonPendingVO preparationCommonPendingVO = new PreparationCommonPendingVO(); @@ -1022,6 +1030,9 @@ public class DeskServiceImpl implements DeskService { preparationCommonPendingVO.setSignType(signFranchiseDO.getSignType()); preparationCommonPendingVO.setPartnershipSignatorySecond(signFranchiseDO.getPartnershipSignatorySecond()); } + OpeningOperationPlanDO doMapOrDefault = planDOMap.getOrDefault(x.getShopId(), new OpeningOperationPlanDO()); + preparationCommonPendingVO.setOpenTime(doMapOrDefault.getOpenTime()); + preparationCommonPendingVO.setActivityTheme(doMapOrDefault.getActivityTheme()); preparationCommonPendingVO.setShopCode(shopInfoDO.getShopCode()); preparationCommonPendingVO.setJoinMode(shopInfoDO.getJoinMode()); preparationCommonPendingVO.setInvestmentManager(userNameMap.getOrDefault(shopInfoDO.getInvestmentManager(),"")); diff --git a/coolstore-partner-service/src/main/java/com/cool/store/service/impl/EnterpriseServiceImpl.java b/coolstore-partner-service/src/main/java/com/cool/store/service/impl/EnterpriseServiceImpl.java index 036c02713..0f08df472 100644 --- a/coolstore-partner-service/src/main/java/com/cool/store/service/impl/EnterpriseServiceImpl.java +++ b/coolstore-partner-service/src/main/java/com/cool/store/service/impl/EnterpriseServiceImpl.java @@ -73,7 +73,7 @@ public class EnterpriseServiceImpl implements EnterpriseService { currentUser.setId(enterpriseUser.getId()); currentUser.setUserId(enterpriseUser.getUserId()); currentUser.setAccount(enterpriseUser.getUserId()); - currentUser.setDbName("coolcollege_intelligent_10027"); + currentUser.setDbName("coolcollege_intelligent_74"); currentUser.setDepartmentIds(enterpriseUser.getDepartments()); currentUser.setRoles(enterpriseUser.getRoles()); currentUser.setLanguage(enterpriseUser.getLanguage()); diff --git a/coolstore-partner-service/src/main/java/com/cool/store/service/impl/ExportRealizeServiceImpl.java b/coolstore-partner-service/src/main/java/com/cool/store/service/impl/ExportRealizeServiceImpl.java index 3e8cd8215..004773297 100644 --- a/coolstore-partner-service/src/main/java/com/cool/store/service/impl/ExportRealizeServiceImpl.java +++ b/coolstore-partner-service/src/main/java/com/cool/store/service/impl/ExportRealizeServiceImpl.java @@ -25,7 +25,7 @@ import com.cool.store.service.order.MiniStoreOrderService; import com.cool.store.service.order.impl.MiniStoreOrderServiceImpl; import com.cool.store.service.tp.TpScoreJournalService; import com.cool.store.service.visit.VisitRecordService; -import com.cool.store.service.visit.VisitRecordService; +import com.cool.store.utils.BeanUtil; import com.cool.store.utils.BeanUtil; import com.cool.store.utils.JSONUtils; import com.cool.store.utils.RedisUtilPool; @@ -40,7 +40,6 @@ import com.cool.store.vo.tp.TpScoreJournalVO; import com.cool.store.vo.visit.VisitRecordListVO; import com.cool.store.vo.point.PointExportVO; import com.cool.store.vo.point.PointPageVO; -import com.cool.store.vo.visit.VisitRecordListVO; import com.fasterxml.jackson.core.type.TypeReference; import com.fasterxml.jackson.databind.JsonNode; import com.fasterxml.jackson.databind.ObjectMapper; @@ -853,6 +852,8 @@ public class ExportRealizeServiceImpl implements ExportRealizeService { } } + + private List convertAndFillPointExport(List list) { List pointIds = CollStreamUtil.toList(list, PointPageVO::getPointId); Map pointMap = pointFinancialDataDAO.getMapByPointIds(pointIds); diff --git a/coolstore-partner-service/src/main/java/com/cool/store/service/impl/ExportServiceImpl.java b/coolstore-partner-service/src/main/java/com/cool/store/service/impl/ExportServiceImpl.java index b3221cce4..255a68268 100644 --- a/coolstore-partner-service/src/main/java/com/cool/store/service/impl/ExportServiceImpl.java +++ b/coolstore-partner-service/src/main/java/com/cool/store/service/impl/ExportServiceImpl.java @@ -311,6 +311,7 @@ public class ExportServiceImpl implements ExportService { return count; } + @Override public Long myPointExport(PointPageRequest request, LoginUserInfo user) { Long count = pointService.getMyPointCount(request, user.getUserId()); diff --git a/coolstore-partner-service/src/main/java/com/cool/store/service/impl/HqtAPIServiceImpl.java b/coolstore-partner-service/src/main/java/com/cool/store/service/impl/HqtAPIServiceImpl.java index f9051e6ea..1711e4e76 100644 --- a/coolstore-partner-service/src/main/java/com/cool/store/service/impl/HqtAPIServiceImpl.java +++ b/coolstore-partner-service/src/main/java/com/cool/store/service/impl/HqtAPIServiceImpl.java @@ -15,6 +15,8 @@ import com.cool.store.request.HqtPartnerAcceptanceRequest; import com.cool.store.request.hqt.*; import com.cool.store.response.HqtAPIResponse; import com.cool.store.service.HqtAPIService; +import com.fasterxml.jackson.databind.DeserializationFeature; +import com.fasterxml.jackson.databind.ObjectMapper; import lombok.extern.slf4j.Slf4j; import okhttp3.*; import org.jetbrains.annotations.NotNull; diff --git a/coolstore-partner-service/src/main/java/com/cool/store/service/impl/ImportServiceImpl.java b/coolstore-partner-service/src/main/java/com/cool/store/service/impl/ImportServiceImpl.java new file mode 100644 index 000000000..347770eac --- /dev/null +++ b/coolstore-partner-service/src/main/java/com/cool/store/service/impl/ImportServiceImpl.java @@ -0,0 +1,197 @@ +package com.cool.store.service.impl; + +import com.alibaba.fastjson.JSONObject; +import com.cool.store.dao.BigRegionDAO; +import com.cool.store.dao.ReceivingBankDAO; +import com.cool.store.dao.RegionDao; +import com.cool.store.dto.ImportOaOldShopDataDTO; +import com.cool.store.dto.ImportOaOldShopDataErrorDTO; +import com.cool.store.dto.ImportReceivingBankDTO; +import com.cool.store.dto.ImportReceivingBankErrorDTO; +import com.cool.store.dto.region.BigRegionDTO; +import com.cool.store.entity.ImportTaskDO; +import com.cool.store.entity.ReceivingBankDO; +import com.cool.store.enums.FileTypeEnum; +import com.cool.store.enums.FranchiseBrandEnum; +import com.cool.store.enums.ImportTaskStatusEnum; +import com.cool.store.enums.point.PayTypeEnum; +import com.cool.store.mapper.ImportTaskMapper; +import com.cool.store.request.ReceivingBankRequest; +import com.cool.store.service.ImportService; +import com.cool.store.utils.easyExcel.EasyExcelUtil; +import com.cool.store.utils.poi.DateUtils; +import com.cool.store.utils.poi.StringUtils; +import lombok.extern.slf4j.Slf4j; +import org.apache.commons.collections4.CollectionUtils; +import org.apache.commons.collections4.ListUtils; +import org.springframework.beans.BeanUtils; +import org.springframework.beans.factory.annotation.Value; +import org.springframework.stereotype.Service; +import org.springframework.transaction.annotation.Transactional; + +import javax.annotation.Resource; +import java.util.*; +import java.util.stream.Collectors; + +import static com.cool.store.utils.poi.DateUtils.SPECIAL_DATE_START_1; + +/** + * @Author: WangShuo + * @Date: 2025/06/19/10:29 + * @Version 1.0 + * @注释: + */ +@Service +@Slf4j +public class ImportServiceImpl implements ImportService { + @Value("${mybatis.configuration.variables.enterpriseId}") + private String eid; + @Resource + private EasyExcelUtil easyExcelUtil; + @Resource + private ImportTaskMapper importTaskMapper; + @Resource + private RegionDao regionDao; + @Resource + private BigRegionDAO bigRegionDAO; + @Resource + private ReceivingBankDAO receivingBankDAO; + @Override + @Transactional(rollbackFor = Exception.class) + public Boolean importReceivingBank(List importList, String originalFilename, String userId, ImportTaskDO task) { + List list = new ArrayList<>(); + List errorList = new ArrayList<>(); + List bigRegionDTOS = bigRegionDAO.queryAllBigRegion(null, null, null, null); + Map bigRegionMap = bigRegionDTOS.stream().collect(Collectors.toMap(BigRegionDTO::getRegionName, x -> x)); + List receivingBankDOS = receivingBankDAO.queryAll(); + Set receivingBankSet = receivingBankDOS.stream() + .map(bank -> new ReceivingBankDO(bank.getRegionId(), bank.getFranchiseBrand(), bank.getPayType())) + .collect(Collectors.toSet()); + ListUtils.emptyIfNull(importList) + .forEach(data -> { + try { + buildReceivingBankColumn(data,list,errorList,bigRegionMap,receivingBankSet,userId); + } catch (Exception e) { + ImportReceivingBankErrorDTO errorDTO = new ImportReceivingBankErrorDTO(); + //直接复制 + BeanUtils.copyProperties(data, errorDTO); + errorDTO.setErrorMsg("数据处理异常,请确认!"); + errorList.add(errorDTO); + log.info("importReceivingBank 转化error:{}", JSONObject.toJSONString(data)); + } + }); + receivingBankDAO.batchInsertOrUpdate(list); + if (!errorList.isEmpty()) { + task.setStatus(ImportTaskStatusEnum.ERROR.getCode()); + String url = null; + try { + url = easyExcelUtil.exportExcel(ImportReceivingBankErrorDTO.class, errorList, null, + FileTypeEnum.RECEIVING_BANK_IMPORT.getDesc() + DateUtils.parseDateToStr(SPECIAL_DATE_START_1, new Date()), + FileTypeEnum.RECEIVING_BANK_IMPORT.getDesc() + DateUtils.parseDateToStr(SPECIAL_DATE_START_1, new Date())); + } catch (Exception e) { + log.info("导出失败列表失败 errorList:{}", JSONObject.toJSONString(errorList)); + } + task.setFileUrl(url); + } else { + task.setStatus(ImportTaskStatusEnum.SUCCESS.getCode()); + } + task.setTotalNum(importList.size()); + task.setSuccessNum(importList.size() - errorList.size()); + importTaskMapper.update(eid, task); + log.info("导入数据条数:{}", list.size()); + if (CollectionUtils.isEmpty(list)) { + log.info("导入数据转化为空"); + return false; + } + return true; + } + + + /** + * @param dto excel列表数据 + * @param list 正常导入的数据 + * @param errorList 错误导入的数据 + * @param bigRegionMap 区域数据 + * @param receivingBankSet 重复数据校验 + * @param userId 用户id + * @return + */ + private boolean buildReceivingBankColumn(ImportReceivingBankDTO dto, List list, + List errorList, + Map bigRegionMap, + Set receivingBankSet, String userId) { + // 1. 统一获取并处理字段 + String franchiseBrand = StringUtils.trimToNull(dto.getFranchiseBrand()); + String regionName = StringUtils.trimToNull(dto.getRegionName()); + String payType = StringUtils.trimToNull(dto.getPayType()); + String payee = StringUtils.trimToNull(dto.getPayee()); + String receivingAccount = StringUtils.trimToNull(dto.getReceivingAccount()); + String bankName = StringUtils.trimToNull(dto.getBankName()); + String branchBankName = StringUtils.trimToNull(dto.getBranchBankName()); + + // 2. 错误信息收集 + StringBuilder errorMsg = new StringBuilder(); + + if (FranchiseBrandEnum.getCodeByDesc(franchiseBrand) == null) { + errorMsg.append("品牌信息错误;"); + } + if (bigRegionMap.get(regionName) == null) { + errorMsg.append("大区信息错误;"); + } + if (PayTypeEnum.getCodeByDesc(payType) == null) { + errorMsg.append("付款方式信息错误;"); + } + if (StringUtils.isBlank(payee)) { + errorMsg.append("收款人不能为空;"); + } + if (StringUtils.isBlank(receivingAccount)) { + errorMsg.append("收款账户不能为空;"); + } + if (StringUtils.isBlank(bankName)) { + errorMsg.append("收款银行不能为空;"); + } + if (StringUtils.isBlank(branchBankName)) { + errorMsg.append("收款银行开户行不能为空;"); + } +// if (receivingBankSet.contains(new ReceivingBankDO( +// bigRegionMap.get(regionName) != null ? bigRegionMap.get(regionName).getRegionId() : null, +// FranchiseBrandEnum.getCodeByDesc(franchiseBrand) != null ? FranchiseBrandEnum.getCodeByDesc(franchiseBrand) : null, +// PayTypeEnum.getCodeByDesc(payType) != null ? PayTypeEnum.getCodeByDesc(payType) : null))) { +// errorMsg.append("收款信息已存在;"); +// } + + // 3. 只有存在错误时才创建错误dto 没有错误不需要创建对象 + if (errorMsg.length() > 0) { + ImportReceivingBankErrorDTO errorDTO = new ImportReceivingBankErrorDTO(); + //直接复制 + BeanUtils.copyProperties(dto, errorDTO); + errorDTO.setErrorMsg(errorMsg.toString()); + errorList.add(errorDTO); + return false; + } + + // 4. 正常数据处理 + ReceivingBankDO bankDO = new ReceivingBankDO(); + bankDO.setRegionId(bigRegionMap.get(regionName).getRegionId()); + bankDO.setFranchiseBrand(FranchiseBrandEnum.getCodeByDesc(franchiseBrand)); + bankDO.setPayType(PayTypeEnum.getCodeByDesc(payType)); + bankDO.setPayee(payee); + bankDO.setReceivingAccount(receivingAccount); + bankDO.setBankName(bankName); + bankDO.setBranchBankName(branchBankName); + bankDO.setCreateTime(new Date()); + bankDO.setCreateUser(userId); + bankDO.setUpdateTime(new Date()); + bankDO.setUpdateUser(userId); + list.add(bankDO); + + // 5. 添加到已存在集合 + receivingBankSet.add(new ReceivingBankDO( + bankDO.getRegionId(), + bankDO.getFranchiseBrand(), + bankDO.getPayType())); + + return true; +} + +} diff --git a/coolstore-partner-service/src/main/java/com/cool/store/service/impl/LiePinServiceImpl.java b/coolstore-partner-service/src/main/java/com/cool/store/service/impl/LiePinServiceImpl.java new file mode 100644 index 000000000..4b2d54748 --- /dev/null +++ b/coolstore-partner-service/src/main/java/com/cool/store/service/impl/LiePinServiceImpl.java @@ -0,0 +1,131 @@ +package com.cool.store.service.impl; + +import com.cool.store.constants.RedisConstant; +import com.cool.store.dao.StoreDao; +import com.cool.store.dao.ThirdPartyAccountDAO; +import com.cool.store.dao.ThirdPartyStoreDAO; +import com.cool.store.entity.StoreDO; +import com.cool.store.entity.ThirdPartyAccountDO; +import com.cool.store.entity.ThirdPartyStoreDO; +import com.cool.store.enums.ErrorCodeEnum; +import com.cool.store.exception.ServiceException; +import com.cool.store.request.liepin.AddStoreEmpRequest; +import com.cool.store.request.liepin.AddStoreRequest; +import com.cool.store.request.liepin.GetPathRequest; +import com.cool.store.response.liepin.PathResponse; +import com.cool.store.service.LiePinService; +import com.cool.store.service.ThirdLiePinService; +import com.cool.store.utils.RedisConstantUtil; +import com.cool.store.utils.RedisUtilPool; +import com.cool.store.utils.StringUtil; +import org.springframework.beans.factory.annotation.Value; +import org.springframework.stereotype.Service; + +import javax.annotation.Resource; + +/** + * @Author suzhuhong + * @Date 2025/5/26 19:27 + * @Version 1.0 + */ +@Service +public class LiePinServiceImpl implements LiePinService { + + + @Resource + ThirdPartyStoreDAO thirdPartyStoreDAO; + @Resource + ThirdPartyAccountDAO thirdPartyAccountDAO; + @Resource + StoreDao storeDao; + @Resource + ThirdLiePinService thirdLiePinService; + + @Value("${liePin.tenantId}") + private Long tenantId; + @Resource + RedisUtilPool redisUtilPool; + @Resource + private RedisConstantUtil redisConstantUtil; + + + @Override + public String getJumpUrl(String shopCode,String mobile,String userName) { + String key = redisConstantUtil.getKeyCommonMethod(RedisConstant.LIE_PIN_EMP_PATH_PREFIX, shopCode,mobile); + String path = redisUtilPool.getString(key); + if (StringUtil.isNotEmpty(path)){ + return path; + } + //查询当前门店是否推送该人员和门店到猎聘 如果没有推送 先推送 + ThirdPartyAccountDO codeAndMobile = thirdPartyAccountDAO.getByCodeAndMobile(shopCode, mobile); + Long storeId = null; + if (codeAndMobile!=null){ + storeId = Long.valueOf(codeAndMobile.getThirdPartyStoreId()); + }else { + //先推送门店 + storeId = pushStoreToLiePin(shopCode); + //推送人员 + pushStoreEmpToLiePin(shopCode, mobile,userName); + } + //推送门店推送人员 + GetPathRequest pathRequest = GetPathRequest.builder().mobile(mobile).store_id(String.valueOf(storeId)).tenant_id(tenantId).build(); + PathResponse pathDTO = thirdLiePinService.getPath(pathRequest); + //存储3分钟 + redisUtilPool.setString(key,pathDTO.getPath(),3*60); + return pathDTO.getPath(); + } + + @Override + public Long pushStoreToLiePin(String shopCode) { + //首先校验门店是否推送过 + ThirdPartyStoreDO storeRecord = thirdPartyStoreDAO.getByLocalStoreCode(shopCode); + if (storeRecord!=null){ + return Long.valueOf(storeRecord.getThirdPartyStoreId()); + } + //校验推送的数据是否全 不全提示信息不足 + StoreDO store = storeDao.getByStoreNum(shopCode); + if (StringUtil.isAnyBlank(store.getStoreAddress(),store.getLatitude(),store.getLongitude(),store.getAvatar(),store.getTelephone())){ + throw new ServiceException(ErrorCodeEnum.STORE_INFO_INSUFFICIENT); + } + //oss文件换猎聘文件路径 + String filePath = thirdLiePinService.getFilePath(store.getAvatar()); + AddStoreRequest addStore = AddStoreRequest.builder().store_name(store.getStoreName()). + address(store.getStoreAddress()) + .longitude(store.getLongitude()) + .latitude(store.getLatitude()) + .contact_person_mobile(store.getTelephone()) + .exigency_mobile(store.getTelephone()) + .contact_person_name(store.getStoreName() + store.getTelephone()) + .doorplate_picture(filePath).tenant_id(tenantId).build(); + Long storeId = thirdLiePinService.addStoreToLiePin(addStore); + //成功之后新增记录 + ThirdPartyStoreDO thirdPartyStoreDO = ThirdPartyStoreDO.builder().localStoreCode(shopCode).thirdPartyStoreId(String.valueOf(storeId)).thirdPartyStoreUrl(filePath).build(); + thirdPartyStoreDAO.addPushRecord(thirdPartyStoreDO); + return storeId; + } + + @Override + public Long pushStoreEmpToLiePin(String shopCode, String mobile, String userName) { + if (StringUtil.isAnyBlank(shopCode,mobile)){ + throw new ServiceException(ErrorCodeEnum.PARAMS_REQUIRED); + } + ThirdPartyAccountDO codeAndMobile = thirdPartyAccountDAO.getByCodeAndMobile(shopCode, mobile); + if (codeAndMobile!=null){ + return Long.valueOf(codeAndMobile.getThirdPartyAccountId()); + } + if (StringUtil.isEmpty(userName)){ + userName = "店员" + mobile; + } + Long storeId = pushStoreToLiePin(shopCode); + + AddStoreEmpRequest request = AddStoreEmpRequest.builder().store_id(storeId).account_type(1).position_id(1L).tenant_id(tenantId).mobile(mobile).nick_name(userName).build(); + Long accountId = thirdLiePinService.addStoreEmp(request); + + ThirdPartyAccountDO accountDO = ThirdPartyAccountDO.builder().accountType(request.getAccount_type()).mobile(mobile) + .positionId(request.getPosition_id()).localStoreCode(shopCode).thirdPartyStoreId(String + .valueOf(storeId)).thirdPartyAccountId(String.valueOf(accountId)).build(); + thirdPartyAccountDAO.addPushRecord(accountDO); + return accountId; + } + +} diff --git a/coolstore-partner-service/src/main/java/com/cool/store/service/impl/LineFlowService.java b/coolstore-partner-service/src/main/java/com/cool/store/service/impl/LineFlowService.java index 62f3e3a42..ecd549829 100644 --- a/coolstore-partner-service/src/main/java/com/cool/store/service/impl/LineFlowService.java +++ b/coolstore-partner-service/src/main/java/com/cool/store/service/impl/LineFlowService.java @@ -101,7 +101,6 @@ public abstract class LineFlowService { if (CollectionUtils.isNotEmpty(shopInfoDOS)){ throw new ServiceException(ErrorCodeEnum.SHOP_HAVE_NOT_OVER_ACCORDING); } - LineInfoDO lineInfo = lineInfoDAO.getLineInfo(request.getLineId()); String partnerId = lineInfo.getPartnerId(); LineAuditInfoDO auditInfo = new LineAuditInfoDO(); diff --git a/coolstore-partner-service/src/main/java/com/cool/store/service/impl/LinePayServiceImpl.java b/coolstore-partner-service/src/main/java/com/cool/store/service/impl/LinePayServiceImpl.java index 038f24d04..1d46b2489 100644 --- a/coolstore-partner-service/src/main/java/com/cool/store/service/impl/LinePayServiceImpl.java +++ b/coolstore-partner-service/src/main/java/com/cool/store/service/impl/LinePayServiceImpl.java @@ -6,10 +6,7 @@ import com.alibaba.fastjson.JSONObject; import com.cool.store.constants.CommonConstants; import com.cool.store.constants.RedisConstant; import com.cool.store.context.LoginUserInfo; -import com.cool.store.dao.HyPartnerUserInfoDAO; -import com.cool.store.dao.LineInfoDAO; -import com.cool.store.dao.LinePayDAO; -import com.cool.store.dao.ShopStageInfoDAO; +import com.cool.store.dao.*; import com.cool.store.dto.AmountDTO; import com.cool.store.entity.*; import com.cool.store.enums.*; @@ -21,13 +18,16 @@ import com.cool.store.exception.ServiceException; import com.cool.store.mapper.FranchiseFeeMapper; import com.cool.store.mapper.LineInfoMapper; import com.cool.store.mapper.ShopInfoMapper; +import com.cool.store.request.FranchiseFeePayOnlineRequest; import com.cool.store.request.LinePaySubmitRequest; -import com.cool.store.request.xgj.ReceiptCallBackRequest; -import com.cool.store.request.xgj.ReceiptRequest; +import com.cool.store.request.xgj.*; import com.cool.store.response.FranchiseFeePayInfoResponse; +import com.cool.store.response.FranchiseFeePayOnlineResponse; +import com.cool.store.response.ReceivingBankResponse; import com.cool.store.response.bigdata.ApiResponse; import com.cool.store.service.LinePayService; import com.cool.store.service.PushService; +import com.cool.store.service.ReceivingBankService; import com.cool.store.service.UserAuthMappingService; import com.cool.store.utils.CoolDateUtils; import com.cool.store.utils.RedisConstantUtil; @@ -39,6 +39,7 @@ import com.cool.store.vo.LinePayVO; import com.cool.store.vo.PartnerUserInfoVO; import lombok.extern.slf4j.Slf4j; import org.apache.commons.collections4.CollectionUtils; +import org.apache.commons.lang3.ObjectUtils; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Value; import org.springframework.stereotype.Service; @@ -52,6 +53,7 @@ import java.util.*; import java.util.function.Function; import java.util.stream.Collectors; +import static com.cool.store.enums.WorkflowSubStageStatusEnum.PAY_DEPOSIT_45; import static com.cool.store.utils.poi.DateUtils.SPECIAL_DATE_START; import static com.cool.store.utils.poi.DateUtils.YYYY_MM_DD_HH_MM_SS; @@ -92,6 +94,8 @@ public class LinePayServiceImpl implements LinePayService { RedisConstantUtil redisConstantUtil; @Resource PushService pushService; + @Resource + private ReceivingBankService receivingBankService; @Override public LinePayVO getLinePayInfo(Long lineId, Integer businessType, Long shopId) { @@ -132,7 +136,7 @@ public class LinePayServiceImpl implements LinePayService { if (lineInfo == null) { throw new ServiceException(ErrorCodeEnum.LINE_ID_IS_NOT_EXIST); } - if (!WorkflowSubStageStatusEnum.PAY_DEPOSIT_45.getCode().equals(lineInfo.getWorkflowSubStageStatus())) { + if (!PAY_DEPOSIT_45.getCode().equals(lineInfo.getWorkflowSubStageStatus())) { throw new ServiceException(ErrorCodeEnum.LINE_STATUS_NOT_ALLOW_OPERATE); } lineInfo.setWorkflowSubStage(WorkflowSubStageEnum.SIGN_INTENT_AGREEMENT.getCode()); @@ -161,7 +165,8 @@ public class LinePayServiceImpl implements LinePayService { if (StringUtils.isBlank(userId)) { throw new ServiceException(ErrorCodeEnum.ACCESS_TOKEN_INVALID); } - FranchiseFeeDO franchiseFeeDO = franchiseFeeMapper.selectByShopId(request.getShopId()); +// doFilter(request.getShopId(),request.getAmount(),request.getId(),request.getPayUserName()); +// FranchiseFeeDO franchiseFeeDO = franchiseFeeMapper.selectByShopId(request.getShopId()); //判断付款人最多2人(可重复) List list = linePayDAO.getFranchiseFeePayInfoByShopId(request.getShopId()); Map payIdMap = list.stream().collect(Collectors.toMap(LinePayDO::getId, Function.identity())); @@ -216,7 +221,7 @@ public class LinePayServiceImpl implements LinePayService { LinePayDO linePayById = linePayDAO.getById(linePayDO.getId()); if (linePayById == null) { log.info("linePayById is null"); - throw new ServiceException(ErrorCodeEnum.UPDATE_ERROR); + throw new ServiceException(ErrorCodeEnum.UPDATE_ERROR); } else { linePayDO.setUpdateTime(new Date()); linePayDO.setUpdateUserId(userId); @@ -250,6 +255,37 @@ public class LinePayServiceImpl implements LinePayService { } } + private void doFilter(Long shopId,BigDecimal amount,Long payId,String payUserName) { + FranchiseFeeDO franchiseFeeDO = franchiseFeeMapper.selectByShopId(shopId); + //判断付款人最多2人(可重复) + List list = linePayDAO.getFranchiseFeePayInfoByShopId(shopId); + list=list.stream().filter(linePayDO -> !linePayDO.getPayStatus().equals(PayStatusEnum.CANCELED.getCode()) + &&!linePayDO.getPayStatus().equals(PayStatusEnum.PAY_FAIL_55.getCode())).collect(Collectors.toList()); + Map payIdMap = list.stream().collect(Collectors.toMap(LinePayDO::getId, Function.identity())); + if (payId!= null) { + payIdMap.remove(payId); + } + //判断缴费金额不能大于未缴费金额 + BigDecimal total = payIdMap.values().stream() + .map(LinePayDO::getAmount) + .reduce(BigDecimal.ZERO, BigDecimal::add); + //应缴金额 + BigDecimal amountDue = new BigDecimal(franchiseFeeDO.getYearFranchiseFee()) + .add(new BigDecimal(franchiseFeeDO.getLoanMargin())) + .add(new BigDecimal(franchiseFeeDO.getFirstYearFee())) + .add(new BigDecimal(franchiseFeeDO.getFirstYearManageFee())) + .add(new BigDecimal(franchiseFeeDO.getPerformanceBond())); + //未缴费金额 + BigDecimal amountUnpaid = amountDue.subtract(total); + if (amount.compareTo(amountUnpaid) > 0) { + throw new ServiceException(ErrorCodeEnum.PAY_AMOUNT_ERROR); + } + Set payUserList = list.stream().map(LinePayDO::getPayUserName).collect(Collectors.toSet()); + if (!payUserList.contains(payUserName) && payUserList.size() >= 2) { + throw new ServiceException(ErrorCodeEnum.PAY_USER_NAME_ERROR); + } + } + @Override public String getPaymentReceiptCode() { //当前日期 @@ -314,6 +350,18 @@ public class LinePayServiceImpl implements LinePayService { return Boolean.TRUE; } + @Override + public Boolean onlinePushPayInfo(Long shopId, LinePayDO linePayDO) { + FranchiseFeeDO franchiseFeeDO = franchiseFeeMapper.selectByShopId(shopId); + ReceivingBankResponse receivingBankResponse = receivingBankService.getByShopId(shopId); + ReceiptOnlineRequest receiptOnlineRequest = new ReceiptOnlineRequest(shopId, franchiseFeeDO.getId().intValue(), linePayDO); + receiptOnlineRequest.setPayee(receivingBankResponse.getPayee()); + receiptOnlineRequest.setReceivingAccount(receivingBankResponse.getReceivingAccount()); + receiptOnlineRequest.setBankName(receivingBankResponse.getBankName()); + receiptOnlineRequest.setBranchBankName(receivingBankResponse.getBranchBankName()); + return pushService.pushOnlineReceiptToXGJ(receiptOnlineRequest); + } + @Override @Transactional(rollbackFor = Exception.class) public ApiResponse ReceiptCallBack(ReceiptCallBackRequest request) { @@ -322,11 +370,139 @@ public class LinePayServiceImpl implements LinePayService { return ApiResponse.error(ErrorCodeEnum.RECEIPT_NOT_EXIST); } linePayDO.setXgjClaimStatus(request.getClaimStatus()); + if (StringUtils.isNotEmpty(request.getFailReason())){ + linePayDO.setXgjFailReason(request.getFailReason()); + } linePayDO.setUpdateTime(new Date()); linePayDAO.updateLinePay(linePayDO); return ApiResponse.success(Boolean.TRUE); } + @Override + public ApiResponse changeOnlinePayInfo(OnlinePayInfoRequest onlinePayInfoRequest) { + if (PayStatusEnum.FEES_HAVE_BEEN_PAID_50.getCode().equals(onlinePayInfoRequest.getPaymentStatus())&&StringUtils.isEmpty(onlinePayInfoRequest.getPaySerialNumber())&& + ObjectUtils.anyNull(onlinePayInfoRequest.getActAmount(),onlinePayInfoRequest.getPayTime())){ + return ApiResponse.error(ErrorCodeEnum.PARAMS_REQUIRED); + } + //根据收款单编号查询 + LinePayDO linePayDO = linePayDAO.selectByPaymentReceiptCode(onlinePayInfoRequest.getReceiptId()); + if (Objects.isNull(linePayDO)) { + return ApiResponse.error(ErrorCodeEnum.RECEIPT_NOT_EXIST); + } + linePayDO.setPayStatus(onlinePayInfoRequest.getPaymentStatus()); + linePayDO.setPayTime(onlinePayInfoRequest.getPayTime()); + linePayDO.setPaySerialNumber(onlinePayInfoRequest.getPaySerialNumber()); + linePayDO.setXgjClaimStatus(onlinePayInfoRequest.getClaimStatus()); + linePayDO.setAmount(onlinePayInfoRequest.getActAmount()); + linePayDAO.updateLinePay(linePayDO); + return ApiResponse.success(Boolean.TRUE); + } + + @Override + @Transactional(rollbackFor = Exception.class) + public FranchiseFeePayOnlineResponse franchiseFeePayOnline(FranchiseFeePayOnlineRequest request, String userId) { + if (request.getId()!=null){ + throw new ServiceException(ErrorCodeEnum.NOT_ALLOW_OPERATE); + } + String lockKey = "submitFranchiseFeePayInfoOnline:lineId" + request.getLineId() + "shopId" + request.getShopId(); + doFilter(request.getShopId(),request.getAmount(),request.getId(),request.getPayUserName()); + ShopStageInfoDO shopSubStageInfo = shopStageInfoDAO.getShopSubStageInfo(request.getShopId(), ShopSubStageEnum.SHOP_STAGE_7); + if (!shopSubStageInfo.getShopSubStageStatus().equals(ShopSubStageStatusEnum.SHOP_SUB_STAGE_STATUS_72.getShopSubStageStatus()) + && !shopSubStageInfo.getShopSubStageStatus().equals(ShopSubStageStatusEnum.SHOP_SUB_STAGE_STATUS_71.getShopSubStageStatus())) { + throw new ServiceException(ErrorCodeEnum.NOT_ALLOW_OPERATE); + } + //流水 + String lockValue = UUID.randomUUID().toString(); + boolean acquired = false; + try { + //10s过期 + acquired = redisUtilPool.setNxExpire(lockKey, lockValue, CommonConstants.TEN_SECONDS); + if (Boolean.TRUE.equals(acquired)) { + LineInfoDO lineInfo = lineInfoDAO.getLineInfo(request.getLineId()); + FranchiseFeePayOnlineResponse response = new FranchiseFeePayOnlineResponse(); + response.setShopId(request.getShopId()); + //新增 + if (request.getId() == null) { + LinePayDO linePayDO = new LinePayDO(); + linePayDO.setShopId(request.getShopId()); + linePayDO.setLineId(request.getLineId()); + linePayDO.setAmount(request.getAmount()); + linePayDO.setPayBusinessType(PayBusinessTypeEnum.FRANCHISE_FEE.getCode()); + linePayDO.setPartnerId(lineInfo.getPartnerId()); + linePayDO.setPayStatus(PayStatusEnum.WAIT_PAY_45.getCode()); + linePayDO.setPayType(PayTypeEnum.ONLINE_PAY.getCode()); + linePayDO.setPayUserName(request.getPayUserName()); + linePayDO.setCreateUserId(userId); + linePayDO.setCreateTime(new Date()); + linePayDO.setXgjClaimStatus(ClaimStatusEnum.TO_BE_CLAIMED.getCode()); + linePayDO.setPaymentReceiptCode(this.getPaymentReceiptCode()); + linePayDO.setDeleted(false); + linePayDAO.addLinePay(linePayDO); + response.setPaymentReceiptCode(linePayDO.getPaymentReceiptCode()); + //推送收款单到新管家 + this.onlinePushPayInfo(request.getShopId(),linePayDO); + }else{ + //修改 + LinePayDO linePayDO = linePayDAO.getById(request.getId()); + if (linePayDO == null){ + throw new ServiceException(ErrorCodeEnum.UPDATE_ERROR); + } + if (linePayDO.getXgjClaimStatus().equals(ClaimStatusEnum.CLAIMED.getCode())){ + throw new ServiceException(ErrorCodeEnum.CLAIM_STATUS_ERROR); + } + if (linePayDO.getPayStatus().equals(PayStatusEnum.CANCELED.getCode()) + ||linePayDO.getPayStatus().equals(PayStatusEnum.FEES_HAVE_BEEN_PAID_50.getCode())){ + throw new ServiceException(ErrorCodeEnum.NOT_ALLOW_OPERATE); + } + linePayDO.setUpdateTime(new Date()); + linePayDO.setPayStatus(PayStatusEnum.WAIT_PAY_45.getCode()); + linePayDO.setPayUserName(request.getPayUserName()); + linePayDO.setUpdateUserId(userId); + linePayDO.setAmount(request.getAmount()); + //如果是认领失败状态的时候 修改需要将状态置为待认领 + if (linePayDO.getXgjClaimStatus().equals(ClaimStatusEnum.CLAIMED_FAIL.getCode())){ + linePayDO.setXgjClaimStatus(ClaimStatusEnum.TO_BE_CLAIMED.getCode()); + } + linePayDAO.updateLinePay(linePayDO); + response.setPaymentReceiptCode(linePayDO.getPaymentReceiptCode()); + //推送数据 + this.onlinePushPayInfo(request.getShopId(),linePayDO); + } + if (shopSubStageInfo.getShopSubStageStatus().equals(ShopSubStageStatusEnum.SHOP_SUB_STAGE_STATUS_71.getShopSubStageStatus())) { + shopStageInfoDAO.updateShopStageInfo(request.getShopId(), ShopSubStageStatusEnum.SHOP_SUB_STAGE_STATUS_72); + } + return response; + } else { + throw new ServiceException(ErrorCodeEnum.DUPLICATE_SUBMISSION); + } + } finally { + if (Boolean.TRUE.equals(acquired)) { + String currentValue = redisUtilPool.getString(lockKey); + if (lockValue.equals(currentValue)) { + redisUtilPool.delKey(lockKey); + } + } + } + } + + @Override + @Transactional(rollbackFor = Exception.class) + public Boolean cancelFranchiseFeePayOnline(Long id, String userId) { + LinePayDO linePay = linePayDAO.getById(id); + if (linePay == null) { + throw new ServiceException(ErrorCodeEnum.DELETE_ERROR); + } + if (linePay.getXgjClaimStatus().equals(ClaimStatusEnum.CLAIMED.getCode())){ + throw new ServiceException(ErrorCodeEnum.CLAIM_STATUS_ERROR); + } + linePay.setPayStatus(PayStatusEnum.CANCELED.getCode()); + linePayDAO.updateLinePay(linePay); + + //取消支付 + this.onlinePushPayInfo(linePay.getShopId(),linePay); + return true; + } + @Override public FranchiseFeePayInfoResponse getById(Long id) { diff --git a/coolstore-partner-service/src/main/java/com/cool/store/service/impl/MessageTemplateServiceImpl.java b/coolstore-partner-service/src/main/java/com/cool/store/service/impl/MessageTemplateServiceImpl.java index fb98026cd..572ae521b 100644 --- a/coolstore-partner-service/src/main/java/com/cool/store/service/impl/MessageTemplateServiceImpl.java +++ b/coolstore-partner-service/src/main/java/com/cool/store/service/impl/MessageTemplateServiceImpl.java @@ -80,9 +80,9 @@ public class MessageTemplateServiceImpl implements MessageTemplateService { @Resource TaskExecutor noticeThreadPool; @Resource - HyPartnerUserInfoDAO hyPartnerUserInfoDAO; - @Resource MessageIssueService messageIssueService; + @Resource + HyPartnerUserInfoDAO hyPartnerUserInfoDAO; diff --git a/coolstore-partner-service/src/main/java/com/cool/store/service/impl/OpenApiServiceImpl.java b/coolstore-partner-service/src/main/java/com/cool/store/service/impl/OpenApiServiceImpl.java index afd726c55..55116e3f2 100644 --- a/coolstore-partner-service/src/main/java/com/cool/store/service/impl/OpenApiServiceImpl.java +++ b/coolstore-partner-service/src/main/java/com/cool/store/service/impl/OpenApiServiceImpl.java @@ -23,6 +23,7 @@ import com.cool.store.enums.point.ShopSubStageStatusEnum; import com.cool.store.exception.ServiceException; import com.cool.store.request.PostAndOrderRequest; import com.cool.store.request.xgj.FranchiseFeeCallBackRequest; +import com.cool.store.request.xgj.OnlinePayInfoRequest; import com.cool.store.request.xgj.ReceiptCallBackRequest; import com.cool.store.response.bigdata.ApiResponse; import com.cool.store.service.FranchiseFeeService; @@ -139,4 +140,9 @@ public class OpenApiServiceImpl implements OpenApiService { public ApiResponse changePaymentStatus(FranchiseFeeCallBackRequest request) { return franchiseFeeService.changePaymentStatus(request); } + + @Override + public ApiResponse changeOnlinePayInfo(OnlinePayInfoRequest onlinePayInfoRequest) { + return linePayService.changeOnlinePayInfo(onlinePayInfoRequest); + } } diff --git a/coolstore-partner-service/src/main/java/com/cool/store/service/impl/OpeningOperationPlanImpl.java b/coolstore-partner-service/src/main/java/com/cool/store/service/impl/OpeningOperationPlanImpl.java index 7db6b86f7..6f9e7e88f 100644 --- a/coolstore-partner-service/src/main/java/com/cool/store/service/impl/OpeningOperationPlanImpl.java +++ b/coolstore-partner-service/src/main/java/com/cool/store/service/impl/OpeningOperationPlanImpl.java @@ -19,8 +19,11 @@ import com.cool.store.enums.point.ShopSubStageStatusEnum; import com.cool.store.exception.ServiceException; import com.cool.store.mapper.UserAuthMappingMapper; import com.cool.store.request.OpeningOperationPlanRequest; +import com.cool.store.request.OrderSummaryRequest; import com.cool.store.request.PlanListRequest; +import com.cool.store.response.OrderSummaryResponse; import com.cool.store.service.*; +import com.cool.store.utils.poi.DateUtils; import com.cool.store.utils.poi.StringUtils; import com.cool.store.vo.OpeningOperationPlanListVO; import com.cool.store.vo.OpeningOperationPlanVO; @@ -32,6 +35,7 @@ import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; import javax.annotation.Resource; +import java.math.BigDecimal; import java.util.*; import java.util.stream.Collectors; @@ -65,6 +69,8 @@ public class OpeningOperationPlanImpl implements OpeningOperationPlanService { private LineInfoDAO lineInfoDAO; @Resource private ShopService shopService; + @Resource + HuoMaService huoMaService; @Resource UserAuthMappingService userAuthMappingService; @@ -79,10 +85,7 @@ public class OpeningOperationPlanImpl implements OpeningOperationPlanService { log.error("addNewPlan ActivityTheme length error"); throw new ServiceException(ErrorCodeEnum.ACTIVITY_THEME_LENGTH_FALSE); } - if (request.getSurveyResult().length() > CommonConstants.MAX_LENGTH_ONE_HUNDRED) { - log.error("addNewPlan SurveyResult length error"); - throw new ServiceException(ErrorCodeEnum.SURVEYRESULT_LENGTH_FALSE); - } + ShopInfoDO shopInfo = shopInfoDAO.getShopInfo(request.getShopId()); String userId = userInfo.getUserId(); OpeningOperationPlanDO selectByShopId = openingOperationPlanDAO.selectByShopId(request.getShopId()); Long planId; @@ -95,6 +98,10 @@ public class OpeningOperationPlanImpl implements OpeningOperationPlanService { openingOperationPlanDO.setId(selectByShopId.getId()); openingOperationPlanDO.setUpdateTime(new Date()); openingOperationPlanDO.setUpdateUserId(userId); + //如果开业时间调整 需要重新获取数据 时间相同不需要拉取数据 + if (!DateUtils.parseDateToStr(DateUtils.YYYY_MM_DD,request.getOpenTime()).equals(DateUtils.parseDateToStr(DateUtils.YYYY_MM_DD,selectByShopId.getOpenTime()))){ + getIncome(shopInfo.getShopCode(),openingOperationPlanDO); + } planId = openingOperationPlanDAO.updateSelective(openingOperationPlanDO); } else { //新增 @@ -102,32 +109,11 @@ public class OpeningOperationPlanImpl implements OpeningOperationPlanService { openingOperationPlanDO.setSubmittedUserId(userId); openingOperationPlanDO.setCreateTime(new Date()); openingOperationPlanDO.setCreateUserId(userId); + getIncome(shopInfo.getShopCode(),openingOperationPlanDO); planId = openingOperationPlanDAO.insertSelective(openingOperationPlanDO); } - shopStageInfoDAO.updateShopStageInfo(request.getShopId(), ShopSubStageStatusEnum.SHOP_SUB_STAGE_STATUS_141); - ShopInfoDO shopInfoDO = shopInfoDAO.getShopInfo(request.getShopId()); - LineInfoDO lineInfoDO = lineInfoDAO.getLineInfo(shopInfoDO.getLineId()); - Set planAuditUser = new HashSet<>(); - List regionManagerUser = userAuthMappingService.getAllUserByRoleEnumAndRegionId(UserRoleEnum.REGION_MANAGER, shopInfoDO.getRegionId()); - if (Objects.nonNull(regionManagerUser)){ - Set regionManagerUserIds = regionManagerUser.stream().map(EnterpriseUserDO::getUserId).collect(Collectors.toSet()); - planAuditUser.addAll(regionManagerUserIds); - } - List regionalManager = userAuthMappingService.getAllUserByRoleEnumAndRegionId(UserRoleEnum.REGIONAL_MANAGER, shopInfoDO.getRegionId()); - if (Objects.nonNull(regionalManager)){ - Set regionalManagerUserIds = regionalManager.stream().map(EnterpriseUserDO::getUserId).collect(Collectors.toSet()); - planAuditUser.addAll(regionalManagerUserIds); - } - - HashMap map = new HashMap<>(); - map.put("partnerUsername",lineInfoDO.getUsername()); - map.put("partnerMobile",lineInfoDO.getMobile()); - map.put("storeName",shopInfoDO.getShopName()); - commonService.sendQWMessage(new ArrayList<>(planAuditUser), - MessageEnum.MESSAGE_42, - map); + shopStageInfoDAO.updateShopStageInfo(request.getShopId(), ShopSubStageStatusEnum.SHOP_SUB_STAGE_STATUS_143); return planId; - } @Override @@ -141,21 +127,9 @@ public class OpeningOperationPlanImpl implements OpeningOperationPlanService { ShopInfoDO shopInfo = shopInfoDAO.getShopInfo(shopId); OpeningOperationPlanDO openingOperationPlanDO = openingOperationPlanDAO.selectByShopId(shopId); EnterpriseUserDO userInfoById = enterpriseUserDAO.getUserInfoById(shopInfo.getSupervisorUserId()); - List allUserByRoleEnumAndRegionId = userAuthMappingService.getAllUserByRoleEnumAndRegionId(UserRoleEnum.OPERATIONS_MANAGER, shopInfo.getRegionId()); - List collect = new ArrayList<>(); - if (CollectionUtils.isEmpty(allUserByRoleEnumAndRegionId)){ - collect = null; - }else { - collect = allUserByRoleEnumAndRegionId.stream() - .filter(user -> user.getName() != null) - .map(user -> user.getName()) - .collect(Collectors.toList()); - } - if (Objects.nonNull(openingOperationPlanDO)) { openingOperationPlanVO = new OpeningOperationPlanVO(openingOperationPlanDO); openingOperationPlanVO.setSubmiter(Objects.isNull(userInfoById) ? null : userInfoById.getName()); - openingOperationPlanVO.setApprover(CollectionUtils.isEmpty(collect) ? null : collect.stream().collect(Collectors.joining(","))); String preparationUserIds = openingOperationPlanDO.getPreparationUserIds(); if (StringUtils.isNotBlank(preparationUserIds)){ List stream = Arrays.stream(preparationUserIds.split(CommonConstants.COMMA)).collect(Collectors.toList()); @@ -165,14 +139,71 @@ public class OpeningOperationPlanImpl implements OpeningOperationPlanService { String userName = enterpriseUserDAO.getUserName(openingOperationPlanDO.getSubmittedUserId()); openingOperationPlanVO.setSubmittedUserName(userName); openingOperationPlanVO.setShopName(shopInfo.getShopName()); + + if (StringUtils.isAnyEmpty(openingOperationPlanDO.getFirstDayIncome(),openingOperationPlanDO.getSecondDayIncome(),openingOperationPlanDO.getThirdDayIncome())){ + getIncome(shopInfo.getShopCode(),openingOperationPlanDO); + openingOperationPlanDAO.updateSelective(openingOperationPlanDO); + } + openingOperationPlanVO.setFirstDayIncome(openingOperationPlanDO.getFirstDayIncome()); + openingOperationPlanVO.setSecondDayIncome(openingOperationPlanDO.getSecondDayIncome()); + openingOperationPlanVO.setThirdDayIncome(openingOperationPlanDO.getThirdDayIncome()); return openingOperationPlanVO; } openingOperationPlanVO.setSubmiter(Objects.isNull(userInfoById) ? null : userInfoById.getName()); - openingOperationPlanVO.setApprover(CollectionUtils.isEmpty(collect) ? null : collect.stream().collect(Collectors.joining(","))); return openingOperationPlanVO; } + + + private OpeningOperationPlanDO getIncome(String code,OpeningOperationPlanDO openingOperationPlanDO){ + if (openingOperationPlanDO.getOpenTime()==null||StringUtils.isEmpty(code)){ + return openingOperationPlanDO; + } + OrderSummaryRequest orderSummaryRequest = new OrderSummaryRequest(); + orderSummaryRequest.setType("1"); + orderSummaryRequest.setShop_sn(code); + //当前日期 + try { + String dateStr = DateUtils.parseDateToStr(DateUtils.YYYY_MM_DD, openingOperationPlanDO.getOpenTime()); + if (StringUtils.isEmpty(openingOperationPlanDO.getFirstDayIncome())||"0.00".equals(openingOperationPlanDO.getFirstDayIncome())){ + orderSummaryRequest.setStart_date(dateStr); + orderSummaryRequest.setEnd_date(dateStr); + OrderSummaryResponse orderSummary = huoMaService.getOrderSummary(orderSummaryRequest); + //第一天收入 + BigDecimal firstDay = OrderSummaryResponse.calculateExpectedIncome(orderSummary); + openingOperationPlanDO.setFirstDayIncome(firstDay.toString()); + } + + //当前日期加1 + String dateStr1 = DateUtils.getPlusFDays(openingOperationPlanDO.getOpenTime(), 1).toString(); + if (StringUtils.isEmpty(openingOperationPlanDO.getSecondDayIncome())||"0.00".equals(openingOperationPlanDO.getSecondDayIncome())){ + orderSummaryRequest.setStart_date(dateStr1); + orderSummaryRequest.setEnd_date(dateStr1); + OrderSummaryResponse orderSummary = huoMaService.getOrderSummary(orderSummaryRequest); + //第一天收入 + BigDecimal secondDay = OrderSummaryResponse.calculateExpectedIncome(orderSummary); + openingOperationPlanDO.setSecondDayIncome(secondDay.toString()); + } + + //当前日期加2 + String dateStr2 = DateUtils.getPlusFDays(openingOperationPlanDO.getOpenTime(), 2).toString(); + if (StringUtils.isEmpty(openingOperationPlanDO.getThirdDayIncome())||"0.00".equals(openingOperationPlanDO.getThirdDayIncome())){ + orderSummaryRequest.setStart_date(dateStr2); + orderSummaryRequest.setEnd_date(dateStr2); + OrderSummaryResponse orderSummary = huoMaService.getOrderSummary(orderSummaryRequest); + //第一天收入 + BigDecimal thirdDay = OrderSummaryResponse.calculateExpectedIncome(orderSummary); + openingOperationPlanDO.setThirdDayIncome(thirdDay.toString()); + } + } catch (Exception e) { + log.error("收入查询失败:{}",e.getMessage()); + return openingOperationPlanDO; + } + return openingOperationPlanDO; + } + @Override + @Deprecated public PageInfo getPlanListPage(PlanListRequest request) { log.info("getPlanListPage request:{}", JSONObject.toJSONString(request)); if (!sysRoleService.checkIsAdmin(request.getCurUserId())) { diff --git a/coolstore-partner-service/src/main/java/com/cool/store/service/impl/OperationLogServiceImpl.java b/coolstore-partner-service/src/main/java/com/cool/store/service/impl/OperationLogServiceImpl.java index 520995877..2dc442a94 100644 --- a/coolstore-partner-service/src/main/java/com/cool/store/service/impl/OperationLogServiceImpl.java +++ b/coolstore-partner-service/src/main/java/com/cool/store/service/impl/OperationLogServiceImpl.java @@ -235,6 +235,30 @@ public class OperationLogServiceImpl implements OperationLogService { return operationLogDAO.batchUpdateByPrimaryKeySelective(operationLogList); } + @Override + public Boolean handleApproveTimeNoDate(Long shopId,ShopSubStageStatusEnum subStageStatusEnum, Long audit, String userId, String reason) { + OperationLogDO operationLogDO = new OperationLogDO(); + operationLogDO.setOperator(userId); + operationLogDO.setAuditResultId(audit); + operationLogDO.setRemarks(reason); + operationLogDO.setShopId(shopId); + operationLogDO.setShopSubStage(subStageStatusEnum.getShopSubStageEnum().getShopSubStage()); + operationLogDO.setShopSubStageStatus(subStageStatusEnum.getShopSubStageStatus()); + operationLogDO.setStatus(OperationStatusEnum.PROCESSED.getCode()); + operationLogDO.setType(OperationTypeEnum.OPERATION_TYPE_1.getCode()); + String userName = enterpriseUserDAO.getUserName(userId); + if (StringUtils.isNotBlank(userName)) { + operationLogDO.setOperatorName(userName); + } + Date createTime = new Date(); + Date updateTime = new Date(); + operationLogDO.setCreateTime(createTime); + operationLogDO.setUpdateTime(updateTime); + operationLogDO.setCreateUserId(userId); + operationLogDAO.addOperationLog(operationLogDO); + return Boolean.TRUE; + } + } diff --git a/coolstore-partner-service/src/main/java/com/cool/store/service/impl/PointServiceImpl.java b/coolstore-partner-service/src/main/java/com/cool/store/service/impl/PointServiceImpl.java index 686c261e7..fe9617e40 100644 --- a/coolstore-partner-service/src/main/java/com/cool/store/service/impl/PointServiceImpl.java +++ b/coolstore-partner-service/src/main/java/com/cool/store/service/impl/PointServiceImpl.java @@ -51,8 +51,7 @@ import java.util.*; import java.util.function.Function; import java.util.stream.Collectors; -import static com.cool.store.enums.point.ShopSubStageStatusEnum.SHOP_SUB_STAGE_STATUS_21; -import static com.cool.store.enums.point.ShopSubStageStatusEnum.SHOP_SUB_STAGE_STATUS_21_5; +import static com.cool.store.enums.point.ShopSubStageStatusEnum.*; /** * @author zhangchenbiao @@ -106,6 +105,10 @@ public class PointServiceImpl implements PointService { private String enterpriseId; @Resource SysRoleMapper sysRoleMapper; + @Resource + OperationLogService operationLogService; + @Resource + OperationLogDAO operationLogDAO; @Resource PointFinancialDataDAO pointFinancialDataDAO; @@ -1195,14 +1198,13 @@ public class PointServiceImpl implements PointService { } @Override - public Integer uploadRentContract(AddRentContractRequest request) { + public Integer uploadRentContract(AddRentContractRequest request,String userId,String userName) { if (!request.check()) { throw new ServiceException(ErrorCodeEnum.PARAMS_VALIDATE_ERROR); } Long pointId = request.getPointId(), shopId = request.getShopId(); - ShopInfoDO shopInfo = null; + ShopInfoDO shopInfo = shopInfo = shopInfoDAO.getShopInfo(shopId);; if (Objects.isNull(pointId) && Objects.nonNull(shopId)) { - shopInfo = shopInfoDAO.getShopInfo(shopId); pointId = shopInfo.getPointId(); } if (Objects.nonNull(pointId) && Objects.isNull(shopId)) { @@ -1239,6 +1241,13 @@ public class PointServiceImpl implements PointService { MessageEnum.MESSAGE_15, map); } + // 审批记录 + operationLogService.addOperationLog(shopId, ShopSubStageStatusEnum.SHOP_SUB_STAGE_STATUS_20, userId, userName, + OperationTypeEnum.OPERATION_TYPE_0, "加盟商上传租赁合同", OperationStatusEnum.PROCESSED); + List userDOList = userAuthMappingService.getAllUserByRoleEnumAndRegionId(UserRoleEnum.REGION_MANAGER, shopInfo.getInvestRegionId()); + operationLogService.addOperationLog(shopId, ShopSubStageStatusEnum.SHOP_SUB_STAGE_STATUS_21, + userId, userDOList, + OperationTypeEnum.OPERATION_TYPE_1, "招商片区老总审核", OperationStatusEnum.NOT_PROCESSED); return shopStageInfoDAO.updateShopStageInfo(shopId, SHOP_SUB_STAGE_STATUS_21); } @@ -1286,6 +1295,8 @@ public class PointServiceImpl implements PointService { Long auditId = shopAuditInfoDAO.addAuditInfo(AuditRentContractRequest.convert(request, AuditTypeEnum.UPLOAD_RENT_CONTRACT)); ShopSubStageStatusEnum subStageStatus = null; + Integer current = shopStageInfo.getShopSubStageStatus(); + ShopSubStageStatusEnum currentShopSubStageStatusEnum = getShopSubStageStatusEnum(current); if (AuditResultTypeEnum.PASS.getCode().equals(request.getResultType())){ if (shopStageInfo.getShopSubStageStatus().equals(SHOP_SUB_STAGE_STATUS_21.getShopSubStageStatus())){ subStageStatus = SHOP_SUB_STAGE_STATUS_21_5; @@ -1296,6 +1307,16 @@ public class PointServiceImpl implements PointService { }else { subStageStatus = ShopSubStageStatusEnum.SHOP_SUB_STAGE_STATUS_22; } + //处理审批 + handleApprove(shopId,AuditTypeEnum.UPLOAD_RENT_CONTRACT,request.getOperateUserId(),request.getOperateUserName(), + request.getResultType(),currentShopSubStageStatusEnum,request.getReason()); + //如果有下一级 + if (SHOP_SUB_STAGE_STATUS_21.getShopSubStageStatus().equals(currentShopSubStageStatusEnum.getShopSubStageStatus())){ + List userDOList = userAuthMappingService.getAllUserByRoleEnumAndRegionId(UserRoleEnum.BRANCH_OFFICE, shopInfo.getInvestRegionId()); + operationLogService.addOperationLog(shopId, ShopSubStageStatusEnum.SHOP_SUB_STAGE_STATUS_21_5, + request.getOperateUserId(), userDOList, + OperationTypeEnum.OPERATION_TYPE_1, "分部内勤审核", OperationStatusEnum.NOT_PROCESSED); + } if (ShopSubStageStatusEnum.SHOP_SUB_STAGE_STATUS_23.equals(subStageStatus)) { //审核通过铺位变为已签约 @@ -1324,6 +1345,41 @@ public class PointServiceImpl implements PointService { return CommonConstants.ONE; } + + /** + * 处理审批 + * @param shopId + * @param auditTypeEnum + * @param userId + * @param userName + * @param resultType + * @param currentStatusEnum + * @param cause + * @return + */ + private Boolean handleApprove(Long shopId,AuditTypeEnum auditTypeEnum,String userId,String userName,Integer resultType,ShopSubStageStatusEnum currentStatusEnum,String cause){ + ShopAuditInfoDO shopAuditInfoDO = new ShopAuditInfoDO(); + shopAuditInfoDO.setShopId(shopId); + shopAuditInfoDO.setAuditType(auditTypeEnum.getCode()); + shopAuditInfoDO.setSubmittedUserId(userId); + shopAuditInfoDO.setSubmittedUserName(userName); + shopAuditInfoDO.setResultType(resultType); + if (AuditResultTypeEnum.PASS.getCode().equals(shopAuditInfoDO.getResultType())) { + shopAuditInfoDO.setPassReason(cause); + } else { + shopAuditInfoDO.setRejectReason(cause); + } + Long auditId = shopAuditInfoDAO.addAuditInfo(shopAuditInfoDO); + //更新操作记录 + List operationLogs = operationLogDAO.getBySubStageStatusEnumAndsStatus(shopId, currentStatusEnum, OperationTypeEnum.OPERATION_TYPE_1.getCode()); + if (CollectionUtils.isNotEmpty(operationLogs)){ + operationLogService.batchUpdateProcessed(operationLogs, auditId, userId, cause); + }else { + operationLogService.handleApproveTimeNoDate(shopId,currentStatusEnum,auditId, userId, cause); + } + return true; + } + @Override public Integer updateRentContract(UpdateRentContractRequest request) { if (!request.check()) { diff --git a/coolstore-partner-service/src/main/java/com/cool/store/service/impl/PreparationServiceImpl.java b/coolstore-partner-service/src/main/java/com/cool/store/service/impl/PreparationServiceImpl.java index 34a3528ba..75325c2de 100644 --- a/coolstore-partner-service/src/main/java/com/cool/store/service/impl/PreparationServiceImpl.java +++ b/coolstore-partner-service/src/main/java/com/cool/store/service/impl/PreparationServiceImpl.java @@ -212,6 +212,28 @@ public class PreparationServiceImpl implements PreparationService { } } + @Override + public void decorationCompletion(Long shopId) { + List shopStageInfo = shopStageInfoDAO.getShopStageInfo(shopId, null); + if (CollectionUtils.isNotEmpty(shopStageInfo)) { + Map shopStageInfoDOMap = shopStageInfo.stream().collect(Collectors.toMap(ShopStageInfoDO::getShopSubStage, data -> data)); + Boolean flag2 = ShopSubStageStatusEnum.SHOP_SUB_STAGE_STATUS_123.getShopSubStageStatus(). + equals(shopStageInfoDOMap.get(ShopSubStageEnum.SHOP_STAGE_12.getShopSubStage()).getShopSubStageStatus()); + + //如果阶段已经初始化过 直接跳过 针对老数据 + if(shopStageInfoDOMap.get(ShopSubStageEnum.SHOP_STAGE_14.getShopSubStage()).getShopSubStageStatus() + >ShopSubStageStatusEnum.SHOP_SUB_STAGE_STATUS_140.getShopSubStageStatus()){ + return; + } + + if (flag2){ + List list = new ArrayList<>(); + list.add(ShopSubStageStatusEnum.SHOP_SUB_STAGE_STATUS_140); + shopStageInfoDAO.batchUpdateShopStageStatus(shopId, list); + } + } + } + @Override public void sysStoreCompleted(Long shopId) { List shopStageInfo = shopStageInfoDAO.getShopStageInfo(shopId, null); diff --git a/coolstore-partner-service/src/main/java/com/cool/store/service/impl/PushServiceImpl.java b/coolstore-partner-service/src/main/java/com/cool/store/service/impl/PushServiceImpl.java index 3600b5acb..7b20a3c4f 100644 --- a/coolstore-partner-service/src/main/java/com/cool/store/service/impl/PushServiceImpl.java +++ b/coolstore-partner-service/src/main/java/com/cool/store/service/impl/PushServiceImpl.java @@ -16,7 +16,9 @@ import com.cool.store.enums.ErrorCodeEnum; import com.cool.store.enums.UserRoleEnum; import com.cool.store.exception.ServiceException; import com.cool.store.request.ZxjpApiRequest; +import com.cool.store.request.xgj.CancelPayRequest; import com.cool.store.request.xgj.PushFranchiseFeeRequest; +import com.cool.store.request.xgj.ReceiptOnlineRequest; import com.cool.store.request.xgj.ReceiptRequest; import com.cool.store.response.XgjAccessTokenDTO; import com.cool.store.response.XgjBaseResponse; @@ -153,6 +155,12 @@ public class PushServiceImpl implements PushService { return executePostApiCall(apiUrl, request, Boolean.class, xgjUsername, xgjSecret,getXgjAccessToken().getAccess_token()); } + @Override + public Boolean pushOnlineReceiptToXGJ(ReceiptOnlineRequest receiptRequest) { + String apiUrl = xgjUrl + "/dmp/dmp-join/open/franchiseeReceipts/online"; + return executePostApiCall(apiUrl, receiptRequest, Boolean.class, xgjUsername, xgjSecret,getXgjAccessToken().getAccess_token()); + } + @Override public Boolean pushDataToPOS(ZxjpApiRequest zxjpApiRequest) { String apiUrl = url + "/dzgV1/zxcrm/shop/upsert"; @@ -297,7 +305,7 @@ public class PushServiceImpl implements PushService { } String responseBody = response.body().string(); log.info("getUnReadMessageNum response num:{}", responseBody); - return Integer.valueOf(responseBody); + return Integer.valueOf(responseBody)+100; } catch (Exception e) { log.error("API调用异常 - URL: {}, 错误: {}", url, e.getMessage(), e); throw new ServiceException(ErrorCodeEnum.THIRD_API_ERROR, "接口调用异常: " + e.getMessage()); diff --git a/coolstore-partner-service/src/main/java/com/cool/store/service/impl/ReceivingBankServiceImpl.java b/coolstore-partner-service/src/main/java/com/cool/store/service/impl/ReceivingBankServiceImpl.java new file mode 100644 index 000000000..4c5da6487 --- /dev/null +++ b/coolstore-partner-service/src/main/java/com/cool/store/service/impl/ReceivingBankServiceImpl.java @@ -0,0 +1,139 @@ +package com.cool.store.service.impl; + +import com.cool.store.dao.*; +import com.cool.store.entity.BigRegionDO; +import com.cool.store.entity.FranchiseFeeDO; +import com.cool.store.entity.ReceivingBankDO; +import com.cool.store.entity.ShopInfoDO; +import com.cool.store.enums.ErrorCodeEnum; +import com.cool.store.enums.point.PayTypeEnum; +import com.cool.store.exception.ServiceException; +import com.cool.store.mapper.FranchiseFeeMapper; +import com.cool.store.request.ReceivingBankListRequest; +import com.cool.store.request.ReceivingBankRequest; +import com.cool.store.response.ReceivingBankResponse; +import com.cool.store.service.ReceivingBankService; +import com.github.pagehelper.PageHelper; +import com.github.pagehelper.PageInfo; +import org.apache.commons.collections4.CollectionUtils; +import org.apache.commons.lang3.StringUtils; +import org.springframework.stereotype.Service; + +import javax.annotation.Resource; +import java.util.*; +import java.util.stream.Collectors; + +/** + * @Author: WangShuo + * @Date: 2025/06/18/17:53 + * @Version 1.0 + * @注释: + */ +@Service +public class ReceivingBankServiceImpl implements ReceivingBankService { + @Resource + private ReceivingBankDAO receivingBankDAO; + @Resource + private RegionDao regionDao; + @Resource + private BigRegionDAO bigRegionDAO; + @Resource + private EnterpriseUserDAO enterpriseUserDAO; + @Resource + private ShopInfoDAO shopInfoDAO; + @Resource + private FranchiseFeeMapper franchiseFeeMapper; + + + @Override + public Integer submit(ReceivingBankRequest request, String userId) { + ReceivingBankDO receivingBankDO = new ReceivingBankDO(); + receivingBankDO.setRegionId(request.getRegionId()); + receivingBankDO.setFranchiseBrand(Integer.parseInt(request.getFranchiseBrand())); + receivingBankDO.setPayee(request.getPayee()); + receivingBankDO.setPayType(request.getPayType()); + receivingBankDO.setReceivingAccount(request.getReceivingAccount()); + receivingBankDO.setBankName(request.getBankName()); + receivingBankDO.setBranchBankName(request.getBranchBankName()); + if (request.getId() == null) { + receivingBankDO.setCreateTime(new Date()); + receivingBankDO.setCreateUser(userId); + } else { + receivingBankDO.setId(request.getId()); + receivingBankDO.setUpdateTime(new Date()); + receivingBankDO.setUpdateUser(userId); + } + return receivingBankDAO.batchInsertOrUpdate(Collections.singletonList(receivingBankDO)); + } + + @Override + public PageInfo getByFranchiseBrandAndRegionId(ReceivingBankListRequest request) { + PageHelper.startPage(request.getPageNum(),request.getPageSize()); + List list = receivingBankDAO.getByFranchiseBrandAndRegionId(request.getFranchiseBrandList(),request.getRegionIdList()); + if (CollectionUtils.isEmpty(list)){ + return new PageInfo<>(); + } + PageInfo pageInfo = new PageInfo<>(list); + List responses = new ArrayList<>(); + Set regionSet = list.stream().filter(Objects::nonNull).map(ReceivingBankDO::getRegionId).collect(Collectors.toSet()); + Set userIds = list.stream().filter(Objects::nonNull).map(ReceivingBankDO::getCreateUser).collect(Collectors.toSet()); + userIds.addAll(list.stream().filter(Objects::nonNull).map(ReceivingBankDO::getUpdateUser).collect(Collectors.toSet())); + Map userNameMap = enterpriseUserDAO.getUserNameMap(new ArrayList<>(userIds)); + Map regionNameMap = regionDao.getRegionNameMap(new ArrayList<>(regionSet)); + Map bigRegionMap = bigRegionDAO.getMapByRegionIds(new ArrayList<>(regionSet)); + for (ReceivingBankDO x:list){ + ReceivingBankResponse response = new ReceivingBankResponse(); + response.setId(x.getId()); + response.setRegionId(x.getRegionId()); + response.setRegionName(regionNameMap.getOrDefault(x.getRegionId(),"")); + response.setGroup(bigRegionMap.getOrDefault(x.getRegionId(),new BigRegionDO()).getGroupName()); + response.setFranchiseBrand(x.getFranchiseBrand().toString()); + response.setPayType(x.getPayType()); + response.setPayee(x.getPayee()); + response.setReceivingAccount(x.getReceivingAccount()); + response.setBankName(x.getBankName()); + response.setBranchBankName(x.getBranchBankName()); + response.setCreateUserName(userNameMap.getOrDefault(x.getCreateUser(),"")); + response.setUpdateUserName(userNameMap.getOrDefault(x.getUpdateUser(),"")); + response.setCreateTime(x.getCreateTime()); + response.setUpdateTime(x.getUpdateTime()); + responses.add(response); + } + pageInfo.setList(responses); + return pageInfo; + } + + @Override + public ReceivingBankResponse getByShopId(Long shopId) { + ShopInfoDO shopInfo = shopInfoDAO.getShopInfo(shopId); + if (shopInfo.getRegionId()==null){ + throw new ServiceException(ErrorCodeEnum.SHOP_REGION_NOT_EXIST); + } + if (StringUtils.isBlank(shopInfo.getFranchiseBrand())){ + throw new ServiceException(ErrorCodeEnum.SHOP_FRANCHISE_BRAND_NOT_EXITS); + } + FranchiseFeeDO franchiseFeeDO = franchiseFeeMapper.selectByShopId(shopId); + if (franchiseFeeDO == null){ + throw new ServiceException(ErrorCodeEnum.UNISSUED_STATEMENT); + } + if (franchiseFeeDO.getPayType() == null + || (!franchiseFeeDO.getPayType().equals(PayTypeEnum.ONLINE_PAY.getCode()) + &&!franchiseFeeDO.getPayType().equals(PayTypeEnum.OFFLINE_PAY.getCode()) )){ + throw new ServiceException(ErrorCodeEnum.PAY_TYPE_NOT_EXIST); + } + List receivingBankDOList = receivingBankDAO.getByRegionAndFranchiseBrandAndPayType(shopInfo.getRegionId(), Integer.parseInt(shopInfo.getFranchiseBrand()), franchiseFeeDO.getPayType()); + if (CollectionUtils.isEmpty(receivingBankDOList)){ + throw new ServiceException(ErrorCodeEnum.RECEIVING_BANK_NOT_EXIST); + } + if (receivingBankDOList.size() > 1){ + throw new ServiceException(ErrorCodeEnum.THERE_ARE_SEVERAL_RECEIVING_BANK); + } + ReceivingBankResponse response= new ReceivingBankResponse(); + response.setPayType(receivingBankDOList.get(0).getPayType()); + response.setPayee(receivingBankDOList.get(0).getPayee()); + response.setReceivingAccount(receivingBankDOList.get(0).getReceivingAccount()); + response.setBankName(receivingBankDOList.get(0).getBankName()); + response.setBranchBankName(receivingBankDOList.get(0).getBranchBankName()); + return response; + } +} diff --git a/coolstore-partner-service/src/main/java/com/cool/store/service/impl/ShopServiceImpl.java b/coolstore-partner-service/src/main/java/com/cool/store/service/impl/ShopServiceImpl.java index d09a91d9d..a2683adb3 100644 --- a/coolstore-partner-service/src/main/java/com/cool/store/service/impl/ShopServiceImpl.java +++ b/coolstore-partner-service/src/main/java/com/cool/store/service/impl/ShopServiceImpl.java @@ -52,6 +52,7 @@ import java.util.stream.Stream; import static com.cool.store.enums.ErrorCodeEnum.*; import static com.cool.store.enums.UserRoleEnum.*; import static com.cool.store.enums.WorkflowSubStageStatusEnum.*; +import static com.cool.store.enums.point.ShopSubStageEnum.SHOP_STAGE_8; import static com.cool.store.enums.point.ShopSubStageEnum.SHOP_STAGE_15; import static com.cool.store.enums.point.ShopSubStageEnum.SHOP_STAGE_8; @@ -943,8 +944,6 @@ public class ShopServiceImpl implements ShopService { case SHOP_SUB_STAGE_STATUS_11: case SHOP_SUB_STAGE_STATUS_50: case SHOP_SUB_STAGE_STATUS_140: - case SHOP_SUB_STAGE_STATUS_141: - case SHOP_SUB_STAGE_STATUS_142: case SHOP_SUB_STAGE_STATUS_171: case SHOP_SUB_STAGE_STATUS_270: case SHOP_SUB_STAGE_STATUS_274: diff --git a/coolstore-partner-service/src/main/java/com/cool/store/service/impl/SignFranchiseServiceImpl.java b/coolstore-partner-service/src/main/java/com/cool/store/service/impl/SignFranchiseServiceImpl.java index 0a5cc3c1f..503bfd9c2 100644 --- a/coolstore-partner-service/src/main/java/com/cool/store/service/impl/SignFranchiseServiceImpl.java +++ b/coolstore-partner-service/src/main/java/com/cool/store/service/impl/SignFranchiseServiceImpl.java @@ -6,6 +6,7 @@ import com.alibaba.fastjson.JSONObject; import com.cool.store.constants.CommonConstants; import com.cool.store.constants.RedisConstant; import com.cool.store.constants.DictConstants; +import com.cool.store.constants.RedisConstant; import com.cool.store.context.LoginUserInfo; import com.cool.store.dao.*; import com.cool.store.dao.fees.WalletPayInfoDAO; @@ -483,6 +484,9 @@ public class SignFranchiseServiceImpl implements SignFranchiseService, AuditResu shopInfoDO.setDecorationRequirement(request.getDecorationRequirement()); shopInfoDO.setSpecialInstruction(request.getSpecialInstruction()); shopInfoMapper.updateByPrimaryKeySelective(shopInfoDO); + //添加修改日志 + handleDecorartionReq(shopInfoDO.getId(),request.getDecorationLevel(),request.getDecorationRequirement(), + request.getShopDecorationAttributes(),request.getSpecialInstruction(),user); if (Objects.nonNull(pointInfoById)) { pointInfoById.setProvince(request.getProvince()); pointInfoById.setCity(request.getCity()); @@ -675,6 +679,7 @@ public class SignFranchiseServiceImpl implements SignFranchiseService, AuditResu } } + /** * 分部内勤/财务审批拒绝 */ @@ -937,6 +942,7 @@ public class SignFranchiseServiceImpl implements SignFranchiseService, AuditResu return pushService.pushContract(contractInformationDTO); } catch (Exception e) { log.error("推送合同信息失败", e); + throw new ServiceException(ErrorCodeEnum.THIRD_API_ERROR,e.getMessage()); } } return null; diff --git a/coolstore-partner-service/src/main/java/com/cool/store/service/impl/StoreServiceImpl.java b/coolstore-partner-service/src/main/java/com/cool/store/service/impl/StoreServiceImpl.java index 34c70186c..b2d4b0ad1 100644 --- a/coolstore-partner-service/src/main/java/com/cool/store/service/impl/StoreServiceImpl.java +++ b/coolstore-partner-service/src/main/java/com/cool/store/service/impl/StoreServiceImpl.java @@ -1,11 +1,12 @@ package com.cool.store.service.impl; +import cn.hutool.core.collection.CollStreamUtil; import cn.hutool.core.collection.CollStreamUtil; import cn.hutool.core.collection.CollUtil; import cn.hutool.core.util.StrUtil; import com.alibaba.fastjson.JSONObject; -import com.cool.store.constants.CommonConstants; import com.cool.store.context.CurrentUserHolder; +import com.cool.store.dao.store.StoreBusinessReportDAO; import com.cool.store.dto.StoreNameDTO; import com.cool.store.dao.store.StoreMasterSignerInfoDAO; import com.cool.store.dto.store.*; @@ -16,8 +17,10 @@ import com.cool.store.dao.SysRoleDao; import com.cool.store.dto.StoreDTO; import com.cool.store.dto.UserSimpleDTO; import com.cool.store.entity.*; +import com.cool.store.entity.store.StoreBusinessReportDO; import com.cool.store.entity.store.StoreMasterSignerInfoDO; import com.cool.store.enums.*; +import com.cool.store.enums.master.BrandTypeEnum; import com.cool.store.exception.ServiceException; import com.cool.store.mapper.*; import com.cool.store.request.store.StoreListRequest; @@ -29,8 +32,6 @@ import com.cool.store.utils.GeoMapUtil; import com.cool.store.utils.poi.constant.Constants; import com.cool.store.vo.SysRoleVO; import com.cool.store.vo.store.StoreListVO; -import com.fasterxml.jackson.core.type.TypeReference; -import com.fasterxml.jackson.databind.ObjectMapper; import com.github.pagehelper.PageHelper; import com.github.pagehelper.PageInfo; import com.google.common.collect.Lists; @@ -81,6 +82,8 @@ public class StoreServiceImpl implements StoreService { StoreMasterSignerInfoDAO storeMasterSignerInfoDAO; @Resource EnterpriseUserRoleMapper enterpriseUserRoleMapper; + @Resource + StoreBusinessReportDAO storeBusinessReportDAO; @Override public PageInfo getStoreExtendFieldInfo(Integer pageSize, Integer pageNum, Boolean queryOperations) { @@ -398,6 +401,44 @@ public class StoreServiceImpl implements StoreService { return result; } + @Override + public void saveStoreReport(String date) { + List reportList = new ArrayList<>(); + List joinList = Arrays.asList(BrandTypeEnum.JP.getCode(), BrandTypeEnum.ZSJ.getCode(), BrandTypeEnum.MX.getCode()); + reportList.addAll(storeReportStatistics(date, joinList, null)); + // 处理正新鸡排境内境外 + reportList.addAll(storeReportStatistics(date, Collections.singletonList(BrandTypeEnum.JP.getCode()), 1)); + reportList.addAll(storeReportStatistics(date, Collections.singletonList(BrandTypeEnum.JP.getCode()), 2)); + + if (CollectionUtils.isNotEmpty(reportList)) { + storeBusinessReportDAO.insertOrUpdateBatch(reportList); + } + } + + private List storeReportStatistics(String date, List joinList, Integer domestic) { + Map totalMap = storeDao.totalOpenStoreReport(date, domestic, joinList); + Map periodBeginMap = storeDao.periodBeginStoreReport(date, domestic, joinList); + Map newMap = storeDao.newOpenStoreReport(date, domestic, joinList); + Map closeMap = storeDao.closeStoreReport(date, domestic, joinList); + List reportList = new ArrayList<>(); + for (Integer joinBrand : joinList) { + Integer periodBeginNum = periodBeginMap.getOrDefault(joinBrand, 0); + Integer newOpenNum = newMap.getOrDefault(joinBrand, 0); + Integer closeNum = closeMap.getOrDefault(joinBrand, 0); + StoreBusinessReportDO report = new StoreBusinessReportDO(); + report.setJoinBrand(joinBrand); + report.setDomestic(Objects.nonNull(domestic) ? domestic : 0); + report.setDate(date); + report.setOpenTotalNum(totalMap.getOrDefault(joinBrand, 0)); + report.setPeriodBeginNum(periodBeginNum); + report.setNewOpenNum(newOpenNum); + report.setCloseNum(closeNum); + report.setPeriodEndNum(periodBeginNum + newOpenNum - closeNum); + reportList.add(report); + } + return reportList; + } + @Override public List authStoreUser(List storeIdList, String positionType) { diff --git a/coolstore-partner-service/src/main/java/com/cool/store/service/impl/ThirdFoodServiceImpl.java b/coolstore-partner-service/src/main/java/com/cool/store/service/impl/ThirdFoodServiceImpl.java index 9ba93e782..ff60fa8b4 100644 --- a/coolstore-partner-service/src/main/java/com/cool/store/service/impl/ThirdFoodServiceImpl.java +++ b/coolstore-partner-service/src/main/java/com/cool/store/service/impl/ThirdFoodServiceImpl.java @@ -8,6 +8,10 @@ import com.cool.store.dto.recipe.RecipeSpLaunchDTO; import com.cool.store.dto.recipe.RevenueDataDTO; import com.cool.store.dto.recipe.RevenueDataQueryDTO; import com.cool.store.dto.recipe.SalesVolumeDayQueryDTO; +import com.cool.store.dto.GetAccessTokenDTO; +import com.cool.store.dto.food.DishesDTO; +import com.cool.store.dto.store.StoreUserPositionDTO; +import com.cool.store.dto.recipe.SalesVolumeDayQueryDTO; import com.cool.store.dto.store.StoreUserUpdateDTO; import com.cool.store.entity.StoreDO; import com.cool.store.enums.ErrorCodeEnum; @@ -28,7 +32,9 @@ import okhttp3.OkHttpClient; import okhttp3.Request; import okhttp3.RequestBody; import okhttp3.Response; +import org.apache.poi.ss.formula.functions.T; import org.springframework.beans.factory.annotation.Value; +import org.springframework.core.ParameterizedTypeReference; import org.springframework.stereotype.Service; import javax.annotation.Resource; @@ -64,6 +70,22 @@ public class ThirdFoodServiceImpl implements ThirdFoodService { return executeApiCall(url, dto, String.class); } + @Override + public List getPurchasedDishesList(FoodTokenDTO dto) { + String url = "/v1/recipe/getPurchasedRecipeList"; + ParameterizedTypeReference>> responseType = + new ParameterizedTypeReference>>() {}; + return listByExecuteApiCall(url, dto, responseType).getData(); + } + + @Override + public List getMyDesignDishesList(FoodTokenDTO dto) { + String url = "/v1/recipe/getRecipeList"; + ParameterizedTypeReference>> responseType = + new ParameterizedTypeReference>>() {}; + return listByExecuteApiCall(url, dto, responseType).getData(); + } + @Override public StoreUserResponse pushStoreUser(List dto) { String url = "/v1/store/updateStoreUser"; @@ -105,6 +127,45 @@ public class ThirdFoodServiceImpl implements ThirdFoodService { return BeanUtil.toList(list, RevenueDataVO.class, CopyOptions.create().setFieldMapping(Collections.singletonMap("storeCode", "storeNum"))); } + private T listByExecuteApiCall(String url, Object requestBody, ParameterizedTypeReference responseType) { + // 1. 打印请求前日志 + //logRequest(url, requestBody); + try { + Request request = buildRequest(requestBody, url); + + 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().constructType(responseType.getType()); + + OpportunityApiResponse apiResponse = objectMapper.readValue(responseBody, javaType); + + if (apiResponse.getCode() != 200) { + throw new ServiceException(ErrorCodeEnum.THIRD_API_ERROR, apiResponse.getMsg()); + } + return objectMapper.readValue(responseBody, javaType); + } + } 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 T executeApiCall(String url, Object requestBody, Class responseType) { // 1. 打印请求前日志 //logRequest(url, requestBody); diff --git a/coolstore-partner-service/src/main/java/com/cool/store/service/impl/ThirdLiePinServiceImpl.java b/coolstore-partner-service/src/main/java/com/cool/store/service/impl/ThirdLiePinServiceImpl.java new file mode 100644 index 000000000..3ff1b0de1 --- /dev/null +++ b/coolstore-partner-service/src/main/java/com/cool/store/service/impl/ThirdLiePinServiceImpl.java @@ -0,0 +1,191 @@ +package com.cool.store.service.impl; + + +import cn.hutool.core.thread.ThreadUtil; +import cn.hutool.core.util.StrUtil; +import cn.hutool.core.util.URLUtil; +import cn.hutool.http.HttpRequest; +import cn.hutool.http.HttpResponse; +import cn.hutool.http.HttpUtil; +import cn.hutool.json.JSONUtil; +import com.cool.store.constants.RedisConstant; +import com.cool.store.enums.ErrorCodeEnum; +import com.cool.store.exception.ServiceException; +import com.cool.store.request.liepin.*; +import com.cool.store.response.liepin.*; +import com.cool.store.service.ThirdLiePinService; +import com.cool.store.service.XbbApiCaller; +import com.cool.store.utils.*; +import com.fasterxml.jackson.databind.ObjectMapper; +import lombok.extern.slf4j.Slf4j; +import okhttp3.OkHttpClient; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.beans.factory.annotation.Value; +import org.springframework.stereotype.Service; + +import javax.annotation.PostConstruct; +import javax.annotation.Resource; +import java.util.HashMap; +import java.util.Map; +import java.util.concurrent.TimeUnit; +import java.util.concurrent.locks.Lock; +import java.util.concurrent.locks.ReentrantLock; + +/** + * @Author suzhuhong + * @Date 2025/5/20 15:33 + * @Version 1.0 + */ +@Service +@Slf4j +public class ThirdLiePinServiceImpl implements ThirdLiePinService { + + private XbbApiCaller xbbApiCaller; + + private GetAccessTokenRequest getAccessTokenRequest; + + private final Lock lock = new ReentrantLock(); + + @Value("${liePin.appId}") + private String appId; + @Value("${liePin.secretKey}") + private String secretKey; + @Value("${liePin.aesSecretKey}") + private String aesSecretKey; + @Value("${liePin.baseUrl}") + private String liePinBaseUrl; + @Value("${liePin.tenantId}") + private Long tenantId; + @Value("${liePin.mobile}") + private String mobile; + + @Resource + OkHttpClient okHttpClient; + + @Resource + ObjectMapper objectMapper; + + @Autowired + private RedisUtilPool redisUtilPool; + @Resource + private RedisConstantUtil redisConstantUtil; + + + @PostConstruct + public void init() { + this.xbbApiCaller = new XbbApiCaller(liePinBaseUrl, appId, secretKey, aesSecretKey,objectMapper); + this.getAccessTokenRequest = new GetAccessTokenRequest(tenantId,mobile); + } + + @Override + public String getAccessToken(GetAccessTokenRequest request) { + String key = redisConstantUtil.getKeyCommonMethod(RedisConstant.ACCESS_TOKEN_CACHE_PREFIX, String.valueOf(request.getTenant_id()), request.getMobile()); + String accessToken = redisUtilPool.getString(key); + if (StringUtil.isNotEmpty(accessToken)){ + return accessToken; + } + String url = "/open_api/v2/super/b_applet/access_token"; + XbbPostRequest xbbPostRequest = XbbPostRequest.newBuilder().uri(url).jsonString(JSONUtil.toJsonStr(request)).build(); + XbbResponse response = xbbApiCaller.post(xbbPostRequest, LiePinTokenInfo.class,getToken()); + accessToken = response.getData().getAccess_token(); + redisUtilPool.setString(key,accessToken,RedisConstant.ONE_DAY_SECONDS*7); + return accessToken; + } + + @Override + public Long addStoreToLiePin(AddStoreRequest addStoreRequest) { + String accessToken = getAccessToken(getAccessTokenRequest); + Map queryString = new HashMap<>(); + queryString.put("access_token",accessToken); + String url = "/open_api/v2/super/b_applet/store"; + XbbPostRequest xbbPostRequest = XbbPostRequest.newBuilder().uri(url).queryParam(queryString).jsonString(JSONUtil.toJsonStr(addStoreRequest)).build(); + XbbResponse storeInfoResponse = xbbApiCaller.post(xbbPostRequest, StoreInfoResponse.class,getToken()); + return storeInfoResponse.getData().getStore_id(); + } + + @Override + public Long addStoreEmp(AddStoreEmpRequest addStoreEmpRequest) { + String accessToken = getAccessToken(getAccessTokenRequest); + Map queryString = new HashMap<>(); + queryString.put("access_token",accessToken); + String url = "/open_api/v2/super/b_applet/store/account"; + XbbPostRequest xbbPostRequest = XbbPostRequest.newBuilder().uri(url).queryParam(queryString).jsonString(JSONUtil.toJsonStr(addStoreEmpRequest)).build(); + XbbResponse empInfoResponseXbbResponse = xbbApiCaller.post(xbbPostRequest, StoreEmpInfoResponse.class,getToken()); + return empInfoResponseXbbResponse.getData().getAccount_id(); + } + + @Override + public PathResponse getPath(GetPathRequest getPathRequest) { + String accessToken = getAccessToken(getAccessTokenRequest); + Map queryString = new HashMap<>(); + queryString.put("access_token",accessToken); + String url = "/open_api/v2/super/b_applet/jump_url"; + XbbPostRequest xbbPostRequest = XbbPostRequest.newBuilder().uri(url).queryParam(queryString).jsonString(JSONUtil.toJsonStr(getPathRequest)).build(); + XbbResponse jumpUrl = xbbApiCaller.post(xbbPostRequest, PathResponse.class,getToken()); + return jumpUrl.getData(); + } + + @Override + public String getFilePath(String ossUrl) { + String accessToken = getAccessToken(getAccessTokenRequest); + Map queryString = new HashMap<>(); + queryString.put("access_token",accessToken); + String url = "/open_api/v2/super/common/upload"; + UploadRequest uploadRequest = new UploadRequest(OssUtil.getUrlName(ossUrl), OssUtil.convertPublicOssUrlToBase64(ossUrl)); + XbbPostRequest xbbPostRequest = XbbPostRequest.newBuilder().uri(url).queryParam(queryString).jsonString(JSONUtil.toJsonStr(uploadRequest)).build(); + XbbResponse file = xbbApiCaller.post(xbbPostRequest, FileResponse.class,getToken()); + return file.getData().getFile_id(); + } + + + /** + * 接口授权token + * @return + */ + public String getToken() { + String key = redisConstantUtil.getKeyCommonMethod(RedisConstant.TOKEN_CACHE_PREFIX, appId,secretKey); + String accessToken = redisUtilPool.getString(key); + if (StringUtil.isNotEmpty(accessToken)){ + return accessToken; + } + try { + if (!lock.tryLock(10, TimeUnit.SECONDS)) { + throw new ServiceException("获取token失败"); + } + } catch (InterruptedException e) { + throw new ServiceException("获取token失败"); + } + try { + Exception error = null; + for (int i = 0; i < 3; i++) { + try { + String urlTemplate = "{}/open_api/access_token?app_id={}&secret_key={}"; + String url = StrUtil.format(urlTemplate, liePinBaseUrl, appId, URLUtil.encode(secretKey)); + // 创建POST请求并设置请求头 + HttpRequest request = HttpUtil.createPost(url).header("Content-Type", "application/json"); + String responseBody; + try (HttpResponse httpResponse = request.execute()) { + responseBody = httpResponse.body(); + } + // 解析JSON响应 + TokenResponse tokenResponse = JSONUtil.toBean(responseBody, TokenResponse.class); + if (!tokenResponse.isSuccess()) { + throw new ServiceException(ErrorCodeEnum.THIRD_API_ERROR,tokenResponse.getMsg()); + } + // 获取缓存的时间 提前半小时过期 重新获取 + Long expire = ((tokenResponse.getData().getExpire() - System.currentTimeMillis())/1000)-1800; + redisUtilPool.setString(key,tokenResponse.getData().getToken(),expire.intValue()); + return tokenResponse.getData().getToken(); + } catch (Exception e) { + log.error("第{}次获取token error:{}",i+1,error.getMessage()); + ThreadUtil.sleep(2, TimeUnit.SECONDS); + } + } + throw new ServiceException("获取token失败"); + } finally { + lock.unlock(); + } + } + + +} diff --git a/coolstore-partner-service/src/main/java/com/cool/store/service/impl/ThirdOpportunityServiceImpl.java b/coolstore-partner-service/src/main/java/com/cool/store/service/impl/ThirdOpportunityServiceImpl.java index 09ed1a3d7..3a2fab0c5 100644 --- a/coolstore-partner-service/src/main/java/com/cool/store/service/impl/ThirdOpportunityServiceImpl.java +++ b/coolstore-partner-service/src/main/java/com/cool/store/service/impl/ThirdOpportunityServiceImpl.java @@ -6,6 +6,7 @@ import com.cool.store.exception.ServiceException; import com.cool.store.request.oppty.*; import com.cool.store.response.oppty.*; import com.cool.store.service.ThirdOpportunityService; +import com.cool.store.utils.CommonContextUtil; import com.cool.store.utils.JsonUtils; import com.cool.store.utils.SignatureUtils; import com.fasterxml.jackson.core.JsonProcessingException; @@ -79,8 +80,8 @@ public class ThirdOpportunityServiceImpl implements ThirdOpportunityService { @Override public String berthOperation(BerthOperationRequest requestBody) { String url = apiUrl+"open/oppty/v1/addBerthInfo"; - return executeApiCall(url, requestBody, String.class); - + String profileName = CommonContextUtil.getProfileName(); + return "online".equals(profileName) ? executeApiCall(url, requestBody, String.class) : null; } @Override diff --git a/coolstore-partner-service/src/main/java/com/cool/store/service/impl/UserAuthMappingServiceImpl.java b/coolstore-partner-service/src/main/java/com/cool/store/service/impl/UserAuthMappingServiceImpl.java index 1068c3b65..5e714b826 100644 --- a/coolstore-partner-service/src/main/java/com/cool/store/service/impl/UserAuthMappingServiceImpl.java +++ b/coolstore-partner-service/src/main/java/com/cool/store/service/impl/UserAuthMappingServiceImpl.java @@ -6,7 +6,10 @@ import com.cool.store.constants.CommonConstants; import com.cool.store.context.CurrentUserHolder; import com.cool.store.context.LoginUserInfo; import com.cool.store.dao.*; +import com.cool.store.dto.BigRegionUserDTO; +import com.cool.store.dto.BigRegionUserListDTO; import com.cool.store.dto.UserDTO; +import com.cool.store.dto.region.BigRegionDTO; import com.cool.store.entity.*; import com.cool.store.enums.*; import com.cool.store.exception.ServiceException; @@ -14,6 +17,7 @@ import com.cool.store.mapper.RegionMapper; import com.cool.store.mapper.SysRoleMapper; import com.cool.store.mapper.UserAuthMappingMapper; import com.cool.store.request.SysRoleRequest; +import com.cool.store.response.bigdata.ApiResponse; import com.cool.store.service.UserAuthMappingService; import com.cool.store.utils.RedisConstantUtil; import com.cool.store.utils.RedisUtilPool; @@ -78,8 +82,11 @@ public class UserAuthMappingServiceImpl implements UserAuthMappingService { private EnterpriseUserRoleDao enterpriseUserRoleDao; @Autowired private RegionDao regionDao; - @Autowired - private BigRegionDAO bigRegionDAO; + @Resource + BigRegionDAO bigRegionDAO; + + @Resource + StoreDao storeDao; @Override @@ -228,22 +235,22 @@ public class UserAuthMappingServiceImpl implements UserAuthMappingService { // 查找有区域权限的人 List authRegionUserIdList = authWarRegionUser(regionId); if (CollectionUtils.isEmpty(authRegionUserIdList)) { - return null; + return Lists.newArrayList(); } Long roleId = userRoleEnum.getCode(); List hasRoleUserIdList = sysRoleMapper.getPositionUserIds(Collections.singletonList(String.valueOf(roleId))); if (CollectionUtils.isEmpty(hasRoleUserIdList)) { - return null; + return Lists.newArrayList(); } authRegionUserIdList.retainAll(hasRoleUserIdList); if (CollectionUtils.isEmpty(authRegionUserIdList)) { - return null; + return Lists.newArrayList(); } if (CollectionUtils.isNotEmpty(authRegionUserIdList)) { List userInfoByUserIds = enterpriseUserDAO.getUserInfoByUserIds(authRegionUserIdList); return userInfoByUserIds; } - return null; + return Lists.newArrayList(); } @Override @@ -266,12 +273,12 @@ public class UserAuthMappingServiceImpl implements UserAuthMappingService { // 查找有区域权限的人 List authRegionUserIdList = authWarRegionUser(regionId); if (CollectionUtils.isEmpty(authRegionUserIdList)) { - return null; + return Lists.newArrayList(); } Long roleId = userRoleEnum.getCode(); List hasRoleUserIdList = sysRoleMapper.getPositionUserIds(Collections.singletonList(String.valueOf(roleId))); if (CollectionUtils.isEmpty(hasRoleUserIdList)) { - return null; + return Lists.newArrayList(); } authRegionUserIdList.retainAll(hasRoleUserIdList); if (CollectionUtils.isEmpty(authRegionUserIdList)) { @@ -536,6 +543,42 @@ public class UserAuthMappingServiceImpl implements UserAuthMappingService { return new ArrayList<>(); } + @Override + public ApiResponse> getAllBigRegionSpecialRoleUserList(String storeCode, UserRoleEnum userRoleEnum) { + StoreDO store = storeDao.getByStoreNum(storeCode); + if (Objects.isNull(store)){ + return ApiResponse.error(ErrorCodeEnum.STORE_NUM_NOT_FOUND); + } + //如果没有大区 则返回空 + if (store.getBranch()==null){ + return ApiResponse.success( null); + } + //查询所有启用的大区 + List bigRegionByUserId = userAuthMappingMapper.getBigRegionByUserId(Arrays.asList(store.getBranch()), userRoleEnum.getDesc()); + //根据区域ID对bigRegionByUserId人员进行分组 + Map> bigRegionByRegionId = bigRegionByUserId.stream().collect(Collectors.groupingBy(BigRegionUserDTO::getRegionId)); + //转为对象BigRegionUserListDTO + List result = bigRegionByRegionId.entrySet().stream().map(entry -> { + BigRegionUserListDTO dto = new BigRegionUserListDTO(); + dto.setRegionId(entry.getKey()); + // 获取对应区域的大区信息 + if (CollectionUtils.isNotEmpty(entry.getValue())){ + BigRegionUserDTO regionDTO = entry.getValue().get(0); + dto.setRegionName(regionDTO.getRegionName()); + } + // 将 BigRegionUserDTO 转换为 UserDTO + List userDTOList = entry.getValue().stream().map(bigRegionUser -> { + UserDTO userDTO = new UserDTO(); + userDTO.setName(bigRegionUser.getName()); + userDTO.setMobile(bigRegionUser.getMobile()); + return userDTO; + }).collect(Collectors.toList()); + dto.setSpecialRoleUserList(userDTOList); + return dto; + }).collect(Collectors.toList()); + return ApiResponse.success(result); + } + private List extractNumbers(String regionPath) { List regionIds = new ArrayList<>(); Pattern pattern = Pattern.compile("\\d+"); diff --git a/coolstore-partner-service/src/main/java/com/cool/store/service/impl/WechatMiniAppServiceImpl.java b/coolstore-partner-service/src/main/java/com/cool/store/service/impl/WechatMiniAppServiceImpl.java index bf6ddb727..b26eee866 100644 --- a/coolstore-partner-service/src/main/java/com/cool/store/service/impl/WechatMiniAppServiceImpl.java +++ b/coolstore-partner-service/src/main/java/com/cool/store/service/impl/WechatMiniAppServiceImpl.java @@ -10,6 +10,7 @@ import com.cool.store.enums.*; import com.cool.store.exception.ServiceException; import com.cool.store.http.WechatRest; import com.cool.store.mapper.HyPartnerUserChannelMapper; +import com.cool.store.oss.OssClientService; import com.cool.store.request.MobileUpdateRequest; import com.cool.store.service.WechatMiniAppService; import com.cool.store.utils.RedisUtilPool; @@ -24,10 +25,13 @@ import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; import javax.annotation.Resource; +import java.io.ByteArrayInputStream; import java.text.MessageFormat; import java.util.Date; import java.util.Objects; +import static com.cool.store.utils.easyExcel.EasyExcelUtil.getUploadPath; + /** * @author zhangchenbiao * @FileName: WechatMiniAppServiceImpl @@ -52,6 +56,8 @@ public class WechatMiniAppServiceImpl implements WechatMiniAppService { HyOpenAreaInfoDAO hyOpenAreaInfoDAO; @Resource PartnerUserWechatBindDAO partnerUserWechatBindDAO; + @Resource + private OssClientService ossClientService; @Value("${weixin.appId}") private String wxAppId; @Value("${weixin.appSecret}") @@ -62,6 +68,8 @@ public class WechatMiniAppServiceImpl implements WechatMiniAppService { private Integer exhibition; @Value("${recommended.channel.id}") private Integer recommended; + @Value("${mybatis.configuration.variables.enterpriseId}") + private String eid; @Override public PartnerUserInfoVO miniProgramLogin(MiniProgramLoginDTO param) { @@ -286,4 +294,42 @@ public class WechatMiniAppServiceImpl implements WechatMiniAppService { return null; } + private String delCacheAndGetAccessToken() { + String cacheAccessToken = "wechat_mini_" + wxAppId; + redisUtilPool.delKey(cacheAccessToken); + return wechatRest.getAccessToken(wxAppId, wxAppSecret); + } + + @Override + public String createQrCode(String page, String scene, String width) { + String accessToken = wechatRest.getAccessToken(wxAppId, wxAppSecret); + if (StringUtils.isBlank(accessToken)) { + log.error("token获取失败"); + return null; + } + byte[] qrCode = null; + try { + qrCode = wechatRest.createQrCode(accessToken, page, scene, width); + } catch (ServiceException e) { + if (ErrorCodeEnum.WX_ACCESS_TOKEN_INVALID.getCode() == e.getErrorCode()) { + accessToken = delCacheAndGetAccessToken(); + qrCode = wechatRest.createQrCode(accessToken, page, scene, width); + } + } + if (qrCode == null || qrCode.length == 0) { + return null; + } + try { + // 生成唯一文件名 + String fileName = getUploadPath(eid) + "qrcode" + UUIDUtils.get32UUID() + ".png"; + ByteArrayInputStream inputStream = new ByteArrayInputStream(qrCode); + String url = ossClientService.putObject(fileName, inputStream, (long) qrCode.length, "image/png"); + log.info("二维码上传OSS成功,url:{}", url); + return url; + } catch (Exception e) { + log.error("二维码上传OSS失败", e); + } + return null; + } + } diff --git a/coolstore-partner-service/src/main/java/com/cool/store/service/impl/WithdrawApplicationServiceImpl.java b/coolstore-partner-service/src/main/java/com/cool/store/service/impl/WithdrawApplicationServiceImpl.java index e6f7b9b27..2e9fb27ba 100644 --- a/coolstore-partner-service/src/main/java/com/cool/store/service/impl/WithdrawApplicationServiceImpl.java +++ b/coolstore-partner-service/src/main/java/com/cool/store/service/impl/WithdrawApplicationServiceImpl.java @@ -5,11 +5,13 @@ import com.cool.store.constants.RedisConstant; import com.cool.store.context.CurrentUserHolder; import com.cool.store.context.LoginUserInfo; import com.cool.store.dao.EnterpriseUserDAO; +import com.cool.store.dao.StoreDao; import com.cool.store.dao.WithdrawApplicationDAO; import com.cool.store.dao.wallet.WalletTradeDAO; import com.cool.store.dto.wallet.AccountWithdrawerDTO; import com.cool.store.dto.wallet.TradeRecordDTO; import com.cool.store.dto.wallet.WithdrawApplicationDTO; +import com.cool.store.entity.StoreDO; import com.cool.store.entity.WithdrawApplicationDO; import com.cool.store.entity.wallet.WalletTradeDO; import com.cool.store.enums.ErrorCodeEnum; @@ -28,6 +30,7 @@ import com.cool.store.utils.RedisUtil; import com.github.pagehelper.PageHelper; import com.github.pagehelper.PageInfo; import lombok.extern.slf4j.Slf4j; +import org.apache.commons.collections4.CollectionUtils; import org.apache.commons.lang3.StringUtils; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; @@ -35,12 +38,14 @@ import org.springframework.transaction.annotation.Transactional; import javax.annotation.Resource; import java.math.BigDecimal; import java.text.MessageFormat; +import java.util.Date; +import java.util.List; +import java.util.Objects; import java.util.*; import java.util.concurrent.TimeUnit; import java.util.stream.Collectors; import java.util.stream.Stream; -import static com.cool.store.enums.wallet.WalletTradeModuleEnum.STANDARD_STORE; import static com.cool.store.enums.wallet.WalletTradeModuleEnum.TRANSFER; /** @@ -65,6 +70,9 @@ public class WithdrawApplicationServiceImpl implements WithdrawApplicationServic @Resource EnterpriseUserDAO enterpriseUserDAO; + @Resource + StoreDao storeDao; + private static final String WITHDRAW_ORDER_PREFIX = "TX"; @Override @@ -77,8 +85,19 @@ public class WithdrawApplicationServiceImpl implements WithdrawApplicationServic .filter(StringUtils::isNotBlank) .collect(Collectors.toSet()); Map userNameMap = enterpriseUserDAO.getUserNameMap(new ArrayList<>(userIdList)); + + // 获取门店ID列表并查询门店名称 + Set storeIdList = responses.stream() + .filter(x -> StringUtils.isNotBlank(x.getRelateStoreId())) + .map(WithdrawApplicationDTO::getRelateStoreId) + .collect(Collectors.toSet()); + Map storeNameMap = storeDao.getStoreMapByStoreIds(new ArrayList<>(storeIdList)); responses.stream().forEach(x->{ x.setCreateUserName(userNameMap.get(x.getCreateUserId())); + StoreDO storeDO = storeNameMap.get(x.getRelateStoreId()); + if (storeDO!=null){ + x.setRelateStoreName(storeDO.getStoreName()); + } }); return new PageInfo<>(responses); } @@ -96,6 +115,8 @@ public class WithdrawApplicationServiceImpl implements WithdrawApplicationServic .amount(request.getAmount()) .bankCardNo(request.getBankCardNo()) .bankName(request.getBankName()) + .relateStoreId(request.getRelateStoreId()) + .remark(request.getRemark()) .status(AllocationPayStatusEnum.UNPAID.getStatus()) .createUserId(userId) .createTime(new Date()) diff --git a/coolstore-partner-service/src/main/java/com/cool/store/service/renewal/RenewalApplicationService.java b/coolstore-partner-service/src/main/java/com/cool/store/service/renewal/RenewalApplicationService.java new file mode 100644 index 000000000..d8b05518c --- /dev/null +++ b/coolstore-partner-service/src/main/java/com/cool/store/service/renewal/RenewalApplicationService.java @@ -0,0 +1,29 @@ +package com.cool.store.service.renewal; + +import com.cool.store.request.renewal.RenewalApplicationCreateRequest; +import com.cool.store.request.renewal.RenewalApplicationQueryRequest; +import com.cool.store.request.renewal.RenewalApprovalRequest; +import com.cool.store.request.renewal.RenewalFranchiseeConfirmRequest; +import com.cool.store.vo.PartnerUserInfoVO; +import com.cool.store.vo.renewal.RenewalApplicationDetailVO; +import com.cool.store.vo.renewal.RenewalApplicationListVO; +import com.github.pagehelper.PageInfo; + +public interface RenewalApplicationService { + + PageInfo queryRenewalApplicationList(RenewalApplicationQueryRequest request); + + RenewalApplicationDetailVO getRenewalApplicationDetail(Long renewalId); + + Boolean createRenewalApplication(RenewalApplicationCreateRequest request); + + Boolean franchiseeConfirm(RenewalFranchiseeConfirmRequest request, PartnerUserInfoVO user); + + Boolean operationsConsultantApproval(RenewalApprovalRequest request); + + Boolean regionalConsultantApproval(RenewalApprovalRequest request); + + Boolean groupEngineeringApproval(RenewalApprovalRequest request); + + void autoGenerateRenewalApplications(); +} diff --git a/coolstore-partner-service/src/main/java/com/cool/store/service/renewal/impl/RenewalApplicationServiceImpl.java b/coolstore-partner-service/src/main/java/com/cool/store/service/renewal/impl/RenewalApplicationServiceImpl.java new file mode 100644 index 000000000..4c7b58612 --- /dev/null +++ b/coolstore-partner-service/src/main/java/com/cool/store/service/renewal/impl/RenewalApplicationServiceImpl.java @@ -0,0 +1,557 @@ +package com.cool.store.service.renewal.impl; + +import cn.hutool.core.collection.CollStreamUtil; +import com.cool.store.context.CurrentUserHolder; +import com.cool.store.context.LoginUserInfo; +import com.cool.store.dao.EnterpriseUserDAO; +import com.cool.store.dao.RegionDao; +import com.cool.store.dao.StoreDao; +import com.cool.store.dao.contract.ContractMasterDAO; +import com.cool.store.dao.renewal.RenewalApplicationDAO; +import com.cool.store.dao.renewal.RenewalRenovateApprovalDAO; +import com.cool.store.dao.renewal.RenewalApplicationSignerInfoDAO; +import com.cool.store.dao.store.StoreMasterSignerInfoDAO; +import com.cool.store.entity.EnterpriseUserDO; +import com.cool.store.entity.RegionDO; +import com.cool.store.entity.StoreDO; +import com.cool.store.entity.approval.CommonApprovalLogDO; +import com.cool.store.entity.contract.ContractMasterDO; +import com.cool.store.entity.renewal.RenewalApplicationDO; +import com.cool.store.entity.renewal.RenewalApplicationSignerInfoDO; +import com.cool.store.entity.renewal.RenewalRenovateApprovalDO; +import com.cool.store.entity.store.StoreMasterSignerInfoDO; +import com.cool.store.enums.ErrorCodeEnum; +import com.cool.store.enums.UserRoleEnum; +import com.cool.store.enums.approval.ApprovalResultEnum; +import com.cool.store.enums.master.BrandTypeEnum; +import com.cool.store.enums.renewal.RenewalNodeEnum; +import com.cool.store.enums.renewal.RenewalStatusEnum; +import com.cool.store.exception.ServiceException; +import com.cool.store.request.renewal.RenewalApplicationCreateRequest; +import com.cool.store.request.renewal.RenewalApplicationQueryRequest; +import com.cool.store.request.renewal.RenewalApprovalRequest; +import com.cool.store.request.renewal.RenewalFranchiseeConfirmRequest; +import com.cool.store.service.UserAuthMappingService; +import com.cool.store.service.approval.CommonApprovalLogService; +import com.cool.store.service.renewal.RenewalApplicationService; +import com.cool.store.utils.BeanUtil; +import com.cool.store.utils.GenerateNoUtil; +import com.cool.store.utils.poi.StringUtils; +import com.cool.store.vo.PartnerUserInfoVO; +import com.cool.store.vo.approval.ApprovalGroupedVO; +import com.cool.store.vo.renewal.ContractRelatedInfoVO; +import com.cool.store.vo.renewal.RenewalApplicationDetailVO; +import com.cool.store.vo.renewal.RenewalApplicationListVO; +import com.cool.store.vo.renewal.RenewalRenovateApprovalVO; +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; +import java.util.stream.Stream; + +import static javassist.CtClass.version; + +@Service +@RequiredArgsConstructor +@Slf4j +public class RenewalApplicationServiceImpl implements RenewalApplicationService { + + private final RenewalApplicationDAO renewalApplicationDAO; + private final ContractMasterDAO contractMasterDAO; + private final StoreDao storeDao; + private final RegionDao regionDao; + private final EnterpriseUserDAO enterpriseUserDAO; + private final CommonApprovalLogService commonApprovalLogService; + private final UserAuthMappingService userAuthMappingService; + private final RenewalRenovateApprovalDAO renewalRenovateApprovalDAO; + private final StoreMasterSignerInfoDAO storeMasterSignerInfoDAO; + private final RenewalApplicationSignerInfoDAO renewalApplicationSignerInfoDAO; + private final com.cool.store.dao.approval.CommonApprovalLogDAO commonApprovalLogDAO; + + + @Override + public PageInfo queryRenewalApplicationList(RenewalApplicationQueryRequest request) { + if (request.getKeyword() != null && !request.getKeyword().isEmpty()) { + request.setQueryStore(true); + } + List regionIds = null; + if (request.getRegionId() != null) { + regionIds = Collections.singletonList(String.valueOf(request.getRegionId())); + } + PageHelper.startPage(request.getPageNum(), request.getPageSize()); + List list = renewalApplicationDAO.queryRenewalApplicationList(request, regionIds); + PageInfo pageInfo = new PageInfo<>(list); + + // 填充状态名称 + list.forEach(vo -> vo.setStatusName(RenewalStatusEnum.getNameByStatus(vo.getStatus()))); + + // 批量查询签约人信息并填充 + if (CollectionUtils.isNotEmpty(list)) { + List applicationNos = list.stream().map(RenewalApplicationListVO::getApplicationNo).collect(Collectors.toList()); + Map signerMap = renewalApplicationSignerInfoDAO.getByApplicationNos(applicationNos); + List storeCodeList = list.stream().map(RenewalApplicationListVO::getStoreCode).collect(Collectors.toList()); + List storeList = storeDao.getStoreNumByStoreCodes(storeCodeList); + Map map = CollStreamUtil.toMap(storeList, StoreDO::getStoreNum, v -> v); + List regionIdList = storeList.stream() + .flatMap(store -> Stream.of(store.getRegionId(), store.getBranch())) + .filter(Objects::nonNull) + .distinct() + .collect(Collectors.toList()); + Map regionNameMap = regionDao.getRegionNameMap(regionIdList); + List userIds = storeList.stream().map(StoreDO::getJoinSupervision).collect(Collectors.toList()); + Map userNameMap = enterpriseUserDAO.getUserNameMap(userIds); + list.forEach(vo -> { + RenewalApplicationSignerInfoDO signer = signerMap.get(vo.getApplicationNo()); + if (signer != null) { + vo.setSigner1Name(signer.getSigner1Name()); + vo.setSigner1Mobile(signer.getSigner1Mobile()); + vo.setSigner2Name(signer.getSigner2Name()); + vo.setSigner2Mobile(signer.getSigner2Mobile()); + } + StoreDO store = map.get(vo.getStoreCode()); + if (store!=null){ + vo.setStoreName(store.getStoreName()); + vo.setStoreAddress(store.getStoreAddress()); + vo.setBrandName(BrandTypeEnum.getDescByCode(store.getJoinBrand())); + if (StringUtils.isNotBlank(store.getJoinSupervision())){ + vo.setRecruitmentManager(userNameMap.get(store.getJoinSupervision())); + } + vo.setRegionName(regionNameMap.get(store.getRegionId())); + vo.setBranchName(regionNameMap.get(store.getBranch())); + } + }); + } + return pageInfo; + } + + @Override + public RenewalApplicationDetailVO getRenewalApplicationDetail(Long renewalId) { + RenewalApplicationDO renewalDO = renewalApplicationDAO.getById(renewalId); + if (renewalDO == null) { + throw new ServiceException(ErrorCodeEnum.RENEWAL_APPLY_NOT_EXIST); + } + + RenewalApplicationDetailVO detailVO = new RenewalApplicationDetailVO(); + detailVO.setRenewalId(renewalDO.getId()); + detailVO.setApplicationNo(renewalDO.getApplicationNo()); + detailVO.setStoreCode(renewalDO.getStoreCode()); + detailVO.setContractExpireDate(renewalDO.getContractExpireDate()); + detailVO.setIsRenovate(renewalDO.getIsRenovate()); + detailVO.setStatus(renewalDO.getStatus()); + detailVO.setStatusName(RenewalStatusEnum.getNameByStatus(renewalDO.getStatus())); + detailVO.setRemark(renewalDO.getRemark()); + detailVO.setOriginalContractNo(renewalDO.getOriginalContractNo()); + detailVO.setCreateUserName(renewalDO.getCreateUserName()); + detailVO.setCreatedTime(renewalDO.getCreatedTime()); + + // 查询门店信息补充 + if (renewalDO.getStoreCode() != null) { + StoreDO store = storeDao.getByStoreNum(renewalDO.getStoreCode()); + if (store != null) { + detailVO.setStoreName(store.getStoreName()); + detailVO.setStoreAddress(store.getStoreAddress()); + detailVO.setBrandName(BrandTypeEnum.getDescByCode(store.getJoinBrand())); + detailVO.setStoreStatus(store.getStoreStatus()); + if (StringUtils.isNotBlank(store.getJoinSupervision())){ + String userName = enterpriseUserDAO.getUserName(store.getJoinSupervision()); + detailVO.setRecruitmentManager(userName); + } + Map regionNameMap = regionDao.getRegionNameMap(Arrays.asList(store.getBranch(), store.getRegionId())); + detailVO.setRegionName(regionNameMap.get(store.getRegionId())); + detailVO.setBranchName(regionNameMap.get(store.getBranch())); + } + } + + // 查询关联合同信息 + if (renewalDO.getOriginalContractNo() != null) { + ContractMasterDO contractDO = contractMasterDAO.getByContractNo(renewalDO.getOriginalContractNo()); + if (contractDO != null) { + ContractRelatedInfoVO contractInfo = new ContractRelatedInfoVO(); + contractInfo.setContractNo(contractDO.getContractNo()); + contractInfo.setBrandName(contractDO.getBrandName()); + contractInfo.setSignDate(contractDO.getSignDate()); + contractInfo.setContractType(contractDO.getContractType()); + contractInfo.setStartDate(contractDO.getStartDate()); + contractInfo.setEndDate(contractDO.getEndDate()); + detailVO.setContractInfo(contractInfo); + } + } + + // 查询签约人信息快照 + RenewalApplicationSignerInfoDO signerInfo = renewalApplicationSignerInfoDAO.getByApplicationNo(renewalDO.getApplicationNo()); + if (signerInfo != null) { + detailVO.setSigner1Name(signerInfo.getSigner1Name()); + detailVO.setSigner1Mobile(signerInfo.getSigner1Mobile()); + detailVO.setSigner2Name(signerInfo.getSigner2Name()); + detailVO.setSigner2Mobile(signerInfo.getSigner2Mobile()); + } + + // 查询审批记录 + ApprovalGroupedVO approvalBatches = commonApprovalLogService.getApprovalRecordsGroupedByVersion(renewalDO.getApplicationNo()); + detailVO.setApprovalBatches(approvalBatches); + + if (detailVO.getIsRenovate()==1){ + RenewalRenovateApprovalDO byApplicationNo = renewalRenovateApprovalDAO.getByApplicationNo(renewalDO.getApplicationNo()); + RenewalRenovateApprovalVO renewalRenovateApprovalVO = new RenewalRenovateApprovalVO(); + BeanUtil.copyProperties(byApplicationNo,renewalRenovateApprovalVO); + detailVO.setRenewalRenovateApprovalVO(renewalRenovateApprovalVO); + } + + return detailVO; + } + + @Override + @Transactional + public Boolean createRenewalApplication(RenewalApplicationCreateRequest request) { + LoginUserInfo currentUser = CurrentUserHolder.getUser(); + + // 查询门店信息 + StoreDO store = storeDao.getByStoreId(request.getStoreId()); + if (store == null) { + throw new ServiceException(ErrorCodeEnum.STORE_NOT_EXIST); + } + + // 查询当前门店最新合同 + ContractMasterDO latestContract = contractMasterDAO.getLatestContractByStoreCode(store.getStoreNum()); + if (latestContract!=null&&latestContract.getRenewalCreated() != null && latestContract.getRenewalCreated() == 1) { + throw new ServiceException(ErrorCodeEnum.CURRENT_SHOP_EXIST_APPLY); + } + + // 生成申请编号 + String applicationNo = GenerateNoUtil.generateNo("XQ"); + + // 构建续签申请 + RenewalApplicationDO renewalDO = RenewalApplicationDO.builder() + .applicationNo(applicationNo) + .storeCode(store.getStoreNum()) + .isDeleted(0) + .status(RenewalStatusEnum.PENDING_FRANCHISEE.getStatus()) + .isRenovate(0) + .remark(request.getRemark()) + .createUserName(currentUser.getName()) + .createUserId(currentUser.getUserId()) + .applyTime(new Date()) + .build(); + if (latestContract!=null){ + renewalDO.setOriginalContractNo(latestContract.getContractNo()); + renewalDO.setContractExpireDate(latestContract.getEndDate()); + } + renewalApplicationDAO.insertSelective(renewalDO); + + // 更新合同续签标记 + if (latestContract!=null){ + contractMasterDAO.updateRenewalCreated(latestContract.getId(), 1); + } + + // 保存签约人信息快照 + StoreMasterSignerInfoDO signerInfo = storeMasterSignerInfoDAO.getByStoreId(store.getStoreId()); + if (signerInfo != null) { + RenewalApplicationSignerInfoDO signerSnapshot = RenewalApplicationSignerInfoDO.builder() + .applicationNo(applicationNo) + .signer1Name(signerInfo.getSigner1Name()) + .signer1Mobile(signerInfo.getSigner1Mobile()) + .signer2Name(signerInfo.getSigner2Name()) + .signer2Mobile(signerInfo.getSigner2Mobile()) + .createdTime(new Date()) + .updatedTime(new Date()) + .build(); + renewalApplicationSignerInfoDAO.insertSelective(signerSnapshot); + } + return true; + } + + @Override + @Transactional + public Boolean franchiseeConfirm(RenewalFranchiseeConfirmRequest request, PartnerUserInfoVO userInfoVO) { + RenewalApplicationDO renewalDO = renewalApplicationDAO.getById(request.getRenewalId()); + if (renewalDO == null) { + throw new ServiceException(ErrorCodeEnum.RENEWAL_APPLY_NOT_EXIST); + } + if (!RenewalStatusEnum.PENDING_FRANCHISEE.getStatus().equals(renewalDO.getStatus())) { + throw new ServiceException(ErrorCodeEnum.NOT_SUPPORT_OPERATION); + } + + if (request.getConfirmed()) { + // 确认续签 -> 待运营顾问审核 + renewalDO.setStatus(RenewalStatusEnum.PENDING_OPS.getStatus()); + renewalApplicationDAO.updateByPrimaryKeySelective(renewalDO); + + + // 写入审批记录:加盟商提交记录 + commonApprovalLogService.insertSingleRecord( + renewalDO.getApplicationNo(), userInfoVO.getPartnerId(), userInfoVO.getUsername(), + RenewalNodeEnum.FRANCHISEE_CONFIRM.getCode(), RenewalNodeEnum.FRANCHISEE_CONFIRM.getName() + ); + + // 获取区域信息 + StoreDO store = storeDao.getByStoreNum(renewalDO.getStoreCode()); + RegionDO regionDO = regionDao.getRegionByStoreId(store.getStoreId()); + + // 生成运营顾问审批节点 + List auditUserIds = getAuditUserIds(regionDO != null ? regionDO.getId() : null, UserRoleEnum.SUPERVISION); + List approveRecords = new ArrayList<>(); + for (String userId : auditUserIds) { + EnterpriseUserDO user = enterpriseUserDAO.getUserInfoById(userId); + String userName = user != null ? user.getName() : ""; + approveRecords.add(CommonApprovalLogDO.builder() + .nodeCode(RenewalNodeEnum.OPS_CONSULTANT.getCode()) + .nodeName(RenewalNodeEnum.OPS_CONSULTANT.getName()) + .handleUserId(userId) + .handleUserName(userName) + .build()); + } + if (CollectionUtils.isNotEmpty(approveRecords)) { + commonApprovalLogService.batchInsertApprovalRecords(renewalDO.getApplicationNo(), approveRecords); + } + + } else { + // 不续签 + renewalDO.setStatus(RenewalStatusEnum.NOT_RENEWED.getStatus()); + renewalApplicationDAO.updateByPrimaryKeySelective(renewalDO); + } + return true; + } + + @Override + @Transactional + public Boolean operationsConsultantApproval(RenewalApprovalRequest request) { + RenewalApplicationDO renewalDO = renewalApplicationDAO.getById(request.getRenewalId()); + if (renewalDO == null) { + throw new ServiceException(ErrorCodeEnum.RENEWAL_APPLY_NOT_EXIST); + } + if (!RenewalStatusEnum.PENDING_OPS.getStatus().equals(renewalDO.getStatus())) { + throw new ServiceException(ErrorCodeEnum.NOT_SUPPORT_OPERATION); + } + + LoginUserInfo currentUser = CurrentUserHolder.getUser(); + + if (request.getPass()) { + // 翻新信息处理 + if (request.getIsRenovate() != null && request.getIsRenovate() == 1) { + renewalDO.setIsRenovate(1); + RenewalRenovateApprovalDO renovateDO = RenewalRenovateApprovalDO.builder() + .applicationNo(renewalDO.getApplicationNo()) + .shopAreaId(request.getShopAreaId()) + .decorationAttributes(request.getDecorationAttributes()) + .decorationLevel(request.getDecorationLevel()) + .decorationRequirement(request.getDecorationRequirement()) + .specialInstruction(request.getSpecialInstruction()) + .videoUrl(request.getVideoUrl()) + .shopFrontPhotoUrl(request.getShopFrontPhotoUrl()) + .build(); + renewalRenovateApprovalDAO.insertSelective(renovateDO); + } + + // 通过 -> 待片区顾问审核 + renewalDO.setStatus(RenewalStatusEnum.PENDING_REGION.getStatus()); + renewalApplicationDAO.updateByPrimaryKeySelective(renewalDO); + + commonApprovalLogService.updateNodeApprovalStatus( + renewalDO.getApplicationNo(), + RenewalNodeEnum.OPS_CONSULTANT.getCode(), + ApprovalResultEnum.PASS.getResult(), + currentUser.getUserId(), currentUser.getName(), + request.getRemark(), true, + getRegionIdByStoreCode(renewalDO.getStoreCode()) + ); + } else { + // 拒绝 + renewalDO.setStatus(RenewalStatusEnum.REJECTED.getStatus()); + renewalApplicationDAO.updateByPrimaryKeySelective(renewalDO); + + commonApprovalLogService.updateNodeApprovalStatus( + renewalDO.getApplicationNo(), + RenewalNodeEnum.OPS_CONSULTANT.getCode(), + ApprovalResultEnum.REJECT.getResult(), + currentUser.getUserId(), currentUser.getName(), + request.getRemark(), false, null + ); + } + return true; + } + + @Override + @Transactional + public Boolean regionalConsultantApproval(RenewalApprovalRequest request) { + LoginUserInfo currentUser = CurrentUserHolder.getUser(); + RenewalApplicationDO renewalDO = renewalApplicationDAO.getById(request.getRenewalId()); + if (renewalDO == null) { + throw new ServiceException(ErrorCodeEnum.RENEWAL_APPLY_NOT_EXIST); + } + if (!RenewalStatusEnum.PENDING_REGION.getStatus().equals(renewalDO.getStatus())) { + throw new ServiceException(ErrorCodeEnum.NOT_SUPPORT_OPERATION); + } + + if (request.getPass()) { + // 通过 -> 待集团工程部审核 + renewalDO.setStatus(RenewalStatusEnum.PENDING_GROUP.getStatus()); + renewalApplicationDAO.updateByPrimaryKeySelective(renewalDO); + + commonApprovalLogService.updateNodeApprovalStatus( + renewalDO.getApplicationNo(), + RenewalNodeEnum.REGION_CONSULTANT.getCode(), + ApprovalResultEnum.PASS.getResult(), + currentUser.getUserId(), currentUser.getName(), + request.getRemark(), true, + getRegionIdByStoreCode(renewalDO.getStoreCode()) + ); + } else { + // 拒绝 + renewalDO.setStatus(RenewalStatusEnum.REJECTED.getStatus()); + renewalApplicationDAO.updateByPrimaryKeySelective(renewalDO); + + commonApprovalLogService.updateNodeApprovalStatus( + renewalDO.getApplicationNo(), + RenewalNodeEnum.REGION_CONSULTANT.getCode(), + ApprovalResultEnum.REJECT.getResult(), + currentUser.getUserId(), currentUser.getName(), + request.getRemark(), false, null + ); + } + return true; + } + + @Override + @Transactional + public Boolean groupEngineeringApproval(RenewalApprovalRequest request) { + RenewalApplicationDO renewalDO = renewalApplicationDAO.getById(request.getRenewalId()); + if (renewalDO == null) { + throw new ServiceException(ErrorCodeEnum.RENEWAL_APPLY_NOT_EXIST); + } + if (!RenewalStatusEnum.PENDING_GROUP.getStatus().equals(renewalDO.getStatus())) { + throw new ServiceException(ErrorCodeEnum.NOT_SUPPORT_OPERATION); + } + + LoginUserInfo currentUser = CurrentUserHolder.getUser(); + Long version = getCurrentVersion(renewalDO.getApplicationNo()); + + if (request.getPass()) { + // 通过 -> 续签中 + renewalDO.setStatus(RenewalStatusEnum.RENEWAL_ING.getStatus()); + renewalApplicationDAO.updateByPrimaryKeySelective(renewalDO); + + commonApprovalLogService.updateNodeApprovalStatus( + renewalDO.getApplicationNo(), + RenewalNodeEnum.GROUP_ENGINEERING.getCode(), + ApprovalResultEnum.PASS.getResult(), + currentUser.getUserId(), currentUser.getName(), + request.getRemark(), false, null + ); + } else { + // 拒绝 + renewalDO.setStatus(RenewalStatusEnum.REJECTED.getStatus()); + renewalApplicationDAO.updateByPrimaryKeySelective(renewalDO); + + commonApprovalLogService.updateNodeApprovalStatus( + renewalDO.getApplicationNo(), + RenewalNodeEnum.GROUP_ENGINEERING.getCode(), + ApprovalResultEnum.REJECT.getResult(), + currentUser.getUserId(), currentUser.getName(), + request.getRemark(), false, null + ); + } + return true; + } + + @Override + @Transactional + public void autoGenerateRenewalApplications() { + // 查询90天内到期且未生成续签的合同 + List contracts = contractMasterDAO.queryContractsNearExpiry(90); + if (CollectionUtils.isEmpty(contracts)) { + log.info("没有即将到期的合同需要生成续签申请"); + return; + } + + for (ContractMasterDO contract : contracts) { + try { + // 再次检查renewalCreated状态(防止并发) + ContractMasterDO fresh = contractMasterDAO.getById(contract.getId()); + if (fresh == null || fresh.getRenewalCreated() == 1) { + continue; + } + + String applicationNo = GenerateNoUtil.generateNo("XQ"); + RenewalApplicationDO renewalDO = RenewalApplicationDO.builder() + .applicationNo(applicationNo) + .storeCode(contract.getStoreCode()) + .originalContractNo(contract.getContractNo()) + .contractExpireDate(contract.getEndDate()) + .isDeleted(0) + .status(RenewalStatusEnum.PENDING_FRANCHISEE.getStatus()) + .isRenovate(0) + .remark("系统自动生成") + .createUserName("系统") + .applyTime(new Date()) + .build(); + renewalApplicationDAO.insertSelective(renewalDO); + + // 保存签约人信息快照 + StoreDO store = storeDao.getByStoreNum(contract.getStoreCode()); + if (store != null) { + StoreMasterSignerInfoDO signerInfo = storeMasterSignerInfoDAO.getByStoreId(store.getStoreId()); + if (signerInfo != null) { + RenewalApplicationSignerInfoDO signerSnapshot = RenewalApplicationSignerInfoDO.builder() + .applicationNo(applicationNo) + .signer1Name(signerInfo.getSigner1Name()) + .signer1Mobile(signerInfo.getSigner1Mobile()) + .signer2Name(signerInfo.getSigner2Name()) + .signer2Mobile(signerInfo.getSigner2Mobile()) + .createdTime(new Date()) + .updatedTime(new Date()) + .build(); + renewalApplicationSignerInfoDAO.insertSelective(signerSnapshot); + } + } + + // 更新续签标记 + contractMasterDAO.updateRenewalCreated(contract.getId(), 1); + + log.info("自动生成续签申请: applicationNo={}, storeCode={}", applicationNo, contract.getStoreCode()); + } catch (Exception e) { + log.error("自动生成续签申请失败: contractId={}", contract.getId(), e); + } + } + } + + /** + * 获取申请当前批次版本号 + * 同一批次提交的所有审批记录使用相同的版本号 + */ + private Long getCurrentVersion(String applicationNo) { + return GenerateNoUtil.generateVersion(); + } + + /** + * 根据门店编码获取区域ID + */ + private Long getRegionIdByStoreCode(String storeCode) { + StoreDO store = storeDao.getByStoreNum(storeCode); + if (store != null) { + RegionDO region = regionDao.getRegionByStoreId(store.getStoreId()); + if (region != null) { + return region.getId(); + } + } + return null; + } + + /** + * 获取审批人ID列表 + */ + private List getAuditUserIds(Long regionId, UserRoleEnum userRoleEnum) { + List users = userAuthMappingService.getAllUserByRoleEnumAndRegionId(userRoleEnum, regionId); + return ListUtils.emptyIfNull(users).stream() + .map(EnterpriseUserDO::getUserId) + .distinct() + .collect(Collectors.toList()); + } +} diff --git a/coolstore-partner-service/src/main/java/com/cool/store/service/visit/impl/VisitRecordServiceImpl.java b/coolstore-partner-service/src/main/java/com/cool/store/service/visit/impl/VisitRecordServiceImpl.java index 2082229fe..081ff3245 100644 --- a/coolstore-partner-service/src/main/java/com/cool/store/service/visit/impl/VisitRecordServiceImpl.java +++ b/coolstore-partner-service/src/main/java/com/cool/store/service/visit/impl/VisitRecordServiceImpl.java @@ -114,7 +114,7 @@ public class VisitRecordServiceImpl implements VisitRecordService { .stream() .map(Long::valueOf) .collect(Collectors.toList()); - List bigRegionList = bigRegionDAO.queryAllBigRegion(null, null, null); + List bigRegionList = bigRegionDAO.queryAllBigRegion(null, null, null, null); Set bigRegionIds = CollStreamUtil.toSet(bigRegionList, BigRegionDTO::getRegionId); authRegionIds.retainAll(bigRegionIds); if (CollectionUtils.isEmpty(authRegionIds)) { diff --git a/coolstore-partner-service/src/main/java/com/cool/store/service/wallet/impl/WalletServiceImpl.java b/coolstore-partner-service/src/main/java/com/cool/store/service/wallet/impl/WalletServiceImpl.java index 068a91111..fbe04c52d 100644 --- a/coolstore-partner-service/src/main/java/com/cool/store/service/wallet/impl/WalletServiceImpl.java +++ b/coolstore-partner-service/src/main/java/com/cool/store/service/wallet/impl/WalletServiceImpl.java @@ -30,6 +30,7 @@ import com.cool.store.mapper.ApplyLicenseMapper; import com.cool.store.request.wallet.*; import com.cool.store.service.UserAuthMappingService; import com.cool.store.service.dict.impl.DictService; +import com.cool.store.service.fees.WalletPayInfoService; import com.cool.store.service.impl.CommonService; import com.cool.store.service.wallet.*; import com.cool.store.utils.BeanUtil; @@ -82,6 +83,7 @@ public class WalletServiceImpl implements WalletService { private final UserAuthMappingService userAuthMappingService; private final CommonService commonService; private final WalletTradeService walletTradeService; + private final WalletPayInfoService walletPayInfoService; @Value("${wallet.org.id}") private Long orgId; @@ -558,6 +560,10 @@ public class WalletServiceImpl implements WalletService { if (orgFlag){ tradeRecodePageRequest.setOrgId(orgId); } + if (StringUtils.isNotEmpty(request.getExpenseTypeCode())){ + tradeRecodePageRequest.setFeeItemId(walletPayInfoService.getFeeItemId(request.getExpenseTypeCode())); + } + TradeRecordListDTO tradeRecordListDTO = walletApiService.getTradeRecordList(tradeRecodePageRequest); return toPageInfo(tradeRecordListDTO.getPageData(), TradeRecordDTO.class, tradeRecordListDTO.getPage()); } diff --git a/coolstore-partner-service/src/main/java/com/cool/store/utils/easyExcel/EasyExcelUtil.java b/coolstore-partner-service/src/main/java/com/cool/store/utils/easyExcel/EasyExcelUtil.java index 881f2d921..41e9609a6 100644 --- a/coolstore-partner-service/src/main/java/com/cool/store/utils/easyExcel/EasyExcelUtil.java +++ b/coolstore-partner-service/src/main/java/com/cool/store/utils/easyExcel/EasyExcelUtil.java @@ -99,7 +99,7 @@ public class EasyExcelUtil { } - private String getUploadPath(String eid) { + public static String getUploadPath(String eid) { String time = DateUtil.format(new Date(), "yyMM"); return "eid" + "/" + eid + "/" + time + "/"; } diff --git a/coolstore-partner-service/src/main/java/com/cool/store/utils/easyExcel/StoreImageExcelExporter.java b/coolstore-partner-service/src/main/java/com/cool/store/utils/easyExcel/StoreImageExcelExporter.java new file mode 100644 index 000000000..b2f0cb020 --- /dev/null +++ b/coolstore-partner-service/src/main/java/com/cool/store/utils/easyExcel/StoreImageExcelExporter.java @@ -0,0 +1,227 @@ +package com.cool.store.utils.easyExcel; + +import com.cool.store.dto.StoreImageExportDTO; +import com.cool.store.oss.OssClientService; +import org.apache.poi.ss.usermodel.*; +import org.apache.poi.xssf.usermodel.XSSFWorkbook; +import org.springframework.stereotype.Service; + +import javax.annotation.Resource; +import javax.servlet.http.HttpServletResponse; +import java.io.ByteArrayInputStream; +import java.io.ByteArrayOutputStream; +import java.io.InputStream; +import java.net.HttpURLConnection; +import java.net.URL; +import java.util.List; + +/** + * @Author suzhuhong + * @Date 2025/11/20 18:53 + * @Version 1.0 + */ +@Service +public class StoreImageExcelExporter { + + @Resource + private OssClientService ossClientService; + /** + * 导出带图片的门店信息到Excel + * @param dataList 门店图片数据列表 + * @param response HTTP响应对象 + * @param fileName 导出文件名 + */ + /** + * 导出带图片的门店信息到Excel + * @param dataList 门店图片数据列表 + * @param response HTTP响应对象 + * @param fileName 导出文件名 + */ + public String exportStoreImages(List dataList, + HttpServletResponse response, + String fileName) throws Exception { + Workbook workbook = new XSSFWorkbook(); + Sheet sheet = workbook.createSheet("门店图片信息"); + + // 设置表头 + Row headerRow = sheet.createRow(0); + CellStyle headerStyle = createHeaderStyle(workbook); + + Cell storeCodeHeader = headerRow.createCell(0); + storeCodeHeader.setCellValue("门店编码"); + storeCodeHeader.setCellStyle(headerStyle); + + Cell storeNameHeader = headerRow.createCell(1); + storeNameHeader.setCellValue("门店名称"); + storeNameHeader.setCellStyle(headerStyle); + + Cell imageHeader = headerRow.createCell(2); + imageHeader.setCellValue("图片"); + imageHeader.setCellStyle(headerStyle); + + // 创建绘图容器 + Drawing drawing = sheet.createDrawingPatriarch(); + + // 填充数据 + for (int i = 0; i < dataList.size(); i++) { + StoreImageExportDTO item = dataList.get(i); + Row row = sheet.createRow(i + 1); + + // 设置行高以便显示图片 + row.setHeightInPoints(300); + + // 门店编码 + Cell storeCodeCell = row.createCell(0); + storeCodeCell.setCellValue(item.getStoreCode()); + + // 门店名称 + Cell storeNameCell = row.createCell(1); + storeNameCell.setCellValue(item.getStoreName()); + + // 插入图片到第3列(索引2) + if (item.getImageUrl() != null && !item.getImageUrl().isEmpty()) { + insertImageToCell(workbook, drawing, row, i, item.getImageUrl()); + } + } + + // 设置列宽 + sheet.setColumnWidth(0, 20 * 256); // 门店编码列宽 + sheet.setColumnWidth(1, 30 * 256); // 门店名称列宽 + sheet.setColumnWidth(2, 50 * 256); + sheet.setColumnWidth(3, 50 * 256); + sheet.setColumnWidth(4, 50 * 256); + sheet.setColumnWidth(5, 50 * 256); + sheet.setColumnWidth(6, 50 * 256); + sheet.setColumnWidth(7, 50 * 256); + sheet.setColumnWidth(8, 50 * 256); + + // 设置响应头 + response.setContentType("application/vnd.openxmlformats-officedocument.spreadsheetml.sheet"); + response.setHeader("Content-Disposition", "attachment; filename=" + java.net.URLEncoder.encode(fileName, "UTF-8")); + + ByteArrayOutputStream byteArrayOutputStream = new ByteArrayOutputStream(); + workbook.write(byteArrayOutputStream); + workbook.close(); + + // 准备上传到OSS + byte[] bytes = byteArrayOutputStream.toByteArray(); + long size = bytes.length; + InputStream inputStream = new ByteArrayInputStream(bytes); + + // 提取文件名(不含扩展名) + String objectName = fileName; + if (fileName.contains(".")) { + objectName = fileName.substring(0, fileName.lastIndexOf(".")); + } + + // 上传到OSS并返回访问URL + return ossClientService.putObject(objectName + ".xlsx", inputStream, size, + "application/vnd.openxmlformats-officedocument.spreadsheetml.sheet"); + } + + + + /** + * 在指定列中垂直排列显示多张图片 + */ + private void insertImageToCell(Workbook workbook, Drawing drawing, Row row, int rowIndex, String imageUrl) { + if (imageUrl == null || imageUrl.isEmpty()) { + return; + } + + String[] imageUrls = imageUrl.split(";"); + int imageCount = Math.min(imageUrls.length, 10); + + if (imageCount == 0) { + return; + } + + try { + // 根据图片数量调整行高 + row.setHeightInPoints(300); + + // 计算每张图片的宽度(平均分配) + + for (int i = 0; i < imageCount; i++) { + String singleImageUrl = imageUrls[i].trim(); + if (singleImageUrl.isEmpty()) { + continue; + } + + byte[] imageBytes = downloadImage(singleImageUrl); + if (imageBytes != null) { + int pictureIdx = workbook.addPicture(imageBytes, getImageType(singleImageUrl)); + CreationHelper helper = workbook.getCreationHelper(); + ClientAnchor anchor = helper.createClientAnchor(); + + // 水平排列:每张图片在相同的行,但不同的列位置 + anchor.setCol1(2 + i); // 起始列递增 + anchor.setRow1(rowIndex+1); // 相同的行 + anchor.setCol2(3 + i); // 结束列递增 + anchor.setRow2(rowIndex + 2); // 相同的结束行 + + anchor.setAnchorType(ClientAnchor.AnchorType.MOVE_AND_RESIZE); + + Picture picture = drawing.createPicture(anchor, pictureIdx); + } + } + } catch (Exception e) { + Cell errorCell = row.createCell(2); + errorCell.setCellValue("图片加载失败: " + e.getMessage()); + } + } + + + + + + /** + * 创建表头样式 + */ + private static CellStyle createHeaderStyle(Workbook workbook) { + CellStyle style = workbook.createCellStyle(); + Font font = workbook.createFont(); + font.setBold(true); + style.setFont(font); + style.setAlignment(HorizontalAlignment.CENTER); + return style; + } + + /** + * 下载网络图片 + */ + private byte[] downloadImage(String imageUrl) throws Exception { + URL url = new URL(imageUrl); + HttpURLConnection connection = (HttpURLConnection) url.openConnection(); + connection.setConnectTimeout(5000); + connection.setReadTimeout(5000); + connection.setRequestMethod("GET"); + + ByteArrayOutputStream outputStream = new ByteArrayOutputStream(); + try (InputStream inputStream = connection.getInputStream()) { + byte[] buffer = new byte[1024]; + int bytesRead; + while ((bytesRead = inputStream.read(buffer)) != -1) { + outputStream.write(buffer, 0, bytesRead); + } + } + return outputStream.toByteArray(); + } + + /** + * 根据文件扩展名判断图片类型 + */ + private int getImageType(String imageUrl) { + if (imageUrl.toLowerCase().endsWith(".png")) { + return Workbook.PICTURE_TYPE_PNG; + } else if (imageUrl.toLowerCase().endsWith(".jpg") || imageUrl.toLowerCase().endsWith(".jpeg")) { + return Workbook.PICTURE_TYPE_JPEG; + } else if (imageUrl.toLowerCase().endsWith(".gif")) { + return Workbook.PICTURE_TYPE_JPEG; + } else { + return Workbook.PICTURE_TYPE_JPEG; // 默认JPEG + } + } + + +} diff --git a/coolstore-partner-service/src/main/java/com/cool/store/utils/poi/ExcelUtil.java b/coolstore-partner-service/src/main/java/com/cool/store/utils/poi/ExcelUtil.java index ccea4e063..2911b0a88 100644 --- a/coolstore-partner-service/src/main/java/com/cool/store/utils/poi/ExcelUtil.java +++ b/coolstore-partner-service/src/main/java/com/cool/store/utils/poi/ExcelUtil.java @@ -140,8 +140,8 @@ public class ExcelUtil { * @param is 输入流 * @return 转换后集合 */ - public List importExcel(InputStream is) throws Exception { - return importExcel(StringUtils.EMPTY, is); + public List importExcel(InputStream is,Integer titleRows) throws Exception { + return importExcel(StringUtils.EMPTY, is, titleRows); } /** @@ -162,7 +162,7 @@ public class ExcelUtil { * @param is 输入流 * @return 转换后集合 */ - public List importExcel(String sheetName, InputStream is) throws Exception { + public List importExcel(String sheetName, InputStream is,Integer titleRows) throws Exception { this.type = Excel.Type.IMPORT; this.wb = WorkbookFactory.create(is); List list = null; @@ -218,7 +218,7 @@ public class ExcelUtil { // 定义一个map用于存放excel列的序号和field. Map cellMap = new HashMap<>(16); // 获取表头 - Row heard = sheet.getRow(0); + Row heard = sheet.getRow(titleRows); for (int i = 0; i < heard.getPhysicalNumberOfCells(); i++) { Cell cell = heard.getCell(i); if (ObjectUtil.isNotNull(cell)) { @@ -245,8 +245,10 @@ public class ExcelUtil { } } } + //数据读取行数 默认表头+1 + Integer startRow = heard.getRowNum()+1; // 将数据填入集合 - list = fillCollection(sheet, rows, fieldsMap); + list = fillCollection(sheet, rows, fieldsMap, startRow); } return list; } @@ -1130,10 +1132,10 @@ public class ExcelUtil { * @throws InstantiationException 实例创建异常 * @throws IllegalAccessException 实例创建异常 */ - private List fillCollection(Sheet sheet, int rows, Map fieldsMap) throws InstantiationException, IllegalAccessException { + private List fillCollection(Sheet sheet, int rows, Map fieldsMap,Integer startRow) throws InstantiationException, IllegalAccessException { List list = new ArrayList<>(); - int j=1; - for (int i = 0; i < rows-1; i++) { + int j=startRow; + for (int i = j; i < rows; i++) { // 从第2行开始取数据,默认第一行是表头. Row row = sheet.getRow(j); j++; diff --git a/coolstore-partner-web/src/main/java/com/cool/store/config/OpenApiValidateFilter.java b/coolstore-partner-web/src/main/java/com/cool/store/config/OpenApiValidateFilter.java index b749a3ee1..a8bd2b953 100644 --- a/coolstore-partner-web/src/main/java/com/cool/store/config/OpenApiValidateFilter.java +++ b/coolstore-partner-web/src/main/java/com/cool/store/config/OpenApiValidateFilter.java @@ -8,6 +8,7 @@ import com.cool.store.response.ResponseResult; import com.cool.store.response.bigdata.ApiResponse; import com.cool.store.utils.OpenSignatureUtil; import com.cool.store.utils.RsaSignUtil; +import com.cool.store.utils.StringUtil; import com.cool.store.utils.UUIDUtils; import com.fasterxml.jackson.core.JsonProcessingException; import com.fasterxml.jackson.core.type.TypeReference; @@ -59,7 +60,7 @@ public class OpenApiValidateFilter implements Filter { private static final List oldUrlMapping = new ArrayList<>(Arrays.asList( "/zxjp/open/v1/statusRefresh","/zxjp/open/v1/changePaymentStatus", "/zxjp/open/v1/getYlsToken", "/zxjp/open/v1/getStoreList", - "/zxjp/open/v1/changeReceiptStatus", "/zxjp/open/v1/getStoreUser")); + "/zxjp/open/v1/changeReceiptStatus", "/zxjp/open/v1/getStoreUser","/zxjp/open/v1/changeOnlinePayInfo")); // 添加钱包接口路径前缀常量 private static final String WALLET_API_PATTERN = "^/zxjp/open/v\\d+/wallet/.*$"; @@ -77,6 +78,7 @@ public class OpenApiValidateFilter implements Filter { } MDC.put(CommonConstants.REQUEST_ID, UUIDUtils.get32UUID()); //statusRefresh 放开不需要验签 + log.info("openUrl:{}",uri); if (isWhitelistUri(uri)) { filterChain.doFilter(servletRequest, response); return; @@ -148,14 +150,17 @@ public class OpenApiValidateFilter implements Filter { String serverSign; //接口映射 红圈通系统使用新验签, oldUrlMapping接口使用旧的验签模式 后续新增接口都使用新验签 if (oldUrlMapping.contains(uri)) { + log.info("使用旧验签"); serverSign = getOldSign(jsonBody, appKey, timestampStr); } else { + log.info("使用新验签"); serverSign = getNewSign(jsonBody, appKey, timestampStr); } log.info("serverSign{}", serverSign); if (!serverSign.equalsIgnoreCase(clientSign)) { + log.info("OpenApiValidateFilter==>签名校验失败"); res.setStatus(HttpStatus.OK.value()); res.setCharacterEncoding("UTF-8"); res.getWriter().write(JSON.toJSONString( @@ -171,11 +176,15 @@ public class OpenApiValidateFilter implements Filter { private @NotNull String getNewSign(String jsonBody, String appKey, String timestampStr) throws JsonProcessingException { // 2. 使用 Jackson 解析 JSON 并转为 TreeMap(自动按键排序) ObjectMapper objectMapper = new ObjectMapper(); - SortedMap params = objectMapper.readValue( - jsonBody, - new TypeReference>() { - } - ); + SortedMap params = new TreeMap<>(); + if (StringUtil.isNotEmpty(jsonBody)){ + params = objectMapper.readValue( + jsonBody, + new TypeReference>() { + } + ); + } + params.put("appKey", appKey); params.put("timestamp", timestampStr); diff --git a/coolstore-partner-web/src/main/java/com/cool/store/config/SignValidateFilter.java b/coolstore-partner-web/src/main/java/com/cool/store/config/SignValidateFilter.java index 7f0e14992..3b607cde2 100644 --- a/coolstore-partner-web/src/main/java/com/cool/store/config/SignValidateFilter.java +++ b/coolstore-partner-web/src/main/java/com/cool/store/config/SignValidateFilter.java @@ -95,6 +95,8 @@ public class SignValidateFilter implements Filter { filterChain.doFilter(servletRequest, servletResponse); return; } + String realClientIp = RealIpUtils.getRealClientIp(request); + log.info("realClientIp:{}",realClientIp); MDC.put(CommonConstants.REQUEST_ID, UUIDUtils.get32UUID()); HttpServletResponse response = (HttpServletResponse) servletResponse; diff --git a/coolstore-partner-web/src/main/java/com/cool/store/config/TokenValidateFilter.java b/coolstore-partner-web/src/main/java/com/cool/store/config/TokenValidateFilter.java index 9bc10784d..aa96a517f 100644 --- a/coolstore-partner-web/src/main/java/com/cool/store/config/TokenValidateFilter.java +++ b/coolstore-partner-web/src/main/java/com/cool/store/config/TokenValidateFilter.java @@ -53,8 +53,10 @@ public class TokenValidateFilter implements Filter { "/zxjp/**/api/audit/result", "/zxjp/pc/video/**", "/zxjp/**/api/license", + "/zxjp/pc/third/api/list", "/zxjp/pc/v3/login/accountLogin", "/zxjp/pc/v3/login/refreshLogin", + "/zxjp/pc/test/**", "/zxjp/ws/**", "/zxjp/pc/v3/login/sendSmsCode", "/zxjp/pc/v3/login/sendSmsCode/test", diff --git a/coolstore-partner-web/src/main/java/com/cool/store/config/swagger/Swagger2Config.java b/coolstore-partner-web/src/main/java/com/cool/store/config/swagger/Swagger2Config.java index 171d63ab2..31c5e1e78 100644 --- a/coolstore-partner-web/src/main/java/com/cool/store/config/swagger/Swagger2Config.java +++ b/coolstore-partner-web/src/main/java/com/cool/store/config/swagger/Swagger2Config.java @@ -25,7 +25,7 @@ import java.util.List; * @description: * @date 2023/05/15 02:52 */ -@Profile({"local", "test", "pre"}) +@Profile({"local", "pre"}) @Configuration @EnableSwagger2 @EnableKnife4j diff --git a/coolstore-partner-web/src/main/java/com/cool/store/controller/webb/AdjustmentOrderController.java b/coolstore-partner-web/src/main/java/com/cool/store/controller/webb/AdjustmentOrderController.java index dc667a071..21e36fe5f 100644 --- a/coolstore-partner-web/src/main/java/com/cool/store/controller/webb/AdjustmentOrderController.java +++ b/coolstore-partner-web/src/main/java/com/cool/store/controller/webb/AdjustmentOrderController.java @@ -77,4 +77,10 @@ public class AdjustmentOrderController { public ResponseResult generateSplitOrder(@Valid @RequestBody GenerateSplitOrderRequest request) { return ResponseResult.success(adjustmentOrderService.generateSplitOrder(request)); } + + @PostMapping("/approval") + @ApiOperation("审批调整单") + public ResponseResult approval(@Valid @RequestBody AdjustmentApprovalRequest request) { + return ResponseResult.success(adjustmentOrderService.approval(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 index c80308a87..a3041d746 100644 --- 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 @@ -1,6 +1,12 @@ package com.cool.store.controller.webb; import com.cool.store.dto.close.CloseStoreMkUserDTO; +import com.cool.store.dto.xgj.XgjBranchBankDTO; +import com.cool.store.dto.xgj.XgjPartnerPageDTO; +import com.cool.store.request.close.refund.*; +import com.cool.store.request.xgj.XgjBankQueryRequest; +import com.cool.store.response.ResponseResult; +import com.cool.store.service.ThirdXgjService; import com.cool.store.request.close.refund.CloseStoreRefundAddRequest; import com.cool.store.request.close.refund.CloseStoreRefundQueryRequest; import com.cool.store.request.close.refund.CloseStoreRefundSkipRequest; diff --git a/coolstore-partner-web/src/main/java/com/cool/store/controller/webb/ContractMasterController.java b/coolstore-partner-web/src/main/java/com/cool/store/controller/webb/ContractMasterController.java new file mode 100644 index 000000000..f3131f461 --- /dev/null +++ b/coolstore-partner-web/src/main/java/com/cool/store/controller/webb/ContractMasterController.java @@ -0,0 +1,46 @@ +package com.cool.store.controller.webb; + +import com.cool.store.request.contract.ContractMasterQueryRequest; +import com.cool.store.response.ResponseResult; +import com.cool.store.service.contract.ContractMasterService; +import com.cool.store.vo.contract.ContractMasterDetailVO; +import com.cool.store.vo.contract.ContractMasterListVO; +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 org.springframework.web.multipart.MultipartFile; + +import javax.validation.constraints.NotNull; + +@Api(tags = "PC-合同管理") +@RestController +@RequestMapping("/pc/contract/master") +@RequiredArgsConstructor +@Validated +public class ContractMasterController { + + private final ContractMasterService contractMasterService; + + @ApiOperation("合同列表") + @GetMapping("/list") + public ResponseResult> queryContractMasterList(ContractMasterQueryRequest request) { + return ResponseResult.success(contractMasterService.queryContractMasterList(request)); + } + + @ApiOperation("合同详情") + @GetMapping("/detail") + @ApiImplicitParam(name = "contractId", value = "合同ID", required = true, dataType = "Long", paramType = "query") + public ResponseResult getContractMasterDetail(@NotNull(message = "合同ID不能为空") Long contractId) { + return ResponseResult.success(contractMasterService.getContractMasterDetail(contractId)); + } + + @ApiOperation("批量导入合同") + @PostMapping("/import") + public ResponseResult importContractAndCost(@RequestParam("file") MultipartFile file) { + return ResponseResult.success(contractMasterService.importContractAndCost(file)); + } +} diff --git a/coolstore-partner-web/src/main/java/com/cool/store/controller/webb/ExportController.java b/coolstore-partner-web/src/main/java/com/cool/store/controller/webb/ExportController.java index dba85dc1b..530672282 100644 --- a/coolstore-partner-web/src/main/java/com/cool/store/controller/webb/ExportController.java +++ b/coolstore-partner-web/src/main/java/com/cool/store/controller/webb/ExportController.java @@ -7,6 +7,7 @@ import com.cool.store.request.*; import com.cool.store.request.order.PCStoreOrderQueryRequest; import com.cool.store.request.tp.TpScoreJournalQueryRequest; import com.cool.store.request.visit.VisitRecordQueryRequest; +import com.cool.store.request.order.PCStoreOrderQueryRequest; import com.cool.store.response.ResponseResult; import com.cool.store.service.ExportService; import io.swagger.annotations.Api; diff --git a/coolstore-partner-web/src/main/java/com/cool/store/controller/webb/ImportController.java b/coolstore-partner-web/src/main/java/com/cool/store/controller/webb/ImportController.java new file mode 100644 index 000000000..810d68667 --- /dev/null +++ b/coolstore-partner-web/src/main/java/com/cool/store/controller/webb/ImportController.java @@ -0,0 +1,73 @@ +package com.cool.store.controller.webb; + +import com.cool.store.context.CurrentUserHolder; +import com.cool.store.dto.ImportReceivingBankDTO; +import com.cool.store.entity.ImportTaskDO; +import com.cool.store.enums.ErrorCodeEnum; +import com.cool.store.enums.FileTypeEnum; +import com.cool.store.enums.ImportTaskStatusEnum; +import com.cool.store.exception.ServiceException; +import com.cool.store.mapper.ImportTaskMapper; +import com.cool.store.response.ResponseResult; +import com.cool.store.service.ImportService; +import com.cool.store.utils.poi.ExcelUtil; +import io.swagger.annotations.Api; +import io.swagger.annotations.ApiOperation; +import lombok.extern.slf4j.Slf4j; +import org.springframework.beans.factory.annotation.Value; +import org.springframework.web.bind.annotation.PostMapping; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RestController; +import org.springframework.web.multipart.MultipartFile; + +import javax.annotation.Resource; +import java.util.ArrayList; +import java.util.List; + +/** + * @Author: WangShuo + * @Date: 2025/06/19/10:25 + * @Version 1.0 + * @注释: + */ +@RestController +@RequestMapping("/pc/import") +@Api("导入") +@Slf4j +public class ImportController { + + @Resource + private ImportService importService; + @Resource + private ImportTaskMapper importTaskMapper; + @Value("${mybatis.configuration.variables.enterpriseId}") + private String eid; + + @PostMapping("/receivingBank") + @ApiOperation(value = "导入收款银行配置") + public ResponseResult importReceivingBank(MultipartFile file) { + if (file.isEmpty()) { + throw new ServiceException(ErrorCodeEnum.FILE_ERROR); + } + ExcelUtil util = new ExcelUtil<>(ImportReceivingBankDTO.class); + List importList = new ArrayList<>(); + try { + importList = util.importExcel(file.getInputStream(),1); + } catch (Exception e) { + e.printStackTrace(); + } + ImportTaskDO importTaskDO = new ImportTaskDO(); + importTaskDO.setFileName(file.getOriginalFilename()); + importTaskDO.setFileType(FileTypeEnum.RECEIVING_BANK_IMPORT.getFileType()); + importTaskDO.setIsImport(true); + importTaskDO.setStatus(ImportTaskStatusEnum.PROGRESS.getCode()); + importTaskDO.setCreateUserId(CurrentUserHolder.getUserId()); + importTaskDO.setCreateName(CurrentUserHolder.getUser().getName()); + importTaskDO.setCreateTime(System.currentTimeMillis()); + importTaskMapper.insert(eid, importTaskDO); + importService.importReceivingBank(importList, file.getOriginalFilename(), CurrentUserHolder.getUser().getUserId(), importTaskDO); + return ResponseResult.success(true); + } + + +} 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 afe8e4ef9..56ab4ba8e 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 @@ -8,12 +8,18 @@ import com.cool.store.dto.region.BigRegionDTO; 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.enums.close.CloseTypeEnum; +import com.cool.store.enums.UserRoleEnum; 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.OpenApiStoreRequest; +import com.cool.store.request.StoreCodeDTO; +import com.cool.store.request.close.store.ThirdCloseStoreApplyRequest; +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.openapi.ShopListRequest; @@ -24,6 +30,7 @@ import com.cool.store.request.wallet.AccountTradeCallbackRequest; 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.OnlinePayInfoRequest; import com.cool.store.request.xgj.ReceiptCallBackRequest; import com.cool.store.response.RegionResponse; import com.cool.store.response.ResponseResult; @@ -32,6 +39,9 @@ import com.cool.store.response.bigdata.ApiResponse; import com.cool.store.service.*; import com.cool.store.service.privatesphere.PrivateSphereQrService; import com.cool.store.service.wallet.WalletService; +import com.cool.store.service.close.CloseStoreService; +import com.cool.store.service.xinfa.XinFaBusinessService; +import com.cool.store.service.xinfa.XinFaDeviceService; import com.cool.store.service.xinfa.XinFaBusinessService; import com.cool.store.service.xinfa.XinFaDeviceService; import com.cool.store.utils.HttpHelper; @@ -49,6 +59,7 @@ import org.springframework.web.bind.annotation.*; import javax.annotation.Resource; import javax.servlet.http.HttpServletRequest; import java.util.List; +import java.util.Map; /** * @Author suzhuhong @@ -77,15 +88,17 @@ public class OpenApiController { MessageTemplateService messageTemplateService; @Resource WechatMiniAppService wechatMiniAppService; + @Resource + CloseStoreService closeStoreService; @Autowired WeChatHandler weChatHandler; @Resource WalletService walletService; @Resource - CloseStoreService closeStoreService; - @Resource ShopService shopService; @Resource + UserAuthMappingService userAuthMappingService; + @Resource BigRegionService bigRegionService; @Resource RegionService regionService; @@ -126,6 +139,13 @@ public class OpenApiController { return openApiService.changeReceiptStatus(request); } + @ApiOperation("新管家回调 修改线上支付信息") + @PostMapping("/changeOnlinePayInfo") + public ApiResponse changeOnlinePayInfo(@RequestBody @Validated OnlinePayInfoRequest request){ + log.info("changeReceiptStatus request:{}", JSONObject.toJSONString(request)); + return openApiService.changeOnlinePayInfo(request); + } + @ApiOperation("新管家回调 账单收款状态及缴款金额") @PostMapping("/changePaymentStatus") public ApiResponse changePaymentStatus(@RequestBody @Validated FranchiseFeeCallBackRequest request){ @@ -281,6 +301,12 @@ public class OpenApiController { return ResponseResult.success(shopService.getShopNameAndCodeByMobile(request.getMobile(), request.getShopId())); } + @ApiOperation("大区下指定角色的人 只查直接管辖") + @PostMapping("/getRegionUserList") + public ApiResponse> getAllBigRegionSpecialRoleUserList(@RequestBody StoreCodeRequest storeCodeRequest) { + return userAuthMappingService.getAllBigRegionSpecialRoleUserList(storeCodeRequest.getStoreCode(),UserRoleEnum.DELIVERY_SPECIALIST); + } + @PostMapping("/queryAllBigRegion") @ApiOperation("获取所有可选择的大区") public ApiResponse> queryContentInfo(@RequestBody @Validated StoreRequest request) { diff --git a/coolstore-partner-web/src/main/java/com/cool/store/controller/webb/PCExamInfoController.java b/coolstore-partner-web/src/main/java/com/cool/store/controller/webb/PCExamInfoController.java new file mode 100644 index 000000000..901448ab3 --- /dev/null +++ b/coolstore-partner-web/src/main/java/com/cool/store/controller/webb/PCExamInfoController.java @@ -0,0 +1,76 @@ +package com.cool.store.controller.webb; + +import com.cool.store.common.InsertGroup; +import com.cool.store.common.UpdateGroup; +import com.cool.store.dto.exam.*; +import com.cool.store.response.ResponseResult; +import com.cool.store.service.exam.ExamInfoService; +import com.cool.store.vo.exam.ExamInfoListVO; +import com.cool.store.vo.exam.ExamInfoVO; +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.*; + +/** + * PC端考试管理Controller + */ +@Api(tags = "PC端-考试管理") +@RestController +@RequestMapping("/pc/exam/info") +@RequiredArgsConstructor +public class PCExamInfoController { + + private final ExamInfoService examInfoService; + + @ApiOperation("创建考试") + @PostMapping("/add") + public ResponseResult addExam(@RequestBody @Validated({InsertGroup.class}) ExamInfoAddDTO dto) { + examInfoService.addExam(dto); + return ResponseResult.success(true); + } + + @ApiOperation("编辑考试") + @PostMapping("/edit") + public ResponseResult updateExam(@RequestBody @Validated({UpdateGroup.class}) ExamInfoAddDTO dto) { + examInfoService.updateExam(dto); + return ResponseResult.success(true); + } + + @ApiOperation("发布考试") + @PostMapping("/publish") + public ResponseResult publishExam(Long id) { + examInfoService.publishExam(id); + return ResponseResult.success(true); + } + + @ApiOperation("结束考试") + @PostMapping("/end") + public ResponseResult endExam(Long id) { + examInfoService.endExam(id); + return ResponseResult.success(true); + } + + @ApiOperation("删除考试") + @PostMapping("/delete") + public ResponseResult deleteExam(Long id) { + examInfoService.deleteExam(id); + return ResponseResult.success(true); + } + + @ApiOperation("考试列表") + @PostMapping("/list") + public ResponseResult> getExamList(@RequestBody ExamInfoListDTO dto) { + PageInfo result = examInfoService.getExamList(dto); + return ResponseResult.success(result); + } + + @ApiOperation("考试详情") + @GetMapping("/detail/{id}") + public ResponseResult getExamDetail(@PathVariable Long id) { + ExamInfoVO result = examInfoService.getExamDetail(id); + return ResponseResult.success(result); + } +} \ No newline at end of file diff --git a/coolstore-partner-web/src/main/java/com/cool/store/controller/webb/PCExamPaperController.java b/coolstore-partner-web/src/main/java/com/cool/store/controller/webb/PCExamPaperController.java new file mode 100644 index 000000000..5cb7f05cf --- /dev/null +++ b/coolstore-partner-web/src/main/java/com/cool/store/controller/webb/PCExamPaperController.java @@ -0,0 +1,62 @@ +package com.cool.store.controller.webb; + +import com.cool.store.common.InsertGroup; +import com.cool.store.common.UpdateGroup; +import com.cool.store.dto.exam.*; +import com.cool.store.response.ResponseResult; +import com.cool.store.service.exam.ExamPaperService; +import com.cool.store.vo.exam.ExamPaperListVO; +import com.cool.store.vo.exam.ExamPaperVO; +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.*; + +/** + * PC端试卷管理Controller + */ +@Api(tags = "PC端-试卷管理") +@RestController +@RequestMapping("/pc/exam/paper") +@RequiredArgsConstructor +public class PCExamPaperController { + + private final ExamPaperService examPaperService; + + @ApiOperation("新增试卷") + @PostMapping("/add") + public ResponseResult addPaper(@RequestBody @Validated({InsertGroup.class}) ExamPaperAddDTO dto) { + examPaperService.addPaper(dto); + return ResponseResult.success(true); + } + + @ApiOperation("编辑试卷") + @PostMapping("/edit") + public ResponseResult updatePaper(@RequestBody @Validated({UpdateGroup.class}) ExamPaperAddDTO dto) { + examPaperService.updatePaper(dto); + return ResponseResult.success(true); + } + + @ApiOperation("删除试卷") + @PostMapping("/delete") + public ResponseResult deletePaper(Long id) { + examPaperService.deletePaper(id); + return ResponseResult.success(true); + } + + @ApiOperation("试卷列表") + @PostMapping("/list") + public ResponseResult> getPaperList(@RequestBody ExamPaperListDTO dto) { + PageInfo result = examPaperService.getPaperList(dto); + return ResponseResult.success(result); + } + + @ApiOperation("试卷详情") + @GetMapping("/detail/{id}") + public ResponseResult getPaperDetail(@PathVariable Long id) { + ExamPaperVO result = examPaperService.getPaperDetail(id); + return ResponseResult.success(result); + } +} \ No newline at end of file diff --git a/coolstore-partner-web/src/main/java/com/cool/store/controller/webb/PCExamQuestionController.java b/coolstore-partner-web/src/main/java/com/cool/store/controller/webb/PCExamQuestionController.java new file mode 100644 index 000000000..b1a9caabd --- /dev/null +++ b/coolstore-partner-web/src/main/java/com/cool/store/controller/webb/PCExamQuestionController.java @@ -0,0 +1,64 @@ +package com.cool.store.controller.webb; + +import com.cool.store.common.InsertGroup; +import com.cool.store.common.UpdateGroup; +import com.cool.store.dto.exam.*; +import com.cool.store.response.ResponseResult; +import com.cool.store.service.exam.ExamQuestionService; +import com.cool.store.vo.exam.ExamQuestionListVO; +import com.cool.store.vo.exam.ExamQuestionVO; +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 java.util.List; + +/** + * PC端题目管理Controller + */ +@Api(tags = "PC端-题目管理") +@RestController +@RequestMapping("/pc/exam/question") +@RequiredArgsConstructor +public class PCExamQuestionController { + + private final ExamQuestionService examQuestionService; + + @ApiOperation("新增题目") + @PostMapping("/add") + public ResponseResult addQuestion(@RequestBody @Validated({InsertGroup.class}) ExamQuestionAddDTO dto) { + examQuestionService.addQuestion(dto); + return ResponseResult.success(true); + } + + @ApiOperation("编辑题目") + @PostMapping("/edit") + public ResponseResult updateQuestion(@RequestBody @Validated({UpdateGroup.class}) ExamQuestionAddDTO dto) { + examQuestionService.updateQuestion(dto); + return ResponseResult.success(true); + } + + @ApiOperation("批量删除题目") + @PostMapping("/delete") + public ResponseResult deleteQuestions(@RequestBody List ids) { + examQuestionService.deleteQuestions(ids); + return ResponseResult.success(true); + } + + @ApiOperation("题目列表") + @PostMapping("/list") + public ResponseResult> getQuestionList(@RequestBody ExamQuestionListDTO dto) { + PageInfo result = examQuestionService.getQuestionList(dto); + return ResponseResult.success(result); + } + + @ApiOperation("题目详情") + @GetMapping("/detail/{id}") + public ResponseResult getQuestionDetail(@PathVariable Long id) { + ExamQuestionVO result = examQuestionService.getQuestionDetail(id); + return ResponseResult.success(result); + } +} \ No newline at end of file diff --git a/coolstore-partner-web/src/main/java/com/cool/store/controller/webb/PCOpenPreparationController.java b/coolstore-partner-web/src/main/java/com/cool/store/controller/webb/PCOpenPreparationController.java index c07344095..3179cf2e1 100644 --- a/coolstore-partner-web/src/main/java/com/cool/store/controller/webb/PCOpenPreparationController.java +++ b/coolstore-partner-web/src/main/java/com/cool/store/controller/webb/PCOpenPreparationController.java @@ -77,7 +77,7 @@ public class PCOpenPreparationController { return ResponseResult.success(openingOperationPlanService.getPlanListPage(request)); } @PostMapping("/openingOperationPlan/audit") - @ApiOperation("审核运营方案") + @ApiOperation("审核运营方案-废弃") public ResponseResult auditPlan(@RequestBody OpeningOperationPlanAuditRequest request) { return ResponseResult.success(auditOpeningOperationPlanService.auditPlan(request,CurrentUserHolder.getUser())); } diff --git a/coolstore-partner-web/src/main/java/com/cool/store/controller/webb/PCStoreController.java b/coolstore-partner-web/src/main/java/com/cool/store/controller/webb/PCStoreController.java index 869e9bf5e..289833d26 100644 --- a/coolstore-partner-web/src/main/java/com/cool/store/controller/webb/PCStoreController.java +++ b/coolstore-partner-web/src/main/java/com/cool/store/controller/webb/PCStoreController.java @@ -5,6 +5,7 @@ import com.cool.store.context.CurrentUserHolder; import com.cool.store.dto.store.StoreUserDTO; import com.cool.store.request.store.StoreListRequest; import com.cool.store.request.UserStoreRequest; +import com.cool.store.request.store.StoreListRequest; import com.cool.store.response.MiniShopsResponse; import com.cool.store.response.ResponseResult; import com.cool.store.service.StoreService; 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 53bd18e0d..2cb1b685b 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 @@ -10,20 +10,32 @@ import com.cool.store.dao.bonus.BonusDistributionRuleDAO; import com.cool.store.dao.fees.WalletPayInfoDAO; 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.dto.wechat.CallbackMessageDTO; +import com.cool.store.dto.wechat.WechatTemplateMessageDTO; +import com.cool.store.dto.contract.ContractCallbackDTO; +import com.cool.store.dto.food.DishesDTO; +import com.cool.store.dto.*; +import com.cool.store.dto.xgj.XgjPayResultDTO; import com.cool.store.entity.*; import com.cool.store.entity.closeup.CloseUpApplyFormDO; import com.cool.store.entity.closeup.CloseUpPlatformDO; import com.cool.store.entity.bonus.BonusDistributionRuleDO; +import com.cool.store.entity.closeup.CloseUpApplyFormDO; +import com.cool.store.entity.closeup.CloseUpPlatformDO; import com.cool.store.entity.fees.WalletPayInfoDO; import com.cool.store.enums.*; +import com.cool.store.enums.DownSystemTypeEnum; +import com.cool.store.enums.MessageEnum; +import com.cool.store.enums.SMSMsgEnum; +import com.cool.store.enums.*; import com.cool.store.enums.point.ShopSubStageStatusEnum; import com.cool.store.enums.wechat.WechatTemplateEnum; +import com.cool.store.exception.ServiceException; import com.cool.store.handler.WeChatHandler; import com.cool.store.job.XxlJobHandler; import com.cool.store.mapper.FranchiseFeeMapper; @@ -34,6 +46,10 @@ 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.liepin.AddStoreEmpRequest; +import com.cool.store.request.liepin.AddStoreRequest; +import com.cool.store.request.liepin.GetAccessTokenRequest; +import com.cool.store.request.liepin.GetPathRequest; import com.cool.store.request.oppty.*; import com.cool.store.request.storeopen.StoreMonthRevenueRequest; import com.cool.store.request.storeopen.StoreRecipeDailySalesRequest; @@ -47,6 +63,7 @@ import com.cool.store.response.bigdata.ApiResponse; import com.cool.store.response.bigdata.ProfitDataResponse; import com.cool.store.response.bigdata.ProfitRateResponse; import com.cool.store.response.huoma.ShopBaseInfoResponse; +import com.cool.store.response.liepin.PathResponse; import com.cool.store.response.oppty.CityResponse; import com.cool.store.response.oppty.OpportunityDetailResponse; import com.cool.store.response.oppty.OpportunityInfoPageResponse; @@ -65,11 +82,12 @@ import com.cool.store.service.wallet.WalletApiService; import com.cool.store.service.wechat.WechatTemplateService; import com.cool.store.service.xinfa.XinFaBusinessService; import com.cool.store.utils.RsaSignUtil; +import com.cool.store.utils.easyExcel.StoreImageExcelExporter; +import com.cool.store.utils.poi.ExcelUtil; import com.cool.store.utils.poi.StringUtils; import com.fasterxml.jackson.core.JsonProcessingException; import com.fasterxml.jackson.core.type.TypeReference; import com.fasterxml.jackson.databind.ObjectMapper; -import com.sun.org.apache.xpath.internal.operations.Bool; import io.swagger.annotations.ApiOperation; import io.swagger.models.auth.In; import lombok.extern.slf4j.Slf4j; @@ -77,9 +95,13 @@ import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Value; import org.springframework.validation.annotation.Validated; import org.springframework.web.bind.annotation.*; +import org.springframework.web.multipart.MultipartFile; import javax.annotation.Resource; +import javax.servlet.http.HttpServletResponse; import javax.validation.Valid; +import java.time.LocalDate; +import java.time.format.DateTimeFormatter; import java.util.*; @Slf4j @@ -157,17 +179,60 @@ public class PCTestController { @Resource CloseUpPlatformDAO closeUpPlatformDAO; @Resource - ThirdStoreOpenDataService thirdStoreOpenDataService; - @Resource - BonusService bonusService; - @Resource - BonusDistributionRuleDAO bonusRuleDAO; + WechatMiniAppService wechatMiniAppService; + + @PostMapping("/softOpenDate") + public ResponseResult softOpenDate() { + xxlJobHandler.softOpenDate(); + return ResponseResult.success(true); + } @PostMapping("/closeUpAutoOpen") public void closeUpAutoOpen(Long applyId) { closeUpService.closeUpAutoOpen(applyId); } + + @PostMapping("/createQrCode") + public ResponseResult createQrCode(String page, String scene, String width) { + return ResponseResult.success(wechatMiniAppService.createQrCode(page, scene, width)); + } + + @Resource + ThirdStoreOpenDataService thirdStoreOpenDataService; + @Resource + BonusService bonusService; + @Resource + BonusDistributionRuleDAO bonusRuleDAO; + @Resource + StoreService storeService; + + + @PostMapping("/saveStoreReport") + public ResponseResult saveStoreReport(String startDate, String endDate) { + DateTimeFormatter dayFormatter = DateTimeFormatter.ofPattern("yyyy-MM-dd"); + DateTimeFormatter monthFormatter = DateTimeFormatter.ofPattern("yyyy-MM"); + DateTimeFormatter yearFormatter = DateTimeFormatter.ofPattern("yyyy"); + LocalDate start = LocalDate.parse(startDate + "-01" + (startDate.length() == 4 ? "-01" : ""), dayFormatter); + LocalDate end = LocalDate.parse(endDate + "-01" + (startDate.length() == 4 ? "-01" : ""), dayFormatter); + for (; !start.isAfter(end); ) { + String date = startDate.length() == 4 ? start.format(yearFormatter) : start.format(monthFormatter); + try { + storeService.saveStoreReport(date); + if (startDate.length() == 4) { + start = start.plusYears(1); + } else { + start = start.plusMonths(1); + } + log.info("{}执行成功", date); + } catch (Exception e) { + log.error("{}执行失败", date, e); + } + } + return ResponseResult.success(true); + } + + @PostMapping("/queryPlatformStatus") public void queryPlatformStatus() { xxlJobHandler.queryPlatformStatus(); @@ -316,7 +381,7 @@ public class PCTestController { messageMap.put("pointName", pointInfo.getPointName()); messageMap.put("pointAddress", pointInfo.getAddress()); messageMap.put("reason", "表现一般不予通过"); - commonService.sendMessage(Arrays.asList("123836131931284423","020125244825417786"), messageEnum, messageMap); + commonService.sendMessage(Arrays.asList("wpayJeDAAAhGIFgUJpJN-zg39JuNbYhg_woayJeDAAAZtsQ3Xj2Lv_V1kOK421F1g"), messageEnum, messageMap); return ResponseResult.success(Boolean.FALSE); } @@ -363,16 +428,14 @@ public class PCTestController { @GetMapping("/testQWMessage") public ResponseResult testQWMessage(){ List userIds = new ArrayList<>(); - userIds.add("wpayJeDAAAhGIFgUJpJN-zg39JuNbYhg_woayJeDAAA52Wm6ZigyveSjniyimeqZQ"); + userIds.add("wpayJeDAAAhGIFgUJpJN-zg39JuNbYhg_woayJeDAAAZtsQ3Xj2Lv_V1kOK421F1g"); HashMap map = new HashMap<>(); map.put("partnerUsername","sx"); map.put("partnerMobile","13563273279"); - commonService.sendQWMessage(userIds, - MessageEnum.MESSAGE_14, - map); - + commonService.sendQWMessage(userIds, MessageEnum.MESSAGE_14, map); return ResponseResult.success(Boolean.TRUE); } + @Resource ThirdOpportunityService thirdOpportunityService; @Resource @@ -530,6 +593,47 @@ public class PCTestController { public ResponseResult getPosToken(@RequestBody @Validated GetAccessTokenDTO dto) { return ResponseResult.success(pushService.getPosToken(dto)); } + @Resource + ThirdLiePinService liePinService; + + @ApiOperation("获取猎聘薪招聘token") + @PostMapping("/getLiePinAccessToken") + public ResponseResult getLiePinAccessToken(@RequestBody @Validated GetAccessTokenRequest dto) { + return ResponseResult.success(liePinService.getAccessToken(dto)); + } + + @ApiOperation("新增门店到猎聘") + @PostMapping("/addStoreToLiePin") + public ResponseResult addStoreToLiePin(@RequestBody @Validated AddStoreRequest dto) { + return ResponseResult.success(liePinService.addStoreToLiePin(dto)); + } + + @ApiOperation("新增员工到门店-猎聘") + @PostMapping("/addStoreEmp") + public ResponseResult addStoreEmp(@RequestBody @Validated AddStoreEmpRequest dto) { + return ResponseResult.success(liePinService.addStoreEmp(dto)); + } + + @ApiOperation("获取跳转链接") + @PostMapping("/getJumpUrl") + public ResponseResult getPath(@RequestBody @Validated GetPathRequest dto) { + return ResponseResult.success(liePinService.getPath(dto)); + } + + @Resource + LiePinService LocalLiePinService; + + @ApiOperation("获取链接") + @PostMapping("/getPath") + public ResponseResult getPath(@RequestParam String code,String mobile,String userName) { + return ResponseResult.success(LocalLiePinService.getJumpUrl(code,mobile,userName)); + } + + @GetMapping("/getFilePath") + @ApiOperation("获取新超人文件地址") + public ResponseResult getFilePath(@RequestParam(value = "ossUrl", required = true) String ossUrl) { + return ResponseResult.success(liePinService.getFilePath(ossUrl)); + } @@ -555,6 +659,18 @@ public class PCTestController { return ResponseResult.success(thirdFoodService.getFoodToken(dto)); } + @ApiOperation("获取已购菜品") + @PostMapping("/getPurchasedDishesList") + public ResponseResult> getPurchasedDishesList(@RequestBody @Validated FoodTokenDTO dto) { + return ResponseResult.success(thirdFoodService.getPurchasedDishesList(dto)); + } + + @ApiOperation("获取我研发的菜品") + @PostMapping("/getMyDesignDishesList") + public ResponseResult> getMyDesignDishesList(@RequestBody @Validated FoodTokenDTO dto) { + return ResponseResult.success(thirdFoodService.getMyDesignDishesList(dto)); + } + @GetMapping("/getToday") @ApiOperation("getToday") @@ -760,7 +876,8 @@ public class PCTestController { return "success"; } } - return nonce; + log.info("echostr:{}", echostr); + return echostr; } @ApiOperation("测试小程序模板消息") @@ -975,6 +1092,29 @@ public class PCTestController { } + @Resource + StoreImageExcelExporter storeImageExcelExporter; + + /** + * @param response + */ + @PostMapping("/images") + public void exportStoreImages(MultipartFile file, + HttpServletResponse response) { + try { + if (file.isEmpty()) { + throw new ServiceException(ErrorCodeEnum.FILE_ERROR); + } + ExcelUtil util = new ExcelUtil<>(StoreImageExportDTO.class); + List importList = util.importExcel(file.getInputStream(), 0); + storeImageExcelExporter.exportStoreImages(importList, response,"门店图片导出"); + } catch (Exception e) { + // 处理异常 + e.printStackTrace(); + } + } + + @Value("${cool.api.rsa.private.key}") private String coolPrivateKey; diff --git a/coolstore-partner-web/src/main/java/com/cool/store/controller/webb/PointController.java b/coolstore-partner-web/src/main/java/com/cool/store/controller/webb/PointController.java index d3870383e..9ffdca500 100644 --- a/coolstore-partner-web/src/main/java/com/cool/store/controller/webb/PointController.java +++ b/coolstore-partner-web/src/main/java/com/cool/store/controller/webb/PointController.java @@ -2,6 +2,7 @@ package com.cool.store.controller.webb; import com.alibaba.fastjson.JSONObject; import com.cool.store.context.CurrentUserHolder; +import com.cool.store.context.LoginUserInfo; import com.cool.store.context.PartnerUserHolder; import com.cool.store.dto.point.PointStatisticsDTO; import com.cool.store.dto.point.ShopPointDTO; @@ -283,7 +284,8 @@ public class PointController { @ApiOperation("上传租赁合同") @PostMapping("/uploadRentContract") public ResponseResult uploadRentContract(@RequestBody @Validated AddRentContractRequest request) { - return ResponseResult.success(pointService.uploadRentContract(request)); + LoginUserInfo user = CurrentUserHolder.getUser(); + return ResponseResult.success(pointService.uploadRentContract(request,user.getUserId(),user.getName())); } @ApiOperation("保存点位测算 V3.0 新增") diff --git a/coolstore-partner-web/src/main/java/com/cool/store/controller/webb/ReceivingBankController.java b/coolstore-partner-web/src/main/java/com/cool/store/controller/webb/ReceivingBankController.java new file mode 100644 index 000000000..e78aa2e1d --- /dev/null +++ b/coolstore-partner-web/src/main/java/com/cool/store/controller/webb/ReceivingBankController.java @@ -0,0 +1,46 @@ +package com.cool.store.controller.webb; + +import com.cool.store.context.CurrentUserHolder; +import com.cool.store.request.ReceivingBankListRequest; +import com.cool.store.request.ReceivingBankRequest; +import com.cool.store.response.ReceivingBankResponse; +import com.cool.store.response.ResponseResult; +import com.cool.store.service.ReceivingBankService; +import com.github.pagehelper.PageInfo; +import io.swagger.annotations.Api; +import io.swagger.annotations.ApiOperation; +import org.springframework.web.bind.annotation.*; + +import javax.annotation.Resource; +import javax.validation.Valid; + +/** + * @Author: WangShuo + * @Date: 2025/06/19/09:40 + * @Version 1.0 + * @注释: + */ +@RestController +@Api(value = "收款银行配置") +@RequestMapping("/pc/receivingBank") +public class ReceivingBankController { + @Resource + private ReceivingBankService receivingBankService; + @PostMapping("/submit") + @ApiOperation("添加/修改收款银行") + public ResponseResult submit(@RequestBody @Valid ReceivingBankRequest request){ + return ResponseResult.success(receivingBankService.submit(request, CurrentUserHolder.getUserId())); + } + + @PostMapping("/list") + @ApiOperation("收款银行列表") + public ResponseResult> list(@RequestBody @Valid ReceivingBankListRequest request){ + return ResponseResult.success(receivingBankService.getByFranchiseBrandAndRegionId(request)); + } + + @GetMapping("/getByShopId") + @ApiOperation("根据门店id查询收款银行信息") + public ResponseResult getByShopId(@RequestParam("shopId") Long shopId){ + return ResponseResult.success(receivingBankService.getByShopId(shopId)); + } +} diff --git a/coolstore-partner-web/src/main/java/com/cool/store/controller/webb/RenewalApplicationController.java b/coolstore-partner-web/src/main/java/com/cool/store/controller/webb/RenewalApplicationController.java new file mode 100644 index 000000000..58ba60adf --- /dev/null +++ b/coolstore-partner-web/src/main/java/com/cool/store/controller/webb/RenewalApplicationController.java @@ -0,0 +1,110 @@ +package com.cool.store.controller.webb; + +import com.cool.store.request.renewal.RenewalApplicationCreateRequest; +import com.cool.store.request.renewal.RenewalApplicationQueryRequest; +import com.cool.store.request.renewal.RenewalApprovalRequest; +import com.cool.store.response.ResponseResult; +import com.cool.store.service.renewal.RenewalApplicationService; +import com.cool.store.vo.renewal.RenewalApplicationDetailVO; +import com.cool.store.vo.renewal.RenewalApplicationListVO; +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; + +/** + * PC端续签申请管理接口 + */ +@Api(tags = "PC-续签申请管理") +@RestController +@RequestMapping("/pc/renewal/application") +@RequiredArgsConstructor +@Validated +public class RenewalApplicationController { + + private final RenewalApplicationService renewalApplicationService; + + /** + * 查询续签申请列表 + * 支持按关键字、区域、合同到期时间、状态等条件筛选 + * + * @param request 查询请求参数 + * @return 续签申请分页列表 + */ + @ApiOperation("续签申请列表") + @PostMapping("/list") + public ResponseResult> queryRenewalApplicationList(@RequestBody @Validated RenewalApplicationQueryRequest request) { + return ResponseResult.success(renewalApplicationService.queryRenewalApplicationList(request)); + } + + /** + * 查询续签申请详情 + * 包含续签基本信息、门店信息、签约人快照、关联合同信息、审批记录 + * + * @param renewalId 续签申请ID + * @return 续签申请详情 + */ + @ApiOperation("续签申请详情") + @GetMapping("/detail") + @ApiImplicitParam(name = "renewalId", value = "续签申请ID", required = true, dataType = "Long", paramType = "query") + public ResponseResult getRenewalApplicationDetail(@NotNull(message = "续签申请ID不能为空") Long renewalId) { + return ResponseResult.success(renewalApplicationService.getRenewalApplicationDetail(renewalId)); + } + + /** + * 新增续签申请 + * 创建续签申请并保存签约人信息快照 + * + * @param request 创建请求参数(门店ID、备注) + * @return 是否创建成功 + */ + @ApiOperation("新增续签申请") + @PostMapping("/create") + public ResponseResult createRenewalApplication(@RequestBody @Validated RenewalApplicationCreateRequest request) { + return ResponseResult.success(renewalApplicationService.createRenewalApplication(request)); + } + + /** + * 运营顾问审批续签申请 + * 审批通过后流转到片区顾问,支持标记翻新信息 + * + * @param request 审批请求参数(续签申请ID、是否通过、审批意见、翻新信息) + * @return 是否审批成功 + */ + @ApiOperation("运营顾问审批") + @PostMapping("/ops/approve") + public ResponseResult operationsConsultantApproval(@RequestBody @Validated RenewalApprovalRequest request) { + return ResponseResult.success(renewalApplicationService.operationsConsultantApproval(request)); + } + + /** + * 片区顾问审批续签申请 + * 审批通过后流转到集团工程部 + * + * @param request 审批请求参数(续签申请ID、是否通过、审批意见) + * @return 是否审批成功 + */ + @ApiOperation("片区顾问审批") + @PostMapping("/region/approve") + public ResponseResult regionalConsultantApproval(@RequestBody @Validated RenewalApprovalRequest request) { + return ResponseResult.success(renewalApplicationService.regionalConsultantApproval(request)); + } + + /** + * 集团工程部审批续签申请 + * 审批通过后流程完成 + * + * @param request 审批请求参数(续签申请ID、是否通过、审批意见) + * @return 是否审批成功 + */ + @ApiOperation("集团工程部审批") + @PostMapping("/group/approve") + public ResponseResult groupEngineeringApproval(@RequestBody @Validated RenewalApprovalRequest request) { + return ResponseResult.success(renewalApplicationService.groupEngineeringApproval(request)); + } +} diff --git a/coolstore-partner-web/src/main/java/com/cool/store/controller/webc/LinePayController.java b/coolstore-partner-web/src/main/java/com/cool/store/controller/webc/LinePayController.java index 3c8b06243..c13e1ec73 100644 --- a/coolstore-partner-web/src/main/java/com/cool/store/controller/webc/LinePayController.java +++ b/coolstore-partner-web/src/main/java/com/cool/store/controller/webc/LinePayController.java @@ -4,8 +4,10 @@ import com.cool.store.context.CurrentUserHolder; import com.cool.store.context.PartnerUserHolder; import com.cool.store.dto.AmountDTO; import com.cool.store.enums.point.PayBusinessTypeEnum; +import com.cool.store.request.FranchiseFeePayOnlineRequest; import com.cool.store.request.LinePaySubmitRequest; import com.cool.store.response.FranchiseFeePayInfoResponse; +import com.cool.store.response.FranchiseFeePayOnlineResponse; import com.cool.store.response.ResponseResult; import com.cool.store.service.LinePayService; import com.cool.store.vo.LinePayVO; @@ -15,6 +17,7 @@ import io.swagger.annotations.ApiImplicitParam; import io.swagger.annotations.ApiImplicitParams; import io.swagger.annotations.ApiOperation; import lombok.extern.slf4j.Slf4j; +import org.springframework.validation.annotation.Validated; import org.springframework.web.bind.annotation.*; import javax.annotation.Resource; @@ -79,4 +82,15 @@ public class LinePayController { public ResponseResult getById(@RequestParam("id") Long id) { return ResponseResult.success(linePayService.getById(id)); } + @ApiOperation("加盟费线上支付提交付款单") + @PostMapping("/submitFranchiseFeePayOnline") + public ResponseResult submitFranchiseFeePayOnline(@RequestBody @Validated FranchiseFeePayOnlineRequest request) { + return ResponseResult.success(linePayService.franchiseFeePayOnline(request, PartnerUserHolder.getUser().getPartnerId())); + } + + @ApiOperation("加盟费线上支付取消付款单") + @GetMapping("/cancelFranchiseFeePayOnline") + public ResponseResult cancelFranchiseFeePayOnline(@RequestParam("id") Long id) { + return ResponseResult.success(linePayService.cancelFranchiseFeePayOnline(id, PartnerUserHolder.getUser().getPartnerId())); + } } diff --git a/coolstore-partner-web/src/main/java/com/cool/store/controller/webc/MiniExamController.java b/coolstore-partner-web/src/main/java/com/cool/store/controller/webc/MiniExamController.java new file mode 100644 index 000000000..7f74d2b1e --- /dev/null +++ b/coolstore-partner-web/src/main/java/com/cool/store/controller/webc/MiniExamController.java @@ -0,0 +1,84 @@ +package com.cool.store.controller.webc; + +import com.cool.store.context.PartnerUserHolder; +import com.cool.store.dto.exam.*; +import com.cool.store.response.ResponseResult; +import com.cool.store.service.exam.ExamAttemptService; +import com.cool.store.service.exam.ExamInfoService; +import com.cool.store.vo.PartnerUserInfoVO; +import com.cool.store.vo.exam.ExamAttemptListVO; +import com.cool.store.vo.exam.ExamAttemptVO; +import com.cool.store.vo.exam.ExamInfoVO; +import com.cool.store.vo.exam.ExamPaperForAttemptVO; +import com.cool.store.vo.exam.ExamResultVO; +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.*; + +/** + * 小程序端考试Controller + */ +@Api(tags = "小程序-考试入口") +@RestController +@RequestMapping("/mini/exam") +@RequiredArgsConstructor +public class MiniExamController { + + private final ExamInfoService examInfoService; + private final ExamAttemptService examAttemptService; + + @ApiOperation("通过token进入考试") + @PostMapping("/entry/token") + public ResponseResult getExamByToken(@RequestBody @Validated ExamTokenDTO dto) { + ExamInfoVO result = examInfoService.getExamByToken(dto.getToken()); + return ResponseResult.success(result); + } + + @ApiOperation("开始考试") + @PostMapping("/start") + public ResponseResult startAttempt(@RequestBody ExamStartAttemptDTO dto) { + ExamPaperForAttemptVO result = examAttemptService.startAttempt(dto); + return ResponseResult.success(result); + } + + @ApiOperation("保存答案") + @PostMapping("/saveAnswer") + public ResponseResult saveAnswer(@RequestBody ExamSubmitAnswerDTO dto) { + examAttemptService.saveAnswer(dto); + return ResponseResult.success(true); + } + + @ApiOperation("提交试卷") + @PostMapping("/submit") + public ResponseResult submitPaper(@RequestBody ExamSubmitPaperDTO dto) { + ExamResultVO result = examAttemptService.submitPaper(dto); + return ResponseResult.success(result); + } + + @ApiOperation("查看答卷详情") + @GetMapping("/detail/{attemptId}") + public ResponseResult getAttemptDetail(@PathVariable Long attemptId) { + ExamAttemptVO result = examAttemptService.getAttemptDetail(attemptId); + return ResponseResult.success(result); + } + + @ApiOperation("查看考试结果") + @GetMapping("/result/{attemptId}") + public ResponseResult getResult(@PathVariable Long attemptId) { + ExamResultVO result = examAttemptService.getResult(attemptId); + return ResponseResult.success(result); + } + + @ApiOperation("我的考试记录") + @GetMapping("/myList") + public ResponseResult> myAttemptList( + @RequestParam(defaultValue = "1") Integer pageNum, + @RequestParam(defaultValue = "10") Integer pageSize) { + PartnerUserInfoVO userInfo = PartnerUserHolder.getUser(); + PageInfo result = examAttemptService.listByMobile(userInfo.getMobile(), pageNum, pageSize); + return ResponseResult.success(result); + } +} \ No newline at end of file diff --git a/coolstore-partner-web/src/main/java/com/cool/store/controller/webc/MiniOpenPreparationController.java b/coolstore-partner-web/src/main/java/com/cool/store/controller/webc/MiniOpenPreparationController.java index 26fd6eb9e..b9a711f32 100644 --- a/coolstore-partner-web/src/main/java/com/cool/store/controller/webc/MiniOpenPreparationController.java +++ b/coolstore-partner-web/src/main/java/com/cool/store/controller/webc/MiniOpenPreparationController.java @@ -45,12 +45,7 @@ public class MiniOpenPreparationController { @GetMapping("/openingOperationPlan/getPlan") @ApiOperation("查询开业运营方案") public ResponseResult getPlan(@RequestParam("shopId") Long shopId) { - OpeningOperationPlanVO plan = openingOperationPlanService.getPlanByShopId(shopId); - if (AuditStatusEnum.PASS.getCode().equals(plan.getResultType())) { - return ResponseResult.success(plan); - } - log.info("运营方案待审核或未通过"); - return ResponseResult.success(null); + return ResponseResult.success(openingOperationPlanService.getPlanByShopId(shopId)); } @GetMapping("/firstOrder/get") diff --git a/coolstore-partner-web/src/main/java/com/cool/store/controller/webc/MiniReceivingBankController.java b/coolstore-partner-web/src/main/java/com/cool/store/controller/webc/MiniReceivingBankController.java new file mode 100644 index 000000000..f2bcb1f79 --- /dev/null +++ b/coolstore-partner-web/src/main/java/com/cool/store/controller/webc/MiniReceivingBankController.java @@ -0,0 +1,33 @@ +package com.cool.store.controller.webc; + +import com.cool.store.response.ReceivingBankResponse; +import com.cool.store.response.ResponseResult; +import com.cool.store.service.ReceivingBankService; +import io.swagger.annotations.Api; +import io.swagger.annotations.ApiOperation; +import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RequestParam; +import org.springframework.web.bind.annotation.RestController; + +import javax.annotation.Resource; + +/** + * @Author: WangShuo + * @Date: 2025/08/12/14:32 + * @Version 1.0 + * @注释: + */ +@RestController +@Api(value = "mini收款银行配置") +@RequestMapping("/mini/receivingBank") +public class MiniReceivingBankController { + @Resource + private ReceivingBankService receivingBankService; + + @GetMapping("/getByShopId") + @ApiOperation("根据门店id查询收款银行信息") + public ResponseResult getByShopId(@RequestParam("shopId") Long shopId){ + return ResponseResult.success(receivingBankService.getByShopId(shopId)); + } +} diff --git a/coolstore-partner-web/src/main/java/com/cool/store/controller/webc/MiniRenewalApplicationController.java b/coolstore-partner-web/src/main/java/com/cool/store/controller/webc/MiniRenewalApplicationController.java new file mode 100644 index 000000000..26953ece7 --- /dev/null +++ b/coolstore-partner-web/src/main/java/com/cool/store/controller/webc/MiniRenewalApplicationController.java @@ -0,0 +1,48 @@ +package com.cool.store.controller.webc; + +import com.cool.store.context.PartnerUserHolder; +import com.cool.store.request.renewal.RenewalApplicationQueryRequest; +import com.cool.store.request.renewal.RenewalFranchiseeConfirmRequest; +import com.cool.store.response.ResponseResult; +import com.cool.store.service.renewal.RenewalApplicationService; +import com.cool.store.vo.PartnerUserInfoVO; +import com.cool.store.vo.renewal.RenewalApplicationDetailVO; +import com.cool.store.vo.renewal.RenewalApplicationListVO; +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; + +@Api(tags = "mini-续签申请管理") +@RestController +@RequestMapping("/mini/renewal/application") +@RequiredArgsConstructor +@Validated +public class MiniRenewalApplicationController { + + private final RenewalApplicationService renewalApplicationService; + + @ApiOperation("续签申请列表") + @GetMapping("/list") + public ResponseResult> queryRenewalApplicationList(RenewalApplicationQueryRequest request) { + return ResponseResult.success(renewalApplicationService.queryRenewalApplicationList(request)); + } + + @ApiOperation("续签申请详情") + @GetMapping("/detail") + @ApiImplicitParam(name = "renewalId", value = "续签申请ID", required = true, dataType = "Long", paramType = "query") + public ResponseResult getRenewalApplicationDetail(@NotNull(message = "续签申请ID不能为空") Long renewalId) { + return ResponseResult.success(renewalApplicationService.getRenewalApplicationDetail(renewalId)); + } + + @ApiOperation("加盟商确认续签") + @PostMapping("/franchisee/confirm") + public ResponseResult franchiseeConfirm(@RequestBody @Validated RenewalFranchiseeConfirmRequest request) { + return ResponseResult.success(renewalApplicationService.franchiseeConfirm(request, PartnerUserHolder.getUser())); + } +} diff --git a/coolstore-partner-web/src/main/java/com/cool/store/controller/webc/MiniShopAccountController.java b/coolstore-partner-web/src/main/java/com/cool/store/controller/webc/MiniShopAccountController.java index e7982e7fa..585aee70d 100644 --- a/coolstore-partner-web/src/main/java/com/cool/store/controller/webc/MiniShopAccountController.java +++ b/coolstore-partner-web/src/main/java/com/cool/store/controller/webc/MiniShopAccountController.java @@ -5,6 +5,7 @@ import com.cool.store.dto.FoodTokenDTO; import com.cool.store.dto.GetAccessTokenDTO; import com.cool.store.dto.ModifyPasswordDTO; import com.cool.store.dto.ShopAccount.ShopAccountDTO; +import com.cool.store.dto.food.DishesDTO; import com.cool.store.request.GetPasswordDTO; import com.cool.store.response.ResponseResult; import com.cool.store.service.*; @@ -41,6 +42,9 @@ public class MiniShopAccountController { @Resource EnterpriseService enterpriseService; + @Resource + LiePinService LocalLiePinService; + @ApiOperation("根据门店shopId查询平台账号") @GetMapping("/getShopAccountByShopId") @@ -79,6 +83,18 @@ public class MiniShopAccountController { return ResponseResult.success(thirdFoodService.getFoodToken(dto)); } + @ApiOperation("获取已购菜品") + @PostMapping("/getPurchasedDishesList") + public ResponseResult> getPurchasedDishesList(@RequestBody @Validated FoodTokenDTO dto) { + return ResponseResult.success(thirdFoodService.getPurchasedDishesList(dto)); + } + + @ApiOperation("获取我研发的菜品") + @PostMapping("/getMyDesignDishesList") + public ResponseResult> getMyDesignDishesList(@RequestBody @Validated FoodTokenDTO dto) { + return ResponseResult.success(thirdFoodService.getMyDesignDishesList(dto)); + } + @ApiOperation("获取加密子串") @PostMapping("/getEncryptedSubstring") public ResponseResult getEncryptedSubstring(@RequestBody GetPasswordDTO dto) { @@ -91,6 +107,14 @@ public class MiniShopAccountController { return ResponseResult.success(accountService.shopIdToYlsCode(shopId)); } + + + @ApiOperation("获取链接") + @GetMapping("/getPath") + public ResponseResult getPath(@RequestParam(value = "shopCode",required = true) String shopCode) { + return ResponseResult.success(LocalLiePinService.getJumpUrl(shopCode,PartnerUserHolder.getUser().getMobile(),PartnerUserHolder.getUser().getUsername())); + } + @ApiOperation("获取标品登录token") @GetMapping("/getAccessToken") public ResponseResult getAccessToken() { diff --git a/coolstore-partner-web/src/main/java/com/cool/store/controller/webc/MiniShopController.java b/coolstore-partner-web/src/main/java/com/cool/store/controller/webc/MiniShopController.java index 7415360ea..ebcc6554a 100644 --- a/coolstore-partner-web/src/main/java/com/cool/store/controller/webc/MiniShopController.java +++ b/coolstore-partner-web/src/main/java/com/cool/store/controller/webc/MiniShopController.java @@ -97,9 +97,9 @@ public class MiniShopController { @ApiOperation("上传租赁合同") @PostMapping("/uploadRentContract") public ResponseResult uploadRentContract(@RequestBody @Validated AddRentContractRequest request) { - Long lineId = PartnerUserHolder.getUser().getLineId(); - request.setCurLineId(lineId); - return ResponseResult.success(pointService.uploadRentContract(request)); + PartnerUserInfoVO user = PartnerUserHolder.getUser(); + request.setCurLineId(user.getLineId()); + return ResponseResult.success(pointService.uploadRentContract(request,user.getPartnerId(),user.getUsername())); } @ApiOperation("获取租赁合同详情") 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 77527f29f..f82a3a9b6 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 @@ -6,14 +6,19 @@ import com.cool.store.constants.CommonConstants; import com.cool.store.dao.*; import com.cool.store.dao.fees.ShopAllocationInfoDAO; import com.cool.store.dao.fees.WalletPayInfoDAO; +import com.cool.store.dto.BigRegionUserListDTO; import com.cool.store.dto.OpenCityDTO; -import com.cool.store.dto.ocr.InvoiceDTO; import com.cool.store.dto.store.StoreUserPositionDTO; import com.cool.store.dto.store.StoreUserUpdateDTO; import com.cool.store.dto.wallet.OpenBasicInfoDTO; import com.cool.store.entity.*; import com.cool.store.entity.fees.ShopAllocationInfoDO; import com.cool.store.entity.fees.WalletPayInfoDO; +import com.cool.store.enums.UserRoleEnum; +import com.cool.store.enums.ErrorCodeEnum; +import com.cool.store.enums.IDCardSideEnum; +import com.cool.store.enums.WorkflowSubStageEnum; +import com.cool.store.enums.XGJCollectionStatusEnum; import com.cool.store.enums.*; import com.cool.store.enums.point.ShopStageEnum; import com.cool.store.enums.point.ShopSubStageEnum; @@ -24,6 +29,7 @@ import com.cool.store.exception.ServiceException; import com.cool.store.job.XxlJobHandler; import com.cool.store.mapper.HyOpenAreaInfoMapper; import com.cool.store.request.ShopListSuccessOpenRequest; +import com.cool.store.request.StoreCodeRequest; import com.cool.store.request.wallet.CoolOpenBasicInfoRequest; import com.cool.store.request.xfsgFirstOrderListRequest; import com.cool.store.request.xgj.FranchiseFeeCallBackRequest; @@ -31,6 +37,7 @@ import com.cool.store.request.xgj.ReceiptCallBackRequest; import com.cool.store.request.xgj.ReceiptRequest; import com.cool.store.response.MiniShopsResponse; import com.cool.store.response.ResponseResult; +import com.cool.store.response.bigdata.ApiResponse; import com.cool.store.response.caipin.StoreUserResponse; import com.cool.store.response.xfsgFirstOderListResponse; import com.cool.store.service.*; @@ -99,13 +106,14 @@ public class TestController { @Autowired StoreService storeService; @Resource - LinePayDAO linePayDAO; - @Resource - OpenApiService openApiService; - @Resource private CloseStoreAccountService closeStoreAccountService; @Resource private CloseStoreRefundService closeStoreRefundService; + @Resource + LinePayDAO linePayDAO; + @Resource + OpenApiService openApiService; + @Resource private WalletPayInfoDAO walletPayInfoDAO; @Resource @@ -185,7 +193,7 @@ public class TestController { public ResponseResult importCity(MultipartFile file) { ExcelUtil util = new ExcelUtil<>(OpenCityDTO.class); try { - List lineDOList = util.importExcel(file.getInputStream()); + List lineDOList = util.importExcel(file.getInputStream(),0); get(lineDOList); } catch (Exception e) { e.printStackTrace(); @@ -473,6 +481,12 @@ public class TestController { return ResponseResult.success(walletService.openOnlineBankAccount(request)); } + @ApiOperation("大区下指定角色的人 只查直接管辖") + @PostMapping("/getRegionUserList") + public ApiResponse> getUserIdByRoleIdAndRegionId(@RequestBody StoreCodeRequest request) { + return userAuthMappingService.getAllBigRegionSpecialRoleUserList(request.getStoreCode(),UserRoleEnum.DELIVERY_SPECIALIST); + } + @GetMapping("/handleStoreLogLai") public ResponseResult handleStoreLogLai(@RequestParam(value = "flag", required = false) Integer flag , @RequestParam(value = "storeCode", required = false) String storeCode) { 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 134767e67..c9f87241f 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 @@ -24,6 +24,14 @@ import com.cool.store.enums.tp.TpFormStatusEnum; import com.cool.store.enums.close.CloseTypeEnum; import com.cool.store.enums.master.StoreCloseReasonEnum; import com.cool.store.enums.wallet.WalletTradeModuleEnum; +import com.cool.store.enums.point.ShopStatusEnum; +import com.cool.store.enums.point.ShopSubStageEnum; +import com.cool.store.enums.point.ShopSubStageStatusEnum; +import com.cool.store.exception.ServiceException; +import com.cool.store.enums.close.RefundPayStatusEnum; +import com.cool.store.enums.close.XgjRefundPayStatusEnum; +import com.cool.store.enums.master.StoreCloseReasonEnum; +import com.cool.store.enums.wallet.WalletTradeModuleEnum; import com.cool.store.mapper.ApplyLicenseMapper; import com.cool.store.mapper.LineInfoMapper; import com.cool.store.mapper.TrainingExperienceMapper; @@ -34,6 +42,9 @@ import com.cool.store.request.bigdata.LatestOrderDateRequest; import com.cool.store.request.storeopen.StoreDailyNonOpenMissingRequest; 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.request.xfsgFirstOrderListRequest; +import com.cool.store.request.close.store.CloseStoreApplyRequest; import com.cool.store.response.bigdata.LatestOrderDateResponse; import com.cool.store.response.storeopen.StoreDailyNonOpenMissingResponse; import com.cool.store.service.*; @@ -45,6 +56,7 @@ import com.cool.store.service.fees.WalletPayInfoService; import com.cool.store.service.impl.CommonService; import com.cool.store.service.store.PreAllocationRecordService; import com.cool.store.service.tp.TpApplyService; +import com.cool.store.service.renewal.RenewalApplicationService; import com.cool.store.utils.MDCUtils; import com.cool.store.utils.poi.DateUtils; import com.cool.store.utils.poi.StringUtils; @@ -118,6 +130,8 @@ public class XxlJobHandler { @Resource private TallyBookService tallyBookService; @Resource + private RenewalApplicationService renewalApplicationService; + @Resource ShopAccountDAO accountDAO; @Resource ShopAccountDAO shopAccountDAO; @@ -153,17 +167,19 @@ public class XxlJobHandler { @Resource WithdrawApplicationService withdrawApplicationService; @Resource + CloseUpPlatformDAO closeUpPlatformDAO; + @Resource + CloseUpService closeUpService; + @Resource BonusDistributionRuleDAO ruleDAO; @Resource BonusService bonusService; @Resource CloseStoreInfoDAO closeStoreInfoDAO; @Resource + StoreService storeService; + @Resource ThirdStoreOpenDataService thirdStoreOpenDataService; - @Resource - CloseUpPlatformDAO closeUpPlatformDAO; - @Resource - CloseUpService closeUpService; private static final DateTimeFormatter MONTH_FORMATTER = DateTimeFormatter.ofPattern("yyyy-MM"); private static final DateTimeFormatter DATE_FORMATTER = DateTimeFormatter.ofPattern("yyyy-MM-dd"); @@ -910,6 +926,40 @@ public class XxlJobHandler { } } + @XxlJob("autoGenerateRenewalApplication") + public void autoGenerateRenewalApplication() { + MDCUtils.put(CommonConstants.REQUEST_ID, UUID.randomUUID().toString()); + log.info("------start autoGenerateRenewalApplication------"); + try { + renewalApplicationService.autoGenerateRenewalApplications(); + XxlJobHelper.handleSuccess(); + } catch (Exception e) { + log.error("自动生成续签申请失败", e); + XxlJobHelper.handleFail(e.getMessage()); + } + log.info("------end autoGenerateRenewalApplication------"); + } + + /** + * 门店报表 + */ + @XxlJob("saveStoreReport") + public void saveStoreReport() { + MDCUtils.put(CommonConstants.REQUEST_ID, UUID.randomUUID().toString()); + log.info("------start saveStoreReport------"); + + try { + LocalDate now = LocalDate.now(); + log.info("统计月份:{}", now.format(MONTH_FORMATTER)); + storeService.saveStoreReport(now.format(MONTH_FORMATTER)); + log.info("------end saveStoreReport------"); + } catch (Exception e) { + log.error("saveStoreReport执行失败", e); + XxlJobHelper.handleFail("执行失败: " + e.getMessage()); + } + } + + /** * 未开业门店 */ diff --git a/coolstore-partner-web/src/main/resources/application-ab.properties b/coolstore-partner-web/src/main/resources/application-ab.properties index 3bc939ec3..55443750a 100644 --- a/coolstore-partner-web/src/main/resources/application-ab.properties +++ b/coolstore-partner-web/src/main/resources/application-ab.properties @@ -1,6 +1,6 @@ #mysql config -default.datasource.url=jdbc:mysql://dingpushcoolcollege.mysql.rds.aliyuncs.com:3306/coolcollege_intelligent_36?useSSL=false&useUnicode=true&characterEncoding=utf8&allowMultiQueries=true&autoReconnect=true +default.datasource.url=jdbc:mysql://dingpushcoolcollege.mysql.rds.aliyuncs.com:3306/coolcollege_intelligent_74?useSSL=false&useUnicode=true&characterEncoding=utf8&allowMultiQueries=true&autoReconnect=true default.datasource.username=coolstore default.datasource.password=CSCErYcXniNYm7bT @@ -37,6 +37,19 @@ rocketmq.nameSrvAdder=http://MQ_INST_1748142459508127_BZfpFxuJ.cn-hangzhou.mq-in rocketmq.topic=zx_simple_message rocketmq.orderTopic=zx_order_message + +#oss配置 +#oss.host=https://oss-store.coolcollege.cn/ +#oss.accessKeyId=LTAI5tRSXy2MrqaaBJ6gReur +#oss.accessKeySecret=FFsl8d9batprJ0vXr0k4Y8ada40Wm2 +#oss.endpoint=oss-cn-hangzhou.aliyuncs.com +#oss.bucket=cool-store-hsay +#oss.file.dir=partner/171cddee76471740/ +#oss.excelFile.dir=lineExcel/ +##cdn地址 +#cdn.url=https://testhsaypic.coolstore.cn + + #oss配置 #oss.host=https://oss-store.coolcollege.cn/ #oss.accessKeyId=LTAI5tRSXy2MrqaaBJ6gReur @@ -65,15 +78,15 @@ trtc.sdkAppId=1600026212 trtc.secretKey=e036b654c665f649f053a01ff6f5652a826980027be298d4d49949f6e26434a5 trtc.video.callback.secretKey=ur4wq2iFbRI03Q35 -weixin.appId=wx085c84fe42691bf1 -weixin.appSecret=58e89c9ec4ade1d094bbe21836a19ec4 +weixin.appId=wxd77a2761c1911ee1 +weixin.appSecret=fb669b90fcdcdd0e2da21b6e066df83e weixin.index.url=pages/index/index signKey=77fea013c3a6459685b83c21a2fc3411 fixMobileOpenid=HSAY5531DA7 #xxljob配置 #xxljob配置 -xxl.job.admin.addresses = http://10.6.48.226:10001/xxl-job-admin +xxl.job.admin.addresses = https://tjob.coolstore.cn/xxl-job-admin xxl.job.executor.appname = ${spring.application.name} xxl.job.executor.ip = xxl.job.executor.port = 40301 @@ -85,7 +98,7 @@ exhibition.channel.id=52399 recommended.channel.id=52400 cool.app.id=80685 -coolstore.page.domain=https://t2store.coolstore.cn +coolstore.page.domain=https://tstore.coolstore.cn xfsg.url=https://inf-test.xianfengsg.com/InfService @@ -96,8 +109,9 @@ aliyun.sms.private.accessKeyId=LTAI5tDp9nFNSca53jjzepE5 aliyun.sms.private.accessKeySecret=oTWhLJ6t6DeIINFTkAzwlY18ORfyYl mybatis.configuration.variables.enterpriseId=5558ce7a3aa84e3590392fcaa8697ffb -enterprise.dingCorpId=dingef2502a50df74ccc35c2f4657eb6378f +enterprise.dingCorpId=wpayJeDAAAhGIFgUJpJN-zg39JuNbYhg +##qywx.task.notice.url1=https://tstore-api.coolstore.cn/notice?corpId=%s&appType=%s&target=%s qywx.task.notice.url2=https://tstore-h5.coolstore.cn/?corpId=%s&appType=%s#/notice?target=%s¬iceType=zx&corpId=%s&appType=%s&eid=%s #机会点地址 @@ -123,14 +137,14 @@ xgj.api.auth.secret=3ba6e4c5632547b8b2b3acefe08667bb xgj.api.token.url=http://117.139.13.24:29000 #云流水账号 -#yls.api.auth.url=http://scm330-test.366ec.net -#yls.api.auth.username=096d4009072c927c -#yls.api.auth.secret=3b56198f096d4009072c927c96fbc8b6 - -yls.api.auth.url=http://yuanguiwuliu.com +yls.api.auth.url=http://scm330-test.366ec.net yls.api.auth.username=096d4009072c927c yls.api.auth.secret=3b56198f096d4009072c927c96fbc8b6 +#yls.api.auth.url=http://yuanguiwuliu.com +#yls.api.auth.username=096d4009072c927c +#yls.api.auth.secret=3b56198f096d4009072c927c96fbc8b6 + #新掌柜账号 xzg.api.auth.url=http://webapi.zhengxinfood.com @@ -145,6 +159,14 @@ special.user.id=wpayJeDAAAhGIFgUJpJN-zg39JuNbYhg_woayJeDAAA0TC8mkCJeXouw94hYA-D3 ask.bot.url=https://test.auth.wx.askbot.cn +liePin.appId=1921816018922205184 +liePin.secretKey=dns6x4f1p14a36u4t22xvteppmz07ir2 +liePin.aesSecretKey=_nkULTpkBHHZeWgQ +liePin.baseUrl=https://open-xhopen-qa53.qa.xunhou.cn +liePin.tenantId=12833 +liePin.mobile=13345565081 + + hqt.token.url=https://tc.cloud.hecom.cn hqt.token.username=18161486722 hqt.token.grant_type=client_credentials diff --git a/coolstore-partner-web/src/main/resources/application-test.properties b/coolstore-partner-web/src/main/resources/application-test.properties index f8f9a76fa..a036fbe12 100644 --- a/coolstore-partner-web/src/main/resources/application-test.properties +++ b/coolstore-partner-web/src/main/resources/application-test.properties @@ -70,7 +70,7 @@ signKey=77fea013c3a6459685b83c21a2fc3411 fixMobileOpenid=HSAY5531DA7 #xxljob配置 #xxljob配置 -xxl.job.admin.addresses = http://10.6.48.226:10001/xxl-job-admin +xxl.job.admin.addresses = https://tjob.coolstore.cn/xxl-job-admin xxl.job.executor.appname = ${spring.application.name} xxl.job.executor.ip = xxl.job.executor.port = 40301 @@ -121,14 +121,14 @@ xgj.api.auth.secret=3ba6e4c5632547b8b2b3acefe08667bb xgj.api.token.url=http://117.139.13.24:29000 #云流水账号 -#yls.api.auth.url=http://scm330-test.366ec.net -#yls.api.auth.username=096d4009072c927c -#yls.api.auth.secret=3b56198f096d4009072c927c96fbc8b6 - -yls.api.auth.url=http://yuanguiwuliu.com +yls.api.auth.url=http://scm330-test.366ec.net yls.api.auth.username=096d4009072c927c yls.api.auth.secret=3b56198f096d4009072c927c96fbc8b6 +#yls.api.auth.url=http://yuanguiwuliu.com +#yls.api.auth.username=096d4009072c927c +#yls.api.auth.secret=3b56198f096d4009072c927c96fbc8b6 + #新掌柜账号 xzg.api.auth.url=http://webapi.zhengxinfood.com @@ -143,6 +143,14 @@ special.user.id=wpayJeDAAAhGIFgUJpJN-zg39JuNbYhg_woayJeDAAA0TC8mkCJeXouw94hYA-D3 ask.bot.url=https://test.auth.wx.askbot.cn +liePin.appId=1921816018922205184 +liePin.secretKey=dns6x4f1p14a36u4t22xvteppmz07ir2 +liePin.aesSecretKey=_nkULTpkBHHZeWgQ +liePin.baseUrl=https://open-xhopen-qa53.qa.xunhou.cn +liePin.tenantId=12833 +liePin.mobile=13345565081 + + hqt.token.url=https://tc.cloud.hecom.cn hqt.token.username=18161486722 hqt.token.grant_type=client_credentials diff --git a/pom.xml b/pom.xml index e6df40d21..fa82574c2 100644 --- a/pom.xml +++ b/pom.xml @@ -135,7 +135,7 @@ cn.hutool hutool-all - 5.7.22 + 5.8.16 com.aliyun From e667f2b57733414505cb4d73a265399c63df9c1b Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E7=8E=8B=E9=9D=9E=E5=87=A1?= Date: Tue, 12 May 2026 09:05:52 +0000 Subject: [PATCH 2/2] Merge #129 into master from cc_20260512_point_zx MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 新增机会点返回门店列表字段 * cc_20260512_point_zx: (1 commits squashed) - Add OpportunityInfoResponseStore class and update OpportunityInfoPageResponse Signed-off-by: 王非凡 Merged-by: 正新 CR-link: https://codeup.aliyun.com/692ea314dec569489f6f167c/hangzhou/java/custom_zxjp/change/129 --- .../oppty/OpportunityInfoPageResponse.java | 2 +- .../oppty/OpportunityInfoResponseStore.java | 15 +++++++++++++++ 2 files changed, 16 insertions(+), 1 deletion(-) create mode 100644 coolstore-partner-model/src/main/java/com/cool/store/response/oppty/OpportunityInfoResponseStore.java diff --git a/coolstore-partner-model/src/main/java/com/cool/store/response/oppty/OpportunityInfoPageResponse.java b/coolstore-partner-model/src/main/java/com/cool/store/response/oppty/OpportunityInfoPageResponse.java index 072733f9d..66f41f48b 100644 --- a/coolstore-partner-model/src/main/java/com/cool/store/response/oppty/OpportunityInfoPageResponse.java +++ b/coolstore-partner-model/src/main/java/com/cool/store/response/oppty/OpportunityInfoPageResponse.java @@ -19,6 +19,6 @@ public class OpportunityInfoPageResponse { private List pageData; - + private List zhengXinStores; } diff --git a/coolstore-partner-model/src/main/java/com/cool/store/response/oppty/OpportunityInfoResponseStore.java b/coolstore-partner-model/src/main/java/com/cool/store/response/oppty/OpportunityInfoResponseStore.java new file mode 100644 index 000000000..987f518d6 --- /dev/null +++ b/coolstore-partner-model/src/main/java/com/cool/store/response/oppty/OpportunityInfoResponseStore.java @@ -0,0 +1,15 @@ +package com.cool.store.response.oppty; + +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +@Data + +public class OpportunityInfoResponseStore { + @ApiModelProperty("门店编码") + private String storeSn; + @ApiModelProperty("门店坐标,经纬度,隔开") + private String location; + @ApiModelProperty("门店名称") + private String storeName; +}