SalesWriteReport.php 9.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295
  1. <?php
  2. namespace App\Console\Commands;
  3. use App\Model\AreaMap;
  4. use App\Model\BasicType;
  5. use App\Model\BasicTypeAllUse;
  6. use App\Model\Construction;
  7. use App\Model\Customer;
  8. use App\Model\CustomerInfo;
  9. use App\Model\CustomerReport;
  10. use App\Model\CustomerReportDepart;
  11. use App\Model\Depart;
  12. use App\Model\Employee;
  13. use App\Model\FollowUpRecord;
  14. use App\Model\PaymentReceipt;
  15. use App\Model\PaymentReceiptInfo;
  16. use App\Model\Product;
  17. use App\Model\PurchaseOrder;
  18. use App\Model\SalesOrder;
  19. use App\Model\SalesOrderInfo;
  20. use App\Model\SalesOrderOtherFee;
  21. use App\Model\SalesOrderProductInfo;
  22. use App\Model\SalesOrderReport;
  23. use App\Model\SeeRange;
  24. use App\Service\ProductService;
  25. use Illuminate\Console\Command;
  26. use Illuminate\Support\Facades\DB;
  27. class SalesWriteReport extends Command
  28. {
  29. /**
  30. * The name and signature of the console command.
  31. *
  32. * @var string
  33. */
  34. protected $signature = 'command:sales_write_report';
  35. /**
  36. * The console command description.
  37. *
  38. * @var string
  39. */
  40. protected $description = 'Command description';
  41. /**
  42. * Create a new command instance.
  43. *
  44. * @return void
  45. */
  46. public function __construct()
  47. {
  48. parent::__construct();
  49. }
  50. /**
  51. * Execute the console command.
  52. *
  53. * @return mixed
  54. */
  55. public function handle()
  56. {
  57. echo "执行任务--------start---------------\n";
  58. try {
  59. $this->SalesWrite();
  60. }catch (\Throwable $exception){
  61. echo "发生异常:" . $exception->getFile() . "|" . $exception->getMessage() . "|" . $exception->getLine() . "\n";
  62. }
  63. echo "执行任务--------end---------------\n";
  64. }
  65. private function SalesWrite(){
  66. //今天到上月今天的时间戳
  67. $nowStamp = time();
  68. $lastMonth = date("Y-m-d 00:00:00", strtotime("-1 month"));
  69. $lastMonthStamp = strtotime($lastMonth);
  70. $area = Depart::where('del_time',0)
  71. ->where('parent_id',0)
  72. ->pluck('area','id')
  73. ->toArray();
  74. SalesOrder::where("del_time",0)
  75. ->where('crt_time','>=', $lastMonthStamp)
  76. ->where('crt_time','<=', $nowStamp)
  77. ->orderBy('crt_time','asc')
  78. ->chunkById(200, function ($data) use($nowStamp, $area){
  79. // 开启事务
  80. DB::transaction(function () use ($data, $nowStamp, $area) {
  81. $dataArray = $data->toArray();
  82. $main = $this->processingData($dataArray, $nowStamp,$area);
  83. if (! empty($main)) {
  84. SalesOrderReport::whereIn('sale_order_id',array_column($dataArray,'id'))
  85. ->update(['del_time' => $nowStamp]);
  86. SalesOrderReport::insert($main);
  87. echo '200条写入中' . PHP_EOL;
  88. } else {
  89. echo '暂无数据写入' . PHP_EOL;
  90. }
  91. });
  92. });
  93. }
  94. private function processingData($data,$time,$area){
  95. $id = array_column($data,'id');
  96. $contact_product = $this->getSalesOrderProduct($id);
  97. $customer = $this->getCustomer(array_column($data,'customer_id'));
  98. $basic = $this->getBasic($data);
  99. $zp_money = $this->getOtherMoney($id);
  100. $fz_man = $this->getFzMan($id);
  101. $construction = $this->getConstruction($id);
  102. $payment = $this->getPayment(array_column($data,'order_number'));
  103. $purchase = $this->getPurchaseFrom(array_filter(array_column($data,'contact_order_no')));
  104. $insert = [];
  105. foreach ($data as $value){
  106. $receipt = $payment[$value['order_number']] ?? 0;
  107. $contact_product_tmp = $contact_product[$value['id']] ?? [];
  108. $contact_product_tmp_str = implode('、',$contact_product_tmp);
  109. $customer_tmp = $customer[$value['customer_id']] ?? "";
  110. $basic_tmp = $basic[$value['plat_type']] ?? "";
  111. $area_tmp = $area[$value['top_depart_id']] ?? 0;
  112. $zp_tmp = $zp_money[$value['id']] ?? 0;
  113. $fz_tmp = $fz_man[$value['id']] ?? "";
  114. $purchase_tmp = $purchase[$value['contact_order_no']] ?? 0;
  115. $state = $this->makeState($value);
  116. if(isset($construction[$value['id']])){
  117. $c = $construction[$value['id']];
  118. if($c <= Construction::STATE_THREE){
  119. $state_tmp = 2;
  120. }elseif($c <= Construction::STATE_FIVE){
  121. $state_tmp = 3;
  122. }else{
  123. $state_tmp = 4;
  124. }
  125. }else{
  126. $state_tmp = $state;
  127. }
  128. $insert[] = [
  129. 'sale_order_id' => $value['id'],
  130. 'sales_order_type' => $value['sales_order_type'],
  131. 'receipt' => $receipt,
  132. 'model_type' => $value['model_type'],
  133. 'order_number' => $value['order_number'],
  134. 'contact_product' => $contact_product_tmp_str,
  135. 'fz_man' => $fz_tmp,
  136. 'plat_type_title' => $basic_tmp,
  137. 'customer_title' => $customer_tmp,
  138. 'crt_id' => $value['crt_id'],
  139. 'crt_time' => $value['crt_time'],
  140. 'contract_fee' => $value['contract_fee'],
  141. 'zp_contract_fee' => $zp_tmp,
  142. 'top_depart_id' => $value['top_depart_id'],
  143. 'from_top_depart_id' => $purchase_tmp,
  144. 'area' => $area_tmp,
  145. 'state' => $state_tmp,
  146. ];
  147. }
  148. return $insert;
  149. }
  150. private function getSalesOrderProduct($data_id)
  151. {
  152. $product = [];
  153. $sales_p_info = SalesOrderProductInfo::where('del_time',0)
  154. ->whereIn('sales_order_id',$data_id)
  155. ->select('product_id','sales_order_id')
  156. ->get()->toArray();
  157. $map = Product::whereIn('id',array_unique(array_column($sales_p_info,'product_id')))
  158. ->pluck('title','id')
  159. ->toArray();
  160. foreach ($sales_p_info as $value){
  161. $tmp = $map[$value['product_id']] ?? "";
  162. $product[$value['sales_order_id']][] = $tmp;
  163. }
  164. return $product;
  165. }
  166. private function getCustomer($data_id)
  167. {
  168. return Customer::whereIn('id',$data_id)
  169. ->pluck('title','id')
  170. ->toArray();
  171. }
  172. private function getBasic($data)
  173. {
  174. $array = array_unique(array_column($data,'plat_type'));
  175. return BasicType::whereIn('id',$array)
  176. ->pluck('title','id')
  177. ->toArray();
  178. }
  179. private function getOtherMoney($id){
  180. $fee = [];
  181. $sales_o_info = SalesOrderOtherFee::where('del_time',0)
  182. ->whereIn('sales_order_id',$id)
  183. ->get()->toArray();
  184. foreach ($sales_o_info as $value){
  185. $fee[$value['sales_order_id']] = $value['other_fee_1'];
  186. }
  187. return $fee;
  188. }
  189. private function getFzMan($id){
  190. //单据中选择的负责人
  191. $sales_order = SalesOrderInfo::where('del_time',0)
  192. ->where('type',SalesOrderInfo::type_two)
  193. ->whereIn('sales_order_id',$id)
  194. ->select('sales_order_id','data_id')
  195. ->get()->toArray();
  196. $empList = Employee::whereIn('id', array_unique(array_column($sales_order,'data_id')))
  197. ->pluck('emp_name','id')
  198. ->toArray();
  199. $employee_two = [];
  200. foreach ($sales_order as $value){
  201. $str = $empList[$value['data_id']] ?? "";
  202. if(! $str) continue;
  203. if(isset($employee_two[$value['sales_order_id']])){
  204. $employee_two[$value['sales_order_id']] .= ',' . $str;
  205. }else{
  206. $employee_two[$value['sales_order_id']] = $str;
  207. }
  208. }
  209. return $employee_two;
  210. }
  211. private function makeState($value){
  212. if($value['sales_order_type'] == SalesOrder::Order_type_one){
  213. //安装件
  214. if(in_array($value['state'], [SalesOrder::State_minus_one, SalesOrder::State_zero, SalesOrder::State_one])){
  215. return 0;
  216. }elseif(in_array($value['state'], [SalesOrder::State_two, SalesOrder::State_three, SalesOrder::State_four])){
  217. return 1;
  218. }else{
  219. return 1;
  220. }
  221. }else{
  222. return 0;
  223. }
  224. return $state;
  225. }
  226. private function getConstruction($id){
  227. $construction = Construction::where('del_time',0)
  228. ->whereIn('sales_order_id', $id)
  229. ->select('sales_order_id','state')
  230. ->get()->toArray();
  231. $return = [];
  232. foreach ($construction as $value){
  233. if(isset($return[$value['sales_order_id']])){
  234. if($value['state'] > $return[$value['sales_order_id']]) $return[$value['sales_order_id']] = $value['state'];
  235. }else{
  236. $return[$value['sales_order_id']] = $value['state'];
  237. }
  238. }
  239. return $return;
  240. }
  241. private function getPayment($id){
  242. $infos = PaymentReceiptInfo::where('del_time',0)
  243. ->where('type',PaymentReceiptInfo::type_three)//回款信息
  244. ->where('data_order_type', PaymentReceipt::data_type_one)//合同
  245. ->where('data_type', PaymentReceipt::type_one)//收款
  246. ->whereIn('data_order_no',$id)
  247. ->get()->toArray();
  248. $infos_map = [];
  249. foreach ($infos as $value){
  250. if(isset($infos_map[$value['data_order_no']])){
  251. $tmp = bcadd($value['amount'], $infos_map[$value['data_order_no']],2);
  252. $infos_map[$value['data_order_no']] = $tmp;
  253. }else{
  254. $infos_map[$value['data_order_no']] = $value['amount'];
  255. }
  256. }
  257. return $infos_map;
  258. }
  259. private function getPurchaseFrom($order_no){
  260. return PurchaseOrder::whereIn('order_number',$order_no)
  261. ->pluck('top_depart_id','order_number')
  262. ->toArray();
  263. }
  264. }