MPurchase.Class.php 82 KB

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