Report.php 18 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452
  1. <?php
  2. namespace app\admin\controller;
  3. use think\facade\Db;
  4. use think\facade\Validate;
  5. //报表处理类
  6. class Report extends Base
  7. {
  8. //产品价格和产品导出
  9. public function exportGood()
  10. {
  11. $param = $this->request->only(['date', 'platform_id', 'status'], 'post', 'trim');
  12. $val = Validate::rule([
  13. 'date|筛选时间' => 'require|date',
  14. 'platform_id|筛选平台ID' => 'require|number|gt:0',
  15. 'status|状态' => 'require|number|in:5,6,8',
  16. ]);
  17. if (!$val->check($param)) return error_show(1004, $val->getError());
  18. $where_ladder = [['gl.is_del', '=', 0]];
  19. $where_good = [['g.is_del', '=', 0]];
  20. if (!empty($param['date'])) {
  21. $where_ladder[] = ['gl.addtime', 'between', [$param['date'] . ' 00:00:00', $param['date'] . ' 23:59:59']];
  22. $where_good[] = ['g.addtime', 'between', [$param['date'] . ' 00:00:00', $param['date'] . ' 23:59:59']];
  23. }
  24. if (!empty($param['platform_id'])) {
  25. $where_ladder[] = ['gp.platform_code', '=', $param['platform_id']];
  26. $where_good[] = ['gp.platform_code', '=', $param['platform_id']];
  27. }
  28. if (!empty($param['status'])) {
  29. $where_ladder[] = ['g.status', '=', $param['status']];
  30. $where_good[] = ['g.status', '=', $param['status']];
  31. }
  32. $data = [];
  33. //产品价格
  34. $rs_ladder = Db::name('good_ladder')
  35. ->alias('gl')
  36. ->field('g.good_name 商品名称,gl.market_price 市场价,gl.origin_rate 税率,g.moq 起订量,gl.sale_price 售价,gl.skuCode 商品编码,gl.cost_fee 工艺费,gl.market_platform 对比平台')
  37. ->where($where_ladder)
  38. ->leftJoin('good_platform gp', 'gp.skuCode=gl.skuCode AND gp.is_del=0')
  39. ->leftJoin('good g', 'g.spuCode=gp.spuCode AND g.is_del=0')
  40. ->order('gl.id')
  41. ->select()
  42. ->toArray();
  43. if (!empty($rs_ladder)) {
  44. $data[] = [
  45. 'head' => array_keys($rs_ladder[0]),
  46. 'list' => $rs_ladder,
  47. 'filename' => '产品价格' . date('YmdHis'),
  48. ];
  49. }
  50. //产品
  51. $rs_temp_good = Db::name('good')
  52. ->alias('g')
  53. ->field('"" 一级分类,"" 二级分类, g.cat_id 三级分类,g.good_name 商品名称,g.good_type 商品类型,g.brand_id 商品品牌,\'\' 型号,g.origin_place 产地,g.good_unit 计量单位,g.weight 重量g,\'\' 响应时间,g.lead_time 供货周期,g.good_size 商品尺寸,g.packing_size 装箱尺寸,g.packing_way 包装方式,g.packing_spec 装箱规格,g.packing_list 包装清单,g.delivery_place 发货地,g.delivery_day 物流时间,gp.skuCode 商品编码,g.spuCode')
  54. ->where($where_good)
  55. ->leftJoin('good_platform gp', 'gp.spuCode=g.spuCode AND gp.is_del=0')
  56. ->order('g.id')
  57. ->select()
  58. ->toArray();
  59. $all_good_type = [1 => '定制商品', 2 => '常规商品'];
  60. $all_brand = Db::name('brand')->whereIn('id', array_column($rs_temp_good, '商品品牌'))->where('is_del', 0)->column('brand_name', 'id');
  61. $all_cat = Db::name('cat')
  62. ->alias('c3')
  63. ->whereIn('c3.id', array_column($rs_temp_good, '三级分类'))
  64. ->where('c3.is_del', 0)
  65. ->leftJoin('cat c2', 'c2.id=c3.pid AND c2.is_del=0')
  66. ->leftJoin('cat c1', 'c1.id=c2.pid AND c1.is_del=0')
  67. ->column('c3.cat_name cat_name_3,c2.cat_name cat_name_2,c1.cat_name cat_name_1', 'c3.id');
  68. $all_unit = Db::name('unit')->whereIn('id', array_column($rs_temp_good, '计量单位'))->where('is_del', 0)->column('unit', 'id');
  69. foreach ($rs_temp_good as &$value) {
  70. $value['商品品牌'] = isset($all_brand[$value['商品品牌']]) ? $all_brand[$value['商品品牌']] : '';
  71. $value['商品类型'] = isset($all_good_type[$value['商品类型']]) ? $all_good_type[$value['商品类型']] : '';
  72. $value['一级分类'] = isset($all_cat[$value['三级分类']]['cat_name_1']) ? $all_cat[$value['三级分类']]['cat_name_1'] : '';
  73. $value['二级分类'] = isset($all_cat[$value['三级分类']]['cat_name_2']) ? $all_cat[$value['三级分类']]['cat_name_2'] : '';
  74. $value['三级分类'] = isset($all_cat[$value['三级分类']]['cat_name_3']) ? $all_cat[$value['三级分类']]['cat_name_3'] : '';
  75. $temp = explode(',', $value['产地']);
  76. $value['产地'] = GetAddr(json_encode(['provice_code' => isset($temp[0]) ? $temp[0] : '', 'city_code' => isset($temp[1]) ? $temp[1] : '', 'area_code' => isset($temp[2]) ? $temp[2] : '']));
  77. $value['计量单位'] = isset($all_unit[$value['计量单位']]) ? $all_unit[$value['计量单位']] : '';
  78. $temp_2 = explode(',', $value['发货地']);
  79. $value['发货地'] = GetAddr(json_encode(['provice_code' => isset($temp_2[0]) ? $temp_2[0] : '', 'city_code' => isset($temp_2[1]) ? $temp_2[1] : '', 'area_code' => isset($temp_2[2]) ? $temp_2[2] : '']));
  80. $value['型号'] = Db::name('good_spec')
  81. ->alias('gp')
  82. ->field('')
  83. ->leftJoin('specs s', 's.id=gp.spec_id AND s.is_del=0')
  84. ->leftJoin('spec_value sv', 'sv.id=gp.spec_value_id AND s.is_del=0')
  85. ->where([
  86. 'gp.spuCode' => $value['spuCode'],
  87. 'gp.is_del' => 0,
  88. 's.spec_name' => '型号',
  89. ])
  90. ->value('sv.spec_value', '');
  91. $value['响应时间'] = Db::name('good_spec')
  92. ->alias('gp')
  93. ->field('')
  94. ->leftJoin('specs s', 's.id=gp.spec_id AND s.is_del=0')
  95. ->leftJoin('spec_value sv', 'sv.id=gp.spec_value_id AND s.is_del=0')
  96. ->where([
  97. 'gp.spuCode' => $value['spuCode'],
  98. 'gp.is_del' => 0,
  99. 's.spec_name' => '响应时间',
  100. ])
  101. ->value('sv.spec_value', '');
  102. unset($value['spuCode']);
  103. }
  104. if (!empty($rs_temp_good)) {
  105. $data[] = [
  106. 'head' => array_keys($rs_temp_good[0]),
  107. 'list' => $rs_temp_good,
  108. 'filename' => '产品' . date('YmdHis'),
  109. ];
  110. }
  111. if (empty($data)) return error_show(1005, '没有可供导出的数据');
  112. else excelSaveBatch($data);
  113. }
  114. //【一、采购日报表】1.咨询单总数
  115. public function zixunTotal()
  116. {
  117. $param = $this->request->only([
  118. 'token',
  119. 'start_date' => date('Y-m-d H:i:s'),
  120. 'end_date' => date('Y-m-d H:i:s'),
  121. ], 'post', 'trim');
  122. $val_params = Validate::rule([
  123. 'start_date' => 'date|elt:end_date',
  124. 'end_date' => 'date',
  125. ]);
  126. if (!$val_params->check($param)) return error_show(1004, $val_params->getError());
  127. $rs = Db::name('good_zixun')
  128. ->alias('gz')
  129. ->field('gz.id,DATE_FORMAT(gz.addtime,"%Y-%m-%d") addtime,gz.createrid,du.itemid,ci.name')
  130. ->leftJoin('depart_user du', 'du.uid=gz.createrid AND du.is_del=0')
  131. ->leftJoin('company_item ci', 'ci.id=du.itemid AND ci.is_del=0')
  132. ->where('gz.is_del', 0)
  133. ->whereBetween('gz.addtime', [$param['start_date'], $param['end_date']])
  134. ->cursor();
  135. $data = [];
  136. foreach ($rs as $value) {
  137. $addtime_stamp = strtotime($value['addtime']);
  138. if (!isset($data[$addtime_stamp])) $data[$addtime_stamp] = [
  139. 'date' => $value['addtime'],
  140. 'list' => [],
  141. ];
  142. if (isset($data[$addtime_stamp]['list'][$value['itemid']])) {
  143. $data[$addtime_stamp]['list'][$value['itemid']]['total']++;
  144. } else {
  145. $data[$addtime_stamp]['list'][$value['itemid']] = [
  146. 'total' => 1,
  147. 'name' => $value['name'],
  148. ];
  149. }
  150. }
  151. //去掉下标
  152. foreach ($data as &$v) {
  153. $v['list'] = array_merge($v['list']);
  154. }
  155. return app_show(0, '请求成功', array_merge($data));
  156. }
  157. //【一、采购日报表】2.采购订单总金额
  158. public function purcheaseOrderSum()
  159. {
  160. $param = $this->request->only([
  161. 'token',
  162. 'start_date' => date('Y-m-d H:i:s'),
  163. 'end_date' => date('Y-m-d H:i:s'),
  164. ], 'post', 'trim');
  165. $val_params = Validate::rule([
  166. 'start_date' => 'date|elt:end_date',
  167. 'end_date' => 'date',
  168. ]);
  169. if (!$val_params->check($param)) return error_show(1004, $val_params->getError());
  170. $rs = Db::name('purchease_order')
  171. ->alias('po')
  172. ->field('po.id,DATE_FORMAT(po.addtime,"%Y-%m-%d") addtime,po.cgder_id,po.total_fee,po.good_num,po.status,du.itemid,ci.name')
  173. ->leftJoin('depart_user du', 'du.uid=po.cgder_id AND du.is_del=0')
  174. ->leftJoin('company_item ci', 'ci.id=du.itemid AND ci.is_del=0')
  175. ->where('po.is_del', 0)
  176. ->whereBetween('po.addtime', [$param['start_date'], $param['end_date']])
  177. ->cursor();
  178. $data = [];
  179. foreach ($rs as $value) {
  180. $addtime_stamp = strtotime($value['addtime']);
  181. if (!isset($data[$addtime_stamp])) {
  182. $data[$addtime_stamp] = [
  183. 'date' => $value['addtime'],//date('Y年m月d日', $addtime_stamp),
  184. 'list' => [],
  185. ];
  186. }
  187. if (!isset($data[$addtime_stamp]['list'][$value['itemid']])) {
  188. $data[$addtime_stamp]['list'][$value['itemid']] = [
  189. 'name' => $value['name'],
  190. 'total_fee' => 0.00,
  191. 'good_num' => 0,
  192. 'wait_total_fee' => 0.00,
  193. 'wait_good_num' => 0,
  194. ];
  195. }
  196. if ($value['status'] == 0) {
  197. $data[$addtime_stamp]['list'][$value['itemid']]['wait_total_fee'] += $value['total_fee'];
  198. $data[$addtime_stamp]['list'][$value['itemid']]['wait_good_num'] += $value['good_num'];
  199. } else {
  200. $data[$addtime_stamp]['list'][$value['itemid']]['total_fee'] += $value['total_fee'];
  201. $data[$addtime_stamp]['list'][$value['itemid']]['good_num'] += $value['good_num'];
  202. }
  203. }
  204. //去除下标
  205. foreach ($data as &$v) {
  206. $v['list'] = array_merge($v['list']);
  207. }
  208. return app_show(0, '请求成功', array_merge($data));
  209. }
  210. //【一、采购日报表】3.采购员回复咨询单数
  211. public function consultBidsSum()
  212. {
  213. $param = $this->request->only([
  214. 'token',
  215. 'start_date' => date('Y-m-d H:i:s'),
  216. 'end_date' => date('Y-m-d H:i:s'),
  217. ], 'post', 'trim');
  218. $val_params = Validate::rule([
  219. 'start_date' => 'date|elt:end_date',
  220. 'end_date' => 'date',
  221. ]);
  222. if (!$val_params->check($param)) return error_show(1004, $val_params->getError());
  223. $rs = Db::name('consult_bids')
  224. ->alias('cb')
  225. ->field('cb.id,DATE_FORMAT(cb.addtime,"%Y-%m-%d") addtime,cb.createrid,cb.creater,c.num,du.itemid,ci.name')
  226. ->leftJoin('consult c', 'c.zxNo=cb.zxNo AND c.is_del=0')
  227. ->leftJoin('depart_user du', 'du.uid=cb.createrid AND du.is_del=0')
  228. ->leftJoin('company_item ci', 'ci.id=du.itemid AND ci.is_del=0')
  229. ->where('cb.is_del', 0)
  230. ->whereBetween('cb.addtime', [$param['start_date'], $param['end_date']])
  231. ->cursor();
  232. $data = [];
  233. $total = 1;
  234. foreach ($rs as $value) {
  235. $addtime_stamp = strtotime($value['addtime']);
  236. if (!isset($data[$addtime_stamp])) {
  237. $data[$addtime_stamp] = [
  238. 'date' => $value['addtime'],//date('Y年m月d日', $addtime_stamp),
  239. 'list' => [],
  240. ];
  241. }
  242. if (!isset($data[$addtime_stamp]['list'][$value['itemid']])) {
  243. $data[$addtime_stamp]['list'][$value['itemid']] = [
  244. 'name' => $value['name'],
  245. 'list' => [],
  246. ];
  247. }
  248. if (!isset($data[$addtime_stamp]['list'][$value['itemid']]['list']['createrid'])) {
  249. $data[$addtime_stamp]['list'][$value['itemid']]['list'][$value['createrid']] = [
  250. 'name' => $value['creater'],
  251. 'order_total' => 0,
  252. 'good_total' => 0,
  253. ];
  254. }
  255. $data[$addtime_stamp]['list'][$value['itemid']]['list'][$value['createrid']]['order_total']++;
  256. $data[$addtime_stamp]['list'][$value['itemid']]['list'][$value['createrid']]['good_total'] += $value['num'];
  257. $total++;
  258. }
  259. //去除下标
  260. foreach ($data as &$v) {
  261. foreach ($v['list'] as &$vv) {
  262. $vv['list'] = array_merge($vv['list']);
  263. }
  264. $v['list'] = array_merge($v['list']);
  265. }
  266. $data[] = ['date' => '汇总', 'list' => ['name' => '', 'list' => ['name' => '', 'order_total' => $total, 'good_total' => 0]]];
  267. return app_show(0, '请求成功', array_merge($data));
  268. }
  269. //【一、采购日报表】4.采购员订单金额
  270. public function purcheaseOrderSumByUser()
  271. {
  272. $param = $this->request->only([
  273. 'token',
  274. 'start_date' => date('Y-m-d H:i:s'),
  275. 'end_date' => date('Y-m-d H:i:s'),
  276. ], 'post', 'trim');
  277. $val_params = Validate::rule([
  278. 'start_date' => 'date|elt:end_date',
  279. 'end_date' => 'date',
  280. ]);
  281. if (!$val_params->check($param)) return error_show(1004, $val_params->getError());
  282. $rs = Db::name('purchease_order')
  283. ->alias('po')
  284. ->field('po.id,DATE_FORMAT(po.addtime,"%Y-%m-%d") addtime,po.cgder_id,po.cgder,po.total_fee,po.good_num,po.status')
  285. ->where('po.is_del', 0)
  286. ->whereBetween('po.addtime', [$param['start_date'], $param['end_date']])
  287. ->cursor();
  288. $data = [];
  289. foreach ($rs as $value) {
  290. $addtime_stamp = strtotime($value['addtime']);
  291. if (!isset($data[$addtime_stamp])) {
  292. $data[$addtime_stamp] = [
  293. 'date' => $value['addtime'],//date('Y年m月d日', $addtime_stamp),
  294. 'list' => [],
  295. ];
  296. }
  297. if (!isset($data[$addtime_stamp]['list'][$value['cgder_id']])) {
  298. $data[$addtime_stamp]['list'][$value['cgder_id']] = [
  299. 'name' => $value['cgder'],
  300. 'total_fee' => 0.00,
  301. 'good_num' => 0,
  302. 'wait_total_fee' => 0.00,
  303. 'wait_good_num' => 0,
  304. ];
  305. }
  306. if ($value['status'] == 0) {
  307. $data[$addtime_stamp]['list'][$value['cgder_id']]['wait_total_fee'] += $value['total_fee'];
  308. $data[$addtime_stamp]['list'][$value['cgder_id']]['wait_good_num'] += $value['good_num'];
  309. } else {
  310. $data[$addtime_stamp]['list'][$value['cgder_id']]['total_fee'] += $value['total_fee'];
  311. $data[$addtime_stamp]['list'][$value['cgder_id']]['good_num'] += $value['good_num'];
  312. }
  313. }
  314. //去除下标
  315. foreach ($data as &$v) {
  316. $v['list'] = array_merge($v['list']);
  317. }
  318. return app_show(0, '请求成功', array_merge($data));
  319. }
  320. //【二、咨询单报表】1.已采反报价信息
  321. public function consultInfoBidsSum()
  322. {
  323. $param = $this->request->only([
  324. 'token',
  325. 'zxNo' => [],
  326. 'start_date' => date('Y-m-d H:i:s'),
  327. 'end_date' => date('Y-m-d H:i:s'),
  328. 'page' => 1,
  329. 'size' => 15,
  330. 'is_export' => 0,//是否导出,1导出,0不导出
  331. ], 'post', 'trim');
  332. $val_params = Validate::rule([
  333. 'start_date' => 'date|elt:end_date',
  334. 'end_date' => 'date',
  335. 'is_export' => 'in:0,1',
  336. ]);
  337. if (!$val_params->check($param)) return error_show(1004, $val_params->getError());
  338. $rs = Db::name('consult_bids')
  339. ->alias('cb')
  340. ->where('cb.is_del', 0);
  341. if (!empty($param['start_date']) && !empty($param['end_date'])) $rs->whereBetween('cb.addtime', [$param['start_date'], $param['end_date']]);
  342. if (!empty($param['zxNo'])) $rs->whereIn('cb.zxNo', $param['zxNo']);
  343. if ($param['is_export'] == 1) {
  344. $data = $rs
  345. ->field('ci.addtime as 咨询时间,cb.bidNo as 采购单反馈单号,cb.zxNo as 咨询订单号,cb.addtime as 回复时间,cb.good_name as 产品名称,s.name as 供应商名称,cb.total_fee 成本合计,cb.delivery_day 物流时间,cb.work_day 产品工期,cb.expire_day 信息有效期,cb.creater 采购员,ci.num 需求数量,ci.arrival_time 要求到货日期,co.salesman 业务人员,csi.companyName 客户名称')->leftJoin('consult_info ci', 'ci.zxNo=cb.zxNo AND ci.is_del=0')
  346. ->leftJoin('consult_order co', 'co.zxNo=cb.zxNo AND co.is_del=0')
  347. ->leftJoin('supplier s', 's.code=cb.supplierNo AND s.is_del=0')
  348. ->leftJoin('customer_info csi', 'csi.companyNo=co.khNo AND csi.is_del=0')
  349. ->select()
  350. ->toArray();
  351. if (empty($data)) return error_show(1005, '没有可供导出的数据');
  352. else {
  353. $headerArr = array_keys($data[0]);
  354. excelSave('咨询单报表-已采反报价信息' . date('YmdHis'), $headerArr, $data);
  355. }
  356. } else {
  357. $total = $rs->count('cb.id');
  358. $data = $rs
  359. ->field('cb.id,ci.addtime,cb.bidNo,cb.zxNo,cb.addtime cbaddtime,cb.good_name,s.name supplier,cb.total_fee,cb.delivery_day,cb.work_day,cb.expire_day,cb.creater,ci.num,ci.arrival_time,co.salesman,csi.companyName')
  360. ->leftJoin('consult_info ci', 'ci.zxNo=cb.zxNo AND ci.is_del=0')
  361. ->leftJoin('consult_order co', 'co.zxNo=cb.zxNo AND co.is_del=0')
  362. ->leftJoin('supplier s', 's.code=cb.supplierNo AND s.is_del=0')
  363. ->leftJoin('customer_info csi', 'csi.companyNo=co.khNo AND csi.is_del=0')
  364. ->page($param['page'], $param['size'])
  365. ->select()
  366. ->toArray();
  367. return app_show(0, '请求成功', ['list' => $data, 'total' => $total]);
  368. }
  369. }
  370. }