Goods.php 21 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435
  1. <?php
  2. /**
  3. * Niushop商城系统 - 团队十年电商经验汇集巨献!
  4. * =========================================================
  5. * Copy right 2019-2029 杭州牛之云科技有限公司, 保留所有权利。
  6. * ----------------------------------------------
  7. * 官方网址: https://www.niushop.com
  8. * =========================================================
  9. */
  10. namespace addon\virtualcard\shop\controller;
  11. use addon\form\model\Form;
  12. use addon\virtualcard\model\VirtualGoods as VirtualGoodsModel;
  13. use app\model\goods\Goods as GoodsModel;
  14. use app\model\goods\GoodsAttribute as GoodsAttributeModel;
  15. use app\model\goods\GoodsBrand as GoodsBrandModel;
  16. use app\model\goods\GoodsCategory as GoodsCategoryModel;
  17. use app\model\goods\GoodsLabel as GoodsLabelModel;
  18. use app\model\goods\GoodsService as GoodsServiceModel;
  19. use app\model\store\Store as StoreModel;
  20. use app\model\web\Config as ConfigModel;
  21. use app\shop\controller\BaseShop;
  22. /**
  23. * 虚拟商品
  24. * Class Virtualgoods
  25. * @package app\shop\controller
  26. */
  27. class Goods extends BaseShop
  28. {
  29. protected $replace = [
  30. 'ADDON_VIRTUALCARD_CSS' => __ROOT__ . '/addon/virtualcard/shop/view/public/css',
  31. 'ADDON_VIRTUALCARD_JS' => __ROOT__ . '/addon/virtualcard/shop/view/public/js',
  32. 'ADDON_VIRTUALCARD_IMG' => __ROOT__ . '/addon/virtualcard/shop/view/public/img',
  33. ];
  34. /**
  35. * 添加商品
  36. * @return mixed
  37. */
  38. public function addGoods()
  39. {
  40. if (request()->isAjax()) {
  41. $category_id = input("category_id", 0);// 分类id
  42. $category_json = json_encode($category_id);//分类字符串
  43. $category_id = ',' . implode(',', $category_id) . ',';
  44. $data = [
  45. 'goods_name' => input("goods_name", ""),// 商品名称,
  46. 'goods_attr_class' => input("goods_attr_class", ""),// 商品类型id,
  47. 'goods_attr_name' => input("goods_attr_name", ""),// 商品类型名称,
  48. 'is_limit' => input("is_limit", "0"),// 商品是否开启限购,
  49. 'limit_type' => input("limit_type", "1"),// 限购类型,
  50. 'site_id' => $this->site_id,
  51. 'category_id' => $category_id,
  52. 'category_json' => $category_json,
  53. 'goods_image' => input("goods_image", ""),// 商品主图路径
  54. 'goods_content' => input("goods_content", ""),// 商品详情
  55. 'goods_state' => input("goods_state", ""),// 商品状态(1.正常0下架)
  56. 'price' => input("price", 0),// 商品价格(取第一个sku)
  57. 'market_price' => input("market_price", 0),// 市场价格(取第一个sku)
  58. 'cost_price' => input("cost_price", 0),// 成本价(取第一个sku)
  59. 'sku_no' => input("sku_no", ""),// 商品sku编码
  60. 'weight' => input("weight", ""),// 重量
  61. 'volume' => input("volume", ""),// 体积
  62. 'goods_stock' => input("goods_stock", 0),// 商品库存(总和)
  63. 'goods_stock_alarm' => input("goods_stock_alarm", 0),// 库存预警
  64. 'goods_spec_format' => input("goods_spec_format", ""),// 商品规格格式
  65. 'goods_attr_format' => input("goods_attr_format", ""),// 商品参数格式
  66. 'introduction' => input("introduction", ""),// 促销语
  67. 'keywords' => input("keywords", ""),// 关键词
  68. 'brand_id' => input("brand_id", 0),//品牌id
  69. 'unit' => input("unit", ""),// 单位
  70. 'sort' => input("sort", 0),// 排序,
  71. 'video_url' => input("video_url", ""),// 视频
  72. 'goods_sku_data' => input("goods_sku_data", ""),// SKU商品数据
  73. 'goods_service_ids' => input("goods_service_ids", ''),// 商品服务id集合
  74. 'label_id' => input("label_id", ''),// 商品分组id
  75. 'virtual_sale' => input("virtual_sale", 0),// 虚拟销量
  76. 'max_buy' => input("max_buy", 0),// 限购
  77. 'min_buy' => input("min_buy", 0),// 起售
  78. 'recommend_way' => input('recommend_way', 0), // 推荐方式,1:新品,2:精品,3;推荐
  79. 'timer_on' => strtotime(input('timer_on', 0)),//定时上架
  80. 'timer_off' => strtotime(input('timer_off', 0)),//定时下架
  81. 'is_consume_discount' => input('is_consume_discount', 0),//是否参与会员折扣
  82. 'qr_id' => input('qr_id', 0),//社群二维码id
  83. 'template_id' => input('template_id', 0),//商品海报id
  84. 'sale_show' => input('sale_show', 0),//
  85. 'stock_show' => input('stock_show', 0),//
  86. 'market_price_show' => input('market_price_show', 0),//
  87. 'barrage_show' => input('barrage_show', 0),//
  88. 'form_id' => input('form_id', 0),
  89. 'sale_channel' => input('sale_channel', 'all'),
  90. 'sale_store' => input('sale_store', 'all'),
  91. ];
  92. $virtual_goods_model = new VirtualGoodsModel();
  93. $res = $virtual_goods_model->addGoods($data);
  94. return $res;
  95. } else {
  96. //获取一级商品分类
  97. $goods_category_model = new GoodsCategoryModel();
  98. $condition = [
  99. [ 'pid', '=', 0 ],
  100. [ 'site_id', '=', $this->site_id ]
  101. ];
  102. $goods_category_list = $goods_category_model->getCategoryList($condition, 'category_id,category_name,level,commission_rate');
  103. $goods_category_list = $goods_category_list[ 'data' ];
  104. $this->assign("goods_category_list", $goods_category_list);
  105. //获取商品类型
  106. $goods_attr_model = new GoodsAttributeModel();
  107. $attr_class_list = $goods_attr_model->getAttrClassList([ [ 'site_id', '=', $this->site_id ] ], 'class_id,class_name')[ 'data' ];
  108. $this->assign("attr_class_list", $attr_class_list);
  109. // 商品服务
  110. $goods_service_model = new GoodsServiceModel();
  111. $service_list = $goods_service_model->getServiceList([ [ 'site_id', '=', $this->site_id ] ], 'id,service_name,icon')[ 'data' ];
  112. $this->assign("service_list", $service_list);
  113. // 商品标签
  114. $goods_label_model = new GoodsLabelModel();
  115. $label_list = $goods_label_model->getLabelList([ [ 'site_id', '=', $this->site_id ] ], 'id,label_name', 'sort ASC')[ 'data' ];
  116. $this->assign("label_list", $label_list);
  117. // 商品品牌
  118. $goods_brand_model = new GoodsBrandModel();
  119. $brand_list = $goods_brand_model->getBrandList([ [ 'site_id', '=', $this->site_id ] ], 'brand_id,brand_name', 'sort asc')[ 'data' ];
  120. $this->assign("brand_list", $brand_list);
  121. //商品默认排序值
  122. $config_model = new ConfigModel();
  123. $sort_config = $config_model->getGoodsSort($this->site_id);
  124. $sort_config = $sort_config[ 'data' ][ 'value' ];
  125. $this->assign("sort_config", $sort_config);
  126. //获取商品海报
  127. $poster_list = event('PosterTemplate', [ 'site_id' => $this->site_id ], true);
  128. if (!empty($poster_list)) {
  129. $poster_list = $poster_list[ 'data' ];
  130. }
  131. $this->assign('poster_list', $poster_list);
  132. $form_is_exit = addon_is_exit('form', $this->site_id);
  133. if ($form_is_exit) {
  134. $form_list = ( new Form() )->getFormList([ [ 'site_id', '=', $this->site_id ], [ 'form_type', '=', 'goods' ], [ 'is_use', '=', 1 ] ], 'id desc', 'id, form_name')[ 'data' ];
  135. $this->assign('form_list', $form_list);
  136. }
  137. $this->assign('form_is_exit', $form_is_exit);
  138. $this->assign('all_goodsclass', event('GoodsClass'));
  139. $this->assign('goods_class', ( new VirtualGoodsModel() )->getGoodsClass());
  140. $this->assign('store_is_exit', addon_is_exit('store', $this->site_id));
  141. return $this->fetch("goods/add_goods", [], $this->replace);
  142. }
  143. }
  144. /**
  145. * 编辑商品
  146. * @return mixed
  147. */
  148. public function editGoods()
  149. {
  150. $virtual_goods_model = new VirtualGoodsModel();
  151. if (request()->isAjax()) {
  152. $category_id = input("category_id", 0);// 分类id
  153. $category_json = json_encode($category_id);//分类字符串
  154. $category_id = ',' . implode(',', $category_id) . ',';
  155. $data = [
  156. 'goods_id' => input("goods_id", 0),// 商品id
  157. 'goods_name' => input("goods_name", ""),// 商品名称,
  158. 'goods_attr_class' => input("goods_attr_class", ""),// 商品类型id,
  159. 'goods_attr_name' => input("goods_attr_name", ""),// 商品类型名称,
  160. 'is_limit' => input("is_limit", "0"),// 商品是否开启限购,
  161. 'limit_type' => input("limit_type", "1"),// 限购类型,
  162. 'site_id' => $this->site_id,
  163. 'category_id' => $category_id,
  164. 'category_json' => $category_json,
  165. 'goods_image' => input("goods_image", ""),// 商品主图路径
  166. 'goods_content' => input("goods_content", ""),// 商品详情
  167. 'goods_state' => input("goods_state", ""),// 商品状态(1.正常0下架)
  168. 'price' => input("price", 0),// 商品价格(取第一个sku)
  169. 'market_price' => input("market_price", 0),// 市场价格(取第一个sku)
  170. 'cost_price' => input("cost_price", 0),// 成本价(取第一个sku)
  171. 'sku_no' => input("sku_no", ""),// 商品sku编码
  172. 'weight' => input("weight", ""),// 重量
  173. 'volume' => input("volume", ""),// 体积
  174. 'goods_stock' => input("goods_stock", 0),// 商品库存(总和)
  175. 'goods_stock_alarm' => input("goods_stock_alarm", 0),// 库存预警
  176. 'goods_spec_format' => input("goods_spec_format", ""),// 商品规格格式
  177. 'goods_attr_format' => input("goods_attr_format", ""),// 商品参数格式
  178. 'introduction' => input("introduction", ""),// 促销语
  179. 'keywords' => input("keywords", ""),// 关键词
  180. 'unit' => input("unit", ""),// 单位
  181. 'sort' => input("sort", 0),// 排序,
  182. 'video_url' => input("video_url", ""),// 视频
  183. 'goods_sku_data' => input("goods_sku_data", ""),// SKU商品数据
  184. 'goods_service_ids' => input("goods_service_ids", ''),// 商品服务id集合
  185. 'label_id' => input("label_id", ''),// 商品分组id
  186. 'brand_id' => input("brand_id", 0),//品牌id
  187. 'virtual_sale' => input("virtual_sale", 0),// 虚拟销量
  188. 'max_buy' => input("max_buy", 0),// 限购
  189. 'min_buy' => input("min_buy", 0),// 起售
  190. 'recommend_way' => input('recommend_way', 0), // 推荐方式,1:新品,2:精品,3;推荐
  191. 'timer_on' => strtotime(input('timer_on', 0)),//定时上架
  192. 'timer_off' => strtotime(input('timer_off', 0)),//定时下架
  193. 'spec_type_status' => input('spec_type_status', 0),
  194. 'is_consume_discount' => input('is_consume_discount', 0),//是否参与会员折扣
  195. 'qr_id' => input('qr_id', 0),//社群二维码id
  196. 'template_id' => input('template_id', 0),//商品海报id
  197. 'sale_show' => input('sale_show', 0),//
  198. 'stock_show' => input('stock_show', 0),//
  199. 'market_price_show' => input('market_price_show', 0),//
  200. 'barrage_show' => input('barrage_show', 0),//
  201. 'form_id' => input('form_id', 0),
  202. 'sale_channel' => input('sale_channel', 'all'),
  203. 'sale_store' => input('sale_store', 'all'),
  204. ];
  205. $res = $virtual_goods_model->editGoods($data);
  206. return $res;
  207. } else {
  208. $goods_model = new GoodsModel();
  209. $goods_id = input("goods_id", 0);
  210. $goods_info = $goods_model->editGetGoodsInfo([ [ 'goods_id', '=', $goods_id ], [ 'site_id', '=', $this->site_id ] ])[ 'data' ];
  211. $goods_sku_list = $goods_model->getGoodsSkuList([ [ 'goods_id', '=', $goods_id ], [ 'site_id', '=', $this->site_id ] ], "sku_id,sku_name,sku_no,sku_spec_format,price,market_price,cost_price,stock,virtual_indate,sku_image,sku_images,goods_spec_format,spec_name,stock_alarm,is_default", '')[ 'data' ];
  212. $goods_info[ 'sku_list' ] = $goods_sku_list;
  213. $this->assign("goods_info", $goods_info);
  214. //获取一级商品分类
  215. $goods_category_model = new GoodsCategoryModel();
  216. $condition = [
  217. [ 'pid', '=', 0 ],
  218. [ 'site_id', '=', $this->site_id ]
  219. ];
  220. $goods_category_list = $goods_category_model->getCategoryList($condition, 'category_id,category_name,level,commission_rate')[ 'data' ];
  221. $this->assign("goods_category_list", $goods_category_list);
  222. //获取商品类型
  223. $goods_attr_model = new GoodsAttributeModel();
  224. $attr_class_list = $goods_attr_model->getAttrClassList([ [ 'site_id', '=', $this->site_id ] ], 'class_id,class_name')[ 'data' ];
  225. $this->assign("attr_class_list", $attr_class_list);
  226. // 商品服务
  227. $goods_service_model = new GoodsServiceModel();
  228. $service_list = $goods_service_model->getServiceList([ [ 'site_id', '=', $this->site_id ] ], 'id,service_name,icon')[ 'data' ];
  229. $this->assign("service_list", $service_list);
  230. // 商品标签
  231. $goods_label_model = new GoodsLabelModel();
  232. $label_list = $goods_label_model->getLabelList([ [ 'site_id', '=', $this->site_id ] ], 'id,label_name', 'sort ASC')[ 'data' ];
  233. $this->assign("label_list", $label_list);
  234. //获取品牌
  235. $goods_brand_model = new GoodsBrandModel();
  236. $brand_list = $goods_brand_model->getBrandList([ [ 'site_id', '=', $this->site_id ] ], "brand_id, brand_name")[ 'data' ];
  237. $this->assign("brand_list", $brand_list);
  238. //获取商品海报
  239. $poster_list = event('PosterTemplate', [ 'site_id' => $this->site_id ], true);
  240. if (!empty($poster_list)) {
  241. $poster_list = $poster_list[ 'data' ];
  242. }
  243. $this->assign('poster_list', $poster_list);
  244. $form_is_exit = addon_is_exit('form', $this->site_id);
  245. if ($form_is_exit) {
  246. $form_list = ( new Form() )->getFormList([ [ 'site_id', '=', $this->site_id ], [ 'form_type', '=', 'goods' ], [ 'is_use', '=', 1 ] ], 'id desc', 'id, form_name')[ 'data' ];
  247. $this->assign('form_list', $form_list);
  248. }
  249. $this->assign('form_is_exit', $form_is_exit);
  250. $store_is_exit = addon_is_exit('store', $this->site_id);
  251. if ($store_is_exit && $goods_info[ 'sale_store' ] != 'all') {
  252. $store_list = ( new StoreModel() )->getStoreList([ [ 'site_id', '=', $this->site_id ], [ 'store_id', 'in', $goods_info[ 'sale_store' ] ] ], 'store_id,store_name,status,address,full_address,is_frozen');
  253. $this->assign('store_list', $store_list[ 'data' ]);
  254. }
  255. $this->assign('store_is_exit', $store_is_exit);
  256. return $this->fetch("goods/edit_goods", [], $this->replace);
  257. }
  258. }
  259. /**
  260. * 卡密管理
  261. * @return array|mixed|void
  262. */
  263. public function carmichael()
  264. {
  265. $virtual_goods_model = new VirtualGoodsModel();
  266. if (request()->isAjax()) {
  267. $page = input('page', 1);
  268. $page_size = input('page_size', PAGE_LIST_ROWS);
  269. $goods_id = input('goods_id', 0);
  270. $is_sold = input('is_sold', 0);
  271. $condition = [
  272. [ 'gv.goods_id', '=', $goods_id ],
  273. [ 'gv.site_id', '=', $this->site_id ]
  274. ];
  275. if ($is_sold) {
  276. $condition[] = [ 'gv.order_id', '<>', 0 ];
  277. } else {
  278. $condition[] = [ 'gv.order_id', '=', 0 ];
  279. }
  280. $join = [
  281. [ 'goods_sku gs', 'gs.sku_id = gv.sku_id', 'left' ],
  282. [ 'member m', 'm.member_id = gv.member_id', 'left' ],
  283. ];
  284. $field = 'gv.id,gv.sku_name,gv.card_info,gv.order_id,gv.sku_id,gv.sold_time,gs.spec_name,m.nickname, m.headimg';
  285. $res = $virtual_goods_model->getVirtualGoodsPageList($condition, $page, $page_size, 'id desc,sold_time desc', $field, 'gv', $join);
  286. return $res;
  287. }
  288. $goods_id = input('goods_id', 0);
  289. $this->assign('goods_id', $goods_id);
  290. $goods_info = $virtual_goods_model->getGoodsDetail($goods_id, $this->site_id);
  291. if (empty($goods_info[ 'data' ])) $this->error('未获取到商品信息');
  292. $this->assign('goods', $goods_info[ 'data' ]);
  293. $temp_condition = array (
  294. [ 'goods_id', '=', $goods_id ],
  295. [ 'site_id', '=', $this->site_id ],
  296. [ 'order_id', '=', 0 ]
  297. );
  298. $this->assign('stock', $virtual_goods_model->getVirtualGoodsCount($temp_condition)[ 'data' ] ?? 0);
  299. return $this->fetch("goods/carmichael", [], $this->replace);
  300. }
  301. /**
  302. * 下载卡密导入模板
  303. * @throws \PHPExcel_Exception
  304. * @throws \PHPExcel_Reader_Exception
  305. * @throws \PHPExcel_Writer_Exception
  306. */
  307. public function downloadTemplate()
  308. {
  309. // 实例化excel
  310. $phpExcel = new \PhpOffice\PhpSpreadsheet\Spreadsheet();
  311. $phpExcel->getProperties()->setTitle("卡密数据导入模板");
  312. $phpExcel->getProperties()->setSubject("卡密数据导入模板");
  313. // 对单元格设置居中效果
  314. $phpExcel->getActiveSheet()->getStyle('A')->getAlignment()->setHorizontal(\PhpOffice\PhpSpreadsheet\Style\Alignment::HORIZONTAL_CENTER);
  315. $phpExcel->getActiveSheet()->getStyle('B')->getAlignment()->setHorizontal(\PhpOffice\PhpSpreadsheet\Style\Alignment::HORIZONTAL_CENTER);
  316. //单独添加列名称
  317. $phpExcel->setActiveSheetIndex(0);
  318. $phpExcel->getActiveSheet()->setCellValue('A1', '卡号');//可以指定位置
  319. $phpExcel->getActiveSheet()->setCellValue('B1', '密码');
  320. // 设置第一个sheet为工作的sheet
  321. $phpExcel->setActiveSheetIndex(0);
  322. // 保存Excel 2007格式文件,保存路径为当前路径,名字为export.xlsx
  323. $objWriter = \PhpOffice\PhpSpreadsheet\IOFactory::createWriter($phpExcel, 'Xlsx');
  324. $file = date('卡密数据导入模板', time()) . '.xlsx';
  325. $objWriter->save($file);
  326. header("Content-type:application/octet-stream");
  327. $filename = basename($file);
  328. header("Content-Disposition:attachment;filename = " . $filename);
  329. header("Accept-ranges:bytes");
  330. header("Accept-length:" . filesize($file));
  331. readfile($file);
  332. unlink($file);
  333. exit;
  334. }
  335. /**
  336. * 添加卡密
  337. * @return array
  338. */
  339. public function addCarmichael()
  340. {
  341. if (request()->isAjax()) {
  342. $virtual_goods_model = new VirtualGoodsModel();
  343. $goods_id = input('goods_id', 0);
  344. $sku_id = input('sku_id', 0);
  345. $data = input('data', '');
  346. $carmichael = explode(',', $data);
  347. $res = $virtual_goods_model->addGoodsVirtual($this->site_id, $goods_id, $sku_id, $carmichael);
  348. return $res;
  349. }
  350. }
  351. /**
  352. * 导入数据
  353. */
  354. public function import()
  355. {
  356. if (request()->isAjax()) {
  357. $virtual_goods_model = new VirtualGoodsModel();
  358. $path = input('path', '');
  359. $res = $virtual_goods_model->importData($path);
  360. return $res;
  361. }
  362. }
  363. /**
  364. * 删除卡密
  365. */
  366. public function deleteGoodsVirtual()
  367. {
  368. if (request()->isAjax()) {
  369. $ids = input('id', '');
  370. $goods_id = input('goods_id', '');
  371. $virtual_goods_model = new VirtualGoodsModel();
  372. $res = $virtual_goods_model->deleteGoodsVirtual([ [ 'order_id', '=', 0 ], [ 'id', 'in', $ids ], [ 'site_id', '=', $this->site_id ], [ 'goods_id', '=', $goods_id ] ]);
  373. return $res;
  374. }
  375. }
  376. /**
  377. * 编辑卡密
  378. * @return array
  379. */
  380. public function editGoodsVirtual()
  381. {
  382. if (request()->isAjax()) {
  383. $virtual_goods_model = new VirtualGoodsModel();
  384. $id = input('id', '');
  385. $card_info = [
  386. 'cardno' => input('cardno', ''),
  387. 'password' => input('password', '')
  388. ];
  389. $res = $virtual_goods_model->updateGoodsVirtual([ 'card_info' => json_encode($card_info) ], [ [ 'id', '=', $id ], [ 'site_id', '=', $this->site_id ], [ 'order_id', '=', 0 ] ]);
  390. return $res;
  391. }
  392. }
  393. }