MessageDetailController.php 12 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235
  1. <?php
  2. namespace app\frontend\controllers;
  3. use app\common\components\BaseController;
  4. use Illuminate\Support\Arr;
  5. use Illuminate\Support\Facades\DB;
  6. use Yunshop\Commission\models\Commission;
  7. use Yunshop\Integral\Common\Models\IntegralGoodsModel;
  8. class MessageDetailController extends BaseController {
  9. protected $pageSize = 2000;
  10. public function getMsgDetail(){
  11. $data=$this->makeMsgTemplate($this->getGoodsList());
  12. $str='<!doctype html>
  13. <html>
  14. <head>
  15. <meta charset="utf-8">
  16. <title>商品异常数据</title>
  17. <meta name="keywords" content="" />
  18. <meta name="description" content="" />
  19. <meta name="viewport" content="width=device-width, initial-scale=1.0, maximum-scale=1.0, user-scalable=0" />
  20. <meta name="format-detection" content="telephone=no" />
  21. <meta name="apple-mobile-web-app-capable" content="yes" />
  22. <meta name="apple-mobile-web-app-status-bar-style" content="black">
  23. <meta name="author" content="CSS5, css5.com.cn" />
  24. <style>
  25. body{font-size:62.5%;font-family:"Microsoft YaHei",Arial; overflow-x:hidden; overflow-y:auto;}
  26. .viewport{ max-width:640px; min-width:300px; margin:0 auto;}
  27. </style>
  28. </head>
  29. <body>
  30. <div>
  31. <h1 style="text-align: center" style="font-size: 20px">商品价格异常数据</h1>
  32. <table class="table" style="font-size: 16em">
  33. <thead>
  34. <tr>
  35. <th>商品ID</th>
  36. <th>商品规格ID</th>
  37. <th>商品价格</th>
  38. <th>成品价格</th>
  39. <th>峰值金额</th>
  40. </tr>
  41. </thead>
  42. <tbody>';
  43. foreach ($data as $d){
  44. $str.='<tr>
  45. <td>'.$d["goods_id"].'</td>
  46. <td>'.$d["goods_option_id"].'</td>
  47. <td>'.$d["product_price"].'</td>
  48. <td>'.$d["cost_price"].'</td>
  49. <td>'.$d["max_price"].'</td>
  50. </tr>';
  51. }
  52. $str.='
  53. </tbody>
  54. </table>
  55. </div>
  56. </body>
  57. </html>';
  58. echo $str;exit;
  59. }
  60. private function makeMsgTemplate(array $data): array
  61. {
  62. // $template = '商品id:1,现价:122,会员:100,VIP:82,成本:90,VIP会员利润报警';
  63. \Log::info($data);
  64. $templates = [];
  65. foreach (array_chunk($data, 4) as $chunk) {
  66. $template = '下架异常商品:';
  67. foreach ($chunk as $item) {
  68. if($item['goods_option_id']){
  69. $template .= sprintf('商品id:%d,商品规格id:%d,商品规格现价:%.2F,峰值金额:%.2f,商品规格成本:%.2f,利润报警|', $item['goods_id'],$item['goods_option_id'], $item['product_price'],$item['max_price'], $item['cost_price']);
  70. }else{
  71. $template .= sprintf('商品id:%d,商品现价:%.2F,峰值金额:%.2f,成本:%.2f,利润报警|', $item['goods_id'], $item['product_price'],$item['max_price'], $item['cost_price']);
  72. }
  73. }
  74. $templates[] = rtrim($template, "|");
  75. }
  76. return $templates;
  77. }
  78. private function getGoodsList(): array
  79. {
  80. $requestSearch = [];
  81. /*$list = Goods::Search($requestSearch)->with(['hasOneSmallCodeUrl', 'hasManyOptions', 'hasManyGoodsDiscount', 'hasOneYzGoods' => function ($query) {
  82. $query->with('hasOneMiddlegroundConfiguration');
  83. }])->pluginId()->orderBy('display_order', 'desc')->orderBy('yz_goods.id', 'desc');
  84. if (!empty($requestSearch['middleground_configuration_id'])) {
  85. $list = $list->whereHas('hasOneYzGoods', function ($query) use ($requestSearch) {
  86. $query->where('middleground_configuration_id', $requestSearch['middleground_configuration_id']);
  87. });
  88. }*/
  89. $list=DB::table('yz_goods')
  90. ->select('yz_goods.id','yz_goods.status','yz_goods.price','yz_goods.cost_price','yz_goods_option.id as goods_option_id','yz_goods_option.title as goods_option_title','yz_goods_option.product_price as goods_option_product_price','yz_goods_option.cost_price as goods_option_cost_price','yz_goods_option.market_price as goods_option_market_price',
  91. 'yz_community_marketing_goods.is_open as qtj_status','yz_community_marketing_goods.alone_rule','yz_community_marketing_goods.alone_rule_rate','yz_community_marketing_goods.cashier_rate',
  92. 'yz_goods_sale.max_point_deduct')
  93. ->leftJoin('yz_goods_option','yz_goods_option.goods_id','=','yz_goods.id')
  94. ->leftJoin('yz_community_marketing_goods','yz_community_marketing_goods.goods_id','=','yz_goods.id')
  95. ->leftJoin('yz_goods_sale','yz_goods_sale.goods_id','=','yz_goods.id')
  96. ->where(['yz_goods.status'=>1,'yz_goods.uniacid'=>4])
  97. ->whereNull('yz_goods.deleted_at');
  98. $result = [];
  99. while (($data = $list->paginate($this->pageSize)) && $data->currentPage() <= $data->lastPage()) {
  100. $result[] = $this->processData($data->items());
  101. $currentPage = $data->currentPage();
  102. request()->offsetSet('page', ++$currentPage);
  103. }
  104. return Arr::collapse($result);
  105. }
  106. /**
  107. * 处理数据
  108. * @param $data
  109. * @return array
  110. */
  111. private function processData($data): array
  112. {
  113. $alert = [];
  114. $deduction_set=0;
  115. $deduction_set_max='0';
  116. foreach ($data as $l) {
  117. $price=$l['goods_option_product_price']?$l['goods_option_product_price']:$l['price'];
  118. $cost_price=$l['goods_option_cost_price']?$l['goods_option_cost_price']:$l['cost_price'];
  119. $goods_discount=DB::table('yz_goods_discount')->select('discount_method','level_id','discount_value')->where(['goods_id'=>$l['id']])->get();
  120. $max_member_price='0';
  121. $integralData=IntegralGoodsModel::uniacid()->select('deduction_set','deduction_set_max')->where('goods_id',$l['id'])->first();
  122. if($integralData){
  123. $integralData=$integralData->toArray();
  124. if($integralData['deduction_set']==1){
  125. $deduction_set=$integralData['deduction_set'];
  126. $deduction_set_max=$integralData['deduction_set_max'];
  127. }else{
  128. $deduction_set=\Setting::get('integral.deduction_set');
  129. $deduction_set_max=\Setting::get('integral.deduction_set_max');
  130. }
  131. }
  132. foreach ($goods_discount as $v => $d){
  133. if($d['discount_value']){
  134. if($d['discount_method']==1){
  135. //$value=$d['discount_value'].'折';
  136. //$member_price=$price-($price*$d['discount_value']/10);
  137. $member_yh_price=$price-$price*$d['discount_value']/10;
  138. }elseif ($d['discount_method']==2){
  139. //$value=$d['discount_value'].'元';
  140. //$member_price=$price-$d['discount_value'];
  141. $member_yh_price=$d['discount_value'];
  142. }elseif ($d['discount_method']==3){
  143. //$value=$d['discount_value'].'%';
  144. //$member_price=$price-($cost_price*$d['discount_value']/100);
  145. $member_yh_price=$cost_price*$d['discount_value']/100;
  146. }
  147. if($max_member_price<$member_yh_price){
  148. $max_member_price=$member_yh_price;
  149. }
  150. /*$member_hyj_lr=$member_price-$cost_price;
  151. $member_hyj_lrl=round(($member_price-$cost_price)*100/$cost_price.'%',2);
  152. $arr[]=$level_name.':'.$value;
  153. $arr1[]=$level_name.":".$member_price.'元';
  154. $arr2[]=$level_name.":".$member_yh_price.'元';
  155. $arr3[]=$level_name.":".$member_hyj_lr.'元';
  156. $arr4[]=$level_name.":".$member_hyj_lrl.'%';*/
  157. }
  158. }
  159. $qyjyh=$price*$l['alone_rule_rate']/100;
  160. if (strpos($l['max_point_deduct'], '%') !== false) {
  161. $jfzgdkje=$price*$l['max_point_deduct']/100;
  162. }else{
  163. $jfzgdkje=$l['max_point_deduct'];
  164. }
  165. $commission_goods = Commission::getGoodsSet($l['id'])->toArray();
  166. $commission_goods_rule=unserialize($commission_goods['rule']);
  167. $commission_first_arr1=$commission_first_arr2=$commission_first_arr3=$commission_first_arr4=[];
  168. $commission_second_arr1=$commission_second_arr2=$commission_second_arr3=$commission_second_arr4=[];
  169. // $commission_third_arr1=$commission_third_arr2=$commission_third_arr3=$commission_third_arr4=[];
  170. $max_commission_first_price=$max_first_rate='0';
  171. $max_commission_second_price=$max_second_rate='0';
  172. foreach ($commission_goods_rule as $cc){
  173. // $levelName=$cc['levelName'];
  174. if($max_first_rate <$cc['first_level_rate']){
  175. $max_first_rate=$cc['first_level_rate'];
  176. }
  177. if($max_second_rate <$cc['second_level_rate']){
  178. $max_second_rate=$cc['first_level_rate'];
  179. }
  180. /*if(isset($cc['first_level_rate'])&&$cc['first_level_rate']>0){
  181. $first_level_rate=$cc['first_level_rate'];
  182. $commission_first_arr1[]=$levelName.':'.$first_level_rate.'%';
  183. $commission_first_arr2[]=$levelName.':'.$first_level_rate/100*$price.'元';
  184. $commission_first_arr3[]=$levelName.':'.($price-($first_level_rate/100*$price)-$cost_price).'元';
  185. $commission_first_arr4[]=$levelName.':'.round(($price-($first_level_rate/100*$cost_price)-$cost_price)/$cost_price,2).'%';
  186. }
  187. if(isset($cc['second_level_rate'])&&$cc['second_level_rate']>0){
  188. $second_level_rate=$cc['second_level_rate'];
  189. $commission_second_arr1[]=$levelName.':'.$second_level_rate.'%';
  190. $commission_second_arr2[]=$levelName.':'.$second_level_rate/100*$price.'元';
  191. $commission_second_arr3[]=$levelName.':'.($price-($second_level_rate/100*$price)-$cost_price).'元';
  192. $commission_second_arr4[]=$levelName.':'.round(($price-($second_level_rate/100*$cost_price)-$cost_price)/$cost_price,2).'%';
  193. }*/
  194. /* if(isset($cc['third_level_rate'])&&$cc['third_level_rate']>0){
  195. $third_level_rate=$cc['third_level_rate'];
  196. $commission_third_arr1[]=$levelName.':'.$third_level_rate.'%';
  197. $commission_third_arr2[]=$levelName.':'.$third_level_rate/100*$price.'元';
  198. $commission_third_arr3[]=$levelName.':'.($price-($third_level_rate/100*$price)-$cost_price).'元';
  199. $commission_third_arr4[]=$levelName.':'.round(($price-($third_level_rate/100*$cost_price)-$cost_price)/$cost_price,2).'%';
  200. }*/
  201. }
  202. $max_commission_first_price=$max_first_rate/100*$price;
  203. $max_commission_second_price=$max_second_rate/100*$price;
  204. $max_price_arr=[$max_member_price,$jfzgdkje];
  205. if($l['qtj_status']==1&&$l['alone_rule']==1){
  206. array_push($max_price_arr,$qyjyh);
  207. }
  208. if($deduction_set==1){
  209. array_push($max_price_arr,$price*$deduction_set_max/100);
  210. }
  211. if($commission_goods['is_commission']==1&& $commission_goods['has_commission']==1){
  212. array_push($max_price_arr,$max_commission_first_price,$max_commission_second_price);
  213. }
  214. $max_price=array_sum($max_price_arr);
  215. $record = [
  216. 'goods_id' => $l['id'],
  217. 'goods_option_id'=>$l['goods_option_id'],
  218. 'product_price' => $price,
  219. 'cost_price' => $cost_price,
  220. 'max_price'=>$max_price
  221. ];
  222. $sf_price=$price-$max_price;
  223. if ($record['product_price'] <= $record['cost_price']||$sf_price<=$record['cost_price']) {
  224. //DB::table('yz_goods')->where('id',$record['goods_id'])->update(['status'=>0]);
  225. $alert[] = $record;
  226. }
  227. }
  228. return $alert;
  229. }
  230. }