request->isGet() === false) { $this->error('请求错误'); } $param = $this->request->param(); $gdlist = \db('工单_印件资料') ->field('子订单编号') ->where('订单编号',$param['order']) ->where('Mod_rq', null) ->select(); $this->success('成功', [ 'list' => $gdlist, ]); } /** * 1.1查询订单号或生产款号 * 查询对应订单编号或生产款号 */ public function Apiorder() { if ($this->request->isGet() === false) { $this->error('请求错误'); } $param = $this->request->param(); $gdlist = \db('工单_基本资料') ->field('订单编号,生产款号') ->where('订单编号|生产款号','like','%'.$param['search'].'%') ->where('Mod_rq', null) ->select(); $this->success('成功', [ 'list' => $gdlist, ]); } /** * 1.2查询新增基本信息 * 新增查询信息 */ public function queryOrderSize() { // 检查请求类型是否为GET if ($this->request->isGet() === false) { $this->error('请求错误'); } $param = $this->request->param(); //问题分类 $fetchCategory = \db('db_问题分类')->field('问题类型, classification as 分类名称,num')->order('num desc')->select(); $groupedCategories = []; // 遍历数据,将相同分类名称的问题类型归类 foreach ($fetchCategory as $item) { $categoryname = $item['分类名称']; $category = $item['问题类型']; // 如果分类名称不存在,则初始化为空数组 if (!isset($groupedCategories[$categoryname])) { $groupedCategories[$categoryname] = []; } // 避免重复添加相同的问题类型 if (!in_array($category, $groupedCategories[$categoryname])) { $groupedCategories[$categoryname][] = $category; } } $gdlist = \db('工单_基本资料') ->field('订单编号,生产款号,款式,订单数量') ->where(['订单编号|生产款号' => $param['订单编号']]) ->where('Mod_rq', null) ->find(); if (empty($gdlist)) { $this->error('未找到相关数据'); } // 查询订单尺码信息 $sizeData = \db('工单_印件资料')->where(['订单编号' => $gdlist['订单编号']])->where('Mod_rq', null)->select(); if (empty($sizeData)) { $this->error('未找到相关数据'); } // 计算所有尺码数据 $sizes = []; foreach ($sizeData as $order) { foreach ($order as $key => $value) { if (strpos($key, 'cm') === 0 && strpos($key, 'cmsl') === false && $value !== null && $value !== '') { $sizes[] = $value; } } } // 去重后所有子订单重复的尺码数据 $sizes = array_values(array_unique($sizes)); // 获取颜色备注并统计每个颜色的sctotal和zdtotal $colorData = []; // 用于存储每个颜色备注对应的sctotal和zdtotal foreach ($sizeData as $item) { if (!empty($item['颜色备注'])) { $color = $item['颜色备注']; $sctotal = (int)$item['sctotal']; $zdtotal = (int)$item['zdtotal']; if (isset($colorData[$color])) { $colorData[$color]['sctotal'] += $sctotal; $colorData[$color]['zdtotal'] += $zdtotal; } else { $colorData[$color] = [ 'sctotal' => $sctotal, 'zdtotal' => $zdtotal ]; } } } // 获取颜色备注(去重) $colorremark = array_values(array_unique(array_keys($colorData))); //面料分类|面料名称 $getarr = \db('工单_bom资料') ->field('物料分类,BOM_物料名称') ->where('BOM_工单编号', $param['订单编号']) ->where('Mod_rq', null) ->select(); $fabricArr = []; // 存储拼接后的数据 foreach ($getarr as $value) { $materialName = $value['BOM_物料名称']; // 如果物料分类为空,就用'-'代替 $bomDesc = !empty($value['物料分类']) ? $value['物料分类'] : ''; // 拼接字符串,并去除多余空格 $combinedData = trim($bomDesc . ' - ' . $materialName); // 存入数组 $fabricArr[] = $combinedData; // $bomDesc = !empty($value['物料分类']) ? $value['物料分类'] : ''; // 防止null // // 拼接字符串,并去除可能的前后空格 // $combinedData = trim($bomDesc . ' - ' . $materialName, ' -'); // // 存入数组 // $fabricArr[] = $combinedData; } // 获取面料颜色 $getAllFabricData = \db('工单_面料资料') ->field('BOM_物料名称,BOM_定额门幅,BOM_计划门幅,BOM_颜色') ->where('BOM_工单编号', $param['订单编号']) ->where('Mod_rq', null) ->select(); // 用于统计每个物料的用料情况 $uniqueFabricData = []; // 去重后的面料数据 foreach ($getAllFabricData as $fabric) { $key = $fabric['BOM_颜色'] . '-' . $fabric['BOM_物料名称']; // 以颜色和物料名称为唯一标识 $uniqueFabricData[$key] = $fabric; // 使用唯一标识作为数组的键,自动去重 } // 重建数组索引,移除键名 $uniqueFabricData = array_values($uniqueFabricData); $materialUsage = []; // 遍历每种颜色的统计数据 foreach ($colorData as $color => $data) { // 遍历去重后的面料数据 foreach ($uniqueFabricData as $fabric) { // 判断颜色是否匹配 if ($fabric['BOM_颜色'] === $color) { // 直接统计每个物料的数量,而不进行用料的计算 $materialUsage[$color][$fabric['BOM_物料名称']][] = $fabric; // 使用物料名称作为键,存储所有相关的面料数据 } } } // 生成实际用料数据 $actualUsage = []; foreach ($materialUsage as $color => $materials) { foreach ($materials as $materialName => $fabricData) { // 获取该颜色下的 sctotal 和 zdtotal $sctotal = isset($colorData[$color]['sctotal']) ? $colorData[$color]['sctotal'] : 0; $zdtotal = isset($colorData[$color]['zdtotal']) ? $colorData[$color]['zdtotal'] : 0; // 获取定额门幅和计划门幅 $standardWidth = isset($fabricData[0]['BOM_定额门幅']) ? $fabricData[0]['BOM_定额门幅'] : 0; $plannedWidth = isset($fabricData[0]['BOM_计划门幅']) ? $fabricData[0]['BOM_计划门幅'] : 0; // 直接根据去重后的面料数据进行统计 $actualUsage[] = [ '颜色' => $color, '物料名称' => $materialName, '定额门幅' => $standardWidth, '计划门幅' => $plannedWidth, 'sctotal' => $sctotal, 'zdtotal' => $zdtotal ]; } } foreach ($actualUsage as &$item) { // 如果 'sctotal' 或 '定额门幅' 为空,则默认为 0 $sctotal = isset($item['sctotal']) && is_numeric($item['sctotal']) ? $item['sctotal'] : 0; $demf = isset($item['定额门幅']) && is_numeric($item['定额门幅']) ? $item['定额门幅'] : 0; $zdtotal = isset($item['zdtotal']) && is_numeric($item['zdtotal']) ? $item['zdtotal'] : 0; $jhmf = isset($item['计划门幅']) && is_numeric($item['计划门幅']) ? $item['计划门幅'] : 0; $item['实际用料'] = $sctotal * $demf; $item['计划用料'] = $zdtotal * $jhmf; } // 选择显示的字段 $fieldsToShow = ['颜色', '物料名称', '实际用料', '计划用料']; $finalResult = array(); foreach ($actualUsage as $item) { $filteredItem = array(); foreach ($fieldsToShow as $field) { if (isset($item[$field])) { $filteredItem[$field] = $item[$field]; } } $finalResult[] = $filteredItem; } //定义接口 $this->success('成功', [ 'list' => $gdlist, 'colorremark' => $colorremark, 'fetchCategory' => $groupedCategories, 'FabricData' => $fabricArr, 'size' => $sizes, '面料统计' => $finalResult ]); } /** * 1.3新增次品或返工 * 新增到设备_质量汇总表 */ public function ApiAddDefective(){ if (!$this->request->isPost()) { $this->error('非法请求'); } $params = $this->request->param(); if (empty($params)){ $this->error('参数错误'); } $res = \db('设备_质量汇总')->where('mod_rq', null)->order('status_num desc')->find(); //记录每次新增次数排序,判断是否有返回值,没有则从1开始 $status_num = isset($res['status_num']) ? $res['status_num'] : 1; // 构建单条记录的函数,传递 $list_gd 作为参数 function buildRecords($item,$status_num) { // 拆分物料名称(假设格式为 面料分类-面料名称) $materialParts = explode('-', $item['物料名称']); // 面料分类 $materialCategory = isset($materialParts[0]) ? $materialParts[0] : ''; // 面料名称 $materialName = isset($materialParts[1]) ? $materialParts[1] : ''; // 获取最新的单据编号 $resd = \db('设备_质量汇总') ->field('单据编号') ->where('mod_rq', null) ->order('单据编号 desc') ->find(); // 获取当前日期 $currentDate = date('Ymd'); // 如果查询到最新的单据编号 if ($resd) { // 提取最新单据编号的日期和流水号部分 preg_match('/ZL(\d{8})(\d{4})/', $resd['单据编号'], $matches); // 如果匹配成功,进行累加 if ($matches) { $lastDate = $matches[1]; $lastNumber = (int)$matches[2]; // 将流水号转为数字 // 如果当前日期和最新单据的日期不同,则从0001开始 $newNumber = ($currentDate !== $lastDate) ? '0001' : str_pad($lastNumber + 1, 4, '0', STR_PAD_LEFT); } else { // 如果没有匹配到正确的格式,则从0001开始 $newNumber = '0001'; } } else { // 如果没有查询到单据编号,默认从0001开始 $newNumber = '0001'; } return [ '单据编号' => 'ZL' . $currentDate . $newNumber, '订单编号' => $item['订单编号'], '生产款号' => $item['生产款号'], '款式' => $item['款式'], '颜色' => $item['颜色'], '尺码' => $item['尺码'], '数量' => $item['数量'], '组别' => $item['组别'], '实际用料' => $item['实际用料'], '计划用料' => $item['计划用料'], '备注' => $item['备注'], '问题分类' => $item['问题分类'], 'sczl_rq' => date('Y-m-d H:i:s'), 'Sys_rq' => $item['Sys_rq'], 'Sys_id' => $item['Sys_id'], '状态' => $item['状态'], 'status_num' => $status_num + 1, '面料分类' => $materialCategory, '面料名称' => $materialName, ]; } // 检查是否是索引数组(多条记录) if (isset($params[0]) && is_array($params[0])) { foreach ($params as $item) { $list[] = buildRecords($item,$status_num); } } else { // 处理单条记录 $list[] = buildRecords($params,$status_num); } // 插入前统计问题分类的使用次数 foreach ($list as $item) { $category = $item['问题分类']; // 查询满足 问题类型 + classification 的记录 $record = \db('db_问题分类') ->where('问题类型', $category) // 可选,防止 null 报错 ->whereNotNull('classification') ->find(); if ($record) { $newNum = intval($record['num']) + 1; // 使用 update 替代 setInc,手动加1 $updateSql = \db('db_问题分类')->fetchSql(true) ->where('id', $record['id']) // 建议用主键精确定位 ->update(['num' => $newNum]); \db()->query($updateSql); } } $result = \db('设备_质量汇总')->insertAll($list); if ($result) { $this->success('数据插入成功 : ' . date('H:i:s')); } else { $this->error('数据插入失败'); } } /** * 1.4质量管理左侧菜单栏查询 */ public function ApiMouthlist() { // 检查请求类型是否为GET if ($this->request->isGet() === false) { $this->error('请求错误'); } $param = $this->request->param(); // 查询符合条件的数据 $list = \db('设备_质量汇总') ->where('状态', $param['code']) ->where('mod_rq', null) ->order('Sys_rq desc') ->group('Sys_rq') ->select(); if (empty($list)) { $this->success('成功', ''); return; //$this->error('未查询到数据'); } // 用于存储按年和月分类的数据 $data = []; // 遍历查询结果,将日期按年、月分组 foreach ($list as $item) { // 获取 Sys_rq 字段的值(日期) $sys_rq = $item['Sys_rq']; // 提取年、月、日 $year = date('Y', strtotime($sys_rq)); $month = date('Y-m', strtotime($sys_rq)); $day = date('Y-m-d', strtotime($sys_rq)); // 将数据按年、月、日分类 if (!isset($data[$year])) { $data[$year] = []; } if (!isset($data[$year][$month])) { $data[$year][$month] = []; } // 将日期加入到对应的年、月下 $data[$year][$month][] = $day; } $this->success('成功', $data); } /** * 1.5查询单据汇总次片、返工列表数据 */ public function ApiSubPieceAnd() { if ($this->request->isGet() === false) { $this->error('请求错误'); } $params = $this->request->param(); $where = ['mod_rq' => null]; if (!empty($params['code'])) { $where['状态'] = $params['code']; } if (!empty($params['组别'])) { $where['组别'] = $params['组别']; } if (!empty($params['search'])) { $where['单据编号|订单编号|生产款号|面料名称|面料分类|颜色|问题分类|款式|组别'] = ['like', '%' . $params['search'] . '%']; } // 处理日期查询(支持按天和按月) if (!empty($params['Sys_rq'])) { if (preg_match('/^\d{4}-\d{2}-\d{2}$/', $params['Sys_rq'])) { // 按天查询 $where['Sys_rq'] = $params['Sys_rq']; } elseif (preg_match('/^\d{4}-\d{2}$/', $params['Sys_rq'])) { // 按月查询 $where['Sys_rq'] = ['like', $params['Sys_rq'] . '%']; }elseif (preg_match('/^\d{4}$/', $params['Sys_rq'])) { // 按年查询 //需要年份查询将代码屏蔽取消 // $where['Sys_rq'] = $params['Sys_rq']; $this->success('成功', ['data' => '', 'total' => '']); } } $data = \db('设备_质量汇总') ->field('单据编号,订单编号,生产款号,面料名称,面料分类,问题分类,颜色,数量,款式,Sys_rq,尺码,组别') ->where($where) ->select(); $mergedData = []; foreach ($data as $item) { //一条数据 if (!isset($mergedData[$item['单据编号']])) { $mergedData[$item['单据编号']] = [ '单据编号' => $item['单据编号'], '订单编号' => $item['订单编号'], '款式' => $item['款式'], '生产款号' => $item['生产款号'], '问题分类' => $item['问题分类'], '颜色' => $item['颜色'], '面料名称' => $item['面料名称'], '面料分类' => $item['面料分类'], '数量' => $item['数量'], '组别' => $item['组别'], '尺码' => $item['尺码'], 'Sys_rq' => $item['Sys_rq'] ]; } else { // 多条合并数据、数量进行累加 $mergedData[$item['单据编号']]['问题分类'] = implode(',', array_unique(array_filter(array_merge(explode(',', $mergedData[$item['单据编号']]['问题分类']), [$item['问题分类']])))); $mergedData[$item['单据编号']]['颜色'] = implode(',', array_unique(array_filter(array_merge(explode(',', $mergedData[$item['单据编号']]['颜色']), [$item['颜色']])))); $mergedData[$item['单据编号']]['面料名称'] = implode(',', array_unique(array_filter(array_merge(explode(',', $mergedData[$item['单据编号']]['面料名称']), [$item['面料名称']])))); $mergedData[$item['单据编号']]['面料分类'] = implode(',', array_unique(array_filter(array_merge(explode(',', $mergedData[$item['单据编号']]['面料分类']), [$item['面料分类']])))); $mergedData[$item['单据编号']]['订单编号'] = implode(',', array_unique(array_filter(array_merge(explode(',', $mergedData[$item['单据编号']]['订单编号']), [$item['订单编号']])))); $mergedData[$item['单据编号']]['生产款号'] = implode(',', array_unique(array_filter(array_merge(explode(',', $mergedData[$item['单据编号']]['生产款号']), [$item['生产款号']])))); $mergedData[$item['单据编号']]['款式'] = implode(',', array_unique(array_filter(array_merge(explode(',', $mergedData[$item['单据编号']]['款式']), [$item['款式']])))); $mergedData[$item['单据编号']]['尺码'] = implode(',', array_unique(array_filter(array_merge(explode(',', $mergedData[$item['单据编号']]['尺码']), [$item['尺码']])))); $mergedData[$item['单据编号']]['组别'] = implode(',', array_unique(array_filter(array_merge(explode(',', $mergedData[$item['单据编号']]['组别']), [$item['组别']])))); $mergedData[$item['单据编号']]['数量'] += $item['数量']; } } $finalData = array_values($mergedData); $this->success('成功', ['data' => $finalData, 'total' => count($finalData)]); } /** * 1.6查询单据明细次片、返工列表数据 */ public function ApiSubPieceAndReworkList() { if ($this->request->isGet() === false) { $this->error('请求错误'); } $params = $this->request->param(); $where = ['mod_rq' => null]; // 状态查询 if (!empty($params['code'])) { $where['状态'] = $params['code']; } // 关键词模糊搜索 if (!empty($params['search'])) { $where['单据编号|订单编号|生产款号|面料名称|面料分类|颜色|问题分类'] = ['like', '%' . $params['search'] . '%']; } // 处理日期查询(支持按天和按月) if (!empty($params['Sys_rq'])) { if (preg_match('/^\d{4}-\d{2}-\d{2}$/', $params['Sys_rq'])) { // 按天查询(2025-03-27) $where['Sys_rq'] = $params['Sys_rq']; } elseif (preg_match('/^\d{4}-\d{2}$/', $params['Sys_rq'])) { // 按月查询(2025-03),匹配该月的所有数据 $where['Sys_rq'] = ['like', $params['Sys_rq'] . '%']; } } $res = \db('设备_质量汇总') ->where($where) ->limit(($params['page'] - 1) * $params['limit'], $params['limit']) ->order('sczl_rq','desc') ->select(); $this->success('获取成功', ['data' => $res, 'total' => count($res)]); } /** * 查询获取问题分类 */ public function getProblemCategories() { if (!$this->request->isGet()) { $this->error('请求错误'); } $params = $this->request->param(); // 仅查询未被删除的数据 $where = ['mod_rq' => null]; // 允许通过问题类型进行搜索 if (!empty($params['search'])) { $where['问题类型'] = ['like', '%' . $params['search'] . '%']; } $data = \db('db_问题分类')->where($where)->order('update_time desc')->select(); if (!$data) { $this->error('未查询到数据'); } $this->success('获取成功', ['data' => $data, 'total' => count($data)]); } /** * 添加问题分类接口 */ public function addProblemCategory() { if (!$this->request->isPost()) { $this->error('非法请求'); } $params = $this->request->param(); if (empty($params['问题类型'])) { $this->error('问题类型不能为空'); } $insertData = [ '问题类型' => $params['问题类型'], 'sys_id' => $params['sys_id'], 'classification' => $params['classification'], 'Sys_rq' => date('Y-m-d H:i:s') ]; $sql = \db('db_问题分类') ->fetchSql(true) ->insert($insertData); $res = \db()->query($sql); $this->success('添加成功'); } /** * 删除问题分类接口 */ public function deleteProblemCategory() { if (!$this->request->isPost()) { $this->error('非法请求'); } $params = $this->request->param(); if (empty($params['id'])) { $this->error('ID 不能为空'); } $updateData = [ 'mod_rq' => date('Y-m-d H:i:s') ]; $res = \db('db_问题分类')->where('id', $params['id'])->update($updateData); if ($res) { $this->success('删除成功'); } else { $this->error('删除失败'); } } /** * 机台设备查询 */ public function getMachineDeviceTypes(){ $res = \db('设备_基本资料') ->where('mod_rq', null) ->select(); $this->success('成功', [ 'list' => $res, ]); } /** * 设备_基本资料 * 更新机台设备 */ public function updateMachineDeviceTypes() { if (!$this->request->isPost()) { $this->error('非法请求'); } $params = $this->request->param(); if (empty($params['UniqId'])) { $this->error('UniqId 参数不能为空'); } $deviceData = [ // 'sys_sbID' => $params['sys_sbID'], // '工序' => $params['工序'], // '设备编号' => $params['设备编号'], // '生产工序' => $params['生产工序'], // '设备编组' => $params['设备编组'], // '组长' => $params['组长'], 'status' => $params['status'], ]; $result = \db('设备_基本资料') ->where('UniqId', $params['UniqId']) ->where('mod_rq', null) ->update($deviceData); if ($result) { $this->success('设备更新成功'); } else { $this->error('设备更新失败'); } } /** * 新增设备_基本资料 * 新增机台设备 */ public function addMachineDeviceTypes() { if (!$this->request->isPost()) { $this->error('非法请求'); } $params = $this->request->param(); // 生产工序与工序号的映射 $processMapping = [ '裁剪' => 2, '车缝' => 3, '手工' => 4, '总检' => 6, '大烫' => 5, '包装' => 7, ]; $productionProcess = $params['生产工序'] ?? ''; $UniqId = \db('设备_基本资料') ->field('UniqId') ->order('UniqId desc') ->find(); // 新的设备数据 $deviceData = [ 'UniqId' => $UniqId['UniqId'] + 1, 'sys_sbID' => $params['sys_sbID'], '工序' => $processMapping[$productionProcess], '设备编号' => $params['设备编号'], '生产工序' => $params['生产工序'], '设备编组' => $params['设备编组'], '组长' => $params['组长'], 'sys_id' => $params['sys_id'], 'sys_rq' => date('Y-m-d H:i:s'), 'status' => 1, ]; $result = \db('设备_基本资料')->fetchSql(true) ->insert($deviceData); $list_gd = \db()->query($result); if ($result) { $this->success('设备新增成功'); } else { $this->error('设备新增失败'); } } /** * 订单状态更新 */ public function Apigdstatus() { if (!$this->request->isPost()) { $this->error('非法请求'); } $params = $this->request->param(); $uniqids = explode(',', $params['Uniqid']); // 判断gd_statu是否为“3-已完工”,只判断一次 $isFinished = $params['gd_statu'] == '3-已完工'; foreach ($uniqids as $uniqid) { $uniqid = trim($uniqid); $updateData = [ 'gd_statu' => $params['gd_statu'] ]; // 如果是“已完工”,加上完工日期 if ($isFinished) { $updateData['工单完工日期'] = date('Y-m-d H:i:s'); } else { // 如果不是已完工,清空完工日期 $updateData['工单完工日期'] = null; } $ReportSql = \db('工单_基本资料')->where('Uniqid', $uniqid)->fetchSql(true)->update($updateData); \db()->query($ReportSql); } $this->success('订单状态更新成功'); } /** * 产品BOM资料 */ public function Apibomlistarr(){ if ($this->request->isGet() === false) { $this->error('请求错误'); } $param = $this->request->param(); $page = isset($param['page']) ? (int)$param['page'] : 1; // 默认第1页 $limit = isset($param['limit']) ? (int)$param['limit'] : 50; // 默认每页50条 $bomlist = Db::name('工单_bom资料') ->alias('a') ->field(' a.BOM_工单编号 as 订单编号, a.BOM_desc as 备注, a.BOM_库存总量 as 库存总量, a.BOM_面料结余 as 面料结余, a.BOM_实际门幅 as 实际门幅, a.BOM_物料编码 as 物料编码, a.BOM_物料名称 as 物料名称, a.BOM_投料单位 as 投料单位, a.BOM_标准用量 as 定额用料, a.BOM_计划用量 as 计划用料, a.BOM_实际用量 as 标准用料, a.Bom_领用数量 as 领用数量, a.BOM_退还数量 as 退还数量, a.BOM_退还数量 as 退还数量, a.Sys_ID, a.Sys_rq, a.UNIQID, a.物料分类 as 物料分类, a.BOM_计划门幅 as 计划门幅, a.BOM_定额门幅 as 定额门幅, b.生产款号, b.客户编号, b.款式 ') ->join('工单_基本资料 b', 'a.BOM_工单编号 = b.订单编号', 'left') // 多条件关联 ->where('a.BOM_工单编号|a.BOM_物料编码|a.BOM_物料名称|a.物料分类|b.生产款号|b.款式|b.客户编号', 'like', "{$param['search']}%") ->order('a.BOM_工单编号 desc') ->where('a.Mod_rq',null) ->limit(($page - 1) * $limit, $limit) ->select(); // 处理数据,去掉计划用料字段的小数点后多余的0 foreach ($bomlist as &$item) { // 转换为浮点数,去掉无意义的 0 $item['计划用料'] = floatval($item['计划用料']); } // 解除引用,防止意外修改 unset($item); $count = Db::name('工单_bom资料') ->where('Mod_rq',null) ->count(); $data['total'] = $count; $data['list'] = $bomlist; $this->success('成功',$data); } }