StoreCreateSync.php 54 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495969798991001011021031041051061071081091101111121131141151161171181191201211221231241251261271281291301311321331341351361371381391401411421431441451461471481491501511521531541551561571581591601611621631641651661671681691701711721731741751761771781791801811821831841851861871881891901911921931941951961971981992002012022032042052062072082092102112122132142152162172182192202212222232242252262272282292302312322332342352362372382392402412422432442452462472482492502512522532542552562572582592602612622632642652662672682692702712722732742752762772782792802812822832842852862872882892902912922932942952962972982993003013023033043053063073083093103113123133143153163173183193203213223233243253263273283293303313323333343353363373383393403413423433443453463473483493503513523533543553563573583593603613623633643653663673683693703713723733743753763773783793803813823833843853863873883893903913923933943953963973983994004014024034044054064074084094104114124134144154164174184194204214224234244254264274284294304314324334344354364374384394404414424434444454464474484494504514524534544554564574584594604614624634644654664674684694704714724734744754764774784794804814824834844854864874884894904914924934944954964974984995005015025035045055065075085095105115125135145155165175185195205215225235245255265275285295305315325335345355365375385395405415425435445455465475485495505515525535545555565575585595605615625635645655665675685695705715725735745755765775785795805815825835845855865875885895905915925935945955965975985996006016026036046056066076086096106116126136146156166176186196206216226236246256266276286296306316326336346356366376386396406416426436446456466476486496506516526536546556566576586596606616626636646656666676686696706716726736746756766776786796806816826836846856866876886896906916926936946956966976986997007017027037047057067077087097107117127137147157167177187197207217227237247257267277287297307317327337347357367377387397407417427437447457467477487497507517527537547557567577587597607617627637647657667677687697707717727737747757767777787797807817827837847857867877887897907917927937947957967977987998008018028038048058068078088098108118128138148158168178188198208218228238248258268278288298308318328338348358368378388398408418428438448458468478488498508518528538548558568578588598608618628638648658668678688698708718728738748758768778788798808818828838848858868878888898908918928938948958968978988999009019029039049059069079089099109119129139149159169179189199209219229239249259269279289299309319329339349359369379389399409419429439449459469479489499509519529539549559569579589599609619629639649659669679689699709719729739749759769779789799809819829839849859869879889899909919929939949959969979989991000100110021003100410051006100710081009101010111012101310141015101610171018101910201021102210231024102510261027102810291030103110321033103410351036103710381039104010411042104310441045104610471048104910501051105210531054105510561057105810591060106110621063106410651066106710681069107010711072107310741075107610771078107910801081108210831084108510861087108810891090109110921093109410951096109710981099110011011102110311041105110611071108110911101111111211131114111511161117111811191120112111221123112411251126112711281129113011311132113311341135113611371138113911401141114211431144114511461147114811491150115111521153115411551156115711581159116011611162116311641165116611671168116911701171117211731174117511761177117811791180118111821183118411851186118711881189119011911192119311941195119611971198119912001201120212031204120512061207120812091210121112121213121412151216121712181219122012211222122312241225122612271228122912301231123212331234123512361237123812391240124112421243124412451246124712481249125012511252125312541255125612571258125912601261126212631264126512661267126812691270127112721273127412751276127712781279128012811282128312841285128612871288128912901291129212931294129512961297129812991300130113021303130413051306130713081309131013111312131313141315131613171318131913201321132213231324132513261327132813291330133113321333133413351336133713381339134013411342134313441345134613471348134913501351135213531354135513561357135813591360136113621363136413651366136713681369137013711372137313741375137613771378137913801381138213831384138513861387138813891390139113921393139413951396139713981399140014011402140314041405140614071408140914101411141214131414141514161417141814191420142114221423142414251426
  1. <?php
  2. namespace addons\Store\common\logic;
  3. use addons\Store\common\enums\StoreEnum;
  4. use common\enums\StatusEnum;
  5. use addons\Store\common\models\Store;
  6. use addons\Store\common\models\StoreGoodsCate;
  7. use addons\Store\common\models\StoreCommonSyncLogs;
  8. use addons\Store\common\models\StoreGoods;
  9. use addons\Store\common\models\StoreSyncGoodsLogs;
  10. use addons\Store\common\models\StoreGoodsCateRelate;
  11. use addons\Store\common\models\StoreGoodsAttr;
  12. use addons\Store\common\models\StoreGoodsExtra;
  13. use addons\Store\common\models\StoreNotice;
  14. use addons\Store\common\models\StoreModel;
  15. use addons\Store\common\models\StoreFreightRules;
  16. use addons\Store\common\models\StoreSettings;
  17. use addons\Store\common\models\StoreCashierExtra;
  18. use addons\Store\common\models\StoreGoodsReserve;
  19. use addons\Store\common\models\StoreGoodsReserveSku;
  20. use addons\Store\common\models\StoreReserveSetting;
  21. use addons\Store\common\models\StoreExtra;
  22. use addons\Store\common\models\StoreBossAgentSetting;
  23. use addons\Store\common\models\StoreBossAgentLevel;
  24. use addons\Store\common\models\StoreCoupon;
  25. use addons\Store\common\models\StoreCouponGoodsRelate;
  26. use addons\Store\common\models\StoreCouponCatRelate;
  27. use addons\Store\common\models\StoreCouponGiveItemSetting;
  28. use addons\Store\common\models\StoreCouponGiveItemSettingDetail;
  29. use addons\Store\common\models\StoreCouponMemberRelate;
  30. use common\models\goods\GoodsAssociation;
  31. use common\models\goods\GoodsSpecs;
  32. use addons\Store\common\models\StoreGoodsModel;
  33. use addons\Store\common\events\goods\GoodsEditEvent;
  34. use common\enums\AddonsEnum;
  35. use common\models\mall\MallAddons;
  36. use Yii;
  37. use addons\Store\addons\Verification\common\models\StoreVerificationSetting;
  38. use addons\Store\addons\Verification\common\models\StoreVerificationCoupons;
  39. use addons\Coupon\common\models\AddonsCoupon;
  40. class StoreCreateSync
  41. {
  42. public function synStoreData($params)
  43. {
  44. if (empty($params['self_store_id'])) return true;
  45. $before_model = Store::find()
  46. ->where(['id' => $params['self_store_id']])
  47. ->asArray()
  48. ->one();
  49. if (empty($before_model) || empty($before_model['is_sync']) || $before_model['sync_status'] != StoreEnum::SYNC_STATUS_WAIT) return true;
  50. //需要被同步的门店id
  51. $self_store_id = $params['self_store_id'];
  52. $mall_id = $params['mall_id'];
  53. $is_secondary_card = MallAddons::isInstall($mall_id, 'SecondaryCard');
  54. $is_install_store_boss_agent = MallAddons::isInstall($mall_id, AddonsEnum::ADDONS_NAME_STORE_BOSS_AGENT);
  55. $is_install_coupon = MallAddons::isInstall($mall_id, AddonsEnum::ADDONS_NAME_COUPON);
  56. //模板门店id
  57. $source_store_id = $params['source_store_id'];
  58. $enter = \Yii::$app->services->setting->addons->get($mall_id, StoreEnum::ADDONS_NAME, 'enter');
  59. if (empty($enter['is_template'])) {
  60. return true;
  61. }
  62. if (empty($source_store_id)) {
  63. $template_store = json_decode($enter['template_store'], true);
  64. if (empty($template_store)) {
  65. return true;
  66. }
  67. $template_store = end($template_store);
  68. $source_store_id = $template_store['id'];
  69. $source_store = Store::find()
  70. ->where([
  71. 'id' => $params['self_store_id'],
  72. 'status' => [StatusEnum::ENABLED, StatusEnum::DISABLED]
  73. ])
  74. ->one();
  75. if (empty($source_store)) {
  76. return true;
  77. }
  78. }
  79. //更新店铺同步中
  80. self::updateStoreStatus($params['self_store_id'], StoreEnum::SYNC_STATUS_IN_SYNC);
  81. $transaction = \Yii::$app->db->beginTransaction();
  82. try {
  83. //清楚可能已经存在的数据
  84. StoreSettings::updateAll([
  85. 'status' => StatusEnum::DELETE
  86. ], [
  87. 'store_id' => $params['self_store_id'],
  88. 'mall_id' => $mall_id
  89. ]);
  90. //店铺信息
  91. self::syncStore($self_store_id, $source_store_id);
  92. //店铺公告
  93. self::syncCommon($self_store_id, $source_store_id, 'StoreNotice', StoreNotice::class);
  94. //门店分佣模式
  95. self::syncCommon($self_store_id, $source_store_id, 'StoreModel', StoreModel::class);
  96. //门店配置记录表
  97. self::syncStoreSettings($self_store_id, $source_store_id, $mall_id);
  98. //预约门店独立设置
  99. self::syncCommon($self_store_id, $source_store_id, 'StoreReserveSetting', StoreReserveSetting::class);
  100. //商品
  101. self::syncGoodsCateData($self_store_id, $source_store_id); //商品分类
  102. self::syncCommon($self_store_id, $source_store_id, 'FreightRules', StoreFreightRules::class);
  103. self::syncGoodsData($self_store_id, $source_store_id, $mall_id);
  104. self::syncGoodsAssociation($self_store_id, $source_store_id);
  105. self::syncCommon($self_store_id, $source_store_id, 'GoodsSpecs', GoodsSpecs::class);
  106. if ($is_install_coupon) {
  107. var_dump('优惠券');
  108. //优惠券
  109. self::syncStoreCoupon($self_store_id, $source_store_id);
  110. self::syncStoreCouponCatRelate($self_store_id, $source_store_id, $mall_id);
  111. self::syncStoreCouponGoodsRelate($self_store_id, $source_store_id, $mall_id);
  112. self::syncStoreCouponGiveItemSetting($self_store_id, $source_store_id, $mall_id);
  113. self::syncStoreCouponMemberRelate($self_store_id, $source_store_id, $mall_id);
  114. }
  115. if ($is_install_store_boss_agent) {
  116. var_dump('股东团队');
  117. //股东基础设置
  118. self::syncCommon($self_store_id, $source_store_id, 'StoreBossAgentSetting', StoreBossAgentSetting::class);
  119. //股东等级
  120. self::syncStoreBossAgentLevel($self_store_id, $source_store_id, 'StoreBossAgentLevel', StoreBossAgentLevel::class);
  121. //门店核销券与门店股东相关联,同步设置
  122. self::syncCommon($self_store_id, $source_store_id, 'StoreVerificationCoupons', StoreVerificationCoupons::class);
  123. self::syncCommon($self_store_id, $source_store_id, 'StoreVerificationSetting', StoreVerificationSetting::class);
  124. //核销券同步完先禁用
  125. StoreVerificationCoupons::updateAll([
  126. 'status' => StatusEnum::DISABLED
  127. ], [
  128. 'store_id' => $params['self_store_id'],
  129. 'mall_id' => $mall_id
  130. ]);
  131. }
  132. if ($is_secondary_card) {
  133. var_dump('次卡');
  134. //次卡同步
  135. self::syncSecondaryCard($self_store_id, $source_store_id, $mall_id);
  136. //次卡关系同步
  137. self::syncSecondaryCardRelateStore($self_store_id, $source_store_id, $mall_id);
  138. }
  139. //收银同步
  140. self::syncStoreCashierExtra($self_store_id, $source_store_id, $mall_id);
  141. self::syncStoreExtra($self_store_id, $source_store_id, $mall_id);
  142. self::updateStoreStatus($params['self_store_id'], StoreEnum::SYNC_STATUS_COMPLETE);
  143. $transaction->commit();
  144. // self::syncCommon($self_store_id, $source_store_id, 'StoreGoodsCate', StoreGoodsCate::class);
  145. } catch (\Exception $e) {
  146. $transaction->rollback();
  147. self::updateStoreStatus($params['self_store_id'], StoreEnum::SYNC_STATUS_WAIT);
  148. var_dump($e->getMessage());
  149. }
  150. }
  151. public static function syncCommon($self_store_id, $source_store_id, $type, $class)
  152. {
  153. $not_status_array = ['GoodsSpecs', 'StoreBossAgentSetting'];
  154. $where = [];
  155. $where[] = ['store_id' => $source_store_id];
  156. if (!in_array($type, $not_status_array)) $where[] = ['status' => [StatusEnum::ENABLED, StatusEnum::DISABLED]];
  157. $list = $class::lists([
  158. 'where' => $where,
  159. 'order' => 'id asc',
  160. ]);
  161. if (empty($list)) {
  162. return true;
  163. }
  164. $ids = array_column($list, 'id');
  165. $source_type_ids = StoreCommonSyncLogs::getTypeIds($self_store_id, $source_store_id, $type, $ids);
  166. foreach ($list as $item) {
  167. if (in_array($item['id'], $source_type_ids)) continue;
  168. $source_type_id = $item['id'];
  169. unset($item['id']);
  170. $model = new $class();
  171. $item['store_id'] = $self_store_id;
  172. $model->attributes = $item;
  173. $model->save();
  174. StoreCommonSyncLogs::add($self_store_id, $source_store_id, $source_type_id, $type, $model->id, $model->mall_id);
  175. }
  176. }
  177. //商品分类
  178. public static function syncGoodsCateData($self_store_id, $source_store_id)
  179. {
  180. $type = 'GoodsCate';
  181. $goods_cate_list = StoreGoodsCate::find()
  182. ->where(['store_id' => $source_store_id, 'status' => [StatusEnum::ENABLED, StatusEnum::DISABLED]])
  183. ->orderBy('parent_id asc,id asc')->asArray()->all();
  184. if (empty($goods_cate_list)) {
  185. return true;
  186. }
  187. $ids = array_column($goods_cate_list, 'id');
  188. $goods_cate_common_sync_logs_list = StoreCommonSyncLogs::lists([
  189. 'where' => [
  190. ['self_store_id' => $self_store_id],
  191. ['type' => $type],
  192. ['source_store_id' => $source_store_id],
  193. ['source_type_id' => $ids]
  194. ],
  195. 'index' => 'source_type_id',
  196. ]);
  197. $source_type_ids = array_column($goods_cate_common_sync_logs_list, 'source_type_id');
  198. $arr = [];
  199. foreach ($goods_cate_list as $item) {
  200. if (in_array($item['id'], $source_type_ids)) continue;
  201. $source_type_id = $item['id'];
  202. $model = new StoreGoodsCate();
  203. $item['store_id'] = $self_store_id;
  204. $item['parent_id'] = 0;
  205. $model->attributes = $item;
  206. $model->save();
  207. StoreCommonSyncLogs::add($self_store_id, $source_store_id, $source_type_id, $type, $model->id, $model->mall_id);
  208. $arr[$source_type_id] = $model->id;
  209. }
  210. foreach ($goods_cate_list as $item) {
  211. if (empty($item['parent_id'])) continue;
  212. $parent_id = $item['parent_id'];
  213. if (!isset($arr[$parent_id])) continue;
  214. $parent_cate_id = $arr[$parent_id];
  215. if (!isset($arr[$item['id']])) continue;
  216. $cate_id = $arr[$item['id']];
  217. StoreGoodsCate::updateAll(['parent_id' => $parent_cate_id], ['id' => $cate_id]);
  218. }
  219. }
  220. //同步商品
  221. public static function syncGoodsData($self_store_id, $source_store_id)
  222. {
  223. $now = time();
  224. $i = 1;
  225. $page_size = 1000;
  226. while ($goods_list = StoreGoods::find()
  227. ->where(['store_id' => $source_store_id, 'status' => [StatusEnum::ENABLED, StatusEnum::DISABLED]])
  228. ->andWhere(['or', ['goods_source' => null], ['goods_source' => '']])
  229. ->with(['cats', 'attr', 'extra'])
  230. ->offset(($i - 1) * $page_size)->orderBy('id asc')->asArray()->limit($page_size)->all()) {
  231. $goods_ids = array_column($goods_list, 'id');
  232. $sync_goods_logs_list = StoreSyncGoodsLogs::lists([
  233. 'where' => [
  234. ['self_store_id' => $self_store_id], ['source_store_id' => $source_store_id], ['source_goods_id' => $goods_ids]
  235. ],
  236. ]);
  237. $sync_goods_logs_goods_ids = array_column($sync_goods_logs_list, 'source_goods_id');
  238. $goods_ids = array_diff($goods_ids, $sync_goods_logs_goods_ids);
  239. if (!empty($goods_ids)) {
  240. $goods_cate_relate_list = StoreGoodsCateRelate::lists(['where' => [['goods_id' => $goods_ids]]]);
  241. $goods_cate_ids = array_column($goods_cate_relate_list, 'cate_id');
  242. $goods_cate_sync_logs_list = StoreCommonSyncLogs::lists([
  243. 'where' => [
  244. ['type' => 'GoodsCate'],
  245. ['self_store_id' => $self_store_id],
  246. ['source_store_id' => $source_store_id],
  247. ['source_type_id' => $goods_cate_ids],
  248. ],
  249. 'index' => 'source_type_id',
  250. ]);
  251. $goods_cate_relate_arr = [];
  252. foreach ($goods_cate_relate_list as $val) {
  253. $goods_cate_relate_arr[$val['goods_id']][] = $val['cate_id'];
  254. }
  255. foreach ($goods_list as $goods) {
  256. if (!in_array($goods['id'], $goods_ids)) continue;
  257. $cats = [];
  258. if (isset($goods_cate_relate_arr[$goods['id']])) {
  259. foreach ($goods_cate_relate_arr[$goods['id']] as $cid) {
  260. if (isset($goods_cate_sync_logs_list[$cid])) {
  261. $cats[] = $goods_cate_sync_logs_list[$cid]['type_id'];
  262. }
  263. }
  264. }
  265. $add_goods_data = $goods;
  266. $add_goods_data['mall_id'] = $goods['mall_id'];
  267. $add_goods_data['store_id'] = $self_store_id;
  268. unset($add_goods_data['id']);
  269. $add_goods_data['cats'] = $cats;
  270. $source_goods_id = $goods['id'];
  271. //更新运费模板
  272. if (!empty($goods['freight_id'])) {
  273. $freight_rules_sync_logs_list = StoreCommonSyncLogs::lists([
  274. 'where' => [
  275. ['type' => 'FreightRules'],
  276. ['self_store_id' => $self_store_id],
  277. ['source_store_id' => $source_store_id],
  278. ],
  279. 'index' => 'source_type_id',
  280. ]);
  281. if (isset($freight_rules_sync_logs_list[$goods['freight_id']])) {
  282. $goods['freight_id'] = $freight_rules_sync_logs_list[$goods['freight_id']]['type_id'];
  283. }
  284. }
  285. //添加商品
  286. $goods_model = new StoreGoods();
  287. unset($goods['id']);
  288. $goods_model->attributes = $goods;
  289. $goods_model->store_id = $self_store_id;
  290. $goods_model->supplier_id = $self_store_id;
  291. $goods_model->is_on_sale = 0;
  292. $goods_model->save();
  293. $goods_id = $goods_model->id;
  294. self::addSyncGoodsLogs($self_store_id, $source_store_id, $goods_id, $source_goods_id, $goods['mall_id']);
  295. //商品规格
  296. if (!empty($goods['attr'])) {
  297. self::addGoodsAttr($goods_id, $goods['attr'], $now);
  298. }
  299. //商品分类关联
  300. if (!empty($cats)) {
  301. self::addGoodsCateRelate($cats, $goods_id, $now);
  302. }
  303. //额外信息
  304. if (!empty($goods['extra'])) {
  305. self::addGoodExtra($goods['mall_id'], $self_store_id, $goods_id, $goods['extra']);
  306. }
  307. //编辑商品触发
  308. $event = new GoodsEditEvent($goods_model->mall_id);
  309. $data['goods_id'] = $goods_id;
  310. $data['store_id'] = $self_store_id;
  311. $data['mall_id'] = $goods_model->mall_id;
  312. Yii::$app->services->events->dispatch($event, $data, $event->listeners);
  313. // //预约商品
  314. if ($goods['goods_type'] == 3) {
  315. self::syncGoodsReserve($self_store_id, $source_store_id, $goods_id, $source_goods_id, StoreGoodsReserve::class);
  316. self::syncGoodsReserve($self_store_id, $source_store_id, $goods_id, $source_goods_id, StoreGoodsReserveSku::class);
  317. }
  318. if (MallAddons::isInstall($goods_model->mall_id, AddonsEnum::ADDONS_NAME_DEVOTE)) {
  319. //红包贡献值
  320. self::syncDevoteGoodsSetting($self_store_id, $source_store_id, $goods_id, $source_goods_id, \addons\Devote\common\models\DevoteGoodsSetting::class);
  321. }
  322. //商品模式
  323. self::syncStoreGoodsModel($self_store_id, $source_store_id, $goods_id, $source_goods_id, StoreGoodsModel::class);
  324. var_dump($goods_id);
  325. }
  326. }
  327. $i++;
  328. }
  329. }
  330. protected static function addSyncGoodsLogs($self_store_id, $source_store_id, $goods_id, $source_goods_id, $mall_id)
  331. {
  332. $model = new StoreSyncGoodsLogs();
  333. $model->mall_id = $mall_id;
  334. $model->self_store_id = $self_store_id;
  335. $model->source_store_id = $source_store_id;
  336. $model->goods_id = $goods_id;
  337. $model->source_goods_id = $source_goods_id;
  338. $model->save();
  339. }
  340. //商品规格
  341. protected static function addGoodsAttr($goods_id, $attr_arr, $now)
  342. {
  343. $insert = [];
  344. foreach ($attr_arr as $goods_attr) {
  345. $insert[] = [
  346. $goods_id,
  347. $goods_attr['name'],
  348. $goods_attr['sign_id'],
  349. $goods_attr['stock'],
  350. $goods_attr['price'],
  351. $goods_attr['original_price'],
  352. $goods_attr['cost_price'],
  353. $goods_attr['goods_no'],
  354. $goods_attr['weight'],
  355. $goods_attr['pic_url'],
  356. $goods_attr['version'],
  357. $goods_attr['sort'],
  358. $now, $now];
  359. }
  360. $field = ['goods_id', 'name', 'sign_id', 'stock', 'price', 'original_price', 'cost_price', 'goods_no', 'weight',
  361. 'pic_url', 'version', 'sort', 'created_at', 'updated_at'];
  362. // 批量插入数据,商品规格
  363. Yii::$app->db->createCommand()->batchInsert(StoreGoodsAttr::tableName(), $field, $insert)->execute();
  364. }
  365. //商品与分类关联
  366. protected static function addGoodsCateRelate($cats, $goods_id, $now)
  367. {
  368. $insert = [];
  369. foreach ($cats as $cid) {
  370. $insert[] = [$goods_id, $cid, $now, $now];
  371. }
  372. $field = ['goods_id', 'cate_id', 'created_at', 'updated_at'];
  373. // 批量插入数据,商品分类关联
  374. Yii::$app->db->createCommand()->batchInsert(StoreGoodsCateRelate::tableName(), $field, $insert)->execute();
  375. }
  376. //商品额外信息
  377. protected static function addGoodExtra($mall_id, $store_id, $goods_id, $extra)
  378. {
  379. // 批量插入数据,商品规格
  380. $goods_extra_model = new StoreGoodsExtra();
  381. $goods_extra_model->mall_id = $mall_id;
  382. $goods_extra_model->store_id = $store_id;
  383. $goods_extra_model->goods_id = $goods_id;
  384. $goods_extra_model->full_reduce_money = $extra['full_reduce_money'];
  385. $goods_extra_model->full_reduce_price_limit = $extra['full_reduce_price_limit'];
  386. $goods_extra_model->score_give_setting = $extra['score_give_setting'];
  387. $goods_extra_model->score_deduct_setting = $extra['score_deduct_setting'];
  388. $goods_extra_model->currency_deduct_setting = $extra['currency_deduct_setting'];
  389. $goods_extra_model->is_member_price = $extra['is_member_price'];
  390. $goods_extra_model->member_price_setting = $extra['member_price_setting'];
  391. $goods_extra_model->member_buy_limit_setting = $extra['member_buy_limit_setting'];
  392. $goods_extra_model->status = $extra['status'];
  393. $goods_extra_model->is_repurchase = $extra['is_repurchase'];
  394. $goods_extra_model->repurchase_setting = $extra['repurchase_setting'];
  395. $goods_extra_model->is_alone_settle = $extra['is_alone_settle'];
  396. $goods_extra_model->alone_settle_price = $extra['alone_settle_price'];
  397. $goods_extra_model->save();
  398. }
  399. //关联商品
  400. public static function syncGoodsAssociation($self_store_id, $source_store_id)
  401. {
  402. $now = time();
  403. $i = 1;
  404. $sync_goods_logs_list = StoreSyncGoodsLogs::lists([
  405. 'where' => [
  406. ['self_store_id' => $self_store_id], ['source_store_id' => $source_store_id],
  407. ],
  408. 'index' => 'source_goods_id'
  409. ]);
  410. if (empty($sync_goods_logs_list)) {
  411. return true;
  412. }
  413. $page_size = 1000;
  414. while ($goods_list = GoodsAssociation::find()
  415. ->where(['store_id' => $source_store_id, 'status' => [StatusEnum::ENABLED, StatusEnum::DISABLED]])
  416. ->offset(($i - 1) * $page_size)->orderBy('id asc')->asArray()->limit($page_size)->all()) {
  417. $type = 'GoodsAssociation';
  418. $ids = array_column($goods_list, 'id');
  419. $source_type_ids = StoreCommonSyncLogs::getTypeIds($self_store_id, $source_store_id, $type, $ids);
  420. foreach ($goods_list as &$item) {
  421. if (in_array($item['id'], $source_type_ids)) continue;
  422. for ($i = 1; $i < 11; $i++) {
  423. $item_name = 'extra' . $i . '_goods_id';
  424. $extra_goods_id = json_decode($item[$item_name], true);
  425. if (!empty($extra_goods_id)) {
  426. $new_goods = [];
  427. foreach ($extra_goods_id as $goods_id) {
  428. if (isset($sync_goods_logs_list[$goods_id])) {
  429. $new_goods[] = $sync_goods_logs_list[$goods_id]['goods_id'];
  430. }
  431. }
  432. if ($new_goods) {
  433. $item[$item_name] = json_encode($new_goods);
  434. }
  435. }
  436. }
  437. $new_goods_id = $sync_goods_logs_list[$item['goods_id']]['goods_id'];
  438. if (empty($new_goods_id)) {
  439. continue;
  440. }
  441. $source_type_id = $item['id'];
  442. $model = new GoodsAssociation();
  443. unset($item['id']);
  444. $model->attributes = $item;
  445. $model->store_id = $self_store_id;
  446. $model->goods_id = $new_goods_id;
  447. $model->save();
  448. StoreCommonSyncLogs::add($self_store_id, $source_store_id, $source_type_id, $type, $model->id, $model->mall_id);
  449. }
  450. $i++;
  451. }
  452. }
  453. public static function syncStore($self_store_id, $source_store_id)
  454. {
  455. $select = [
  456. 'mall_id',
  457. 'business_time_start',
  458. 'business_time_end',
  459. 'store_style',
  460. 'commission_authority',
  461. 'share_title',
  462. 'share_desc',
  463. 'share_pic',
  464. 'freight_type',
  465. 'intra_city_distribution',
  466. 'shop_status',
  467. 'scan_code_bind',
  468. 'pickup',
  469. 'is_show_wechat_video_number',
  470. 'is_show_coupon',
  471. // 'default_store_cate_style',
  472. // 'store_category_switch',
  473. 'show_sync_goods',
  474. 'payment_settlement_type'
  475. ];
  476. $source_store_info = Store::find()
  477. ->where(['id' => $source_store_id])
  478. ->select($select)
  479. ->asArray()
  480. ->one();
  481. $model = Store::find()
  482. ->where(['id' => $self_store_id])
  483. ->one();
  484. $model->attributes = $source_store_info;
  485. $model->save();
  486. }
  487. public static function syncStoreSettings($self_store_id, $source_store_id, $mall_id)
  488. {
  489. $type = 'StoreSettings';
  490. $setting = StoreSettings::find()
  491. ->where(['store_id' => $source_store_id, 'status' => [StatusEnum::ENABLED, StatusEnum::DISABLED]])
  492. ->asArray()
  493. ->one();
  494. if (empty($setting)) {
  495. return true;
  496. }
  497. $source_type_id = $setting['id'];
  498. $source_type_ids = StoreCommonSyncLogs::getTypeIds($self_store_id, $source_store_id, $type, [$source_type_id]);
  499. if (in_array($source_type_id, $source_type_ids)) return true;
  500. $setting['store_id'] = $self_store_id;
  501. if ($setting['store_service_fee'] == 2) {
  502. $setting['store_service_fee'] = 0;
  503. $setting['huifu_mch_no'] = '';
  504. }
  505. $model = new StoreSettings();
  506. unset($setting['id'], $setting['is_customer'], $setting['customer_types']);
  507. $model->attributes = $setting;
  508. $model->save();
  509. $addons_store_score_give_setting = Yii::$app->services->setting->addons->get($mall_id, StoreEnum::ADDONS_NAME, 'scoreGive');
  510. $addons_store_payment_setting = Yii::$app->services->setting->addons->get($mall_id, StoreEnum::ADDONS_NAME, 'payment');
  511. //积分赠送,如果指定门店包含了$source_store_id, $self_store_id也加进去
  512. if ($addons_store_score_give_setting['store_limit_type'] && $addons_store_score_give_setting['store_limit_stores']) {
  513. $score_give_limit_store = json_decode($addons_store_score_give_setting['store_limit_stores'], true);
  514. if ($score_give_limit_store && in_array($source_store_id, $score_give_limit_store)) {
  515. array_push($score_give_limit_store, $self_store_id);
  516. }
  517. \Yii::$app->services->setting->addons->set($mall_id, StoreEnum::ADDONS_NAME, [
  518. 'scoreGive' => [
  519. 'store_limit_stores' => $score_give_limit_store
  520. ]
  521. ]);
  522. }
  523. //积分抵扣,如果指定门店包含了$source_store_id, $self_store_id也加进去
  524. if ($addons_store_payment_setting['score_deduction']) {
  525. $score_deduction = json_decode($addons_store_payment_setting['score_deduction'], true);
  526. if ($score_deduction['store_limit_stores_deduction'] && $score_deduction['store_limit_type'] && isset($score_deduction['store_limit_stores_deduction'][$source_store_id])) {
  527. $score_deduction['store_limit_stores_deduction'][$self_store_id] = '';
  528. \Yii::$app->services->setting->addons->set($mall_id, StoreEnum::ADDONS_NAME, [
  529. 'payment' => [
  530. 'score_deduction' => $score_deduction
  531. ]
  532. ]);
  533. }
  534. }
  535. StoreCommonSyncLogs::add($self_store_id, $source_store_id, $source_type_id, $type, $model->id, $model->mall_id);
  536. }
  537. public static function syncGoodsReserve($self_store_id, $source_store_id, $goods_id, $source_goods_id, $class)
  538. {
  539. $where[] = ['store_id' => $source_store_id];
  540. $where[] = ['goods_id' => $source_goods_id];
  541. $list = $class::lists([
  542. 'where' => $where,
  543. 'order' => 'id asc',
  544. ]);
  545. foreach ($list as $item) {
  546. $model = new $class();
  547. $item['store_id'] = $self_store_id;
  548. $item['goods_id'] = $goods_id;
  549. $model->attributes = $item;
  550. $model->save();
  551. }
  552. }
  553. public static function syncSecondaryCard($self_store_id, $source_store_id, $mall_id)
  554. {
  555. $type = 'SecondaryCard';
  556. $class = new \addons\SecondaryCard\common\models\SecondaryCard();
  557. $list = $class::lists([
  558. 'alias' => 'sc',
  559. 'where' => [
  560. ['sc.mall_id' => $mall_id],
  561. [
  562. 'or',
  563. ['sc.use_type' => 0],
  564. ['scrs.store_id' => $source_store_id, 'scrs.store_type' => 1]
  565. ]
  566. ],
  567. 'join' => [['left join', \addons\SecondaryCard\common\models\SecondaryCardRelateStore::tableName() . ' as scrs', 'sc.id = scrs.secondary_card_id']]
  568. ]);
  569. if (empty($list)) {
  570. return true;
  571. }
  572. $ids = array_column($list, 'id');
  573. $source_type_ids = StoreCommonSyncLogs::getTypeIds($self_store_id, $source_store_id, $type, $ids);
  574. foreach ($list as $item) {
  575. if (in_array($item['id'], $source_type_ids)) continue;
  576. if ($item['create_source_type'] == 0) {
  577. continue;
  578. }
  579. $source_type_id = $item['id'];
  580. unset($item['id']);
  581. $model = new $class();
  582. if ($item['create_source_type'] == 1) {
  583. $item['create_source_id'] = $self_store_id;
  584. }
  585. $item['is_on_sales'] = 0;
  586. $model->attributes = $item;
  587. $model->save();
  588. StoreCommonSyncLogs::add($self_store_id, $source_store_id, $source_type_id, $type, $model->id, $model->mall_id);
  589. }
  590. }
  591. public static function syncSecondaryCardRelateStore($self_store_id, $source_store_id, $mall_id)
  592. {
  593. $type = 'SecondaryCardRelateStore';
  594. $class = new \addons\SecondaryCard\common\models\SecondaryCardRelateStore();
  595. $secondary_card_list = \addons\SecondaryCard\common\models\SecondaryCard::lists([
  596. 'alias' => 'sc',
  597. 'where' => [
  598. ['sc.mall_id' => $mall_id],
  599. [
  600. 'or',
  601. ['sc.use_type' => 0],
  602. ['scrs.store_id' => $source_store_id, 'scrs.store_type' => 1]
  603. ]
  604. ],
  605. 'join' => [['left join', \addons\SecondaryCard\common\models\SecondaryCardRelateStore::tableName() . ' as scrs', 'sc.id = scrs.secondary_card_id']],
  606. 'index' => 'id'
  607. ]);
  608. if (empty($secondary_card_list)) {
  609. return true;
  610. }
  611. //获取已同步的次卡
  612. $sync_list = StoreCommonSyncLogs::lists([
  613. 'where' => [
  614. ['type' => 'SecondaryCard'],
  615. ['self_store_id' => $self_store_id],
  616. ['source_store_id' => $source_store_id],
  617. ],
  618. 'index' => 'source_type_id'
  619. ]);
  620. $where = [];
  621. $where[] = ['store_id' => $source_store_id];
  622. $where[] = ['status' => [StatusEnum::ENABLED, StatusEnum::DISABLED]];
  623. $list = $class::lists([
  624. 'where' => $where,
  625. 'order' => 'id asc',
  626. ]);
  627. if (empty($list)) {
  628. return true;
  629. }
  630. $ids = array_column($list, 'id');
  631. $source_type_ids = StoreCommonSyncLogs::getTypeIds($self_store_id, $source_store_id, $type, $ids);
  632. foreach ($list as $item) {
  633. if (in_array($item['id'], $source_type_ids)) continue;
  634. if (!isset($secondary_card_list[$item['secondary_card_id']])) continue;
  635. $secondary_card = $secondary_card_list[$item['secondary_card_id']];
  636. if ($secondary_card['create_source_type'] == 0) {
  637. $secondary_card_id = $secondary_card['id'];
  638. } else {
  639. if (!isset($sync_list[$item['secondary_card_id']]['type_id'])) continue;
  640. $secondary_card_id = $sync_list[$item['secondary_card_id']]['type_id'];
  641. }
  642. $source_type_id = $item['id'];
  643. unset($item['id']);
  644. $model = new $class();
  645. $item['secondary_card_id'] = $secondary_card_id;
  646. $item['store_id'] = $self_store_id;
  647. $model->attributes = $item;
  648. $model->save();
  649. StoreCommonSyncLogs::add($self_store_id, $source_store_id, $source_type_id, $type, $model->id, $model->mall_id);
  650. }
  651. }
  652. public static function syncStoreCashierExtra($self_store_id, $source_store_id, $mall_id)
  653. {
  654. $is_install_coupon = MallAddons::isInstall($mall_id, AddonsEnum::ADDONS_NAME_COUPON);
  655. StoreCashierExtra::updateAll([
  656. 'status' => StatusEnum::DELETE
  657. ], [
  658. 'store_id' => $self_store_id,
  659. 'mall_id' => $mall_id
  660. ]);
  661. $type = 'StoreCashierExtra';
  662. $class = new StoreCashierExtra();
  663. $where = [];
  664. $where[] = ['store_id' => $source_store_id];
  665. $where[] = ['status' => [StatusEnum::ENABLED, StatusEnum::DISABLED]];
  666. $list = $class::lists([
  667. 'where' => $where,
  668. 'order' => 'id asc',
  669. ]);
  670. if (empty($list)) {
  671. return true;
  672. }
  673. $ids = array_column($list, 'id');
  674. $source_type_ids = StoreCommonSyncLogs::getTypeIds($self_store_id, $source_store_id, $type, $ids);
  675. $limit_coupon_ids = [];
  676. foreach ($list as $item) {
  677. if (in_array($item['id'], $source_type_ids)) continue;
  678. if ($item['score_give_setting']) {
  679. $score_give_setting = json_decode($item['score_give_setting'], true);
  680. if ($score_give_setting['coupon_id']) {
  681. $limit_coupon_ids[] = $score_give_setting['coupon_id'];
  682. }
  683. }
  684. if ($item['score_deduct_setting']) {
  685. $score_give_setting = json_decode($item['score_deduct_setting'], true);
  686. if ($score_give_setting['coupon_id']) {
  687. $limit_coupon_ids[] = $score_give_setting['coupon_id'];
  688. }
  689. }
  690. $source_type_id = $item['id'];
  691. unset($item['id']);
  692. $model = new $class();
  693. $item['store_id'] = $self_store_id;
  694. $model->attributes = $item;
  695. $model->save();
  696. StoreCommonSyncLogs::add($self_store_id, $source_store_id, $source_type_id, $type, $model->id, $model->mall_id);
  697. }
  698. if ($is_install_coupon && $limit_coupon_ids) {
  699. //指定门店内容增加$self_store_id
  700. foreach ($limit_coupon_ids as $coupon_id) {
  701. $coupon_info = AddonsCoupon::find()->where(['id' => $coupon_id, 'mall_id' => $mall_id])->one();
  702. if (empty($coupon_info)) {
  703. continue;
  704. }
  705. $store_id = $coupon_info->store_id;
  706. if ($store_id) {
  707. $store_id_array = explode(',', $store_id);
  708. array_push($store_id_array, $self_store_id);
  709. $store_id_array = implode(',', $store_id_array);
  710. $coupon_info->store_id = $store_id_array;
  711. $coupon_info->save();
  712. }
  713. }
  714. }
  715. }
  716. public static function syncStoreBossAgentLevel($self_store_id, $source_store_id)
  717. {
  718. $type = 'StoreBossAgentLevel';
  719. $class = new StoreBossAgentLevel();
  720. $where = [];
  721. $where[] = ['store_id' => $source_store_id];
  722. $where[] = ['status' => [StatusEnum::ENABLED, StatusEnum::DISABLED]];
  723. $list = $class::lists([
  724. 'where' => $where,
  725. 'order' => 'id asc',
  726. ]);
  727. if (empty($list)) {
  728. return true;
  729. }
  730. $ids = array_column($list, 'id');
  731. $source_type_ids = StoreCommonSyncLogs::getTypeIds($self_store_id, $source_store_id, $type, $ids);
  732. $goods_ids = $self_good_list = [];
  733. foreach ($list as $item) {
  734. if ($item['upgrade_type_goods'] && $item['goods_type'] == 2 && json_decode($item['goods_warehouse_ids'], true)) {
  735. $tempArray = json_decode($item['goods_warehouse_ids'], true);
  736. $goods_ids = array_merge($goods_ids, $tempArray);
  737. }
  738. }
  739. if ($goods_ids) {
  740. $sync_goods_logs_list = StoreSyncGoodsLogs::lists([
  741. 'where' => [
  742. ['self_store_id' => $self_store_id], ['source_store_id' => $source_store_id], ['source_goods_id' => $goods_ids]
  743. ],
  744. ]);
  745. $self_good_ids = array_column($sync_goods_logs_list, 'goods_id');
  746. $sync_goods_logs_id_list = array_column($sync_goods_logs_list, 'goods_id', 'source_goods_id');
  747. $self_goods_list = StoreGoods::lists([
  748. 'where' => [['id' => $self_good_ids], ['status' => [StatusEnum::ENABLED, StatusEnum::DISABLED]]],
  749. 'select' => ['id', 'goods_name as name', 'cover_pic'],
  750. 'index' => 'id'
  751. ]);
  752. }
  753. foreach ($list as $item) {
  754. if (in_array($item['id'], $source_type_ids)) continue;
  755. $self_warehouse_insert_ids = $self_goods_insert_list = [];
  756. if ($item['upgrade_type_goods'] && $item['goods_type'] == 2 && json_decode($item['goods_warehouse_ids'], true)) {
  757. $goods_warehouse_ids = json_decode($item['goods_warehouse_ids']);
  758. foreach ($goods_warehouse_ids as $id) {
  759. if (isset($sync_goods_logs_id_list[$id])) {
  760. $self_warehouse_insert_ids[] = $sync_goods_logs_id_list[$id];
  761. $self_goods_insert_list[] = $self_goods_list[$sync_goods_logs_id_list[$id]] ?? [];
  762. }
  763. }
  764. $item['goods_warehouse_ids'] = json_encode($self_warehouse_insert_ids);
  765. $item['goods_list'] = json_encode($self_goods_insert_list);
  766. }
  767. $source_type_id = $item['id'];
  768. unset($item['id']);
  769. $model = new $class();
  770. $item['store_id'] = $self_store_id;
  771. $model->attributes = $item;
  772. $model->save();
  773. StoreCommonSyncLogs::add($self_store_id, $source_store_id, $source_type_id, $type, $model->id, $model->mall_id);
  774. }
  775. }
  776. public static function updateStoreStatus($store_id, $status)
  777. {
  778. $model = Store::find()
  779. ->where(['id' => $store_id])
  780. ->one();
  781. $model->sync_status = $status;
  782. $model->save();
  783. }
  784. public static function syncStoreExtra($self_store_id, $source_store_id)
  785. {
  786. $type = 'StoreExtra';
  787. $where[] = ['store_id' => $source_store_id];
  788. $where[] = ['status' => [StatusEnum::ENABLED, StatusEnum::DISABLED]];
  789. $list = StoreExtra::lists([
  790. 'where' => $where,
  791. 'order' => 'id asc',
  792. ]);
  793. if (empty($list)) {
  794. return true;
  795. }
  796. $ids = array_column($list, 'id');
  797. $source_type_ids = StoreCommonSyncLogs::getTypeIds($self_store_id, $source_store_id, $type, $ids);
  798. $sync_coupon_list = StoreCommonSyncLogs::lists([
  799. 'where' => [
  800. ['type' => 'StoreCoupon'],
  801. ['self_store_id' => $self_store_id],
  802. ['source_store_id' => $source_store_id],
  803. ],
  804. 'index' => 'source_type_id'
  805. ]);
  806. foreach ($list as $item) {
  807. if (in_array($item['id'], $source_type_ids)) continue;
  808. $model = new StoreExtra();
  809. $item['store_id'] = $self_store_id;
  810. $give_setting = json_decode($item['give_setting'], true);
  811. if ($give_setting) {
  812. if ($give_setting['coupon_give']['coupon_id1'] && isset($sync_coupon_list[$give_setting['coupon_give']['coupon_id1']]['type_id'])) {
  813. $give_setting['coupon_give']['coupon_id1'] = $sync_coupon_list[$give_setting['coupon_give']['coupon_id1']]['type_id'];
  814. }
  815. if ($give_setting['coupon_give']['coupon_id2'] && isset($sync_coupon_list[$give_setting['coupon_give']['coupon_id2']]['type_id'])) {
  816. $give_setting['coupon_give']['coupon_id2'] = $sync_coupon_list[$give_setting['coupon_give']['coupon_id2']]['type_id'];
  817. }
  818. $item['give_setting'] = json_encode($give_setting);
  819. }
  820. $source_type_id = $item['id'];
  821. unset($item['id']);
  822. $model->attributes = $item;
  823. $model->save();
  824. StoreCommonSyncLogs::add($self_store_id, $source_store_id, $source_type_id, $type, $model->id, $model->mall_id);
  825. }
  826. }
  827. public static function syncStoreCoupon($self_store_id, $source_store_id)
  828. {
  829. $class = StoreCoupon::class;
  830. $type = 'StoreCoupon';
  831. $where[] = ['store_id' => $source_store_id];
  832. $where[] = ['status' => [StatusEnum::ENABLED, StatusEnum::DISABLED]];
  833. $list = $class::lists([
  834. 'where' => $where,
  835. 'order' => 'id asc',
  836. ]);
  837. if (empty($list)) {
  838. return true;
  839. }
  840. $ids = array_column($list, 'id');
  841. $source_type_ids = StoreCommonSyncLogs::getTypeIds($self_store_id, $source_store_id, $type, $ids);
  842. foreach ($list as $item) {
  843. if (in_array($item['id'], $source_type_ids)) continue;
  844. $source_type_id = $item['id'];
  845. unset($item['id']);
  846. $model = new $class();
  847. $item['store_id'] = $self_store_id;
  848. $item['is_open_screen'] = 0;
  849. $item['is_public_receive'] = 0;
  850. $model->attributes = $item;
  851. $model->save();
  852. StoreCommonSyncLogs::add($self_store_id, $source_store_id, $source_type_id, $type, $model->id, $model->mall_id);
  853. }
  854. }
  855. public static function syncStoreCouponCatRelate($self_store_id, $source_store_id, $mall_id)
  856. {
  857. $class = StoreCouponCatRelate::class;
  858. $type = 'StoreCouponCatRelate';
  859. //同步的优惠券
  860. $sync_coupon_list = StoreCommonSyncLogs::lists([
  861. 'where' => [
  862. ['type' => 'StoreCoupon'],
  863. ['self_store_id' => $self_store_id],
  864. ['source_store_id' => $source_store_id],
  865. ],
  866. 'index' => 'source_type_id'
  867. ]);
  868. if (empty($sync_coupon_list)) {
  869. return true;
  870. }
  871. $coupon_id = array_column($sync_coupon_list, 'source_type_id');
  872. $where[] = ['coupon_id' => $coupon_id];
  873. $where[] = ['status' => [StatusEnum::ENABLED, StatusEnum::DISABLED]];
  874. $list = $class::lists([
  875. 'where' => $where,
  876. 'order' => 'id asc',
  877. ]);
  878. if (empty($list)) {
  879. return true;
  880. }
  881. $ids = array_column($list, 'id');
  882. $source_type_ids = StoreCommonSyncLogs::getTypeIds($self_store_id, $source_store_id, $type, $ids);
  883. $cate_id = array_column($list, 'cate_id');
  884. //同步的优惠券
  885. $sync_cate_list = StoreCommonSyncLogs::lists([
  886. 'where' => [
  887. ['type' => 'GoodsCate'],
  888. ['self_store_id' => $self_store_id],
  889. ['source_store_id' => $source_store_id],
  890. ['source_type_id' => $cate_id],
  891. ],
  892. 'index' => 'source_type_id'
  893. ]);
  894. if (empty($sync_cate_list)) {
  895. return true;
  896. }
  897. foreach ($list as $item) {
  898. if (in_array($item['id'], $source_type_ids)) continue;
  899. $source_type_id = $item['id'];
  900. unset($item['id']);
  901. $new_cate_id = $sync_cate_list[$item['cate_id']]['type_id'];
  902. if (empty($new_cate_id)) {
  903. continue;
  904. }
  905. $new_coupon_id = $sync_coupon_list[$item['coupon_id']]['type_id'];
  906. if (empty($new_coupon_id)) {
  907. continue;
  908. }
  909. $model = new $class();
  910. $item['coupon_id'] = $new_coupon_id;
  911. $item['cate_id'] = $new_cate_id;
  912. $model->attributes = $item;
  913. $model->save();
  914. StoreCommonSyncLogs::add($self_store_id, $source_store_id, $source_type_id, $type, $model->id, $mall_id);
  915. }
  916. }
  917. public static function syncStoreCouponGoodsRelate($self_store_id, $source_store_id, $mall_id)
  918. {
  919. $class = StoreCouponGoodsRelate::class;
  920. $type = 'StoreCouponGoodsRelate';
  921. //同步的优惠券
  922. $sync_coupon_list = StoreCommonSyncLogs::lists([
  923. 'where' => [
  924. ['type' => 'StoreCoupon'],
  925. ['self_store_id' => $self_store_id],
  926. ['source_store_id' => $source_store_id],
  927. ],
  928. 'index' => 'source_type_id'
  929. ]);
  930. if (empty($sync_coupon_list)) {
  931. return true;
  932. }
  933. $coupon_id = array_column($sync_coupon_list, 'source_type_id');
  934. $where[] = ['coupon_id' => $coupon_id];
  935. $where[] = ['status' => [StatusEnum::ENABLED, StatusEnum::DISABLED]];
  936. $list = $class::lists([
  937. 'where' => $where,
  938. 'order' => 'id asc',
  939. ]);
  940. if (empty($list)) {
  941. return true;
  942. }
  943. $ids = array_column($list, 'id');
  944. $source_type_ids = StoreCommonSyncLogs::getTypeIds($self_store_id, $source_store_id, $type, $ids);
  945. $goods_id = array_column($list, 'goods_id');
  946. $sync_goods_logs_list = StoreSyncGoodsLogs::lists([
  947. 'where' => [
  948. ['self_store_id' => $self_store_id], ['source_store_id' => $source_store_id], ['source_goods_id' => $goods_id]
  949. ],
  950. 'index' => 'source_goods_id'
  951. ]);
  952. if (empty($sync_goods_logs_list)) {
  953. return true;
  954. }
  955. foreach ($list as $item) {
  956. if (in_array($item['id'], $source_type_ids)) continue;
  957. $source_type_id = $item['id'];
  958. unset($item['id']);
  959. $new_goods_id = $sync_goods_logs_list[$item['goods_id']]['goods_id'];
  960. if (empty($new_goods_id)) {
  961. continue;
  962. }
  963. $new_coupon_id = $sync_coupon_list[$item['coupon_id']]['type_id'];
  964. if (empty($new_coupon_id)) {
  965. continue;
  966. }
  967. $model = new $class();
  968. $item['coupon_id'] = $new_coupon_id;
  969. $item['goods_id'] = $new_goods_id;
  970. $model->attributes = $item;
  971. $model->save();
  972. StoreCommonSyncLogs::add($self_store_id, $source_store_id, $source_type_id, $type, $model->id, $mall_id);
  973. }
  974. }
  975. public static function syncDevoteGoodsSetting($self_store_id, $source_store_id, $goods_id, $source_goods_id, $class)
  976. {
  977. $type = 'DevoteGoodsSetting';
  978. $where[] = ['goods_id' => $source_goods_id];
  979. $where[] = ['status' => [StatusEnum::ENABLED, StatusEnum::DISABLED]];
  980. $list = $class::lists([
  981. 'where' => $where,
  982. 'order' => 'id asc',
  983. ]);
  984. if (empty($list)) {
  985. return true;
  986. }
  987. $ids = array_column($list, 'id');
  988. $source_type_ids = StoreCommonSyncLogs::getTypeIds($self_store_id, $source_store_id, $type, $ids);
  989. foreach ($list as $item) {
  990. if (in_array($item['id'], $source_type_ids)) continue;
  991. $source_type_id = $item['id'];
  992. unset($item['id']);
  993. $model = new $class();
  994. $item['goods_id'] = $goods_id;
  995. $item['store_id'] = $self_store_id;
  996. $model->attributes = $item;
  997. $model->save();
  998. StoreCommonSyncLogs::add($self_store_id, $source_store_id, $source_type_id, $type, $model->id, $model->mall_id);
  999. }
  1000. }
  1001. public static function syncStoreGoodsModel($self_store_id, $source_store_id, $goods_id, $source_goods_id, $class)
  1002. {
  1003. $type = 'StoreGoodsModel';
  1004. $where[] = ['goods_id' => $source_goods_id];
  1005. $where[] = ['status' => [StatusEnum::ENABLED, StatusEnum::DISABLED]];
  1006. $list = $class::lists([
  1007. 'where' => $where,
  1008. 'order' => 'id asc',
  1009. ]);
  1010. if (empty($list)) {
  1011. return true;
  1012. }
  1013. $ids = array_column($list, 'id');
  1014. $source_type_ids = StoreCommonSyncLogs::getTypeIds($self_store_id, $source_store_id, $type, $ids);
  1015. foreach ($list as $item) {
  1016. if (in_array($item['id'], $source_type_ids)) continue;
  1017. $source_type_id = $item['id'];
  1018. unset($item['id']);
  1019. $model = new $class();
  1020. $item['goods_id'] = $goods_id;
  1021. $item['store_id'] = $self_store_id;
  1022. $model->attributes = $item;
  1023. $model->save();
  1024. StoreCommonSyncLogs::add($self_store_id, $source_store_id, $source_type_id, $type, $model->id, $model->mall_id);
  1025. }
  1026. }
  1027. public static function syncStoreCouponGiveItemSetting($self_store_id, $source_store_id, $mall_id)
  1028. {
  1029. $type = 'StoreCouponGiveItemSetting';
  1030. $class = StoreCouponGiveItemSetting::class;
  1031. $where[] = ['mall_id' => $mall_id];
  1032. $where[] = ['store_id' => $source_store_id];
  1033. $where[] = ['item_type' => 'goods'];
  1034. $where[] = ['status' => [StatusEnum::ENABLED, StatusEnum::DISABLED]];
  1035. $list = $class::lists([
  1036. 'where' => $where,
  1037. 'order' => 'id asc',
  1038. ]);
  1039. if (empty($list)) {
  1040. return true;
  1041. }
  1042. $goods_id = array_column($list, 'item_id');
  1043. $sync_goods_logs_list = StoreSyncGoodsLogs::lists([
  1044. 'where' => [
  1045. ['self_store_id' => $self_store_id], ['source_store_id' => $source_store_id], ['source_goods_id' => $goods_id]
  1046. ],
  1047. 'index' => 'source_goods_id'
  1048. ]);
  1049. if (empty($sync_goods_logs_list)) {
  1050. return true;
  1051. }
  1052. $ids = array_column($list, 'id');
  1053. $source_type_ids = StoreCommonSyncLogs::getTypeIds($self_store_id, $source_store_id, $type, $ids);
  1054. $setting_ids = [];
  1055. foreach ($list as $item) {
  1056. if (in_array($item['id'], $source_type_ids)) continue;
  1057. $source_type_id = $item['id'];
  1058. unset($item['id']);
  1059. $new_goods_id = $sync_goods_logs_list[$item['item_id']]['goods_id'];
  1060. if (empty($new_goods_id)) {
  1061. continue;
  1062. }
  1063. $setting_ids[] = $source_type_id;
  1064. $model = new $class();
  1065. $item['store_id'] = $self_store_id;
  1066. $item['item_id'] = $new_goods_id;
  1067. $model->attributes = $item;
  1068. $model->save();
  1069. StoreCommonSyncLogs::add($self_store_id, $source_store_id, $source_type_id, $type, $model->id, $model->mall_id);
  1070. }
  1071. if (!empty($setting_ids)) {
  1072. self::syncStoreCouponGiveItemSettingDetail($self_store_id, $source_store_id, $mall_id, $setting_ids);
  1073. }
  1074. }
  1075. public static function syncStoreCouponGiveItemSettingDetail($self_store_id, $source_store_id, $mall_id, $coupon_give_item_setting_id)
  1076. {
  1077. $type = 'StoreCouponGiveItemSettingDetail';
  1078. $class = StoreCouponGiveItemSettingDetail::class;
  1079. $where[] = ['mall_id' => $mall_id];
  1080. $where[] = ['store_id' => $source_store_id];
  1081. $where[] = ['coupon_give_item_setting_id' => $coupon_give_item_setting_id];
  1082. $where[] = ['status' => [StatusEnum::ENABLED, StatusEnum::DISABLED]];
  1083. $list = $class::lists([
  1084. 'where' => $where,
  1085. 'order' => 'id asc',
  1086. ]);
  1087. if (empty($list)) {
  1088. return true;
  1089. }
  1090. //同步的优惠券项目
  1091. $sync_give_list = StoreCommonSyncLogs::lists([
  1092. 'where' => [
  1093. ['type' => 'StoreCouponGiveItemSetting'],
  1094. ['self_store_id' => $self_store_id],
  1095. ['source_store_id' => $source_store_id],
  1096. ],
  1097. 'index' => 'source_type_id'
  1098. ]);
  1099. if (empty($sync_give_list)) {
  1100. return true;
  1101. }
  1102. //同步的优惠券
  1103. $sync_coupon_list = StoreCommonSyncLogs::lists([
  1104. 'where' => [
  1105. ['type' => 'StoreCoupon'],
  1106. ['self_store_id' => $self_store_id],
  1107. ['source_store_id' => $source_store_id],
  1108. ],
  1109. 'index' => 'source_type_id'
  1110. ]);
  1111. if (empty($sync_coupon_list)) {
  1112. return true;
  1113. }
  1114. $ids = array_column($list, 'id');
  1115. $source_type_ids = StoreCommonSyncLogs::getTypeIds($self_store_id, $source_store_id, $type, $ids);
  1116. foreach ($list as $item) {
  1117. if (in_array($item['id'], $source_type_ids)) continue;
  1118. $source_type_id = $item['id'];
  1119. unset($item['id']);
  1120. $new_coupon_give_item_setting_id = $sync_give_list[$item['coupon_give_item_setting_id']]['type_id'];
  1121. if (empty($new_coupon_give_item_setting_id)) {
  1122. continue;
  1123. }
  1124. $new_coupon_id = $sync_coupon_list[$item['coupon_id']]['type_id'];
  1125. if (empty($new_coupon_id)) {
  1126. continue;
  1127. }
  1128. $model = new $class();
  1129. $item['store_id'] = $self_store_id;
  1130. $item['coupon_id'] = $new_coupon_id;
  1131. $item['coupon_give_item_setting_id'] = $new_coupon_give_item_setting_id;
  1132. $model->attributes = $item;
  1133. $model->save();
  1134. StoreCommonSyncLogs::add($self_store_id, $source_store_id, $source_type_id, $type, $model->id, $model->mall_id);
  1135. }
  1136. }
  1137. public static function syncStoreCouponMemberRelate($self_store_id, $source_store_id, $mall_id)
  1138. {
  1139. $type = 'StoreCouponMemberRelate';
  1140. $class = StoreCouponMemberRelate::class;
  1141. //同步的优惠券
  1142. $sync_coupon_list = StoreCommonSyncLogs::lists([
  1143. 'where' => [
  1144. ['type' => 'StoreCoupon'],
  1145. ['self_store_id' => $self_store_id],
  1146. ['source_store_id' => $source_store_id],
  1147. ],
  1148. 'index' => 'source_type_id'
  1149. ]);
  1150. if (empty($sync_coupon_list)) {
  1151. return true;
  1152. }
  1153. $coupon_id = array_column($sync_coupon_list, 'source_type_id');
  1154. $where[] = ['coupon_id' => $coupon_id];
  1155. $where[] = ['status' => [StatusEnum::ENABLED, StatusEnum::DISABLED]];
  1156. $list = $class::lists([
  1157. 'where' => $where,
  1158. 'order' => 'id asc',
  1159. ]);
  1160. if (empty($list)) {
  1161. return true;
  1162. }
  1163. $ids = array_column($list, 'id');
  1164. $source_type_ids = StoreCommonSyncLogs::getTypeIds($self_store_id, $source_store_id, $type, $ids);
  1165. foreach ($list as $item) {
  1166. if (in_array($item['id'], $source_type_ids)) continue;
  1167. $source_type_id = $item['id'];
  1168. unset($item['id']);
  1169. $new_coupon_id = $sync_coupon_list[$item['coupon_id']]['type_id'];
  1170. if (empty($new_coupon_id)) {
  1171. continue;
  1172. }
  1173. $model = new $class();
  1174. $item['coupon_id'] = $new_coupon_id;
  1175. $item['store_id'] = $self_store_id;
  1176. $model->attributes = $item;
  1177. $model->save();
  1178. StoreCommonSyncLogs::add($self_store_id, $source_store_id, $source_type_id, $type, $model->id, $mall_id);
  1179. }
  1180. }
  1181. }