Products.php 10 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304
  1. <?php
  2. // +----------------------------------------------------------------------
  3. // | A3Mall
  4. // +----------------------------------------------------------------------
  5. // | Copyright (c) 2020 http://www.a3-mall.com All rights reserved.
  6. // +----------------------------------------------------------------------
  7. // | Author: xzncit <158373108@qq.com>
  8. // +----------------------------------------------------------------------
  9. namespace app\admin\service\products;
  10. use app\admin\service\platform\Category as CategoryService;
  11. use app\admin\service\Service;
  12. use app\admin\model\goods\Goods as GoodsModel;
  13. use app\common\models\goods\GoodsItem as GoodsItemModel;
  14. use app\common\models\goods\ProductsBrand as BrandModel;
  15. use app\common\models\goods\GoodsExtends as GoodsExtendsModel;
  16. use app\common\models\goods\GoodsModel as GoodsParamsModel;
  17. use app\common\models\goods\GoodsImage as GoodsImageModel;
  18. use app\common\models\goods\GoodsCard as GoodsCardModel;
  19. use app\common\models\promotion\PromotionPrice as PromotionPriceModel;
  20. use app\common\models\promotion\PromotionPriceItem as PromotionPriceItemModel;
  21. use app\common\models\goods\Distribution as DistributionModel;
  22. use app\common\models\goods\ProductsModel;
  23. use mall\utils\Tool;
  24. use think\facade\Db;
  25. use think\facade\Env;
  26. /**
  27. * 商品服务类
  28. * Class Products
  29. * @package app\admin\service\products
  30. */
  31. class Products extends Service {
  32. /**
  33. * 获取列表数据
  34. * @param $data
  35. * @param string $goodsType
  36. * @return array
  37. * @throws \think\db\exception\DataNotFoundException
  38. * @throws \think\db\exception\DbException
  39. * @throws \think\db\exception\ModelNotFoundException
  40. */
  41. public static function getList($data,$goodsType="0"){
  42. $fields = ["cat_id","status","brand_id","title","goods_type"];
  43. $searchData = [
  44. 'cat_id'=>$data['key']["cat_id"]??'',
  45. 'status'=>$data['key']["status"]??'',
  46. 'brand_id'=>$data['key']["brand_id"]??'',
  47. 'title'=>$data['key']["title"]??'',
  48. 'goods_type'=>$goodsType
  49. ];
  50. $count = GoodsModel::withSearch($fields,$searchData)->withJoin("category")->count();
  51. $result = array_map(function ($res){
  52. $res["photo"] = Tool::thumb($res["photo"]);
  53. return $res;
  54. },GoodsModel::withSearch($fields,$searchData)->withJoin("category")->order("goods.id","desc")->page($data["page"]??1,$data["limit"]??10)->select()->toArray());
  55. return ["count"=>$count, "data"=>$result];
  56. }
  57. /**
  58. * 获取列表搜索分类和品牌数据
  59. * @return array
  60. * @throws \think\db\exception\DataNotFoundException
  61. * @throws \think\db\exception\DbException
  62. * @throws \think\db\exception\ModelNotFoundException
  63. */
  64. public static function getSearchData(){
  65. return [
  66. "cat"=>CategoryService::getTree(["status"=>0,"module"=>"goods"]),
  67. "brand"=>BrandModel::where("status",0)->select()->toArray()
  68. ];
  69. }
  70. /**
  71. * 详情
  72. * @param $id
  73. * @return array
  74. * @throws \think\db\exception\DataNotFoundException
  75. * @throws \think\db\exception\DbException
  76. * @throws \think\db\exception\ModelNotFoundException
  77. */
  78. public static function detail($id){
  79. $goods = GoodsModel::where("id",$id)->find();
  80. $goodsExtends = GoodsExtendsModel::where(['goods_id'=>$id])->select()->toArray();
  81. $goodsAttribute = [];
  82. foreach($goodsExtends as $val){
  83. $goodsAttribute[] = $val["attribute"];
  84. }
  85. return [
  86. "cat"=>CategoryService::getTree(["status"=>0,"module"=>"goods"]),
  87. "photo"=>GoodsImageModel::where(['goods_id'=>$id])->select()->toArray(),
  88. "brand"=>BrandModel::where("status",0)->select()->toArray(),
  89. "distribution"=>DistributionModel::where("status",0)->select()->toArray(),
  90. "model"=>ProductsModel::select()->toArray(),
  91. "card"=>GoodsCardModel::select()->toArray(),
  92. "goods_extends"=>$goodsAttribute,
  93. "data"=>$goods??[]
  94. ];
  95. }
  96. /**
  97. * 保存数据
  98. * @param array $data
  99. * @return bool
  100. * @throws \Exception
  101. */
  102. public static function save($data=[]){
  103. if(DistributionModel::where(["id"=>$data["delivery_id"]])->count() <=0){
  104. throw new \Exception("请设置运费模板",0);
  105. }
  106. $post = $data;
  107. $post['sell_price'] = $data['product_sell_price'];
  108. $post['market_price'] = $data['product_market_price'];
  109. $post['cost_price'] = $data['product_cost_price'];
  110. $post['goods_weight'] = $data['product_weight'];
  111. $post['store_nums'] = $data['product_store_nums'];
  112. if(empty($post['goods_number'])){
  113. $data['goods_number'] = $post['goods_number'] = self::goodsNumber();
  114. }
  115. if(GoodsModel::where("id",$data["id"])->count()){
  116. GoodsModel::where("id",$data["id"])->save($post);
  117. }else{
  118. unset($data["id"],$post["id"]);
  119. $data["id"] = GoodsModel::create($post)->id;
  120. }
  121. GoodsExtendsModel::where(['goods_id' => $data['id']])->delete();
  122. $data['goods_extends'] = !empty($data['goods_extends']) ? $data['goods_extends'] : [];
  123. foreach ($data['goods_extends'] as $val) {
  124. GoodsExtendsModel::create(['attribute' => $val, 'goods_id' => $data['id']]);
  125. }
  126. $attr = [];
  127. foreach ($_POST as $key => $val) {
  128. if (strpos($key, 'attr_id_') !== false) {
  129. $attr[ltrim($key, 'attr_id_')] = $val;
  130. }
  131. }
  132. GoodsParamsModel::where(['goods_id' => $data["id"]])->delete();
  133. $shop_goods_module = [];
  134. if ($data['model_id'] > 0 && !empty($attr)) {
  135. $sort = 0;
  136. foreach ($attr as $key => $val) {
  137. $shop_goods_module[] = [
  138. 'goods_id' => $data["id"],
  139. 'model_id' => $data['model_id'],
  140. 'attribute_id' => $key,
  141. 'attribute_value' => is_array($val) ? join(',', $val) : $val,
  142. 'sort' => $sort
  143. ];
  144. $sort++;
  145. }
  146. if(!empty($shop_goods_module)){
  147. GoodsParamsModel::saveAll($shop_goods_module);
  148. }
  149. }
  150. $images = [];
  151. if(!empty($data["images"])){
  152. foreach($data["images"] as $value){
  153. $images[] = [
  154. "goods_id" => $data["id"],
  155. "path" => $value,
  156. "create_time" => time()
  157. ];
  158. }
  159. }
  160. GoodsImageModel::where("goods_id",$data["id"])->delete();
  161. if(!empty($images)){
  162. GoodsImageModel::insertAll($images);
  163. }
  164. return true;
  165. }
  166. /**
  167. * 删除商品
  168. * @param $params
  169. * @return bool
  170. * @throws \Exception
  171. */
  172. public static function delete($params){
  173. try{
  174. GoodsModel::startTrans();
  175. $array = array_map("intval",explode(",",$params));
  176. foreach($array as $id) {
  177. $row = GoodsModel::where('id', $id)->find();
  178. if(empty($row)) continue;
  179. GoodsModel::where("id",$id)->delete();
  180. GoodsExtendsModel::where(['goods_id' => $id])->delete();
  181. GoodsItemModel::where(['goods_id' => $id])->delete();
  182. GoodsParamsModel::where(['goods_id' => $id])->delete();
  183. GoodsImageModel::where(['goods_id' => $id])->delete();
  184. if ($promotion_price = PromotionPriceModel::where("goods_id", $id)->find()) {
  185. PromotionPriceModel::where("id",$promotion_price["id"])->delete();
  186. PromotionPriceItemModel::where("pid",$promotion_price['id'])->delete();
  187. }
  188. }
  189. GoodsModel::commit();
  190. return true;
  191. }catch (\Exception $ex){
  192. GoodsModel::rollback();
  193. throw new \Exception($ex->getMessage(). " file: " . $ex->getFile() . " line: " . $ex->getLine(),$ex->getCode());
  194. }
  195. }
  196. /**
  197. * 更新字段值
  198. * @return GoodsModel
  199. */
  200. public static function setFields(){
  201. $data = self::getFields();
  202. return GoodsModel::where("id",$data["id"])->update([$data["name"]=>$data["value"]]);
  203. }
  204. /**
  205. * 导出数据
  206. * @throws \PhpOffice\PhpSpreadsheet\Writer\Exception
  207. * @throws \think\db\exception\DataNotFoundException
  208. * @throws \think\db\exception\DbException
  209. * @throws \think\db\exception\ModelNotFoundException
  210. */
  211. public static function export(){
  212. $data = $title = [];
  213. $prefix = Env::get("DATABASE_PREFIX");
  214. $fields = Db::query("show COLUMNS FROM {$prefix}goods");
  215. foreach($fields as $item){
  216. $title[] = $item["Field"];
  217. }
  218. $r = GoodsModel::select()->toArray();
  219. foreach($r as $key=>$item){
  220. $arr = [];
  221. foreach ($item as $k=>$v){
  222. $arr[$k] = ' ' . $v;
  223. }
  224. $data[] = $arr;
  225. }
  226. $spreadsheet = new \PhpOffice\PhpSpreadsheet\Spreadsheet();
  227. $sheet = $spreadsheet->getActiveSheet();
  228. foreach ($title as $key => $value) {
  229. $sheet->setCellValueByColumnAndRow($key + 1, 1, $value);
  230. }
  231. $row = 2;
  232. foreach ($data as $item) {
  233. $column = 1;
  234. foreach ($item as $value) {
  235. $sheet->setCellValueByColumnAndRow($column, $row, $value);
  236. $column++;
  237. }
  238. $row++;
  239. }
  240. $titCol = 'A';
  241. foreach ($title as $key => $value) {
  242. $sheet->setCellValue($titCol . '1', $value);
  243. $titCol++;
  244. }
  245. $row = 2;
  246. foreach ($data as $item) {
  247. $dataCol = 'A';
  248. foreach ($item as $value) {
  249. $sheet->setCellValue($dataCol . $row, $value);
  250. $dataCol++;
  251. }
  252. $row++;
  253. }
  254. header('Content-Type: application/vnd.openxmlformats-officedocument.spreadsheetml.sheet');
  255. header('Content-Disposition: attachment;filename="goods.xlsx"');
  256. header('Cache-Control: max-age=0');
  257. header('Cache-Control: max-age=1');
  258. header('Expires: Mon, 26 Jul 1997 05:00:00 GMT');
  259. header('Last-Modified: ' . gmdate('D, d M Y H:i:s') . ' GMT');
  260. header('Cache-Control: cache, must-revalidate');
  261. header('Pragma: public');
  262. $writer = \PhpOffice\PhpSpreadsheet\IOFactory::createWriter($spreadsheet, 'Xlsx');
  263. $writer->save('php://output');
  264. exit;
  265. }
  266. }