新功能FQC,主界面tab布局,第一页是FQC,上面表单下面表格。 表单内容有查询字段lotId,片...
बनाया गया: 28 जनवरी 2026
का उपयोग करके उत्तर दिया गया GPT-5.2 Thinking द्वारा Chat01
बनाया गया: 28 जनवरी 2026
का उपयोग करके उत्तर दिया गया GPT-5.2 Thinking द्वारा Chat01
新功能FQC,主界面tab布局,第一页是FQC,上面表单下面表格。 表单内容有查询字段lotId,片号unitId,查询按钮。
表格列有隐藏列lotRrn,unitRrn,显示列lotId,unitId,productId,lotStatus,tapeCount,dieTotalCount,fqcResult,fqcComments。fqcResult
列支持单击编辑,点击后显示下拉列表,可以选择OK和NG。fqcComments列点击后弹框输入内容,因为会输入的很多,所以采用弹框形式录入。点击弹框以外区域默认
输入完成,关闭弹框,内容保存在列中。表格提供一个保存按钮,点击保存,检查fqcResult列是否全部选择,然后获取表格内容ajax保存。
表格还有一个操作列,放在第一列。操作列有按钮:tape管理,附件管理。点击操作按钮需要弹框。tape管理弹框内容:表格显示tape信息,
tape信息表格列有:tapeId,ringId,binCode,binQty,goodBadFlag,binQtyNew.binQtyNew单击可编辑,只能输入正整数。表格的下面提供
按钮:保存和关闭。保存就要卡控是否有输入数量的行,如果有获取行内容,ajax传递后台。关闭就是关闭弹框。。附件管理:点击后弹框显示已上传附件信息,
附件信息以表格形式或者列表形式展示。已上传附件提供下载和查看。弹框有按钮:上传附件和关闭。上传附件就是可以选择文件上传,文件支持图片和Excel之类的。
第二页是跳步,上面表单下面表格。 表单内容有查询字段lotId,片号unitId,查询按钮。表格列有隐藏列lotRrn,unitRrn,显示列lotId,unitId,productId,lotStatus,tapeCount,dieTotalCount,fqcResult,fqcComments。
表格支持多选。选择行后,点击跳战按钮,显示弹框。弹框主体有工序routeId,工步operationId,备注comments,工序和工步不可输入,可以点击放大镜图标弹框选择。弹框实现先默认为空。
弹框确认逻辑是获取工序工步和勾选的行数据,ajax传递后台。
中英文固定字符fqc。中英文配置单独给出即可。
案例代码,关于ajax前后端使用
Ext.Ajax.request({
url: getContextPath() + '/tapeStoreIn.do',
method: 'POST',
requestMethod: 'queryStoredTapeInfo',
params: {
lotId: lotId,
unitId: unitId,
tapeId: tapeId,
page: page || 1,
limit: limit || 20
},
success: function(response){
layer.close(loadIndex);
var res = parseExtResponse(response);
if(res && (res.success || res.flag === true)){
var list = res.dataList || [];
texttable.reload('historyTable', { data: list, page: { curr: page || 1 } }); if(list.length === 0){ layer.msg(i18n_msg_tape_store_no_data, {icon:0}); } else { layer.msg(i18n_msg_tape_store_query_success, {icon:1}); } }else{ layer.msg((res && (res.msg || res.message)) || i18n_msg_tape_store_load_failed, {icon:2}); table.reload('historyTable', { data: [] }); } }, failure: function(){ layer.close(loadIndex); layer.msg(i18n_msg_tape_store_network_error, {icon:2}); } }); public Map<String, Object> queryStoredTapeInfo(Map<String, Object> params) { Map<String, Object> result = new HashMap<>(); try { String lotId = StringUtils.trimToEmpty(MapUtils.getStringCheckNull(params, "lotId")); String unitId = StringUtils.trimToEmpty(MapUtils.getStringCheckNull(params, "unitId")); String tapeId = StringUtils.trimToEmpty(MapUtils.getStringCheckNull(params, "tapeId")); // 分页参数 int page = MapUtils.getIntValue(params, "page", 1); int limit = MapUtils.getIntValue(params, "limit", 20); DieSortingTapeInfoBeol condition = new DieSortingTapeInfoBeol(); condition.setLikeLotId(lotId); condition.setLikeUnitId(unitId); if (StringUtils.isNotBlank(tapeId)) { condition.setTapeId(tapeId); } condition.setTapeStatus(DieSortingTapeStatusEnum.SHIP.getCode()); // 查询总数 int totalCount = lotSubService.countDieSortingTapeInfoBeolByCondition(condition); // 分页查询 int offset = (page - 1) * limit; List<DieSortingTapeInfoBeol> tapeInfoList = lotSubService.selectDieSortingTapeInfoBeolByConditionWithPage(condition, offset, limit); List<Map<String, Object>> dataList = new ArrayList<>(); if (CollectionUtils.isNotEmpty(tapeInfoList)) { for (DieSortingTapeInfoBeol tapeInfo : tapeInfoList) { Map<String, Object> tapeMap = new HashMap<>(); tapeMap.put("tapeId", tapeInfo.getTapeId()); tapeMap.put("lotId", tapeInfo.getLotId()); tapeMap.put("unitId", tapeInfo.getUnitId()); tapeMap.put("ringId", tapeInfo.getRingId()); tapeMap.put("binCode", tapeInfo.getBinCode()); tapeMap.put("binQty", tapeInfo.getBinQty()); tapeMap.put("tapeStatus", tapeInfo.getTapeStatus()); tapeMap.put("tapeStatusDesc", DieSortingTapeStatusEnum.SHIP.getDesc()); tapeMap.put("lastUpdateDate", tapeInfo.getLastUpdateDate()); tapeMap.put("lastUpdateBy", tapeInfo.getLastUpdateBy()); dataList.add(tapeMap); } } result.put("flag", true); result.put("success", true); result.put("dataList", dataList); result.put("count", totalCount); logger.info("查询已入库Tape成功,共{}条记录", dataList.size()); } catch (Exception e) { logger.error("查询已入库Tape失败:{}", e.getMessage(), e); result.put("flag", false); result.put("success", false); result.put("msg", e.getMessage()); } return result; } layui表格初始化不要用url查询,默认为空,后面采用ajax加载。 通过这个你应该明白我用的是struts,所以文件上传的实现,ext的ajax好像不行。文件提交到后台还得使用ftp上传到文件服务器。但是文件服务器目前没有提供,可以先上传到本地。仅供测试。 后端的表有-- Create table create table FQC_INFO ( fqc_id VARCHAR2(64) not null, lot_rrn NUMBER(20), lot_id VARCHAR2(64), unit_rrn NUMBER(20), unit_id VARCHAR2(64), fqc_result VARCHAR2(8), fqc_comments VARCHAR2(64), create_by VARCHAR2(64), create_date DATE, last_update_by VARCHAR2(64), last_update_date DATE ) tablespace TS_MYCIM_DAT pctfree 10 initrans 1 maxtrans 255 storage ( initial 64K minextents 1 maxextents unlimited ); -- Add comments to the table comment on table FQC_INFO is 'FQC'; -- Add comments to the columns comment on column FQC_INFO.fqc_id is '主键'; comment on column FQC_INFO.lot_id is '批次号'; comment on column FQC_INFO.unit_id is '片号'; comment on column FQC_INFO.fqc_result is 'FQC结果,OK/NG'; -- Create/Recreate primary, unique and foreign key constraints alter table FQC_INFO add constraint PK_FQC_INFO primary key (FQC_ID) using index tablespace TS_MYCIM_DAT pctfree 10 initrans 2 maxtrans 255; -- Create table create table FQC_HISTORY ( trans_rrn NUMBER(20) not null, trans_seq NUMBER(4) not null, trans_id VARCHAR2(64), trans_comments VARCHAR2(64), fqc_id VARCHAR2(64) not null, lot_rrn NUMBER(20), lot_id VARCHAR2(64), unit_rrn NUMBER(20), unit_id VARCHAR2(64), fqc_result VARCHAR2(8), fqc_comments VARCHAR2(64) ) tablespace TS_MYCIM_HIST pctfree 10 initrans 1 maxtrans 255 storage ( initial 64K minextents 1 maxextents unlimited ); -- Add comments to the table comment on table FQC_HISTORY is 'fqc历史'; -- Add comments to the columns comment on column FQC_HISTORY.fqc_id is '主键'; comment on column FQC_HISTORY.lot_id is '批次号'; comment on column FQC_HISTORY.unit_id is '片号'; comment on column FQC_HISTORY.fqc_result is 'FQC结果,OK/NG'; -- Create/Recreate primary, unique and foreign key constraints alter table FQC_HISTORY add constraint PK_FQC_HISTORY primary key (TRANS_RRN, TRANS_SEQ) using index tablespace TS_MYCIM_DAT pctfree 10 initrans 2 maxtrans 255; -- Create table create table FQC_FILES_INFO ( fqc_id VARCHAR2(64) not null, file_id VARCHAR2(64) not null, file_name VARCHAR2(64), file_path VARCHAR2(256), file_type VARCHAR2(16), file_size VARCHAR2(16), create_by VARCHAR2(64), create_date DATE ) tablespace TS_MYCIM_DAT pctfree 10 initrans 1 maxtrans 255 storage ( initial 64K minextents 1 maxextents unlimited ); -- Add comments to the table comment on table FQC_FILES_INFO is 'FQC附件'; -- Add comments to the columns comment on column FQC_FILES_INFO.fqc_id is '主键'; -- Create/Recreate primary, unique and foreign key constraints alter table FQC_FILES_INFO add constraint PK_FQC_FILES_INFO primary key (FQC_ID, FILE_ID) using index tablespace TS_MYCIM_DAT pctfree 10 initrans 2 maxtrans 255; -- Create table create table FQC_FILES_HISTORY ( trans_rrn NUMBER(20) not null, trans_seq NUMBER(4) not null, trans_id VARCHAR2(64), trans_comments VARCHAR2(64), fqc_id VARCHAR2(64) not null, file_id VARCHAR2(64) not null, file_name VARCHAR2(64), file_path VARCHAR2(256), file_type VARCHAR2(16), file_size VARCHAR2(16) ) tablespace TS_MYCIM_DAT pctfree 10 initrans 1 maxtrans 255 storage ( initial 64K minextents 1 maxextents unlimited ); -- Add comments to the columns comment on column FQC_FILES_HISTORY.fqc_id is '主键'; -- Create/Recreate primary, unique and foreign key constraints alter table FQC_FILES_HISTORY add constraint PK_FQC_FILES_HISTORY primary key (TRANS_RRN, TRANS_SEQ) using index tablespace TS_MYCIM_DAT pctfree 10 initrans 2 maxtrans 255; 这是我设计的表,对应的Java类可以命名为FqcInfo和FqcFilesInfo.历史表不需要类。事务有自己的类 public class TransactionLog implements java.io.Serializable { private long transRrn; private String transId; private Timestamp transStartTimestamp; private Timestamp transEndTimestamp; private String transPerformedBy; private Long transPerformedByUserRrn; private String comments; private Long transSequence; 对应的Java类我已经创建了。 界面中英文采用下面方式提供 i18n_lbl_fqc_transfer_src = "Available List";
i18n_lbl_fqc_transfer_dest = "Selected List";
i18n_btn_fqc_query = "Search";
i18n_btn_fqc_save = "Save";
i18n_btn_fqc_reset = "Reset";
jdbc接口实现案例:
@Override
public void deleteDieSortingTapeInfoBeol(String tapeId) {
String sql = "DELETE FROM BEOL_DIE_SORTING_TAPE_INFO WHERE TAPE_ID=?";
jdbcTemplate.update(sql, tapeId);
}
text@Override public DieSortingTapeInfoBeol selectDieSortingTapeInfoBeolById(String tapeId) { String sql = "SELECT * FROM BEOL_DIE_SORTING_TAPE_INFO WHERE TAPE_ID=?"; return jdbcTemplate.queryForObjectWithNull(sql, new Object[]{tapeId}, DieSortingTapeInfoMapper.ROW_MAPPER); }
界面的国际化,如果是body中间就采用:
<li class="layui-this"> <i class="layui-icon layui-icon-add-circle"></i> <mycim2:contentDisplay id="LBL_TAPE_STORE_TAB_STORE" default="Tape入库"/> </li> js中就采用: {field:'tapeId', title:i18n_lbl_tape_store_tape_id, width:250, align:'center'}, {field:'ringId', title:i18n_lbl_tape_store_ring_id, width:250, align:'center'}, {field:'binCode', title:i18n_lbl_tape_store_bin_code, width:120, align:'center'}, {field:'lotId', title:i18n_lbl_tape_store_lot_id, width:250, align:'center'}, {field:'unitId', title:i18n_lbl_tape_store_unit_id, width:250, align:'center'}, 给出界面代码,国际化配置,后端代码,jdbc的接口和实现。命名不要缩写,比如manager不要写成manag这种。 界面头部 <%@ page contentType="text/html;charset=UTF-8" %> <%@ page language="java" %><%@ taglib uri="struts-html" prefix="html" %>
<%@ taglib uri="struts-logic" prefix="logic" %>
<%@ taglib uri="struts-bean" prefix="bean" %>
<%@ taglib uri="mycim2" prefix="mycim2" %>