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 1fad1670a..e4d4b6115 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 @@ -331,4 +331,9 @@ public class RedisConstant { * 每刻退款用户信息 */ public static final String MK_USER_MAPPING = "zxjp_mk_user_mapping"; + + /** + * 建店资料总部订货收款账户信息 + */ + public static final String BUILD_RECEIVE_BANK_INFO = "zxjp_build_receive_bank_info"; } 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 59ecfef84..5b11549ba 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 @@ -369,6 +369,7 @@ public enum ErrorCodeEnum { TP_PENALTY_APPLY_INEFFECTIVE(1810010, "该处罚单未生效无法完成缴费", null), TP_PENALTY_APPLY_NO_NEED_PAY(1810011, "该处罚单无需缴费", null), + CITY_PLANNING_EXISTS(1820001, "同年份同季度同省市已存在规划,不能重复添加", null), ; 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 e4e3f5fee..f3a8ffb51 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 @@ -50,6 +50,7 @@ public enum ShopSubStageStatusEnum { //加盟合同签约 SHOP_SUB_STAGE_STATUS_80(ShopSubStageEnum.SHOP_STAGE_8, 800, "待加盟内勤/大区内勤提交", Boolean.FALSE), SHOP_SUB_STAGE_STATUS_83(ShopSubStageEnum.SHOP_STAGE_8, 830, "待分部内勤审核", Boolean.FALSE), + SHOP_SUB_STAGE_STATUS_83_5(ShopSubStageEnum.SHOP_STAGE_8, 835, "待财务审核", Boolean.FALSE), SHOP_SUB_STAGE_STATUS_84(ShopSubStageEnum.SHOP_STAGE_8, 840, "已签约", Boolean.TRUE), SHOP_SUB_STAGE_STATUS_85(ShopSubStageEnum.SHOP_STAGE_8, 850, "审核失败", Boolean.FALSE), @@ -88,11 +89,15 @@ public enum ShopSubStageStatusEnum { //平台资料提交 SHOP_SUB_STAGE_STATUS_150(ShopSubStageEnum.SHOP_STAGE_15, 1500, "待加盟商提交", Boolean.FALSE), + // 2025-12-26 加盟开店管理流程调整,新增“待运营顾问审核”,删除1520、1530、1540、1550阶段, + SHOP_SUB_STAGE_STATUS_150_5(ShopSubStageEnum.SHOP_STAGE_15, 1505, "待运营顾问审核", Boolean.FALSE), SHOP_SUB_STAGE_STATUS_151(ShopSubStageEnum.SHOP_STAGE_15, 1510, "待圆规物流填写", Boolean.FALSE), + // ----- 以下子阶段删除 ----- SHOP_SUB_STAGE_STATUS_152(ShopSubStageEnum.SHOP_STAGE_15, 1520, "待财务填写",Boolean.FALSE), SHOP_SUB_STAGE_STATUS_153(ShopSubStageEnum.SHOP_STAGE_15, 1530, "待分部总监审批",Boolean.FALSE), SHOP_SUB_STAGE_STATUS_154(ShopSubStageEnum.SHOP_STAGE_15, 1540, "待分管副总裁审批",Boolean.FALSE), SHOP_SUB_STAGE_STATUS_155(ShopSubStageEnum.SHOP_STAGE_15, 1550, "待总裁审批",Boolean.FALSE), + // ----- 以上 ----- SHOP_SUB_STAGE_STATUS_156(ShopSubStageEnum.SHOP_STAGE_15, 1560, "已完成", Boolean.TRUE), //POS diff --git a/coolstore-partner-dao/src/main/java/com/cool/store/dao/ShopStageInfoDAO.java b/coolstore-partner-dao/src/main/java/com/cool/store/dao/ShopStageInfoDAO.java index 9672ac615..a667ffffb 100644 --- a/coolstore-partner-dao/src/main/java/com/cool/store/dao/ShopStageInfoDAO.java +++ b/coolstore-partner-dao/src/main/java/com/cool/store/dao/ShopStageInfoDAO.java @@ -349,8 +349,9 @@ public class ShopStageInfoDAO { public List getSpecialShopStageInfo(List shopIds, Integer shopSubStage, List shopSubStageStatusList, String investmentUserId, - List authRegionIds,Boolean ownShopFlag, DeskRequest deskRequest) { - return shopStageInfoMapper.getSpecialShopStageInfo(shopIds, shopSubStage, shopSubStageStatusList, investmentUserId, authRegionIds,ownShopFlag, deskRequest); + List authRegionIds,Boolean ownShopFlag, DeskRequest deskRequest, + String operationsConsultantUserId) { + return shopStageInfoMapper.getSpecialShopStageInfo(shopIds, shopSubStage, shopSubStageStatusList, investmentUserId, authRegionIds,ownShopFlag, deskRequest, operationsConsultantUserId); } /** diff --git a/coolstore-partner-dao/src/main/java/com/cool/store/dao/SignFranchiseDAO.java b/coolstore-partner-dao/src/main/java/com/cool/store/dao/SignFranchiseDAO.java index c79e7307b..c39b29989 100644 --- a/coolstore-partner-dao/src/main/java/com/cool/store/dao/SignFranchiseDAO.java +++ b/coolstore-partner-dao/src/main/java/com/cool/store/dao/SignFranchiseDAO.java @@ -47,4 +47,8 @@ public class SignFranchiseDAO { } signFranchiseMapper.updateAuditByShopId(auditId,shopId,dto); } + + public void updateAuditByShopId(Long auditId, Long shopId){ + signFranchiseMapper.updateAuditByShopId(auditId, shopId, null); + } } 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 20dab3b50..a4b1bbba8 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 @@ -7,6 +7,7 @@ import com.cool.store.mapper.StoreMapper; import com.cool.store.response.MiniShopsResponse; import com.google.common.collect.Lists; import org.apache.commons.collections4.CollectionUtils; +import org.apache.commons.collections4.MapUtils; import org.apache.commons.lang3.StringUtils; import org.apache.ibatis.annotations.Param; import org.springframework.stereotype.Repository; @@ -18,6 +19,7 @@ import java.time.LocalDate; import java.util.ArrayList; import java.util.Date; import java.util.List; +import java.util.stream.Collectors; @Repository public class StoreDao { @@ -181,4 +183,32 @@ public class StoreDao { public List getNoOrderStore(LocalDate latestDate, List businessTypes, Boolean inBusinessType) { return storeMapper.getNoOrderStore(latestDate, businessTypes, inBusinessType); } + + /** + * 根据行政区划查询门店数量统计 + * @param cityNames 市名称列表 + * @return <年, <季度, <省, <市, 门店数量>>>> + */ + public Map>>> storeNumStatisticsByAd(List years, List cityNames) { + if (CollectionUtils.isEmpty(cityNames)) { + return Collections.emptyMap(); + } + List> maps = storeMapper.storeNumStatisticsByAd(years, cityNames); + return maps.stream() + .collect(Collectors.groupingBy( + v -> MapUtils.getInteger(v, "year"), + Collectors.groupingBy( + v -> MapUtils.getInteger(v, "quarter"), + Collectors.groupingBy( + v -> MapUtils.getString(v, "province"), + Collectors.toMap( + v -> MapUtils.getString(v, "city"), + v -> MapUtils.getInteger(v, "store_num", 0), + (o, n) -> o) + ) + ) + ) + + ); + } } diff --git a/coolstore-partner-dao/src/main/java/com/cool/store/dao/ad/AdDistrictDAO.java b/coolstore-partner-dao/src/main/java/com/cool/store/dao/ad/AdDistrictDAO.java new file mode 100644 index 000000000..b49b8aed6 --- /dev/null +++ b/coolstore-partner-dao/src/main/java/com/cool/store/dao/ad/AdDistrictDAO.java @@ -0,0 +1,49 @@ +package com.cool.store.dao.ad; + +import cn.hutool.core.collection.CollStreamUtil; +import com.cool.store.entity.ad.AdDistrictDO; +import com.cool.store.mapper.ad.AdDistrictMapper; +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.List; +import java.util.Map; + +/** + *

+ * 行政区划DAO + *

+ * + * @author wangff + * @since 2026/1/8 + */ +@Repository +@RequiredArgsConstructor +public class AdDistrictDAO { + private final AdDistrictMapper adDistrictMapper; + + /** + * 根据区划编码查询名称 + */ + public Map getNameByCodes(List codes) { + if (CollectionUtils.isEmpty(codes)) { + return Collections.emptyMap(); + } + Example example = new Example(AdDistrictDO.class); + example.createCriteria().andIn("code", codes); + List list = adDistrictMapper.selectByExample(example); + return CollStreamUtil.toMap(list, AdDistrictDO::getCode, AdDistrictDO::getName); + } + + /** + * 列表查询 + * @param pid 父级id + * @return 行政区划列表 + */ + public List getList(Long pid) { + return adDistrictMapper.select(AdDistrictDO.builder().pid(pid).build()); + } +} diff --git a/coolstore-partner-dao/src/main/java/com/cool/store/dao/plan/CityPlanningDAO.java b/coolstore-partner-dao/src/main/java/com/cool/store/dao/plan/CityPlanningDAO.java new file mode 100644 index 000000000..dc588fa90 --- /dev/null +++ b/coolstore-partner-dao/src/main/java/com/cool/store/dao/plan/CityPlanningDAO.java @@ -0,0 +1,106 @@ +package com.cool.store.dao.plan; + +import com.cool.store.entity.plan.CityPlanningDO; +import com.cool.store.mapper.plan.CityPlanningMapper; +import com.cool.store.request.plan.CityPlanningQueryRequest; +import lombok.RequiredArgsConstructor; +import org.apache.commons.collections4.CollectionUtils; +import org.apache.commons.lang3.StringUtils; +import org.springframework.stereotype.Repository; +import tk.mybatis.mapper.entity.Example; + +import java.util.List; +import java.util.Objects; + +/** + * 城市规划DAO + */ +@Repository +@RequiredArgsConstructor +public class CityPlanningDAO { + private final CityPlanningMapper cityPlanningMapper; + + /** + * 新增 + */ + public boolean insertSelective(CityPlanningDO cityPlanningDO) { + return cityPlanningMapper.insertSelective(cityPlanningDO) > 0; + } + + /** + * 编辑 + */ + public boolean updateSelective(CityPlanningDO cityPlanningDO) { + return cityPlanningMapper.updateByPrimaryKeySelective(cityPlanningDO) > 0; + } + + /** + * 根据id查询 + */ + public CityPlanningDO getById(Long id) { + return cityPlanningMapper.selectByPrimaryKey(id); + } + + /** + * 批量删除 + */ + public boolean deleteByIds(List ids) { + if (CollectionUtils.isEmpty(ids)) { + return false; + } + Example example = new Example(CityPlanningDO.class); + example.createCriteria().andIn("id", ids); + return cityPlanningMapper.deleteByExample(example) > 0; + } + + /** + * 检查同年份同季度同省市是否存在规划 + * @param year 年份 + * @param quarter 季度 + * @param provinceCode 省区划代码 + * @param cityCode 市区划代码 + * @param excludeId 排除的id(用于编辑时排除自身) + * @return 是否存在 + */ + public boolean existsByYearAndQuarterAndRegion(Integer year, Integer quarter, + String provinceCode, String cityCode, Long excludeId) { + Example example = new Example(CityPlanningDO.class); + Example.Criteria criteria = example.createCriteria(); + criteria.andEqualTo("year", year) + .andEqualTo("quarter", quarter) + .andEqualTo("provinceCode", provinceCode) + .andEqualTo("cityCode", cityCode); + if (Objects.nonNull(excludeId)) { + criteria.andNotEqualTo("id", excludeId); + } + return cityPlanningMapper.selectCountByExample(example) > 0; + } + + /** + * 分页查询 + */ + public List queryByCondition(CityPlanningQueryRequest request) { + Example example = new Example(CityPlanningDO.class); + Example.Criteria criteria = example.createCriteria(); + + if (StringUtils.isNotBlank(request.getPlanNo())) { + criteria.andLike("planNo", "%" + request.getPlanNo() + "%"); + } + if (Objects.nonNull(request.getYear())) { + criteria.andEqualTo("year", request.getYear()); + } + if (Objects.nonNull(request.getQuarter())) { + criteria.andEqualTo("quarter", request.getQuarter()); + } + if (StringUtils.isNotBlank(request.getProvinceCode())) { + criteria.andEqualTo("provinceCode", request.getProvinceCode()); + } + if (StringUtils.isNotBlank(request.getCityCode())) { + criteria.andEqualTo("cityCode", request.getCityCode()); + } + + example.setOrderByClause("create_time DESC"); + return cityPlanningMapper.selectByExample(example); + } +} + diff --git a/coolstore-partner-dao/src/main/java/com/cool/store/mapper/ShopStageInfoMapper.java b/coolstore-partner-dao/src/main/java/com/cool/store/mapper/ShopStageInfoMapper.java index 89fbc7a8b..005169e3e 100644 --- a/coolstore-partner-dao/src/main/java/com/cool/store/mapper/ShopStageInfoMapper.java +++ b/coolstore-partner-dao/src/main/java/com/cool/store/mapper/ShopStageInfoMapper.java @@ -150,7 +150,8 @@ public interface ShopStageInfoMapper extends Mapper { @Param("investmentUserId") String investmentUserId, @Param("authRegionIds") List authRegionIds, @Param("ownShopFlag") Boolean ownShopFlag, - @Param("request") DeskRequest deskRequest); + @Param("request") DeskRequest deskRequest, + @Param("operationsConsultantUserId") String operationsConsultantUserId); List getSubStageList(@Param("shopIds") List shopIds,@Param("shopSubStage") Integer shopSubStage); List getSubStages(@Param("shopIds") List shopIds,@Param("shopSubStage") Integer shopSubStage); 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 2234439d5..5d54889ff 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 @@ -11,6 +11,7 @@ import java.math.BigDecimal; import java.time.LocalDate; import java.util.Date; import java.util.List; +import java.util.Map; @Mapper public interface StoreMapper { @@ -110,4 +111,24 @@ public interface StoreMapper { * @return 门店列表 */ List getNoOrderStore(@Param("latestDate") LocalDate latestDate, @Param("businessTypes") List businessTypes, @Param("inBusinessType") Boolean inBusinessType); + + /** + * 根据市统计门店数量 + * @param cityNames 市列表 + */ + List> storeNumStatisticsByAd(@Param("years") List years, + @Param("cityNames") List cityNames); + + /** + * 根据省市统计开店数量 + * @param province 省 + * @param city 市 + * @param openStartTime 开店开始时间 + * @param openEndTime 开店结束时间 + * @return 数量 + */ + Integer totalStoreNumByAd(@Param("province") String province, + @Param("city") String city, + @Param("openStartTime") LocalDate openStartTime, + @Param("openEndTime") LocalDate openEndTime); } diff --git a/coolstore-partner-dao/src/main/java/com/cool/store/mapper/ad/AdDistrictMapper.java b/coolstore-partner-dao/src/main/java/com/cool/store/mapper/ad/AdDistrictMapper.java new file mode 100644 index 000000000..3e9a91e2e --- /dev/null +++ b/coolstore-partner-dao/src/main/java/com/cool/store/mapper/ad/AdDistrictMapper.java @@ -0,0 +1,7 @@ +package com.cool.store.mapper.ad; + +import com.cool.store.entity.ad.AdDistrictDO; +import tk.mybatis.mapper.common.Mapper; + +public interface AdDistrictMapper extends Mapper { +} \ No newline at end of file diff --git a/coolstore-partner-dao/src/main/java/com/cool/store/mapper/plan/CityPlanningMapper.java b/coolstore-partner-dao/src/main/java/com/cool/store/mapper/plan/CityPlanningMapper.java new file mode 100644 index 000000000..7fbf65b21 --- /dev/null +++ b/coolstore-partner-dao/src/main/java/com/cool/store/mapper/plan/CityPlanningMapper.java @@ -0,0 +1,7 @@ +package com.cool.store.mapper.plan; + +import com.cool.store.entity.plan.CityPlanningDO; +import tk.mybatis.mapper.common.Mapper; + +public interface CityPlanningMapper extends Mapper { +} \ No newline at end of file diff --git a/coolstore-partner-dao/src/main/resources/mapper/ShopStageInfoMapper.xml b/coolstore-partner-dao/src/main/resources/mapper/ShopStageInfoMapper.xml index 4b0a1f782..7428b5d65 100644 --- a/coolstore-partner-dao/src/main/resources/mapper/ShopStageInfoMapper.xml +++ b/coolstore-partner-dao/src/main/resources/mapper/ShopStageInfoMapper.xml @@ -389,6 +389,9 @@ #{joinMode} + + AND si.operations_consultant = #{operationsConsultantUserId} + order by a.update_time desc diff --git a/coolstore-partner-dao/src/main/resources/mapper/StoreMapper.xml b/coolstore-partner-dao/src/main/resources/mapper/StoreMapper.xml index 7cefdd7b0..f06b014a6 100644 --- a/coolstore-partner-dao/src/main/resources/mapper/StoreMapper.xml +++ b/coolstore-partner-dao/src/main/resources/mapper/StoreMapper.xml @@ -328,4 +328,31 @@ + + + + diff --git a/coolstore-partner-dao/src/main/resources/mapper/ad/AdDistrictMapper.xml b/coolstore-partner-dao/src/main/resources/mapper/ad/AdDistrictMapper.xml new file mode 100644 index 000000000..3de7d2750 --- /dev/null +++ b/coolstore-partner-dao/src/main/resources/mapper/ad/AdDistrictMapper.xml @@ -0,0 +1,16 @@ + + + + + + + + + + + + + + \ No newline at end of file diff --git a/coolstore-partner-dao/src/main/resources/mapper/plan/CityPlanningMapper.xml b/coolstore-partner-dao/src/main/resources/mapper/plan/CityPlanningMapper.xml new file mode 100644 index 000000000..4221a3455 --- /dev/null +++ b/coolstore-partner-dao/src/main/resources/mapper/plan/CityPlanningMapper.xml @@ -0,0 +1,19 @@ + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/coolstore-partner-model/src/main/java/com/cool/store/entity/ad/AdDistrictDO.java b/coolstore-partner-model/src/main/java/com/cool/store/entity/ad/AdDistrictDO.java new file mode 100644 index 000000000..83d088541 --- /dev/null +++ b/coolstore-partner-model/src/main/java/com/cool/store/entity/ad/AdDistrictDO.java @@ -0,0 +1,55 @@ +package com.cool.store.entity.ad; + +import lombok.AllArgsConstructor; +import lombok.Builder; +import lombok.Data; +import lombok.NoArgsConstructor; + +import java.util.Date; +import javax.persistence.*; + +@Data +@Table(name = "ad_district_${enterpriseId}") +@AllArgsConstructor +@NoArgsConstructor +@Builder +public class AdDistrictDO { + /** + * id + */ + @Id + @GeneratedValue(strategy = GenerationType.IDENTITY) + private Long id; + + /** + * 父级id + */ + private Long pid; + + /** + * 级别 + */ + private Boolean level; + + /** + * 区划代码 + */ + private String code; + + /** + * 名称 + */ + private String name; + + /** + * 创建时间 + */ + @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/plan/CityPlanningDO.java b/coolstore-partner-model/src/main/java/com/cool/store/entity/plan/CityPlanningDO.java new file mode 100644 index 000000000..bb39dafb3 --- /dev/null +++ b/coolstore-partner-model/src/main/java/com/cool/store/entity/plan/CityPlanningDO.java @@ -0,0 +1,68 @@ +package com.cool.store.entity.plan; + +import lombok.Data; + +import java.util.Date; +import javax.persistence.*; + +/** + * 城市规划 + */ +@Data +@Table(name = "zxjp_city_planning") +public class CityPlanningDO { + @Id + @GeneratedValue(strategy = GenerationType.IDENTITY) + private Long id; + + /** + * 规划编码 + */ + @Column(name = "plan_no") + private String planNo; + + /** + * 规划年份 + */ + private Integer year; + + /** + * 季度 + */ + private Integer quarter; + + /** + * 省区划代码 + */ + @Column(name = "province_code") + private String provinceCode; + + /** + * 市区划代码 + */ + @Column(name = "city_code") + private String cityCode; + + /** + * 季度目标 + */ + private Integer target; + + /** + * 创建时间 + */ + @Column(name = "create_time") + private Date createTime; + + /** + * 创建人id + */ + @Column(name = "create_user_id") + private String createUserId; + + /** + * 更新时间 + */ + @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/request/plan/CityPlanningQueryRequest.java b/coolstore-partner-model/src/main/java/com/cool/store/request/plan/CityPlanningQueryRequest.java new file mode 100644 index 000000000..66063b745 --- /dev/null +++ b/coolstore-partner-model/src/main/java/com/cool/store/request/plan/CityPlanningQueryRequest.java @@ -0,0 +1,28 @@ +package com.cool.store.request.plan; + +import com.cool.store.common.PageBasicInfo; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +/** + * 城市规划查询请求 + */ +@Data +public class CityPlanningQueryRequest extends PageBasicInfo { + + @ApiModelProperty("规划id") + private String planNo; + + @ApiModelProperty("规划年份") + private Integer year; + + @ApiModelProperty("规划季度") + private Integer quarter; + + @ApiModelProperty("省区划代码") + private String provinceCode; + + @ApiModelProperty("市区划代码") + private String cityCode; +} + diff --git a/coolstore-partner-model/src/main/java/com/cool/store/request/plan/CityPlanningUpdateRequest.java b/coolstore-partner-model/src/main/java/com/cool/store/request/plan/CityPlanningUpdateRequest.java new file mode 100644 index 000000000..163240c72 --- /dev/null +++ b/coolstore-partner-model/src/main/java/com/cool/store/request/plan/CityPlanningUpdateRequest.java @@ -0,0 +1,40 @@ +package com.cool.store.request.plan; + +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; + +/** + * 城市规划编辑请求 + */ +@Data +public class CityPlanningUpdateRequest { + @ApiModelProperty(value = "规划id") + @NotNull(message = "规划id不能为空", groups = {UpdateGroup.class}) + private Long id; + + @ApiModelProperty(value = "省区划代码") + @NotBlank(message = "省区划代码不能为空", groups = {InsertGroup.class, UpdateGroup.class}) + private String provinceCode; + + @ApiModelProperty(value = "市区划代码") + @NotBlank(message = "市区划代码不能为空", groups = {InsertGroup.class, UpdateGroup.class}) + private String cityCode; + + @ApiModelProperty(value = "年份") + @NotNull(message = "年份不能为空", groups = {InsertGroup.class, UpdateGroup.class}) + private Integer year; + + @ApiModelProperty(value = "季度") + @NotNull(message = "季度不能为空", groups = {InsertGroup.class, UpdateGroup.class}) + private Integer quarter; + + @ApiModelProperty(value = "季度目标") + @NotNull(message = "季度目标不能为空", groups = {InsertGroup.class, UpdateGroup.class}) + private Integer target; +} + diff --git a/coolstore-partner-model/src/main/java/com/cool/store/vo/ad/AdDistrictVO.java b/coolstore-partner-model/src/main/java/com/cool/store/vo/ad/AdDistrictVO.java new file mode 100644 index 000000000..e6251def3 --- /dev/null +++ b/coolstore-partner-model/src/main/java/com/cool/store/vo/ad/AdDistrictVO.java @@ -0,0 +1,27 @@ +package com.cool.store.vo.ad; + +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +/** + *

+ * 行政区划VO + *

+ * + * @author wangff + * @since 2025/10/14 + */ +@Data +public class AdDistrictVO { + @ApiModelProperty("id") + private Long id; + + @ApiModelProperty("行政区划编码") + private String code; + + @ApiModelProperty("名称") + private String name; + + @ApiModelProperty("父级id") + private Long pid; +} diff --git a/coolstore-partner-model/src/main/java/com/cool/store/vo/plan/CityPlanningStatisticsVO.java b/coolstore-partner-model/src/main/java/com/cool/store/vo/plan/CityPlanningStatisticsVO.java new file mode 100644 index 000000000..88351c2d5 --- /dev/null +++ b/coolstore-partner-model/src/main/java/com/cool/store/vo/plan/CityPlanningStatisticsVO.java @@ -0,0 +1,30 @@ +package com.cool.store.vo.plan; + +import io.swagger.annotations.ApiModelProperty; +import lombok.AllArgsConstructor; +import lombok.Data; +import lombok.NoArgsConstructor; + +import java.math.BigDecimal; + +/** + *

+ * 规划进度统计VO + *

+ * + * @author wangff + * @since 2026/1/8 + */ +@Data +@AllArgsConstructor +@NoArgsConstructor +public class CityPlanningStatisticsVO { + @ApiModelProperty("总计季度目标") + private Integer target; + + @ApiModelProperty("总计已完成数量") + private Integer completeNum; + + @ApiModelProperty("总计完成率") + private BigDecimal completeRate; +} diff --git a/coolstore-partner-model/src/main/java/com/cool/store/vo/plan/CityPlanningVO.java b/coolstore-partner-model/src/main/java/com/cool/store/vo/plan/CityPlanningVO.java new file mode 100644 index 000000000..874cce9ce --- /dev/null +++ b/coolstore-partner-model/src/main/java/com/cool/store/vo/plan/CityPlanningVO.java @@ -0,0 +1,50 @@ +package com.cool.store.vo.plan; + +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +import java.math.BigDecimal; + +/** + *

+ * 城市规划VO + *

+ * + * @author wangff + * @since 2026/1/8 + */ +@Data +public class CityPlanningVO { + @ApiModelProperty("id") + private Long id; + + @ApiModelProperty("规划编码") + private String planNo; + + @ApiModelProperty("规划年份") + private Integer year; + + @ApiModelProperty("季度") + private Integer quarter; + + @ApiModelProperty("省区划代码") + private String provinceCode; + + @ApiModelProperty("省") + private String province; + + @ApiModelProperty("市区划代码") + private String cityCode; + + @ApiModelProperty("市") + private String city; + + @ApiModelProperty("季度目标") + private Integer target; + + @ApiModelProperty("已完成数量") + private Integer completeNum; + + @ApiModelProperty("完成率") + private BigDecimal completeRate; +} diff --git a/coolstore-partner-service/src/main/java/com/cool/store/service/BuildInformationService.java b/coolstore-partner-service/src/main/java/com/cool/store/service/BuildInformationService.java index d3b23a8c3..8634fb3a7 100644 --- a/coolstore-partner-service/src/main/java/com/cool/store/service/BuildInformationService.java +++ b/coolstore-partner-service/src/main/java/com/cool/store/service/BuildInformationService.java @@ -1,6 +1,8 @@ package com.cool.store.service; +import com.cool.store.context.LoginUserInfo; +import com.cool.store.request.AuditApproveRequest; import com.cool.store.request.BuildInformationRequest; import com.cool.store.request.BuildSettlerRequest; import com.cool.store.response.BuildInformationResponse; @@ -14,10 +16,16 @@ public interface BuildInformationService { BuildInformationResponse getBuildInformation(Long shopId); - Integer submitOrUpdate(BuildInformationRequest request); + Integer submitOrUpdate(BuildInformationRequest request, String userId, String userName); Integer getJoinType(Long lineId); Boolean updateBuildSettler(BuildSettlerRequest request,String userId); + /** + * 运营顾问审批 + * @param request 审批Request + * @param user 用户 + */ + Boolean operationsConsultantAudit(AuditApproveRequest request, LoginUserInfo user); } 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 7ac2cfc65..78fc3b7ee 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 @@ -16,6 +16,8 @@ public interface OperationLogService { Long addOperationLog(Long shopId, ShopSubStageStatusEnum shopSubStageStatusEnum,String userId, List operationUserList, OperationTypeEnum operationTypeEnum, String remark,OperationStatusEnum operationStatusEnum); + Long addOperationLog(Long shopId, ShopSubStageStatusEnum shopSubStageStatusEnum,String userId, List operationUserList, OperationTypeEnum operationTypeEnum, String remark,OperationStatusEnum operationStatusEnum, int serial); + List getAuditInfo(Long shopId,List shopSubStageList); Boolean batchUpdateProcessed( List operationLogs,Long audit , String userId, String reason); diff --git a/coolstore-partner-service/src/main/java/com/cool/store/service/SignFranchiseService.java b/coolstore-partner-service/src/main/java/com/cool/store/service/SignFranchiseService.java index 69235b683..f300bf8ab 100644 --- a/coolstore-partner-service/src/main/java/com/cool/store/service/SignFranchiseService.java +++ b/coolstore-partner-service/src/main/java/com/cool/store/service/SignFranchiseService.java @@ -32,6 +32,8 @@ public interface SignFranchiseService { */ Boolean auditApprove(AuditApproveRequest request, LoginUserInfo user); + Boolean financeAuditApprove(AuditApproveRequest request, LoginUserInfo user); + /** * 加盟合同退回后重新缴费 * @param shopId diff --git a/coolstore-partner-service/src/main/java/com/cool/store/service/ad/AdDistrictService.java b/coolstore-partner-service/src/main/java/com/cool/store/service/ad/AdDistrictService.java new file mode 100644 index 000000000..3000287ad --- /dev/null +++ b/coolstore-partner-service/src/main/java/com/cool/store/service/ad/AdDistrictService.java @@ -0,0 +1,24 @@ +package com.cool.store.service.ad; + + +import com.cool.store.vo.ad.AdDistrictVO; + +import java.util.List; + +/** + *

+ * 行政区划 服务类 + *

+ * + * @author wangff + * @since 2025/10/14 + */ +public interface AdDistrictService { + + /** + * 行政区划列表 + * @param pid 父级id,默认1 + * @return 行政区划VO列表 + */ + List cityList(Long pid); +} diff --git a/coolstore-partner-service/src/main/java/com/cool/store/service/ad/impl/AdDistrictServiceImpl.java b/coolstore-partner-service/src/main/java/com/cool/store/service/ad/impl/AdDistrictServiceImpl.java new file mode 100644 index 000000000..2c2076cf6 --- /dev/null +++ b/coolstore-partner-service/src/main/java/com/cool/store/service/ad/impl/AdDistrictServiceImpl.java @@ -0,0 +1,35 @@ +package com.cool.store.service.ad.impl; + +import com.cool.store.dao.ad.AdDistrictDAO; +import com.cool.store.entity.ad.AdDistrictDO; +import com.cool.store.service.ad.AdDistrictService; +import com.cool.store.utils.BeanUtil; +import com.cool.store.vo.ad.AdDistrictVO; +import lombok.RequiredArgsConstructor; +import org.springframework.stereotype.Service; + +import java.util.List; +import java.util.Objects; + +/** + *

+ * 行政区划 服务实现类 + *

+ * + * @author wangff + * @since 2025/10/14 + */ +@Service +@RequiredArgsConstructor +public class AdDistrictServiceImpl implements AdDistrictService { + private final AdDistrictDAO adDistrictDAO; + + @Override + public List cityList(Long pid) { + if (Objects.isNull(pid)) { + pid = 1L; + } + List list = adDistrictDAO.getList(pid); + return BeanUtil.toList(list, AdDistrictVO.class); + } +} 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 e8446e4dd..800a67cde 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 @@ -1,8 +1,11 @@ package com.cool.store.service.impl; +import cn.hutool.core.collection.CollStreamUtil; 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.*; import com.cool.store.entity.*; import com.cool.store.enums.*; @@ -10,17 +13,15 @@ import com.cool.store.enums.point.ShopSubStageEnum; import com.cool.store.enums.point.ShopSubStageStatusEnum; import com.cool.store.exception.ServiceException; import com.cool.store.mapper.WarehouseInfoMapper; +import com.cool.store.request.AuditApproveRequest; import com.cool.store.request.BuildInformationRequest; import com.cool.store.request.BuildSettlerRequest; import com.cool.store.response.BuildInformationResponse; -import com.cool.store.service.BuildInformationService; -import com.cool.store.mapper.BuildInformationMapper; -import com.cool.store.service.EnumInfoService; -import com.cool.store.service.PreparationService; -import com.cool.store.service.UserAuthMappingService; +import com.cool.store.service.*; import com.cool.store.utils.RedisConstantUtil; import com.cool.store.utils.RedisUtilPool; import com.cool.store.utils.poi.StringUtils; +import com.cool.store.utils.poi.constant.Constants; import lombok.extern.slf4j.Slf4j; import org.apache.commons.collections4.CollectionUtils; import org.jetbrains.annotations.NotNull; @@ -31,7 +32,9 @@ import org.springframework.transaction.annotation.Transactional; import javax.annotation.Resource; import java.util.*; import java.util.stream.Collectors; -import java.util.stream.Stream; + +import static com.cool.store.enums.point.ShopSubStageStatusEnum.*; +import static com.cool.store.enums.point.ShopSubStageStatusEnum.SHOP_SUB_STAGE_STATUS_150_5; /** * @author EDY @@ -75,11 +78,19 @@ public class BuildInformationServiceImpl implements BuildInformationService { private BigRegionDAO bigRegionDAO; @Resource private AcceptanceInfoDAO acceptanceInfoDAO; + @Resource + private OperationLogService operationLogService; + @Resource + private EnterpriseUserDAO enterpriseUserDAO; + @Resource + private ShopAuditInfoDAO shopAuditInfoDAO; + @Resource + private OperationLogDAO operationLogDAO; @Override @Transactional(rollbackFor = Exception.class) - public Integer submitOrUpdate(BuildInformationRequest request) { + public Integer submitOrUpdate(BuildInformationRequest request, String userId, String userName) { log.info("提交/修改建店资料开始,shopId:{}", JSONObject.toJSONString(request)); String lockKey = redisConstantUtil.submitBuildKey(request.getShopId()); String lockValue = UUID.randomUUID().toString(); @@ -123,21 +134,18 @@ public class BuildInformationServiceImpl implements BuildInformationService { buildInformationDO.setSettlerIdCardFront(qualificationsInfoDO.getFrontOfIdCard()); buildInformationDO.setSettlerIdCardReverse(qualificationsInfoDO.getBackOfIdCard()); } + // 存在运营顾问审批不通过重新编辑的情况,所以这里判断一下是否存在未处理的审批记录,不存在则添加审批记录 + insertOperations(shopInfoDO, userId, userName); if (Objects.isNull(informationDO)) { buildInformationDO.setCreateTime(new Date()); buildInformationDO.setUpdateTime(new Date()); - shopStageInfoDAO.updateShopStageInfo(request.getShopId(), ShopSubStageStatusEnum.SHOP_SUB_STAGE_STATUS_151); + shopStageInfoDAO.updateShopStageInfo(request.getShopId(), ShopSubStageStatusEnum.SHOP_SUB_STAGE_STATUS_150_5); HashMap map = new HashMap<>(); map.put("partnerUsername", lineInfoDO.getUsername()); map.put("partnerMobile", lineInfoDO.getMobile()); map.put("storeName", shopInfoDO.getShopName()); - List logisticsList = userAuthMappingService.getAllUserByRoleEnumAndRegionId(UserRoleEnum.LOGISTICS, shopInfoDO.getRegionId()); - List logistics = new ArrayList<>(); - if (Objects.nonNull(logisticsList)) { - logistics.addAll(logisticsList.stream().map(EnterpriseUserDO::getUserId).collect(Collectors.toList())); - } - commonService.sendQWMessage(logistics, - MessageEnum.MESSAGE_52, + commonService.sendQWMessage(Collections.singletonList(shopInfoDO.getOperationsConsultant()), + MessageEnum.MESSAGE_54, map); return buildInformationDAO.insertSelective(buildInformationDO); } else { @@ -158,6 +166,19 @@ public class BuildInformationServiceImpl implements BuildInformationService { } } platformBuildDAO.batchUpdate(platformBuildDOS); + // 运营顾问审批驳回后,走的编辑逻辑,因此判断是否为加盟商驳回后第一次编辑,推进阶段到运营顾问审批 + ShopStageInfoDO currentStage = shopStageInfoDAO.getByShopIdAndSubStage(shopInfoDO.getId(), ShopSubStageEnum.SHOP_STAGE_15.getShopSubStage()); + if (SHOP_SUB_STAGE_STATUS_150.getShopSubStageStatus().equals(currentStage.getShopSubStageStatus())) { + shopStageInfoDAO.updateShopStageInfo(request.getShopId(), SHOP_SUB_STAGE_STATUS_150_5); + shopStageInfoDAO.updateShopStageInfo(request.getShopId(), ShopSubStageStatusEnum.SHOP_SUB_STAGE_STATUS_150_5); + HashMap map = new HashMap<>(); + map.put("partnerUsername", lineInfoDO.getUsername()); + map.put("partnerMobile", lineInfoDO.getMobile()); + map.put("storeName", shopInfoDO.getShopName()); + commonService.sendQWMessage(Collections.singletonList(shopInfoDO.getOperationsConsultant()), + MessageEnum.MESSAGE_54, + map); + } return buildInformationDAO.updateByShopIdSelective(buildInformationDO); } }else{ @@ -173,6 +194,19 @@ public class BuildInformationServiceImpl implements BuildInformationService { } } + private void insertOperations(ShopInfoDO shopInfoDO, String userId, String userName) { + List operationLogs = operationLogDAO.getBySubStageStatusEnumAndsStatus(shopInfoDO.getId(), SHOP_SUB_STAGE_STATUS_150_5, OperationTypeEnum.OPERATION_TYPE_1.getCode()); + if (CollectionUtils.isEmpty(operationLogs)) { + EnterpriseUserDO operationsConsultant = enterpriseUserDAO.getUserInfoById(shopInfoDO.getOperationsConsultant()); + // 审批记录 + operationLogService.addOperationLog(shopInfoDO.getId(), ShopSubStageStatusEnum.SHOP_SUB_STAGE_STATUS_150, userId, userName, + OperationTypeEnum.OPERATION_TYPE_0, "建店资料提交审批", OperationStatusEnum.PROCESSED); + operationLogService.addOperationLog(shopInfoDO.getId(), ShopSubStageStatusEnum.SHOP_SUB_STAGE_STATUS_150_5, + shopInfoDO.getOperationsConsultant(), Collections.singletonList(operationsConsultant), + OperationTypeEnum.OPERATION_TYPE_1, "建店资料运营顾问审核", OperationStatusEnum.NOT_PROCESSED); + } + } + @Override public BuildInformationResponse getBuildInformation(Long shopId) { BuildInformationResponse response = new BuildInformationResponse(); @@ -221,6 +255,16 @@ public class BuildInformationServiceImpl implements BuildInformationService { } response.setDeclareGoodsType(orderSysInfoDO.getDeclareGoodsType()); } + if (StringUtils.isBlank(response.getReceivingFirmName())) { + String bankInfoStr = redisUtilPool.getString(RedisConstant.BUILD_RECEIVE_BANK_INFO); + if (StringUtils.isNotBlank(bankInfoStr)) { + JSONObject bankInfo = JSONObject.parseObject(bankInfoStr); + response.setReceivingFirmName(bankInfo.getString("receivingFirmName")); + response.setReceivingMsBankAccount(bankInfo.getString("receivingMsBankAccount")); + response.setReceivingMsBankBranch(bankInfo.getString("receivingMsBankBranch")); + response.setBankUnionPayAccount(bankInfo.getString("bankUnionPayAccount")); + } + } if (StringUtils.isBlank(response.getXgjVicePresident())) { List userList = userAuthMappingService.getAllUserByRoleEnumAndRegionId(UserRoleEnum.VICE_PRESIDENT_IN_CHARGE, shopInfo.getRegionId()); if (CollectionUtils.isNotEmpty(userList)) { @@ -370,6 +414,50 @@ public class BuildInformationServiceImpl implements BuildInformationService { return true; } + @Override + @Transactional + public Boolean operationsConsultantAudit(AuditApproveRequest request, LoginUserInfo user) { + ShopInfoDO shopInfo = shopInfoDAO.getShopInfo(request.getShopId()); + if (shopInfo.getShopDecorationAttributes() == null){ + throw new ServiceException(ErrorCodeEnum.SHOP_DECORATION_ATTRIBUTES_IS_NULL); + } + ShopStageInfoDO shopSubStageInfo = shopStageInfoDAO.getShopSubStageInfo(request.getShopId(), ShopSubStageEnum.SHOP_STAGE_15); + if (!shopSubStageInfo.getShopSubStageStatus().equals(SHOP_SUB_STAGE_STATUS_150_5.getShopSubStageStatus())) { + throw new ServiceException(ErrorCodeEnum.WORK_FLOW_STAGE_PASS_ERROR); + } + if (Constants.ZERO_INTEGER.equals(request.getAuditResult())) { + shopStageInfoDAO.updateShopStageInfo(request.getShopId(), SHOP_SUB_STAGE_STATUS_150); + } else { + shopStageInfoDAO.updateShopStageInfo(request.getShopId(), SHOP_SUB_STAGE_STATUS_151); + ShopInfoDO shopInfoDO = shopInfoDAO.getShopInfo(request.getShopId()); + LineInfoDO lineInfoDO = lineInfoDAO.getLineInfo(shopInfoDO.getLineId()); + HashMap map = new HashMap<>(); + map.put("partnerUsername", lineInfoDO.getUsername()); + map.put("partnerMobile", lineInfoDO.getMobile()); + map.put("storeName", shopInfoDO.getShopName()); + List logisticsList = userAuthMappingService.getAllUserByRoleEnumAndRegionId(UserRoleEnum.LOGISTICS, shopInfoDO.getRegionId()); + List logistics = CollStreamUtil.toList(logisticsList, EnterpriseUserDO::getUserId); + commonService.sendQWMessage(logistics, MessageEnum.MESSAGE_52, map); + } + + ShopAuditInfoDO shopAuditInfoDO = new ShopAuditInfoDO(); + shopAuditInfoDO.setShopId(request.getShopId()); + shopAuditInfoDO.setAuditType(AuditTypeEnum.BUILDINFORMATION.getCode()); + shopAuditInfoDO.setSubmittedUserId(user.getUserId()); + shopAuditInfoDO.setSubmittedUserName(user.getName()); + shopAuditInfoDO.setResultType(request.getAuditResult() ^ 1); + if (AuditResultTypeEnum.PASS.getCode().equals(shopAuditInfoDO.getResultType())) { + shopAuditInfoDO.setPassReason(request.getCause()); + } else { + shopAuditInfoDO.setRejectReason(request.getCause()); + } + Long auditId = shopAuditInfoDAO.addAuditInfo(shopAuditInfoDO); + //更新操作记录 + List operationLogs = operationLogDAO.getBySubStageStatusEnumAndsStatus(request.getShopId(), SHOP_SUB_STAGE_STATUS_150_5, OperationTypeEnum.OPERATION_TYPE_1.getCode()); + operationLogService.batchUpdateProcessed(operationLogs, auditId, user.getUserId(), request.getCause()); + return true; + } + } 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 580731188..20c48a63a 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 @@ -309,6 +309,9 @@ public class DeskServiceImpl implements DeskService { if (userRoleIds.contains(UserRoleEnum.BRANCH_OFFICE.getCode()) || userRoleIds.contains(UserRoleEnum.REGION_OFFICE.getCode()) || isAdmin) { subStageStatusList.add(SHOP_SUB_STAGE_STATUS_83.getShopSubStageStatus()); } + if (userRoleIds.contains(UserRoleEnum.FINANCE.getCode())) { + subStageStatusList.add(SHOP_SUB_STAGE_STATUS_83_5.getShopSubStageStatus()); + } PageInfo pageInfo = commonPendingVOPageInfo(deskRequest, user, ShopSubStageEnum.SHOP_STAGE_8, subStageStatusList, Boolean.TRUE); return pageInfo; @@ -515,8 +518,8 @@ public class DeskServiceImpl implements DeskService { public PageInfo buildInformationPendingList(DeskRequest deskRequest, LoginUserInfo user) { List userRoleIds = enterpriseUserRoleMapper.getUserRoleIds(user.getUserId()); if (userRoleIds.contains(UserRoleEnum.SUPERVISION.getCode())) { - return commonPendingVOPageInfo(deskRequest, user, ShopSubStageEnum.SHOP_STAGE_15, - Collections.singletonList(SHOP_SUB_STAGE_STATUS_150.getShopSubStageStatus()), Boolean.FALSE); + return commonPendingVOPageInfoByOperationsConsultant(deskRequest, user.getUserId(), ShopSubStageEnum.SHOP_STAGE_15, + Arrays.asList(SHOP_SUB_STAGE_STATUS_150.getShopSubStageStatus(), SHOP_SUB_STAGE_STATUS_150_5.getShopSubStageStatus()), Boolean.FALSE); } //如果不是财务角色或者即是财务又是自有店财务 则不需要标识 Boolean ownShopFlag = null; @@ -551,7 +554,7 @@ public class DeskServiceImpl implements DeskService { subStageStatusList.add(ShopSubStageStatusEnum.SHOP_SUB_STAGE_STATUS_154.getShopSubStageStatus()); subStageStatusList.add(ShopSubStageStatusEnum.SHOP_SUB_STAGE_STATUS_155.getShopSubStageStatus()); } - return commonPendingVOPage(deskRequest, isAdmin ? null : user, ShopSubStageEnum.SHOP_STAGE_15, subStageStatusList, isAdmin ? Boolean.FALSE : Boolean.TRUE, ownShopFlag); + return commonPendingVOPage(deskRequest, isAdmin ? null : user, ShopSubStageEnum.SHOP_STAGE_15, subStageStatusList, isAdmin ? Boolean.FALSE : Boolean.TRUE, ownShopFlag, null); } @Override @@ -815,7 +818,11 @@ public class DeskServiceImpl implements DeskService { * @return */ private PageInfo commonPendingVOPageInfo(DeskRequest deskRequest, LoginUserInfo user, ShopSubStageEnum shopSubStageEnum, List subStageStatusList, Boolean filterFlag) { - return this.commonPendingVOPage(deskRequest, user, shopSubStageEnum, subStageStatusList, filterFlag, null); + return this.commonPendingVOPage(deskRequest, user, shopSubStageEnum, subStageStatusList, filterFlag, null, null); + } + + private PageInfo commonPendingVOPageInfoByOperationsConsultant(DeskRequest deskRequest, String operationsConsultantUserId, ShopSubStageEnum shopSubStageEnum, List subStageStatusList, Boolean filterFlag) { + return this.commonPendingVOPage(deskRequest, null, shopSubStageEnum, subStageStatusList, filterFlag, null, operationsConsultantUserId); } /** @@ -826,7 +833,8 @@ public class DeskServiceImpl implements DeskService { * @param subStageStatusList * @return */ - private PageInfo commonPendingVOPage(DeskRequest deskRequest, LoginUserInfo user, ShopSubStageEnum shopSubStageEnum, List subStageStatusList, Boolean filterFlag, Boolean ownShopFlag) { + private PageInfo commonPendingVOPage(DeskRequest deskRequest, LoginUserInfo user, ShopSubStageEnum shopSubStageEnum, List subStageStatusList, Boolean filterFlag, Boolean ownShopFlag, + String operationsConsultantUserId) { //user.getJobNumber() List authRegionIds = new ArrayList<>(); if (filterFlag) { @@ -836,7 +844,7 @@ public class DeskServiceImpl implements DeskService { } PageHelper.startPage(deskRequest.getPageNum(), deskRequest.getPageSize()); List specialShopStageInfo = shopStageInfoDAO.getSpecialShopStageInfo(null, shopSubStageEnum.getShopSubStage(), - subStageStatusList, user == null ? null : user.getUserId(), authRegionIds, ownShopFlag, deskRequest); + subStageStatusList, user == null ? null : user.getUserId(), authRegionIds, ownShopFlag, deskRequest, operationsConsultantUserId); PageInfo result = new PageInfo<>(specialShopStageInfo); List shopIds = specialShopStageInfo.stream().map(ShopStageInfoDO::getShopId).collect(Collectors.toList()); List lineIds = specialShopStageInfo.stream().map(ShopStageInfoDO::getLineId).collect(Collectors.toList()); 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 5fe4ac8ad..69f6a2aa1 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 @@ -59,10 +59,16 @@ public class OperationLogServiceImpl implements OperationLogService { @Override @Transactional(rollbackFor = Exception.class) public Long addOperationLog(Long shopId, ShopSubStageStatusEnum shopSubStageStatusEnum, String userId, List operationUserList, OperationTypeEnum operationTypeEnum, String remark, OperationStatusEnum operationStatusEnum) { + return addOperationLog(shopId, shopSubStageStatusEnum, userId, operationUserList, operationTypeEnum, remark, operationStatusEnum, 1); + } + + @Override + @Transactional(rollbackFor = Exception.class) + public Long addOperationLog(Long shopId, ShopSubStageStatusEnum shopSubStageStatusEnum, String userId, List operationUserList, OperationTypeEnum operationTypeEnum, String remark, OperationStatusEnum operationStatusEnum, int serial) { List operationLogDOList = new ArrayList<>(); Calendar calendar = Calendar.getInstance(); calendar.setTime(new Date()); - calendar.add(Calendar.SECOND, 1); + calendar.add(Calendar.SECOND, serial); Date date = calendar.getTime(); if(CollectionUtils.isEmpty(operationUserList)){ operationUserList = new ArrayList<>(); diff --git a/coolstore-partner-service/src/main/java/com/cool/store/service/impl/OrderSysInfoServiceImpl.java b/coolstore-partner-service/src/main/java/com/cool/store/service/impl/OrderSysInfoServiceImpl.java index 793b36dfe..a1c7985ed 100644 --- a/coolstore-partner-service/src/main/java/com/cool/store/service/impl/OrderSysInfoServiceImpl.java +++ b/coolstore-partner-service/src/main/java/com/cool/store/service/impl/OrderSysInfoServiceImpl.java @@ -107,26 +107,9 @@ public class OrderSysInfoServiceImpl implements OrderSysInfoService { if (shopSubStageInfo.getShopSubStageStatus().equals(ShopSubStageStatusEnum.SHOP_SUB_STAGE_STATUS_151.getShopSubStageStatus())) { orderSysInfoDO.setOrderCreateTime(new Date()); orderSysInfoDO.setOrderCreateUser(curUserId); - shopStageInfoDAO.updateShopStageInfo(request.getShopId(), SHOP_SUB_STAGE_STATUS_152); - ShopInfoDO shopInfoDO = shopInfoDAO.getShopInfo(request.getShopId()); - LineInfoDO lineInfoDO = lineInfoDAO.getLineInfo(shopInfoDO.getLineId()); - HashMap map = new HashMap<>(); - map.put("partnerUsername", lineInfoDO.getUsername()); - map.put("partnerMobile", lineInfoDO.getMobile()); - map.put("storeName", shopInfoDO.getShopName()); - //自有店财务 - UserRoleEnum finance = UserRoleEnum.FINANCE; - if (JoinModeEnum.OWN_STORE.getCode()==(shopInfo.getJoinMode())) { - finance = UserRoleEnum.OWN_SHOP_OFFICE; - } - List itList = userAuthMappingService.getAllUserByRoleEnumAndRegionId(finance, shopInfoDO.getRegionId()); - List itUsers = new ArrayList<>(); - if (Objects.nonNull(itList)) { - itUsers.addAll(itList.stream().map(EnterpriseUserDO::getUserId).collect(Collectors.toList())); - } - commonService.sendQWMessage(itUsers, - MessageEnum.MESSAGE_53, - map); + shopStageInfoDAO.updateShopStageInfo(request.getShopId(), SHOP_SUB_STAGE_STATUS_156); + stageCompletion(request.getShopId()); + syncMainSysServer.syncStore(request.getShopId()); return orderSysInfoDAO.updateByShopId(orderSysInfoDO); } else { orderSysInfoDO.setOrderUpdateTime(new Date()); 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 c1ce5ba31..6511048cc 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 @@ -872,6 +872,9 @@ public class ShopServiceImpl implements ShopService { case SHOP_SUB_STAGE_STATUS_83: return getUsersByRolesAndRegion(Arrays.asList(REGION_OFFICE, BRANCH_OFFICE), shopInfo.getRegionId()); + case SHOP_SUB_STAGE_STATUS_83_5: + return getUsersByRolesAndRegion(Collections.singletonList(FINANCE), shopInfo.getRegionId()); + case SHOP_SUB_STAGE_STATUS_85_1: return getUsersByRole(FINANCE); 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 156e3500c..618c74fae 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 @@ -242,6 +242,7 @@ public class SignFranchiseServiceImpl implements SignFranchiseService, AuditResu shopStageInfoDAO.updateShopStageInfo(request.getShopId(), ShopSubStageStatusEnum.SHOP_SUB_STAGE_STATUS_83); //发送通知 List auditFranchiseFeeUsers = userAuthMappingService.getUserIdByRoleEnumAndRegionId(Arrays.asList(BRANCH_OFFICE, REGION_OFFICE), shopInfoDO.getRegionId()); + List financeUsers = userAuthMappingService.getUserIdByRoleEnumAndRegionId(Collections.singletonList(FINANCE), shopInfoDO.getRegionId()); List auditFranchiseFeeUserList = auditFranchiseFeeUsers.stream().distinct().map(EnterpriseUserDO::getUserId).collect(Collectors.toList()); LineInfoDO lineInfo = lineInfoMapper.getByLineId(shopInfoDO.getLineId()); HashMap map = new HashMap<>(); @@ -255,8 +256,10 @@ public class SignFranchiseServiceImpl implements SignFranchiseService, AuditResu OperationTypeEnum.OPERATION_TYPE_0, "加盟签约合同提交", OperationStatusEnum.PROCESSED); operationLogService.addOperationLog(request.getShopId(), ShopSubStageStatusEnum.SHOP_SUB_STAGE_STATUS_83, user.getUserId(), auditFranchiseFeeUsers, - OperationTypeEnum.OPERATION_TYPE_1, "加盟签约合同审批", OperationStatusEnum.NOT_PROCESSED); - + OperationTypeEnum.OPERATION_TYPE_1, "加盟签约合同审批", OperationStatusEnum.NOT_PROCESSED, 1); + operationLogService.addOperationLog(request.getShopId(), ShopSubStageStatusEnum.SHOP_SUB_STAGE_STATUS_83_5, + user.getUserId(), financeUsers, + OperationTypeEnum.OPERATION_TYPE_1, "加盟签约合同财务审批", OperationStatusEnum.NOT_PROCESSED, 2); } else { //修改签约人信息 signFranchiseMapper.updateByPrimaryKeySelective(signFranchiseDO); @@ -318,6 +321,7 @@ public class SignFranchiseServiceImpl implements SignFranchiseService, AuditResu shopStageInfoDAO.updateShopStageInfo(request.getShopId(), ShopSubStageStatusEnum.SHOP_SUB_STAGE_STATUS_83); //发送通知 List userIds = userAuthMappingService.getUserIdByRoleEnumAndRegionId(Arrays.asList(BRANCH_OFFICE, REGION_OFFICE), shopInfoDO.getRegionId()); + List financeUsers = userAuthMappingService.getUserIdByRoleEnumAndRegionId(Collections.singletonList(FINANCE), shopInfoDO.getRegionId()); List auditFranchiseFeeUserList = userIds.stream().distinct().map(EnterpriseUserDO::getUserId).collect(Collectors.toList()); LineInfoDO lineInfo = lineInfoMapper.getByLineId(shopInfoDO.getLineId()); HashMap map = new HashMap<>(); @@ -332,8 +336,10 @@ public class SignFranchiseServiceImpl implements SignFranchiseService, AuditResu OperationTypeEnum.OPERATION_TYPE_0, "加盟签约合同重新提交提交", OperationStatusEnum.PROCESSED); operationLogService.addOperationLog(request.getShopId(), ShopSubStageStatusEnum.SHOP_SUB_STAGE_STATUS_83, user.getUserId(), userIds, - OperationTypeEnum.OPERATION_TYPE_1, "加盟签约合同审批", OperationStatusEnum.NOT_PROCESSED); - + OperationTypeEnum.OPERATION_TYPE_1, "加盟签约合同审批", OperationStatusEnum.NOT_PROCESSED, 1); + operationLogService.addOperationLog(request.getShopId(), ShopSubStageStatusEnum.SHOP_SUB_STAGE_STATUS_83_5, + user.getUserId(), financeUsers, + OperationTypeEnum.OPERATION_TYPE_1, "加盟签约合同财务审批", OperationStatusEnum.NOT_PROCESSED, 2); return Boolean.TRUE; } @@ -447,6 +453,99 @@ public class SignFranchiseServiceImpl implements SignFranchiseService, AuditResu //流水 String lockValue = UUID.randomUUID().toString(); boolean acquired = false; + try { + //10s过期 + acquired = redisUtilPool.setNxExpire(lockKey, lockValue, CommonConstants.TEN_SECONDS); + if (Boolean.TRUE.equals(acquired)) { + ShopInfoDO shopInfoDO = shopInfoMapper.selectByPrimaryKey(shopId); + ShopAuditInfoDO shopAuditInfoDO = new ShopAuditInfoDO(); + shopAuditInfoDO.setShopId(shopId); + shopAuditInfoDO.setAuditType(AuditTypeEnum.SIGN_FRANCHISE.getCode()); + shopAuditInfoDO.setSubmittedUserId(user.getUserId()); + shopAuditInfoDO.setSubmittedUserName(user.getName()); + //驳回 + if (Constants.ZERO_INTEGER.equals(request.getAuditResult())) { + auditReject(request, shopAuditInfoDO, shopInfoDO); + } else if (Constants.ONE_INTEGER.equals(request.getAuditResult())) { + shopAuditInfoDO.setResultType(Constants.ZERO_INTEGER); + shopAuditInfoDO.setPassReason(request.getCause()); + //更新状态为加盟商 + LineInfoDO lineInfoDO = lineInfoMapper.getByLineId(shopInfoDO.getLineId()); + shopStageInfoDAO.updateShopStageInfo(shopId, SHOP_SUB_STAGE_STATUS_83_5); + + Boolean sendNotice = Boolean.TRUE; + if (sendNotice) { + HashMap map = new HashMap<>(); + map.put("partnerUsername", lineInfoDO.getUsername()); + map.put("partnerMobile", lineInfoDO.getMobile()); + map.put("storeName", shopInfoDO.getShopName()); + List userDOList = userAuthMappingService.getAllUserByRoleEnumAndRegionId(UserRoleEnum.FINANCE, shopInfoDO.getRegionId()); + List finances = new ArrayList<>(); + if (Objects.nonNull(userDOList)) { + finances.addAll(userDOList.stream().map(EnterpriseUserDO::getUserId).collect(Collectors.toList())); + } + commonService.sendQWMessage(finances, + MessageEnum.MESSAGE_19_1, + map); + } + } + shopAuditInfoMapper.insertSelective(shopAuditInfoDO); + Long auditId = shopAuditInfoDO.getId(); + signFranchiseDAO.updateAuditByShopId(auditId, shopId); + //审批记录表记录 + List operationLogs = operationLogDAO.getBySubStageStatusEnumAndsStatus(request.getShopId(), ShopSubStageStatusEnum.SHOP_SUB_STAGE_STATUS_83, OperationTypeEnum.OPERATION_TYPE_1.getCode()); + operationLogService.batchUpdateProcessed(operationLogs, auditId, user.getUserId(), request.getCause()); + return true; + } 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); + } + } + } + } + + /** + * 分部内勤/财务审批拒绝 + */ + private void auditReject(AuditApproveRequest request, ShopAuditInfoDO shopAuditInfoDO, ShopInfoDO shopInfoDO) { + shopAuditInfoDO.setResultType(Constants.ONE_INTEGER); + shopAuditInfoDO.setRejectReason(request.getCause()); + Map requestMap = new HashMap<>(); + LineInfoDO lineInfo = lineInfoMapper.getByLineId(shopInfoDO.getLineId()); + shopStageInfoDAO.updateShopStageInfo(request.getShopId(), ShopSubStageStatusEnum.SHOP_SUB_STAGE_STATUS_85); + Set auditFranchiseFeeUsers = new HashSet<>(); + List branchUser = userAuthMappingService.getAllUserByRoleEnumAndRegionId(UserRoleEnum.JOIN_OFFICE, shopInfoDO.getRegionId()); + if (Objects.nonNull(branchUser)) { + Set branchUserIds = branchUser.stream().map(EnterpriseUserDO::getUserId).collect(Collectors.toSet()); + auditFranchiseFeeUsers.addAll(branchUserIds); + } + List regionUser = userAuthMappingService.getAllUserByRoleEnumAndRegionId(REGION_OFFICE, shopInfoDO.getRegionId()); + if (Objects.nonNull(regionUser)) { + Set regionUserIds = regionUser.stream().map(EnterpriseUserDO::getUserId).collect(Collectors.toSet()); + auditFranchiseFeeUsers.addAll(regionUserIds); + } + requestMap.put("storeName", shopInfoDO.getShopName()); + requestMap.put("partnerName", lineInfo.getUsername()); + requestMap.put("partnerMobile", lineInfo.getMobile()); + requestMap.put("lineId", String.valueOf(lineInfo.getId())); + requestMap.put("shopId", String.valueOf(shopInfoDO.getId())); + commonService.sendMessage(new ArrayList<>(auditFranchiseFeeUsers), MessageEnum.MESSAGE_20, requestMap); + } + + @Override + @Transactional + public Boolean financeAuditApprove(AuditApproveRequest request, LoginUserInfo user) { + log.info("SignFranchiseServiceImpl financeAuditApprove request:{}", JSONObject.toJSONString(request)); + Long shopId = request.getShopId(); + String lockKey = "financeAuditApprove:" + request.getShopId(); + //流水 + String lockValue = UUID.randomUUID().toString(); + boolean acquired = false; try { //10s过期 acquired = redisUtilPool.setNxExpire(lockKey, lockValue, CommonConstants.TEN_SECONDS); @@ -460,30 +559,9 @@ public class SignFranchiseServiceImpl implements SignFranchiseService, AuditResu //驳回 ContractCallbackDTO contractCallbackDTO = null; if (Constants.ZERO_INTEGER.equals(request.getAuditResult())) { - shopAuditInfoDO.setResultType(Constants.ONE_INTEGER); - shopAuditInfoDO.setRejectReason(request.getCause()); - Map requestMap = new HashMap<>(); - LineInfoDO lineInfo = lineInfoMapper.getByLineId(shopInfoDO.getLineId()); - shopStageInfoDAO.updateShopStageInfo(shopId, ShopSubStageStatusEnum.SHOP_SUB_STAGE_STATUS_85); - Set auditFranchiseFeeUsers = new HashSet<>(); - List branchUser = userAuthMappingService.getAllUserByRoleEnumAndRegionId(UserRoleEnum.JOIN_OFFICE, shopInfoDO.getRegionId()); - if (Objects.nonNull(branchUser)) { - Set branchUserIds = branchUser.stream().map(EnterpriseUserDO::getUserId).collect(Collectors.toSet()); - auditFranchiseFeeUsers.addAll(branchUserIds); - } - List regionUser = userAuthMappingService.getAllUserByRoleEnumAndRegionId(REGION_OFFICE, shopInfoDO.getRegionId()); - if (Objects.nonNull(regionUser)) { - Set regionUserIds = regionUser.stream().map(EnterpriseUserDO::getUserId).collect(Collectors.toSet()); - auditFranchiseFeeUsers.addAll(regionUserIds); - } - requestMap.put("storeName", shopInfoDO.getShopName()); - requestMap.put("partnerName", lineInfo.getUsername()); - requestMap.put("partnerMobile", lineInfo.getMobile()); - requestMap.put("lineId", String.valueOf(lineInfo.getId())); - requestMap.put("shopId", String.valueOf(shopInfoDO.getId())); - commonService.sendMessage(new ArrayList<>(auditFranchiseFeeUsers), MessageEnum.MESSAGE_20, requestMap); + auditReject(request, shopAuditInfoDO, shopInfoDO); } else if (Constants.ONE_INTEGER.equals(request.getAuditResult())) { - log.info("合同审核,装修属性:{},加盟模式:{}",ShopDecorationAttributesEnum.getDescByCode(shopInfoDO.getShopDecorationAttributes()), + log.info("合同审核,装修属性:{},加盟模式:{}", ShopDecorationAttributesEnum.getDescByCode(shopInfoDO.getShopDecorationAttributes()), JoinModeEnum.getByCode(shopInfoDO.getJoinMode())); if (shopInfoDO.getShopDecorationAttributes().equals(ShopDecorationAttributesEnum.OLD_NEW_OPEN.getCode())) { //老店新开时装修与开业直接完成 @@ -491,7 +569,7 @@ public class SignFranchiseServiceImpl implements SignFranchiseService, AuditResu SHOP_SUB_STAGE_STATUS_863, SHOP_SUB_STAGE_STATUS_91, SHOP_SUB_STAGE_STATUS_112, SHOP_SUB_STAGE_STATUS_123, SHOP_SUB_STAGE_STATUS_143, SHOP_SUB_STAGE_STATUS_276 )); - }else{ + } else { //,加盟公司自有店->加盟公司建店 不推送数据 再crm中完成 //v2.0.0 先确认装修团队 TeamAreaMappingDO city = teamAreaMappingDAO.getByCityId(shopInfoDO.getWantShopAreaId()); @@ -512,7 +590,7 @@ public class SignFranchiseServiceImpl implements SignFranchiseService, AuditResu shopDecorationAssignDO.setShopId(shopId); shopDecorationAssignDAO.insert(shopDecorationAssignDO); //新增一个延迟队列 四个小时之后确定是否手动分配 没有手动分配 直接自动分配 红圈通推送和下一个流程开始改为分配团队之后 触发 - simpleMessageService.send(String.valueOf(shopDecorationAssignDO.getId()), RocketMqTagEnum.DELAY_SHOP_DECORATION_ASSIGN,System.currentTimeMillis() + 4*60*60 * 1000); + simpleMessageService.send(String.valueOf(shopDecorationAssignDO.getId()), RocketMqTagEnum.DELAY_SHOP_DECORATION_ASSIGN, System.currentTimeMillis() + 4 * 60 * 60 * 1000); } shopAuditInfoDO.setResultType(Constants.ZERO_INTEGER); shopAuditInfoDO.setPassReason(request.getCause()); @@ -523,15 +601,15 @@ public class SignFranchiseServiceImpl implements SignFranchiseService, AuditResu lineInfoMapper.insertOrUpdate(lineInfoDO); shopStageInfoDAO.updateShopStageInfo(shopId, SHOP_SUB_STAGE_STATUS_84); //初始化数据 如果是正新鸡排 需要手动分配 其他品牌直接开始 且将招商经理给到运营经理 - if (FranchiseBrandEnum.ZXJP.getCode()==Integer.valueOf(shopInfoDO.getFranchiseBrand())){ - log.info("zxjp_assign shopId:{}",shopId); + if (FranchiseBrandEnum.ZXJP.getCode() == Integer.valueOf(shopInfoDO.getFranchiseBrand())) { + log.info("zxjp_assign shopId:{}", shopId); //新增分配信息 OperationsConsultantAssignDO operationsConsultantAssignDO = new OperationsConsultantAssignDO(); operationsConsultantAssignDO.setShopId(shopId); operationsConsultantAssignDO.setAssignStatus(0); operationsConsultantAssignDO.setRegionId(shopInfoDO.getRegionId()); operationsConsultantAssignDAO.addOperationsConsultantAssign(operationsConsultantAssignDO); - }else { + } else { //其他品牌直接开始 且将招商经理给到运营经理 shopInfoDO.setOperationsConsultant(shopInfoDO.getInvestmentManager()); shopInfoDAO.updateShopInfo(shopInfoDO); @@ -548,15 +626,6 @@ public class SignFranchiseServiceImpl implements SignFranchiseService, AuditResu map.put("partnerUsername", lineInfoDO.getUsername()); map.put("partnerMobile", lineInfoDO.getMobile()); map.put("storeName", shopInfoDO.getShopName()); - List userDOList = userAuthMappingService.getAllUserByRoleEnumAndRegionId(UserRoleEnum.FINANCE, shopInfoDO.getRegionId()); - List finances = new ArrayList<>(); - if (Objects.nonNull(userDOList)) { - finances.addAll(userDOList.stream().map(EnterpriseUserDO::getUserId).collect(Collectors.toList())); - } -// List liGuiNeiQinList = enterpriseUserRoleDao.selectUserIdsByRoleIdList(Arrays.asList(UserRoleEnum.CONSTRUCTION_CUSTOMER.getCode())); -// commonService.sendQWMessage(liGuiNeiQinList, -// MessageEnum.MESSAGE_57, -// map); commonService.sendQWMessage(Collections.singletonList(shopInfoDO.getInvestmentManager()), MessageEnum.MESSAGE_26, map); @@ -564,13 +633,13 @@ public class SignFranchiseServiceImpl implements SignFranchiseService, AuditResu } shopAuditInfoMapper.insertSelective(shopAuditInfoDO); Long auditId = shopAuditInfoDO.getId(); - if (contractCallbackDTO!=null&&StringUtils.isNotEmpty(contractCallbackDTO.getStoreCode())){ + if (contractCallbackDTO != null && StringUtils.isNotEmpty(contractCallbackDTO.getStoreCode())) { shopInfoDO.setShopCode(contractCallbackDTO.getStoreCode()); shopInfoMapper.updateByPrimaryKeySelective(shopInfoDO); } - signFranchiseDAO.updateAuditByShopId(auditId, shopId,contractCallbackDTO); + signFranchiseDAO.updateAuditByShopId(auditId, shopId, contractCallbackDTO); //审批记录表记录 - List operationLogs = operationLogDAO.getBySubStageStatusEnumAndsStatus(request.getShopId(), ShopSubStageStatusEnum.SHOP_SUB_STAGE_STATUS_83, OperationTypeEnum.OPERATION_TYPE_1.getCode()); + List operationLogs = operationLogDAO.getBySubStageStatusEnumAndsStatus(request.getShopId(), ShopSubStageStatusEnum.SHOP_SUB_STAGE_STATUS_83_5, OperationTypeEnum.OPERATION_TYPE_1.getCode()); operationLogService.batchUpdateProcessed(operationLogs, auditId, user.getUserId(), request.getCause()); return true; } else { diff --git a/coolstore-partner-service/src/main/java/com/cool/store/service/plan/CityPlanningService.java b/coolstore-partner-service/src/main/java/com/cool/store/service/plan/CityPlanningService.java new file mode 100644 index 000000000..9beae6d36 --- /dev/null +++ b/coolstore-partner-service/src/main/java/com/cool/store/service/plan/CityPlanningService.java @@ -0,0 +1,58 @@ +package com.cool.store.service.plan; + +import com.cool.store.request.plan.CityPlanningUpdateRequest; +import com.cool.store.request.plan.CityPlanningQueryRequest; +import com.cool.store.vo.plan.CityPlanningStatisticsVO; +import com.cool.store.vo.plan.CityPlanningVO; +import com.github.pagehelper.PageInfo; + +import java.util.List; + +/** + * 城市规划服务接口 + */ +public interface CityPlanningService { + + /** + * 新增城市规划 + * @param request 新增请求 + * @return 是否成功 + */ + Boolean add(CityPlanningUpdateRequest request); + + /** + * 编辑城市规划 + * @param request 编辑请求 + * @return 是否成功 + */ + Boolean update(CityPlanningUpdateRequest request); + + /** + * 分页查询 + * @param request 查询请求 + * @return 分页结果 + */ + PageInfo queryPage(CityPlanningQueryRequest request); + + /** + * 批量删除 + * @param ids id列表 + * @return 是否成功 + */ + Boolean deleteByIds(List ids); + + /** + * 规划进度 + * @param request 查询请求 + * @return 分页结果 + */ + PageInfo cityPlanningSchedule(CityPlanningQueryRequest request); + + /** + * 规划进度总计 + * @param request 查询请求 + * @return 规划进度统计VO + */ + CityPlanningStatisticsVO cityPlanningStatistics(CityPlanningQueryRequest request); +} + diff --git a/coolstore-partner-service/src/main/java/com/cool/store/service/plan/impl/CityPlanningServiceImpl.java b/coolstore-partner-service/src/main/java/com/cool/store/service/plan/impl/CityPlanningServiceImpl.java new file mode 100644 index 000000000..647c2a457 --- /dev/null +++ b/coolstore-partner-service/src/main/java/com/cool/store/service/plan/impl/CityPlanningServiceImpl.java @@ -0,0 +1,161 @@ +package com.cool.store.service.plan.impl; + +import cn.hutool.core.collection.CollStreamUtil; +import com.cool.store.context.CurrentUserHolder; +import com.cool.store.dao.StoreDao; +import com.cool.store.dao.ad.AdDistrictDAO; +import com.cool.store.dao.plan.CityPlanningDAO; +import com.cool.store.entity.plan.CityPlanningDO; +import com.cool.store.enums.ErrorCodeEnum; +import com.cool.store.exception.ServiceException; +import com.cool.store.request.plan.CityPlanningUpdateRequest; +import com.cool.store.request.plan.CityPlanningQueryRequest; +import com.cool.store.service.plan.CityPlanningService; +import com.cool.store.utils.BeanUtil; +import com.cool.store.vo.plan.CityPlanningStatisticsVO; +import com.cool.store.vo.plan.CityPlanningVO; +import com.github.pagehelper.PageHelper; +import com.github.pagehelper.PageInfo; +import lombok.RequiredArgsConstructor; +import org.springframework.stereotype.Service; + +import java.math.BigDecimal; +import java.math.RoundingMode; +import java.time.format.DateTimeFormatter; +import java.util.*; +import java.util.stream.Collectors; +import java.util.stream.Stream; + +/** + * 城市规划服务实现类 + */ +@Service +@RequiredArgsConstructor +public class CityPlanningServiceImpl implements CityPlanningService { + private final CityPlanningDAO cityPlanningDAO; + private final AdDistrictDAO adDistrictDAO; + private final StoreDao storeDao; + + private final static DateTimeFormatter dtf = DateTimeFormatter.ofPattern("yyMMddHHmmssSSS"); + + @Override + public Boolean add(CityPlanningUpdateRequest request) { + // 校验同年份同季度同省市不能存在2个规划 + if (cityPlanningDAO.existsByYearAndQuarterAndRegion( + request.getYear(), request.getQuarter(), + request.getProvinceCode(), request.getCityCode(), null)) { + throw new ServiceException(ErrorCodeEnum.CITY_PLANNING_EXISTS); + } + + CityPlanningDO cityPlanningDO = BeanUtil.toBean(request, CityPlanningDO.class); + cityPlanningDO.setPlanNo(generatePlanNo(request)); + cityPlanningDO.setCreateUserId(CurrentUserHolder.getUserId()); + return cityPlanningDAO.insertSelective(cityPlanningDO); + } + + @Override + public Boolean update(CityPlanningUpdateRequest request) { + // 先查询是否存在 + CityPlanningDO existing = cityPlanningDAO.getById(request.getId()); + if (existing == null) { + throw new ServiceException("规划不存在"); + } + + // 校验同年份同季度同省市不能存在2个规划(排除自身) + if (cityPlanningDAO.existsByYearAndQuarterAndRegion( + request.getYear(), request.getQuarter(), + request.getProvinceCode(), request.getCityCode(), request.getId())) { + throw new ServiceException("同年份同季度同省市已存在其他规划,不能修改"); + } + + CityPlanningDO cityPlanningDO = BeanUtil.toBean(request, CityPlanningDO.class); + return cityPlanningDAO.updateSelective(cityPlanningDO); + } + + @Override + public PageInfo queryPage(CityPlanningQueryRequest request) { + PageHelper.startPage(request.getPageNum(), request.getPageSize()); + List list = cityPlanningDAO.queryByCondition(request); + PageInfo page = new PageInfo<>(list); + PageInfo result = BeanUtil.toPage(page, CityPlanningVO.class); + List adCodes = list.stream() + .flatMap(v -> Stream.of(v.getProvinceCode(), v.getCityCode())) + .distinct() + .collect(Collectors.toList()); + Map adMap = adDistrictDAO.getNameByCodes(adCodes); + result.getList().forEach(v -> { + v.setProvince(adMap.get(v.getProvinceCode())); + v.setCity(adMap.get(v.getCityCode())); + }); + return result; + } + + @Override + public Boolean deleteByIds(List ids) { + return cityPlanningDAO.deleteByIds(ids); + } + + @Override + public PageInfo cityPlanningSchedule(CityPlanningQueryRequest request) { + PageHelper.startPage(request.getPageNum(), request.getPageSize()); + List list = cityPlanningDAO.queryByCondition(request); + PageInfo page = new PageInfo<>(list); + PageInfo result = BeanUtil.toPage(page, CityPlanningVO.class); + List adCodes = list.stream() + .flatMap(v -> Stream.of(v.getProvinceCode(), v.getCityCode())) + .distinct() + .collect(Collectors.toList()); + Map adMap = adDistrictDAO.getNameByCodes(adCodes); + Set years = CollStreamUtil.toSet(list, CityPlanningDO::getYear); + Map>>> storeNumMap = storeDao.storeNumStatisticsByAd(new ArrayList<>(years), new ArrayList<>(adMap.values())); + result.getList().forEach(v -> { + v.setProvince(adMap.get(v.getProvinceCode())); + v.setCity(adMap.get(v.getCityCode())); + Integer completeNum = storeNumMap.getOrDefault(v.getYear(), Collections.emptyMap()) + .getOrDefault(v.getQuarter(), Collections.emptyMap()) + .getOrDefault(v.getProvince(), Collections.emptyMap()) + .getOrDefault(v.getCity(), 0); + v.setCompleteNum(completeNum); + BigDecimal rate = v.getTarget() != 0 ? BigDecimal.valueOf(completeNum) + .multiply(BigDecimal.valueOf(100)) + .divide(BigDecimal.valueOf(v.getTarget()), 1, RoundingMode.HALF_UP) : BigDecimal.ZERO; + v.setCompleteRate(rate); + }); + return result; + } + + @Override + public CityPlanningStatisticsVO cityPlanningStatistics(CityPlanningQueryRequest request) { + List list = cityPlanningDAO.queryByCondition(request); + List adCodes = list.stream() + .flatMap(v -> Stream.of(v.getProvinceCode(), v.getCityCode())) + .distinct() + .collect(Collectors.toList()); + Map adMap = adDistrictDAO.getNameByCodes(adCodes); + Set years = CollStreamUtil.toSet(list, CityPlanningDO::getYear); + Map>>> storeNumMap = storeDao.storeNumStatisticsByAd(new ArrayList<>(years), new ArrayList<>(adMap.values())); + int completeNum = 0, totalTarget = 0; + for (CityPlanningDO v : list) { + String province = adMap.get(v.getProvinceCode()); + String city = adMap.get(v.getCityCode()); + completeNum += storeNumMap.getOrDefault(v.getYear(), Collections.emptyMap()) + .getOrDefault(v.getQuarter(), Collections.emptyMap()) + .getOrDefault(province, Collections.emptyMap()) + .getOrDefault(city, 0); + totalTarget += v.getTarget(); + } + BigDecimal rate = totalTarget != 0 ? BigDecimal.valueOf(completeNum) + .multiply(BigDecimal.valueOf(100)) + .divide(BigDecimal.valueOf(totalTarget), 1, RoundingMode.HALF_UP) : BigDecimal.ZERO; + return new CityPlanningStatisticsVO(totalTarget, completeNum, rate); + } + + /** + * 生成规划编码 + * 格式:CP + 年份 + 季度 + 序号 + */ + private String generatePlanNo(CityPlanningUpdateRequest request) { + return "GH" + request.getYear() + request.getQuarter() + request.getCityCode() + ((int) (Math.random() * 900) + 100); + } +} + diff --git a/coolstore-partner-web/src/main/java/com/cool/store/controller/webb/AdDistrictController.java b/coolstore-partner-web/src/main/java/com/cool/store/controller/webb/AdDistrictController.java new file mode 100644 index 000000000..025f1f214 --- /dev/null +++ b/coolstore-partner-web/src/main/java/com/cool/store/controller/webb/AdDistrictController.java @@ -0,0 +1,36 @@ +package com.cool.store.controller.webb; + +import com.cool.store.response.ResponseResult; +import com.cool.store.service.ad.AdDistrictService; +import com.cool.store.vo.ad.AdDistrictVO; +import io.swagger.annotations.Api; +import io.swagger.annotations.ApiOperation; +import lombok.RequiredArgsConstructor; +import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RestController; + +import java.util.List; + +/** + *

+ * 行政区划 前端控制器 + *

+ * + * @author wangff + * @since 2025/10/14 + */ +@Api(tags = "行政区划") +@RestController +@RequestMapping("/pc/ad/district") +@RequiredArgsConstructor +public class AdDistrictController { + private final AdDistrictService adDistrictService; + + @ApiOperation("行政区划列表") + @GetMapping("/list") + public ResponseResult> cityList(Long pid) { + return ResponseResult.success(adDistrictService.cityList(pid)); + } + +} diff --git a/coolstore-partner-web/src/main/java/com/cool/store/controller/webb/CityPlanningController.java b/coolstore-partner-web/src/main/java/com/cool/store/controller/webb/CityPlanningController.java new file mode 100644 index 000000000..943da79ae --- /dev/null +++ b/coolstore-partner-web/src/main/java/com/cool/store/controller/webb/CityPlanningController.java @@ -0,0 +1,66 @@ +package com.cool.store.controller.webb; + +import com.cool.store.common.InsertGroup; +import com.cool.store.common.UpdateGroup; +import com.cool.store.request.plan.CityPlanningUpdateRequest; +import com.cool.store.request.plan.CityPlanningQueryRequest; +import com.cool.store.response.ResponseResult; +import com.cool.store.service.plan.CityPlanningService; +import com.cool.store.vo.plan.CityPlanningStatisticsVO; +import com.cool.store.vo.plan.CityPlanningVO; +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; + +/** + * 城市规划控制器 + */ +@Api(tags = "城市规划") +@RestController +@RequestMapping("/pc/cityPlanning") +@RequiredArgsConstructor +public class CityPlanningController { + private final CityPlanningService cityPlanningService; + + @ApiOperation("新增城市规划") + @PostMapping("/add") + public ResponseResult add(@RequestBody @Validated(InsertGroup.class) CityPlanningUpdateRequest request) { + return ResponseResult.success(cityPlanningService.add(request)); + } + + @ApiOperation("编辑城市规划") + @PostMapping("/update") + public ResponseResult update(@RequestBody @Validated(UpdateGroup.class) CityPlanningUpdateRequest request) { + return ResponseResult.success(cityPlanningService.update(request)); + } + + @ApiOperation("分页查询城市规划") + @PostMapping("/queryPage") + public ResponseResult> queryPage(@RequestBody CityPlanningQueryRequest request) { + return ResponseResult.success(cityPlanningService.queryPage(request)); + } + + @ApiOperation("批量删除城市规划") + @PostMapping("/deleteByIds") + public ResponseResult deleteByIds(@RequestBody List ids) { + return ResponseResult.success(cityPlanningService.deleteByIds(ids)); + } + + @ApiOperation("规划进度") + @PostMapping("/cityPlanningSchedule") + public ResponseResult> cityPlanningSchedule(@RequestBody CityPlanningQueryRequest request) { + return ResponseResult.success(cityPlanningService.cityPlanningSchedule(request)); + } + + @ApiOperation("规划进度总计") + @PostMapping("/cityPlanningStatistics") + public ResponseResult cityPlanningStatistics(@RequestBody CityPlanningQueryRequest request) { + return ResponseResult.success(cityPlanningService.cityPlanningStatistics(request)); + } +} + diff --git a/coolstore-partner-web/src/main/java/com/cool/store/controller/webb/PCBuildInformationController.java b/coolstore-partner-web/src/main/java/com/cool/store/controller/webb/PCBuildInformationController.java index 777547942..2a4d8b80a 100644 --- a/coolstore-partner-web/src/main/java/com/cool/store/controller/webb/PCBuildInformationController.java +++ b/coolstore-partner-web/src/main/java/com/cool/store/controller/webb/PCBuildInformationController.java @@ -1,5 +1,8 @@ package com.cool.store.controller.webb; +import com.cool.store.context.CurrentUserHolder; +import com.cool.store.context.LoginUserInfo; +import com.cool.store.request.AuditApproveRequest; import com.cool.store.request.BuildInformationRequest; import com.cool.store.response.BuildInformationResponse; import com.cool.store.response.ResponseResult; @@ -33,7 +36,8 @@ public class PCBuildInformationController { @ApiOperation("提交/修改") @PostMapping("/submitOrUpdate") public ResponseResult submitBuildInformation(@RequestBody @Validated BuildInformationRequest request) { - return ResponseResult.success(buildInformationService.submitOrUpdate(request)); + LoginUserInfo user = CurrentUserHolder.getUser(); + return ResponseResult.success(buildInformationService.submitOrUpdate(request, user.getUserId(), user.getName())); } @ApiOperation("获取加盟类型 1 - 个人加盟 2- 企业加盟") @@ -42,4 +46,10 @@ public class PCBuildInformationController { return ResponseResult.success(buildInformationService.getJoinType(lineId)); } + @ApiOperation("建店资料营运顾问审批") + @PostMapping("/operationsConsultantAudit") + public ResponseResult operationsConsultantAudit(@RequestBody @Validated AuditApproveRequest request) { + LoginUserInfo user = CurrentUserHolder.getUser(); + return ResponseResult.success(buildInformationService.operationsConsultantAudit(request, user)); + } } diff --git a/coolstore-partner-web/src/main/java/com/cool/store/controller/webb/PCSignFranchiseController.java b/coolstore-partner-web/src/main/java/com/cool/store/controller/webb/PCSignFranchiseController.java index ad8ada20f..675ed6dca 100644 --- a/coolstore-partner-web/src/main/java/com/cool/store/controller/webb/PCSignFranchiseController.java +++ b/coolstore-partner-web/src/main/java/com/cool/store/controller/webb/PCSignFranchiseController.java @@ -44,6 +44,13 @@ public class PCSignFranchiseController { return ResponseResult.success(signFranchiseService.auditApprove(request,user)); } + @ApiOperation("加盟合同签约财务审核") + @PostMapping("/audit/finance") + public ResponseResult financeAuditApprove(@RequestBody @Validated AuditApproveRequest request) { + LoginUserInfo user = CurrentUserHolder.getUser(); + return ResponseResult.success(signFranchiseService.financeAuditApprove(request,user)); + } + @ApiOperation("获取默认值") @GetMapping("/default/get") public ResponseResult getSignFranchise(@RequestParam("shopId") Long shopId) { diff --git a/coolstore-partner-web/src/main/java/com/cool/store/controller/webc/MiniBuildInformationController.java b/coolstore-partner-web/src/main/java/com/cool/store/controller/webc/MiniBuildInformationController.java index c602bc24b..a80f9e880 100644 --- a/coolstore-partner-web/src/main/java/com/cool/store/controller/webc/MiniBuildInformationController.java +++ b/coolstore-partner-web/src/main/java/com/cool/store/controller/webc/MiniBuildInformationController.java @@ -36,7 +36,8 @@ public class MiniBuildInformationController { @ApiOperation("提交/修改") @PostMapping("/submitOrUpdate") public ResponseResult submitBuildInformation(@RequestBody @Validated BuildInformationRequest request) { - return ResponseResult.success(buildInformationService.submitOrUpdate(request)); + PartnerUserInfoVO user = PartnerUserHolder.getUser(); + return ResponseResult.success(buildInformationService.submitOrUpdate(request, user.getPartnerId(), user.getUsername())); } @ApiOperation("获取加盟类型 1 - 个人加盟 2- 企业加盟")