SportsBagService.php 22 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511
  1. <?php
  2. namespace App\Service;
  3. use App\Model\BasicType;
  4. use App\Model\Construction;
  5. use App\Model\Employee;
  6. use App\Model\EmployeeDepartPermission;
  7. use App\Model\PurchaseOrder;
  8. use App\Model\SalesOrder;
  9. use App\Model\SeeRange;
  10. use App\Model\SportsBag;
  11. use App\Model\SportsBagProductInfo;
  12. use App\Model\WxEmployeeOfficial;
  13. use Illuminate\Support\Facades\DB;
  14. class SportsBagService extends Service
  15. {
  16. public function edit($data,$user){
  17. list($status,$msg) = $this->orderRule($data,$user,false);
  18. if(!$status) return [$status,$msg];
  19. $params = $this->getDataFile($data);
  20. (new OperationLogService())->setOperationList($params,$user,2);
  21. try{
  22. DB::beginTransaction();
  23. $material_model = SportsBag::where('id',$data['id'])->first();
  24. $material_model->title = $data['title'];
  25. $material_model->purchase_attribute = $data['purchase_attribute'];
  26. $material_model->is_attribute = $data['is_attribute'];
  27. $material_model->mark = $data['mark'] ?? "";
  28. $material_model->number = $data['number'];
  29. $material_model->start_time = $data['start_time'] ?? 0;
  30. $material_model->end_time = $data['end_time'] ?? 0;
  31. $material_model->total_amount = $data['total_amount'] ?? 0;
  32. $material_model->save();
  33. $time = time();
  34. SportsBagProductInfo::where('del_time',0)
  35. ->where('sports_bag_id',$data['id'])
  36. ->update(['del_time' => $time]);
  37. if(!empty($data['product'])){
  38. $map = (new ProductService())->getProductDetail(array_column($data['product'],'product_id'));
  39. $sub = [];
  40. foreach ($data['product'] as $value){
  41. $tmp = $map[$value['product_id']] ?? [];
  42. $sub[] = [
  43. 'sports_bag_id' => $material_model->id,
  44. 'product_id' => $value['product_id'],
  45. 'number' => $value['number'],
  46. 'mark' => $value['mark'] ?? '',
  47. 'cost' => $value['cost'] ?? 0,
  48. 'retail_price' => $tmp['retail_price'] ?? 0,
  49. 'crt_time' => $time,
  50. 'basic_type_id' => $value['basic_type_id'],
  51. 'price' => $value['price'],
  52. ];
  53. }
  54. SportsBagProductInfo::insert($sub);
  55. }
  56. DB::commit();
  57. }catch (\Throwable $e){
  58. DB::rollBack();
  59. return [false,$e->getMessage()];
  60. }
  61. if(! empty($data['check'])) {
  62. list($status,$msg) = (new CheckService())->checkAll([
  63. "id" => $material_model->id,
  64. "order_number" => $data['order_number'],
  65. "opt_case" => CheckService::twl,
  66. "menu_id" => $data['menu_id']
  67. ],$user);
  68. if(! $status) return [true, '保存成功,活动包确认失败,异常信息:' . $msg];
  69. }
  70. return [true,''];
  71. }
  72. public function add($data,$user){
  73. list($status,$msg) = $this->orderRule($data,$user);
  74. if(!$status) return [$status,$msg];
  75. try{
  76. DB::beginTransaction();
  77. $material_model = new SportsBag();
  78. $material_model->order_number = $data['order_number'];
  79. $material_model->purchase_attribute = $data['purchase_attribute'];
  80. $material_model->is_attribute = $data['is_attribute'];
  81. $material_model->title = $data['title'];
  82. $material_model->mark = $data['mark'] ?? "";
  83. $material_model->number = $data['number'];
  84. $material_model->start_time = $data['start_time'] ?? 0;
  85. $material_model->end_time = $data['end_time'] ?? 0;
  86. $material_model->crt_id = $user['id'];
  87. $material_model->depart_id = $data['depart_id'] ?? 0;
  88. $material_model->top_depart_id = $data['top_depart_id'] ?? 0;
  89. $material_model->total_amount = $data['total_amount'] ?? 0;
  90. $material_model->save();
  91. $time = time();
  92. if(!empty($data['product'])){
  93. $map = (new ProductService())->getProductDetail(array_column($data['product'],'product_id'));
  94. $sub = [];
  95. foreach ($data['product'] as $value){
  96. $tmp = $map[$value['product_id']] ?? [];
  97. $sub[] = [
  98. 'sports_bag_id' => $material_model->id,
  99. 'product_id' => $value['product_id'],
  100. 'number' => $value['number'],
  101. 'mark' => $value['mark'] ?? '',
  102. 'cost' => $value['cost'] ?? 0,
  103. 'retail_price' => $tmp['retail_price'] ?? 0,
  104. 'crt_time' => $time,
  105. 'basic_type_id' => $value['basic_type_id'],
  106. 'price' => $value['price'],
  107. ];
  108. }
  109. SportsBagProductInfo::insert($sub);
  110. }
  111. if(! empty($data['check'])) {
  112. list($status,$msg) = (new CheckService())->checkAll([
  113. "id" => $material_model->id,
  114. "order_number" => $data['order_number'],
  115. "opt_case" => CheckService::twl,
  116. "menu_id" => $data['menu_id']
  117. ],$user);
  118. if(! $status) return [true, '保存成功,活动包确认失败,异常信息:' . $msg];
  119. }
  120. DB::commit();
  121. }catch (\Throwable $e){
  122. DB::rollBack();
  123. if (str_contains($e->getMessage(), '1062') || str_contains($e->getMessage(), 'Duplicate entry')) {
  124. return [false, '网络环境波动,请重新操作'];
  125. }
  126. return [false,$e->getMessage()];
  127. }
  128. (new OperationLogService())->setOperationList($data,$user);
  129. if(! empty($data['check'])) {
  130. list($status,$msg) = (new CheckService())->checkAll([
  131. "id" => $material_model->id,
  132. "order_number" => $data['order_number'],
  133. "opt_case" => CheckService::twl,
  134. "menu_id" => $data['menu_id']
  135. ],$user);
  136. if(! $status) return [true, '保存成功,活动包确认失败,异常信息:' . $msg];
  137. }
  138. return [true,''];
  139. }
  140. public function detail($data){
  141. if($this->isEmpty($data,'id')) return [false,'请选择数据'];
  142. $order = SportsBag::where('id',$data['id'])
  143. ->where('del_time',0)
  144. ->first();
  145. if(empty($order)) return [false, '活动包不存在或已被删除'];
  146. $order = $order->toArray();
  147. $purchase_attribute = explode(',',$order['purchase_attribute']);
  148. if($order['is_attribute'] == 1){
  149. $purchase_attribute = explode(',',$order['purchase_attribute']);
  150. $str2 = "";
  151. foreach ($purchase_attribute as $value){
  152. $tmp = SalesOrder::$model_type_title[$value] ?? "";
  153. if(! empty($tmp)) $str2 .= $tmp . ',';
  154. }
  155. $order['purchase_attribute_title'] = rtrim($str2,',');
  156. }else{
  157. $basic_type = BasicType::whereIn('id',$purchase_attribute)->pluck('title','id')->toArray();
  158. $str = "";
  159. if(! empty($basic_type)){
  160. foreach ($purchase_attribute as $value){
  161. $str .= $basic_type[$value] . ',';
  162. }
  163. }
  164. $order['purchase_attribute_title'] = rtrim($str,',');
  165. }
  166. $start_time = $order['start_time'] ? date("Y-m-d H:i",$order['start_time']) : '';
  167. $end_time = $order['end_time'] ? date("Y-m-d H:i",$order['end_time']) : '';
  168. $order['sports_bag_time'] = $start_time . '——' . $end_time;
  169. $order['product'] = $order['depart'] = $order['employee'] = [];
  170. $info = SportsBagProductInfo::where('del_time',0)
  171. ->where('sports_bag_id',$data['id'])
  172. ->get()->toArray();
  173. $map = (new ProductService())->getProductDetail(array_column($info,'product_id'));
  174. foreach ($info as $value){
  175. $tmp = $map[$value['product_id']] ?? [];
  176. $value['title'] = $tmp['title'] ?? "";
  177. $value['code'] = $tmp['code'] ?? "";
  178. $value['size'] = $tmp['size'] ?? "";
  179. $value['unit'] = $tmp['unit'] ?? "";
  180. $value['bar_code'] = $tmp['bar_code'] ?? "";
  181. $order['product'][] = $value;
  182. }
  183. $order['crt_name'] = Employee::where('id',$order['crt_id'])->value('emp_name');
  184. $order['crt_time'] = $order['crt_time'] ? date("Y-m-d H:i:s",$order['crt_time']): '';
  185. $state_array = $this->getStateMake([$order]);
  186. $order['state_title'] = $this->makeState($order,$state_array);
  187. //可见范围
  188. $return = (new RangeService())->RangeDetail($order['id'],SeeRange::type_eight);
  189. $order['depart'] = $return[0] ?? [];
  190. $order['employee'] = $return[1] ?? [];
  191. return [true, $order];
  192. }
  193. public function del($data,$user){
  194. if($this->isEmpty($data,'id')) return [false,'请选择数据!'];
  195. $order = SportsBag::where('del_time',0)->where('id',$data['id'])->first();
  196. if(empty($order)) return [false,'活动包不存在或已被删除'];
  197. if($order['state'] > SportsBag::STATE_ZERO) return [false, '请确认活动包状态,删除失败!'];
  198. try{
  199. DB::beginTransaction();
  200. SportsBag::where('id',$data['id'])->update([
  201. 'del_time'=>time()
  202. ]);
  203. SportsBagProductInfo::where('sports_bag_id',$data['id'])->update([
  204. 'del_time'=>time()
  205. ]);
  206. (new RangeService())->RangeDelete($data['id'],SeeRange::type_eight);
  207. DB::commit();
  208. }catch (\Throwable $e){
  209. DB::rollBack();
  210. return [false,$e->getMessage()];
  211. }
  212. return [true,''];
  213. }
  214. public function getList($data,$user){
  215. $model = SportsBag::SportsBagClear($user,$data);
  216. $model = $model->where('del_time',0)
  217. ->select('id','title','number','start_time','end_time','crt_time','crt_id','mark','total_amount','state','order_number','purchase_attribute',"is_attribute")
  218. ->orderby('id', 'desc');
  219. if(! empty($data['order_number'])) $model->where('order_number', 'LIKE', '%'.$data['order_number'].'%');
  220. if(! empty($data['is_attribute'])) $model->where('is_attribute',$data['is_attribute']);
  221. if(! empty($data['purchase_attribute'])) $model->whereRaw("FIND_IN_SET(?, purchase_attribute)", [$data['purchase_attribute']]);
  222. if(isset($data['state'])) $model->where('state', $data['state']);
  223. if(isset($data['valid'])) {
  224. //获取有效时间内的活动包
  225. $time = time();
  226. $model->where('start_time','<=',$time);
  227. $model->where('end_time','>=',$time);
  228. }
  229. if(! empty($data['title'])) $model->where('title', 'LIKE', '%'.$data['title'].'%');
  230. if(! empty($data['mark'])) $model->where('mark', 'LIKE', '%'.$data['mark'].'%');
  231. if(! empty($data['crt_time'][0]) && ! empty($data['crt_time'][1])) {
  232. $return = $this->changeDateToTimeStampAboutRange($data['crt_time']);
  233. $model->where('crt_time','>=',$return[0]);
  234. $model->where('crt_time','<=',$return[1]);
  235. }
  236. if(! empty($data['sports_bag_time'][0]) && ! empty($data['sports_bag_time'][1])) {
  237. $start_time = $this->changeDateToDateMin($data['sports_bag_time'][0]);
  238. $end_time = $this->changeDateToDateMin($data['sports_bag_time'][1]);
  239. $model->where('start_time','>=',$start_time);
  240. $model->where('end_time','<=',$end_time);
  241. }
  242. $list = $this->limit($model,'',$data);
  243. $list = $this->fillListData($list,$data);
  244. return [true, $list];
  245. }
  246. public function fillListData($data,$ergs){
  247. if(empty($data['data'])) return $data;
  248. $emp_id = array_unique(array_merge_recursive(array_column($data['data'],'crt_id')));
  249. $emp_map = Employee::whereIn('id',$emp_id)
  250. ->pluck('emp_name','id')
  251. ->toArray();
  252. list($product_price, $product) = $this->getProductMessage(array_column($data['data'],'id'), $ergs);
  253. //订单状态数据组织
  254. $state_array = $this->getStateMake($data['data']);
  255. foreach ($data['data'] as $key => $value){
  256. $start_time = $value['start_time'] ? date("Y-m-d H:i",$value['start_time']) : '';
  257. $end_time = $value['end_time'] ? date("Y-m-d H:i",$value['end_time']) : '';
  258. $data['data'][$key]['sports_bag_time'] = $start_time . '——' . $end_time;
  259. $data['data'][$key]['crt_time'] = $value['crt_time'] ? date("Y-m-d H:i:s",$value['crt_time']) : '';
  260. $data['data'][$key]['crt_name'] = $emp_map[$value['crt_id']] ?? '';
  261. $data['data'][$key]['state_title'] = $this->makeState($data['data'][$key], $state_array);
  262. $data['data'][$key]['product'] = $product[$value['id']] ?? [];
  263. $data['data'][$key]['ori_total_amount'] = $product_price[$value['id']] ?? 0;
  264. $data['data'][$key]['is_attribute_title'] = SportsBag::$attribute_name[$value['is_attribute']] ?? "";
  265. }
  266. return $data;
  267. }
  268. public function getProductMessage($sports_bag_id = [], $data){
  269. $product_price = $product_message = [];
  270. if(empty($sports_bag_id)) return [$product_price, $product_message];
  271. $sales_p_info = SportsBagProductInfo::where('del_time',0)
  272. ->whereIn('sports_bag_id', $sports_bag_id)
  273. ->get()->toArray();
  274. //产品信息
  275. $map = [];
  276. if(! empty($data['product'])) $map = (new ProductService())->getProductDetail(array_column($sales_p_info,'product_id'));
  277. foreach ($sales_p_info as $value){
  278. if(! empty($data['product'])){
  279. $tmp = $map[$value['product_id']] ?? [];
  280. $value['title'] = $tmp['title'] ?? "";
  281. $value['code'] = $tmp['code'] ?? "";
  282. $value['size'] = $tmp['size'] ?? "";
  283. $value['unit'] = $tmp['unit'] ?? "";
  284. $value['bar_code'] = $tmp['bar_code'] ?? "";
  285. $product_message[$value['sports_bag_id']][] = $value;
  286. }
  287. $tmp = bcmul($value['retail_price'], $value['number'], 2);
  288. if(isset($product_price[$value['sports_bag_id']])){
  289. $product_price[$value['sports_bag_id']] = bcadd($tmp, $product_price[$value['sports_bag_id']],2);
  290. }else{
  291. $product_price[$value['sports_bag_id']] = $tmp;
  292. }
  293. }
  294. return [$product_price, $product_message];
  295. }
  296. public function makeState($value, $state_array){
  297. $nowStamp = time();
  298. if(! empty($state_array[$value['order_number']])){
  299. $return = $state_array[$value['order_number']];
  300. if($value['state'] == SportsBag::State_minus_one){
  301. $state = "驳回:" . $return;
  302. }else{
  303. $state = "待" . $return . "审核";
  304. }
  305. }elseif($value['state'] == SportsBag::STATE_ZERO){
  306. $state = "待" . $value['crt_name'] . "提交";
  307. }else{
  308. $attribute_2 = "";
  309. if($value['state'] == SportsBag::STATE_TWO){
  310. if($nowStamp < $value['start_time']){
  311. $attribute_2 = "待开始";
  312. }elseif ($nowStamp > $value['end_time']){
  313. $attribute_2 = "已结束";
  314. }elseif ($nowStamp >= $value['start_time'] && $nowStamp <= $value['end_time']){
  315. $attribute_2 = "正在进行";
  316. }
  317. }
  318. $state = SportsBag::$name[$value['state']] ?? '';
  319. if(! empty($attribute_2)) $state = $state . "($attribute_2)";
  320. }
  321. return $state;
  322. }
  323. public function getStateMake($data){
  324. if(empty($data)) return [];
  325. $order_no = [];
  326. foreach ($data as $value){
  327. if(! in_array($value['state'], [SportsBag::State_minus_one,SportsBag::STATE_ONE])) continue;
  328. $order_no[] = $value['order_number'];
  329. }
  330. return (new OaService())->getOaTeamDetailList($order_no);
  331. }
  332. public function orderRule(&$data, $user, $is_check = true){
  333. if(empty($data['title'])) return [false,'请填写活动名称'];
  334. if(empty($data['sports_bag_time'][0]) || empty($data['sports_bag_time'][1])) return [false,'请填写活动时间范围'];
  335. if(empty($data['is_attribute'])) return [false, '请选择销售属性|采购属性'];
  336. if(empty($data['purchase_attribute'])) return [false, '请选择销售属性|采购属性对应的数据'];
  337. $data['start_time'] = $this->changeDateToDateMin($data['sports_bag_time'][0]);
  338. $data['end_time'] = $this->changeDateToDateMin($data['sports_bag_time'][1]);
  339. if(empty($data['number'])) return [false,'必选产品种数不能为空'];
  340. $res = $this->checkNumber($data['number']);
  341. if(! $res) return [false,'请输入正确的必选产品种数'];
  342. if(empty($data['total_amount'])) return [false,'活动包总金额不能为空'];
  343. $res = $this->checkNumber($data['total_amount']);
  344. if(! $res) return [false,'活动包总金额请输入不超过两位小数并且大于0的数值'];
  345. if(empty($data['product'])) return [false, '请选择产品'];
  346. foreach ($data['product'] as $value){
  347. if(empty($value['number'])) return [false,'产品数量不能为空'];
  348. $res = $this->checkNumber($value['number']);
  349. if(! $res) return [false,'请输入正确的产品数量'];
  350. }
  351. //所属部门 以及 顶级部门
  352. if(empty($data['depart_id'])) $data['depart_id'] = $this->getDepart($user);
  353. $data['top_depart_id'] = $user['depart_map'][$data['depart_id']] ?? 0;
  354. if($is_check){
  355. $order_number = (new OrderNoService())->createOrderNumber(SportsBag::prefix);
  356. if(empty($order_number)) return [false,'活动包唯一单号生成失败!'];
  357. $data['order_number'] = $order_number;
  358. }else{
  359. if($this->isEmpty($data,'id')) return [false,'活动包ID不能为空!'];
  360. $purchase = SportsBag::where('del_time',0)->where('id',$data['id'])->first();
  361. if(empty($purchase)) return [false, '活动包不存在或已被删除'];
  362. if($purchase->state > SportsBag::STATE_ZERO) return [false,'请确认活动包状态,修改失败'];
  363. }
  364. return [true, ''];
  365. }
  366. public function checkSportsBag($id = []){
  367. if(empty($id)) return [true, ''];
  368. $now = time();
  369. $bag = SportsBag::whereIn('id',$id)
  370. ->select('id','title','start_time','end_time','state','del_time')
  371. ->get()->toArray();
  372. $return = [];
  373. foreach ($bag as $value){
  374. if($value['del_time'] > 0){
  375. $return[] = "活动包" . $value['title'] ."已删除或不存在";
  376. }elseif($value['state'] < SportsBag::STATE_TWO){
  377. $return[] = "活动包" . $value['title'] ."审核未通过";
  378. }elseif($now < $value['start_time'] || $now > $value['end_time']){
  379. $return[] = "活动包" . $value['title'] ."未在活动时间内,请稍等";
  380. }
  381. }
  382. if(! empty($return)){
  383. $msg = implode(' | ', $return);
  384. return [false, $msg];
  385. }
  386. return [true, ''];
  387. }
  388. //发送消息
  389. public function sportsBagSendWx($data, $user){
  390. list($status,$msg) = $this->sportsBagSendWxRule($data);
  391. if(! $status) return [false,$msg];
  392. //发送消息
  393. $send_data = $msg;
  394. (new OaService())->sendWxOaCheckMessage($send_data);
  395. return [true, ''];
  396. }
  397. public function sportsBagSendWxRule($data){
  398. if(empty($data['id'])) return [false,'请选择活动包'];
  399. if(empty($data['depart_id'])) return [false, '请选择门店'];
  400. $customer = SportsBag::where('del_time',0)
  401. ->where('state','>=',SportsBag::STATE_TWO)
  402. ->whereIn('id',$data['id'])
  403. ->get()->toArray();
  404. if(empty($customer)) return [false,'活动包未审核通过、不存在或已被删除'];
  405. $employee_id = EmployeeDepartPermission::whereIn('depart_id',$data['depart_id'])
  406. ->select('employee_id')
  407. ->get()->toArray();
  408. if(empty($employee_id)) return [true, '门店下无人员信息,公众号消息发送结束'];
  409. $employee_id = array_unique(array_column($employee_id,'employee_id'));
  410. $wx_map = WxEmployeeOfficial::whereIn('employee_id', $employee_id)
  411. ->pluck('openid','employee_id')
  412. ->toArray();
  413. $emp = Employee::whereIn('id', $employee_id)
  414. ->pluck('emp_name','id')
  415. ->toArray();
  416. $send_data = [];
  417. foreach ($employee_id as $value){
  418. $tmp = $emp[$value] ?? "";
  419. $open_id = $wx_map[$value] ?? "";
  420. // if(empty($open_id)) return [false, $tmp . "暂未关注微信公众号,公众号消息发送失败"];
  421. if(empty($open_id)) continue;
  422. foreach ($customer as $sport){
  423. //提醒
  424. $send_data[] = [
  425. 'employee_id' => $value,
  426. 'type' => 2,
  427. 'state' => 0,
  428. 'menu_id' => "30",
  429. 'openid' => $open_id,
  430. 'order_number' => $sport['order_number'],
  431. 'tmp_data' => [
  432. $sport['order_number'],
  433. "活动包消息提醒",
  434. "已发送",
  435. $tmp,
  436. date('Y-m-d H:i:s'),
  437. ],
  438. ];
  439. }
  440. }
  441. return [true, $send_data];
  442. }
  443. }