Browse Source

完成公海池客户认领功能,修复编译错误

master
Trae AI 2 months ago
parent
commit
a32d5d1bbd
  1. 54
      src/main/java/com/example/web/controller/CustomerRestController.java
  2. 7
      src/main/java/com/example/web/mapper/CustomerMapper.java
  3. 8
      src/main/java/com/example/web/service/CustomerService.java
  4. 203
      src/main/java/com/example/web/service/impl/CustomerServiceImpl.java
  5. 7
      src/main/resources/mapper/CustomerMapper.xml
  6. 72
      src/main/resources/static/sells.html
  7. 60
      src/main/resources/static/supply.html

54
src/main/java/com/example/web/controller/CustomerRestController.java

@ -206,4 +206,58 @@ public class CustomerRestController {
System.out.println("DEBUG: 记录客户查看操作响应: " + response); System.out.println("DEBUG: 记录客户查看操作响应: " + response);
return response; return response;
} }
/**
* 认领客户
* @param request 认领请求包含客户ID和操作人信息
* @return 响应结果
*/
@PostMapping("/claim")
public Map<String, Object> claimCustomer(@RequestBody Map<String, Object> request) {
Map<String, Object> response = new HashMap<>();
try {
System.out.println("DEBUG: 收到客户认领请求,数据: " + request);
String customerId = (String) request.get("customerId");
// 获取操作人信息
Map<String, Object> operatorInfo = (Map<String, Object>) request.get("operatorInfo");
if (operatorInfo == null) {
operatorInfo = new HashMap<>();
}
// 创建登录者信息对象
Login login = new Login();
login.setProjectName((String) operatorInfo.get("role"));
login.setUserName((String) operatorInfo.get("userName"));
login.setManagercompany((String) operatorInfo.get("company"));
login.setManagerdepartment((String) operatorInfo.get("department"));
login.setOrganization((String) operatorInfo.get("organization"));
if (customerId == null || customerId.isEmpty()) {
response.put("success", false);
response.put("message", "客户认领失败: 参数不完整");
return response;
}
// 调用服务层方法认领客户
boolean success = customerService.claimCustomer(customerId, login);
System.out.println("DEBUG: 客户认领结果: " + success);
if (success) {
response.put("success", true);
response.put("message", "客户认领成功");
} else {
response.put("success", false);
response.put("message", "客户认领失败");
}
} catch (Exception e) {
System.out.println("DEBUG: 客户认领异常,异常信息: " + e.getMessage());
e.printStackTrace();
response.put("success", false);
response.put("message", "客户认领失败: " + e.getMessage());
}
return response;
}
} }

7
src/main/java/com/example/web/mapper/CustomerMapper.java

@ -90,6 +90,13 @@ public interface CustomerMapper {
*/ */
Contacts getContactsByPhoneNumber(@Param("phoneNumber") String phoneNumber); Contacts getContactsByPhoneNumber(@Param("phoneNumber") String phoneNumber);
/**
* 根据ID获取联系人信息
* @param id 联系人ID
* @return 联系人信息
*/
Contacts getContactsById(@Param("id") String id);
/** /**
* 更新联系人信息 * 更新联系人信息
* @param contacts 联系人信息 * @param contacts 联系人信息

8
src/main/java/com/example/web/service/CustomerService.java

@ -85,4 +85,12 @@ public interface CustomerService {
* @return 是否成功 * @return 是否成功
*/ */
boolean saveOperationRecord(String userId, Login login, String operationEvent, String originalData, String modifiedData, String changedFields); boolean saveOperationRecord(String userId, Login login, String operationEvent, String originalData, String modifiedData, String changedFields);
/**
* 认领客户
* @param customerId 客户ID
* @param login 登录者信息
* @return 是否成功
*/
boolean claimCustomer(String customerId, Login login);
} }

203
src/main/java/com/example/web/service/impl/CustomerServiceImpl.java

