diff --git a/app/adminapi/controller/custom/CustomController.php b/app/adminapi/controller/custom/CustomController.php
index 7bfdf305c..21ecc80ed 100644
--- a/app/adminapi/controller/custom/CustomController.php
+++ b/app/adminapi/controller/custom/CustomController.php
@@ -52,7 +52,7 @@ class CustomController extends BaseAdminController
     public function add()
     {
         $params = (new CustomValidate())->post()->goCheck('add');
-        $result = CustomLogic::add($params);
+        $result = CustomLogic::add($params,$this->adminId);
         if (true === $result) {
             return $this->success('添加成功', [], 1, 1);
         }
diff --git a/app/adminapi/controller/custom_follow/CustomFollowController.php b/app/adminapi/controller/custom/CustomFollowController.php
similarity index 89%
rename from app/adminapi/controller/custom_follow/CustomFollowController.php
rename to app/adminapi/controller/custom/CustomFollowController.php
index 2b542ee7a..9989effaa 100644
--- a/app/adminapi/controller/custom_follow/CustomFollowController.php
+++ b/app/adminapi/controller/custom/CustomFollowController.php
@@ -13,13 +13,13 @@
 // +----------------------------------------------------------------------
 
 
-namespace app\adminapi\controller\custom_follow;
+namespace app\adminapi\controller\custom;
 
 
 use app\adminapi\controller\BaseAdminController;
-use app\adminapi\lists\custom_follow\CustomFollowLists;
-use app\adminapi\logic\custom_follow\CustomFollowLogic;
-use app\adminapi\validate\custom_follow\CustomFollowValidate;
+use app\adminapi\lists\custom\CustomFollowLists;
+use app\adminapi\logic\custom\CustomFollowLogic;
+use app\adminapi\validate\custom\CustomFollowValidate;
 
 
 /**
@@ -52,7 +52,7 @@ class CustomFollowController extends BaseAdminController
     public function add()
     {
         $params = (new CustomFollowValidate())->post()->goCheck('add');
-        $result = CustomFollowLogic::add($params);
+        $result = CustomFollowLogic::add($params,$this->adminId);
         if (true === $result) {
             return $this->success('添加成功', [], 1, 1);
         }
@@ -69,7 +69,7 @@ class CustomFollowController extends BaseAdminController
     public function edit()
     {
         $params = (new CustomFollowValidate())->post()->goCheck('edit');
-        $result = CustomFollowLogic::edit($params);
+        $result = CustomFollowLogic::edit($params,$this->adminId);
         if (true === $result) {
             return $this->success('编辑成功', [], 1, 1);
         }
diff --git a/app/adminapi/lists/custom/CustomContactsLists.php b/app/adminapi/lists/custom/CustomContactsLists.php
index 626e17ab9..741533d2b 100644
--- a/app/adminapi/lists/custom/CustomContactsLists.php
+++ b/app/adminapi/lists/custom/CustomContactsLists.php
@@ -16,8 +16,11 @@ namespace app\adminapi\lists\custom;
 
 
 use app\adminapi\lists\BaseAdminDataLists;
+use app\common\model\custom\Custom;
 use app\common\model\custom\CustomContacts;
 use app\common\lists\ListsSearchInterface;
+use app\common\model\dept\Dept;
+use app\common\model\dept\Orgs;
 
 
 /**
@@ -38,7 +41,7 @@ class CustomContactsLists extends BaseAdminDataLists implements ListsSearchInter
     public function setSearch(): array
     {
         return [
-            '=' => ['custom_id', 'name', 'position', 'phone', 'telephone', 'email', 'notes', 'annex'],
+            '%like%' => ['name', 'position', 'phone', 'telephone', 'email'],
         ];
     }
 
@@ -54,11 +57,18 @@ class CustomContactsLists extends BaseAdminDataLists implements ListsSearchInter
      */
     public function lists(): array
     {
-        return CustomContacts::where($this->searchWhere)
-            ->field(['*'])
+        return CustomContacts::field('id,custom_id,name,position,phone,telephone,email,notes,annex')->where($this->searchWhere)
             ->limit($this->limitOffset, $this->limitLength)
             ->order(['id' => 'desc'])
-            ->select()
+            ->select()->each(function($item){
+				$custom = Custom::field('org_id,dept_id')->where('id',$item['custom_id'])->findOrEmpty();
+				$org = Orgs::field('name')->where('id',$custom['org_id'])->findOrEmpty();
+				$dept = Dept::field('name')->where('id',$custom['dept_id'])->findOrEmpty();
+				$item['org_name'] = $org['name'];
+				$item['dept_name'] = $dept['name'];
+				unset($item['custom_id']);
+				return $item;
+	        })
             ->toArray();
     }
 
diff --git a/app/adminapi/lists/custom_follow/CustomFollowLists.php b/app/adminapi/lists/custom/CustomFollowLists.php
similarity index 62%
rename from app/adminapi/lists/custom_follow/CustomFollowLists.php
rename to app/adminapi/lists/custom/CustomFollowLists.php
index f3a38e208..371cf047c 100644
--- a/app/adminapi/lists/custom_follow/CustomFollowLists.php
+++ b/app/adminapi/lists/custom/CustomFollowLists.php
@@ -12,13 +12,14 @@
 // | author: likeadminTeam
 // +----------------------------------------------------------------------
 
-namespace app\adminapi\lists\custom_follow;
+namespace app\adminapi\lists\custom;
 
 
 use app\adminapi\lists\BaseAdminDataLists;
-use app\common\model\custom\Custom;
-use app\common\model\custom_follow\CustomFollow;
 use app\common\lists\ListsSearchInterface;
+use app\common\model\auth\Admin;
+use app\common\model\custom\Custom;
+use app\common\model\custom\CustomFollow;
 
 
 /**
@@ -39,7 +40,8 @@ class CustomFollowLists extends BaseAdminDataLists implements ListsSearchInterfa
     public function setSearch(): array
     {
         return [
-            '=' => ['custom_id', 'contacts', 'date', 'types', 'admin_id', 'description', 'annex', 'coordinate', 'next_follow_date', 'status'],
+            '%like%' => ['name', 'contacts', 'executor'],
+	        '=' => ['types']
         ];
     }
 
@@ -55,13 +57,23 @@ class CustomFollowLists extends BaseAdminDataLists implements ListsSearchInterfa
      */
     public function lists(): array
     {
-        return CustomFollow::where($this->searchWhere)
-            ->field(['*'])
+		$params = $this->request->get();
+		$where = [];
+		if(isset($params['custom_name']) && $params['custom_name'] != ''){
+			$custom_ids = Custom::where('name','like','%'.$params['custom_name'].'%')->column('id');
+			$where[] = ['custom_id','in',$custom_ids];
+		}
+        return CustomFollow::field('id,custom_id,name,contacts,date,types,executor,description,coordinate,next_follow_date,add_user,update_user,create_time,update_time')
+	        ->where($this->searchWhere)->where($where)
             ->limit($this->limitOffset, $this->limitLength)
             ->order(['id' => 'desc'])
             ->select()->each(function($item){
+				$item['types_text'] = $item->types_text;
 				$custom = Custom::field('name')->where('id',$item['custom_id'])->findOrEmpty();
+				$admin = Admin::where('id','in',[$item['add_user'],$item['update_user']])->column('name','id');
 				$item['custom_name'] = $custom['name'];
+				$item['add_user'] = $admin[$item['add_user']];
+		        $item['update_user'] = $admin[$item['update_user']];
 				return $item;
 	        })
             ->toArray();
@@ -76,7 +88,13 @@ class CustomFollowLists extends BaseAdminDataLists implements ListsSearchInterfa
      */
     public function count(): int
     {
-        return CustomFollow::where($this->searchWhere)->count();
+	    $params = $this->request->get();
+	    $where = [];
+	    if(isset($params['custom_name']) && $params['custom_name'] != ''){
+		    $custom_ids = Custom::where('name','like','%'.$params['custom_name'].'%')->column('id');
+		    $where[] = ['custom_id','in',$custom_ids];
+	    }
+        return CustomFollow::where($this->searchWhere)->where($where)->count();
     }
 
 }
\ No newline at end of file
diff --git a/app/adminapi/lists/custom/CustomLists.php b/app/adminapi/lists/custom/CustomLists.php
index 38f82d90a..d426246bb 100644
--- a/app/adminapi/lists/custom/CustomLists.php
+++ b/app/adminapi/lists/custom/CustomLists.php
@@ -16,10 +16,10 @@ namespace app\adminapi\lists\custom;
 
 
 use app\adminapi\lists\BaseAdminDataLists;
-use app\common\model\custom\Custom;
-use app\common\model\custom_follow\CustomFollow;
 use app\common\lists\ListsSearchInterface;
-use think\facade\Db;
+use app\common\model\auth\Admin;
+use app\common\model\custom\Custom;
+use app\common\model\GeoProvince;
 
 /**
  * Custom列表
@@ -39,7 +39,8 @@ class CustomLists extends BaseAdminDataLists implements ListsSearchInterface
     public function setSearch(): array
     {
         return [
-            '=' => ['c.org_id', 'c.dept_id', 'c.name', 'c.custom_type', 'c.phone', 'c.credit_rating', 'c.province', 'c.city', 'c.status'],
+            '=' => ['custom_type', 'phone', 'province'],
+	        '%like%' => ['name','master_name']
         ];
     }
 
@@ -55,43 +56,56 @@ class CustomLists extends BaseAdminDataLists implements ListsSearchInterface
      */
     public function lists(): array
     {
-        return Db::name('Custom')->alias('c')
-            ->where($this->searchWhere)
-            ->whereNull('c.delete_time')
-            ->leftJoin('orgs o','o.id = c.org_id')
-            ->leftJoin('dept d','d.id = c.dept_id')
-            ->field('c.*, d.name as dept_name, o.name as org_name')
-            ->limit($this->limitOffset, $this->limitLength)
-            ->order(['c.id' => 'desc'])
-            ->select()->each(function($item, $key){
-                //关联数据后续添加
-                if (!empty($item['other_contacts'])) {
-                    $otherContactsArray = json_decode($item['other_contacts'], true);
-                    if (is_array($otherContactsArray)) {
-                        $item['other_contacts'] = $otherContactsArray;
-                    }
-                }
-                $item['last_follow_date'] = '-';
-                $item['next_follow_date'] = '-';
-                $customFollow = CustomFollow::where('custom_id', $item['id'])->order('id', 'desc')->limit(1)->findOrEmpty();
-                if (!$customFollow->isEmpty()) {
-                    $interval = date_diff(date_create($customFollow['date']), date_create(date('Y-m-d H:i:s')));
-                    if ($interval->days <= 3) {
-                        $item['last_follow_date'] = $interval->days . '天内';
-                    } else if ($interval->days <= 7) {
-                        $item['last_follow_date'] = '1周内';
-                    } else if ($interval->days <= 30) {
-                        $item['last_follow_date'] = '30天内';
-                    } else if ($interval->days <= 60) {
-                        $item['last_follow_date'] = '60天内';
-                    } else {
-                        $item['last_follow_date'] = '超过60天内';
-                    }
-                    $item['next_follow_date'] = $customFollow['next_follow_date'];
-                }      
-                return $item;
-            })
-            ->toArray();
+//        return Db::name('Custom')->alias('c')
+//            ->where($this->searchWhere)
+//            ->whereNull('c.delete_time')
+//            ->leftJoin('orgs o','o.id = c.org_id')
+//            ->leftJoin('dept d','d.id = c.dept_id')
+//            ->field('c.*, d.name as dept_name, o.name as org_name')
+//            ->limit($this->limitOffset, $this->limitLength)
+//            ->order(['c.id' => 'desc'])
+//            ->select()->each(function($item, $key){
+//                //关联数据后续添加
+//                if (!empty($item['other_contacts'])) {
+//                    $otherContactsArray = json_decode($item['other_contacts'], true);
+//                    if (is_array($otherContactsArray)) {
+//                        $item['other_contacts'] = $otherContactsArray;
+//                    }
+//                }
+//                $item['last_follow_date'] = '-';
+//                $item['next_follow_date'] = '-';
+//                $customFollow = CustomFollow::where('custom_id', $item['id'])->order('id', 'desc')->limit(1)->findOrEmpty();
+//                if (!$customFollow->isEmpty()) {
+//                    $interval = date_diff(date_create($customFollow['date']), date_create(date('Y-m-d H:i:s')));
+//                    if ($interval->days <= 3) {
+//                        $item['last_follow_date'] = $interval->days . '天内';
+//                    } else if ($interval->days <= 7) {
+//                        $item['last_follow_date'] = '1周内';
+//                    } else if ($interval->days <= 30) {
+//                        $item['last_follow_date'] = '30天内';
+//                    } else if ($interval->days <= 60) {
+//                        $item['last_follow_date'] = '60天内';
+//                    } else {
+//                        $item['last_follow_date'] = '超过60天内';
+//                    }
+//                    $item['next_follow_date'] = $customFollow['next_follow_date'];
+//                }
+//                return $item;
+//            })
+//            ->toArray();
+	    return Custom::field('id,name,custom_type,province,master_name,master_position,master_telephone,master_phone,notes,add_user,create_time')
+			    ->where($this->searchWhere)->limit($this->limitOffset, $this->limitLength)
+			    ->order(['id' => 'desc'])
+			    ->select()->each(function($item){
+			        $item['custom_type_text'] = $item->custom_type_text;
+					$admin = Admin::field('id,name')->where('id',$item['add_user'])->findOrEmpty();
+					$province = GeoProvince::field('province_name')->where('province_code',$item['province'])->findOrEmpty();
+					$item['add_user_name'] = $admin['name'];
+			        $item['province_name'] = $province['province_name'];
+					unset($item['province'],$item['add_user']);
+					return $item;
+			    })
+			    ->toArray();
     }
 
 
@@ -103,11 +117,7 @@ class CustomLists extends BaseAdminDataLists implements ListsSearchInterface
      */
     public function count(): int
     {
-        return Db::name('Custom')->alias('c')
-        ->where($this->searchWhere)
-        ->whereNull('c.delete_time')
-        ->leftJoin('orgs o','o.id = c.org_id')
-        ->leftJoin('dept d','d.id = c.dept_id')->count();
+        return Custom::where($this->searchWhere)->count();
     }
 
 }
