MPurchase.Class.php 81 KB

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