From 1492ffd32e43d0294cc6ac9a4f4389cd50d91fe9 Mon Sep 17 00:00:00 2001
From: liyong <18434998025@163.com>
Date: 星期四, 07 五月 2026 16:38:00 +0800
Subject: [PATCH] feat(basic): 添加客户联系人管理功能

---
 src/main/java/com/ruoyi/basic/dto/CustomerContactDto.java                  |   15 ++
 src/main/java/com/ruoyi/basic/pojo/CustomerContact.java                    |  105 +++++++++++++++++
 src/main/java/com/ruoyi/basic/controller/CustomerContactController.java    |   64 ++++++++++
 src/main/java/com/ruoyi/basic/mapper/CustomerContactMapper.java            |   23 +++
 src/main/java/com/ruoyi/basic/service/impl/CustomerContactServiceImpl.java |   84 ++++++++++++++
 src/main/java/com/ruoyi/basic/service/CustomerContactService.java          |   26 ++++
 src/main/resources/mapper/basic/CustomerContactMapper.xml                  |   38 ++++++
 7 files changed, 355 insertions(+), 0 deletions(-)

diff --git a/src/main/java/com/ruoyi/basic/controller/CustomerContactController.java b/src/main/java/com/ruoyi/basic/controller/CustomerContactController.java
new file mode 100644
index 0000000..e5e8ce9
--- /dev/null
+++ b/src/main/java/com/ruoyi/basic/controller/CustomerContactController.java
@@ -0,0 +1,64 @@
+package com.ruoyi.basic.controller;
+
+import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
+import com.ruoyi.basic.dto.CustomerContactDto;
+import com.ruoyi.basic.service.CustomerContactService;
+import com.ruoyi.framework.web.domain.R;
+import io.swagger.v3.oas.annotations.Operation;
+import io.swagger.v3.oas.annotations.tags.Tag;
+import lombok.AllArgsConstructor;
+import org.springframework.web.bind.annotation.*;
+
+/**
+ * <p>
+ * 瀹㈡埛鑱旂郴浜鸿〃 鍓嶇鎺у埗鍣�
+ * </p>
+ *
+ * @author 鑺杞欢锛堟睙鑻忥級鏈夐檺鍏徃
+ * @since 2026-05-07 03:46:40
+ */
+@RestController
+@RequestMapping("/customerContact")
+@AllArgsConstructor
+@Tag(name = "瀹㈡埛鑱旂郴浜鸿〃")
+public class CustomerContactController {
+
+    private final CustomerContactService customerContactService;
+
+    /**
+     * 鍒嗛〉鏌ヨ
+     * @param page
+     * @param customerContact
+     * @return
+     */
+    @GetMapping("/listPage")
+    @Operation(summary = "鍒嗛〉鏌ヨ")
+    public R listPage(Page<CustomerContactDto> page, CustomerContactDto customerContact) {
+        return R.ok(customerContactService.listPage(page, customerContact));
+    }
+
+
+    @PostMapping("/add")
+    @Operation(summary = "娣诲姞")
+    public R add(@RequestBody CustomerContactDto customerContact) {
+        return R.ok(customerContactService.add(customerContact));
+    }
+
+    @PutMapping("update")
+    @Operation(summary = "淇敼")
+    public R update(@RequestBody CustomerContactDto customerContact) {
+        return R.ok(customerContactService.updateCustomerContact(customerContact));
+    }
+
+    @GetMapping("/getById/{id}")
+    @Operation(summary = "閫氳繃id鏌ヨ")
+    public R getById(@PathVariable("id") Long id) {
+        return R.ok(customerContactService.getCustomerContactDtoById(id));
+    }
+
+    @DeleteMapping("/delete")
+    @Operation(summary = "鍒犻櫎")
+    public R delete(@RequestBody CustomerContactDto customerContact) {
+        return R.ok(customerContactService.removeById(customerContact));
+    }
+}
diff --git a/src/main/java/com/ruoyi/basic/dto/CustomerContactDto.java b/src/main/java/com/ruoyi/basic/dto/CustomerContactDto.java
new file mode 100644
index 0000000..0244372
--- /dev/null
+++ b/src/main/java/com/ruoyi/basic/dto/CustomerContactDto.java
@@ -0,0 +1,15 @@
+package com.ruoyi.basic.dto;
+
+import com.ruoyi.basic.pojo.CustomerContact;
+import lombok.Data;
+
+import java.util.List;
+
+@Data
+public class CustomerContactDto extends CustomerContact {
+
+    private String customerNames;
+
+    private List<Long> customerIdList;
+
+}
diff --git a/src/main/java/com/ruoyi/basic/mapper/CustomerContactMapper.java b/src/main/java/com/ruoyi/basic/mapper/CustomerContactMapper.java
new file mode 100644
index 0000000..8e376a4
--- /dev/null
+++ b/src/main/java/com/ruoyi/basic/mapper/CustomerContactMapper.java
@@ -0,0 +1,23 @@
+package com.ruoyi.basic.mapper;
+
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+import com.baomidou.mybatisplus.core.metadata.IPage;
+import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
+import com.ruoyi.basic.dto.CustomerContactDto;
+import com.ruoyi.basic.pojo.CustomerContact;
+import org.apache.ibatis.annotations.Mapper;
+import org.apache.ibatis.annotations.Param;
+
+/**
+ * <p>
+ * 瀹㈡埛鑱旂郴浜鸿〃 Mapper 鎺ュ彛
+ * </p>
+ *
+ * @author 鑺杞欢锛堟睙鑻忥級鏈夐檺鍏徃
+ * @since 2026-05-07 03:46:40
+ */
+@Mapper
+public interface CustomerContactMapper extends BaseMapper<CustomerContact> {
+
+    IPage<CustomerContactDto> listPage(Page<CustomerContactDto> page, @Param("customerContactDto") CustomerContactDto customerContactDto);
+}
diff --git a/src/main/java/com/ruoyi/basic/pojo/CustomerContact.java b/src/main/java/com/ruoyi/basic/pojo/CustomerContact.java
new file mode 100644
index 0000000..1edc1ab
--- /dev/null
+++ b/src/main/java/com/ruoyi/basic/pojo/CustomerContact.java
@@ -0,0 +1,105 @@
+package com.ruoyi.basic.pojo;
+
+import com.baomidou.mybatisplus.annotation.FieldFill;
+import com.baomidou.mybatisplus.annotation.IdType;
+import com.baomidou.mybatisplus.annotation.TableField;
+import com.baomidou.mybatisplus.annotation.TableId;
+import com.baomidou.mybatisplus.annotation.TableName;
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Getter;
+import lombok.Setter;
+import lombok.ToString;
+
+import java.io.Serializable;
+import java.time.LocalDateTime;
+
+/**
+ * <p>
+ * 瀹㈡埛鑱旂郴浜鸿〃
+ * </p>
+ *
+ * @author 鑺杞欢锛堟睙鑻忥級鏈夐檺鍏徃
+ * @since 2026-05-07 03:46:40
+ */
+@Getter
+@Setter
+@ToString
+@TableName("customer_contact")
+@ApiModel(value = "CustomerContact瀵硅薄", description = "瀹㈡埛鑱旂郴浜鸿〃")
+public class  CustomerContact implements Serializable {
+
+    private static final long serialVersionUID = 1L;
+
+    /**
+     * 涓婚敭ID
+     */
+    @ApiModelProperty("涓婚敭ID")
+    @TableId(value = "id", type = IdType.AUTO)
+    private Long id;
+
+    /**
+     * 鑱旂郴浜哄悕绉�
+     */
+    @ApiModelProperty("鑱旂郴浜哄悕绉�")
+    private String contactName;
+
+    /**
+     * 鐢佃瘽
+     */
+    @ApiModelProperty("鐢佃瘽")
+    private String phone;
+
+    /**
+     * 鍏宠仈瀹㈡埛淇℃伅琛↖D
+     */
+    @ApiModelProperty("鍏宠仈瀹㈡埛淇℃伅琛↖D")
+    private String customerId;
+
+    /**
+     * 閮ㄩ棬ID
+     */
+    @ApiModelProperty("閮ㄩ棬ID")
+    @TableField(fill = FieldFill.INSERT)
+    private Long deptId;
+
+    /**
+     * 鍒涘缓浜�
+     */
+    @ApiModelProperty("鍒涘缓浜�")
+    @TableField(fill = FieldFill.INSERT)
+    private Long createUser;
+
+    /**
+     * 鍒涘缓鏃堕棿
+     */
+    @ApiModelProperty("鍒涘缓鏃堕棿")
+    @TableField(fill = FieldFill.INSERT)
+    private LocalDateTime createTime;
+
+    /**
+     * 鏇存柊浜�
+     */
+    @ApiModelProperty("鏇存柊浜�")
+    @TableField(fill = FieldFill.INSERT_UPDATE)
+    private Long updateUser;
+
+    /**
+     * 鏇存柊鏃堕棿
+     */
+    @ApiModelProperty("鏇存柊鏃堕棿")
+    @TableField(fill = FieldFill.INSERT_UPDATE)
+    private LocalDateTime updateTime;
+
+    /**
+     * 澶囨敞
+     */
+    @ApiModelProperty("澶囨敞")
+    private String remark;
+
+    /**
+     * 鍒犻櫎鏍囧織锛�0浠h〃瀛樺湪 2浠h〃鍒犻櫎锛�
+     */
+    @ApiModelProperty("鍒犻櫎鏍囧織锛�0浠h〃瀛樺湪 2浠h〃鍒犻櫎锛�")
+    private String delFlag;
+}
diff --git a/src/main/java/com/ruoyi/basic/service/CustomerContactService.java b/src/main/java/com/ruoyi/basic/service/CustomerContactService.java
new file mode 100644
index 0000000..aa71f50
--- /dev/null
+++ b/src/main/java/com/ruoyi/basic/service/CustomerContactService.java
@@ -0,0 +1,26 @@
+package com.ruoyi.basic.service;
+
+import com.baomidou.mybatisplus.core.metadata.IPage;
+import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
+import com.ruoyi.basic.dto.CustomerContactDto;
+import com.ruoyi.basic.pojo.CustomerContact;
+import com.baomidou.mybatisplus.extension.service.IService;
+
+/**
+ * <p>
+ * 瀹㈡埛鑱旂郴浜鸿〃 鏈嶅姟绫�
+ * </p>
+ *
+ * @author 鑺杞欢锛堟睙鑻忥級鏈夐檺鍏徃
+ * @since 2026-05-07 03:46:40
+ */
+public interface CustomerContactService extends IService<CustomerContact> {
+
+    IPage<CustomerContactDto> listPage(Page<CustomerContactDto> page, CustomerContactDto customerContact);
+
+    Boolean add(CustomerContactDto customerContact);
+
+    Boolean updateCustomerContact(CustomerContactDto customerContact);
+
+    CustomerContactDto getCustomerContactDtoById(Long id);
+}
diff --git a/src/main/java/com/ruoyi/basic/service/impl/CustomerContactServiceImpl.java b/src/main/java/com/ruoyi/basic/service/impl/CustomerContactServiceImpl.java
new file mode 100644
index 0000000..281b214
--- /dev/null
+++ b/src/main/java/com/ruoyi/basic/service/impl/CustomerContactServiceImpl.java
@@ -0,0 +1,84 @@
+package com.ruoyi.basic.service.impl;
+
+import com.baomidou.mybatisplus.core.metadata.IPage;
+import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
+import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
+import com.ruoyi.basic.dto.CustomerContactDto;
+import com.ruoyi.basic.mapper.CustomerContactMapper;
+import com.ruoyi.basic.pojo.CustomerContact;
+import com.ruoyi.basic.service.CustomerContactService;
+import com.ruoyi.common.utils.bean.BeanUtils;
+import lombok.RequiredArgsConstructor;
+import org.springframework.stereotype.Service;
+
+import java.util.ArrayList;
+import java.util.Arrays;
+import java.util.List;
+import java.util.Objects;
+import java.util.stream.Collectors;
+
+/**
+ * <p>
+ * 瀹㈡埛鑱旂郴浜鸿〃 鏈嶅姟瀹炵幇绫�
+ * </p>
+ *
+ * @author 鑺杞欢锛堟睙鑻忥級鏈夐檺鍏徃
+ * @since 2026-05-07 03:46:40
+ */
+@Service
+@RequiredArgsConstructor
+public class CustomerContactServiceImpl extends ServiceImpl<CustomerContactMapper, CustomerContact> implements CustomerContactService {
+
+    private final CustomerContactMapper customerContactMapper;
+    @Override
+    public IPage<CustomerContactDto> listPage(Page<CustomerContactDto> page, CustomerContactDto customerContactDto) {
+        return customerContactMapper.listPage(page,customerContactDto);
+    }
+
+    @Override
+    public Boolean add(CustomerContactDto customerContact) {
+        List<Long> idList = customerContact.getCustomerIdList();
+        if (idList != null && !idList.isEmpty()) {
+            String result = idList.stream()
+                    .filter(Objects::nonNull)
+                    .distinct()
+                    .map(String::valueOf) // 灏� Long 杞崲涓� String
+                    .collect(Collectors.joining(","));
+            customerContact.setCustomerId(result);
+    }
+        return save(customerContact);
+
+    }
+
+    @Override
+    public Boolean updateCustomerContact(CustomerContactDto customerContact) {
+        List<Long> idList = customerContact.getCustomerIdList();
+        if (idList != null && !idList.isEmpty()) {
+            String result = idList.stream()
+                    .filter(Objects::nonNull)
+                    .distinct()
+                    .map(String::valueOf) // 灏� Long 杞崲涓� String
+                    .collect(Collectors.joining(","));
+            customerContact.setCustomerId(result);
+        }
+        return updateById(customerContact);
+    }
+
+    @Override
+    public CustomerContactDto getCustomerContactDtoById(Long id) {
+        CustomerContact byId = getById(id);
+        CustomerContactDto customerContactDto = new CustomerContactDto();
+        BeanUtils.copyProperties(byId, customerContactDto);
+        if (byId != null && byId.getCustomerId() != null && !byId.getCustomerId().isEmpty()) {
+            List<Long> idList = Arrays.stream(byId.getCustomerId().split(","))
+                    .map(String::trim) // 鍘婚櫎鍙兘鐨勭┖鏍�
+                    .filter(s -> !s.isEmpty()) // 杩囨护绌哄瓧绗︿覆
+                    .map(Long::parseLong) // 杞崲涓� Long
+                    .collect(Collectors.toList());
+            customerContactDto.setCustomerIdList(idList);
+        } else {
+            customerContactDto.setCustomerIdList(new ArrayList<>());
+        }
+        return customerContactDto;
+    }
+}
diff --git a/src/main/resources/mapper/basic/CustomerContactMapper.xml b/src/main/resources/mapper/basic/CustomerContactMapper.xml
new file mode 100644
index 0000000..1c2f582
--- /dev/null
+++ b/src/main/resources/mapper/basic/CustomerContactMapper.xml
@@ -0,0 +1,38 @@
+<?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.ruoyi.basic.mapper.CustomerContactMapper">
+
+    <!-- 閫氱敤鏌ヨ鏄犲皠缁撴灉 -->
+    <resultMap id="BaseResultMap" type="com.ruoyi.basic.pojo.CustomerContact">
+        <id column="id" property="id" />
+        <result column="contact_name" property="contactName" />
+        <result column="phone" property="phone" />
+        <result column="customer_id" property="customerId" />
+        <result column="dept_id" property="deptId" />
+        <result column="create_user" property="createUser" />
+        <result column="create_time" property="createTime" />
+        <result column="update_user" property="updateUser" />
+        <result column="update_time" property="updateTime" />
+        <result column="remark" property="remark" />
+        <result column="del_flag" property="delFlag" />
+    </resultMap>
+    <select id="listPage" resultType="com.ruoyi.basic.dto.CustomerContactDto">
+        SELECT
+        cc.*,
+        (
+        SELECT GROUP_CONCAT(ci.customer_name SEPARATOR ',')
+        FROM customer ci
+        WHERE FIND_IN_SET(ci.id, cc.customer_id)
+        ) AS customer_names
+        FROM customer_contact cc
+        <where>
+            cc.del_flag = 0
+            <if test="customerContactDto.contactName != null and customerContactDto.contactName !=''">
+                and cc.contact_name = #{customerContactDto.contactName}
+            </if>
+            <if test="customerContactDto.phone != null and customerContactDto.phone !=''">
+                and cc.phone = #{customerContactDto.phone}
+            </if>
+        </where>
+    </select>
+</mapper>

--
Gitblit v1.9.3