# Conflicts:
#	yunxi-ui-admin-vue3/src/utils/dict.ts
pull/1/head
tengxi 1 year ago
commit 54ec953004

@ -1,5 +1,7 @@
package com.yunxi.scm.module.system.dal.dataobject.enterprise; package com.yunxi.scm.module.system.dal.dataobject.enterprise;
import com.yunxi.scm.module.system.dal.dataobject.dept.DeptDO;
import com.yunxi.scm.module.system.dal.dataobject.dept.PostDO;
import lombok.*; import lombok.*;
import java.util.*; import java.util.*;
import java.time.LocalDateTime; import java.time.LocalDateTime;
@ -276,4 +278,9 @@ public class EnterpriseDO extends BaseDO {
*/ */
private String commissionPeriodOfValidity; private String commissionPeriodOfValidity;
@TableField(exist = false)
private DeptDO deptDO;
@TableField(exist = false)
private List<PostDO> postDOList;
} }

@ -235,8 +235,12 @@ public class AdminUserServiceImpl implements AdminUserService {
//查询对应的租户 //查询对应的租户
List<TenantDO> tenantDOList = tenantService.getTenantListByUserId(adminUserDO.getId()); List<TenantDO> tenantDOList = tenantService.getTenantListByUserId(adminUserDO.getId());
for (TenantDO tenantDO: tenantDOList) { for (TenantDO tenantDO: tenantDOList) {
//查询租户下的机构 //查询租户下的企业
List<EnterpriseDO> enterpriseList = enterpriseService.getEnterpriseListByTenantId(tenantDO.getId(), adminUserDO.getId()); List<EnterpriseDO> enterpriseList = enterpriseService.getEnterpriseListByTenantId(tenantDO.getId(), adminUserDO.getId());
//查询企业下的部门和岗位
for (EnterpriseDO enterpriseDO : enterpriseList) {
}
tenantDO.setEnterpriseList(enterpriseList); tenantDO.setEnterpriseList(enterpriseList);
if(adminUserDO.getTenantId().equals(tenantDO.getId())){ if(adminUserDO.getTenantId().equals(tenantDO.getId())){
adminUserDO.setEnterpriseList(enterpriseList); adminUserDO.setEnterpriseList(enterpriseList);

@ -92,6 +92,9 @@ public interface ErrorCodeConstants {
// ========== 合同详情信息 500100001 ========== // ========== 合同详情信息 500100001 ==========
ErrorCode CONTRACT_INFO_NOT_EXISTS = new ErrorCode(1005000002, "合同详情信息不存在"); ErrorCode CONTRACT_INFO_NOT_EXISTS = new ErrorCode(1005000002, "合同详情信息不存在");
// ========== 主体负责人转移 TODO 补充编号 ==========
ErrorCode SUBJECT_TRANSFER_NOT_EXISTS = new ErrorCode(1005000003, "主体负责人转移不存在");
// ========== 跟进报告管理 TODO 补充编号 ==========
ErrorCode SUBJECT_FOLLOW_REPORT_NOT_EXISTS = new ErrorCode(1005000004, "跟进报告管理不存在");
} }

@ -1,5 +1,6 @@
package com.yunxi.scm.module.xxjj.controller.admin.subjectfollowmanagement.vo; package com.yunxi.scm.module.xxjj.controller.admin.subjectfollowmanagement.vo;
import com.yunxi.scm.module.xxjj.dal.dataobject.subjectbasic.SubjectBasicDO;
import io.swagger.v3.oas.annotations.media.Schema; import io.swagger.v3.oas.annotations.media.Schema;
import lombok.*; import lombok.*;
import java.util.*; import java.util.*;
@ -55,10 +56,18 @@ public class SubjectFollowManagementBaseVO {
@Schema(description = "提醒类型(0准时提醒 1提前5分钟 2提前15分钟 3提前30分钟 4提前1小时)", example = "1") @Schema(description = "提醒类型(0准时提醒 1提前5分钟 2提前15分钟 3提前30分钟 4提前1小时)", example = "1")
private String remindType; private String remindType;
@Schema(description = "提醒方式(1系统消息 2邮件 3短信)", example = "1")
private String remindMode;
@Schema(description = "提醒方式(1系统消息 2邮件 3短信)", example = "1")
private String[] remindModeArr;
@Schema(description = "任务描述", example = "你猜") @Schema(description = "任务描述", example = "你猜")
private String description; private String description;
@Schema(description = "附件") @Schema(description = "附件")
private String annex; private String annex;
@Schema(description = "客户")
private SubjectBasicDO subjectBasicDO;
} }

@ -54,6 +54,9 @@ public class SubjectFollowManagementExcelVO {
@ExcelProperty("提醒类型(0准时提醒 1提前5分钟 2提前15分钟 3提前30分钟 4提前1小时)") @ExcelProperty("提醒类型(0准时提醒 1提前5分钟 2提前15分钟 3提前30分钟 4提前1小时)")
private String remindType; private String remindType;
@Schema(description = "提醒方式(1系统消息 2邮件 3短信)", example = "1")
private String remindMode;
@ExcelProperty("任务描述") @ExcelProperty("任务描述")
private String description; private String description;

@ -48,6 +48,9 @@ public class SubjectFollowManagementExportReqVO {
@Schema(description = "提醒类型(0准时提醒 1提前5分钟 2提前15分钟 3提前30分钟 4提前1小时)", example = "1") @Schema(description = "提醒类型(0准时提醒 1提前5分钟 2提前15分钟 3提前30分钟 4提前1小时)", example = "1")
private String remindType; private String remindType;
@Schema(description = "提醒方式(1系统消息 2邮件 3短信)", example = "1")
private String remindMode;
@Schema(description = "任务描述", example = "你猜") @Schema(description = "任务描述", example = "你猜")
private String description; private String description;

@ -59,6 +59,9 @@ public class SubjectFollowManagementPageReqVO extends PageParam {
@Schema(description = "提醒类型(0准时提醒 1提前5分钟 2提前15分钟 3提前30分钟 4提前1小时)", example = "1") @Schema(description = "提醒类型(0准时提醒 1提前5分钟 2提前15分钟 3提前30分钟 4提前1小时)", example = "1")
private String remindType; private String remindType;
@Schema(description = "提醒方式(1系统消息 2邮件 3短信)", example = "1")
private String remindMode;
@Schema(description = "任务描述", example = "你猜") @Schema(description = "任务描述", example = "你猜")
private String description; private String description;
@ -69,4 +72,16 @@ public class SubjectFollowManagementPageReqVO extends PageParam {
@DateTimeFormat(pattern = FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND) @DateTimeFormat(pattern = FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND)
private LocalDateTime[] createTime; private LocalDateTime[] createTime;
@Schema(description = "客户名称", example = "赵六")
private String name;
@Schema(description = "客户来源(0电话营销 1主动来电 2客户介绍 3朋友介绍 4独立开发 5网络搜索 6广告杂志 7展会促销 8其他途径)")
private String customerSource;
@Schema(description = "客户星级(0一星 1二星 2三星 3四星 4五星)")
private String customerStarrating;
} }

@ -1,5 +1,6 @@
package com.yunxi.scm.module.xxjj.controller.admin.subjectfollowmanagement.vo; package com.yunxi.scm.module.xxjj.controller.admin.subjectfollowmanagement.vo;
import com.baomidou.mybatisplus.annotation.TableField;
import io.swagger.v3.oas.annotations.media.Schema; import io.swagger.v3.oas.annotations.media.Schema;
import lombok.*; import lombok.*;
import java.time.LocalDateTime; import java.time.LocalDateTime;
@ -16,4 +17,39 @@ public class SubjectFollowManagementRespVO extends SubjectFollowManagementBaseVO
@Schema(description = "创建时间", requiredMode = Schema.RequiredMode.REQUIRED) @Schema(description = "创建时间", requiredMode = Schema.RequiredMode.REQUIRED)
private LocalDateTime createTime; private LocalDateTime createTime;
@Schema(description = "更新人", requiredMode = Schema.RequiredMode.REQUIRED)
private String creatorName;
/**
* 使 SysUser id
*
* 使 String
*/
@Schema(description = "更新人", requiredMode = Schema.RequiredMode.REQUIRED)
private String updaterName;
private String belongingPeopleName;
private String calssify;
private String name;
private String logo;
private String reservedFields1;
/**
* (0 1 2 3 4 5)
*/
private String enterpriseNature;
/**
* (0 1 2 3 4 5 6 7 8广)
*/
private String industryClassify;
/**
* (0 1 2 3 4 5 6广 7 8)
*/
private String customerSource;
/**
* (0 1 2 3 4)
*/
private String customerStarrating;
/**
* (0 1 2 3 4 5 6 7 8)
*/
private String industrySchedule;
} }

@ -0,0 +1,102 @@
package com.yunxi.scm.module.xxjj.controller.admin.subjectfollowreport;
import org.springframework.web.bind.annotation.*;
import javax.annotation.Resource;
import org.springframework.validation.annotation.Validated;
import org.springframework.security.access.prepost.PreAuthorize;
import io.swagger.v3.oas.annotations.tags.Tag;
import io.swagger.v3.oas.annotations.Parameter;
import io.swagger.v3.oas.annotations.Operation;
import javax.validation.constraints.*;
import javax.validation.*;
import javax.servlet.http.*;
import java.util.*;
import java.io.IOException;
import com.yunxi.scm.framework.common.pojo.PageResult;
import com.yunxi.scm.framework.common.pojo.CommonResult;
import static com.yunxi.scm.framework.common.pojo.CommonResult.success;
import com.yunxi.scm.framework.excel.core.util.ExcelUtils;
import com.yunxi.scm.framework.operatelog.core.annotations.OperateLog;
import static com.yunxi.scm.framework.operatelog.core.enums.OperateTypeEnum.*;
import com.yunxi.scm.module.xxjj.controller.admin.subjectfollowreport.vo.*;
import com.yunxi.scm.module.xxjj.dal.dataobject.subjectfollowreport.SubjectFollowReportDO;
import com.yunxi.scm.module.xxjj.convert.subjectfollowreport.SubjectFollowReportConvert;
import com.yunxi.scm.module.xxjj.service.subjectfollowreport.SubjectFollowReportService;
@Tag(name = "管理后台 - 跟进报告管理")
@RestController
@RequestMapping("/xxjj/subject-follow-report")
@Validated
public class SubjectFollowReportController {
@Resource
private SubjectFollowReportService subjectFollowReportService;
@PostMapping("/create")
@Operation(summary = "创建跟进报告管理")
@PreAuthorize("@ss.hasPermission('xxjj:subject-follow-report:create')")
public CommonResult<Long> createSubjectFollowReport(@Valid @RequestBody SubjectFollowReportCreateReqVO createReqVO) {
return success(subjectFollowReportService.createSubjectFollowReport(createReqVO));
}
@PutMapping("/update")
@Operation(summary = "更新跟进报告管理")
@PreAuthorize("@ss.hasPermission('xxjj:subject-follow-report:update')")
public CommonResult<Boolean> updateSubjectFollowReport(@Valid @RequestBody SubjectFollowReportUpdateReqVO updateReqVO) {
subjectFollowReportService.updateSubjectFollowReport(updateReqVO);
return success(true);
}
@DeleteMapping("/delete")
@Operation(summary = "删除跟进报告管理")
@Parameter(name = "id", description = "编号", required = true)
@PreAuthorize("@ss.hasPermission('xxjj:subject-follow-report:delete')")
public CommonResult<Boolean> deleteSubjectFollowReport(@RequestParam("id") Long id) {
subjectFollowReportService.deleteSubjectFollowReport(id);
return success(true);
}
@GetMapping("/get")
@Operation(summary = "获得跟进报告管理")
@Parameter(name = "id", description = "编号", required = true, example = "1024")
@PreAuthorize("@ss.hasPermission('xxjj:subject-follow-report:query')")
public CommonResult<SubjectFollowReportRespVO> getSubjectFollowReport(@RequestParam("id") Long id) {
SubjectFollowReportDO subjectFollowReport = subjectFollowReportService.getSubjectFollowReport(id);
return success(SubjectFollowReportConvert.INSTANCE.convert(subjectFollowReport));
}
@GetMapping("/list")
@Operation(summary = "获得跟进报告管理列表")
@Parameter(name = "ids", description = "编号列表", required = true, example = "1024,2048")
@PreAuthorize("@ss.hasPermission('xxjj:subject-follow-report:query')")
public CommonResult<List<SubjectFollowReportRespVO>> getSubjectFollowReportList(@RequestParam("ids") Collection<Long> ids) {
List<SubjectFollowReportDO> list = subjectFollowReportService.getSubjectFollowReportList(ids);
return success(SubjectFollowReportConvert.INSTANCE.convertList(list));
}
@GetMapping("/page")
@Operation(summary = "获得跟进报告管理分页")
@PreAuthorize("@ss.hasPermission('xxjj:subject-follow-report:query')")
public CommonResult<PageResult<SubjectFollowReportRespVO>> getSubjectFollowReportPage(@Valid SubjectFollowReportPageReqVO pageVO) {
PageResult<SubjectFollowReportDO> pageResult = subjectFollowReportService.getSubjectFollowReportPage(pageVO);
return success(SubjectFollowReportConvert.INSTANCE.convertPage(pageResult));
}
@GetMapping("/export-excel")
@Operation(summary = "导出跟进报告管理 Excel")
@PreAuthorize("@ss.hasPermission('xxjj:subject-follow-report:export')")
@OperateLog(type = EXPORT)
public void exportSubjectFollowReportExcel(@Valid SubjectFollowReportExportReqVO exportReqVO,
HttpServletResponse response) throws IOException {
List<SubjectFollowReportDO> list = subjectFollowReportService.getSubjectFollowReportList(exportReqVO);
// 导出 Excel
List<SubjectFollowReportExcelVO> datas = SubjectFollowReportConvert.INSTANCE.convertList02(list);
ExcelUtils.write(response, "跟进报告管理.xls", "数据", SubjectFollowReportExcelVO.class, datas);
}
}

@ -0,0 +1,49 @@
package com.yunxi.scm.module.xxjj.controller.admin.subjectfollowreport.vo;
import io.swagger.v3.oas.annotations.media.Schema;
import lombok.*;
import java.util.*;
import java.time.LocalDateTime;
import java.time.LocalDateTime;
import java.time.LocalDateTime;
import java.time.LocalDateTime;
import javax.validation.constraints.*;
import org.springframework.format.annotation.DateTimeFormat;
import static com.yunxi.scm.framework.common.util.date.DateUtils.FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND;
/**
* Base VO VO 使
* VO Swagger
*/
@Data
public class SubjectFollowReportBaseVO {
@Schema(description = "报告类型(1跟进报告 2其他报告)", example = "1")
private String reportType;
@Schema(description = "报告日期")
@DateTimeFormat(pattern = FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND)
private LocalDateTime reporTime;
@Schema(description = "跟进日期")
@DateTimeFormat(pattern = FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND)
private LocalDateTime followTime;
@Schema(description = "业务id", requiredMode = Schema.RequiredMode.REQUIRED, example = "6470")
@NotNull(message = "业务id不能为空")
private Long businessId;
@Schema(description = "附件")
private String annex;
@Schema(description = "报告内容", example = "随便")
private String description;
@Schema(description = "批阅人员")
private String readOverUser;
@Schema(description = "抄送人员")
private String makeCopyUser;
}

@ -0,0 +1,14 @@
package com.yunxi.scm.module.xxjj.controller.admin.subjectfollowreport.vo;
import lombok.*;
import java.util.*;
import io.swagger.v3.oas.annotations.media.Schema;
import javax.validation.constraints.*;
@Schema(description = "管理后台 - 跟进报告管理创建 Request VO")
@Data
@EqualsAndHashCode(callSuper = true)
@ToString(callSuper = true)
public class SubjectFollowReportCreateReqVO extends SubjectFollowReportBaseVO {
}

@ -0,0 +1,51 @@
package com.yunxi.scm.module.xxjj.controller.admin.subjectfollowreport.vo;
import io.swagger.v3.oas.annotations.media.Schema;
import lombok.*;
import java.util.*;
import java.time.LocalDateTime;
import java.time.LocalDateTime;
import java.time.LocalDateTime;
import java.time.LocalDateTime;
import com.alibaba.excel.annotation.ExcelProperty;
/**
* Excel VO
*
* @author
*/
@Data
public class SubjectFollowReportExcelVO {
@ExcelProperty("主键id")
private Long id;
@ExcelProperty("报告类型(1跟进报告 2其他报告)")
private String reportType;
@ExcelProperty("报告日期")
private LocalDateTime reporTime;
@ExcelProperty("跟进日期")
private LocalDateTime followTime;
@ExcelProperty("业务id")
private Long businessId;
@ExcelProperty("附件")
private String annex;
@ExcelProperty("报告内容")
private String description;
@ExcelProperty("批阅人员")
private String readOverUser;
@ExcelProperty("抄送人员")
private String makeCopyUser;
@ExcelProperty("创建时间")
private LocalDateTime createTime;
}

@ -0,0 +1,46 @@
package com.yunxi.scm.module.xxjj.controller.admin.subjectfollowreport.vo;
import lombok.*;
import java.util.*;
import io.swagger.v3.oas.annotations.media.Schema;
import com.yunxi.scm.framework.common.pojo.PageParam;
import java.time.LocalDateTime;
import org.springframework.format.annotation.DateTimeFormat;
import static com.yunxi.scm.framework.common.util.date.DateUtils.FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND;
@Schema(description = "管理后台 - 跟进报告管理 Excel 导出 Request VO参数和 SubjectFollowReportPageReqVO 是一致的")
@Data
public class SubjectFollowReportExportReqVO {
@Schema(description = "报告类型(1跟进报告 2其他报告)", example = "1")
private String reportType;
@Schema(description = "报告日期")
@DateTimeFormat(pattern = FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND)
private LocalDateTime[] reporTime;
@Schema(description = "跟进日期")
@DateTimeFormat(pattern = FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND)
private LocalDateTime[] followTime;
@Schema(description = "业务id", example = "6470")
private Long businessId;
@Schema(description = "附件")
private String annex;
@Schema(description = "报告内容", example = "随便")
private String description;
@Schema(description = "批阅人员")
private String readOverUser;
@Schema(description = "抄送人员")
private String makeCopyUser;
@Schema(description = "创建时间")
@DateTimeFormat(pattern = FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND)
private LocalDateTime[] createTime;
}

@ -0,0 +1,48 @@
package com.yunxi.scm.module.xxjj.controller.admin.subjectfollowreport.vo;
import lombok.*;
import java.util.*;
import io.swagger.v3.oas.annotations.media.Schema;
import com.yunxi.scm.framework.common.pojo.PageParam;
import org.springframework.format.annotation.DateTimeFormat;
import java.time.LocalDateTime;
import static com.yunxi.scm.framework.common.util.date.DateUtils.FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND;
@Schema(description = "管理后台 - 跟进报告管理分页 Request VO")
@Data
@EqualsAndHashCode(callSuper = true)
@ToString(callSuper = true)
public class SubjectFollowReportPageReqVO extends PageParam {
@Schema(description = "报告类型(1跟进报告 2其他报告)", example = "1")
private String reportType;
@Schema(description = "报告日期")
@DateTimeFormat(pattern = FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND)
private LocalDateTime[] reporTime;
@Schema(description = "跟进日期")
@DateTimeFormat(pattern = FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND)
private LocalDateTime[] followTime;
@Schema(description = "业务id", example = "6470")
private Long businessId;
@Schema(description = "附件")
private String annex;
@Schema(description = "报告内容", example = "随便")
private String description;
@Schema(description = "批阅人员")
private String readOverUser;
@Schema(description = "抄送人员")
private String makeCopyUser;
@Schema(description = "创建时间")
@DateTimeFormat(pattern = FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND)
private LocalDateTime[] createTime;
}

@ -0,0 +1,19 @@
package com.yunxi.scm.module.xxjj.controller.admin.subjectfollowreport.vo;
import io.swagger.v3.oas.annotations.media.Schema;
import lombok.*;
import java.time.LocalDateTime;
@Schema(description = "管理后台 - 跟进报告管理 Response VO")
@Data
@EqualsAndHashCode(callSuper = true)
@ToString(callSuper = true)
public class SubjectFollowReportRespVO extends SubjectFollowReportBaseVO {
@Schema(description = "主键id", requiredMode = Schema.RequiredMode.REQUIRED, example = "11334")
private Long id;
@Schema(description = "创建时间", requiredMode = Schema.RequiredMode.REQUIRED)
private LocalDateTime createTime;
}

@ -0,0 +1,18 @@
package com.yunxi.scm.module.xxjj.controller.admin.subjectfollowreport.vo;
import io.swagger.v3.oas.annotations.media.Schema;
import lombok.*;
import java.util.*;
import javax.validation.constraints.*;
@Schema(description = "管理后台 - 跟进报告管理更新 Request VO")
@Data
@EqualsAndHashCode(callSuper = true)
@ToString(callSuper = true)
public class SubjectFollowReportUpdateReqVO extends SubjectFollowReportBaseVO {
@Schema(description = "主键id", requiredMode = Schema.RequiredMode.REQUIRED, example = "11334")
@NotNull(message = "主键id不能为空")
private Long id;
}

@ -0,0 +1,102 @@
package com.yunxi.scm.module.xxjj.controller.admin.subjecttransfer;
import org.springframework.web.bind.annotation.*;
import javax.annotation.Resource;
import org.springframework.validation.annotation.Validated;
import org.springframework.security.access.prepost.PreAuthorize;
import io.swagger.v3.oas.annotations.tags.Tag;
import io.swagger.v3.oas.annotations.Parameter;
import io.swagger.v3.oas.annotations.Operation;
import javax.validation.constraints.*;
import javax.validation.*;
import javax.servlet.http.*;
import java.util.*;
import java.io.IOException;
import com.yunxi.scm.framework.common.pojo.PageResult;
import com.yunxi.scm.framework.common.pojo.CommonResult;
import static com.yunxi.scm.framework.common.pojo.CommonResult.success;
import com.yunxi.scm.framework.excel.core.util.ExcelUtils;
import com.yunxi.scm.framework.operatelog.core.annotations.OperateLog;
import static com.yunxi.scm.framework.operatelog.core.enums.OperateTypeEnum.*;
import com.yunxi.scm.module.xxjj.controller.admin.subjecttransfer.vo.*;
import com.yunxi.scm.module.xxjj.dal.dataobject.subjecttransfer.SubjectTransferDO;
import com.yunxi.scm.module.xxjj.convert.subjecttransfer.SubjectTransferConvert;
import com.yunxi.scm.module.xxjj.service.subjecttransfer.SubjectTransferService;
@Tag(name = "管理后台 - 主体负责人转移")
@RestController
@RequestMapping("/xxjj/subject-transfer")
@Validated
public class SubjectTransferController {
@Resource
private SubjectTransferService subjectTransferService;
@PostMapping("/create")
@Operation(summary = "创建主体负责人转移")
@PreAuthorize("@ss.hasPermission('xxjj:subject-transfer:create')")
public CommonResult<Long> createSubjectTransfer(@Valid @RequestBody SubjectTransferCreateReqVO createReqVO) {
return success(subjectTransferService.createSubjectTransfer(createReqVO));
}
@PutMapping("/update")
@Operation(summary = "更新主体负责人转移")
@PreAuthorize("@ss.hasPermission('xxjj:subject-transfer:update')")
public CommonResult<Boolean> updateSubjectTransfer(@Valid @RequestBody SubjectTransferUpdateReqVO updateReqVO) {
subjectTransferService.updateSubjectTransfer(updateReqVO);
return success(true);
}
@DeleteMapping("/delete")
@Operation(summary = "删除主体负责人转移")
@Parameter(name = "id", description = "编号", required = true)
@PreAuthorize("@ss.hasPermission('xxjj:subject-transfer:delete')")
public CommonResult<Boolean> deleteSubjectTransfer(@RequestParam("id") Long id) {
subjectTransferService.deleteSubjectTransfer(id);
return success(true);
}
@GetMapping("/get")
@Operation(summary = "获得主体负责人转移")
@Parameter(name = "id", description = "编号", required = true, example = "1024")
@PreAuthorize("@ss.hasPermission('xxjj:subject-transfer:query')")
public CommonResult<SubjectTransferRespVO> getSubjectTransfer(@RequestParam("id") Long id) {
SubjectTransferDO subjectTransfer = subjectTransferService.getSubjectTransfer(id);
return success(SubjectTransferConvert.INSTANCE.convert(subjectTransfer));
}
@GetMapping("/list")
@Operation(summary = "获得主体负责人转移列表")
@Parameter(name = "ids", description = "编号列表", required = true, example = "1024,2048")
@PreAuthorize("@ss.hasPermission('xxjj:subject-transfer:query')")
public CommonResult<List<SubjectTransferRespVO>> getSubjectTransferList(@RequestParam("ids") Collection<Long> ids) {
List<SubjectTransferDO> list = subjectTransferService.getSubjectTransferList(ids);
return success(SubjectTransferConvert.INSTANCE.convertList(list));
}
@GetMapping("/page")
@Operation(summary = "获得主体负责人转移分页")
@PreAuthorize("@ss.hasPermission('xxjj:subject-transfer:query')")
public CommonResult<PageResult<SubjectTransferRespVO>> getSubjectTransferPage(@Valid SubjectTransferPageReqVO pageVO) {
PageResult<SubjectTransferDO> pageResult = subjectTransferService.getSubjectTransferPage(pageVO);
return success(SubjectTransferConvert.INSTANCE.convertPage(pageResult));
}
@GetMapping("/export-excel")
@Operation(summary = "导出主体负责人转移 Excel")
@PreAuthorize("@ss.hasPermission('xxjj:subject-transfer:export')")
@OperateLog(type = EXPORT)
public void exportSubjectTransferExcel(@Valid SubjectTransferExportReqVO exportReqVO,
HttpServletResponse response) throws IOException {
List<SubjectTransferDO> list = subjectTransferService.getSubjectTransferList(exportReqVO);
// 导出 Excel
List<SubjectTransferExcelVO> datas = SubjectTransferConvert.INSTANCE.convertList02(list);
ExcelUtils.write(response, "主体负责人转移.xls", "数据", SubjectTransferExcelVO.class, datas);
}
}

@ -0,0 +1,44 @@
package com.yunxi.scm.module.xxjj.controller.admin.subjecttransfer.vo;
import io.swagger.v3.oas.annotations.media.Schema;
import lombok.*;
import java.util.*;
import java.time.LocalDateTime;
import java.time.LocalDateTime;
import javax.validation.constraints.*;
/**
* Base VO VO 使
* VO Swagger
*/
@Data
public class SubjectTransferBaseVO {
@Schema(description = "业务id", requiredMode = Schema.RequiredMode.REQUIRED, example = "1442")
private Long businessId;
@Schema(description = "业务类型(0客户 1供应商 2服务商)", example = "1")
private String businessType;
@Schema(description = "转移前用户id", requiredMode = Schema.RequiredMode.REQUIRED)
private Long userId1;
@Schema(description = "转移后用户id", requiredMode = Schema.RequiredMode.REQUIRED)
private Long userId2;
@Schema(description = "转移数据类型(0商机1订单2财务3费用4发票)", example = "2")
private String transferType;
@Schema(description = "备注", example = "你猜")
private String remark;
@Schema(description = "转移前所属用户id", example = "你猜")
private String userId1s;
@Schema(description = "业务ids", example = "你猜")
private String businessIds;
@Schema(description = "转移数据类型", example = "你猜")
private String[] transferTypeArr;
}

@ -0,0 +1,14 @@
package com.yunxi.scm.module.xxjj.controller.admin.subjecttransfer.vo;
import lombok.*;
import java.util.*;
import io.swagger.v3.oas.annotations.media.Schema;
import javax.validation.constraints.*;
@Schema(description = "管理后台 - 主体负责人转移创建 Request VO")
@Data
@EqualsAndHashCode(callSuper = true)
@ToString(callSuper = true)
public class SubjectTransferCreateReqVO extends SubjectTransferBaseVO {
}

@ -0,0 +1,43 @@
package com.yunxi.scm.module.xxjj.controller.admin.subjecttransfer.vo;
import io.swagger.v3.oas.annotations.media.Schema;
import lombok.*;
import java.util.*;
import java.time.LocalDateTime;
import java.time.LocalDateTime;
import com.alibaba.excel.annotation.ExcelProperty;
/**
* Excel VO
*
* @author
*/
@Data
public class SubjectTransferExcelVO {
@ExcelProperty("主键id")
private Long id;
@ExcelProperty("业务id")
private Long businessId;
@ExcelProperty("业务类型(0客户 1供应商 2服务商)")
private String businessType;
@ExcelProperty("转移前用户id")
private Long userId1;
@ExcelProperty("转移后用户id")
private Long userId2;
@ExcelProperty("转移数据类型(0商机1订单2财务3费用4发票)")
private String transferType;
@ExcelProperty("备注")
private String remark;
@ExcelProperty("创建时间")
private LocalDateTime createTime;
}

@ -0,0 +1,38 @@
package com.yunxi.scm.module.xxjj.controller.admin.subjecttransfer.vo;
import lombok.*;
import java.util.*;
import io.swagger.v3.oas.annotations.media.Schema;
import com.yunxi.scm.framework.common.pojo.PageParam;
import java.time.LocalDateTime;
import org.springframework.format.annotation.DateTimeFormat;
import static com.yunxi.scm.framework.common.util.date.DateUtils.FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND;
@Schema(description = "管理后台 - 主体负责人转移 Excel 导出 Request VO参数和 SubjectTransferPageReqVO 是一致的")
@Data
public class SubjectTransferExportReqVO {
@Schema(description = "业务id", example = "1442")
private Long businessId;
@Schema(description = "业务类型(0客户 1供应商 2服务商)", example = "1")
private String businessType;
@Schema(description = "转移前用户id")
private Long userId1;
@Schema(description = "转移后用户id")
private Long userId2;
@Schema(description = "转移数据类型(0商机1订单2财务3费用4发票)", example = "2")
private String transferType;
@Schema(description = "备注", example = "你猜")
private String remark;
@Schema(description = "创建时间")
@DateTimeFormat(pattern = FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND)
private LocalDateTime[] createTime;
}

@ -0,0 +1,49 @@
package com.yunxi.scm.module.xxjj.controller.admin.subjecttransfer.vo;
import lombok.*;
import java.util.*;
import io.swagger.v3.oas.annotations.media.Schema;
import com.yunxi.scm.framework.common.pojo.PageParam;
import org.springframework.format.annotation.DateTimeFormat;
import java.time.LocalDateTime;
import static com.yunxi.scm.framework.common.util.date.DateUtils.FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND;
@Schema(description = "管理后台 - 主体负责人转移分页 Request VO")
@Data
@EqualsAndHashCode(callSuper = true)
@ToString(callSuper = true)
public class SubjectTransferPageReqVO extends PageParam {
@Schema(description = "业务id", example = "1442")
private Long businessId;
@Schema(description = "业务类型(0客户 1供应商 2服务商)", example = "1")
private String businessType;
@Schema(description = "转移前用户id")
private Long userId1;
@Schema(description = "转移后用户id")
private Long userId2;
@Schema(description = "转移数据类型(0商机1订单2财务3费用4发票)", example = "2")
private String transferType;
@Schema(description = "转移前所属用户id", example = "你猜")
private String userId1s;
@Schema(description = "业务ids", example = "你猜")
private String businessIds;
@Schema(description = "转移数据类型", example = "你猜")
private String[] transferTypeArr;
@Schema(description = "备注", example = "你猜")
private String remark;
@Schema(description = "创建时间")
@DateTimeFormat(pattern = FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND)
private LocalDateTime[] createTime;
}

@ -0,0 +1,19 @@
package com.yunxi.scm.module.xxjj.controller.admin.subjecttransfer.vo;
import io.swagger.v3.oas.annotations.media.Schema;
import lombok.*;
import java.time.LocalDateTime;
@Schema(description = "管理后台 - 主体负责人转移 Response VO")
@Data
@EqualsAndHashCode(callSuper = true)
@ToString(callSuper = true)
public class SubjectTransferRespVO extends SubjectTransferBaseVO {
@Schema(description = "主键id", requiredMode = Schema.RequiredMode.REQUIRED, example = "6519")
private Long id;
@Schema(description = "创建时间", requiredMode = Schema.RequiredMode.REQUIRED)
private LocalDateTime createTime;
}

@ -0,0 +1,18 @@
package com.yunxi.scm.module.xxjj.controller.admin.subjecttransfer.vo;
import io.swagger.v3.oas.annotations.media.Schema;
import lombok.*;
import java.util.*;
import javax.validation.constraints.*;
@Schema(description = "管理后台 - 主体负责人转移更新 Request VO")
@Data
@EqualsAndHashCode(callSuper = true)
@ToString(callSuper = true)
public class SubjectTransferUpdateReqVO extends SubjectTransferBaseVO {
@Schema(description = "主键id", requiredMode = Schema.RequiredMode.REQUIRED, example = "6519")
@NotNull(message = "主键id不能为空")
private Long id;
}

@ -0,0 +1,34 @@
package com.yunxi.scm.module.xxjj.convert.subjectfollowreport;
import java.util.*;
import com.yunxi.scm.framework.common.pojo.PageResult;
import org.mapstruct.Mapper;
import org.mapstruct.factory.Mappers;
import com.yunxi.scm.module.xxjj.controller.admin.subjectfollowreport.vo.*;
import com.yunxi.scm.module.xxjj.dal.dataobject.subjectfollowreport.SubjectFollowReportDO;
/**
* Convert
*
* @author
*/
@Mapper
public interface SubjectFollowReportConvert {
SubjectFollowReportConvert INSTANCE = Mappers.getMapper(SubjectFollowReportConvert.class);
SubjectFollowReportDO convert(SubjectFollowReportCreateReqVO bean);
SubjectFollowReportDO convert(SubjectFollowReportUpdateReqVO bean);
SubjectFollowReportRespVO convert(SubjectFollowReportDO bean);
List<SubjectFollowReportRespVO> convertList(List<SubjectFollowReportDO> list);
PageResult<SubjectFollowReportRespVO> convertPage(PageResult<SubjectFollowReportDO> page);
List<SubjectFollowReportExcelVO> convertList02(List<SubjectFollowReportDO> list);
}

@ -0,0 +1,34 @@
package com.yunxi.scm.module.xxjj.convert.subjecttransfer;
import java.util.*;
import com.yunxi.scm.framework.common.pojo.PageResult;
import org.mapstruct.Mapper;
import org.mapstruct.factory.Mappers;
import com.yunxi.scm.module.xxjj.controller.admin.subjecttransfer.vo.*;
import com.yunxi.scm.module.xxjj.dal.dataobject.subjecttransfer.SubjectTransferDO;
/**
* Convert
*
* @author
*/
@Mapper
public interface SubjectTransferConvert {
SubjectTransferConvert INSTANCE = Mappers.getMapper(SubjectTransferConvert.class);
SubjectTransferDO convert(SubjectTransferCreateReqVO bean);
SubjectTransferDO convert(SubjectTransferUpdateReqVO bean);
SubjectTransferRespVO convert(SubjectTransferDO bean);
List<SubjectTransferRespVO> convertList(List<SubjectTransferDO> list);
PageResult<SubjectTransferRespVO> convertPage(PageResult<SubjectTransferDO> page);
List<SubjectTransferExcelVO> convertList02(List<SubjectTransferDO> list);
}

@ -1,5 +1,6 @@
package com.yunxi.scm.module.xxjj.dal.dataobject.subjectfollowmanagement; package com.yunxi.scm.module.xxjj.dal.dataobject.subjectfollowmanagement;
import com.yunxi.scm.module.xxjj.dal.dataobject.subjectbasic.SubjectBasicDO;
import lombok.*; import lombok.*;
import java.util.*; import java.util.*;
import java.time.LocalDateTime; import java.time.LocalDateTime;
@ -73,6 +74,11 @@ public class SubjectFollowManagementDO extends BaseDO {
* (0 15 215 330 41) * (0 15 215 330 41)
*/ */
private String remindType; private String remindType;
/**
* (1 2 3)
*/
private String remindMode;
/** /**
* *
*/ */
@ -82,4 +88,53 @@ public class SubjectFollowManagementDO extends BaseDO {
*/ */
private String annex; private String annex;
@TableField(exist = false)
private SubjectBasicDO subjectBasicDO;
@TableField(exist = false)
private String creatorName;
/**
* 使 SysUser id
*
* 使 String
*/
@TableField(exist = false)
private String updaterName;
@TableField(exist = false)
private String belongingPeopleName;
@TableField(exist = false)
private String calssify;
@TableField(exist = false)
private String name;
@TableField(exist = false)
private String logo;
@TableField(exist = false)
private String reservedFields1;
/**
* (0 1 2 3 4 5)
*/
@TableField(exist = false)
private String enterpriseNature;
/**
* (0 1 2 3 4 5 6 7 8广)
*/
@TableField(exist = false)
private String industryClassify;
/**
* (0 1 2 3 4 5 6广 7 8)
*/
@TableField(exist = false)
private String customerSource;
/**
* (0 1 2 3 4)
*/
@TableField(exist = false)
private String customerStarrating;
/**
* (0 1 2 3 4 5 6 7 8)
*/
@TableField(exist = false)
private String industrySchedule;
} }

@ -0,0 +1,65 @@
package com.yunxi.scm.module.xxjj.dal.dataobject.subjectfollowreport;
import lombok.*;
import java.util.*;
import java.time.LocalDateTime;
import java.time.LocalDateTime;
import java.time.LocalDateTime;
import java.time.LocalDateTime;
import com.baomidou.mybatisplus.annotation.*;
import com.yunxi.scm.framework.mybatis.core.dataobject.BaseDO;
/**
* DO
*
* @author
*/
@TableName("xxjj_subject_follow_report")
@KeySequence("xxjj_subject_follow_report_seq") // 用于 Oracle、PostgreSQL、Kingbase、DB2、H2 数据库的主键自增。如果是 MySQL 等数据库,可不写。
@Data
@EqualsAndHashCode(callSuper = true)
@ToString(callSuper = true)
@Builder
@NoArgsConstructor
@AllArgsConstructor
public class SubjectFollowReportDO extends BaseDO {
/**
* id
*/
@TableId
private Long id;
/**
* (1 2)
*/
private String reportType;
/**
*
*/
private LocalDateTime reporTime;
/**
*
*/
private LocalDateTime followTime;
/**
* id
*/
private Long businessId;
/**
*
*/
private String annex;
/**
*
*/
private String description;
/**
*
*/
private String readOverUser;
/**
*
*/
private String makeCopyUser;
}

@ -0,0 +1,55 @@
package com.yunxi.scm.module.xxjj.dal.dataobject.subjecttransfer;
import lombok.*;
import java.util.*;
import java.time.LocalDateTime;
import java.time.LocalDateTime;
import com.baomidou.mybatisplus.annotation.*;
import com.yunxi.scm.framework.mybatis.core.dataobject.BaseDO;
/**
* DO
*
* @author
*/
@TableName("xxjj_subject_transfer")
@KeySequence("xxjj_subject_transfer_seq") // 用于 Oracle、PostgreSQL、Kingbase、DB2、H2 数据库的主键自增。如果是 MySQL 等数据库,可不写。
@Data
@EqualsAndHashCode(callSuper = true)
@ToString(callSuper = true)
@Builder
@NoArgsConstructor
@AllArgsConstructor
public class SubjectTransferDO extends BaseDO {
/**
* id
*/
@TableId
private Long id;
/**
* id
*/
private Long businessId;
/**
* (0 1 2)
*/
private String businessType;
/**
* id
*/
private Long userId1;
/**
* id
*/
private Long userId2;
/**
* (01234)
*/
private String transferType;
/**
*
*/
private String remark;
}

@ -2,12 +2,14 @@ package com.yunxi.scm.module.xxjj.dal.mysql.subjectfollowmanagement;
import java.util.*; import java.util.*;
import com.baomidou.mybatisplus.core.metadata.IPage;
import com.yunxi.scm.framework.common.pojo.PageResult; import com.yunxi.scm.framework.common.pojo.PageResult;
import com.yunxi.scm.framework.mybatis.core.query.LambdaQueryWrapperX; import com.yunxi.scm.framework.mybatis.core.query.LambdaQueryWrapperX;
import com.yunxi.scm.framework.mybatis.core.mapper.BaseMapperX; import com.yunxi.scm.framework.mybatis.core.mapper.BaseMapperX;
import com.yunxi.scm.module.xxjj.dal.dataobject.subjectfollowmanagement.SubjectFollowManagementDO; import com.yunxi.scm.module.xxjj.dal.dataobject.subjectfollowmanagement.SubjectFollowManagementDO;
import org.apache.ibatis.annotations.Mapper; import org.apache.ibatis.annotations.Mapper;
import com.yunxi.scm.module.xxjj.controller.admin.subjectfollowmanagement.vo.*; import com.yunxi.scm.module.xxjj.controller.admin.subjectfollowmanagement.vo.*;
import org.apache.ibatis.annotations.Param;
/** /**
* Mapper * Mapper
@ -17,6 +19,8 @@ import com.yunxi.scm.module.xxjj.controller.admin.subjectfollowmanagement.vo.*;
@Mapper @Mapper
public interface SubjectFollowManagementMapper extends BaseMapperX<SubjectFollowManagementDO> { public interface SubjectFollowManagementMapper extends BaseMapperX<SubjectFollowManagementDO> {
IPage<SubjectFollowManagementDO> selectPage02(IPage<SubjectFollowManagementDO> page, @Param("reqVO") SubjectFollowManagementPageReqVO reqVO);
default PageResult<SubjectFollowManagementDO> selectPage(SubjectFollowManagementPageReqVO reqVO) { default PageResult<SubjectFollowManagementDO> selectPage(SubjectFollowManagementPageReqVO reqVO) {
return selectPage(reqVO, new LambdaQueryWrapperX<SubjectFollowManagementDO>() return selectPage(reqVO, new LambdaQueryWrapperX<SubjectFollowManagementDO>()
.eqIfPresent(SubjectFollowManagementDO::getBusinessId, reqVO.getBusinessId()) .eqIfPresent(SubjectFollowManagementDO::getBusinessId, reqVO.getBusinessId())

@ -0,0 +1,48 @@
package com.yunxi.scm.module.xxjj.dal.mysql.subjectfollowreport;
import java.util.*;
import com.yunxi.scm.framework.common.pojo.PageResult;
import com.yunxi.scm.framework.mybatis.core.query.LambdaQueryWrapperX;
import com.yunxi.scm.framework.mybatis.core.mapper.BaseMapperX;
import com.yunxi.scm.module.xxjj.dal.dataobject.subjectfollowreport.SubjectFollowReportDO;
import org.apache.ibatis.annotations.Mapper;
import com.yunxi.scm.module.xxjj.controller.admin.subjectfollowreport.vo.*;
/**
* Mapper
*
* @author
*/
@Mapper
public interface SubjectFollowReportMapper extends BaseMapperX<SubjectFollowReportDO> {
default PageResult<SubjectFollowReportDO> selectPage(SubjectFollowReportPageReqVO reqVO) {
return selectPage(reqVO, new LambdaQueryWrapperX<SubjectFollowReportDO>()
.eqIfPresent(SubjectFollowReportDO::getReportType, reqVO.getReportType())
.betweenIfPresent(SubjectFollowReportDO::getReporTime, reqVO.getReporTime())
.betweenIfPresent(SubjectFollowReportDO::getFollowTime, reqVO.getFollowTime())
.eqIfPresent(SubjectFollowReportDO::getBusinessId, reqVO.getBusinessId())
.eqIfPresent(SubjectFollowReportDO::getAnnex, reqVO.getAnnex())
.eqIfPresent(SubjectFollowReportDO::getDescription, reqVO.getDescription())
.eqIfPresent(SubjectFollowReportDO::getReadOverUser, reqVO.getReadOverUser())
.eqIfPresent(SubjectFollowReportDO::getMakeCopyUser, reqVO.getMakeCopyUser())
.betweenIfPresent(SubjectFollowReportDO::getCreateTime, reqVO.getCreateTime())
.orderByDesc(SubjectFollowReportDO::getId));
}
default List<SubjectFollowReportDO> selectList(SubjectFollowReportExportReqVO reqVO) {
return selectList(new LambdaQueryWrapperX<SubjectFollowReportDO>()
.eqIfPresent(SubjectFollowReportDO::getReportType, reqVO.getReportType())
.betweenIfPresent(SubjectFollowReportDO::getReporTime, reqVO.getReporTime())
.betweenIfPresent(SubjectFollowReportDO::getFollowTime, reqVO.getFollowTime())
.eqIfPresent(SubjectFollowReportDO::getBusinessId, reqVO.getBusinessId())
.eqIfPresent(SubjectFollowReportDO::getAnnex, reqVO.getAnnex())
.eqIfPresent(SubjectFollowReportDO::getDescription, reqVO.getDescription())
.eqIfPresent(SubjectFollowReportDO::getReadOverUser, reqVO.getReadOverUser())
.eqIfPresent(SubjectFollowReportDO::getMakeCopyUser, reqVO.getMakeCopyUser())
.betweenIfPresent(SubjectFollowReportDO::getCreateTime, reqVO.getCreateTime())
.orderByDesc(SubjectFollowReportDO::getId));
}
}

@ -0,0 +1,44 @@
package com.yunxi.scm.module.xxjj.dal.mysql.subjecttransfer;
import java.util.*;
import com.yunxi.scm.framework.common.pojo.PageResult;
import com.yunxi.scm.framework.mybatis.core.query.LambdaQueryWrapperX;
import com.yunxi.scm.framework.mybatis.core.mapper.BaseMapperX;
import com.yunxi.scm.module.xxjj.dal.dataobject.subjecttransfer.SubjectTransferDO;
import org.apache.ibatis.annotations.Mapper;
import com.yunxi.scm.module.xxjj.controller.admin.subjecttransfer.vo.*;
/**
* Mapper
*
* @author
*/
@Mapper
public interface SubjectTransferMapper extends BaseMapperX<SubjectTransferDO> {
default PageResult<SubjectTransferDO> selectPage(SubjectTransferPageReqVO reqVO) {
return selectPage(reqVO, new LambdaQueryWrapperX<SubjectTransferDO>()
.eqIfPresent(SubjectTransferDO::getBusinessId, reqVO.getBusinessId())
.eqIfPresent(SubjectTransferDO::getBusinessType, reqVO.getBusinessType())
.eqIfPresent(SubjectTransferDO::getUserId1, reqVO.getUserId1())
.eqIfPresent(SubjectTransferDO::getUserId2, reqVO.getUserId2())
.eqIfPresent(SubjectTransferDO::getTransferType, reqVO.getTransferType())
.eqIfPresent(SubjectTransferDO::getRemark, reqVO.getRemark())
.betweenIfPresent(SubjectTransferDO::getCreateTime, reqVO.getCreateTime())
.orderByDesc(SubjectTransferDO::getId));
}
default List<SubjectTransferDO> selectList(SubjectTransferExportReqVO reqVO) {
return selectList(new LambdaQueryWrapperX<SubjectTransferDO>()
.eqIfPresent(SubjectTransferDO::getBusinessId, reqVO.getBusinessId())
.eqIfPresent(SubjectTransferDO::getBusinessType, reqVO.getBusinessType())
.eqIfPresent(SubjectTransferDO::getUserId1, reqVO.getUserId1())
.eqIfPresent(SubjectTransferDO::getUserId2, reqVO.getUserId2())
.eqIfPresent(SubjectTransferDO::getTransferType, reqVO.getTransferType())
.eqIfPresent(SubjectTransferDO::getRemark, reqVO.getRemark())
.betweenIfPresent(SubjectTransferDO::getCreateTime, reqVO.getCreateTime())
.orderByDesc(SubjectTransferDO::getId));
}
}

@ -1,5 +1,12 @@
package com.yunxi.scm.module.xxjj.service.subjectfollowmanagement; package com.yunxi.scm.module.xxjj.service.subjectfollowmanagement;
import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.yunxi.scm.module.system.dal.dataobject.user.AdminUserDO;
import com.yunxi.scm.module.system.service.user.AdminUserService;
import com.yunxi.scm.module.xxjj.dal.dataobject.subjectbasic.SubjectBasicDO;
import com.yunxi.scm.module.xxjj.service.subjectbasic.SubjectBasicService;
import org.apache.commons.lang3.StringUtils;
import org.springframework.stereotype.Service; import org.springframework.stereotype.Service;
import javax.annotation.Resource; import javax.annotation.Resource;
import org.springframework.validation.annotation.Validated; import org.springframework.validation.annotation.Validated;
@ -26,11 +33,16 @@ public class SubjectFollowManagementServiceImpl implements SubjectFollowManageme
@Resource @Resource
private SubjectFollowManagementMapper subjectFollowManagementMapper; private SubjectFollowManagementMapper subjectFollowManagementMapper;
@Resource
private SubjectBasicService subjectBasicService;
@Resource
private AdminUserService adminUserService;
@Override @Override
public Long createSubjectFollowManagement(SubjectFollowManagementCreateReqVO createReqVO) { public Long createSubjectFollowManagement(SubjectFollowManagementCreateReqVO createReqVO) {
// 插入 // 插入
SubjectFollowManagementDO subjectFollowManagement = SubjectFollowManagementConvert.INSTANCE.convert(createReqVO); SubjectFollowManagementDO subjectFollowManagement = SubjectFollowManagementConvert.INSTANCE.convert(createReqVO);
subjectFollowManagement.setRemindMode(StringUtils.join(createReqVO.getRemindModeArr(), ","));
subjectFollowManagementMapper.insert(subjectFollowManagement); subjectFollowManagementMapper.insert(subjectFollowManagement);
// 返回 // 返回
return subjectFollowManagement.getId(); return subjectFollowManagement.getId();
@ -42,6 +54,7 @@ public class SubjectFollowManagementServiceImpl implements SubjectFollowManageme
validateSubjectFollowManagementExists(updateReqVO.getId()); validateSubjectFollowManagementExists(updateReqVO.getId());
// 更新 // 更新
SubjectFollowManagementDO updateObj = SubjectFollowManagementConvert.INSTANCE.convert(updateReqVO); SubjectFollowManagementDO updateObj = SubjectFollowManagementConvert.INSTANCE.convert(updateReqVO);
updateObj.setRemindMode(StringUtils.join(updateReqVO.getRemindModeArr(), ","));
subjectFollowManagementMapper.updateById(updateObj); subjectFollowManagementMapper.updateById(updateObj);
} }
@ -71,7 +84,29 @@ public class SubjectFollowManagementServiceImpl implements SubjectFollowManageme
@Override @Override
public PageResult<SubjectFollowManagementDO> getSubjectFollowManagementPage(SubjectFollowManagementPageReqVO pageReqVO) { public PageResult<SubjectFollowManagementDO> getSubjectFollowManagementPage(SubjectFollowManagementPageReqVO pageReqVO) {
return subjectFollowManagementMapper.selectPage(pageReqVO);
IPage<SubjectFollowManagementDO> page = new Page<>(pageReqVO.getPageNo(), pageReqVO.getPageSize());
subjectFollowManagementMapper.selectPage02(page, pageReqVO);
return new PageResult<>(page.getRecords(), page.getTotal());
/*PageResult<SubjectFollowManagementDO> pageResult = subjectFollowManagementMapper.selectPage(pageReqVO);
List<SubjectFollowManagementDO> list = pageResult.getList();
for (SubjectFollowManagementDO subjectFollowManagementDO : list) {
SubjectBasicDO subjectBasicDO = subjectBasicService.getSubjectBasic(subjectFollowManagementDO.getBusinessId());
subjectFollowManagementDO.setSubjectBasicDO(subjectBasicDO);
if(StringUtils.isNotEmpty(subjectFollowManagementDO.getCreator())){
AdminUserDO adminUserDO = adminUserService.getUser(Long.parseLong(subjectFollowManagementDO.getCreator()));
subjectFollowManagementDO.setCreatorName(adminUserDO.getNickname());
}
if(StringUtils.isNotEmpty(subjectFollowManagementDO.getUpdater())){
AdminUserDO adminUserDO = adminUserService.getUser(Long.parseLong(subjectFollowManagementDO.getUpdater()));
subjectFollowManagementDO.setUpdaterName(adminUserDO.getNickname());
}
}
pageResult.setList(list);
return pageResult;*/
} }
@Override @Override

@ -0,0 +1,70 @@
package com.yunxi.scm.module.xxjj.service.subjectfollowreport;
import java.util.*;
import javax.validation.*;
import com.yunxi.scm.module.xxjj.controller.admin.subjectfollowreport.vo.*;
import com.yunxi.scm.module.xxjj.dal.dataobject.subjectfollowreport.SubjectFollowReportDO;
import com.yunxi.scm.framework.common.pojo.PageResult;
/**
* Service
*
* @author
*/
public interface SubjectFollowReportService {
/**
*
*
* @param createReqVO
* @return
*/
Long createSubjectFollowReport(@Valid SubjectFollowReportCreateReqVO createReqVO);
/**
*
*
* @param updateReqVO
*/
void updateSubjectFollowReport(@Valid SubjectFollowReportUpdateReqVO updateReqVO);
/**
*
*
* @param id
*/
void deleteSubjectFollowReport(Long id);
/**
*
*
* @param id
* @return
*/
SubjectFollowReportDO getSubjectFollowReport(Long id);
/**
*
*
* @param ids
* @return
*/
List<SubjectFollowReportDO> getSubjectFollowReportList(Collection<Long> ids);
/**
*
*
* @param pageReqVO
* @return
*/
PageResult<SubjectFollowReportDO> getSubjectFollowReportPage(SubjectFollowReportPageReqVO pageReqVO);
/**
* , Excel
*
* @param exportReqVO
* @return
*/
List<SubjectFollowReportDO> getSubjectFollowReportList(SubjectFollowReportExportReqVO exportReqVO);
}

@ -0,0 +1,82 @@
package com.yunxi.scm.module.xxjj.service.subjectfollowreport;
import org.springframework.stereotype.Service;
import javax.annotation.Resource;
import org.springframework.validation.annotation.Validated;
import java.util.*;
import com.yunxi.scm.module.xxjj.controller.admin.subjectfollowreport.vo.*;
import com.yunxi.scm.module.xxjj.dal.dataobject.subjectfollowreport.SubjectFollowReportDO;
import com.yunxi.scm.framework.common.pojo.PageResult;
import com.yunxi.scm.module.xxjj.convert.subjectfollowreport.SubjectFollowReportConvert;
import com.yunxi.scm.module.xxjj.dal.mysql.subjectfollowreport.SubjectFollowReportMapper;
import static com.yunxi.scm.framework.common.exception.util.ServiceExceptionUtil.exception;
import static com.yunxi.scm.module.xxjj.enums.ErrorCodeConstants.*;
/**
* Service
*
* @author
*/
@Service
@Validated
public class SubjectFollowReportServiceImpl implements SubjectFollowReportService {
@Resource
private SubjectFollowReportMapper subjectFollowReportMapper;
@Override
public Long createSubjectFollowReport(SubjectFollowReportCreateReqVO createReqVO) {
// 插入
SubjectFollowReportDO subjectFollowReport = SubjectFollowReportConvert.INSTANCE.convert(createReqVO);
subjectFollowReportMapper.insert(subjectFollowReport);
// 返回
return subjectFollowReport.getId();
}
@Override
public void updateSubjectFollowReport(SubjectFollowReportUpdateReqVO updateReqVO) {
// 校验存在
validateSubjectFollowReportExists(updateReqVO.getId());
// 更新
SubjectFollowReportDO updateObj = SubjectFollowReportConvert.INSTANCE.convert(updateReqVO);
subjectFollowReportMapper.updateById(updateObj);
}
@Override
public void deleteSubjectFollowReport(Long id) {
// 校验存在
validateSubjectFollowReportExists(id);
// 删除
subjectFollowReportMapper.deleteById(id);
}
private void validateSubjectFollowReportExists(Long id) {
if (subjectFollowReportMapper.selectById(id) == null) {
//throw exception(SUBJECT_FOLLOW_REPORT_NOT_EXISTS);
}
}
@Override
public SubjectFollowReportDO getSubjectFollowReport(Long id) {
return subjectFollowReportMapper.selectById(id);
}
@Override
public List<SubjectFollowReportDO> getSubjectFollowReportList(Collection<Long> ids) {
return subjectFollowReportMapper.selectBatchIds(ids);
}
@Override
public PageResult<SubjectFollowReportDO> getSubjectFollowReportPage(SubjectFollowReportPageReqVO pageReqVO) {
return subjectFollowReportMapper.selectPage(pageReqVO);
}
@Override
public List<SubjectFollowReportDO> getSubjectFollowReportList(SubjectFollowReportExportReqVO exportReqVO) {
return subjectFollowReportMapper.selectList(exportReqVO);
}
}

@ -0,0 +1,70 @@
package com.yunxi.scm.module.xxjj.service.subjecttransfer;
import java.util.*;
import javax.validation.*;
import com.yunxi.scm.module.xxjj.controller.admin.subjecttransfer.vo.*;
import com.yunxi.scm.module.xxjj.dal.dataobject.subjecttransfer.SubjectTransferDO;
import com.yunxi.scm.framework.common.pojo.PageResult;
/**
* Service
*
* @author
*/
public interface SubjectTransferService {
/**
*
*
* @param createReqVO
* @return
*/
Long createSubjectTransfer(@Valid SubjectTransferCreateReqVO createReqVO);
/**
*
*
* @param updateReqVO
*/
void updateSubjectTransfer(@Valid SubjectTransferUpdateReqVO updateReqVO);
/**
*
*
* @param id
*/
void deleteSubjectTransfer(Long id);
/**
*
*
* @param id
* @return
*/
SubjectTransferDO getSubjectTransfer(Long id);
/**
*
*
* @param ids
* @return
*/
List<SubjectTransferDO> getSubjectTransferList(Collection<Long> ids);
/**
*
*
* @param pageReqVO
* @return
*/
PageResult<SubjectTransferDO> getSubjectTransferPage(SubjectTransferPageReqVO pageReqVO);
/**
* , Excel
*
* @param exportReqVO
* @return
*/
List<SubjectTransferDO> getSubjectTransferList(SubjectTransferExportReqVO exportReqVO);
}

@ -0,0 +1,87 @@
package com.yunxi.scm.module.xxjj.service.subjecttransfer;
import org.apache.commons.lang3.StringUtils;
import org.springframework.stereotype.Service;
import javax.annotation.Resource;
import org.springframework.validation.annotation.Validated;
import java.util.*;
import com.yunxi.scm.module.xxjj.controller.admin.subjecttransfer.vo.*;
import com.yunxi.scm.module.xxjj.dal.dataobject.subjecttransfer.SubjectTransferDO;
import com.yunxi.scm.framework.common.pojo.PageResult;
import com.yunxi.scm.module.xxjj.convert.subjecttransfer.SubjectTransferConvert;
import com.yunxi.scm.module.xxjj.dal.mysql.subjecttransfer.SubjectTransferMapper;
import static com.yunxi.scm.framework.common.exception.util.ServiceExceptionUtil.exception;
import static com.yunxi.scm.module.xxjj.enums.ErrorCodeConstants.*;
/**
* Service
*
* @author
*/
@Service
@Validated
public class SubjectTransferServiceImpl implements SubjectTransferService {
@Resource
private SubjectTransferMapper subjectTransferMapper;
@Override
public Long createSubjectTransfer(SubjectTransferCreateReqVO createReqVO) {
String[] businessIds = createReqVO.getBusinessIds().split(",");
for (int i=0; i< businessIds.length; i++){
SubjectTransferDO subjectTransfer = SubjectTransferConvert.INSTANCE.convert(createReqVO);
subjectTransfer.setBusinessId(Long.parseLong(businessIds[i]));
subjectTransfer.setUserId1(Long.parseLong(createReqVO.getUserId1s().split(",")[i]));
subjectTransfer.setTransferType((StringUtils.join(createReqVO.getTransferTypeArr(), ",")));
subjectTransferMapper.insert(subjectTransfer);
}
return 0L;
}
@Override
public void updateSubjectTransfer(SubjectTransferUpdateReqVO updateReqVO) {
// 校验存在
validateSubjectTransferExists(updateReqVO.getId());
// 更新
SubjectTransferDO updateObj = SubjectTransferConvert.INSTANCE.convert(updateReqVO);
subjectTransferMapper.updateById(updateObj);
}
@Override
public void deleteSubjectTransfer(Long id) {
// 校验存在
validateSubjectTransferExists(id);
// 删除
subjectTransferMapper.deleteById(id);
}
private void validateSubjectTransferExists(Long id) {
if (subjectTransferMapper.selectById(id) == null) {
throw exception(SUBJECT_TRANSFER_NOT_EXISTS);
}
}
@Override
public SubjectTransferDO getSubjectTransfer(Long id) {
return subjectTransferMapper.selectById(id);
}
@Override
public List<SubjectTransferDO> getSubjectTransferList(Collection<Long> ids) {
return subjectTransferMapper.selectBatchIds(ids);
}
@Override
public PageResult<SubjectTransferDO> getSubjectTransferPage(SubjectTransferPageReqVO pageReqVO) {
return subjectTransferMapper.selectPage(pageReqVO);
}
@Override
public List<SubjectTransferDO> getSubjectTransferList(SubjectTransferExportReqVO exportReqVO) {
return subjectTransferMapper.selectList(exportReqVO);
}
}

@ -8,5 +8,29 @@
代码生成器暂时只生成 Mapper XML 文件本身,更多推荐 MybatisX 快速开发插件来生成查询。 代码生成器暂时只生成 Mapper XML 文件本身,更多推荐 MybatisX 快速开发插件来生成查询。
文档可见https://www.iocoder.cn/MyBatis/x-plugins/ 文档可见https://www.iocoder.cn/MyBatis/x-plugins/
--> -->
<select id="selectPage02"
resultType="com.yunxi.scm.module.xxjj.dal.dataobject.subjectfollowmanagement.SubjectFollowManagementDO" >
SELECT a.*,b.name,b.logo,b.calssify,b.reserved_fields1,b.enterprise_nature,b.industry_classify,b.customer_source,b.customer_starrating,b.industry_schedule,c.nickname creatorName,d.nickname updaterName,e.nickname belongingPeopleName
from xxjj_subject_follow_management a LEFT JOIN xxjj_subject_basic b on a.business_id = b.id
LEFT JOIN system_users c on a.creator = c.id
LEFT JOIN system_users d on a.updater = d.id
LEFT JOIN system_users e on b.belonging_people = e.id
where 1=1
<if test="reqVO.title != null and reqVO.title !=''">
AND a.title like concat('%', #{reqVO.title}, '%')
</if>
<if test="reqVO.businessType != null and reqVO.businessType !=''">
AND a.business_type = #{reqVO.businessType}
</if>
<if test="reqVO.name != null and reqVO.name !=''">
AND b.name like concat('%', #{reqVO.name}, '%')
</if>
<if test="reqVO.calssify != null and reqVO.calssify !=''">
AND b.calssify = #{reqVO.calssify}
</if>
<if test="reqVO.businessType != null and reqVO.businessType !=''">
AND a.business_type = #{reqVO.businessType}
</if>
ORDER BY id DESC
</select>
</mapper> </mapper>

@ -0,0 +1,12 @@
<?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.yunxi.scm.module.xxjj.dal.mysql.subjectfollowreport.SubjectFollowReportMapper">
<!--
一般情况下,尽可能使用 Mapper 进行 CRUD 增删改查即可。
无法满足的场景,例如说多表关联查询,才使用 XML 编写 SQL。
代码生成器暂时只生成 Mapper XML 文件本身,更多推荐 MybatisX 快速开发插件来生成查询。
文档可见https://www.iocoder.cn/MyBatis/x-plugins/
-->
</mapper>

@ -0,0 +1,12 @@
<?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.yunxi.scm.module.xxjj.dal.mysql.subjecttransfer.SubjectTransferMapper">
<!--
一般情况下,尽可能使用 Mapper 进行 CRUD 增删改查即可。
无法满足的场景,例如说多表关联查询,才使用 XML 编写 SQL。
代码生成器暂时只生成 Mapper XML 文件本身,更多推荐 MybatisX 快速开发插件来生成查询。
文档可见https://www.iocoder.cn/MyBatis/x-plugins/
-->
</mapper>

@ -0,0 +1,215 @@
package com.yunxi.scm.module.xxjj.service.subjectfollowreport;
import org.junit.jupiter.api.Disabled;
import org.junit.jupiter.api.Test;
import org.springframework.boot.test.mock.mockito.MockBean;
import javax.annotation.Resource;
import com.yunxi.scm.framework.test.core.ut.BaseDbUnitTest;
import com.yunxi.scm.module.xxjj.controller.admin.subjectfollowreport.vo.*;
import com.yunxi.scm.module.xxjj.dal.dataobject.subjectfollowreport.SubjectFollowReportDO;
import com.yunxi.scm.module.xxjj.dal.mysql.subjectfollowreport.SubjectFollowReportMapper;
import com.yunxi.scm.framework.common.pojo.PageResult;
import javax.annotation.Resource;
import org.springframework.context.annotation.Import;
import java.util.*;
import java.time.LocalDateTime;
import static cn.hutool.core.util.RandomUtil.*;
import static com.yunxi.scm.module.xxjj.enums.ErrorCodeConstants.*;
import static com.yunxi.scm.framework.test.core.util.AssertUtils.*;
import static com.yunxi.scm.framework.test.core.util.RandomUtils.*;
import static com.yunxi.scm.framework.common.util.date.LocalDateTimeUtils.*;
import static com.yunxi.scm.framework.common.util.object.ObjectUtils.*;
import static com.yunxi.scm.framework.common.util.date.DateUtils.*;
import static org.junit.jupiter.api.Assertions.*;
import static org.mockito.Mockito.*;
/**
* {@link SubjectFollowReportServiceImpl}
*
* @author
*/
@Import(SubjectFollowReportServiceImpl.class)
public class SubjectFollowReportServiceImplTest extends BaseDbUnitTest {
@Resource
private SubjectFollowReportServiceImpl subjectFollowReportService;
@Resource
private SubjectFollowReportMapper subjectFollowReportMapper;
@Test
public void testCreateSubjectFollowReport_success() {
// 准备参数
SubjectFollowReportCreateReqVO reqVO = randomPojo(SubjectFollowReportCreateReqVO.class);
// 调用
Long subjectFollowReportId = subjectFollowReportService.createSubjectFollowReport(reqVO);
// 断言
assertNotNull(subjectFollowReportId);
// 校验记录的属性是否正确
SubjectFollowReportDO subjectFollowReport = subjectFollowReportMapper.selectById(subjectFollowReportId);
assertPojoEquals(reqVO, subjectFollowReport);
}
@Test
public void testUpdateSubjectFollowReport_success() {
// mock 数据
SubjectFollowReportDO dbSubjectFollowReport = randomPojo(SubjectFollowReportDO.class);
subjectFollowReportMapper.insert(dbSubjectFollowReport);// @Sql: 先插入出一条存在的数据
// 准备参数
SubjectFollowReportUpdateReqVO reqVO = randomPojo(SubjectFollowReportUpdateReqVO.class, o -> {
o.setId(dbSubjectFollowReport.getId()); // 设置更新的 ID
});
// 调用
subjectFollowReportService.updateSubjectFollowReport(reqVO);
// 校验是否更新正确
SubjectFollowReportDO subjectFollowReport = subjectFollowReportMapper.selectById(reqVO.getId()); // 获取最新的
assertPojoEquals(reqVO, subjectFollowReport);
}
@Test
public void testUpdateSubjectFollowReport_notExists() {
// 准备参数
SubjectFollowReportUpdateReqVO reqVO = randomPojo(SubjectFollowReportUpdateReqVO.class);
// 调用, 并断言异常
assertServiceException(() -> subjectFollowReportService.updateSubjectFollowReport(reqVO), SUBJECT_FOLLOW_REPORT_NOT_EXISTS);
}
@Test
public void testDeleteSubjectFollowReport_success() {
// mock 数据
SubjectFollowReportDO dbSubjectFollowReport = randomPojo(SubjectFollowReportDO.class);
subjectFollowReportMapper.insert(dbSubjectFollowReport);// @Sql: 先插入出一条存在的数据
// 准备参数
Long id = dbSubjectFollowReport.getId();
// 调用
subjectFollowReportService.deleteSubjectFollowReport(id);
// 校验数据不存在了
assertNull(subjectFollowReportMapper.selectById(id));
}
@Test
public void testDeleteSubjectFollowReport_notExists() {
// 准备参数
Long id = randomLongId();
// 调用, 并断言异常
assertServiceException(() -> subjectFollowReportService.deleteSubjectFollowReport(id), SUBJECT_FOLLOW_REPORT_NOT_EXISTS);
}
@Test
@Disabled // TODO 请修改 null 为需要的值,然后删除 @Disabled 注解
public void testGetSubjectFollowReportPage() {
// mock 数据
SubjectFollowReportDO dbSubjectFollowReport = randomPojo(SubjectFollowReportDO.class, o -> { // 等会查询到
o.setReportType(null);
o.setReporTime(null);
o.setFollowTime(null);
o.setBusinessId(null);
o.setAnnex(null);
o.setDescription(null);
o.setReadOverUser(null);
o.setMakeCopyUser(null);
o.setCreateTime(null);
});
subjectFollowReportMapper.insert(dbSubjectFollowReport);
// 测试 reportType 不匹配
subjectFollowReportMapper.insert(cloneIgnoreId(dbSubjectFollowReport, o -> o.setReportType(null)));
// 测试 reporTime 不匹配
subjectFollowReportMapper.insert(cloneIgnoreId(dbSubjectFollowReport, o -> o.setReporTime(null)));
// 测试 followTime 不匹配
subjectFollowReportMapper.insert(cloneIgnoreId(dbSubjectFollowReport, o -> o.setFollowTime(null)));
// 测试 businessId 不匹配
subjectFollowReportMapper.insert(cloneIgnoreId(dbSubjectFollowReport, o -> o.setBusinessId(null)));
// 测试 annex 不匹配
subjectFollowReportMapper.insert(cloneIgnoreId(dbSubjectFollowReport, o -> o.setAnnex(null)));
// 测试 description 不匹配
subjectFollowReportMapper.insert(cloneIgnoreId(dbSubjectFollowReport, o -> o.setDescription(null)));
// 测试 readOverUser 不匹配
subjectFollowReportMapper.insert(cloneIgnoreId(dbSubjectFollowReport, o -> o.setReadOverUser(null)));
// 测试 makeCopyUser 不匹配
subjectFollowReportMapper.insert(cloneIgnoreId(dbSubjectFollowReport, o -> o.setMakeCopyUser(null)));
// 测试 createTime 不匹配
subjectFollowReportMapper.insert(cloneIgnoreId(dbSubjectFollowReport, o -> o.setCreateTime(null)));
// 准备参数
SubjectFollowReportPageReqVO reqVO = new SubjectFollowReportPageReqVO();
reqVO.setReportType(null);
reqVO.setReporTime(buildBetweenTime(2023, 2, 1, 2023, 2, 28));
reqVO.setFollowTime(buildBetweenTime(2023, 2, 1, 2023, 2, 28));
reqVO.setBusinessId(null);
reqVO.setAnnex(null);
reqVO.setDescription(null);
reqVO.setReadOverUser(null);
reqVO.setMakeCopyUser(null);
reqVO.setCreateTime(buildBetweenTime(2023, 2, 1, 2023, 2, 28));
// 调用
PageResult<SubjectFollowReportDO> pageResult = subjectFollowReportService.getSubjectFollowReportPage(reqVO);
// 断言
assertEquals(1, pageResult.getTotal());
assertEquals(1, pageResult.getList().size());
assertPojoEquals(dbSubjectFollowReport, pageResult.getList().get(0));
}
@Test
@Disabled // TODO 请修改 null 为需要的值,然后删除 @Disabled 注解
public void testGetSubjectFollowReportList() {
// mock 数据
SubjectFollowReportDO dbSubjectFollowReport = randomPojo(SubjectFollowReportDO.class, o -> { // 等会查询到
o.setReportType(null);
o.setReporTime(null);
o.setFollowTime(null);
o.setBusinessId(null);
o.setAnnex(null);
o.setDescription(null);
o.setReadOverUser(null);
o.setMakeCopyUser(null);
o.setCreateTime(null);
});
subjectFollowReportMapper.insert(dbSubjectFollowReport);
// 测试 reportType 不匹配
subjectFollowReportMapper.insert(cloneIgnoreId(dbSubjectFollowReport, o -> o.setReportType(null)));
// 测试 reporTime 不匹配
subjectFollowReportMapper.insert(cloneIgnoreId(dbSubjectFollowReport, o -> o.setReporTime(null)));
// 测试 followTime 不匹配
subjectFollowReportMapper.insert(cloneIgnoreId(dbSubjectFollowReport, o -> o.setFollowTime(null)));
// 测试 businessId 不匹配
subjectFollowReportMapper.insert(cloneIgnoreId(dbSubjectFollowReport, o -> o.setBusinessId(null)));
// 测试 annex 不匹配
subjectFollowReportMapper.insert(cloneIgnoreId(dbSubjectFollowReport, o -> o.setAnnex(null)));
// 测试 description 不匹配
subjectFollowReportMapper.insert(cloneIgnoreId(dbSubjectFollowReport, o -> o.setDescription(null)));
// 测试 readOverUser 不匹配
subjectFollowReportMapper.insert(cloneIgnoreId(dbSubjectFollowReport, o -> o.setReadOverUser(null)));
// 测试 makeCopyUser 不匹配
subjectFollowReportMapper.insert(cloneIgnoreId(dbSubjectFollowReport, o -> o.setMakeCopyUser(null)));
// 测试 createTime 不匹配
subjectFollowReportMapper.insert(cloneIgnoreId(dbSubjectFollowReport, o -> o.setCreateTime(null)));
// 准备参数
SubjectFollowReportExportReqVO reqVO = new SubjectFollowReportExportReqVO();
reqVO.setReportType(null);
reqVO.setReporTime(buildBetweenTime(2023, 2, 1, 2023, 2, 28));
reqVO.setFollowTime(buildBetweenTime(2023, 2, 1, 2023, 2, 28));
reqVO.setBusinessId(null);
reqVO.setAnnex(null);
reqVO.setDescription(null);
reqVO.setReadOverUser(null);
reqVO.setMakeCopyUser(null);
reqVO.setCreateTime(buildBetweenTime(2023, 2, 1, 2023, 2, 28));
// 调用
List<SubjectFollowReportDO> list = subjectFollowReportService.getSubjectFollowReportList(reqVO);
// 断言
assertEquals(1, list.size());
assertPojoEquals(dbSubjectFollowReport, list.get(0));
}
}

@ -0,0 +1,199 @@
package com.yunxi.scm.module.xxjj.service.subjecttransfer;
import org.junit.jupiter.api.Disabled;
import org.junit.jupiter.api.Test;
import org.springframework.boot.test.mock.mockito.MockBean;
import javax.annotation.Resource;
import com.yunxi.scm.framework.test.core.ut.BaseDbUnitTest;
import com.yunxi.scm.module.xxjj.controller.admin.subjecttransfer.vo.*;
import com.yunxi.scm.module.xxjj.dal.dataobject.subjecttransfer.SubjectTransferDO;
import com.yunxi.scm.module.xxjj.dal.mysql.subjecttransfer.SubjectTransferMapper;
import com.yunxi.scm.framework.common.pojo.PageResult;
import javax.annotation.Resource;
import org.springframework.context.annotation.Import;
import java.util.*;
import java.time.LocalDateTime;
import static cn.hutool.core.util.RandomUtil.*;
import static com.yunxi.scm.module.xxjj.enums.ErrorCodeConstants.*;
import static com.yunxi.scm.framework.test.core.util.AssertUtils.*;
import static com.yunxi.scm.framework.test.core.util.RandomUtils.*;
import static com.yunxi.scm.framework.common.util.date.LocalDateTimeUtils.*;
import static com.yunxi.scm.framework.common.util.object.ObjectUtils.*;
import static com.yunxi.scm.framework.common.util.date.DateUtils.*;
import static org.junit.jupiter.api.Assertions.*;
import static org.mockito.Mockito.*;
/**
* {@link SubjectTransferServiceImpl}
*
* @author
*/
@Import(SubjectTransferServiceImpl.class)
public class SubjectTransferServiceImplTest extends BaseDbUnitTest {
@Resource
private SubjectTransferServiceImpl subjectTransferService;
@Resource
private SubjectTransferMapper subjectTransferMapper;
@Test
public void testCreateSubjectTransfer_success() {
// 准备参数
SubjectTransferCreateReqVO reqVO = randomPojo(SubjectTransferCreateReqVO.class);
// 调用
Long subjectTransferId = subjectTransferService.createSubjectTransfer(reqVO);
// 断言
assertNotNull(subjectTransferId);
// 校验记录的属性是否正确
SubjectTransferDO subjectTransfer = subjectTransferMapper.selectById(subjectTransferId);
assertPojoEquals(reqVO, subjectTransfer);
}
@Test
public void testUpdateSubjectTransfer_success() {
// mock 数据
SubjectTransferDO dbSubjectTransfer = randomPojo(SubjectTransferDO.class);
subjectTransferMapper.insert(dbSubjectTransfer);// @Sql: 先插入出一条存在的数据
// 准备参数
SubjectTransferUpdateReqVO reqVO = randomPojo(SubjectTransferUpdateReqVO.class, o -> {
o.setId(dbSubjectTransfer.getId()); // 设置更新的 ID
});
// 调用
subjectTransferService.updateSubjectTransfer(reqVO);
// 校验是否更新正确
SubjectTransferDO subjectTransfer = subjectTransferMapper.selectById(reqVO.getId()); // 获取最新的
assertPojoEquals(reqVO, subjectTransfer);
}
@Test
public void testUpdateSubjectTransfer_notExists() {
// 准备参数
SubjectTransferUpdateReqVO reqVO = randomPojo(SubjectTransferUpdateReqVO.class);
// 调用, 并断言异常
assertServiceException(() -> subjectTransferService.updateSubjectTransfer(reqVO), SUBJECT_TRANSFER_NOT_EXISTS);
}
@Test
public void testDeleteSubjectTransfer_success() {
// mock 数据
SubjectTransferDO dbSubjectTransfer = randomPojo(SubjectTransferDO.class);
subjectTransferMapper.insert(dbSubjectTransfer);// @Sql: 先插入出一条存在的数据
// 准备参数
Long id = dbSubjectTransfer.getId();
// 调用
subjectTransferService.deleteSubjectTransfer(id);
// 校验数据不存在了
assertNull(subjectTransferMapper.selectById(id));
}
@Test
public void testDeleteSubjectTransfer_notExists() {
// 准备参数
Long id = randomLongId();
// 调用, 并断言异常
assertServiceException(() -> subjectTransferService.deleteSubjectTransfer(id), SUBJECT_TRANSFER_NOT_EXISTS);
}
@Test
@Disabled // TODO 请修改 null 为需要的值,然后删除 @Disabled 注解
public void testGetSubjectTransferPage() {
// mock 数据
SubjectTransferDO dbSubjectTransfer = randomPojo(SubjectTransferDO.class, o -> { // 等会查询到
o.setBusinessId(null);
o.setBusinessType(null);
o.setUserId1(null);
o.setUserId2(null);
o.setTransferType(null);
o.setRemark(null);
o.setCreateTime(null);
});
subjectTransferMapper.insert(dbSubjectTransfer);
// 测试 businessId 不匹配
subjectTransferMapper.insert(cloneIgnoreId(dbSubjectTransfer, o -> o.setBusinessId(null)));
// 测试 businessType 不匹配
subjectTransferMapper.insert(cloneIgnoreId(dbSubjectTransfer, o -> o.setBusinessType(null)));
// 测试 userId1 不匹配
subjectTransferMapper.insert(cloneIgnoreId(dbSubjectTransfer, o -> o.setUserId1(null)));
// 测试 userId2 不匹配
subjectTransferMapper.insert(cloneIgnoreId(dbSubjectTransfer, o -> o.setUserId2(null)));
// 测试 transferType 不匹配
subjectTransferMapper.insert(cloneIgnoreId(dbSubjectTransfer, o -> o.setTransferType(null)));
// 测试 remark 不匹配
subjectTransferMapper.insert(cloneIgnoreId(dbSubjectTransfer, o -> o.setRemark(null)));
// 测试 createTime 不匹配
subjectTransferMapper.insert(cloneIgnoreId(dbSubjectTransfer, o -> o.setCreateTime(null)));
// 准备参数
SubjectTransferPageReqVO reqVO = new SubjectTransferPageReqVO();
reqVO.setBusinessId(null);
reqVO.setBusinessType(null);
reqVO.setUserId1(null);
reqVO.setUserId2(null);
reqVO.setTransferType(null);
reqVO.setRemark(null);
reqVO.setCreateTime(buildBetweenTime(2023, 2, 1, 2023, 2, 28));
// 调用
PageResult<SubjectTransferDO> pageResult = subjectTransferService.getSubjectTransferPage(reqVO);
// 断言
assertEquals(1, pageResult.getTotal());
assertEquals(1, pageResult.getList().size());
assertPojoEquals(dbSubjectTransfer, pageResult.getList().get(0));
}
@Test
@Disabled // TODO 请修改 null 为需要的值,然后删除 @Disabled 注解
public void testGetSubjectTransferList() {
// mock 数据
SubjectTransferDO dbSubjectTransfer = randomPojo(SubjectTransferDO.class, o -> { // 等会查询到
o.setBusinessId(null);
o.setBusinessType(null);
o.setUserId1(null);
o.setUserId2(null);
o.setTransferType(null);
o.setRemark(null);
o.setCreateTime(null);
});
subjectTransferMapper.insert(dbSubjectTransfer);
// 测试 businessId 不匹配
subjectTransferMapper.insert(cloneIgnoreId(dbSubjectTransfer, o -> o.setBusinessId(null)));
// 测试 businessType 不匹配
subjectTransferMapper.insert(cloneIgnoreId(dbSubjectTransfer, o -> o.setBusinessType(null)));
// 测试 userId1 不匹配
subjectTransferMapper.insert(cloneIgnoreId(dbSubjectTransfer, o -> o.setUserId1(null)));
// 测试 userId2 不匹配
subjectTransferMapper.insert(cloneIgnoreId(dbSubjectTransfer, o -> o.setUserId2(null)));
// 测试 transferType 不匹配
subjectTransferMapper.insert(cloneIgnoreId(dbSubjectTransfer, o -> o.setTransferType(null)));
// 测试 remark 不匹配
subjectTransferMapper.insert(cloneIgnoreId(dbSubjectTransfer, o -> o.setRemark(null)));
// 测试 createTime 不匹配
subjectTransferMapper.insert(cloneIgnoreId(dbSubjectTransfer, o -> o.setCreateTime(null)));
// 准备参数
SubjectTransferExportReqVO reqVO = new SubjectTransferExportReqVO();
reqVO.setBusinessId(null);
reqVO.setBusinessType(null);
reqVO.setUserId1(null);
reqVO.setUserId2(null);
reqVO.setTransferType(null);
reqVO.setRemark(null);
reqVO.setCreateTime(buildBetweenTime(2023, 2, 1, 2023, 2, 28));
// 调用
List<SubjectTransferDO> list = subjectTransferService.getSubjectTransferList(reqVO);
// 断言
assertEquals(1, list.size());
assertPojoEquals(dbSubjectTransfer, list.get(0));
}
}

@ -0,0 +1,48 @@
import request from '@/config/axios'
export interface SubjectFollowManagementVO {
id: number
businessId: number
businessType: string
title: string
idCard: string
startTime: Date
endTime: Date
responsible: string
partake: string
mark: string
urgency: string
remindType: string
description: string
annex: string
}
// 查询主体跟进管理列表
export const getSubjectFollowManagementPage = async (params) => {
return await request.get({ url: `/xxjj/subject-follow-management/page`, params })
}
// 查询主体跟进管理详情
export const getSubjectFollowManagement = async (id: number) => {
return await request.get({ url: `/xxjj/subject-follow-management/get?id=` + id })
}
// 新增主体跟进管理
export const createSubjectFollowManagement = async (data: SubjectFollowManagementVO) => {
return await request.post({ url: `/xxjj/subject-follow-management/create`, data })
}
// 修改主体跟进管理
export const updateSubjectFollowManagement = async (data: SubjectFollowManagementVO) => {
return await request.put({ url: `/xxjj/subject-follow-management/update`, data })
}
// 删除主体跟进管理
export const deleteSubjectFollowManagement = async (id: number) => {
return await request.delete({ url: `/xxjj/subject-follow-management/delete?id=` + id })
}
// 导出主体跟进管理 Excel
export const exportSubjectFollowManagement = async (params) => {
return await request.download({ url: `/xxjj/subject-follow-management/export-excel`, params })
}

@ -0,0 +1,43 @@
import request from '@/config/axios'
export interface SubjectFollowReportVO {
id: number
reportType: string
reporTime: Date
followTime: Date
businessId: number
annex: string
description: string
readOverUser: string
makeCopyUser: string
}
// 查询跟进报告管理列表
export const getSubjectFollowReportPage = async (params) => {
return await request.get({ url: `/xxjj/subject-follow-report/page`, params })
}
// 查询跟进报告管理详情
export const getSubjectFollowReport = async (id: number) => {
return await request.get({ url: `/xxjj/subject-follow-report/get?id=` + id })
}
// 新增跟进报告管理
export const createSubjectFollowReport = async (data: SubjectFollowReportVO) => {
return await request.post({ url: `/xxjj/subject-follow-report/create`, data })
}
// 修改跟进报告管理
export const updateSubjectFollowReport = async (data: SubjectFollowReportVO) => {
return await request.put({ url: `/xxjj/subject-follow-report/update`, data })
}
// 删除跟进报告管理
export const deleteSubjectFollowReport = async (id: number) => {
return await request.delete({ url: `/xxjj/subject-follow-report/delete?id=` + id })
}
// 导出跟进报告管理 Excel
export const exportSubjectFollowReport = async (params) => {
return await request.download({ url: `/xxjj/subject-follow-report/export-excel`, params })
}

@ -0,0 +1,41 @@
import request from '@/config/axios'
export interface SubjectTransferVO {
id: number
businessId: number
businessType: string
userId1: number
userId2: number
transferType: string
remark: string
}
// 查询主体负责人转移列表
export const getSubjectTransferPage = async (params) => {
return await request.get({ url: `/xxjj/subject-transfer/page`, params })
}
// 查询主体负责人转移详情
export const getSubjectTransfer = async (id: number) => {
return await request.get({ url: `/xxjj/subject-transfer/get?id=` + id })
}
// 新增主体负责人转移
export const createSubjectTransfer = async (data: SubjectTransferVO) => {
return await request.post({ url: `/xxjj/subject-transfer/create`, data })
}
// 修改主体负责人转移
export const updateSubjectTransfer = async (data: SubjectTransferVO) => {
return await request.put({ url: `/xxjj/subject-transfer/update`, data })
}
// 删除主体负责人转移
export const deleteSubjectTransfer = async (id: number) => {
return await request.delete({ url: `/xxjj/subject-transfer/delete?id=` + id })
}
// 导出主体负责人转移 Excel
export const exportSubjectTransfer = async (params) => {
return await request.download({ url: `/xxjj/subject-transfer/export-excel`, params })
}

@ -0,0 +1,32 @@
.xy-card-info.is-always-shadow {
box-shadow: 0px 0px 0px rgba(0, 0, 0, 0);
}
.xy-card-info {
border: 0px;
.el-card__header {
padding: 16px 0px;
background-color: inherit;
.xy-card-info-icona {
top: 10px;
width: 5px;
height: 24px;
float: left;
background-color: #005EFE;
}
.xy-card-info-text {
margin-left: 10px;
}
}
.el-card__body {
padding: 15px 0px;
.el-row {
margin: 10px;
}
}
}

@ -1,6 +1,7 @@
@import './var.css'; @import './var.css';
@import 'element-plus/theme-chalk/dark/css-vars.css'; @import 'element-plus/theme-chalk/dark/css-vars.css';
@import './font.scss'; @import './font.scss';
@import './cus.scss';
* { * {
font-family: 'AlibabaPuHuiTi-3-55-Regular'; font-family: 'AlibabaPuHuiTi-3-55-Regular';

@ -204,6 +204,11 @@ export enum DICT_TYPE {
enterpriseNature = 'enterprise_nature', //客户星级 enterpriseNature = 'enterprise_nature', //客户星级
XUELI = 'XUELI', //学历 XUELI = 'XUELI', //学历
ENTERPRISE_OPERATE_TYPE = 'enterprise_operate_type', //客户星级 ENTERPRISE_OPERATE_TYPE = 'enterprise_operate_type', //客户星级
customer_type = 'customer_type', //客户星级
account_type = 'account_type', //客户星级
urgent_level = 'urgent_level', //紧要程度
task_remind = 'task_remind', //紧要程度
remind_way = 'remind_way', //紧要程度
// ============= PRODUCT 模块================= // ============= PRODUCT 模块=================
PRODUCT_STATUS = 'product_status', //商品状态 PRODUCT_STATUS = 'product_status', //商品状态
@ -219,4 +224,6 @@ export enum DICT_TYPE {
MANAGE_INVENTORY = 'manage_inventory', //管理库存 MANAGE_INVENTORY = 'manage_inventory', //管理库存
TRANSPORT_TEMPERATURE = 'transport_temperature', //温层 TRANSPORT_TEMPERATURE = 'transport_temperature', //温层
OUTPUT_TAX_RATE = 'output_tax_rate', //商品进销税率 OUTPUT_TAX_RATE = 'output_tax_rate', //商品进销税率
} }

@ -1,42 +1,137 @@
<template> <template>
<el-card class="box-card"> <div>
<template #header> <el-card class="box-card xy-y1">
<el-button type="" link icon="ep:Back">返回</el-button> <template #header>
</template> <el-button type="" link>返回</el-button>
<template #default> </template>
<el-button type="" link icon="ep:back">返回</el-button> <template #default>
cs <el-row>
</template> <el-col :span="24">
</el-card> <el-row>
<el-col :span="12">
<ContentWrap> <div style="float: left;"><el-image style="width: 100px; height: 100px" fit="fill" /></div>
<el-tabs v-model="activeTabN" class="xy-tabs"> <div style="height: 100px; line-height: 100px;float: left;">江阴华润制钢有限公司一级客户</div>
</el-col>
<el-col :span="12">
<div style="float: right;">
<el-space :size="10">
<el-button type="primary">编辑信息</el-button>
<el-button>更新业务进度</el-button>
<el-button>申请评级</el-button>
<el-button>更新业务进度</el-button>
<el-select placeholder="更多操作" style="width: 100px;">
<el-option label="业务配置" :value="1" />
<el-option label="业务配置" :value="1" />
</el-select>
</el-space>
</div>
</el-col>
</el-row>
</el-col>
</el-row>
<el-row>
<el-col :span="24" style="background-color: #F7F8FA; padding: 24px;">
<el-row>
<el-col :span="6">
<el-row>
<el-col :span="6" class="xy-label">客户编号</el-col>
<el-col :span="18" class="xy-text">C20230822001</el-col>
</el-row>
</el-col>
<el-col :span="6">
<el-row>
<el-col :span="6" class="xy-label">企业性质</el-col>
<el-col :span="18" class="xy-text">外资企业</el-col>
</el-row>
</el-col>
<el-col :span="6">
<el-row>
<el-col :span="6" class="xy-label">行业分类</el-col>
<el-col :span="18" class="xy-text">行业分类</el-col>
</el-row>
</el-col>
<el-col :span="6">
<el-row>
<el-col :span="8">状态</el-col>
<el-col :span="8">业务进度</el-col>
<el-col :span="8">信用等级</el-col>
</el-row>
</el-col>
</el-row>
<el-row>
<el-col :span="6">
<el-row>
<el-col :span="6" class="xy-label">创建时间</el-col>
<el-col :span="18" class="xy-text">2023-08-23 23:26:08</el-col>
</el-row>
</el-col>
<el-col :span="6">
<el-row>
<el-col :span="6" class="xy-label">默认联系人</el-col>
<el-col :span="18" class="xy-text">李总13112345678</el-col>
</el-row>
</el-col>
<el-col :span="6">
<el-row>
<el-col :span="6" class="xy-label">归属人员</el-col>
<el-col :span="18" class="xy-text">张总 (已锁定到期时间10/30)</el-col>
</el-row>
</el-col>
<el-col :span="6">
<el-row>
<el-col :span="8">已启用</el-col>
<el-col :span="8">正在跟进</el-col>
<!-- <el-col :span="8"><el-rate :model-value="2" clearable /></el-col> -->
</el-row>
</el-col>
</el-row>
</el-col>
</el-row>
</template>
</el-card>
<el-tabs v-model="activeTabN">
<el-tab-pane label="基础信息" name="tabN1"> <el-tab-pane label="基础信息" name="tabN1">
<InfoBasic /> <template v-if="activeTabN == 'tabN1'">
<InfoBasic />
</template>
</el-tab-pane> </el-tab-pane>
<el-tab-pane label="资质信息" name="tabN2"> <el-tab-pane label="资质信息" name="tabN2">
<InfoQualification /> <template v-if="activeTabN == 'tabN2'">
<InfoQualification />
</template>
</el-tab-pane> </el-tab-pane>
<el-tab-pane label="财务信息" name="tabN3"> <el-tab-pane label="财务信息" name="tabN3">
<InfoFinancial /> <template v-if="activeTabN == 'tabN3'">
<InfoFinancial />
</template>
</el-tab-pane> </el-tab-pane>
<el-tab-pane label="合同信息" name="tabN4"> <el-tab-pane label="合同信息" name="tabN4">
<InfoContract /> <template v-if="activeTabN == 'tabN4'">
<InfoContract />
</template>
</el-tab-pane> </el-tab-pane>
<el-tab-pane label="销售订单" name="tabN5"> <el-tab-pane label="销售订单" name="tabN5">
<InfoSaleOrder /> <template v-if="activeTabN == 'tabN5'">
<InfoSaleOrder />
</template>
</el-tab-pane> </el-tab-pane>
<el-tab-pane label="结算信息" name="tabN6"> <el-tab-pane label="结算信息" name="tabN6">
<InfoSettlement /> <template v-if="activeTabN == 'tabN6'">
<InfoSettlement />
</template>
</el-tab-pane> </el-tab-pane>
<el-tab-pane label="操作记录" name="tabN7"> <el-tab-pane label="操作记录" name="tabN7">
<InfoOperationRecords /> <template v-if="activeTabN == 'tabN7'">
<InfoOperationRecords />
</template>
</el-tab-pane> </el-tab-pane>
<el-tab-pane label="日志记录" name="tabN8"> <el-tab-pane label="日志记录" name="tabN8">
<InfoLogging /> <template v-if="activeTabN == 'tabN8'">
<InfoLogging />
</template>
</el-tab-pane> </el-tab-pane>
</el-tabs> </el-tabs>
</ContentWrap> </div>
</template> </template>
<script setup lang="ts" name="CustomerDetails"> <script setup lang="ts" name="CustomerDetails">
@ -48,6 +143,7 @@ import InfoSaleOrder from './src/InfoSaleOrder.vue'
import InfoSettlement from './src/InfoSettlement.vue' import InfoSettlement from './src/InfoSettlement.vue'
import InfoOperationRecords from './src/InfoOperationRecords.vue' import InfoOperationRecords from './src/InfoOperationRecords.vue'
import InfoLogging from './src/InfoLogging.vue' import InfoLogging from './src/InfoLogging.vue'
const activeTabN = ref('tabN1') const activeTabN = ref('tabN1')
</script> </script>
@ -57,6 +153,58 @@ const activeTabN = ref('tabN1')
padding-left: 10px; padding-left: 10px;
} }
} }
.xy-card {
.el-card__header {
background-color: #F7F8FA;
}
}
.xy-card-info.is-always-shadow {
box-shadow: 0px 0px 0px rgba(0, 0, 0, 0);
}
.xy-card-info {
border: 0px;
.el-card__header {
padding: 16px 0px;
background-color: inherit;
.xy-card-info-icona {
top: 10px;
width: 5px;
height: 24px;
float: left;
background-color: #005EFE;
}
.xy-card-info-text {
margin-left: 10px;
}
}
.el-card__body {
padding: 15px 0px;
.el-row {
margin: 10px;
}
}
}
</style> </style>
<style lang="scss" scoped></style> <style lang="scss" scoped>
.xy-y1 {
.xy-label {
text-align: right;
color: #86909C;
}
.xy-text {
color: #1D2129;
}
}
</style>

@ -9,23 +9,38 @@
<el-input v-model="queryParams.name" placeholder="请输入客户名称" clearable @keyup.enter="handleQuery" <el-input v-model="queryParams.name" placeholder="请输入客户名称" clearable @keyup.enter="handleQuery"
class="!w-240px" /> class="!w-240px" />
</el-form-item> </el-form-item>
<el-form-item label="客户状态" prop="customerStatus">
<el-select v-model="queryParams.customerStatus" placeholder="请选择">
<el-option v-for="dict in getIntDictOptions(DICT_TYPE.CUSTOMER_STATUS)" :key="dict.value"
:label="dict.label" :value="dict.value" />
</el-select>
</el-form-item>
<el-form-item label="客户分类" prop="calssify"> <el-form-item label="客户分类" prop="calssify">
<el-select v-model="queryParams.calssify" placeholder="请选择"> <el-select v-model="queryParams.calssify" placeholder="请选择">
<el-option v-for="dict in getIntDictOptions(DICT_TYPE.CUSTOMER_CALSSIFY)" :key="dict.value" <el-option v-for="dict in getIntDictOptions(DICT_TYPE.CUSTOMER_CALSSIFY)" :key="dict.value"
:label="dict.label" :value="dict.value" /> :label="dict.label" :value="dict.value" />
</el-select> </el-select>
</el-form-item> </el-form-item>
<el-form-item label="企业性质" prop="enterpriseNature"> <el-form-item label="信用等级" prop="customerStarrating">
<el-select v-model="queryParams.customerStarrating" placeholder="请选择">
<el-option v-for="dict in getIntDictOptions(DICT_TYPE.CUSTOMER_STARRATING)" :key="dict.value"
:label="dict.label" :value="dict.value" />
</el-select>
</el-form-item>
<!-- <el-form-item label="企业性质" prop="enterpriseNature">
<el-select v-model="queryParams.enterpriseNature" placeholder="请选择"> <el-select v-model="queryParams.enterpriseNature" placeholder="请选择">
<el-option v-for="dict in getIntDictOptions(DICT_TYPE.enterpriseNature)" :key="dict.value" <el-option v-for="dict in getIntDictOptions(DICT_TYPE.enterpriseNature)" :key="dict.value"
:label="dict.label" :value="dict.value" /> :label="dict.label" :value="dict.value" />
</el-select> </el-select>
</el-form-item> </el-form-item> -->
<el-form-item label="创建时间" prop="createTime"> <!-- <el-form-item label="创建时间" prop="createTime">
<el-date-picker v-model="queryParams.createTime" value-format="YYYY-MM-DD HH:mm:ss" type="daterange" <el-date-picker v-model="queryParams.createTime" value-format="YYYY-MM-DD HH:mm:ss" type="daterange"
start-placeholder="开始日期" end-placeholder="结束日期" start-placeholder="开始日期" end-placeholder="结束日期"
:default-time="[new Date('1 00:00:00'), new Date('1 23:59:59')]" class="!w-240px" /> :default-time="[new Date('1 00:00:00'), new Date('1 23:59:59')]" class="!w-240px" />
</el-form-item> </el-form-item> -->
<el-form-item> <el-form-item>
<el-button @click="handleQuery"> <el-button @click="handleQuery">
<Icon icon="ep:search" class="mr-5px" /> 搜索 <Icon icon="ep:search" class="mr-5px" /> 搜索
@ -41,12 +56,23 @@
<el-col :span="24"> <el-col :span="24">
<el-form-item> <el-form-item>
<el-button type="primary" plain @click="openForm('create')" v-hasPermi="['xxjj:subject-basic:create']"> <el-button type="primary" plain @click="openForm('create')" v-hasPermi="['xxjj:subject-basic:create']">
<Icon icon="ep:plus" class="mr-5px" /> 新增 <Icon icon="ep:plus" class="mr-5px" /> 新建客户
</el-button>
<el-button type="default" plain @click="openForm2('create')" v-hasPermi="['xxjj:subject-basic:create']">
<Icon icon="ep:plus" class="mr-5px" /> 新建任务
</el-button>
<el-button type="default" plain @click="openForm3('create')" v-hasPermi="['xxjj:subject-basic:create']">
<Icon icon="ep:refresh" class="mr-5px" /> 转移客户
</el-button> </el-button>
<el-button type="success" plain @click="handleExport" :loading="exportLoading" <el-button type="default" plain @click="handleExport" :loading="exportLoading"
v-hasPermi="['xxjj:subject-basic:export']"> v-hasPermi="['xxjj:subject-basic:export']">
<Icon icon="ep:download" class="mr-5px" /> 导出 <Icon icon="ep:download" class="mr-5px" /> 导出
</el-button> </el-button>
<el-button type="default" plain @click="handleExport" :loading="exportLoading"
v-hasPermi="['xxjj:subject-basic:export']">
<Icon icon="ep:upload" class="mr-5px" /> 导入
</el-button>
</el-form-item> </el-form-item>
</el-col> </el-col>
</el-row> </el-row>
@ -56,9 +82,9 @@
<el-row> <el-row>
<el-col :span="24" style="margin: 10px 0px;"> <el-col :span="24" style="margin: 10px 0px;">
<el-table v-loading="loading" :data="list" :border="true" :stripe="true" :show-overflow-tooltip="true" <el-table v-loading="loading" :data="list" :border="true" :stripe="true" :show-overflow-tooltip="true"
class="xy-table"> class="xy-table" @selection-change="handleSelectionChange">
<el-table-column fixed type="selection" width="40px" /> <el-table-column fixed type="selection" width="40px" />
<el-table-column fixed label="客户名称" prop="name" width="250px"> <el-table-column fixed label="客户名称" prop="name" sortable width="250px">
<template #default="scope"> <template #default="scope">
<el-row> <el-row>
<el-col :span="6"> <el-col :span="6">
@ -67,7 +93,8 @@
<el-col :span="18"> <el-col :span="18">
<el-row> <el-row>
<el-col :span="24">{{ scope.row.name }}</el-col> <el-col :span="24">{{ scope.row.name }}</el-col>
<el-col :span="24">{{ scope.row.name }}</el-col> <el-col :span="24"><dict-tag :type="DICT_TYPE.customer_type"
:value="scope.row.reservedFields1" /></el-col>
</el-row> </el-row>
</el-col> </el-col>
</el-row> </el-row>
@ -95,7 +122,7 @@
</el-table-column> </el-table-column>
<el-table-column label="客户星级" prop="customerStarrating" width="150px"> <el-table-column label="客户星级" prop="customerStarrating" width="150px">
<template #default="scope"> <template #default="scope">
<el-rate v-model="scope.row.customerStarrating" /> <el-rate v-model="scope.row.customerStarrating" :disabled="true" />
</template> </template>
</el-table-column> </el-table-column>
<el-table-column label="业务进度" prop="industrySchedule" width="120px"> <el-table-column label="业务进度" prop="industrySchedule" width="120px">
@ -148,7 +175,9 @@
</el-row> </el-row>
</ContentWrap> </ContentWrap>
<SubjectBasicForm ref="formRef" @success="getList" /> <SubjectBasicForm ref="formRef" @success="getList" />
<DrawerFilter :isShow="isShowDrawerFilterA" @do-close="doCloseDrawerFilterA" /> <SubjectFollowManagementForm ref="subjectFollowManagementFormRef" @success="getList" />
<SubjectTransferForm ref="subjectTransferFormRef" @success="getList" />
<DrawerFilter :isShow="isShowDrawerFilterA" @do-close="doCloseDrawerFilterA" @do-search="doDrawerFilterASearch" />
</template> </template>
<script setup lang="ts" name="SubjectBasic"> <script setup lang="ts" name="SubjectBasic">
@ -160,6 +189,8 @@ import { dateFormatter } from '@/utils/formatTime'
import download from '@/utils/download' import download from '@/utils/download'
import * as SubjectBasicApi from '@/api/xxjj/subjectBasic' import * as SubjectBasicApi from '@/api/xxjj/subjectBasic'
import SubjectBasicForm from './SubjectBasicForm.vue' import SubjectBasicForm from './SubjectBasicForm.vue'
import SubjectFollowManagementForm from './src/SubjectFollowManagementForm.vue'
import SubjectTransferForm from './src/SubjectTransferForm.vue'
import DrawerFilter from './src/DrawerFilter.vue' import DrawerFilter from './src/DrawerFilter.vue'
const message = useMessage() // const message = useMessage() //
const { t } = useI18n() // const { t } = useI18n() //
@ -167,7 +198,7 @@ const { t } = useI18n() // 国际化
const loading = ref(true) // const loading = ref(true) //
const total = ref(0) // const total = ref(0) //
const list = ref([]) // const list = ref([]) //
const queryParams = reactive({ let queryParams: any = reactive({
pageNo: 1, pageNo: 1,
pageSize: 10, pageSize: 10,
businessType: null, businessType: null,
@ -250,10 +281,14 @@ const queryParams = reactive({
}) })
const queryFormRef = ref() // const queryFormRef = ref() //
const exportLoading = ref(false) // const exportLoading = ref(false) //
const multipleSelection = ref()
const handleSelectionChange = (val) => {
multipleSelection.value = val
}
/** 查询列表 */ /** 查询列表 */
const getList = async () => { const getList = async () => {
loading.value = true loading.value = true
queryParams.businessType = '1';
try { try {
const data = await SubjectBasicApi.getSubjectBasicPage(queryParams) const data = await SubjectBasicApi.getSubjectBasicPage(queryParams)
list.value = data.list list.value = data.list
@ -277,8 +312,32 @@ const resetQuery = () => {
/** 添加/修改操作 */ /** 添加/修改操作 */
const formRef = ref() const formRef = ref()
const router = useRouter()
const openForm = (type: string, id?: number) => { const openForm = (type: string, id?: number) => {
formRef.value.open(type, id) router.push({ path: '/customer/customer-add' })
//formRef.value.open(type, id)
}
/** 新建任务操作 */
const subjectFollowManagementFormRef = ref()
const openForm2 = (type: string, id?: number) => {
subjectFollowManagementFormRef.value.open(type, id)
}
const subjectTransferFormRef = ref()
const openForm3 = (type: string, id?: number) => {
if (multipleSelection.value == undefined || multipleSelection.value.length <= 0) {
message.error(t('请选择需要转移的客户'))
return
}
let customerIds: any = ref([])
let belongingPeoples: any = ref([])
multipleSelection.value.forEach(element => {
customerIds.value.push(element.id);
belongingPeoples.value.push(element.belongingPeople);
});
customerIds = customerIds.value.join(",");
belongingPeoples = belongingPeoples.value.join(",");
subjectTransferFormRef.value.open(type, id, customerIds, belongingPeoples)
} }
/** 删除按钮操作 */ /** 删除按钮操作 */
@ -317,7 +376,10 @@ const doShowDrawerFilterA = (isshow: boolean) => {
const doCloseDrawerFilterA = (isshow: boolean) => { const doCloseDrawerFilterA = (isshow: boolean) => {
isShowDrawerFilterA.value = isshow; isShowDrawerFilterA.value = isshow;
} }
const doDrawerFilterASearch = (params: Object) => {
queryParams = params;
getList()
}
/** 初始化 **/ /** 初始化 **/
onMounted(() => { onMounted(() => {
getList() getList()

@ -20,6 +20,16 @@
style="width: 100%;" /> style="width: 100%;" />
</el-form-item> </el-form-item>
</el-col> </el-col>
<el-col :span="12">
<el-form-item label="客户状态" prop="customerStatus">
<el-select v-model="queryParams.customerStatus" placeholder="请选择" style="width: 100%;">
<el-option v-for="dict in getIntDictOptions(DICT_TYPE.CUSTOMER_STATUS)" :key="dict.value"
:label="dict.label" :value="dict.value" />
</el-select>
</el-form-item>
</el-col>
</el-row>
<el-row :gutter="20">
<el-col :span="12"> <el-col :span="12">
<el-form-item label="客户分类" prop="calssify"> <el-form-item label="客户分类" prop="calssify">
<el-select v-model="queryParams.calssify" placeholder="请选择" style="width: 100%;"> <el-select v-model="queryParams.calssify" placeholder="请选择" style="width: 100%;">
@ -28,7 +38,55 @@
</el-select> </el-select>
</el-form-item> </el-form-item>
</el-col> </el-col>
<el-col :span="12">
<el-form-item label="客户类型" prop="reservedFields1">
<el-select v-model="queryParams.reservedFields1" placeholder="请选择" style="width: 100%;">
<el-option v-for="dict in getIntDictOptions(DICT_TYPE.customer_type)" :key="dict.value"
:label="dict.label" :value="dict.value" />
</el-select>
</el-form-item>
</el-col>
</el-row>
<el-row :gutter="20">
<el-col :span="12">
<el-form-item label="业务进度" prop="industrySchedule">
<el-select v-model="queryParams.industrySchedule" placeholder="请选择" style="width: 100%;">
<el-option v-for="dict in getIntDictOptions(DICT_TYPE.industrySchedule)" :key="dict.value"
:label="dict.label" :value="dict.value" />
</el-select>
</el-form-item>
</el-col>
<el-col :span="12">
<el-form-item label="行业分类" prop="industryClassify">
<el-select v-model="queryParams.industryClassify" placeholder="请选择" style="width: 100%;">
<el-option v-for="dict in getIntDictOptions(DICT_TYPE.industryClassify)" :key="dict.value"
:label="dict.label" :value="dict.value" />
</el-select>
</el-form-item>
</el-col>
</el-row> </el-row>
<el-row :gutter="20">
<el-col :span="12">
<el-form-item label="客户来源" prop="customerSource">
<el-select v-model="queryParams.customerSource" placeholder="请选择" style="width: 100%;">
<el-option v-for="dict in getIntDictOptions(DICT_TYPE.customerSource)" :key="dict.value"
:label="dict.label" :value="dict.value" />
</el-select>
</el-form-item>
</el-col>
<el-col :span="12">
<el-form-item label="账户类型" prop="reservedFields2">
<el-select v-model="queryParams.reservedFields2" placeholder="请选择" style="width: 100%;">
<el-option v-for="dict in getIntDictOptions(DICT_TYPE.account_type)" :key="dict.value"
:label="dict.label" :value="dict.value" />
</el-select>
</el-form-item>
</el-col>
</el-row>
<el-row :gutter="20"> <el-row :gutter="20">
<el-col :span="12"> <el-col :span="12">
<el-form-item label="企业性质" prop="enterpriseNature"> <el-form-item label="企业性质" prop="enterpriseNature">
@ -51,7 +109,7 @@
</template> </template>
<template #footer> <template #footer>
<div class="xy-footer"> <div class="xy-footer">
<el-button type="primary" :icon="Search">查询</el-button> <el-button type="primary" :icon="Search" @click="handleQuery"></el-button>
<el-button :icon="RefreshLeft">重置</el-button> <el-button :icon="RefreshLeft">重置</el-button>
</div> </div>
</template> </template>
@ -72,7 +130,10 @@ const emit = defineEmits(['doClose'])
const doClose = () => { const doClose = () => {
emit('doClose', false) emit('doClose', false)
} }
/** 搜索按钮操作 */
const handleQuery = () => {
emit('doSearch', queryParams)
}
const queryParams = reactive({ const queryParams = reactive({
pageNo: 1, pageNo: 1,
pageSize: 10, pageSize: 10,

@ -19,9 +19,9 @@
操作记录 操作记录
</template> </template>
<template #default> <template #default>
<el-card class="xy-card-info-a"> <el-card class="xy-card-info">
<template #header> <template #header>
基本信息 <div class="xy-card-info-icona"></div><span class="xy-card-info-text">基本信息</span>
</template> </template>
<template #default> <template #default>
<el-row> <el-row>
@ -86,9 +86,9 @@
</el-row> </el-row>
</template> </template>
</el-card> </el-card>
<el-card class="xy-card-info-a"> <el-card class="xy-card-info">
<template #header> <template #header>
详细信息 <div class="xy-card-info-icona"></div><span class="xy-card-info-text">详细信息</span>
</template> </template>
<template #default> <template #default>
<el-row> <el-row>
@ -143,9 +143,9 @@
</el-row> </el-row>
</template> </template>
</el-card> </el-card>
<el-card class="xy-card-info-a"> <el-card class="xy-card-info">
<template #header> <template #header>
合作信息 <div class="xy-card-info-icona"></div><span class="xy-card-info-text">合作信息</span>
</template> </template>
<template #default> <template #default>
<el-row> <el-row>
@ -178,9 +178,9 @@
</el-row> </el-row>
</template> </template>
</el-card> </el-card>
<el-card class="xy-card-info-a"> <el-card class="xy-card-info">
<template #header> <template #header>
运营信息 <div class="xy-card-info-icona"></div><span class="xy-card-info-text">运营信息</span>
</template> </template>
<template #default> <template #default>
<el-row> <el-row>
@ -227,9 +227,9 @@
</el-row> </el-row>
</template> </template>
</el-card> </el-card>
<el-card class="xy-card-info-a"> <el-card class="xy-card-info">
<template #header> <template #header>
联系人信息 <div class="xy-card-info-icona"></div><span class="xy-card-info-text">联系人信息</span>
</template> </template>
<template #default> <template #default>
<el-row> <el-row>
@ -247,9 +247,9 @@
</el-row> </el-row>
</template> </template>
</el-card> </el-card>
<el-card class="xy-card-info-a"> <el-card class="xy-card-info">
<template #header> <template #header>
扩展信息 <div class="xy-card-info-icona"></div><span class="xy-card-info-text">扩展信息</span>
</template> </template>
<template #default> <template #default>
<el-row> <el-row>
@ -312,36 +312,54 @@ const tbDataA = [
</script> </script>
<style lang="scss"> <style lang="scss">
.xy-card-b { // .xy-card-b {
margin: 16px 24px; // margin: 16px 24px;
.el-card__header { // .el-card__header {
background-color: #F7F8FA; // background-color: #F7F8FA;
height: 48px; // height: 48px;
padding: 12px 16px; // padding: 12px 16px;
color: #666666; // color: #666666;
} // }
} // }
.xy-card-info-a { // .xy-card {
margin-top: 16px; // .el-card__header {
border: 0px; // background-color: #F7F8FA;
// }
// }
.el-card__header { // .xy-card-info.is-always-shadow {
background-color: inherit; // box-shadow: 0px 0px 0px rgba(0, 0, 0, 0);
padding: 0px; // }
height: 28px;
line-height: 28px;
}
.xy-label { // .xy-card-info {
color: #86909C; // border: 0px;
text-align: right;
}
.xy-text { // .el-card__header {
color: #1D2129; // padding: 16px 0px;
} // background-color: inherit;
}
// .xy-card-info-icona {
// top: 10px;
// width: 5px;
// height: 24px;
// float: left;
// background-color: #005EFE;
// }
// .xy-card-info-text {
// margin-left: 10px;
// }
// }
// .el-card__body {
// padding: 15px 0px;
// .el-row {
// margin: 10px;
// }
// }
// }
</style> </style>

@ -4,9 +4,9 @@
财务信息 财务信息
</template> </template>
<template #default> <template #default>
<el-card class="xy-card-info-a"> <el-card class="xy-card-info">
<template #header> <template #header>
财务信息 <div class="xy-card-info-icona"></div><span class="xy-card-info-text">财务信息</span>
</template> </template>
<template #default> <template #default>
<el-row> <el-row>
@ -55,9 +55,9 @@
</el-row> </el-row>
</template> </template>
</el-card> </el-card>
<el-card class="xy-card-info-a"> <el-card class="xy-card-info">
<template #header> <template #header>
结算信息 <div class="xy-card-info-icona"></div><span class="xy-card-info-text">结算信息</span>
</template> </template>
<template #default> <template #default>
<el-row> <el-row>
@ -80,9 +80,9 @@
</el-row> </el-row>
</template> </template>
</el-card> </el-card>
<el-card class="xy-card-info-a"> <el-card class="xy-card-info">
<template #header> <template #header>
分控信息 <div class="xy-card-info-icona"></div><span class="xy-card-info-text">分控信息</span>
</template> </template>
<template #default> <template #default>
<el-row> <el-row>

@ -4,9 +4,9 @@
资质信息 资质信息
</template> </template>
<template #default> <template #default>
<el-card class="xy-card-info-a"> <el-card class="xy-card-info">
<template #header> <template #header>
主体信息 <div class="xy-card-info-icona"></div><span class="xy-card-info-text">主体信息</span>
</template> </template>
<template #default> <template #default>
<el-row> <el-row>
@ -75,9 +75,9 @@
</el-row> </el-row>
</template> </template>
</el-card> </el-card>
<el-card class="xy-card-info-a"> <el-card class="xy-card-info">
<template #header> <template #header>
代表人信息 <div class="xy-card-info-icona"></div><span class="xy-card-info-text">代表人信息</span>
</template> </template>
<template #default> <template #default>
<el-row> <el-row>
@ -95,9 +95,9 @@
</el-row> </el-row>
</template> </template>
</el-card> </el-card>
<el-card class="xy-card-info-a"> <el-card class="xy-card-info">
<template #header> <template #header>
资质信息 <div class="xy-card-info-icona"></div><span class="xy-card-info-text">资质信息</span>
</template> </template>
<template #default> <template #default>
<el-row> <el-row>
@ -175,5 +175,6 @@ const tbDataA = [
] ]
</script> </script>
<style lang="scss"></style> <style lang="scss">
</style>

@ -0,0 +1,184 @@
<template>
<Dialog :title="dialogTitle" v-model="dialogVisible">
<el-form
ref="formRef"
:model="formData"
:rules="formRules"
label-width="100px"
v-loading="formLoading"
>
<!-- <el-form-item label="业务id" prop="businessId">
<el-input v-model="formData.businessId" placeholder="请输入业务id" />
</el-form-item> -->
<!-- <el-form-item label="代表人类型(0客户 1供应商 2服务商)" prop="businessType">
<el-select v-model="formData.businessType" placeholder="请选择代表人类型(0客户 1供应商 2服务商)">
<el-option label="请选择字典生成" value="" />
</el-select>
</el-form-item> -->
<el-form-item label="任务标题" prop="title">
<el-input v-model="formData.title" placeholder="请输入任务标题" />
</el-form-item>
<!-- <el-form-item label="身份证号" prop="idCard">
<el-input v-model="formData.idCard" placeholder="请输入身份证号" />
</el-form-item> -->
<el-form-item label="开始时间" prop="startTime">
<el-date-picker
v-model="formData.startTime"
type="datetime"
value-format="x"
format="YYYY/MM/DD HH:mm"
placeholder="选择开始时间"
/>
</el-form-item>
<el-form-item label="结束时间" prop="endTime">
<el-date-picker
v-model="formData.endTime"
type="datetime"
value-format="x"
format="YYYY/MM/DD HH:mm"
placeholder="选择结束时间"
/>
</el-form-item>
<el-form-item label="关联客户" prop="businessId">
<el-input v-model="formData.businessId" placeholder="请输入客户" />
</el-form-item>
<el-form-item label="负责人员" prop="responsible">
<el-input v-model="formData.responsible" placeholder="请输入负责人员" />
</el-form-item>
<el-form-item label="参与人员" prop="partake">
<el-input v-model="formData.partake" placeholder="请输入参与人员" />
</el-form-item>
<el-form-item label="标记颜色" prop="mark">
<el-input v-model="formData.mark" placeholder="请输入标记颜色" />
</el-form-item>
<el-form-item label="紧要程度" prop="urgency">
<el-radio-group v-model="formData.urgency" size="large">
<el-radio-button label="重要" />
<el-radio-button label="紧急" />
<el-radio-button label="普通" />
<el-radio-button label="较低" />
</el-radio-group>
</el-form-item>
<el-form-item label="任务提醒" prop="remindType">
<el-select v-model="formData.remindType" placeholder="请选择">
<el-option v-for="dict in getIntDictOptions(DICT_TYPE.task_remind)" :key="dict.value"
:label="dict.label" :value="dict.value" />
</el-select>
</el-form-item>
<el-form-item label="提醒方式" prop="remindMode">
<el-checkbox-group v-model="formData.remindModeArr">
<el-checkbox v-for="dict in getIntDictOptions(DICT_TYPE.remind_way)" :key="dict.value"
:label="dict.label" :value="dict.value" />
</el-checkbox-group>
</el-form-item>
<el-form-item label="任务描述" prop="description">
<el-input v-model="formData.description" type="textarea" placeholder="请输入任务描述" />
</el-form-item>
<el-form-item label="附件">
<UploadFile v-model="formData.annex" />
</el-form-item>
</el-form>
<template #footer>
<el-button @click="submitForm" type="primary" :disabled="formLoading"> </el-button>
<el-button @click="dialogVisible = false"> </el-button>
</template>
</Dialog>
</template>
<script setup lang="ts">
import * as SubjectFollowManagementApi from '@/api/xxjj/subjectFollowManagement'
import { DICT_TYPE, getIntDictOptions } from '@/utils/dict'
const { t } = useI18n() //
const message = useMessage() //
const dialogVisible = ref(false) //
const dialogTitle = ref('') //
const formLoading = ref(false) // 12
const formType = ref('') // create - update -
const formData = ref({
id: undefined,
businessId: undefined,
businessType: '1',
title: undefined,
idCard: undefined,
startTime: undefined,
endTime: undefined,
responsible: undefined,
partake: undefined,
mark: undefined,
urgency: undefined,
remindType: undefined,
description: undefined,
annex: undefined
})
const formRules = reactive({
businessId: [{ required: true, message: '业务id不能为空', trigger: 'blur' }]
})
const formRef = ref() // Ref
/** 打开弹窗 */
const open = async (type: string, id?: number) => {
dialogVisible.value = true
dialogTitle.value = t('action.' + type)
formType.value = type
resetForm()
//
if (id) {
formLoading.value = true
try {
formData.value = await SubjectFollowManagementApi.getSubjectFollowManagement(id)
} finally {
formLoading.value = false
}
}
}
defineExpose({ open }) // open
/** 提交表单 */
const emit = defineEmits(['success']) // success
const submitForm = async () => {
//
if (!formRef) return
const valid = await formRef.value.validate()
if (!valid) return
//
formLoading.value = true
try {
const data = formData.value as unknown as SubjectFollowManagementApi.SubjectFollowManagementVO
data.businessType = '1';
debugger
if (formType.value === 'create') {
await SubjectFollowManagementApi.createSubjectFollowManagement(data)
message.success(t('common.createSuccess'))
} else {
await SubjectFollowManagementApi.updateSubjectFollowManagement(data)
message.success(t('common.updateSuccess'))
}
dialogVisible.value = false
//
emit('success')
} finally {
formLoading.value = false
}
}
/** 重置表单 */
const resetForm = () => {
formData.value = {
id: undefined,
businessId: undefined,
businessType: undefined,
title: undefined,
idCard: undefined,
startTime: undefined,
endTime: undefined,
responsible: undefined,
partake: undefined,
mark: undefined,
urgency: undefined,
remindType: undefined,
description: undefined,
annex: undefined
}
formRef.value?.resetFields()
}
</script>

@ -0,0 +1,138 @@
<template>
<Dialog :title="dialogTitle" v-model="dialogVisible">
<el-form
ref="formRef"
:model="formData"
:rules="formRules"
label-width="100px"
v-loading="formLoading"
>
<!-- <el-form-item label="业务id" prop="businessId">
<el-input v-model="formData.businessId" placeholder="请输入业务id" />
</el-form-item>
<el-form-item label="业务类型(0客户 1供应商 2服务商)" prop="businessType">
<el-select v-model="formData.businessType" placeholder="请选择业务类型(0客户 1供应商 2服务商)">
<el-option label="请选择字典生成" value="" />
</el-select>
</el-form-item>
<el-form-item label="转移前用户id" prop="userId1">
<el-input v-model="formData.userId1" placeholder="请输入转移前用户id" />
</el-form-item> -->
<el-form-item label="接收人员" prop="userId2">
<el-input v-model="formData.userId2" placeholder="请输入接收人员" />
</el-form-item>
<el-form-item label="转移数据" prop="transferType">
<el-checkbox-group v-model="formData.transferTypeArr">
<el-checkbox label="商机" />
<el-checkbox label="订单" />
<el-checkbox label="财务" />
<el-checkbox label="费用" />
<el-checkbox label="发票" />
</el-checkbox-group>
</el-form-item>
<el-form-item label="备注信息" prop="remark">
<el-input v-model="formData.remark" type="textarea" placeholder="请输入备注" />
</el-form-item>
</el-form>
<template #footer>
<el-button @click="submitForm" type="primary" :disabled="formLoading"> </el-button>
<el-button @click="dialogVisible = false"> </el-button>
</template>
</Dialog>
</template>
<script setup lang="ts">
import * as SubjectTransferApi from '@/api/xxjj/subjectTransfer'
const { t } = useI18n() //
const message = useMessage() //
const dialogVisible = ref(false) //
const dialogTitle = ref('') //
const formLoading = ref(false) // 12
const formType = ref('') // create - update -
const businessIds = ref('') // create - update -
const userId1s = ref('') // create - update -
const formData = ref({
id: undefined,
businessId: undefined,
businessIds: undefined,
businessType: '1',
userId1: undefined,
userId1s: undefined,
userId2: undefined,
transferType: undefined,
remark: undefined
})
const formRules = reactive({
businessId: [{ required: true, message: '业务id不能为空', trigger: 'blur' }],
userId1: [{ required: true, message: '转移前用户id不能为空', trigger: 'blur' }],
userId2: [{ required: true, message: '转移后用户id不能为空', trigger: 'blur' }]
})
const formRef = ref() // Ref
/** 打开弹窗 */
const open = async (type: string, id?: number, customerIds: string, belongingPeoples: string) => {
businessIds.value = customerIds
userId1s.value = belongingPeoples
dialogVisible.value = true
dialogTitle.value = t('action.' + type)
formType.value = type
resetForm()
//
if (id) {
formLoading.value = true
try {
formData.value = await SubjectTransferApi.getSubjectTransfer(id)
} finally {
formLoading.value = false
}
}
}
defineExpose({ open }) // open
/** 提交表单 */
const emit = defineEmits(['success']) // success
const submitForm = async () => {
//
if (!formRef) return
const valid = await formRef.value.validate()
if (!valid) return
//
formLoading.value = true
try {
const data = formData.value as unknown as SubjectTransferApi.SubjectTransferVO
data.businessType = '1';
data.businessIds = businessIds.value;
data.userId1s = userId1s.value;
debugger
if (formType.value === 'create') {
await SubjectTransferApi.createSubjectTransfer(data)
message.success(t('common.createSuccess'))
} else {
await SubjectTransferApi.updateSubjectTransfer(data)
message.success(t('common.updateSuccess'))
}
dialogVisible.value = false
//
emit('success')
} finally {
formLoading.value = false
}
}
/** 重置表单 */
const resetForm = () => {
formData.value = {
id: undefined,
businessId: undefined,
businessIds: undefined,
businessType: undefined,
userId1s: undefined,
userId1: undefined,
userId2: undefined,
transferType: undefined,
remark: undefined
}
formRef.value?.resetFields()
}
</script>

@ -0,0 +1,184 @@
<template>
<Dialog :title="dialogTitle" v-model="dialogVisible">
<el-form
ref="formRef"
:model="formData"
:rules="formRules"
label-width="100px"
v-loading="formLoading"
>
<!-- <el-form-item label="业务id" prop="businessId">
<el-input v-model="formData.businessId" placeholder="请输入业务id" />
</el-form-item> -->
<!-- <el-form-item label="代表人类型(0客户 1供应商 2服务商)" prop="businessType">
<el-select v-model="formData.businessType" placeholder="请选择代表人类型(0客户 1供应商 2服务商)">
<el-option label="请选择字典生成" value="" />
</el-select>
</el-form-item> -->
<el-form-item label="任务标题" prop="title">
<el-input v-model="formData.title" placeholder="请输入任务标题" />
</el-form-item>
<!-- <el-form-item label="身份证号" prop="idCard">
<el-input v-model="formData.idCard" placeholder="请输入身份证号" />
</el-form-item> -->
<el-form-item label="开始时间" prop="startTime">
<el-date-picker
v-model="formData.startTime"
type="datetime"
value-format="x"
format="YYYY/MM/DD HH:mm"
placeholder="选择开始时间"
/>
</el-form-item>
<el-form-item label="结束时间" prop="endTime">
<el-date-picker
v-model="formData.endTime"
type="datetime"
value-format="x"
format="YYYY/MM/DD HH:mm"
placeholder="选择结束时间"
/>
</el-form-item>
<el-form-item label="关联客户" prop="businessId">
<el-input v-model="formData.businessId" placeholder="请输入客户" />
</el-form-item>
<el-form-item label="负责人员" prop="responsible">
<el-input v-model="formData.responsible" placeholder="请输入负责人员" />
</el-form-item>
<el-form-item label="参与人员" prop="partake">
<el-input v-model="formData.partake" placeholder="请输入参与人员" />
</el-form-item>
<el-form-item label="标记颜色" prop="mark">
<el-input v-model="formData.mark" placeholder="请输入标记颜色" />
</el-form-item>
<el-form-item label="紧要程度" prop="urgency">
<el-radio-group v-model="formData.urgency" size="large">
<el-radio-button label="重要" />
<el-radio-button label="紧急" />
<el-radio-button label="普通" />
<el-radio-button label="较低" />
</el-radio-group>
</el-form-item>
<el-form-item label="任务提醒" prop="remindType">
<el-select v-model="formData.remindType" placeholder="请选择">
<el-option v-for="dict in getIntDictOptions(DICT_TYPE.task_remind)" :key="dict.value"
:label="dict.label" :value="dict.value" />
</el-select>
</el-form-item>
<el-form-item label="提醒方式" prop="remindMode">
<el-checkbox-group v-model="formData.remindModeArr">
<el-checkbox v-for="dict in getIntDictOptions(DICT_TYPE.remind_way)" :key="dict.value"
:label="dict.label" :value="dict.value" />
</el-checkbox-group>
</el-form-item>
<el-form-item label="任务描述" prop="description">
<el-input v-model="formData.description" type="textarea" placeholder="请输入任务描述" />
</el-form-item>
<el-form-item label="附件">
<UploadFile v-model="formData.annex" />
</el-form-item>
</el-form>
<template #footer>
<el-button @click="submitForm" type="primary" :disabled="formLoading"> </el-button>
<el-button @click="dialogVisible = false"> </el-button>
</template>
</Dialog>
</template>
<script setup lang="ts">
import * as SubjectFollowManagementApi from '@/api/xxjj/subjectFollowManagement'
import { DICT_TYPE, getIntDictOptions } from '@/utils/dict'
const { t } = useI18n() //
const message = useMessage() //
const dialogVisible = ref(false) //
const dialogTitle = ref('') //
const formLoading = ref(false) // 12
const formType = ref('') // create - update -
const formData = ref({
id: undefined,
businessId: undefined,
businessType: '1',
title: undefined,
idCard: undefined,
startTime: undefined,
endTime: undefined,
responsible: undefined,
partake: undefined,
mark: undefined,
urgency: undefined,
remindType: undefined,
description: undefined,
annex: undefined
})
const formRules = reactive({
businessId: [{ required: true, message: '业务id不能为空', trigger: 'blur' }]
})
const formRef = ref() // Ref
/** 打开弹窗 */
const open = async (type: string, id?: number) => {
dialogVisible.value = true
dialogTitle.value = t('action.' + type)
formType.value = type
resetForm()
//
if (id) {
formLoading.value = true
try {
formData.value = await SubjectFollowManagementApi.getSubjectFollowManagement(id)
} finally {
formLoading.value = false
}
}
}
defineExpose({ open }) // open
/** 提交表单 */
const emit = defineEmits(['success']) // success
const submitForm = async () => {
//
if (!formRef) return
const valid = await formRef.value.validate()
if (!valid) return
//
formLoading.value = true
try {
const data = formData.value as unknown as SubjectFollowManagementApi.SubjectFollowManagementVO
data.businessType = '1';
debugger
if (formType.value === 'create') {
await SubjectFollowManagementApi.createSubjectFollowManagement(data)
message.success(t('common.createSuccess'))
} else {
await SubjectFollowManagementApi.updateSubjectFollowManagement(data)
message.success(t('common.updateSuccess'))
}
dialogVisible.value = false
//
emit('success')
} finally {
formLoading.value = false
}
}
/** 重置表单 */
const resetForm = () => {
formData.value = {
id: undefined,
businessId: undefined,
businessType: undefined,
title: undefined,
idCard: undefined,
startTime: undefined,
endTime: undefined,
responsible: undefined,
partake: undefined,
mark: undefined,
urgency: undefined,
remindType: undefined,
description: undefined,
annex: undefined
}
formRef.value?.resetFields()
}
</script>

@ -0,0 +1,143 @@
<template>
<Dialog :title="dialogTitle" v-model="dialogVisible">
<el-form
ref="formRef"
:model="formData"
:rules="formRules"
label-width="100px"
v-loading="formLoading"
>
<el-form-item label="报告类型" prop="reportType">
<el-radio-group v-model="formData.reportType" size="large">
<el-radio-button label="跟进报告" />
<el-radio-button label="其他报告" />
</el-radio-group>
</el-form-item>
<el-form-item label="报告日期" prop="reporTime">
<el-date-picker
v-model="formData.reporTime"
type="date"
value-format="x"
format="YYYY/MM/DD"
placeholder="选择报告日期"
/>
</el-form-item>
<el-form-item label="跟进日期" prop="followTime">
<el-date-picker
v-model="formData.followTime"
type="date"
value-format="x"
format="YYYY/MM/DD"
placeholder="选择跟进日期"
/>
</el-form-item>
<el-form-item label="任务编号" prop="businessId">
<el-input v-model="formData.businessId" placeholder="请输入业务id" :disabled="true"/>
</el-form-item>
<el-form-item label="报告内容">
<Editor v-model="formData.description" height="150px" />
</el-form-item>
<el-form-item label="附件">
<UploadFile v-model="formData.annex" />
</el-form-item>
<el-form-item label="批阅人员" prop="readOverUser">
<el-input v-model="formData.readOverUser" placeholder="请输入批阅人员" />
</el-form-item>
<el-form-item label="抄送人员" prop="makeCopyUser">
<el-input v-model="formData.makeCopyUser" placeholder="请输入抄送人员" />
</el-form-item>
</el-form>
<template #footer>
<el-button @click="submitForm" type="primary" :disabled="formLoading"> </el-button>
<el-button @click="dialogVisible = false"> </el-button>
</template>
</Dialog>
</template>
<script setup lang="ts">
import * as SubjectFollowReportApi from '@/api/xxjj/subjectFollowReport'
const { t } = useI18n() //
const message = useMessage() //
const dialogVisible = ref(false) //
const dialogTitle = ref('') //
const formLoading = ref(false) // 12
const formType = ref('') // create - update -
const formData:any = ref({
id: undefined,
reportType: undefined,
reporTime: undefined,
followTime: undefined,
businessId: undefined,
annex: undefined,
description: undefined,
readOverUser: undefined,
makeCopyUser: undefined
})
const formRules = reactive({
businessId: [{ required: true, message: '业务id不能为空', trigger: 'blur' }]
})
const formRef = ref() // Ref
/** 打开弹窗 */
const open = async (type: string, id?: number) => {
dialogVisible.value = true
dialogTitle.value = t('action.' + type)
formType.value = 'create'
resetForm()
//
if (id) {
formLoading.value = true
try {
//formData.value = await SubjectFollowReportApi.getSubjectFollowReport(id)
formData.value.businessId = id
} finally {
formLoading.value = false
}
}
}
defineExpose({ open }) // open
/** 提交表单 */
const emit = defineEmits(['success']) // success
const submitForm = async () => {
//
if (!formRef) return
const valid = await formRef.value.validate()
if (!valid) return
//
formLoading.value = true
try {
const data = formData.value as unknown as SubjectFollowReportApi.SubjectFollowReportVO
if (formType.value === 'create') {
await SubjectFollowReportApi.createSubjectFollowReport(data)
message.success(t('common.createSuccess'))
} else {
await SubjectFollowReportApi.updateSubjectFollowReport(data)
message.success(t('common.updateSuccess'))
}
dialogVisible.value = false
//
emit('success')
} finally {
formLoading.value = false
}
}
/** 重置表单 */
const resetForm = () => {
formData.value = {
id: undefined,
reportType: undefined,
reporTime: undefined,
followTime: undefined,
businessId: undefined,
annex: undefined,
description: undefined,
readOverUser: undefined,
makeCopyUser: undefined
}
formRef.value?.resetFields()
}
</script>

@ -0,0 +1,386 @@
<template>
<ContentWrap title="客户跟进">
<el-row>
<el-col :span="24">
<el-form class="-mb-15px" :model="queryParams" ref="queryFormRef" :inline="true" label-width="68px">
<el-row>
<el-col :span="24">
<el-form-item label="任务标题" prop="name">
<el-input v-model="queryParams.title" placeholder="请输入客户名称" clearable @keyup.enter="handleQuery"
class="!w-240px" />
</el-form-item>
<el-form-item label="客户名称" prop="name">
<el-input v-model="queryParams.name" placeholder="请输入客户名称" clearable @keyup.enter="handleQuery"
class="!w-240px" />
</el-form-item>
<el-form-item label="客户分类" prop="calssify">
<el-select v-model="queryParams.calssify" placeholder="请选择">
<el-option v-for="dict in getIntDictOptions(DICT_TYPE.CUSTOMER_CALSSIFY)" :key="dict.value"
:label="dict.label" :value="dict.value" />
</el-select>
</el-form-item>
<el-form-item label="信用等级" prop="customerStarrating">
<el-select v-model="queryParams.customerStarrating" placeholder="请选择">
<el-option v-for="dict in getIntDictOptions(DICT_TYPE.CUSTOMER_STARRATING)" :key="dict.value"
:label="dict.label" :value="dict.value" />
</el-select>
</el-form-item>
<!-- <el-form-item label="企业性质" prop="enterpriseNature">
<el-select v-model="queryParams.enterpriseNature" placeholder="请选择">
<el-option v-for="dict in getIntDictOptions(DICT_TYPE.enterpriseNature)" :key="dict.value"
:label="dict.label" :value="dict.value" />
</el-select>
</el-form-item> -->
<!-- <el-form-item label="创建时间" prop="createTime">
<el-date-picker v-model="queryParams.createTime" value-format="YYYY-MM-DD HH:mm:ss" type="daterange"
start-placeholder="开始日期" end-placeholder="结束日期"
:default-time="[new Date('1 00:00:00'), new Date('1 23:59:59')]" class="!w-240px" />
</el-form-item> -->
<el-form-item>
<el-button @click="handleQuery">
<Icon icon="ep:search" class="mr-5px" /> 搜索
</el-button>
<el-button @click="resetQuery">
<Icon icon="ep:refresh" class="mr-5px" /> 重置
</el-button>
<el-button type="primary" link :icon="Filter" @click="doShowDrawerFilterA(true)"></el-button>
</el-form-item>
</el-col>
</el-row>
<el-row>
<el-col :span="24">
<el-form-item>
<el-button type="primary" plain @click="openForm('create')" v-hasPermi="['xxjj:subject-basic:create']">
<Icon icon="ep:plus" class="mr-5px" /> 新建任务
</el-button>
<!-- <el-button type="default" plain @click="openForm('create')" v-hasPermi="['xxjj:subject-basic:create']">
<Icon icon="ep:plus" class="mr-5px" /> 新建任务
</el-button>
<el-button type="default" plain @click="openForm('create')" v-hasPermi="['xxjj:subject-basic:create']">
<Icon icon="ep:refresh" class="mr-5px" /> 转移客户
</el-button> -->
<el-button type="default" plain @click="handleExport" :loading="exportLoading"
v-hasPermi="['xxjj:subject-basic:export']">
<Icon icon="ep:download" class="mr-5px" /> 导出
</el-button>
<el-button type="default" plain @click="handleExport" :loading="exportLoading"
v-hasPermi="['xxjj:subject-basic:export']">
<Icon icon="ep:upload" class="mr-5px" /> 导入
</el-button>
</el-form-item>
</el-col>
</el-row>
</el-form>
</el-col>
</el-row>
<el-row>
<el-col :span="24" style="margin: 10px 0px;">
<el-table v-loading="loading" :data="list" :border="true" :stripe="true" :show-overflow-tooltip="true"
class="xy-table">
<el-table-column fixed type="selection" width="40px" />
<el-table-column label="任务标题" align="center" sortable prop="title" width="150px" />
<el-table-column fixed label="客户名称" prop="name" width="250px">
<template #default="scope">
<el-row>
<el-col :span="6">
<el-image style="width: 46px; height: 46px" :src="scope.row.logo" fit="fill" />
</el-col>
<el-col :span="18">
<el-row>
<el-col :span="24">{{ scope.row.name }}</el-col>
<el-col :span="24"><dict-tag :type="DICT_TYPE.customer_type" :value="scope.row.reservedFields1" /></el-col>
</el-row>
</el-col>
</el-row>
</template>
</el-table-column>
<el-table-column label="上次跟进时间" align="center" prop="title" width="150px" />
<el-table-column label="紧急程度" align="center" prop="urgency" width="150px" />
<el-table-column label="负责人" align="center" prop="belongingPeopleName" width="150px" />
<el-table-column label="客户分类" prop="calssify" width="120px">
<template #default="scope">
<dict-tag :type="DICT_TYPE.CUSTOMER_CALSSIFY" :value="scope.row.calssify" />
</template>
</el-table-column>
<el-table-column label="企业性质" prop="enterpriseNature" width="120px">
<template #default="scope">
<dict-tag :type="DICT_TYPE.enterpriseNature" :value="scope.row.enterpriseNature" />
</template>
</el-table-column>
<el-table-column label="行业分类" prop="industryClassify" width="120px">
<template #default="scope">
<dict-tag :type="DICT_TYPE.industryClassify" :value="scope.row.industryClassify" />
</template>
</el-table-column>
<el-table-column label="信用等级" prop="customerStarrating" width="150px">
<template #default="scope">
<el-rate v-model="scope.row.customerStarrating" :disabled="true"/>
</template>
</el-table-column>
<el-table-column label="业务进度" prop="industrySchedule" width="120px">
<template #default="scope">
<dict-tag :type="DICT_TYPE.industrySchedule" :value="scope.row.industrySchedule" />
</template>
</el-table-column>
<el-table-column label="开始时间" align="center" prop="startTime" width="150px">
<template #default="scope">
{{ dayjs(scope.row.startTime).format('YYYY-MM-DD') }}
</template>
</el-table-column>
<el-table-column label="结束时间" align="center" prop="endTime" width="150px">
<template #default="scope">
{{ dayjs(scope.row.endTime).format('YYYY-MM-DD') }}
</template>
</el-table-column>
<el-table-column label="创建时间" align="center" prop="createTime" width="150px">
<template #default="scope">
<el-row>
<el-col :span="24">{{ scope.row.creatorName }}</el-col>
<el-col :span="24" style="font-size: 12px;color: #999999;">
{{ dayjs(scope.row.createTime).format('YYYY-MM-DD HH:mm:ss') }}
</el-col>
</el-row>
</template>
</el-table-column>
<el-table-column label="更新时间" align="center" prop="updateTime" width="150px">
<template #default="scope">
<el-row>
<el-col :span="24">{{ scope.row.updaterName }}</el-col>
<el-col :span="24" style="font-size: 12px;color: #999999;">
{{ dayjs(scope.row.updateTime).format('YYYY-MM-DD HH:mm:ss') }}
</el-col>
</el-row>
</template>
</el-table-column>
<el-table-column label="操作" align="center" width="200px" fixed="right">
<template #default="scope">
<el-button link type="primary" @click="openForm('update', scope.row.id)"
v-hasPermi="['xxjj:subject-basic:update']">
详情
</el-button>
<el-button link type="primary" @click="openForm2('update', scope.row.id)"
v-hasPermi="['xxjj:subject-basic:update']">
报告
</el-button>
<el-button link type="danger" @click="handleDelete(scope.row.id)"
v-hasPermi="['xxjj:subject-basic:delete']">
删除
</el-button>
</template>
</el-table-column>
</el-table>
<Pagination :total="total" v-model:page="queryParams.pageNo" v-model:limit="queryParams.pageSize"
@pagination="getList" />
</el-col>
</el-row>
</ContentWrap>
<SubjectFollowManagementForm ref="formRef" @success="getList" />
<SubjectFollowReportForm ref="subjectFollowReportFormRef" @success="getList" />
<DrawerFilter :isShow="isShowDrawerFilterA" @do-close="doCloseDrawerFilterA" @do-search="doDrawerFilterASearch" />
</template>
<script setup lang="ts" name="SubjectBasic">
import { ref, reactive } from 'vue'
import { Filter } from '@element-plus/icons-vue'
import dayjs from 'dayjs'
import { DICT_TYPE, getStrDictOptions, getIntDictOptions } from '@/utils/dict'
import { dateFormatter } from '@/utils/formatTime'
import download from '@/utils/download'
import * as SubjectFollowManagementApi from '@/api/xxjj/SubjectFollowManagement'
import SubjectFollowManagementForm from './SubjectFollowManagementForm.vue'
import SubjectFollowReportForm from './SubjectFollowReportForm.vue'
import DrawerFilter from './src/DrawerFilter.vue'
const message = useMessage() //
const { t } = useI18n() //
const loading = ref(true) //
const total = ref(0) //
const list = ref([]) //
let queryParams : any = reactive({
pageNo: 1,
pageSize: 10,
businessType: null,
calssify: null,
name: null,
logo: null,
enterpriseNature: null,
industryClassify: null,
customerSource: null,
customerStarrating: null,
industrySchedule: null,
belongingPeople: null,
city: null,
country: null,
address: null,
phone: null,
companyFax: null,
companyHttp: null,
companyProfile: null,
customerStatus: null,
socialInformationCodeCertificate: null,
registerAddress: null,
informationCode: null,
operateStart: null,
operateEnd: null,
registerCapital: null,
businessScope: null,
proofPaidCapital: null,
assetCertificate: null,
assetCertificateMortgage: null,
otherQualifications: null,
collaborationStart: null,
collaborationEnd: null,
demandVolumeDown: null,
demandVolumeUpper: null,
fundLimit: null,
businessHours: null,
businessStart: null,
businessEnd: null,
allowableUnloadingStart: null,
allowableUnloadingEnd: null,
unloading: null,
unloadingEfficiency: null,
allowableShipmentStart: null,
allowableShipmentEnd: null,
shipment: null,
shipmentEffciency: null,
paymentMethod: null,
accountName: null,
bankAccount: null,
bankDeposit: null,
depositArea: null,
bankBranch: null,
companyTaxNumber: null,
enterpriseName: null,
workAddress: null,
collaborationMethod: null,
settlementMethod: null,
accountPeriod: null,
underpaymentMethod: null,
applyForUnderpaymentRatio: null,
marginMethod: null,
applyForMarginRatio: null,
overdueInterestRate: null,
applyForOverdueRatio: null,
reservedFields1: null,
reservedFields2: null,
reservedFields3: null,
reservedFields4: null,
reservedFields5: null,
reservedFields6: null,
creditRating: null,
autoCreditRating: null,
accountsReceivableUpper: null,
orderQuantityDown: null,
orderQuantityUpper: null,
accountsReceivableOverdue: null,
taxPaymentCertificate: null,
createTime: []
})
const queryFormRef = ref() //
const exportLoading = ref(false) //
/** 查询列表 */
const getList = async () => {
loading.value = true
try {
queryParams.businessType = 1;
const data = await SubjectFollowManagementApi.getSubjectFollowManagementPage(queryParams)
list.value = data.list
total.value = data.total
} finally {
loading.value = false
}
}
/** 搜索按钮操作 */
const handleQuery = () => {
queryParams.pageNo = 1
getList()
}
/** 重置按钮操作 */
const resetQuery = () => {
queryFormRef.value.resetFields()
handleQuery()
}
/** 添加/修改操作 */
const formRef = ref()
const openForm = (type: string, id?: number) => {
formRef.value.open(type, id)
}
const subjectFollowReportFormRef = ref()
const openForm2 = (type: string, id?: number) => {
subjectFollowReportFormRef.value.open(type, id)
}
/** 删除按钮操作 */
const handleDelete = async (id: number) => {
try {
//
await message.delConfirm()
//
await SubjectFollowManagementApi.deleteSubjectFollowManagement(id)
message.success(t('common.delSuccess'))
//
await getList()
} catch { }
}
/** 导出按钮操作 */
const handleExport = async () => {
try {
//
await message.exportConfirm()
//
exportLoading.value = true
const data = await SubjectFollowManagementApi.exportSubjectFollowManagement(queryParams)
download.excel(data, '基础业务信息表(客户,供应商,服务商主体).xls')
} catch {
} finally {
exportLoading.value = false
}
}
//
let isShowDrawerFilterA = ref(false);
const doShowDrawerFilterA = (isshow: boolean) => {
isShowDrawerFilterA.value = isshow;
}
const doCloseDrawerFilterA = (isshow: boolean) => {
isShowDrawerFilterA.value = isshow;
}
const doDrawerFilterASearch = (params: Object) => {
queryParams = params;
getList()
}
/** 初始化 **/
onMounted(() => {
getList()
})
</script>
<style lang="scss">
.xy-table thead {
color: #1D2129;
}
.xy-table thead th.el-table__cell {
background-color: #F7F8FA;
}
.xy-table.is-scrolling-left th.el-table-fixed-column--left {
background-color: #F7F8FA;
}
</style>

@ -0,0 +1,316 @@
<template>
<ContentWrap>
<!-- 搜索工作栏 -->
<el-form
class="-mb-15px"
:model="queryParams"
ref="queryFormRef"
:inline="true"
label-width="68px"
>
<el-form-item label="业务id" prop="businessId">
<el-input
v-model="queryParams.businessId"
placeholder="请输入业务id"
clearable
@keyup.enter="handleQuery"
class="!w-240px"
/>
</el-form-item>
<el-form-item label="代表人类型(0客户 1供应商 2服务商)" prop="businessType">
<el-select
v-model="queryParams.businessType"
placeholder="请选择代表人类型(0客户 1供应商 2服务商)"
clearable
class="!w-240px"
>
<el-option label="请选择字典生成" value="" />
</el-select>
</el-form-item>
<el-form-item label="任务标题" prop="title">
<el-input
v-model="queryParams.title"
placeholder="请输入任务标题"
clearable
@keyup.enter="handleQuery"
class="!w-240px"
/>
</el-form-item>
<el-form-item label="身份证号" prop="idCard">
<el-input
v-model="queryParams.idCard"
placeholder="请输入身份证号"
clearable
@keyup.enter="handleQuery"
class="!w-240px"
/>
</el-form-item>
<el-form-item label="开始时间" prop="startTime">
<el-date-picker
v-model="queryParams.startTime"
value-format="YYYY-MM-DD HH:mm:ss"
type="daterange"
start-placeholder="开始日期"
end-placeholder="结束日期"
:default-time="[new Date('1 00:00:00'), new Date('1 23:59:59')]"
class="!w-240px"
/>
</el-form-item>
<el-form-item label="结束时间" prop="endTime">
<el-date-picker
v-model="queryParams.endTime"
value-format="YYYY-MM-DD HH:mm:ss"
type="daterange"
start-placeholder="开始日期"
end-placeholder="结束日期"
:default-time="[new Date('1 00:00:00'), new Date('1 23:59:59')]"
class="!w-240px"
/>
</el-form-item>
<el-form-item label="负责人员" prop="responsible">
<el-input
v-model="queryParams.responsible"
placeholder="请输入负责人员"
clearable
@keyup.enter="handleQuery"
class="!w-240px"
/>
</el-form-item>
<el-form-item label="参与人员" prop="partake">
<el-input
v-model="queryParams.partake"
placeholder="请输入参与人员"
clearable
@keyup.enter="handleQuery"
class="!w-240px"
/>
</el-form-item>
<el-form-item label="标记颜色" prop="mark">
<el-input
v-model="queryParams.mark"
placeholder="请输入标记颜色"
clearable
@keyup.enter="handleQuery"
class="!w-240px"
/>
</el-form-item>
<el-form-item label="紧要程度(0重要 1紧急 2普通 3较低)" prop="urgency">
<el-input
v-model="queryParams.urgency"
placeholder="请输入紧要程度(0重要 1紧急 2普通 3较低)"
clearable
@keyup.enter="handleQuery"
class="!w-240px"
/>
</el-form-item>
<el-form-item label="提醒类型(0准时提醒 1提前5分钟 2提前15分钟 3提前30分钟 4提前1小时)" prop="remindType">
<el-select
v-model="queryParams.remindType"
placeholder="请选择提醒类型(0准时提醒 1提前5分钟 2提前15分钟 3提前30分钟 4提前1小时)"
clearable
class="!w-240px"
>
<el-option label="请选择字典生成" value="" />
</el-select>
</el-form-item>
<el-form-item label="创建时间" prop="createTime">
<el-date-picker
v-model="queryParams.createTime"
value-format="YYYY-MM-DD HH:mm:ss"
type="daterange"
start-placeholder="开始日期"
end-placeholder="结束日期"
:default-time="[new Date('1 00:00:00'), new Date('1 23:59:59')]"
class="!w-240px"
/>
</el-form-item>
<el-form-item>
<el-button @click="handleQuery"><Icon icon="ep:search" class="mr-5px" /> 搜索</el-button>
<el-button @click="resetQuery"><Icon icon="ep:refresh" class="mr-5px" /> 重置</el-button>
<el-button
type="primary"
plain
@click="openForm('create')"
v-hasPermi="['xxjj:subject-follow-management:create']"
>
<Icon icon="ep:plus" class="mr-5px" /> 新增
</el-button>
<el-button
type="success"
plain
@click="handleExport"
:loading="exportLoading"
v-hasPermi="['xxjj:subject-follow-management:export']"
>
<Icon icon="ep:download" class="mr-5px" /> 导出
</el-button>
</el-form-item>
</el-form>
</ContentWrap>
<!-- 列表 -->
<ContentWrap>
<el-table v-loading="loading" :data="list" :stripe="true" :show-overflow-tooltip="true">
<el-table-column label="序号" type="index" width="70px" />
<el-table-column label="主键id" align="center" prop="id" width="150px"/>
<el-table-column label="业务id" align="center" prop="businessId" width="150px"/>
<el-table-column label="代表人类型(0客户 1供应商 2服务商)" align="center" prop="businessType" width="150px"/>
<el-table-column label="任务标题" align="center" prop="title" width="150px"/>
<el-table-column label="身份证号" align="center" prop="idCard" width="150px"/>
<el-table-column
label="开始时间"
align="center"
prop="startTime"
:formatter="dateFormatter"
width="150px"
/>
<el-table-column
label="结束时间"
align="center"
prop="endTime"
:formatter="dateFormatter"
width="150px"
/>
<el-table-column label="负责人员" align="center" prop="responsible" width="150px"/>
<el-table-column label="参与人员" align="center" prop="partake" width="150px"/>
<el-table-column label="标记颜色" align="center" prop="mark" width="150px"/>
<el-table-column label="紧要程度(0重要 1紧急 2普通 3较低)" align="center" prop="urgency" width="150px"/>
<el-table-column label="提醒类型(0准时提醒 1提前5分钟 2提前15分钟 3提前30分钟 4提前1小时)" align="center" prop="remindType" width="150px"/>
<el-table-column label="任务描述" align="center" prop="description" width="150px"/>
<el-table-column label="附件" align="center" prop="annex" width="150px"/>
<el-table-column
label="创建时间"
align="center"
prop="createTime"
:formatter="dateFormatter"
width="150px"
/>
<el-table-column label="操作" align="center" width="150px">
<template #default="scope">
<el-button
link
type="primary"
@click="openForm('update', scope.row.id)"
v-hasPermi="['xxjj:subject-follow-management:update']"
>
编辑
</el-button>
<el-button
link
type="danger"
@click="handleDelete(scope.row.id)"
v-hasPermi="['xxjj:subject-follow-management:delete']"
>
删除
</el-button>
</template>
</el-table-column>
</el-table>
<!-- 分页 -->
<Pagination
:total="total"
v-model:page="queryParams.pageNo"
v-model:limit="queryParams.pageSize"
@pagination="getList"
/>
</ContentWrap>
<!-- 表单弹窗添加/修改 -->
<SubjectFollowManagementForm ref="formRef" @success="getList" />
</template>
<script setup lang="ts" name="SubjectFollowManagement">
import { dateFormatter } from '@/utils/formatTime'
import download from '@/utils/download'
import * as SubjectFollowManagementApi from '@/api/xxjj/subjectFollowManagement'
import SubjectFollowManagementForm from './SubjectFollowManagementForm.vue'
const message = useMessage() //
const { t } = useI18n() //
const loading = ref(true) //
const total = ref(0) //
const list = ref([]) //
const queryParams = reactive({
pageNo: 1,
pageSize: 10,
businessId: null,
businessType: null,
title: null,
idCard: null,
startTime: [],
endTime: [],
responsible: null,
partake: null,
mark: null,
urgency: null,
remindType: null,
description: null,
annex: null,
createTime: []
})
const queryFormRef = ref() //
const exportLoading = ref(false) //
/** 查询列表 */
const getList = async () => {
loading.value = true
try {
const data = await SubjectFollowManagementApi.getSubjectFollowManagementPage(queryParams)
list.value = data.list
total.value = data.total
} finally {
loading.value = false
}
}
/** 搜索按钮操作 */
const handleQuery = () => {
queryParams.pageNo = 1
getList()
}
/** 重置按钮操作 */
const resetQuery = () => {
queryFormRef.value.resetFields()
handleQuery()
}
/** 添加/修改操作 */
const formRef = ref()
const openForm = (type: string, id?: number) => {
formRef.value.open(type, id)
}
/** 删除按钮操作 */
const handleDelete = async (id: number) => {
try {
//
await message.delConfirm()
//
await SubjectFollowManagementApi.deleteSubjectFollowManagement(id)
message.success(t('common.delSuccess'))
//
await getList()
} catch {}
}
/** 导出按钮操作 */
const handleExport = async () => {
try {
//
await message.exportConfirm()
//
exportLoading.value = true
const data = await SubjectFollowManagementApi.exportSubjectFollowManagement(queryParams)
download.excel(data, '主体跟进管理.xls')
} catch {
} finally {
exportLoading.value = false
}
}
/** 初始化 **/
onMounted(() => {
getList()
})
</script>

@ -0,0 +1,247 @@
<template>
<el-drawer :model-value="props.isShow" :with-header="true" :show-close="false" class="xy-drawer" @closed="doClose"
size="40%">
<template #header style="background-color: red;">
<div class="xy-header-l">
<el-icon>
<Filter />
</el-icon>
</div>
<div class="xy-header-r">
<el-button type="" link :icon="ArrowRightBold" @click="doClose"></el-button>
</div>
</template>
<template #default>
<el-form :model="queryParams" ref="queryFormRef">
<el-row :gutter="20">
<el-col :span="12">
<el-form-item label="客户名称" prop="name">
<el-input v-model="queryParams.name" placeholder="请输入客户名称" clearable @keyup.enter="handleQuery"
style="width: 100%;" />
</el-form-item>
</el-col>
<el-col :span="12">
<el-form-item label="客户状态" prop="customerStatus">
<el-select v-model="queryParams.customerStatus" placeholder="请选择" style="width: 100%;">
<el-option v-for="dict in getIntDictOptions(DICT_TYPE.CUSTOMER_STATUS)" :key="dict.value"
:label="dict.label" :value="dict.value" />
</el-select>
</el-form-item>
</el-col>
</el-row>
<el-row :gutter="20">
<el-col :span="12">
<el-form-item label="客户分类" prop="calssify">
<el-select v-model="queryParams.calssify" placeholder="请选择" style="width: 100%;">
<el-option v-for="dict in getIntDictOptions(DICT_TYPE.CUSTOMER_CALSSIFY)" :key="dict.value"
:label="dict.label" :value="dict.value" />
</el-select>
</el-form-item>
</el-col>
<el-col :span="12">
<el-form-item label="客户类型" prop="reservedFields1">
<el-select v-model="queryParams.reservedFields1" placeholder="请选择" style="width: 100%;">
<el-option v-for="dict in getIntDictOptions(DICT_TYPE.customer_type)" :key="dict.value"
:label="dict.label" :value="dict.value" />
</el-select>
</el-form-item>
</el-col>
</el-row>
<el-row :gutter="20">
<el-col :span="12">
<el-form-item label="业务进度" prop="industrySchedule">
<el-select v-model="queryParams.industrySchedule" placeholder="请选择" style="width: 100%;">
<el-option v-for="dict in getIntDictOptions(DICT_TYPE.industrySchedule)" :key="dict.value"
:label="dict.label" :value="dict.value" />
</el-select>
</el-form-item>
</el-col>
<el-col :span="12">
<el-form-item label="行业分类" prop="industryClassify">
<el-select v-model="queryParams.industryClassify" placeholder="请选择" style="width: 100%;">
<el-option v-for="dict in getIntDictOptions(DICT_TYPE.industryClassify)" :key="dict.value"
:label="dict.label" :value="dict.value" />
</el-select>
</el-form-item>
</el-col>
</el-row>
<el-row :gutter="20">
<el-col :span="12">
<el-form-item label="客户来源" prop="customerSource">
<el-select v-model="queryParams.customerSource" placeholder="请选择" style="width: 100%;">
<el-option v-for="dict in getIntDictOptions(DICT_TYPE.customerSource)" :key="dict.value"
:label="dict.label" :value="dict.value" />
</el-select>
</el-form-item>
</el-col>
<el-col :span="12">
<el-form-item label="账户类型" prop="reservedFields2">
<el-select v-model="queryParams.reservedFields2" placeholder="请选择" style="width: 100%;">
<el-option v-for="dict in getIntDictOptions(DICT_TYPE.account_type)" :key="dict.value"
:label="dict.label" :value="dict.value" />
</el-select>
</el-form-item>
</el-col>
</el-row>
<el-row :gutter="20">
<el-col :span="12">
<el-form-item label="企业性质" prop="enterpriseNature">
<el-select v-model="queryParams.enterpriseNature" placeholder="请选择" style="width: 100%;">
<el-option v-for="dict in getIntDictOptions(DICT_TYPE.enterpriseNature)" :key="dict.value"
:label="dict.label" :value="dict.value" />
</el-select>
</el-form-item>
</el-col>
<el-col :span="12">
<el-form-item label="创建时间" prop="createTime">
<el-date-picker v-model="queryParams.createTime" value-format="YYYY-MM-DD HH:mm:ss"
type="daterange" start-placeholder="开始日期" end-placeholder="结束日期"
:default-time="[new Date('1 00:00:00'), new Date('1 23:59:59')]" class="!w-240px"
style="width: 100%;" />
</el-form-item>
</el-col>
</el-row>
</el-form>
</template>
<template #footer>
<div class="xy-footer">
<el-button type="primary" :icon="Search" @click="handleQuery"></el-button>
<el-button :icon="RefreshLeft">重置</el-button>
</div>
</template>
</el-drawer>
</template>
<script setup lang="ts" name="DrawerFilter">
import { Filter, ArrowRightBold, Search, RefreshLeft } from '@element-plus/icons-vue'
import { DICT_TYPE, getIntDictOptions } from '@/utils/dict'
const props = defineProps({
isShow: Boolean
})
const emit = defineEmits(['doClose'])
//
const doClose = () => {
emit('doClose', false)
}
/** 搜索按钮操作 */
const handleQuery = () => {
emit('doSearch', queryParams)
}
const queryParams = reactive({
pageNo: 1,
pageSize: 10,
businessType: null,
calssify: null,
name: null,
logo: null,
enterpriseNature: null,
industryClassify: null,
customerSource: null,
customerStarrating: null,
industrySchedule: null,
belongingPeople: null,
city: null,
country: null,
address: null,
phone: null,
companyFax: null,
companyHttp: null,
companyProfile: null,
customerStatus: null,
socialInformationCodeCertificate: null,
registerAddress: null,
informationCode: null,
operateStart: null,
operateEnd: null,
registerCapital: null,
businessScope: null,
proofPaidCapital: null,
assetCertificate: null,
assetCertificateMortgage: null,
otherQualifications: null,
collaborationStart: null,
collaborationEnd: null,
demandVolumeDown: null,
demandVolumeUpper: null,
fundLimit: null,
businessHours: null,
businessStart: null,
businessEnd: null,
allowableUnloadingStart: null,
allowableUnloadingEnd: null,
unloading: null,
unloadingEfficiency: null,
allowableShipmentStart: null,
allowableShipmentEnd: null,
shipment: null,
shipmentEffciency: null,
paymentMethod: null,
accountName: null,
bankAccount: null,
bankDeposit: null,
depositArea: null,
bankBranch: null,
companyTaxNumber: null,
enterpriseName: null,
workAddress: null,
collaborationMethod: null,
settlementMethod: null,
accountPeriod: null,
underpaymentMethod: null,
applyForUnderpaymentRatio: null,
marginMethod: null,
applyForMarginRatio: null,
overdueInterestRate: null,
applyForOverdueRatio: null,
reservedFields1: null,
reservedFields2: null,
reservedFields3: null,
reservedFields4: null,
reservedFields5: null,
reservedFields6: null,
creditRating: null,
autoCreditRating: null,
accountsReceivableUpper: null,
orderQuantityDown: null,
orderQuantityUpper: null,
accountsReceivableOverdue: null,
taxPaymentCertificate: null,
createTime: []
})
</script>
<style lang="scss">
.xy-drawer {
.el-drawer__header {
margin: 0px;
border-bottom: solid 1px #D9D9D9;
padding: 10px 0px;
height: 50px;
.xy-header-l {
padding: 0px 10px;
}
.xy-header-r {
padding: 0px 10px;
}
}
.el-drawer__footer {
border-top: solid 1px #D9D9D9;
padding: 0px;
.xy-footer {
padding: 10px;
}
}
}
</style>

@ -0,0 +1,138 @@
<template>
<Dialog :title="dialogTitle" v-model="dialogVisible">
<el-form
ref="formRef"
:model="formData"
:rules="formRules"
label-width="100px"
v-loading="formLoading"
>
<el-form-item label="报告类型(1跟进报告 2其他报告)" prop="reportType">
<el-select v-model="formData.reportType" placeholder="请选择报告类型(1跟进报告 2其他报告)">
<el-option label="请选择字典生成" value="" />
</el-select>
</el-form-item>
<el-form-item label="报告日期" prop="reporTime">
<el-date-picker
v-model="formData.reporTime"
type="date"
value-format="x"
placeholder="选择报告日期"
/>
</el-form-item>
<el-form-item label="跟进日期" prop="followTime">
<el-date-picker
v-model="formData.followTime"
type="date"
value-format="x"
placeholder="选择跟进日期"
/>
</el-form-item>
<el-form-item label="业务id" prop="businessId">
<el-input v-model="formData.businessId" placeholder="请输入业务id" />
</el-form-item>
<el-form-item label="附件" prop="annex">
<el-input v-model="formData.annex" placeholder="请输入附件" />
</el-form-item>
<el-form-item label="报告内容">
<Editor v-model="formData.description" height="150px" />
</el-form-item>
<el-form-item label="批阅人员" prop="readOverUser">
<el-input v-model="formData.readOverUser" placeholder="请输入批阅人员" />
</el-form-item>
<el-form-item label="抄送人员" prop="makeCopyUser">
<el-input v-model="formData.makeCopyUser" placeholder="请输入抄送人员" />
</el-form-item>
</el-form>
<template #footer>
<el-button @click="submitForm" type="primary" :disabled="formLoading"> </el-button>
<el-button @click="dialogVisible = false"> </el-button>
</template>
</Dialog>
</template>
<script setup lang="ts">
import * as SubjectFollowReportApi from '@/api/xxjj/subjectFollowReport'
const { t } = useI18n() //
const message = useMessage() //
const dialogVisible = ref(false) //
const dialogTitle = ref('') //
const formLoading = ref(false) // 12
const formType = ref('') // create - update -
const formData = ref({
id: undefined,
reportType: undefined,
reporTime: undefined,
followTime: undefined,
businessId: undefined,
annex: undefined,
description: undefined,
readOverUser: undefined,
makeCopyUser: undefined
})
const formRules = reactive({
businessId: [{ required: true, message: '业务id不能为空', trigger: 'blur' }]
})
const formRef = ref() // Ref
/** 打开弹窗 */
const open = async (type: string, id?: number) => {
dialogVisible.value = true
dialogTitle.value = t('action.' + type)
formType.value = type
resetForm()
//
if (id) {
formLoading.value = true
try {
formData.value = await SubjectFollowReportApi.getSubjectFollowReport(id)
} finally {
formLoading.value = false
}
}
}
defineExpose({ open }) // open
/** 提交表单 */
const emit = defineEmits(['success']) // success
const submitForm = async () => {
//
if (!formRef) return
const valid = await formRef.value.validate()
if (!valid) return
//
formLoading.value = true
try {
const data = formData.value as unknown as SubjectFollowReportApi.SubjectFollowReportVO
if (formType.value === 'create') {
await SubjectFollowReportApi.createSubjectFollowReport(data)
message.success(t('common.createSuccess'))
} else {
await SubjectFollowReportApi.updateSubjectFollowReport(data)
message.success(t('common.updateSuccess'))
}
dialogVisible.value = false
//
emit('success')
} finally {
formLoading.value = false
}
}
/** 重置表单 */
const resetForm = () => {
formData.value = {
id: undefined,
reportType: undefined,
reporTime: undefined,
followTime: undefined,
businessId: undefined,
annex: undefined,
description: undefined,
readOverUser: undefined,
makeCopyUser: undefined
}
formRef.value?.resetFields()
}
</script>

@ -0,0 +1,269 @@
<template>
<ContentWrap>
<!-- 搜索工作栏 -->
<el-form
class="-mb-15px"
:model="queryParams"
ref="queryFormRef"
:inline="true"
label-width="68px"
>
<el-form-item label="报告类型(1跟进报告 2其他报告)" prop="reportType">
<el-select
v-model="queryParams.reportType"
placeholder="请选择报告类型(1跟进报告 2其他报告)"
clearable
class="!w-240px"
>
<el-option label="请选择字典生成" value="" />
</el-select>
</el-form-item>
<el-form-item label="报告日期" prop="reporTime">
<el-date-picker
v-model="queryParams.reporTime"
value-format="YYYY-MM-DD HH:mm:ss"
type="daterange"
start-placeholder="开始日期"
end-placeholder="结束日期"
:default-time="[new Date('1 00:00:00'), new Date('1 23:59:59')]"
class="!w-240px"
/>
</el-form-item>
<el-form-item label="跟进日期" prop="followTime">
<el-date-picker
v-model="queryParams.followTime"
value-format="YYYY-MM-DD HH:mm:ss"
type="daterange"
start-placeholder="开始日期"
end-placeholder="结束日期"
:default-time="[new Date('1 00:00:00'), new Date('1 23:59:59')]"
class="!w-240px"
/>
</el-form-item>
<el-form-item label="业务id" prop="businessId">
<el-input
v-model="queryParams.businessId"
placeholder="请输入业务id"
clearable
@keyup.enter="handleQuery"
class="!w-240px"
/>
</el-form-item>
<el-form-item label="附件" prop="annex">
<el-input
v-model="queryParams.annex"
placeholder="请输入附件"
clearable
@keyup.enter="handleQuery"
class="!w-240px"
/>
</el-form-item>
<el-form-item label="批阅人员" prop="readOverUser">
<el-input
v-model="queryParams.readOverUser"
placeholder="请输入批阅人员"
clearable
@keyup.enter="handleQuery"
class="!w-240px"
/>
</el-form-item>
<el-form-item label="抄送人员" prop="makeCopyUser">
<el-input
v-model="queryParams.makeCopyUser"
placeholder="请输入抄送人员"
clearable
@keyup.enter="handleQuery"
class="!w-240px"
/>
</el-form-item>
<el-form-item label="创建时间" prop="createTime">
<el-date-picker
v-model="queryParams.createTime"
value-format="YYYY-MM-DD HH:mm:ss"
type="daterange"
start-placeholder="开始日期"
end-placeholder="结束日期"
:default-time="[new Date('1 00:00:00'), new Date('1 23:59:59')]"
class="!w-240px"
/>
</el-form-item>
<el-form-item>
<el-button @click="handleQuery"><Icon icon="ep:search" class="mr-5px" /> 搜索</el-button>
<el-button @click="resetQuery"><Icon icon="ep:refresh" class="mr-5px" /> 重置</el-button>
<el-button
type="primary"
plain
@click="openForm('create')"
v-hasPermi="['xxjj:subject-follow-report:create']"
>
<Icon icon="ep:plus" class="mr-5px" /> 新增
</el-button>
<el-button
type="success"
plain
@click="handleExport"
:loading="exportLoading"
v-hasPermi="['xxjj:subject-follow-report:export']"
>
<Icon icon="ep:download" class="mr-5px" /> 导出
</el-button>
</el-form-item>
</el-form>
</ContentWrap>
<!-- 列表 -->
<ContentWrap>
<el-table v-loading="loading" :data="list" :stripe="true" :show-overflow-tooltip="true">
<el-table-column label="序号" type="index" width="70px" />
<el-table-column label="主键id" align="center" prop="id" width="150px"/>
<el-table-column label="报告类型(1跟进报告 2其他报告)" align="center" prop="reportType" width="150px"/>
<el-table-column
label="报告日期"
align="center"
prop="reporTime"
:formatter="dateFormatter"
width="150px"
/>
<el-table-column
label="跟进日期"
align="center"
prop="followTime"
:formatter="dateFormatter"
width="150px"
/>
<el-table-column label="业务id" align="center" prop="businessId" width="150px"/>
<el-table-column label="附件" align="center" prop="annex" width="150px"/>
<el-table-column label="报告内容" align="center" prop="description" width="150px"/>
<el-table-column label="批阅人员" align="center" prop="readOverUser" width="150px"/>
<el-table-column label="抄送人员" align="center" prop="makeCopyUser" width="150px"/>
<el-table-column
label="创建时间"
align="center"
prop="createTime"
:formatter="dateFormatter"
width="150px"
/>
<el-table-column label="操作" align="center" width="150px">
<template #default="scope">
<el-button
link
type="primary"
@click="openForm('update', scope.row.id)"
v-hasPermi="['xxjj:subject-follow-report:update']"
>
编辑
</el-button>
<el-button
link
type="danger"
@click="handleDelete(scope.row.id)"
v-hasPermi="['xxjj:subject-follow-report:delete']"
>
删除
</el-button>
</template>
</el-table-column>
</el-table>
<!-- 分页 -->
<Pagination
:total="total"
v-model:page="queryParams.pageNo"
v-model:limit="queryParams.pageSize"
@pagination="getList"
/>
</ContentWrap>
<!-- 表单弹窗添加/修改 -->
<SubjectFollowReportForm ref="formRef" @success="getList" />
</template>
<script setup lang="ts" name="SubjectFollowReport">
import { dateFormatter } from '@/utils/formatTime'
import download from '@/utils/download'
import * as SubjectFollowReportApi from '@/api/xxjj/subjectFollowReport'
import SubjectFollowReportForm from './SubjectFollowReportForm.vue'
const message = useMessage() //
const { t } = useI18n() //
const loading = ref(true) //
const total = ref(0) //
const list = ref([]) //
const queryParams = reactive({
pageNo: 1,
pageSize: 10,
reportType: null,
reporTime: [],
followTime: [],
businessId: null,
annex: null,
description: null,
readOverUser: null,
makeCopyUser: null,
createTime: []
})
const queryFormRef = ref() //
const exportLoading = ref(false) //
/** 查询列表 */
const getList = async () => {
loading.value = true
try {
const data = await SubjectFollowReportApi.getSubjectFollowReportPage(queryParams)
list.value = data.list
total.value = data.total
} finally {
loading.value = false
}
}
/** 搜索按钮操作 */
const handleQuery = () => {
queryParams.pageNo = 1
getList()
}
/** 重置按钮操作 */
const resetQuery = () => {
queryFormRef.value.resetFields()
handleQuery()
}
/** 添加/修改操作 */
const formRef = ref()
const openForm = (type: string, id?: number) => {
formRef.value.open(type, id)
}
/** 删除按钮操作 */
const handleDelete = async (id: number) => {
try {
//
await message.delConfirm()
//
await SubjectFollowReportApi.deleteSubjectFollowReport(id)
message.success(t('common.delSuccess'))
//
await getList()
} catch {}
}
/** 导出按钮操作 */
const handleExport = async () => {
try {
//
await message.exportConfirm()
//
exportLoading.value = true
const data = await SubjectFollowReportApi.exportSubjectFollowReport(queryParams)
download.excel(data, '跟进报告管理.xls')
} catch {
} finally {
exportLoading.value = false
}
}
/** 初始化 **/
onMounted(() => {
getList()
})
</script>

@ -0,0 +1,122 @@
<template>
<Dialog :title="dialogTitle" v-model="dialogVisible">
<el-form
ref="formRef"
:model="formData"
:rules="formRules"
label-width="100px"
v-loading="formLoading"
>
<el-form-item label="业务id" prop="businessId">
<el-input v-model="formData.businessId" placeholder="请输入业务id" />
</el-form-item>
<el-form-item label="业务类型(0客户 1供应商 2服务商)" prop="businessType">
<el-select v-model="formData.businessType" placeholder="请选择业务类型(0客户 1供应商 2服务商)">
<el-option label="请选择字典生成" value="" />
</el-select>
</el-form-item>
<el-form-item label="转移前用户id" prop="userId1">
<el-input v-model="formData.userId1" placeholder="请输入转移前用户id" />
</el-form-item>
<el-form-item label="转移后用户id" prop="userId2">
<el-input v-model="formData.userId2" placeholder="请输入转移后用户id" />
</el-form-item>
<el-form-item label="转移数据类型(0商机1订单2财务3费用4发票)" prop="transferType">
<el-select v-model="formData.transferType" placeholder="请选择转移数据类型(0商机1订单2财务3费用4发票)">
<el-option label="请选择字典生成" value="" />
</el-select>
</el-form-item>
<el-form-item label="备注" prop="remark">
<el-input v-model="formData.remark" placeholder="请输入备注" />
</el-form-item>
</el-form>
<template #footer>
<el-button @click="submitForm" type="primary" :disabled="formLoading"> </el-button>
<el-button @click="dialogVisible = false"> </el-button>
</template>
</Dialog>
</template>
<script setup lang="ts">
import * as SubjectTransferApi from '@/api/xxjj/subjectTransfer'
const { t } = useI18n() //
const message = useMessage() //
const dialogVisible = ref(false) //
const dialogTitle = ref('') //
const formLoading = ref(false) // 12
const formType = ref('') // create - update -
const formData = ref({
id: undefined,
businessId: undefined,
businessType: undefined,
userId1: undefined,
userId2: undefined,
transferType: undefined,
remark: undefined
})
const formRules = reactive({
businessId: [{ required: true, message: '业务id不能为空', trigger: 'blur' }],
userId1: [{ required: true, message: '转移前用户id不能为空', trigger: 'blur' }],
userId2: [{ required: true, message: '转移后用户id不能为空', trigger: 'blur' }]
})
const formRef = ref() // Ref
/** 打开弹窗 */
const open = async (type: string, id?: number) => {
dialogVisible.value = true
dialogTitle.value = t('action.' + type)
formType.value = type
resetForm()
//
if (id) {
formLoading.value = true
try {
formData.value = await SubjectTransferApi.getSubjectTransfer(id)
} finally {
formLoading.value = false
}
}
}
defineExpose({ open }) // open
/** 提交表单 */
const emit = defineEmits(['success']) // success
const submitForm = async () => {
//
if (!formRef) return
const valid = await formRef.value.validate()
if (!valid) return
//
formLoading.value = true
try {
const data = formData.value as unknown as SubjectTransferApi.SubjectTransferVO
if (formType.value === 'create') {
await SubjectTransferApi.createSubjectTransfer(data)
message.success(t('common.createSuccess'))
} else {
await SubjectTransferApi.updateSubjectTransfer(data)
message.success(t('common.updateSuccess'))
}
dialogVisible.value = false
//
emit('success')
} finally {
formLoading.value = false
}
}
/** 重置表单 */
const resetForm = () => {
formData.value = {
id: undefined,
businessId: undefined,
businessType: undefined,
userId1: undefined,
userId2: undefined,
transferType: undefined,
remark: undefined
}
formRef.value?.resetFields()
}
</script>

@ -0,0 +1,241 @@
<template>
<ContentWrap>
<!-- 搜索工作栏 -->
<el-form
class="-mb-15px"
:model="queryParams"
ref="queryFormRef"
:inline="true"
label-width="68px"
>
<el-form-item label="业务id" prop="businessId">
<el-input
v-model="queryParams.businessId"
placeholder="请输入业务id"
clearable
@keyup.enter="handleQuery"
class="!w-240px"
/>
</el-form-item>
<el-form-item label="业务类型(0客户 1供应商 2服务商)" prop="businessType">
<el-select
v-model="queryParams.businessType"
placeholder="请选择业务类型(0客户 1供应商 2服务商)"
clearable
class="!w-240px"
>
<el-option label="请选择字典生成" value="" />
</el-select>
</el-form-item>
<el-form-item label="转移前用户id" prop="userId1">
<el-input
v-model="queryParams.userId1"
placeholder="请输入转移前用户id"
clearable
@keyup.enter="handleQuery"
class="!w-240px"
/>
</el-form-item>
<el-form-item label="转移后用户id" prop="userId2">
<el-input
v-model="queryParams.userId2"
placeholder="请输入转移后用户id"
clearable
@keyup.enter="handleQuery"
class="!w-240px"
/>
</el-form-item>
<el-form-item label="转移数据类型(0商机1订单2财务3费用4发票)" prop="transferType">
<el-select
v-model="queryParams.transferType"
placeholder="请选择转移数据类型(0商机1订单2财务3费用4发票)"
clearable
class="!w-240px"
>
<el-option label="请选择字典生成" value="" />
</el-select>
</el-form-item>
<el-form-item label="备注" prop="remark">
<el-input
v-model="queryParams.remark"
placeholder="请输入备注"
clearable
@keyup.enter="handleQuery"
class="!w-240px"
/>
</el-form-item>
<el-form-item label="创建时间" prop="createTime">
<el-date-picker
v-model="queryParams.createTime"
value-format="YYYY-MM-DD HH:mm:ss"
type="daterange"
start-placeholder="开始日期"
end-placeholder="结束日期"
:default-time="[new Date('1 00:00:00'), new Date('1 23:59:59')]"
class="!w-240px"
/>
</el-form-item>
<el-form-item>
<el-button @click="handleQuery"><Icon icon="ep:search" class="mr-5px" /> 搜索</el-button>
<el-button @click="resetQuery"><Icon icon="ep:refresh" class="mr-5px" /> 重置</el-button>
<el-button
type="primary"
plain
@click="openForm('create')"
v-hasPermi="['xxjj:subject-transfer:create']"
>
<Icon icon="ep:plus" class="mr-5px" /> 新增
</el-button>
<el-button
type="success"
plain
@click="handleExport"
:loading="exportLoading"
v-hasPermi="['xxjj:subject-transfer:export']"
>
<Icon icon="ep:download" class="mr-5px" /> 导出
</el-button>
</el-form-item>
</el-form>
</ContentWrap>
<!-- 列表 -->
<ContentWrap>
<el-table v-loading="loading" :data="list" :stripe="true" :show-overflow-tooltip="true">
<el-table-column label="序号" type="index" width="70px" />
<el-table-column label="主键id" align="center" prop="id" width="150px"/>
<el-table-column label="业务id" align="center" prop="businessId" width="150px"/>
<el-table-column label="业务类型(0客户 1供应商 2服务商)" align="center" prop="businessType" width="150px"/>
<el-table-column label="转移前用户id" align="center" prop="userId1" width="150px"/>
<el-table-column label="转移后用户id" align="center" prop="userId2" width="150px"/>
<el-table-column label="转移数据类型(0商机1订单2财务3费用4发票)" align="center" prop="transferType" width="150px"/>
<el-table-column label="备注" align="center" prop="remark" width="150px"/>
<el-table-column
label="创建时间"
align="center"
prop="createTime"
:formatter="dateFormatter"
width="150px"
/>
<el-table-column label="操作" align="center" width="150px">
<template #default="scope">
<el-button
link
type="primary"
@click="openForm('update', scope.row.id)"
v-hasPermi="['xxjj:subject-transfer:update']"
>
编辑
</el-button>
<el-button
link
type="danger"
@click="handleDelete(scope.row.id)"
v-hasPermi="['xxjj:subject-transfer:delete']"
>
删除
</el-button>
</template>
</el-table-column>
</el-table>
<!-- 分页 -->
<Pagination
:total="total"
v-model:page="queryParams.pageNo"
v-model:limit="queryParams.pageSize"
@pagination="getList"
/>
</ContentWrap>
<!-- 表单弹窗添加/修改 -->
<SubjectTransferForm ref="formRef" @success="getList" />
</template>
<script setup lang="ts" name="SubjectTransfer">
import { dateFormatter } from '@/utils/formatTime'
import download from '@/utils/download'
import * as SubjectTransferApi from '@/api/xxjj/subjectTransfer'
import SubjectTransferForm from './SubjectTransferForm.vue'
const message = useMessage() //
const { t } = useI18n() //
const loading = ref(true) //
const total = ref(0) //
const list = ref([]) //
const queryParams = reactive({
pageNo: 1,
pageSize: 10,
businessId: null,
businessType: null,
userId1: null,
userId2: null,
transferType: null,
remark: null,
createTime: []
})
const queryFormRef = ref() //
const exportLoading = ref(false) //
/** 查询列表 */
const getList = async () => {
loading.value = true
try {
const data = await SubjectTransferApi.getSubjectTransferPage(queryParams)
list.value = data.list
total.value = data.total
} finally {
loading.value = false
}
}
/** 搜索按钮操作 */
const handleQuery = () => {
queryParams.pageNo = 1
getList()
}
/** 重置按钮操作 */
const resetQuery = () => {
queryFormRef.value.resetFields()
handleQuery()
}
/** 添加/修改操作 */
const formRef = ref()
const openForm = (type: string, id?: number) => {
formRef.value.open(type, id)
}
/** 删除按钮操作 */
const handleDelete = async (id: number) => {
try {
//
await message.delConfirm()
//
await SubjectTransferApi.deleteSubjectTransfer(id)
message.success(t('common.delSuccess'))
//
await getList()
} catch {}
}
/** 导出按钮操作 */
const handleExport = async () => {
try {
//
await message.exportConfirm()
//
exportLoading.value = true
const data = await SubjectTransferApi.exportSubjectTransfer(queryParams)
download.excel(data, '主体负责人转移.xls')
} catch {
} finally {
exportLoading.value = false
}
}
/** 初始化 **/
onMounted(() => {
getList()
})
</script>
Loading…
Cancel
Save