MPurchase.Class.php 82 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394959697989910010110210310410510610710810911011111211311411511611711811912012112212312412512612712812913013113213313413513613713813914014114214314414514614714814915015115215315415515615715815916016116216316416516616716816917017117217317417517617717817918018118218318418518618718818919019119219319419519619719819920020120220320420520620720820921021121221321421521621721821922022122222322422522622722822923023123223323423523623723823924024124224324424524624724824925025125225325425525625725825926026126226326426526626726826927027127227327427527627727827928028128228328428528628728828929029129229329429529629729829930030130230330430530630730830931031131231331431531631731831932032132232332432532632732832933033133233333433533633733833934034134234334434534634734834935035135235335435535635735835936036136236336436536636736836937037137237337437537637737837938038138238338438538638738838939039139239339439539639739839940040140240340440540640740840941041141241341441541641741841942042142242342442542642742842943043143243343443543643743843944044144244344444544644744844945045145245345445545645745845946046146246346446546646746846947047147247347447547647747847948048148248348448548648748848949049149249349449549649749849950050150250350450550650750850951051151251351451551651751851952052152252352452552652752852953053153253353453553653753853954054154254354454554654754854955055155255355455555655755855956056156256356456556656756856957057157257357457557657757857958058158258358458558658758858959059159259359459559659759859960060160260360460560660760860961061161261361461561661761861962062162262362462562662762862963063163263363463563663763863964064164264364464564664764864965065165265365465565665765865966066166266366466566666766866967067167267367467567667767867968068168268368468568668768868969069169269369469569669769869970070170270370470570670770870971071171271371471571671771871972072172272372472572672772872973073173273373473573673773873974074174274374474574674774874975075175275375475575675775875976076176276376476576676776876977077177277377477577677777877978078178278378478578678778878979079179279379479579679779879980080180280380480580680780880981081181281381481581681781881982082182282382482582682782882983083183283383483583683783883984084184284384484584684784884985085185285385485585685785885986086186286386486586686786886987087187287387487587687787887988088188288388488588688788888989089189289389489589689789889990090190290390490590690790890991091191291391491591691791891992092192292392492592692792892993093193293393493593693793893994094194294394494594694794894995095195295395495595695795895996096196296396496596696796896997097197297397497597697797897998098198298398498598698798898999099199299399499599699799899910001001100210031004100510061007100810091010101110121013101410151016101710181019102010211022102310241025102610271028102910301031103210331034103510361037103810391040104110421043104410451046104710481049105010511052105310541055105610571058105910601061106210631064106510661067106810691070107110721073107410751076107710781079108010811082108310841085108610871088108910901091109210931094109510961097109810991100110111021103110411051106110711081109111011111112111311141115111611171118111911201121112211231124112511261127112811291130113111321133113411351136113711381139114011411142114311441145114611471148114911501151115211531154115511561157115811591160116111621163116411651166116711681169117011711172117311741175117611771178117911801181118211831184118511861187118811891190119111921193119411951196119711981199120012011202120312041205120612071208120912101211121212131214121512161217121812191220122112221223122412251226122712281229123012311232123312341235123612371238123912401241124212431244124512461247124812491250125112521253125412551256125712581259126012611262126312641265126612671268126912701271127212731274127512761277127812791280128112821283128412851286128712881289129012911292129312941295129612971298129913001301130213031304130513061307130813091310131113121313131413151316131713181319132013211322132313241325132613271328132913301331133213331334133513361337133813391340134113421343134413451346134713481349135013511352135313541355135613571358135913601361136213631364136513661367136813691370137113721373137413751376137713781379138013811382138313841385138613871388138913901391139213931394139513961397139813991400140114021403140414051406140714081409141014111412141314141415141614171418141914201421142214231424142514261427142814291430143114321433143414351436143714381439144014411442144314441445144614471448144914501451145214531454145514561457145814591460146114621463146414651466146714681469147014711472147314741475147614771478147914801481148214831484148514861487148814891490149114921493149414951496149714981499150015011502150315041505150615071508150915101511151215131514151515161517151815191520152115221523152415251526152715281529153015311532153315341535153615371538153915401541154215431544154515461547154815491550155115521553155415551556155715581559156015611562156315641565156615671568156915701571157215731574157515761577157815791580158115821583158415851586158715881589159015911592159315941595159615971598159916001601160216031604160516061607160816091610161116121613161416151616161716181619162016211622162316241625162616271628162916301631163216331634163516361637163816391640164116421643164416451646164716481649165016511652165316541655165616571658165916601661166216631664166516661667166816691670167116721673167416751676167716781679168016811682168316841685168616871688168916901691169216931694169516961697169816991700170117021703170417051706170717081709171017111712171317141715171617171718171917201721172217231724172517261727172817291730173117321733173417351736173717381739174017411742174317441745174617471748174917501751175217531754175517561757175817591760176117621763176417651766176717681769177017711772177317741775177617771778177917801781178217831784178517861787178817891790179117921793179417951796179717981799180018011802180318041805180618071808180918101811181218131814181518161817181818191820182118221823182418251826182718281829183018311832183318341835183618371838183918401841184218431844184518461847184818491850185118521853185418551856185718581859186018611862186318641865186618671868186918701871187218731874187518761877187818791880188118821883188418851886188718881889189018911892189318941895
  1. <?php
  2. /**
  3. * 采购数据模型
  4. * Created by PhpStorm.
  5. * User: XiaoMing
  6. * Date: 2019/11/11
  7. * Time: 17:49
  8. */
  9. namespace JinDouYun\Model\Purchase;
  10. use Exception;
  11. use JinDouYun\Cache\Stock;
  12. use JinDouYun\Controller\Common\Logger;
  13. use JinDouYun\Dao\Order\DOrder;
  14. use JinDouYun\Dao\Order\DOrderGoods;
  15. use JinDouYun\Dao\Stock\DInventoryWarehouse;
  16. use JinDouYun\Model\Order\MOrder;
  17. use Mall\Framework\Core\ErrorCode;
  18. use Mall\Framework\Core\ResultWrapper;
  19. use Mall\Framework\Core\StatusCode;
  20. use JinDouYun\Model\Stock\MInventoryIn;
  21. use JinDouYun\Model\GoodsManage\MSku;
  22. use JinDouYun\Model\GoodsManage\MGoodsBasic;
  23. use JinDouYun\Model\MBaseModel;
  24. use JinDouYun\Model\Stock\MInventory;
  25. use JinDouYun\Model\Shop\MShop;
  26. use JinDouYun\Model\Merchant\MMerchant;
  27. use JinDouYun\Model\Stock\MWarehouse;
  28. use JinDouYun\Model\System\MPrintNum;
  29. use JinDouYun\Model\Finance\MRefund;
  30. use JinDouYun\Dao\Purchase\DPurchase;
  31. use JinDouYun\Dao\Purchase\DPurchaseGoods;
  32. use JinDouYun\Dao\Stock\DInventory;
  33. use JinDouYun\Dao\Shop\DShop;
  34. use Mall\Framework\Factory;
  35. use const Grpc\STATUS_ABORTED;
  36. use Util\Common\AgentTools;
  37. class MPurchase extends MBaseModel
  38. {
  39. private $objDPurchase;
  40. private $onlineUserId;
  41. private $onlineEnterpriseId;
  42. private $objPurchaseGoods;
  43. private $objDPurchaseGoods;
  44. private $objDInventory;
  45. private $objStock;
  46. private $cutTable = 200000;
  47. private $objDShop;
  48. /**
  49. * MOrder constructor.
  50. * @param $onlineUserId
  51. * @param $onlineEnterpriseId
  52. * @throws Exception
  53. */
  54. public function __construct($onlineUserId, $onlineEnterpriseId)
  55. {
  56. $this->onlineUserId = $onlineUserId;
  57. $this->onlineEnterpriseId = $onlineEnterpriseId;
  58. parent::__construct($this->onlineEnterpriseId, $this->onlineUserId);
  59. $this->objDPurchase = new DPurchase('stock');
  60. $this->objDPurchaseGoods = new DPurchaseGoods('stock');
  61. $this->objPurchaseGoods = new MPurchaseGoods($this->onlineUserId, $this->onlineEnterpriseId);
  62. $this->objDInventory = new DInventory('stock');
  63. $this->objDInventory->setTable('qianniao_inventory_' . $this->onlineEnterpriseId);
  64. $this->objDPurchase->setTable($this->objDPurchase->get_Table() . '_' . $this->onlineEnterpriseId);
  65. $this->objDPurchaseGoods->setTable($this->objDPurchaseGoods->get_Table() . '_' . $this->onlineEnterpriseId);
  66. $this->objDPurchaseGoods->setSearchIndex('purchase_details_search')->setType('purchase_details');
  67. $this->objStock = new Stock($this->onlineEnterpriseId);
  68. $this->objDShop = new DShop();
  69. $this->objDShop->setTable('qianniao_shop_1');
  70. }
  71. /**
  72. * 增加采购订单
  73. * @param $params
  74. * @return ResultWrapper
  75. * @throws Exception
  76. */
  77. public function addPurchase($params)
  78. {
  79. if(isset($params['departmentPath'])){
  80. $params['extends'] = json_encode(['departmentPath' => (string)$params['departmentPath']]);
  81. unset($params['departmentPath']);
  82. }
  83. $beginStatus = $this->objDPurchase->beginTransaction();
  84. $goodData = $params['goodsData'];
  85. unset($params['deleteArray']);
  86. unset($params['goodsData']);
  87. $purchaseAmount = 0; //采购总额
  88. $goodsNum = 0; // 统计采购订单总商品数
  89. foreach ($goodData as $key => $val) {
  90. $goodsNum = bcadd($val['buyerNum'], $goodsNum, 2);
  91. $purchaseAmount = bcadd($purchaseAmount, $val['subtotalPrice'], 4);
  92. }
  93. $params['purchaseAmount'] = $purchaseAmount;
  94. $params['goodsNum'] = $goodsNum;
  95. $params['createTime'] = time();
  96. $params['updateTime'] = time();
  97. //添加采购订单
  98. //no编号
  99. $dbResult = $this->objDPurchase->get('createTime >='.strtotime(date('Ymd'.'0:0:0')), 'no', 'createTime desc');
  100. if ($dbResult === false) {
  101. return ResultWrapper::fail($this->objDPurchase->error(), ErrorCode::$dberror);
  102. }
  103. if(empty($dbResult)){
  104. $params['no'] = createSerialNumberByDate('');
  105. }else{
  106. $params['no'] = createSerialNumberByDate($dbResult['no']);
  107. }
  108. //查询仓库数据
  109. $objMWarehouse = new MWarehouse($this->onlineEnterpriseId);
  110. $modelResult = $objMWarehouse->getWarehouse(['id' => $params['warehouseId'], 'deleteStatus' => StatusCode::$standard]);
  111. if(!$modelResult->isSuccess()){
  112. return ResultWrapper::fail($modelResult->getData(), $modelResult->getErrorCode());
  113. }
  114. $warehouseData = $modelResult->getData();
  115. unset($modelResult);
  116. if(empty($warehouseData)){
  117. return ResultWrapper::fail('仓库信息查询失败', ErrorCode::$paramError);
  118. }
  119. $params['warehouseId'] = $warehouseData['id'];
  120. $params['warehouseName'] = $warehouseData['warehouseName'];
  121. $params['inStatus'] = StatusCode::$delete;
  122. $params['returnStatus'] = StatusCode::$orderReturn['notReturn'];
  123. $params['auditStatus'] = StatusCode::$auditStatus['auditing'];
  124. $params['auditName'] = '';
  125. $params['auditId'] = 0;
  126. $params['auditTime'] = 0;
  127. $params['deleteStatus'] = StatusCode::$standard;
  128. $params['serialNum'] = $this->objStock->createSerialSn(0, 'purchase');
  129. $purchaseId = $this->objDPurchase->insert($params);
  130. if ($purchaseId === false) {
  131. $this->objDPurchase->rollBack();
  132. return ResultWrapper::fail($this->objDPurchase->error(), ErrorCode::$dberror);
  133. }
  134. $insert = [];
  135. foreach ($goodData as $details) {
  136. $insert[] = [
  137. 'basicGoodsId' => $details['basicGoodsId'],
  138. 'goodsCode' => $details['goodsCode'],
  139. 'goodsName' => $details['goodsName'],
  140. 'skuId' => $details['skuId'],
  141. 'buyerNum' => $details['buyerNum'],//采购数量
  142. 'inNum' => 0,//入库数量
  143. 'otherNum' => $details['otherNum'],
  144. 'inOfNum' => $details['buyerNum'],//待入库数量
  145. 'returnOnNum' => 0,//可退数量
  146. 'returnNum' => 0,//退货数量
  147. 'buyerUnitPrice' => $details['buyerUnitPrice'],
  148. 'subtotalPrice' => $details['subtotalPrice'],
  149. 'couponAmount' => getArrayItem($details, 'couponAmount', 0),
  150. 'otherAmount' => getArrayItem($details, 'otherAmount', 0),
  151. 'purchaseId' => $purchaseId,
  152. 'categoryId' => $details['categoryId'],
  153. 'categoryName' => $details['categoryName'],
  154. 'returnStatus' => StatusCode::$orderReturn['notReturn'],
  155. 'deleteStatus' => StatusCode::$standard,
  156. 'unitName' => isset($details['unitName']) ? $details['unitName'] : '',//单位名称
  157. 'skuName' => isset($details['skuName']) ? $details['skuName'] : ''
  158. ];
  159. }
  160. $dbResult = $this->objPurchaseGoods->addPurchaseGoods($insert);
  161. if (!$dbResult->isSuccess()) {
  162. $this->objDPurchase->rollBack();
  163. return ResultWrapper::fail($dbResult->getData(), ErrorCode::$dberror);
  164. }
  165. // 增加es数据
  166. /*
  167. $ids = $dbResult->getData();
  168. $modelResult = self::addEsData($insert, $params, $ids);
  169. if (!$modelResult->isSuccess()) {
  170. $this->objDPurchase->rollBack();
  171. return ResultWrapper::fail($modelResult->getData(), $modelResult->getErrorCode());
  172. }*/
  173. $beginStatus && $this->objDPurchase->commit();
  174. return ResultWrapper::success($purchaseId);
  175. }
  176. /**
  177. * 采购订单详情
  178. * @param $id
  179. * @return ResultWrapper
  180. * @throws Exception
  181. */
  182. public function getPurchaseInfoById($id)
  183. {
  184. $dbResult = $this->objDPurchase->get($id);
  185. if ($dbResult === false) {
  186. return ResultWrapper::fail($this->objDPurchase->error(), ErrorCode::$dberror);
  187. }
  188. if (empty($dbResult)) return ResultWrapper::success([]);
  189. $purchaseData = $dbResult;
  190. unset($dbResult);
  191. $dbResult = $this->objDPurchaseGoods->select(['purchaseId' => $purchaseData['id'], 'deleteStatus' => StatusCode::$standard]);
  192. if ($dbResult === false) {
  193. return ResultWrapper::fail($this->objDPurchaseGoods->error(), ErrorCode::$paramError);
  194. }
  195. $purchaseData['details'] = $dbResult;
  196. $purchaseData['type'] = StatusCode::$orderType['purchaseOrder'];
  197. unset($dbResult);
  198. $purchaseData['details'] = parent::formatOrderMan($this->onlineEnterpriseId, $purchaseData['details']);
  199. $objMPrintNum = new MPrintNum($this->onlineEnterpriseId);
  200. $purchaseData['printNum'] = $objMPrintNum->getObjectPrintNum($purchaseData['no'], StatusCode::$orderType['purchaseIn']);
  201. return ResultWrapper::success($purchaseData);
  202. }
  203. /**
  204. * 采购订单详情和批次数据(采购退货专用)
  205. * @param $params
  206. * @return ResultWrapper
  207. * @throws Exception
  208. */
  209. public function getPurchaseAndBatchInfoById($params)
  210. {
  211. $id = $params['id'];
  212. $warehouseId = $params['warehouseId'];
  213. if(empty($warehouseId)){
  214. return ResultWrapper::fail('查询批次仓库id错误', ErrorCode::$paramError);
  215. }
  216. //查询采购数量
  217. $dbResult = $this->objDPurchaseGoods->select(['purchaseId' => $id, 'deleteStatus' => StatusCode::$standard, 'inStatus' => [5,6], 'returnStatus' => [0,1]]);
  218. if($dbResult === false){
  219. return ResultWrapper::fail($this->objDPurchaseGoods->error(), ErrorCode::$dberror);
  220. }
  221. $detailsResult = $dbResult;
  222. unset($dbResult);
  223. //查询所有单位的主单位
  224. $skuIds = array_column($detailsResult, 'skuId');
  225. $objMSku = new MSku($this->onlineUserId, $this->onlineEnterpriseId);
  226. $modelResult = $objMSku->getConversion($skuIds);
  227. if(!$modelResult->isSuccess()){
  228. return ResultWrapper::fail($modelResult->getData(), $modelResult->getErrorCode());
  229. }
  230. $skuResult = $modelResult->getData();
  231. unset($modelResult);
  232. foreach($detailsResult as &$value){
  233. $value['masterSkuId'] = $skuResult[$value['skuId']]['masterSkuId'];
  234. }
  235. unset($value);
  236. //库存剩余
  237. $sql = 'select * from qianniao_inventory_batch_'.$this->onlineEnterpriseId.'_'.$warehouseId.' where originId = '.$id;
  238. $dbResult = $this->objDPurchaseGoods->query($sql);
  239. if ($dbResult === false) {
  240. return ResultWrapper::fail($this->objDPurchase->error(), ErrorCode::$dberror);
  241. }
  242. $batchResult = $dbResult;
  243. unset($dbResult);
  244. $batchData = [];
  245. foreach($batchResult as $value){
  246. $batchData[$value['skuId']]['num'] += $value['num'];
  247. }
  248. //映射数量
  249. foreach($detailsResult as &$value){
  250. if(isset($batchData[$value['masterSkuId']])){
  251. $value['num'] = $batchData[$value['masterSkuId']]['num'];
  252. }
  253. }
  254. //转换数量
  255. $objMInventory = new MInventory($this->onlineEnterpriseId, $this->onlineUserId);
  256. $modelResult = $objMInventory->conversionMinorSku($detailsResult);
  257. if (!$modelResult->isSuccess()) {
  258. return ResultWrapper::fail($modelResult->getData(), $modelResult->getErrorCode());
  259. }
  260. $details = $modelResult->getData();
  261. unset($modelResult);
  262. $returnData = parent::formatOrderMan($this->onlineEnterpriseId, $details);
  263. return ResultWrapper::success($returnData);
  264. }
  265. /**
  266. * 修改采购单 and ESData 库存审核入库用
  267. * 可公用
  268. * @param $updateData
  269. * @param $where
  270. * @return ResultWrapper
  271. * @throws Exception
  272. */
  273. public function updatePurchaseData($updateData, $where)
  274. {
  275. $updateData['updateTime'] = time();
  276. $updateDetailsData = $updateData['details'];
  277. unset($updateData['details']);
  278. //查询详情
  279. $this->objDPurchaseGoods->setTable('qianniao_purchase_goods' . '_' . $this->onlineEnterpriseId);
  280. $dbResult = $this->objDPurchaseGoods->select(['purchaseId' => $where['id'], 'deleteStatus' => StatusCode::$standard]);
  281. if ($dbResult === false) {
  282. return ResultWrapper::fail($this->objDPurchaseGoods->error(), ErrorCode::$dberror);
  283. }
  284. $details = $dbResult;
  285. unset($dbResult);
  286. //修改采购单es 入库状态 入库数量
  287. $updateData['inStatus'] = 5;
  288. foreach ($details as $value) {
  289. if($updateDetailsData[$value['skuId']]){
  290. $inStatus = 5;
  291. if(bcsub($value['buyerNum'], bcadd($updateDetailsData[$value['skuId']]['inNum'], $value['inNum'])) > 0){
  292. $updateData['inStatus'] = 6;
  293. $inStatus = 6;
  294. }
  295. $updateDetails = [
  296. 'inNum' => bcadd($updateDetailsData[$value['skuId']]['inNum'], $value['inNum']),
  297. 'inOfNum' => bcsub($value['inOfNum'], $updateDetailsData[$value['skuId']]['inNum']),
  298. 'returnOnNum' => bcadd($updateDetailsData[$value['skuId']]['inNum'], $value['returnOnNum']),
  299. 'inStatus' => $inStatus,
  300. 'updateTime' => time(),
  301. ];
  302. $dbResult = $this->objDPurchaseGoods->update($updateDetails, ['id' => $value['id'], 'skuId' => $value['skuId']]);
  303. if($dbResult === false){
  304. return ResultWrapper::fail($this->objDPurchaseGoods->error(), ErrorCode::$dberror);
  305. }
  306. // $esId = parent::setEsId($this->onlineEnterpriseId, 'PurchaseDetailsId', $value['id']);
  307. // $esResult = $this->objDPurchaseGoods->esupdateTypeFieldVaule($updateDetails, $esId);
  308. // if (!$esResult) {
  309. // return ResultWrapper::fail($esResult, ErrorCode::$dberror);
  310. // }
  311. }else{
  312. $updateData['inStatus'] = 6;
  313. }
  314. }
  315. $dbResult = $this->objDPurchase->update($updateData, $where);
  316. if ($dbResult === false) {
  317. ResultWrapper::fail($this->objDPurchase->error(), ErrorCode::$dberror);
  318. }
  319. $returnData = $dbResult;
  320. unset($dbResult);
  321. var_dump($updateData);
  322. var_dump($where);
  323. if($updateData['inStatus']==5){
  324. AgentTools::addTask($where['id'], $this->onlineEnterpriseId);
  325. }
  326. return ResultWrapper::success($returnData);
  327. }
  328. /**
  329. * 修改采购单退货状态
  330. * @param $purchaseId
  331. * @param $detailsData
  332. * @return ResultWrapper
  333. * @throws Exception
  334. */
  335. public function updatePurchaseDetailsReturnStatus($purchaseId, $detailsData)
  336. {
  337. $updateData['updateTime'] = time();
  338. //默认全部退货
  339. $updateData['returnStatus'] = StatusCode::$orderReturn['allReturn'];
  340. //查询详情
  341. $this->objDPurchaseGoods->setTable('qianniao_purchase_goods' . '_' . $this->onlineEnterpriseId);
  342. $dbResult = $this->objDPurchaseGoods->select(['purchaseId' => $purchaseId, 'deleteStatus' => StatusCode::$standard]);
  343. if ($dbResult === false) {
  344. return ResultWrapper::fail($this->objDPurchaseGoods->error(), ErrorCode::$dberror);
  345. }
  346. $details = $dbResult;
  347. unset($dbResult);
  348. $beginStatus = $this->objDPurchaseGoods->beginTransaction();
  349. //修改采购单es 入库状态
  350. foreach ($details as $value) {
  351. if(isset($detailsData[$value['skuId']])){
  352. if($detailsData[$value['skuId']]['num'] > $value['returnOnNum']){
  353. $this->objDPurchaseGoods->rollBack();
  354. return ResultWrapper::fail('退货数量不能大于可退数量', ErrorCode::$paramError);
  355. }
  356. $returnStatus = 2;
  357. if(bcsub($value['returnOnNum'], $detailsData[$value['skuId']]['num']) > 0){
  358. //部分退货
  359. $updateData['returnStatus'] = StatusCode::$orderReturn['partReturn'];
  360. $returnStatus = 1;
  361. }
  362. $updateDetails = [
  363. 'updateTime' => time(),
  364. 'returnOnNum' => bcsub($value['returnOnNum'], $detailsData[$value['skuId']]['num']),//可退数量
  365. 'returnNum' => bcadd($detailsData[$value['skuId']]['num'], $value['returnNum']),//退货数量
  366. 'returnStatus' => $returnStatus
  367. ];
  368. //修改数据库
  369. $dbResult = $this->objDPurchaseGoods->update($updateDetails, ['id' => $value['id'], 'skuId' => $value['skuId']]);
  370. if($dbResult === false){
  371. $this->objDPurchaseGoods->rollBack();
  372. return ResultWrapper::fail($this->objDPurchaseGoods->error(), ErrorCode::$dberror);
  373. }
  374. //修改es
  375. /*
  376. $esId = parent::setEsId($this->onlineEnterpriseId, 'PurchaseDetailsId', $value['id']);
  377. $esResult = $this->objDPurchaseGoods->esupdateTypeFieldVaule($updateDetails, $esId);
  378. if (!$esResult) {
  379. $this->objDPurchaseGoods->rollBack();
  380. return ResultWrapper::fail($esResult, ErrorCode::$dberror);
  381. }*/
  382. }else{
  383. //部分退货
  384. $updateData['returnStatus'] = StatusCode::$orderReturn['partReturn'];
  385. }
  386. }
  387. //修改采购单
  388. $dbResult = $this->objDPurchase->update($updateData, ['id' => $purchaseId]);
  389. if ($dbResult === false) {
  390. $this->objDPurchaseGoods->rollBack();
  391. ResultWrapper::fail($this->objDPurchase->error(), ErrorCode::$dberror);
  392. }
  393. $returnData = $dbResult;
  394. unset($dbResult);
  395. $beginStatus && $this->objDPurchaseGoods->commit();
  396. return ResultWrapper::success($returnData);
  397. }
  398. /**
  399. * 编辑采购订单
  400. * @param $params
  401. * @return ResultWrapper
  402. * @throws Exception
  403. */
  404. public function editPurchase($params)
  405. {
  406. if (empty($params['id'])) {
  407. return ResultWrapper::fail('没有id', ErrorCode::$paramError);
  408. }
  409. $id = $params['id'];
  410. $deleteArray = $params['deleteArray'];
  411. unset($params['id']);
  412. unset($params['source']);
  413. unset($params['deleteArray']);
  414. $this->objDPurchase->beginTransaction();
  415. $goodData = $params['goodsData'];
  416. unset($params['goodsData']);
  417. $purchaseAmount = 0; //采购总额
  418. $goodsNum = 0; // 统计采购订单总商品数
  419. foreach ($goodData as $key => $val) {
  420. $goodsNum = bcadd($val['buyerNum'], $goodsNum, 2);
  421. $purchaseAmount = bcadd($purchaseAmount, $val['subtotalPrice'], 4);
  422. $goodData[$key]['inOfNum'] = $val['buyerNum'];
  423. }
  424. $params['purchaseAmount'] = $purchaseAmount;
  425. $params['goodsNum'] = $goodsNum;
  426. $dbResult = $this->objDPurchase->update($params, $id);
  427. if ($dbResult === false) {
  428. $this->objDPurchase->rollBack();
  429. return ResultWrapper::fail($this->objDPurchase->error(), ErrorCode::$dberror);
  430. }
  431. unset($dbResult);
  432. $objPurchaseGoods = new MPurchaseGoods($this->onlineUserId, $this->onlineEnterpriseId);
  433. $dbResult = $objPurchaseGoods->editPurchaseGoods($goodData, ['purchaseId' => $id, 'deleteArray' => $deleteArray]);
  434. if (!$dbResult->isSuccess()) {
  435. $this->objDPurchase->rollBack();
  436. return ResultWrapper::fail($dbResult->getData(), ErrorCode::$dberror);
  437. }
  438. $this->objDPurchase->commit();
  439. return ResultWrapper::success($dbResult);
  440. }
  441. /**
  442. * 更新审核状态
  443. * @param $params
  444. * @return ResultWrapper
  445. * @throws Exception
  446. */
  447. public function updateAuditStatus($params)
  448. {
  449. $id = $params['id'];
  450. unset($params['id']);
  451. $sql = "select *,p.id as pid,g.id as gid from " . $this->objDPurchase->get_Table() . " p left join qianniao_purchase_goods_" . $this->onlineEnterpriseId . " g on p.id = g.purchaseId where p.id = " . $id . " and p.deleteStatus = " . StatusCode::$standard . ' and g.deleteStatus = ' . StatusCode::$standard;
  452. $purchaseData = $this->objDPurchase->query($sql);
  453. if ($purchaseData === false) {
  454. return ResultWrapper::fail($this->objDPurchase->error(), ErrorCode::$dberror);
  455. }
  456. if (empty($purchaseData)) {
  457. return ResultWrapper::fail('审核的单据不存在', ErrorCode::$contentNotExists);
  458. }
  459. if ($purchaseData[0]['auditStatus'] == StatusCode::$auditStatus['auditPass']) {
  460. return ResultWrapper::fail('当前单据已经审核通过', ErrorCode::$notAllowAccess);
  461. }
  462. $beginStatus = $this->objDPurchase->beginTransaction();
  463. $dbResult = $this->objDPurchase->update($params, $id);
  464. if ($dbResult === false) {
  465. $this->objDPurchase->rollBack();
  466. return ResultWrapper::fail($this->objDPurchase->error(), ErrorCode::$dberror);
  467. }
  468. if($purchaseData[0]['purchaseType'] == StatusCode::$standard){
  469. $source = StatusCode::$orderType['merchantPurchase'];
  470. $type = StatusCode::$orderType['merchantPurchaseIn'];
  471. }else{
  472. $source = StatusCode::$orderType['purchaseOrder'];
  473. $type = StatusCode::$orderType['purchaseIn'];
  474. }
  475. $purchaseInData = [
  476. 'sourceId' => $purchaseData[0]['purchaseId'],//来源id
  477. 'sourceNo' => $purchaseData[0]['no'],//来源单号
  478. 'materielNum' => 0, //入库数量
  479. 'merchantId' => $purchaseData[0]['merchantId'],//商户id
  480. 'originId' => $purchaseData[0]['purchaseId'],//源头id
  481. 'originNo' => $purchaseData[0]['no'],//源头单号
  482. 'shopId' => $purchaseData[0]['shopId'],
  483. 'warehouseId' => $purchaseData[0]['warehouseId'],//仓库id
  484. 'warehouseName' => $purchaseData[0]['warehouseName'],//仓库名称
  485. 'operatorId' => $purchaseData[0]['operatorId'], //制单人id
  486. 'operatorName' => $purchaseData[0]['operatorName'], //制单人姓名
  487. 'source' => $source,
  488. 'type' => $type,
  489. 'orderGoodsData' => []
  490. ];
  491. $amount = 0;
  492. foreach ($purchaseData as $key => $value) {
  493. $purchaseInData['materielNum']++;
  494. $amount += $value['subtotalPrice'];
  495. $purchaseInData['orderGoodsData'][] = [
  496. 'materielId' => $value['basicGoodsId'],
  497. 'materielName' => $value['goodsName'],
  498. 'materielCode' => $value['goodsCode'],
  499. 'skuId' => $value['skuId'],
  500. 'unitName' => isset($value['unitName']) ? $value['unitName'] : '',
  501. 'skuName' => isset($value['skuName']) ? $value['skuName'] : '',
  502. 'num' => $value['buyerNum'],
  503. 'otherNum' => $value['otherNum'],
  504. 'unitPrice' => $value['buyerUnitPrice'],
  505. 'totalPrice' => $value['subtotalPrice'],
  506. ];
  507. //更新es审核
  508. /*
  509. $esId = parent::setEsId($this->onlineEnterpriseId, 'PurchaseDetailsId', $value['gid']);
  510. $esResult = $this->objDPurchaseGoods->esupdateTypeFieldVaule($params, $esId);
  511. if (!$esResult) {
  512. return ResultWrapper::fail($esResult, ErrorCode::$dberror);
  513. }*/
  514. }
  515. $purchaseInData['operatorId'] = $params['auditId'];
  516. $purchaseInData['operatorName'] = $params['auditName'];
  517. $purchaseInData['amount'] = $amount;
  518. $objMInventoryIn = new MInventoryIn($this->onlineEnterpriseId, $this->onlineUserId);
  519. $dbResult = $objMInventoryIn->addInventoryIn($purchaseInData);
  520. if (!$dbResult->isSuccess()) {
  521. $this->objDPurchase->rollBack();
  522. return ResultWrapper::fail($dbResult->getData(), ErrorCode::$dberror);
  523. }
  524. $beginStatus && $this->objDPurchase->commit();
  525. return ResultWrapper::success($dbResult->getData());
  526. }
  527. /**
  528. * 删除采购单
  529. * @param $id
  530. * @return ResultWrapper
  531. */
  532. public function delPurchase($id)
  533. {
  534. $dbResult = $this->objDPurchase->update(['deleteStatus' => StatusCode::$delete], $id);
  535. if ($dbResult === false) {
  536. return ResultWrapper::fail($this->objDPurchase->error(), ErrorCode::$dberror);
  537. } else {
  538. return ResultWrapper::success($dbResult);
  539. }
  540. }
  541. /**
  542. * 采购单列表
  543. * @param $selectParams
  544. * @param $export
  545. * @return ResultWrapper
  546. * @throws Exception
  547. */
  548. public function getAllPurchase($selectParams, $export)
  549. {
  550. $selectParams = parent::getStaffQueryParams($selectParams, 'buyerId');
  551. $limit = $selectParams['limit'];
  552. unset($selectParams['limit']);
  553. $offset = $selectParams['offset'];
  554. unset($selectParams['offset']);
  555. $isSelectInventory = isset($selectParams['isSelectInventory']) ? $selectParams['isSelectInventory'] : true;
  556. unset($selectParams['isSelectInventory']);
  557. $selectParams['deleteStatus'] = StatusCode::$standard;
  558. //查询商铺绑定仓库
  559. if(isset($selectParams['shopId']) && !empty($selectParams['shopId'])){
  560. $objMShop = new MShop($this->onlineEnterpriseId);
  561. $modelResult = $objMShop->getShopBindWarehouse($selectParams['shopId']);
  562. if(!$modelResult->isSuccess()){
  563. return ResultWrapper::fail($modelResult->getData(), $modelResult->getErrorCode());
  564. }
  565. $shop = $modelResult->getData();
  566. unset($modelResult);
  567. if(empty($shop)){
  568. return ResultWrapper::fail('商铺查询失败', ErrorCode::$dberror);
  569. }
  570. $selectParams['warehouseId'] = $shop['warehouseId'];
  571. }
  572. if ($export) {
  573. $modelResult = self::export($selectParams);
  574. if (!$modelResult->isSuccess()) {
  575. return ResultWrapper::fail($modelResult->getData(), $modelResult->getErrorCode());
  576. }
  577. exit;
  578. }
  579. $dbResult = $this->objDPurchase->select($selectParams, '*', 'createTime desc', $limit, $offset);
  580. if ($dbResult === false) {
  581. return ResultWrapper::fail($this->objDPurchase->error(), ErrorCode::$dberror);
  582. }
  583. $total = $this->objDPurchase->count($selectParams);
  584. $purchaseData = self::format($dbResult);
  585. $return = [
  586. 'data' => $purchaseData,
  587. 'total' => ($total) ? intval($total) : 0,
  588. ];
  589. $objMInventory = new MInventory($this->onlineEnterpriseId, $this->onlineUserId);
  590. $objMInventory->updateCache = true;
  591. return ResultWrapper::success($return);
  592. }
  593. /**
  594. * 根据采购单查询批次商品sku剩余库存数量
  595. * @param $purchaseId
  596. * @return ResultWrapper
  597. */
  598. public function getInventoryBatchNum($purchaseId)
  599. {
  600. $dbResult = $this->objDPurchase->get(['id' => $purchaseId, 'deleteStatus' => StatusCode::$standard]);
  601. if ($dbResult === false) {
  602. return ResultWrapper::fail($this->objDPurchase->error, ErrorCode::$dberror);
  603. }
  604. if (empty($dbResult)) {
  605. return ResultWrapper::fail('采购单据查询失败', ErrorCode::$dberror);
  606. }
  607. $purchaseData = $dbResult;
  608. unset($dbResult);
  609. $dbResult = $this->objDPurchaseGoods->select(['purchaseId' => $purchaseId, 'deleteStatus' => StatusCode::$standard]);
  610. if ($dbResult === false) {
  611. return ResultWrapper::fail($this->objDPurchaseGoods->error, ErrorCode::$dberror);
  612. }
  613. if (empty($dbResult)) {
  614. return ResultWrapper::fail('采购单据详情查询失败', ErrorCode::$dberror);
  615. }
  616. $purchaseData['goodsData'] = $dbResult;
  617. unset($dbResult);
  618. $objMInventory = new MInventory($this->onlineEnterpriseId, $this->onlineUserId);
  619. foreach ($purchaseData['goodsData'] as $value) {
  620. $skuIds[] = $value['skuId'];
  621. }
  622. $modelResult = $objMInventory->getBatchDataByOriginId($purchaseData['warehouseId'], $purchaseData['id'], $skuIds);
  623. if (!$modelResult->isSuccess()) {
  624. return ResultWrapper::fail($modelResult->getData(), $modelResult->getErrorCode());
  625. }
  626. $batchData = $modelResult->getData();
  627. if (empty($batchData)) {
  628. return ResultWrapper::fail('批次数据查询失败', ErrorCode::$paramError);
  629. }
  630. // 采购订单有多个入库批次情况
  631. foreach ($batchData as $key => $value){
  632. $batchData[$value['skuId']]['num'] += $value['num'];
  633. }
  634. foreach ($purchaseData['goodsData'] as &$value) {
  635. $value['inventoryBatchNum'] = 0;
  636. if (isset($batchData[$value['skuId']])) {
  637. $value['inventoryBatchNum'] = $batchData[$value['skuId']]['num'];
  638. }
  639. }
  640. return ResultWrapper::success($purchaseData);
  641. }
  642. /**
  643. * 采购汇总
  644. * @param $selectParams
  645. * @param $type
  646. * @return ResultWrapper
  647. * @throws Exception
  648. */
  649. public function getAllPurchaseByFields($selectParams, $type ,$export = 0)
  650. {
  651. $defaultDbName = Factory::config()->get('db.default.dbname');
  652. $limit = $selectParams['limit'];
  653. unset($selectParams['limit']);
  654. $offset = $selectParams['offset'];
  655. unset($selectParams['offset']);
  656. $onReturn = $selectParams['onReturn'];
  657. unset($selectParams['onReturn']);
  658. if($export){
  659. $limit = 999;
  660. $offset = 0;
  661. }
  662. $groupBySql = '';
  663. if ($type == 1) {//商品
  664. $groupBySql = ' GROUP BY g.basicGoodsId';
  665. } elseif ($type == 2) {//供应商
  666. $groupBySql = ' GROUP BY p.supplierId,g.basicGoodsId';
  667. } elseif ($type == 3) {//采购人员
  668. $groupBySql = ' GROUP BY p.buyerId,g.basicGoodsId';
  669. } elseif($type == 4){
  670. $groupBySql = ' GROUP BY p.shopId,g.basicGoodsId';
  671. }else {
  672. return ResultWrapper::fail('type参数错误', ErrorCode::$paramError);
  673. }
  674. $whereSql = '';
  675. if (isset($selectParams['warehouseId']) && !empty($selectParams['warehouseId'])) {
  676. $where = empty($whereSql) ? ' WHERE ' : ' AND ';
  677. $whereSql .= $where . ' p.warehouseId = ' . $selectParams['warehouseId'];
  678. }
  679. if (isset($selectParams['inStatus']) && !empty($selectParams['inStatus'])) {
  680. $where = empty($whereSql) ? ' WHERE ' : ' AND ';
  681. $whereSql .= $where . ' p.inStatus = ' . $selectParams['inStatus'];
  682. }
  683. if (isset($selectParams['goodsName']) && !empty($selectParams['goodsName'])) {
  684. $where = empty($whereSql) ? ' WHERE ' : ' AND ';
  685. $whereSql .= $where . ' g.goodsName LIKE "%' . $selectParams['goodsName'] . '%" ';
  686. }
  687. if (isset($selectParams['categoryId']) && !empty($selectParams['categoryId'])) {
  688. $where = empty($whereSql) ? ' WHERE ' : ' AND ';
  689. $whereSql .= $where . ' g.categoryId = ' . $selectParams['categoryId'];
  690. }
  691. if (isset($selectParams['start']) && !empty($selectParams['start']) && isset($selectParams['end']) && !empty($selectParams['end'])) {
  692. $where = empty($whereSql) ? ' WHERE ' : ' AND ';
  693. $whereSql .= $where . ' p.createTime BETWEEN ' . $selectParams['start'] . ' AND ' . $selectParams['end'];
  694. }
  695. if (isset($selectParams['supplierId']) && !empty($selectParams['supplierId'])) {
  696. $where = empty($whereSql) ? ' WHERE ' : ' AND ';
  697. $whereSql .= $where . ' p.supplierId = ' . $selectParams['supplierId'];
  698. }
  699. if (isset($selectParams['buyerId']) && !empty($selectParams['buyerId'])) {
  700. $where = empty($whereSql) ? ' WHERE ' : ' AND ';
  701. $whereSql .= $where . ' p.buyerId = ' . $selectParams['buyerId'];
  702. }
  703. if (isset($selectParams['shopId']) && !empty($selectParams['shopId'])) {
  704. $where = empty($whereSql) ? ' WHERE ' : ' AND ';
  705. $whereSql .= $where . ' p.shopId = ' . $selectParams['shopId'];
  706. }
  707. //统计已审核 未删除主单据 未删除详情 的采购订单
  708. $where = empty($whereSql) ? ' WHERE ' : ' AND ';
  709. $whereSql .= $where . ' p.auditStatus = ' . StatusCode::$auditStatus['auditPass'] . ' AND p.deleteStatus = ' . StatusCode::$standard . ' AND g.deleteStatus = ' . StatusCode::$standard;
  710. $sql = 'SELECT p.warehouseId,p.warehouseName,p.id,p.`no`,p.buyerId,p.buyerName,p.supplierId,p.supplierName,p.operatorId,p.operatorName,p.inStatus,s.name as shopName,g.skuId,g.categoryId,g.categoryName,g.basicGoodsId AS materielId,g.goodsName AS materielName,g.goodsCode AS materielCode,SUM(g.buyerNum) AS allNum,SUM(g.subtotalPrice) AS total,(SUM(g.subtotalPrice) / SUM(g.buyerNum)) AS costPrice, SUM(g.otherNum) AS otherNum '
  711. . 'FROM ' . $this->objDPurchase->get_Table() . ' p '
  712. . 'LEFT JOIN `'.$defaultDbName.'`.'.$this->objDShop->get_Table().' s ON s.id = p.shopId '
  713. . 'LEFT JOIN ' . $this->objDPurchaseGoods->get_Table() . ' g ON p.id = g.purchaseId '
  714. . $whereSql . ' ' . $groupBySql . ' '
  715. . 'ORDER BY p.createTime DESC LIMIT ' . $offset . ' , ' . $limit;
  716. $dbResult = $this->objDPurchase->query($sql);
  717. if ($dbResult === false) {
  718. return ResultWrapper::fail($this->objDPurchase->error(), ErrorCode::$dberror);
  719. }
  720. $selectData = $dbResult;
  721. unset($dbResult);
  722. $totalSql = 'SELECT COUNT(id) AS total FROM (SELECT p.id FROM ' . $this->objDPurchase->get_Table() . ' p '
  723. . 'LEFT JOIN `'.$defaultDbName.'`.'.$this->objDShop->get_Table().' s ON s.id = p.shopId '
  724. . 'LEFT JOIN ' . $this->objDPurchaseGoods->get_Table() . ' g ON p.id = g.purchaseId ' . $whereSql . ' ' . $groupBySql . ') AS selectData';
  725. $dbResult = $this->objDPurchase->query($totalSql);
  726. if ($dbResult === false) {
  727. return ResultWrapper::fail($this->objDPurchase->error(), ErrorCode::$dberror);
  728. }
  729. $countData = array_shift($dbResult);
  730. unset($dbResult);
  731. //判断是否需要退货
  732. /*if ($onReturn) {
  733. //查询所有已退货的采购单 查询条件 已审核 未删除主单据 未删除详情 的采购退货单 关联 采购单
  734. $objMPurchaseOut = new MPurchaseOut($this->onlineUserId, $this->onlineEnterpriseId);
  735. $modelResult = $objMPurchaseOut->getReturnDataByShopIds([$selectParams['shopId']]);
  736. if (!$modelResult->isSuccess()) {
  737. return ResultWrapper::fail($modelResult->getData(), $modelResult->getErrorCode());
  738. }
  739. $purchaseOutData = $modelResult->getData();
  740. foreach ($selectData as &$value) {
  741. if (isset($purchaseOutData[$value['materielId']])) {
  742. $value['allNum'] = bcsub($value['allNum'], $purchaseOutData[$value['materielId']]['num']);
  743. $value['total'] = bcmul($value['allNum'], $value['costPrice']);
  744. }
  745. }
  746. unset($value);
  747. }*/
  748. $return = [
  749. 'data' => parent::formatOrderMan($this->onlineEnterpriseId, $selectData),
  750. 'total' => ($countData['total']) ? intval($countData['total']) : 0,
  751. ];
  752. //导出
  753. if($export){
  754. self::exportPurchaseByFields($return['data']);
  755. exit;
  756. }
  757. return ResultWrapper::success($return);
  758. }
  759. /**
  760. * 汇总搜索 (暂未使用)
  761. * @param $params
  762. * @param $type
  763. * @param $export
  764. * @return ResultWrapper
  765. */
  766. public function searchAllPurchaseByFields($params, $type, $export)
  767. {
  768. $onReturn = $params['onReturn'];
  769. unset($params['onReturn']);
  770. $defaultDSL = ['from' => $params['offset'], 'size' => $params['limit'], 'sort' => ['createTime' => ['order' => 'desc']]];
  771. $selectParams = [];
  772. $groupBySql = '';
  773. if ($type == 1) {//商品
  774. $groupBySql = ' GROUP BY g.basicGoodsId';
  775. } elseif ($type == 2) {//供应商
  776. $groupBySql = ' GROUP BY p.supplierId,g.basicGoodsId';
  777. } elseif ($type == 3) {//采购人员
  778. $groupBySql = ' GROUP BY p.buyerId,g.basicGoodsId';
  779. } else {
  780. return ResultWrapper::fail('type参数错误', ErrorCode::$paramError);
  781. }
  782. $selectParams[] = ['term' => ['enterpriseId' => $this->onlineEnterpriseId]];
  783. !empty($params['categoryId']) && $selectParams[] = ['term' => ['categoryId' => $params['categoryId']]];
  784. !empty($params['shopId']) && $selectParams[] = ['term' => ['shopId' => $params['shopId']]];
  785. !empty($params['inStatus']) && $selectParams[] = ['term' => ['inStatus' => $params['inStatus']]];
  786. (!empty($params['start']) && !empty($params['end'])) && $selectParams[] = ['range' => ['createTime' => ['gte' => $params['start'], 'lte' => $params['end']]]];
  787. !empty($params['search']) && $selectParams[] = ['multi_match' => ['fields' => ['goodsName', 'goodsCode'], 'query' => $params['search'], 'fuzziness' => 'AUTO']];
  788. $dsl = [];
  789. !empty($selectParams) && $dsl['query']['bool']['must'][] = $selectParams;
  790. $dsl = array_merge($defaultDSL, $dsl);
  791. $dbResult = $this->objDPurchaseGoods->getSearchQueryDsl($dsl);
  792. if (isset($dbResult['error'])) {
  793. return ResultWrapper::fail($dbResult, ErrorCode::$dberror);
  794. }
  795. $returnData = parent::formatEsSelectData($dbResult, $this->onlineEnterpriseId, StatusCode::$orderType['purchaseOrder']);
  796. return ResultWrapper::success($returnData);
  797. }
  798. /**
  799. * 查询采购数据和详情数据
  800. * @param $selectParams
  801. * @return ResultWrapper
  802. * @throws Exception
  803. */
  804. public function getAllPurchaseAndDetails($selectParams)
  805. {
  806. $this->objDPurchaseGoods->setTable('qianniao_purchase_goods' . '_' . $this->onlineEnterpriseId);
  807. $limit = $selectParams['limit'];
  808. unset($selectParams['limit']);
  809. $offset = $selectParams['offset'];
  810. unset($selectParams['offset']);
  811. $field = 'p.*,g.basicGoodsId,g.goodsName,g.goodsCode,g.skuId,g.buyerNum,g.buyerUnitPrice,g.subtotalPrice';
  812. $where = ' where p.deleteStatus = ' . StatusCode::$standard;
  813. isset($selectParams['orderStatus']) && $where .= ' and p.orderStatus = ' . $selectParams['orderStatus'];
  814. $orderBy = ' order by p.createTime desc ';
  815. $limitSql = ' limit ' . $offset . ',' . $limit;
  816. $sql = 'select ' . $field . ' from ' . $this->objDPurchase->get_Table() . ' p left join ' . $this->objDPurchaseGoods->get_Table() . ' g on p.id = g.purchaseId' . $where . $orderBy . $limitSql;
  817. $dbResult = $this->objDPurchase->query($sql);
  818. if ($dbResult === false) {
  819. return ResultWrapper::fail($this->objDPurchase->error(), ErrorCode::$dberror);
  820. }
  821. $field = 'count(g.id) as count';
  822. $sql = 'select ' . $field . ' from ' . $this->objDPurchase->get_Table() . ' p left join ' . $this->objDPurchaseGoods->get_Table() . ' g on p.id = g.purchaseId' . $where;
  823. $totalData = $this->objDPurchase->query($sql);
  824. if ($totalData === false) {
  825. return ResultWrapper::fail($this->objDPurchase->error(), ErrorCode::$dberror);
  826. }
  827. $total = array_shift($totalData)['count'];
  828. $return = [
  829. 'data' => $dbResult,
  830. 'total' => ($total) ? intval($total) : 0,
  831. ];
  832. return ResultWrapper::success($return);
  833. }
  834. /**
  835. * 采购明细页面数据统计
  836. *
  837. * @throws Exception
  838. */
  839. public function getAllData()
  840. {
  841. $this->objDPurchaseGoods->setTable('qianniao_purchase_goods' . '_' . $this->onlineEnterpriseId);
  842. //供应商总数
  843. $objMSupplier = new MSupplier($this->onlineUserId, $this->onlineEnterpriseId);
  844. $modelResult = $objMSupplier->getAllSupplierNum();
  845. if (!$modelResult->isSuccess()) {
  846. return ResultWrapper::fail($modelResult->getData(), $modelResult->getErrorCode());
  847. }
  848. $data['supplierNum'] = $modelResult->getData();
  849. unset($modelResult);
  850. //采购订单总数
  851. $dbResult = $this->objDPurchase->count(['deleteStatus' => StatusCode::$standard]);
  852. if ($dbResult === false) {
  853. return ResultWrapper::fail($this->objDPurchase->error(), ErrorCode::$dberror);
  854. }
  855. $data['purchaseNum'] = $dbResult;
  856. unset($dbResult);
  857. //采购总金额
  858. $sql = "select sum(purchaseAmount) amount from " . $this->objDPurchase->get_Table() . " where deleteStatus = " . StatusCode::$standard;
  859. $dbResult = $this->objDPurchase->query($sql);
  860. if ($dbResult === false) {
  861. return ResultWrapper::fail($this->objDPurchase->error(), ErrorCode::$dberror);
  862. }
  863. $data['purchaseAmount'] = array_shift($dbResult)['amount'];
  864. unset($dbResult);
  865. //商品种类数量(根据商品skuId)
  866. $sql = "SELECT count(1) as count FROM (SELECT skuId FROM " . $this->objDPurchaseGoods->get_Table() . " GROUP BY skuId) as skuData";
  867. $dbResult = $this->objDPurchaseGoods->query($sql);
  868. if ($dbResult === false) {
  869. return ResultWrapper::fail($this->objDPurchaseGoods->error(), ErrorCode::$dberror);
  870. }
  871. $data['skuNum'] = array_shift($dbResult)['count'];
  872. unset($dbResult);
  873. //商品总数
  874. $sql = "select sum(buyerNum) as num from " . $this->objDPurchaseGoods->get_Table() . " where deleteStatus = " . StatusCode::$standard;
  875. $dbResult = $this->objDPurchaseGoods->query($sql);
  876. if ($dbResult === false) {
  877. return ResultWrapper::fail($this->objDPurchaseGoods->error(), ErrorCode::$dberror);
  878. }
  879. $data['goodsNum'] = array_shift($dbResult)['num'];
  880. unset($dbResult);
  881. return ResultWrapper::success($data);
  882. }
  883. /**
  884. * 采购明细
  885. * @param $selectParams
  886. * @param $export
  887. * @return ResultWrapper
  888. * @throws Exception
  889. */
  890. public function getAllPurchaseDetails($selectParams, $export = 0)
  891. {
  892. $limit = $selectParams['limit'];
  893. unset($selectParams['limit']);
  894. $offset = $selectParams['offset'];
  895. unset($selectParams['offset']);
  896. $this->objDPurchaseGoods->setTable('qianniao_purchase_goods' . '_' . $this->onlineEnterpriseId);
  897. $this->objDPurchase->setTable('qianniao_purchase' . '_' . $this->onlineEnterpriseId);
  898. $whereSql = '';
  899. if(!empty($selectParams['merchantId'])){
  900. $whereSql .= ' and p.merchantId = '.$selectParams['merchantId'];
  901. }
  902. if(!empty($selectParams['shopId'])){
  903. $whereSql .= ' and p.shopId = '.$selectParams['shopId'];
  904. }
  905. if(!empty($selectParams['categoryId'])){
  906. $whereSql .= ' and g.categoryId = '.$selectParams['categoryId'];
  907. }
  908. if(!empty($selectParams['supplierId'])){
  909. $whereSql .= ' and p.supplierId = '.$selectParams['supplierId'];
  910. }
  911. if(!empty($selectParams['auditStatus'])){
  912. $whereSql .= ' and p.auditStatus = '.$selectParams['auditStatus'];
  913. }
  914. if(!empty($selectParams['start']) && !empty($selectParams['end'])){
  915. $whereSql .= ' and p.createTime between '.$selectParams['start'].' and '.$selectParams['end'];
  916. }
  917. if(!empty($selectParams['search'])){
  918. $whereSql .= ' and g.goodsName like "%'.$selectParams['search'].'%" ';
  919. }
  920. $sql = "select p.merchantId,p.no,p.inStatus,p.supplierName,p.buyerName,p.remark,p.operatorName,g.id,g.goodsName,g.buyerNum,g.buyerUnitPrice,g.subtotalPrice,g.basicGoodsId,g.skuId,g.otherNum from " . $this->objDPurchase->get_Table() . " p LEFT JOIN " . $this->objDPurchaseGoods->get_Table() . " g on p.id = g.purchaseId where g.deleteStatus = " . StatusCode::$standard . $whereSql . " ORDER BY g.createTime desc ";
  921. if ($export) {
  922. $result = $this->objDPurchase->exportQuery($sql);
  923. if ($result === false) {
  924. return ResultWrapper::fail($this->objDPurchase->error(), ErrorCode::$dberror);
  925. }
  926. $modelResult = self::formatPurchaseDetails($result);
  927. if (!$modelResult->isSuccess()) {
  928. return ResultWrapper::fail($modelResult->getData(), $modelResult->getErrorCode());
  929. }
  930. $data = $modelResult->getData();
  931. self::exportPurchaseDetails($data);
  932. exit;
  933. }
  934. $sql .= " limit " . $offset . "," . $limit;
  935. $dbResult = $this->objDPurchase->query($sql);
  936. if ($dbResult === false) {
  937. return ResultWrapper::fail($this->objDPurchase->error(), ErrorCode::$dberror);
  938. }
  939. $sql = "select count(g.id) as count from " . $this->objDPurchase->get_Table() . " p LEFT JOIN " . $this->objDPurchaseGoods->get_Table() . " g on p.id = g.purchaseId where g.deleteStatus = " . StatusCode::$standard. $whereSql;
  940. $totalData = $this->objDPurchase->query($sql);
  941. if ($totalData === false) {
  942. return ResultWrapper::fail($this->objDPurchase->error(), ErrorCode::$dberror);
  943. }
  944. $total = array_shift($totalData)['count'];
  945. $modelResult = self::formatPurchaseDetails($dbResult);
  946. if (!$modelResult->isSuccess()) {
  947. return ResultWrapper::fail($modelResult->getData(), $modelResult->getErrorCode());
  948. }
  949. $data = $modelResult->getData();
  950. $return = [
  951. 'data' => $data,
  952. 'total' => ($total) ? intval($total) : 0,
  953. ];
  954. return ResultWrapper::success($return);
  955. }
  956. /**
  957. * 采购明细搜索
  958. * @param $params
  959. * @param $export
  960. * @return ResultWrapper
  961. * @throws Exception
  962. */
  963. public function searchAllPurchaseDetails($params, $export)
  964. {
  965. $defaultDSL = ['from' => $params['offset'], 'size' => $params['limit'], 'sort' => ['createTime' => ['order' => 'desc']]];
  966. $selectParams = [];
  967. $selectParams[] = ['term' => ['enterpriseId' => $this->onlineEnterpriseId]];
  968. !empty($params['categoryId']) && $selectParams[] = ['term' => ['categoryId' => $params['categoryId']]];
  969. !empty($params['shopId']) && $selectParams[] = ['term' => ['shopId' => $params['shopId']]];
  970. !empty($params['supplierId']) && $selectParams[] = ['term' => ['supplierId' => $params['supplierId']]];
  971. !empty($params['auditStatus']) && $selectParams[] = ['term' => ['auditStatus' => $params['auditStatus']]];
  972. (!empty($params['start']) && !empty($params['end'])) && $selectParams[] = ['range' => ['createTime' => ['gte' => $params['start'], 'lte' => $params['end']]]];
  973. !empty($params['search']) && $selectParams[] = ['multi_match' => ['fields' => ['goodsName', 'goodsCode'], 'query' => $params['search'], "type" => "best_fields", "tie_breaker" => 0.3, "minimum_should_match" => "50%"]];
  974. $dsl = [];
  975. !empty($selectParams) && $dsl['query']['bool']['must'][] = $selectParams;
  976. $dsl = array_merge($defaultDSL, $dsl);
  977. //导出
  978. if ($export) {
  979. $esResult = $this->objDPurchaseGoods->getScrollSearchQueryDsl($dsl);
  980. if (isset($esResult['error'])) {
  981. return ResultWrapper::fail($esResult, ErrorCode::$dberror);
  982. }
  983. $formatData = parent::formatEsSelectData($esResult);
  984. $modelResult = self::formatPurchaseDetails($formatData['data']);
  985. if (!$modelResult->isSuccess()) {
  986. return ResultWrapper::fail($modelResult->getData(), $modelResult->getErrorCode());
  987. }
  988. $formatData['data'] = $modelResult->getData();
  989. self::exportPurchaseDetails($formatData['data']);
  990. exit;
  991. }
  992. $dbResult = $this->objDPurchaseGoods->getSearchQueryDsl($dsl);
  993. if (isset($dbResult['error'])) {
  994. return ResultWrapper::fail($dbResult, ErrorCode::$dberror);
  995. }
  996. $formatData = parent::formatEsSelectData($dbResult);
  997. $modelResult = self::formatPurchaseDetails($formatData['data']);
  998. if (!$modelResult->isSuccess()) {
  999. return ResultWrapper::fail($modelResult->getData(), $modelResult->getErrorCode());
  1000. }
  1001. $formatData['data'] = $modelResult->getData();
  1002. return ResultWrapper::success($formatData);
  1003. }
  1004. /**
  1005. * 采购明细导出方法
  1006. * @param $result
  1007. * @return void
  1008. * @throws Exception
  1009. */
  1010. public function exportPurchaseDetails($result)
  1011. {
  1012. //导出到本地
  1013. header("Content-type:application/vnd.ms-excel");
  1014. header("Content-Disposition:filename=采购明细记录表.csv");
  1015. header('Cache-Control: max-age=0');
  1016. $fp = fopen('php://output', 'a');
  1017. $head = ['序号', '采购单号', '商品编号', '商品名称', '单位', '属性', '分类', '品牌', '采购数量','其他单位', '采购单价', '采购金额', '入库状态', '供应商']; //定义标题
  1018. foreach ($head as $i => $v) {
  1019. $head[$i] = mb_convert_encoding($v, 'GBK', 'utf-8'); //将中文标题转换编码,否则乱码
  1020. }
  1021. fputcsv($fp, $head);
  1022. $limit = 10000;
  1023. $num = 0; //计数器
  1024. foreach ($result as $v) { //循环数据
  1025. $num++;
  1026. if ($num == $limit) {
  1027. ob_flush(); //释放内存
  1028. flush();
  1029. }
  1030. $rows['id'] = isset($v['id']) ? $v['id'] : null;
  1031. $rows['no'] = isset($v['no']) ? $v['no'] : null;
  1032. $rows['goodsCode'] = isset($v['goodsCode']) ? $v['goodsCode'] : null;
  1033. $rows['goodsName'] = isset($v['goodsName']) ? $v['goodsName'] : null;
  1034. $rows['unitName'] = isset($v['unitName']) ? $v['unitName'] : null;
  1035. $rows['skuName'] = isset($v['skuName']) ? $v['skuName'] : null;
  1036. $rows['categoryName'] = isset($v['categoryName']) ? $v['categoryName'] : null;
  1037. $rows['brandName'] = isset($v['brandName']) ? $v['brandName'] : null;
  1038. $rows['buyerNum'] = isset($v['buyerNum']) ? $v['buyerNum'] : null;
  1039. $rows['otherNum'] = isset($v['otherNum']) ? $v['otherNum'] : null;
  1040. $rows['buyerUnitPrice'] = isset($v['buyerUnitPrice']) ? $v['buyerUnitPrice'] : null;
  1041. $rows['subtotalPrice'] = isset($v['subtotalPrice']) ? $v['subtotalPrice'] : null;
  1042. $rows['inStatus'] = isset($v['inStatus']) ? $v['inStatus'] == StatusCode::$standard ? '已入库' : '未入库' : null;
  1043. $rows['supplierName'] = isset($v['supplierName']) ? $v['supplierName'] : null;
  1044. foreach ($rows as $kk => $vv) {
  1045. $rs[$kk] = mb_convert_encoding($vv, 'GBK', 'utf-8'); //转译编码
  1046. }
  1047. fputcsv($fp, $rs);
  1048. $rows = [];
  1049. }
  1050. }
  1051. /**
  1052. * 导出方法
  1053. * @param $condition
  1054. * @return ResultWrapper
  1055. * @throws Exception
  1056. */
  1057. public function export($condition)
  1058. {
  1059. $result = $this->objDPurchase->exportSelect($condition, 'id,no,supplierName,purchaseAmount,buyerName,operatorName,createTime,auditStatus');
  1060. if ($result === false) {
  1061. return ResultWrapper::fail($this->objDPurchase->error(), ErrorCode::$dberror);
  1062. }
  1063. $formatIds = [];
  1064. $formatData = [];
  1065. foreach ($result as $value) {
  1066. $formatData[$value['id']] = $value;
  1067. $formatIds[] = $value['id'];
  1068. }
  1069. $this->objDPurchaseGoods->setTable('qianniao_purchase_goods' . '_' . $this->onlineEnterpriseId);
  1070. $dbResult = $this->objDPurchaseGoods->exportSelect(['purchaseId' => $formatIds, 'deleteStatus' => StatusCode::$standard]);
  1071. if ($dbResult === false) {
  1072. return ResultWrapper::fail($this->objDPurchaseGoods->error(), ErrorCode::$paramError);
  1073. }
  1074. //导出到本地
  1075. header("Content-type:application/vnd.ms-excel");
  1076. header("Content-Disposition:filename=采购记录表.csv");
  1077. header('Cache-Control: max-age=0');
  1078. $fp = fopen('php://output', 'a');
  1079. $head = ['编号', '采购单号', '供应商', '采购单总金额', '采购人员', '制单人员', '制单日期', '审核状态', '商品名称', '商品编码', '单位', '分类', '采购数量','其他单位', '采购单价', '采购总价'];//定义标题
  1080. foreach ($head as $i => $v) {
  1081. $head[$i] = mb_convert_encoding($v, 'GBK', 'utf-8');//将中文标题转换编码,否则乱码
  1082. }
  1083. fputcsv($fp, $head);
  1084. $limit = 10000;
  1085. $num = 0;//计数器
  1086. foreach ($dbResult as $value) {//循环数据
  1087. $num++;
  1088. if ($num == $limit) {
  1089. ob_flush();//释放内存
  1090. flush();
  1091. }
  1092. $value = parent::formatOrderMan($this->onlineEnterpriseId, $value);
  1093. $v = $formatData[$value['purchaseId']];
  1094. $rows['id'] = isset($v['id']) ? $v['id'] : null;
  1095. $rows['no'] = isset($v['no']) ? $v['no'] : null;
  1096. $rows['supplierName'] = isset($v['supplierName']) ? $v['supplierName'] : null;
  1097. $rows['purchaseAmount'] = isset($v['purchaseAmount']) ? $v['purchaseAmount'] : null;
  1098. $rows['buyerName'] = isset($v['buyerName']) ? $v['buyerName'] : null;
  1099. $rows['operatorName'] = isset($v['operatorName']) ? $v['operatorName'] : null;
  1100. $rows['createTime'] = isset($v['createTime']) ? date('Y-m-d H:i:s', $v['createTime']) : null;
  1101. $rows['auditStatus'] = isset($v['auditStatus']) ? ($v['auditStatus'] == StatusCode::$auditStatus['auditPass'] ? '已审核' : '未审核') : null;
  1102. $rows['goodsName'] = isset($value['goodsName']) ? $value['goodsName'] : null;
  1103. $rows['goodsCode'] = isset($value['goodsCode']) ? $value['goodsCode'] : null;
  1104. $rows['unitName'] = isset($value['unitName']) ? $value['unitName'] : null;
  1105. $rows['categoryName'] = isset($value['categoryName']) ? $value['categoryName'] : null;
  1106. $rows['buyerNum'] = isset($value['buyerNum']) ? $value['buyerNum'] : null;
  1107. $rows['otherNum'] = isset($value['otherNum']) ? $value['otherNum'] : null;
  1108. $rows['buyerUnitPrice'] = isset($value['buyerUnitPrice']) ? $value['buyerUnitPrice'] : null;
  1109. $rows['subtotalPrice'] = isset($value['subtotalPrice']) ? $value['subtotalPrice'] : null;
  1110. foreach ($rows as $kk => $vv) {
  1111. $rs[$kk] = mb_convert_encoding($vv, 'GBK', 'utf-8'); //转译编码
  1112. }
  1113. fputcsv($fp, $rs);
  1114. $rows = [];
  1115. }
  1116. return ResultWrapper::success('成功');
  1117. }
  1118. /**
  1119. * 格式化采购明细列表数据
  1120. * @param $data
  1121. * @return ResultWrapper
  1122. * @throws Exception
  1123. */
  1124. public function formatPurchaseDetails($data)
  1125. {
  1126. if (empty($data)) return ResultWrapper::success($data);
  1127. $skuIds = [];
  1128. $nos = [];
  1129. $basics = [];
  1130. foreach ($data as $value) {
  1131. $skuIds[] = $value['skuId'];
  1132. $nos[] = $value['no'];
  1133. $basics[] = $value['basicGoodsId'];
  1134. }
  1135. //单位name
  1136. $skuNames = [];
  1137. if ($skuIds) {
  1138. $objMSku = new MSku($this->onlineUserId, $this->onlineEnterpriseId);
  1139. $return = $objMSku->getNameByIds($skuIds);
  1140. if (!$return->isSuccess()) {
  1141. return ResultWrapper::fail($return->getData(), $return->getErrorCode());
  1142. }
  1143. $skuNames = $return->getData();
  1144. unset($return);
  1145. }
  1146. //采购入库 入库状态
  1147. $purchaseInData = [];
  1148. if ($nos) {
  1149. $objMInventoryIn = new MInventoryIn($this->onlineEnterpriseId, $this->onlineUserId);
  1150. $modelResult = $objMInventoryIn->getAllInventoryInByNo($nos);
  1151. if (!$modelResult->isSuccess()) {
  1152. return ResultWrapper::fail($modelResult->getData(), $modelResult->getErrorCode());
  1153. }
  1154. $purchaseInData = $modelResult->getData();
  1155. unset($modelResult);
  1156. }
  1157. //分类信息
  1158. $categoryData = [];
  1159. $brandData = [];
  1160. if ($basics) {
  1161. $objMGoodsBasic = new MGoodsBasic($this->onlineUserId, $this->onlineEnterpriseId);
  1162. $modelResult = $objMGoodsBasic->getCategoryByIds($basics);
  1163. if (!$modelResult->isSuccess()) {
  1164. return ResultWrapper::fail($modelResult->getData(), $modelResult->getErrorCode());
  1165. }
  1166. $categoryData = $modelResult->getData();
  1167. unset($modelResult);
  1168. $modelResult = $objMGoodsBasic->getBrandByIds($basics);
  1169. if (!$modelResult->isSuccess()) {
  1170. return ResultWrapper::fail($modelResult->getData(), $modelResult->getErrorCode());
  1171. }
  1172. $brandData = $modelResult->getData();
  1173. unset($modelResult);
  1174. }
  1175. foreach ($data as $key => &$value) {
  1176. $value['goodsCode'] = createCode(StatusCode::$code['goodsBasic']['prefix'], $value['basicGoodsId'], StatusCode::$code['goodsBasic']['length']);
  1177. $nos && $value['purchaseInStatus'] = isset($purchaseInData[$value['no']]) ? $purchaseInData[$value['no']]['auditStatus'] : StatusCode::$delete;
  1178. $basics && $value['categoryName'] = isset($categoryData[$value['basicGoodsId']]) ? $categoryData[$value['basicGoodsId']]['title'] : null;
  1179. $basics && $value['brandName'] = isset($brandData[$value['basicGoodsId']]) ? $brandData[$value['basicGoodsId']]['title'] : null;
  1180. }
  1181. $data = parent::formatOrderMan($this->onlineEnterpriseId, $data, StatusCode::$orderType['purchaseOrder']);
  1182. return ResultWrapper::success($data);
  1183. }
  1184. /**
  1185. * 格式化采购列表
  1186. * @param $data
  1187. * @return mixed
  1188. * @throws Exception
  1189. */
  1190. private function format($data)
  1191. {
  1192. if (isset($data['id'])) {
  1193. $dimension = $data;
  1194. unset($data);
  1195. $data[] = $dimension;
  1196. }
  1197. $allPurchaseIds = [];
  1198. foreach ($data as $key => $val) {
  1199. $allPurchaseIds[] = $val['id'];
  1200. }
  1201. $objMPurchaseGoods = new MPurchaseGoods($this->onlineUserId, $this->onlineEnterpriseId);
  1202. $dbResult = $objMPurchaseGoods->getGoodsByPurchaseIds($allPurchaseIds);
  1203. if (!$dbResult->isSuccess()) {
  1204. return $data;
  1205. }
  1206. $goodsData = $dbResult->getData();
  1207. $allSkuIds = array_column($goodsData, 'skuId');
  1208. //sku信息
  1209. $objMSku = new MSku($this->onlineUserId, $this->onlineEnterpriseId);
  1210. $selectParams = [
  1211. 'id' => $allSkuIds,
  1212. ];
  1213. $skuData = [];
  1214. $dbResult = $objMSku->getSkuInfo($selectParams, '*', false);
  1215. if ($dbResult->isSuccess()) {
  1216. $skuData = $dbResult->getData();
  1217. }
  1218. foreach ($skuData as $key => $value) {
  1219. $allSkuData[$value['id']] = $value;
  1220. }
  1221. foreach ($goodsData as $key => &$value) {
  1222. $value['unit'] = isset($allSkuData[$value['skuId']]) ? $allSkuData[$value['skuId']] : '';
  1223. $allGoodsData[$value['purchaseId']][] = $value;
  1224. }
  1225. //查询商户
  1226. $merchantIds = array_column($data,'merchantId');
  1227. if(!empty($merchantIds)){
  1228. $objMMerchant = new MMerchant($this->onlineEnterpriseId, $this->onlineUserId);
  1229. $modelResult = $objMMerchant->selectMerchantData(['id' => $merchantIds]);
  1230. $merchantData = [];
  1231. if($modelResult->isSuccess()){
  1232. $merchantResult = $modelResult->getData();
  1233. foreach($merchantResult as $value){
  1234. $merchantData[$value['id']] = $value;
  1235. }
  1236. }
  1237. }
  1238. foreach ($data as $key => &$value) {
  1239. //渲染采购入库前缀
  1240. $value['no'] = StatusCode::$noPrefix[2] .'-'. $value['no'];
  1241. $value['goodsData'] = [];
  1242. if (isset($allGoodsData[$value['id']])) {
  1243. $value['goodsData'] = $allGoodsData[$value['id']];
  1244. }
  1245. $value['merchantName'] = isset($merchantData[$value['merchantId']]) ? $merchantData[$value['merchantId']]['name'] : '';
  1246. }
  1247. return $data;
  1248. }
  1249. /**
  1250. * 根据nos数组查询多条采购订单数据
  1251. * @param $nos
  1252. * @return array|ResultWrapper
  1253. */
  1254. public function getAllPurchaseByNos($nos)
  1255. {
  1256. if (empty($nos)) return $nos;
  1257. $dbResult = $this->objDPurchase->select(['no' => $nos]);
  1258. if ($dbResult === false) {
  1259. return ResultWrapper::fail($this->objDPurchase->error(), ErrorCode::$dberror);
  1260. }
  1261. if (empty($dbResult)) return ResultWrapper::fail('采购订单数据为空', ErrorCode::$paramError);
  1262. $returnData = [];
  1263. foreach ($dbResult as $value) {
  1264. $returnData[$value['no']] = $value;
  1265. }
  1266. return ResultWrapper::success($returnData);
  1267. }
  1268. /**
  1269. * 增加详情es数据
  1270. * @param $data
  1271. * @param $params
  1272. * @param $ids
  1273. * @return ResultWrapper
  1274. */
  1275. // public function addEsData($data, $params, $ids)
  1276. // {
  1277. // foreach ($data as $key => $value) {
  1278. // $value['inStatus'] = StatusCode::$delete;
  1279. // $modelResult = self::updateEsData($value, $params, $ids[$key]);
  1280. // if (!$modelResult->isSuccess()) {
  1281. // return ResultWrapper::fail($modelResult->getData(), $modelResult->getErrorCode());
  1282. // }
  1283. // }
  1284. // return ResultWrapper::success(true);
  1285. // }
  1286. /**
  1287. * 添加详情es
  1288. * @param $data
  1289. * @param $params
  1290. * @param $id
  1291. * @return ResultWrapper
  1292. */
  1293. // public function updateEsData($data, $params, $id)
  1294. // {
  1295. // $addEsData = [
  1296. // 'id' => $id,
  1297. // 'enterpriseId' => $this->onlineEnterpriseId,
  1298. // 'no' => isset($params['no']) ? $params['no'] : false,
  1299. // 'supplierId' => isset($params['supplierId']) ? $params['supplierId'] : false,
  1300. // 'supplierName' => isset($params['supplierName']) ? $params['supplierName'] : false,
  1301. // 'buyerId' => isset($params['buyerId']) ? $params['buyerId'] : false,
  1302. // 'buyerName' => isset($params['buyerName']) ? $params['buyerName'] : false,
  1303. // 'remark' => isset($params['remark']) ? $params['remark'] : false,
  1304. // 'operatorId' => isset($params['operatorId']) ? $params['operatorId'] : false,
  1305. // 'operatorName' => isset($params['operatorName']) ? $params['operatorName'] : false,
  1306. // 'returnStatus' => isset($params['returnStatus']) ? $params['returnStatus'] : false,
  1307. // 'inStatus' => isset($params['inStatus']) ? $params['inStatus'] : false,
  1308. // 'auditId' => isset($params['auditId']) ? $params['auditId'] : false,
  1309. // 'auditName' => isset($params['auditName']) ? $params['auditName'] : false,
  1310. // 'auditStatus' => isset($params['auditStatus']) ? $params['auditStatus'] : false,
  1311. // 'auditTime' => isset($params['auditTime']) ? $params['auditTime'] : false,
  1312. // 'deleteStatus' => isset($params['deleteStatus']) ? $params['deleteStatus'] : false,
  1313. // 'createTime' => isset($params['createTime']) ? $params['createTime'] : false,
  1314. // 'updateTime' => isset($params['updateTime']) ? $params['updateTime'] : false,
  1315. //
  1316. // 'basicGoodsId' => isset($data['basicGoodsId']) ? $data['basicGoodsId'] : false,
  1317. // 'goodsName' => isset($data['goodsName']) ? $data['goodsName'] : false,
  1318. // 'goodsCode' => isset($data['goodsCode']) ? $data['goodsCode'] : false,
  1319. // 'skuId' => isset($data['skuId']) ? $data['skuId'] : false,
  1320. // 'unitName' => isset($data['unitName']) ? $data['unitName'] : false,
  1321. // 'skuName' => isset($data['skuName']) ? $data['skuName'] : false,
  1322. // 'categoryId' => isset($data['categoryId']) ? $data['categoryId'] : false,
  1323. // 'categoryName' => isset($data['categoryName']) ? $data['categoryName'] : false,
  1324. // 'buyerNum' => isset($data['buyerNum']) ? $data['buyerNum'] : false,
  1325. // 'buyerUnitPrice' => isset($data['buyerUnitPrice']) ? $data['buyerUnitPrice'] : false,
  1326. // 'subtotalPrice' => isset($data['subtotalPrice']) ? $data['subtotalPrice'] : false,
  1327. // 'purchaseId' => isset($data['purchaseId']) ? $data['purchaseId'] : false,
  1328. // 'detailsReturnStatus' => isset($data['returnStatus']) ? $data['returnStatus'] : false,
  1329. // 'detailsDeleteStatus' => isset($data['deleteStatus']) ? $data['deleteStatus'] : false,
  1330. // ];
  1331. // foreach ($addEsData as $key => $value) {
  1332. // if ($value === false) {
  1333. // return ResultWrapper::fail($key . '---ES字段未设置', ErrorCode::$paramError);
  1334. // }
  1335. // }
  1336. // //创建es id
  1337. // $esId = self::esId($id);
  1338. // $result = $this->objDPurchaseGoods->addUpSearchIndexDocument($addEsData, $esId);
  1339. // if (isset($result['_shards']) && isset($result['_shards']['successful']) && $result['_shards']['successful'] == 1) {
  1340. // return ResultWrapper::success(isset($result['_id']) ? $result['_id'] : false);
  1341. // }
  1342. // return ResultWrapper::fail($result['error']['reason'], ErrorCode::$paramError);
  1343. // }
  1344. /**
  1345. * 拼接详情es id
  1346. * @param $id
  1347. * @return string
  1348. */
  1349. // public function esId($id)
  1350. // {
  1351. // return 'EnterpriseId_' . $this->onlineEnterpriseId . '_PurchaseDetailsId_' . $id;
  1352. // }
  1353. /**
  1354. * Doc: (des="")
  1355. * User: XMing
  1356. * Date: 2020/12/23
  1357. * Time: 10:29 上午
  1358. * @param array $arr
  1359. * @return string
  1360. */
  1361. public static function formatSpecGroup($arr): string
  1362. {
  1363. $str = '';
  1364. if (empty($arr) || !is_array($arr)) {
  1365. return $str;
  1366. }
  1367. foreach ($arr as $item) {
  1368. if (!empty($str)) {
  1369. $str .= '_';
  1370. }
  1371. $str .= $item['specValueName'];
  1372. }
  1373. return $str;
  1374. }
  1375. /**
  1376. * Doc: (des="获取商品的最近采购成本价格")
  1377. * User: XMing
  1378. * Date: 2021/3/11
  1379. * Time: 10:28 上午
  1380. * @param int $materielId
  1381. * @param int $date
  1382. * @return ResultWrapper
  1383. */
  1384. public function getCostPriceSheetByMaterielId(int $materielId,int $date): ResultWrapper
  1385. {
  1386. $sql = 'SELECT buyerUnitPrice,skuId,createTime FROM '.$this->objDPurchaseGoods->get_Table().' WHERE basicGoodsId = '.$materielId;
  1387. $sql .= ' AND createTime <= '.$date;
  1388. $lists = $this->objDPurchaseGoods->query($sql);
  1389. if ($lists === false){
  1390. Logger::logs(E_USER_ERROR,'sql error',__CLASS__,__LINE__,$this->objDPurchaseGoods->error());
  1391. return ResultWrapper::fail($this->objDPurchaseGoods->error(),ErrorCode::$dberror);
  1392. }
  1393. if (empty($lists)){
  1394. return ResultWrapper::success([]);
  1395. }
  1396. $arrayList = [];
  1397. foreach ($lists as $item){
  1398. $arrayList[$item['skuId']][] = [
  1399. 'costPrice' => floatval($item['buyerUnitPrice']),
  1400. 'createTime' => $item['createTime']
  1401. ];
  1402. }
  1403. return ResultWrapper::success($arrayList);
  1404. }
  1405. /**
  1406. * 采购再次入库
  1407. * @param int $orderId
  1408. * @return ResultWrapper
  1409. */
  1410. public function reStockIn($purchaseId)
  1411. {
  1412. // 获取采购单数据
  1413. $purchaseData = $this->objDPurchase->get($purchaseId);
  1414. if ($purchaseData === false){
  1415. return ResultWrapper::fail($this->objDPurchase->error(),ErrorCode::$dberror);
  1416. }
  1417. if (empty($purchaseData)){
  1418. return ResultWrapper::fail('采购订单数据为空',ErrorCode::$paramError);
  1419. }
  1420. if ($purchaseData['inStatus'] == StatusCode::$standard){
  1421. return ResultWrapper::fail('采购订单已经入库,请不要重复入库',ErrorCode::$paramError);
  1422. }
  1423. // 查询采购订单是否还有未审核的入库单,必须先处理完,再生成新的入库单
  1424. $objMInventoryIn = new MInventoryIn($this->onlineEnterpriseId, $this->onlineUserId);
  1425. $condition = [
  1426. 'originId' => $purchaseId,
  1427. 'deleteStatus' => StatusCode::$standard,
  1428. 'auditStatus' => StatusCode::$auditStatus['auditing'],
  1429. ];
  1430. $result = $objMInventoryIn->getInventoryInData($condition);
  1431. if (!$result->isSuccess()) {
  1432. return ResultWrapper::fail($result->getData(), ErrorCode::$dberror);
  1433. }
  1434. $inventoryInData = $result->getData();
  1435. if( !empty($inventoryInData) ){
  1436. return ResultWrapper::fail('当前采购订单还有未审核的入库单,单号:'.StatusCode::$noPrefix[3].'-'.$inventoryInData[0]['no'].',请先处理完成', ErrorCode::$notAllowAccess);
  1437. }
  1438. // 查询采购订单商品数据
  1439. $purchaseGoodsData = $this->objDPurchaseGoods->select(['purchaseId' => $purchaseId,'deleteStatus' => StatusCode::$standard]);
  1440. if ($purchaseGoodsData === false){
  1441. return ResultWrapper::fail($this->objDPurchaseGoods->error(),ErrorCode::$dberror);
  1442. }
  1443. if (empty($purchaseGoodsData)){
  1444. return ResultWrapper::fail('采购订单商品为空',ErrorCode::$paramError);
  1445. }
  1446. // 组装采购入库单数据
  1447. $purchaseInData = [
  1448. 'sourceId' => $purchaseData['id'],
  1449. 'sourceNo' => $purchaseData['no'],
  1450. 'originNo' => $purchaseData['no'],
  1451. 'originId' => $purchaseData['id'],
  1452. 'shopId' => $purchaseData['shopId'],
  1453. 'shopName' => getArrayItem($purchaseData, 'shopName'),
  1454. 'amount' => $purchaseData['purchaseAmount'],
  1455. 'operatorId' => $purchaseData['operatorId'],//操作人id
  1456. 'operatorName' => $purchaseData['operatorName'],//操作人信息
  1457. 'warehouseId' => $purchaseData['warehouseId'],//仓库id
  1458. 'warehouseName' => $purchaseData['warehouseName'],//仓库名称
  1459. 'source' => StatusCode::$orderType['purchaseOrder'],
  1460. 'type' => StatusCode::$orderType['purchaseIn'],
  1461. 'remark' => $purchaseData['remark'],
  1462. 'merchantId' => $purchaseData['merchantId'],//商户id
  1463. 'orderGoodsData' => []
  1464. ];
  1465. $purchaseInData['materielNum'] = 0;
  1466. $amount = 0;
  1467. foreach ($purchaseGoodsData as $key => $value) {
  1468. if ($value['inOfNum'] > 0 ){
  1469. $amount += bcmul($value['inOfNum'],$value['buyerUnitPrice'],2);
  1470. $purchaseInData['materielNum']++;
  1471. $purchaseInData['orderGoodsData'][] = [
  1472. 'materielId' => $value['basicGoodsId'],
  1473. 'materielName' => $value['goodsName'],
  1474. 'materielCode' => $value['goodsCode'],
  1475. 'skuId' => $value['skuId'],
  1476. 'unitName' => isset($value['unitName']) ? $value['unitName'] : '',
  1477. 'skuName' => isset($value['skuName']) ? $value['skuName'] : '',
  1478. 'num' => $value['inOfNum'],
  1479. 'inNum' => 0,
  1480. 'otherNum' => $value['otherNum'],
  1481. 'unitPrice' => $value['buyerUnitPrice'],
  1482. 'totalPrice' => bcmul($value['inOfNum'],$value['buyerUnitPrice'],2),
  1483. ];
  1484. }
  1485. }
  1486. $purchaseInData['amount'] = $amount;
  1487. if (empty($purchaseInData['orderGoodsData'])){
  1488. return ResultWrapper::fail('此采购订单没有需要入库的商品',ErrorCode::$paramError);
  1489. }
  1490. // 新增采购入库单
  1491. $dbResult = $objMInventoryIn->addInventoryIn($purchaseInData);
  1492. if (!$dbResult->isSuccess()) {
  1493. return ResultWrapper::fail($dbResult->getData(), ErrorCode::$dberror);
  1494. }
  1495. return ResultWrapper::success($dbResult->getData());
  1496. }
  1497. /**
  1498. * 采购订单直接退款
  1499. */
  1500. public function retMoney($purchaseId)
  1501. {
  1502. $purchaseData = $this->objDPurchase->get($purchaseId);
  1503. if($purchaseData === false){
  1504. return ResultWrapper::fail($this->objDPurchase->error(), ErrorCode::$dberror);
  1505. }
  1506. if(empty($purchaseData)){
  1507. return ResultWrapper::fail('采购订单数据为空', ErrorCode::$contentNotExists);
  1508. }
  1509. $purchaseGoodsData = $this->objDPurchaseGoods->select(['purchaseId' => $purchaseId,'deleteStatus' => StatusCode::$standard]);
  1510. if ($purchaseGoodsData === false){
  1511. return ResultWrapper::fail($this->objDPurchaseGoods->error(),ErrorCode::$dberror);
  1512. }
  1513. if (empty($purchaseGoodsData)){
  1514. return ResultWrapper::fail('采购订单商品为空',ErrorCode::$paramError);
  1515. }
  1516. /*
  1517. $refundMoney = 0;
  1518. foreach ($purchaseGoodsData as $key => $value) {
  1519. if ($value['inOfNum'] > 0 ){
  1520. $refundMoney += bcmul($value['inOfNum'],$value['buyerUnitPrice'],2);
  1521. }
  1522. }
  1523. // 生成财务退款单
  1524. $financeRefundData = [
  1525. 'originId' => getArrayItem($purchaseData,'id',''),
  1526. 'originNo' => getArrayItem($purchaseData,'no',''),
  1527. 'sourceNo' => getArrayItem($purchaseData,'no',''),
  1528. 'refundTime' => time(),
  1529. 'createTime' => time(),
  1530. 'unitId' => getArrayItem($purchaseData,'supplierId',0),
  1531. 'unitName' => getArrayItem($purchaseData,'supplierName',0),
  1532. 'currentAccountName' => getArrayItem($purchaseData,'supplierName',''),
  1533. 'financeType' => '采购退款',
  1534. 'financeTypeId' => 1,
  1535. 'payType' =>'',
  1536. 'shopId' => getArrayItem($purchaseData,'warehouseId',0),
  1537. 'shopName' => getArrayItem($purchaseData,'warehouseName',0),
  1538. 'money' => $refundMoney,
  1539. 'operatorId' => $this->onlineUserId,
  1540. 'type' => StatusCode::$delete,
  1541. 'auditStatus' => StatusCode::$auditStatus['auditing'],
  1542. ];
  1543. // 根据订单支付方式规划退款账户
  1544. /*$objMAccount = new MAccount($this->enterpriseId,$this->userCenterId);
  1545. $payType = explode(',', $order['payType']);
  1546. // 包含余额组合支付方式统一返回余额,其他原路返回
  1547. if( in_array(StatusCode::$payType['balance'],$payType) ){
  1548. $financeAccountData = $objMAccount->getDefaultAccount(StatusCode::$payType['balance']);
  1549. }else{
  1550. $financeAccountData = $objMAccount->getDefaultAccount($payType);
  1551. }
  1552. if(!$financeAccountData->isSuccess()){
  1553. $this->objDInventoryOut->rollBack();
  1554. return ResultWrapper::fail($financeAccountData->getData(), $financeAccountData->getErrorCode());
  1555. }
  1556. $financeAccountData = $financeAccountData->getData();
  1557. $financeRefundData['accountList'] = [
  1558. [
  1559. 'accountId' => $financeAccountData['id'],
  1560. 'accountNumber' => $financeAccountData['accountNumber'],
  1561. 'accountName' => $financeAccountData['name'],
  1562. 'money' => $InventoryOutData['amount'],
  1563. ]
  1564. ];*/
  1565. $beginTransactionStatus = $this->objDPurchase->beginTransaction();
  1566. // 修改采购单退款标识字段
  1567. $result = $this->objDPurchase->update(['havaRefund'=>StatusCode::$standard,'inStatus'=>StatusCode::$standard,'updateTime'=>time()], $purchaseId);
  1568. if($result === false){
  1569. $this->objDPurchase->rollBack();
  1570. return ResultWrapper::fail($this->objDPurchase->error(), ErrorCode::$dberror);
  1571. }
  1572. // 添加退款单
  1573. /*$financeRefundData['accountList'] = [];
  1574. $objMRefund = new MRefund($this->onlineEnterpriseId,$this->onlineUserId);
  1575. $result = $objMRefund->addRefund($financeRefundData);
  1576. if(!$result->isSuccess()){
  1577. $this->objDPurchase->rollBack();
  1578. return ResultWrapper::fail($result->getData(),$result->getErrorCode());
  1579. }*/
  1580. if($beginTransactionStatus){
  1581. $this->objDPurchase->commit();
  1582. }
  1583. return ResultWrapper::success($result);
  1584. }
  1585. /**
  1586. * 采购总汇表导出方法
  1587. * @param $result
  1588. */
  1589. public function exportPurchaseByFields($result)
  1590. {
  1591. //导出到本地
  1592. header("Content-type:application/vnd.ms-excel");
  1593. header("Content-Disposition:filename=采购总汇表.csv");
  1594. header('Cache-Control: max-age=0');
  1595. $fp = fopen('php://output', 'a');
  1596. $head = ['商品类别', '仓库','商品', '商品编码', '规格','数量', '其他单位', '入库状态', '成本', '总成本']; //定义标题
  1597. foreach ($head as $i => $v) {
  1598. $head[$i] = mb_convert_encoding($v, 'GBK', 'utf-8'); //将中文标题转换编码,否则乱码
  1599. }
  1600. fputcsv($fp, $head);
  1601. $limit = 10000;
  1602. $num = 0;//计数器
  1603. foreach ($result as $value) {//循环数据
  1604. $num++;
  1605. if ($num == $limit) {
  1606. ob_flush();//释放内存
  1607. flush();
  1608. }
  1609. $rows['categoryName'] = isset($value['categoryName']) ? $value['categoryName'] : null;//商品类别
  1610. $rows['warehouseName'] = isset($value['warehouseName']) ? $value['warehouseName'] : null;//仓库
  1611. $rows['materielName'] = isset($value['materielName']) ? $value['materielName'] : null;//商品
  1612. $rows['materielCode'] = isset($value['materielCode']) ? $value['materielCode'] : null;//商品编码
  1613. $rows['unitName'] = isset($value['unitName']) ? $value['unitName'] : null;//规格
  1614. $rows['total'] = isset($value['total']) ? $value['total'] : null;//数量
  1615. $rows['otherNum'] = isset($value['otherNum']) ? $value['otherNum'] : null;//其他单位
  1616. $rows['inStatus'] = isset($v['inStatus']) ? $v['inStatus'] == StatusCode::$standard ? '已入库' : '未入库' : null;//入库状态
  1617. $rows['costPrice'] = isset($value['costPrice']) ? $value['costPrice'] : null;//成本
  1618. $rows['allNum'] = isset($value['allNum']) ? $value['allNum'] : null;//总成本
  1619. foreach ($rows as $kk => $vv) {
  1620. $rs[$kk] = mb_convert_encoding($vv, 'GBK', 'utf-8'); //转译编码
  1621. }
  1622. fputcsv($fp, $rs);
  1623. $rows = [];
  1624. }
  1625. }
  1626. /**
  1627. * 智能采购列表
  1628. */
  1629. public function getAllOrderPurchase($selectParams)
  1630. {
  1631. $stockDbName = Factory::config()->get('db.stock.dbname');
  1632. $objDOrder = new DOrder();
  1633. $objDOrderGoods = new DOrderGoods();
  1634. $objDInventoryWarehouse = new DInventoryWarehouse();
  1635. $objDInventoryWarehouse->setTable('qianniao_inventory_warehouse_'.$this->onlineEnterpriseId);
  1636. $orderTableName = $objDOrder->getTableName('qianniao_order_' . $this->onlineEnterpriseId, $this->onlineUserId, $this->cutTable);
  1637. $objDOrder->setTable($orderTableName);
  1638. $orderGoodsTableName = $objDOrderGoods->getTableName('qianniao_order_goods_' . $this->onlineEnterpriseId, $this->onlineUserId, $this->cutTable);
  1639. $objDOrderGoods->setTable($orderGoodsTableName);
  1640. $returnData = [
  1641. 'data' => [],
  1642. 'total' => 0,
  1643. ];
  1644. $limit = $selectParams['limit'];
  1645. unset($selectParams['limit']);
  1646. $offset = $selectParams['offset'];
  1647. unset($selectParams['offset']);
  1648. $whereSql = '';
  1649. if (isset($selectParams['no']) && !empty($selectParams['no'])) {
  1650. $where = empty($whereSql) ? ' WHERE ' : ' AND ';
  1651. $whereSql .= $where . ' o.no like "%' . $selectParams['no'] .'%"';
  1652. }
  1653. if (isset($selectParams['customerName']) && !empty($selectParams['customerName'])) {
  1654. $where = empty($whereSql) ? ' WHERE ' : ' AND ';
  1655. $whereSql .= $where . ' o.customerName like "%' . $selectParams['customerName'] .'%"';
  1656. }
  1657. if (isset($selectParams['payStatus']) && !empty($selectParams['payStatus'])) {
  1658. $where = empty($whereSql) ? ' WHERE ' : ' AND ';
  1659. $whereSql .= $where . ' o.payStatus = ' . $selectParams['payStatus'];
  1660. }
  1661. if (isset($selectParams['orderStatus']) && !empty($selectParams['orderStatus'])) {
  1662. $where = empty($whereSql) ? ' WHERE ' : ' AND ';
  1663. $whereSql .= $where . ' o.orderStatus = ' . $selectParams['orderStatus'];
  1664. }
  1665. if (isset($selectParams['auditStatus']) && !empty($selectParams['auditStatus'])) {
  1666. $where = empty($whereSql) ? ' WHERE ' : ' AND ';
  1667. $whereSql .= $where . ' o.auditStatus = ' . $selectParams['auditStatus'];
  1668. }
  1669. if ( (isset($selectParams['start']) && !empty($selectParams['start']))&&(isset($selectParams['end']) && !empty($selectParams['end'])) ) {
  1670. $where = empty($whereSql) ? ' WHERE ' : ' AND ';
  1671. $whereSql .= $where . ' o.createTime BETWEEN ' . $selectParams['start'] . ' AND '. $selectParams['end'];
  1672. }
  1673. $where = empty($whereSql) ? ' WHERE ' : ' AND ';
  1674. $whereSql .= $where . 'g.deleteStatus = ' . StatusCode::$standard;
  1675. $sql = 'SELECT g.*,o.*,sum(g.buyNum) as goodsBuyNum,sum(g.otherNum) as goodsOtherNum, w.inventoryNum as inventoryNum,w.otherNum as warehouseOtherNum FROM ' . $objDOrderGoods->get_Table() .' as g left join '. $objDOrder->get_Table() .' as o on o.id=g.orderId left join `'.$stockDbName.'`.'. $objDInventoryWarehouse->get_Table() .' as w on g.skuId=w.skuId '.$whereSql . ' group by g.skuId ORDER BY o.createTime DESC LIMIT ' . $offset . ' , ' . $limit;
  1676. $dbResult = $objDOrder->query($sql);
  1677. if ($dbResult === false) {
  1678. return ResultWrapper::fail($objDOrder->error(), ErrorCode::$dberror);
  1679. }
  1680. if(empty($dbResult)){
  1681. return ResultWrapper::success($returnData);
  1682. }
  1683. //格式化数据
  1684. foreach ($dbResult as $key => $value){
  1685. if(empty($value['inventoryNum'])){
  1686. $dbResult[$key]['inventoryNum'] = 0;
  1687. }
  1688. if(empty($value['warehouseOtherNum'])){
  1689. $dbResult[$key]['warehouseOtherNum'] = 0;
  1690. }
  1691. }
  1692. $return = [
  1693. 'data' => $dbResult,
  1694. 'total' => count($dbResult),
  1695. ];
  1696. return ResultWrapper::success($return);
  1697. }
  1698. }