Merge #30 into master from cc_20260106_process_change

fix:加盟合同签约及建店资料修改

* cc_20260106_process_change: (6 commits squashed)

  - fix:加盟合同签约新增财务审批

  - fix:建店资料阶段逻辑修改

  - fix:加盟合同签约待办,财务查看待财务审批的待办

  - feat:城市规划

  - feat:行政区划接口;
    fix:城市规划修改

  - fix:加盟合同签约审批日志逻辑修改

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

CR-link: https://codeup.aliyun.com/692ea314dec569489f6f167c/hangzhou/java/custom_zxjp/change/30
This commit is contained in:
王非凡
2026-01-19 09:11:34 +00:00
committed by 正新
parent eb9b8bdf00
commit c28515123a
41 changed files with 1259 additions and 92 deletions

View File

@@ -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";
}

View File

@@ -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),
;

View File

@@ -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

View File

@@ -349,8 +349,9 @@ public class ShopStageInfoDAO {
public List<ShopStageInfoDO> getSpecialShopStageInfo(List<Long> shopIds, Integer shopSubStage,
List<Integer> shopSubStageStatusList,
String investmentUserId,
List<String> authRegionIds,Boolean ownShopFlag, DeskRequest deskRequest) {
return shopStageInfoMapper.getSpecialShopStageInfo(shopIds, shopSubStage, shopSubStageStatusList, investmentUserId, authRegionIds,ownShopFlag, deskRequest);
List<String> authRegionIds,Boolean ownShopFlag, DeskRequest deskRequest,
String operationsConsultantUserId) {
return shopStageInfoMapper.getSpecialShopStageInfo(shopIds, shopSubStage, shopSubStageStatusList, investmentUserId, authRegionIds,ownShopFlag, deskRequest, operationsConsultantUserId);
}
/**

View File

@@ -47,4 +47,8 @@ public class SignFranchiseDAO {
}
signFranchiseMapper.updateAuditByShopId(auditId,shopId,dto);
}
public void updateAuditByShopId(Long auditId, Long shopId){
signFranchiseMapper.updateAuditByShopId(auditId, shopId, null);
}
}

View File

@@ -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<StoreDO> getNoOrderStore(LocalDate latestDate, List<String> businessTypes, Boolean inBusinessType) {
return storeMapper.getNoOrderStore(latestDate, businessTypes, inBusinessType);
}
/**
* 根据行政区划查询门店数量统计
* @param cityNames 市名称列表
* @return <年, <季度, <省, <市, 门店数量>>>>
*/
public Map<Integer, Map<Integer, Map<String, Map<String, Integer>>>> storeNumStatisticsByAd(List<Integer> years, List<String> cityNames) {
if (CollectionUtils.isEmpty(cityNames)) {
return Collections.emptyMap();
}
List<Map<String, Object>> 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)
)
)
)
);
}
}

View File

@@ -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;
/**
* <p>
* 行政区划DAO
* </p>
*
* @author wangff
* @since 2026/1/8
*/
@Repository
@RequiredArgsConstructor
public class AdDistrictDAO {
private final AdDistrictMapper adDistrictMapper;
/**
* 根据区划编码查询名称
*/
public Map<String, String> getNameByCodes(List<String> codes) {
if (CollectionUtils.isEmpty(codes)) {
return Collections.emptyMap();
}
Example example = new Example(AdDistrictDO.class);
example.createCriteria().andIn("code", codes);
List<AdDistrictDO> list = adDistrictMapper.selectByExample(example);
return CollStreamUtil.toMap(list, AdDistrictDO::getCode, AdDistrictDO::getName);
}
/**
* 列表查询
* @param pid 父级id
* @return 行政区划列表
*/
public List<AdDistrictDO> getList(Long pid) {
return adDistrictMapper.select(AdDistrictDO.builder().pid(pid).build());
}
}

View File

@@ -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<Long> 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<CityPlanningDO> 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);
}
}

View File

@@ -150,7 +150,8 @@ public interface ShopStageInfoMapper extends Mapper<ShopStageInfoDO> {
@Param("investmentUserId") String investmentUserId,
@Param("authRegionIds") List<String> authRegionIds,
@Param("ownShopFlag") Boolean ownShopFlag,
@Param("request") DeskRequest deskRequest);
@Param("request") DeskRequest deskRequest,
@Param("operationsConsultantUserId") String operationsConsultantUserId);
List<ShopStageInfoDO> getSubStageList(@Param("shopIds") List<Long> shopIds,@Param("shopSubStage") Integer shopSubStage);
List<ShopStageInfoDO> getSubStages(@Param("shopIds") List<Long> shopIds,@Param("shopSubStage") Integer shopSubStage);

