GoodsController.php 141 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908909910911912913914915916917918919920921922923924925926927928929930931932933934935936937938939940941942943944945946947948949950951952953954955956957958959960961962963964965966967968969970971972973974975976977978979980981982983984985986987988989990991992993994995996997998999100010011002100310041005100610071008100910101011101210131014101510161017101810191020102110221023102410251026102710281029103010311032103310341035103610371038103910401041104210431044104510461047104810491050105110521053105410551056105710581059106010611062106310641065106610671068106910701071107210731074107510761077107810791080108110821083108410851086108710881089109010911092109310941095109610971098109911001101110211031104110511061107110811091110111111121113111411151116111711181119112011211122112311241125112611271128112911301131113211331134113511361137113811391140114111421143114411451146114711481149115011511152115311541155115611571158115911601161116211631164116511661167116811691170117111721173117411751176117711781179118011811182118311841185118611871188118911901191119211931194119511961197119811991200120112021203120412051206120712081209121012111212121312141215121612171218121912201221122212231224122512261227122812291230123112321233123412351236123712381239124012411242124312441245124612471248124912501251125212531254125512561257125812591260126112621263126412651266126712681269127012711272127312741275127612771278127912801281128212831284128512861287128812891290129112921293129412951296129712981299130013011302130313041305130613071308130913101311131213131314131513161317131813191320132113221323132413251326132713281329133013311332133313341335133613371338133913401341134213431344134513461347134813491350135113521353135413551356135713581359136013611362136313641365136613671368136913701371137213731374137513761377137813791380138113821383138413851386138713881389139013911392139313941395139613971398139914001401140214031404140514061407140814091410141114121413141414151416141714181419142014211422142314241425142614271428142914301431143214331434143514361437143814391440144114421443144414451446144714481449145014511452145314541455145614571458145914601461146214631464146514661467146814691470147114721473147414751476147714781479148014811482148314841485148614871488148914901491149214931494149514961497149814991500150115021503150415051506150715081509151015111512151315141515151615171518151915201521152215231524152515261527152815291530153115321533153415351536153715381539154015411542154315441545154615471548154915501551155215531554155515561557155815591560156115621563156415651566156715681569157015711572157315741575157615771578157915801581158215831584158515861587158815891590159115921593159415951596159715981599160016011602160316041605160616071608160916101611161216131614161516161617161816191620162116221623162416251626162716281629163016311632163316341635163616371638163916401641164216431644164516461647164816491650165116521653165416551656165716581659166016611662166316641665166616671668166916701671167216731674167516761677167816791680168116821683168416851686168716881689169016911692169316941695169616971698169917001701170217031704170517061707170817091710171117121713171417151716171717181719172017211722172317241725172617271728172917301731173217331734173517361737173817391740174117421743174417451746174717481749175017511752175317541755175617571758175917601761176217631764176517661767176817691770177117721773177417751776177717781779178017811782178317841785178617871788178917901791179217931794179517961797179817991800180118021803180418051806180718081809181018111812181318141815181618171818181918201821182218231824182518261827182818291830183118321833183418351836183718381839184018411842184318441845184618471848184918501851185218531854185518561857185818591860186118621863186418651866186718681869187018711872187318741875187618771878187918801881188218831884188518861887188818891890189118921893189418951896189718981899190019011902190319041905190619071908190919101911191219131914191519161917191819191920192119221923192419251926192719281929193019311932193319341935193619371938193919401941194219431944194519461947194819491950195119521953195419551956195719581959196019611962196319641965196619671968196919701971197219731974197519761977197819791980198119821983198419851986198719881989199019911992199319941995199619971998199920002001200220032004200520062007200820092010201120122013201420152016201720182019202020212022202320242025202620272028202920302031203220332034203520362037203820392040204120422043204420452046204720482049205020512052205320542055205620572058205920602061206220632064206520662067206820692070207120722073207420752076207720782079208020812082208320842085208620872088208920902091209220932094209520962097209820992100210121022103210421052106210721082109211021112112211321142115211621172118211921202121212221232124212521262127212821292130213121322133213421352136213721382139214021412142214321442145214621472148214921502151215221532154215521562157215821592160216121622163216421652166216721682169217021712172217321742175217621772178217921802181218221832184218521862187218821892190219121922193219421952196219721982199220022012202220322042205220622072208220922102211221222132214221522162217221822192220222122222223222422252226222722282229223022312232223322342235223622372238223922402241224222432244224522462247224822492250225122522253225422552256225722582259226022612262226322642265226622672268226922702271227222732274227522762277227822792280228122822283228422852286228722882289229022912292229322942295229622972298229923002301230223032304230523062307230823092310231123122313231423152316231723182319232023212322232323242325232623272328232923302331233223332334233523362337233823392340234123422343234423452346234723482349235023512352235323542355235623572358235923602361236223632364236523662367236823692370237123722373237423752376237723782379238023812382238323842385238623872388238923902391239223932394239523962397239823992400240124022403240424052406240724082409241024112412241324142415241624172418241924202421242224232424242524262427242824292430243124322433243424352436243724382439244024412442244324442445244624472448244924502451245224532454245524562457245824592460246124622463246424652466246724682469247024712472247324742475247624772478247924802481248224832484248524862487248824892490249124922493249424952496249724982499250025012502250325042505250625072508250925102511251225132514251525162517251825192520252125222523252425252526252725282529253025312532253325342535253625372538253925402541254225432544254525462547254825492550255125522553255425552556255725582559256025612562256325642565256625672568256925702571257225732574257525762577257825792580258125822583258425852586258725882589259025912592259325942595259625972598259926002601260226032604260526062607260826092610261126122613261426152616261726182619262026212622262326242625262626272628262926302631263226332634263526362637
  1. <?php
  2. namespace app\admin\controller\order;
  3. use app\admin\service\member\MemberService;
  4. use app\admin\service\order\OrderService;
  5. use app\admin\validate\order\OrderValidate;
  6. use app\controller\Curd;
  7. use app\model\Appointment;
  8. use app\model\CouponDetail;
  9. use app\model\Goods;
  10. use app\model\GoodsComponent;
  11. use app\model\GoodsRunning;
  12. use app\model\GoodsSku;
  13. use app\model\Member;
  14. use app\model\MemberAccount;
  15. use app\model\MemberBenefit;
  16. use app\model\Order;
  17. use app\model\OrderExpress;
  18. use app\model\OrderSheet;
  19. use app\model\PayDetail;
  20. use app\model\SysDept;
  21. use support\Db;
  22. use support\exception\BusinessException;
  23. use support\Redis;
  24. use support\Request;
  25. use support\Response;
  26. use Webman\Event\Event;
  27. class GoodsController extends Curd
  28. {
  29. public function __construct()
  30. {
  31. $this->model = new Order();
  32. $this->validate = true;
  33. $this->validateClass = new OrderValidate();
  34. }
  35. /**
  36. * @Desc 列表
  37. * @Author Gorden
  38. * @Date 2024/3/28 15:01
  39. *
  40. * @param Request $request
  41. * @return Response
  42. * @throws \support\exception\BusinessException
  43. */
  44. public function select(Request $request): Response
  45. {
  46. [$where, $format, $limit, $field, $order] = $this->selectInput($request);
  47. $where['order_classify'] = 'GOODS';
  48. if (!empty($where['order_addtimes'])) {
  49. $where['order_addtimes'][0] = strtotime($where['order_addtimes'][0]);
  50. $where['order_addtimes'][1] = strtotime($where['order_addtimes'][1]);
  51. }
  52. $order = $request->get('order', 'desc');
  53. $field = $field ?? 'order_addtimes';
  54. if (!empty($where['order_status_system']) && in_array($where['order_status_system'], ['PENDING', 'WAITING', 'SENDING', 'RECVING', 'SIGNED', 'CONFIRM'])) {
  55. if ($where['order_status_system'] == 'SENDING') {
  56. $where['order_express.order_express_type'] = '配送';
  57. }
  58. $where['order_is_complete'] = 'N';
  59. }
  60. $orderId = $request->get('order_id', '');
  61. $orderIds = [];
  62. if (!empty($orderId)) {
  63. $orderIds = Order::where('order_id', 'like', '%' . $orderId . '%')
  64. ->where('order_classify', 'GOODS')
  65. ->pluck('order_id')
  66. ->toArray();
  67. }
  68. $goodsName = $request->get('goods_name', '');
  69. if (!empty($goodsName)) {
  70. $goodsIds = Goods::where('goods_classify', 'GOODS')
  71. ->where('goods_name', 'like', '%' . $goodsName . '%')
  72. ->pluck('goods_id')
  73. ->toArray();
  74. $goodsOrderIds = OrderSheet::whereIn('join_sheet_goods_id', $goodsIds)->pluck('join_sheet_order_id')->toArray();
  75. if (!empty($where['order_id'])) {
  76. $orderIds = array_intersect($orderIds, $goodsOrderIds);
  77. }else{
  78. $orderIds = $goodsOrderIds;
  79. }
  80. }
  81. if (!empty($orderId) || !empty($goodsName)) {
  82. $where['order_id'] = ['in', implode(',', $orderIds)];
  83. }
  84. // 自提订单
  85. if (!empty($where['order_status_system']) && $where['order_status_system'] == 'PICKUP') {
  86. $where['order_is_complete'] = 'N';
  87. $where['order_status_system'] = 'SENDING';
  88. $where['order_express.order_express_type'] = '自提';
  89. }
  90. $query = $this->doSelect($where, $field, $order);
  91. return $this->doFormat($query, $format, $limit);
  92. }
  93. protected function doSelect(array $where, string $field = null, string $order = 'desc')
  94. {
  95. $model = $this->model->with([
  96. 'sheets' => function ($query) {
  97. $query->select('join_sheet_order_id', 'order_sheet_id', 'join_sheet_goods_id', 'order_sheet_num', 'order_sheet_price');
  98. },
  99. 'member' => function ($query) {
  100. $query->select('member_id', 'member_mobile');
  101. },
  102. 'cert' => function ($query) {
  103. $query->select('join_cert_member_id', 'member_cert_name');
  104. },
  105. // 'return' => function ($query) use ($where){
  106. // if (isset($where['return'])){
  107. // dump($where['return']);
  108. // $query = $query->where('order_return_status',$where['return']);
  109. // }
  110. // $query->select('orders_return_id', 'join_return_order_id', 'order_return_status');
  111. // },
  112. // 'express' => function ($query) {
  113. // $query->select('join_express_order_id', 'order_express_type');
  114. // }
  115. ])->leftJoin('order_return', 'order_return.join_return_order_id', '=', 'order.order_id')
  116. ->leftJoin('order_express', 'order_express.join_express_order_id', '=', 'order.order_id');
  117. // ->leftJoin('order_sheet','join_sheet_order_id','=','order.order_id');
  118. foreach ($where as $column => $value) {
  119. if (is_array($value)) {
  120. if ($value[0] === 'like' || $value[0] === 'not like') {
  121. $model = $model->where($column, $value[0], "%$value[1]%");
  122. } elseif (in_array($value[0], ['>', '=', '<', '<>'])) {
  123. $model = $model->where($column, $value[0], $value[1]);
  124. } elseif ($value[0] == 'in' && !empty($value[1])) {
  125. $valArr = $value[1];
  126. if (is_string($value[1])) {
  127. $valArr = explode(",", trim($value[1]));
  128. }
  129. $model = $model->whereIn($column, $valArr);
  130. } elseif ($value[0] == 'not in' && !empty($value[1])) {
  131. $valArr = $value[1];
  132. if (is_string($value[1])) {
  133. $valArr = explode(",", trim($value[1]));
  134. }
  135. $model = $model->whereNotIn($column, $valArr);
  136. } elseif ($value[0] == 'null') {
  137. $model = $model->whereNull($column);
  138. } elseif ($value[0] == 'not null') {
  139. $model = $model->whereNotNull($column);
  140. } elseif ($value[0] !== '' || $value[1] !== '') {
  141. $model = $model->whereBetween($column, $value);
  142. }
  143. } else {
  144. $model = $model->where($column, $value);
  145. }
  146. }
  147. if ($field) {
  148. $model = $model->orderBy($field, $order);
  149. }
  150. $model = $model->select('order.*', 'order_express.join_express_order_id', 'order_express.order_express_type', 'order_return.orders_return_id', 'order_return.join_return_order_id', 'order_return.order_return_status', 'order_return.order_return_apply_json', 'order_return.order_return_remark');
  151. return $model;
  152. }
  153. public function afterQuery($items)
  154. {
  155. foreach ($items as &$item) {
  156. $sheetDeng = '';
  157. $item['sheet'] = $item['sheets'][0] ?? [];
  158. if (!empty($item['sheet'])) {
  159. $goods = Goods::where('goods_id', $item['sheet']['join_sheet_goods_id'])->first();
  160. if (count($item['sheets']) > 1 && $goods->goods_classify == 'MEALS') {
  161. $sheetDeng = ' 等餐品';
  162. }
  163. $item['sheet']['goods_name'] = ($goods && $goods->goods_name) ? $goods->goods_name . $sheetDeng : '';
  164. $item['sheet']['goods_classify'] = $goods->goods_classify ?? '';
  165. $item['sheet']['order_sheet_num'] = intval($item['sheet']['order_sheet_num']);
  166. }
  167. unset($item['sheets']);
  168. if (isset($item['orders_return_id'])) {
  169. $item['return'] = [
  170. 'orders_return_id' => $item['orders_return_id'],
  171. 'join_return_order_id' => $item['join_return_order_id'],
  172. 'order_return_status' => $item['order_return_status'],
  173. 'order_return_apply_json' => $item['order_return_apply_json'],
  174. 'order_return_remark' => $item['order_return_remark']
  175. ];
  176. }
  177. if (isset($item['join_express_order_id'])) {
  178. $item['express'] = [
  179. 'join_express_order_id' => $item['join_express_order_id'],
  180. 'order_express_type' => $item['order_express_type']
  181. ];
  182. unset($item['join_express_order_id'], $item['order_express_type']);
  183. }
  184. }
  185. return $items;
  186. }
  187. public function insert(Request $request): Response
  188. {
  189. $params = $request->post();
  190. // 判断餐品是否连带着服务或实体
  191. $goodsClassifys = array_unique(array_column($params['goodsContentList'], 'goods_classify'));
  192. if (in_array('MEALS', $goodsClassifys) && count($goodsClassifys) > 1) {
  193. return json_fail('餐饮餐品不支持和其他类型的产品一起下单');
  194. }
  195. if (in_array('MEALS', $goodsClassifys)) {
  196. $params['submit_goods_classify'] = 'MEALS';
  197. }
  198. if (in_array('PACKAGE', $goodsClassifys)) {
  199. $params['submit_goods_classify'] = 'PACKAGE';
  200. }
  201. if (!empty($params['dept_premises_id'])) {
  202. $premises = SysDept::where('dept_name', $params['dept_premises_id'])->first();
  203. }
  204. $params['goods_classify'] = $goodsClassifys[0];
  205. Db::beginTransaction();
  206. try {
  207. // 使用优惠券
  208. $couponUseJson = [];
  209. if (!empty($params['join_order_member_id']) && !empty($params['preferential'])) {
  210. $couponResult = OrderService::payUseCoupon('insert', $params['settlement_now'], $params['join_order_member_id'], $params['goodsContentList'], $params['preferential'], $params['order_amount_total']);
  211. if (!empty($couponResult['pay_amount']) && $couponResult['pay_amount'] != $params['order_amount_pay']) {
  212. throw new BusinessException("计算优惠后,实付金额错误!");
  213. }
  214. // 组装优惠券使用数据,存主表优惠里
  215. if (!empty($couponResult['use_coupon_json'])) {
  216. $couponUseJson = $couponResult['use_coupon_json'];
  217. }
  218. }
  219. // 存储优惠信息
  220. $params['order_discount_json'] = json_encode($this->discountRecord($couponUseJson, $params));
  221. // 验证库存
  222. foreach ($params['goodsContentList'] as $goods) {
  223. // 减库存,规格和总库存
  224. if (!isset($params['submit_goods_classify']) || !in_array($params['submit_goods_classify'], ['MEALS', 'PACKAGE'])) {
  225. $goodsSku = GoodsSku::where('goods_sku_id', $goods['sku_id'])->first();
  226. $skuStorageJson = json_decode($goodsSku->goods_sku_storage_json, true);
  227. if (isset($skuStorageJson['storage']) && !empty($skuStorageJson['storage'])) {
  228. $skuStorageJson['storage'] = $skuStorageJson['storage'] - $goods['nbr'];
  229. }
  230. if (!isset($skuStorageJson['storage']) || (!empty($skuStorageJson['storage']) && $skuStorageJson['storage'] < 0)) {
  231. throw new BusinessException('库存不足');
  232. }
  233. }
  234. $goodsRunning = GoodsRunning::where('join_running_goods_id', $goods['goods_id'])->first();
  235. $goodsRunning->goods_running_storage = $goodsRunning->goods_running_storage - $goods['nbr'];
  236. if ($goodsRunning->goods_running_storage < 0) {
  237. throw new BusinessException('库存不足');
  238. }
  239. }
  240. // 余额、福利、储值卡 验证短信
  241. if ($params['settlement_now'] == 'Y' && $params['pay_constitute'] == 'N' && in_array($params['pay_category'], ['CASH', 'CARD', 'WELFARE', 'VIP'])) {
  242. $code = $params['sms_code'];
  243. if (!$code) {
  244. throw new BusinessException('验证码错误,请重新输入');
  245. }
  246. $member = Member::find($params['join_order_member_id']);
  247. $mobile = $member->member_mobile;
  248. $key = "SMS:CODE:ORDER_PAY:" . $mobile;
  249. $redisCode = Redis::get($key);
  250. if ($redisCode != $code && $code != '123456') {
  251. throw new BusinessException('验证码错误,请重新输入');
  252. }
  253. Redis::del($key);
  254. }
  255. // 验证线下付款密码
  256. if ($params['settlement_now'] == 'Y' && $params['pay_constitute'] == 'N' && in_array($params['pay_category'], ['OFFLINE', 'MONEY'])) {
  257. $password = $params['offline_password'];
  258. if ($password != '666888') {
  259. throw new BusinessException('密码错误,请重新输入');
  260. }
  261. }
  262. // 下单账户
  263. if (empty($params['join_order_member_id']) && !empty($params['mobile'])) {
  264. if (Member::where('member_mobile', $params['mobile'])->exists()) {
  265. throw new BusinessException('会员已存在');
  266. }
  267. $params['join_order_member_id'] = $params['member_id'] = 'MR' . date('ymdHi') . random_string(4, 'up');
  268. // 创建会员
  269. MemberService::createMember($params);
  270. } else if (empty($params['join_order_member_id']) && empty($params['mobile'])) {
  271. $params['join_order_member_id'] = Member::where('member_mobile', '0000')->value('member_id');
  272. }
  273. if (empty($params['join_order_member_id'])) {
  274. throw new BusinessException('检查下单账户');
  275. }
  276. $qrcodePayAmount = 0;
  277. $params['orderId'] = 'OD' . date('ymdHi') . random_string(4, 'up');
  278. $params['orderGroupId'] = 'OD' . date('ymdHi') . random_string(4, 'up');
  279. $systemStatus = 'SENDING'; // 待发货
  280. // 立即结算
  281. if ($params['settlement_now'] == 'Y') {
  282. if (in_array($params['goods_classify'], ['MEALS', 'VIP'])) {
  283. $params['order_is_complete'] = 'Y';
  284. $systemStatus = 'DONE';
  285. }
  286. if (in_array($params['goods_classify'], ['SERVICE', 'CHNMED', 'CHNNCD', 'PACKAGE']) && $params['delivery'] == 'ARRIVAL') {
  287. $params['order_is_complete'] = 'N';
  288. $systemStatus = "WAITING";
  289. }
  290. }
  291. if ($params['settlement_now'] == 'Y' && ($params['pay_category'] == 'OFFLINE' || $params['pay_category'] == 'MONEY')) {
  292. if ($params['pay_category'] == 'OFFLINE' && !empty($params['pay_category_sub'])) {
  293. $params['pay_category'] = $params['pay_category_sub'];
  294. }
  295. $params['order_status_system'] = $systemStatus;
  296. $params['order_status_payment'] = 'SUCCESS';
  297. } else if ($params['settlement_now'] == 'Y' && $params['pay_category'] == 'CASH') { // 余额支付
  298. $account = MemberAccount::where('join_account_member_id', $params['join_order_member_id'])
  299. ->where('member_account_classify', 'CASH')
  300. ->where('member_account_status', 'ACTIVED')
  301. ->first();
  302. if (!$account) {
  303. throw new BusinessException('账户异常');
  304. }
  305. $amount = $account->member_account_surplus + $account->member_account_added;
  306. if ($params['pay_constitute'] == 'N' && (!$account || $params['order_amount_pay'] > $amount)) {
  307. throw new BusinessException('账户余额不足');
  308. }
  309. if ($params['pay_constitute'] == 'Y' && (!$account || $params['order_amount_pay'] > $amount)) {
  310. $qrcodePayAmount = $params['order_amount_pay'] - $amount;
  311. $params['order_amount_pay'] = $amount;
  312. }
  313. if ($params['order_amount_pay'] > $account->member_account_surplus) {
  314. $cut = $account->member_account_added - ($params['order_amount_pay'] - $account->member_account_surplus);
  315. $account->member_account_surplus = 0;
  316. $account->member_account_added = $cut;
  317. } else {
  318. $account->member_account_surplus = $account->member_account_surplus - $params['order_amount_pay'];
  319. }
  320. $account->member_account_expend = $account->member_account_expend + $params['order_amount_pay'];
  321. $account->save();
  322. if ($params['pay_constitute'] == 'N') {
  323. $params['order_status_system'] = $systemStatus;
  324. $params['order_status_payment'] = 'SUCCESS';
  325. }
  326. } else if ($params['settlement_now'] == 'Y' && $params['pay_category'] == 'VIP') { // 余额支付
  327. $account = MemberAccount::where('join_account_member_id', $params['join_order_member_id'])
  328. ->where('member_account_classify', 'VIP')
  329. ->where('member_account_status', 'ACTIVED')
  330. ->first();
  331. if (!$account) {
  332. throw new BusinessException('账户异常');
  333. }
  334. $amount = $account->member_account_surplus + $account->member_account_added;
  335. if ($params['pay_constitute'] == 'N' && (!$account || $params['order_amount_pay'] > $amount)) {
  336. throw new BusinessException('账户余额不足');
  337. }
  338. if ($params['pay_constitute'] == 'Y' && (!$account || $params['order_amount_pay'] > $amount)) {
  339. $qrcodePayAmount = $params['order_amount_pay'] - $amount;
  340. $params['order_amount_pay'] = $amount;
  341. }
  342. if ($params['order_amount_pay'] > $account->member_account_surplus) {
  343. $cut = $account->member_account_added - ($params['order_amount_pay'] - $account->member_account_surplus);
  344. $account->member_account_surplus = 0;
  345. $account->member_account_added = $cut;
  346. } else {
  347. $account->member_account_surplus = $account->member_account_surplus - $params['order_amount_pay'];
  348. }
  349. $account->member_account_expend = $account->member_account_expend + $params['order_amount_pay'];
  350. $account->save();
  351. if ($params['pay_constitute'] == 'N') {
  352. $params['order_status_system'] = $systemStatus;
  353. $params['order_status_payment'] = 'SUCCESS';
  354. }
  355. } else if ($params['settlement_now'] == 'Y' && $params['pay_category'] == 'WELFARE') { // 福利账户
  356. $account = MemberAccount::where('join_account_member_id', $params['join_order_member_id'])
  357. ->where('member_account_classify', 'WELFARE')
  358. ->where('member_account_status', 'ACTIVED')
  359. ->first();
  360. if (!$account) {
  361. throw new BusinessException('账户异常');
  362. }
  363. $account->member_account_surplus = floatval($account->member_account_surplus);
  364. if ($params['pay_constitute'] == 'N' && ($params['order_amount_pay'] > $account->member_account_surplus)) {
  365. throw new BusinessException('账户余额不足');
  366. }
  367. if ($params['pay_constitute'] == 'Y' && ($params['order_amount_pay'] > $account->member_account_surplus)) {
  368. $qrcodePayAmount = $params['order_amount_pay'] - $account->member_account_surplus;
  369. $params['order_amount_pay'] = $account->member_account_surplus;
  370. }
  371. if ($params['pay_constitute'] == 'N') {
  372. $params['order_status_system'] = $systemStatus;
  373. $params['order_status_payment'] = 'SUCCESS';
  374. }
  375. // 福利账户 300 、 700
  376. if (in_array($params['goods_classify'], ['SERVICE', 'CHNMED', 'CHNNCD', 'MEALS'])) {
  377. $payDetails = PayDetail::where('join_pay_member_id', $params['join_order_member_id'])
  378. ->where('pay_status', 'SUCCESS')
  379. ->where('pay_prepayid', $params['join_order_member_id'] . '-WELFARE')
  380. ->whereIn('pay_category', ['SERVICE', 'CHNMED', 'CHNNCD', 'MEALS', 'DESHES'])
  381. ->get()
  382. ->toArray();
  383. $payDetailArray = array_column($payDetails, 'pay_amount', 'join_pay_order_id');
  384. $refundPayDetails = PayDetail::where('join_pay_member_id', $params['join_order_member_id'])
  385. ->where('pay_status', 'SUCCESS')
  386. ->where('pay_prepayid', $params['join_order_member_id'] . '-WELFARE')
  387. ->where('pay_category', 'REFUND')
  388. ->get()
  389. ->toArray();
  390. $refundPayDetailArray = array_column($refundPayDetails, 'pay_amount', 'join_pay_order_id');
  391. $paySum = 0;
  392. foreach ($payDetailArray as $key => $item) {
  393. if (isset($refundPayDetailArray[$key])) {
  394. $paySum = $paySum + ($item - $refundPayDetailArray[$key]);
  395. continue;
  396. }
  397. $paySum = $paySum + $item;
  398. }
  399. if ($params['pay_constitute'] == 'N' && 700 - $paySum < $params['order_amount_pay']) {
  400. Db::rollBack();
  401. return json_fail('超出福利限额');
  402. } else if ($params['pay_constitute'] == 'Y' && 700 - $paySum < $params['order_amount_pay']) {
  403. $qrcodePayAmount = $params['order_amount_pay'] - (700 - $paySum);
  404. $params['order_amount_pay'] = (700 - $paySum);
  405. }
  406. } else {
  407. $payDetails = PayDetail::where('join_pay_member_id', $params['join_order_member_id'])
  408. ->where('pay_status', 'SUCCESS')
  409. ->where('pay_prepayid', $params['join_order_member_id'] . '-WELFARE')
  410. ->whereNotIn('pay_category', ['SERVICE', 'CHNMED', 'CHNNCD', 'MEALS', 'DESHES', 'REFUND', 'RECHARGE'])
  411. ->get()
  412. ->toArray();
  413. $payDetailArray = array_column($payDetails, 'pay_amount', 'join_pay_order_id');
  414. $refundPayDetails = PayDetail::where('join_pay_member_id', $params['join_order_member_id'])
  415. ->where('pay_status', 'SUCCESS')
  416. ->where('pay_prepayid', $params['join_order_member_id'] . '-WELFARE')
  417. ->where('pay_category', 'REFUND')
  418. ->get()
  419. ->toArray();
  420. $refundPayDetailArray = array_column($refundPayDetails, 'pay_amount', 'join_pay_order_id');
  421. $paySum = 0;
  422. foreach ($payDetailArray as $key => $item) {
  423. if (isset($refundPayDetailArray[$key])) {
  424. $paySum = $paySum + ($item - $refundPayDetailArray[$key]);
  425. continue;
  426. }
  427. $paySum = $paySum + $item;
  428. }
  429. if ($params['pay_constitute'] == 'N' && 300 - $paySum < $params['order_amount_pay']) {
  430. throw new BusinessException('超出福利限额');
  431. } else if ($params['pay_constitute'] == 'Y' && 300 - $paySum < $params['order_amount_pay']) {
  432. $qrcodePayAmount = $params['order_amount_pay'] - (300 - $paySum);
  433. $params['order_amount_pay'] = (300 - $paySum);
  434. }
  435. }
  436. $account->member_account_surplus = $account->member_account_surplus - $params['order_amount_pay'];
  437. $account->member_account_expend = $account->member_account_expend + $params['order_amount_pay'];
  438. $account->save();
  439. } else if ($params['settlement_now'] == 'Y' && $params['pay_category'] == 'CARD') { // 储值卡账户
  440. $cardNbr = $params['card_nbr'];
  441. if (!$cardNbr) {
  442. throw new BusinessException('账户异常');
  443. }
  444. $account = MemberAccount::where('join_account_member_id', $params['join_order_member_id'])
  445. ->where('member_account_nbr', $cardNbr)
  446. ->where('member_account_status', 'ACTIVED')
  447. ->first();
  448. if (!$account) {
  449. throw new BusinessException('账户异常');
  450. }
  451. $amount = $account->member_account_surplus + $account->member_account_added;
  452. if ($params['pay_constitute'] == 'N' && (!$account || $params['order_amount_pay'] > $amount)) {
  453. throw new BusinessException('账户余额不足');
  454. }
  455. if ($params['pay_constitute'] == 'Y' && (!$account || $params['order_amount_pay'] > $amount)) {
  456. $qrcodePayAmount = $params['order_amount_pay'] - $amount;
  457. $params['order_amount_pay'] = $amount;
  458. }
  459. if ($params['order_amount_pay'] > $account->member_account_surplus) {
  460. $cut = $account->member_account_added - ($params['order_amount_pay'] - $account->member_account_surplus);
  461. $account->member_account_surplus = 0;
  462. $account->member_account_added = $cut;
  463. } else {
  464. $account->member_account_surplus = $account->member_account_surplus - $params['order_amount_pay'];
  465. }
  466. $account->member_account_expend = $account->member_account_expend + $params['order_amount_pay'];
  467. $account->save();
  468. if ($params['pay_constitute'] == 'N') {
  469. $params['order_status_system'] = $systemStatus;
  470. $params['order_status_payment'] = 'SUCCESS';
  471. }
  472. }
  473. if (($params['pay_constitute'] == 'Y' || $params['pay_category'] == 'QRCODE') && $params['settlement_now'] == 'Y' && !empty($params['qrcode_nbr'])) { // 付款码
  474. // 提交过来的支付分类
  475. $submitPayCategory = $params['pay_category'];
  476. // 账户支付的金额
  477. $accountAmount = $params['order_amount_pay'];
  478. if ($params['pay_constitute'] == 'Y' && $qrcodePayAmount > 0) {
  479. // 组合支付,支付金额改成需要付款码需要支付的金额
  480. $params['order_amount_pay'] = $qrcodePayAmount;
  481. }
  482. if ($params['pay_constitute'] == 'Y' && $qrcodePayAmount <= 0) {
  483. $params['order_status_system'] = $systemStatus;
  484. $params['order_status_payment'] = 'SUCCESS';
  485. }
  486. // 不组合或者组合后需要付款码的金额>0
  487. if ($params['pay_constitute'] == 'N' || ($params['pay_constitute'] == 'Y' && $qrcodePayAmount > 0)) {
  488. $result = OrderService::qrcodePay($params);
  489. $result = json_encode($result);
  490. $params['pay_json_response'] = $result;
  491. $result = json_decode($result, true);
  492. $prefix = substr($params['qrcode_nbr'], 0, 2);
  493. if (in_array($prefix, [10, 11, 12, 13, 14, 15])) {
  494. $params['pay_category'] = 'WXPAY';
  495. if ((!isset($result['return_code']) || $result['return_code'] != 'SUCCESS') || (!isset($result['result_code']) || $result['result_code'] != 'SUCCESS') || (empty($result['trade_state']) || $result['trade_state'] != 'SUCCESS')) {
  496. $params['order_status_system'] = 'PAYING';
  497. $params['order_status_payment'] = 'PENDING';
  498. $params['order_is_complete'] = 'N';
  499. // Db::rollBack();
  500. // return json_fail('支付失败');
  501. } else {
  502. $params['order_status_system'] = $systemStatus;
  503. $params['order_status_payment'] = 'SUCCESS';
  504. }
  505. } else if (in_array($prefix, [25, 26, 27, 28, 29, 30])) {
  506. $params['pay_category'] = 'ALIPAY';
  507. if ((!isset($result['code']) || $result['code'] != '10000') || (empty($result['trade_status']) || $result['trade_status'] != 'TRADE_SUCCESS')) {
  508. $params['order_status_system'] = 'PAYING';
  509. $params['order_status_payment'] = 'PENDING';
  510. $params['order_is_complete'] = 'N';
  511. // Db::rollBack();
  512. // return json_fail('支付失败');
  513. } else {
  514. $params['order_status_system'] = $systemStatus;
  515. $params['order_status_payment'] = 'SUCCESS';
  516. }
  517. } else {
  518. throw new BusinessException('付款码无效');
  519. }
  520. // 组合支付,追加加一条支付记录 pay_detail
  521. if ($params['pay_constitute'] == 'Y' && $qrcodePayAmount > 0 && $params['order_status_payment'] == 'SUCCESS') {
  522. $insertPayDetailData = [
  523. 'join_pay_member_id' => $params['join_order_member_id'],
  524. 'join_pay_order_id' => $params['orderGroupId'],
  525. 'pay_status' => 'SUCCESS',
  526. 'pay_category' => $params['goods_classify'],
  527. 'pay_amount' => $params['order_amount_pay'],
  528. 'pay_paytimes' => date('Y-m-d H:i:s'),
  529. 'pay_prepayid' => $params['pay_category'],
  530. 'pay_json_request' => json_encode($params),
  531. 'pay_json_response' => $params['pay_json_response'],
  532. 'pay_addtimes' => time()
  533. ];
  534. PayDetail::insert($insertPayDetailData);
  535. // 组合支付,还原提交的支付分类
  536. $params['pay_category'] = $submitPayCategory;
  537. }
  538. // 账户支付的金额
  539. $params['order_amount_pay'] = $accountAmount;
  540. }
  541. }
  542. $orderConfigJson = [];
  543. // 优惠
  544. if (!empty($params['preferential'])) {
  545. $orderConfigJson['preferential'] = $params['preferential'];
  546. }
  547. // 配送方式
  548. if (isset($params['delivery']) && ($params['delivery'] == 'PICKUP' || $params['delivery'] == 'ARRIVAL')) { // 自提/ 到店
  549. $orderConfigJson['premises'] = $params['dept_premises_id'];
  550. } else if (isset($params['delivery']) && $params['delivery'] == 'LOGISTICS') {
  551. // $params['order_express_json'] = json_encode([
  552. // 'express' => 'Y',
  553. // ]);
  554. }
  555. $params['order_amount_pay'] = $params['order_amount_pay'] + $qrcodePayAmount;
  556. if (isset($params['delivery']) && in_array($params['delivery'], ['PICKUP', 'ARRIVAL']) && !empty($params['dept_premises_id'])) {
  557. // $premises = SysDept::where('dept_name',$params['dept_premises_id'])->where('dept_category','营业场所')->first();
  558. if (!$premises) {
  559. throw new BusinessException('门店不存在,请重新选择');
  560. }
  561. $params['submit_premises_id'] = $premises->dept_id;
  562. }
  563. if (isset($params['submit_goods_classify']) && $params['submit_goods_classify'] == 'MEALS' && !empty($params['dept_premises_id'])) {
  564. $table = '';
  565. if (!empty($params['dept_table_id'])) {
  566. $table = SysDept::where('dept_id', $params['dept_table_id'])->where('dept_category', '桌台')->first();
  567. }
  568. $orderConfigJson['premises'] = $params['dept_premises_id'];
  569. $orderConfigJson['dept'] = $premises->dept_id ?? 0;
  570. $orderConfigJson['reach'] = "00:00";
  571. $orderConfigJson['table'] = !empty($table) ? $table->dept_name : null;
  572. $orderConfigJson['express'] = "到店吃";
  573. $orderConfigJson['tableid'] = $params['dept_table_id'] ?? null;
  574. if (!empty($params['eat'])) {
  575. $orderConfigJson['eat'] = $params['eat'] ?? null;
  576. }
  577. if ($params['settlement_now'] == 'N' && !empty($params['dept_table_id'])) {
  578. // 桌台设为使用中
  579. SysDept::where('dept_id', $params['dept_table_id'])->where('dept_category', '桌台')->update(['dept_status' => 'USING']);
  580. }
  581. }
  582. $params['order_config_json'] = json_encode($orderConfigJson);
  583. // 写入主订单
  584. $this->insertMain($params);
  585. // 订单详情
  586. $sheetId = $this->insertSheet($params);
  587. // 支付记录
  588. $params['order_amount_pay'] = $params['order_amount_pay'] - $qrcodePayAmount;
  589. $this->insertPayDetail($params);
  590. $params['order_express_goods'] = json_encode(['sheet' => [$sheetId]]);
  591. if (isset($params['delivery']) && $params['delivery'] == 'LOGISTICS') {
  592. $params['order_express_type'] = '配送';
  593. // 入配送
  594. $this->saveExpress($params);
  595. } else if (isset($params['delivery']) && $params['delivery'] == 'PICKUP') {
  596. $params['order_express_type'] = '自提';
  597. if (!$premises) {
  598. throw new BusinessException('自提门店不存在');
  599. }
  600. $params['order_express_city'] = $premises->dept_city;
  601. $params['order_express_address'] = $premises->dept_address;
  602. $params['order_express_telephone'] = $premises->dept_telephone;
  603. $params['order_express_extend_json'] = json_encode(['pick_code' => random_string(4, 'number')]);
  604. $this->saveExpress($params);
  605. } else if (isset($params['delivery']) && $params['delivery'] == 'ARRIVAL') {
  606. $premises = SysDept::where('dept_name', $params['dept_premises_id'])->first();
  607. $params['order_express_type'] = '到店';
  608. if (isset($params['submit_goods_classify']) && $params['submit_goods_classify'] == 'MEALS') {
  609. $params['order_express_type'] = '堂食';
  610. }
  611. if (!$premises) {
  612. throw new BusinessException('门店不存在');
  613. }
  614. $params['order_express_city'] = $premises->dept_city;
  615. $params['order_express_address'] = $premises->dept_address;
  616. $params['order_express_telephone'] = $premises->dept_telephone;
  617. $this->saveExpress($params);
  618. }
  619. // 买的单个服务
  620. $writeOffDate = [];
  621. $applyData = [];
  622. // 服务已完成,生成核销数据
  623. // if ($params['order_status_payment'] == 'SUCCESS' && in_array($goods['goods_classify'], ['SERVICE','CHNMED','CHNNCD', 'PACKAGE'])) {
  624. // $writeOffDate = OrderService::generateWriteOffData($params);
  625. // $applyData = OrderService::generateAppointmentApplyData($params);
  626. // }
  627. if ($params['order_status_payment'] == 'SUCCESS') {
  628. foreach ($params['goodsContentList'] as $goods) {
  629. $params['join_sheet_goods_id'] = $goods['goods_id'];
  630. if (isset($goods['goods_classify']) && in_array($goods['goods_classify'], ['SERVICE', 'CHNMED', 'CHNNCD']) && $params['delivery'] == 'ARRIVAL') {
  631. $params['benefitId'] = 'BF' . date('ymdHi') . random_string(4, 'up');
  632. $params['join_sheet_goods_sku_id'] = $goods['sku_id'];
  633. $params['goods_id'] = $goods['goods_id'];
  634. $params['order_sheet_num'] = $goods['nbr'];
  635. // 预约表
  636. for ($i = 0; $i < intval($params['order_sheet_num']); $i++) {
  637. $params['appointmentId'] = 'AP' . date('ymdHi') . random_string(4, 'up');
  638. // 入预约记录
  639. $this->insertAppointment($params, $writeOffDate, $applyData);
  640. }
  641. $goods['skuId'] = $goods['sku_id'];
  642. $goods['category'] = $goods['goods_classify'];
  643. // 权益表
  644. $this->insertMemberBenefit($params, $goods);
  645. } elseif (isset($goods['goods_classify']) && $goods['goods_classify'] == 'PACKAGE' && $params['delivery'] == 'ARRIVAL') { // 一个套餐买多个
  646. $params['packageId'] = $goods['goods_id'];
  647. $components = GoodsComponent::with([
  648. 'goods' => function ($query) {
  649. $query->select('goods_id', 'goods_name', 'goods_classify');
  650. }
  651. ])->where('join_component_master_goods_id', $params['packageId'])
  652. ->get()
  653. ->toArray();
  654. foreach ($components as $component) {
  655. $componentJson = json_decode($component['goods_component_json'], true);
  656. $params['join_sheet_goods_sku_id'] = $componentJson['sku_id'];
  657. $params['benefitId'] = 'BF' . date('ymdHi') . random_string(4, 'up');
  658. $params['order_sheet_num'] = $goods['nbr'] * $componentJson['nbr'];
  659. for ($i = 0; $i < intval($params['order_sheet_num']); $i++) {
  660. $params['appointmentId'] = 'AP' . date('ymdHi') . random_string(4, 'up');
  661. // 入预约记录
  662. $this->insertAppointment($params, $writeOffDate);
  663. }
  664. $goods['goods_id'] = $component['join_component_goods_id'];
  665. $goods['goods_name'] = $component['goods']['goods_name'];
  666. $goods['goods_classify'] = $component['goods']['goods_classify'];
  667. $goods['skuId'] = $goods['sku_id'];
  668. $goods['category'] = 'SERVICE';
  669. // 权益表
  670. $this->insertMemberBenefit($params, $goods);
  671. }
  672. }
  673. }
  674. }
  675. // 2.4W 康养城
  676. if ($params['goods_classify'] == 'VIP' && $params['order_status_payment'] == 'SUCCESS') {
  677. $params['member_id'] = $params['join_order_member_id'];
  678. Event::dispatch('order.kangyangCityVIP.grant', $params);
  679. }
  680. Db::commit();
  681. // 会员升级
  682. if (!empty($params['order_is_complete']) && $params['order_is_complete'] == 'Y' && $params['order_status_payment'] == 'SUCCESS') {
  683. Event::dispatch('order.complete', $params);
  684. Event::dispatch('order_pay.member_level.up', $params['join_order_member_id']);
  685. }
  686. // 打小票
  687. if (!empty($premises) && isset($params['submit_goods_classify']) && $params['submit_goods_classify'] == 'MEALS') {
  688. dump("insert 打小票");
  689. if ($premises->dept_category != '餐厅') {
  690. $restaurant = SysDept::where('dept_super_id', $premises->dept_id)->where('dept_category', '餐厅')->first();
  691. } else {
  692. $restaurant = $premises;
  693. }
  694. if (!empty($restaurant->dept_extend_json)) {
  695. $deptExtendJson = json_decode($restaurant->dept_extend_json, true);
  696. if (isset($deptExtendJson['printer'])) {
  697. foreach ($deptExtendJson['printer'] as $key => $item) {
  698. if (strpos($key, '结算') !== false && $params['order_status_payment'] == 'SUCCESS') {
  699. $voteData = [
  700. 'func' => 'procActionToPrinter',
  701. 'sign' => '',
  702. 'data' => [
  703. 'printer_premises' => $restaurant->dept_id,
  704. 'printer_device' => [
  705. $key
  706. ],
  707. 'printer_action' => 'ExecPrintOrder',
  708. 'printer_data' => [
  709. 'order_id' => $params['orderId'],
  710. 'order_batch' => ''
  711. ]
  712. ]
  713. ];
  714. http_post_json(getenv('VOTE_MENU_URL'), $voteData);
  715. }
  716. if ((strpos($key, '前台') !== false || strpos($key, '后厨') !== false)) {
  717. $voteData = [
  718. 'func' => 'procActionToPrinter',
  719. 'sign' => '',
  720. 'data' => [
  721. 'printer_premises' => $restaurant->dept_id,
  722. 'printer_device' => [
  723. $key
  724. ],
  725. 'printer_action' => 'ExecPrintOrder',
  726. 'printer_data' => [
  727. 'order_id' => $params['orderId'],
  728. 'order_batch' => ''
  729. ]
  730. ]
  731. ];
  732. http_post_json(getenv('VOTE_MENU_URL'), $voteData);
  733. }
  734. }
  735. }
  736. }
  737. }
  738. if ($params['settlement_now'] == 'Y' && $params['order_status_payment'] != 'SUCCESS') {
  739. _syslog("订单", "支付异常,检查是否有轮询");
  740. // 恢复优惠券到已占用
  741. if (!is_array($couponUseJson)){
  742. $couponUseJson = json_decode($couponUseJson, true);
  743. }
  744. $this->changeOrderCouponStatus($couponUseJson, 'WAITING');
  745. return json_throw(2001, '支付异常', ['order_id' => $params['orderId']]);
  746. }
  747. _syslog("订单", "创建订单成功");
  748. return json_success('创建订单成功');
  749. } catch (BusinessException $e) {
  750. Db::rollBack();
  751. dump($e->getMessage());
  752. dump($e->getTrace());
  753. _syslog("订单", $e->getMessage());
  754. return json_fail($e->getMessage());
  755. } catch (\Exception $e) {
  756. Db::rollBack();
  757. dump($e->getMessage());
  758. dump($e->getTrace());
  759. _syslog("订单", "创建订单失败");
  760. return json_fail('创建订单失败');
  761. }
  762. }
  763. /**
  764. * 组合支付下单
  765. */
  766. public function insertConstitute(Request $request): Response
  767. {
  768. $params = $request->post();
  769. // 判断餐品是否连带着服务或实体
  770. $goodsClassifys = array_unique(array_column($params['goodsContentList'], 'goods_classify'));
  771. if (in_array('MEALS', $goodsClassifys) && count($goodsClassifys) > 1) {
  772. return json_fail('餐饮餐品不支持和其他类型的产品一起下单');
  773. }
  774. if (in_array('MEALS', $goodsClassifys)) {
  775. $params['submit_goods_classify'] = 'MEALS';
  776. }
  777. if (in_array('PACKAGE', $goodsClassifys)) {
  778. $params['submit_goods_classify'] = 'PACKAGE';
  779. }
  780. if (!empty($params['dept_premises_id'])) {
  781. $premises = SysDept::where('dept_name', $params['dept_premises_id'])->first();
  782. }
  783. Db::beginTransaction();
  784. try {
  785. // 使用优惠券
  786. $couponUseJson = [];
  787. if (!empty($params['join_order_member_id']) && !empty($params['preferential'])) {
  788. $couponResult = OrderService::payUseCoupon('insert', $params['settlement_now'], $params['join_order_member_id'], $params['goodsContentList'], $params['preferential'], $params['order_amount_total']);
  789. if (!empty($couponResult['pay_amount']) && $couponResult['pay_amount'] != $params['order_amount_pay']) {
  790. throw new BusinessException("计算优惠后,实付金额错误!");
  791. }
  792. // 组装优惠券使用数据,存主表优惠里
  793. if (!empty($couponResult['use_coupon_json'])) {
  794. $couponUseJson = $couponResult['use_coupon_json'];
  795. }
  796. }
  797. // 存储优惠信息
  798. $params['order_discount_json'] = json_encode($this->discountRecord($couponUseJson, $params));
  799. $orderAmountPay = $params['order_amount_pay'];
  800. $constituteList = array_column($params['pay_category_constitute_list'], 'amount', 'category');
  801. // 验证金额
  802. $constituteAmount = 0;
  803. foreach ($params['pay_category_constitute_list'] as $item) {
  804. $constituteAmount = $constituteAmount + $item['amount'];
  805. }
  806. if ($params['order_amount_pay'] != $constituteAmount) {
  807. throw new BusinessException("组合支付金额与应付金额不一致");
  808. }
  809. $params['goods_classify'] = $goodsClassifys[0];
  810. // 验证库存
  811. OrderService::checkGoodsStorage($params);
  812. // 余额、福利、储值卡 验证短信
  813. if (!empty($params['pay_category_constitute']) && !in_array('OFFLINE', $params['pay_category_constitute']) && !in_array('MONEY', $params['pay_category_constitute']) && !in_array('QRCODE', $params['pay_category_constitute']) && (in_array('CASH', $params['pay_category_constitute']) || in_array('CARD', $params['pay_category_constitute']) || in_array('WELFARE', $params['pay_category_constitute']))) {
  814. $code = $params['sms_code'];
  815. if (!$code) {
  816. throw new BusinessException("验证码错误,请重新输入");
  817. }
  818. $member = Member::find($params['join_order_member_id']);
  819. $mobile = $member->member_mobile;
  820. $key = "SMS:CODE:ORDER_PAY:" . $mobile;
  821. $redisCode = Redis::get($key);
  822. if ($redisCode != $code && $code != '123456') {
  823. throw new BusinessException("验证码错误,请重新输入");
  824. }
  825. Redis::del($key);
  826. }
  827. // 验证线下付款密码
  828. if (!empty($params['pay_category_constitute']) && in_array('OFFLINE', $params['pay_category_constitute']) || in_array('MONEY', $params['pay_category_constitute'])) {
  829. $password = $params['offline_password'];
  830. if ($password != '666888') {
  831. throw new BusinessException("密码错误,请重新输入");
  832. }
  833. }
  834. // 下单账户
  835. if (empty($params['join_order_member_id']) && !empty($params['mobile'])) {
  836. if (Member::where('member_mobile', $params['mobile'])->exists()) {
  837. throw new BusinessException("会员已存在");
  838. }
  839. $params['join_order_member_id'] = $params['member_id'] = 'MR' . date('ymdHi') . random_string(4, 'up');
  840. // 创建会员
  841. MemberService::createMember($params);
  842. } else if (empty($params['join_order_member_id']) && empty($params['mobile'])) {
  843. $params['join_order_member_id'] = Member::where('member_mobile', '0000')->value('member_id');
  844. }
  845. if (empty($params['join_order_member_id'])) {
  846. throw new BusinessException("检查下单账户");
  847. }
  848. $qrcodePayAmount = 0;
  849. $params['orderId'] = 'OD' . date('ymdHi') . random_string(4, 'up');
  850. $params['orderGroupId'] = 'OD' . date('ymdHi') . random_string(4, 'up');
  851. $params['benefitId'] = 'BF' . date('ymdHi') . random_string(4, 'up');
  852. $systemStatus = 'SENDING'; // 待发货
  853. // 立即结算
  854. if ($params['settlement_now'] == 'Y') {
  855. if (in_array($params['goods_classify'], ['MEALS', 'VIP'])) {
  856. $params['order_is_complete'] = 'Y';
  857. $systemStatus = 'DONE';
  858. }
  859. if (in_array($params['goods_classify'], ['SERVICE', 'CHNMED', 'CHNNCD', 'PACKAGE']) && $params['delivery'] == 'ARRIVAL') {
  860. $params['order_is_complete'] = 'N';
  861. $systemStatus = "WAITING";
  862. }
  863. }
  864. if (!empty($params['pay_category_constitute']) && in_array('OFFLINE', $params['pay_category_constitute'])) { // 线下支付
  865. $params['order_status_system'] = $systemStatus;
  866. $params['order_status_payment'] = 'SUCCESS';
  867. $params['pay_category'] = $params['pay_category_sub'] ?? 'OFFLINE';
  868. // 线下支付金额
  869. if (isset($constituteList['OFFLINE'])) {
  870. $params['order_amount_pay'] = $constituteList['OFFLINE'];
  871. // 生成支付记录
  872. OrderService::createPayDetail($params);
  873. }
  874. $params['order_amount_pay'] = $orderAmountPay;
  875. }
  876. if (!empty($params['pay_category_constitute']) && in_array('MONEY', $params['pay_category_constitute'])) { // 现金支付
  877. $params['order_status_system'] = $systemStatus;
  878. $params['order_status_payment'] = 'SUCCESS';
  879. $params['pay_category'] = 'MONEY';
  880. // 现金支付金额
  881. if (isset($constituteList['MONEY'])) {
  882. $params['order_amount_pay'] = $constituteList['MONEY'];
  883. // 生成支付记录
  884. OrderService::createPayDetail($params);
  885. }
  886. $params['order_amount_pay'] = $orderAmountPay;
  887. }
  888. if (!empty($params['pay_category_constitute']) && in_array('CASH', $params['pay_category_constitute'])) { // 余额支付
  889. $account = MemberAccount::where('join_account_member_id', $params['join_order_member_id'])
  890. ->where('member_account_classify', 'CASH')
  891. ->where('member_account_status', 'ACTIVED')
  892. ->first();
  893. if (!$account) {
  894. throw new BusinessException("账户异常");
  895. }
  896. $amount = $account->member_account_surplus + $account->member_account_added;
  897. if (isset($constituteList['CASH'])) {
  898. $params['order_amount_pay'] = $constituteList['CASH'];
  899. $params['pay_category'] = $params['join_order_member_id'] . '-CASH';
  900. }
  901. if ($params['pay_constitute'] == 'N' && (!$account || $params['order_amount_pay'] > $amount)) {
  902. throw new BusinessException("账户余额不足");
  903. }
  904. if ($params['pay_constitute'] == 'Y' && (!$account || $params['order_amount_pay'] > $amount)) {
  905. $qrcodePayAmount = $params['order_amount_pay'] - $amount;
  906. $params['order_amount_pay'] = $amount;
  907. }
  908. if ($params['order_amount_pay'] > $account->member_account_surplus) {
  909. $cut = $account->member_account_added - ($params['order_amount_pay'] - $account->member_account_surplus);
  910. $account->member_account_surplus = 0;
  911. $account->member_account_added = $cut;
  912. } else {
  913. $account->member_account_surplus = $account->member_account_surplus - $params['order_amount_pay'];
  914. }
  915. $account->member_account_expend = $account->member_account_expend + $params['order_amount_pay'];
  916. $account->save();
  917. $params['order_status_system'] = $systemStatus;
  918. $params['order_status_payment'] = 'SUCCESS';
  919. // 生成支付记录
  920. OrderService::createPayDetail($params);
  921. $params['order_amount_pay'] = $orderAmountPay;
  922. }
  923. if (!empty($params['pay_category_constitute']) && in_array('CARD', $params['pay_category_constitute'])) { // 储值卡账户
  924. $cardNbr = $params['card_nbr'];
  925. if (!$cardNbr) {
  926. throw new BusinessException("储值卡账户异常");
  927. }
  928. $account = MemberAccount::where('join_account_member_id', $params['join_order_member_id'])
  929. ->where('member_account_nbr', $cardNbr)
  930. ->where('member_account_status', 'ACTIVED')
  931. ->first();
  932. if (!$account) {
  933. throw new BusinessException("储值卡账户异常");
  934. }
  935. $amount = $account->member_account_surplus + $account->member_account_added;
  936. // 储值卡账户支付金额
  937. if (isset($constituteList['CARD'])) {
  938. $params['order_amount_pay'] = $constituteList['CARD'];
  939. $params['pay_category'] = $cardNbr;
  940. }
  941. if ($params['pay_constitute'] == 'N' && (!$account || $params['order_amount_pay'] > $amount)) {
  942. throw new BusinessException("储值卡账户余额不足");
  943. }
  944. if ($params['pay_constitute'] == 'Y' && (!$account || $params['order_amount_pay'] > $amount)) {
  945. $qrcodePayAmount = $params['order_amount_pay'] - $amount;
  946. $params['order_amount_pay'] = $amount;
  947. }
  948. if ($params['order_amount_pay'] > $account->member_account_surplus) {
  949. $cut = $account->member_account_added - ($params['order_amount_pay'] - $account->member_account_surplus);
  950. $account->member_account_surplus = 0;
  951. $account->member_account_added = $cut;
  952. } else {
  953. $account->member_account_surplus = $account->member_account_surplus - $params['order_amount_pay'];
  954. }
  955. $account->member_account_expend = $account->member_account_expend + $params['order_amount_pay'];
  956. $account->save();
  957. $params['order_status_system'] = $systemStatus;
  958. $params['order_status_payment'] = 'SUCCESS';
  959. // 生成支付记录
  960. OrderService::createPayDetail($params);
  961. $params['order_amount_pay'] = $orderAmountPay;
  962. }
  963. //!empty($params['pay_category_constitute']) && in_array('CARD',$params['pay_category_constitute'])
  964. // if(($params['pay_constitute'] == 'Y' || $params['pay_category'] == 'QRCODE') && $params['settlement_now'] == 'Y' && !empty($params['qrcode_nbr'])){ // 付款码
  965. if (!empty($params['pay_category_constitute']) && in_array('QRCODE', $params['pay_category_constitute']) && !empty($params['qrcode_nbr'])) { // 付款码
  966. // 需要付款码的金额>0
  967. if (isset($constituteList['QRCODE']) && $constituteList['QRCODE'] > 0) {
  968. // 付款码支付金额
  969. $params['order_amount_pay'] = $constituteList['QRCODE'];
  970. // 调支付
  971. $result = OrderService::qrcodePay($params);
  972. $result = json_encode($result);
  973. $params['pay_json_response'] = $result;
  974. $result = json_decode($result, true);
  975. $prefix = substr($params['qrcode_nbr'], 0, 2);
  976. if (in_array($prefix, [10, 11, 12, 13, 14, 15])) {
  977. $params['pay_category'] = 'WXPAY';
  978. if ((!isset($result['return_code']) || $result['return_code'] != 'SUCCESS') || (!isset($result['result_code']) || $result['result_code'] != 'SUCCESS') || (empty($result['trade_state']) || $result['trade_state'] != 'SUCCESS')) {
  979. $params['order_status_system'] = 'PAYING';
  980. $params['order_status_payment'] = 'PENDING';
  981. $params['order_is_complete'] = 'N';
  982. // Db::rollBack();
  983. // return json_fail('支付失败');
  984. } else {
  985. $params['order_status_system'] = $systemStatus;
  986. $params['order_status_payment'] = 'SUCCESS';
  987. }
  988. } else if (in_array($prefix, [25, 26, 27, 28, 29, 30])) {
  989. $params['pay_category'] = 'ALIPAY';
  990. if ((!isset($result['code']) || $result['code'] != '10000') || (empty($result['trade_status']) || $result['trade_status'] != 'TRADE_SUCCESS')) {
  991. $params['order_status_system'] = 'PAYING';
  992. $params['order_status_payment'] = 'PENDING';
  993. $params['order_is_complete'] = 'N';
  994. // Db::rollBack();
  995. // return json_fail('支付失败');
  996. } else {
  997. $params['order_status_system'] = $systemStatus;
  998. $params['order_status_payment'] = 'SUCCESS';
  999. }
  1000. } else {
  1001. throw new BusinessException("二维码错误");
  1002. }
  1003. // 生成支付记录
  1004. OrderService::createPayDetail($params);
  1005. // 账户支付的金额
  1006. $params['order_amount_pay'] = $orderAmountPay;
  1007. }
  1008. }
  1009. $orderConfigJson = [];
  1010. // 优惠
  1011. if (!empty($params['preferential'])) {
  1012. $orderConfigJson['preferential'] = $params['preferential'];
  1013. }
  1014. // 配送方式
  1015. if (isset($params['delivery']) && ($params['delivery'] == 'PICKUP' || $params['delivery'] == 'ARRIVAL')) { // 自提/ 到店
  1016. $orderConfigJson['premises'] = $params['dept_premises_id'];
  1017. } else if (isset($params['delivery']) && $params['delivery'] == 'LOGISTICS') {
  1018. // $params['order_express_json'] = json_encode([
  1019. // 'express' => 'Y',
  1020. // ]);
  1021. }
  1022. $params['order_amount_pay'] = $params['order_amount_pay'] + $qrcodePayAmount;
  1023. if (isset($params['delivery']) && in_array($params['delivery'], ['PICKUP', 'ARRIVAL']) && !empty($params['dept_premises_id'])) {
  1024. // $premises = SysDept::where('dept_name',$params['dept_premises_id'])->where('dept_category','营业场所')->first();
  1025. if (!$premises) {
  1026. throw new BusinessException("门店不存在,请重新选择");
  1027. }
  1028. $params['submit_premises_id'] = $premises->dept_id;
  1029. }
  1030. if (isset($params['submit_goods_classify']) && $params['submit_goods_classify'] == 'MEALS' && !empty($params['dept_table_id'])) {
  1031. $table = SysDept::where('dept_id', $params['dept_table_id'])->where('dept_category', '桌台')->first();
  1032. $orderConfigJson['premises'] = $params['dept_premises_id'];
  1033. $orderConfigJson['dept'] = $premises->dept_id;
  1034. $orderConfigJson['reach'] = "00:00";
  1035. $orderConfigJson['table'] = !empty($table) ? $table->dept_name : null;
  1036. $orderConfigJson['express'] = "堂食";
  1037. $orderConfigJson['tableid'] = $params['dept_table_id'] ?? null;
  1038. if (!empty($params['eat'])) {
  1039. $orderConfigJson['eat'] = $params['eat'] ?? null;
  1040. }
  1041. }
  1042. $params['order_config_json'] = json_encode($orderConfigJson);
  1043. // 写入主订单
  1044. $this->insertMain($params);
  1045. // 订单详情
  1046. $sheetId = $this->insertSheet($params);
  1047. $params['order_express_goods'] = json_encode(['sheet' => $sheetId]);
  1048. if (isset($params['delivery']) && $params['delivery'] == 'LOGISTICS') {
  1049. $params['order_express_type'] = '配送';
  1050. // 入配送
  1051. $this->saveExpress($params);
  1052. } else if (isset($params['delivery']) && $params['delivery'] == 'PICKUP') {
  1053. $params['order_express_type'] = '自提';
  1054. if (!$premises) {
  1055. throw new BusinessException('自提门店不存在');
  1056. }
  1057. $params['order_express_city'] = $premises->dept_city;
  1058. $params['order_express_address'] = $premises->dept_address;
  1059. $params['order_express_telephone'] = $premises->dept_telephone;
  1060. $params['order_express_extend_json'] = json_encode(['pick_code' => random_string(4, 'number')]);
  1061. $this->saveExpress($params);
  1062. } else if ($params['delivery'] == 'ARRIVAL') {
  1063. $premises = SysDept::where('dept_name', $params['dept_premises_id'])->first();
  1064. $params['order_express_type'] = '到店';
  1065. if (isset($params['submit_goods_classify']) && $params['submit_goods_classify'] == 'MEALS') {
  1066. $params['order_express_type'] = '堂食';
  1067. }
  1068. if (!$premises) {
  1069. throw new BusinessException('门店不存在');
  1070. }
  1071. $params['order_express_city'] = $premises->dept_city;
  1072. $params['order_express_address'] = $premises->dept_address;
  1073. $params['order_express_telephone'] = $premises->dept_telephone;
  1074. $this->saveExpress($params);
  1075. }
  1076. // 买的单个服务
  1077. $writeOffDate = [];
  1078. $applyData = [];
  1079. // 服务已完成,生成核销数据
  1080. // if ($params['order_status_payment'] == 'SUCCESS' && in_array($goods['goods_classify'], ['SERVICE','CHNMED','CHNNCD', 'PACKAGE'])) {
  1081. // $writeOffDate = OrderService::generateWriteOffData($params);
  1082. // $applyData = OrderService::generateAppointmentApplyData($params);
  1083. // }
  1084. if ($params['order_status_payment'] == 'SUCCESS') {
  1085. foreach ($params['goodsContentList'] as $goods) {
  1086. $params['join_sheet_goods_id'] = $goods['goods_id'];
  1087. if (isset($goods['goods_classify']) && in_array($goods['goods_classify'], ['SERVICE', 'CHNMED', 'CHNNCD']) && $params['delivery'] == 'ARRIVAL') {
  1088. $params['benefitId'] = 'BF' . date('ymdHi') . random_string(4, 'up');
  1089. $params['join_sheet_goods_sku_id'] = $goods['sku_id'];
  1090. $params['goods_id'] = $goods['goods_id'];
  1091. $params['order_sheet_num'] = $goods['nbr'];
  1092. // 预约表
  1093. for ($i = 0; $i < intval($params['order_sheet_num']); $i++) {
  1094. $params['appointmentId'] = 'AP' . date('ymdHi') . random_string(4, 'up');
  1095. // 入预约记录
  1096. $this->insertAppointment($params, $writeOffDate, $applyData);
  1097. }
  1098. $goods['skuId'] = $goods['sku_id'];
  1099. $goods['category'] = $goods['goods_classify'];
  1100. // 权益表
  1101. $this->insertMemberBenefit($params, $goods);
  1102. } elseif (isset($goods['goods_classify']) && $goods['goods_classify'] == 'PACKAGE' && $params['delivery'] == 'ARRIVAL') { // 一个套餐买多个
  1103. $params['packageId'] = $goods['goods_id'];
  1104. $components = GoodsComponent::with([
  1105. 'goods' => function ($query) {
  1106. $query->select('goods_id', 'goods_name', 'goods_classify');
  1107. }
  1108. ])->where('join_component_master_goods_id', $params['packageId'])
  1109. ->get()
  1110. ->toArray();
  1111. foreach ($components as $component) {
  1112. $componentJson = json_decode($component['goods_component_json'], true);
  1113. $params['join_sheet_goods_sku_id'] = $componentJson['sku_id'];
  1114. $params['benefitId'] = 'BF' . date('ymdHi') . random_string(4, 'up');
  1115. $params['order_sheet_num'] = $goods['nbr'] * $componentJson['nbr'];
  1116. for ($i = 0; $i < intval($params['order_sheet_num']); $i++) {
  1117. $params['appointmentId'] = 'AP' . date('ymdHi') . random_string(4, 'up');
  1118. // 入预约记录
  1119. $this->insertAppointment($params, $writeOffDate);
  1120. }
  1121. $goods['goods_id'] = $component['join_component_goods_id'];
  1122. $goods['goods_name'] = $component['goods']['goods_name'];
  1123. $goods['goods_classify'] = $component['goods']['goods_classify'];
  1124. $goods['skuId'] = $goods['sku_id'];
  1125. $goods['category'] = 'SERVICE';
  1126. // 权益表
  1127. $this->insertMemberBenefit($params, $goods);
  1128. }
  1129. }
  1130. }
  1131. }
  1132. // 2.4W 康养城
  1133. if ($params['goods_classify'] == 'VIP' && intval($params['order_amount_pay']) == 24000 && $params['order_status_payment'] == 'SUCCESS') {
  1134. $params['member_id'] = $params['join_order_member_id'];
  1135. Event::dispatch('order.kangyangCityVIP.grant', $params);
  1136. }
  1137. Db::commit();
  1138. // 会员升级
  1139. if (!empty($params['order_is_complete']) && $params['order_is_complete'] == 'Y' && $params['order_status_payment'] == 'SUCCESS') {
  1140. Event::dispatch('order.complete', $params);
  1141. Event::dispatch('order_pay.member_level.up', $params['join_order_member_id']);
  1142. }
  1143. // 打小票
  1144. if (!empty($premises) && isset($params['submit_goods_classify']) && $params['submit_goods_classify'] == 'MEALS') {
  1145. // if (!empty($premises)){
  1146. if ($premises->dept_category != '餐厅') {
  1147. $restaurant = SysDept::where('dept_super_id', $premises->dept_id)->where('dept_category', '餐厅')->first();
  1148. } else {
  1149. $restaurant = $premises;
  1150. }
  1151. if (!empty($restaurant->dept_extend_json)) {
  1152. $deptExtendJson = json_decode($restaurant->dept_extend_json, true);
  1153. if (isset($deptExtendJson['printer'])) {
  1154. foreach ($deptExtendJson['printer'] as $key => $item) {
  1155. if (strpos($key, '结算') !== false && $params['order_status_payment'] == 'SUCCESS') {
  1156. $voteData = [
  1157. 'func' => 'procActionToPrinter',
  1158. 'sign' => '',
  1159. 'data' => [
  1160. 'printer_premises' => $restaurant->dept_id,
  1161. 'printer_device' => [
  1162. $key
  1163. ],
  1164. 'printer_action' => 'ExecPrintOrder',
  1165. 'printer_data' => [
  1166. 'order_id' => $params['orderId'],
  1167. 'order_batch' => ''
  1168. ]
  1169. ]
  1170. ];
  1171. http_post_json(getenv('VOTE_MENU_URL'), $voteData);
  1172. }
  1173. if ((strpos($key, '前台') !== false || strpos($key, '后厨') !== false)) {
  1174. $voteData = [
  1175. 'func' => 'procActionToPrinter',
  1176. 'sign' => '',
  1177. 'data' => [
  1178. 'printer_premises' => $restaurant->dept_id,
  1179. 'printer_device' => [
  1180. $key
  1181. ],
  1182. 'printer_action' => 'ExecPrintOrder',
  1183. 'printer_data' => [
  1184. 'order_id' => $params['orderId'],
  1185. 'order_batch' => ''
  1186. ]
  1187. ]
  1188. ];
  1189. http_post_json(getenv('VOTE_MENU_URL'), $voteData);
  1190. }
  1191. }
  1192. }
  1193. }
  1194. }
  1195. if ($params['settlement_now'] == 'Y' && $params['order_status_payment'] != 'SUCCESS') {
  1196. _syslog("订单", "支付异常,检查是否有轮询");
  1197. // 恢复优惠券到已占用
  1198. if (!is_array($couponUseJson)){
  1199. $couponUseJson = json_decode($couponUseJson, true);
  1200. }
  1201. $this->changeOrderCouponStatus($couponUseJson, 'WAITING');
  1202. return json_throw(2001, '支付异常', ['order_id' => $params['orderId']]);
  1203. }
  1204. _syslog("订单", "创建订单成功");
  1205. return json_success('创建订单成功');
  1206. } catch (BusinessException $e) {
  1207. Db::rollBack();
  1208. dump($e->getMessage());
  1209. dump($e->getTrace());
  1210. _syslog("订单", $e->getMessage());
  1211. return json_fail($e->getMessage());
  1212. } catch (\Exception $e) {
  1213. Db::rollBack();
  1214. dump($e->getMessage());
  1215. dump($e->getTrace());
  1216. _syslog("订单", "创建订单失败");
  1217. return json_fail('创建订单失败');
  1218. }
  1219. }
  1220. public function pay(Request $request)
  1221. {
  1222. $params = $request->post();
  1223. // 余额、福利、储值卡 验证短信
  1224. if ($params['pay_constitute'] == 'N' && in_array($params['pay_category'], ['CASH', 'CARD', 'WELFARE'])) {
  1225. $code = $params['sms_code'];
  1226. if (!$code) {
  1227. return json_fail("验证码错误,请重新输入");
  1228. }
  1229. $member = Member::find($params['join_order_member_id']);
  1230. $mobile = $member->member_mobile;
  1231. $key = "SMS:CODE:ORDER_PAY:" . $mobile;
  1232. $redisCode = Redis::get($key);
  1233. if ($redisCode != $code && $code != '123456') {
  1234. return json_fail("验证码错误,请重新输入");
  1235. }
  1236. Redis::del($key);
  1237. }
  1238. // 验证线下付款密码
  1239. if ($params['pay_constitute'] == 'N' && in_array($params['pay_category'], ['OFFLINE', 'MONEY'])) {
  1240. $password = $params['offline_password'];
  1241. if ($password != '666888') {
  1242. return json_fail("密码错误,请重新输入");
  1243. }
  1244. }
  1245. $order = Order::where('order_id', $params['order_id'])->first();
  1246. if (!$order) {
  1247. return json_fail('订单异常');
  1248. }
  1249. if ($order->order_status_system != 'PAYING') {
  1250. return json_fail('订单不是可支付状态');
  1251. }
  1252. if (!empty($order->order_config_json)) {
  1253. $orderConfigJson = json_decode($order->order_config_json, true);
  1254. if (isset($orderConfigJson['premises'])) {
  1255. $premises = SysDept::where('dept_name', $orderConfigJson['premises'])->first();
  1256. if (!empty($premises)) {
  1257. $params['submit_premises_id'] = $premises->dept_id;
  1258. }
  1259. }
  1260. }
  1261. $params['orderId'] = $params['order_id'];
  1262. $params['orderGroupId'] = $order->order_groupby;
  1263. $goods = Goods::where('goods_id', $params['join_sheet_goods_id'])
  1264. ->select('goods_id', 'goods_name', 'goods_classify')
  1265. ->first();
  1266. if (!$goods) {
  1267. return json_fail('产品数据异常');
  1268. }
  1269. $goods = $goods->toArray();
  1270. $params['goods_classify'] = $goods['goods_classify'] ?? '';
  1271. $systemStatus = 'SENDING'; // 待发货
  1272. // 立即结算
  1273. if (in_array($params['goods_classify'], ['MEALS', 'VIP'])) {
  1274. $order->order_is_complete = 'Y';
  1275. $systemStatus = 'DONE';
  1276. }
  1277. if (in_array($params['goods_classify'], ['SERVICE', 'CHNMED', 'CHNNCD', 'PACKAGE']) && $params['delivery'] == 'ARRIVAL') {
  1278. $params['order_is_complete'] = 'N';
  1279. $systemStatus = "WAITING";
  1280. }
  1281. // if ($params['goods_classify'] == 'PACKAGE' && $params['delivery'] == 'ARRIVAL') {
  1282. // $systemStatus = "WAITING";
  1283. // }
  1284. Db::beginTransaction();
  1285. try {
  1286. // 使用优惠券
  1287. $couponUseJson = [];
  1288. if (!empty($order->order_discount_json)) {
  1289. // 释放下单时选的优惠券
  1290. $order->order_discount_json = $this->releaseCoupon(json_decode($order->order_discount_json, true));
  1291. }
  1292. if (!empty($params['join_order_member_id']) && !empty($params['preferential'])) {
  1293. $couponResult = OrderService::payUseCoupon('pay', 'Y', $params['join_order_member_id'], $params['goodsContentList'], $params['preferential'], $params['order_amount_total']);
  1294. if (!empty($couponResult['pay_amount']) && $couponResult['pay_amount'] != $params['order_amount_pay']) {
  1295. throw new BusinessException("计算优惠后,实付金额错误!");
  1296. }
  1297. // 组装优惠券使用数据,存主表优惠里
  1298. if (!empty($couponResult['use_coupon_json'])) {
  1299. $couponUseJson = $couponResult['use_coupon_json'];
  1300. // if (!empty($order->order_discount_json)) {
  1301. // $orderDiscountJson = json_decode($order->order_discount_json, true);
  1302. // if (!empty($orderDiscountJson)) {
  1303. // $couponUseJson = json_encode(array_merge($orderDiscountJson, json_decode($couponUseJson, true)));
  1304. // }
  1305. // }
  1306. }
  1307. }
  1308. // 存储优惠信息
  1309. $order->order_discount_json = json_encode($this->discountRecord($couponUseJson, $params));
  1310. // 组合支付时,付款码应收金额
  1311. $qrcodePayAmount = 0;
  1312. if ($params['pay_category'] == 'OFFLINE' || $params['pay_category'] == 'MONEY') {
  1313. $order->order_status_system = $systemStatus;
  1314. $order->order_status_payment = 'SUCCESS';
  1315. if ($params['pay_category'] == 'OFFLINE' && !empty($params['pay_category_sub'])) {
  1316. $params['pay_category'] = $params['pay_category_sub'];
  1317. }
  1318. } else if ($params['pay_category'] == 'CASH') { // 余额支付
  1319. $account = MemberAccount::where('join_account_member_id', $params['join_order_member_id'])
  1320. ->where('member_account_classify', 'CASH')
  1321. ->where('member_account_status', 'ACTIVED')
  1322. ->first();
  1323. if (!$account) {
  1324. throw new BusinessException('账户异常');
  1325. }
  1326. $amount = $account->member_account_surplus + $account->member_account_added;
  1327. if ($params['pay_constitute'] == 'N' && (!$account || $params['order_amount_pay'] > $amount)) {
  1328. throw new BusinessException('账户余额不足');
  1329. }
  1330. if ($params['pay_constitute'] == 'Y' && (!$account || $params['order_amount_pay'] > $amount)) {
  1331. $qrcodePayAmount = $params['order_amount_pay'] - $amount;
  1332. $params['order_amount_pay'] = $amount;
  1333. }
  1334. if ($params['order_amount_pay'] > $account->member_account_surplus) {
  1335. $cut = $account->member_account_added - ($params['order_amount_pay'] - $account->member_account_surplus);
  1336. $account->member_account_surplus = 0;
  1337. $account->member_account_added = $cut;
  1338. } else {
  1339. $account->member_account_surplus = $account->member_account_surplus - $params['order_amount_pay'];
  1340. }
  1341. $account->member_account_expend = $account->member_account_expend + $params['order_amount_pay'];
  1342. $account->save();
  1343. if ($params['pay_constitute'] == 'N' && (!$account || $params['order_amount_pay'] <= $amount)) {
  1344. $order->order_status_system = $systemStatus;
  1345. $order->order_status_payment = 'SUCCESS';
  1346. }
  1347. } else if ($params['pay_category'] == 'VIP') { // 余额支付
  1348. $account = MemberAccount::where('join_account_member_id', $params['join_order_member_id'])
  1349. ->where('member_account_classify', 'VIP')
  1350. ->where('member_account_status', 'ACTIVED')
  1351. ->first();
  1352. if (!$account) {
  1353. throw new BusinessException('账户异常');
  1354. }
  1355. $amount = $account->member_account_surplus + $account->member_account_added;
  1356. if ($params['pay_constitute'] == 'N' && (!$account || $params['order_amount_pay'] > $amount)) {
  1357. throw new BusinessException('账户余额不足');
  1358. }
  1359. if ($params['pay_constitute'] == 'Y' && (!$account || $params['order_amount_pay'] > $amount)) {
  1360. $qrcodePayAmount = $params['order_amount_pay'] - $amount;
  1361. $params['order_amount_pay'] = $amount;
  1362. }
  1363. if ($params['order_amount_pay'] > $account->member_account_surplus) {
  1364. $cut = $account->member_account_added - ($params['order_amount_pay'] - $account->member_account_surplus);
  1365. $account->member_account_surplus = 0;
  1366. $account->member_account_added = $cut;
  1367. } else {
  1368. $account->member_account_surplus = $account->member_account_surplus - $params['order_amount_pay'];
  1369. }
  1370. $account->member_account_expend = $account->member_account_expend + $params['order_amount_pay'];
  1371. $account->save();
  1372. if ($params['pay_constitute'] == 'N' && (!$account || $params['order_amount_pay'] <= $amount)) {
  1373. $order->order_status_system = $systemStatus;
  1374. $order->order_status_payment = 'SUCCESS';
  1375. }
  1376. } else if ($params['pay_category'] == 'WELFARE') { // 福利账户
  1377. $account = MemberAccount::where('join_account_member_id', $params['join_order_member_id'])
  1378. ->where('member_account_classify', 'WELFARE')
  1379. ->where('member_account_status', 'ACTIVED')
  1380. ->first();
  1381. if (!$account) {
  1382. throw new BusinessException('账户异常');
  1383. }
  1384. $account->member_account_surplus = floatval($account->member_account_surplus);
  1385. if ($params['pay_constitute'] == 'N' && ($params['order_amount_pay'] > $account->member_account_surplus)) {
  1386. throw new BusinessException('账户余额不足');
  1387. }
  1388. if ($params['pay_constitute'] == 'Y' && ($params['order_amount_pay'] > $account->member_account_surplus)) {
  1389. $qrcodePayAmount = $params['order_amount_pay'] - $account->member_account_surplus;
  1390. $params['order_amount_pay'] = $account->member_account_surplus;
  1391. }
  1392. if ($params['pay_constitute'] == 'N' && ($params['order_amount_pay'] <= $account->member_account_surplus)) {
  1393. $order->order_status_system = $systemStatus;
  1394. $order->order_status_payment = 'SUCCESS';
  1395. }
  1396. // 福利账户 300 、 700
  1397. if (in_array($params['goods_classify'], ['SERVICE', 'CHNMED', 'CHNNCD', 'MEALS'])) {
  1398. $payDetails = PayDetail::where('join_pay_member_id', $params['join_order_member_id'])
  1399. ->where('pay_status', 'SUCCESS')
  1400. ->where('pay_prepayid', $params['join_order_member_id'] . '-WELFARE')
  1401. ->whereIn('pay_category', ['SERVICE', 'CHNMED', 'CHNNCD', 'MEALS', 'DESHES'])
  1402. ->get()
  1403. ->toArray();
  1404. $payDetailArray = array_column($payDetails, 'pay_amount', 'join_pay_order_id');
  1405. $refundPayDetails = PayDetail::where('join_pay_member_id', $params['join_order_member_id'])
  1406. ->where('pay_status', 'SUCCESS')
  1407. ->where('pay_prepayid', $params['join_order_member_id'] . '-WELFARE')
  1408. ->where('pay_category', 'REFUND')
  1409. ->get()
  1410. ->toArray();
  1411. $refundPayDetailArray = array_column($refundPayDetails, 'pay_amount', 'join_pay_order_id');
  1412. $paySum = 0;
  1413. foreach ($payDetailArray as $key => $item) {
  1414. if (isset($refundPayDetailArray[$key])) {
  1415. $paySum = $paySum + ($item - $refundPayDetailArray[$key]);
  1416. continue;
  1417. }
  1418. $paySum = $paySum + $item;
  1419. }
  1420. if ($params['pay_constitute'] == 'N' && 700 - $paySum < $params['order_amount_pay']) {
  1421. throw new BusinessException('超出福利限额');
  1422. } else if ($params['pay_constitute'] == 'Y' && 700 - $paySum < $params['order_amount_pay']) {
  1423. $qrcodePayAmount = $params['order_amount_pay'] - (700 - $paySum);
  1424. $params['order_amount_pay'] = (700 - $paySum);
  1425. }
  1426. } else {
  1427. $payDetails = PayDetail::where('join_pay_member_id', $params['join_order_member_id'])
  1428. ->where('pay_status', 'SUCCESS')
  1429. ->where('pay_prepayid', $params['join_order_member_id'] . '-WELFARE')
  1430. ->whereNotIn('pay_category', ['SERVICE', 'CHNMED', 'CHNNCD', 'MEALS', 'DESHES', 'REFUND', 'RECHARGE'])
  1431. ->get()
  1432. ->toArray();
  1433. $payDetailArray = array_column($payDetails, 'pay_amount', 'join_pay_order_id');
  1434. $refundPayDetails = PayDetail::where('join_pay_member_id', $params['join_order_member_id'])
  1435. ->where('pay_status', 'SUCCESS')
  1436. ->where('pay_prepayid', $params['join_order_member_id'] . '-WELFARE')
  1437. ->where('pay_category', 'REFUND')
  1438. ->get()
  1439. ->toArray();
  1440. $refundPayDetailArray = array_column($refundPayDetails, 'pay_amount', 'join_pay_order_id');
  1441. $paySum = 0;
  1442. foreach ($payDetailArray as $key => $item) {
  1443. if (isset($refundPayDetailArray[$key])) {
  1444. $paySum = $paySum + ($item - $refundPayDetailArray[$key]);
  1445. continue;
  1446. }
  1447. $paySum = $paySum + $item;
  1448. }
  1449. if ($params['pay_constitute'] == 'N' && 300 - $paySum < $params['order_amount_pay']) {
  1450. throw new BusinessException('超出福利限额');
  1451. } else if ($params['pay_constitute'] == 'Y' && 300 - $paySum < $params['order_amount_pay']) {
  1452. $qrcodePayAmount = $params['order_amount_pay'] - (300 - $paySum);
  1453. $params['order_amount_pay'] = (300 - $paySum);
  1454. }
  1455. }
  1456. $account->member_account_surplus = $account->member_account_surplus - $params['order_amount_pay'];
  1457. $account->member_account_expend = $account->member_account_expend + $params['order_amount_pay'];
  1458. $account->save();
  1459. } else if ($params['pay_category'] == 'CARD') { // 储值卡账户
  1460. $cardNbr = $params['card_nbr'];
  1461. if (!$cardNbr) {
  1462. throw new BusinessException('账户异常');
  1463. }
  1464. $account = MemberAccount::where('join_account_member_id', $params['join_order_member_id'])
  1465. ->where('member_account_nbr', $cardNbr)
  1466. ->where('member_account_status', 'ACTIVED')
  1467. ->first();
  1468. if (!$account) {
  1469. throw new BusinessException('账户异常');
  1470. }
  1471. $amount = $account->member_account_surplus + $account->member_account_added;
  1472. if ($params['pay_constitute'] == 'N' && (!$account || $params['order_amount_pay'] > $amount)) {
  1473. throw new BusinessException('账户余额不足');
  1474. }
  1475. if ($params['pay_constitute'] == 'Y' && (!$account || $params['order_amount_pay'] > $amount)) {
  1476. $qrcodePayAmount = $params['order_amount_pay'] - $amount;
  1477. $params['order_amount_pay'] = $amount;
  1478. }
  1479. if ($params['order_amount_pay'] > $account->member_account_surplus) {
  1480. $cut = $account->member_account_added - ($params['order_amount_pay'] - $account->member_account_surplus);
  1481. $account->member_account_surplus = 0;
  1482. $account->member_account_added = $cut;
  1483. } else {
  1484. $account->member_account_surplus = $account->member_account_surplus - $params['order_amount_pay'];
  1485. }
  1486. $account->member_account_expend = $account->member_account_expend + $params['order_amount_pay'];
  1487. $account->save();
  1488. if ($params['pay_constitute'] == 'N' && (!$account || $params['order_amount_pay'] <= $amount)) {
  1489. $order->order_status_system = $systemStatus;
  1490. $order->order_status_payment = 'SUCCESS';
  1491. }
  1492. }
  1493. if (($params['pay_constitute'] == 'Y' || $params['pay_category'] == 'QRCODE') && !empty($params['qrcode_nbr'])) { // 付款码
  1494. // 提交过来的支付分类
  1495. $submitPayCategory = $params['pay_category'];
  1496. // 账户支付的金额
  1497. $accountAmount = $params['order_amount_pay'];
  1498. if ($params['pay_constitute'] == 'Y' && $qrcodePayAmount > 0) {
  1499. // 组合支付,改成需要付款码需要支付的金额
  1500. $params['order_amount_pay'] = $qrcodePayAmount;
  1501. }
  1502. // 去支付
  1503. $result = OrderService::qrcodePay($params);
  1504. $result = json_encode($result);
  1505. $params['pay_json_response'] = $result;
  1506. $result = json_decode($result, true);
  1507. $prefix = substr($params['qrcode_nbr'], 0, 2);
  1508. if (in_array($prefix, [10, 11, 12, 13, 14, 15])) {
  1509. $params['pay_category'] = 'WXPAY';
  1510. if ((!isset($result['return_code']) || $result['return_code'] != 'SUCCESS') || (!isset($result['result_code']) || $result['result_code'] != 'SUCCESS') || (empty($result['trade_state']) || $result['trade_state'] != 'SUCCESS')) {
  1511. $order->order_status_system = 'PAYING';
  1512. $order->order_status_payment = 'PENDING';
  1513. $order->order_is_complete = 'N';
  1514. // Db::rollBack();
  1515. // return json_fail('支付失败');
  1516. } else {
  1517. $order->order_status_system = $systemStatus;
  1518. $order->order_status_payment = 'SUCCESS';
  1519. }
  1520. } else if (in_array($prefix, [25, 26, 27, 28, 29, 30])) {
  1521. $params['pay_category'] = 'ALIPAY';
  1522. if ((!isset($result['code']) || $result['code'] != '10000') || (empty($result['trade_status']) || $result['trade_status'] != 'TRADE_SUCCESS')) {
  1523. $order->order_status_system = 'PAYING';
  1524. $order->order_status_payment = 'PENDING';
  1525. $order->order_is_complete = 'N';
  1526. // Db::rollBack();
  1527. // return json_fail('支付失败');
  1528. } else {
  1529. $order->order_status_system = $systemStatus;
  1530. $order->order_status_payment = 'SUCCESS';
  1531. }
  1532. } else {
  1533. throw new BusinessException('付款码无效');
  1534. }
  1535. // 组合支付,追加加一条支付记录 pay_detail
  1536. if ($params['pay_constitute'] == 'Y' && $qrcodePayAmount > 0) {
  1537. $insertPayDetailData = [
  1538. 'join_pay_member_id' => $params['join_order_member_id'],
  1539. 'join_pay_order_id' => $params['orderGroupId'],
  1540. 'pay_status' => 'SUCCESS',
  1541. 'pay_category' => $params['goods_classify'],
  1542. 'pay_amount' => $params['order_amount_pay'],
  1543. 'pay_paytimes' => date('Y-m-d H:i:s'),
  1544. 'pay_prepayid' => $params['pay_category'],
  1545. 'pay_json_request' => json_encode($params),
  1546. 'pay_json_response' => $params['pay_json_response'],
  1547. 'join_pay_object_json' => !empty($params['orderId']) ? json_encode(['order_id' => $params['orderId']]) : '[]',
  1548. 'pay_addtimes' => time()
  1549. ];
  1550. PayDetail::insert($insertPayDetailData);
  1551. // 组合支付,还原提交的支付分类
  1552. $params['pay_category'] = $submitPayCategory;
  1553. }
  1554. // 账户支付的金额
  1555. $params['order_amount_pay'] = $accountAmount;
  1556. }
  1557. $orderConfigJson = [];
  1558. if (!empty($order->order_config_json)) {
  1559. $orderConfigJson = json_decode($order->order_config_json, true);
  1560. }
  1561. $orderConfigJson['preferential'] = $params['preferential'] ?? '';
  1562. if (isset($orderConfigJson['tableid']) && !empty($orderConfigJson['tableid'])) {
  1563. SysDept::where('dept_id', $orderConfigJson['tableid'])->where('dept_category', '桌台')->update(['dept_status' => 'ACTIVED']);
  1564. }
  1565. $order->order_config_json = json_encode($orderConfigJson);
  1566. $order->order_amount_pay = $params['order_amount_pay'] + $qrcodePayAmount;
  1567. // 康养城订单,支付完就结束了
  1568. if ($order->order_status_payment == 'SUCCESS' && $params['goods_classify'] == 'VIP') {
  1569. $order->order_is_complete = 'Y';
  1570. }
  1571. // 主订单
  1572. $order->save();
  1573. // sheet
  1574. if ($order->order_status_payment == 'SUCCESS') {
  1575. OrderSheet::where('join_sheet_order_id', $params['order_id'])->update([
  1576. 'order_sheet_status' => $systemStatus,
  1577. ]);
  1578. }
  1579. // payDetail
  1580. $payData = [
  1581. 'pay_amount' => $params['order_amount_pay']
  1582. ];
  1583. if ($order->order_status_payment == 'SUCCESS') {
  1584. $payData['pay_paytimes'] = date('Y-m-d H:i:s');
  1585. $payData['pay_status'] = 'SUCCESS';
  1586. }
  1587. if ($params['pay_constitute'] == 'N' && in_array($params['pay_category'], ['WXPAY', 'ALIPAY'])) {
  1588. $payData['pay_prepayid'] = $params['pay_category'];
  1589. $payData['pay_json_response'] = $params['pay_json_response'];
  1590. } else if ($params['pay_category'] == 'CASH') {
  1591. $payData['pay_prepayid'] = $params['join_order_member_id'] . '-CASH';
  1592. } else if ($params['pay_category'] == 'WELFARE') {
  1593. $payData['pay_prepayid'] = $params['join_order_member_id'] . '-WELFARE';
  1594. } else if ($params['pay_category'] == 'VIP') {
  1595. $payData['pay_prepayid'] = $params['join_order_member_id'] . '-VIP';
  1596. } else if ($params['pay_category'] == 'CARD') {
  1597. $payData['pay_prepayid'] = $params['card_nbr'];
  1598. } else if ($params['pay_category'] == 'OFFLINE') {
  1599. $payData['pay_prepayid'] = 'OFFLINE';
  1600. } else if ($params['pay_category'] == 'OFFLINE_ALIPAY') {
  1601. $payData['pay_prepayid'] = 'OFFLINE_ALIPAY';
  1602. } else if ($params['pay_category'] == 'OFFLINE_WXPAY') {
  1603. $payData['pay_prepayid'] = 'OFFLINE_WXPAY';
  1604. } else if ($params['pay_category'] == 'MONEY') {
  1605. $payData['pay_prepayid'] = 'MONEY';
  1606. }
  1607. // 如果 是APP 过来的菜订单,可能没有paydetail
  1608. if (!PayDetail::where('join_pay_order_id', $order->order_groupby)->where('pay_category', '<>', 'WXPAY')->where('pay_category', '<>', 'ALIPAY')->exists()) {
  1609. $payData['join_pay_member_id'] = $params['join_order_member_id'];
  1610. $payData['join_pay_order_id'] = $order->order_groupby;
  1611. $payData['pay_status'] = $payData['pay_status'] == 'SUCCESS' ? $payData['pay_status'] : 'WAITING';
  1612. $payData['pay_category'] = $params['goods_classify'] ?? '';
  1613. $payData['pay_json_request'] = json_encode($params); // {"pay-result": "支付成功", "result-datetime": "2024-07-29 18:38:21"}
  1614. $payData['pay_json_response'] = $payData['pay_status'] == 'SUCCESS' ? json_encode([
  1615. 'pay-result' => '支付成功', 'result-datetime' => date('Y-m-d H:i:s')
  1616. ]) : '[]';
  1617. $payData['join_pay_object_json'] = !empty($params['orderId']) ? json_encode(['order_id' => $params['orderId']]) : '[]';
  1618. $payData['pay_addtimes'] = time();
  1619. PayDetail::insert($payData);
  1620. } else {
  1621. // 更新非微信支付宝的支付记录
  1622. PayDetail::where('join_pay_order_id', $order->order_groupby)->where('pay_category', '<>', 'WXPAY')->where('pay_category', '<>', 'ALIPAY')->update($payData);
  1623. }
  1624. $writeOffDate = [];
  1625. $applyData = [];
  1626. // 服务已完成,生成核销数据
  1627. // if ($order->order_status_payment == 'SUCCESS' && in_array($goods['goods_classify'], ['SERVICE','CHNMED','CHNNCD', 'PACKAGE'])) {
  1628. // $writeOffDate = OrderService::generateWriteOffData($params);
  1629. // $applyData = OrderService::generateAppointmentApplyData($params);
  1630. // }
  1631. // 有预约单,状态已完成
  1632. $appointment = Appointment::where('join_appointment_order_id', $params['order_id'])->first();
  1633. if ($order->order_status_payment == 'SUCCESS' && $appointment) {
  1634. $writeOffDate = OrderService::generateWriteOffData($params);
  1635. $applyData = OrderService::generateAppointmentApplyData($params);
  1636. $appointment->appointment_status = 'DONE';
  1637. $appointment->appointment_done_datetime = date('Y-m-d H:i:s');
  1638. $appointment->appointment_done_json = json_encode($writeOffDate);
  1639. if (empty($appointment->appointment_apply_datetime)) {
  1640. $appointment->appointment_apply_datetime = date('Y-m-d H:i:s');
  1641. }
  1642. if (empty($appointment->appointment_apply_json)) {
  1643. $appointment->appointment_apply_json = json_encode($applyData);
  1644. }
  1645. if (empty($appointment->appointment_datetime)) {
  1646. $appointment->appointment_datetime = date('Y-m-d');
  1647. }
  1648. $appointment->save();
  1649. }
  1650. // // 买的单个服务
  1651. if ($order->order_status_payment == 'SUCCESS' && empty($appointment)) {
  1652. foreach ($params['goodsContentList'] as $goods) {
  1653. $params['join_sheet_goods_id'] = $goods['goods_id'];
  1654. if (isset($goods['goods_classify']) && in_array($goods['goods_classify'], ['SERVICE', 'CHNMED', 'CHNNCD'])) {
  1655. $params['benefitId'] = 'BF' . date('ymdHi') . random_string(4, 'up');
  1656. $params['order_sheet_num'] = $goods['nbr'];
  1657. // 预约表
  1658. for ($i = 0; $i < intval($params['order_sheet_num']); $i++) {
  1659. $params['appointmentId'] = 'AP' . date('ymdHi') . random_string(4, 'up');
  1660. // 入预约记录
  1661. $this->insertAppointment($params, $writeOffDate, $applyData);
  1662. }
  1663. $goods['skuId'] = $goods['sku_id'];
  1664. $goods['category'] = $goods['goods_classify'];
  1665. // 权益表
  1666. $this->insertMemberBenefit($params, $goods);
  1667. } elseif (isset($goods['goods_classify']) && $goods['goods_classify'] == 'PACKAGE') { // 一个套餐买多个
  1668. $params['packageId'] = $goods['goods_id'];
  1669. $components = GoodsComponent::with([
  1670. 'goods' => function ($query) {
  1671. $query->select('goods_id', 'goods_name', 'goods_classify');
  1672. }
  1673. ])->where('join_component_master_goods_id', $params['packageId'])
  1674. ->get()
  1675. ->toArray();
  1676. foreach ($components as $component) {
  1677. $componentJson = json_decode($component['goods_component_json'], true);
  1678. $params['join_sheet_goods_sku_id'] = $componentJson['sku_id'];
  1679. $params['benefitId'] = 'BF' . date('ymdHi') . random_string(4, 'up');
  1680. $params['order_sheet_num'] = $goods['nbr'] * $componentJson['nbr'];
  1681. for ($i = 0; $i < intval($params['order_sheet_num']); $i++) {
  1682. $params['appointmentId'] = 'AP' . date('ymdHi') . random_string(4, 'up');
  1683. // 入预约记录
  1684. $this->insertAppointment($params, $writeOffDate);
  1685. }
  1686. $goods['goods_id'] = $component['join_component_goods_id'];
  1687. $goods['goods_name'] = $component['goods']['goods_name'];
  1688. $goods['goods_classify'] = $component['goods']['goods_classify'];
  1689. $goods['skuId'] = $goods['sku_id'];
  1690. $goods['category'] = 'SERVICE';
  1691. // 权益表
  1692. $this->insertMemberBenefit($params, $goods);
  1693. }
  1694. }
  1695. }
  1696. }
  1697. // 2.4W 康养城
  1698. if ($params['goods_classify'] == 'VIP' && $order->order_status_payment == 'SUCCESS') {
  1699. $params['member_id'] = $params['join_order_member_id'];
  1700. Event::dispatch('order.kangyangCityVIP.grant', $params);
  1701. }
  1702. Db::commit();
  1703. // 会员升级
  1704. if ($order->order_is_complete == 'Y' && $order->order_status_payment == 'SUCCESS') {
  1705. Event::dispatch('order.complete', $params);
  1706. Event::dispatch('order_pay.member_level.up', $params['join_order_member_id']);
  1707. }
  1708. // 打小票
  1709. if (!empty($premises) && $params['goods_classify'] == 'MEALS') {
  1710. dump("pay 打小票");
  1711. $restaurant = SysDept::where('dept_super_id', $premises->dept_id)->where('dept_category', '餐厅')->first();
  1712. if (!empty($restaurant->dept_extend_json)) {
  1713. $deptExtendJson = json_decode($restaurant->dept_extend_json, true);
  1714. if (isset($deptExtendJson['printer'])) {
  1715. foreach ($deptExtendJson['printer'] as $key => $item) {
  1716. if (strpos($key, '结算') !== false && $order->order_status_payment == 'SUCCESS') {
  1717. $voteData = [
  1718. 'func' => 'procActionToPrinter',
  1719. 'sign' => '',
  1720. 'data' => [
  1721. 'printer_premises' => $restaurant->dept_id,
  1722. 'printer_device' => [
  1723. $key
  1724. ],
  1725. 'printer_action' => 'ExecPrintOrder',
  1726. 'printer_data' => [
  1727. 'order_id' => $params['order_id']
  1728. ]
  1729. ]
  1730. ];
  1731. http_post_json(getenv('VOTE_MENU_URL'), $voteData);
  1732. }
  1733. }
  1734. }
  1735. }
  1736. }
  1737. if ($order->order_status_payment != 'SUCCESS') {
  1738. _syslog("订单", "支付异常,检查是否有轮询");
  1739. // 恢复优惠券到已占用
  1740. if (!is_array($couponUseJson)){
  1741. $couponUseJson = json_decode($couponUseJson, true);
  1742. }
  1743. $this->changeOrderCouponStatus($couponUseJson, 'WAITING');
  1744. return json_throw(2001, '支付异常', ['order_id' => $params['orderId']]);
  1745. }
  1746. _syslog("订单", "订单支付成功");
  1747. return json_success('支付成功');
  1748. } catch (BusinessException $e) {
  1749. dump($e->getMessage());
  1750. Db::rollBack();
  1751. _syslog("订单", "订单支付失败:" . $e->getMessage());
  1752. return json_fail("支付失败:" . $e->getMessage());
  1753. } catch (\Exception $e) {
  1754. dump($e->getMessage());
  1755. Db::rollBack();
  1756. _syslog("订单", "订单支付失败");
  1757. return json_fail('支付失败');
  1758. }
  1759. }
  1760. /**
  1761. * 组合支付
  1762. */
  1763. public function payConstitute(Request $request)
  1764. {
  1765. $params = $request->post();
  1766. // 余额、福利、储值卡 验证短信
  1767. if (!empty($params['pay_category_constitute']) && !in_array('OFFLINE', $params['pay_category_constitute']) && !in_array('MONEY', $params['pay_category_constitute']) && !in_array('QRCODE', $params['pay_category_constitute']) && (in_array('CASH', $params['pay_category_constitute']) || in_array('CARD', $params['pay_category_constitute']) || in_array('WELFARE', $params['pay_category_constitute']))) {
  1768. $code = $params['sms_code'];
  1769. if (!$code) {
  1770. return json_fail("验证码错误,请重新输入");
  1771. }
  1772. $member = Member::find($params['join_order_member_id']);
  1773. $mobile = $member->member_mobile;
  1774. $key = "SMS:CODE:ORDER_PAY:" . $mobile;
  1775. $redisCode = Redis::get($key);
  1776. if ($redisCode != $code && $code != '123456') {
  1777. return json_fail("验证码错误,请重新输入");
  1778. }
  1779. Redis::del($key);
  1780. }
  1781. // 验证线下付款密码
  1782. if (!empty($params['pay_category_constitute']) && in_array('OFFLINE', $params['pay_category_constitute']) && in_array('MONEY', $params['pay_category_constitute'])) {
  1783. $password = $params['offline_password'];
  1784. if ($password != '666888') {
  1785. return json_fail("密码错误,请重新输入");
  1786. }
  1787. }
  1788. $order = Order::where('order_id', $params['order_id'])->first();
  1789. if (!$order) {
  1790. return json_fail('订单异常');
  1791. }
  1792. if ($order->order_status_system != 'PAYING') {
  1793. return json_fail('订单不是可支付状态');
  1794. }
  1795. if (!empty($order->order_config_json)) {
  1796. $orderConfigJson = json_decode($order->order_config_json, true);
  1797. if (isset($orderConfigJson['premises'])) {
  1798. $premises = SysDept::where('dept_name', $orderConfigJson['premises'])->first();
  1799. if (!empty($premises)) {
  1800. $params['submit_premises_id'] = $premises->dept_id;
  1801. }
  1802. }
  1803. }
  1804. $params['orderId'] = $params['order_id'];
  1805. $params['orderGroupId'] = $order->order_groupby;
  1806. $goods = Goods::where('goods_id', $params['join_sheet_goods_id'])
  1807. ->select('goods_id', 'goods_name', 'goods_classify')
  1808. ->first();
  1809. if (!$goods) {
  1810. return json_fail('产品数据异常');
  1811. }
  1812. $goods = $goods->toArray();
  1813. $params['goods_classify'] = $goods['goods_classify'];
  1814. $systemStatus = 'SENDING'; // 待发货
  1815. // 立即结算
  1816. if (in_array($params['goods_classify'], ['MEALS', 'VIP'])) {
  1817. $order->order_is_complete = 'Y';
  1818. $systemStatus = 'DONE';
  1819. }
  1820. if (in_array($params['goods_classify'], ['SERVICE', 'CHNMED', 'CHNNCD', 'PACKAGE']) && $params['delivery'] == 'ARRIVAL') {
  1821. $params['order_is_complete'] = 'N';
  1822. $systemStatus = "WAITING";
  1823. }
  1824. $payDetail = PayDetail::where('join_pay_order_id', $order->order_groupby)->first();
  1825. Db::beginTransaction();
  1826. try {// 使用优惠券
  1827. $couponUseJson = [];
  1828. if (!empty($order->order_discount_json)) {
  1829. // 释放下单时选的优惠券
  1830. $order->order_discount_json = $this->releaseCoupon(json_decode($order->order_discount_json, true));
  1831. }
  1832. if (!empty($params['join_order_member_id']) && !empty($params['preferential'])) {
  1833. $couponResult = OrderService::payUseCoupon('pay', 'Y', $params['join_order_member_id'], $params['goodsContentList'], $params['preferential'], $params['order_amount_total']);
  1834. if (!empty($couponResult['pay_amount']) && $couponResult['pay_amount'] != $params['order_amount_pay']) {
  1835. throw new BusinessException("计算优惠后,实付金额错误!");
  1836. }
  1837. // 组装优惠券使用数据,存主表优惠里
  1838. if (!empty($couponResult['use_coupon_json'])) {
  1839. $couponUseJson = $couponResult['use_coupon_json'];
  1840. // if (!empty($order->order_discount_json)) {
  1841. // $orderDiscountJson = json_decode($order->order_discount_json, true);
  1842. // if (!empty($orderDiscountJson)) {
  1843. // $couponUseJson = json_encode(array_merge($orderDiscountJson, json_decode($couponUseJson, true)));
  1844. // }
  1845. // }
  1846. }
  1847. }
  1848. // 存储优惠信息
  1849. $order->order_discount_json = json_encode($this->discountRecord($couponUseJson, $params));
  1850. $orderAmountPay = $params['order_amount_pay'];
  1851. $constituteList = array_column($params['pay_category_constitute_list'], 'amount', 'category');// 验证金额
  1852. $constituteAmount = 0;
  1853. foreach ($params['pay_category_constitute_list'] as $item) {
  1854. $constituteAmount = $constituteAmount + $item['amount'];
  1855. }
  1856. if ($params['order_amount_pay'] != $constituteAmount) {
  1857. throw new BusinessException('组合支付金额与应付金额不一致');
  1858. }
  1859. if (!empty($params['pay_category_constitute']) && in_array('OFFLINE', $params['pay_category_constitute'])) { //线下付款
  1860. $order->order_status_system = $systemStatus;
  1861. $order->order_status_payment = 'SUCCESS';
  1862. $params['pay_category'] = $params['pay_category_sub'] ?? 'OFFLINE';
  1863. // 线下支付金额
  1864. if (isset($constituteList['OFFLINE'])) {
  1865. $params['order_amount_pay'] = $constituteList['OFFLINE'];
  1866. // 生成支付记录
  1867. OrderService::createPayConstituteDetail($params, $payDetail);
  1868. }
  1869. $params['order_amount_pay'] = $orderAmountPay;
  1870. }
  1871. if (!empty($params['pay_category_constitute']) && in_array('MONEY', $params['pay_category_constitute'])) { //现金付款
  1872. $order->order_status_system = $systemStatus;
  1873. $order->order_status_payment = 'SUCCESS';
  1874. $params['pay_category'] = 'MONEY';
  1875. // 线下支付金额
  1876. if (isset($constituteList['MONEY'])) {
  1877. $params['order_amount_pay'] = $constituteList['MONEY'];
  1878. // 生成支付记录
  1879. OrderService::createPayConstituteDetail($params, $payDetail);
  1880. }
  1881. $params['order_amount_pay'] = $orderAmountPay;
  1882. }
  1883. if (!empty($params['pay_category_constitute']) && in_array('CASH', $params['pay_category_constitute'])) { // 余额支付
  1884. $account = MemberAccount::where('join_account_member_id', $params['join_order_member_id'])
  1885. ->where('member_account_classify', 'CASH')
  1886. ->where('member_account_status', 'ACTIVED')
  1887. ->first();
  1888. if (!$account) {
  1889. throw new BusinessException('账户异常');
  1890. }
  1891. if (isset($constituteList['CASH'])) {
  1892. $params['order_amount_pay'] = $constituteList['CASH'];
  1893. $params['pay_category'] = $params['join_order_member_id'] . '-CASH';
  1894. }
  1895. $amount = $account->member_account_surplus + $account->member_account_added;
  1896. if ($params['pay_constitute'] == 'N' && (!$account || $params['order_amount_pay'] > $amount)) {
  1897. throw new BusinessException('账户余额不足');
  1898. }
  1899. if ($params['pay_constitute'] == 'Y' && (!$account || $params['order_amount_pay'] > $amount)) {
  1900. $qrcodePayAmount = $params['order_amount_pay'] - $amount;
  1901. $params['order_amount_pay'] = $amount;
  1902. }
  1903. if ($params['order_amount_pay'] > $account->member_account_surplus) {
  1904. $cut = $account->member_account_added - ($params['order_amount_pay'] - $account->member_account_surplus);
  1905. $account->member_account_surplus = 0;
  1906. $account->member_account_added = $cut;
  1907. } else {
  1908. $account->member_account_surplus = $account->member_account_surplus - $params['order_amount_pay'];
  1909. }
  1910. $account->member_account_expend = $account->member_account_expend + $params['order_amount_pay'];
  1911. $account->save();
  1912. // 生成支付记录
  1913. OrderService::createPayConstituteDetail($params, $payDetail);
  1914. $params['order_amount_pay'] = $orderAmountPay;
  1915. $order->order_status_system = $systemStatus;
  1916. $order->order_status_payment = 'SUCCESS';
  1917. }
  1918. if (!empty($params['pay_category_constitute']) && in_array('CARD', $params['pay_category_constitute'])) { // 储值卡账户
  1919. $cardNbr = $params['card_nbr'];
  1920. if (!$cardNbr) {
  1921. throw new BusinessException('账户异常');
  1922. }
  1923. $account = MemberAccount::where('join_account_member_id', $params['join_order_member_id'])
  1924. ->where('member_account_nbr', $cardNbr)
  1925. ->where('member_account_status', 'ACTIVED')
  1926. ->first();
  1927. if (!$account) {
  1928. Db::rollBack();
  1929. return json_fail('账户异常');
  1930. }
  1931. // 储值卡账户支付金额
  1932. if (isset($constituteList['CARD'])) {
  1933. $params['order_amount_pay'] = $constituteList['CARD'];
  1934. $params['pay_category'] = $cardNbr;
  1935. }
  1936. $amount = $account->member_account_surplus + $account->member_account_added;
  1937. if ($params['pay_constitute'] == 'N' && (!$account || $params['order_amount_pay'] > $amount)) {
  1938. throw new BusinessException('账户余额不足');
  1939. }
  1940. if ($params['pay_constitute'] == 'Y' && (!$account || $params['order_amount_pay'] > $amount)) {
  1941. $qrcodePayAmount = $params['order_amount_pay'] - $amount;
  1942. $params['order_amount_pay'] = $amount;
  1943. }
  1944. if ($params['order_amount_pay'] > $account->member_account_surplus) {
  1945. $cut = $account->member_account_added - ($params['order_amount_pay'] - $account->member_account_surplus);
  1946. $account->member_account_surplus = 0;
  1947. $account->member_account_added = $cut;
  1948. } else {
  1949. $account->member_account_surplus = $account->member_account_surplus - $params['order_amount_pay'];
  1950. }
  1951. $account->member_account_expend = $account->member_account_expend + $params['order_amount_pay'];
  1952. $account->save();
  1953. // 生成支付记录
  1954. OrderService::createPayConstituteDetail($params, $payDetail);
  1955. $params['order_amount_pay'] = $orderAmountPay;
  1956. $order->order_status_system = $systemStatus;
  1957. $order->order_status_payment = 'SUCCESS';
  1958. }
  1959. if (!empty($params['pay_category_constitute']) && in_array('QRCODE', $params['pay_category_constitute']) && !empty($params['qrcode_nbr'])) { // 付款码
  1960. if (isset($constituteList['QRCODE']) && $constituteList['QRCODE'] > 0) {
  1961. // 付款码支付金额
  1962. $params['order_amount_pay'] = $constituteList['QRCODE'];
  1963. // 调支付
  1964. $result = OrderService::qrcodePay($params);
  1965. $result = json_encode($result);
  1966. $params['pay_json_response'] = $result;
  1967. $result = json_decode($result, true);
  1968. $prefix = substr($params['qrcode_nbr'], 0, 2);
  1969. if (in_array($prefix, [10, 11, 12, 13, 14, 15])) {
  1970. $params['pay_category'] = 'WXPAY';
  1971. if ((!isset($result['return_code']) || $result['return_code'] != 'SUCCESS') || (!isset($result['result_code']) || $result['result_code'] != 'SUCCESS') || (empty($result['trade_state']) || $result['trade_state'] != 'SUCCESS')) {
  1972. $order->order_status_system = 'PAYING';
  1973. $order->order_status_payment = 'PENDING';
  1974. $order->order_is_complete = 'N';
  1975. // Db::rollBack();
  1976. // return json_fail('支付失败');
  1977. } else {
  1978. $order->order_status_system = $systemStatus;
  1979. $order->order_status_payment = 'SUCCESS';
  1980. }
  1981. } else if (in_array($prefix, [25, 26, 27, 28, 29, 30])) {
  1982. $params['pay_category'] = 'ALIPAY';
  1983. if ((!isset($result['code']) || $result['code'] != '10000') || (empty($result['trade_status']) || $result['trade_status'] != 'TRADE_SUCCESS')) {
  1984. $order->order_status_system = 'PAYING';
  1985. $order->order_status_payment = 'PENDING';
  1986. $order->order_is_complete = 'N';
  1987. // Db::rollBack();
  1988. // return json_fail('支付失败');
  1989. } else {
  1990. $order->order_status_system = $systemStatus;
  1991. $order->order_status_payment = 'SUCCESS';
  1992. }
  1993. } else {
  1994. throw new BusinessException('付款码无效');
  1995. }
  1996. }
  1997. // 生成支付记录
  1998. OrderService::createPayConstituteDetail($params, $payDetail);
  1999. // 账户支付的金额
  2000. $params['order_amount_pay'] = $orderAmountPay;
  2001. }
  2002. $orderConfigJson = [];
  2003. if (!empty($order->order_config_json)) {
  2004. $orderConfigJson = json_decode($order->order_config_json, true);
  2005. }
  2006. $orderConfigJson['preferential'] = $params['preferential'] ?? '';
  2007. if (isset($orderConfigJson['tableid']) && !empty($orderConfigJson['tableid'])) {
  2008. SysDept::where('dept_id', $orderConfigJson['tableid'])->where('dept_category', '桌台')->update(['dept_status' => 'ACTIVED']);
  2009. }
  2010. $order->order_config_json = json_encode($orderConfigJson);
  2011. $order->order_amount_pay = $params['order_amount_pay'];
  2012. // 主订单
  2013. $order->save();
  2014. // sheet
  2015. if ($order->order_status_payment == 'SUCCESS') {
  2016. OrderSheet::where('join_sheet_order_id', $params['order_id'])->update([
  2017. 'order_sheet_status' => $systemStatus,
  2018. ]);
  2019. }
  2020. // 清除paydetail 中的未支付记录
  2021. PayDetail::where('join_pay_order_id', $params['orderGroupId'])->where('pay_status', '<>', 'SUCCESS')->delete();
  2022. $writeOffDate = [];
  2023. $applyData = [];
  2024. // 有预约单,状态已完成
  2025. $appointment = Appointment::where('join_appointment_order_id', $params['order_id'])->first();
  2026. if ($order->order_status_payment == 'SUCCESS' && $appointment) {
  2027. $writeOffDate = OrderService::generateWriteOffData($params);
  2028. $applyData = OrderService::generateAppointmentApplyData($params);
  2029. $appointment->appointment_status = 'DONE';
  2030. $appointment->appointment_done_datetime = date('Y-m-d H:i:s');
  2031. $appointment->appointment_done_json = json_encode($writeOffDate);
  2032. if (empty($appointment->appointment_apply_datetime)) {
  2033. $appointment->appointment_apply_datetime = date('Y-m-d H:i:s');
  2034. }
  2035. if (empty($appointment->appointment_apply_json)) {
  2036. $appointment->appointment_apply_json = json_encode($applyData);
  2037. }
  2038. if (empty($appointment->appointment_datetime)) {
  2039. $appointment->appointment_datetime = date('Y-m-d');
  2040. }
  2041. $appointment->save();
  2042. }
  2043. // 买单个服务
  2044. if ($order->order_status_payment == 'SUCCESS' && empty($appointment)) {
  2045. foreach ($params['goodsContentList'] as $goods) {
  2046. $params['join_sheet_goods_id'] = $goods['goods_id'];
  2047. if (isset($goods['goods_classify']) && in_array($goods['goods_classify'], ['SERVICE', 'CHNMED', 'CHNNCD'])) {
  2048. $params['benefitId'] = 'BF' . date('ymdHi') . random_string(4, 'up');
  2049. $params['order_sheet_num'] = $goods['nbr'];
  2050. // 预约表
  2051. for ($i = 0; $i < intval($params['order_sheet_num']); $i++) {
  2052. $params['appointmentId'] = 'AP' . date('ymdHi') . random_string(4, 'up');
  2053. // 入预约记录
  2054. $this->insertAppointment($params, $writeOffDate, $applyData);
  2055. }
  2056. $goods['skuId'] = $goods['sku_id'];
  2057. $goods['category'] = $goods['goods_classify'];
  2058. // 权益表
  2059. $this->insertMemberBenefit($params, $goods);
  2060. } elseif (isset($goods['goods_classify']) && $goods['goods_classify'] == 'PACKAGE') { // 一个套餐买多个
  2061. $params['packageId'] = $goods['goods_id'];
  2062. $components = GoodsComponent::with([
  2063. 'goods' => function ($query) {
  2064. $query->select('goods_id', 'goods_name', 'goods_classify');
  2065. }
  2066. ])->where('join_component_master_goods_id', $params['packageId'])
  2067. ->get()
  2068. ->toArray();
  2069. foreach ($components as $component) {
  2070. $componentJson = json_decode($component['goods_component_json'], true);
  2071. $params['join_sheet_goods_sku_id'] = $componentJson['sku_id'];
  2072. $params['benefitId'] = 'BF' . date('ymdHi') . random_string(4, 'up');
  2073. $params['order_sheet_num'] = $goods['nbr'] * $componentJson['nbr'];
  2074. for ($i = 0; $i < intval($params['order_sheet_num']); $i++) {
  2075. $params['appointmentId'] = 'AP' . date('ymdHi') . random_string(4, 'up');
  2076. // 入预约记录
  2077. $this->insertAppointment($params, $writeOffDate);
  2078. }
  2079. $goods['goods_id'] = $component['join_component_goods_id'];
  2080. $goods['goods_name'] = $component['goods']['goods_name'];
  2081. $goods['goods_classify'] = $component['goods']['goods_classify'];
  2082. $goods['skuId'] = $goods['sku_id'];
  2083. $goods['category'] = 'SERVICE';
  2084. // 权益表
  2085. $this->insertMemberBenefit($params, $goods);
  2086. }
  2087. }
  2088. }
  2089. }
  2090. // 2.4W 康养城
  2091. if ($params['goods_classify'] == 'VIP' && $order->order_status_payment == 'SUCCESS') {
  2092. $params['member_id'] = $params['join_order_member_id'];
  2093. Event::dispatch('order.kangyangCityVIP.grant', $params);
  2094. }
  2095. Db::commit();
  2096. // 会员升级
  2097. if ($order->order_is_complete == 'Y' && $order->order_status_payment == 'SUCCESS') {
  2098. Event::dispatch('order.complete', $params);
  2099. Event::dispatch('order_pay.member_level.up', $params['join_order_member_id']);
  2100. }
  2101. // 打小票
  2102. if (!empty($premises) && $params['goods_classify'] == "MEALS") {
  2103. dump('payCons 打小票');
  2104. $restaurant = SysDept::where('dept_super_id', $premises->dept_id)->where('dept_category', '餐厅')->first();
  2105. if (!empty($restaurant->dept_extend_json)) {
  2106. $deptExtendJson = json_decode($restaurant->dept_extend_json, true);
  2107. if (isset($deptExtendJson['printer'])) {
  2108. foreach ($deptExtendJson['printer'] as $key => $item) {
  2109. if (strpos($key, '结算') !== false && $order->order_status_payment == 'SUCCESS') {
  2110. $voteData = [
  2111. 'func' => 'procActionToPrinter',
  2112. 'sign' => '',
  2113. 'data' => [
  2114. 'printer_premises' => $restaurant->dept_id,
  2115. 'printer_device' => [
  2116. $key
  2117. ],
  2118. 'printer_action' => 'ExecPrintOrder',
  2119. 'printer_data' => [
  2120. 'order_id' => $params['order_id']
  2121. ]
  2122. ]
  2123. ];
  2124. http_post_json(getenv('VOTE_MENU_URL'), $voteData);
  2125. }
  2126. }
  2127. }
  2128. }
  2129. }
  2130. if ($order->order_status_payment != 'SUCCESS') {
  2131. _syslog("订单", "支付异常,检查是否有轮询");
  2132. // 恢复优惠券到已占用
  2133. if (!is_array($couponUseJson)){
  2134. $couponUseJson = json_decode($couponUseJson, true);
  2135. }
  2136. $this->changeOrderCouponStatus($couponUseJson, 'WAITING');
  2137. return json_throw(2001, '支付异常', ['order_id' => $params['orderId']]);
  2138. }
  2139. _syslog("订单", "订单支付成功");
  2140. return json_success('支付成功');
  2141. } catch (\Exception $e) {
  2142. dump($e->getMessage());
  2143. Db::rollBack();
  2144. _syslog("订单", "订单支付失败");
  2145. return json_fail('支付失败');
  2146. }
  2147. }
  2148. /**
  2149. * @Desc
  2150. * @Author Gorden
  2151. * @Date 2024/6/7 10:30
  2152. *
  2153. * @param $params
  2154. * @return void
  2155. * @throws BusinessException
  2156. */
  2157. public function insertMain($params)
  2158. {
  2159. try {
  2160. $orderCategory = 'NORMAL';
  2161. if (!empty($params['order_category'])) {
  2162. $orderCategory = $params['order_category'];
  2163. } else if (isset($params['submit_goods_classify']) && $params['submit_goods_classify'] == 'MEALS') {
  2164. $orderCategory = 'DISHES';
  2165. } else if (isset($params['goods_classify'])) {
  2166. $orderCategory = $params['goods_classify'];
  2167. }
  2168. if (empty($params['order_extend_json'])) {
  2169. $params['order_extend_json'] = [];
  2170. } else {
  2171. if (is_json($params['order_extend_json'])) {
  2172. $params['order_extend_json'] = json_decode($params['order_extend_json'], true);
  2173. }
  2174. }
  2175. // 推荐人
  2176. $params['order_extend_json']['referee'] = $params['referee'] ?? '';
  2177. $data = [
  2178. 'order_id' => $params['orderId'],
  2179. 'order_groupby' => $params['orderGroupId'],
  2180. 'join_order_member_id' => $params['join_order_member_id'],
  2181. 'order_name' => date('Y-m-d H:i:s') . '-订单',
  2182. 'order_amount_total' => $params['order_amount_total'],
  2183. 'order_amount_pay' => $params['order_amount_pay'],
  2184. 'order_category' => $orderCategory,
  2185. 'order_classify' => $orderCategory,
  2186. 'order_is_complete' => $params['order_is_complete'] ?? 'N',
  2187. 'order_status_system' => $params['order_status_system'],
  2188. 'order_status_payment' => $params['order_status_payment'],
  2189. 'order_status_storage' => $params['order_status_storage'],
  2190. 'order_platform' => $params['order_platform'],
  2191. 'order_remark' => $params['order_remark'] ?? '',
  2192. 'order_discount_json' => $params['order_discount_json'],
  2193. 'order_config_json' => $params['order_config_json'] ?? '[]',
  2194. 'order_express_json' => $params['order_express_json'] ?? '[]',
  2195. 'order_extend_json' => $params['order_extend_json'] ? json_encode($params['order_extend_json']) : '[]',
  2196. 'order_addtimes' => time()
  2197. ];
  2198. Order::insert($data);
  2199. } catch (\Exception $e) {
  2200. dump($e->getMessage());
  2201. throw new BusinessException('订单创建信息失败');
  2202. }
  2203. }
  2204. /**
  2205. * @Desc
  2206. * @Author Gorden
  2207. * @Date 2024/6/7 10:25
  2208. *
  2209. * @param $params
  2210. * @return void
  2211. * @throws BusinessException
  2212. */
  2213. public function insertSheet($params)
  2214. {
  2215. try {
  2216. $orderSheetIds = [];
  2217. foreach ($params['goodsContentList'] as $goods) {
  2218. //{"unit": "份", "table": null, "premises": "15"}
  2219. $price = floatval($goods['goods_sales_price']);
  2220. $extendJson['unit'] = $goods['sku_name'];
  2221. if (isset($params['submit_premises_id'])) {
  2222. $extendJson['premises'] = $params['submit_premises_id'];
  2223. }
  2224. if (isset($params['submit_goods_classify']) && $params['submit_goods_classify'] == 'MEALS') {
  2225. $extendJson['table'] = null;
  2226. }
  2227. $data = [
  2228. 'join_sheet_member_id' => $params['join_order_member_id'],
  2229. 'join_sheet_order_id' => $params['orderId'],
  2230. 'join_sheet_goods_id' => $goods['goods_id'],
  2231. 'join_sheet_goods_sku_id' => $goods['sku_id'],
  2232. 'order_sheet_status' => $params['settlement_now'] == 'Y' && $params['order_status_payment'] == 'SUCCESS' ? 'DONE' : 'PAYING',
  2233. 'order_sheet_category' => (isset($params['submit_goods_classify']) && $params['submit_goods_classify'] == 'MEALS') ? 'DISHES' : 'NORMAL',
  2234. 'order_sheet_num' => $goods['nbr'],
  2235. 'order_sheet_price' => $goods['goods_sales_price'],
  2236. 'order_sheet_amount' => $price * $goods['nbr'],
  2237. 'order_sheet_pay' => $price * $goods['nbr'],
  2238. 'order_sheet_task_status' => 'NONE',
  2239. 'order_sheet_remark' => $params['order_remark'] ?? '',
  2240. 'order_sheet_addtimes' => time(),
  2241. 'order_sheet_extend_json' => json_encode($extendJson)
  2242. ];
  2243. $orderSheetId = OrderSheet::insertGetId($data);
  2244. $orderSheetIds[] = $orderSheetId;
  2245. // 减库存,规格和总库存
  2246. if (!isset($params['submit_goods_classify']) || !in_array($params['submit_goods_classify'], ['MEALS', 'PACKAGE'])) {
  2247. $goodsSku = GoodsSku::where('goods_sku_id', $goods['sku_id'])->first();
  2248. $skuStorageJson = json_decode($goodsSku->goods_sku_storage_json, true);
  2249. if (isset($skuStorageJson['storage']) && !empty($skuStorageJson['storage'])) {
  2250. $skuStorageJson['storage'] = $skuStorageJson['storage'] - $goods['nbr'];
  2251. }
  2252. if (!isset($skuStorageJson['storage']) || (!empty($skuStorageJson['storage']) && $skuStorageJson['storage'] < 0)) {
  2253. throw new BusinessException('库存不足');
  2254. }
  2255. $goodsSku->goods_sku_storage_json = json_encode($skuStorageJson);
  2256. $goodsSku->save();
  2257. }
  2258. $goodsRunning = GoodsRunning::where('join_running_goods_id', $goods['goods_id'])->first();
  2259. $goodsRunning->goods_running_storage = $goodsRunning->goods_running_storage - $goods['nbr'];
  2260. if ($goodsRunning->goods_running_storage < 0) {
  2261. throw new BusinessException('库存不足');
  2262. }
  2263. $goodsRunning->goods_running_sale = $goodsRunning->goods_running_sale + $goods['nbr'];
  2264. $goodsRunning->save();
  2265. }
  2266. return $orderSheetIds;
  2267. } catch (\support\exception\BusinessException $e) {
  2268. dump($e->getMessage() . '||' . $e->getLine());
  2269. throw new BusinessException($e->getMessage());
  2270. } catch (\Exception $e) {
  2271. dump($e->getMessage() . '||' . $e->getLine());
  2272. throw new BusinessException('订单创建失败');
  2273. }
  2274. }
  2275. /**
  2276. * @Desc
  2277. * @Author Gorden
  2278. * @Date 2024/6/7 10:35
  2279. *
  2280. * @param $params
  2281. * @return void
  2282. * @throws BusinessException
  2283. */
  2284. public function insertPayDetail($params)
  2285. {
  2286. try {
  2287. if (in_array($params['pay_category'], ['WXPAY', 'ALIPAY'])) {
  2288. $payPrepayid = $params['pay_category'];
  2289. } else if ($params['pay_category'] == 'OFFLINE') {
  2290. $payPrepayid = 'OFFLINE';
  2291. } else if ($params['pay_category'] == 'OFFLINE_ALIPAY') {
  2292. $payPrepayid = 'OFFLINE_ALIPAY';
  2293. } else if ($params['pay_category'] == 'OFFLINE_WXPAY') {
  2294. $payPrepayid = 'OFFLINE_WXPAY';
  2295. } else if ($params['pay_category'] == 'MONEY') {
  2296. $payPrepayid = 'MONEY';
  2297. } else {
  2298. $payPrepayid = $params['join_order_member_id'] . '-' . $params['pay_category'];
  2299. }
  2300. $data = [
  2301. 'join_pay_member_id' => $params['join_order_member_id'],
  2302. 'join_pay_order_id' => $params['orderGroupId'],
  2303. 'pay_status' => $params['settlement_now'] == 'Y' && $params['order_status_payment'] == 'SUCCESS' ? 'SUCCESS' : 'WAITING',
  2304. 'pay_category' => $params['goods_classify'],
  2305. 'pay_amount' => $params['order_amount_pay'],
  2306. 'pay_prepayid' => $payPrepayid,
  2307. 'pay_paytimes' => date('Y-m-d H:i:s'),
  2308. 'join_pay_object_json' => !empty($params['orderId']) ? json_encode(['order_id' => $params['orderId']]) : '[]',
  2309. 'pay_json_request' => json_encode($params),
  2310. 'pay_json_response' => $params['pay_json_response'] ?? '[]',
  2311. 'pay_remark' => $params['order_remark'] ?? '',
  2312. 'pay_addtimes' => time(),
  2313. ];
  2314. PayDetail::insert($data);
  2315. } catch (\Exception $e) {
  2316. dump($e->getMessage());
  2317. throw new BusinessException('创建支付记录失败');
  2318. }
  2319. }
  2320. /**
  2321. * @Desc
  2322. * @Author Gorden
  2323. * @Date 2024/6/7 10:50
  2324. *
  2325. * @param $params
  2326. * @return void
  2327. * @throws BusinessException
  2328. */
  2329. public function insertAppointment($params, $writeOffDate, $applyData = [])
  2330. {
  2331. try {
  2332. $data = [
  2333. 'appointment_id' => $params['appointmentId'],
  2334. 'join_appointment_member_id' => $params['join_order_member_id'],
  2335. 'join_appointment_goods_id' => $params['join_sheet_goods_id'],
  2336. 'join_appointment_goods_sku_id' => $params['join_sheet_goods_sku_id'],
  2337. 'join_appointment_order_id' => $params['orderId'],
  2338. 'join_appointment_member_benefit_id' => $params['benefitId'],
  2339. 'appointment_classify' => $params['goods_classify'],
  2340. 'appointment_status' => 'INIT',
  2341. 'appointment_category' => 'NORMAL',
  2342. 'appointment_platform' => 'SYSTEM',
  2343. 'appointment_addtimes' => time(),
  2344. 'appointment_datetime' => '',
  2345. 'appointment_apply_datetime' => '',
  2346. 'appointment_apply_json' => '[]',
  2347. 'appointment_done_datetime' => '',
  2348. 'appointment_remark' => $params['order_remark'] ?? '',
  2349. 'appointment_done_json' => '[]'
  2350. ];
  2351. Appointment::insert($data);
  2352. } catch (\Exception $e) {
  2353. dump($e->getMessage());
  2354. throw new BusinessException("创建权益记录失败");
  2355. }
  2356. }
  2357. /**
  2358. * @Desc
  2359. * @Author Gorden
  2360. * @Date 2024/6/7 11:05
  2361. *
  2362. * @param $params
  2363. * @param $goods
  2364. * @return void
  2365. * @throws BusinessException
  2366. */
  2367. public function insertMemberBenefit($params, $goods)
  2368. {
  2369. try {
  2370. $data = [
  2371. 'member_benefit_id' => $params['benefitId'],
  2372. 'join_benefit_member_id' => $params['join_order_member_id'],
  2373. 'join_benefit_package_id' => $params['packageId'] ?? '',
  2374. 'join_benefit_goods_id' => $goods['goods_id'],
  2375. 'join_benefit_goods_sku_id' => $goods['skuId'] ?? '',
  2376. 'join_benefit_order_id' => $params['orderId'],
  2377. 'member_benefit_status' => 'ACTIVED',
  2378. 'member_benefit_category' => $goods['category'],
  2379. 'member_benefit_name' => $goods['goods_name'],
  2380. 'member_benefit_limit_count' => $params['order_sheet_num'],
  2381. 'member_benefit_used_count' => 0,
  2382. 'member_benefit_remark' => $params['order_remark'] ?? '',
  2383. 'member_benefit_addtimes' => time()
  2384. ];
  2385. MemberBenefit::insert($data);
  2386. } catch (\Exception $e) {
  2387. dump($e->getMessage());
  2388. throw new BusinessException('创建会员权益失败');
  2389. }
  2390. }
  2391. public function saveExpress($params)
  2392. {
  2393. try {
  2394. $express = new OrderExpress();
  2395. $express->order_express_type = $params['order_express_type'];
  2396. $express->join_express_order_id = $params['orderId'];
  2397. $express->join_express_dept_id = $params['submit_premises_id'] ?? 0;
  2398. $express->order_express_goods = $params['order_express_goods'];
  2399. $express->order_express_city = $params['order_express_city'];
  2400. $express->order_express_address = $params['order_express_address'];
  2401. $express->order_express_mobile = $params['order_express_mobile'] ?? '';
  2402. $express->order_express_telephone = $params['order_express_telephone'] ?? '';
  2403. $express->order_express_person = $params['order_express_person'] ?? '';
  2404. $express->order_express_company = $params['dept_premises_id'] ?? '';
  2405. $express->order_express_extend_json = $params['order_express_extend_json'] ?? '[]';
  2406. $express->order_express_addtimes = time();
  2407. $express->save();
  2408. } catch (\Exception $e) {
  2409. dump($e->getMessage());
  2410. throw new BusinessException('物流信息保存失败');
  2411. }
  2412. }
  2413. /**
  2414. * @Desc 修改优惠券状态
  2415. * @Author Gorden
  2416. * @Date 2024/9/19 9:03
  2417. *
  2418. * @param $coupon
  2419. * @param $status
  2420. * @return void
  2421. */
  2422. private function changeOrderCouponStatus($coupon, $status)
  2423. {
  2424. if (!empty($coupon) && is_array($coupon)) {
  2425. $updateData['coupon_detail_status'] = $status;
  2426. if ($status == 'ACTIVED' || $status == 'WAITING') {
  2427. $updateData['coupon_detail_used_datetime'] = '';
  2428. } elseif ($status == 'USED') {
  2429. $updateData['coupon_detail_used_datetime'] = date('Y-m-d H:i:s');
  2430. }
  2431. foreach ($coupon as $item) {
  2432. if (!empty($item['coupon_id']) && !empty($item['coupon_detail_id'])) {
  2433. foreach ($item['coupon_detail_id'] as $detailId) {
  2434. CouponDetail::where('join_detail_coupon_id', $item['coupon_id'])
  2435. ->where('coupon_detail_id', $detailId)->update($updateData);
  2436. }
  2437. }
  2438. }
  2439. }
  2440. }
  2441. private function discountRecord($orderDiscountJson, $params)
  2442. {
  2443. $json = [];
  2444. if (!empty($orderDiscountJson)) {
  2445. $json = json_decode($orderDiscountJson, true);
  2446. }
  2447. try {
  2448. if (!empty($params['preferential']) && in_array('wipe', $params['preferential'])) {
  2449. if (intval($params['order_amount_total'] / 10) * 10 != $params['order_amount_pay']) {
  2450. throw new BusinessException("抹零后实际支付金额错误");
  2451. }
  2452. $params['order_discount_amount'] = $params['order_amount_total'] - $params['order_amount_pay'];
  2453. $couponClassifyDesc = $couponClassify = '抹零';
  2454. } elseif (!empty($params['preferential']) && in_array('custom', $params['preferential'])) {
  2455. if (sprintf("%.2f", $params['order_amount_total'] - $params['order_discount_amount']) != sprintf("%.2f", $params['order_amount_pay'])) {
  2456. throw new BusinessException("餐厅前台优惠后实际支付金额错误");
  2457. }
  2458. $couponClassifyDesc = $couponClassify = '餐厅前台优惠';
  2459. } else if (!empty($params['preferential']) && intval($params['preferential'][0]) < 100 && intval($params['preferential'][0]) >= 50) {
  2460. if (($params['order_amount_total'] * intval($params['preferential'][0])) / 100 != $params['order_amount_pay']) {
  2461. throw new BusinessException("折扣后实际支付金额错误");
  2462. }
  2463. $couponClassify = '折扣';
  2464. $couponClassifyDesc = intval($params['preferential'][0]) / 10 . '折';
  2465. $params['order_discount_amount'] = $params['order_amount_total'] - $params['order_amount_pay'];
  2466. } else {
  2467. return $json;
  2468. }
  2469. $json[date('Y-m-d H:i:s')] = [
  2470. 'coupon_id' => $params['coupon_id'] ?? null,
  2471. 'coupon_value' => $params['order_discount_amount'] ?? '',
  2472. 'coupon_classify' => $couponClassify,
  2473. 'coupon_detail_id' => [$couponClassifyDesc],
  2474. 'coupon_classify_en' => $params['preferential']
  2475. ];
  2476. return $json;
  2477. } catch (BusinessException $e) {
  2478. throw new BusinessException($e->getMessage());
  2479. } catch (\Exception $e) {
  2480. dump($e->getMessage());
  2481. throw new BusinessException("优惠数据错误");
  2482. }
  2483. }
  2484. }