\ No newline at end of file
diff --git a/app/adminapi/logic/custom/CustomContactsLogic.php b/app/adminapi/logic/custom/CustomContactsLogic.php
index cf9841a9f..aad1e567f 100644
--- a/app/adminapi/logic/custom/CustomContactsLogic.php
+++ b/app/adminapi/logic/custom/CustomContactsLogic.php
@@ -15,6 +15,7 @@
 namespace app\adminapi\logic\custom;
 
 
+use app\common\model\custom\Custom;
 use app\common\model\custom\CustomContacts;
 use app\common\logic\BaseLogic;
 use think\facade\Db;
@@ -41,16 +42,15 @@ class CustomContactsLogic extends BaseLogic
         Db::startTrans();
         try {
             CustomContacts::create([
-                'custom_id' => $params['custom_id'] ?? 0,
-                'name' => $params['name'] ?? '',
+                'custom_id' => $params['custom_id'],
+                'name' => $params['name'],
                 'position' => $params['position'] ?? '',
                 'phone' => $params['phone'] ?? '',
                 'telephone' => $params['telephone'] ?? '',
                 'email' => $params['email'] ?? '',
                 'notes' => $params['notes'] ?? '',
-                'annex' => $params['annex'] ?? '',
+                'annex' => $params['annex'] ?? null,
             ]);
-
             Db::commit();
             return true;
         } catch (\Exception $e) {
@@ -72,17 +72,17 @@ class CustomContactsLogic extends BaseLogic
     {
         Db::startTrans();
         try {
+			$data = CustomContacts::field('annex')->where('id',$params['id'])->findOrEmpty();
             CustomContacts::where('id', $params['id'])->update([
-                'custom_id' => $params['custom_id'] ?? 0,
-                'name' => $params['name'] ?? '',
+                'custom_id' => $params['custom_id'],
+                'name' => $params['name'],
                 'position' => $params['position'] ?? '',
                 'phone' => $params['phone'] ?? '',
                 'telephone' => $params['telephone'] ?? '',
                 'email' => $params['email'] ?? '',
                 'notes' => $params['notes'] ?? '',
-                'annex' => $params['annex'] ?? '',
+                'annex' => $params['annex'] ?? $data['annex'],
             ]);
-
             Db::commit();
             return true;
         } catch (\Exception $e) {
@@ -115,9 +115,9 @@ class CustomContactsLogic extends BaseLogic
      */
     public static function detail($params): array
     {
-        $customContacts = CustomContacts::findOrEmpty($params['id']);
-        $customContacts->custom = $customContacts->custom;
-        $customContacts->annex = json_decode($customContacts->annex, true);
-        return $customContacts->toArray();
+        $data = CustomContacts::field('id,custom_id,name,position,phone,telephone,email,notes,annex')->findOrEmpty($params['id'])->toArray();
+		$custom = Custom::field('name')->where('id',$data['custom_id'])->findOrEmpty();
+		$data['custom_name'] = $custom['name'];
+        return $data;
     }
 }
\ No newline at end of file
diff --git a/app/adminapi/logic/custom_follow/CustomFollowLogic.php b/app/adminapi/logic/custom/CustomFollowLogic.php
similarity index 62%
rename from app/adminapi/logic/custom_follow/CustomFollowLogic.php
rename to app/adminapi/logic/custom/CustomFollowLogic.php
index c5d721620..9c6c48fc8 100644
--- a/app/adminapi/logic/custom_follow/CustomFollowLogic.php
+++ b/app/adminapi/logic/custom/CustomFollowLogic.php
@@ -12,11 +12,12 @@
 // | author: likeadminTeam
 // +----------------------------------------------------------------------
 
-namespace app\adminapi\logic\custom_follow;
+namespace app\adminapi\logic\custom;
 
 
-use app\common\model\custom_follow\CustomFollow;
 use app\common\logic\BaseLogic;
+use app\common\model\custom\Custom;
+use app\common\model\custom\CustomFollow;
 use think\facade\Db;
 
 
@@ -36,23 +37,24 @@ class CustomFollowLogic extends BaseLogic
      * @author likeadmin
      * @date 2023/11/12 13:40
      */
-    public static function add(array $params): bool
+    public static function add(array $params,$admin_id): bool
     {
         Db::startTrans();
         try {
             CustomFollow::create([
-                'custom_id' => $params['custom_id'] ?? 0,
+                'custom_id' => $params['custom_id'],
+				'name' => $params['name'],
                 'contacts' => $params['contacts'] ?? '',
                 'date' => strtotime($params['date']),
-                'types' => $params['types'] ?? 0,
-                'admin_id' => $params['admin_id'] ?? 0,
+                'types' => $params['types'],
                 'description' => $params['description'] ?? '',
-                'annex' => $params['annex'] ?? '',
-                'coordinate' => $params['coordinate'] ?? 0,
+                'annex' => $params['annex'] ?? null,
+                'coordinate' => $params['coordinate'] ?? '',
+				'executor' => $params['executor'] ?? '',
                 'next_follow_date' => strtotime($params['next_follow_date']),
-                'status' => $params['status'] ?? 0
+	            'add_user' => $admin_id,
+	            'update_user' => $admin_id
             ]);
-
             Db::commit();
             return true;
         } catch (\Exception $e) {
@@ -70,23 +72,24 @@ class CustomFollowLogic extends BaseLogic
      * @author likeadmin
      * @date 2023/11/12 13:40
      */
-    public static function edit(array $params): bool
+    public static function edit(array $params,$admin_id): bool
     {
         Db::startTrans();
         try {
             CustomFollow::where('id', $params['id'])->update([
-                'custom_id' => $params['custom_id'] ?? 0,
-                'contacts' => $params['contacts'] ?? '',
-                'date' => strtotime($params['date']),
-                'types' => $params['types'] ?? 0,
-                'admin_id' => $params['admin_id'] ?? 0,
-                'description' => $params['description'] ?? '',
-                'annex' => $params['annex'] ?? '',
-                'coordinate' => $params['coordinate'] ?? 0,
-                'next_follow_date' => strtotime($params['next_follow_date']),
-                'status' => $params['status'] ?? 0
+	            'custom_id' => $params['custom_id'],
+	            'name' => $params['name'],
+	            'contacts' => $params['contacts'] ?? '',
+	            'date' => strtotime($params['date']),
+	            'types' => $params['types'],
+	            'description' => $params['description'] ?? '',
+	            'annex' => !empty($params['annex']) ? $params['annex'] :null,
+	            'coordinate' => $params['coordinate'] ?? '',
+	            'executor' => $params['executor'] ?? '',
+	            'next_follow_date' => strtotime($params['next_follow_date']),
+	            'update_user' => $admin_id,
+	            'update_time' => time()
             ]);
-
             Db::commit();
             return true;
         } catch (\Exception $e) {
@@ -119,9 +122,9 @@ class CustomFollowLogic extends BaseLogic
      */
     public static function detail($params): array
     {
-        $customFollow = CustomFollow::findOrEmpty($params['id']);
-        $customFollow->custom;
-        $customFollow->annex = json_decode($customFollow->annex, true);
-        return $customFollow->toArray();
+        $data = CustomFollow::field('id,custom_id,name,contacts,date,types,description,annex,coordinate,next_follow_date,executor')->findOrEmpty($params['id']);
+		$custom = Custom::field('name')->where('id',$data['custom_id'])->findOrEmpty();
+		$data['custom_name'] = $custom['name'];
+        return $data->toArray();
     }
 }
\ No newline at end of file
diff --git a/app/adminapi/logic/custom/CustomLogic.php b/app/adminapi/logic/custom/CustomLogic.php
index 24ba0f7a9..1f082bec5 100644
--- a/app/adminapi/logic/custom/CustomLogic.php
+++ b/app/adminapi/logic/custom/CustomLogic.php
@@ -17,6 +17,7 @@ namespace app\adminapi\logic\custom;
 
 use app\common\model\custom\Custom;
 use app\common\logic\BaseLogic;
+use app\common\model\custom\CustomContacts;
 use think\facade\Db;
 
 
@@ -36,24 +37,25 @@ class CustomLogic extends BaseLogic
      * @author likeadmin
      * @date 2023/11/11 22:10
      */
-    public static function add(array $params): bool
+    public static function add(array $params,$admin_id): bool
     {
         Db::startTrans();
         try {
-            Custom::create([
-                'org_id' => $params['org_id'] ?? 0,
-                'dept_id' => $params['dept_id'] ?? 0,
-                'name' => $params['name'] ?? '',
-                'custom_type' => $params['custom_type'] ?? 0,
-                'parent_company' => $params['parent_company'] ?? 0,
-                'phone' => $params['phone'] ?? '',
-                'credit_rating' => $params['credit_rating'] ?? 0,
+			$other_contacts = json_decode($params['other_contacts'],true);
+            $customRes = Custom::create([
+                'org_id' => $params['org_id'],
+                'dept_id' => $params['dept_id'],
+                'name' => $params['name'],
+                'custom_type' => $params['custom_type'],
+                'parent_company' => $params['parent_company'] ?? '',
+                'phone' => $params['phone'],
+                'credit_rating' => $params['credit_rating'],
                 'province' => $params['province'] ?? 0,
                 'city' => $params['city'] ?? 0,
                 'area' => $params['area'] ?? 0,
                 'address' => $params['address'] ?? '',
                 'notes' => $params['notes'] ?? '',
-                'master_name' => $params['master_name'] ?? '',
+                'master_name' => $params['master_name'],
                 'master_position' => $params['master_position'] ?? '',
                 'master_phone' => $params['master_phone'] ?? '',
                 'master_email' => $params['master_email'] ?? '',
@@ -65,10 +67,22 @@ class CustomLogic extends BaseLogic
                 'company_telephone' => $params['company_telephone'] ?? '',
                 'bank_name' => $params['bank_name'] ?? '',
                 'bank_account' => $params['bank_account'] ?? '',
-                'other_contacts' => json_encode($params['other_contacts']),
-                'status' => $params['status'] ?? 0,
+	            'add_user' => $admin_id,
             ]);
-
+			if(!empty($other_contacts)){
+				foreach($other_contacts as $v){
+					CustomContacts::create([
+						'custom_id' => $customRes->id,
+						'name' => $v['name'],
+						'position' => $v['position'] ?? '',
+						'phone' => $v['phone'] ?? '',
+						'telephone' => $v['telephone'] ?? '',
+						'email' => $v['email'] ?? '',
+						'notes' => $v['notes'] ?? '',
+						'annex' => !empty($v['annex']) ? json_encode($v['annex']) : null,
+					]);
+				}
+			}
             Db::commit();
             return true;
         } catch (\Exception $e) {
@@ -91,13 +105,13 @@ class CustomLogic extends BaseLogic
         Db::startTrans();
         try {
             Custom::where('id', $params['id'])->update([
-                'org_id' => $params['org_id'] ?? 0,
-                'dept_id' => $params['dept_id'] ?? 0,
-                'name' => $params['name'] ?? '',
-                'custom_type' => $params['custom_type'] ?? 0,
-                'parent_company' => $params['parent_company'] ?? 0,
-                'phone' => $params['phone'] ?? '',
-                'credit_rating' => $params['credit_rating'] ?? 0,
+                'org_id' => $params['org_id'],
+                'dept_id' => $params['dept_id'],
+                'name' => $params['name'],
+                'custom_type' => $params['custom_type'],
+                'parent_company' => $params['parent_company'] ?? '',
+                'phone' => $params['phone'],
+                'credit_rating' => $params['credit_rating'],
                 'province' => $params['province'] ?? 0,
                 'city' => $params['city'] ?? 0,
                 'area' => $params['area'] ?? 0,
@@ -115,10 +129,8 @@ class CustomLogic extends BaseLogic
                 'company_telephone' => $params['company_telephone'] ?? '',
                 'bank_name' => $params['bank_name'] ?? '',
                 'bank_account' => $params['bank_account'] ?? '',
-                'other_contacts' => json_encode($params['other_contacts']),
-                'status' => $params['status'] ?? 0,
+	            'update_time' => time(),
             ]);
-
             Db::commit();
             return true;
         } catch (\Exception $e) {
@@ -152,11 +164,11 @@ class CustomLogic extends BaseLogic
     public static function detail($params): array
     {
         $custom = Custom::findOrEmpty($params['id']);
-		$parent_company = $custom::field('name')->where('id',$custom['parent_company'])->findOrEmpty();
-		$custom['parent_company_name'] = $parent_company['name'];
-        $custom->org;
-        $custom->dept;
-        $custom->other_contacts = json_decode($custom->other_contacts, true);
+        $custom['org_name'] = $custom->org->name;
+        $custom['dept_name'] = $custom->dept->name;
+		$custom['custom_type_text'] = $custom->custom_type_text;
+	    $custom['credit_rating_text'] = $custom->credit_rating_text;
+		unset($custom['org'],$custom['dept']);
         return $custom->toArray();
     }
 }
\ No newline at end of file
diff --git a/app/adminapi/validate/custom/CustomContactsValidate.php b/app/adminapi/validate/custom/CustomContactsValidate.php
index 94de79230..ca96d92cc 100644
--- a/app/adminapi/validate/custom/CustomContactsValidate.php
+++ b/app/adminapi/validate/custom/CustomContactsValidate.php
@@ -15,6 +15,8 @@
 namespace app\adminapi\validate\custom;
 
 
+use app\common\model\custom\Custom;
+use app\common\model\custom\CustomContacts;
 use app\common\validate\BaseValidate;
 
 
@@ -32,18 +34,21 @@ class CustomContactsValidate extends BaseValidate
       */
     protected $rule = [
         'id' => 'require',
-        'custom_id' => 'require',
-    ];
-
-
-    /**
-     * 参数描述
-     * @var string[]
-     */
-    protected $field = [
-        'id' => 'id',
-        'custom_id' => 'custom_id',
+        'custom_id' => 'require|checkCustom',
+	    'name' => 'require',
+	    'phone' => 'mobile|unique:'.CustomContacts::class,
+	    'email' => 'email',
+	    'annex' => 'checkAnnex',
     ];
+	
+	protected $message = [
+		'id.require' => '缺少必要参数',
+		'custom_id.require' => '请选择客户',
+		'name.require' => '请填写姓名',
+		'phone.mobile' => '手机号码格式错误',
+		'phone.unique' => '手机号码已存在',
+		'email.email' => '邮箱格式错误',
+	];
 
 
     /**
@@ -54,7 +59,7 @@ class CustomContactsValidate extends BaseValidate
      */
     public function sceneAdd()
     {
-        return $this->only(['custom_id']);
+        return $this->remove('id',true);
     }
 
 
@@ -65,9 +70,7 @@ class CustomContactsValidate extends BaseValidate
      * @date 2023/11/11 22:56
      */
     public function sceneEdit()
-    {
-        return $this->only(['id','custom_id']);
-    }
+    {}
 
 
     /**
@@ -92,5 +95,25 @@ class CustomContactsValidate extends BaseValidate
     {
         return $this->only(['id']);
     }
+	
+	public function checkCustom($value): bool|string
+	{
+		$custom = Custom::where('id',$value)->findOrEmpty();
+		if($custom->isEmpty()){
+			return '客户不存在';
+		}
+		return true;
+	}
+	
+	public function checkAnnex($value): bool|string
+	{
+		if(!empty($value) && $value != ''){
+			$annex = json_decode($value,true);
+			if(empty($annex) || !is_array($annex)){
+				return '附件数据格式错误';
+			}
+		}
+		return true;
+	}
 
 }
\ No newline at end of file
diff --git a/app/adminapi/validate/custom_follow/CustomFollowValidate.php b/app/adminapi/validate/custom/CustomFollowValidate.php
similarity index 54%
rename from app/adminapi/validate/custom_follow/CustomFollowValidate.php
rename to app/adminapi/validate/custom/CustomFollowValidate.php
index 73c3e9764..f95cfb79e 100644
--- a/app/adminapi/validate/custom_follow/CustomFollowValidate.php
+++ b/app/adminapi/validate/custom/CustomFollowValidate.php
@@ -12,9 +12,11 @@
 // | author: likeadminTeam
 // +----------------------------------------------------------------------
 
-namespace app\adminapi\validate\custom_follow;
+namespace app\adminapi\validate\custom;
 
 
+use app\common\model\custom\Custom;
+use app\common\model\dict\DictData;
 use app\common\validate\BaseValidate;
 
 
@@ -32,18 +34,23 @@ class CustomFollowValidate extends BaseValidate
       */
     protected $rule = [
         'id' => 'require',
-        'custom_id' => 'require',
+	    'name' => 'require',
+        'custom_id' => 'require|checkCustom',
+	    'date' => 'require|dateFormat:Y-m-d',
+	    'types' => 'require|checkTypes',
+	    'next_follow_date' => 'dateFormat:Y-m-d|checkNext',
+	    'annex' => 'checkAnnex',
     ];
-
-
-    /**
-     * 参数描述
-     * @var string[]
-     */
-    protected $field = [
-        'id' => 'id',
-    ];
-
+	
+	protected $message = [
+		'id.require' => '缺少必要参数',
+		'name.require' => '请填写主题',
+		'custom_id.require' => '请选择客户',
+		'date.require' => '请选择日期',
+		'date.dateFormat' => '日期格式错误',
+		'types.require' => '请选择类型',
+		'next_follow_date.dateFormat' => '下次回访日期格式错误',
+	];
 
     /**
      * @notes 添加场景
@@ -64,9 +71,7 @@ class CustomFollowValidate extends BaseValidate
      * @date 2023/11/12 13:40
      */
     public function sceneEdit()
-    {
-        return $this->only(['id', 'custom_id']);
-    }
+    {}
 
 
     /**
@@ -91,5 +96,44 @@ class CustomFollowValidate extends BaseValidate
     {
         return $this->only(['id']);
     }
+	
+	public function checkCustom($value): bool|string
+	{
+		$custom = Custom::where('id',$value)->findOrEmpty();
+		if($custom->isEmpty()){
+			return '客户不存在';
+		}
+		return true;
+	}
+	
+	public function checkTypes($value): bool|string
+	{
+		$dictData = DictData::where('type_value','custom_follow_type')->column('value');
+		if(!in_array($value,$dictData)){
+			return '类型无效';
+		}
+		return true;
+	}
+	
+	public function checkAnnex($value): bool|string
+	{
+		if(!empty($value) && $value != ''){
+			$annex = json_decode($value,true);
+			if(empty($annex) || !is_array($annex)){
+				return '附件格式错误';
+			}
+		}
+		return true;
+	}
+	
+	public function checkNext($value,$rule,$data): bool|string
+	{
+		if(!empty($value)){
+			if(strtotime($value) - strtotime($data['date']) <=0){
+				return '下次回访日期不能小于上面选择的日期';
+			}
+		}
+		return true;
+	}
 
 }
\ No newline at end of file
diff --git a/app/adminapi/validate/custom/CustomValidate.php b/app/adminapi/validate/custom/CustomValidate.php
index 0def72a9c..fd956b5a8 100644
--- a/app/adminapi/validate/custom/CustomValidate.php
+++ b/app/adminapi/validate/custom/CustomValidate.php
@@ -15,6 +15,9 @@
 namespace app\adminapi\validate\custom;
 
 use app\common\model\custom\Custom;
+use app\common\model\dept\Dept;
+use app\common\model\dept\Orgs;
+use app\common\model\dict\DictData;
 use app\common\validate\BaseValidate;
 
 
@@ -32,17 +35,31 @@ class CustomValidate extends BaseValidate
       */
     protected $rule = [
         'id' => 'require',
-        'name' => 'require|checkName',
+	    'org_id' => 'require|checkOrg',
+	    'dept_id' => 'require|checkDept',
+        'name' => 'require|unique:'.Custom::class,
+	    'custom_type' => 'require|checkType',
+	    'phone' => 'require',
+	    'credit_rating' => 'require|checkRat',
+	    'master_name' => 'require',
+	    'master_phone' => 'mobile',
+	    'master_email' => 'email',
+	    'other_contacts' => 'checkContacts'
     ];
 
 
-    /**
-     * 参数描述
-     * @var string[]
-     */
-    protected $field = [
-        'id' => 'id',
-        'name' => '客户名称'
+    protected $message = [
+	    'id.require' => '缺少必要参数',
+	    'org_id.require' => '请选择组织',
+	    'dept_id.require' => '请选择部门',
+	    'name.require' => '请填写客户名称',
+	    'name.unique' => '客户名称已存在',
+	    'custom_type.require' => '请选择客户属性',
+	    'phone.require' => '请填写客户电话',
+	    'credit_rating.require' => '请选择信用度',
+	    'master_name.require' => '请填写主要负责人姓名',
+	    'master_phone.mobile' => '主要负责人手机号格式错误',
+	    'master_email.email' => '主要负责人邮箱格式错误',
     ];
 
 
@@ -65,9 +82,7 @@ class CustomValidate extends BaseValidate
      * @date 2023/11/11 22:10
      */
     public function sceneEdit()
-    {
-        return $this->only(['id', 'name']);
-    }
+    {}
 
 
     /**
@@ -92,18 +107,63 @@ class CustomValidate extends BaseValidate
     {
         return $this->only(['id']);
     }
-
-    public function checkName($value, $rule, $data)
-    {
-        if (!empty($data['id'])) {
-            $custom = Custom::where('name', $value)->where('id', '<>', $data['id'])->findOrEmpty();
-        } else {
-            $custom = Custom::where('name', $value)->findOrEmpty();
-        }
-        if (!$custom->isEmpty()) {
-            return '客户已存在!';
-        }
-        return true;
-    }
+	
+	public function checkOrg($value): bool|string
+	{
+		$org = Orgs::where('id',$value)->findOrEmpty();
+		if($org->isEmpty()){
+			return '组织不存在';
+		}
+		return true;
+	}
+	
+	public function checkDept($value,$rule,$data): bool|string
+	{
+		$dept = Dept::where('id',$value)->findOrEmpty();
+		if($dept->isEmpty()){
+			return '部门不存在';
+		}
+		if($dept['org_id'] != $data['org_id']){
+			return '部门无效';
+		}
+		return true;
+	}
+	
+	public function checkType($value): bool|string
+	{
+		$dictData = DictData::where('type_value','custom_type')->column('value');
+		if(!in_array($value,$dictData)){
+			return '客户属性无效';
+		}
+		return true;
+	}
+	
+	public function checkRat($value): bool|string
+	{
+		$dictData = DictData::where('type_value','credit_rating')->column('value');
+		if(!in_array($value,$dictData)){
+			return '信用度无效';
+		}
+		return true;
+	}
+	
+	public function checkContacts($value): bool|string
+	{
+		$params = json_decode($value,true);
+		if(empty($params) || !is_array($params)){
+			return '其他联系人数据格式错误';
+		}
+		foreach($params as $v){
+			if(empty($v['name'])){
+				return '请填写联系人姓名';
+			}
+			if(isset($v['annex']) && $v['annex'] != ''){
+				if(!is_array($v['annex'])){
+					return '联系人附件格式错误';
+				}
+			}
+		}
+		return true;
+	}
 
 }
\ No newline at end of file
diff --git a/app/common/model/custom/Custom.php b/app/common/model/custom/Custom.php
index 07cdd5e8f..ceb6169c4 100644
--- a/app/common/model/custom/Custom.php
+++ b/app/common/model/custom/Custom.php
@@ -16,6 +16,7 @@ namespace app\common\model\custom;
 
 
 use app\common\model\BaseModel;
+use app\common\model\dict\DictData;
 use app\common\model\GeoProvince;
 use think\model\concern\SoftDelete;
 
@@ -58,4 +59,14 @@ class Custom extends BaseModel
     {
         return $this->hasOne(\app\common\model\dept\Dept::class, 'id', 'dept_id');
     }
+	
+	public function getCustomTypeTextAttr($value,$data){
+		$dictData = DictData::where('type_value','custom_type')->column('name','value');
+		return $dictData[$data['custom_type']];
+	}
+	
+	public function getCreditRatingTextAttr($value,$data){
+		$dictData = DictData::where('type_value','credit_rating')->column('name','value');
+		return $dictData[$data['credit_rating']];
+	}
 }
\ No newline at end of file
diff --git a/app/common/model/custom/CustomContacts.php b/app/common/model/custom/CustomContacts.php
index 2ad0853e8..1743e0176 100644
--- a/app/common/model/custom/CustomContacts.php
+++ b/app/common/model/custom/CustomContacts.php
@@ -29,22 +29,8 @@ class CustomContacts extends BaseModel
     use SoftDelete;
     protected $name = 'custom_contacts';
     protected $deleteTime = 'delete_time';
-
-    
-    /**
-     * @notes 关联关联客户
-     * @return \think\model\relation\HasOne
-     * @author likeadmin
-     * @date 2023/11/11 22:56
-     */
-    public function customName()
-    {
-        return $this->hasOne(\app\common\model\custom\Custom::class, 'id', 'custom_id')->bind(['custom_name'=>'name']);
-    }
-
-    public function custom()
-    {
-        return $this->belongsTo(\app\common\model\custom\Custom::class, 'custom_id');
-    }
-
+	
+	public function getAnnexAttr($value){
+		return !empty($value) ? json_decode($value) : null;
+	}
 }
\ No newline at end of file
diff --git a/app/common/model/custom_follow/CustomFollow.php b/app/common/model/custom/CustomFollow.php
similarity index 68%
rename from app/common/model/custom_follow/CustomFollow.php
rename to app/common/model/custom/CustomFollow.php
index 85939dbd1..c06405b1e 100644
--- a/app/common/model/custom_follow/CustomFollow.php
+++ b/app/common/model/custom/CustomFollow.php
@@ -12,10 +12,11 @@
 // | author: likeadminTeam
 // +----------------------------------------------------------------------
 
-namespace app\common\model\custom_follow;
+namespace app\common\model\custom;
 
 
 use app\common\model\BaseModel;
+use app\common\model\dict\DictData;
 use think\model\concern\SoftDelete;
 
 
@@ -30,25 +31,23 @@ class CustomFollow extends BaseModel
     protected $name = 'custom_follow';
     protected $deleteTime = 'delete_time';
 
-    public function getDateAttr($value)
+    public function getDateAttr($value): string
     {
-        return empty($value) ? '' : date('Y-m-d H:i:s', $value);
+        return empty($value) ? '' : date('Y-m-d', $value);
     }
 	
 	public function getAnnexAttr($value)
 	{
-		return empty($value) ? '' : json_decode($value,true);
+		return empty($value) ? null : json_decode($value,true);
 	}
 
-    public function getNextFollowDateAttr($value)
+    public function getNextFollowDateAttr($value): string
     {
-        return empty($value) ? '' : date('Y-m-d H:i:s', $value);
+        return empty($value) ? '' : date('Y-m-d', $value);
     }
 
-    public function custom()
-    {
-        return $this->belongsTo(\app\common\model\custom\Custom::class, 'custom_id');
+    public function getTypesTextAttr($value,$data){
+		$dictData = DictData::where('type_value','custom_follow_type')->column('name','value');
+		return $dictData[$data['types']];
     }
-
-    
 }
\ No newline at end of file