MShop.Class.php 58 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908909910911912913914915916917918919920921922923924925926927928929930931932933934935936937938939940941942943944945946947948949950951952953954955956957958959960961962963964965966967968969970971972973974975976977978979980981982983984985986987988989990991992993994995996997998999100010011002100310041005100610071008100910101011101210131014101510161017101810191020102110221023102410251026102710281029103010311032103310341035103610371038103910401041104210431044104510461047104810491050105110521053105410551056105710581059106010611062106310641065106610671068106910701071107210731074107510761077107810791080108110821083108410851086108710881089109010911092109310941095109610971098109911001101110211031104110511061107110811091110111111121113111411151116111711181119112011211122112311241125112611271128112911301131113211331134113511361137113811391140114111421143114411451146114711481149115011511152115311541155115611571158115911601161116211631164116511661167116811691170117111721173117411751176117711781179118011811182118311841185118611871188118911901191119211931194119511961197119811991200120112021203120412051206120712081209121012111212121312141215121612171218121912201221122212231224122512261227122812291230123112321233123412351236123712381239124012411242124312441245124612471248124912501251125212531254125512561257125812591260126112621263126412651266126712681269127012711272127312741275127612771278127912801281128212831284128512861287128812891290129112921293129412951296129712981299130013011302130313041305130613071308130913101311131213131314131513161317131813191320132113221323132413251326132713281329133013311332133313341335133613371338133913401341134213431344134513461347134813491350135113521353135413551356135713581359136013611362136313641365136613671368136913701371137213731374137513761377137813791380138113821383138413851386138713881389139013911392139313941395139613971398139914001401140214031404140514061407140814091410141114121413141414151416141714181419142014211422142314241425142614271428142914301431143214331434143514361437143814391440144114421443144414451446144714481449145014511452145314541455145614571458145914601461146214631464146514661467146814691470147114721473147414751476147714781479148014811482148314841485148614871488148914901491149214931494149514961497149814991500150115021503150415051506150715081509151015111512151315141515151615171518151915201521152215231524152515261527152815291530153115321533153415351536153715381539154015411542154315441545154615471548154915501551155215531554155515561557155815591560156115621563156415651566156715681569157015711572157315741575157615771578157915801581158215831584158515861587158815891590
  1. <?php
  2. /**
  3. * 商铺管理模块
  4. * Created by PhpStorm.
  5. * User: wxj
  6. * Date: 2019/10/31
  7. * Time: 15:02
  8. */
  9. namespace JinDouYun\Model\Shop;
  10. use Exception;
  11. use JinDouYun\Controller\Common\Logger;
  12. use JinDouYun\Dao\Department\DStaff;
  13. use JinDouYun\Dao\GoodsManage\DGoodsBasic;
  14. use JinDouYun\Dao\UserCenter\DUserCenter;
  15. use JinDouYun\Model\Common\Location;
  16. use JinDouYun\Model\Customer\MMemberBalanceDetail;
  17. use JinDouYun\Model\System\MBasicSetup;
  18. use Mall\Framework\Core\ErrorCode;
  19. use Mall\Framework\Core\StatusCode;
  20. use Mall\Framework\Core\ResultWrapper;
  21. use JinDouYun\Dao\Shop\DShop;
  22. use JinDouYun\Dao\Shop\DEnterpriseBindShop;
  23. use Jindouyun\Cache\EnterpriseCache;
  24. use JinDouYun\Cache\RoleAclCache;
  25. use JinDouYun\Cache\ShopCache;
  26. use JinDouYun\Cache\SysAreaChinaCache;
  27. use JinDouYun\Cache\GoodsBasicRelevant;
  28. use JinDouYun\Model\ShopPartner\MShopPartner;
  29. use JinDouYun\Model\Stock\MWarehouse;
  30. use JinDouYun\Model\SysAreaChina\MSysAreaChina;
  31. use JinDouYun\Model\Customer\MCustomer;
  32. use JinDouYun\Model\Enterprise\MEnterprise;
  33. use JinDouYun\Model\Department\MStaff;
  34. use JinDouYun\Model\MBaseModel;
  35. use Monolog\Handler\IFTTTHandler;
  36. class MShop extends MBaseModel
  37. {
  38. private $objDShop;
  39. private $objDEnterpriseBindShop;
  40. private $objSysAreaChinaCache;
  41. private $cutTable = 250000;
  42. private $enterpriseId;
  43. private $userCenterId;
  44. private $objMShopPartner;
  45. private $objRoleAclCache;
  46. private $objShopCache;
  47. private $objMEnterprise;
  48. private $objMStaff;
  49. private $objMMemberBalanceDetail;
  50. public function __construct($enterpriseId, $userCenterId = '')
  51. {
  52. $this->enterpriseId = $enterpriseId;
  53. $this->userCenterId = $userCenterId;
  54. parent::__construct($this->enterpriseId, $this->userCenterId);
  55. $this->objMShopPartner = new MShopPartner($this->enterpriseId, $this->userCenterId);
  56. $this->objDShop = new DShop('default');
  57. $this->objDEnterpriseBindShop = new DEnterpriseBindShop('default');
  58. $this->objSysAreaChinaCache = new SysAreaChinaCache();
  59. $this->objRoleAclCache = new RoleAclCache();
  60. $this->objShopCache = new ShopCache();
  61. $this->objMEnterprise = new MEnterprise();
  62. $this->objMStaff = new MStaff($enterpriseId,$userCenterId);
  63. $this->objMMemberBalanceDetail = new MMemberBalanceDetail($enterpriseId,$userCenterId);
  64. $tableName = $this->objDShop->getTableName('qianniao_shop', $this->enterpriseId, $this->cutTable);
  65. $this->objDShop->setTable($tableName);
  66. $this->objDShop->setSearchIndex('shop_search')->setType('shop');
  67. }
  68. /**
  69. * Doc: (des="添加店铺")
  70. * User: XMing
  71. * Date: 2020/7/15
  72. * Time: 10:42 上午
  73. * @throws Exception
  74. * @param array $params
  75. * @return ResultWrapper
  76. */
  77. public function addShop(array $params)
  78. {
  79. $params['enterpriseId'] = $this->enterpriseId;
  80. $objMEnterprise = new MEnterprise();
  81. $modelResult = $objMEnterprise->createAppid($this->userCenterId);
  82. $params['token'] = $modelResult['token'];
  83. //获取仓库
  84. if(isset($params['warehouseId']) && !empty($params['warehouseId'])){
  85. if(is_array($params['warehouseId'])){
  86. $warehouseId = $params['warehouseId'];
  87. $params['warehouseId'] = implode(',',$params['warehouseId']);
  88. }else{
  89. $warehouseId = [$params['warehouseId']];
  90. }
  91. $objMWarehouse = new MWarehouse($this->enterpriseId);
  92. $modelResult = $objMWarehouse->selectWarehouse(['id' => $warehouseId, 'deleteStatus' => StatusCode::$standard]);
  93. if(!$modelResult->isSuccess()){
  94. return ResultWrapper::fail($modelResult->getData(), $modelResult->getErrorCode());
  95. }
  96. $warehouseResult = $modelResult->getData();
  97. unset($modelResult);
  98. if(empty($warehouseResult)){
  99. return ResultWrapper::fail('仓库查询失败', ErrorCode::$paramError);
  100. }
  101. $selectWarehouseId = array_column($warehouseResult, 'id');
  102. foreach($warehouseId as $value){
  103. if(!in_array($value,$selectWarehouseId)){
  104. return ResultWrapper::fail($value.'仓库查询失败', ErrorCode::$paramError);
  105. }
  106. }
  107. }
  108. $beginStatus = $this->objDShop->beginTransaction();
  109. $ShopId = $this->objDShop->insert($params);
  110. if ($ShopId === false) {
  111. $this->objDShop->rollBack();
  112. return ResultWrapper::fail($this->objDShop->error(), ErrorCode::$dberror);
  113. }
  114. //缓存token
  115. $this->objShopCache->setShopToken($this->enterpriseId, $ShopId, $params['token']);
  116. unset($params['token']);
  117. //缓存企业下的销售区域
  118. self::cacheSalesAreaInEnterprise();
  119. //增加企业商铺关联表
  120. $EnterpriseBindShopData = [
  121. 'enterpriseId' => $params['enterpriseId'],
  122. 'shopId' => $ShopId,
  123. 'updateTime' => time(),
  124. 'createTime' => time(),
  125. ];
  126. $dbResult = $this->objDEnterpriseBindShop->insert($EnterpriseBindShopData);
  127. if($dbResult === false){
  128. $this->objDShop->rollBack();
  129. return ResultWrapper::fail($this->objDEnterpriseBindShop->error(),ErrorCode::$dberror);
  130. }
  131. if($params['recommend_user_id']>0)
  132. {
  133. $objMBasicSetup = new MBasicSetup($this->enterpriseId);
  134. $memberBalanceDetailData = [
  135. 'customerId' => $params['customerId'],
  136. 'type' => 5,
  137. 'userCenterId' => $params['recommend_user_id'],
  138. 'money' => $objMBasicSetup->getBasicField('yhtjmd')->getData(),
  139. 'purpose' => '推荐门店获得',
  140. 'orderIds' =>'',
  141. 'remark' => '推荐门店获得'.$objMBasicSetup->getBasicField('yhtjmd')->getData(),
  142. 'financeType' => '推荐门店获得',
  143. 'accountId' => isset($params['accountId']) ? $params['accountId']: 0,
  144. 'accountName' => isset($params['accountName']) ? $params['accountName']: '',
  145. 'accountNumber' => isset($params['accountNumber']) ? $params['accountNumber']: '',
  146. 'explain' => isset($params['explain']) ? $params['explain']: '',
  147. ];
  148. $result = $this->objMMemberBalanceDetail->addMemberBalanceDetail($memberBalanceDetailData,$isbackstage=true);
  149. if($result) {
  150. $this->objDShop > update(['is_send' => 1], ['id' => $ShopId]);
  151. }
  152. }
  153. /*//自动创建仓库
  154. $wareHouseParam = [
  155. 'warehouseName' => $params['name'] . '仓库',
  156. 'shopId' => $ShopId,
  157. 'shopName' => $params['name'],
  158. 'contactMobile' => $params['mobile'],
  159. 'provinceCode' => $params['provinceCode'],
  160. 'cityCode' => $params['cityCode'],
  161. 'districtCode' => $params['districtCode'],
  162. 'contactAddress' => $params['address'],
  163. 'updateTime' => time(),
  164. 'deleteStatus' => StatusCode::$standard,
  165. 'enableStatus' => StatusCode::$standard,
  166. ];
  167. //添加仓库
  168. $objMWarehouse = new MWarehouse($this->enterpriseId);
  169. $warehouseResult = $objMWarehouse->addWarehouse($wareHouseParam);
  170. if(!$warehouseResult->isSuccess()){
  171. $this->objDShop->rollBack();
  172. return ResultWrapper::fail($warehouseResult->getData(),$warehouseResult->getErrorCode());
  173. }
  174. $warehouseId =(int) $warehouseResult->getData();
  175. $this->objDShop->update(['warehouseId' => $warehouseId], $ShopId);
  176. $objGoodsBasicRelevant = new GoodsBasicRelevant($this->enterpriseId);
  177. $cacheResult = $objGoodsBasicRelevant->cacheShopIdRelationName($ShopId,
  178. [
  179. 'name' => $params['name'],
  180. 'warehouseId' => $warehouseId,
  181. 'warehouseName' => $wareHouseParam['warehouseName'],
  182. 'costType' => $params['costType']
  183. ]);
  184. if (!$cacheResult->isSuccess()) {
  185. $this->objDShop->rollBack();
  186. return ResultWrapper::fail($cacheResult->getData(), $cacheResult->getErrorCode());
  187. }
  188. $this->objRoleAclCache->cacheShopIdAndWarehouseId($this->enterpriseId, $ShopId, $warehouseId);
  189. //修改商铺数据
  190. $update = [
  191. 'warehouseId' => $warehouseId,
  192. 'updateTime' => time(),
  193. ];
  194. $result = $this->objDShop->update($update, ['id' => $ShopId]);
  195. if($result === false){
  196. $this->objDShop->rollBack();
  197. return ResultWrapper::fail($this->objDShop->error(), ErrorCode::$dberror);
  198. }*/
  199. //更新ES
  200. $beginStatus && $this->objDShop->commit();
  201. // self::updateEsData($params, $ShopId, true);
  202. return ResultWrapper::success($ShopId);
  203. }
  204. private function createEsDocumentId($shopId)
  205. {
  206. return 'EnterpriseId_' . $this->enterpriseId . '_ShopId_' . $shopId;
  207. }
  208. public function getShopTable() {
  209. return $this->objDShop->get_Table();
  210. }
  211. public function updateEsData($params, $shopId, $insert = false)
  212. {
  213. $objMSysAreaChina = new MSysAreaChina();
  214. if (isset($params['provinceCode']) && isset($params['cityCode']) && isset($params['districtCode'])) {
  215. $areaName = $objMSysAreaChina->getNameByCode([
  216. $params['provinceCode'],
  217. $params['cityCode'],
  218. $params['districtCode']
  219. ]);
  220. $params['provinceName'] = isset($areaName[$params['provinceCode']]) ? $areaName[$params['provinceCode']] : '';
  221. $params['cityName'] = isset($areaName[$params['cityCode']]) ? $areaName[$params['cityCode']] : '';
  222. $params['districtName'] = isset($areaName[$params['districtCode']]) ? $areaName[$params['districtCode']] : '';
  223. }
  224. if (!empty($params['latitude']) && !empty($params['longitude'])) {
  225. $params['shoplocation'] = [
  226. 'lat' => $params['latitude'],
  227. 'lon' => $params['longitude']
  228. ];
  229. }
  230. unset($params['latitude']);
  231. unset($params['longitude']);
  232. unset($params['openTime']);
  233. if(isset($params['salesArea']) && !empty($params['salesArea'])){
  234. $params['salesArea'] = json_decode($params['salesArea'], true);
  235. $params['salesArea'] = implode(',', $params['salesArea']);
  236. }
  237. $params['id'] = $shopId;
  238. $params['enterpriseId'] = $this->enterpriseId;
  239. $_id = self::createEsDocumentId($shopId);
  240. $result = $this->objDShop->addUpSearchIndexDocument($params, $_id);
  241. //print_r($result);
  242. if (isset($result['_shards']) && isset($result['_shards']['successful']) && $result['_shards']['successful'] == 1) {
  243. //echo "es操作成功";die;
  244. }
  245. //echo "es操作失败";
  246. }
  247. /**
  248. * 获取指定商铺信息
  249. * @param $params
  250. * @return ResultWrapper
  251. * @throws Exception
  252. */
  253. public function getShopInfo($params)
  254. {
  255. $dbResult = $this->objDShop->get($params);
  256. if ($dbResult === false) {
  257. return ResultWrapper::fail($this->objDShop->error(), ErrorCode::$dberror);
  258. } else {
  259. $dbResult = $this->format([$dbResult]);
  260. $dbResult = array_shift($dbResult);
  261. return ResultWrapper::success($dbResult);
  262. }
  263. }
  264. /**
  265. * 编辑商铺
  266. * @param int|array $params 修改商铺的数据
  267. * @return ResultWrapper
  268. * @throws Exception
  269. */
  270. public function editShop($params)
  271. {
  272. if (empty($params['id'])) {
  273. return ResultWrapper::fail('没有指定要修改的商铺id', ErrorCode::$paramError);
  274. }
  275. $shopInfo = $this->objDShop->get(['id' => $params['id']], 'id,warehouseId');
  276. if ($shopInfo === false) {
  277. return ResultWrapper::fail($this->objDShop->error(), ErrorCode::$paramError);
  278. }
  279. $updateShopId = $params['id'];
  280. unset($params['id']);
  281. $shopPartnerId = isset($params['shopPartnerId']) ? $params['shopPartnerId'] : '';
  282. unset($params['shopPartnerId']);
  283. unset($params['partnerName']);
  284. //获取仓库
  285. if(isset($params['warehouseId']) && !empty($params['warehouseId'])){
  286. if(is_array($params['warehouseId'])){
  287. $warehouseId = $params['warehouseId'];
  288. $params['warehouseId'] = implode(',',$params['warehouseId']);
  289. }else{
  290. $warehouseId = [$params['warehouseId']];
  291. }
  292. $objMWarehouse = new MWarehouse($this->enterpriseId);
  293. $modelResult = $objMWarehouse->selectWarehouse(['id' => $warehouseId, 'deleteStatus' => StatusCode::$standard]);
  294. if(!$modelResult->isSuccess()){
  295. return ResultWrapper::fail($modelResult->getData(), $modelResult->getErrorCode());
  296. }
  297. $warehouseResult = $modelResult->getData();
  298. unset($modelResult);
  299. if(empty($warehouseResult)){
  300. return ResultWrapper::fail('仓库查询失败', ErrorCode::$paramError);
  301. }
  302. $selectWarehouseId = array_column($warehouseResult, 'id');
  303. foreach($warehouseId as $value){
  304. if(!in_array($value,$selectWarehouseId)){
  305. return ResultWrapper::fail($value.'仓库查询失败', ErrorCode::$paramError);
  306. }
  307. }
  308. }
  309. $dbResult = $this->objDShop->update($params, $updateShopId);
  310. if ($dbResult === false) {
  311. return ResultWrapper::fail($this->objDShop->error(), ErrorCode::$dberror);
  312. }
  313. if ($shopPartnerId) {
  314. self::changeManagerForShop(['id'=>$updateShopId,'shopPartnerId'=>$shopPartnerId]);
  315. }
  316. //查出企业的店铺下所有的销售区域,缓存到redis
  317. self::cacheSalesAreaInEnterprise();
  318. $objGoodsBasicRelevant = new GoodsBasicRelevant($this->enterpriseId);
  319. $objGoodsBasicRelevant->cacheShopIdRelationName($updateShopId,
  320. [
  321. 'name' => $params['name'],
  322. 'warehouseId' => isset($params['warehouseId']) ? $params['warehouseId'] :$shopInfo['warehouseId'],
  323. 'warehouseName' => isset($params['warehouseName']) ? $params['warehouseName'] : $params['name'] . '仓库',
  324. 'costType' => $params['costType']
  325. ]);
  326. //更新ES
  327. //self::updateEsData($params, $updateShopId);
  328. return ResultWrapper::success($dbResult);
  329. }
  330. /**
  331. * 更换负责人
  332. * @param int|array $params 修改商铺的数据
  333. *
  334. * @return ResultWrapper
  335. * @throws Exception
  336. */
  337. public function changeManagerForShop($params)
  338. {
  339. if (empty($params['id'])) {
  340. return ResultWrapper::fail('没有指定要修改的商铺id', ErrorCode::$paramError);
  341. }
  342. $shopPartnerId = isset($params['shopPartnerId']) ? $params['shopPartnerId'] : '';
  343. //修改原来负责人的商铺数据
  344. $shopPartnerInfo = $this->objMShopPartner->getShopPartnerInfo($shopPartnerId);
  345. if($shopPartnerInfo->isSuccess() == false) {
  346. return ResultWrapper::fail($shopPartnerInfo->getData(), $shopPartnerInfo->getErrorCode());
  347. }
  348. $shopPartnerInfo = $shopPartnerInfo->getData();
  349. $shopIds = explode(',', $shopPartnerInfo['shopId']);
  350. foreach($shopIds as $k => $shopId) {
  351. if($shopId == $params['id']) {
  352. unset($shopIds[$k]);
  353. }
  354. }
  355. $result = $this->objMShopPartner->updateShopIds(trim(implode(',',$shopIds),','),$shopPartnerId);
  356. if($result->isSuccess() == false) {
  357. return ResultWrapper::fail($result->getData(), $result->getErrorCode());
  358. }
  359. //更改商铺的合伙人
  360. $result = self::updateShopPartnerId(['id'=>$params['id'], 'shopPartnerId'=>$shopPartnerId]);
  361. if($result->isSuccess() == false) {
  362. return ResultWrapper::fail($result->getData(), $result->getErrorCode());
  363. }
  364. //更改合伙人的商铺
  365. //查出该合伙人管理的所有商铺
  366. $shopIds = $this->objMShopPartner->getShopIdsByPartnerId($shopPartnerId);
  367. $dbResult = $this->objMShopPartner->updateShopIds(trim(implode(',', array_filter(array_merge($shopIds, [$params['id']]))),","), $shopPartnerId);
  368. if ($dbResult === false) {
  369. return ResultWrapper::fail($this->objDShop->error(), ErrorCode::$dberror);
  370. } else {
  371. return ResultWrapper::success($dbResult);
  372. }
  373. }
  374. /**
  375. * 删除商铺
  376. * @param array $params
  377. * @return ResultWrapper
  378. */
  379. public function delShop($params)
  380. {
  381. if (empty($params)) {
  382. return ResultWrapper::fail('参数错误', ErrorCode::$paramError);
  383. }
  384. $dbResult = $this->objDShop->update(['deleteStatus' => StatusCode::$delete], $params);
  385. if ($dbResult === false) {
  386. return ResultWrapper::fail($this->objDShop->error(), ErrorCode::$dberror);
  387. } else {
  388. //在ES删除
  389. //$_id = self::createEsDocumentId($params['id']);
  390. //$this->objDShop->esdeleteTypeDocument($_id);
  391. return ResultWrapper::success($dbResult);
  392. }
  393. }
  394. /**
  395. * 商铺启用和禁用
  396. * @param array $params
  397. * @return ResultWrapper
  398. */
  399. public function updateShopStatus($params)
  400. {
  401. $dbResult = $this->objDShop->update(['enableStatus' => $params['enableStatus']], $params['id']);
  402. if ($dbResult === false) {
  403. return ResultWrapper::fail($this->objDShop->error(), ErrorCode::$dberror);
  404. } else {
  405. /*$_id = self::createEsDocumentId($params['id']);
  406. $result = $this->objDShop->esupdateTypeFieldVaule(['enableStatus' => $params['enableStatus']], $_id);*/
  407. return ResultWrapper::success($dbResult);
  408. }
  409. }
  410. public function updateShopPartnerId($params)
  411. {
  412. $dbResult = $this->objDShop->update(['shopPartnerId' => $params['shopPartnerId']], $params['id']);
  413. if ($dbResult === false) {
  414. return ResultWrapper::fail($this->objDShop->error(), ErrorCode::$dberror);
  415. } else {
  416. return ResultWrapper::success($dbResult);
  417. }
  418. }
  419. /*
  420. * 处理搜索条件
  421. */
  422. public function search($params)
  423. {
  424. $limit = $params['limit'];
  425. unset($params['limit']);
  426. $offset = $params['offset'];
  427. unset($params['offset']);
  428. $condition = 'deleteStatus = ' . StatusCode::$standard.' AND enterpriseId='.$this->enterpriseId;
  429. if ($params['name']) {
  430. $condition .= " AND name like '%" . $params['name'] . "%'";
  431. }
  432. if ($params['shopPartnerId']) {
  433. $condition .= " AND shopPartnerId = " . $params['shopPartnerId'];
  434. }
  435. if ($params['shopType']) {
  436. $condition .= " AND shopType = " . $params['shopType'];
  437. }
  438. if ($params['enableStatus']) {
  439. $condition .= " AND enableStatus = " . $params['enableStatus'];
  440. }
  441. $dbResult = $this->objDShop->select($condition, '*', 'createTime desc', $limit, $offset);
  442. if ($dbResult === false) {
  443. return ResultWrapper::fail($this->objDShop->error(), ErrorCode::$dberror);
  444. }
  445. $dbResult = self::format($dbResult);
  446. $return = [
  447. 'data' => $dbResult,
  448. 'total' => $this->getShopTotal($condition)
  449. ];
  450. return ResultWrapper::success($return);
  451. }
  452. /**
  453. * 获取所有商铺数据
  454. * @param array $selectParams 过滤条件
  455. * @param string $fields 查询的字段
  456. * @return ResultWrapper
  457. * @throws Exception
  458. */
  459. public function getAllShop($selectParams, $fields = '*')
  460. {
  461. $fields = ' * ';
  462. $countField = ' COUNT(id) as total ';
  463. $where = '';
  464. if (isset($selectParams['enableStatus']) && !empty($selectParams['enableStatus'])){
  465. $where .= ' AND enableStatus = '.$selectParams['enableStatus'];
  466. }
  467. if (isset($selectParams['action']) && $selectParams['action'] == 1){
  468. //基础资料详情页面用来过滤禁止销售店铺
  469. if (isset($selectParamsp['materielId']) && !empty($selectParams['materielId'])){
  470. $objDGoodsBasic = new DGoodsBasic();
  471. $objDGoodsBasic->setTable('qianniao_goods_basic_'.$this->enterpriseId);
  472. $row = $objDGoodsBasic->get($selectParams['materielId']);
  473. if ($row === false){
  474. return ResultWrapper::fail($objDGoodsBasic->error(),ErrorCode::$dberror);
  475. }
  476. $noSaleShopIds = '';
  477. if (isset($row['noSalesShop']) && !empty($row['noSalesShop'])){
  478. $noSaleShopIds = trim(explode($row['noSalesShop'],','),',');
  479. }
  480. if (!empty($noSaleShopIds)){
  481. $where .= ' AND id NOT IN('.$noSaleShopIds.')';
  482. }
  483. }
  484. }
  485. $sql = 'SELECT '.$fields.' FROM qianniao_shop_1 WHERE enterpriseId = '.$this->enterpriseId.' AND deleteStatus = '.StatusCode::$standard.' AND merchantId IS NULL '.$where;
  486. $countSql = 'SELECT '.$countField.' FROM qianniao_shop_1 WHERE enterpriseId = '.$this->enterpriseId.' AND deleteStatus = '.StatusCode::$standard.' AND merchantId IS NULL '.$where;
  487. if (isset($selectParams['limit']) && !empty($selectParams['limit'])){
  488. $sql .= ' LIMIT '.$selectParams['offset'].','.$selectParams['limit'];
  489. }
  490. $dbResult = $this->objDShop->query($sql);
  491. if ($dbResult === false) {
  492. return ResultWrapper::fail($this->objDShop->error(), ErrorCode::$dberror);
  493. }
  494. $dbResult = self::format($dbResult);
  495. $count = $this->objDShop->query($countSql);
  496. if ($count === false){
  497. return ResultWrapper::fail($this->objDShop->error(), ErrorCode::$dberror);
  498. }
  499. $return = [
  500. 'data' => $dbResult,
  501. 'total' => isset($count[0]['total']) ? $count[0]['total'] : 0,
  502. ];
  503. return ResultWrapper::success($return);
  504. }
  505. /**
  506. * 获取商品总数
  507. * @param $where mixed
  508. * @return int
  509. */
  510. public function getShopTotal($where)
  511. {
  512. $total = $this->objDShop->count($where);
  513. return ($total) ? intval($total) : 0;
  514. }
  515. /**
  516. * 处理开业时间 和省市区
  517. * @param $data
  518. * @return mixed
  519. */
  520. public function format($data)
  521. {
  522. $objMSysAreaChina = new MSysAreaChina();
  523. $managerIds = [];
  524. $warehouseIds = [];
  525. foreach ($data as $key => $shop) {
  526. $data[$key]['openTime'] = isset($shop['openTime']) ? (array)json_decode($shop['openTime'], true) : '';
  527. $data[$key]['shopCode'] = createCode(StatusCode::$code['shop']['prefix'], $shop['id'], StatusCode::$code['shop']['length']);
  528. if (isset($shop['provinceCode']) && isset($shop['cityCode']) && isset($shop['districtCode'])) {
  529. $areaName = $objMSysAreaChina->getNameByCode([
  530. $shop['provinceCode'],
  531. $shop['cityCode'],
  532. $shop['districtCode']
  533. ]);
  534. $data[$key]['area']['provinceName'] = isset($areaName[$shop['provinceCode']]) ? $areaName[$shop['provinceCode']] : '';
  535. $data[$key]['area']['cityName'] = isset($areaName[$shop['cityCode']]) ? $areaName[$shop['cityCode']] : '';
  536. $data[$key]['area']['districtName'] = isset($areaName[$shop['districtCode']]) ? $areaName[$shop['districtCode']] : '';
  537. $data[$key]['area']['address'] = $shop['address'];
  538. }
  539. if(!empty($shop['managerId'])) {
  540. $managerIds[] = $shop['managerId'];
  541. }
  542. if(!empty($shop['warehouseId'])) {
  543. if (strpos($shop['warehouseId'], ',')) {
  544. $warehouseIds = array_merge($warehouseIds, explode(',', $shop['warehouseId']));
  545. } else {
  546. $warehouseIds[] = $shop['warehouseId'];
  547. }
  548. }
  549. if (!isset($shop['meters'])){
  550. $data[$key]['meters'] = null;
  551. }
  552. }
  553. $staff = [];
  554. if (!empty($managerIds)) {
  555. //查出商铺的所有店长
  556. $where = [
  557. 'shopId' => 0,
  558. 'userCenterId' => $managerIds,
  559. 'deleteStatus' => StatusCode::$standard
  560. ];
  561. $modelResult = $this->objMStaff->getAllStaffData($where);
  562. if(!$modelResult->isSuccess()){
  563. return ResultWrapper::fail($modelResult->getData(), $modelResult->getErrorCode());
  564. }
  565. $staffResult = $modelResult->getData();
  566. unset($modelResult);
  567. foreach($staffResult as $value){
  568. $staff[$value['userCenterId']] = $value;
  569. }
  570. }
  571. $warehouseData = [];
  572. if (isset($warehouseIds) && $warehouseIds) {
  573. //查出仓库信息
  574. $objMWarehouse = new MWarehouse($this->enterpriseId);
  575. $warehouseResult = $objMWarehouse->getNameByIds($warehouseIds);
  576. if ($warehouseResult->isSuccess()) {
  577. $warehouseData = $warehouseResult->getData();
  578. }
  579. }
  580. foreach ($data as &$shop) {
  581. $shop['warehouseData'] = [];
  582. $shop['managerName'] = isset($staff[$shop['managerId']]) ? $staff[$shop['managerId']]['staffName'] : '';//店长名称
  583. $shop['salesArea'] = !empty($shop['salesArea']) ? json_decode($shop['salesArea'], true) : [];
  584. /*if (in_array('100000-0-0', $shop['salesArea'])) {
  585. $pos = array_search('100000-0-0', $shop['salesArea']);
  586. unset($shop['salesArea'][$pos]);
  587. $shop['isAllCountry'] = 1;
  588. }else {
  589. $shop['isAllCountry'] = 2;
  590. }*/
  591. if (!empty($shop['warehouseId'])) {
  592. if(strpos($shop['warehouseId'],',')){
  593. $wid = explode(',', $shop['warehouseId']);
  594. }else{
  595. $wid = [$shop['warehouseId']];
  596. }
  597. foreach($wid as $v){
  598. if(isset($warehouseData[$v])){
  599. $shop['warehouseData'][$v] = [
  600. 'warehouseId' => $v,
  601. 'warehouseCode' => createCode(StatusCode::$code['warehouse']['prefix'], $v, StatusCode::$code['warehouse']['length']),
  602. 'warehouseName' => $warehouseData[$v]['warehouseName']
  603. ];
  604. }
  605. }
  606. }
  607. }
  608. //$data['warehouseData'] = array_values($data['warehouseData']);
  609. return $data;
  610. }
  611. /**
  612. * Doc: (des="")
  613. * User: XMing
  614. * Date: 2021/3/4
  615. * Time: 12:10 下午
  616. * @param array $shopIds
  617. * @param string $field
  618. * @return ResultWrapper
  619. */
  620. public function getShopByIds(array $shopIds,string $field = "*"): ResultWrapper
  621. {
  622. if (empty($shopIds)){
  623. return ResultWrapper::success([]);
  624. }
  625. $dbResult = $this->objDShop->select(array_values($shopIds), $field);
  626. if ($dbResult === false) {
  627. return ResultWrapper::fail($this->objDShop->error(),ErrorCode::$dberror);
  628. }
  629. return ResultWrapper::success($dbResult);
  630. }
  631. /**
  632. * 获取指定商铺信息
  633. * @param $shopIds
  634. * @param string $field
  635. * @return array
  636. * @deprecated
  637. */
  638. public function getShopName($shopIds, $field = "*")
  639. {
  640. $return = [];
  641. if (!$shopIds) {
  642. return $return;
  643. }
  644. $dbResult = $this->objDShop->select(array_values($shopIds), $field);
  645. if ($dbResult === false) {
  646. return $return;
  647. }
  648. foreach ($dbResult as $shop) {
  649. $return[$shop['id']] = $shop;
  650. }
  651. return $return;
  652. }
  653. /**
  654. * 单个商铺Id查询商铺名称
  655. * @param $shopId
  656. * @return string
  657. */
  658. public function getShopNameById($shopId)
  659. {
  660. $return = '';
  661. if (empty($shopId)) {
  662. return $return;
  663. }
  664. $dbResult = $this->objDShop->get($shopId, 'name');
  665. if ($dbResult === false || empty($dbResult)) {
  666. return $return;
  667. }
  668. return isset($dbResult['name']) ? $dbResult['name'] : $return;
  669. }
  670. /**
  671. * 会员所在地区销售商品的店铺
  672. * @param $userCenterId
  673. * @param $areaCode
  674. * @return ResultWrapper
  675. * @throws Exception
  676. */
  677. public function getShopIdsByArea($userCenterId, $areaCode='')
  678. {
  679. $defaultDSL = [
  680. 'sort' => [
  681. 'createTime' => [
  682. 'order' => 'desc'
  683. ],
  684. ],
  685. ];
  686. $dsl = [];
  687. $dsl['query']['bool']['must'][] = [
  688. 'term' => ['enterpriseId' => $this->enterpriseId],
  689. ];
  690. $dsl['query']['bool']['must'][] = [
  691. 'term' => ['enableStatus' => StatusCode::$standard],
  692. ];
  693. if (!empty($areaCode)) {
  694. $dsl['query']['bool']['must'][] = [
  695. 'term' => [
  696. 'salesArea' => $areaCode
  697. ],
  698. ];
  699. } elseif ($userCenterId){
  700. //查出当前用户的省市区
  701. $objMCustomer = new MCustomer($this->enterpriseId, $this->userCenterId);
  702. $customerData = $objMCustomer->getCustomerInfoByUserCenterId($userCenterId);
  703. if ($customerData->isSuccess()) {
  704. $customerInfo = $customerData->getData();
  705. $provinceCode = isset($customerInfo['provinceCode']) ? $customerInfo['provinceCode'] : 0;
  706. $cityCode = isset($customerInfo['cityCode']) ? $customerInfo['cityCode'] : 0;
  707. $districtCode = isset($customerInfo['districtCode']) ? $customerInfo['districtCode'] : 0;
  708. //V($provinceCode.'-'.$cityCode.'-'.$districtCode);
  709. $dsl['query']['bool']['must'][] = [
  710. 'term' => [
  711. 'salesArea' => $provinceCode . '-' . $cityCode . '-' . $districtCode
  712. ],
  713. ];
  714. /*
  715. * 处理全国销售
  716. * $dsl['query']['bool']['should'][] = [
  717. 'term' => [
  718. 'salesArea' => '100000-0-0'
  719. ],
  720. ];
  721. $dsl['query']['bool']['minimum_should_match'] = 1;*/
  722. }
  723. }else {
  724. return ResultWrapper::success([]);
  725. }
  726. //V($dsl);
  727. $dsl = array_merge($defaultDSL, $dsl);
  728. $result = $this->objDShop->getSearchQueryDsl($dsl);
  729. if (isset($result['status']) && $result['status'] == 400) {
  730. file_put_contents('/www/wwwroot/logs/api.junhailan.com/elasticsearch.log',date('Y-m-d H:i:s').'获取商铺失败,错误原因'.var_export($result,true).PHP_EOL,FILE_APPEND);
  731. if ($result['error']['reason'] == 'all shards failed') {
  732. return ResultWrapper::success([]);
  733. }
  734. return ResultWrapper::fail('获取商铺数据失败' . $result['error']['reason'], ErrorCode::$apiNotResult);
  735. }
  736. if (!isset($result['hits']) || $result['hits']['total'] == 0) {
  737. return ResultWrapper::success([]);
  738. }
  739. $dbResult = $result['hits']['hits'];
  740. $list = [];
  741. foreach ($dbResult as $key => &$value) {
  742. $data = [];
  743. $data = $value['_source'];
  744. //$data['id'] = $value['_id'];
  745. $list[] = $data['id'];
  746. }
  747. return ResultWrapper::success($list);
  748. }
  749. /**
  750. * 根据省市区获取商铺
  751. * @param $params
  752. * @return ResultWrapper
  753. * @throws Exception
  754. */
  755. public function getShopIdByArea($params)
  756. {
  757. $defaultDSL = [
  758. 'sort' => [
  759. 'createTime' => [
  760. 'order' => 'desc'
  761. ],
  762. ],
  763. ];
  764. $dsl = [];
  765. $dsl['query']['bool']['must'][] = [
  766. 'term' => ['enterpriseId' => $this->enterpriseId],
  767. ];
  768. $dsl['query']['bool']['must'][] = [
  769. 'term' => ['enableStatus' => StatusCode::$standard],
  770. ];
  771. $provinceCode = isset($params['provinceCode']) ? $params['provinceCode'] : 0;
  772. $cityCode = isset($params['cityCode']) ? $params['cityCode'] : 0;
  773. $districtCode = isset($params['districtCode']) ? $params['districtCode'] : 0;
  774. $dsl['query']['bool']['must'][] = [
  775. 'term' => [
  776. 'salesArea' => $provinceCode . '-' . $cityCode . '-' . $districtCode
  777. ]
  778. ];
  779. $dsl = array_merge($defaultDSL, $dsl);
  780. $result = $this->objDShop->getSearchQueryDsl($dsl);
  781. if (isset($result['status']) && $result['status'] == 400) {
  782. return '';
  783. /*if($result['error']['reason'] == 'all shards failed') {
  784. return ResultWrapper::success('');
  785. }
  786. return ResultWrapper::fail('获取商铺数据失败' . $result['error']['reason'], ErrorCode::$apiNotResult);*/
  787. }
  788. if (!isset($result['hits']) || $result['hits']['total'] == 0) {
  789. return '';
  790. }
  791. $dbResult = $result['hits']['hits'];
  792. $list = [];
  793. foreach ($dbResult as $key => &$value) {
  794. $data = [];
  795. $data = $value['_source'];
  796. $list[] = $data['id'];
  797. }
  798. return array_shift($list);
  799. }
  800. /**
  801. * 获取当前企业下的销售区域
  802. */
  803. public function getSalesAreaInEnterprise()
  804. {
  805. $salesArea = $this->objShopCache->getEnterpriseSalesArea($this->enterpriseId);
  806. return !empty($salesArea) ? array_values(json_decode($salesArea, true)) : [];
  807. }
  808. /**
  809. * sql查询企业下的所有商铺销售区域
  810. */
  811. public function cacheSalesAreaInEnterprise() {
  812. $selectParams['enterpriseId'] = $this->enterpriseId;
  813. $selectParams['deleteStatus'] = StatusCode::$standard;
  814. $dbResult = $this->objDShop->select($selectParams, 'salesArea');
  815. if ($dbResult === false) {
  816. return ResultWrapper::fail($this->objDShop->error(), ErrorCode::$dberror);
  817. }
  818. $allAreaByEnterprise = [];
  819. foreach ($dbResult as $area) {
  820. $salesArea = !empty($area['salesArea']) ? json_decode($area['salesArea'], true) : [];
  821. if($salesArea) {
  822. $allAreaByEnterprise = array_merge($allAreaByEnterprise, $salesArea);
  823. }
  824. }
  825. $this->objShopCache->cacheEnterpriseSalesArea($this->enterpriseId, $allAreaByEnterprise);
  826. }
  827. /**
  828. * 获取企业下商铺总数
  829. * @param $enterpriseId
  830. * @return ResultWrapper
  831. */
  832. public function getShopTotalByEnterpriseId($enterpriseId)
  833. {
  834. if(empty($enterpriseId)) return ResultWrapper::fail('参数为空', ErrorCode::$paramError);
  835. $cacheEnterpriseCache = new EnterpriseCache();
  836. $cacheResult = $cacheEnterpriseCache->delShopTotalByEnterpriseId($enterpriseId);
  837. unset($cacheResult);
  838. $cacheResult = $cacheEnterpriseCache->getShopTotalByEnterpriseId($enterpriseId);
  839. if($cacheResult){
  840. return ResultWrapper::success($cacheResult);
  841. }
  842. $dbResult = $this->objDShop->count(['enterpriseId' => $enterpriseId, 'deleteStatus' => StatusCode::$standard]);
  843. if($dbResult === false){
  844. return ResultWrapper::fail($this->objDShop->error(), ErrorCode::$dberror);
  845. }
  846. if(empty($dbResult)){
  847. $returnData = 0;
  848. }else{
  849. $returnData = $dbResult;
  850. }
  851. unset($cacheResult);
  852. $cacheResult = $cacheEnterpriseCache->setShopTotalByEnterpriseId($enterpriseId, $returnData);
  853. return ResultWrapper::success($returnData);
  854. }
  855. /**
  856. * @param $enterpriseId
  857. * @return ResultWrapper
  858. * @throws Exception
  859. */
  860. public function checkAllowAddShop($enterpriseId)
  861. {
  862. $enterpriseResult = $this->objMEnterprise->getEnterpriseDataByEnterpriseId($enterpriseId);
  863. if (!$enterpriseResult->isSuccess()){
  864. return ResultWrapper::fail($enterpriseResult->getData(),$enterpriseResult->getErrorCode());
  865. }
  866. $enterprise = $enterpriseResult->getData();
  867. if ($enterprise['scope'] == StatusCode::$standard){
  868. //多店铺,不限制创建数量
  869. return ResultWrapper::success($enterprise['scope']);
  870. }
  871. //单店铺,查询已创建数量
  872. $shopResult = self::getShopTotalByEnterpriseId($enterpriseId);
  873. if (!$shopResult->isSuccess()){
  874. return ResultWrapper::fail($shopResult->getData(),$shopResult->getErrorCode());
  875. }
  876. $shopNum =(int) $shopResult->getData();
  877. if ($shopNum == 0){
  878. return ResultWrapper::success($enterprise['scope']);
  879. }
  880. return ResultWrapper::fail('您已经创建过店铺了',ErrorCode::$paramError);
  881. }
  882. /**
  883. * @param int $enterpriseId
  884. * @param string $fields
  885. * @return ResultWrapper
  886. */
  887. public function getScopeShopInfo(int $enterpriseId, string $fields)
  888. {
  889. $dbResult = $this->objDShop->get(['enterpriseId' => $enterpriseId,'deleteStatus'=>StatusCode::$standard],$fields);
  890. if ($dbResult === false){
  891. return ResultWrapper::fail($this->objDShop->error(),ErrorCode::$dberror);
  892. }
  893. return ResultWrapper::success($dbResult);
  894. }
  895. /**
  896. * 根据shopIds获取商铺数据
  897. * @param $shopIds
  898. * @return ResultWrapper
  899. */
  900. public function getShopDataByShopIds($shopIds)
  901. {
  902. if(empty($shopIds)) return ResultWrapper::fail('shopIds参数错误', ErrorCode::$paramError);
  903. $dbResult = $this->objDShop->select(['id' => $shopIds]);
  904. if($dbResult === false){
  905. return ResultWrapper::fail($this->objDShop->error(), ErrorCode::$dberror);
  906. }
  907. if(empty($dbResult)){
  908. return ResultWrapper::fail('商铺不存在', ErrorCode::$dberror);
  909. }
  910. $objGoodsBasicRelevant = new GoodsBasicRelevant($this->enterpriseId);
  911. $formatData = [];
  912. foreach($dbResult as $value){
  913. if(isset($value['warehouseId']) && !empty($value['warehouseId'])){
  914. $value['warehouseName'] = '';
  915. if(!isset($value['warehouseName']) || empty($value['warehouseName'])){
  916. $value['warehouseName'] = $objGoodsBasicRelevant->getNameByWarehouseId($value['warehouseId']);
  917. }
  918. }
  919. $formatData[$value['id']] = $value;
  920. }
  921. return ResultWrapper::success($formatData);
  922. }
  923. /**
  924. * 获取员工所在商铺列表
  925. * @param $params
  926. * @return ResultWrapper
  927. */
  928. public function getShopByStaff($params)
  929. {
  930. //1.判断当前登录人角色 区分是否返回所有商铺列表
  931. $modelResult = $this->objMEnterprise->getEnterpriseDataByEnterpriseId($this->enterpriseId);
  932. if(!$modelResult->isSuccess()){
  933. return ResultWrapper::fail($modelResult->getData(), $modelResult->getErrorCode());
  934. }
  935. $enterprise = $modelResult->getData();
  936. unset($modelResult);
  937. //如果是管理员返回所有商铺列表
  938. if($enterprise['userCenterId'] == $this->userCenterId){
  939. $modelResult = self::getAllShop($params);
  940. if(!$modelResult->isSuccess()){
  941. return ResultWrapper::fail($modelResult->getData(), $modelResult->getErrorCode());
  942. }
  943. return ResultWrapper::success($modelResult->getData());
  944. }
  945. //如果不是管理员 则返回该用户绑定的商铺列表
  946. $sql = 'select * from qianniao_user_bind_enterprise where userCenterId = '.$this->userCenterId.' and enterpriseId = '.$this->enterpriseId;
  947. $dbResult = $this->objDShop->query($sql);
  948. if($dbResult === false){
  949. return ResultWrapper::fail($this->objDShop->error(), ErrorCode::$dberror);
  950. }
  951. $shopIds = [];
  952. foreach($dbResult as $value){
  953. !empty($value['shopId']) && $shopIds[] = $value['shopId'];
  954. }
  955. unset($dbResult);
  956. $whereSql = ' WHERE deleteStatus = '.StatusCode::$standard.' and enterpriseId = '.$this->enterpriseId;
  957. if (!empty($shopIds)){
  958. $whereSql .= ' AND id in ('.implode(',',$shopIds).') ';
  959. }
  960. $sql = 'select * from qianniao_shop_1 '.$whereSql.' order by createTime ASC limit '.$params['offset'].','.$params['limit'];
  961. $dbResult = $this->objDShop->query($sql);
  962. if($dbResult === false){
  963. return ResultWrapper::fail($this->objDShop->error(), ErrorCode::$dberror);
  964. }
  965. $data = $dbResult;
  966. unset($dbResult);
  967. $countSql = 'select count(*) as count from qianniao_shop_1 '.$whereSql;
  968. $dbResult = $this->objDShop->query($countSql);
  969. if($dbResult === false){
  970. return ResultWrapper::fail($this->objDShop->error(), ErrorCode::$dberror);
  971. }
  972. $count = array_shift($dbResult)['count'];
  973. $return = [
  974. 'data' => self::format($data),
  975. 'total' => $count
  976. ];
  977. return ResultWrapper::success($return);
  978. }
  979. /**
  980. * 格式化商铺token
  981. * @return ResultWrapper
  982. */
  983. public function formatShopToken()
  984. {
  985. $dbResult = $this->objDShop->select();
  986. if($dbResult === false){
  987. return ResultWrapper::fail($this->objDShop->error(), ErrorCode::$dberror);
  988. }
  989. $objMEnterprise = new MEnterprise();
  990. foreach($dbResult as $value){
  991. $data = $objMEnterprise->createAppid($value['enterpriseId']);
  992. $this->objDShop->update(['token' => $data['token']], ['id' => $value['id']]);
  993. $this->objShopCache->setShopToken($value['enterpriseId'], $value['id'], $data['token']);
  994. }
  995. return ResultWrapper::success('操作成功');
  996. }
  997. /**
  998. * 设置总店
  999. * @param $params
  1000. * @return ResultWrapper
  1001. */
  1002. public function setTopShop($params)
  1003. {
  1004. $dbResult = $this->objDShop->get(['id' => $params['id'], 'deleteStatus' => StatusCode::$standard]);
  1005. if($dbResult === false){
  1006. return ResultWrapper::fail($this->objDShop->error(), ErrorCode::$dberror);
  1007. }
  1008. if(empty($dbResult)){
  1009. return ResultWrapper::fail('商铺不存在', ErrorCode::$dberror);
  1010. }
  1011. if($dbResult['isMaster'] == StatusCode::$standard){
  1012. return ResultWrapper::fail('已经是总店了', ErrorCode::$dberror);
  1013. }
  1014. $dbResult = $this->objDShop->update(['enterpriseId' => $this->enterpriseId, 'isMaster' => StatusCode::$delete, 'updateTime' => time()]);
  1015. if($dbResult === false){
  1016. return ResultWrapper::fail($this->objDShop->error(), ErrorCode::$dberror);
  1017. }
  1018. $dbResult = $this->objDShop->update(['isMaster' => StatusCode::$standard, 'updateTime' => time()], ['id' => $params['id']]);
  1019. if($dbResult === false){
  1020. return ResultWrapper::fail($this->objDShop->error(), ErrorCode::$dberror);
  1021. }
  1022. return ResultWrapper::success($dbResult);
  1023. }
  1024. /**
  1025. * 设置店长
  1026. * @param $params
  1027. * @return ResultWrapper
  1028. */
  1029. public function setStaffType($params)
  1030. {
  1031. //1.判断员工是否存在
  1032. $modelResult = $this->objMStaff->getStaffData(['id' => $params['id'], 'deleteStatus' => StatusCode::$standard]);
  1033. if(!$modelResult->isSuccess()){
  1034. return ResultWrapper::fail($modelResult->getData(), $modelResult->getErrorCode());
  1035. }
  1036. $staff = $modelResult->getData();
  1037. $userCenterId = getArrayItem($staff,'userCenterId',0);
  1038. unset($modelResult);
  1039. if(empty($staff)){
  1040. return ResultWrapper::fail('员工不存在', ErrorCode::$paramError);
  1041. }
  1042. //2.判断该店铺是否已经有店长
  1043. $dbResult = $this->objDShop->get(['id' => $params['shopId'], 'deleteStatus' => StatusCode::$standard]);
  1044. if($dbResult === false){
  1045. return ResultWrapper::fail($this->objDShop->error(), ErrorCode::$dberror);
  1046. }
  1047. $shop = $dbResult;
  1048. unset($dbResult);
  1049. if(empty($shop)){
  1050. return ResultWrapper::fail('商铺不存在', ErrorCode::$paramError);
  1051. }
  1052. if(!empty($shop['managerId'])){
  1053. return ResultWrapper::fail('该店铺已有店长', ErrorCode::$paramError);
  1054. }
  1055. //3.如果该店铺下没有这个员工的话 把该员工添加到该商铺
  1056. $modelResult = $this->objMStaff->getStaffData(['userCenterId' => $userCenterId, 'shopId' => $params['shopId'], 'deleteStatus' => StatusCode::$standard]);
  1057. if(!$modelResult->isSuccess()){
  1058. return ResultWrapper::fail($modelResult->getData(), $modelResult->getErrorCode());
  1059. }
  1060. $staffBindShop = $modelResult->getData();
  1061. unset($modelResult);
  1062. if(empty($staffBindShop)){
  1063. $objDUserCenter = new DUserCenter();
  1064. $dbResult = $objDUserCenter->get(['id' => $staff['userCenterId']]);
  1065. if($dbResult === false){
  1066. return ResultWrapper::fail($objDUserCenter->error(), ErrorCode::$dberror);
  1067. }
  1068. $staff['mobile'] = $dbResult['mobile'];
  1069. $staff['shopId'] = $params['shopId'];
  1070. unset($staff['id']);
  1071. unset($dbResult);
  1072. $modelResult = $this->objMStaff->addStaff($staff);
  1073. if(!$modelResult->isSuccess()){
  1074. return ResultWrapper::fail($modelResult->getData(), $modelResult->getErrorCode());
  1075. }
  1076. }
  1077. //4.添加店长
  1078. $update = [
  1079. 'managerId' => $userCenterId,
  1080. 'updateTime' => time(),
  1081. ];
  1082. $dbResult = $this->objDShop->update($update, ['id' => $params['shopId']]);
  1083. if($dbResult === false){
  1084. return ResultWrapper::fail($this->objDShop->error(), ErrorCode::$dberror);
  1085. }
  1086. return ResultWrapper::success($userCenterId);
  1087. }
  1088. /**
  1089. * 删除店长
  1090. */
  1091. public function delManager($params)
  1092. {
  1093. $where = [
  1094. 'id' => $params['shopId'],
  1095. 'enterpriseId' => $params['enterpriseId']
  1096. ];
  1097. $dbResult = $this->objDShop->get($where);
  1098. if($dbResult === false){
  1099. return ResultWrapper::fail($this->objDShop->error(), ErrorCode::$dberror);
  1100. }
  1101. $shop = $dbResult;
  1102. unset($dbResult);
  1103. if(empty($shop)){
  1104. return ResultWrapper::fail('商铺不存在', ErrorCode::$paramError);
  1105. }
  1106. if(empty($shop['managerId'])){
  1107. return ResultWrapper::fail('店长不存在', ErrorCode::$paramError);
  1108. }
  1109. //1.删除员工 userCenter与店铺绑定关系
  1110. $delWhere = [
  1111. 'userCenterId' => $shop['managerId'],
  1112. 'shopId' => $shop['id']
  1113. ];
  1114. $modelResult = $this->objMStaff->deleteStaff($delWhere);
  1115. if(!$modelResult->isSuccess()){
  1116. return ResultWrapper::fail($modelResult->getData(), $modelResult->getErrorCode());
  1117. }
  1118. $update = [
  1119. 'managerId' => NULL,
  1120. 'updateTime' => time(),
  1121. ];
  1122. $dbResult = $this->objDShop->update($update,$where);
  1123. if($dbResult === false){
  1124. return ResultWrapper::fail($this->objDShop->error(), ErrorCode::$dberror);
  1125. }
  1126. return ResultWrapper::success($dbResult);
  1127. }
  1128. /**
  1129. * Doc: (des="组装距离计算sql")
  1130. * User: XMing
  1131. * Date: 2020/12/10
  1132. * Time: 10:15 上午
  1133. * @param string $lon1 用户当前经度
  1134. * @param string $lat1 用户当前纬度
  1135. * @param string $lon2 数据库经度的字段名
  1136. * @param string $lat2 数据库纬度的字段名
  1137. * @return string
  1138. */
  1139. public static function buildDistanceSql($lon1='',$lat1='',$lon2='longitude',$lat2='latitude'): string
  1140. {
  1141. $PI = PI;
  1142. $sql = "ROUND(6378.138 * 2 * ASIN( SQRT(POW(SIN( ({$lat1} * $PI / 180 - {$lat2} * $PI / 180 ) / 2 ),2) + COS({$lat1} * $PI / 180) * COS({$lat2} * $PI / 180) * POW(SIN( ({$lon1} * $PI / 180 - {$lon2} * $PI / 180 ) / 2) ,2)) ) * 1000) / 1000 ";
  1143. return $sql;
  1144. }
  1145. /**
  1146. * Doc: (des="获取附近商家列表-按照距离排序-sql")
  1147. * User: XMing
  1148. * Date: 2020/12/10
  1149. * Time: 10:23 上午
  1150. * @param array $data
  1151. * @param $lon1
  1152. * @param $lat1
  1153. * @return ResultWrapper
  1154. */
  1155. public function nearbyLists(array $data,$lon1,$lat1): ResultWrapper
  1156. {
  1157. //$lon1 = '108.978695';
  1158. //$lat1 = '34.321583';
  1159. $map = [];
  1160. $noLocalMap = [];
  1161. foreach ($data as $value){
  1162. if (!empty($value['longitude']) && !empty($value['latitude'])){
  1163. $map[] = $value;
  1164. continue;
  1165. }
  1166. $noLocalMap[] = $value;
  1167. }
  1168. $objLocation = new Location();
  1169. foreach ($map as &$value){
  1170. $sub = $objLocation->get_distance_by_geo($lat1,$lon1,$value['latitude'],$value['longitude']);
  1171. $value['sub'] = $sub;
  1172. }
  1173. unset($value);
  1174. $subColl = array_column($map,'sub');
  1175. array_multisort($subColl,SORT_ASC,$map);
  1176. foreach ($map as &$value){
  1177. $value['meters'] = Location::toMeters($value['sub']);
  1178. }
  1179. unset($value);
  1180. foreach ($noLocalMap as &$value){
  1181. $value['meters'] = null;
  1182. }
  1183. unset($value);
  1184. $map = array_merge($map,$noLocalMap);
  1185. return ResultWrapper::success($map);
  1186. }
  1187. /**
  1188. * Doc: (des="根据企业id获取企业下总店")
  1189. * User: XMing
  1190. * Date: 2020/12/17
  1191. * Time: 4:50 下午
  1192. * @param int $enterpriseId
  1193. * @return ResultWrapper
  1194. */
  1195. public function getCenterShopByEnterprise(int $enterpriseId): ResultWrapper
  1196. {
  1197. $shop = $this->objDShop->get(['enterpriseId' => $enterpriseId,'isMaster' => StatusCode::$standard],'id,name');
  1198. if ($shop === false){
  1199. return ResultWrapper::fail($this->objDShop->error(),ErrorCode::$dberror);
  1200. }
  1201. return ResultWrapper::success($shop);
  1202. }
  1203. /**
  1204. * Doc: (des="")
  1205. * User: XMing
  1206. * Date: 2020/12/30
  1207. * Time: 5:03 下午
  1208. * @param $ids
  1209. * @return ResultWrapper
  1210. */
  1211. public function getShopIdByMerchantIds($ids): ResultWrapper
  1212. {
  1213. if (empty($ids)){
  1214. return ResultWrapper::success([]);
  1215. }
  1216. $lists = $this->objDShop->select(['merchantId'=>$ids],'*');
  1217. if ($lists === false){
  1218. return ResultWrapper::fail($this->objDShop->error(),ErrorCode::$dberror);
  1219. }
  1220. $map = [];
  1221. foreach ($lists as $list) {
  1222. $map[$list['merchantId']] = $list;
  1223. }
  1224. return ResultWrapper::success($map);
  1225. }
  1226. /**
  1227. * Doc: (des="")
  1228. * User: XMing
  1229. * Date: 2021/1/22
  1230. * Time: 6:31 下午
  1231. * @param int $id
  1232. * @return ResultWrapper
  1233. */
  1234. public function getShopById(int $id): ResultWrapper
  1235. {
  1236. $result = $this->objDShop->get($id);
  1237. if ($result === false){
  1238. return ResultWrapper::fail($this->objDShop->error(),ErrorCode::$dberror);
  1239. }
  1240. return ResultWrapper::success($result);
  1241. }
  1242. /**
  1243. * Doc: (des="")
  1244. * User: XMing
  1245. * Date: 2021/1/28
  1246. * Time: 3:58 下午
  1247. * @param array $selectParams
  1248. * @return ResultWrapper
  1249. * @throws Exception
  1250. */
  1251. public function getAll(array $selectParams): ResultWrapper
  1252. {
  1253. //获取用户的客户类型
  1254. $selectParams['modelType'] = StatusCode::$modelType['B2C'];
  1255. if (!empty($this->userCenterId)){
  1256. $objMCustomer = new MCustomer($this->enterpriseId,$this->userCenterId);
  1257. $customerResult = $objMCustomer->getCustomerInfoByUserCenterId($this->userCenterId);
  1258. if (!$customerResult->isSuccess()){
  1259. return ResultWrapper::fail($customerResult->getData(),$customerResult->getErrorCode());
  1260. }
  1261. $customer = $customerResult->getData();
  1262. $modelType = $customer['modelType'];
  1263. if (empty($modelType)){
  1264. $modelType = StatusCode::$modelType['B2C'];
  1265. }
  1266. $selectParams['modelType'] = $modelType;
  1267. }
  1268. $buildSql = self::buildSqlByParams($selectParams);
  1269. $dbResult = $this->objDShop->query($buildSql['sql']);
  1270. if ($dbResult === false) {
  1271. return ResultWrapper::fail($this->objDShop->error(), ErrorCode::$dberror);
  1272. }
  1273. //按照距离进行排序
  1274. if ( isset($selectParams['longitude']) && !empty($selectParams['longitude']) &&
  1275. isset($selectParams['latitude']) && !empty($selectParams['latitude']) ){
  1276. $nearResult = self::nearbyLists($dbResult,$selectParams['longitude'],$selectParams['latitude']);
  1277. if (!$nearResult->isSuccess()){
  1278. return ResultWrapper::fail($nearResult->getData(),$nearResult->getErrorCode());
  1279. }
  1280. $dbResult = $nearResult->getData();
  1281. }
  1282. $dbResult = self::format($dbResult);
  1283. $count = $this->objDShop->query($buildSql['countSql']);
  1284. $return = [
  1285. 'data' => $dbResult,
  1286. 'total' => isset($count[0]['total']) ? $count[0]['total'] : 0
  1287. ];
  1288. return ResultWrapper::success($return);
  1289. }
  1290. /**
  1291. * Doc: (des="")
  1292. * User: XMing
  1293. * Date: 2021/1/30
  1294. * Time: 12:18 下午
  1295. * @param array $selectParams
  1296. * @return array
  1297. */
  1298. public function buildSqlByParams(array $selectParams): array
  1299. {
  1300. $tableName = 'qianniao_shop_1';
  1301. $fields = ' * ';
  1302. $countField = ' COUNT(id) as total ';
  1303. $whereSql = '';
  1304. if (isset($selectParams['modelType']) && !empty($selectParams['modelType'])){
  1305. $modelType = explode(',',$selectParams['modelType']);
  1306. $str = '';
  1307. foreach ($modelType as $type){
  1308. if (!empty($str)){
  1309. $str .= ' OR ';
  1310. }
  1311. $str .= ' FIND_IN_SET('.$type.',`modelType`) ';
  1312. }
  1313. $whereSql .= ' AND ('.$str .')';
  1314. }
  1315. $countSql = 'SELECT '.$countField.' FROM '.$tableName.' WHERE enterpriseId = '.$this->enterpriseId.' and deleteStatus = '.StatusCode::$standard.' AND merchantId IS NULL and enableStatus = '.StatusCode::$standard.' AND extends IS NULL '.$whereSql;
  1316. $whereSql .= ' ORDER BY createTime DESC ';
  1317. if (isset($selectParams['limit']) && !empty($selectParams['limit'])){
  1318. $whereSql .= ' LIMIT '.$selectParams['offset'].','.$selectParams['limit'];
  1319. }
  1320. $sql = 'SELECT '.$fields.' FROM '.$tableName.' WHERE enterpriseId = '.$this->enterpriseId.' and deleteStatus = '.StatusCode::$standard.' AND merchantId IS NULL and enableStatus = '.StatusCode::$standard.' AND extends IS NULL '.$whereSql;
  1321. Logger::logs(E_USER_ERROR,'sql',__CLASS__,__LINE__,$sql);
  1322. return [
  1323. 'countSql' => $countSql,
  1324. 'sql' => $sql
  1325. ];
  1326. }
  1327. /**
  1328. * 获取商铺绑定仓库
  1329. */
  1330. public function getShopBindWarehouse($shopId)
  1331. {
  1332. $dbResult = $this->objDShop->get(['id' => $shopId]);
  1333. if($dbResult === false){
  1334. return ResultWrapper::fail($this->objDShop->error(), ErrorCode::$dberror);
  1335. }
  1336. $shop = $dbResult;
  1337. if(empty($shop)){
  1338. return ResultWrapper::fail('查询商铺失败', ErrorCode::$paramError);
  1339. }
  1340. $warehouseId = [];
  1341. $warehouseData = [];
  1342. if(!empty($shop['warehouseId'])){
  1343. $warehouseIds = explode(',',$shop['warehouseId']);
  1344. $objMWarehouse = new MWarehouse($this->enterpriseId);
  1345. $modelResult = $objMWarehouse->selectWarehouse(['id' => $warehouseIds, 'deleteStatus' => StatusCode::$standard]);
  1346. if(!$modelResult->isSuccess()){
  1347. return ResultWrapper::fail($modelResult->getData(), $modelResult->getErrorCode());
  1348. }
  1349. $warehouse = $modelResult->getData();
  1350. unset($modelResult);
  1351. $warehouseId = [];
  1352. $warehouseData = [];
  1353. foreach($warehouse as $value){
  1354. $warehouseId[] = $value['id'];
  1355. $warehouseData[$value['id']] = $value;
  1356. }
  1357. }
  1358. $return['shopId'] = $shopId;
  1359. $return['warehouseId'] = $warehouseId;
  1360. $return['warehouseData'] = $warehouseData;
  1361. return ResultWrapper::success($return);
  1362. }
  1363. /**
  1364. * 获取店铺绑定的仓库id
  1365. */
  1366. public function getWarehouseIdsByShopId($shopId)
  1367. {
  1368. $warehouseIds = [];
  1369. $dbResult = $this->objDShop->get(['id' => $shopId]);
  1370. if($dbResult === false){
  1371. return ResultWrapper::fail($this->objDShop->error(), ErrorCode::$dberror);
  1372. }
  1373. if(empty($dbResult)){
  1374. return ResultWrapper::success($warehouseIds);
  1375. }
  1376. if(!empty($dbResult['warehouseId'])){
  1377. $warehouseIds = explode(',',$dbResult['warehouseId']);
  1378. }
  1379. return ResultWrapper::success($warehouseIds);
  1380. }
  1381. /**
  1382. * 获取商铺信息
  1383. */
  1384. public function getShopData($where)
  1385. {
  1386. $dbResult = $this->objDShop->select($where);
  1387. if($dbResult === false){
  1388. return ResultWrapper::fail($this->objDShop->error(), ErrorCode::$dberror);
  1389. }
  1390. return ResultWrapper::success($dbResult);
  1391. }
  1392. /**
  1393. * 修改商铺
  1394. * @param $update
  1395. * @param $where
  1396. * @return ResultWrapper
  1397. */
  1398. public function updateShopData($update, $where)
  1399. {
  1400. $dbResult = $this->objDShop->update($update, $where);
  1401. if($dbResult === false){
  1402. return ResultWrapper::fail($this->objDShop->error(), ErrorCode::$dberror);
  1403. }
  1404. return ResultWrapper::success($dbResult);
  1405. }
  1406. /**
  1407. * 多个店铺Id查询店铺名称
  1408. * @param $departmentIds
  1409. * @return ResultWrapper
  1410. */
  1411. public function getShopNameByIds(array $ids)
  1412. {
  1413. //查询所有 id 店铺名称
  1414. $where = [
  1415. 'id' => array_values($ids),
  1416. 'deleteStatus' => StatusCode::$standard,
  1417. ];
  1418. $fields = 'id,name';
  1419. $shopData = $this->objDShop->select($where, $fields);
  1420. if($shopData === false){
  1421. return ResultWrapper::fail($this->objDShop->error(), ErrorCode::$dberror);
  1422. }
  1423. return $shopData;
  1424. }
  1425. // 根据实体企业id和token获取商铺id
  1426. public function getShopid($enterpriseId,$token)
  1427. {
  1428. //查询所有 id 店铺名称
  1429. $where = [
  1430. 'enterpriseId' =>$enterpriseId,
  1431. 'token' =>$token,
  1432. ];
  1433. $fields = 'id,name';
  1434. $shopData = $this->objDShop->select($where, $fields);
  1435. if($shopData === false){
  1436. return ResultWrapper::fail($this->objDShop->error(), ErrorCode::$dberror);
  1437. }
  1438. return $shopData;
  1439. }
  1440. }