@ -231,6 +231,209 @@ public class CustomerServiceImpl implements CustomerService {
} }
} }
@Override
public boolean claimCustomer(String customerId, Login login) {
try {
// 获取当前时间
LocalDateTime now = LocalDateTime.now();
System.out.println("DEBUG: 开始认领客户,客户ID: " + customerId);
// 1. 尝试从primary数据源查找客户
Contacts contacts = null;
int retryCount = 0;
int maxRetries = 3;
long retryDelay = 1000; // 1秒
while (retryCount < maxRetries) {
try {
contacts = customerMapper.getContactsById(customerId);
break; // 获取成功,退出重试循环
} catch (Exception e) {
retryCount++;
System.out.println("DEBUG: 第" + retryCount + "次尝试获取primary数据源连接失败,异常信息: " + e.getMessage());
if (retryCount >= maxRetries) {
throw e; // 达到最大重试次数,抛出异常
}
// 等待一段时间后重试
Thread.sleep(retryDelay);
retryDelay *= 2; // 指数退避
}
}
if (contacts != null) {
System.out.println("DEBUG: 在primary数据源中找到客户");
// 获取企业信息和负责人信息
Enterprise enterprise = customerMapper.getEnterpriseByContactId(contacts.getId());
Managers managers = customerMapper.getManagerByContactId(contacts.getId());
// 保存原始数据用于操作记录
StringBuilder originalData = new StringBuilder("{");
if (enterprise != null) {
originalData.append("\"level\": \"" + (enterprise.getLevel() == null ? "" : enterprise.getLevel()) + "\",");
}
if (managers != null) {
originalData.append("\"managercompany\": \"" + (managers.getManagercompany() == null ? "" : managers.getManagercompany()) + "\",");
originalData.append("\"managerdepartment\": \"" + (managers.getManagerdepartment() == null ? "" : managers.getManagerdepartment()) + "\",");
originalData.append("\"organization\": \"" + (managers.getOrganization() == null ? "" : managers.getOrganization()) + "\",");
originalData.append("\"userName\": \"" + (managers.getUserName() == null ? "" : managers.getUserName()) + "\",");
}
// 移除末尾逗号
if (originalData.length() > 1 && originalData.charAt(originalData.length() - 1) == ',') {
originalData.setLength(originalData.length() - 1);
}
originalData.append("}");
// 更新企业等级为未分级
String originalLevel = null;
if (enterprise != null) {
originalLevel = enterprise.getLevel();
enterprise.setLevel("unclassified");
customerMapper.updateEnterprise(enterprise);
}
// 更新负责人信息
String originalManagerInfo = "";
if (managers != null) {
originalManagerInfo = managers.getManagercompany() + "," + managers.getManagerdepartment() + "," + managers.getOrganization() + "," + managers.getUserName();
managers.setManagercompany(login.getManagercompany());
managers.setManagerdepartment(login.getManagerdepartment());
managers.setOrganization(login.getOrganization());
managers.setUserName(login.getUserName());
customerMapper.updateManagers(managers);
} else {
managers = new Managers();
managers.setId(contacts.getId());
managers.setManagercompany(login.getManagercompany());
managers.setManagerdepartment(login.getManagerdepartment());
managers.setOrganization(login.getOrganization());
managers.setUserName(login.getUserName());
managers.setRole(login.getProjectName());
managers.setCreated_at(now);
managers.setUpdated_at(now);
customerMapper.insertManagers(managers);
}
// 构建修改后的数据
StringBuilder modifiedData = new StringBuilder("{");
modifiedData.append("\"level\": \"unclassified\",");
modifiedData.append("\"managercompany\": \"" + login.getManagercompany() + "\",");
modifiedData.append("\"managerdepartment\": \"" + login.getManagerdepartment() + "\",");
modifiedData.append("\"organization\": \"" + login.getOrganization() + "\",");
modifiedData.append("\"userName\": \"" + login.getUserName() + "\"");
modifiedData.append("}");
// 保存操作记录
String changedFields = "[\"level\", \"managercompany\", \"managerdepartment\", \"organization\", \"userName\"]";
saveOperationRecord(contacts.getId(), login, "认领客户", originalData.toString(), modifiedData.toString(), changedFields);
// 记录客户认领操作
customerTraceUtil.recordCustomerFollowup(contacts.getId(), login.getManagercompany(), login.getManagerdepartment(), login.getOrganization(), login.getProjectName(), login.getUserName(), originalData.toString(), modifiedData.toString(), changedFields);
return true;
}
System.out.println("DEBUG: 在primary数据源中未找到客户,尝试从wechat数据源查找");
// 2. 尝试从wechat数据源查找客户
Users user = null;
retryCount = 0;
retryDelay = 1000; // 1秒
while (retryCount < maxRetries) {
try {
user = wechatCustomerMapper.getUsersByUserId(customerId);
break; // 获取成功,退出重试循环
} catch (Exception e) {
retryCount++;
System.out.println("DEBUG: 第" + retryCount + "次尝试获取wechat数据源连接失败,异常信息: " + e.getMessage());
if (retryCount >= maxRetries) {
throw e; // 达到最大重试次数,抛出异常
}
// 等待一段时间后重试
Thread.sleep(retryDelay);
retryDelay *= 2; // 指数退避
}
}
if (user != null) {
System.out.println("DEBUG: 在wechat数据源中找到客户");
// 获取负责人信息
UsersManagements managements = wechatCustomerMapper.getManagementsByUserId(user.getUserId());
// 保存原始数据用于操作记录
StringBuilder originalData = new StringBuilder("{");
originalData.append("\"level\": \"" + (user.getLevel() == null ? "" : user.getLevel()) + "\",");
if (managements != null) {
originalData.append("\"managercompany\": \"" + (managements.getManagercompany() == null ? "" : managements.getManagercompany()) + "\",");
originalData.append("\"managerdepartment\": \"" + (managements.getManagerdepartment() == null ? "" : managements.getManagerdepartment()) + "\",");
originalData.append("\"organization\": \"" + (managements.getOrganization() == null ? "" : managements.getOrganization()) + "\",");
originalData.append("\"userName\": \"" + (managements.getUserName() == null ? "" : managements.getUserName()) + "\",");
}
// 移除末尾逗号
if (originalData.length() > 1 && originalData.charAt(originalData.length() - 1) == ',') {
originalData.setLength(originalData.length() - 1);
}
originalData.append("}");
// 更新用户等级为未分级
user.setLevel("unclassified");
user.setUpdated_at(now);
// 更新负责人信息
if (managements == null) {
managements = new UsersManagements();
managements.setUserId(user.getUserId());
}
managements.setManagercompany(login.getManagercompany());
managements.setManagerdepartment(login.getManagerdepartment());
managements.setOrganization(login.getOrganization());
managements.setUserName(login.getUserName());
managements.setRole(login.getProjectName());
int result = wechatCustomerMapper.updateUsers(user);
// 保存或更新负责人信息
int managerResult = wechatCustomerMapper.getManagementsByUserId(user.getUserId()) == null
? wechatCustomerMapper.updateUsersManagements(managements)
: wechatCustomerMapper.updateUsersManagements(managements);
System.out.println("DEBUG: 更新wechat数据源用户结果: " + result + ", 更新负责人结果: " + managerResult);
// 保存操作记录
if (result > 0 || managerResult > 0) {
StringBuilder modifiedData = new StringBuilder("{");
modifiedData.append("\"level\": \"unclassified\",");
modifiedData.append("\"managercompany\": \"" + login.getManagercompany() + "\",");
modifiedData.append("\"managerdepartment\": \"" + login.getManagerdepartment() + "\",");
modifiedData.append("\"organization\": \"" + login.getOrganization() + "\",");
modifiedData.append("\"userName\": \"" + login.getUserName() + "\"");
modifiedData.append("}");
String changedFields = "[\"level\", \"managercompany\", \"managerdepartment\", \"organization\", \"userName\"]";
saveOperationRecord(String.valueOf(user.getUserId()), login, "认领客户", originalData.toString(), modifiedData.toString(), changedFields);
// 记录客户认领操作
customerTraceUtil.recordCustomerFollowup(String.valueOf(user.getUserId()), login.getManagercompany(), login.getManagerdepartment(), login.getOrganization(), login.getProjectName(), login.getUserName(), originalData.toString(), modifiedData.toString(), changedFields);
}
return result > 0;
}
System.out.println("DEBUG: 在两个数据源中都未找到客户信息");
return false;
} catch (InterruptedException e) {
System.out.println("DEBUG: 认领客户过程中线程被中断,异常信息: " + e.getMessage());
Thread.currentThread().interrupt();
throw new RuntimeException("认领客户失败: 线程中断");
} catch (Exception e) {
System.out.println("DEBUG: 认领客户失败,异常信息: " + e.getMessage());
e.printStackTrace();
throw new RuntimeException("认领客户失败: " + e.getMessage());
}
}
@Override @Override
public List<CustomerData> getDepartmentSeaPool(String role, Login login) { public List<CustomerData> getDepartmentSeaPool(String role, Login login) {
// 移除重复解码,前端已解码 // 移除重复解码,前端已解码

7
src/main/resources/mapper/CustomerMapper.xml

@ -125,6 +125,13 @@
WHERE phoneNumber = #{phoneNumber} WHERE phoneNumber = #{phoneNumber}
</select> </select>
<!-- 根据ID获取联系人信息 -->
<select id="getContactsById" parameterType="String" resultMap="ContactsResultMap">
SELECT contact_id, id, nickName, phoneNumber, wechat, account, accountNumber, bank, address, followup, created_at, updated_at
FROM contacts
WHERE id = #{id}
</select>
<!-- 更新联系人信息 --> <!-- 更新联系人信息 -->
<update id="updateContacts" parameterType="com.example.web.entity.Contacts"> <update id="updateContacts" parameterType="com.example.web.entity.Contacts">
UPDATE contacts UPDATE contacts

72
src/main/resources/static/sells.html

@ -5025,6 +5025,62 @@
alert('客户新增成功!'); alert('客户新增成功!');
}); });
// 认领客户功能
function claimCustomer(customerId) {
console.log('认领客户:', customerId);
const customer = customerData[customerId];
if (!customer) {
console.log('客户不存在:', customerId);
alert('客户不存在!');
return;
}
// 获取登录用户信息
const loginInfo = getLoginUserInfo();
console.log('登录者信息:', loginInfo);
// 构造请求数据
const requestData = {
customerId: customerId,
operatorInfo: {
company: loginInfo.managercompany,
department: loginInfo.managerdepartment,
organization: loginInfo.organization,
role: loginInfo.projectName,
userName: loginInfo.userName
}
};
// 发送POST请求认领客户
fetch('/DL/api/customer/claim', {
method: 'POST',
headers: {
'Content-Type': 'application/json',
},
body: JSON.stringify(requestData)
})
.then(response => response.json())
.then(data => {
console.log('认领客户结果:', data);
if (data.success) {
alert('客户认领成功!');
// 刷新公海池列表
if (currentTab === 'departmentSeaPool') {
showDepartmentSeaPool();
} else if (currentTab === 'organizationSeaPool') {
showOrganizationSeaPool();
}
} else {
alert('客户认领失败: ' + (data.message || '未知错误'));
}
})
.catch(error => {
console.error('认领客户失败:', error);
alert('客户认领失败: 网络错误');
});
}
// 查看详情功能 // 查看详情功能
function viewCustomerDetails(customerId) { function viewCustomerDetails(customerId) {
console.log('查看客户详情:', customerId); console.log('查看客户详情:', customerId);
@ -5128,9 +5184,21 @@
document.getElementById('detail-specification').textContent = customer.specification || '-'; document.getElementById('detail-specification').textContent = customer.specification || '-';
document.getElementById('detail-quantity').textContent = customer.quantity || '-'; document.getElementById('detail-quantity').textContent = customer.quantity || '-';
document.getElementById('detail-weight').textContent = customer.weight || '-'; document.getElementById('detail-weight').textContent = customer.weight || '-';
// 公海池客户将编辑按钮改为认领按钮
const editSaveBtn = document.getElementById('editSaveBtn');
editSaveBtn.textContent = '认领';
editSaveBtn.onclick = function() {
claimCustomer(customer.id);
};
} else { } else {
console.log('隐藏公海需求区域'); console.log('隐藏公海需求区域');
publicSeaDemandSection.style.display = 'none'; publicSeaDemandSection.style.display = 'none';
// 普通客户恢复编辑按钮功能
const editSaveBtn = document.getElementById('editSaveBtn');
editSaveBtn.textContent = '编辑';
editSaveBtn.onclick = toggleEditMode;
} }
document.getElementById('customerModal').classList.add('active'); document.getElementById('customerModal').classList.add('active');
@ -6246,7 +6314,7 @@
<td>${customer.created_at || ''}</td> <td>${customer.created_at || ''}</td>
<td>${customer.updated_at || ''}</td> <td>${customer.updated_at || ''}</td>
<td> <td>
<button class="action-btn follow-customer" onclick="event.stopPropagation(); viewCustomerDetails('${customer.id}')">详情</button> <button class="action-btn follow-customer" onclick="event.stopPropagation(); claimCustomer('${customer.id}')">认领</button>
</td> </td>
`; `;
@ -6281,7 +6349,7 @@
<td>${customer.created_at || ''}</td> <td>${customer.created_at || ''}</td>
<td>${customer.updated_at || ''}</td> <td>${customer.updated_at || ''}</td>
<td> <td>
<button class="action-btn follow-customer" onclick="event.stopPropagation(); viewCustomerDetails('${customer.id}')">详情</button> <button class="action-btn follow-customer" onclick="event.stopPropagation(); claimCustomer('${customer.id}')">认领</button>
</td> </td>
`; `;

