MShop.Class.php 57 KB

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