Purchase.php 26 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662
  1. <?php
  2. namespace app\data\controller\api\business;
  3. use app\data\model\DataUser;
  4. use app\data\model\DataUserLeaveMessage;
  5. use app\data\model\ShopCoordination;
  6. use app\data\model\ShopCoordinationItem;
  7. use app\data\model\ShopOcean;
  8. use app\data\model\ShopOceanItem;
  9. use app\data\model\ShopProduction;
  10. use app\data\model\ShopProductionItem;
  11. use app\data\model\ShopPurchase;
  12. use app\data\model\ShopPurchaseItem;
  13. use app\data\model\ShopPurchaseOffer;
  14. use app\data\model\ShopPurchaseOfferAmount;
  15. use think\admin\Controller;
  16. use think\Exception;
  17. use think\exception\ErrorException;
  18. use think\facade\Db;
  19. use hg\apidoc\annotation\Title;
  20. use hg\apidoc\annotation\Method;
  21. use hg\apidoc\annotation\Param;
  22. use hg\apidoc\annotation\Returned;
  23. use think\facade\Validate;
  24. use think\Request;
  25. /**
  26. * 商家端发布订单
  27. * Class Goods
  28. * @package app\data\controller\api
  29. */
  30. class Purchase extends Controller
  31. {
  32. /**
  33. * @Title ("采购订单发布和编辑")
  34. * @Method ("post")
  35. * @Param ("id",desc="如果是编辑则传ID")
  36. * @Param ("real_name",desc="联系人")
  37. * @Param ("mobile",desc="联系方式")
  38. * @Param ("post_time",desc="交货时间")
  39. * @Param ("post_address",desc="交货地址")
  40. * @Param ("images",desc="图片数组,[{type:'image或video',src:'http://xxxxx'}]")
  41. * @Param ("item",desc="['id:修改则传ID','name 商品名称','spec 规格','number 数量','standard 验收标准','price 价格']")
  42. * @return void
  43. */
  44. public function purchase_order(\think\Validate $validate,Request $request){
  45. $request->offsetSet('images',json_decode($request['images'],true)?:[]);
  46. $request->offsetSet('item',json_decode($request['item'],true)?:[]);
  47. $admin_id = $this->uuid();
  48. $data=$this->_vali([
  49. 'real_name.require'=>'联系人不能为空',
  50. 'mobile.require'=>'联系方式不能为空',
  51. 'post_time.require'=>'交货时间不能为空',
  52. 'post_address.require'=>'交货单地址不能为空',
  53. 'images.require'=>'图片不能为空',
  54. // 'images.array'=>'图片格式有误',
  55. 'images.min:1'=>'图片必须',
  56. 'item.require'=>'商品参数不能为空',
  57. ]);
  58. $data['images'] = json_decode($request['images'],true);
  59. $data['item'] = json_decode($request['item'],true);
  60. foreach ($data['images'] as $image){
  61. $validate->failException()->check($image,[
  62. 'type|图片类型'=>['require','in:image,video'],
  63. 'src|图片链接'=>['require','url'],
  64. ]);
  65. }
  66. foreach ($data['item'] as $item){
  67. $validate->failException()->check($item,[
  68. 'name|名称'=>['require'],
  69. 'spec|规格'=>['require'],
  70. 'number|数量'=>['require','integer'],
  71. 'standard|验收标准'=>['require'],
  72. 'price|价格'=>['require','float'],
  73. ]);
  74. }
  75. $purchase_data = [
  76. 'admin_id'=>$admin_id->id,
  77. 'real_name'=>$data['real_name'],
  78. 'mobile'=>$data['mobile'],
  79. 'images'=>$data['images'],
  80. 'post_time'=>$data['post_time'],
  81. 'post_address'=>$data['post_address'],
  82. 'create_time'=>date('Y-m-d H:i:s'),
  83. 'longitude'=>$admin_id->merchant->longitude,
  84. 'latitude'=>$admin_id->merchant->latitude,
  85. 'amount'=>min(array_column($data['item'],'price')),
  86. ];
  87. Db::startTrans();
  88. try {
  89. if($request['id']){
  90. $order_id=ShopPurchase::where('admin_id',$admin_id['id'])->where('id',$request['id'])->findOrFail();
  91. $order_id->save($purchase_data);
  92. }else {
  93. $order_id = ShopPurchase::create($purchase_data);
  94. }
  95. $item_ids=[];
  96. foreach ($data['item'] as &$v){
  97. $item_data = [
  98. 'purchase_id'=>$order_id['id'],
  99. 'name'=>$v['name'],
  100. 'spec'=>$v['spec'],
  101. 'number'=>$v['number'],
  102. 'standard'=>$v['standard'],
  103. 'price'=>$v['price'],
  104. ];
  105. if(!empty($v['id'])){
  106. $itemModel=$order_id->items()->where('id',$v['id'])->find();
  107. if(!$itemModel){
  108. $this->error('商品不存在');
  109. }
  110. $itemModel->save($item_data);
  111. }else{
  112. $itemModel=$order_id->items()->save($item_data);
  113. }
  114. $item_ids[]=$itemModel['id'];
  115. }
  116. $order_id->items()->whereNotIn('id',$item_ids)->select()->each(function ($d){$d->delete();});
  117. ShopPurchaseOffer::where('order_id',$order_id['id'])
  118. ->whereNotIn('item_id',$item_ids)
  119. ->select()->each(function ($m){$m->delete();});
  120. // 提交事务
  121. Db::commit();
  122. $this->success('采购订单发布成功');
  123. } catch (ErrorException $e) {
  124. // 回滚事务
  125. Db::rollback();
  126. $this->error('发布失败');
  127. }
  128. }
  129. /**
  130. * @Title ("生产订单发布或编辑")
  131. * @Method ("post")
  132. * @Param ("id",desc="如果是编辑则传ID")
  133. * @Param ("real_name",desc="联系人")
  134. * @Param ("mobile",desc="联系方式")
  135. * @Param ("standard_tech",desc="生产技术标准")
  136. * @Param ("standard_check",desc="生产验收标准")
  137. * @Param ("post_time",desc="交货时间")
  138. * @Param ("post_address",desc="交货地址")
  139. * @Param ("file",desc="图片/视频,[{type:'image或video',src:'http://xxxxx'}]")
  140. * @Param ("item",desc="二维数组,[{'id:修改则传ID',name:'产品名称',spec:'规格',number:'数量',enclosure:[{filename:'文件名',fileurl:'文件链接'}]}]")
  141. * @return void
  142. */
  143. public function production_order(\think\Validate $validate,Request $request){
  144. $admin_id = $this->uuid();
  145. $request->offsetSet('file',json_decode($request['file'],true)?:[]);
  146. $request->offsetSet('item',json_decode($request['item'],true)?:[]);
  147. $data=$this->_vali([
  148. 'real_name.require'=>'联系人不能为空',
  149. 'mobile.require'=>'联系方式不能为空',
  150. 'standard_tech.require'=>'生产技术标准必须',
  151. 'standard_check.require'=>'生产验收标准必须',
  152. 'post_time.require'=>'交货时间不能为空',
  153. 'post_address.require'=>'交货单地址不能为空',
  154. 'item.require'=>'商品参数不能为空',
  155. //'file.array'=>'图片视频有误',
  156. ]);
  157. $data['file'] = json_decode($request['file'],true);
  158. $data['item'] = json_decode($request['item'],true);
  159. foreach ($data['file']??[] as $image){
  160. $validate->failException()->check($image,[
  161. 'type|图片类型'=>['require','in:image,video'],
  162. 'src|图片链接'=>['require','url'],
  163. ]);
  164. }
  165. foreach ($data['item'] as $item){
  166. $validate->failException()->check($item,[
  167. 'name|名称'=>['require'],
  168. 'spec|规格'=>['require'],
  169. 'number|数量'=>['require','integer'],
  170. 'enclosure|附件'=>['array',],
  171. ]);
  172. if(!empty($item['enclosure'])){
  173. foreach ($item['enclosure'] as $enclosure){
  174. $validate->failException()->check($enclosure,[
  175. 'filename|文件名'=>['require'],
  176. 'fileurl|文件地址'=>['require','url',],
  177. ]);
  178. }
  179. }
  180. }
  181. $purchase_data = [
  182. 'admin_id'=>$admin_id->id,
  183. 'real_name'=>$data['real_name'],
  184. 'mobile'=>$data['mobile'],
  185. 'standard_tech'=>$data['standard_tech'],
  186. 'standard_check'=>$data['standard_check'],
  187. 'post_time'=>$data['post_time'],
  188. 'post_address'=>$data['post_address'],
  189. 'longitude'=>$admin_id->merchant->longitude,
  190. 'latitude'=>$admin_id->merchant->latitude,
  191. 'create_time'=>date('Y-m-d H:i:s'),
  192. 'file'=>$data['file']??[],
  193. ];
  194. Db::startTrans();
  195. try {
  196. if($request['id']) {
  197. $order=ShopProduction::where('admin_id',$admin_id['id'])->where('id',$request['id'])->findOrFail();
  198. $order->save($purchase_data);
  199. $item_ids=[];
  200. foreach ($data['item'] as $item){
  201. if(!empty($item['id'])){
  202. $itemModel=$order->items()->where('id',$item['id'])->findOrFail();
  203. $itemModel->save($item);
  204. }else{
  205. $itemModel=$order->items()->save($item);
  206. }
  207. $item_ids[]=$itemModel['id'];
  208. }
  209. $order->items()->whereNotIn('id',$item_ids)->select()->each(function ($d){$d->delete();});
  210. }else{
  211. $order = ShopProduction::create($purchase_data);
  212. $order->items()->saveAll($data['item']);
  213. }
  214. // 提交事务
  215. Db::commit();
  216. $this->success('订单已发布');
  217. } catch (ErrorException $e) {
  218. // 回滚事务
  219. Db::rollback();
  220. $this->success('发布失败');
  221. }
  222. }
  223. /**
  224. * @Title ("海运订单发布或编辑")
  225. * @Method ("post")
  226. * @Param ("id",desc="如果是编辑则传ID")
  227. * @Param ("real_name",desc="联系人")
  228. * @Param ("mobile",desc="联系方式")
  229. * @Param ("form",desc="包装形式")
  230. * @Param ("wharf_to",desc="装货码头")
  231. * @Param ("wharf_for",desc="交货码头")
  232. * @Param ("file",desc="图片/视频,[{type:'image或video',src:'http://xxxxx'}]")
  233. * @Param ("item",desc="['id:修改则传ID','name 商品名称','weight 重量']")
  234. * @return void
  235. */
  236. public function ocean_order(\think\Validate $validate,Request $request){
  237. $request->offsetSet('file',json_decode($request['file'],true)?:[]);
  238. $request->offsetSet('item',json_decode($request['item'],true)?:[]);
  239. $admin_id = $this->uuid();
  240. $data=$this->_vali([
  241. 'real_name.require'=>'联系人不能为空',
  242. 'mobile.require'=>'联系方式不能为空',
  243. 'form.require'=>'包装形式必须',
  244. 'wharf_to.require'=>'装货码头必须',
  245. 'wharf_for.require'=>'交货码头必须',
  246. // 'file.array'=>'图片必须是数组',
  247. 'item.require'=>'商品必须',
  248. 'item.array'=>'商品必须是数组',
  249. ]);
  250. $data['file'] = json_decode($request['file'],true);
  251. $data['item'] = json_decode($request['item'],true);
  252. foreach ($data['file']??[] as $image){
  253. $validate->failException()->check($image,[
  254. 'type|图片类型'=>['require','in:image,video'],
  255. 'src|图片链接'=>['require','url'],
  256. ]);
  257. }
  258. foreach ($data['item'] as $item){
  259. $validate->failException()->check($item,[
  260. 'name|名称'=>['require'],
  261. 'weight|数量吨位'=>['require','float'],
  262. ]);
  263. }
  264. $purchase_data = [
  265. 'admin_id'=>$admin_id->id,
  266. 'real_name'=>$data['real_name'],
  267. 'mobile'=>$data['mobile'],
  268. 'form'=>$data['form'],
  269. 'wharf_to'=>$data['wharf_to'],
  270. 'wharf_for'=>$data['wharf_for'],
  271. 'file'=>$data['file']??[],
  272. 'longitude'=>$admin_id->merchant->longitude,
  273. 'latitude'=>$admin_id->merchant->latitude,
  274. ];
  275. Db::startTrans();
  276. try {
  277. if($request['id']){
  278. $order_id=ShopOcean::where('admin_id',$admin_id['id'])->where('id',$request['id'])->findOrFail();
  279. $order_id->save($purchase_data);
  280. $item_ids=[];
  281. foreach ($data['item'] as $item){
  282. if(!empty($item['id'])){
  283. $itemModel=$order_id->items()->where('id',$item['id'])->findOrFail();
  284. $itemModel->save($item);
  285. }else{
  286. $itemModel=$order_id->items()->save($item);
  287. }
  288. $item_ids[]=$itemModel['id'];
  289. }
  290. $order_id->items()->whereNotIn('id',$item_ids)->select()->each(function ($d){$d->delete();});
  291. }else {
  292. $order_id = ShopOcean::mk()->create($purchase_data);
  293. $order_id->items()->saveAll($data['item']);
  294. }
  295. // 提交事务
  296. Db::commit();
  297. $this->success('已发布');
  298. } catch (ErrorException $e) {
  299. // 回滚事务
  300. Db::rollback();
  301. $this->success('发布失败');
  302. }
  303. }
  304. /**
  305. * @Title ("外协订单发布或编辑")
  306. * @Method ("post")
  307. * @Param ("id",desc="如果是编辑则传ID")
  308. * @Param ("real_name",desc="联系人")
  309. * @Param ("mobile",desc="联系方式")
  310. * @Param ("standard_tech",desc="生产技术标准")
  311. * @Param ("standard_check",desc="生产验收标准")
  312. * @Param ("post_time",desc="交货时间")
  313. * @Param ("post_address",desc="交货地址")
  314. * @Param ("file",desc="图片/视频,[{type:'image或video',src:'http://xxxxx'}]")
  315. * @Param ("item",desc="二维数组,[{'id:修改则传ID',name:'产品名称',spec:'规格',number:'数量',enclosure:[{filename:'文件名',fileurl:'文件链接'}]}]")
  316. * @return void
  317. */
  318. public function coordination_order(\think\Validate $validate,Request $request){
  319. $request->offsetSet('file',json_decode($request['file'],true)?:[]);
  320. $request->offsetSet('item',json_decode($request['item'],true)?:[]);
  321. $admin_id = $this->uuid();
  322. $data=$this->_vali([
  323. 'real_name.require'=>'联系人不能为空',
  324. 'mobile.require'=>'联系方式不能为空',
  325. 'standard_tech.require'=>'生产技术标准',
  326. 'standard_check.require'=>'生产验收标准',
  327. 'post_time.require'=>'交货时间不能为空',
  328. 'post_address.require'=>'交货单地址不能为空',
  329. 'item.require'=>'商品参数不能为空',
  330. // 'file.array'=>'图片必须是数组',
  331. ]);
  332. $data['file'] = json_decode($request['file'],true);
  333. $data['item'] = json_decode($request['item'],true);
  334. foreach ($data['file']??[] as $image){
  335. $validate->failException()->check($image,[
  336. 'type|图片类型'=>['require','in:image,video'],
  337. 'src|图片链接'=>['require','url'],
  338. ]);
  339. }
  340. foreach ($data['item'] as $item){
  341. $validate->failException()->check($item,[
  342. 'name|名称'=>['require'],
  343. 'spec|规格'=>['require'],
  344. 'number|数量'=>['require','integer'],
  345. 'enclosure|附件'=>['array',],
  346. ]);
  347. if(!empty($item['enclosure'])){
  348. foreach ($item['enclosure'] as $enclosure){
  349. $validate->failException()->check($enclosure,[
  350. 'filename|文件名'=>['require'],
  351. 'fileurl|文件地址'=>['require','url',],
  352. ]);
  353. }
  354. }
  355. }
  356. $purchase_data = [
  357. 'admin_id'=>$admin_id->id,
  358. 'real_name'=>$data['real_name'],
  359. 'mobile'=>$data['mobile'],
  360. 'standard_tech'=>$data['standard_tech'],
  361. 'standard_check'=>$data['standard_check'],
  362. 'post_time'=>$data['post_time'],
  363. 'post_address'=>$data['post_address'],
  364. 'longitude'=>$admin_id->merchant->longitude,
  365. 'latitude'=>$admin_id->merchant->latitude,
  366. 'file'=>$data['file']??[],
  367. 'create_time'=>date('Y-m-d H:i:s')
  368. ];
  369. Db::startTrans();
  370. try {
  371. if($request['id']){
  372. $order=ShopCoordination::where('id',$request['id'])->where('admin_id',$admin_id['id'])->findOrFail();
  373. $order->save($purchase_data);
  374. $item_ids=[];
  375. foreach ($data['item'] as $item){
  376. if(!empty($item['id'])){
  377. $itemModel=$order->items()->where('id',$item['id'])->findOrFail();
  378. $itemModel->save($item);
  379. }else{
  380. $itemModel=$order->items()->save($item);
  381. }
  382. $item_ids[]=$itemModel['id'];
  383. }
  384. $order->items()->whereNotIn('id',$item_ids)->select()->each(function ($d){$d->delete();});
  385. }else {
  386. $order = ShopCoordination::mk()->create($purchase_data);
  387. $order->items()->saveAll($data['item']);
  388. }
  389. // 提交事务
  390. Db::commit();
  391. $this->success('已发布');
  392. } catch (ErrorException $e) {
  393. // 回滚事务
  394. Db::rollback();
  395. $this->success('发布失败');
  396. }
  397. }
  398. public function order_no($key,$uuid){
  399. $time_str = date('YmdHi');
  400. $order_no = $key.$time_str . sprintf("%04d", $uuid);
  401. return $order_no;
  402. }
  403. public function uuid(){
  404. $purchase_model = new Common($this->app);
  405. $uuid = $purchase_model->uuid();
  406. return $uuid;
  407. }
  408. /**
  409. * @Title("采购订单列表")
  410. * @Param ("page",desc="第几页")
  411. * @Param ("limit",desc="每页几条")
  412. * @Param ("status",desc="1未报价2已报价3已匹配")
  413. * @Param ("tab",desc="1采购2生产3外协4海运")
  414. * @Returned("参考用户端采购订单列表")
  415. */
  416. public function list(Request $request){
  417. $status=$request['status'];
  418. $tab=$request['tab']?:1;
  419. $query=ShopPurchase::getQuery($tab);
  420. $list=$query
  421. ->where('admin_id',$this->uuid()->id)
  422. ->with(['items'])
  423. ->when($status,['status'=>$status])
  424. ->order('id','desc')
  425. ->paginate($request['limit']?:15);
  426. $this->success('',$list);
  427. }
  428. /**
  429. *@Title("详情")
  430. * @Param ("tab",desc="1采购2生产3外协4海运")
  431. * @Param ("id",desc="订单ID")
  432. * @Returned("is_matched",desc="是否已匹配")
  433. * @Returned("参考用户端采购订单列表")
  434. */
  435. public function show(Request $request){
  436. DataUser::$copyRealName=true;
  437. $data=$this->_vali([
  438. 'id.require'=>'ID必须',
  439. 'tab.require'=>'tab必须',
  440. ],'get');
  441. if($data['tab']==1) {
  442. $model = ShopPurchase::getQuery($data['tab'])
  443. ->with(['items','items.offers','items.offers.user'])
  444. ->findOrFail($data['id']);
  445. foreach ($model['items'] as &$v){
  446. foreach ($v['offers'] as &$a){
  447. $a['amounts'] = ShopPurchaseOfferAmount::mk()
  448. ->where('user_id',$a['user_id'])
  449. ->where('offer_id',$a['id'])
  450. ->order('id asc')
  451. ->select();
  452. }
  453. }
  454. }else{
  455. $model = ShopPurchase::getQuery($data['tab'])
  456. ->with(['items','offers','offers.user'])
  457. ->findOrFail($data['id']);
  458. }
  459. $this->success('',$model);
  460. }
  461. /**
  462. *@Title("取消订单")
  463. * @Param ("tab",desc="1采购2生产3外协4海运")
  464. * @Param ("id",desc="订单ID")
  465. */
  466. public function cancel(Request $request){
  467. $data=$this->_vali([
  468. 'id.require'=>'ID必须',
  469. 'tab.require'=>'tab必须',
  470. ],'get');
  471. $admin=$this->uuid();
  472. $model=ShopPurchase::getQuery($data['tab'])->where('admin_id',$admin['id'])->findOrFail($data['id']);
  473. $model['status']=0;
  474. $model->save();
  475. $this->success('操作成功');
  476. }
  477. /**
  478. *@Title("提醒完成")
  479. * @Param ("user_id",desc="用户ID")
  480. */
  481. public function reminder(Request $request){
  482. $data=$this->_vali([
  483. 'user_id.require'=>'user_id必须'
  484. ],'get');
  485. $alias = DataUser::mk()->where('id',$data['user_id'])->value('jgalias');
  486. $content = '您报价的订单已匹配完成,请及时查看';
  487. $alias ? jgpush($content,$alias) : '';
  488. $this->success('操作成功');
  489. }
  490. /**
  491. * @Title("匹配订单")
  492. * @Method("POST")
  493. * @Param ("tab",desc="1采购2生产3外协4海运")
  494. * @Param ("id",desc="订单ID")
  495. * @Param ("offer_id",desc="接单ID")
  496. */
  497. public function match(Request $request){
  498. $data=$this->_vali([
  499. 'id.require'=>'ID必须',
  500. 'tab.require'=>'tab必须',
  501. 'offer_id.require'=>'offer必须',
  502. ]);
  503. $admin=$this->uuid();
  504. $tab = $data['tab'];
  505. $id = $data['id'];
  506. Db::startTrans();
  507. // $admin['id'] = '10010';
  508. $model=ShopPurchase::getItem($data['tab'],$admin['id'])->lock(true)
  509. ->where(function ($query) use ($tab,$id){
  510. // if ($tab==1){
  511. // $query->where('purchase_id',$id);
  512. // }else{
  513. $query->where('id',$id);
  514. // }
  515. })
  516. ->findOrEmpty();
  517. $model_id = $model['id'];
  518. //dump($model->toArray());die;
  519. if($model['is_matched']){
  520. Db::rollback();
  521. $this->error('该订单已匹配');
  522. }
  523. // $hasMatch=ShopPurchase::getItem($data['tab'])->where('offer_id',$data['offer_id'])->value('id');
  524. $hasMatch=ShopPurchase::getItem($data['tab'])->where('id',$data['id'])->value('offer_id');
  525. if($hasMatch){
  526. Db::rollback();
  527. $this->error('该接单已被其他订单匹配');
  528. }
  529. $offer=ShopPurchase::getOffer($data['tab'])->lock(true)
  530. // ->where('user_id',$data['offer_id'])
  531. ->when($tab,function ($querys) use ($tab,$model_id){
  532. switch ($tab){
  533. case 1:
  534. $querys->where('item_id',$model_id);
  535. break;
  536. case 2:
  537. $querys->where('production_id',$model_id);
  538. break;
  539. case 3:
  540. $querys->where('corrdination_id',$model_id);
  541. break;
  542. case 4:
  543. $querys->where('ocea_id',$model_id);
  544. break;
  545. }
  546. })
  547. ->findOrEmpty();
  548. if($request['tab']==1){
  549. if ($offer->item_id != $model['id']) {
  550. Db::rollback();
  551. $this->error('该接单不属于此订单');
  552. }
  553. }else {
  554. if ($offer->order_id != $model['id']) {
  555. Db::rollback();
  556. $this->error('该接单不属于此订单');
  557. }
  558. }
  559. $model['offer_id']=$data['offer_id'];
  560. if($data['tab']==1){
  561. $main=$model->main;
  562. $main['status']=3;
  563. $main->save();
  564. }else{
  565. $model['status']=3;
  566. }
  567. $model->save();
  568. Db::commit();
  569. $url = setword($data['tab']+1,$data['id']);
  570. ShopPurchase::getItem($data['tab'])->where('id',$model['id'])->update(['down_word'=>$url]);
  571. $this->success('匹配成功');
  572. }
  573. /**
  574. * @Title ("发送留言")
  575. * @Method("post")
  576. * @Param ("id",desc="订单ID")
  577. * @Param ("tab",desc="1采购2生产3外协4海运")
  578. * @Param ("user_id",desc="发送给的用户id")
  579. * @Param ("content",desc="内容")
  580. */
  581. public function msg_send(Request $request){
  582. $this->_vali([
  583. 'id.require'=>'id必须',
  584. 'user_id.require'=>'用户必须',
  585. 'tab.require'=>'tab必须',
  586. 'content.require'=>'tab必须',
  587. 'content.max:500'=>'内容过长',
  588. ]);
  589. $model=ShopPurchase::getQuery($request['tab'])->findOrFail($request['id']);
  590. $user=DataUser::where('id',$request['user_id'])->findOrFail();
  591. $msg=DataUserLeaveMessage::create([
  592. 'uuid'=>$this->uuid()->id,
  593. 'uuid2'=>$user['id'],
  594. 'content'=>$request['content'],
  595. 'type'=>DataUserLeaveMessage::getMsgType($model->getTable()),
  596. 'link_id'=>$model['id'],
  597. ]);
  598. $this->success('发送成功',$msg);
  599. }
  600. /**
  601. * @Title ("留言列表")
  602. * @Param ("id",desc="订单ID")
  603. * @Param ("tab",desc="1采购2生产3外协4海运")
  604. * @Param ("user_id",desc="要查看的用户id")
  605. * @Returned ("user.headimg",desc="用户头像")
  606. * @Returned ("merchant.headimg",desc="商家头像")
  607. * @Returned ("is_mine",desc="是否是自己的留言")
  608. */
  609. public function msg_get(Request $request){
  610. $this->_vali([
  611. 'id.require'=>'id必须',
  612. 'tab.require'=>'tab必须',
  613. ],'get');
  614. $model=ShopPurchase::getQuery($request['tab'])->findOrFail($request['id']);
  615. $messagelist = DataUserLeaveMessage::mk()
  616. ->where('type',DataUserLeaveMessage::getMsgType($model->getTable()))
  617. ->where('uuid2',$request['user_id'])
  618. ->where('link_id',$model['id'])
  619. ->with(['user2'=>function($query){
  620. $query->field('id,nickname,headimg');
  621. }])
  622. ->field('id,uuid,uuid2,content,create_at')
  623. ->select()->toArray();
  624. foreach ($messagelist as &$msg){
  625. $msg['user']=$msg['user2'];
  626. unset($msg['user2']);
  627. }
  628. $this->success('成功',$messagelist);
  629. }
  630. /**
  631. * @Title("获取订单配置")
  632. * @Returned("packing",desc="包装形式数组")
  633. */
  634. public function config(){
  635. $config=[];
  636. $config['packing']=systemConfig('merchant_config.packing')?:[];
  637. $this->success('',$config);
  638. }
  639. }