MdController.php 75 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394959697989910010110210310410510610710810911011111211311411511611711811912012112212312412512612712812913013113213313413513613713813914014114214314414514614714814915015115215315415515615715815916016116216316416516616716816917017117217317417517617717817918018118218318418518618718818919019119219319419519619719819920020120220320420520620720820921021121221321421521621721821922022122222322422522622722822923023123223323423523623723823924024124224324424524624724824925025125225325425525625725825926026126226326426526626726826927027127227327427527627727827928028128228328428528628728828929029129229329429529629729829930030130230330430530630730830931031131231331431531631731831932032132232332432532632732832933033133233333433533633733833934034134234334434534634734834935035135235335435535635735835936036136236336436536636736836937037137237337437537637737837938038138238338438538638738838939039139239339439539639739839940040140240340440540640740840941041141241341441541641741841942042142242342442542642742842943043143243343443543643743843944044144244344444544644744844945045145245345445545645745845946046146246346446546646746846947047147247347447547647747847948048148248348448548648748848949049149249349449549649749849950050150250350450550650750850951051151251351451551651751851952052152252352452552652752852953053153253353453553653753853954054154254354454554654754854955055155255355455555655755855956056156256356456556656756856957057157257357457557657757857958058158258358458558658758858959059159259359459559659759859960060160260360460560660760860961061161261361461561661761861962062162262362462562662762862963063163263363463563663763863964064164264364464564664764864965065165265365465565665765865966066166266366466566666766866967067167267367467567667767867968068168268368468568668768868969069169269369469569669769869970070170270370470570670770870971071171271371471571671771871972072172272372472572672772872973073173273373473573673773873974074174274374474574674774874975075175275375475575675775875976076176276376476576676776876977077177277377477577677777877978078178278378478578678778878979079179279379479579679779879980080180280380480580680780880981081181281381481581681781881982082182282382482582682782882983083183283383483583683783883984084184284384484584684784884985085185285385485585685785885986086186286386486586686786886987087187287387487587687787887988088188288388488588688788888989089189289389489589689789889990090190290390490590690790890991091191291391491591691791891992092192292392492592692792892993093193293393493593693793893994094194294394494594694794894995095195295395495595695795895996096196296396496596696796896997097197297397497597697797897998098198298398498598698798898999099199299399499599699799899910001001100210031004100510061007100810091010101110121013101410151016101710181019102010211022102310241025102610271028102910301031103210331034103510361037103810391040104110421043104410451046104710481049105010511052105310541055105610571058105910601061106210631064106510661067106810691070107110721073107410751076107710781079108010811082108310841085108610871088108910901091109210931094109510961097109810991100110111021103110411051106110711081109111011111112111311141115111611171118111911201121112211231124112511261127112811291130113111321133113411351136113711381139114011411142114311441145114611471148114911501151115211531154115511561157115811591160116111621163116411651166116711681169117011711172117311741175117611771178117911801181118211831184118511861187118811891190119111921193119411951196119711981199120012011202120312041205120612071208120912101211121212131214121512161217121812191220122112221223122412251226122712281229123012311232123312341235123612371238123912401241124212431244124512461247124812491250125112521253125412551256125712581259126012611262126312641265126612671268126912701271127212731274127512761277127812791280128112821283128412851286128712881289129012911292129312941295129612971298129913001301130213031304130513061307130813091310131113121313131413151316131713181319132013211322132313241325132613271328132913301331133213331334133513361337133813391340134113421343134413451346134713481349135013511352135313541355135613571358135913601361136213631364136513661367136813691370137113721373137413751376137713781379138013811382138313841385138613871388138913901391139213931394139513961397139813991400140114021403140414051406140714081409141014111412141314141415141614171418141914201421142214231424142514261427142814291430143114321433143414351436143714381439144014411442144314441445144614471448144914501451145214531454145514561457145814591460146114621463146414651466146714681469147014711472147314741475147614771478147914801481148214831484148514861487148814891490149114921493149414951496149714981499150015011502150315041505150615071508150915101511151215131514151515161517151815191520152115221523152415251526152715281529153015311532153315341535153615371538153915401541154215431544154515461547154815491550155115521553155415551556155715581559156015611562156315641565156615671568156915701571157215731574157515761577157815791580158115821583158415851586158715881589159015911592159315941595159615971598159916001601160216031604160516061607160816091610161116121613161416151616161716181619162016211622162316241625162616271628162916301631163216331634163516361637163816391640164116421643164416451646164716481649165016511652165316541655165616571658165916601661166216631664166516661667166816691670167116721673167416751676167716781679168016811682168316841685168616871688168916901691169216931694169516961697169816991700170117021703170417051706170717081709171017111712171317141715171617171718171917201721172217231724172517261727172817291730173117321733173417351736173717381739174017411742174317441745174617471748174917501751175217531754175517561757175817591760176117621763176417651766176717681769177017711772177317741775177617771778177917801781178217831784178517861787178817891790179117921793179417951796179717981799180018011802180318041805180618071808180918101811181218131814181518161817181818191820182118221823182418251826182718281829183018311832183318341835183618371838183918401841184218431844184518461847184818491850185118521853185418551856185718581859186018611862186318641865186618671868186918701871187218731874187518761877187818791880188118821883188418851886
  1. <?php
  2. /**
  3. * 重庆赤晓店信息科技有限公司
  4. * https://www.chixiaodian.com
  5. * Copyright (c) 2023 赤店商城 All rights reserved.
  6. */
  7. namespace app\modules\client\controllers\v1;
  8. use app\constants\OptionSetting;
  9. use app\librarys\Picqer\Barcode\BarcodeGeneratorJPG;
  10. use app\models\Admin;
  11. use app\models\Cash;
  12. use app\models\DeliveryInfo;
  13. use app\models\Level;
  14. use app\models\Lg;
  15. use app\models\Mch;
  16. use app\models\MchStaff;
  17. use app\models\Md;
  18. use app\models\MdCategory;
  19. use app\models\MdProfit;
  20. use app\models\MdSetting;
  21. use app\models\MdStaff;
  22. use app\models\Option;
  23. use app\models\Order;
  24. use app\models\OrderDetail;
  25. use app\models\OrderGoodsCancel;
  26. use app\models\OrderRefund;
  27. use app\models\RefundAddress;
  28. use app\models\SaasUser;
  29. use app\models\Store;
  30. use app\models\User;
  31. use app\modules\client\controllers\BaseController;
  32. use app\modules\client\models\v1\MdListForm;
  33. use app\modules\client\models\v1\MdOrder;
  34. use app\modules\client\models\v1\ShareQrcodeForm;
  35. use app\modules\client\models\v1\MdGodsForm;
  36. use app\utils\ArrayHelper;
  37. use app\utils\Notice\NoticeSend;
  38. use app\utils\OrderNo;
  39. use app\utils\QrCode;
  40. use app\utils\ShareQrcode;
  41. use yii\data\Pagination;
  42. use yii\helpers\Json;
  43. class MdController extends BaseController
  44. {
  45. public function behaviors()
  46. {
  47. return parent::behaviors();
  48. }
  49. public function actionMdCategory() {
  50. $store_id = get_store_id();
  51. $mdCategory = MdCategory::getList($store_id);
  52. return $this->asJson([
  53. 'code' => 0,
  54. 'msg' => 'success',
  55. 'data' => $mdCategory
  56. ]);
  57. }
  58. public function actionList() {
  59. $form = new MdListForm();
  60. $form->page = get_params('page', 1);
  61. $form->longitude = get_params('longitude', 1);
  62. $form->latitude = get_params('latitude', 1);
  63. $form->attributes = get_params();
  64. return $this->asJson($form->search());
  65. }
  66. /**
  67. * @return \yii\web\Response
  68. */
  69. public function actionSubmit() {
  70. $saas_user_id = get_saas_user_id();
  71. $name = post_params('name');
  72. $mobile = post_params('mobile');
  73. $province = post_params('province');
  74. $city = post_params('city');
  75. $district = post_params('district');
  76. $logo = post_params('logo');
  77. $contact = post_params('contact');
  78. $address = post_params('address');
  79. $user_name = post_params('user_name') ?: $mobile;
  80. $longitude = post_params('longitude');
  81. $latitude = post_params('latitude');
  82. $password = post_params('password') ?: $mobile;
  83. $cat_id = post_params('cat_id');
  84. if (empty($contact) || empty($name) || empty($mobile) || empty($logo) || empty($province) || empty($city) || empty($district) || empty($address) || empty($user_name) || empty($password)) {
  85. return $this->asJson([
  86. 'code' => 1,
  87. 'msg' => '参数错误'
  88. ]);
  89. }
  90. $admin = Admin::find()->where(['username' => $user_name, 'is_delete' => 0])->one();
  91. $md = Md::find()->where(['store_id' => get_store_id(), 'user_name' => $user_name, 'is_delete' => 0])->one();
  92. if (!empty($admin) || !empty($md)) {
  93. return $this->asJson([
  94. 'code' => 1,
  95. 'msg' => '用户名已经存在,请更换'
  96. ]);
  97. }
  98. $md_staff = MdStaff::findOne(['saas_user_id' => $saas_user_id, 'is_delete' => 0, 'store_id' => get_store_id()]);
  99. if ($md_staff) {
  100. return $this->asJson([
  101. 'code' => 1,
  102. 'msg' => '由于您属于其他门店员工,暂时无法创建门店'
  103. ]);
  104. }
  105. $admin = Md::find()->where(['store_id' => get_store_id(), 'mobile' => $mobile, 'is_delete' => 0])->andWhere(['in', 'shop_audit', [0, 1]])->one();
  106. if ($admin) {
  107. return $this->asJson([
  108. 'code' => 1,
  109. 'msg' => '当前注册手机号店铺已存在或存在待审核记录'
  110. ]);
  111. }
  112. if ($cat_id > 0) {
  113. $mdCategory = MdCategory::getList(get_store_id(), $cat_id);
  114. if (!$mdCategory) {
  115. return $this->asJson([
  116. 'code' => 1,
  117. 'msg' => '门店分类不存在'
  118. ]);
  119. }
  120. }
  121. $md = new Md();
  122. $md->store_id = get_store_id();
  123. $md->user_id = $saas_user_id;
  124. $md->name = $name;
  125. $md->address = $address;
  126. $md->mobile = $mobile;
  127. $md->contact = $contact;
  128. $md->cover_url = $logo;
  129. $md->province = $province;
  130. $md->city = $city;
  131. $md->district = $district;
  132. $md->user_name = $user_name;
  133. $md->longitude = $longitude;
  134. $md->latitude = $latitude;
  135. $md->password = \Yii::$app->security->generatePasswordHash($password);
  136. $md->cat_id = $cat_id ?: 0;
  137. if ($md->save()) {
  138. return $this->asJson([
  139. 'code' => 0,
  140. 'msg' => '提交成功'
  141. ]);
  142. }
  143. return $this->asJson([
  144. 'code' => 1,
  145. 'msg' => $md->errors[0]
  146. ]);
  147. }
  148. public function actionMdCenter() {
  149. $saas_user_id = get_saas_user_id();
  150. $store_id = get_store_id();
  151. $md = Md::find()->where(['store_id'=> $store_id, 'is_delete' => 0, 'shop_audit' => 1, 'manager' => $saas_user_id])->asArray()->one();
  152. if (empty($md)) {
  153. return $this->asJson([
  154. 'code' => 1,
  155. 'msg' => '门店信息不存在或未拥有该门店的权限'
  156. ]);
  157. }
  158. // 利润佣金
  159. $md['sale_profit'] = MdProfit::find()->where(['store_id' => $store_id, 'md_id' => $md['id'], 'is_send' => 1, 'is_clerk' => 0])->sum('sale_profit');
  160. // 销售佣金
  161. $md['pay_profit'] = MdProfit::find()->where(['store_id' => $store_id, 'md_id' => $md['id'], 'is_send' => 1, 'is_clerk' => 0])->sum('pay_profit');
  162. // 统计自提订单信息
  163. $md['offline_order'] = [
  164. 'not_send' => Order::find()->where(['store_id' => $store_id, 'md_id' => $md['id'], 'is_delete' => 0])->andWhere(['trade_status'=>0, 'is_offline' => 1])->count(),
  165. 'send' => Order::find()->where(['store_id' => $store_id, 'md_id' => $md['id'], 'is_delete' => 0])->andWhere(['trade_status'=>2, 'is_offline' => 1])->count(),
  166. 'confirm' => Order::find()->where(['store_id' => $store_id, 'md_id' => $md['id'], 'is_delete' => 0])->andWhere(['trade_status'=>3, 'is_offline' => 1, 'is_recycle'=>0])->count(),
  167. 'wait_sale' => OrderRefund::find()->alias('or')->leftJoin(['o' => Order::tableName()],'or.order_id = o.id')->where(['or.store_id' => $store_id, 'or.md_id' => $md['id'], 'o.is_delete' => 0, 'or.is_delete' => 0, 'or.status' => 0])->andWhere(['o.is_offline' => 1])->count(),// 待售后
  168. ];
  169. // 统计门店订单信息
  170. $md['all_order'] = [
  171. 'not_send' => Order::find()->where(['store_id' => $store_id, 'md_id' => $md['id'], 'is_delete' => 0])->andWhere(['trade_status'=>0,])->count(),
  172. 'send' => Order::find()->where(['store_id' => $store_id, 'md_id' => $md['id'], 'is_delete' => 0])->andWhere(['trade_status'=>2])->count(),
  173. 'confirm' => Order::find()->where(['store_id' => $store_id, 'md_id' => $md['id'], 'is_delete' => 0])->andWhere(['trade_status'=>3, 'is_recycle'=>0])->count(),
  174. 'wait_sale' => OrderRefund::find()->alias('or')->leftJoin(['o' => Order::tableName()],'or.order_id = o.id')->where(['or.store_id' => $store_id, 'or.md_id' => $md['id'], 'o.is_delete' => 0, 'or.is_delete' => 0, 'or.status' => 0])->count(),// 待售后
  175. ];
  176. // 未结算收益
  177. $md['not_send_profit'] = MdProfit::find()->alias('mp')->leftJoin(['o' => Order::tableName()], 'mp.order_id = o.id')
  178. ->where(['mp.store_id' => $store_id, 'mp.md_id' => $md['id'], 'mp.is_send' => 0])->andWhere(['NOT IN', 'o.trade_status', [-1, 1]])
  179. ->sum('mp.total_profit') ?? 0;
  180. // 已提现佣金
  181. $md['cash'] = bcsub($md['total_profit'] , $md['cash_profit'],2);
  182. return $this->asJson([
  183. 'code' => 0,
  184. 'data' => $md
  185. ]);
  186. }
  187. public function actionStaffCenter() {
  188. $saas_user = get_saas_user();
  189. $saas_user_id = $saas_user->id;
  190. $store_id = get_store_id();
  191. $md_staff = MdStaff::find()->where(['store_id' => $store_id, 'saas_user_id' => $saas_user_id, 'is_disable' => 0, 'is_delete' => 0])->asArray()->one();
  192. if (empty($md_staff)) {
  193. return $this->asJson([
  194. 'code' => 1,
  195. 'msg' => '您未有所属门店或权限被限制'
  196. ]);
  197. }
  198. $md = Md::findOne($md_staff['md_id']);
  199. // 已核销订单数量
  200. $md_staff['clerk_count'] = MdProfit::find()->where(['store_id' => $store_id, 'md_id' => $md_staff['md_id'], 'is_clerk' => 1, 'clerk_id' => $md_staff['id'], 'is_send' => 1])->count();
  201. // 待核销订单数量
  202. $md_staff['no_clerk_count'] = MdProfit::find()->where(['store_id' => $store_id, 'md_id' => $md_staff['md_id'], 'is_clerk' => 1, 'is_send' => 0])
  203. ->andWhere(['order_id' => Order::find()->select('id')->where(['trade_status' => [Order::ORDER_FLOW_NO_SEND, Order::ORDER_FLOW_NO_SEND], 'is_pay' => 1, 'is_recycle' => 0])])
  204. ->count();
  205. $md_staff['avatar'] = $saas_user->avatar;
  206. $md_staff['name'] = $saas_user->name;
  207. $md_staff['md_name'] = $md->name;
  208. $md_staff['md_logo'] = $md->cover_url;
  209. $md_staff['md_shop_time_type'] = $md->shop_time_type;
  210. $md_staff['md_start_time'] = $md->start_time;
  211. $md_staff['md_end_time'] = $md->end_time;
  212. return $this->asJson([
  213. 'code' => 0,
  214. 'data' => $md_staff
  215. ]);
  216. }
  217. public function actionAuditStatus() {
  218. $saas_user_id = get_saas_user_id();
  219. $md = Md::find()->where(['user_id' => $saas_user_id, 'store_id' => get_store_id(), 'is_delete' => 0])->orderBy('id desc')->limit(1)->one();
  220. if (!$md) {
  221. return $this->asJson([
  222. 'code' => 0,
  223. 'msg' => '没有审核记录',
  224. 'data' => ['status' => -1]
  225. ]);
  226. }
  227. return $this->asJson([
  228. 'code' => 0,
  229. 'data' => ['status' => $md->shop_audit]
  230. ]);
  231. }
  232. public function actionSetting() {
  233. $open_status = post_params('open_status');
  234. $saas_user_id = get_saas_user_id();
  235. $store_id = get_store_id();
  236. $md = Md::find()->where(['store_id' => $store_id, 'is_delete' => 0, 'shop_audit' => 1])->andWhere(['or', ['user_id' => $saas_user_id], ['manager' => $saas_user_id]])->one();
  237. if (!$md) {
  238. return $this->asJson([
  239. 'code' => 1,
  240. 'msg' => '未拥有该门店的权限'
  241. ]);
  242. }
  243. $md->open_status = intval($open_status);
  244. if (!$md->save()) {
  245. return $this->asJson([
  246. 'code' => 1,
  247. 'msg' => $md->errors[0]
  248. ]);
  249. }
  250. return $this->asJson([
  251. 'code' => 0,
  252. 'data' => '保存成功'
  253. ]);
  254. }
  255. /**
  256. * 保存门店设置
  257. * @return \yii\web\Response
  258. * @author: hankaige
  259. * @Time: 2024/4/8 09:37
  260. */
  261. public function actionHandleSetting()
  262. {
  263. $saas_user_id = get_saas_user_id();
  264. $store_id = get_store_id();
  265. $md = Md::find()->where(['store_id' => $store_id, 'is_delete' => 0, 'shop_audit' => 1])->andWhere(['or', ['user_id' => $saas_user_id], ['manager' => $saas_user_id]])->one();
  266. if (!$md) {
  267. return $this->asJson([
  268. 'code' => 1,
  269. 'msg' => '未拥有该门店的权限'
  270. ]);
  271. }
  272. $md->cover_url = post_params('cover_url');
  273. $md->name = post_params('name');
  274. $md->mobile = post_params('mobile');
  275. $md->address = post_params('address');
  276. if(post_params('start_time') == '00:00' && post_params('end_time') == '23:59'){
  277. $md->shop_time_type = 1;
  278. }
  279. $md->start_time = post_params('start_time');
  280. $md->end_time = post_params('end_time');
  281. $md->open_status = post_params('open_status');
  282. if(!$md->save()){
  283. return $this->asJson([
  284. 'code' => 1,
  285. 'msg' => $md->errors[0]
  286. ]);
  287. }
  288. return $this->asJson([
  289. 'code' => 0,
  290. 'data' => '保存成功'
  291. ]);
  292. }
  293. public function actionOtherInfo() {
  294. $store = Store::findOne(get_store_id());
  295. $pics = $store->md_banner ? Json::decode($store->md_banner) : [];
  296. return $this->asJson([
  297. 'code' => 0,
  298. 'data' => [
  299. 'md_agreement' => $store->md_agreement,
  300. 'md_banner' => $pics,
  301. 'md_category' => MdCategory::getList(get_store_id())
  302. ]
  303. ]);
  304. }
  305. public function actionSelectList() {
  306. $page = get_params('page', 1);
  307. $limit = get_params('limit', 20);
  308. $query = SaasUser::find()
  309. ->where(['is_delete' => SaasUser::DELETE_STATUS_FALSE])
  310. ->andWhere(['not', ['name' => '']]);
  311. if (!empty(get_params('keyword'))) {
  312. $query->andWhere(['like', 'name', get_params('keyword')]);
  313. }
  314. $count = $query->count();
  315. $pagination = new Pagination(['totalCount' => $count, 'pageSize' => $limit, 'page' => $page - 1]);
  316. $list = $query->select('id, name, avatar')->limit($pagination->limit)
  317. ->offset($pagination->offset)->orderBy('created_at desc')->asArray()->all();
  318. return $this->asJson([
  319. 'code' => 0,
  320. 'msg' => 'success',
  321. 'data' => [
  322. 'list' => $list,
  323. 'page_count' => $pagination->pageCount,
  324. 'row_count' => $count
  325. ]
  326. ]);
  327. }
  328. public function actionStaffAdd() {
  329. $store_id = get_store_id();
  330. $manager_user_id = get_saas_user_id();
  331. $md = Md::find()->where(['store_id' => $store_id, 'is_delete' => 0, 'shop_audit' => 1])->andWhere(['or', ['user_id' => $manager_user_id], ['manager' => $manager_user_id]])->one();
  332. if (!$md) {
  333. return $this->asJson([
  334. 'code' => 1,
  335. 'msg' => '未拥有该门店的权限'
  336. ]);
  337. }
  338. $name = post_params('name');
  339. $mobile = post_params('mobile');
  340. $saas_user_id = post_params('saas_user_id');
  341. if (empty($name) || empty($mobile) || empty($saas_user_id)) {
  342. return $this->asJson([
  343. 'code' => 1,
  344. 'msg' => '参数有误'
  345. ]);
  346. }
  347. $staff = MdStaff::findOne(['store_id' => $store_id, 'saas_user_id' => $saas_user_id, 'is_delete' => 0]);
  348. if ($staff) {
  349. return $this->asJson([
  350. 'code' => 1,
  351. 'msg' => '该员工已在其他门店下,请重新绑定'
  352. ]);
  353. }
  354. $md_staff = new MdStaff();
  355. $md_staff->store_id = $store_id;
  356. $md_staff->md_id = $md->id;
  357. $md_staff->saas_user_id = $saas_user_id;
  358. $md_staff->name = $name;
  359. $md_staff->mobile = $mobile;
  360. if (!$md_staff->save()) {
  361. return $this->asJson([
  362. 'code' => 1,
  363. 'msg' => $md_staff->errors[0]
  364. ]);
  365. }
  366. return $this->asJson([
  367. 'code' => 0,
  368. 'msg' => '保存成功'
  369. ]);
  370. }
  371. public function actionStaffList() {
  372. $keyword = get_params('keyword', '');
  373. $page = get_params('page', 1);
  374. $limit = get_params('limit', 20);
  375. $store_id = get_store_id();
  376. $saas_user_id = get_saas_user_id();
  377. $md = Md::find()->where(['store_id' => $store_id, 'is_delete' => 0, 'shop_audit' => 1])->andWhere(['or', ['user_id' => $saas_user_id], ['manager' => $saas_user_id]])->one();
  378. if (!$md) {
  379. return $this->asJson([
  380. 'code' => 1,
  381. 'msg' => '未拥有该门店的查看员工权限'
  382. ]);
  383. }
  384. $query = MdStaff::find()->where(['is_delete' => 0, 'store_id' => $store_id, 'md_id' => $md->id]);
  385. if (!empty($keyword)) {
  386. $query->andWhere([
  387. 'or',
  388. ['like', 'name', $keyword],
  389. ['like', 'mobile', $keyword]
  390. ]);
  391. }
  392. $count = $query->count();
  393. $pagination = new Pagination(['totalCount' => $count, 'pageSize' => $limit, 'page' => $page - 1]);
  394. $list = $query->select('id, name, mobile, md_id')->limit($pagination->limit)
  395. ->offset($pagination->offset)->orderBy('created_at desc')->asArray()->all();
  396. foreach ($list as &$value) {
  397. $value['avatar'] = SaasUser::findOne($value['saas_user_id'])->avatar;
  398. $value['clerk_count'] = MdProfit::find()->where(['store_id' => $store_id, 'clerk_id' => $value['id'], 'md_id' => $value['md_id'], 'is_clerk' => 1, 'is_send' => 1])->count();
  399. }
  400. return $this->asJson([
  401. 'code' => 0,
  402. 'msg' => 'success',
  403. 'data' => [
  404. 'list' => $list,
  405. 'page_count' => $pagination->pageCount,
  406. 'row_count' => $count
  407. ]
  408. ]);
  409. }
  410. public function actionUserList() {
  411. $store_id = get_store_id();
  412. $saas_user_id = get_saas_user_id();
  413. $page = get_params('page', 1);
  414. $limit = get_params('limit', 20);
  415. $keyword = get_params('keyword', '');
  416. $md = Md::find()->where(['store_id' => $store_id, 'is_delete' => 0, 'shop_audit' => 1])->andWhere(['or', ['user_id' => $saas_user_id], ['manager' => $saas_user_id]])->one();
  417. if (!$md) {
  418. return $this->asJson([
  419. 'code' => 1,
  420. 'msg' => '未拥有该门店的查看用户权限'
  421. ]);
  422. }
  423. $user_id_arr = Order::find()->where(['md_id' => $md->id, 'is_pay' => 1])->select('user_id')->distinct()->asArray()->all();
  424. $arr = [];
  425. foreach ($user_id_arr as $value) {
  426. $query = SaasUser::find()->where(['mobile' => User::findOne($value['user_id'])->binding]);
  427. if ($keyword) {
  428. $query->andWhere(['like', 'name', $keyword]);
  429. $saas_user = $query->one();
  430. } else {
  431. $saas_user = $query->one();
  432. }
  433. if ($saas_user) {
  434. $tmp = [
  435. 'create_time' => date('Y-m-d', $saas_user->created_at),
  436. 'name' => $saas_user->name,
  437. 'avatar' => $saas_user->avatar,
  438. 'order_count' => Order::find()->where(['md_id' => $md->id, 'is_pay' => 1, 'user_id' => $value['user_id']])->count(),
  439. 'order_price' => Order::find()->where(['md_id' => $md->id, 'is_pay' => 1, 'user_id' => $value['user_id']])->sum('pay_price')
  440. ];
  441. $arr[] = $tmp;
  442. }
  443. }
  444. if (empty($arr)) {
  445. return $this->asJson([
  446. 'code' => 0,
  447. 'msg' => 'success',
  448. 'data' => [
  449. 'row_count' => 0,
  450. 'page_count' => 0,
  451. 'list' => $arr,
  452. ],
  453. ]);
  454. }
  455. $data = array_slice($arr, ($page - 1) * $limit, $limit);
  456. return $this->asJson([
  457. 'code' => 0,
  458. 'msg' => 'success',
  459. 'data' => [
  460. 'row_count' => count($arr),
  461. 'page_count' => ceil(count($arr) / $limit),
  462. 'list' => $data,
  463. ]
  464. ]);
  465. }
  466. public function actionStaffClerkDetail() {
  467. $id = get_params('id', 0);
  468. $page = get_params('page', 1);
  469. $limit = get_params('limit', 20);
  470. $store_id = get_store_id();
  471. $saas_user_id = get_saas_user_id();
  472. $md = Md::find()->where(['store_id' => $store_id, 'is_delete' => 0, 'shop_audit' => 1])->andWhere(['or', ['user_id' => $saas_user_id], ['manager' => $saas_user_id]])->one();
  473. if (!$md) {
  474. return $this->asJson([
  475. 'code' => 1,
  476. 'msg' => '未拥有该门店的查看员工核销详情权限'
  477. ]);
  478. }
  479. $md_staff = MdStaff::findOne($id);
  480. if (!$md_staff) {
  481. return $this->asJson([
  482. 'code' => 1,
  483. 'msg' => '未找到该员工相关信息'
  484. ]);
  485. }
  486. $query = MdProfit::find()->where(['store_id' => $store_id, 'clerk_id' => $md_staff->id, 'md_id' => $md->id, 'is_send' => 1]);
  487. $count = $query->count();
  488. $pagination = new Pagination(['totalCount' => $count, 'pageSize' => $limit, 'page' => $page - 1]);
  489. $list = $query->select('updated_at as clerk_time, order_id')->limit($pagination->limit)
  490. ->offset($pagination->offset)->orderBy('created_at desc')->asArray()->all();
  491. foreach ($list as &$value) {
  492. $value['clerk_time'] = date('Y-m-d H:i:s', $value['clerk_time']);
  493. $order = Order::findOne($value['order_id']);
  494. $value['order_no'] = $order->order_no;
  495. $value['pay_price'] = $order->pay_price;
  496. $value['goods_list'] = OrderDetail::find()->where(['order_id' => $value['order_id']])->select('goods_name, num, attr, pic, total_price')->asArray()->all();
  497. }
  498. return $this->asJson([
  499. 'code' => 0,
  500. 'msg' => 'success',
  501. 'data' => [
  502. 'list' => $list,
  503. 'page_count' => $pagination->pageCount,
  504. 'row_count' => $count
  505. ]
  506. ]);
  507. }
  508. public function actionOfflineOrder() {
  509. $page = get_params('page', 1);
  510. $keyword = get_params('keyword', '');
  511. $limit = get_params('limit', 20);
  512. // status -1 全部 0待发货 2待自提 3已完成 4待售后
  513. $status = get_params('status', -1);
  514. $order_user_id = get_params('saas_user_id');
  515. $orderSaasUser = SaasUser::findOne($order_user_id);
  516. $store_id = get_store_id();
  517. $mdStaff = MdStaff::findOne([
  518. 'saas_user_id'=> get_saas_user_id(),
  519. 'store_id' => $store_id,
  520. 'is_delete' => 0,
  521. 'is_disable' => 0
  522. ]);
  523. $md_id = $mdStaff ? $mdStaff->md_id : 0;
  524. $user_id = User::findOne(['store_id' => $store_id,'binding' => $orderSaasUser->mobile])->id;
  525. $query = Order::find()->alias('o')->where([
  526. 'o.store_id' => $store_id,
  527. 'o.is_pay' => 1,
  528. 'o.is_recycle' => 0,
  529. 'o.is_offline' => 1
  530. ])->andWhere(['!=', 'o.pay_type', 2]);
  531. if ($user_id) {
  532. $query->andWhere(['o.user_id' => $user_id]);
  533. }
  534. if ($md_id > 0) {
  535. $query->andWhere(['o.md_id' => $md_id]);
  536. }
  537. // 之前判断是佣金是否发放
  538. if ($status > -1) {
  539. if (intval($status) === 4) {
  540. $query->leftJoin(['or' => OrderRefund::tableName()], 'or.order_id = o.id')
  541. ->andWhere(['OR', ['or.status' => 0], ['or.is_agree' => 0]]);
  542. } else {
  543. // $query->andWhere(['mp.is_send' => $status]);
  544. $query->andWhere(['o.trade_status' => $status]);
  545. }
  546. }
  547. if (!empty($keyword)) {
  548. $query->andWhere([
  549. 'or',
  550. ['like', 'o.order_no', $keyword],
  551. ['like', 'o.name', $keyword],
  552. ]);
  553. }
  554. $count = $query->count();
  555. $pagination = new Pagination(['totalCount' => $count, 'pageSize' => $limit, 'page' => $page - 1]);
  556. $list = $query->select('o.order_no, o.id, o.name, o.mobile, o.pay_price, o.order_type, o.created_at,o.remark,o.words,o.trade_status,o.md_id,o.mch_id')->limit($pagination->limit)
  557. ->offset($pagination->offset)->orderBy('o.created_at desc')->asArray()->all();
  558. foreach ($list as &$value) {
  559. $value['goods_list'] = OrderDetail::find()->where(['order_id' => $value['id']])->select('goods_name, num, attr, pic, total_price')->asArray()->all();
  560. $value['created_at'] = date('Y-m-d H:i:s', $value['created_at']);
  561. $value['trade_status_text'] = Order::getStatusText($value['trade_status']);
  562. $value['checked'] = 0;
  563. $value['disabled'] = $value['trade_status'] == 2 || $value['trade_status'] == 0 ? 0 : 1;
  564. $orderRefund = OrderRefund::findOne(['order_id' => $value['id'], 'user_delete' => 0, 'is_delete' => 0]);
  565. $value['refund'] = null;
  566. if ($orderRefund) {
  567. $value['refund'] = [
  568. 'is_agree' => intval($orderRefund->is_agree),//0=待处理,1=已同意,2=已拒绝
  569. 'status' => intval($orderRefund->status),//0=待商家处理,1=同意并已退款,2=已同意换货,3=已拒绝退换货
  570. 'is_user_send' => intval($orderRefund->is_user_send),//用户是否发货
  571. 'refund_type' => intval($orderRefund->type),//1退款退货 2换货
  572. 'is_user_cancel' => intval($orderRefund->is_user_cancel), //用户是否取消售后申请 0/1
  573. 'id' => $orderRefund->id
  574. ];
  575. }
  576. // 显示门店名称 或者 入住商名称
  577. if($value['md_id'] > 0){
  578. $value['shop_name'] = Md::findOne(['id' => $value['md_id']])->name;
  579. }elseif($value['mch_id']){
  580. $value['shop_name'] = Mch::findOne(['id' => $value['mch_id']])->name;
  581. }
  582. }
  583. return $this->asJson([
  584. 'code' => 0,
  585. 'msg' => 'success',
  586. 'data' => [
  587. 'no_clerk_count' => 0,// 前端已经没有用到这个值了
  588. 'list' => $list,
  589. 'page_count' => $pagination->pageCount,
  590. 'row_count' => $count
  591. ]
  592. ]);
  593. }
  594. public function actionOrderDetail() {
  595. $order = Order::findOne([
  596. 'id' => get_params('order_id'),
  597. 'is_delete' => 0,
  598. ]);
  599. if (!$order) {
  600. return $this->asJson([
  601. 'code' => 1,
  602. 'msg' => '订单不存在',
  603. ]);
  604. }
  605. $goods_list = OrderDetail::find()->alias('od')
  606. ->where(['od.order_id' => $order->id, 'od.is_delete' => 0])->asArray()->all();
  607. $num = 0;
  608. foreach ($goods_list as $i => $item) {
  609. $goods = Json::decode($item['goods_info']);
  610. $newItem = [];
  611. $newItem['goods_id'] = $item['goods_id'];
  612. $newItem['order_detail_id'] = $item['id'];
  613. $newItem['name'] = $item['goods_name'] ?: $goods['name'];
  614. $newItem['total_price'] = $item['total_price'];
  615. $newItem['num'] = $item['num'];
  616. $newItem['attr'] = json_decode($item['attr']);
  617. $num += intval($item['num']);
  618. $newItem['goods_pic'] = $item['pic'] ?: $goods['cover_pic'];
  619. //取消信息
  620. $cancel_info = [];
  621. $cancel_info['num'] = OrderGoodsCancel::find()->where([
  622. 'order_id' => $order->id,
  623. 'order_detail_id' => $item['id'],
  624. 'status' => [
  625. OrderGoodsCancel::STATUS_PASS,
  626. OrderGoodsCancel::STATUS_PAY,
  627. OrderGoodsCancel::STATUS_PAY_FAIL,
  628. ]
  629. ])->sum('num') ?: 0;
  630. $cancel_info['cancel_list'] = OrderGoodsCancel::find()->where([
  631. 'order_id' => $order->id,
  632. 'order_detail_id' => $item['id'],
  633. 'status' => [
  634. OrderGoodsCancel::STATUS_PASS,
  635. OrderGoodsCancel::STATUS_PAY,
  636. OrderGoodsCancel::STATUS_PAY_FAIL,
  637. ]
  638. ])->orderBy('id desc')
  639. ->select('status, num, refund_price, created_at, updated_at')
  640. ->asArray()
  641. ->all();
  642. foreach ($cancel_info['cancel_list'] as &$cancel_item) {
  643. $cancel_item['status_text'] = OrderGoodsCancel::$status_text[$cancel_item['status']];
  644. $cancel_item['status'] = intval($cancel_item['status']);
  645. if ($cancel_item['status'] === OrderGoodsCancel::STATUS_PAY) {
  646. $cancel_item['status'] = 1;
  647. }
  648. if ($cancel_item['status'] === OrderGoodsCancel::STATUS_PAY_FAIL) {
  649. $cancel_item['status'] = 0;
  650. }
  651. if ($cancel_item['status'] === OrderGoodsCancel::STATUS_CANCEL) {
  652. $cancel_item['status'] = 2;
  653. }
  654. $cancel_item['created_at'] = date('Y-m-d H:i:s', $cancel_item['created_at']);
  655. if (in_array($cancel_item['status'], [OrderGoodsCancel::STATUS_PASS, OrderGoodsCancel::STATUS_REFUSE])) {
  656. $cancel_item['created_at'] = date('Y-m-d H:i:s', $cancel_item['updated_at']);
  657. }
  658. }
  659. $newItem['cancel_info'] = $cancel_info;
  660. $newItem['cancel_num'] = OrderGoodsCancel::find()->where([
  661. 'order_detail_id' => $item['id'],
  662. 'status' => [
  663. OrderGoodsCancel::STATUS_PAY,
  664. OrderGoodsCancel::STATUS_PASS,
  665. OrderGoodsCancel::STATUS_PAY_FAIL
  666. ]
  667. ])->sum('num') ?: 0;
  668. $newItem['cancel_text'] = '';
  669. if ($newItem['cancel_num'] > 0) {
  670. $newItem['cancel_text'] = '已退款' .$newItem['cancel_num'] .'件';
  671. if ($newItem['cancel_num'] >= $item['num']) {
  672. $newItem['cancel_text'] = '已退款';
  673. }
  674. }
  675. $newList[] = $newItem;
  676. }
  677. $md_id = $order->md_id;
  678. $order_type = (int)$order->order_type;
  679. if ($md_id > 0) {
  680. $md = Md::findOne($md_id);
  681. }
  682. $diy_shop_name = Option::get(OptionSetting::DIY_SHOP_NAME, $order->store_id, 'pay', Option::get(OptionSetting::DIY_SHOP_NAME, $order->store_id, 'store', '自提配送')['value'] ?: '自提配送')['value'];
  683. $diy_express_name = Option::get(OptionSetting::DIY_EXPRESS_NAME, $order->store_id, 'pay', Option::get(OptionSetting::DIY_EXPRESS_NAME, $order->store_id, 'store', '快递配送')['value'] ?: '快递配送')['value'];
  684. $store = Store::findOne($order->store_id);
  685. return $this->asJson([
  686. 'code' => 0,
  687. 'msg' => 'success',
  688. 'data' => [
  689. 'order_id' => $order->id,
  690. 'is_pay' => $order->is_pay,
  691. 'name' => $order->name,
  692. 'mobile' => $order->mobile,
  693. 'address' => $order->address,
  694. 'order_no' => $order->order_no,
  695. 'addtime' => date('Y-m-d H:i', $order->created_at),
  696. 'total_price' => doubleval(sprintf('%.2f', $order->total_price)),
  697. 'goods_total_price' => doubleval(sprintf('%.2f', doubleval($order->total_price) - doubleval($order->express_price))),
  698. 'pay_price' => $order->pay_price,
  699. 'num' => $num,
  700. 'goods_list' => $newList,
  701. 'is_offline' => $order->is_offline,
  702. 'diy_express_name' => intval($order->is_offline) === 1 ? $diy_shop_name : $diy_express_name,
  703. 'pay_type' => $order->pay_type,
  704. 'apply_delete' => $order->apply_delete,
  705. 'trade_status' => $order->trade_status,
  706. 'is_send' => MdProfit::findOne(['order_id' => $order->id])->is_send,
  707. 'order_type' => (int)$order->order_type,
  708. 'mch_name' => $store->name ?: '平台自营',
  709. 'md_name' => !empty($md) ? $md->name : '',
  710. 'md_mobile' => !empty($md) ? $md->mobile : '',
  711. 'md_address' => !empty($md) ? $md->address : '',
  712. ],
  713. ]);
  714. }
  715. public function actionSendOrder() {
  716. $order_id = post_params('order_id', []);
  717. $order_id = Json::decode($order_id);
  718. $express = post_params('express', '');
  719. $expressNo = post_params('express_no', '');
  720. if (empty($order_id) || !is_array($order_id)) {
  721. return $this->asJson([
  722. 'code' => 1,
  723. 'msg' => '参数错误'
  724. ]);
  725. }
  726. $t = \Yii::$app->db->beginTransaction();
  727. foreach ($order_id as $value) {
  728. $order = Order::findOne($value);
  729. if ($order->is_pay == 0) {
  730. $t->rollBack();
  731. return $this->asJson([
  732. 'code' => 1,
  733. 'msg' => '存在异常订单'
  734. ]);
  735. }
  736. if ((int)$order->trade_status !== 0) {
  737. return $this->asJson([
  738. 'code' => 1,
  739. 'msg' => '订单状态异常'
  740. ]);
  741. }
  742. $order->send_time = time();
  743. $order->trade_status = 2;
  744. $order->express = $express;
  745. $order->express_no = $expressNo;
  746. if (!$order->save()) {
  747. $t->rollBack();
  748. return $this->asJson([
  749. 'code' => 1,
  750. 'msg' => implode(';', array_values($order->firstErrors))
  751. ]);
  752. }
  753. }
  754. $t->commit();
  755. return $this->asJson([
  756. 'code' => 0,
  757. 'msg' => '处理完成'
  758. ]);
  759. }
  760. public function actionClerkOrder() {
  761. $order_id = post_params('order_id', []);
  762. $order_id = Json::decode($order_id);
  763. if (empty($order_id) || !is_array($order_id)) {
  764. return $this->asJson([
  765. 'code' => 1,
  766. 'msg' => '参数错误'
  767. ]);
  768. }
  769. $saas_user_id = get_saas_user_id();
  770. $md_staff = MdStaff::findOne(['saas_user_id' => $saas_user_id, 'is_delete' => 0, 'store_id' => get_store_id()]);
  771. $user = get_user_id();
  772. $mch_staff = MchStaff::findOne(['user_id' => $user, 'is_delete' => 0, 'store_id' => get_store_id()]);
  773. // if (!$md_staff) {
  774. // return $this->asJson([
  775. // 'code' => 1,
  776. // 'msg' => '当前无可操作权限'
  777. // ]);
  778. // }
  779. // if ($md_staff->is_disable) {
  780. // return $this->asJson([
  781. // 'code' => 1,
  782. // 'msg' => '核销权限已被禁用'
  783. // ]);
  784. // }
  785. foreach ($order_id as $value) {
  786. $t = \Yii::$app->db->beginTransaction();
  787. $order = Order::findOne($value);
  788. //如果订单已经取消
  789. if ($order->apply_delete == Order::ORDER_APPLY_DELETE || $order->trade_status == Order::ORDER_FLOW_CANCEL) {
  790. $t->rollBack();
  791. return $this->asJson([
  792. 'code' => 1,
  793. 'msg' => '订单已取消或申请取消中,不可核销'
  794. ]);
  795. }
  796. if ($order->is_pay == 0) {
  797. $t->rollBack();
  798. return $this->asJson([
  799. 'code' => 1,
  800. 'msg' => '存在异常订单'
  801. ]);
  802. }
  803. if($order->md_id > 0 && $md_staff->md_id != $order->md_id){
  804. $t->rollBack();
  805. return $this->asJson([
  806. 'code' => 1,
  807. 'msg' => '暂无核销权限'
  808. ]);
  809. }
  810. if($order->mch_id > 0 && $mch_staff->mch_id != $order->mch_id){
  811. $t->rollBack();
  812. return $this->asJson([
  813. 'code' => 1,
  814. 'msg' => '暂无核销权限'
  815. ]);
  816. }
  817. if($order->md_id > 0){
  818. $mp_profit = MdProfit::findOne(['order_id' => $value]);
  819. if ($md_staff->md_id != $mp_profit->md_id) {
  820. $t->rollBack();
  821. return $this->asJson([
  822. 'code' => 1,
  823. 'msg' => '操作异常'
  824. ]);
  825. }
  826. if ($mp_profit->is_clerk == 1 && $mp_profit->is_send == 0) {
  827. $mp_profit->is_send = 1;
  828. $mp_profit->clerk_id = $md_staff->id;
  829. $mp_profit->updated_at = time();
  830. if (!$mp_profit->save()) {
  831. $t->rollBack();
  832. return $this->asJson([
  833. 'code' => 1,
  834. 'msg' => $mp_profit->errors[0]
  835. ]);
  836. }
  837. $md = Md::findOne($mp_profit->md_id);
  838. $md->total_profit += $mp_profit->total_profit;
  839. $md->cash_profit += $mp_profit->total_profit;
  840. $md->clerk_profit += $mp_profit->clerk_profit;
  841. if (!$md->save()) {
  842. $t->rollBack();
  843. return $this->asJson([
  844. 'code' => 1,
  845. 'msg' => $md->errors[0]
  846. ]);
  847. }
  848. $order->clerk_id = get_user_id();
  849. $order->trade_status = 3;
  850. $order->confirm_time = time();
  851. if (!$order->save()) {
  852. $t->rollBack();
  853. return $this->asJson([
  854. 'code' => 1,
  855. 'msg' => $order->errors
  856. ]);
  857. }
  858. }
  859. }
  860. if($order->mch_id > 0){
  861. $order->clerk_id = get_user_id();
  862. $order->trade_status = Order::ORDER_FLOW_CONFIRM;
  863. $order->confirm_time = time();
  864. if ($order->pay_type == 2) {
  865. $order->is_pay = 1;
  866. $order->pay_time = time();
  867. }
  868. $order->save();
  869. }
  870. $t->commit();
  871. }
  872. return $this->asJson([
  873. 'code' => 0,
  874. 'msg' => '处理成功'
  875. ]);
  876. }
  877. /**
  878. * 获取佣金相关
  879. */
  880. public function actionGetPrice()
  881. {
  882. $saas_user_id = get_saas_user_id();
  883. $store_id = get_store_id();
  884. $md = Md::find()->where(['store_id' => $store_id, 'is_delete' => 0, 'shop_audit' => 1])->andWhere(['or', ['user_id' => $saas_user_id], ['manager' => $saas_user_id]])->one();
  885. if (!$md) {
  886. return $this->asJson([
  887. 'code' => 1,
  888. 'msg' => '未拥有该门店的权限'
  889. ]);
  890. }
  891. $res = [
  892. 'cash_profit' => $md->cash_profit
  893. ];
  894. // 新提现方式
  895. $model = MdSetting::find()->where(['store_id' => $this->store_id])->one();
  896. $wxappUrl = \Yii::$app->request->hostInfo . \Yii::$app->request->baseUrl . '/statics/wxapp/images';
  897. $payTypeList = [
  898. [
  899. 'icon' => $wxappUrl . '/icon-share-wechat.png',
  900. 'name' => '微信',
  901. 'is_show' => $model['pay_wechat'] ? true : false,
  902. 'type' => 'wechat'
  903. ],
  904. [
  905. 'icon' => $wxappUrl . '/icon-share-ant.png',
  906. 'name' => '支付宝',
  907. 'is_show' => $model['pay_alipay'] ? true : false,
  908. 'type' => 'alipay'
  909. ],
  910. [
  911. 'icon' => $wxappUrl . '/icon-share-bank.png',
  912. 'name' => '银行卡',
  913. 'is_show' => $model['pay_bank'] ? true : false,
  914. 'type' => 'bank_card'
  915. ],
  916. [
  917. 'icon' => $wxappUrl . '/gold.png',
  918. 'name' => '余额',
  919. 'is_show' => $model['pay_remaining'] ? true : false,
  920. 'type' => 'money'
  921. ],
  922. [
  923. 'icon' => $wxappUrl . '/icon-share-bank.png',
  924. 'name' => '灵工',
  925. 'is_show' => $model['pay_lg'] ? true : false,
  926. 'type' => 'lg'
  927. ],
  928. ];
  929. $res['pay_type_list'] = $payTypeList;
  930. $res['cash_method_list'] = [];
  931. $saas_user = get_saas_user();
  932. $cash_method = [];
  933. $lg = Lg::find()->where(['store_id' => $this->store_id,'user_id'=>$saas_user->id,'status'=>1,'is_delete'=>0])->one();
  934. if (!empty($saas_user->withdraw_method)) {
  935. $cash_method = json_decode($saas_user->withdraw_method, true);
  936. if ($lg){
  937. //灵工
  938. $cash_method = array_merge($cash_method, [[
  939. 'type' => 'lg'
  940. ]]);
  941. }
  942. if (is_array($cash_method)) {
  943. $res['cash_method_list'] = $cash_method;
  944. }
  945. }else{
  946. if($lg){
  947. //灵工
  948. $cash_method[]['type'] = 'lg';
  949. $res['cash_method_list'] = array_values($cash_method);
  950. }
  951. }
  952. $money = [
  953. [
  954. 'type' => 'money'
  955. ]
  956. ];
  957. $cash_method = array_merge($cash_method, $money);
  958. if (is_array($cash_method)) {
  959. foreach ($cash_method as $index => &$item) {
  960. if ($item['type'] === 'wechat' && $payTypeList[0]['is_show'] === false) {
  961. unset($cash_method[$index]);
  962. }
  963. if ($item['type'] === 'alipay' && $payTypeList[1]['is_show'] === false) {
  964. unset($cash_method[$index]);
  965. }
  966. if ($item['type'] === 'bank_card' && $payTypeList[2]['is_show'] === false) {
  967. unset($cash_method[$index]);
  968. }
  969. if ($item['type'] === 'money' && $payTypeList[3]['is_show'] === false) {
  970. unset($cash_method[$index]);
  971. }
  972. if ($item['type'] === 'lg' && $payTypeList[4]['is_show'] === false) {
  973. unset($cash_method[$index]);
  974. }
  975. }
  976. $res['cash_method_list'] = array_values($cash_method);;
  977. }
  978. $res['cash_service_charge'] = $model['cash_service_charge'] ?? 0;
  979. $res['min_money'] = $model['min_money'] ?? 0;
  980. return $this->asJson(['code' => 0, 'msg' => 'success', 'data' => $res]);
  981. }
  982. /**
  983. * 获取提现方式
  984. */
  985. public function actionGetCashMethod()
  986. {
  987. $mdSetting = MdSetting::findOne(['store_id' => $this->store_id]);
  988. $saas_user = get_saas_user();
  989. $cash_method = [];
  990. $payTypeList = [
  991. [
  992. 'name' => '微信',
  993. 'is_show' => (bool)$mdSetting['pay_wechat'],
  994. 'type' => 'wechat',
  995. 'is_bind' => false
  996. ],
  997. [
  998. 'name' => '支付宝',
  999. 'is_show' => (bool)$mdSetting['pay_alipay'],
  1000. 'type' => 'alipay',
  1001. 'is_bind' => false
  1002. ],
  1003. [
  1004. 'name' => '银行卡',
  1005. 'is_show' => (bool)$mdSetting['pay_bank'],
  1006. 'type' => 'bank_card',
  1007. 'is_bind' => false
  1008. ],
  1009. [
  1010. 'name' => '灵工',
  1011. 'is_show' => (bool)$mdSetting['pay_lg'],
  1012. 'type' => 'lg',
  1013. 'is_bind' => false
  1014. ],
  1015. ];
  1016. $lg = Lg::find()->where(['store_id' => $this->store_id,'user_id'=>$saas_user->id,'status'=>1,'is_delete'=>0])->one();
  1017. if (!empty($saas_user->withdraw_method)) {
  1018. $decode = json_decode($saas_user->withdraw_method, true);
  1019. if ($lg){
  1020. //灵工
  1021. $decode = array_merge($decode, [[
  1022. 'type' => 'lg'
  1023. ]]);
  1024. }
  1025. if (is_array($decode)) {
  1026. $cash_method = $decode;
  1027. foreach ($payTypeList as &$pay_item) {
  1028. foreach ($cash_method as $item) {
  1029. if ($item['type'] === $pay_item['type']) {
  1030. $pay_item['is_bind'] = true;
  1031. $pay_item = array_merge($pay_item, $item);
  1032. }
  1033. }
  1034. }
  1035. }
  1036. }else{
  1037. if($lg){
  1038. //灵工
  1039. $cash_method[]['type'] = 'lg';
  1040. $res['cash_method_list'] = array_values($cash_method);
  1041. }
  1042. }
  1043. return $this->asJson([
  1044. 'code' => 0,
  1045. 'msg' => 'success',
  1046. 'data' => [
  1047. 'list' => $payTypeList,
  1048. ],
  1049. ]);
  1050. }
  1051. /**
  1052. * 获取提现方式
  1053. */
  1054. public function actionDelCashMethod()
  1055. {
  1056. $saas_user = get_saas_user();
  1057. $type = post_params('type');
  1058. if (empty($type)) {
  1059. return $this->asJson([
  1060. 'code' => 1,
  1061. 'msg' => '参数错误',
  1062. ]);
  1063. }
  1064. if ($type == 'lg'){
  1065. $lg = Lg::find()->where(['user_id'=>$saas_user->id,'is_delete'=>0])->one();
  1066. if ($lg){
  1067. $lg->is_delete = 1;
  1068. $lg->save();
  1069. return $this->asJson([
  1070. 'code' => 0,
  1071. 'msg' => '操作成功',
  1072. ]);
  1073. }
  1074. }
  1075. if (empty($saas_user->withdraw_method)) {
  1076. return $this->asJson([
  1077. 'code' => 0,
  1078. 'msg' => '操作成功',
  1079. ]);
  1080. }
  1081. $cash_method = json_decode($saas_user->withdraw_method, true);
  1082. if (is_array($cash_method)) {
  1083. foreach ($cash_method as $key => $value) {
  1084. if ($value['type'] == $type) {
  1085. unset($cash_method[$key]);
  1086. }
  1087. }
  1088. $saas_user->withdraw_method = json_encode(array_values($cash_method));
  1089. } else {
  1090. $saas_user->withdraw_method = '';
  1091. }
  1092. if ($saas_user->save()) {
  1093. return $this->asJson([
  1094. 'code' => 0,
  1095. 'msg' => '操作成功',
  1096. ]);
  1097. }
  1098. return $this->asJson([
  1099. 'code' => 0,
  1100. 'msg' => '操作失败',
  1101. ]);
  1102. }
  1103. /**
  1104. * 添加提现方式
  1105. */
  1106. public function actionAddCashMethod()
  1107. {
  1108. $type = post_params('type');
  1109. if (empty($type)) {
  1110. return $this->asJson([
  1111. 'code' => 1,
  1112. 'msg' => '参数错误',
  1113. ]);
  1114. }
  1115. $name = post_params('name');
  1116. $account = post_params('account');
  1117. $bank = post_params('bank');
  1118. if (empty($name) || empty($account)) {
  1119. return $this->asJson([
  1120. 'code' => 1,
  1121. 'msg' => '账号和姓名不能为空',
  1122. ]);
  1123. }
  1124. if ($type == 'bank_card' && empty($bank)) {
  1125. return $this->asJson([
  1126. 'code' => 1,
  1127. 'msg' => '银行不能为空',
  1128. ]);
  1129. }
  1130. $data = [
  1131. 'type' => $type,
  1132. 'name' => $name,
  1133. 'account' => $account,
  1134. ];
  1135. if ($type == 'bank_card') {
  1136. $data['bank'] = $bank;
  1137. }
  1138. $saas_user = get_saas_user();
  1139. if (empty($saas_user->withdraw_method)) {
  1140. $saas_user->withdraw_method = json_encode(array_values([$data]));
  1141. } else {
  1142. $decode = json_decode($saas_user->withdraw_method, true);
  1143. if (!$decode) {
  1144. $saas_user->withdraw_method = json_encode(array_values([$data]));
  1145. } else {
  1146. foreach ($decode as $key => $value) {
  1147. if ($value['type'] == $type) {
  1148. unset($decode[$key]);
  1149. break;
  1150. }
  1151. }
  1152. $decode[] = $data;
  1153. $saas_user->withdraw_method = json_encode(array_values($decode));
  1154. }
  1155. }
  1156. if ($saas_user->save()) {
  1157. return $this->asJson([
  1158. 'code' => 0,
  1159. 'msg' => '操作成功',
  1160. ]);
  1161. }
  1162. return $this->asJson([
  1163. 'code' => 1,
  1164. 'msg' => '操作失败',
  1165. ]);
  1166. }
  1167. public function actionCashApply() {
  1168. $price = post_params('cash');
  1169. $type = post_params('type');
  1170. if (!$price || !in_array($type, ['alipay', 'bank_card', 'wechat','money','lg'])) {
  1171. return $this->asJson([
  1172. 'code' => 1,
  1173. 'msg' => '参数非法',
  1174. ]);
  1175. }
  1176. $saas_user_id = get_saas_user_id();
  1177. $user_id = get_user_id();
  1178. $store_id = get_store_id();
  1179. $md = Md::find()->where(['store_id' => $store_id, 'is_delete' => 0, 'shop_audit' => 1])->andWhere(['or', ['user_id' => $saas_user_id], ['manager' => $saas_user_id]])->one();
  1180. if (!$md) {
  1181. return $this->asJson([
  1182. 'code' => 1,
  1183. 'msg' => '未拥有该门店的权限'
  1184. ]);
  1185. }
  1186. if ($price > $md->cash_profit) {
  1187. return $this->asJson([
  1188. 'code' => 1,
  1189. 'msg' => '当前大于可提现金额'
  1190. ]);
  1191. }
  1192. $exit = Cash::find()->andWhere(['=', 'status', 0])->andWhere(['user_id' => $user_id,
  1193. 'store_id' => $store_id, 'cash_type' => 2])->exists();
  1194. if ($exit) {
  1195. // return $this->asJson([
  1196. // 'code' => 1,
  1197. // 'msg' => '尚有未完成的提现申请'
  1198. // ]);
  1199. }
  1200. $setting = MdSetting::findOne(['store_id'=>get_store_id()]);
  1201. // 每日提现金额限制
  1202. if ($setting['cash_max_day']) {
  1203. $cash_sum = Cash::find()->where([
  1204. 'store_id' => $this->store_id,
  1205. 'is_delete' => 0,
  1206. 'status' => [0, 1, 2, 5],
  1207. ])->andWhere([
  1208. 'AND',
  1209. ['>=', 'created_at', strtotime(date('Y-m-d 00:00:00'))],
  1210. ['<=', 'created_at', strtotime(date('Y-m-d 23:59:59'))],
  1211. ])->sum('price');
  1212. $cash_max_day = $setting['cash_max_day'] - ($cash_sum ? $cash_sum : 0);
  1213. if ($setting['cash_max_day'] > 0 && $price > $cash_max_day) {
  1214. return $this->asJson([
  1215. 'code' => 1,
  1216. 'msg' => '提现金额不能超过' . $cash_max_day . '元'
  1217. ]);
  1218. }
  1219. }
  1220. // 单人每日提现
  1221. if ($setting['cash_max_single_day']) {
  1222. $cash_sum = Cash::find()->where([
  1223. 'store_id' => get_store_id(),
  1224. 'is_delete' => 0,
  1225. 'status' => [0, 1, 2, 5],
  1226. 'user_id' => $user_id
  1227. ])->andWhere([
  1228. 'AND',
  1229. ['>=', 'created_at', strtotime(date('Y-m-d 00:00:00'))],
  1230. ['<=', 'created_at', strtotime(date('Y-m-d 23:59:59'))],
  1231. ])->sum('price');
  1232. $cash_max_single_day_ = $setting['cash_max_single_day'] - ($cash_sum ?: 0);
  1233. if ($setting['cash_max_single_day'] > 0 && $price > $cash_max_single_day_) {
  1234. return $this->asJson([
  1235. 'code' => 1,
  1236. 'msg' => '每人每天提现金额不能超过'. $cash_max_single_day_ .'元'
  1237. ]);
  1238. }
  1239. }
  1240. $user = User::findOne(['id' => $user_id, 'store_id' => get_store_id()]);
  1241. if (!$user) {
  1242. return $this->asJson([
  1243. 'code' => 1,
  1244. 'msg' => '网络异常'
  1245. ]);
  1246. }
  1247. if ($price < $setting['min_money']) {
  1248. return $this->asJson([
  1249. 'code' => 1,
  1250. 'msg' => '提现金额不能小于' . $setting['min_money'] . '元'
  1251. ]);
  1252. }
  1253. $t = \Yii::$app->db->beginTransaction();
  1254. $cash = new Cash();
  1255. $cash->order_no = OrderNo::getOrderNo(OrderNo::ORDER_CASH);
  1256. $cash->is_delete = 0;
  1257. $cash->status = 0;
  1258. $cash->md_id = $md->id;
  1259. $cash->price = $price;
  1260. $cash->created_at = time();
  1261. $cash->user_id = $user_id;
  1262. $cash->store_id = $store_id;
  1263. if ($type == 'money') {
  1264. $cash->type = 3;
  1265. // 2024-12-17 直接完成打款
  1266. // $cash->status = Cash::STATUS_RECHARGE;// 余额通过
  1267. } else {
  1268. $saas_user = get_saas_user();
  1269. $withdraw_method = Json::decode($saas_user->withdraw_method);
  1270. $withdraw_method = array_column($withdraw_method, null, 'type');
  1271. if ($type == 'wechat') {
  1272. $cash->type = 0;
  1273. $cash->name = $withdraw_method['wechat']['name'];
  1274. $cash->mobile = $withdraw_method['wechat']['account'];
  1275. }
  1276. if ($type == 'alipay') {
  1277. $cash->type = 1;
  1278. $cash->name = $withdraw_method['alipay']['name'];
  1279. $cash->mobile = $withdraw_method['alipay']['account'];
  1280. }
  1281. if ($type == 'bank_card') {
  1282. $cash->type = 2;
  1283. $cash->name = $withdraw_method['bank_card']['name'];
  1284. $cash->mobile = $withdraw_method['bank_card']['account'];
  1285. $cash->bank_name = $withdraw_method['bank_card']['bank'];
  1286. }
  1287. if ($type == 'lg') {
  1288. //灵工提现
  1289. $lg_info = Lg::find()->where(['user_id'=>$saas_user->id,'is_delete'=>0])->one();
  1290. $cash->type = 4;
  1291. $cash->name = $lg_info->name;
  1292. $cash->mobile = $lg_info->mobile;
  1293. }
  1294. }
  1295. $cash->pay_time = 0;
  1296. $cash->service_charge = $setting['cash_service_charge'];
  1297. $cash->cash_type = 2;
  1298. if ($cash->save()) {
  1299. $md->cash_profit -= $cash->price;
  1300. if (!$md->save()) {
  1301. $t->rollBack();
  1302. return $this->asJson([
  1303. 'code' => 1,
  1304. 'msg' => $md->errors[0]
  1305. ]);
  1306. }
  1307. $t->commit();
  1308. return $this->asJson([
  1309. 'code' => 0,
  1310. 'msg' => '申请成功'
  1311. ]);
  1312. } else {
  1313. $t->rollBack();
  1314. return $this->asJson([
  1315. 'code' => 1,
  1316. 'msg' => $cash->errors
  1317. ]);
  1318. }
  1319. }
  1320. public function actionOrderList() {
  1321. $page = get_params('page', 1);
  1322. $keyword = get_params('keyword', '');
  1323. $limit = get_params('limit', 20);
  1324. $time = get_params('time', '');
  1325. // 前端在写的时候 把-1当作了全部 所以整个status的值-1
  1326. $status = (int)get_params('status', -1) - 1;
  1327. $saas_user_id = get_saas_user_id();
  1328. $store_id = get_store_id();
  1329. $md = Md::find()->where(['store_id' => $store_id, 'is_delete' => 0, 'shop_audit' => 1])->andWhere(['or', ['user_id' => $saas_user_id], ['manager' => $saas_user_id]])->one();
  1330. if (!$md) {
  1331. return $this->asJson([
  1332. 'code' => 1,
  1333. 'msg' => '未拥有该门店查看订单权限'
  1334. ]);
  1335. }
  1336. $query = Order::find()->alias('o')->where([
  1337. 'o.is_delete' => 0,
  1338. 'o.store_id' => $store_id,
  1339. 'o.user_delete' => 0,
  1340. 'o.md_id' => $md->id,
  1341. 'o.is_recycle' => 0
  1342. ]);
  1343. if ($time) {
  1344. $timestamp = strtotime($time);
  1345. $start_time = strtotime(date('Y-m-01 00:00:00', $timestamp));
  1346. $end_time = $start_time + 30 * 24 * 3600;
  1347. $query->andWhere(['and', ['>=', 'o.created_at', $start_time], ['<=', 'o.created_at', $end_time]]);
  1348. }
  1349. if ($keyword) {
  1350. $query->andWhere(['like', 'o.order_no', $keyword]);
  1351. }
  1352. if(intval($status) == 4){ //待售后
  1353. $query->leftJoin(['or' => OrderRefund::tableName()], 'o.id = or.order_id')
  1354. ->andWhere(['AND', ['IS NOT', 'or.id', NULL], ['or.is_user_cancel' => 0]]);
  1355. } else {
  1356. if ($status != -2) {
  1357. $query->andWhere(['o.trade_status'=>$status]);
  1358. }
  1359. }
  1360. $count = $query->count();
  1361. $pagination = new Pagination(['totalCount' => $count, 'page' => $page - 1, 'pageSize' => $limit]);
  1362. /* @var Order[] $list */
  1363. $list = $query->limit($pagination->limit)->offset($pagination->offset)->orderBy('created_at DESC')->all();
  1364. $new_list = [];
  1365. foreach ($list as $order) {
  1366. $order_detail_list = OrderDetail::findAll(['order_id' => $order->id, 'is_delete' => 0]);
  1367. $goods_list = [];
  1368. foreach ($order_detail_list as $order_detail) {
  1369. $goods = json_decode($order_detail->goods_info, true);
  1370. if (!$goods) {
  1371. continue;
  1372. }
  1373. $goods_pic = $order_detail->pic ?? $goods['cover_pic'];
  1374. $goods_list[] = (object)[
  1375. 'goods_id' => $goods['id'] ?? $order_detail->goods_id,
  1376. 'goods_pic' => $goods_pic,
  1377. 'goods_name' => $order_detail->goods_name,
  1378. 'num' => $order_detail->num,
  1379. 'price' => $order_detail->total_price,
  1380. 'attr_list' => json_decode($order_detail->attr),
  1381. ];
  1382. }
  1383. $orderRefund = OrderRefund::findOne(['order_id' => $order->id, 'user_delete' => 0, 'is_delete' => 0]);
  1384. $deliveryInfo = null;
  1385. if ($order->is_delivery == 1) {
  1386. $deliveryInfo = DeliveryInfo::find()->where(['order_no' => $order->order_no])->one();
  1387. }
  1388. $is_order_refund = $order_refund_enable = 0;
  1389. if ($orderRefund) {
  1390. $is_order_refund = 1;
  1391. } else {
  1392. $is_order_refund = 0;
  1393. }
  1394. if ($order->is_pay == 1 && ($order->trade_status == Order::ORDER_FLOW_SEND || $order->trade_status == Order::ORDER_FLOW_CONFIRM)) {
  1395. $order_refund_enable = 1;
  1396. } else {
  1397. $order_refund_enable = 0;
  1398. }
  1399. if ($order->trade_status == Order::ORDER_FLOW_CONFIRM) {
  1400. $after_sale_time = Option::get(OptionSetting::STORE_AFTER_SALE_TIME, $store_id);
  1401. if ((time() - $order->confirm_time) > $after_sale_time['value'] * 86400) {//超过可售后时间
  1402. $order_refund_enable = 0;
  1403. }
  1404. }
  1405. $is_send = 0;
  1406. $md_profit = MdProfit::findOne(['order_id' => $order->id]);
  1407. if ($md_profit->is_clerk) {
  1408. $is_send = $md_profit->is_send;
  1409. }
  1410. $trade_status_text = Order::getStatusText($order->trade_status);
  1411. $refund = null;
  1412. if ($orderRefund) {
  1413. $refund = [
  1414. 'is_agree' => intval($orderRefund->is_agree),//0=待处理,1=已同意,2=已拒绝
  1415. 'status' => intval($orderRefund->status),//0=待商家处理,1=同意并已退款,2=已同意换货,3=已拒绝退换货
  1416. 'is_user_send' => intval($orderRefund->is_user_send),//用户是否发货
  1417. 'refund_type' => intval($orderRefund->type),//1退款退货 2换货
  1418. 'is_user_cancel' => intval($orderRefund->is_user_cancel), //用户是否取消售后申请 0/1
  1419. 'id' => $orderRefund->id
  1420. ];
  1421. if ($order->trade_status === Order::ORDER_FLOW_CONFIRM) {
  1422. $trade_status_text = "已完成(有售后)";
  1423. }
  1424. }
  1425. $new_list[] = (object)[
  1426. 'is_send' => $is_send,
  1427. 'is_order_refund' => $is_order_refund,
  1428. 'order_refund_enable' => $order_refund_enable,
  1429. 'order_id' => $order->id,
  1430. 'order_no' => $order->order_no,
  1431. 'add_time' => $order->created_at,
  1432. 'created_at' => date('Y-m-d H:i:s',$order->created_at),
  1433. 'goods_list' => $goods_list,
  1434. 'total_price' => $order->total_price,
  1435. 'pay_price' => $deliveryInfo ? sprintf("%1.2f", $order->pay_price + $deliveryInfo->fee) : $order->pay_price,
  1436. 'is_pay' => $order->is_pay,
  1437. 'is_comment' => $order->is_comment,
  1438. 'is_offline' => $order->is_offline,
  1439. 'offline_qrcode' => $order->offline_qrcode,
  1440. 'express' => $order->express,
  1441. 'type' => $order->type,
  1442. 'pay_type' => $order->pay_type,
  1443. 'refund' => $refund,
  1444. 'apply_delete' => $order->apply_delete,
  1445. 'trade_status' => $order->trade_status,
  1446. 'delivery_fee' => $deliveryInfo ? $deliveryInfo->fee : 0,
  1447. 'is_delivery' => $order->is_delivery,
  1448. 'trade_status_text' => $trade_status_text,
  1449. 'remark' => $order->remark,// 买家留言
  1450. 'words' => $order->words,// 商家备注
  1451. 'address_name' => $order->name,// 自提信息
  1452. 'address_mobile' => $order->mobile,// 自提手机号
  1453. 'address' => $order->address,// 收货地址
  1454. ];
  1455. }
  1456. $refund_address = RefundAddress::find()->where(['store_id' => $store_id, 'is_delete' => 0])
  1457. ->select('id, name, address, mobile')->asArray()->all();
  1458. return $this->asJson([
  1459. 'code' => 0,
  1460. 'msg' => 'success',
  1461. 'data' => [
  1462. 'row_count' => $count,
  1463. 'page_count' => $pagination->pageCount,
  1464. 'list' => $new_list,
  1465. 'refund_address' => $refund_address
  1466. ],
  1467. ]);
  1468. }
  1469. public function actionProfitDetail() {
  1470. $page = get_params('page', 1);
  1471. $limit = get_params('limit', 20);
  1472. $status = get_params('status', 0);
  1473. $date_time = strtotime(get_params('queryDate', 0));
  1474. $year = date('Y', $date_time);
  1475. $mouth = date('m', $date_time);
  1476. $mouth_end = date('t', $date_time);
  1477. $start_date = strtotime($year. '-' . $mouth . '-' . '01');
  1478. $end_date = strtotime($year. '-' . $mouth . '-' . $mouth_end) + (60 * 60 * 24);
  1479. $store_id = get_store_id();
  1480. $saas_user_id = get_saas_user_id();
  1481. $md = Md::find()->where(['store_id' => $store_id, 'is_delete' => 0, 'shop_audit' => 1])->andWhere(['or', ['user_id' => $saas_user_id], ['manager' => $saas_user_id]])->one();
  1482. if (!$md) {
  1483. return $this->asJson([
  1484. 'code' => 1,
  1485. 'msg' => '未拥有该门店的查看员工核销详情权限'
  1486. ]);
  1487. }
  1488. $query = MdProfit::find()->alias('mp')->leftJoin(['o' => Order::tableName()], 'mp.order_id = o.id')
  1489. ->where(['mp.store_id' => $store_id, 'mp.md_id' => $md->id])->andWhere(['NOT IN', 'o.trade_status', [-1, 1]]);
  1490. if (!empty($date_time)) {
  1491. $query->andWhere(['and', ['>=', 'mp.created_at', $start_date], ['<=', 'mp.created_at', $end_date]]);
  1492. }
  1493. if ($status != 0 && in_array($status, [1, 2])) {
  1494. $query->andWhere(['mp.is_send' => $status == 2 ? 1 : 0]);
  1495. }
  1496. $count = $query->count();
  1497. $total_price = $query->sum('mp.total_profit');
  1498. $pagination = new Pagination(['totalCount' => $count, 'pageSize' => $limit, 'page' => $page - 1]);
  1499. $list = $query->select('mp.*')->limit($pagination->limit)
  1500. ->offset($pagination->offset)->orderBy('created_at desc')->asArray()->all();
  1501. foreach ($list as &$value) {
  1502. $value['created_at'] = date('Y-m-d H:i:s', $value['created_at']);
  1503. $value['updated_at'] = date('Y-m-d H:i:s', $value['updated_at']);
  1504. $order = Order::findOne($value['order_id']);
  1505. $value['order_no'] = $order->order_no;
  1506. }
  1507. return $this->asJson([
  1508. 'code' => 0,
  1509. 'msg' => 'success',
  1510. 'data' => [
  1511. 'list' => $list,
  1512. 'page_count' => $pagination->pageCount,
  1513. 'row_count' => $count,
  1514. 'total_price' => $total_price
  1515. ]
  1516. ]);
  1517. }
  1518. public function actionCashDetail() {
  1519. $page = get_params('page', 1);
  1520. $limit = get_params('limit', 20);
  1521. $status = get_params('status', -1);
  1522. $store_id = get_store_id();
  1523. $saas_user_id = get_saas_user_id();
  1524. $md = Md::find()->where(['store_id' => $store_id, 'is_delete' => 0, 'shop_audit' => 1])->andWhere(['or', ['user_id' => $saas_user_id], ['manager' => $saas_user_id]])->one();
  1525. if (!$md) {
  1526. return $this->asJson([
  1527. 'code' => 1,
  1528. 'msg' => '未拥有该门店的查看员工核销详情权限'
  1529. ]);
  1530. }
  1531. $query = Cash::find()->where(['store_id' => $store_id, 'md_id' => $md->id]);
  1532. if ($status != -1) {
  1533. $query->andWhere(['status' => $status]);
  1534. }
  1535. $count = $query->count();
  1536. $pagination = new Pagination(['totalCount' => $count, 'pageSize' => $limit, 'page' => $page - 1]);
  1537. $list = $query->select('*')->limit($pagination->limit)
  1538. ->offset($pagination->offset)->orderBy('created_at desc')->asArray()->all();
  1539. foreach ($list as &$value) {
  1540. $value['created_at'] = date('Y-m-d H:i:s', $value['created_at']);
  1541. }
  1542. return $this->asJson([
  1543. 'code' => 0,
  1544. 'msg' => 'success',
  1545. 'data' => [
  1546. 'list' => $list,
  1547. 'page_count' => $pagination->pageCount,
  1548. 'row_count' => $count
  1549. ]
  1550. ]);
  1551. }
  1552. public function actionGetQrcode() {
  1553. $saas_user_id = get_saas_user_id();
  1554. $scene = "{$saas_user_id}";
  1555. if (is_wechat_platform()) {
  1556. $res = ShareQrcode::wxQrcode('md_admin/md-center/self-mention', $scene);
  1557. if (isset($res['code']) && $res['code'] == 1) {
  1558. return $this->asJson([
  1559. 'code' => 1,
  1560. 'msg' => $res['response']['errmsg'],
  1561. ]);
  1562. }
  1563. } elseif (is_alipay_platform()) {
  1564. $res = ShareQrcode::getAlipayQrcode('md_admin/md-center/self-mention', $scene);
  1565. if (empty($res['code']) || $res['code'] != 10000) {
  1566. return $this->asJson($res);
  1567. }
  1568. $res['url_path'] = $res['qr_code_url_circle_blue'];
  1569. } else {
  1570. $file_name = md5('md_admin/md-center/self-mention' . $scene.get_store_id());
  1571. // 保存小程序码到文件
  1572. $dir = \Yii::$app->runtimePath . '/image/wx_qrcode';
  1573. if (! is_dir($dir)) {
  1574. mkdir($dir, 0777, true);
  1575. }
  1576. $url = str_replace('http://', 'https://', \Yii::$app->request->hostInfo . '/runtime/image/wx_qrcode/' . $file_name);
  1577. QrCode::image(\Yii::$app->request->hostInfo . '/h5/#/md_admin/md-center/self-mention', 600, false, 'L', 'JPEG', 0, ['255,255,255', '0,0,0'], 1, false, $dir. '/' .$file_name . '.jpg');
  1578. $res = [
  1579. 'code' => 0,
  1580. 'root_path' => $dir . '/' . $file_name . '.jpg',
  1581. 'url_path' => $url . '.jpg',
  1582. ];
  1583. }
  1584. $level = User::findOne(get_user_id())->level;
  1585. $level_name = Level::findOne(['level' => $level])->name;
  1586. $id = sprintf("%011d", get_user_id());
  1587. $generator = new BarcodeGeneratorJPG();
  1588. $barcode = $generator->getBarcode($id, $generator::TYPE_CODE_128, 2, 30);
  1589. $filename = md5('user_clerk_' . $id);
  1590. $code_path = \Yii::$app->runtimePath . '/image/' . $filename . '.jpg';
  1591. $pic_url = str_replace('http://', 'https://', \Yii::$app->request->hostInfo . '/runtime/image/' . $filename . '.jpg');
  1592. file_put_contents($code_path, $barcode);
  1593. // $barcode = base64_encode($barcode);
  1594. return $this->asJson([
  1595. 'code' => 0,
  1596. 'data' => [
  1597. 'qr_url' => $res['url_path'],
  1598. 'name' => get_saas_user()->name,
  1599. 'avatar' => get_saas_user()->avatar,
  1600. 'level_name' => $level_name ?: '普通用户',
  1601. 'code_path' => $pic_url
  1602. ]
  1603. ]);
  1604. }
  1605. /**
  1606. * 获取门店推广海报
  1607. * @return \yii\web\Response
  1608. * @author: hankaige
  1609. * @Time: 2024/3/20 15:02
  1610. */
  1611. public function actionGetShareQrcode()
  1612. {
  1613. $form = new ShareQrcodeForm();
  1614. $form->store_id = get_store_id();
  1615. $form->type = 11;
  1616. $form->user = get_user();
  1617. $form->user_id = get_user_id();
  1618. $form->md_id = get_params('md_id');
  1619. return $this->asJson($form->search());
  1620. }
  1621. // 删除已完成订单 也就是加入回收站
  1622. public function actionRecycleOrder()
  1623. {
  1624. $orderIds = post_params('order_ids',[]);
  1625. $res = Order::updateAll(['is_recycle' => 1],['id' => $orderIds,'trade_status'=>3,'store_id'=>get_store_id()]);
  1626. if($res > 0){
  1627. return $this->asJson(['code' => 0,'msg'=>'操作成功']);
  1628. }
  1629. return $this->asJson(['code' => 1,'msg'=>'订单不存在']);
  1630. }
  1631. /**
  1632. * 到货通知
  1633. * @return \yii\web\Response
  1634. * @author: hankaige
  1635. * @Time: 2024/4/8 13:49
  1636. */
  1637. public function actionNotice(){
  1638. $orderIds = post_params('order_ids',[]);
  1639. if(count($orderIds) <= 0){
  1640. return $this->asJson(['code'=>1,'msg'=>'请选择要通知订单']);
  1641. }
  1642. foreach($orderIds as $orderId){
  1643. $order = Order::find()->with(['orderDetail'])->where(['id'=>$orderId])->asArray()->one();
  1644. if(empty($order)){
  1645. continue;
  1646. }
  1647. $goodsName = '';
  1648. foreach($order['orderDetail'] as $goods){
  1649. $goodsName .= $goods['name'] . ',';
  1650. }
  1651. $md = Md::findOne($order['md_id']);
  1652. NoticeSend::ShopArrive($order['user_id'],$order['mobile'],$order['order_no'],$goodsName,$md->name);
  1653. }
  1654. return $this->asJson(['code'=>0,'msg' => '已通知客户']);
  1655. }
  1656. // 获取独立店铺的商品列表
  1657. public function actionGetGoods(){
  1658. $form = new MdGodsForm();
  1659. $form->store_id = get_store_id();
  1660. $form->md_id = get_params('md_id');
  1661. $form->keyword = get_params('keyword','');
  1662. $form->status = get_params('status',-1);
  1663. return $this->asJson($form->getGoodsList());
  1664. }
  1665. public function actionUpdateStatus(){
  1666. $form = new MdGodsForm();
  1667. $form->store_id = get_store_id();
  1668. $form->md_id = get_params('md_id');
  1669. $form->status = get_params('status');
  1670. $form->ids = get_params('ids');
  1671. return $this->asJson($form->batchUpdateStatus());
  1672. }
  1673. public function actionGetGoodsAttr(){
  1674. $form = new MdGodsForm();
  1675. $form->store_id = get_store_id();
  1676. $form->md_id = get_params('md_id');
  1677. $form->id = get_params('id');
  1678. return $this->asJson($form->getGoodsAttr());
  1679. }
  1680. public function actionSetGoodsInfo(){
  1681. $form = new MdGodsForm();
  1682. $form->store_id = get_store_id();
  1683. $form->md_id = post_params('md_id');
  1684. $form->id = post_params('id');
  1685. $form->goods_price = post_params('goods_price', 0);
  1686. $form->goods_num = post_params('goods_num', 0);
  1687. $form->attr = post_params('attr', 0);
  1688. $res = $form->setPrice();
  1689. return $this->asJson($res);
  1690. }
  1691. /**
  1692. * 设置订单备注
  1693. * @return \yii\web\Response
  1694. * @author: hankaige
  1695. * @Time: 2024/4/10 16:33
  1696. */
  1697. public function actionSetOrderWords(){
  1698. $orderId = post_params('order_id');
  1699. if(empty($orderId)){
  1700. return $this->asJson(['code'=>1,'msg'=>'订单ID不能为空']);
  1701. }
  1702. $order = Order::findOne($orderId);
  1703. if(empty($order)){
  1704. return $this->asJson(['code'=>1,'msg'=>'订单不存在']);
  1705. }
  1706. $words = post_params('words');
  1707. if(empty($words)){
  1708. return $this->asJson(['code'=>1,'msg'=>'备注不能为空']);
  1709. }
  1710. $order->words = $words;
  1711. $res = $order->save();
  1712. if($res){
  1713. return $this->asJson(['code'=>0,'msg'=>'保存成功']);
  1714. }
  1715. return $this->asJson(['code'=>1,'msg'=>'保存失败']);
  1716. }
  1717. public function actionOrderCancel()
  1718. {
  1719. $form = new MdOrder();
  1720. $form->order_id = get_params('order_id');
  1721. $form->store_id = get_store_id();
  1722. $form->md_id = get_params('md_id');
  1723. return $this->asJson($form->handleCancel());
  1724. }
  1725. /**
  1726. * 平台商品订单取消
  1727. */
  1728. public function actionApplyOrderDelete()
  1729. {
  1730. $saas_user_id = get_saas_user_id();
  1731. $form = new MdOrder();
  1732. $form->attributes = post_params();
  1733. $form->order_id = post_params('order_id');
  1734. $form->store_id = get_store_id();
  1735. $md = Md::find()->where(['store_id' => get_store_id(), 'is_delete' => 0, 'shop_audit' => 1])
  1736. ->andWhere(['or', ['user_id' => $saas_user_id], ['manager' => $saas_user_id]])->one();
  1737. if (!$md) {
  1738. return $this->asJson([
  1739. 'code' => 1,
  1740. 'msg' => '未拥有该门店操作订单权限'
  1741. ]);
  1742. }
  1743. $form->md_id = $md->id;
  1744. return $this->asJson($form->applyOrderDelete());
  1745. }
  1746. /**
  1747. * 平台商品订单取消
  1748. */
  1749. public function actionHandleRefund()
  1750. {
  1751. $saas_user_id = get_saas_user_id();
  1752. $form = new MdOrder();
  1753. $form->attributes = post_params();
  1754. $form->order_id = post_params('order_id');
  1755. $form->store_id = get_store_id();
  1756. $md = Md::find()->where(['store_id' => get_store_id(), 'is_delete' => 0, 'shop_audit' => 1])
  1757. ->andWhere(['or', ['user_id' => $saas_user_id], ['manager' => $saas_user_id]])->one();
  1758. if (!$md) {
  1759. return $this->asJson([
  1760. 'code' => 1,
  1761. 'msg' => '未拥有该门店操作订单权限'
  1762. ]);
  1763. }
  1764. $form->md_id = $md->id;
  1765. return $this->asJson($form->handleRefund());
  1766. }
  1767. }