diff --git a/app/admin/controller/PdmPartitemIndex.php b/app/admin/controller/PdmPartitemIndex.php index 1df3b0f..6c6e4eb 100644 --- a/app/admin/controller/PdmPartitemIndex.php +++ b/app/admin/controller/PdmPartitemIndex.php @@ -146,6 +146,73 @@ class PdmPartitemIndex extends AdminController } return [$count, $list]; + } + + + /** + * 获取资源列表 + * @param array $params + * @return array + * @throws DataNotFoundException + * @throws DbException + * @throws ModelNotFoundException + */ + public static function dataListAll(array $params): array + { + $controller = new PdmPartitemIndex(); + + $where = $controller->buildSelectParams(); + $count = $controller->model->where($where)->count(); + $fieldList = $controller->model->getFields(); + $order = !array_key_exists('sort', $fieldList) ? 'id' : 'sort'; + $subQuery = $controller->model->field('id')->where($where)->order($order, 'desc')->buildSql(); + $subQuery = '( SELECT object.id FROM ' . $subQuery . ' AS object )'; + // $list = $this->model->with($this->relationModel)->where('id in' . $subQuery)->order($order, 'asc')->select()->toArray(); // 如果是'desc' list_to_tree 函数返回为空! + $list = $controller->model->with($controller->relationModel)->where('id in' . $subQuery)->order($order, 'asc')->select(); // 如果是'desc' list_to_tree 函数返回为空! + + foreach($list as $key => $value){ + // throw new \Exception(json_encode($value)); + // throw new \Exception(json_encode($list[$key]->admin['nickname'])); + $list[$key]['creator'] =__($list[$key]->admin == null?'': $list[$key]->admin['nickname']); + $list[$key]['parttype'] =__($list[$key]->pdmParttype ==null?'': $list[$key]->pdmParttype['name']); + $list[$key]['mfg_name'] =__($list[$key]->pdmMfgName == null ?'': $list[$key]->pdmMfgName['mfgname']); + $list[$key]['mpn'] =__($list[$key]->pdmPurchasecode == null ?'': $list[$key]->pdmPurchasecode['mpn']); + + // if($list[$key]->mfgname == null){ + // $list[$key]['mfg_name'] =''; + // }else{ + // $list[$key]['mfg_name'] =$list[$key]->mfgname['mfgname']; + // } + } + + $list = $list->toArray(); + if(!empty($list) && is_array($list)){ + $nodeid = array(); + foreach($list as $key => $value){ + if($value['pid'] == 0 ){ + $nodeid[] = $value['id']; + } + } + + foreach($list as $key => $value){ + if(!in_array($value['pid'],$nodeid) && $value['pid'] > 0){ + $nodeid[] = $value['pid']; + $nodevalue = $controller->model->find($value['pid']); + $nodevalue = $controller->model->find($value['pid'])->toArray(); + + if(!empty($nodevalue)){ + $list[] = &$nodevalue; + } + } + } + $list = list_sort_by($list,'id','asc'); + // usort($list, function($a, $b) { + // return $a['id'] <=> $b['id']; // 对 'id' 进行升序排序 + // }); + // throw new \Exception(json_encode($list)); + } + return [$count, $list]; + } /** diff --git a/app/admin/controller/PdmPartitemRelation.php b/app/admin/controller/PdmPartitemRelation.php index 29870da..8b0991e 100644 --- a/app/admin/controller/PdmPartitemRelation.php +++ b/app/admin/controller/PdmPartitemRelation.php @@ -212,7 +212,7 @@ class PdmPartitemRelation extends AdminController $where = ['partnumber' => $partnumbertemp]; // $partnumbertemp1 = PdmPartitemIndexModel::find($partnumbertemp)->toArray(); $partnumbertemp1 = PdmPartitemIndexModel::where($where)->select()->toArray(); - list($countpartnumberIndex, $partitemIndex) = \app\admin\controller\PdmPartitemIndex::dataList($partnumbertemp1); + list($countpartnumberIndex, $partitemIndex) = \app\admin\controller\PdmPartitemIndex::dataListAll($partnumbertemp1); if (request()->isPost()) { diff --git a/app/admin/controller/PdmPartlist.php b/app/admin/controller/PdmPartlist.php index 3343bda..f9b9e30 100644 --- a/app/admin/controller/PdmPartlist.php +++ b/app/admin/controller/PdmPartlist.php @@ -63,7 +63,8 @@ class PdmPartlist extends AdminController $limit = (int)input('limit', 10); $where = $this->buildSelectParams(); $fieldList = $this->model->getFields(); - $order = !array_key_exists('sort', $fieldList) ? 'id' : 'sort'; + // $order = !array_key_exists('sort', $fieldList) ? 'id' : 'sort'; + $order = 'id' ; $where[] = ['pid','in',$pid]; if (!empty($post['keyword'])) { @@ -77,7 +78,13 @@ class PdmPartlist extends AdminController } // throw new \Exception(json_encode($where)); $count = $this->model->where($where)->count(); - $subQuery = $this->model->field('id')->where($where)->order($order, 'desc')->limit($limit)->page($page)->buildSql(); + $export = input('export',0); + if($export>0){ + $subQuery = $this->model->field('id')->where($where)->order($order, 'asc')->buildSql(); // asc or desc + }else{ + $subQuery = $this->model->field('id')->where($where)->order($order, 'asc')->limit($limit)->page($page)->buildSql(); + } + $subQuery = '( SELECT object.id FROM ' . $subQuery . ' AS object )'; $list = $this->model->with($this->relationModel)->where('id in' . $subQuery)->order($order, 'asc')->select() // 如果是'desc' list_to_tree 函数返回为空! // $list = $this->model->where($where)->limit((int)$limit)->page((int)$page)->select() @@ -99,4 +106,59 @@ class PdmPartlist extends AdminController } + /** + * 更新数据到CIS数据表 + * @return Response + * @throws DbException + */ + public function sync(): Response + { + //$lists = json_decode( input('data')); + $lists = input('data'); + $bomid = input('bomid') ; + // throw new \Exception(json_encode($lists)); + + if(!empty($bomid)){ + $status = $this->model->destroy(['pid' => $bomid]); + if($status){ + + } else{ + return $this->error('BOM ID:'.$bomid.',删除数据失败!'); + } + } + + foreach( $lists as &$item){ + // 添加或修改 'pid' 键 + $item['pid'] = $bomid; + // 检查 '备注' 键是否存在 + // if (isset($item['备注'])) { + // // 将 '备注' 的值赋给 'content' + // $item['content'] = $item['备注']; + // // 移除 '备注' 键 + // unset($item['备注']); + // } else { + // // 可选:如果 '备注' 键不存在,可以设置一个默认值或记录日志 + // $item['content'] = ''; // 或其他默认值 + // // error_log("缺少 '备注' 字段,键值: " . $key); + // } + // 可选:处理 'id' 键 + if (!empty($item['id'])) { + unset($item['id']); + } + } + // throw new \Exception(json_encode($lists)); + + $status = $this->model->saveAll($lists); + if($status){ + return $this->success('BOM ID:'.$bomid.'更新数据成功。'); + // return $this->success(); + } else{ + return $this->error('BOM ID:'.$bomid.',更新数据失败!'); + } + + return $this->error('更新失败,请检查您的参数!'); + } + + + } diff --git a/app/admin/controller/PdmPurchasecode.php b/app/admin/controller/PdmPurchasecode.php index 36b369e..8ec9bce 100644 --- a/app/admin/controller/PdmPurchasecode.php +++ b/app/admin/controller/PdmPurchasecode.php @@ -77,4 +77,33 @@ class PdmPurchasecode extends AdminController } + /** + * 修改资源状态 -EOL + * @return Response|void + */ + public function statusEol() + { + if (request()->isAjax()) { + + $where[] = ['id', '=', input('id')]; + if (!$this->authService->SuperAdmin() && $this->dataLimit + && in_array($this->dataLimitField, $this->model->getFields())) { + $where[] = [$this->dataLimitField, '=', get_admin_id()]; + } + + try { + $this->status = $this->model->where($where)->update(['eol' => input('eol')]); + } catch (\Throwable $th) { + return $this->error($th->getMessage()); + } + + if ($this->status) { + return $this->success(); + } + } + + return $this->error(); + } + + } diff --git a/app/admin/model/PdmPartlist.php b/app/admin/model/PdmPartlist.php index ee085a9..1a91220 100644 --- a/app/admin/model/PdmPartlist.php +++ b/app/admin/model/PdmPartlist.php @@ -40,7 +40,7 @@ class PdmPartlist extends Model */ public function partitemview() { - return $this->hasOne(\app\admin\model\PdmPartitemView::Class,'partnumber','partnumber')->bind(['purchasecode','parttype','value','description','mpn','mfgname','footprint','manufacture']); + return $this->hasOne(\app\admin\model\PdmPartitemView::Class,'partnumber','partnumber')->bind(['purchasecode','parttype','value','description','mpn','mfg','footprint','manufacture']); } // 字段修改器 diff --git a/app/admin/view/pdm_partitem_relation/add.html b/app/admin/view/pdm_partitem_relation/add.html index 07a74b9..9cca9a3 100644 --- a/app/admin/view/pdm_partitem_relation/add.html +++ b/app/admin/view/pdm_partitem_relation/add.html @@ -20,7 +20,7 @@ -->
- +
diff --git a/app/admin/view/pdm_partitem_relation/index.html b/app/admin/view/pdm_partitem_relation/index.html index 2c66f19..b30a42a 100644 --- a/app/admin/view/pdm_partitem_relation/index.html +++ b/app/admin/view/pdm_partitem_relation/index.html @@ -312,12 +312,12 @@ // 确认用户希望导出全部数据 layer.confirm('确定更新所有数据到 CIS数据表 吗?', { icon: 3, title: '更新确认' }, function(index){ layer.close(index); - exportAllDataToExcel(); + updataAllCis(); }); }); // 自定义导出功能 - function exportAllDataToExcel(){ + function updataAllCis(){ // 获取当前的过滤条件(例如,pid) // let selectedData = table.checkStatus('lay-tableGroup').data; // let pid = selectedData.length ? selectedData[0].id : 0; diff --git a/app/admin/view/pdm_partlist/index.html b/app/admin/view/pdm_partlist/index.html index b030cb5..7590c38 100644 --- a/app/admin/view/pdm_partlist/index.html +++ b/app/admin/view/pdm_partlist/index.html @@ -143,21 +143,39 @@ + + + + + +
- +
+
+ + +
@@ -313,7 +331,10 @@ let $ = layui.jquery; let table = layui.table; let form = layui.form; - let count = {$count|default=300}; + // let count = {$count|default=300}; + + let bomname =""; + let bomid = ""; // 定义表格URL let tableURL = "{:url('/PdmPartlist/index')}"; @@ -327,11 +348,55 @@ , page: true , limit: 18 , cols: [[ - { type: 'radio', align: 'left', title: '{:__("ID")}' }, + { type: 'radio', align: 'left' }, + { field: 'id', title: '{:__("ID")}' }, { field: 'partnumber', align: 'center', title: '{:__("BOM编码")}' }, // { field: 'reference', align: 'center', title: '{:__("位号")}' }, { field: 'content', align: 'center', title: '{:__("备注")}' }, ]] + ,done: function(res, curr, count) { + if (res.data.length > 0) { + // 获取第一行数据 + // let firstRow = res.data[0]; + let data = table.checkStatus('lay-tableGroup').data; + let ids = []; + + // console.log('data:'+ JSON.stringify(data)); + + // 处理选中行的数据 + handleSelectedRow(data); + + for (const key in data) { + ids.push(data[key].id); + bomid = data[key].id; + bomname = data[key].partnumber; + } + + let url = tableURL + '?pid=' + ids.join(','); + table.reloadData('lay-tableList', { + url: url + }); + + + // // 重新加载关联表格数据 + // let ids = res.data.map(item => item.id); + // let url = tableURL + '?pid=' + ids.join(','); + + // table.reload('lay-tableList', { + // url: url, + // where: { pid: ids.join(',') } // 传递必要的参数 + // }); + + // 模拟点击第一行的 radio + setTimeout(function(){ + let firstRadio = $('tr.layui-table-body tbody tr').first().find('.layui-form-radio'); + firstRadio.addClass('layui-form-radioed'); + firstRadio.find('input[type="radio"]').prop('checked', true).trigger('change'); + }, 100); // 延迟以确保 DOM 渲染完成 + + console.log('bomid:'+bomid+',bomname:'+bomname); + } + } }) // 基础表格 @@ -341,8 +406,9 @@ ,toolbar: '#tableButton' // ,defaultToolbar: ['filter', 'exports', 'print', 'search'] ,defaultToolbar: ['filter', 'print', 'search'] + , cellMinWidth: 80 , page: true - //, page: false + //, page: false , limit: 18 , cols: [[ {type: 'checkbox'}, @@ -355,7 +421,7 @@ { field: 'value', align: 'left', width: 100,title: '{:__("Value")}' }, { field: 'description', align: 'left', width: 200,title: '{:__("Description")}' }, { field: 'mpn', align: 'left', width: 150,title: '{:__("MPN")}' }, - { field: 'mfgname', align: 'left', width: 150,title: '{:__("MFG")}' }, + { field: 'mfg', align: 'left', width: 150,title: '{:__("MFG")}' }, { field: 'footprint', align: 'left', width: 150,title: '{:__("Footprint")}' }, { field: 'manufacture', align: 'left', width: 120,title: '{:__("Manufacture")}' }, @@ -364,11 +430,19 @@ // {field: 'sort', align: 'center', width: 135, title: '{:__("排序号")}'}, { field: 'quantity', align: 'center', width: 100, title: '{:__("Quantity")}' }, { field: 'unit', align: 'center', width: 80, title: '{:__("Unit")}' }, - { field: 'content', align: 'left', title: '{:__("备注")}' }, + { field: 'content', align: 'left', title: '{:__("Remark")}' }, // {field: 'create_time', align: 'center', width: 180,title: '{:__("创建时间")}'}, { align: 'center', toolbar: '#tableBar', width: 135, fixed:'right', title: '{:__("操作")}' }, - ]] + ]] }) + + + // 定义处理选中行数据的函数 + function handleSelectedRow(row) { + $('#editforms').find('.pid').attr('value', row.id); + $('#editforms_bom').find('.pid').attr('value', row.id); + } + // 表格选择行事件 table.on('radio(lay-tableGroup)', function (obj) { let data = table.checkStatus('lay-tableGroup').data; @@ -385,8 +459,10 @@ // 获取最后点击 if (obj.checked === true) { - $('#editforms').find('.pid').attr('value', obj.data.id); - $('#editforms_bom').find('.pid').attr('value', obj.data.id); + handleSelectedRow(obj.data); + bomname = obj.data.partnumber; + bomid = obj.data.id; + console.log('bomid:'+bomid+',bomname:'+bomname); } } }); @@ -400,30 +476,41 @@ }); }); + + function isValidFilename(name) { + // 正则匹配非法字符 + const invalidChars = /[\\/:*?"<>|]/; + return !invalidChars.test(name); + } + // 自定义导出功能 - function exportAllDataToExcel(){ + function exportAllDataToExcel(){ + // 获取当前的过滤条件(例如,pid) let selectedData = table.checkStatus('lay-tableGroup').data; let pid = selectedData.length ? selectedData[0].id : 0; // 异步获取所有数据(不分页) layer.msg('异步获取所有数据(不分页),超时限制:30s'); + // 显示加载层 + const loadingIndex = layer.load(1, { shade: [0.3, '#fff'] }); + $.ajax({ - url: tableURL + "?pid=" + pid + "&export=1&limit=" +count ,// 后端需要根据 'export=1' 返回所有数据 - // method: 'GET', + url: tableURL + "?pid=" + pid + "&export=1", // 后端需要根据 'export=1' 返回所有数据 type: 'POST', dataType: 'json', timeout: 30000, success: function(res){ if(res.code === 200){ - layer.msg('获取数据总数:'+ res.data.length); + // layer.msg('获取数据总数: ' + res.data.length); let data = res.data; if(data.length === 0){ - layer.msg('没有数据可导出'); + layer.msg('没有数据可导出,BOM ID:'+bomid+'BOMname:'+bomname); + // 解析完成后关闭加载层 + layer.close(loadingIndex); return; } // 转换数据为 SheetJS 格式 - layer.msg('转换数据为 SheetJS 格式'); - // let worksheetData = data.map(row => { + // layer.msg('转换数据为 SheetJS 格式'); let worksheetData = data.map(row => { return { 'Item': row.item, @@ -433,34 +520,66 @@ 'Value': row.value, 'Description': row.description, 'MPN': row.mpn, - 'MFG': row.mfgname, + 'MFG': row.mfg, 'Footprint': row.footprint, 'Manufacture': row.manufacture, 'Reference': row.reference, 'Quantity': row.quantity, 'Unit': row.unit, - '备注': row.content, + 'Remark': row.content, // 添加其他需要导出的字段 }; }); // 创建工作簿和工作表 - layer.msg('创建工作簿和工作表'); + // layer.msg('创建工作簿和工作表'); let worksheet = XLSX.utils.json_to_sheet(worksheetData); let workbook = XLSX.utils.book_new(); XLSX.utils.book_append_sheet(workbook, worksheet, "BOM数据"); - // 生成 Excel 文件并下载,设置自定义文件名 - - const filename = "BOM_Export_" + new Date().toISOString().slice(0,10) + ".xlsx"; // 自定义文件名 - layer.msg('生成 Excel 文件并下载,设置自定义文件名:'+filename); - XLSX.writeFile(workbook, filename); - layer.msg('生成 Excel 文件并下载,文件名:'+filename); - } + // 解析完成后关闭加载层 + layer.close(loadingIndex); + + // 默认文件名 + const defaultFilename = bomname+" BOM_Export_" + new Date().toISOString().slice(0,10); + + // 弹出提示框让用户输入文件名 + layer.prompt({ + title: '请输入导出文件名', + formType: 0, // 0 = 输入框, 1 = 密码框, 2 = 多行文本 + value: defaultFilename, + area: ['800px', '200px'] // 设置提示框的宽度和高度 + // area: ['50%', '30%'] // 宽度为50%,高度为30% + }, function(value, index, elem){ + // 确保文件名不为空 + if(!value.trim()){ + layer.msg('文件名不能为空'); + return; + } + if(!isValidFilename(value.trim())){ + layer.msg('文件名包含非法字符'); + return; + } + // 确定文件名,添加 .xlsx 后缀 + const filename = value.trim() + ".xlsx"; + layer.msg('生成 Excel 文件并下载,文件名:' + filename); + // 生成并下载 Excel 文件 + XLSX.writeFile(workbook, filename); + layer.close(index); // 关闭提示框 + }); + } else { + layer.msg('获取数据失败,状态码:' + res.code); + // 解析完成后关闭加载层 + layer.close(loadingIndex); + } }, - error: function(res){ - layer.msg('数据获取失败,请稍后重试:'+res.msg); + error: function(xhr, status, error){ + layer.msg('数据获取失败,请稍后重试: ' + error); + // 解析完成后关闭加载层 + layer.close(loadingIndex); } + }); + } // 全局回调函数 @@ -499,5 +618,295 @@ return false; }) } + + let jsonData = []; + + + // 定义字段映射对象 + const fieldMapping = { + 'Item': 'item', + 'Partnumber': 'partnumber', + 'Parttype': 'parttype', + 'Purchasecode': 'purchasecode', + 'Value': 'value', + 'Description': 'description', + 'MPN': 'mpn', + 'MFG': 'mfg', + 'Footprint': 'footprint', + 'Manufacture': 'manufacture', + 'Reference': 'reference', + 'Quantity': 'quantity', + 'Unit': 'unit', + 'Remark': 'content' + // 添加其他需要映射的字段 + }; + + // 逆向转换函数 + function reverseTransform(data, mapping) { + return data.map(row => { + const originalRow = {}; + for (const [exportKey, originalKey] of Object.entries(mapping)) { + originalRow[originalKey] = row[exportKey]; + } + return originalRow; + }); + } + + + //当用户点击上传按钮时,触发隐藏的文件输入: + document.getElementById('uploadExcelBtn').addEventListener('click', function(){ + document.getElementById('excelFileInput').click(); + + }); + + document.getElementById('excelFileInput').addEventListener('change', function(event){ + + // 显示加载层 + const loadingIndex = layer.load(1, { shade: [0.3, '#fff'] }); + + const file = event.target.files[0]; + if(!file){ + layer.close(loadingIndex); + return; + } + + const reader = new FileReader(); + reader.onload = function(e){ + try { + const data = e.target.result; + let workbook; + try { + workbook = XLSX.read(data, { type: 'binary' }); + } catch (error) { + layer.msg('读取 Excel 文件失败,请检查文件格式。'); + return; + } + + // 假设导入第一个工作表 + const firstSheetName = workbook.SheetNames[0]; + const worksheet = workbook.Sheets[firstSheetName]; + + // 将工作表转换为 JSON + jsonData = XLSX.utils.sheet_to_json(worksheet, { defval: '' }); + + if(jsonData.length === 0){ + layer.msg('Excel 文件中没有数据。'); + layer.close(loadingIndex); + return; + } + // 在渲染之前进行验证 + if(!validateData(jsonData)){ + layer.close(loadingIndex); + return; + } + + layer.msg('Excel 文件数据读取成功,渲染数据表。'); + + // 渲染数据到表格 + renderDataTable(jsonData); + + // 显示同步按钮 + document.getElementById('syncButton').style.display = 'inline-block'; + + } catch (error) { + layer.msg('读取 Excel 文件失败,请检查文件格式。'); + } finally { + // 解析完成后关闭加载层 + layer.close(loadingIndex); + } + + + }; + + reader.onerror = function(){ + layer.msg('文件读取出现错误。'); + layer.close(loadingIndex); + }; + + // 读取文件为二进制字符串 + reader.readAsBinaryString(file); + + }); + + // 同步数据到数据库 + document.getElementById('syncButton').addEventListener('click', function(){ + if(jsonData.length === 0){ + layer.msg('没有可同步的数据。'); + return; + } + + // 显示加载层 + const loadingIndex = layer.load(1, { shade: [0.3, '#fff'] }); + + let syncurl = "{:url('/PdmPartlist/sync')}?bomid="+bomid; + + // fetch(syncurl + // , { + // method: 'POST' + // ,headers: { 'Content-Type': 'application/json' } + // ,body: JSON.stringify({ data: jsonData }) + // }) + // .then(response => response.json()) + // .then(data => { + // layer.msg('dddd'.data); + // if(data.success){ + // layer.msg('数据同步成功!'); + // } else { + // layer.msg('同步失败: ' + data.message); + // } + // }) + // .catch(error => { + // console.error('错误:', error); + // layer.msg('同步过程中发生错误'); + // }) + // .finally(() => { + // layer.close(loadingIndex); + // }); + + // 应用逆向转换 + const originalData = reverseTransform(jsonData, fieldMapping); + // console.log(originalData); + console.log(JSON.stringify({ data: originalData })); + + syncData(syncurl, originalData); + + }); + + function syncData(url, jsonData, retries = 3, retryDelay = 1000) { + let attempt = 0; + let loadingIndex; + + attempt++; + // 显示加载指示器 + loadingIndex = layer.load(1, { shade: [0.1, '#fff'] }); + + $.ajax({ + url: url, + // method: 'POST', // 使用 method 替代 type + type: 'POST', + dataType: 'json', // 预期服务器返回 JSON + contentType: 'application/json', // 发送的数据为 JSON + data: JSON.stringify({ data: jsonData }), // 序列化数据 + timeout: 30000, // 设置超时时间30秒 + }) + .done(function(res) { + if (res.code === 200) { + layer.msg('更新数据成功: ' + res.msg); + } else { + layer.msg('更新失败: ' + res.msg); + } + }) + .fail(function(jqXHR, textStatus, errorThrown) { + if (textStatus === 'timeout') { + if (attempt < retries) { + layer.msg(`请求超时,正在进行第 ${attempt} 次重试...`); + setTimeout(makeRequest, retryDelay); + } else { + layer.msg('请求超时,请稍后重试。'); + } + } else if (jqXHR.status === 0) { + layer.msg('网络错误,请检查您的网络连接。'); + } else if (jqXHR.status >= 500) { + layer.msg('服务器错误,请稍后再试。'); + } else if (jqXHR.status === 404) { + layer.msg('请求的资源未找到 (404)。'); + } else if (jqXHR.status === 401) { + layer.msg('未授权,请登录。'); + // 可选:重定向到登录页 + window.location.href = '/login'; + } else { + layer.msg('数据获取失败,请稍后重试: ' + errorThrown); + } + + // 可选:在控制台打印错误详情以便调试 + console.error('AJAX 错误:', jqXHR.responseText); + }) + .always(function() { + // 关闭加载指示器 + layer.close(loadingIndex); + }); + + } + + + function renderDataTable(data){ + // 提取表头(即对象的键) + const tableHeaders = Object.keys(data[0]).map(key => ({ + field: key, + title: key, + sort: true, // 可根据需要设置是否可排序 + // 可以根据需要添加其他属性,如宽度、对齐方式等 + })); + + // 渲染 LayUI 表格 + + // table.reloadData('lay-tableList', { + // data: data + // }); + + // 表格基本配置 + table.render({ + elem: '#dataTable', + data: data, + // cols: [tableHeaders], + cols: [tableHeaders.map(header => ({ + field: header.field, + title: header.title, + width: 150, // 设置指定宽度,如150px + // cellMinWidth:150, + sort: header.sort + }))], + toolbar: '#toolbarDemo', // 绑定工具栏模板 + page: true, // 是否显示分页 + limit: 20, // 默认每页显示数量 + height: 'full-200', // 设置表格高度,根据需要调整 + id: 'dataTableReload' + }); + + // 监听工具栏 + table.on('toolbar(dataTableFilter)', function(obj){ + + if(obj.event === 'export'){ + layer.msg('Excel dataTableFilter export'); + exportTableData(data); // 定义导出函数 + layer.msg('Excel dataTableFilter export end'); + } + }); + } + + + function validateData(data){ + // 示例:确保每行都有 "Item" 和 "Quantity" 字段 + for(let i = 0; i < data.length; i++){ + const row = data[i]; + if(!row.hasOwnProperty('Item') || !row.hasOwnProperty('Quantity')){ + layer.msg(`第 ${i+1} 行缺少必填字段。`); + return false; + } + // 可以添加更多的验证逻辑,如数据类型、值范围等 + } + layer.msg(`数据校验成功。`); + return true; + } + + + + // (可选)导出表格数据为 Excel + function exportTableData(data){ + layer.msg('Excel dataTableFilter --'); + // 使用 SheetJS 将数据转换为工作表 + const worksheet = XLSX.utils.json_to_sheet(data); + const workbook = XLSX.utils.book_new(); + XLSX.utils.book_append_sheet(workbook, worksheet, "导出数据"); + + // 生成 Excel 文件并下载 + const filename = "导出数据_" + new Date().toISOString().slice(0,10) + ".xlsx"; + XLSX.writeFile(workbook, filename); + } + + }); + + + \ No newline at end of file diff --git a/app/admin/view/pdm_purchasecode/add.html b/app/admin/view/pdm_purchasecode/add.html index f42059d..6742912 100644 --- a/app/admin/view/pdm_purchasecode/add.html +++ b/app/admin/view/pdm_purchasecode/add.html @@ -50,20 +50,20 @@
-
-
-
diff --git a/app/admin/view/pdm_purchasecode/index.html b/app/admin/view/pdm_purchasecode/index.html index 096aec4..1366c36 100644 --- a/app/admin/view/pdm_purchasecode/index.html +++ b/app/admin/view/pdm_purchasecode/index.html @@ -183,6 +183,16 @@ + + + + + + + \ No newline at end of file