View File

@@ -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<StoreDO> getNoOrderStore(@Param("latestDate") LocalDate latestDate, @Param("businessTypes") List<String> businessTypes, @Param("inBusinessType") Boolean inBusinessType);
/**
* 根据市统计门店数量
* @param cityNames 市列表
*/
List<Map<String, Object>> storeNumStatisticsByAd(@Param("years") List<Integer> years,
@Param("cityNames") List<String> 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);
}

View File

@@ -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<AdDistrictDO> {
}

View File

@@ -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<CityPlanningDO> {
}

View File

@@ -389,6 +389,9 @@
#{joinMode}
</foreach>
</if>
<if test="operationsConsultantUserId != null and operationsConsultantUserId != ''">
AND si.operations_consultant = #{operationsConsultantUserId}
</if>
order by a.update_time desc
</where>

View File

@@ -328,4 +328,31 @@
</otherwise>
</choose>
</select>
<select id="storeNumStatisticsByAd" resultType="java.util.Map">
SELECT YEAR(open_date) year, province, city, COUNT(1) store_num, QUARTER(open_date) quarter
FROM store_${enterpriseId}
WHERE is_delete = 'effective'
AND city IN
<foreach item="item" collection="cityNames" separator="," open="(" close=")">
#{item}
</foreach>
AND YEAR(open_date) IN
<foreach item="item" collection="years" separator="," open="(" close=")">
#{item}
</foreach>
GROUP BY YEAR(open_date), QUARTER(open_date), province, city
</select>
<select id="totalStoreNumByAd" resultType="java.lang.Integer">
SELECT COUNT(1)
FROM store_${enterpriseId}
WHERE is_delete = 'effective' AND province = #{province} AND city = #{city}
<if test="openStartTime != null">
AND open_time >= #{openStartTime}
</if>
<if test="openEndTime != null">
AND open_time &lt;= #{openEndTime}
</if>
</select>
</mapper>

View File

@@ -0,0 +1,16 @@
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="com.cool.store.mapper.ad.AdDistrictMapper">
<resultMap id="BaseResultMap" type="com.cool.store.entity.ad.AdDistrictDO">
<!--
WARNING - @mbg.generated
-->
<id column="id" jdbcType="BIGINT" property="id" />
<result column="pid" jdbcType="BIGINT" property="pid" />
<result column="level" jdbcType="BIT" property="level" />
<result column="code" jdbcType="VARCHAR" property="code" />
<result column="name" jdbcType="VARCHAR" property="name" />
<result column="create_time" jdbcType="TIMESTAMP" property="createTime" />
<result column="update_time" jdbcType="TIMESTAMP" property="updateTime" />
</resultMap>
</mapper>

View File

@@ -0,0 +1,19 @@
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="com.cool.store.mapper.plan.CityPlanningMapper">
<resultMap id="BaseResultMap" type="com.cool.store.entity.plan.CityPlanningDO">
<!--
WARNING - @mbg.generated
-->
<id column="id" jdbcType="BIGINT" property="id" />
<result column="plan_no" jdbcType="VARCHAR" property="planNo" />
<result column="year" jdbcType="INTEGER" property="year" />
<result column="quarter" jdbcType="INTEGER" property="quarter" />
<result column="province_code" jdbcType="VARCHAR" property="provinceCode" />
<result column="city_code" jdbcType="VARCHAR" property="cityCode" />
<result column="target" jdbcType="INTEGER" property="target" />
<result column="create_time" jdbcType="TIMESTAMP" property="createTime" />
<result column="create_user_id" jdbcType="VARCHAR" property="createUserId" />
<result column="update_time" jdbcType="TIMESTAMP" property="updateTime" />
</resultMap>
</mapper>

View File

@@ -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;
}

View File

@@ -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;
}

View File

@@ -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;
}

View File

@@ -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;
}

View File

@@ -0,0 +1,27 @@
package com.cool.store.vo.ad;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
/**
* <p>
* 行政区划VO
* </p>
*
* @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;
}

View File

@@ -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;
/**
* <p>
* 规划进度统计VO
* </p>
*
* @author wangff
* @since 2026/1/8
*/
@Data
@AllArgsConstructor
@NoArgsConstructor
public class CityPlanningStatisticsVO {
@ApiModelProperty("总计季度目标")
private Integer target;
@ApiModelProperty("总计已完成数量")
private Integer completeNum;
@ApiModelProperty("总计完成率")
private BigDecimal completeRate;
}

