123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381 |
- <?php
- namespace App\Service;
- use App\Model\Employee;
- use App\Model\Product;
- use Illuminate\Support\Facades\DB;
- /**
- * 产品管理
- */
- class ProductService extends Service
- {
- /**
- * 产品分类编辑
- * @param $data
- * @param $user
- * @return array
- */
- public function productCategoryEdit($data,$user){
- list($status,$msg) = $this->productCategoryRule($data,$user,false);
- if(!$status) return [$status,$msg];
- $update = $msg['data'][0];
- $model = new ProductCategory();
- $model->where('id',$data['id'])->update($update);
- return [true,''];
- }
- /**
- * 产品分类新增
- * @param $data
- * @param $user
- * @return array
- */
- public function productCategoryAdd($data,$user){
- list($status,$msg) = $this->productCategoryRule($data,$user);
- if(!$status) return [$status,$msg];
- ProductCategory::insert($msg['data']);
- return [true,''];
- }
- /**
- * 产品分类删除
- * @param $data
- * @return array
- */
- public function productCategoryDel($data){
- if($this->isEmpty($data,'id')) return [false,'请选择数据!'];
- $bool = Product::where('del_time',0)
- ->where('product_category_id',$data['id'])
- ->exists();
- if($bool) return [false,'产品分类下已添加产品,操作失败'];
- try {
- DB::beginTransaction();
- ProductCategory::where('id',$data['id'])->update([
- 'del_time' => time()
- ]);
- DB::commit();
- }catch (\Exception $exception){
- DB::rollBack();
- return [false,$exception->getMessage()];
- }
- return [true,''];
- }
- /**
- * 产品分类列表
- * @param $data
- * @param $user
- * @return array
- */
- public function productCategoryList($data,$user){
- $model = ProductCategory::leftJoin('product_category_orderby as a', function ($join) {
- $join->on('product_category.id', '=', 'a.category_id')
- ->where('a.del_time',0);
- })
- ->where('product_category.del_time',0)
- ->select('product_category.title','product_category.id','product_category.parent_id','product_category.is_edit_unit_price')
- ->orderByRaw('IF(a.sort IS NULL, product_category.id, a.sort) ASC'); // 排序逻辑:优先按 a.sort 排序,没有关联时按主表 id 排序
- if(! empty($data['title'])) $model->where('title', 'LIKE', '%'.$data['title'].'%');
- if(isset($data['is_edit_unit_price'])) $model->where('is_edit_unit_price', $data['is_edit_unit_price']);
- $list = $model->get()->toArray();
- foreach ($list as $key => $value){
- $list[$key]['is_edit_unit_price_title'] = ProductCategory::$is_edit_unit_price[$value['is_edit_unit_price']] ?? "";
- }
- $list_tree = $list;
- if(! empty($list_tree)) {
- $list_tree = $this->makeTree(0,$list_tree);
- $list_tree = $this->set_sort_circle($list_tree);
- }
- return [200, ['data' => $list,'tree' => $list_tree]];
- }
- /**
- * 产品分类参数规则
- * @param $data
- * @param $is_add
- * @return array
- */
- public function productCategoryRule($data,$user, $is_add = true){
- if($this->isEmpty($data,'data')) return [false,'数据不能为空!'];
- $title = array_column($data['data'],'title');
- $title = array_map(function($val) {
- return $val !== null ? $val : 0;
- }, $title);
- $title_count = array_count_values($title);
- foreach ($title as $value){
- if(empty($value)) return [false,'名称不能为空!'];
- if($title_count[$value] > 1) return [false,'名称不能重复'];
- }
- foreach ($data['data'] as $key => $value){
- $data['data'][$key]['upd_time'] = time();
- if($is_add){
- $parent_id = 0;
- if(! empty($value['parent_id'])) {
- $bool = Product::where('del_time',0)
- ->where('product_category_id',$value['parent_id'])
- ->exists();
- if($bool) {
- $title = ProductCategory::where('id',$value['parent_id'])->select('title')->value('title');
- return [false,'产品分类:'. $title .'下已添加产品,不允许添加子分类'];
- }
- $parent_id = $value['parent_id'];
- }
- $data['data'][$key]['parent_id'] = $parent_id;
- $data['data'][$key]['crt_time'] = time();
- $data['data'][$key]['depart_id'] = $data['depart_id'];
- $data['data'][$key]['top_depart_id'] = $data['top_depart_id'];
- $bool = ProductCategory::where('title',$value['title'])
- ->where('top_depart_id',$data['top_depart_id'])
- ->where('del_time',0)
- ->exists();
- }else{
- if($this->isEmpty($data,'id')) return [false,'id不能为空!'];
- $top_depart_id = ProductCategory::where('id',$data['id'])->value('top_depart_id');
- $bool = ProductCategory::where('title',$value['title'])
- ->where('id','<>',$data['id'])
- ->where('del_time',0)
- ->exists();
- }
- if($bool) return [false,'分类名称不能重复'];
- }
- return [true, $data];
- }
- /**
- * 产品编辑
- * @param $data
- * @param $user
- * @return array
- */
- public function productEdit($data,$user){
- list($status,$msg) = $this->productRule($data, $user, false);
- if(!$status) return [$status,$msg];
- try {
- DB::beginTransaction();
- $model = Product::where('id',$data['id'])->first();
- $model->category = $data['category'] ?? '';
- $model->title = $data['title'];
- $model->code = $data['code'] ?? '';
- $model->size = $data['size'] ?? '';
- $model->unit = $data['unit'] ?? '';
- $model->business_cost = $data['business_cost'] ?? 0;
- $model->cost = $data['cost'] ?? 0;
- $model->write_off_price = $data['write_off_price'] ?? 0;
- $model->major_client_settlement_price = $data['major_client_settlement_price'] ?? 0;
- $model->return_change_price = $data['return_change_price'] ?? 0;
- $model->freight_price = $data['freight_price'] ?? 0;
- $model->mark = $data['mark'] ?? '';
- $model->save();
- DB::commit();
- }catch (\Exception $exception){
- DB::rollBack();
- return [false,$exception->getMessage()];
- }
- return [true, ''];
- }
- /**
- * 产品新增
- * @param $data
- * @param $user
- * @return array
- */
- public function productAdd($data,$user){
- list($status,$msg) = $this->productRule($data, $user);
- if(!$status) return [$status,$msg];
- try {
- DB::beginTransaction();
- $model = new Product();
- $model->category = $data['category'] ?? '';
- $model->title = $data['title'];
- $model->code = $data['code'] ?? '';
- $model->size = $data['size'] ?? '';
- $model->unit = $data['unit'] ?? '';
- $model->business_cost = $data['business_cost'] ?? 0;
- $model->cost = $data['cost'] ?? 0;
- $model->write_off_price = $data['write_off_price'] ?? 0;
- $model->major_client_settlement_price = $data['major_client_settlement_price'] ?? 0;
- $model->return_change_price = $data['return_change_price'] ?? 0;
- $model->freight_price = $data['freight_price'] ?? 0;
- $model->mark = $data['mark'] ?? '';
- $model->crt_id = $user['id'];
- $model->save();
- DB::commit();
- }catch (\Exception $exception){
- DB::rollBack();
- return [false,$exception->getMessage()];
- }
- return [true, ''];
- }
- /**
- * 产品删除
- * @param $data
- * @return array
- */
- public function productDel($data){
- if($this->isEmpty($data,'id')) return [false,'请选择数据!'];
- try {
- DB::beginTransaction();
- $time = time();
- Product::where('del_time',0)->whereIn('id',$data['id'])->update(['del_time' => $time]);
- DB::commit();
- }catch (\Exception $exception){
- DB::rollBack();
- return [false,$exception->getMessage()];
- }
- return [true, ''];
- }
- /**
- * 产品详情
- * @param $data
- * @param $user
- * @return array
- */
- public function productDetail($data,$user){
- if($this->isEmpty($data,'id')) return [false,'请选择数据!'];
- $customer = Product::where('del_time',0)
- ->where('id',$data['id'])
- ->first();
- if(empty($customer)) return [false,'产品不存在或已被删除'];
- $customer = $customer->toArray();
- $customer['crt_name'] = Employee::where('id',$customer['crt_id'])->value('emp_name');
- $customer['crt_time'] = $customer['crt_time'] ? date("Y-m-d H:i:s",$customer['crt_time']): '';
- return [true, $customer];
- }
- public function productCommon($data,$user, $field = []){
- if(empty($field)) $field = Product::$field;
- $model = Product::where('del_time',0)
- ->select($field)
- ->orderby('code', 'asc');
- if(! empty($data['title'])) $model->where('title', 'LIKE', '%'.$data['title'].'%');
- if(! empty($data['category'])) $model->where('category', 'LIKE', '%'.$data['category'].'%');
- if(! empty($data['size'])) $model->where('size', 'LIKE', '%'.$data['size'].'%');
- if(! empty($data['code'])) $model->where('code', 'LIKE', '%'.$data['code'].'%');
- if(! empty($data['crt_time'][0]) && ! empty($data['crt_time'][1])) {
- $return = $this->changeDateToTimeStampAboutRange($data['crt_time']);
- $model->where('crt_time','>=',$return[0]);
- $model->where('crt_time','<=',$return[1]);
- }
- return $model;
- }
- /**
- * 产品列表
- * @param $data
- * @param $user
- * @return array
- */
- public function productList($data,$user){
- $model = $this->productCommon($data, $user);
- $list = $this->limit($model,'',$data);
- $list = $this->fillData($list,$user,$data);
- return [true, $list];
- }
- /**
- * 产品参数规则
- * @param $data
- * @param $is_add
- * @return array
- */
- public function productRule(&$data, $user, $is_add = true){
- if(empty($data['code'])) return [false,'产品编码不能为空'];
- if(empty($data['title'])) return [false,'产品名称不能为空'];
- if(! isset($data['cost'])) return [false, '请填写成本'];
- if(! isset($data['business_cost'])) return [false, '请填写业务成本'];
- $res = $this->checkNumber($data['cost']);
- if(! $res['valid']) return [false,'成本:' . $res['error']];
- $res = $this->checkNumber($data['business_cost']);
- if(! $res['valid']) return [false,'业务成本:' . $res['error']];
- if(! empty($data['write_off_price'])){
- $res = $this->checkNumber($data['write_off_price']);
- if(! $res['valid']) return [false,'核销单价:' . $res['error']];
- }
- if(! empty($data['major_client_settlement_price'])){
- $res = $this->checkNumber($data['major_client_settlement_price']);
- if(! $res['valid']) return [false,'大客户结算单价:' . $res['error']];
- }
- if(! empty($data['return_change_price'])){
- $res = $this->checkNumber($data['return_change_price']);
- if(! $res['valid']) return [false,'退货损耗单价:' . $res['error']];
- }
- if(! empty($data['freight_price'])){
- $res = $this->checkNumber($data['freight_price']);
- if(! $res['valid']) return [false,'运费单价:' . $res['error']];
- }
- if($is_add){
- $bool = Product::where('code', $data['code'])
- ->where('del_time',0)
- ->exists();
- }else{
- if(empty($data['id'])) return [false,'ID不能为空'];
- $bool = Product::where('code', $data['code'])
- ->where('id','<>',$data['id'])
- ->where('del_time',0)
- ->exists();
- }
- if($bool) return [false,'产品编码不能重复'];
- return [true, $data];
- }
- /**
- * 拼接数据
- * @param $data
- * @return array
- */
- public function fillData($data, $user, $search){
- if(empty($data['data'])) return $data;
- foreach ($data['data'] as $key => $value){
- $data['data'][$key]['crt_time'] = $value['crt_time'] ? date('Y-m-d H:i:s',$value['crt_time']) : '';
- $data['data'][$key]['crt_name'] = $emp[$value['crt_id']] ?? '';
- }
- return $data;
- }
- }
|