缓存 public function product_details_redis(){ $redis=redis(); $redis_key = md5('product_details_redis'); $sql = "SELECT hz.分类, hz.订单号, hz.印件名称, hz.承印日期, hz.委印单位, hz.库存数量, hz.库龄, hz.尚需发货数量 FROM ( SELECT DATE_FORMAT(Dwcrq, '%Y-%m-%d') AS 承印日期, CCYDH AS 订单号, CYJMC AS 印件名称, CYWDWMC AS 委印单位, DATE_FORMAT(Dwcrq, '%Y-%m-%d') AS 完工日期, e.iAmount AS 要求印数, rk.nrksl AS 已入库数量, ck.CKSL AS 已出库数量, rk.nrksl - ck.CKSL AS 库存数量, e.iAmount - ck.CKSL AS 尚需发货数量, DATEDIFF(DATE(NOW()), DATE_FORMAT(Dwcrq, '%Y-%m-%d')) AS 库龄, CASE WHEN DATEDIFF(DATE(NOW()), DATE_FORMAT(Dwcrq, '%Y-%m-%d')) >= 91 THEN '3个月以上' ELSE '3个月以内' END AS 分类 FROM MCYD cyd LEFT JOIN qlOrderProduct e ON e.cCode = cyd.CCYDH LEFT JOIN ( SELECT cCode, SUM(iOutAmount) AS CKSL FROM ( SELECT d.scSaleOrderCode AS cCode, b.cName, b.iOutAmount, DATE_FORMAT(a.dSendDate, '%Y-%m-%d') AS ckrq FROM fnOut a INNER JOIN fnOutDetail b ON a.ID = b.id_fnOut INNER JOIN fnOutPlanDetail d ON b.ID_OutPlanDetail = d.id WHERE a.iStatus > 20 ) ckmx GROUP BY cCode ) ck ON cyd.CCYDH = ck.cCode LEFT JOIN ( SELECT rk.Code_ProductOrder Code_ProductOrder, SUM(rk.iAmount_In) AS nrksl FROM (SELECT DISTINCT b.iAmount_In, b.cCode as Code_ProductOrder, a.ID, a.ID AS ID_Request, b.ID_Mcyd, a.cCode, a.cName, a.iTag_Group, a.cUnit, 1 AS iVers, a.cSize, 1 AS iState, CASE a.iType WHEN 8 THEN 5 ELSE 0 END AS iType, '' AS cType_P, '' AS cType_P1, '' AS cRemark, '' AS cAlias, 1 AS iSign_Used, 0 AS ID_Origin, CAST( a.bNumRange AS SIGNED ) AS iNumRange, CASE WHEN b.iCount_NumRange > 1 THEN 1 ELSE 0 END AS iMNumRange, b.iCount_NumRange, a.iNodePage, a.iNodePart, 0 AS iSample, 0 AS ID_Comp, 1 AS iSign_State, 0 AS nWeight, 0 AS iSign_FSC, 0 AS ID_FSCRemark, 1 AS iState_Request, '' AS cGrade, c.cdw AS cPackUnit, COALESCE ( c.iAmount, 0 ) AS iAmount_Box, d.CCYDH, d.CYWYXM, 0 AS iOutCheck, '' AS cGrade_OutCheck, 0 AS iInCheck, '' AS cGrade_InCheck FROM qlAProduct AS a INNER JOIN qlOrderProduct AS b ON b.ID_qlAProduct = a.ID LEFT JOIN SCydbzyq AS c ON c.ID_qlOrderProduct = b.ID AND c.ixh = 1 INNER JOIN MCYD AS d ON d.ICYDID = b.ID_Mcyd WHERE d.ICYDSTATE <> - 1) rk GROUP BY Code_ProductOrder ) rk ON cyd.ccydh = rk.Code_ProductOrder WHERE 1 = 1 AND DATE_FORMAT(cyd.Dwcrq, '%Y-%m-%d') BETWEEN '2021-01-01' AND DATE(CONVERT(NOW(), CHAR(10))) AND cyd.LWCBS = '1' AND ck.CKSL < e.iAmount ) hz WHERE hz.库存数量 > 0 ORDER BY hz.库龄 DESC;"; $res = Db::query($sql); if($res){ $redis->set($redis_key, json_encode($res)); echo date("Y-m-d H:i:s").'存进去了'; return $res; } } //1.已完工三个月以内库存明细->接口 public function product_details_within(){ $redis = redis(); $list = json_decode($redis->get(md5('product_details_redis')), true); // echo "
";print_r($list);echo "
";

        $result['columns']=[
            ['name'=>'分类','id'=>'fl','width'=>'11','autoWrap'=>"true",'textAlign'=>'left'],
            ['name'=>'订单号','id'=>'ddh','width'=>'12','autoWrap'=>"true",'textAlign'=>'left'],
            ['name'=>'印件名称','id'=>'yjmc','width'=>'26','autoWrap'=>"true",'textAlign'=>'left'],
            ['name'=>'承印日期','id'=>'cyrq','width'=>'14','autoWrap'=>"true",'textAlign'=>'left'],
            ['name'=>'委印单位','id'=>'wydw','width'=>'24','autoWrap'=>"true",'textAlign'=>'left'],
            ['name'=>'库存数量','id'=>'kcsl','width'=>'8','autoWrap'=>"true",'textAlign'=>'left'],
            ['name'=>'库龄','id'=>'kl','width'=>'8','autoWrap'=>"true",'textAlign'=>'left'],
            ['name'=>'尚需发货数量','id'=>'sxfhsl','width'=>'10','autoWrap'=>"true",'textAlign'=>'left']
        ];

        // 过滤分类为“3个月以内”的记录
        $filtered_list = array_filter($list, function($v) {
            return $v['分类'] === '3个月以内';
        });
        // 截取前20条数据
        $filtered_list = array_slice($filtered_list, 0, 20);
        foreach($filtered_list as $k=>$v){
            $result['rows'][$k]['fl']=$v['分类'];
            $result['rows'][$k]['ddh']=$v['订单号'];
            $result['rows'][$k]['yjmc']=$v['印件名称'];
            $result['rows'][$k]['cyrq']=$v['承印日期'];
            $result['rows'][$k]['wydw']=$v['委印单位'];
            $result['rows'][$k]['kcsl']=$v['库存数量'];
            $result['rows'][$k]['kl']=$v['库龄'];  // 修正此处
            $result['rows'][$k]['sxfhsl']=$v['尚需发货数量'];
        }
        // 如果过滤后的列表为空,则添加空数据行
        if(empty($filtered_list)){
            $result['rows'][] = ['fl'=>'', 'ddh'=>'', 'yjmc'=>'', 'cyrq'=>'', 'wydw'=>'', 'kcsl'=>'', 'kl'=>'', 'sxfhsl'=>''];
        }
        $res['status']=0;
        $res['msg']='';
        $res['data']=$result;
        return json($res);
    }
    //1.已完工三个月以上库存明细->接口
    public function product_details_more(){
        $redis = redis();
        $list = json_decode($redis->get(md5('product_details_redis')), true);
//        echo "
";print_r($list);echo "
";

        $result['columns']=[
            ['name'=>'分类','id'=>'fl','width'=>'11','autoWrap'=>"true",'textAlign'=>'left'],
            ['name'=>'订单号','id'=>'ddh','width'=>'12','autoWrap'=>"true",'textAlign'=>'left'],
            ['name'=>'印件名称','id'=>'yjmc','width'=>'26','autoWrap'=>"true",'textAlign'=>'left'],
            ['name'=>'承印日期','id'=>'cyrq','width'=>'14','autoWrap'=>"true",'textAlign'=>'left'],
            ['name'=>'委印单位','id'=>'wydw','width'=>'24','autoWrap'=>"true",'textAlign'=>'left'],
            ['name'=>'库存数量','id'=>'kcsl','width'=>'8','autoWrap'=>"true",'textAlign'=>'left'],
            ['name'=>'库龄','id'=>'kl','width'=>'8','autoWrap'=>"true",'textAlign'=>'left'],
            ['name'=>'尚需发货数量','id'=>'sxfhsl','width'=>'10','autoWrap'=>"true",'textAlign'=>'left']
        ];

        // 过滤分类为“3个月以上”的记录
        $filtered_list = array_filter($list, function($v) {
            return $v['分类'] === '3个月以上';
        });
        // 截取前20条数据
        $filtered_list = array_slice($filtered_list, 0, 20);
        foreach($filtered_list as $k=>$v){
            $result['rows'][$k]['fl']=$v['分类'];
            $result['rows'][$k]['ddh']=$v['订单号'];
            $result['rows'][$k]['yjmc']=$v['印件名称'];
            $result['rows'][$k]['cyrq']=$v['承印日期'];
            $result['rows'][$k]['wydw']=$v['委印单位'];
            $result['rows'][$k]['kcsl']=$v['库存数量'];
            $result['rows'][$k]['kl']=$v['库龄'];  // 修正此处
            $result['rows'][$k]['sxfhsl']=$v['尚需发货数量'];
        }
        // 如果过滤后的列表为空,则添加空数据行
        if(empty($filtered_list)){
            $result['rows'][] = ['fl'=>'', 'ddh'=>'', 'yjmc'=>'', 'cyrq'=>'', 'wydw'=>'', 'kcsl'=>'', 'kl'=>'', 'sxfhsl'=>''];
        }
        $res['status']=0;
        $res['msg']='';
        $res['data']=$result;
        return json($res);
    }

    //2.当日送货完成情况->缓存
    public function Delivery_day_redis(){
        $redis=redis();
        $redis_key = md5('Delivery_day_redis');
        $sql = "SELECT A.CCYDH AS 订单号,
       A.CYJMC AS 印件名称,
       A.CYWDWMC AS 客户名称,
       A.NCS AS 印数,
       jhs.iAmount AS 要求印数,
       dr.当日出库,
       dr.累计出库,
       dr.未出库
FROM mcyd A
LEFT JOIN (
    SELECT hb.订单号,
           hb.客户名称,
           hb.印件名称,
           SUM(hb.当日出库) AS 当日出库,
           COALESCE(hj.ljcksl, 0) + COALESCE(xlj.ck, 0) AS 累计出库,
           CASE
               WHEN hb.册数 - (COALESCE(hj.ljcksl, 0) + COALESCE(xlj.ck, 0)) < 0 THEN 0
               ELSE hb.册数 - (COALESCE(hj.ljcksl, 0) + COALESCE(xlj.ck, 0))
           END AS 未出库
    FROM (
        SELECT DATE_FORMAT(NOW(), '%Y-%m-%d') AS 送货日期,
               q.客户名称,
               q.订单号,
               q.单位,
               q.印件名称,
               q.册数,
               SUM(q.出库数量) AS 当日出库
        FROM (
            SELECT DISTINCT a.cBillCode,
                            a.cClientName AS 客户名称,
                            d.scSaleOrderCode AS 订单号,
                            b.cName AS 印件名称,
                            b.cUnit AS 单位,
                            md.ncs AS 册数,
                            b.iOutAmount AS 出库数量
            FROM fnOut a
            INNER JOIN fnOutDetail b ON a.ID = b.id_fnOut
            INNER JOIN fnOutPlan c ON a.ID_OutPlan = c.id
            INNER JOIN fnOutPlanDetail d ON b.ID_OutPlanDetail = d.id
            INNER JOIN (SELECT DISTINCT
				b.iAmount_In,
				b.cCode as Code_ProductOrder,
				b.iAmount,
	a.ID,
	a.ID AS ID_Request,
	b.ID_Mcyd,
	a.cCode,
	a.cName,
	a.iTag_Group,
	a.cUnit,
	1 AS iVers,
	a.cSize,
	1 AS iState,
CASE
	a.iType 
	WHEN 8 THEN
	5 ELSE 0 
	END AS iType,
	'' AS cType_P,
	'' AS cType_P1,
	'' AS cRemark,
	'' AS cAlias,
	1 AS iSign_Used,
	0 AS ID_Origin,
	CAST( a.bNumRange AS SIGNED ) AS iNumRange,
CASE
	
	WHEN b.iCount_NumRange > 1 THEN
	1 ELSE 0 
	END AS iMNumRange,
	b.iCount_NumRange,
	a.iNodePage,
	a.iNodePart,
	0 AS iSample,
	0 AS ID_Comp,
	1 AS iSign_State,
	0 AS nWeight,
	0 AS iSign_FSC,
	0 AS ID_FSCRemark,
	1 AS iState_Request,
	'' AS cGrade,
	c.cdw AS cPackUnit,
	COALESCE ( c.iAmount, 0 ) AS iAmount_Box,
	d.CCYDH,
	d.CYWYXM,
	0 AS iOutCheck,
	'' AS cGrade_OutCheck,
	0 AS iInCheck,
	'' AS cGrade_InCheck 
FROM
	qlAProduct AS a
	INNER JOIN qlOrderProduct AS b ON b.ID_qlAProduct = a.ID
	LEFT JOIN SCydbzyq AS c ON c.ID_qlOrderProduct = b.ID 
	AND c.ixh = 1
	INNER JOIN MCYD AS d ON d.ICYDID = b.ID_Mcyd 
WHERE
d.ICYDSTATE <> - 1) f ON b.cFnCode = f.cCode
            LEFT JOIN mcyd md ON d.scSaleOrderCode = md.CCYDH
            WHERE a.iStatus > 20
        ) q
        GROUP BY q.客户名称, q.订单号, q.单位, q.册数, q.印件名称
    ) hb
    LEFT JOIN (
        SELECT lj.ccydh,
               lj.cywdwmc,
               lj.ccpmc,
               SUM(lj.ncksl) AS ljcksl
        FROM (
            SELECT a.cywdwmc,
                   a.ccydh,
                   a.ccpmc,
                   a.ncksl
            FROM sexpstore a,
                 dzprod b
            WHERE a.ccpbh = b.ccpbh
                  AND a.ibilltype = 0
                  AND a.dckrq >= @dDate_Star
                  AND a.dckrq <= @dDate_End
                  AND a.btempstore = 0
        ) lj
        GROUP BY lj.ccydh, lj.cywdwmc, lj.ccpmc
    ) hj ON hj.ccydh = hb.订单号
    LEFT JOIN (
        SELECT f.ccydh,
               SUM(r.iOutAmount) AS ck
        FROM fnOutDetail r
        LEFT JOIN fnOut a ON a.ID = r.id_fnOut
        LEFT JOIN mcyd f ON f.icydid = r.id_scSaleOrder
        WHERE a.iStatus > 20
        GROUP BY f.ccydh
    ) xlj ON xlj.CCYDH = hb.订单号
		GROUP  BY hb.客户名称,
                                  hb.订单号,
                                  hb.印件名称,
                                  hb.单位,
                                  hb.册数,
                                  hb.送货日期,
                                  hj.ljcksl,
                                  xlj.ck
) dr ON A.CCYDH = dr.订单号
LEFT JOIN (SELECT DISTINCT
				b.iAmount_In,
				b.cCode as Code_ProductOrder,
				b.iAmount,
	a.ID,
	a.ID AS ID_Request,
	b.ID_Mcyd,
	a.cCode,
	a.cName,
	a.iTag_Group,
	a.cUnit,
	1 AS iVers,
	a.cSize,
	1 AS iState,
CASE
	a.iType 
	WHEN 8 THEN
	5 ELSE 0 
	END AS iType,
	'' AS cType_P,
	'' AS cType_P1,
	'' AS cRemark,
	'' AS cAlias,
	1 AS iSign_Used,
	0 AS ID_Origin,
	CAST( a.bNumRange AS SIGNED ) AS iNumRange,
CASE
	
	WHEN b.iCount_NumRange > 1 THEN
	1 ELSE 0 
	END AS iMNumRange,
	b.iCount_NumRange,
	a.iNodePage,
	a.iNodePart,
	0 AS iSample,
	0 AS ID_Comp,
	1 AS iSign_State,
	0 AS nWeight,
	0 AS iSign_FSC,
	0 AS ID_FSCRemark,
	1 AS iState_Request,
	'' AS cGrade,
	c.cdw AS cPackUnit,
	COALESCE ( c.iAmount, 0 ) AS iAmount_Box,
	d.CCYDH,
	d.CYWYXM,
	0 AS iOutCheck,
	'' AS cGrade_OutCheck,
	0 AS iInCheck,
	'' AS cGrade_InCheck 
FROM
	qlAProduct AS a
	INNER JOIN qlOrderProduct AS b ON b.ID_qlAProduct = a.ID
	LEFT JOIN SCydbzyq AS c ON c.ID_qlOrderProduct = b.ID 
	AND c.ixh = 1
	INNER JOIN MCYD AS d ON d.ICYDID = b.ID_Mcyd 
WHERE
d.ICYDSTATE <> - 1) jhs ON A.CCYDH = jhs.Code_ProductOrder
WHERE A.DJFRQ >= DATE_FORMAT(NOW(), '%Y-%m-%d 00:00:00')
      AND A.DJFRQ <= DATE_FORMAT(NOW(), '%Y-%m-%d 23:59:59')
      AND A.iCydState <> -1
ORDER BY dr.客户名称, dr.印件名称;";
        $res = Db::query($sql);
        if($res){
            $redis->set($redis_key, json_encode($res));
            echo date("Y-m-d H:i:s").'存进去了';
            return $res;
        }
    }
    //2.当日送货完成情况->接口
    public function Delivery_day(){
        $redis = redis();
        $list = json_decode($redis->get(md5('Delivery_day_redis')), true);
        $result['columns']=[
            ['name'=>'订单号','id'=>'ddh','width'=>'14','autoWrap'=>"true",'textAlign'=>'left'],
            ['name'=>'印件名称','id'=>'yjmc','width'=>'18','autoWrap'=>"true",'textAlign'=>'left'],
            ['name'=>'客户名称','id'=>'khmc','width'=>'18','autoWrap'=>"true",'textAlign'=>'left'],
            ['name'=>'印数','id'=>'ys','width'=>'11','autoWrap'=>"true",'textAlign'=>'left'],
            ['name'=>'要求印数','id'=>'yqys','width'=>'13','autoWrap'=>"true",'textAlign'=>'left'],
            ['name'=>'当日出库','id'=>'drck','width'=>'12','autoWrap'=>"true",'textAlign'=>'left'],
            ['name'=>'累计出库','id'=>'ljck','width'=>'12','autoWrap'=>"true",'textAlign'=>'left'],
            ['name'=>'未出库','id'=>'wck','width'=>'12','autoWrap'=>"true",'textAlign'=>'left']
        ];
        foreach($list as $k=>$v){
            $result['rows'][$k]['ddh'] = $v['订单号'];
            $result['rows'][$k]['yjmc'] = $v['印件名称'];
            $result['rows'][$k]['khmc'] = $v['客户名称'];
            $result['rows'][$k]['ys'] = $v['印数'];
            $result['rows'][$k]['yqys'] = $v['要求印数'];
            $result['rows'][$k]['drck'] = isset($v['当日出库']) ? $v['当日出库'] : '';
            $result['rows'][$k]['ljck'] = isset($v['累计出库']) ? $v['累计出库'] : '';
            $result['rows'][$k]['wck'] = isset($v['未出库']) ? $v['未出库'] : '';
        }
        // 如果过滤后的列表为空,则添加空数据行
        // 注意:这里似乎有一个未定义的变量$filtered_list,你可能需要确保它在使用前已被正确定义和过滤
        if(empty($filtered_list)){
            $result['rows'][] = ['ddh'=>'', 'yjmc'=>'', 'khmc'=>'','ys'=>'', 'yqys'=>'', 'drck'=>'', 'ljck'=>'', 'wck'=>''];
        }
        $res['status'] = 0;
        $res['msg'] = '';
        $res['data'] = $result;
        return json($res);
    }

    //三个月以上 //三个月以内 ->缓存
    public function sys_redis(){
        $redis=redis();
        $redis_key = md5('sys_redis');
        $sql = "SELECT hz.分类, SUM(hz.库存数量) AS 库存数量, SUM(hz.尚需发货数量) AS 尚需发货数量
FROM (
    SELECT 
        DATE(Dwcrq) AS 完工日期,
        CCYDH AS 订单号,
        CYJMC AS 印件名称,
        CYWDWMC AS 委印单位,
        e.iAmount AS 要求印数,
        rk.nrksl AS 已入库数量,
        ck.CKSL AS 已出库数量,
        rk.nrksl - ck.CKSL AS 库存数量,
        e.iAmount - ck.CKSL AS 尚需发货数量,
        DATEDIFF(CURDATE(), DATE(Dwcrq)) AS 库存周期,
        CASE
            WHEN DATEDIFF(CURDATE(), DATE(Dwcrq)) >= 91 THEN '3个月以上'
            ELSE '3个月以内'
        END AS 分类
    FROM MCYD cyd
    LEFT JOIN qlOrderProduct e ON e.cCode = cyd.CCYDH
    LEFT JOIN (
        SELECT 
            MAX(ckmx.ckrq) AS zwckrq,
            cCode,
            SUM(iOutAmount) AS CKSL
        FROM (
            SELECT 
                d.scSaleOrderCode AS cCode,
                b.cName,
                b.iOutAmount,
                DATE(a.dSendDate) AS ckrq
            FROM fnOut a
            INNER JOIN fnOutDetail b ON a.ID = b.id_fnOut
            INNER JOIN fnOutPlanDetail d ON b.ID_OutPlanDetail = d.id
            WHERE a.iStatus > 20
        ) ckmx
        GROUP BY cCode
    ) ck ON cyd.CCYDH = ck.cCode
    LEFT JOIN (
        SELECT 
            rk.Code_ProductOrder AS Code_ProductOrder,
            SUM(iAmount_In) AS nrksl
        FROM (SELECT DISTINCT
				b.iAmount_In,
				b.cCode as Code_ProductOrder,
				b.iAmount,
	a.ID,
	a.ID AS ID_Request,
	b.ID_Mcyd,
	a.cCode,
	a.cName,
	a.iTag_Group,
	a.cUnit,
	1 AS iVers,
	a.cSize,
	1 AS iState,
CASE
	a.iType 
	WHEN 8 THEN
	5 ELSE 0 
	END AS iType,
	'' AS cType_P,
	'' AS cType_P1,
	'' AS cRemark,
	'' AS cAlias,
	1 AS iSign_Used,
	0 AS ID_Origin,
	CAST( a.bNumRange AS SIGNED ) AS iNumRange,
CASE
	
	WHEN b.iCount_NumRange > 1 THEN
	1 ELSE 0 
	END AS iMNumRange,
	b.iCount_NumRange,
	a.iNodePage,
	a.iNodePart,
	0 AS iSample,
	0 AS ID_Comp,
	1 AS iSign_State,
	0 AS nWeight,
	0 AS iSign_FSC,
	0 AS ID_FSCRemark,
	1 AS iState_Request,
	'' AS cGrade,
	c.cdw AS cPackUnit,
	COALESCE ( c.iAmount, 0 ) AS iAmount_Box,
	d.CCYDH,
	d.CYWYXM,
	0 AS iOutCheck,
	'' AS cGrade_OutCheck,
	0 AS iInCheck,
	'' AS cGrade_InCheck 
FROM
	qlAProduct AS a
	INNER JOIN qlOrderProduct AS b ON b.ID_qlAProduct = a.ID
	LEFT JOIN SCydbzyq AS c ON c.ID_qlOrderProduct = b.ID 
	AND c.ixh = 1
	INNER JOIN MCYD AS d ON d.ICYDID = b.ID_Mcyd 
WHERE
d.ICYDSTATE <> - 1) rk
        GROUP BY rk.Code_ProductOrder
    ) rk ON cyd.ccydh = rk.Code_ProductOrder
    WHERE 
        DATE(Dwcrq) BETWEEN '2021-01-01' AND CURDATE()
        AND cyd.LWCBS = '1'
        AND ck.CKSL < e.iAmount
) hz
GROUP BY hz.分类;";
        $res = Db::query($sql);
        if($res){
            $redis->set($redis_key, json_encode($res));
            echo date("Y-m-d H:i:s").'存进去了';
            return $res;
        }
    }
    //三个月以上\三个月以内 柱状->接口
    public function sys() {
        $redis = redis();
        $list = json_decode($redis->get(md5('sys_redis')), true);
        // 分类数组,对应每个分类的名称
        $categories = [];
        // 库存数量数组,对应每个分类的库存数量
        $inventoryData = [];
        // 遍历查询结果,将每个分类的名称和对应的库存数量添加到数组中
        foreach ($list as $item) {
            $categories[] = ' '; // 添加分类名称到数组
            $inventoryData[] = $item['库存数量']; // 添加库存数量到数组
        }
        // 构建最终的数据结构
        $result = [
            'status' => 0, // 状态码,0代表成功
            'msg' => '', // 消息内容,这里为空字符串
            'data' => [
                'categories' => $categories, // 分类名称数组
                'series' => [
                    [
                        'name' => '库存数量', // 系列名称
                        'data' => $inventoryData // 库存数量数据
                    ]
                ]
            ]
        ];
        // 将结果转换为JSON格式并返回
        return json_encode($result);
    }

    //库存趋势图(两年对比)->缓存
    public function kcqst_redis(){
        $redis=redis();
        $redis_key = md5('kcqst_redis');
        $sql = "WITH RECURSIVE LastDayOfMonth AS (
  SELECT LAST_DAY( CURDATE()) AS LastDay
  UNION ALL
  SELECT LAST_DAY(LastDay - INTERVAL 1 MONTH) AS LastDay
  FROM LastDayOfMonth
  WHERE LastDay > DATE_SUB( CURDATE(), INTERVAL 3 YEAR)
)