60
src/main/resources/static/supply.html

@ -5028,6 +5028,62 @@
alert('客户新增成功!'); alert('客户新增成功!');
}); });
// 认领客户功能
function claimCustomer(customerId) {
console.log('认领客户:', customerId);
const customer = customerData[customerId];
if (!customer) {
console.log('客户不存在:', customerId);
alert('客户不存在!');
return;
}
// 获取登录用户信息
const loginInfo = getLoginInfo();
console.log('登录者信息:', loginInfo);
// 构造请求数据
const requestData = {
customerId: customerId,
operatorInfo: {
company: loginInfo.managercompany,
department: loginInfo.managerdepartment,
organization: loginInfo.organization,
role: loginInfo.projectName,
userName: loginInfo.userName
}
};
// 发送POST请求认领客户
fetch('/DL/api/customer/claim', {
method: 'POST',
headers: {
'Content-Type': 'application/json',
},
body: JSON.stringify(requestData)
})
.then(response => response.json())
.then(data => {
console.log('认领客户结果:', data);
if (data.success) {
alert('客户认领成功!');
// 刷新公海池列表
if (currentTab === 'departmentSeaPool') {
showDepartmentSeaPool();
} else if (currentTab === 'organizationSeaPool') {
showOrganizationSeaPool();
}
} else {
alert('客户认领失败: ' + (data.message || '未知错误'));
}
})
.catch(error => {
console.error('认领客户失败:', error);
alert('客户认领失败: 网络错误');
});
}
// 查看详情功能 // 查看详情功能
function viewCustomerDetails(customerId) { function viewCustomerDetails(customerId) {
console.log('查看客户详情:', customerId); console.log('查看客户详情:', customerId);
@ -6299,7 +6355,7 @@
<td>${customer.created_at || '-'}</td> <td>${customer.created_at || '-'}</td>
<td>${customer.updated_at || '-'}</td> <td>${customer.updated_at || '-'}</td>
<td> <td>
<button class="action-btn follow-customer" onclick="event.stopPropagation(); viewCustomerDetails('${customer.id}')">详情</button> <button class="action-btn follow-customer" onclick="event.stopPropagation(); claimCustomer('${customer.id}')">认领</button>
</td> </td>
</tr> </tr>
`; `;
@ -6335,7 +6391,7 @@
<td>${customer.created_at || '-'}</td> <td>${customer.created_at || '-'}</td>
<td>${customer.updated_at || '-'}</td> <td>${customer.updated_at || '-'}</td>
<td> <td>
<button class="action-btn follow-customer" onclick="event.stopPropagation(); viewCustomerDetails('${customer.id}')">详情</button> <button class="action-btn follow-customer" onclick="event.stopPropagation(); claimCustomer('${customer.id}')">认领</button>
</td> </td>
</tr> </tr>
`; `;

Loading…
Cancel
Save