package com.langtech.plm.bg; import java.awt.BorderLayout; import java.awt.Dimension; import java.awt.Toolkit; import java.awt.event.ActionEvent; import java.awt.event.ActionListener; import java.awt.event.MouseEvent; import java.awt.event.MouseListener; import java.io.File; import java.io.FileNotFoundException; import java.io.FileOutputStream; import java.io.IOException; import java.sql.Connection; import java.sql.PreparedStatement; import java.sql.ResultSet; import java.sql.SQLException; import java.text.DecimalFormat; import java.text.SimpleDateFormat; import java.time.LocalDate; import java.time.LocalDateTime; import java.time.format.DateTimeFormatter; import java.time.format.DateTimeParseException; import java.util.ArrayList; import java.util.Collection; import java.util.Collections; import java.util.Date; import java.util.HashMap; import java.util.LinkedHashMap; import java.util.List; import java.util.Map; import java.util.Map.Entry; import java.util.Set; import java.util.Vector; import javax.swing.BorderFactory; import javax.swing.DefaultCellEditor; import javax.swing.JButton; import javax.swing.JComboBox; import javax.swing.JFrame; import javax.swing.JLabel; import javax.swing.JPanel; import javax.swing.JScrollPane; import javax.swing.JTable; import javax.swing.JTextField; import javax.swing.ListSelectionModel; import javax.swing.RowSorter; import javax.swing.table.DefaultTableModel; import javax.swing.table.TableColumnModel; import javax.swing.table.TableModel; import javax.swing.table.TableRowSorter; import org.apache.poi.xssf.usermodel.XSSFCell; import org.apache.poi.xssf.usermodel.XSSFRow; import org.apache.poi.xssf.usermodel.XSSFSheet; import org.apache.poi.xssf.usermodel.XSSFWorkbook; import com.teamcenter.rac.aif.kernel.InterfaceAIFComponent; import com.teamcenter.rac.kernel.ListOfValuesInfo; import com.teamcenter.rac.kernel.TCComponent; import com.teamcenter.rac.kernel.TCComponentForm; import com.teamcenter.rac.kernel.TCComponentItem; import com.teamcenter.rac.kernel.TCComponentItemRevision; import com.teamcenter.rac.kernel.TCComponentListOfValues; import com.teamcenter.rac.kernel.TCComponentListOfValuesType; import com.teamcenter.rac.kernel.TCComponentProject; import com.teamcenter.rac.kernel.TCException; import com.teamcenter.rac.kernel.TCProperty; import com.teamcenter.rac.kernel.TCSession; import com.teamcenter.rac.util.DateButton; import com.teamcenter.rac.util.MessageBox; import com.teamcenter.rac.util.PropertyLayout; import com.teamcenter.soa.client.model.LovValue; public class QDRWRWFPDialog extends JFrame implements ActionListener { private Map textMap = new HashMap<>(); private TCSession session; private JTable table; private String[] header; private ArrayList gsPrefTopLine; private LinkedHashMap gsPrefMap = new LinkedHashMap(); private LinkedHashMap fieldsMap = new LinkedHashMap(); private LinkedHashMap cfdjPref = new LinkedHashMap(); private LinkedHashMap lovPositionMap = new LinkedHashMap(); private LinkedHashMap positionFieldMap = new LinkedHashMap(); private LinkedHashMap widtheMap = new LinkedHashMap(); //public static final int[] HEADERWIDTH = new int[] { 50, 100, 200, 200, 100, 100, 80, 80, 100, 150, 150, 150, 150,150, 150, 150, 150, 150, 150 }; private SimpleDateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd"); private DefaultTableModel dtm1; private JButton yyButton = new JButton("应用"); private JButton gbButton = new JButton("关闭"); private JComboBox cfdJComboBox = new JComboBox(); private DateButton cfsjButton; private JButton tzsjButton = new JButton("调整时间"); private static ArrayList dateConnList = new ArrayList(); private String type; private String id; private ArrayList canWriteColume = new ArrayList(); public QDRWRWFPDialog(TCSession session,String type,String id) { // TODO Auto-generated constructor stub this.session = session; this.type = type; this.id = id; initUI(); } public void initUI() { // TODO Auto-generated method stub this.setTitle("任务分配表"); this.setLayout(new BorderLayout()); String[] cfdj = session.getPreferenceService().getStringValues("Connor_ChangeTaskForm_TriggerLevelMapping"); if (cfdj == null || cfdj.length <= 0) { MessageBox.post("请配置首选项“Connor_ChangeTaskForm_TriggerLevelMapping”", "提示 ", MessageBox.INFORMATION); return; } for (int i = 0; i < cfdj.length; i++) { String[] split = cfdj[i].split("="); if(split[0].equals(type)) { String[] split2 = split[1].split(";"); for (int j = 0; j < split2.length; j++) { String[] split3 = split2[j].split("\\|"); cfdjPref.put(split3[0],split3[1]); cfdJComboBox.addItem(split3[0]); } break; } } //获取首选项匹配的类型 String[] fields = session.getPreferenceService().getStringValues("Connor_ECRECNForm_Datbase_Config"); if (fields == null || fields.length <= 0) { MessageBox.post("请配置首选项“Connor_ECRECNForm_Datbase_Config”", "提示 ", MessageBox.INFORMATION); return; } for (int i = 0; i < fields.length; i++) { if(fields[i].contains(type)) { String[] split = fields[i].split("\\|"); if(split.length == 2) { String[] split2 = split[1].split(";"); for (int j = 0; j < split2.length; j++) { String[] split3 = split2[j].split("="); positionFieldMap.put(split3[0],j); if(split3.length == 3) { fieldsMap.put(split3[0],split3[1]); if(split3[2].contains("%")) { String[] split4 = split3[2].split("%"); widtheMap.put(j, Integer.parseInt(split4[0])); canWriteColume.add(j); }else { widtheMap.put(j, Integer.parseInt(split3[2])); } }else if(split3.length == 4) { fieldsMap.put(split3[0],split3[1]); System.out.println("split3[2]========"+split3[2]); if(split3[2].contains("%")) { String[] split4 = split3[2].split("%"); widtheMap.put(j, Integer.parseInt(split4[0])); System.out.println("split4[0]========"+split4[0]); canWriteColume.add(j); }else { widtheMap.put(j, Integer.parseInt(split3[2])); } lovPositionMap.put(j,split3[3]); } } } } } System.out.println("canWriteColume====="+canWriteColume.size()); System.out.println("fieldsMap====="+fieldsMap); System.out.println("positionMap====="+lovPositionMap); System.out.println("widtheMap====="+widtheMap); Collection valuesCollection = fieldsMap.values(); // 将集合转换为数组 header = valuesCollection.toArray(new String[0]); JPanel topPanel = getTopPanel(); JScrollPane pane = getTablePanel(); pane.setBorder(BorderFactory.createTitledBorder("")); // JPanel btnPanel = getRightPanel(); JPanel bottomPane = getBottomPanel(); this.add(topPanel, BorderLayout.NORTH); this.add(pane, BorderLayout.CENTER); this.add(bottomPane, BorderLayout.SOUTH); this.createActionEvent(); this.pack(); this.setPreferredSize(new Dimension(1850, 1000)); this.validate(); this.setVisible(true); // 设置窗口在屏幕中心 // Dimension screensize = Toolkit.getDefaultToolkit().getScreenSize(); // int x = (int) screensize.getWidth() / 2 - window.getWidth() / 2; // int y = (int) screensize.getHeight() / 2 - window.getHeight() / 2; this.setLocationRelativeTo(null); //设置列宽 TableColumnModel colModel = table.getColumnModel(); for (Entry map : widtheMap.entrySet()) { colModel.getColumn(map.getKey()).setPreferredWidth(map.getValue()); } String[] value = session.getPreferenceService().getStringValues("LD_dbinfo2"); if (value == null || value.length == 0) { MessageBox.post("首选项LD_dbinfo2配置有误,请检查。", "提示", 2); return; } else { Collections.addAll(dateConnList, value); } Set keySet = fieldsMap.keySet(); String fieldsSql = ""; for (String string : keySet) { fieldsSql += string + ","; } fieldsSql = fieldsSql.substring(0, fieldsSql.length() - 1); System.out.println("fieldsSql=========="+fieldsSql); String sqlString = "SELECT " + fieldsSql + " FROM LY_CHANGETASSKFORM_DETAILS where ID='" + id + "'"; System.out.println(sqlString); Connection conn = getConn(); PreparedStatement stmt = null; try{ stmt = conn.prepareStatement(sqlString); ResultSet result = stmt.executeQuery(); while (result.next()) { ArrayList arList = new ArrayList(); for (int i = 0; i < fieldsMap.size(); i++) { System.out.println("result.getString(i+1)==========="+result.getString(i+1)); arList.add(result.getString(i+1) == null? result.getString(i+1) : validateAndFormatDate(result.getString(i+1))); } dtm1.addRow(arList.toArray(new Object[0])); } } catch (SQLException e1) { e1.printStackTrace(); } try { if(stmt != null) { stmt.close(); } if(conn != null) { conn.close(); } } catch (SQLException e) { // TODO Auto-generated catch block e.printStackTrace(); } } public void createActionEvent() { this.yyButton.addActionListener(this); this.gbButton.addActionListener(this); this.tzsjButton.addActionListener(this); } // 查询部分 private JPanel getTopPanel() { // TODO Auto-generated method stub JPanel topPanel = new JPanel(); topPanel.setLayout(new PropertyLayout()); topPanel.add("1.1.left.center", new JLabel("触发等级 ")); topPanel.add("1.2.left.center",cfdJComboBox); topPanel.add("1.3.left.center", new JLabel(" 触发时间 ")); cfsjButton = new DateButton(null, "yyyy-MM-dd", false, false, false); cfsjButton.setDate("未设置日期"); topPanel.add("1.4.left.center", cfsjButton); topPanel.add("1.5.left.center", new JLabel(" ")); topPanel.add("1.6.left.center", tzsjButton); topPanel.add("2.1.left.center", new JLabel(" ")); return topPanel; } // 查询部分 private JPanel getBottomPanel() { // TODO Auto-generated method stub JPanel bottomPanel = new JPanel(); bottomPanel.setLayout(new PropertyLayout()); bottomPanel.add("1.1.left.center", new JLabel(" ")); bottomPanel.add("1.2.left.center", yyButton); bottomPanel.add("1.3.left.center", new JLabel(" ")); bottomPanel.add("1.4.left.center", gbButton); return bottomPanel; } private JScrollPane getTablePanel() { // TODO Auto-generated method stub table = getjTable(null, null, header, null, false); table.setRowHeight(30); // table.setPreferredSize(new Dimension(1500,400)); table.setAutoResizeMode(JTable.AUTO_RESIZE_OFF); // 设置表格的自动调整模式为关闭自动调整 // table.setAutoResizeMode(JTable.AUTO_RESIZE_OFF);//设置JTable的列宽随着列表内容的大小进行调整 // table.setPreferredSize(new Dimension(1200,400)); JScrollPane pane = new JScrollPane(table, JScrollPane.VERTICAL_SCROLLBAR_ALWAYS, JScrollPane.HORIZONTAL_SCROLLBAR_ALWAYS); for (Entry map : lovPositionMap.entrySet()) { JComboBox jComboBox = new JComboBox(); String value = map.getValue(); if(value.contains(",")) { String[] split = value.split(","); for (int i = 0; i < split.length; i++) { jComboBox.addItem(split[i]); } }else { jComboBox.addItem(value); } table.getColumnModel().getColumn(map.getKey()).setCellEditor(new DefaultCellEditor(jComboBox)); } pane.setPreferredSize(new Dimension(1800, 850)); pane.setViewportView(table);// 为scrollPane指定显示对象为table return pane; } /*** * Jtable通用方法 * * @param partsTable * @param dtm * @param titleNames * @param values * @return */ public JTable getjTable(JTable partsTable, DefaultTableModel dtm, Object[] titleNames, Object[][] values, Boolean isTable2) { // int simpleLen = 100; // int totleLen = 1000; if (partsTable == null) { partsTable = new JTable(this.getTableModel(dtm, titleNames, values)); partsTable.setRowHeight(20); partsTable.getTableHeader().setReorderingAllowed(false); partsTable.setSelectionMode(ListSelectionModel.MULTIPLE_INTERVAL_SELECTION); RowSorter sorter = new TableRowSorter(partsTable.getModel()); partsTable.setRowSorter(sorter); // for (int i = 0; i < titleNames.length; i++) { // if(i==2) { // partsTable.getColumnModel().getColumn(i).setPreferredWidth(200); // }else { // partsTable.getColumnModel().getColumn(i).setPreferredWidth(120); // } // // } } return partsTable; } public DefaultTableModel getTableModel(DefaultTableModel dtm, Object[] titleNames, Object[][] values) { dtm1 = null; if (dtm == null) { dtm1 = new DefaultTableModel(values, titleNames) { @Override public boolean isCellEditable(int row, int column) { if(canWriteColume.size() > 0) { for (int i = 0; i < canWriteColume.size(); i++) { if(canWriteColume.get(i) == column) { System.out.println("row=========="+row); return true; } } } return false; } }; } return dtm1; } @Override public void actionPerformed(ActionEvent e) { // TODO Auto-generated method stub Object source = e.getSource(); System.out.println("source==>+" + source); if (source.equals(this.gbButton)) { dispose(); } else if(source.equals(this.yyButton)){ //保存数据 Connection conn = getConn(); PreparedStatement stmt = null; for(int i = 0; i < table.getRowCount(); i++){ StringBuilder updateSql = new StringBuilder(); updateSql.append("update LY_CHANGETASSKFORM_DETAILS set "); for (Entry map : positionFieldMap.entrySet()) { updateSql.append(map.getKey()); String valueAt = (String)table.getValueAt(i,map.getValue()); if(valueAt == null || valueAt.isEmpty()) { updateSql.append("="); updateSql.append("null,"); }else { updateSql.append("='"); updateSql.append(table.getValueAt(i,map.getValue())); updateSql.append("',"); } } //去掉最后一个, updateSql.deleteCharAt(updateSql.length() - 1); updateSql.append(" where ID='"+id+"' and XH='"+table.getValueAt(i,0)+"'"); try { stmt = conn.prepareStatement(updateSql.toString()); System.out.println("updateSql========="+updateSql.toString()); stmt.execute(); } catch (SQLException e1) { // TODO Auto-generated catch block e1.printStackTrace(); } } try { if(stmt != null) { stmt.close(); } if(conn != null) { conn.close(); } } catch (SQLException e1) { // TODO Auto-generated catch block e1.printStackTrace(); } }else if(source.equals(this.tzsjButton)){ gsPrefTopLine = new ArrayList(); String selectedItem = (String)cfdJComboBox.getSelectedItem(); if(selectedItem == null || selectedItem.isEmpty()) { MessageBox.post("请选择触发等级!", "提示", 2); return; } Date date = cfsjButton.getDate(); if(date == null) { MessageBox.post("请选择触发时间!", "提示", 2); return; } String cfsjDate = dateFormat.format(date); String pref = cfdjPref.get(selectedItem); if(pref == null || pref.isEmpty()) { MessageBox.post("未配置触发等级相关的首选项!", "提示", 2); return; } String[] calculateTime = session.getPreferenceService().getStringValues(pref); if (calculateTime == null || calculateTime.length <= 0) { MessageBox.post("请配置首选项“"+pref+"”", "提示 ", MessageBox.INFORMATION); return; } for (int i = 0; i < calculateTime.length; i++) { String[] split = calculateTime[i].split("\\|"); if(i == 0) { for (int j = 0; j < split.length; j++) { gsPrefTopLine.add(split[j]); } }else { gsPrefMap.put(split[0],calculateTime[i]); } } System.out.println(positionFieldMap+"==================positionFieldMap"); System.out.println("gsPrefTopLine----------------"+gsPrefTopLine.size()); Integer xh = positionFieldMap.get(gsPrefTopLine.get(0)); //表里table 开始计算 for(int i = 0; i < table.getRowCount(); i++){ String xhStr = table.getValueAt(i, xh).toString(); String gsStr = gsPrefMap.get(xhStr); if(gsStr != null && !gsStr.isEmpty() ) { String[] split = gsStr.split("\\|"); for (int j = 1; j < gsPrefTopLine.size(); j++) { //如果有值 System.out.println("gsPrefTopLine.get(j)========"+gsPrefTopLine.get(j)); Integer colume = positionFieldMap.get(gsPrefTopLine.get(j)); if(colume != null) { System.out.println(positionFieldMap.get(gsPrefTopLine.get(j))+"=================positionFieldMap.get(gsPrefTopLine.get(j))"); //处理公式 String gs = split[j]; System.out.println("gs========"+gs); if(gs.equals("N")) { table.setValueAt(cfsjDate,i, colume); }else { String[] split2 = gs.split("N"); String time = calculateDate(cfsjDate, Integer.parseInt(split2[1])); System.out.println("time============"+time); table.setValueAt(time,i, colume); } } } } } //调用应用按钮 yyButton.doClick(); MessageBox.post("调整时间完成!", "提示", 2); } } // 获取数据库连接 public static Connection getConn() { Connection conn = null; try { conn = DbPool.getConnection(dateConnList.get(0), dateConnList.get(1)); } catch (Exception e) { // TODO Auto-generated catch block e.printStackTrace(); } return conn; } public static String calculateDate(String dateString, int daysToAdd) { // 定义日期格式 DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyy-MM-dd"); // 解析输入的日期字符串 LocalDate date; try { date = LocalDate.parse(dateString, formatter); } catch (DateTimeParseException e) { throw new IllegalArgumentException("Invalid date format. Please use yyyy-MM-dd.", e); } // 增加或减少天数 LocalDate resultDate = date.plusDays(daysToAdd); // 格式化结果日期为字符串 return resultDate.format(formatter); } public String validateAndFormatDate(String input) { // 定义输入和输出的日期格式 DateTimeFormatter inputFormatter = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss.S"); DateTimeFormatter outputFormatter = DateTimeFormatter.ofPattern("yyyy-MM-dd"); try { // 尝试解析输入的日期时间字符串 LocalDateTime dateTime = LocalDateTime.parse(input, inputFormatter); // 转换为只包含日期的LocalDate对象 LocalDate date = dateTime.toLocalDate(); // 格式化结果日期为字符串 return date.format(outputFormatter); } catch (DateTimeParseException e) { // 如果解析失败,说明输入不符合指定格式,返回原始字符串 return input; } } }