View File

@@ -0,0 +1,50 @@
package com.cool.store.vo.plan;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
import java.math.BigDecimal;
/**
* <p>
* 城市规划VO
* </p>
*
* @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;
}

View File

@@ -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);
}

View File

@@ -16,6 +16,8 @@ public interface OperationLogService {
Long addOperationLog(Long shopId, ShopSubStageStatusEnum shopSubStageStatusEnum,String userId, List<EnterpriseUserDO> operationUserList, OperationTypeEnum operationTypeEnum, String remark,OperationStatusEnum operationStatusEnum);
Long addOperationLog(Long shopId, ShopSubStageStatusEnum shopSubStageStatusEnum,String userId, List<EnterpriseUserDO> operationUserList, OperationTypeEnum operationTypeEnum, String remark,OperationStatusEnum operationStatusEnum, int serial);
List<AuditInfoResponse> getAuditInfo(Long shopId,List<Integer> shopSubStageList);
Boolean batchUpdateProcessed( List<OperationLogDO> operationLogs,Long audit , String userId, String reason);

View File

@@ -32,6 +32,8 @@ public interface SignFranchiseService {
*/
Boolean auditApprove(AuditApproveRequest request, LoginUserInfo user);
Boolean financeAuditApprove(AuditApproveRequest request, LoginUserInfo user);
/**
* 加盟合同退回后重新缴费
* @param shopId

View File

@@ -0,0 +1,24 @@
package com.cool.store.service.ad;
import com.cool.store.vo.ad.AdDistrictVO;
import java.util.List;
/**
* <p>
* 行政区划 服务类
* </p>
*
* @author wangff
* @since 2025/10/14
*/
public interface AdDistrictService {
/**
* 行政区划列表
* @param pid 父级id默认1
* @return 行政区划VO列表
*/
List<AdDistrictVO> cityList(Long pid);
}

View File

@@ -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;
/**
* <p>
* 行政区划 服务实现类
* </p>
*
* @author wangff
* @since 2025/10/14
*/
@Service
@RequiredArgsConstructor
public class AdDistrictServiceImpl implements AdDistrictService {
private final AdDistrictDAO adDistrictDAO;
@Override
public List<AdDistrictVO> cityList(Long pid) {
if (Objects.isNull(pid)) {
pid = 1L;
}
List<AdDistrictDO> list = adDistrictDAO.getList(pid);
return BeanUtil.toList(list, AdDistrictVO.class);
}
}

View File

@@ -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<String, String> map = new HashMap<>();
map.put("partnerUsername", lineInfoDO.getUsername());
map.put("partnerMobile", lineInfoDO.getMobile());
map.put("storeName", shopInfoDO.getShopName());
List<EnterpriseUserDO> logisticsList = userAuthMappingService.getAllUserByRoleEnumAndRegionId(UserRoleEnum.LOGISTICS, shopInfoDO.getRegionId());
List<String> 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<String, String> 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<OperationLogDO> 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<EnterpriseUserDO> 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<String, String> map = new HashMap<>();
map.put("partnerUsername", lineInfoDO.getUsername());
map.put("partnerMobile", lineInfoDO.getMobile());
map.put("storeName", shopInfoDO.getShopName());
List<EnterpriseUserDO> logisticsList = userAuthMappingService.getAllUserByRoleEnumAndRegionId(UserRoleEnum.LOGISTICS, shopInfoDO.getRegionId());
List<String> 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<OperationLogDO> 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;
}
}

View File

