MPriceAdjustment.Class.php 34 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908909910911912913914915916917918919920921922923924925926927928929
  1. <?php
  2. /**
  3. * 调价单管理
  4. * Created by PhpStorm.
  5. * User: phperstar
  6. * Date: 2019/4/16
  7. * Time: 9:41 AM
  8. */
  9. namespace JinDouYun\Model\Price;
  10. use JinDouYun\Cache\PageCache;
  11. use JinDouYun\Cache\PriceCache;
  12. use JinDouYun\Dao\Price\DPriceRangeSheet;
  13. use JinDouYun\Model\Goods\MGoods;
  14. use JinDouYun\Model\GoodsManage\MSku;
  15. use JinDouYun\Model\Stock\MInventory;
  16. use Mall\Framework\Core\ErrorCode;
  17. use Mall\Framework\Core\ResultWrapper;
  18. use Mall\Framework\Core\StatusCode;
  19. use JinDouYun\Model\MBaseModel;
  20. use JinDouYun\Dao\Price\DAreaPrice;
  21. use JinDouYun\Dao\Price\DNationalUnifiedPrice;
  22. use JinDouYun\Dao\Price\DPriceAdjustment;
  23. use JinDouYun\Dao\Price\DLastEffectiveSalePriceAreaType;
  24. class MPriceAdjustment extends MBaseModel
  25. {
  26. /**
  27. * @var int
  28. */
  29. private $onlineUserId;
  30. /**
  31. * @var int
  32. */
  33. private $onlineEnterpriseId;
  34. /**
  35. * @var DPriceAdjustment
  36. */
  37. private $objDPriceAdjustment;
  38. private $objDDistrictPriceCity;
  39. private $objDDistrictPriceProvince;
  40. private $objPriceCache;
  41. /**
  42. * @var DPriceRangeSheet
  43. */
  44. private $objDPriceRangeSheet;
  45. /**
  46. * MPriceAdjustment constructor.
  47. * @param $onlineUserId
  48. * @param $onlineEnterpriseId
  49. * @throws \Exception
  50. */
  51. public function __construct($onlineUserId, $onlineEnterpriseId)
  52. {
  53. $this->onlineUserId = $onlineUserId;
  54. $this->onlineEnterpriseId = $onlineEnterpriseId;
  55. parent::__construct($this->onlineEnterpriseId, $this->onlineUserId);
  56. $this->objPriceCache = new PriceCache($this->onlineEnterpriseId);
  57. $this->objDPriceAdjustment = new DPriceAdjustment();
  58. $this->objDPriceRangeSheet = new DPriceRangeSheet();
  59. $this->objDPriceRangeSheet->setTable($this->objDPriceRangeSheet->get_Table() . '_' . $this->onlineEnterpriseId);
  60. $this->objDPriceAdjustment->setTable($this->objDPriceAdjustment->get_Table() . '_' . $this->onlineEnterpriseId . '_' . date('Y') . '_' . ceil(date('m') / 3));
  61. $this->objDPriceAdjustment->setSearchIndex('priceAdjustmentSheet_search')->setType('priceAdjustmentSheet');
  62. }
  63. /**
  64. * 保存调价单
  65. * @param $sheetData
  66. * @return ResultWrapper
  67. */
  68. public function add($sheetData)
  69. {
  70. // 保存调单价数据
  71. $no = createOrderSn(StatusCode::$source['manage'], StatusCode::$orderType['priceAdjustment'], $this->onlineUserId);
  72. foreach ($sheetData as $key => $value) {
  73. $sheetData[$key]['no'] = $no;
  74. }
  75. $dbResult = $this->objDPriceAdjustment->insert($sheetData, true);
  76. if ($dbResult === false) {
  77. return ResultWrapper::fail($this->objDPriceAdjustment->error(), ErrorCode::$dberror);
  78. }
  79. if (is_array($dbResult)) {
  80. foreach ($dbResult as $key => $id) {
  81. if (isset($sheetData[$key])) {
  82. $sheetData[$key]['id'] = $id;
  83. }
  84. }
  85. }
  86. //self::updateEsData($sheetData);
  87. return ResultWrapper::success($dbResult);
  88. }
  89. /**
  90. * 更新ES
  91. * @param $data
  92. * @return mixed
  93. */
  94. public function updateEsData($data)
  95. {
  96. if (empty($data)) return $data;
  97. foreach ($data as $key => $val) {
  98. $esData = [
  99. 'enterpriseId' => $this->onlineEnterpriseId,
  100. 'id' => $val['id'],//自增id,
  101. 'no' => $val['no'],//调价单号,
  102. 'goodsCode' => isset($val['goodsCode']) ? $val['goodsCode'] : createCode(StatusCode::$code['goodsBasic']['prefix'], $val['goodsId'], StatusCode::$code['goodsBasic']['length']),//商品编号
  103. 'goodsName' => $val['goodsName'],//商品名称
  104. 'goodsId' => $val['goodsId'],//商品id
  105. 'saleType' => $val['saleType'],//销售类型 1实物销售 2虚库销售
  106. 'salePriceAreaType' => $val['salePriceAreaType'],//销售价格生效区域类型 1全国统一价 2大区价
  107. 'salePriceType' => $val['salePriceType'],//销售价格类型 1销售价格 2秒杀活动价
  108. 'shopId' => $val['shopId'],//店铺id
  109. 'shopName' => $val['shopName'],//店铺名称
  110. 'cargoOwnerCode' => '',//货主编码
  111. 'createUserId' => $val['createUserId'],//创建人id
  112. 'createUserName' => $val['createUserName'],//创建人姓名
  113. 'effectiveUserName' => isset($val['effectiveUserName']) ? $val['effectiveUserName'] : '',//生效人姓名
  114. 'effectiveUserId' => isset($val['effectiveUserId']) ? $val['effectiveUserId'] : '',//生效人id
  115. 'deleteStatus' => StatusCode::$standard,//删除状态 4删除 5正常
  116. 'effectiveStatus' => isset($val['effectiveStatus']) ? $val['effectiveStatus'] : StatusCode::$auditStatus['auditPass'],//生效状态 1.待审 2审核通过 3未通过 4审核中
  117. 'createTime' => isset($val['createTime']) ? $val['createTime'] : time(),//创建时间
  118. 'updateTime' => isset($val['updateTime']) ? $val['updateTime'] : time(),//修改时间
  119. 'salePrice' => json_decode($val['salePrice'], true),//销售价格
  120. ];
  121. $_id = self::createEsDocumentId($val['id']);
  122. $result = $this->objDPriceAdjustment->addUpSearchIndexDocument($esData, $_id);
  123. if (isset($result['_shards']) && isset($result['_shards']['successful']) && $result['_shards']['successful'] == 1) {
  124. //echo "es操作成功";
  125. //return;
  126. }
  127. //echo "es操作失败";
  128. }
  129. }
  130. /**
  131. * 生成文档id
  132. * @param $id
  133. * @return string
  134. */
  135. private function createEsDocumentId($id)
  136. {
  137. return 'EnterpriseId_' . $this->onlineEnterpriseId . '_id_' . $id;
  138. }
  139. /**
  140. * 最终价格保存
  141. * @param $sheetData
  142. * @return ResultWrapper
  143. * @throws \Exception
  144. */
  145. public function addPrice($sheetData)
  146. {
  147. switch ($sheetData['salePriceAreaType']) {
  148. case StatusCode::$salePriceAreaType['nationalUnifiedPrice']:
  149. return self::saveNationalUnifiedPrice($sheetData);
  150. break;
  151. case StatusCode::$salePriceAreaType['areaPrice']:
  152. return self::saveAreaPrice($sheetData);
  153. break;
  154. /*
  155. case StatusCode::$salePriceAreaType['regionalPrice'];
  156. return self::saveRegionalPrice($sheetData);
  157. break;
  158. case StatusCode::$salePriceAreaType['districtPrice']:
  159. return self::formatPriceData($sheetData);
  160. break; */
  161. }
  162. }
  163. /**
  164. * 价格部分公共字段
  165. */
  166. public function commonField($sheetData)
  167. {
  168. $salePriceData = [
  169. 'no' => $sheetData['no'],
  170. 'goodsId' => $sheetData['goodsId'],
  171. 'shopId' => $sheetData['shopId'],
  172. 'salePriceType' => $sheetData['salePriceType'],
  173. 'salePrice' => $sheetData['salePrice'],
  174. 'updateTime' => $sheetData['createTime'],
  175. ];
  176. return $salePriceData;
  177. }
  178. /**
  179. * 保存物料最终的全国统一价格
  180. * @param $sheetData
  181. * @return ResultWrapper
  182. * @throws \Exception
  183. */
  184. public function saveNationalUnifiedPrice($sheetData)
  185. {
  186. $salePriceData = self::commonField($sheetData);
  187. $objDNationalUnifiedPrice = new DNationalUnifiedPrice();
  188. $objDNationalUnifiedPrice->beginTransaction();
  189. // 按照企业分表
  190. $tableName = 'qianniao_nationalUnifiedPrice_' . $this->onlineEnterpriseId;
  191. $objDNationalUnifiedPrice->setTable($tableName);
  192. // 查询是否已经设置过价格了
  193. $condition = [
  194. 'shopId' => $salePriceData['shopId'],
  195. 'salePriceType' => $salePriceData['salePriceType'],
  196. 'goodsId' => $salePriceData['goodsId'],
  197. ];
  198. $dbResult = $objDNationalUnifiedPrice->get($condition);
  199. if ($dbResult === false) {
  200. $objDNationalUnifiedPrice->rollBack();
  201. return ResultWrapper::fail($objDNationalUnifiedPrice->error(), ErrorCode::$dberror);
  202. }
  203. $salePriceData['salePrice'] = self::formatMerge($dbResult, $salePriceData, StatusCode::$salePriceAreaType['nationalUnifiedPrice']);
  204. $dbResult = $objDNationalUnifiedPrice->replace($salePriceData);
  205. if ($dbResult === false) {
  206. $objDNationalUnifiedPrice->rollBack();
  207. return ResultWrapper::fail($objDNationalUnifiedPrice->error(), ErrorCode::$dberror);
  208. }
  209. //unset($dbResult);
  210. // $objDAreaPrice = new DAreaPrice();
  211. // // 按照企业分表
  212. // $tableName = 'qianniao_areaPrice_' . $this->onlineEnterpriseId;
  213. // $objDAreaPrice->setTable($tableName);
  214. //
  215. // $dbResult = $objDAreaPrice->delete(
  216. // [
  217. // 'shopId' => $sheetData['shopId'],
  218. // 'goodsId' => $sheetData['goodsId'],
  219. // 'salePriceType' => StatusCode::$salePriceType['salePrice']
  220. // ]
  221. // );
  222. // if ($dbResult === false) {
  223. // $objDNationalUnifiedPrice->rollBack();
  224. // return ResultWrapper::fail($objDAreaPrice->error(), ErrorCode::$dberror);
  225. // }
  226. $objDNationalUnifiedPrice->commit();
  227. //self::savePriceRange($salePriceData);
  228. return ResultWrapper::success($dbResult);
  229. }
  230. private function formatMerge($dbResult, $salePriceData, $salePriceAreaType)
  231. {
  232. if (!is_array($salePriceData['salePrice'])) {
  233. $salePriceData['salePrice'] = json_decode($salePriceData['salePrice'], true);
  234. }
  235. // 如果已经存在价格了,按照skuid合并和替换价格
  236. if (!empty($dbResult)) {
  237. $nowSalePrice = json_decode($dbResult['salePrice'], true);
  238. if (empty($nowSalePrice)) {
  239. $salePriceData['salePrice'] = json_encode($salePriceData['salePrice']);
  240. } else {
  241. // 把已经存在价格替换成新的
  242. foreach ($nowSalePrice as $key => $value) {
  243. if (isset($salePriceData['salePrice'][$key])) {
  244. if ($salePriceAreaType == StatusCode::$salePriceAreaType['areaPrice']) {
  245. if (count($salePriceData['salePrice'][$key]) > 1) {
  246. $nowSalePrice[$key] = array_merge($value, $salePriceData['salePrice'][$key]);
  247. } else {
  248. $nowSalePrice[$key] = $salePriceData['salePrice'][$key];
  249. }
  250. } else {
  251. $nowSalePrice[$key] = $salePriceData['salePrice'][$key];
  252. }
  253. }else{
  254. unset($nowSalePrice[$key]);
  255. }
  256. unset($salePriceData['salePrice'][$key]);
  257. }
  258. // 把新的和旧的合并到一起作为最新的价格
  259. if (!empty($salePriceData['salePrice'])) {
  260. $salePriceData['salePrice'] = $salePriceData['salePrice'] + $nowSalePrice;
  261. } else {
  262. $salePriceData['salePrice'] = $nowSalePrice;
  263. }
  264. $salePriceData['salePrice'] = json_encode($salePriceData['salePrice']);
  265. }
  266. }
  267. if (is_array($salePriceData['salePrice'])) {
  268. $salePriceData['salePrice'] = json_encode($salePriceData['salePrice']);
  269. }
  270. return $salePriceData['salePrice'];
  271. }
  272. /**
  273. * 报错物料最终的区域价格
  274. * @param $sheetData
  275. * @return ResultWrapper
  276. * @throws \Exception
  277. */
  278. public function saveAreaPrice($sheetData)
  279. {
  280. $salePriceData = self::commonField($sheetData);
  281. $salePriceData['salePrice'] = json_decode($salePriceData['salePrice'], true);
  282. $objDAreaPrice = new DAreaPrice();
  283. // 按照企业分表
  284. $tableName = 'qianniao_areaPrice_' . $this->onlineEnterpriseId;
  285. $objDAreaPrice->setTable($tableName);
  286. // 查询是否已经设置过价格了
  287. $condition = [
  288. 'shopId' => $salePriceData['shopId'],
  289. 'salePriceType' => $salePriceData['salePriceType'],
  290. 'goodsId' => $salePriceData['goodsId'],
  291. ];
  292. $dbResult = $objDAreaPrice->get($condition);
  293. if ($dbResult === false) {
  294. return ResultWrapper::fail($objDAreaPrice->error(), ErrorCode::$dberror);
  295. }
  296. $salePriceData['salePrice'] = self::formatMerge($dbResult, $salePriceData, StatusCode::$salePriceAreaType['areaPrice']);
  297. $dbResult = $objDAreaPrice->replace($salePriceData);
  298. if ($dbResult === false) {
  299. return ResultWrapper::fail($objDAreaPrice->error(), ErrorCode::$dberror);
  300. } else {
  301. //self::savePriceRange($salePriceData);
  302. return ResultWrapper::success($dbResult);
  303. }
  304. }
  305. /**
  306. * 保存大区最终价格
  307. */
  308. public function saveRegionalPrice($sheetData)
  309. {
  310. $salePriceData = [];
  311. $sheetData['salePriceArea'] = json_decode($sheetData['salePriceArea'], true);
  312. foreach ($sheetData['salePriceArea'] as $k => $v) {
  313. $salePriceData[$k] = self::commonField($sheetData);
  314. $salePriceData[$k]['regionalDepartmentId'] = $v;
  315. $salePriceData[$k]['regionalGroupId'] = $sheetData['regionalGroupId'];
  316. }
  317. $objDRegionalDepartmentPrice = new DRegionalDepartmentPrice();
  318. // 按照店铺分表
  319. $tableName = 'regionalDepartmentPrice_' . $sheetData['shopId'];
  320. $objDRegionalDepartmentPrice->setTable($tableName);
  321. $dbResult = $objDRegionalDepartmentPrice->replace(array_values($salePriceData), true);
  322. if ($dbResult === false) {
  323. return ResultWrapper::fail($objDRegionalDepartmentPrice->error(), ErrorCode::$dberror);
  324. }
  325. return ResultWrapper::success($dbResult);
  326. }
  327. /**
  328. * 保存区县级最终价格
  329. * @param int $cityid 城市id
  330. * @param array $districtPriceCityData 区县价格数据
  331. * @return ResultWrapper
  332. */
  333. public function saveCityPrice($cityid, $districtPriceCityData)
  334. {
  335. // 计算区县分表
  336. $tableName = 'districtPrice_city_' . $cityid;
  337. $this->objDDistrictPriceCity->setTable($tableName);
  338. $dbResult = $this->objDDistrictPriceCity->replace($districtPriceCityData, true);
  339. if ($dbResult === false) {
  340. return ResultWrapper::fail($this->objDDistrictPriceCity->error(), ErrorCode::$dberror);
  341. } else {
  342. return ResultWrapper::success($dbResult);
  343. }
  344. }
  345. /**
  346. * 保存省级最终价格
  347. * @param int $provinceId 省id
  348. * @param array $districtPriceProvincesData 区域价省一级数据
  349. * @return ResultWrapper
  350. */
  351. public function saveProvincesPrice($provinceId, $districtPriceProvincesData)
  352. {
  353. // 计算省份分表
  354. $tableName = 'districtPrice_province_' . $provinceId;
  355. $this->objDDistrictPriceProvince->setTable($tableName);
  356. $dbResult = $this->objDDistrictPriceProvince->replace($districtPriceProvincesData, true);
  357. if ($dbResult === false) {
  358. return ResultWrapper::fail($this->objDDistrictPriceProvince->error(), ErrorCode::$dberror);
  359. } else {
  360. return ResultWrapper::success($dbResult);
  361. }
  362. }
  363. /**
  364. * 组装区县价格数据
  365. * @param array $sheetData 调单价数据
  366. * @return ResultWrapper
  367. */
  368. public function formatPriceData($sheetData)
  369. {
  370. $sheetData['salePriceArea'] = json_decode($sheetData['salePriceArea'], true);
  371. $areaData = self::areaGroup($sheetData['salePriceArea']);
  372. $salePriceData = self::commonField($sheetData);
  373. if (isset($areaData['citys'])) {
  374. // 按照城市分表插入价格数据
  375. foreach ($areaData['citys'] as $key => $value) {
  376. foreach ($value['district'] as $k => $v) {
  377. $salePriceData['districtId'] = $v;
  378. $districtPriceCityData[] = $salePriceData;
  379. }
  380. $result = self::saveCityPrice($key, $districtPriceCityData);
  381. if (!$result->isSuccess()) {
  382. return $result;
  383. }
  384. }
  385. }
  386. if (isset($areaData['provinces'])) {
  387. // 按照省分表插入价格数据
  388. foreach ($areaData['provinces'] as $key => $value) {
  389. unset($salePriceData['districtId']);
  390. $districtPriceProvinceData[] = $salePriceData;
  391. $result = self::saveProvincesPrice($value, $districtPriceProvinceData);
  392. if (!$result->isSuccess()) {
  393. return $result;
  394. }
  395. }
  396. }
  397. return $result;
  398. }
  399. /**
  400. * 切割省市区归组
  401. * @param array $areaDatas 区域数据
  402. * @return array
  403. */
  404. public function areaGroup($areaDatas)
  405. {
  406. $citys = [];
  407. $provinces = [];
  408. foreach ($areaDatas as $key => $value) {
  409. $areaData = explode('-', $value);
  410. // 提取区一级
  411. if ($areaData[2] != 0) {
  412. $citys[$areaData[1]]['district'][] = $areaData[2];
  413. continue;
  414. }
  415. // 提取市一级
  416. if ($areaData[1] != 0) {
  417. $citys[$areaData[1]]['district'][] = 0;
  418. continue;
  419. }
  420. // 提取省一级
  421. if ($areaData[0] != 0) {
  422. $provinces[] = $areaData[0];
  423. }
  424. }
  425. return [
  426. 'citys' => $citys,
  427. 'provinces' => $provinces,
  428. ];
  429. }
  430. /**
  431. * 获取所有调价单
  432. */
  433. public function getAll($params,$export = 0)
  434. {
  435. $pageData = pageToOffset($params['page'], $params['pageSize']);
  436. if ($export) {
  437. $pageData['limit'] = null;
  438. $pageData['offset'] = null;
  439. }
  440. $condition = null;
  441. if ($params['keyword']) {
  442. $condition = "(goodsName like '%" . $params['keyword'] . "%' or goodsCode like '%" . $params['keyword'] . "%' or no like '%" . $params['keyword'] . "%')";
  443. }
  444. if ($params['startTime'] && $params['endTime']) {
  445. if ($condition !== null) {
  446. $condition .= ' and ';
  447. }
  448. $condition .= " createTime >= " . $params['startTime'] . " and createTime <=" . $params['endTime'];
  449. }
  450. if ($params['effectiveStatus']) {
  451. if ($condition !== null) {
  452. $condition .= ' and ';
  453. }
  454. $condition .= " effectiveStatus = " . $params['effectiveStatus'];
  455. }
  456. if (isset($params['goodsId']) && !empty($params['goodsId'])) {
  457. if ($condition !== null) {
  458. $condition .= ' and ';
  459. }
  460. $condition .= " goodsId = " . $params['goodsId'];
  461. }
  462. if (isset($params['shopId']) && !empty($params['shopId'])){
  463. if ($condition !== null) {
  464. $condition .= ' and ';
  465. }
  466. $condition .= " shopId = ".$params['shopId'];
  467. }
  468. $condition = parent::getShopIdQueryParams($condition);
  469. $total = $this->objDPriceAdjustment->count($condition);
  470. $dbResult = $this->objDPriceAdjustment->select($condition, '*', 'id desc', $pageData['limit'], $pageData['offset']);
  471. if ($dbResult === false) {
  472. return ResultWrapper::fail($this->objDPriceAdjustment->error(), ErrorCode::$dberror);
  473. }
  474. $return = [
  475. 'data' => self::format($dbResult),
  476. 'total' => $total,
  477. ];
  478. //商品调价单导出
  479. if($export){
  480. self::exportGoodsPriceSheet($return['data']);
  481. exit;
  482. }
  483. return ResultWrapper::success($return);
  484. }
  485. /**
  486. * 格式化返回数据
  487. */
  488. public function format($data)
  489. {
  490. $skuIds = [];
  491. foreach ($data as $key => &$val) {
  492. if (!is_array($val['salePrice'])) {
  493. $val['salePrice'] = json_decode($val['salePrice'], true);
  494. }
  495. foreach ($val['salePrice'] as $k => &$v) {
  496. if ($val['salePriceAreaType'] == StatusCode::$salePriceAreaType['nationalUnifiedPrice']) {
  497. $v['skuId'] = $k;
  498. }
  499. }
  500. $val['salePrice'] = array_values($val['salePrice']);
  501. foreach ($val['salePrice'] as $row){
  502. $skuIds[] = $row['skuId'];
  503. }
  504. }
  505. $objMSku = new MSku($this->onlineUserId,$this->onlineEnterpriseId);
  506. $skuResult = $objMSku->getSpecNameBySkuId($skuIds);
  507. $allSkuData = [];
  508. if ($skuResult->isSuccess()){
  509. $allSkuData = $skuResult->getData();
  510. }
  511. foreach ($data as &$value){
  512. foreach ($value['salePrice'] as &$row){
  513. $row['unitName'] = isset($allSkuData[$row['skuId']]) ? $allSkuData[$row['skuId']]['unitName'] : '';
  514. $row['specGroup'] = isset($allSkuData[$row['skuId']]) ? $allSkuData[$row['skuId']]['specGroup'] : [];
  515. if (empty($row['specGroup'])){
  516. $value['specType'] = StatusCode::$specType['single'];
  517. }else{
  518. $value['specType'] = StatusCode::$specType['multiple'];
  519. }
  520. }
  521. }
  522. return $data;
  523. }
  524. /**
  525. * 批量生效操作
  526. * @param array $ids 要生效的当局id集合
  527. * @param $params
  528. * @return ResultWrapper
  529. * @throws \Exception
  530. */
  531. public function effective($ids, $params)
  532. {
  533. // 计算调价单分表
  534. $tableName = 'qianniao_priceAdjustmentSheet_' . $this->onlineEnterpriseId . '_' . date('Y', $params['createTime']) . '_' . ceil(date('m', $params['createTime']) / 3);
  535. $this->objDPriceAdjustment->setTable($tableName);
  536. $priceAdjustment = $this->objDPriceAdjustment->get($ids);
  537. if ($priceAdjustment === false) {
  538. return ResultWrapper::fail($this->objDPriceAdjustment->error(), ErrorCode::$dberror);
  539. }
  540. if (empty($priceAdjustment)) {
  541. return ResultWrapper::fail('要生效的调价单不存在', ErrorCode::$contentNotExists);
  542. }
  543. $beginStatus = $this->objDPriceAdjustment->beginTransaction();
  544. // 将调价单变更为生效状态
  545. $dbResult = $this->objDPriceAdjustment->update(
  546. [
  547. 'effectiveStatus' => StatusCode::$auditStatus['auditPass'],
  548. 'effectiveUserName' => isset($params['effectiveUserName']) ? $params['effectiveUserName'] : '',
  549. 'effectiveUserId' => isset($params['effectiveUserId']) ? $params['effectiveUserId'] : '',
  550. ], $ids);
  551. if ($dbResult === false) {
  552. $this->objDPriceAdjustment->rollBack();
  553. return ResultWrapper::fail($this->objDPriceAdjustment->error(), ErrorCode::$dberror);
  554. }
  555. unset($dbResult);
  556. // 将商品最后生效价格区域类型写入记录表中
  557. $objDLastEffectiveSalePriceAreaType = new DLastEffectiveSalePriceAreaType();
  558. $objDLastEffectiveSalePriceAreaType->setTable('qianniao_lastEffectiveSalePriceAreaType_' . $this->onlineEnterpriseId);
  559. $data = [
  560. 'shopId' => $priceAdjustment['shopId'],
  561. 'goodsCode' => $priceAdjustment['goodsCode'],
  562. 'goodsId' => $priceAdjustment['goodsId'],
  563. 'lastEffectiveSalePriceAreaType' => $priceAdjustment['salePriceAreaType'],
  564. 'no' => $priceAdjustment['no'],
  565. 'updateTime' => time(),
  566. ];
  567. $dbResult = $objDLastEffectiveSalePriceAreaType->replace($data);
  568. if ($dbResult === false) {
  569. $this->objDPriceAdjustment->rollBack();
  570. return ResultWrapper::fail($objDLastEffectiveSalePriceAreaType->error(), ErrorCode::$dberror);
  571. }
  572. $result = self::addPrice($priceAdjustment);
  573. if (!$result->isSuccess()) {
  574. $this->objDPriceAdjustment->rollBack();
  575. return ResultWrapper::fail($this->objDPriceAdjustment->error(), ErrorCode::$dberror);
  576. }
  577. unset($result);
  578. // 每编辑一件商品需要清除一下小程序商品首页的缓存;
  579. $objPageCache = new PageCache();
  580. $objPageCache->delPage();
  581. //删除缓存
  582. $this->objPriceCache->delNationSalePrice($priceAdjustment['goodsId']);
  583. //商户商品设置库存成本
  584. $objMInventory = new MInventory($this->onlineEnterpriseId, $this->onlineUserId);
  585. $salePrice = json_decode($priceAdjustment['salePrice'], true);
  586. foreach($salePrice as $skuId => $v){
  587. $params = [
  588. 'costPrice' => $v['salePrice'],
  589. 'skuId' => $skuId,
  590. ];
  591. $modelResult = $objMInventory->updateInventoryCost($params);
  592. if(!$modelResult->isSuccess()){
  593. $this->objDPriceAdjustment->rollBack();
  594. return ResultWrapper::fail($modelResult->getData(), $modelResult->getErrorCode());
  595. }
  596. }
  597. $beginStatus && $this->objDPriceAdjustment->commit();
  598. return ResultWrapper::success($dbResult);
  599. }
  600. /**
  601. * 计算最低价
  602. */
  603. public function getMinPrice($salePrice)
  604. {
  605. $minPrice = $salePrice['salePrice'];
  606. if ($salePrice['enabledLadder']) {
  607. foreach ($salePrice['ladderPrice'] as $key => $value) {
  608. if ($value['price'] < $minPrice) {
  609. $minPrice = $value['price'];
  610. }
  611. }
  612. }
  613. return $minPrice;
  614. }
  615. /**
  616. * 自从创建调价单且自动生效接口
  617. */
  618. public function addAndEffective($sheetData, $effectiveParams = [])
  619. {
  620. $result = self::add($sheetData);
  621. if (!$result->isSuccess()) {
  622. return ResultWrapper::fail($result->getData(), $result->getErrorCode());
  623. }
  624. $sheetId = $result->getData();
  625. unset($result);
  626. if (empty($effectiveParams)) {
  627. $effectiveParams['createTime'] = time();
  628. }
  629. $result = self::effective($sheetId, $effectiveParams);
  630. if (!$result->isSuccess()) {
  631. return ResultWrapper::fail($result->getData(), $result->getErrorCode());
  632. }
  633. // 每编辑一件商品需要清除一下小程序商品首页的缓存;
  634. $objPageCache = new PageCache();
  635. $objPageCache->delPage();
  636. return ResultWrapper::success($result->getData());
  637. }
  638. /**
  639. * 商品调价单搜索
  640. * @param $selectParams
  641. * @return ResultWrapper
  642. */
  643. public function search($selectParams)
  644. {
  645. $defaultDSL = [
  646. 'from' => $selectParams['offset'],
  647. 'size' => $selectParams['limit'],
  648. 'sort' => [
  649. 'createTime' => [
  650. 'order' => 'desc'
  651. ],
  652. ],
  653. ];
  654. $dsl = [];
  655. $dsl['query']['bool']['must'][] = [
  656. 'term' => ['enterpriseId' => $this->onlineEnterpriseId],
  657. ];
  658. //店铺id
  659. parent::getAccessShopIds();
  660. if (parent::$shopIds) {
  661. $dsl['query']['bool']['filter'][] = [
  662. 'terms' => ['shopId' => parent::$shopIds]
  663. ];
  664. }
  665. //订单编号,收货人,商品名称
  666. if (!empty($selectParams['keyword'])) {
  667. $dsl['query']['bool']['must'][] = [
  668. 'multi_match' => [
  669. 'fields' => ['goodsCode', 'goodsName'],
  670. 'query' => $selectParams['keyword'],
  671. 'fuzziness' => 'AUTO',
  672. ],
  673. ];
  674. }
  675. //生效状态
  676. if (!empty($selectParams['effectiveStatus'])) {
  677. $dsl['query']['bool']['filter'][] =
  678. ['term' => ['effectiveStatus' => $selectParams['effectiveStatus']]];
  679. }
  680. //时间
  681. if (!empty($selectParams['startTime']) && !empty($selectParams['endTime'])) {
  682. $dsl['query']['bool']['must'][] = [
  683. 'range' => [
  684. 'createTime' => [
  685. 'gte' => $selectParams['startTime'],
  686. 'lte' => $selectParams['endTime'],
  687. ]
  688. ]
  689. ];
  690. } else {
  691. if (!empty($selectParams['startTime'])) {
  692. $dsl['query']['bool']['must'][] = [
  693. 'range' => [
  694. 'createTime' => [
  695. 'gte' => $selectParams['startTime'],
  696. ]
  697. ]
  698. ];
  699. }
  700. if (!empty($selectParams['endTime'])) {
  701. $dsl['query']['bool']['must'][] = [
  702. 'range' => [
  703. 'createTime' => [
  704. 'lte' => $selectParams['endTime'],
  705. ]
  706. ]
  707. ];
  708. }
  709. }
  710. $dsl = array_merge($defaultDSL, $dsl);
  711. $result = $this->objDPriceAdjustment->getSearchQueryDsl($dsl);
  712. if (isset($result['status']) && $result['status'] == 400) {
  713. return ResultWrapper::fail('获取数据失败' . $result['error']['reason'], ErrorCode::$apiNotResult);
  714. }
  715. $total = $result['hits']['total'];
  716. $dbResult = $result['hits']['hits'];
  717. $list = [];
  718. foreach ($dbResult as $key => &$value) {
  719. $data = [];
  720. $data = $value['_source'];
  721. $list[] = $data;
  722. }
  723. $return = [
  724. 'data' => self::format($list),
  725. 'total' => ($total) ? intval($total) : 0,
  726. ];
  727. return ResultWrapper::success($return);
  728. }
  729. /**
  730. * 保存商品价格范围
  731. * @param array $data
  732. * @return ResultWrapper
  733. */
  734. public function savePriceRange(array $data)
  735. {
  736. if (empty($data)) {
  737. return ResultWrapper::success([]);
  738. }
  739. $salePrice = json_decode($data['salePrice'],true);
  740. $allSalePrice = array_column($salePrice,'salePrice');
  741. $sale = [
  742. 'minSalePrice' => min($allSalePrice),
  743. 'maxSalePrice' => max($allSalePrice),
  744. ];
  745. $add = [
  746. 'goodsCode' => isset($data['goodsCode']) ? $data['goodsCode'] : '',
  747. 'goodsName' => isset($data['goodsName']) ? $data['goodsName'] : '',
  748. 'goodsId' => $data['goodsId'],
  749. 'shopId' => $data['shopId'],
  750. 'createTime' => time(),
  751. 'salePrice' => json_encode($sale),
  752. ];
  753. $result = $this->objDPriceRangeSheet->replace($add);
  754. if ($result === false) {
  755. return ResultWrapper::fail($this->objDPriceRangeSheet->error(), ErrorCode::$dberror);
  756. }
  757. return ResultWrapper::success(true);
  758. }
  759. /**
  760. * 商品调价单导出方法
  761. * @param $priceSheetData
  762. */
  763. private static function exportGoodsPriceSheet($priceSheetData)
  764. {
  765. //导出到本地
  766. header("Content-type:application/vnd.ms-excel");
  767. header("Content-Disposition:filename=商品调价单明细表记录.csv");
  768. header('Cache-Control: max-age=0');
  769. $fp = fopen('php://output', 'a');
  770. $head = ['调价单编码','商品名称','调价日期','调整后价格规格','调整市场价格','阶梯价','销售价','调整人','相关店铺', '状态']; //定义标题
  771. foreach ($head as $i => $v) {
  772. $head[$i] = mb_convert_encoding($v, 'GBK', 'utf-8'); //将中文标题转换编码,否则乱码
  773. }
  774. fputcsv($fp, $head);
  775. $limit = 10000;
  776. $num = 0;//计数器
  777. foreach ($priceSheetData as $v) {
  778. $marketPrice = []; //市场价格
  779. $ladderPrice = ''; //阶梯价
  780. $salePrice = []; //销售价
  781. $unitName = []; //调整规格
  782. $specValueName = [];//副规格
  783. if(!empty($v['salePrice'])){
  784. foreach ($v['salePrice'] as $value){
  785. $marketPrice[] = $value['marketPrice'];
  786. $ladderPrice = $value['ladderPrice'];
  787. $salePrice[] = $value['salePrice'];
  788. if(!empty($value['specGroup'])){
  789. foreach ($value['specGroup'] as $vv){
  790. $specValueName = $vv['specValueName'];
  791. }
  792. }
  793. $unitName[] = $value['unitName'].';'.$specValueName;//调整规格
  794. }
  795. }
  796. //循环数据
  797. $num++;
  798. if ($num == $limit) {
  799. ob_flush();//释放内存
  800. flush();
  801. }
  802. $rows['no'] = isset($v['no']) ? $v['no'] : '';//调价单编码
  803. $rows['goodsName'] = isset($v['goodsName']) ? $v['goodsName'] : '';//商品名称
  804. $rows['createTime'] = isset($v['createTime']) ? date('Y-m-d H:i:s',$v['createTime']) : '';//调价时间
  805. $rows['unitName'] = implode("\n",$unitName);//调整规格
  806. $rows['price'] = implode("\n",$marketPrice);//调整市场价格
  807. $rows['ladderPrice'] = !empty($ladderPrice) ? $ladderPrice : "否";//阶梯价
  808. $rows['salePrice'] = implode("\n",$salePrice);//销售价
  809. //$rows['customerName'] = isset($v['customerName']) ? $v['customerName'] : '';//客户类型
  810. // $rows['goodsCode'] = isset($v['goodsCode']) ? $v['goodsCode'] : '';//商品编码
  811. $rows['createUserName'] = isset($v['createUserName']) ? $v['createUserName'] : '';//调整人
  812. $rows['shopName'] = isset($v['shopName']) ? $v['shopName'] : '';//相关店铺
  813. $rows['effectiveStatus'] = $v['effectiveStatus'] === 2 ? '生效' : '未生效';//状态
  814. foreach ($rows as $kk => $vv) {
  815. $rs[$kk] = mb_convert_encoding($vv, 'GBK', 'utf-8'); //转译编码
  816. }
  817. fputcsv($fp, $rs);
  818. $rows = [];
  819. }
  820. exit;
  821. }
  822. }