0327-海宁pad走访修改、北仑网格业绩统计修改

This commit is contained in:
2026-03-27 17:27:00 +08:00
parent a7a7f40a35
commit a9ac968749
9 changed files with 142 additions and 29 deletions

View File

@@ -131,10 +131,7 @@ public class GridCountController extends BaseController {
}
}
/**
* 测试环境先放开965上线前改回825。
*/
private boolean isNewRetailTenant() {
return SecurityUtils.getDeptId().toString().startsWith("965");
return SecurityUtils.getDeptId().toString().startsWith("825");
}
}

View File

@@ -33,6 +33,10 @@ public class VisitInfoDTO {
@ApiModelProperty(value = "客户类型 0个人1商户2企业")
private String custType;
/** 活动ID */
@ApiModelProperty(value = "活动ID")
private String campaignId;
/** 异常走访标签(筛选是否异常) */
@ApiModelProperty(value = "异常走访标签 0正常 1走访频率异常 2走访持续时长异常 3签退时间异常")
private String abnormalVisitTag;

View File

@@ -156,6 +156,8 @@ public interface SysCampaignMapper extends BaseMapper<SysCampaign> {
List<VisitInfoVO> selectVisitInfoList(VisitInfoDTO visitInfoDTO);
List<VisitInfoVO> selectVisitInfoList875(VisitInfoDTO visitInfoDTO);
int updateVisitInfoFeedback(VisitInfoFeedbackUpdateDTO updateDTO);
@Update("UPDATE sys_campaign SET del_flag = '2' where campaign_id = #{campaignId}")

View File

@@ -2175,6 +2175,9 @@ public class SysCampaignServiceImpl implements ISysCampaignService
visitInfoDTO.setUserName(SecurityUtils.getUsername());
visitInfoDTO.setUserRole(SecurityUtils.userRole());
visitInfoDTO.setDeptId(String.valueOf(SecurityUtils.getDeptId()));
if ("875".equals(SecurityUtils.getHeadId())) {
return sysCampaignMapper.selectVisitInfoList875(visitInfoDTO);
}
return sysCampaignMapper.selectVisitInfoList(visitInfoDTO);
}
@@ -2183,9 +2186,13 @@ public class SysCampaignServiceImpl implements ISysCampaignService
if (updateDTO == null || updateDTO.getId() == null) {
throw new ServiceException("走访记录ID不能为空");
}
String deptId = String.valueOf(SecurityUtils.getDeptId());
if (!deptId.startsWith("875")) {
throw new ServiceException("当前机构无权维护PAD走访反馈");
}
updateDTO.setUserName(SecurityUtils.getUsername());
updateDTO.setUserRole(SecurityUtils.userRole());
updateDTO.setDeptId(String.valueOf(SecurityUtils.getDeptId()));
updateDTO.setDeptId(deptId);
updateDTO.setSource(StringUtils.trimToNull(updateDTO.getSource()));
updateDTO.setRemark(StringUtils.trimToNull(updateDTO.getRemark()));
updateDTO.setIntentionProductValue(buildIntentionProductValue(updateDTO.getFeedbackItems()));

View File

@@ -239,17 +239,20 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
case when left(vc.campaign_id,7)='appoint' then '-1' else sc.create_role end as create_role ,
case
when dep2.dept_type = 'head' then dep.dept_id
else dep2.dept_id
when hist_branch_dep.dept_id is not null then hist_branch_dep.dept_id
when current_branch_dep.dept_type = 'head' or current_branch_dep.dept_type is null then current_outlet_dep.dept_id
else current_branch_dep.dept_id
end as dept_id,
case
when dep2.dept_type = 'head' then ''
else dep.dept_name
when hist_branch_dep.dept_id is not null then ifnull(hist_outlet_dep.dept_name, '')
when current_branch_dep.dept_type = 'head' or current_branch_dep.dept_type is null then ''
else current_outlet_dep.dept_name
end as outlets,
case
when dep2.dept_type = 'head' then dep.dept_name
else dep2.dept_name
when hist_branch_dep.dept_id is not null then hist_branch_dep.dept_name
when current_branch_dep.dept_type = 'head' or current_branch_dep.dept_type is null then current_outlet_dep.dept_name
else current_branch_dep.dept_name
end as dept_name,
concat( su.nick_name, '-', su.user_name ) as nick_name,
@@ -261,25 +264,48 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
visit_campaign_count vc left join sys_campaign sc on
vc.campaign_id = sc.campaign_id left join sys_user su on
vc.dept_id = su.user_name
left join sys_dept dep on su.dept_id = dep.dept_id
left join sys_dept dep2 on dep.parent_id = dep2.dept_id
left join (
select campaign_id, user_id, max(dept_id) as dept_id, max(outlets_id) as outlets_id
from sys_campaign_group_customer
where user_id is not null
group by campaign_id, user_id
) scgc_his on scgc_his.campaign_id = vc.campaign_id and scgc_his.user_id = su.user_id
left join sys_dept hist_branch_dep on scgc_his.dept_id = hist_branch_dep.dept_id
left join sys_dept hist_outlet_dep on scgc_his.outlets_id = hist_outlet_dep.dept_id
left join sys_dept current_outlet_dep on su.dept_id = current_outlet_dep.dept_id
left join sys_dept current_branch_dep on current_outlet_dep.parent_id = current_branch_dep.dept_id
where
vc.dept_type = '3'
<if test="campaignId != null and campaignId != ''"> and vc.campaign_id = #{campaignId}</if>
<if test="campaignName != null and campaignName != ''"> AND sc.campaign_name like concat('%', #{campaignName}, '%')</if>
<choose>
<when test="outletsId != null">
AND (dep.dept_id = #{outletsId} OR dep2.dept_id = #{outletsId})
AND ifnull(
scgc_his.outlets_id,
case
when current_branch_dep.dept_type = 'head' or current_branch_dep.dept_type is null then null
else current_outlet_dep.dept_id
end
) = #{outletsId}
</when>
<otherwise>
<if test="deptId != null and personType == 'branch' and deptId.toString().endsWith('000')">
AND dep.dept_id = #{deptId}
</if>
<if test="deptId != null and personType == 'branch'">
AND (dep.dept_id = #{deptId} OR dep2.dept_id = #{deptId})
AND ifnull(
scgc_his.dept_id,
case
when current_branch_dep.dept_type = 'head' or current_branch_dep.dept_type is null then current_outlet_dep.dept_id
else current_branch_dep.dept_id
end
) = #{deptId}
</if>
<if test="deptId != null and personType == 'outlet'">
AND (dep.dept_id = #{deptId})
AND ifnull(
scgc_his.outlets_id,
case
when current_branch_dep.dept_type = 'head' or current_branch_dep.dept_type is null then null
else current_outlet_dep.dept_id
end
) = #{deptId}
</if>
</otherwise>
</choose>
@@ -370,4 +396,4 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
#{dt}
</foreach>
</delete>
</mapper>
</mapper>

View File

@@ -1396,12 +1396,44 @@
<select id="selectVisitInfoList" parameterType="VisitInfoDTO" resultType="VisitInfoVO">
select vi.id,vi.campaign_id,vi.campaign_name,vi.vis_name,vi.vis_id,vi.dept_id,d.dept_name,vi.vis_time,vi.cust_name,vi.cust_type,vi.cust_idc,
vi.social_credit_code,vi.create_by,vi.create_time,vi.update_by,vi.update_time,vi.remark,vi.sign_in_time,vi.sign_out_time,vi.sign_in_address,
vi.sign_out_address,vi.abnormal_visit_tag,vi.abnormal_visit_info,vi.sign_in_coordinate,vi.sign_out_coordinate,vi.is_valid_cust,vi.marketing_way,vi.inter_res,
vi.inter_addr,vi.col_staf_name,vi.later_note,vi.intention_product_value,vi.feedback_status,vi.source_of_interview,vi.filename,
vi.out_call_status,vi.out_call_intention,vi.source,vi.analysis_value,vi.facility
vi.sign_out_address,vi.abnormal_visit_tag,vi.abnormal_visit_info,vi.sign_in_coordinate,vi.sign_out_coordinate,vi.is_valid_cust,vi.marketing_way,vi.inter_res
from visit_info vi
left join sys_dept d on vi.dept_id = d.dept_id
<where>
<if test="campaignId != null and campaignId != ''"> and vi.campaign_id = #{campaignId}</if>
<if test="custType != null and custType != ''"> and vi.cust_type = #{custType}</if>
<if test="visName != null and visName != ''"> and vi.vis_name like concat('%', #{visName}, '%')</if>
<if test="visId != null and visId != ''"> and vi.vis_id = #{visId}</if>
<if test="custIdc != null and custIdc != ''"> and vi.cust_idc = #{custIdc}</if>
<if test="socialCreditCode != null and socialCreditCode != ''"> and vi.social_credit_code = #{socialCreditCode}</if>
<if test="abnormalVisitTag != null and abnormalVisitTag != ''"> and vi.abnormal_visit_tag = #{abnormalVisitTag}</if>
<if test="marketingWay != null and marketingWay != ''"> and vi.marketing_way = #{marketingWay}</if>
<if test="interRes != null and interRes != ''"> and vi.inter_res = #{interRes}</if>
<if test="visTime != null">
and (vi.sign_in_time like concat(#{visTime}, '%') or vi.sign_out_time like concat(#{visTime}, '%'))
</if>
<if test="userRole != null">
<choose>
<when test="userRole == 'manager'"> and vi.vis_id = #{userName} </when>
<when test="userRole == 'outlet'"> and d.dept_id = #{deptId} </when>
<when test="userRole == 'branch'"> and (d.dept_id = #{deptId} or find_in_set(#{deptId},d.ancestors)) </when>
<when test="userRole in {'head', 'ops', 'public', 'private'}"> and left(d.dept_id,3) = left(#{deptId},3) </when>
</choose>
</if>
</where>
order by vi.sign_in_time desc
</select>
<select id="selectVisitInfoList875" parameterType="VisitInfoDTO" resultType="VisitInfoVO">
select vi.id,vi.campaign_id,vi.campaign_name,vi.vis_name,vi.vis_id,vi.dept_id,d.dept_name,vi.vis_time,vi.cust_name,vi.cust_type,vi.cust_idc,
vi.social_credit_code,vi.create_by,vi.create_time,vi.update_by,vi.update_time,vi.remark,vi.sign_in_time,vi.sign_out_time,vi.sign_in_address,
vi.sign_out_address,vi.abnormal_visit_tag,vi.abnormal_visit_info,vi.sign_in_coordinate,vi.sign_out_coordinate,vi.is_valid_cust,vi.marketing_way,vi.inter_res,
vi.inter_addr,vi.col_staf_name,vi.later_note,vi.intention_product_value,vi.feedback_status,vi.source_of_interview,vi.filename,
vi.out_call_status,vi.out_call_intention,vi.source,vi.analysis_value,vi.facility
from visit_info_875 vi
left join sys_dept d on vi.dept_id = d.dept_id
<where>
<if test="campaignId != null and campaignId != ''"> and vi.campaign_id = #{campaignId}</if>
<if test="custType != null and custType != ''"> and vi.cust_type = #{custType}</if>
<if test="visName != null and visName != ''"> and vi.vis_name like concat('%', #{visName}, '%')</if>
<if test="visId != null and visId != ''"> and vi.vis_id = #{visId}</if>
@@ -1426,7 +1458,7 @@
</select>
<update id="updateVisitInfoFeedback" parameterType="VisitInfoFeedbackUpdateDTO">
update visit_info vi
update visit_info_875 vi
left join sys_dept d on vi.dept_id = d.dept_id
set vi.source = #{source},
vi.remark = #{remark},

View File

@@ -174,7 +174,7 @@ export default {
return this.roles.includes("headPrivate");
},
isRetailNew825Tenant() {
return String(this.deptId || '').slice(0, 3) === '965';
return String(this.deptId || '').slice(0, 3) === '825';
},
},
created() {

View File

@@ -364,7 +364,7 @@ export default {
return this.userName.slice(0, 3) == 965
},
isRetailNew825Tenant() {
return String(this.deptId || '').slice(0, 3) === '965'
return String(this.deptId || '').slice(0, 3) === '825'
}
},
watch: {

View File

@@ -220,7 +220,16 @@
show-overflow-tooltip
width="150px"
v-if="columns[5].visible"
></el-table-column>
>
<template slot-scope="scope">
<el-button
v-if="isPersonalFeedbackTab && getPersonalViewCustId(scope.row)"
type="text"
@click="openPersonalView(scope.row)"
>{{ scope.row.custName }}</el-button>
<span v-else>{{ scope.row.custName }}</span>
</template>
</el-table-column>
<el-table-column
align="left"
prop="custIdc"
@@ -228,7 +237,16 @@
show-overflow-tooltip
width="200px"
v-if="columns[6].visible && selectedTab === '0'"
></el-table-column>
>
<template slot-scope="scope">
<el-button
v-if="isPersonalFeedbackTab && getPersonalViewCustId(scope.row)"
type="text"
@click="openPersonalView(scope.row)"
>{{ scope.row.custIdc }}</el-button>
<span v-else>{{ scope.row.custIdc || "-" }}</span>
</template>
</el-table-column>
<el-table-column
align="left"
prop="socialCreditCode"
@@ -591,7 +609,7 @@ export default {
// 海宁
is875() {
const deptId = this.deptId === null || this.deptId === undefined ? '' : String(this.deptId)
return deptId.slice(0, 3) === '965'
return deptId.slice(0, 3) === '875'
},
isPersonalFeedbackTab() {
return this.is875 && this.selectedTab === '0'
@@ -670,6 +688,33 @@ export default {
const matched = this.sourceOptions.find(item => item.value === sourceValue);
return matched ? matched.label : (sourceValue || "-");
},
getPersonalViewCustId(row) {
const custId = row && row.custId ? String(row.custId).trim() : "";
if (custId) {
return custId;
}
const custIdc = row && row.custIdc ? String(row.custIdc).trim() : "";
return custIdc ? `101${custIdc}` : "";
},
openPersonalView(row) {
if (!this.isPersonalFeedbackTab) {
this.$message.warning("当前机构暂无个人客户视图跳转权限");
return;
}
const custId = this.getPersonalViewCustId(row);
if (!custId) {
this.$message.warning("未获取到客户标识,暂时无法跳转个人视图");
return;
}
this.$router.push({
path: "/360charts/indexcharts",
query: {
custId,
selectedTab: this.selectedTab,
backUrl: this.$route.path
}
});
},
handleEditFeedback(row) {
if (this.isFeedbackCompleted(row)) {
return;