SELECT 
  LastDayOfMonth.LastDay AS 日期,
  IFNULL(SUM(CASE
    WHEN AA.完工日期 <= LastDayOfMonth.LastDay THEN AA.库存数量
    ELSE 0
  END), 0) AS 库存总量,
  IFNULL(SUM(CASE
    WHEN AA.完工日期 <= LastDayOfMonth.LastDay THEN AA.尚需发货数量
    ELSE 0
  END), 0) AS 尚需发货数量

FROM LastDayOfMonth
LEFT JOIN (
  SELECT 
    DATE(Dwcrq) AS 完工日期,
    CCYDH AS 订单号,
    CYJMC AS 印件名称,
    CYWDWMC AS 委印单位,
    e.iAmount AS 要求印数,
    rk.nrksl AS 已入库数量,
    ck.CKSL AS 已出库数量,
    rk.nrksl - ck.CKSL AS 库存数量,
    e.iAmount - ck.CKSL AS 尚需发货数量,
    DATEDIFF(CURDATE(), DATE(Dwcrq)) AS 库存周期
  FROM MCYD cyd
  LEFT JOIN qlOrderProduct e ON e.cCode = cyd.CCYDH
  LEFT JOIN (
    SELECT 
      MAX(ckmx.ckrq) AS zwckrq,
      cCode,
      SUM(iOutAmount) AS CKSL
    FROM (
      SELECT 
        d.scSaleOrderCode AS cCode,
        b.cName,
        b.iOutAmount,
        DATE(a.dSendDate) AS ckrq
      FROM fnOut a
      INNER JOIN fnOutDetail b ON a.ID = b.id_fnOut
      INNER JOIN fnOutPlanDetail d ON b.ID_OutPlanDetail = d.id
      WHERE a.iStatus > 20
    ) ckmx
    GROUP BY cCode
  ) ck ON cyd.CCYDH = ck.cCode
  LEFT JOIN (
    SELECT 
      rk.Code_ProductOrder AS Code_ProductOrder,
      SUM(iAmount_In) AS nrksl
    FROM (SELECT DISTINCT
				b.iAmount_In,
				b.cCode as Code_ProductOrder,
				b.iAmount,
	a.ID,
	a.ID AS ID_Request,
	b.ID_Mcyd,
	a.cCode,
	a.cName,
	a.iTag_Group,
	a.cUnit,
	1 AS iVers,
	a.cSize,
	1 AS iState,
CASE
	a.iType 
	WHEN 8 THEN
	5 ELSE 0 
	END AS iType,
	'' AS cType_P,
	'' AS cType_P1,
	'' AS cRemark,
	'' AS cAlias,
	1 AS iSign_Used,
	0 AS ID_Origin,
	CAST( a.bNumRange AS SIGNED ) AS iNumRange,
CASE
	
	WHEN b.iCount_NumRange > 1 THEN
	1 ELSE 0 
	END AS iMNumRange,
	b.iCount_NumRange,
	a.iNodePage,
	a.iNodePart,
	0 AS iSample,
	0 AS ID_Comp,
	1 AS iSign_State,
	0 AS nWeight,
	0 AS iSign_FSC,
	0 AS ID_FSCRemark,
	1 AS iState_Request,
	'' AS cGrade,
	c.cdw AS cPackUnit,
	COALESCE ( c.iAmount, 0 ) AS iAmount_Box,
	d.CCYDH,
	d.CYWYXM,
	0 AS iOutCheck,
	'' AS cGrade_OutCheck,
	0 AS iInCheck,
	'' AS cGrade_InCheck 
FROM
	qlAProduct AS a
	INNER JOIN qlOrderProduct AS b ON b.ID_qlAProduct = a.ID
	LEFT JOIN SCydbzyq AS c ON c.ID_qlOrderProduct = b.ID 
	AND c.ixh = 1
	INNER JOIN MCYD AS d ON d.ICYDID = b.ID_Mcyd 
WHERE
d.ICYDSTATE <> - 1) rk
    GROUP BY rk.Code_ProductOrder
  ) rk ON cyd.ccydh = rk.Code_ProductOrder
  WHERE 
    DATE(Dwcrq) BETWEEN  '2022-01-01' AND CURDATE()
    AND cyd.LWCBS = '1'
    AND ck.CKSL < e.iAmount
) AA ON LastDayOfMonth.LastDay >= DATE(AA.完工日期)
GROUP BY LastDayOfMonth.LastDay
ORDER BY LastDayOfMonth.LastDay;";
        $res = Db::query($sql);
        if($res){
            $redis->set($redis_key, json_encode($res));
            echo date("Y-m-d H:i:s").'存进去了';
            return $res;
        }
    }
    //库存趋势图(两年对比)->接口
    public function kcqst(){
        $redis = redis();
        $result = json_decode($redis->get(md5('kcqst_redis')), true);
//        echo "
";print_r($result);echo "
";

        // 初始化数据
        $list['categories'] = ['01', '02', '03', '04', '05', '06', '07', '08', '09', '10', '11', '12'];
        $currentYear = date("Y"); // 当前年份
        $currentMonth = date("m"); // 当前月份
        $previousYear = (int)$currentYear - 1; // 前一年
        // 为前一年和当前年份创建数据数组,初始值为0
        $list['series'][0]['name'] = $previousYear . '年';
        $list['series'][0]['data'] = array_fill(0, 12, 0); // 前一年的数据数组
        $list['series'][1]['name'] = $currentYear . '年';
        $list['series'][1]['data'] = array_fill(0, $currentMonth, 0); // 当前年份的数据数组
        // 遍历查询结果
        foreach ($result as $v) {
            // 获取年份和月份
            $year = substr($v['日期'], 0, 4);
            $month = substr($v['日期'], 5, 2);
            // 如果是前一年的数据
            if ($year == $previousYear) {
                $list['series'][0]['data'][(int)$month - 1] = $v['库存总量'];
            }
            // 如果是当前年份的数据
            if ($year == $currentYear) {
                $list['series'][1]['data'][(int)$month - 1] = $v['库存总量'];
            }
        }
        // 设置响应数据
        $res['status'] = 0;
        $res['msg'] = '';
        $res['data'] = $list;
        return json_encode($res);
    }

    // 总库存->缓存
    public function numcont_redis(){
        $redis=redis();
        $redis_key = md5('numcont_redis');
        $sql = "SELECT 
  YEAR(CURDATE()) AS 年份,
  IFNULL(SUM(CASE
    WHEN YEAR(AA.完工日期) = YEAR(CURDATE()) THEN AA.库存数量
    ELSE 0
  END), 0) AS 库存总量,
  IFNULL(SUM(CASE
    WHEN YEAR(AA.完工日期) = YEAR(CURDATE()) THEN AA.尚需发货数量
    ELSE 0
  END), 0) AS 尚需发货数量
FROM (
  SELECT 
    DATE(Dwcrq) AS 完工日期,
    CCYDH AS 订单号,
    CYJMC AS 印件名称,
    CYWDWMC AS 委印单位,
    e.iAmount AS 要求印数,
    rk.nrksl AS 已入库数量,
    ck.CKSL AS 已出库数量,
    rk.nrksl - ck.CKSL AS 库存数量,
    e.iAmount - ck.CKSL AS 尚需发货数量
  FROM MCYD cyd
  LEFT JOIN qlOrderProduct e ON e.cCode = cyd.CCYDH
  LEFT JOIN (
    SELECT 
      cCode,
      SUM(iOutAmount) AS CKSL
    FROM (
      SELECT 
        d.scSaleOrderCode AS cCode,
        b.iOutAmount,
        DATE(a.dSendDate) AS ckrq
      FROM fnOut a
      INNER JOIN fnOutDetail b ON a.ID = b.id_fnOut
      INNER JOIN fnOutPlanDetail d ON b.ID_OutPlanDetail = d.id
      WHERE a.iStatus > 20
      GROUP BY d.scSaleOrderCode, DATE(a.dSendDate)
    ) ckmx
    GROUP BY cCode
  ) ck ON cyd.CCYDH = ck.cCode
  LEFT JOIN (
    SELECT 
      Code_ProductOrder,
      SUM(iAmount_In) AS nrksl
    FROM (
      
      SELECT DISTINCT
				b.iAmount_In,
				b.cCode as Code_ProductOrder,
				b.iAmount,
	a.ID,
	a.ID AS ID_Request,
	b.ID_Mcyd,
	a.cCode,
	a.cName,
	a.iTag_Group,
	a.cUnit,
	1 AS iVers,
	a.cSize,
	1 AS iState,
CASE
	a.iType 
	WHEN 8 THEN
	5 ELSE 0 
	END AS iType,
	'' AS cType_P,
	'' AS cType_P1,
	'' AS cRemark,
	'' AS cAlias,
	1 AS iSign_Used,
	0 AS ID_Origin,
	CAST( a.bNumRange AS SIGNED ) AS iNumRange,
CASE
	
	WHEN b.iCount_NumRange > 1 THEN
	1 ELSE 0 
	END AS iMNumRange,
	b.iCount_NumRange,
	a.iNodePage,
	a.iNodePart,
	0 AS iSample,
	0 AS ID_Comp,
	1 AS iSign_State,
	0 AS nWeight,
	0 AS iSign_FSC,
	0 AS ID_FSCRemark,
	1 AS iState_Request,
	'' AS cGrade,
	c.cdw AS cPackUnit,
	COALESCE ( c.iAmount, 0 ) AS iAmount_Box,
	d.CCYDH,
	d.CYWYXM,
	0 AS iOutCheck,
	'' AS cGrade_OutCheck,
	0 AS iInCheck,
	'' AS cGrade_InCheck 
FROM
	qlAProduct AS a
	INNER JOIN qlOrderProduct AS b ON b.ID_qlAProduct = a.ID
	LEFT JOIN SCydbzyq AS c ON c.ID_qlOrderProduct = b.ID 
	AND c.ixh = 1
	INNER JOIN MCYD AS d ON d.ICYDID = b.ID_Mcyd 
WHERE
d.ICYDSTATE <> - 1
    
    ) rk
    GROUP BY Code_ProductOrder
  ) rk ON cyd.ccydh = rk.Code_ProductOrder
  WHERE 
    YEAR(Dwcrq) = YEAR(CURDATE())
    AND cyd.LWCBS = '1'
    AND ck.CKSL < e.iAmount
) AA;";
        $res = Db::query($sql);
        if($res){
            $redis->set($redis_key, json_encode($res));
            echo date("Y-m-d H:i:s").'存进去了';
            return $res;
        }
    }
    // 总库存->接口
    public function numcont() {
        $redis = redis();
        $result = json_decode($redis->get(md5('numcont_redis')), true);
        $res = [
            'status' => 0,
            'msg' => '',
        ];
        // 如果结果为空,则直接返回预设的数据结构
        if (empty($result)) {
            $res['data'] = [
                ['name' => ' ', 'value' => 0],
//                ['name' => ' ', 'value' => 0],
            ];
        } else {
            // 注意:这里假设$result总是有数据并且结构固定
            // 对于“尚需发货数量”,除以10000的目的可能是为了单位转换,例如从“个”转换到“万个”
            $res['data'] = [
                ['name' => ' ', 'value' => $result[0]['库存总量']],
//                ['name' => ' ', 'value' => round($result[0]['尚需发货数量'])],
            ];
        }
        return json($res);
    }
}