MPayable.Class.php 9.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252
  1. <?php
  2. /**
  3. * 财务应付生成和检测脚本
  4. * Created by PhpStorm.
  5. * User: phperstar
  6. * Date: 2019/12/19
  7. * Time: 10:38 AM
  8. */
  9. namespace Jobs\Model\MTopic\Finance;
  10. use Mall\Framework\Core\StatusCode;
  11. use Jobs\Cache\FinanceCache;
  12. use Jobs\Dao\Purchase\DPurchase;
  13. use Jobs\Dao\Purchase\DPurchaseOut;
  14. use Jobs\Dao\Stock\DInventoryOut;
  15. use Jobs\Dao\Stock\DInventoryInDetails;
  16. use Jobs\Dao\Finance\DPay;
  17. use Jobs\Dao\Finance\DPayReceiptIndex;
  18. class MPayable
  19. {
  20. private $objDPurchase;
  21. private $objDPurchaseOut;
  22. private $objDInventoryOut;
  23. private $objDPay;
  24. private $objDPayReceiptIndex;
  25. public function __construct()
  26. {
  27. $this->objDPurchase = new DPurchase('stock');
  28. $this->objDPurchaseOut = new DPurchaseOut('stock');
  29. $this->objDInventoryOut = new DInventoryOut('stock');
  30. $this->objDPay = new DPay('finance');
  31. $this->objDPayReceiptIndex = new DPayReceiptIndex('finance');
  32. //$this->objDPay->setSearchIndex('should_pay_receipt_search')->setType('should_pay_receipt');
  33. }
  34. /**
  35. * 检测销售出库单是否都生成应收单了
  36. */
  37. public function checkSaleOutCreateReceivable()
  38. {
  39. }
  40. /**
  41. * 采购入库单生成应付单
  42. */
  43. public function createPayable($params)
  44. {
  45. if (empty($params)) {
  46. echo '请求创建应付单参数为空'.PHP_EOL;
  47. return false;
  48. }
  49. if (empty($params['type'])) {
  50. echo '生成应付单:type字段错误,请提供单据类型'.PHP_EOL;
  51. return false;
  52. }
  53. $payableExtraData = [];
  54. $purchaseData = [];
  55. $payableData = [];
  56. //采购入库生成应付
  57. if($params['type'] == StatusCode::$orderType['purchaseIn']) {
  58. // 查询采购单信息
  59. $this->objDPurchase->setTable($this->objDPurchase->get_Table() . '_' . $params['enterpriseId']);
  60. $purchaseData = $this->objDPurchase->get(['id'=>$params['id']]);
  61. if($purchaseData === false){
  62. echo 'sql错误'.$this->objDPurchase->error().PHP_EOL;
  63. return false;
  64. }
  65. if (empty($purchaseData)) {
  66. echo '采购订单id:' . $params['id'] . '的数据为空'.PHP_EOL;
  67. return false;
  68. }
  69. // 获取入库金额生成应付
  70. $objDInventoryInDetails = new DInventoryInDetails('stock');
  71. $objDInventoryInDetails->setTable('qianniao_inventory_in_details_'.$params['enterpriseId']);
  72. $inDetailsData = $objDInventoryInDetails->select(['linkId' => $params['inventoryInId']]);
  73. if($inDetailsData === false){
  74. echo '查询采购订单对应的入库单详情数据错误'.$objDInventoryInDetails->error().PHP_EOL;
  75. return false;
  76. }
  77. if( empty($inDetailsData) ){
  78. echo '采购订单'.$params['id'].'对应的入库单详情数据为空'.PHP_EOL;
  79. return false;
  80. }
  81. $payMoney = 0;
  82. foreach ($inDetailsData as $key => $value){
  83. $payMoney = bcadd($payMoney, bcmul($value['inNum'], $value['unitPrice']), 2);
  84. }
  85. $payableExtraData = [
  86. 'supplierId' => $purchaseData['supplierId'],
  87. 'supplierName' => $purchaseData['supplierName'],
  88. 'sourceNo' => $purchaseData['no'],
  89. //'payMoney' => $payMoney, // 应付 = 实际采购总成本-均摊费用
  90. 'payMoney' => bcadd(bcsub($purchaseData['purchaseAmount'],$purchaseData['couponAmount'],2),$purchaseData['otherAmount'],2),
  91. 'discountMoney' => $purchaseData['couponAmount'],
  92. 'receiptTypeId' => StatusCode::$orderType['purchaseOrder'],
  93. 'purchaseId' => $purchaseData['id'],
  94. 'notOffsetMoney' => $payMoney,
  95. ];
  96. // 创建应付单数据
  97. $payableData = [
  98. 'warehouseId' => $purchaseData['warehouseId'],
  99. 'warehouseName' => $purchaseData['warehouseName'],
  100. 'financeTypeId' => StatusCode::$orderType['purchaseReturn'],
  101. 'financeType' => '采购单',
  102. 'auditStatus' => StatusCode::$auditStatus['auditing'],
  103. 'createTime' => time(),
  104. 'updateTime' => time(),
  105. ];
  106. }
  107. //采购退货出库生成应付
  108. if($params['type'] == StatusCode::$orderType['purchaseReturnOut']) {
  109. // 查询采购退货出库单信息
  110. $this->objDInventoryOut->setTable($this->objDInventoryOut->get_Table() . '_' . $params['enterpriseId']);
  111. $inventoryOutData = $this->objDInventoryOut->get(['id'=>$params['id']]);
  112. if($inventoryOutData === false){
  113. echo 'sql错误'.$this->objDInventoryOut->error().PHP_EOL;
  114. return false;
  115. }
  116. if (empty($inventoryOutData)) {
  117. echo '采购退货出库单id:' . $params['id'] . '的数据为空'.PHP_EOL;
  118. return false;
  119. }
  120. //查出源采购退货单对应的供应商Id和名称
  121. $this->objDPurchaseOut->setTable($this->objDPurchaseOut->get_Table() . '_' . $params['enterpriseId']);
  122. $purchaseData = $this->objDPurchaseOut->get(['no'=>$inventoryOutData['sourceNo']]);
  123. if($purchaseData === false){
  124. echo 'sql错误'.$this->objDPurchase->error().PHP_EOL;
  125. return false;
  126. }
  127. if (empty($purchaseData)) {
  128. echo '采购退货单no:' . $inventoryOutData['originNo'] . '的数据为空'.PHP_EOL;
  129. return false;
  130. }
  131. $payableExtraData = [
  132. 'supplierId' => $purchaseData['supplierId'],
  133. 'supplierName' => $purchaseData['supplierName'],
  134. 'sourceNo' => $purchaseData['originNo'],//采购订单编号
  135. 'payMoney' => '-'.bcadd($purchaseData['purchaseAmount'], $purchaseData['otherAmount'],4),//实际应付金额
  136. 'discountMoney' => 0,
  137. 'receiptTypeId' => StatusCode::$orderType['purchaseReturn'],
  138. 'purchaseId' => $purchaseData['originId'],
  139. 'notOffsetMoney'=>'-'.bcadd($purchaseData['purchaseAmount'], $purchaseData['otherAmount'],4),//实际应付金额
  140. ];
  141. // 创建应付单数据
  142. $payableData = [
  143. 'warehouseId' => $purchaseData['warehouseId'],
  144. 'warehouseName' => $purchaseData['warehouseName'],
  145. 'financeTypeId' => StatusCode::$orderType['purchaseReturn'],
  146. 'financeType' => '采购退款单',
  147. 'auditStatus' => StatusCode::$auditStatus['auditing'],
  148. 'createTime' => time(),
  149. 'updateTime' => time(),
  150. ];
  151. }
  152. /*foreach ($payableData as $key => $value) {
  153. if (empty($value) && $value !== 0) {
  154. echo $key . '参数错误';
  155. return false;
  156. }
  157. }*/
  158. $payableData = array_merge($payableData, $payableExtraData);
  159. // 添加应付单
  160. $this->objDPay->beginTransaction();
  161. $this->objDPay->setTable('qianniao_pay_receipt_' . $params['enterpriseId'] . '_' . date('Y') . '_' . ceil(date('m') / 3));
  162. //添加应付单no编号
  163. $dbResult = $this->objDPay->get('createTime >='.strtotime(date('Ymd'.'0:0:0')), 'no', 'createTime desc');
  164. if ($dbResult === false) {
  165. echo '数据库查询失败'.$this->objDPay->error().PHP_EOL;
  166. return false;
  167. }
  168. if(empty($dbResult)){
  169. $payableData['no'] = createSerialNumberByDate('');
  170. }else{
  171. $payableData['no'] = createSerialNumberByDate($dbResult['no']);
  172. }
  173. //索引表数据
  174. $indexData = [
  175. 'payReceiptId' => 0,
  176. 'supplierId' => $payableData['supplierId'],
  177. 'sourceNo' => $payableData['sourceNo'],
  178. 'auditStatus' => $payableData['auditStatus'],
  179. 'financeTypeId' => $payableData['financeTypeId'],
  180. 'financeType' => $payableData['financeType'],
  181. 'warehouseId' => $payableData['warehouseId'],
  182. 'createTime' => $payableData['createTime'],
  183. 'updateTime' => $payableData['updateTime'],
  184. ];
  185. $this->objDPayReceiptIndex->setTable('qianniao_pay_receipt_index_' . $params['enterpriseId']);
  186. $payReceiptId = $this->objDPayReceiptIndex->insert($indexData);
  187. if ($payReceiptId === false) {
  188. $this->objDPay->rollBack();
  189. echo 'sql错误'.$this->objDPayReceiptIndex->error().PHP_EOL;
  190. return false;
  191. }
  192. $payableData['id'] = $payReceiptId;
  193. $payableId = $this->objDPay->insert($payableData);
  194. if ($payableId === false) {
  195. $this->objDPay->rollBack();
  196. echo 'sql错误'.$this->objDPay->error().PHP_EOL;
  197. return false;
  198. }
  199. $this->objDPay->commit();
  200. /*
  201. $_id = self::createEsDocumentId($payableId, $params['enterpriseId']);
  202. $esData = $payableData;
  203. $esData['id'] = $payableId;
  204. $esData['enterpriseId'] = $params['enterpriseId'];
  205. $result = $this->objDPay->addUpSearchIndexDocument($esData, $_id);
  206. if (isset($result['_shards']) && isset($result['_shards']['successful']) && $result['_shards']['successful'] == 1) {
  207. //echo "es操作成功";die;
  208. }*/
  209. $objFinanceCache = new FinanceCache();
  210. $objFinanceCache->cacheExistPayEnterprise($params['enterpriseId']);
  211. echo '添加应付单成功'.PHP_EOL;
  212. return true;
  213. }
  214. private function createEsDocumentId($payId, $enterpriseId)
  215. {
  216. $t = date('Y') . '_' . ceil(date('m') / 3);
  217. return 'EnterpriseId_' . $enterpriseId . '_'. $t .'_payId_' . $payId;
  218. }
  219. }