@@ -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<PreparationCommonPendingVO> pageInfo = commonPendingVOPageInfo(deskRequest, user, ShopSubStageEnum.SHOP_STAGE_8,
subStageStatusList, Boolean.TRUE);
return pageInfo;
@@ -515,8 +518,8 @@ public class DeskServiceImpl implements DeskService {
public PageInfo<PreparationCommonPendingVO> buildInformationPendingList(DeskRequest deskRequest, LoginUserInfo user) {
List<Long> 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<PreparationCommonPendingVO> commonPendingVOPageInfo(DeskRequest deskRequest, LoginUserInfo user, ShopSubStageEnum shopSubStageEnum, List<Integer> subStageStatusList, Boolean filterFlag) {
return this.commonPendingVOPage(deskRequest, user, shopSubStageEnum, subStageStatusList, filterFlag, null);
return this.commonPendingVOPage(deskRequest, user, shopSubStageEnum, subStageStatusList, filterFlag, null, null);
}
private PageInfo<PreparationCommonPendingVO> commonPendingVOPageInfoByOperationsConsultant(DeskRequest deskRequest, String operationsConsultantUserId, ShopSubStageEnum shopSubStageEnum, List<Integer> 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<PreparationCommonPendingVO> commonPendingVOPage(DeskRequest deskRequest, LoginUserInfo user, ShopSubStageEnum shopSubStageEnum, List<Integer> subStageStatusList, Boolean filterFlag, Boolean ownShopFlag) {
private PageInfo<PreparationCommonPendingVO> commonPendingVOPage(DeskRequest deskRequest, LoginUserInfo user, ShopSubStageEnum shopSubStageEnum, List<Integer> subStageStatusList, Boolean filterFlag, Boolean ownShopFlag,
String operationsConsultantUserId) {
//user.getJobNumber()
List<String> authRegionIds = new ArrayList<>();
if (filterFlag) {
@@ -836,7 +844,7 @@ public class DeskServiceImpl implements DeskService {
}
PageHelper.startPage(deskRequest.getPageNum(), deskRequest.getPageSize());
List<ShopStageInfoDO> 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<Long> shopIds = specialShopStageInfo.stream().map(ShopStageInfoDO::getShopId).collect(Collectors.toList());
List<Long> lineIds = specialShopStageInfo.stream().map(ShopStageInfoDO::getLineId).collect(Collectors.toList());

View File

@@ -59,10 +59,16 @@ public class OperationLogServiceImpl implements OperationLogService {
@Override
@Transactional(rollbackFor = Exception.class)
public Long addOperationLog(Long shopId, ShopSubStageStatusEnum shopSubStageStatusEnum, String userId, List<EnterpriseUserDO> 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<EnterpriseUserDO> operationUserList, OperationTypeEnum operationTypeEnum, String remark, OperationStatusEnum operationStatusEnum, int serial) {
List<OperationLogDO> 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<>();

View File

@@ -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<String, String> 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<EnterpriseUserDO> itList = userAuthMappingService.getAllUserByRoleEnumAndRegionId(finance, shopInfoDO.getRegionId());
List<String> 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());

View File

@@ -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);

View File

@@ -242,6 +242,7 @@ public class SignFranchiseServiceImpl implements SignFranchiseService, AuditResu
shopStageInfoDAO.updateShopStageInfo(request.getShopId(), ShopSubStageStatusEnum.SHOP_SUB_STAGE_STATUS_83);
//发送通知
List<EnterpriseUserDO> auditFranchiseFeeUsers = userAuthMappingService.getUserIdByRoleEnumAndRegionId(Arrays.asList(BRANCH_OFFICE, REGION_OFFICE), shopInfoDO.getRegionId());
List<EnterpriseUserDO> financeUsers = userAuthMappingService.getUserIdByRoleEnumAndRegionId(Collections.singletonList(FINANCE), shopInfoDO.getRegionId());
List<String> auditFranchiseFeeUserList = auditFranchiseFeeUsers.stream().distinct().map(EnterpriseUserDO::getUserId).collect(Collectors.toList());
LineInfoDO lineInfo = lineInfoMapper.getByLineId(shopInfoDO.getLineId());
HashMap<String, String> 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<EnterpriseUserDO> userIds = userAuthMappingService.getUserIdByRoleEnumAndRegionId(Arrays.asList(BRANCH_OFFICE, REGION_OFFICE), shopInfoDO.getRegionId());
List<EnterpriseUserDO> financeUsers = userAuthMappingService.getUserIdByRoleEnumAndRegionId(Collections.singletonList(FINANCE), shopInfoDO.getRegionId());
List<String> auditFranchiseFeeUserList = userIds.stream().distinct().map(EnterpriseUserDO::getUserId).collect(Collectors.toList());
LineInfoDO lineInfo = lineInfoMapper.getByLineId(shopInfoDO.getLineId());
HashMap<String, String> 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<String, String> map = new HashMap<>();
map.put("partnerUsername", lineInfoDO.getUsername());
map.put("partnerMobile", lineInfoDO.getMobile());
map.put("storeName", shopInfoDO.getShopName());
List<EnterpriseUserDO> userDOList = userAuthMappingService.getAllUserByRoleEnumAndRegionId(UserRoleEnum.FINANCE, shopInfoDO.getRegionId());
List<String> 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<OperationLogDO> 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<String, String> requestMap = new HashMap<>();
LineInfoDO lineInfo = lineInfoMapper.getByLineId(shopInfoDO.getLineId());
shopStageInfoDAO.updateShopStageInfo(request.getShopId(), ShopSubStageStatusEnum.SHOP_SUB_STAGE_STATUS_85);
Set<String> auditFranchiseFeeUsers = new HashSet<>();
List<EnterpriseUserDO> branchUser = userAuthMappingService.getAllUserByRoleEnumAndRegionId(UserRoleEnum.JOIN_OFFICE, shopInfoDO.getRegionId());
if (Objects.nonNull(branchUser)) {
Set<String> branchUserIds = branchUser.stream().map(EnterpriseUserDO::getUserId).collect(Collectors.toSet());
auditFranchiseFeeUsers.addAll(branchUserIds);
}
List<EnterpriseUserDO> regionUser = userAuthMappingService.getAllUserByRoleEnumAndRegionId(REGION_OFFICE, shopInfoDO.getRegionId());
if (Objects.nonNull(regionUser)) {
Set<String> 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<String, String> requestMap = new HashMap<>();
LineInfoDO lineInfo = lineInfoMapper.getByLineId(shopInfoDO.getLineId());
shopStageInfoDAO.updateShopStageInfo(shopId, ShopSubStageStatusEnum.SHOP_SUB_STAGE_STATUS_85);
Set<String> auditFranchiseFeeUsers = new HashSet<>();
List<EnterpriseUserDO> branchUser = userAuthMappingService.getAllUserByRoleEnumAndRegionId(UserRoleEnum.JOIN_OFFICE, shopInfoDO.getRegionId());
if (Objects.nonNull(branchUser)) {
Set<String> branchUserIds = branchUser.stream().map(EnterpriseUserDO::getUserId).collect(Collectors.toSet());
auditFranchiseFeeUsers.addAll(branchUserIds);
}
List<EnterpriseUserDO> regionUser = userAuthMappingService.getAllUserByRoleEnumAndRegionId(REGION_OFFICE, shopInfoDO.getRegionId());
if (Objects.nonNull(regionUser)) {
Set<String> 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<EnterpriseUserDO> userDOList = userAuthMappingService.getAllUserByRoleEnumAndRegionId(UserRoleEnum.FINANCE, shopInfoDO.getRegionId());
List<String> finances = new ArrayList<>();
if (Objects.nonNull(userDOList)) {
finances.addAll(userDOList.stream().map(EnterpriseUserDO::getUserId).collect(Collectors.toList()));
}
// List<String> 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<OperationLogDO> operationLogs = operationLogDAO.getBySubStageStatusEnumAndsStatus(request.getShopId(), ShopSubStageStatusEnum.SHOP_SUB_STAGE_STATUS_83, OperationTypeEnum.OPERATION_TYPE_1.getCode());
List<OperationLogDO> 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 {

View File

@@ -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<CityPlanningVO> queryPage(CityPlanningQueryRequest request);
/**
* 批量删除
* @param ids id列表
* @return 是否成功
*/
Boolean deleteByIds(List<Long> ids);
/**
* 规划进度
* @param request 查询请求
* @return 分页结果
*/
PageInfo<CityPlanningVO> cityPlanningSchedule(CityPlanningQueryRequest request);
/**
* 规划进度总计
* @param request 查询请求
* @return 规划进度统计VO
*/
CityPlanningStatisticsVO cityPlanningStatistics(CityPlanningQueryRequest request);
}

View File

@@ -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<CityPlanningVO> queryPage(CityPlanningQueryRequest request) {
PageHelper.startPage(request.getPageNum(), request.getPageSize());
List<CityPlanningDO> list = cityPlanningDAO.queryByCondition(request);
PageInfo<CityPlanningDO> page = new PageInfo<>(list);
PageInfo<CityPlanningVO> result = BeanUtil.toPage(page, CityPlanningVO.class);
List<String> adCodes = list.stream()
.flatMap(v -> Stream.of(v.getProvinceCode(), v.getCityCode()))
.distinct()
.collect(Collectors.toList());
Map<String, String> 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<Long> ids) {
return cityPlanningDAO.deleteByIds(ids);
}
@Override
public PageInfo<CityPlanningVO> cityPlanningSchedule(CityPlanningQueryRequest request) {
PageHelper.startPage(request.getPageNum(), request.getPageSize());
List<CityPlanningDO> list = cityPlanningDAO.queryByCondition(request);
PageInfo<CityPlanningDO> page = new PageInfo<>(list);
PageInfo<CityPlanningVO> result = BeanUtil.toPage(page, CityPlanningVO.class);
List<String> adCodes = list.stream()
.flatMap(v -> Stream.of(v.getProvinceCode(), v.getCityCode()))
.distinct()
.collect(Collectors.toList());
Map<String, String> adMap = adDistrictDAO.getNameByCodes(adCodes);
Set<Integer> years = CollStreamUtil.toSet(list, CityPlanningDO::getYear);
Map<Integer, Map<Integer, Map<String, Map<String, Integer>>>> 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<CityPlanningDO> list = cityPlanningDAO.queryByCondition(request);
List<String> adCodes = list.stream()
.flatMap(v -> Stream.of(v.getProvinceCode(), v.getCityCode()))
.distinct()
.collect(Collectors.toList());
Map<String, String> adMap = adDistrictDAO.getNameByCodes(adCodes);
Set<Integer> years = CollStreamUtil.toSet(list, CityPlanningDO::getYear);
Map<Integer, Map<Integer, Map<String, Map<String, Integer>>>> 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);
}
}

View File

@@ -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;
/**
* <p>
* 行政区划 前端控制器
* </p>
*
* @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<List<AdDistrictVO>> cityList(Long pid) {
return ResponseResult.success(adDistrictService.cityList(pid));
}
}

View File

@@ -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<Boolean> add(@RequestBody @Validated(InsertGroup.class) CityPlanningUpdateRequest request) {
return ResponseResult.success(cityPlanningService.add(request));
}
@ApiOperation("编辑城市规划")
@PostMapping("/update")
public ResponseResult<Boolean> update(@RequestBody @Validated(UpdateGroup.class) CityPlanningUpdateRequest request) {
return ResponseResult.success(cityPlanningService.update(request));
}
@ApiOperation("分页查询城市规划")
@PostMapping("/queryPage")
public ResponseResult<PageInfo<CityPlanningVO>> queryPage(@RequestBody CityPlanningQueryRequest request) {
return ResponseResult.success(cityPlanningService.queryPage(request));
}
@ApiOperation("批量删除城市规划")
@PostMapping("/deleteByIds")
public ResponseResult<Boolean> deleteByIds(@RequestBody List<Long> ids) {
return ResponseResult.success(cityPlanningService.deleteByIds(ids));
}
@ApiOperation("规划进度")
@PostMapping("/cityPlanningSchedule")
public ResponseResult<PageInfo<CityPlanningVO>> cityPlanningSchedule(@RequestBody CityPlanningQueryRequest request) {
return ResponseResult.success(cityPlanningService.cityPlanningSchedule(request));
}
@ApiOperation("规划进度总计")
@PostMapping("/cityPlanningStatistics")
public ResponseResult<CityPlanningStatisticsVO> cityPlanningStatistics(@RequestBody CityPlanningQueryRequest request) {
return ResponseResult.success(cityPlanningService.cityPlanningStatistics(request));
}
}

View File

@@ -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<Integer> 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<Boolean> operationsConsultantAudit(@RequestBody @Validated AuditApproveRequest request) {
LoginUserInfo user = CurrentUserHolder.getUser();
return ResponseResult.success(buildInformationService.operationsConsultantAudit(request, user));
}
}

View File

@@ -44,6 +44,13 @@ public class PCSignFranchiseController {
return ResponseResult.success(signFranchiseService.auditApprove(request,user));
}
@ApiOperation("加盟合同签约财务审核")
@PostMapping("/audit/finance")
public ResponseResult<Boolean> financeAuditApprove(@RequestBody @Validated AuditApproveRequest request) {
LoginUserInfo user = CurrentUserHolder.getUser();
return ResponseResult.success(signFranchiseService.financeAuditApprove(request,user));
}
@ApiOperation("获取默认值")
@GetMapping("/default/get")
public ResponseResult<AddSignFranchiseResponse> getSignFranchise(@RequestParam("shopId") Long shopId) {

View File

@@ -36,7 +36,8 @@ public class MiniBuildInformationController {
@ApiOperation("提交/修改")
@PostMapping("/submitOrUpdate")
public ResponseResult<Integer> 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- 企业加盟")