Five.php 28 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908909910911912913914915916917918919920921922923924925926927928929930
  1. <?php
  2. namespace app\api\controller;
  3. use think\console\command\make\Model;
  4. use think\Controller;
  5. use think\Db;
  6. use think\Request;
  7. use think\Route;
  8. use think\Session;
  9. class Five extends Controller{
  10. //1.成品库存明细(全部)->缓存
  11. public function product_details_redis(){
  12. $redis=redis();
  13. $redis_key = md5('product_details_redis');
  14. $sql = "SELECT hz.分类, hz.订单号, hz.印件名称, hz.承印日期, hz.委印单位, hz.库存数量, hz.库龄, hz.尚需发货数量
  15. FROM (
  16. SELECT
  17. DATE_FORMAT(Dwcrq, '%Y-%m-%d') AS 承印日期,
  18. CCYDH AS 订单号,
  19. CYJMC AS 印件名称,
  20. CYWDWMC AS 委印单位,
  21. DATE_FORMAT(Dwcrq, '%Y-%m-%d') AS 完工日期,
  22. e.iAmount AS 要求印数,
  23. rk.nrksl AS 已入库数量,
  24. ck.CKSL AS 已出库数量,
  25. rk.nrksl - ck.CKSL AS 库存数量,
  26. e.iAmount - ck.CKSL AS 尚需发货数量,
  27. DATEDIFF(DATE(NOW()), DATE_FORMAT(Dwcrq, '%Y-%m-%d')) AS 库龄,
  28. CASE
  29. WHEN DATEDIFF(DATE(NOW()), DATE_FORMAT(Dwcrq, '%Y-%m-%d')) >= 91 THEN '3个月以上'
  30. ELSE '3个月以内'
  31. END AS 分类
  32. FROM MCYD cyd
  33. LEFT JOIN qlOrderProduct e ON e.cCode = cyd.CCYDH
  34. LEFT JOIN (
  35. SELECT
  36. cCode,
  37. SUM(iOutAmount) AS CKSL
  38. FROM (
  39. SELECT
  40. d.scSaleOrderCode AS cCode,
  41. b.cName,
  42. b.iOutAmount,
  43. DATE_FORMAT(a.dSendDate, '%Y-%m-%d') AS ckrq
  44. FROM fnOut a
  45. INNER JOIN fnOutDetail b ON a.ID = b.id_fnOut
  46. INNER JOIN fnOutPlanDetail d ON b.ID_OutPlanDetail = d.id
  47. WHERE a.iStatus > 20
  48. ) ckmx
  49. GROUP BY cCode
  50. ) ck ON cyd.CCYDH = ck.cCode
  51. LEFT JOIN (
  52. SELECT
  53. rk.Code_ProductOrder Code_ProductOrder,
  54. SUM(rk.iAmount_In) AS nrksl
  55. FROM (SELECT DISTINCT
  56. b.iAmount_In,
  57. b.cCode as Code_ProductOrder,
  58. a.ID,
  59. a.ID AS ID_Request,
  60. b.ID_Mcyd,
  61. a.cCode,
  62. a.cName,
  63. a.iTag_Group,
  64. a.cUnit,
  65. 1 AS iVers,
  66. a.cSize,
  67. 1 AS iState,
  68. CASE
  69. a.iType
  70. WHEN 8 THEN
  71. 5 ELSE 0
  72. END AS iType,
  73. '' AS cType_P,
  74. '' AS cType_P1,
  75. '' AS cRemark,
  76. '' AS cAlias,
  77. 1 AS iSign_Used,
  78. 0 AS ID_Origin,
  79. CAST( a.bNumRange AS SIGNED ) AS iNumRange,
  80. CASE
  81. WHEN b.iCount_NumRange > 1 THEN
  82. 1 ELSE 0
  83. END AS iMNumRange,
  84. b.iCount_NumRange,
  85. a.iNodePage,
  86. a.iNodePart,
  87. 0 AS iSample,
  88. 0 AS ID_Comp,
  89. 1 AS iSign_State,
  90. 0 AS nWeight,
  91. 0 AS iSign_FSC,
  92. 0 AS ID_FSCRemark,
  93. 1 AS iState_Request,
  94. '' AS cGrade,
  95. c.cdw AS cPackUnit,
  96. COALESCE ( c.iAmount, 0 ) AS iAmount_Box,
  97. d.CCYDH,
  98. d.CYWYXM,
  99. 0 AS iOutCheck,
  100. '' AS cGrade_OutCheck,
  101. 0 AS iInCheck,
  102. '' AS cGrade_InCheck
  103. FROM
  104. qlAProduct AS a
  105. INNER JOIN qlOrderProduct AS b ON b.ID_qlAProduct = a.ID
  106. LEFT JOIN SCydbzyq AS c ON c.ID_qlOrderProduct = b.ID
  107. AND c.ixh = 1
  108. INNER JOIN MCYD AS d ON d.ICYDID = b.ID_Mcyd
  109. WHERE
  110. d.ICYDSTATE <> - 1) rk
  111. GROUP BY Code_ProductOrder
  112. ) rk ON cyd.ccydh = rk.Code_ProductOrder
  113. WHERE 1 = 1
  114. AND DATE_FORMAT(cyd.Dwcrq, '%Y-%m-%d') BETWEEN '2021-01-01' AND DATE(CONVERT(NOW(), CHAR(10)))
  115. AND cyd.LWCBS = '1'
  116. AND ck.CKSL < e.iAmount
  117. ) hz
  118. WHERE hz.库存数量 > 0
  119. ORDER BY hz.库龄 DESC;";
  120. $res = Db::query($sql);
  121. if($res){
  122. $redis->set($redis_key, json_encode($res));
  123. echo date("Y-m-d H:i:s").'存进去了';
  124. return $res;
  125. }
  126. }
  127. //1.已完工三个月以内库存明细->接口
  128. public function product_details_within(){
  129. $redis = redis();
  130. $list = json_decode($redis->get(md5('product_details_redis')), true);
  131. // echo "<pre>";print_r($list);echo "<pre>";
  132. $result['columns']=[
  133. ['name'=>'分类','id'=>'fl','width'=>'11','autoWrap'=>"true",'textAlign'=>'left'],
  134. ['name'=>'订单号','id'=>'ddh','width'=>'12','autoWrap'=>"true",'textAlign'=>'left'],
  135. ['name'=>'印件名称','id'=>'yjmc','width'=>'26','autoWrap'=>"true",'textAlign'=>'left'],
  136. ['name'=>'承印日期','id'=>'cyrq','width'=>'14','autoWrap'=>"true",'textAlign'=>'left'],
  137. ['name'=>'委印单位','id'=>'wydw','width'=>'24','autoWrap'=>"true",'textAlign'=>'left'],
  138. ['name'=>'库存数量','id'=>'kcsl','width'=>'8','autoWrap'=>"true",'textAlign'=>'left'],
  139. ['name'=>'库龄','id'=>'kl','width'=>'8','autoWrap'=>"true",'textAlign'=>'left'],
  140. ['name'=>'尚需发货数量','id'=>'sxfhsl','width'=>'10','autoWrap'=>"true",'textAlign'=>'left']
  141. ];
  142. // 过滤分类为“3个月以内”的记录
  143. $filtered_list = array_filter($list, function($v) {
  144. return $v['分类'] === '3个月以内';
  145. });
  146. // 截取前20条数据
  147. $filtered_list = array_slice($filtered_list, 0, 20);
  148. foreach($filtered_list as $k=>$v){
  149. $result['rows'][$k]['fl']=$v['分类'];
  150. $result['rows'][$k]['ddh']=$v['订单号'];
  151. $result['rows'][$k]['yjmc']=$v['印件名称'];
  152. $result['rows'][$k]['cyrq']=$v['承印日期'];
  153. $result['rows'][$k]['wydw']=$v['委印单位'];
  154. $result['rows'][$k]['kcsl']=$v['库存数量'];
  155. $result['rows'][$k]['kl']=$v['库龄']; // 修正此处
  156. $result['rows'][$k]['sxfhsl']=$v['尚需发货数量'];
  157. }
  158. // 如果过滤后的列表为空,则添加空数据行
  159. if(empty($filtered_list)){
  160. $result['rows'][] = ['fl'=>'', 'ddh'=>'', 'yjmc'=>'', 'cyrq'=>'', 'wydw'=>'', 'kcsl'=>'', 'kl'=>'', 'sxfhsl'=>''];
  161. }
  162. $res['status']=0;
  163. $res['msg']='';
  164. $res['data']=$result;
  165. return json($res);
  166. }
  167. //1.已完工三个月以上库存明细->接口
  168. public function product_details_more(){
  169. $redis = redis();
  170. $list = json_decode($redis->get(md5('product_details_redis')), true);
  171. // echo "<pre>";print_r($list);echo "<pre>";
  172. $result['columns']=[
  173. ['name'=>'分类','id'=>'fl','width'=>'11','autoWrap'=>"true",'textAlign'=>'left'],
  174. ['name'=>'订单号','id'=>'ddh','width'=>'12','autoWrap'=>"true",'textAlign'=>'left'],
  175. ['name'=>'印件名称','id'=>'yjmc','width'=>'26','autoWrap'=>"true",'textAlign'=>'left'],
  176. ['name'=>'承印日期','id'=>'cyrq','width'=>'14','autoWrap'=>"true",'textAlign'=>'left'],
  177. ['name'=>'委印单位','id'=>'wydw','width'=>'24','autoWrap'=>"true",'textAlign'=>'left'],
  178. ['name'=>'库存数量','id'=>'kcsl','width'=>'8','autoWrap'=>"true",'textAlign'=>'left'],
  179. ['name'=>'库龄','id'=>'kl','width'=>'8','autoWrap'=>"true",'textAlign'=>'left'],
  180. ['name'=>'尚需发货数量','id'=>'sxfhsl','width'=>'10','autoWrap'=>"true",'textAlign'=>'left']
  181. ];
  182. // 过滤分类为“3个月以上”的记录
  183. $filtered_list = array_filter($list, function($v) {
  184. return $v['分类'] === '3个月以上';
  185. });
  186. // 截取前20条数据
  187. $filtered_list = array_slice($filtered_list, 0, 20);
  188. foreach($filtered_list as $k=>$v){
  189. $result['rows'][$k]['fl']=$v['分类'];
  190. $result['rows'][$k]['ddh']=$v['订单号'];
  191. $result['rows'][$k]['yjmc']=$v['印件名称'];
  192. $result['rows'][$k]['cyrq']=$v['承印日期'];
  193. $result['rows'][$k]['wydw']=$v['委印单位'];
  194. $result['rows'][$k]['kcsl']=$v['库存数量'];
  195. $result['rows'][$k]['kl']=$v['库龄']; // 修正此处
  196. $result['rows'][$k]['sxfhsl']=$v['尚需发货数量'];
  197. }
  198. // 如果过滤后的列表为空,则添加空数据行
  199. if(empty($filtered_list)){
  200. $result['rows'][] = ['fl'=>'', 'ddh'=>'', 'yjmc'=>'', 'cyrq'=>'', 'wydw'=>'', 'kcsl'=>'', 'kl'=>'', 'sxfhsl'=>''];
  201. }
  202. $res['status']=0;
  203. $res['msg']='';
  204. $res['data']=$result;
  205. return json($res);
  206. }
  207. //2.当日送货完成情况->缓存
  208. public function Delivery_day_redis(){
  209. $redis=redis();
  210. $redis_key = md5('Delivery_day_redis');
  211. $sql = "SELECT A.CCYDH AS 订单号,
  212. A.CYJMC AS 印件名称,
  213. A.CYWDWMC AS 客户名称,
  214. A.NCS AS 印数,
  215. jhs.iAmount AS 要求印数,
  216. dr.当日出库,
  217. dr.累计出库,
  218. dr.未出库
  219. FROM mcyd A
  220. LEFT JOIN (
  221. SELECT hb.订单号,
  222. hb.客户名称,
  223. hb.印件名称,
  224. SUM(hb.当日出库) AS 当日出库,
  225. COALESCE(hj.ljcksl, 0) + COALESCE(xlj.ck, 0) AS 累计出库,
  226. CASE
  227. WHEN hb.册数 - (COALESCE(hj.ljcksl, 0) + COALESCE(xlj.ck, 0)) < 0 THEN 0
  228. ELSE hb.册数 - (COALESCE(hj.ljcksl, 0) + COALESCE(xlj.ck, 0))
  229. END AS 未出库
  230. FROM (
  231. SELECT DATE_FORMAT(NOW(), '%Y-%m-%d') AS 送货日期,
  232. q.客户名称,
  233. q.订单号,
  234. q.单位,
  235. q.印件名称,
  236. q.册数,
  237. SUM(q.出库数量) AS 当日出库
  238. FROM (
  239. SELECT DISTINCT a.cBillCode,
  240. a.cClientName AS 客户名称,
  241. d.scSaleOrderCode AS 订单号,
  242. b.cName AS 印件名称,
  243. b.cUnit AS 单位,
  244. md.ncs AS 册数,
  245. b.iOutAmount AS 出库数量
  246. FROM fnOut a
  247. INNER JOIN fnOutDetail b ON a.ID = b.id_fnOut
  248. INNER JOIN fnOutPlan c ON a.ID_OutPlan = c.id
  249. INNER JOIN fnOutPlanDetail d ON b.ID_OutPlanDetail = d.id
  250. INNER JOIN (SELECT DISTINCT
  251. b.iAmount_In,
  252. b.cCode as Code_ProductOrder,
  253. b.iAmount,
  254. a.ID,
  255. a.ID AS ID_Request,
  256. b.ID_Mcyd,
  257. a.cCode,
  258. a.cName,
  259. a.iTag_Group,
  260. a.cUnit,
  261. 1 AS iVers,
  262. a.cSize,
  263. 1 AS iState,
  264. CASE
  265. a.iType
  266. WHEN 8 THEN
  267. 5 ELSE 0
  268. END AS iType,
  269. '' AS cType_P,
  270. '' AS cType_P1,
  271. '' AS cRemark,
  272. '' AS cAlias,
  273. 1 AS iSign_Used,
  274. 0 AS ID_Origin,
  275. CAST( a.bNumRange AS SIGNED ) AS iNumRange,
  276. CASE
  277. WHEN b.iCount_NumRange > 1 THEN
  278. 1 ELSE 0
  279. END AS iMNumRange,
  280. b.iCount_NumRange,
  281. a.iNodePage,
  282. a.iNodePart,
  283. 0 AS iSample,
  284. 0 AS ID_Comp,
  285. 1 AS iSign_State,
  286. 0 AS nWeight,
  287. 0 AS iSign_FSC,
  288. 0 AS ID_FSCRemark,
  289. 1 AS iState_Request,
  290. '' AS cGrade,
  291. c.cdw AS cPackUnit,
  292. COALESCE ( c.iAmount, 0 ) AS iAmount_Box,
  293. d.CCYDH,
  294. d.CYWYXM,
  295. 0 AS iOutCheck,
  296. '' AS cGrade_OutCheck,
  297. 0 AS iInCheck,
  298. '' AS cGrade_InCheck
  299. FROM
  300. qlAProduct AS a
  301. INNER JOIN qlOrderProduct AS b ON b.ID_qlAProduct = a.ID
  302. LEFT JOIN SCydbzyq AS c ON c.ID_qlOrderProduct = b.ID
  303. AND c.ixh = 1
  304. INNER JOIN MCYD AS d ON d.ICYDID = b.ID_Mcyd
  305. WHERE
  306. d.ICYDSTATE <> - 1) f ON b.cFnCode = f.cCode
  307. LEFT JOIN mcyd md ON d.scSaleOrderCode = md.CCYDH
  308. WHERE a.iStatus > 20
  309. ) q
  310. GROUP BY q.客户名称, q.订单号, q.单位, q.册数, q.印件名称
  311. ) hb
  312. LEFT JOIN (
  313. SELECT lj.ccydh,
  314. lj.cywdwmc,
  315. lj.ccpmc,
  316. SUM(lj.ncksl) AS ljcksl
  317. FROM (
  318. SELECT a.cywdwmc,
  319. a.ccydh,
  320. a.ccpmc,
  321. a.ncksl
  322. FROM sexpstore a,
  323. dzprod b
  324. WHERE a.ccpbh = b.ccpbh
  325. AND a.ibilltype = 0
  326. AND a.dckrq >= @dDate_Star
  327. AND a.dckrq <= @dDate_End
  328. AND a.btempstore = 0
  329. ) lj
  330. GROUP BY lj.ccydh, lj.cywdwmc, lj.ccpmc
  331. ) hj ON hj.ccydh = hb.订单号
  332. LEFT JOIN (
  333. SELECT f.ccydh,
  334. SUM(r.iOutAmount) AS ck
  335. FROM fnOutDetail r
  336. LEFT JOIN fnOut a ON a.ID = r.id_fnOut
  337. LEFT JOIN mcyd f ON f.icydid = r.id_scSaleOrder
  338. WHERE a.iStatus > 20
  339. GROUP BY f.ccydh
  340. ) xlj ON xlj.CCYDH = hb.订单号
  341. GROUP BY hb.客户名称,
  342. hb.订单号,
  343. hb.印件名称,
  344. hb.单位,
  345. hb.册数,
  346. hb.送货日期,
  347. hj.ljcksl,
  348. xlj.ck
  349. ) dr ON A.CCYDH = dr.订单号
  350. LEFT JOIN (SELECT DISTINCT
  351. b.iAmount_In,
  352. b.cCode as Code_ProductOrder,
  353. b.iAmount,
  354. a.ID,
  355. a.ID AS ID_Request,
  356. b.ID_Mcyd,
  357. a.cCode,
  358. a.cName,
  359. a.iTag_Group,
  360. a.cUnit,
  361. 1 AS iVers,
  362. a.cSize,
  363. 1 AS iState,
  364. CASE
  365. a.iType
  366. WHEN 8 THEN
  367. 5 ELSE 0
  368. END AS iType,
  369. '' AS cType_P,
  370. '' AS cType_P1,
  371. '' AS cRemark,
  372. '' AS cAlias,
  373. 1 AS iSign_Used,
  374. 0 AS ID_Origin,
  375. CAST( a.bNumRange AS SIGNED ) AS iNumRange,
  376. CASE
  377. WHEN b.iCount_NumRange > 1 THEN
  378. 1 ELSE 0
  379. END AS iMNumRange,
  380. b.iCount_NumRange,
  381. a.iNodePage,
  382. a.iNodePart,
  383. 0 AS iSample,
  384. 0 AS ID_Comp,
  385. 1 AS iSign_State,
  386. 0 AS nWeight,
  387. 0 AS iSign_FSC,
  388. 0 AS ID_FSCRemark,
  389. 1 AS iState_Request,
  390. '' AS cGrade,
  391. c.cdw AS cPackUnit,
  392. COALESCE ( c.iAmount, 0 ) AS iAmount_Box,
  393. d.CCYDH,
  394. d.CYWYXM,
  395. 0 AS iOutCheck,
  396. '' AS cGrade_OutCheck,
  397. 0 AS iInCheck,
  398. '' AS cGrade_InCheck
  399. FROM
  400. qlAProduct AS a
  401. INNER JOIN qlOrderProduct AS b ON b.ID_qlAProduct = a.ID
  402. LEFT JOIN SCydbzyq AS c ON c.ID_qlOrderProduct = b.ID
  403. AND c.ixh = 1
  404. INNER JOIN MCYD AS d ON d.ICYDID = b.ID_Mcyd
  405. WHERE
  406. d.ICYDSTATE <> - 1) jhs ON A.CCYDH = jhs.Code_ProductOrder
  407. WHERE A.DJFRQ >= DATE_FORMAT(NOW(), '%Y-%m-%d 00:00:00')
  408. AND A.DJFRQ <= DATE_FORMAT(NOW(), '%Y-%m-%d 23:59:59')
  409. AND A.iCydState <> -1
  410. ORDER BY dr.客户名称, dr.印件名称;";
  411. $res = Db::query($sql);
  412. if($res){
  413. $redis->set($redis_key, json_encode($res));
  414. echo date("Y-m-d H:i:s").'存进去了';
  415. return $res;
  416. }
  417. }
  418. //2.当日送货完成情况->接口
  419. public function Delivery_day(){
  420. $redis = redis();
  421. $list = json_decode($redis->get(md5('Delivery_day_redis')), true);
  422. $result['columns']=[
  423. ['name'=>'订单号','id'=>'ddh','width'=>'14','autoWrap'=>"true",'textAlign'=>'left'],
  424. ['name'=>'印件名称','id'=>'yjmc','width'=>'18','autoWrap'=>"true",'textAlign'=>'left'],
  425. ['name'=>'客户名称','id'=>'khmc','width'=>'18','autoWrap'=>"true",'textAlign'=>'left'],
  426. ['name'=>'印数','id'=>'ys','width'=>'11','autoWrap'=>"true",'textAlign'=>'left'],
  427. ['name'=>'要求印数','id'=>'yqys','width'=>'13','autoWrap'=>"true",'textAlign'=>'left'],
  428. ['name'=>'当日出库','id'=>'drck','width'=>'12','autoWrap'=>"true",'textAlign'=>'left'],
  429. ['name'=>'累计出库','id'=>'ljck','width'=>'12','autoWrap'=>"true",'textAlign'=>'left'],
  430. ['name'=>'未出库','id'=>'wck','width'=>'12','autoWrap'=>"true",'textAlign'=>'left']
  431. ];
  432. foreach($list as $k=>$v){
  433. $result['rows'][$k]['ddh'] = $v['订单号'];
  434. $result['rows'][$k]['yjmc'] = $v['印件名称'];
  435. $result['rows'][$k]['khmc'] = $v['客户名称'];
  436. $result['rows'][$k]['ys'] = $v['印数'];
  437. $result['rows'][$k]['yqys'] = $v['要求印数'];
  438. $result['rows'][$k]['drck'] = isset($v['当日出库']) ? $v['当日出库'] : '';
  439. $result['rows'][$k]['ljck'] = isset($v['累计出库']) ? $v['累计出库'] : '';
  440. $result['rows'][$k]['wck'] = isset($v['未出库']) ? $v['未出库'] : '';
  441. }
  442. // 如果过滤后的列表为空,则添加空数据行
  443. // 注意:这里似乎有一个未定义的变量$filtered_list,你可能需要确保它在使用前已被正确定义和过滤
  444. if(empty($filtered_list)){
  445. $result['rows'][] = ['ddh'=>'', 'yjmc'=>'', 'khmc'=>'','ys'=>'', 'yqys'=>'', 'drck'=>'', 'ljck'=>'', 'wck'=>''];
  446. }
  447. $res['status'] = 0;
  448. $res['msg'] = '';
  449. $res['data'] = $result;
  450. return json($res);
  451. }
  452. //三个月以上 //三个月以内 ->缓存
  453. public function sys_redis(){
  454. $redis=redis();
  455. $redis_key = md5('sys_redis');
  456. $sql = "SELECT hz.分类, SUM(hz.库存数量) AS 库存数量, SUM(hz.尚需发货数量) AS 尚需发货数量
  457. FROM (
  458. SELECT
  459. DATE(Dwcrq) AS 完工日期,
  460. CCYDH AS 订单号,
  461. CYJMC AS 印件名称,
  462. CYWDWMC AS 委印单位,
  463. e.iAmount AS 要求印数,
  464. rk.nrksl AS 已入库数量,
  465. ck.CKSL AS 已出库数量,
  466. rk.nrksl - ck.CKSL AS 库存数量,
  467. e.iAmount - ck.CKSL AS 尚需发货数量,
  468. DATEDIFF(CURDATE(), DATE(Dwcrq)) AS 库存周期,
  469. CASE
  470. WHEN DATEDIFF(CURDATE(), DATE(Dwcrq)) >= 91 THEN '3个月以上'
  471. ELSE '3个月以内'
  472. END AS 分类
  473. FROM MCYD cyd
  474. LEFT JOIN qlOrderProduct e ON e.cCode = cyd.CCYDH
  475. LEFT JOIN (
  476. SELECT
  477. MAX(ckmx.ckrq) AS zwckrq,
  478. cCode,
  479. SUM(iOutAmount) AS CKSL
  480. FROM (
  481. SELECT
  482. d.scSaleOrderCode AS cCode,
  483. b.cName,
  484. b.iOutAmount,
  485. DATE(a.dSendDate) AS ckrq
  486. FROM fnOut a
  487. INNER JOIN fnOutDetail b ON a.ID = b.id_fnOut
  488. INNER JOIN fnOutPlanDetail d ON b.ID_OutPlanDetail = d.id
  489. WHERE a.iStatus > 20
  490. ) ckmx
  491. GROUP BY cCode
  492. ) ck ON cyd.CCYDH = ck.cCode
  493. LEFT JOIN (
  494. SELECT
  495. rk.Code_ProductOrder AS Code_ProductOrder,
  496. SUM(iAmount_In) AS nrksl
  497. FROM (SELECT DISTINCT
  498. b.iAmount_In,
  499. b.cCode as Code_ProductOrder,
  500. b.iAmount,
  501. a.ID,
  502. a.ID AS ID_Request,
  503. b.ID_Mcyd,
  504. a.cCode,
  505. a.cName,
  506. a.iTag_Group,
  507. a.cUnit,
  508. 1 AS iVers,
  509. a.cSize,
  510. 1 AS iState,
  511. CASE
  512. a.iType
  513. WHEN 8 THEN
  514. 5 ELSE 0
  515. END AS iType,
  516. '' AS cType_P,
  517. '' AS cType_P1,
  518. '' AS cRemark,
  519. '' AS cAlias,
  520. 1 AS iSign_Used,
  521. 0 AS ID_Origin,
  522. CAST( a.bNumRange AS SIGNED ) AS iNumRange,
  523. CASE
  524. WHEN b.iCount_NumRange > 1 THEN
  525. 1 ELSE 0
  526. END AS iMNumRange,
  527. b.iCount_NumRange,
  528. a.iNodePage,
  529. a.iNodePart,
  530. 0 AS iSample,
  531. 0 AS ID_Comp,
  532. 1 AS iSign_State,
  533. 0 AS nWeight,
  534. 0 AS iSign_FSC,
  535. 0 AS ID_FSCRemark,
  536. 1 AS iState_Request,
  537. '' AS cGrade,
  538. c.cdw AS cPackUnit,
  539. COALESCE ( c.iAmount, 0 ) AS iAmount_Box,
  540. d.CCYDH,
  541. d.CYWYXM,
  542. 0 AS iOutCheck,
  543. '' AS cGrade_OutCheck,
  544. 0 AS iInCheck,
  545. '' AS cGrade_InCheck
  546. FROM
  547. qlAProduct AS a
  548. INNER JOIN qlOrderProduct AS b ON b.ID_qlAProduct = a.ID
  549. LEFT JOIN SCydbzyq AS c ON c.ID_qlOrderProduct = b.ID
  550. AND c.ixh = 1
  551. INNER JOIN MCYD AS d ON d.ICYDID = b.ID_Mcyd
  552. WHERE
  553. d.ICYDSTATE <> - 1) rk
  554. GROUP BY rk.Code_ProductOrder
  555. ) rk ON cyd.ccydh = rk.Code_ProductOrder
  556. WHERE
  557. DATE(Dwcrq) BETWEEN '2021-01-01' AND CURDATE()
  558. AND cyd.LWCBS = '1'
  559. AND ck.CKSL < e.iAmount
  560. ) hz
  561. GROUP BY hz.分类;";
  562. $res = Db::query($sql);
  563. if($res){
  564. $redis->set($redis_key, json_encode($res));
  565. echo date("Y-m-d H:i:s").'存进去了';
  566. return $res;
  567. }
  568. }
  569. //三个月以上\三个月以内 柱状->接口
  570. public function sys() {
  571. $redis = redis();
  572. $list = json_decode($redis->get(md5('sys_redis')), true);
  573. // 分类数组,对应每个分类的名称
  574. $categories = [];
  575. // 库存数量数组,对应每个分类的库存数量
  576. $inventoryData = [];
  577. // 遍历查询结果,将每个分类的名称和对应的库存数量添加到数组中
  578. foreach ($list as $item) {
  579. $categories[] = ' '; // 添加分类名称到数组
  580. $inventoryData[] = $item['库存数量']; // 添加库存数量到数组
  581. }
  582. // 构建最终的数据结构
  583. $result = [
  584. 'status' => 0, // 状态码,0代表成功
  585. 'msg' => '', // 消息内容,这里为空字符串
  586. 'data' => [
  587. 'categories' => $categories, // 分类名称数组
  588. 'series' => [
  589. [
  590. 'name' => '库存数量', // 系列名称
  591. 'data' => $inventoryData // 库存数量数据
  592. ]
  593. ]
  594. ]
  595. ];
  596. // 将结果转换为JSON格式并返回
  597. return json_encode($result);
  598. }
  599. //库存趋势图(两年对比)->缓存
  600. public function kcqst_redis(){
  601. $redis=redis();
  602. $redis_key = md5('kcqst_redis');
  603. $sql = "WITH RECURSIVE LastDayOfMonth AS (
  604. SELECT LAST_DAY( CURDATE()) AS LastDay
  605. UNION ALL
  606. SELECT LAST_DAY(LastDay - INTERVAL 1 MONTH) AS LastDay
  607. FROM LastDayOfMonth
  608. WHERE LastDay > DATE_SUB( CURDATE(), INTERVAL 3 YEAR)
  609. )
  610. SELECT
  611. LastDayOfMonth.LastDay AS 日期,
  612. IFNULL(SUM(CASE
  613. WHEN AA.完工日期 <= LastDayOfMonth.LastDay THEN AA.库存数量
  614. ELSE 0
  615. END), 0) AS 库存总量,
  616. IFNULL(SUM(CASE
  617. WHEN AA.完工日期 <= LastDayOfMonth.LastDay THEN AA.尚需发货数量
  618. ELSE 0
  619. END), 0) AS 尚需发货数量
  620. FROM LastDayOfMonth
  621. LEFT JOIN (
  622. SELECT
  623. DATE(Dwcrq) AS 完工日期,
  624. CCYDH AS 订单号,
  625. CYJMC AS 印件名称,
  626. CYWDWMC AS 委印单位,
  627. e.iAmount AS 要求印数,
  628. rk.nrksl AS 已入库数量,
  629. ck.CKSL AS 已出库数量,
  630. rk.nrksl - ck.CKSL AS 库存数量,
  631. e.iAmount - ck.CKSL AS 尚需发货数量,
  632. DATEDIFF(CURDATE(), DATE(Dwcrq)) AS 库存周期
  633. FROM MCYD cyd
  634. LEFT JOIN qlOrderProduct e ON e.cCode = cyd.CCYDH
  635. LEFT JOIN (
  636. SELECT
  637. MAX(ckmx.ckrq) AS zwckrq,
  638. cCode,
  639. SUM(iOutAmount) AS CKSL
  640. FROM (
  641. SELECT
  642. d.scSaleOrderCode AS cCode,
  643. b.cName,
  644. b.iOutAmount,
  645. DATE(a.dSendDate) AS ckrq
  646. FROM fnOut a
  647. INNER JOIN fnOutDetail b ON a.ID = b.id_fnOut
  648. INNER JOIN fnOutPlanDetail d ON b.ID_OutPlanDetail = d.id
  649. WHERE a.iStatus > 20
  650. ) ckmx
  651. GROUP BY cCode
  652. ) ck ON cyd.CCYDH = ck.cCode
  653. LEFT JOIN (
  654. SELECT
  655. rk.Code_ProductOrder AS Code_ProductOrder,
  656. SUM(iAmount_In) AS nrksl
  657. FROM (SELECT DISTINCT
  658. b.iAmount_In,
  659. b.cCode as Code_ProductOrder,
  660. b.iAmount,
  661. a.ID,
  662. a.ID AS ID_Request,
  663. b.ID_Mcyd,
  664. a.cCode,
  665. a.cName,
  666. a.iTag_Group,
  667. a.cUnit,
  668. 1 AS iVers,
  669. a.cSize,
  670. 1 AS iState,
  671. CASE
  672. a.iType
  673. WHEN 8 THEN
  674. 5 ELSE 0
  675. END AS iType,
  676. '' AS cType_P,
  677. '' AS cType_P1,
  678. '' AS cRemark,
  679. '' AS cAlias,
  680. 1 AS iSign_Used,
  681. 0 AS ID_Origin,
  682. CAST( a.bNumRange AS SIGNED ) AS iNumRange,
  683. CASE
  684. WHEN b.iCount_NumRange > 1 THEN
  685. 1 ELSE 0
  686. END AS iMNumRange,
  687. b.iCount_NumRange,
  688. a.iNodePage,
  689. a.iNodePart,
  690. 0 AS iSample,
  691. 0 AS ID_Comp,
  692. 1 AS iSign_State,
  693. 0 AS nWeight,
  694. 0 AS iSign_FSC,
  695. 0 AS ID_FSCRemark,
  696. 1 AS iState_Request,
  697. '' AS cGrade,
  698. c.cdw AS cPackUnit,
  699. COALESCE ( c.iAmount, 0 ) AS iAmount_Box,
  700. d.CCYDH,
  701. d.CYWYXM,
  702. 0 AS iOutCheck,
  703. '' AS cGrade_OutCheck,
  704. 0 AS iInCheck,
  705. '' AS cGrade_InCheck
  706. FROM
  707. qlAProduct AS a
  708. INNER JOIN qlOrderProduct AS b ON b.ID_qlAProduct = a.ID
  709. LEFT JOIN SCydbzyq AS c ON c.ID_qlOrderProduct = b.ID
  710. AND c.ixh = 1
  711. INNER JOIN MCYD AS d ON d.ICYDID = b.ID_Mcyd
  712. WHERE
  713. d.ICYDSTATE <> - 1) rk
  714. GROUP BY rk.Code_ProductOrder
  715. ) rk ON cyd.ccydh = rk.Code_ProductOrder
  716. WHERE
  717. DATE(Dwcrq) BETWEEN '2022-01-01' AND CURDATE()
  718. AND cyd.LWCBS = '1'
  719. AND ck.CKSL < e.iAmount
  720. ) AA ON LastDayOfMonth.LastDay >= DATE(AA.完工日期)
  721. GROUP BY LastDayOfMonth.LastDay
  722. ORDER BY LastDayOfMonth.LastDay;";
  723. $res = Db::query($sql);
  724. if($res){
  725. $redis->set($redis_key, json_encode($res));
  726. echo date("Y-m-d H:i:s").'存进去了';
  727. return $res;
  728. }
  729. }
  730. //库存趋势图(两年对比)->接口
  731. public function kcqst(){
  732. $redis = redis();
  733. $result = json_decode($redis->get(md5('kcqst_redis')), true);
  734. // echo "<pre>";print_r($result);echo "<pre>";
  735. // 初始化数据
  736. $list['categories'] = ['01', '02', '03', '04', '05', '06', '07', '08', '09', '10', '11', '12'];
  737. $currentYear = date("Y"); // 当前年份
  738. $currentMonth = date("m"); // 当前月份
  739. $previousYear = (int)$currentYear - 1; // 前一年
  740. // 为前一年和当前年份创建数据数组,初始值为0
  741. $list['series'][0]['name'] = $previousYear . '年';
  742. $list['series'][0]['data'] = array_fill(0, 12, 0); // 前一年的数据数组
  743. $list['series'][1]['name'] = $currentYear . '年';
  744. $list['series'][1]['data'] = array_fill(0, $currentMonth, 0); // 当前年份的数据数组
  745. // 遍历查询结果
  746. foreach ($result as $v) {
  747. // 获取年份和月份
  748. $year = substr($v['日期'], 0, 4);
  749. $month = substr($v['日期'], 5, 2);
  750. // 如果是前一年的数据
  751. if ($year == $previousYear) {
  752. $list['series'][0]['data'][(int)$month - 1] = $v['库存总量'];
  753. }
  754. // 如果是当前年份的数据
  755. if ($year == $currentYear) {
  756. $list['series'][1]['data'][(int)$month - 1] = $v['库存总量'];
  757. }
  758. }
  759. // 设置响应数据
  760. $res['status'] = 0;
  761. $res['msg'] = '';
  762. $res['data'] = $list;
  763. return json_encode($res);
  764. }
  765. // 总库存->缓存
  766. public function numcont_redis(){
  767. $redis=redis();
  768. $redis_key = md5('numcont_redis');
  769. $sql = "SELECT
  770. YEAR(CURDATE()) AS 年份,
  771. IFNULL(SUM(CASE
  772. WHEN YEAR(AA.完工日期) = YEAR(CURDATE()) THEN AA.库存数量
  773. ELSE 0
  774. END), 0) AS 库存总量,
  775. IFNULL(SUM(CASE
  776. WHEN YEAR(AA.完工日期) = YEAR(CURDATE()) THEN AA.尚需发货数量
  777. ELSE 0
  778. END), 0) AS 尚需发货数量
  779. FROM (
  780. SELECT
  781. DATE(Dwcrq) AS 完工日期,
  782. CCYDH AS 订单号,
  783. CYJMC AS 印件名称,
  784. CYWDWMC AS 委印单位,
  785. e.iAmount AS 要求印数,
  786. rk.nrksl AS 已入库数量,
  787. ck.CKSL AS 已出库数量,
  788. rk.nrksl - ck.CKSL AS 库存数量,
  789. e.iAmount - ck.CKSL AS 尚需发货数量
  790. FROM MCYD cyd
  791. LEFT JOIN qlOrderProduct e ON e.cCode = cyd.CCYDH
  792. LEFT JOIN (
  793. SELECT
  794. cCode,
  795. SUM(iOutAmount) AS CKSL
  796. FROM (
  797. SELECT
  798. d.scSaleOrderCode AS cCode,
  799. b.iOutAmount,
  800. DATE(a.dSendDate) AS ckrq
  801. FROM fnOut a
  802. INNER JOIN fnOutDetail b ON a.ID = b.id_fnOut
  803. INNER JOIN fnOutPlanDetail d ON b.ID_OutPlanDetail = d.id
  804. WHERE a.iStatus > 20
  805. GROUP BY d.scSaleOrderCode, DATE(a.dSendDate)
  806. ) ckmx
  807. GROUP BY cCode
  808. ) ck ON cyd.CCYDH = ck.cCode
  809. LEFT JOIN (
  810. SELECT
  811. Code_ProductOrder,
  812. SUM(iAmount_In) AS nrksl
  813. FROM (
  814. SELECT DISTINCT
  815. b.iAmount_In,
  816. b.cCode as Code_ProductOrder,
  817. b.iAmount,
  818. a.ID,
  819. a.ID AS ID_Request,
  820. b.ID_Mcyd,
  821. a.cCode,
  822. a.cName,
  823. a.iTag_Group,
  824. a.cUnit,
  825. 1 AS iVers,
  826. a.cSize,
  827. 1 AS iState,
  828. CASE
  829. a.iType
  830. WHEN 8 THEN
  831. 5 ELSE 0
  832. END AS iType,
  833. '' AS cType_P,
  834. '' AS cType_P1,
  835. '' AS cRemark,
  836. '' AS cAlias,
  837. 1 AS iSign_Used,
  838. 0 AS ID_Origin,
  839. CAST( a.bNumRange AS SIGNED ) AS iNumRange,
  840. CASE
  841. WHEN b.iCount_NumRange > 1 THEN
  842. 1 ELSE 0
  843. END AS iMNumRange,
  844. b.iCount_NumRange,
  845. a.iNodePage,
  846. a.iNodePart,
  847. 0 AS iSample,
  848. 0 AS ID_Comp,
  849. 1 AS iSign_State,
  850. 0 AS nWeight,
  851. 0 AS iSign_FSC,
  852. 0 AS ID_FSCRemark,
  853. 1 AS iState_Request,
  854. '' AS cGrade,
  855. c.cdw AS cPackUnit,
  856. COALESCE ( c.iAmount, 0 ) AS iAmount_Box,
  857. d.CCYDH,
  858. d.CYWYXM,
  859. 0 AS iOutCheck,
  860. '' AS cGrade_OutCheck,
  861. 0 AS iInCheck,
  862. '' AS cGrade_InCheck
  863. FROM
  864. qlAProduct AS a
  865. INNER JOIN qlOrderProduct AS b ON b.ID_qlAProduct = a.ID
  866. LEFT JOIN SCydbzyq AS c ON c.ID_qlOrderProduct = b.ID
  867. AND c.ixh = 1
  868. INNER JOIN MCYD AS d ON d.ICYDID = b.ID_Mcyd
  869. WHERE
  870. d.ICYDSTATE <> - 1
  871. ) rk
  872. GROUP BY Code_ProductOrder
  873. ) rk ON cyd.ccydh = rk.Code_ProductOrder
  874. WHERE
  875. YEAR(Dwcrq) = YEAR(CURDATE())
  876. AND cyd.LWCBS = '1'
  877. AND ck.CKSL < e.iAmount
  878. ) AA;";
  879. $res = Db::query($sql);
  880. if($res){
  881. $redis->set($redis_key, json_encode($res));
  882. echo date("Y-m-d H:i:s").'存进去了';
  883. return $res;
  884. }
  885. }
  886. // 总库存->接口
  887. public function numcont() {
  888. $redis = redis();
  889. $result = json_decode($redis->get(md5('numcont_redis')), true);
  890. $res = [
  891. 'status' => 0,
  892. 'msg' => '',
  893. ];
  894. // 如果结果为空,则直接返回预设的数据结构
  895. if (empty($result)) {
  896. $res['data'] = [
  897. ['name' => ' ', 'value' => 0],
  898. // ['name' => ' ', 'value' => 0],
  899. ];
  900. } else {
  901. // 注意:这里假设$result总是有数据并且结构固定
  902. // 对于“尚需发货数量”,除以10000的目的可能是为了单位转换,例如从“个”转换到“万个”
  903. $res['data'] = [
  904. ['name' => ' ', 'value' => $result[0]['库存总量']],
  905. // ['name' => ' ', 'value' => round($result[0]['尚需发货数量'])],
  906. ];
  907. }
  908. return json($res);
  909. }
  910. }