diff --git a/config/env.ts b/config/env.ts index aefa726..0a5c838 100644 --- a/config/env.ts +++ b/config/env.ts @@ -2,8 +2,8 @@ export const ENV_CONFIG = { // 开发环境 development: { - // API_BASE_URL: 'http://127.0.0.1:9200/api', - API_BASE_URL: 'https://ysb-api.websoft.top/api', + API_BASE_URL: 'http://127.0.0.1:9200/api', + // API_BASE_URL: 'https://ysb-api.websoft.top/api', APP_NAME: '开发环境', DEBUG: 'true', }, diff --git a/src/credit/mp-customer/follow-step2.tsx b/src/credit/mp-customer/follow-step2.tsx index bf5565d..eaf5b15 100644 --- a/src/credit/mp-customer/follow-step2.tsx +++ b/src/credit/mp-customer/follow-step2.tsx @@ -137,6 +137,8 @@ export default function CreditMpCustomerFollowStep2Page() { const step1Done = useMemo(() => { const anyRow = row as any + // 第二步只需要第一步提交即可进入,不需要审核通过 + // 因为第一次有意向的沟通不需要审核 return Boolean(anyRow?.followStep1Submitted) || Boolean(anyRow?.followStep1SubmittedAt) }, [row]) diff --git a/src/credit/mp-customer/follow-step3.tsx b/src/credit/mp-customer/follow-step3.tsx index 310381c..f32c5a2 100644 --- a/src/credit/mp-customer/follow-step3.tsx +++ b/src/credit/mp-customer/follow-step3.tsx @@ -249,7 +249,7 @@ export default function CreditMpCustomerFollowStep3Page() { const step2Done = useMemo(() => { const anyRow = row as any - return Boolean(anyRow?.followStep2Submitted) || Boolean(anyRow?.followStep2SubmittedAt) + return Boolean(anyRow?.followStep2Approved) || Boolean(anyRow?.followStep2ApprovedAt) }, [row]) const canEdit = !submitted && step2Done diff --git a/src/credit/mp-customer/follow-step4.tsx b/src/credit/mp-customer/follow-step4.tsx index 9d33964..8256191 100644 --- a/src/credit/mp-customer/follow-step4.tsx +++ b/src/credit/mp-customer/follow-step4.tsx @@ -186,7 +186,7 @@ export default function CreditMpCustomerFollowStep4Page() { const step3Done = useMemo(() => { const anyRow = row as any - return Boolean(anyRow?.followStep3Submitted) || Boolean(anyRow?.followStep3SubmittedAt) + return Boolean(anyRow?.followStep3Approved) || Boolean(anyRow?.followStep3ApprovedAt) }, [row]) const canEdit = !submitted && step3Done diff --git a/src/credit/mp-customer/follow-step5.tsx b/src/credit/mp-customer/follow-step5.tsx index 8ffb96d..bee1495 100644 --- a/src/credit/mp-customer/follow-step5.tsx +++ b/src/credit/mp-customer/follow-step5.tsx @@ -135,7 +135,7 @@ export default function CreditMpCustomerFollowStep5Page() { const step4Done = useMemo(() => { const anyRow = row as any - return Boolean(anyRow?.followStep4Submitted) || Boolean(anyRow?.followStep4SubmittedAt) + return Boolean(anyRow?.followStep4Approved) || Boolean(anyRow?.followStep4ApprovedAt) }, [row]) const canEdit = !submitted && step4Done diff --git a/src/credit/mp-customer/follow-step6.tsx b/src/credit/mp-customer/follow-step6.tsx index eb85bde..dcbba31 100644 --- a/src/credit/mp-customer/follow-step6.tsx +++ b/src/credit/mp-customer/follow-step6.tsx @@ -175,7 +175,7 @@ export default function CreditMpCustomerFollowStep6Page() { const step5Done = useMemo(() => { const anyRow = row as any - return Boolean(anyRow?.followStep5Submitted) || Boolean(anyRow?.followStep5SubmittedAt) + return Boolean(anyRow?.followStep5Approved) || Boolean(anyRow?.followStep5ApprovedAt) }, [row]) const addExpectedPayment = useCallback(async () => { diff --git a/src/credit/mp-customer/follow-step7.tsx b/src/credit/mp-customer/follow-step7.tsx index 4a5d4ce..355d8c8 100644 --- a/src/credit/mp-customer/follow-step7.tsx +++ b/src/credit/mp-customer/follow-step7.tsx @@ -172,7 +172,7 @@ export default function CreditMpCustomerFollowStep7Page() { const step6Done = useMemo(() => { const anyRow = row as any - return Boolean(anyRow?.followStep6Submitted) || Boolean(anyRow?.followStep6SubmittedAt) + return Boolean(anyRow?.followStep6Approved) || Boolean(anyRow?.followStep6ApprovedAt) }, [row]) const canEdit = !submitted && step6Done diff --git a/后端Controller修改提示.md b/后端Controller修改提示.md new file mode 100644 index 0000000..0c6e48e --- /dev/null +++ b/后端Controller修改提示.md @@ -0,0 +1,298 @@ +# 后端Controller修改提示词 + +## 🎯 需要修改的文件 +`/Users/gxwebsoft/VUE/template-10579/JAVA/mp-java/src/main/java/com/gxwebsoft/credit/controller/CreditMpCustomerController.java` + +## 📝 具体修改内容 + +### 1. 添加新的接口方法 + +在现有的 `CreditMpCustomerController` 类中添加以下方法: + +```java +/** + * 审核跟进步骤 + */ +@PostMapping("/approve-follow-step") +@OperLog(title = "审核跟进步骤", businessType = BusinessType.UPDATE) +public R approveFollowStep(@RequestBody FollowStepApprovalDTO dto) { + creditMpCustomerService.approveFollowStep(dto); + return R.ok(); +} + +/** + * 批量审核跟进步骤 + */ +@PostMapping("/batch-approve-follow-steps") +@OperLog(title = "批量审核跟进步骤", businessType = BusinessType.UPDATE) +public R batchApproveFollowSteps(@RequestBody BatchFollowStepApprovalDTO dto) { + creditMpCustomerService.batchApproveFollowSteps(dto); + return R.ok(); +} + +/** + * 获取待审核的跟进步骤列表 + */ +@GetMapping("/pending-approval-steps") +@OperLog(title = "获取待审核跟进步骤", businessType = BusinessType.SELECT) +public R> getPendingApprovalSteps(FollowStepQueryDTO query) { + List list = creditMpCustomerService.getPendingApprovalSteps(query); + return R.ok(list); +} + +/** + * 获取客户跟进统计 + */ +@GetMapping("/follow-statistics/{customerId}") +@OperLog(title = "获取客户跟进统计", businessType = BusinessType.SELECT) +public R getFollowStatistics(@PathVariable Long customerId) { + FollowStatisticsDTO statistics = creditMpCustomerService.getFollowStatistics(customerId); + return R.ok(statistics); +} + +/** + * 结束客户跟进流程 + */ +@PostMapping("/end-follow-process") +@OperLog(title = "结束客户跟进流程", businessType = BusinessType.UPDATE) +public R endFollowProcess(@RequestBody EndFollowProcessDTO dto) { + creditMpCustomerService.endFollowProcess(dto.getCustomerId(), dto.getReason()); + return R.ok(); +} +``` + +### 2. 添加必要的导入 + +在文件顶部添加以下导入语句: + +```java +import com.your.package.dto.FollowStepApprovalDTO; +import com.your.package.dto.BatchFollowStepApprovalDTO; +import com.your.package.dto.FollowStepQueryDTO; +import com.your.package.dto.PendingApprovalStepVO; +import com.your.package.dto.FollowStatisticsDTO; +import com.your.package.dto.EndFollowProcessDTO; +import com.your.package.annotation.OperLog; +import com.your.package.enums.BusinessType; +``` + +### 3. 需要创建的DTO类 + +#### FollowStepApprovalDTO.java +```java +@Data +public class FollowStepApprovalDTO { + private Long customerId; + private Integer step; + private Boolean approved; + private String remark; +} +``` + +#### BatchFollowStepApprovalDTO.java +```java +@Data +public class BatchFollowStepApprovalDTO { + private List approvals; +} +``` + +#### FollowStepQueryDTO.java +```java +@Data +public class FollowStepQueryDTO { + private Integer step; + private Long customerId; + private Long userId; +} +``` + +#### PendingApprovalStepVO.java +```java +@Data +public class PendingApprovalStepVO { + private Long customerId; + private String customerName; + private Integer step; + private String stepTitle; + private String submittedAt; + private String submittedBy; + private Object content; +} +``` + +#### FollowStatisticsDTO.java +```java +@Data +public class FollowStatisticsDTO { + private Integer totalSteps; + private Integer completedSteps; + private Integer currentStep; + private Double progress; + private List stepDetails; +} +``` + +#### FollowStepDetailDTO.java +```java +@Data +public class FollowStepDetailDTO { + private Integer step; + private String title; + private String status; // pending, submitted, approved, rejected + private String submittedAt; + private String approvedAt; +} +``` + +#### EndFollowProcessDTO.java +```java +@Data +public class EndFollowProcessDTO { + private Long customerId; + private String reason; +} +``` + +### 4. Service层需要添加的方法 + +在 `CreditMpCustomerService` 接口中添加: + +```java +/** + * 审核跟进步骤 + */ +void approveFollowStep(FollowStepApprovalDTO dto); + +/** + * 批量审核跟进步骤 + */ +void batchApproveFollowSteps(BatchFollowStepApprovalDTO dto); + +/** + * 获取待审核的跟进步骤列表 + */ +List getPendingApprovalSteps(FollowStepQueryDTO query); + +/** + * 获取客户跟进统计 + */ +FollowStatisticsDTO getFollowStatistics(Long customerId); + +/** + * 结束客户跟进流程 + */ +void endFollowProcess(Long customerId, String reason); +``` + +### 5. 实体类修改 + +在 `CreditMpCustomer.java` 中添加第5-7步的字段: + +```java +// 第5步字段 +private Integer followStep5Submitted; +private String followStep5SubmittedAt; +private String followStep5Contracts; +private Integer followStep5NeedApproval; +private Integer followStep5Approved; +private String followStep5ApprovedAt; +private Long followStep5ApprovedBy; + +// 第6步字段 +private Integer followStep6Submitted; +private String followStep6SubmittedAt; +private String followStep6PaymentRecords; +private String followStep6ExpectedPayments; +private Integer followStep6NeedApproval; +private Integer followStep6Approved; +private String followStep6ApprovedAt; +private Long followStep6ApprovedBy; + +// 第7步字段 +private Integer followStep7Submitted; +private String followStep7SubmittedAt; +private String followStep7VisitRecords; +private Integer followStep7NeedApproval; +private Integer followStep7Approved; +private String followStep7ApprovedAt; +private Long followStep7ApprovedBy; + +// 流程结束字段 +private Integer followProcessEnded; +private String followProcessEndTime; +private String followProcessEndReason; +``` + +### 6. 数据库修改 + +执行以下SQL语句: + +```sql +-- 第5步字段 +ALTER TABLE credit_mp_customer ADD COLUMN follow_step5_submitted TINYINT DEFAULT 0; +ALTER TABLE credit_mp_customer ADD COLUMN follow_step5_submitted_at VARCHAR(255); +ALTER TABLE credit_mp_customer ADD COLUMN follow_step5_contracts TEXT; +ALTER TABLE credit_mp_customer ADD COLUMN follow_step5_need_approval TINYINT DEFAULT 1; +ALTER TABLE credit_mp_customer ADD COLUMN follow_step5_approved TINYINT DEFAULT 0; +ALTER TABLE credit_mp_customer ADD COLUMN follow_step5_approved_at VARCHAR(255); +ALTER TABLE credit_mp_customer ADD COLUMN follow_step5_approved_by BIGINT; + +-- 第6步字段 +ALTER TABLE credit_mp_customer ADD COLUMN follow_step6_submitted TINYINT DEFAULT 0; +ALTER TABLE credit_mp_customer ADD COLUMN follow_step6_submitted_at VARCHAR(255); +ALTER TABLE credit_mp_customer ADD COLUMN follow_step6_payment_records TEXT; +ALTER TABLE credit_mp_customer ADD COLUMN follow_step6_expected_payments TEXT; +ALTER TABLE credit_mp_customer ADD COLUMN follow_step6_need_approval TINYINT DEFAULT 1; +ALTER TABLE credit_mp_customer ADD COLUMN follow_step6_approved TINYINT DEFAULT 0; +ALTER TABLE credit_mp_customer ADD COLUMN follow_step6_approved_at VARCHAR(255); +ALTER TABLE credit_mp_customer ADD COLUMN follow_step6_approved_by BIGINT; + +-- 第7步字段 +ALTER TABLE credit_mp_customer ADD COLUMN follow_step7_submitted TINYINT DEFAULT 0; +ALTER TABLE credit_mp_customer ADD COLUMN follow_step7_submitted_at VARCHAR(255); +ALTER TABLE credit_mp_customer ADD COLUMN follow_step7_visit_records TEXT; +ALTER TABLE credit_mp_customer ADD COLUMN follow_step7_need_approval TINYINT DEFAULT 1; +ALTER TABLE credit_mp_customer ADD COLUMN follow_step7_approved TINYINT DEFAULT 0; +ALTER TABLE credit_mp_customer ADD COLUMN follow_step7_approved_at VARCHAR(255); +ALTER TABLE credit_mp_customer ADD COLUMN follow_step7_approved_by BIGINT; + +-- 流程结束字段 +ALTER TABLE credit_mp_customer ADD COLUMN follow_process_ended TINYINT DEFAULT 0; +ALTER TABLE credit_mp_customer ADD COLUMN follow_process_end_time VARCHAR(255); +ALTER TABLE credit_mp_customer ADD COLUMN follow_process_end_reason TEXT; +``` + +## 🔧 实施步骤 + +1. **数据库修改**:先执行SQL脚本添加字段 +2. **实体类修改**:更新 `CreditMpCustomer.java` +3. **DTO类创建**:创建所有需要的DTO类 +4. **Service接口**:添加方法定义 +5. **Service实现**:实现具体业务逻辑 +6. **Controller修改**:添加新的接口方法 +7. **Mapper修改**:添加必要的SQL查询 + +## ⚠️ 注意事项 + +1. **包名替换**:请将 `com.your.package` 替换为实际的包名 +2. **注解检查**:确保 `@OperLog` 和 `BusinessType` 存在 +3. **事务处理**:审核方法需要添加 `@Transactional` 注解 +4. **权限控制**:根据需要添加权限验证注解 +5. **数据验证**:在Service层添加必要的数据验证逻辑 + +## 🧪 测试建议 + +1. 测试步骤提交和审核流程 +2. 测试批量审核功能 +3. 测试统计接口返回的数据格式 +4. 测试流程结束功能 +5. 验证步骤解锁逻辑是否正确 + +## 📋 完整的业务流程 + +1. 销售人员提交步骤 → 设置 `submitted=1`, `needApproval=1` +2. 管理员审核 → 设置 `approved=0/1`, 记录审核时间和审核人 +3. 前端检查 `approved` 状态决定是否解锁下一步 +4. 支持查看待审核列表和批量操作 +5. 提供进度统计和流程管理功能 diff --git a/测试步骤功能.md b/测试步骤功能.md new file mode 100644 index 0000000..79ca876 --- /dev/null +++ b/测试步骤功能.md @@ -0,0 +1,193 @@ +# 步骤功能测试指南 + +## 🧪 测试第一步截图功能 + +### 测试步骤: +1. 进入第一步页面(加微信前沟通) +2. 检查以下功能是否正常: + +#### 短信截图功能: +- [ ] 点击 "+" 按钮是否能打开图片选择 +- [ ] 选择图片后是否能正常上传 +- [ ] 上传后是否显示图片缩略图 +- [ ] 点击图片是否能预览 +- [ ] 长按或点击图片是否能弹出"预览/删除"选项 +- [ ] 删除功能是否正常 +- [ ] 最多只能上传6张图片 + +#### 电话沟通截图功能: +- [ ] 点击 "+" 按钮是否能打开图片选择 +- [ ] 选择图片后是否能正常上传 +- [ ] 上传后是否显示图片缩略图 +- [ ] 点击图片是否能预览 +- [ ] 长按或点击图片是否能弹出"预览/删除"选项 +- [ ] 删除功能是否正常 +- [ ] 最多只能上传6张图片 + +### 可能的问题和解决方案: + +#### 1. 点击 "+" 没反应 +**可能原因:** +- `canEdit` 为 false(已提交状态) +- `chooseAndUploadImages` 函数有问题 + +**检查方法:** +```javascript +// 在浏览器控制台检查 +console.log('canEdit:', canEdit); +console.log('smsShots.length:', smsShots.length); +``` + +#### 2. 图片选择失败 +**可能原因:** +- 没有相机/相册权限 +- Taro.chooseImage 配置问题 + +**解决方案:** +```javascript +// 检查权限 +try { + await Taro.authorize({ scope: 'scope.camera' }); + await Taro.authorize({ scope: 'scope.writePhotosAlbum' }); +} catch (e) { + console.error('权限获取失败:', e); +} +``` + +#### 3. 图片上传失败 +**可能原因:** +- `uploadFileByPath` 函数问题 +- 网络问题 +- 文件路径问题 + +**检查方法:** +```javascript +// 检查上传函数 +console.log('uploadFileByPath:', uploadFileByPath); +``` + +## 🧪 测试第二步跳转功能 + +### 测试步骤: +1. 完成第一步提交 +2. 进入第二步页面 +3. 填写所有必填项: + - [ ] 微信号 + - [ ] 添加微信截图 + - [ ] 沟通情况 +4. 点击提交按钮 +5. 检查是否跳转到第三步 + +### 可能的问题和解决方案: + +#### 1. 第二步无法提交 +**可能原因:** +- 第一步未提交 +- 表单验证失败 +- 网络问题 + +**检查方法:** +```javascript +// 检查第一步状态 +console.log('step1Done:', step1Done); +console.log('wechatId:', wechatId); +console.log('screenshot:', screenshot); +console.log('remark:', remark); +``` + +#### 2. 提交后不跳转 +**可能原因:** +- 提交失败 +- 跳转URL错误 +- Taro.redirectTo 问题 + +**检查方法:** +```javascript +// 检查提交结果 +console.log('提交结果:', res); +// 检查跳转URL +console.log('跳转URL:', `/credit/mp-customer/follow-step3?id=${customerId}`); +``` + +## 🔧 调试技巧 + +### 1. 启用详细日志 +在代码中添加更多 console.log: +```javascript +const chooseAndUploadImages = useCallback(async (kind: 'sms' | 'call') => { + console.log('chooseAndUploadImages called:', kind); + console.log('canEdit:', canEdit); + console.log('current length:', kind === 'sms' ? smsShots.length : callShots.length); + + if (!canEdit) { + console.log('Cannot edit: submitted'); + return; + } + + // ... 其他代码 +}, [callShots, canEdit, smsShots]); +``` + +### 2. 检查网络请求 +```javascript +// 在上传函数中添加 +console.log('Uploading file:', p); +const record = await uploadFileByPath(p); +console.log('Upload result:', record); +``` + +### 3. 检查状态更新 +```javascript +// 在状态更新后 +console.log('Updated smsShots:', smsShots); +console.log('Updated callShots:', callShots); +``` + +## 📱 微信小程序特殊注意事项 + +### 1. 权限问题 +微信小程序需要特殊权限: +- `scope.camera` - 相机 +- `scope.writePhotosAlbum` - 相册 + +### 2. 文件路径问题 +微信小程序的临时文件路径可能不同,需要兼容处理: +```javascript +const pathsFromChooseImageResult = (res: any): string[] => { + const a = res?.tempFilePaths; + if (Array.isArray(a) && a.length) { + return a.map((p: any) => String(p || '').trim()).filter(Boolean); + } + const files = res?.tempFiles; + if (Array.isArray(files) && files.length) { + return files.map((f: any) => String(f?.path || '').trim()).filter(Boolean); + } + return []; +}; +``` + +### 3. 调试工具 +使用微信开发者工具的调试功能: +- Console 面板查看日志 +- Network 面板查看网络请求 +- Sources 面板断点调试 + +## 🚀 常见问题解决 + +### 问题1:截图上传后不显示 +**解决方案:** +1. 检查图片URL是否有效 +2. 检查缩略图生成 +3. 检查状态更新 + +### 问题2:提交后不跳转 +**解决方案:** +1. 检查提交是否成功 +2. 检查跳转URL是否正确 +3. 检查页面是否存在 + +### 问题3:按钮点击没反应 +**解决方案:** +1. 检查按钮是否被禁用 +2. 检查点击事件绑定 +3. 检查函数是否有错误