Browse Source

完善简道云逻辑和客户管理功能

hzj
Trae AI 1 month ago
parent
commit
a469f5fb6a
  1. 3
      web/src/main/java/com/example/web/mapper/UsersMapper.java
  2. 124
      web/src/main/java/com/example/web/service/impl/UserServiceImpl.java
  3. 9
      web/src/main/resources/mapper/UsersMapper.xml
  4. 28
      web/src/main/resources/static/index.html

3
web/src/main/java/com/example/web/mapper/UsersMapper.java

@ -63,4 +63,7 @@ public interface UsersMapper {
@DataSource("wechat") @DataSource("wechat")
Users findByUserId(String userId); Users findByUserId(String userId);
@DataSource("wechat")
int updateSyncStatusWithValue(Map<String, Object> params);
} }

124
web/src/main/java/com/example/web/service/impl/UserServiceImpl.java

@ -2,8 +2,10 @@ package com.example.web.service.impl;
import com.example.web.entity.InformationTra; import com.example.web.entity.InformationTra;
import com.example.web.entity.Managers; import com.example.web.entity.Managers;
import com.example.web.entity.Personnel;
import com.example.web.entity.Users; import com.example.web.entity.Users;
import com.example.web.entity.UsersManagements; import com.example.web.entity.UsersManagements;
import com.example.web.mapper.PersonnelMapper;
import com.example.web.mapper.UsersMapper; import com.example.web.mapper.UsersMapper;
import com.example.web.mapper.ManagersMapper; import com.example.web.mapper.ManagersMapper;
import com.example.web.mapper.UsersManagementsMapper; import com.example.web.mapper.UsersManagementsMapper;
@ -12,6 +14,7 @@ import com.example.web.service.UserService;
import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service; import org.springframework.stereotype.Service;
import java.time.LocalDateTime;
import java.util.HashMap; import java.util.HashMap;
import java.util.List; import java.util.List;
import java.util.Map; import java.util.Map;
@ -25,6 +28,9 @@ public class UserServiceImpl implements UserService {
@Autowired @Autowired
private ManagersMapper managersMapper; private ManagersMapper managersMapper;
@Autowired
private PersonnelMapper personnelMapper;
@Autowired @Autowired
private UsersManagementsMapper usersManagementsMapper; private UsersManagementsMapper usersManagementsMapper;
@ -177,6 +183,13 @@ public class UserServiceImpl implements UserService {
return result; return result;
} }
// 检查客户是否是第一次跟进
Users user = usersMapper.findByUserId(userId);
if (user != null && user.getFollowup_at() != null) {
// 不是第一次跟进,设置followup_at参数为非空,避免更新跟进时间
params.put("followup_at", user.getFollowup_at());
}
// 更新跟进信息 // 更新跟进信息
usersMapper.updateFollowup(params); usersMapper.updateFollowup(params);
@ -271,7 +284,79 @@ public class UserServiceImpl implements UserService {
return result; return result;
} }
// 1. 更新 users 表,修改 type 字段并清空 followup 字段 // 获取客户信息
Users user = usersMapper.findByUserId(userId);
if (user == null) {
result.put("success", false);
result.put("message", "客户不存在");
return result;
}
// 根据用户选择的类型进行不同的归还处理
// type参数是用户选择的类型,可能值包括:buyer(大贸易客户)、seller(供应商)、both(两者都是)、smalls(小品种客户)
if ("seller".equals(type) || "both".equals(type)) {
// 随机分配给指定的人员
String[] assignUsers = {"刘琴", "何佳芹", "汤敏", "李真音"};
int randomIndex = (int) (Math.random() * assignUsers.length);
String assignedUser = assignUsers[randomIndex];
// 1. 更新 users 表,修改 type 字段
usersMapper.updateUserTypeAndClearFollowup(params);
// 从primary数据源的personnel表查询业务员信息
Personnel personnel = personnelMapper.findByName(assignedUser);
// 创建UsersManagements对象,将personnel表中的信息写入usermanagements表
UsersManagements usersManagements = new UsersManagements();
usersManagements.setUserId(userId);
usersManagements.setAssistant(assistant);
if (personnel != null) {
// 如果找到业务员信息,使用查询到的信息
usersManagements.setManagerId(personnel.getManagerId());
usersManagements.setManagercompany(personnel.getManagercompany());
usersManagements.setManagerdepartment(personnel.getManagerdepartment());
usersManagements.setOrganization(personnel.getOrganization());
usersManagements.setRole(personnel.getProjectName()); // projectName对应role
usersManagements.setUserName(personnel.getName()); // name对应userName
} else {
// 如果未找到业务员信息,使用默认值
usersManagements.setManagerId(userId);
usersManagements.setManagercompany(managercompany);
usersManagements.setManagerdepartment(managerdepartment);
usersManagements.setOrganization(organization);
usersManagements.setRole(role);
usersManagements.setUserName(assignedUser);
}
// 更新或插入usermanagements表
UsersManagements existing = usersManagementsMapper.findByUserId(userId);
if (existing != null) {
usersManagements.setId(existing.getId());
usersManagements.setCreated_at(existing.getCreated_at());
usersManagements.setUpdated_at(LocalDateTime.now());
usersManagementsMapper.update(usersManagements);
} else {
usersManagements.setCreated_at(LocalDateTime.now());
usersManagements.setUpdated_at(LocalDateTime.now());
usersManagementsMapper.insert(usersManagements);
}
// 记录归还操作
InformationTra tra = createInformationTra(
managercompany,
managerdepartment,
organization,
role,
userName,
assistant,
userId,
"归还客户并分配给" + assignedUser
);
informationTraService.recordUserOperation(tra);
} else {
// 正常放入公海池
// 1. 更新 users 表,修改 type 字段
usersMapper.updateUserTypeAndClearFollowup(params); usersMapper.updateUserTypeAndClearFollowup(params);
// 2. 清除 usermanagements 表中的记录 // 2. 清除 usermanagements 表中的记录
@ -289,6 +374,7 @@ public class UserServiceImpl implements UserService {
"归还客户到" + type "归还客户到" + type
); );
informationTraService.recordUserOperation(tra); informationTraService.recordUserOperation(tra);
}
result.put("success", true); result.put("success", true);
result.put("message", "归还成功"); result.put("message", "归还成功");
@ -306,6 +392,7 @@ public class UserServiceImpl implements UserService {
try { try {
String userId = (String) params.get("userId"); String userId = (String) params.get("userId");
String systemType = (String) params.get("systemType"); // 大贸易系统或小品种系统
String userName = (String) params.get("userName"); String userName = (String) params.get("userName");
String managercompany = (String) params.get("managercompany"); String managercompany = (String) params.get("managercompany");
String managerdepartment = (String) params.get("managerdepartment"); String managerdepartment = (String) params.get("managerdepartment");
@ -313,14 +400,41 @@ public class UserServiceImpl implements UserService {
String role = (String) params.get("role"); String role = (String) params.get("role");
String assistant = (String) params.get("assistant"); String assistant = (String) params.get("assistant");
if (userId == null) { if (userId == null || systemType == null) {
result.put("success", false); result.put("success", false);
result.put("message", "缺少必要参数"); result.put("message", "缺少必要参数");
return result; return result;
} }
// 更新 users 表,设置 sync_statuss 字段值为 0 // 获取客户信息,判断客户类型
usersMapper.updateSyncStatusToZero(params); Users user = usersMapper.findByUserId(userId);
if (user == null) {
result.put("success", false);
result.put("message", "客户不存在");
return result;
}
String userType = user.getType();
Integer syncStatus = 0;
// 根据系统类型和客户类型设置sync_statuss值
if ("大贸易系统".equals(systemType)) {
if ("seller".equals(userType) || "both".equals(userType)) {
syncStatus = 1;
} else {
syncStatus = 0;
}
} else if ("小品种系统".equals(systemType)) {
if ("seller".equals(userType) || "both".equals(userType)) {
syncStatus = 3;
} else {
syncStatus = 2;
}
}
// 更新sync_statuss值
params.put("syncStatus", syncStatus);
usersMapper.updateSyncStatusWithValue(params);
// 记录操作 // 记录操作
InformationTra tra = createInformationTra( InformationTra tra = createInformationTra(
@ -331,7 +445,7 @@ public class UserServiceImpl implements UserService {
userName, userName,
assistant, assistant,
userId, userId,
"简道云操作" "简道云操作 - " + systemType
); );
informationTraService.recordUserOperation(tra); informationTraService.recordUserOperation(tra);

9
web/src/main/resources/mapper/UsersMapper.xml

@ -206,7 +206,10 @@
<update id="updateFollowup" parameterType="java.util.Map"> <update id="updateFollowup" parameterType="java.util.Map">
UPDATE users UPDATE users
SET followup = #{followup}, SET followup = #{followup},
updated_at = NOW(),
<if test="followup_at == null">
followup_at = NOW(), followup_at = NOW(),
</if>
type = #{type}, type = #{type},
level = #{level}, level = #{level},
detailedaddress = #{detailedaddress}, detailedaddress = #{detailedaddress},
@ -240,6 +243,12 @@
WHERE userId = #{userId} WHERE userId = #{userId}
</update> </update>
<update id="updateSyncStatusWithValue" parameterType="java.util.Map">
UPDATE users
SET sync_statuss = #{syncStatus}
WHERE userId = #{userId}
</update>
<update id="updateUserTypeAndClearFollowup" parameterType="java.util.Map"> <update id="updateUserTypeAndClearFollowup" parameterType="java.util.Map">
UPDATE users UPDATE users
SET type = #{type}, SET type = #{type},

28
web/src/main/resources/static/index.html

@ -1043,7 +1043,7 @@
// 只有管理员显示复选框 // 只有管理员显示复选框
var checkboxCell = isAdmin ? '<td><input type="checkbox" class="userCheckbox" data-userid="' + (user.userId || '') + '"></td>' : '<td style="width: 40px;"></td>'; var checkboxCell = isAdmin ? '<td><input type="checkbox" class="userCheckbox" data-userid="' + (user.userId || '') + '"></td>' : '<td style="width: 40px;"></td>';
var row = '<tr onclick="openDetailModal(\'' + (user.userId || '') + '\')" style="cursor: pointer;">' + var row = '<tr style="cursor: default;">' +
checkboxCell + checkboxCell +
'<td>' + (user.nickName || '-') + '</td>' + '<td>' + (user.nickName || '-') + '</td>' +
'<td>' + (user.phoneNumber || '-') + '</td>' + '<td>' + (user.phoneNumber || '-') + '</td>' +
@ -1052,7 +1052,7 @@
'<td>' + (user.followup || '-') + '</td>' + '<td>' + (user.followup || '-') + '</td>' +
'<td>' + responseTime + '</td>' + '<td>' + responseTime + '</td>' +
managerCell + managerCell +
'<td><button onclick="openFollowupModal(\'' + (user.userId || '') + '\', \'' + (user.nickName || '') + '\', \'' + (user.phoneNumber || '') + '\'); event.stopPropagation();" style="padding: 4px 8px; background-color: #1890ff; color: white; border: none; border-radius: 4px; font-size: 12px; margin-right: 4px;">跟进</button> <button onclick="openReturnModal(\'' + (user.userId || '') + '\', \'' + (user.nickName || '') + '\', \'' + (user.phoneNumber || '') + '\', \'' + (user.type || '') + '\'); event.stopPropagation();" style="padding: 4px 8px; background-color: #faad14; color: white; border: none; border-radius: 4px; font-size: 12px; margin-right: 4px;">归还</button> ' + jianDaoYunButton + '</td>' + '<td><button onclick="openFollowupModal(\'' + (user.userId || '') + '\', \'' + (user.nickName || '') + '\', \'' + (user.phoneNumber || '') + '\'); event.stopPropagation();" style="padding: 4px 8px; background-color: #1890ff; color: white; border: none; border-radius: 4px; font-size: 12px; margin-right: 4px;">跟进</button> <button onclick="openDetailModal(\'' + (user.userId || '') + '\'); event.stopPropagation();" style="padding: 4px 8px; background-color: #13c2c2; color: white; border: none; border-radius: 4px; font-size: 12px; margin-right: 4px;">详情</button> <button onclick="openReturnModal(\'' + (user.userId || '') + '\', \'' + (user.nickName || '') + '\', \'' + (user.phoneNumber || '') + '\', \'' + (user.type || '') + '\'); event.stopPropagation();" style="padding: 4px 8px; background-color: #faad14; color: white; border: none; border-radius: 4px; font-size: 12px; margin-right: 4px;">归还</button> ' + jianDaoYunButton + '</td>' +
'</tr>'; '</tr>';
personalBody.innerHTML += row; personalBody.innerHTML += row;
@ -2231,7 +2231,15 @@
<h3 style="margin: 0 0 20px 0; font-size: 18px; font-weight: 600; color: #333; text-align: center;">简道云</h3> <h3 style="margin: 0 0 20px 0; font-size: 18px; font-weight: 600; color: #333; text-align: center;">简道云</h3>
<input type="hidden" id="jianDaoYunUserId"> <input type="hidden" id="jianDaoYunUserId">
<div style="margin-bottom: 24px; text-align: center;"> <div style="margin-bottom: 24px; text-align: center;">
<p style="font-size: 14px; color: #666;">是否将客户拉入你的简道云?</p> <p style="font-size: 14px; color: #666; margin-bottom: 16px;">选择要拉入的系统:</p>
<div style="text-align: left; margin-left: 80px;">
<label style="display: block; margin-bottom: 12px; font-size: 14px; color: #333;">
<input type="radio" name="systemType" value="大贸易系统" checked style="margin-right: 8px;"> 大贸易系统
</label>
<label style="display: block; margin-bottom: 12px; font-size: 14px; color: #333;">
<input type="radio" name="systemType" value="小品种系统" style="margin-right: 8px;"> 小品种系统
</label>
</div>
</div> </div>
<div style="text-align: right; margin-top: 24px;"> <div style="text-align: right; margin-top: 24px;">
<button onclick="closeJianDaoYunModal()" style="padding: 10px 16px; margin-right: 12px; border: 1px solid #d9d9d9; border-radius: 4px; font-size: 14px; color: #666; background-color: white; cursor: pointer; transition: all 0.3s ease;">取消</button> <button onclick="closeJianDaoYunModal()" style="padding: 10px 16px; margin-right: 12px; border: 1px solid #d9d9d9; border-radius: 4px; font-size: 14px; color: #666; background-color: white; cursor: pointer; transition: all 0.3s ease;">取消</button>
@ -2818,7 +2826,7 @@
managerCell = '<td style="display: none;"></td>'; managerCell = '<td style="display: none;"></td>';
} }
var row = '<tr onclick="openDetailModal(\'' + (user.userId || '') + '\')" style="cursor: pointer;">' + var row = '<tr style="cursor: default;">' +
'<td><input type="checkbox" class="userCheckbox" data-userid="' + (user.userId || '') + '"></td>' + '<td><input type="checkbox" class="userCheckbox" data-userid="' + (user.userId || '') + '"></td>' +
'<td>' + (user.nickName || '-') + '</td>' + '<td>' + (user.nickName || '-') + '</td>' +
'<td>' + (user.phoneNumber || '-') + '</td>' + '<td>' + (user.phoneNumber || '-') + '</td>' +
@ -2827,7 +2835,7 @@
'<td>' + (user.followup || '-') + '</td>' + '<td>' + (user.followup || '-') + '</td>' +
'<td>' + responseTime + '</td>' + '<td>' + responseTime + '</td>' +
managerCell + managerCell +
'<td><button onclick="claimCustomer(\'' + (user.userId || '') + '\', \'' + (user.nickName || '') + '\', \'' + (user.phoneNumber || '') + '\'); event.stopPropagation();" style="padding: 4px 8px; background-color: #52c41a; color: white; border: none; border-radius: 4px; font-size: 12px;">认领</button></td>' + '<td><button onclick="openDetailModal(\'' + (user.userId || '') + '\'); event.stopPropagation();" style="padding: 4px 8px; background-color: #13c2c2; color: white; border: none; border-radius: 4px; font-size: 12px; margin-right: 4px;">详情</button> <button onclick="claimCustomer(\'' + (user.userId || '') + '\', \'' + (user.nickName || '') + '\', \'' + (user.phoneNumber || '') + '\'); event.stopPropagation();" style="padding: 4px 8px; background-color: #52c41a; color: white; border: none; border-radius: 4px; font-size: 12px;">认领</button></td>' +
'</tr>'; '</tr>';
publicBody.innerHTML += row; publicBody.innerHTML += row;
@ -2847,6 +2855,8 @@
} }
function claimCustomer(userId, userName, phone) { function claimCustomer(userId, userName, phone) {
// 显示确认弹窗
if (confirm('确认认领该客户吗?')) {
var usersManagements = userInfo.usersManagements; var usersManagements = userInfo.usersManagements;
var params = { var params = {
@ -2878,6 +2888,7 @@
}; };
xhr.send(JSON.stringify(params)); xhr.send(JSON.stringify(params));
} }
}
function openFollowupModal(userId, userName, phone) { function openFollowupModal(userId, userName, phone) {
document.getElementById('followupUserId').value = userId; document.getElementById('followupUserId').value = userId;
@ -3205,8 +3216,12 @@
var userId = document.getElementById('jianDaoYunUserId').value; var userId = document.getElementById('jianDaoYunUserId').value;
var usersManagements = userInfo.usersManagements; var usersManagements = userInfo.usersManagements;
// 获取选中的系统类型
var systemType = document.querySelector('input[name="systemType"]:checked').value;
var params = { var params = {
userId: userId, userId: userId,
systemType: systemType,
userName: usersManagements.userName || '', userName: usersManagements.userName || '',
managercompany: usersManagements.managercompany || '', managercompany: usersManagements.managercompany || '',
managerdepartment: usersManagements.managerdepartment || '', managerdepartment: usersManagements.managerdepartment || '',
@ -3247,7 +3262,8 @@
managercompany: usersManagements.managercompany || '', managercompany: usersManagements.managercompany || '',
managerdepartment: usersManagements.managerdepartment || '', managerdepartment: usersManagements.managerdepartment || '',
organization: usersManagements.organization || '', organization: usersManagements.organization || '',
role: usersManagements.role || '' role: usersManagements.role || '',
assistant: usersManagements.assistant || ''
}; };
var url = '/KH/api/users/return'; var url = '/KH/api/users/return';

Loading…
Cancel
Save