U8ServerService.php 12 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272
  1. <?php
  2. namespace App\Service;
  3. use App\Model\Record;
  4. use Illuminate\Support\Facades\DB;
  5. class U8ServerService extends Service
  6. {
  7. protected $databaseService;
  8. /**
  9. * @var string|null
  10. */
  11. protected $error;
  12. /**
  13. * U8ServerService constructor.
  14. */
  15. public function __construct($loginUser = [])
  16. {
  17. $service = new U8DatabaseServerService($loginUser);
  18. $this->databaseService = $service->db;
  19. $this->error = $service->error;
  20. }
  21. /**
  22. * 获取错误信息
  23. *
  24. * @return string|null
  25. */
  26. public function getError()
  27. {
  28. return $this->error;
  29. }
  30. public function purchaseRequisition($data, $user){
  31. $qx = $user['qx'];
  32. $order_date = $data['order_date'] ?? [];
  33. $order_date = array_filter($order_date);
  34. $order_number = $data['order_number'] ?? "";
  35. $model = $this->databaseService->table('PU_AppVouch as a')
  36. ->leftJoin('Person as c', 'c.cPersonCode', 'a.cPersonCode')
  37. ->when(empty($qx), function ($query) use($user){
  38. return $query->where('a.cMaker',$user['username']);
  39. })
  40. ->when(! empty($order_number), function ($query) use($order_number){
  41. return $query->where('a.cCode','LIKE', '%'.$order_number.'%');
  42. })
  43. ->when(! empty($order_date), function ($query) use($order_date){
  44. $start = date('Y-m-d H:i:s.000', $order_date[0]);
  45. $end = date('Y-m-d H:i:s.000', $order_date[1]);
  46. return $query->whereBetween('a.dDate', [$start, $end]);
  47. })
  48. // ->where(function ($query) {
  49. // $query->where('a.iverifystateex', 0)
  50. // ->OrwhereNull('a.iverifystateex');
  51. // })
  52. ->whereNull('a.cVerifier')
  53. ->select('a.cMaker as crt_name', DB::raw("COALESCE(c.cPersonName, '') as purchase_name"),'a.cBusType as business_type','a.cCode as order_number',DB::raw("CONVERT(varchar(10), a.dDate, 120) as order_date"))
  54. ->orderBy('a.ID','desc');
  55. $list = $this->limit($model,'',$data);
  56. $list = $this->fillAll($list, 2);
  57. return [true , $list];
  58. }
  59. public function purchaseRequisitionDetail($data, $user){
  60. if(empty($data['order_number'])) return [false, '采购请购单号不能为空'];
  61. $order = $this->databaseService->table('PU_AppVouch as a')
  62. ->leftJoin('Person as c', 'c.cPersonCode', 'a.cPersonCode')
  63. // ->where('a.cMaker',$user['username'])
  64. // ->where('a.iverifystateex',0)
  65. ->where('cCode', $data['order_number'])
  66. ->select('a.cMaker as crt_name', DB::raw("COALESCE(c.cPersonName, '') as purchase_name"),'a.cBusType as business_type','a.cCode as order_number',DB::raw("CONVERT(varchar(10), a.dDate, 120) as order_date"),'a.ID as id')
  67. ->first();
  68. if(empty($order)) return [false, '采购请购单不存在'];
  69. $order = (array) $order;
  70. $detail = $this->databaseService->table('PU_AppVouchs as a')
  71. ->leftJoin('Inventory as b', 'b.cInvCode', 'a.cInvCode')
  72. ->leftJoin('ComputationUnit as c', 'c.cComunitCode', 'b.cComUnitCode')
  73. ->where('a.ID', $order['id'])
  74. ->select('b.cInvName as product_title','b.cInvStd as product_size','b.cInvCode as product_code','b.cCurrencyName as product_ty','c.cComUnitName as unit_title',DB::raw("CONVERT(varchar(10), a.dRequirDate, 120) as need_arrived_date"),DB::raw("LTRIM(STR(a.fQuantity, 20, 2)) as quantity"))
  75. ->get();
  76. // 转为数组的数组
  77. $detail = array_map(function ($item) {
  78. return (array) $item;
  79. }, $detail->toArray());
  80. foreach ($detail as $key => $value){
  81. if($user['zt'] == 1){
  82. if(! empty($value['product_ty'])) $detail[$key]['product_title'] = $value['product_title'] . '|' . $value['product_ty'];
  83. }else{
  84. if(! empty($value['product_size'])) $detail[$key]['product_title'] = $value['product_title'] . '|' . $value['product_size'];
  85. }
  86. }
  87. $order['detail'] = $detail;
  88. return [true, $order];
  89. }
  90. public function purchaseOrder($data, $user){
  91. $qx = $user['qx'];
  92. $order_date = $data['order_date'] ?? [];
  93. $order_date = array_filter($order_date);
  94. $order_number = $data['order_number'] ?? "";
  95. $model = $this->databaseService->table('PO_Pomain as a')
  96. ->leftJoin('Vendor as c', 'c.cVenCode', 'a.cVenCode')
  97. ->when(empty($qx), function ($query) use($user){
  98. return $query->where('a.cMaker',$user['username']);
  99. })
  100. ->when(! empty($order_number), function ($query) use($order_number){
  101. return $query->where('a.cPOID','LIKE', '%'.$order_number.'%');
  102. })
  103. ->when(! empty($order_date), function ($query) use($order_date){
  104. $start = date('Y-m-d H:i:s.000', $order_date[0]);
  105. $end = date('Y-m-d H:i:s.000', $order_date[1]);
  106. return $query->whereBetween('a.dPODate', [$start, $end]);
  107. })
  108. ->where(function ($query) {
  109. $query->where('a.iverifystateex', 0)
  110. ->OrwhereNull('a.iverifystateex');
  111. })
  112. ->select('a.cMaker as crt_name', 'a.cBusType as business_type','a.cPOID as order_number',DB::raw("CONVERT(varchar(10), a.dPODate, 120) as order_date"),'c.cVenName as supplier_title')
  113. ->orderBy('a.POID','desc');
  114. $list = $this->limit($model,'',$data);
  115. $list = $this->fillAll($list, 1);
  116. return [true , $list];
  117. }
  118. public function purchaseOrderDetail($data, $user){
  119. if(empty($data['order_number'])) return [false, '采购单号不能为空'];
  120. $order = $this->databaseService->table('PO_Pomain as a')
  121. ->leftJoin('Vendor as c', 'c.cVenCode', 'a.cVenCode')
  122. ->where('cPOID', $data['order_number'])
  123. // ->where('a.cMaker',$user['username'])
  124. // ->where('a.iverifystateex',0)
  125. ->select('a.cMaker as crt_name', 'a.cBusType as business_type','a.cPOID as order_number',DB::raw("CONVERT(varchar(10), a.dPODate, 120) as order_date"),'c.cVenName as supplier_title','a.POID as id')
  126. ->first();
  127. if(empty($order)) return [false, '采购单不存在'];
  128. $order = (array) $order;
  129. $detail = $this->databaseService->table('PO_Podetails as a')
  130. ->leftJoin('Inventory as b', 'b.cInvCode', 'a.cInvCode')
  131. ->leftJoin('ComputationUnit as c', 'c.cComunitCode', 'b.cComUnitCode')
  132. ->where('a.POID', $order['id'])
  133. ->select('b.cInvName as product_title','b.cInvStd as product_size','b.cInvCode as product_code','b.cCurrencyName as product_ty','c.cComUnitName as unit_title',DB::raw("LTRIM(STR(a.iQuantity, 20, 2)) as quantity"),DB::raw("LTRIM(STR(a.iSum, 20, 2)) as amount"))
  134. ->get();
  135. // 转为数组的数组
  136. $detail = array_map(function ($item) {
  137. return (array) $item;
  138. }, $detail->toArray());
  139. foreach ($detail as $key => $value){
  140. if($user['zt'] == 1){
  141. if(! empty($value['product_ty'])) $detail[$key]['product_title'] = $value['product_title'] . '|' . $value['product_ty'];
  142. }else{
  143. if(! empty($value['product_size'])) $detail[$key]['product_title'] = $value['product_title'] . '|' . $value['product_size'];
  144. }
  145. }
  146. $order['detail'] = $detail;
  147. return [true, $order];
  148. }
  149. public function paymentOrder($data, $user){
  150. $qx = $user['qx'];
  151. $order_date = $data['order_date'] ?? [];
  152. $order_date = array_filter($order_date);
  153. $order_number = $data['order_number'] ?? "";
  154. $model = $this->databaseService->table('AP_ApplyPayVouch as a')
  155. ->leftJoin('Vendor as c', 'c.cVenCode', 'a.cDwCode')
  156. ->when(empty($qx), function ($query) use($user){
  157. return $query->where('a.cOperator',$user['username']);
  158. })
  159. ->when(! empty($order_number), function ($query) use($order_number){
  160. return $query->where('a.cVouchID','LIKE', '%'.$order_number.'%');
  161. })
  162. ->when(! empty($order_date), function ($query) use($order_date){
  163. $start = date('Y-m-d H:i:s.000', $order_date[0]);
  164. $end = date('Y-m-d H:i:s.000', $order_date[1]);
  165. return $query->whereBetween('a.dVouchDate', [$start, $end]);
  166. })
  167. ->whereNull('a.cCheckMan')
  168. ->select('a.cOperator as crt_name', 'c.cVenName as supplier_title','a.cVouchID as order_number',DB::raw("CONVERT(varchar(10), a.dVouchDate, 120) as order_date"))
  169. ->orderBy('a.PID','desc');
  170. $list = $this->limit($model,'',$data);
  171. $list = $this->fillAll($list, 3);
  172. return [true , $list];
  173. }
  174. public function paymentOrderDetail($data, $user){
  175. if(empty($data['order_number'])) return [false, '付款申请单号不能为空'];
  176. $order = $this->databaseService->table('AP_ApplyPayVouch as a')
  177. ->leftJoin('Vendor as c', 'c.cVenCode', 'a.cDwCode')
  178. // ->where('a.cOperator',$user['username'])
  179. // ->whereNull('a.cCheckMan')
  180. ->where('cVouchID', $data['order_number'])
  181. ->select('a.cOperator as crt_name', 'c.cVenName as supplier_title','a.cVouchID as order_number',DB::raw("CONVERT(varchar(10), a.dVouchDate, 120) as order_date"),'a.PID as id')
  182. ->first();
  183. if(empty($order)) return [false, '付款单不存在'];
  184. $order = (array) $order;
  185. $detail = $this->databaseService->table('AP_ApplyPayVouchs as a')
  186. ->leftJoin('Inventory as b', 'b.cInvCode', 'a.cInvCode')
  187. ->leftJoin('ComputationUnit as c', 'c.cComunitCode', 'b.cComUnitCode')
  188. ->where('a.PID', $order['id'])
  189. ->select('a.cSource as source','a.cCoVouchID as source_order_number','b.cInvName as product_title','b.cInvStd as product_size','b.cCurrencyName as product_ty','c.cComUnitName as unit_title',DB::raw("LTRIM(STR(a.iApplyAmt_s, 20, 2)) as number"),
  190. DB::raw("LTRIM(STR(a.iApplyAmt_f, 20, 2)) as amount"),DB::raw("LTRIM(STR(a.iOriTaxCost, 20, 2)) as price"))
  191. ->get();
  192. // 转为数组的数组
  193. $detail = array_map(function ($item) {
  194. return (array) $item;
  195. }, $detail->toArray());
  196. foreach ($detail as $key => $value){
  197. if($user['zt'] == 1){
  198. if(! empty($value['product_ty'])) $detail[$key]['product_title'] = $value['product_title'] . '|' . $value['product_ty'];
  199. }else{
  200. if(! empty($value['product_size'])) $detail[$key]['product_title'] = $value['product_title'] . '|' . $value['product_size'];
  201. }
  202. }
  203. // 使用 array_column 提取所有 amount 并求和
  204. $order['total_amount'] = number_format(array_sum(array_column($detail, 'amount')), 2, '.', '');
  205. $order['detail'] = $detail;
  206. return [true, $order];
  207. }
  208. public function getOrderDetails($data,$user){
  209. $type = $data['type'];
  210. if($type == 1){
  211. // 采购单
  212. [$success, $order] = $this->purchaseOrderDetail($data,$user);
  213. }elseif ($type == 2){
  214. // 请购单
  215. [$success, $order] = $this->purchaseRequisitionDetail($data,$user);
  216. }else{
  217. // 付款申请单
  218. [$success, $order] = $this->paymentOrderDetail($data,$user);
  219. }
  220. return [$success, $order];
  221. }
  222. private function fillAll($list, $type){
  223. if(empty($list['data'])) return $list;
  224. $map = Record::where('del_time',0)
  225. ->where('type', $type)
  226. ->whereIn('order_number',array_column($list['data'],'order_number'))
  227. ->pluck('id','order_number')
  228. ->toArray();
  229. foreach ($list['data'] as $key => $value){
  230. $is_create = 0;
  231. if(isset($map[$value->order_number])) $is_create = 1;
  232. $list['data'][$key]->is_create = $is_create;
  233. }
  234. return $list;
  235. }
  236. }