From ad8477d3ee82a3fffd5de4cd60a237c9ee6b1fb7 Mon Sep 17 00:00:00 2001
From: quanwei <419654421@qq.com>
Date: Wed, 04 Mar 2026 14:27:05 +0800
Subject: [PATCH] 后台添加供需求发布

---
 admin/app/shop/model/plus/release/DemandProject.php |  212 ++++++++++++++++++++++++++++++++++++++++++++++++++++
 1 files changed, 209 insertions(+), 3 deletions(-)

diff --git a/admin/app/shop/model/plus/release/DemandProject.php b/admin/app/shop/model/plus/release/DemandProject.php
index cb33b5d..c9cb30d 100644
--- a/admin/app/shop/model/plus/release/DemandProject.php
+++ b/admin/app/shop/model/plus/release/DemandProject.php
@@ -4,6 +4,10 @@
 
 use app\common\model\plus\release\Project as ProjectModel;
 use app\common\model\plus\release\ReleaseProjectImage as ReleaseProjectImageModel;
+use app\common\model\plus\release\ReleaseCategory as ReleaseCategoryModel;
+use app\common\model\plus\release\DemandUser as DemandUserModel;
+use app\common\model\plus\release\Setting as SettingModel;
+use app\common\model\user\PointsLog as PointsLogModel;
 
 /**
  * 模型
@@ -20,9 +24,9 @@
         if (!empty($data['name'])) {
             $model = $model->where('name', 'like', '%' . $data['name'] . '%');
         }
-        $list = $model->with('category')->where('project_type', '=', 0)
+        $list = $model->with(['category','user'])->where('project_type', '=', 0)
             ->where('is_delete', '=', 0)
-            ->order(['sort' => 'asc', 'create_time' => 'asc'])
+            ->order(['sort' => 'asc', 'create_time' => 'desc'])
             ->paginate($data);
         foreach($list as &$val){
             $val['finish_time'] = empty($val["finish_time"]) ? '' : date('Y-m-d',$val["finish_time"]);
@@ -31,7 +35,209 @@
         return $list;
     }
 
-     /**
+    /**
+     * 获取默认数据(分类、设置)
+     */
+    public function getDefaultData()
+    {
+        $setting = SettingModel::getAll();
+        $settlement = $setting['settlement']['values'] ?? [];
+        return [
+            'category_list' => ReleaseCategoryModel::getALL(),
+            'demand_price' => $settlement['demand_price'] ?? 0,
+        ];
+    }
+
+    /**
+     * 后台发布需求
+     * @param array $data 表单数据
+     * @param int $user_id 发布用户ID
+     * @param int $pay_points 是否支付连盟币(0不支付,1支付)
+     * @return bool
+     */
+    public function addByAdmin($data, $user_id, $pay_points = 0)
+    {
+        // 验证必填项
+        if (empty($data['name'])) {
+            $this->error = '请输入标题';
+            return false;
+        }
+        if (empty($data['category_id'])) {
+            $this->error = '请选择分类';
+            return false;
+        }
+        if (empty($data['price'])) {
+            $this->error = '请输入您的预算';
+            return false;
+        }
+        if (empty($data['content'])) {
+            $this->error = '请输入详细要求';
+            return false;
+        }
+
+        // 验证需求方用户是否存在
+        $demand_user = DemandUserModel::detail($user_id);
+        if (!$demand_user || $demand_user['is_delete'] == 1) {
+            $this->error = '需求方用户不存在';
+            return false;
+        }
+
+        // 如果需要支付连盟币,从设置中获取金额并检查余额
+        $pay_price = 0;
+        if ($pay_points > 0) {
+            $setting = SettingModel::getAll();
+            $settlement = $setting['settlement']['values'] ?? [];
+            $pay_price = $settlement['demand_price'] ?? 0;
+
+            $main_user = \app\common\model\user\User::detail($user_id);
+            if ($main_user['points'] < $pay_price) {
+                $this->error = '用户连盟币不足';
+                return false;
+            }
+        }
+
+        $save_data = [
+            'user_id' => $user_id,
+            'name' => $data['name'],
+            'category_id' => $data['category_id'],
+            'price' => $data['price'],
+            'content' => $data['content'],
+            'product_content' => $data['product_content'] ?? '',
+            'product_case' => $data['product_case'] ?? '',
+            'detail' => $data['detail'] ?? '',
+            'project_type' => 0, // 需求类型
+            'show_phone' => $data['show_phone'] ?? 1,
+            'is_show' => $data['is_show'] ?? 1,
+            'status' => 1, // 后台发布自动通过审核
+            'app_id' => self::$app_id,
+        ];
+
+        if (!empty($data['finish_time']) && $data['finish_time'] != '请选择日期') {
+            $save_data['finish_time'] = strtotime($data['finish_time']);
+        } else {
+            $save_data['finish_time'] = 0;
+        }
+
+        return $this->transaction(function () use ($data, $save_data, $pay_points, $user_id) {
+            // 记录内容
+            $this->save($save_data);
+            // 记录图片
+            $this->saveAllImages($this['project_id'], $data);
+
+            // 如果需要支付连盟币
+            if ($pay_points > 0) {
+                // 从设置中获取支付金额
+                $setting = SettingModel::getAll();
+                $settlement = $setting['settlement']['values'] ?? [];
+                $pay_price = $settlement['demand_price'] ?? 0;
+
+                // 减少主用户表的连盟币
+                \app\common\model\user\User::where('user_id', '=', $user_id)->dec('points', $pay_price)->update();
+                PointsLogModel::add([
+                    'user_id' => $user_id,
+                    'value' => -$pay_price,
+                    'describe' => "后台发布需求消耗连盟币",
+                    'app_id' => self::$app_id,
+                ]);
+            }
+
+            return $this['project_id'];
+        });
+    }
+
+    /**
+     * 后台编辑需求
+     * @param int $project_id 项目ID
+     * @param array $data 表单数据
+     * @return bool
+     */
+    public function editByAdmin($project_id, $data)
+    {
+        // 验证必填项
+        if (empty($data['name'])) {
+            $this->error = '请输入标题';
+            return false;
+        }
+        if (empty($data['category_id'])) {
+            $this->error = '请选择分类';
+            return false;
+        }
+        if (empty($data['price'])) {
+            $this->error = '请输入您的预算';
+            return false;
+        }
+        if (empty($data['content'])) {
+            $this->error = '请输入详细要求';
+            return false;
+        }
+
+        $model = self::detail($project_id);
+        if (!$model) {
+            $this->error = '项目不存在';
+            return false;
+        }
+        $save_data = [
+            'name' => $data['name'],
+            'category_id' => $data['category_id'],
+            'price' => $data['price'],
+            'content' => $data['content'],
+            'product_content' => $data['product_content'] ?? '',
+            'product_case' => $data['product_case'] ?? '',
+            'detail' => $data['detail'] ?? '',
+            'show_phone' => $data['show_phone'] ?? 1,
+            'is_show' => $data['is_show'] ?? 1,
+        ];
+
+        if (!empty($data['finish_time']) && $data['finish_time'] != '请选择日期') {
+            $save_data['finish_time'] = strtotime($data['finish_time']);
+        } else {
+            $save_data['finish_time'] = 0;
+        }
+
+        return $model->transaction(function () use ($model, $project_id, $data, $save_data) {
+            // 更新内容
+            $model->save($save_data);
+            // 更新图片
+            $model->saveAllImages($project_id, $data);
+
+            return true;
+        });
+    }
+
+    /**
+     * 记录图片
+     */
+    private function saveAllImages($id, $formData)
+    {
+        (new ReleaseProjectImageModel())->where("project_id", "=", $id)->delete();
+        // 生成图片数据
+        if (!empty($formData['image_list']) && is_array($formData['image_list'])) {
+            $imageData = [];
+            foreach ($formData['image_list'] as $imageItem) {
+                // 处理图片ID:可能是对象数组或纯ID
+                $image_id = 0;
+                if (is_array($imageItem)) {
+                    $image_id = !empty($imageItem['image_id']) ? $imageItem['image_id'] : ($imageItem['file_id'] ?? 0);
+                } elseif (is_numeric($imageItem)) {
+                    $image_id = $imageItem;
+                }
+                if ($image_id > 0) {
+                    $imageData[] = [
+                        'project_id' => $id,
+                        'image_id' => $image_id,
+                        'app_id' => self::$app_id
+                    ];
+                }
+            }
+            if (!empty($imageData)) {
+                $model = new ReleaseProjectImageModel;
+                return $model->saveAll($imageData);
+            }
+        }
+        return true;
+    }
+
+    /**
      * 审核
      */
     public function submit($param)

--
Gitblit v1.9.2