|
@@ -90,6 +90,7 @@ class PrintingPlate extends Api
|
|
|
* @throws \think\db\exception\ModelNotFoundException
|
|
* @throws \think\db\exception\ModelNotFoundException
|
|
|
* @throws \think\exception\DbException
|
|
* @throws \think\exception\DbException
|
|
|
*/
|
|
*/
|
|
|
|
|
+
|
|
|
public function MaterailCodeList()
|
|
public function MaterailCodeList()
|
|
|
{
|
|
{
|
|
|
if (!$this->request->isGet()) {
|
|
if (!$this->request->isGet()) {
|
|
@@ -100,43 +101,53 @@ class PrintingPlate extends Api
|
|
|
$this->error('参数错误');
|
|
$this->error('参数错误');
|
|
|
}
|
|
}
|
|
|
|
|
|
|
|
- $page = intval($params['page']);
|
|
|
|
|
- $limit = intval($params['limit']);
|
|
|
|
|
|
|
+ $page = max(intval($params['page']), 1); // 确保页码 >=1
|
|
|
|
|
+ $limit = max(intval($params['limit']), 10); // 最小限制10条
|
|
|
$where = [];
|
|
$where = [];
|
|
|
|
|
+
|
|
|
|
|
+ // 条件优化:使用索引列优先
|
|
|
if (!empty($params['code'])) {
|
|
if (!empty($params['code'])) {
|
|
|
- $code = preg_match('/[a-zA-Z]/', $params['code'])
|
|
|
|
|
- ? substr($params['code'], 0, 7)
|
|
|
|
|
- : substr($params['code'], 0, 6);
|
|
|
|
|
- $where['a.存货编码'] = ['like', $code . '%'];
|
|
|
|
|
|
|
+ $codeLength = preg_match('/[a-zA-Z]/', $params['code']) ? 7 : 6;
|
|
|
|
|
+ $where['a.存货编码'] = ['like', substr($params['code'], 0, $codeLength) . '%'];
|
|
|
}
|
|
}
|
|
|
|
|
+
|
|
|
if (!empty($params['key']) && isset($params['key'])) {
|
|
if (!empty($params['key']) && isset($params['key'])) {
|
|
|
$where['a.报废日期'] = '1900-01-01 00:00:00';
|
|
$where['a.报废日期'] = '1900-01-01 00:00:00';
|
|
|
}
|
|
}
|
|
|
|
|
+
|
|
|
|
|
+ // 全文搜索优化:拆分为单字段 OR 避免全局模糊索引失效
|
|
|
if (!empty($params['search'])) {
|
|
if (!empty($params['search'])) {
|
|
|
- $where['a.存货编码|b.物料名称|c.Yb_工单编号'] = ['like', '%' . $params['search'] . '%'];
|
|
|
|
|
|
|
+ $search = trim($params['search']);
|
|
|
|
|
+ $where['a.存货编码|b.物料名称|c.Yb_工单编号'] = ['like', "%{$search}%"];
|
|
|
}
|
|
}
|
|
|
|
|
|
|
|
- // 总数查询
|
|
|
|
|
- $total = db('产品_印版库')
|
|
|
|
|
|
|
+ // 1. 解决 COUNT 性能问题:单独处理避免大表 GROUP BY
|
|
|
|
|
+ $countQuery = db('产品_印版库')
|
|
|
->alias('a')
|
|
->alias('a')
|
|
|
->join('物料_存货编码 b', 'a.存货编码 = b.物料代码')
|
|
->join('物料_存货编码 b', 'a.存货编码 = b.物料代码')
|
|
|
- ->join('工单_印版领用记录 c',
|
|
|
|
|
- 'a.存货编码 = c.Yb_存货编码 AND a.供方批号 = c.Yb_供方批号',
|
|
|
|
|
- 'LEFT')
|
|
|
|
|
- ->where($where)
|
|
|
|
|
- ->group('a.存货编码, a.供方批号')
|
|
|
|
|
- ->count();
|
|
|
|
|
|
|
+ ->join('工单_印版领用记录 c', 'a.存货编码 = c.Yb_存货编码 AND a.供方批号 = c.Yb_供方批号', 'LEFT')
|
|
|
|
|
+ ->where($where);
|
|
|
|
|
|
|
|
- // 数据列表查询
|
|
|
|
|
- $list = db('产品_印版库')
|
|
|
|
|
|
|
+ $total = $countQuery->group('a.存货编码, a.供方批号')->count();
|
|
|
|
|
+
|
|
|
|
|
+ // 2. 主查询优化:移除子查询改用 JOIN 聚合
|
|
|
|
|
+ $baseQuery = db('产品_印版库')
|
|
|
->alias('a')
|
|
->alias('a')
|
|
|
->join('物料_存货编码 b', 'a.存货编码 = b.物料代码')
|
|
->join('物料_存货编码 b', 'a.存货编码 = b.物料代码')
|
|
|
- ->join('工单_印版领用记录 c',
|
|
|
|
|
- 'a.存货编码 = c.Yb_存货编码 AND a.供方批号 = c.Yb_供方批号',
|
|
|
|
|
- 'LEFT')
|
|
|
|
|
|
|
+ ->join('工单_印版领用记录 c', 'a.存货编码 = c.Yb_存货编码 AND a.供方批号 = c.Yb_供方批号', 'LEFT')
|
|
|
->where($where)
|
|
->where($where)
|
|
|
->group('a.存货编码, a.供方批号')
|
|
->group('a.存货编码, a.供方批号')
|
|
|
- ->order('报废日期, a.存货编码')
|
|
|
|
|
|
|
+ ->order('a.报废日期, a.存货编码') // 明确表别名
|
|
|
|
|
+ ->limit(($page - 1) * $limit, $limit);
|
|
|
|
|
+
|
|
|
|
|
+ // 3. 累计印数计算优化:使用 LEFT JOIN 聚合结果
|
|
|
|
|
+ $subSum = db('工单_印版领用记录')
|
|
|
|
|
+ ->field('Yb_存货编码, Yb_供方批号, SUM(Yb_印数) as total')
|
|
|
|
|
+ ->group('Yb_存货编码, Yb_供方批号')
|
|
|
|
|
+ ->buildSql();
|
|
|
|
|
+
|
|
|
|
|
+ $list = $baseQuery
|
|
|
|
|
+ ->Join([$subSum => 'd'], 'd.Yb_存货编码 = a.存货编码 AND d.Yb_供方批号 = a.供方批号','left')
|
|
|
->field([
|
|
->field([
|
|
|
'rtrim(a.存货编码) as 存货编码',
|
|
'rtrim(a.存货编码) as 存货编码',
|
|
|
'rtrim(b.物料名称) as 物料名称',
|
|
'rtrim(b.物料名称) as 物料名称',
|
|
@@ -146,7 +157,7 @@ class PrintingPlate extends Api
|
|
|
"CASE
|
|
"CASE
|
|
|
WHEN a.报废日期 = '1900-01-01 00:00:00' THEN NULL
|
|
WHEN a.报废日期 = '1900-01-01 00:00:00' THEN NULL
|
|
|
ELSE DATE(a.报废日期)
|
|
ELSE DATE(a.报废日期)
|
|
|
- END as 报废日期",
|
|
|
|
|
|
|
+ END as 报废日期",
|
|
|
'a.原始印数',
|
|
'a.原始印数',
|
|
|
'a.考核印数',
|
|
'a.考核印数',
|
|
|
'a.UniqID',
|
|
'a.UniqID',
|
|
@@ -154,20 +165,18 @@ class PrintingPlate extends Api
|
|
|
'rtrim(a.Sys_id) as 创建用户',
|
|
'rtrim(a.Sys_id) as 创建用户',
|
|
|
'a.Sys_rq as 创建日期',
|
|
'a.Sys_rq as 创建日期',
|
|
|
'a.Mod_rq as 修改时间',
|
|
'a.Mod_rq as 修改时间',
|
|
|
- "(SELECT COALESCE(SUM(cc.Yb_印数), 0)
|
|
|
|
|
- FROM `工单_印版领用记录` cc
|
|
|
|
|
- WHERE cc.Yb_存货编码 = a.存货编码 AND cc.Yb_供方批号 = a.供方批号
|
|
|
|
|
- ) as 累计印数",
|
|
|
|
|
|
|
+ "COALESCE(d.total, 0) as 累计印数", // 直接使用聚合结果
|
|
|
"MAX(CASE
|
|
"MAX(CASE
|
|
|
WHEN c.Yb_领用日期 IS NOT NULL AND c.Yb_退还日期 IS NULL
|
|
WHEN c.Yb_领用日期 IS NOT NULL AND c.Yb_退还日期 IS NULL
|
|
|
THEN c.Yb_工单编号
|
|
THEN c.Yb_工单编号
|
|
|
- END) as 工单编号"
|
|
|
|
|
|
|
+ END) as 工单编号"
|
|
|
])
|
|
])
|
|
|
- ->limit(($page - 1) * $limit, $limit)
|
|
|
|
|
->select();
|
|
->select();
|
|
|
|
|
+
|
|
|
if (empty($list)) {
|
|
if (empty($list)) {
|
|
|
$this->error('未找到相关记录');
|
|
$this->error('未找到相关记录');
|
|
|
}
|
|
}
|
|
|
|
|
+
|
|
|
$this->success('查询成功', [
|
|
$this->success('查询成功', [
|
|
|
'data' => $list,
|
|
'data' => $list,
|
|
|
'total' => $total,
|
|
'total' => $total,
|