package com.qlm.controller.jinzai; import cn.hutool.core.collection.CollUtil; import cn.hutool.core.date.DateUtil; import com.alibaba.fastjson.JSON; import com.jfinal.aop.Clear; import com.jfinal.kit.HttpKit; import com.jfinal.kit.StrKit; import com.jfinal.plugin.activerecord.Db; import com.jfinal.plugin.activerecord.Page; import com.jfinal.plugin.activerecord.Record; import com.qlm.annotation.RequestUrl; import com.qlm.common.ApiResponse; import com.qlm.common.PageResult; import com.qlm.controller.common.CommonController; import com.qlm.dto.DeviceMonitorRecordDto; import com.qlm.dto.ItemModifyRecordDto; import com.qlm.dto.ItemModifyRecordVO; import com.qlm.dto.ProdTaskUploadRecordDto; import com.qlm.netty.constant.CommandType; import com.qlm.netty.manager.DeviceSessionManager; import com.qlm.netty.util.WhitelistValidator; import com.qlm.tools.WxUtil; import com.qlm.view.core.AdminView; import io.netty.channel.ChannelHandlerContext; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import java.math.BigInteger; import java.util.ArrayList; import java.util.HashMap; import java.util.List; import java.util.Map; import java.util.stream.Collectors; /** * @program: jinzaifoodadmin * @ClassName: ProdBatchController * @description: 生产批次管理 * @author: 吴英健 * @create: 2025-08-27 14:41 * @Version 1.0 **/ @RequestUrl("/prodBatch") public class ProdBatchController extends CommonController { private static final Logger logger = LoggerFactory.getLogger(ProdBatchController.class); /** * 生产任务上传记录路由 */ public void getProdUploadRecordPage() { renderJsp("/page/jinzai/production_task_upload.jsp"); } /** * 生产任务上传记录查询 */ public void getProdUploadRecord() { //分页参数 int pageNumber = getParaToInt("pageNumber", 1); int pageSize = getParaToInt("pageSize", 10); //创建时间、工厂ID、产线ID、WMS状态 String createTime = getPara("createTime"); String factoryId = getPara("factoryId"); String productName = getPara("productName"); String wmsStatus = getPara("wmsStatus"); try { StringBuilder whereSql = new StringBuilder(" from jinzai_upload_master_copy where 1=1"); List params = new ArrayList<>(); if(StrKit.notBlank(createTime)){ //创建时间 = whereSql.append(" and create_time = ?"); params.add(createTime); } // if(StrKit.notBlank(factoryId)){ // whereSql.append(" and factory_id = ?"); // params.add(factoryId); // } if(StrKit.notBlank(productName)){ whereSql.append(" and pinxiang like ?"); params.add("%" + productName + "%"); } // if(StrKit.notBlank(wmsStatus)){ // whereSql.append(" and wms_status = ?"); // } whereSql.append(" order by create_time desc"); Page paginate = Db.paginate(pageNumber, pageSize, "select *", whereSql.toString(), params.toArray()); if(paginate == null){ renderJson(new PageResult<>(0, pageNumber, pageSize, new ArrayList<>())); return; } List list = paginate.getList(); List prodTaskUploadRecordDtoList = new ArrayList<>(); for (Record record : list) { prodTaskUploadRecordDtoList.add(convertRecordToDto(record)); } renderJson(new PageResult<>(paginate.getTotalRow(), pageNumber, pageSize, prodTaskUploadRecordDtoList)); }catch (Exception e){ logger.error("查询生产任务上传记录异常:", e); renderJson(new PageResult<>(0, pageNumber, pageSize, new ArrayList<>())); } } /** * 补打信息记录路由 */ public void getProdRePrintRecordPage() { renderJsp("/page/jinzai/reprint_record.jsp"); } /** * 工控机监控记录路由 */ public void getProdMonitorRecordPage() { renderJsp("/page/jinzai/deviceMonitor.jsp"); } /** * 查询工控机监控记录 */ public void getDeviceMonitorList() { // 获取分页参数 int pageNumber = getParaToInt("pageNumber", 1); int pageSize = getParaToInt("pageSize", 10); Integer deviceId = getParaToInt("deviceId"); try { StringBuilder fromSql = new StringBuilder(" from t_device_detail tdd"); fromSql.append(" inner join t_jz_device tjd on tdd.device_id = tjd.id"); fromSql.append(" left join t_factory tf on tjd.factory_id = tf.id"); fromSql.append(" left join t_workshop tw on tjd.workshop_id = tw.id"); fromSql.append(" left join t_jz_item tjp on tdd.product_sku = tjp.sku"); List params = new ArrayList<>(); if (deviceId != null) { fromSql.append(" where tdd.device_id = ?"); params.add(deviceId); } Page paginate = Db.paginate(pageNumber, pageSize, "select tdd.*,tjd.id as deviceId, tjd.device_no as deviceNo,tjd.desc as device_name, tf.factory_name, tw.workshop_name, tjp.item_name as product_name", fromSql.toString(), params.toArray()); if (paginate == null) { renderJson(ApiResponse.success(new PageResult<>(0, pageNumber, pageSize, new ArrayList<>()))); return; } List list = paginate.getList(); List deviceMonitorRecordDtoList = new ArrayList<>(); for (Record record : list) { deviceMonitorRecordDtoList.add(convertRecordToDeviceMonitorRecordDto(record)); } renderJson(new PageResult<>(paginate.getTotalRow(), pageNumber, pageSize, deviceMonitorRecordDtoList)); } catch (Exception e) { logger.error("查询设备监控记录列表异常:", e); renderJson(new PageResult<>(0, pageNumber, pageSize, new ArrayList<>())); } } /** * 刷新设备详细信息 */ @Clear public void refreshDeviceDetail() { ApiResponse apiResponse = new ApiResponse(); Integer deviceId = getParaToInt("deviceId"); try { String sqlOne = "select * from t_jz_device where id = ?"; Record record = Db.findFirst(sqlOne, deviceId); if (record == null) { apiResponse.setCode(500); apiResponse.setMsg("系统异常:设备不存在"); } else { boolean result = DeviceSessionManager.getInstance().sendCommand(record.getStr("device_no"),null, CommandType.DEVICE_INFO_REPORT.getCode()); if (result) { apiResponse.setMsg("刷新成功"); apiResponse.setCode(0); StringBuilder sql = new StringBuilder("select tjd.*,tdd.id as deviceId,tdd.device_no as deviceNo, tdd.desc as device_name, tf.factory_name, tw.workshop_name, tjp.item_name as product_name"); sql.append(" from t_jz_device tdd"); sql.append(" inner join t_device_detail tjd on tdd.id = tjd.device_id"); sql.append(" left join t_factory tf on tdd.factory_id = tf.id"); sql.append(" left join t_workshop tw on tdd.workshop_id = tw.id"); sql.append(" left join t_jz_item tjp on tjd.product_sku = tjp.sku"); sql.append(" where tdd.id = ?"); record = Db.findFirst(sql.toString(), deviceId); DeviceMonitorRecordDto deviceMonitorRecordDto = convertRecordToDeviceMonitorRecordDto(record); apiResponse.setData(deviceMonitorRecordDto); } else { apiResponse.setCode(500); apiResponse.setMsg("刷新失败"); } } }catch (Exception e) { logger.error("刷新设备详细信息异常:", e); apiResponse.setCode(500); apiResponse.setMsg("系统异常:" + e.getMessage()); } renderJson(apiResponse); } /** * 获取设备信息 */ public void getDeviceList() { ApiResponse apiResponse = new ApiResponse(); String sql = "select id,`desc` as name from t_jz_device"; try { List list = Db.find(sql); apiResponse.setData(list); } catch (Exception e) { logger.error("获取设备列表异常:", e); apiResponse.setCode(500); apiResponse.setMsg("系统异常:" + e.getMessage()); } renderJson(apiResponse); } /** * 品相信息更改记录路由 */ public void getProdItemChangeRecordPage() { renderJsp("/page/jinzai/itemChangeRecord.jsp"); } /** * 查询品相信息更改记录 */ public void getItemChangeRecordList() { // 获取分页参数 int pageNumber = getParaToInt("pageNumber", 1); int pageSize = getParaToInt("pageSize", 10); //工厂ID、车间、产线、开始结束时间 Integer factoryId = getParaToInt("factoryId"); Integer workshopId = getParaToInt("workshopId"); Integer lineId = getParaToInt("lineId"); String startTime = getPara("startDate"); String endTime = getPara("endDate"); if (StrKit.notBlank(startTime)) { startTime = startTime + " 00:00:00"; } if (StrKit.notBlank(endTime)) { endTime = endTime + " 23:59:59"; } try { String selectColumns = "select r.modify_type,r.reference_code,f.factory_name,w.workshop_name,bi.item_name as before_item_name,ai.item_name as after_item_name,r.modify_time,r.modify_user"; StringBuilder fromSql = new StringBuilder(" from t_item_modify_record r"); fromSql.append(" left join t_factory f on r.factory_id = f.id"); fromSql.append(" left join t_workshop w on r.workshop_id = w.id"); fromSql.append(" left join t_jz_device l on r.line_id = l.id"); fromSql.append(" left join t_jz_item bi on r.before_item_id = bi.id"); fromSql.append(" left join t_jz_item ai on r.after_item_id = ai.id"); fromSql.append(" where 1=1"); List params = new ArrayList<>(); if (factoryId != null) { fromSql.append(" and r.factory_id = ?"); params.add(factoryId); } if (workshopId != null) { fromSql.append(" and r.workshop_id = ?"); params.add(workshopId); } if (lineId != null) { fromSql.append(" and r.line_id = ?"); params.add(lineId); } if (StrKit.notBlank(startTime)) { fromSql.append(" and r.modify_time >= ?"); params.add(startTime); } if (StrKit.notBlank(endTime)) { fromSql.append(" and r.modify_time <= ?"); params.add(endTime); } Page paginate = Db.paginate(pageNumber, pageSize, selectColumns, fromSql.toString(), params.toArray()); if(paginate == null){ renderJson(new PageResult<>(0, pageNumber, pageSize, new ArrayList<>())); return; } List list = paginate.getList(); List itemModifyRecordVOList = new ArrayList<>(); for (Record record : list) { ItemModifyRecordVO itemModifyRecordVO = new ItemModifyRecordVO(); itemModifyRecordVO.setModifyType(WxUtil.getInt("modify_type",record)); itemModifyRecordVO.setReferenceCode(record.getStr("reference_code")); itemModifyRecordVO.setFactoryName(record.getStr("factory_name")); itemModifyRecordVO.setWorkshopName(record.getStr("workshop_name")); itemModifyRecordVO.setBeforeItemName(record.getStr("before_item_name")); itemModifyRecordVO.setAfterItemName(record.getStr("after_item_name")); itemModifyRecordVO.setModifyTime(DateUtil.format(record.getDate("modify_time"), "yyyy-MM-dd HH:mm:ss")); itemModifyRecordVO.setModifyUser(record.getStr("modify_user")); itemModifyRecordVOList.add(itemModifyRecordVO); } renderJson(new PageResult<>(paginate.getTotalRow(), pageNumber, pageSize, itemModifyRecordVOList)); } catch (Exception e) { logger.error("查询品相信息更改记录列表异常:", e); renderJson(new PageResult<>(0, pageNumber, pageSize, new ArrayList<>())); } } /** * 变更品相 */ @Clear public void changeItem() { ApiResponse apiResponse = new ApiResponse(); //AdminView loginUser = getLoginUser(); AdminView loginUser = new AdminView(); loginUser.setUsername("测试管理员"); try { String bodyData = HttpKit.readData(getRequest()); ItemModifyRecordDto itemModifyRecordDto = JSON.parseObject(bodyData, ItemModifyRecordDto.class); apiResponse = actionChangeItem(itemModifyRecordDto,loginUser); } catch (Exception e) { logger.error("品相信息更改异常:", e); apiResponse.setCode(500); apiResponse.setMsg("系统异常:" + e.getMessage()); } renderJson(apiResponse); } private ApiResponse actionChangeItem(ItemModifyRecordDto itemModifyRecordDto,AdminView loginUser) { Integer modifyType = itemModifyRecordDto.getModifyType(); List referenceCodes = itemModifyRecordDto.getReferenceCodes(); //单号/箱码/托码 对应的修改之前的 品项sku Map referenceCodeAndSku = new HashMap<>(); if(modifyType.compareTo(1) == 0){ Record first = Db.findFirst("select * from jinzai_upload_master_copy where task_no = ?", referenceCodes.get(0)); if(first == null){ return ApiResponse.error("单号不存在"); } referenceCodeAndSku.put(referenceCodes.get(0),first.getStr("sku")); }else if(modifyType.compareTo(2) == 0){ String codeList = referenceCodes.stream() .map(code -> "'" + code + "'") .collect(java.util.stream.Collectors.joining(",")); List masterRecords = Db.find("select * from jinzai_upload_master_copy where id in(" + codeList + ")"); if(masterRecords.size() != referenceCodes.size()){ return ApiResponse.error("有箱码不存在"); } masterRecords.forEach(record -> { referenceCodeAndSku.put(record.getStr("id"),record.getStr("sku")); }); }else if(modifyType.compareTo(3) == 0){ String codeList = referenceCodes.stream() .map(code -> "'" + code + "'") .collect(java.util.stream.Collectors.joining(",")); List duoRecords = Db.find("select * from jinzai_upload_master_copy where duo_code in(" + codeList + ")"); if(duoRecords.size() != referenceCodes.size()){ return ApiResponse.error("有托码不存在"); } duoRecords.forEach(record -> { referenceCodeAndSku.put(record.getStr("duo_code"),record.getStr("sku")); }); } boolean tx = Db.tx(() -> { try { //转成字符串,逗号拼接 String addReferenceCode = referenceCodes.stream() .map(code -> "'" + code + "'") .collect(java.util.stream.Collectors.joining(",")); List itemList = Db.find("select * from t_jz_item"); Map itemMap = new HashMap<>(); Map itemSkuMap = new HashMap<>(); if (CollUtil.isNotEmpty(itemList)) { itemMap = itemList.stream().collect(Collectors.toMap( record -> WxUtil.getInt("id", record), record -> record, (existing, replacement) -> existing )); itemSkuMap = itemList.stream().collect(Collectors.toMap( record -> record.getStr("sku"), record -> record, (existing, replacement) -> existing )); } Record itemRecord = itemMap.get(itemModifyRecordDto.getAfterItemId()); String itemName = itemRecord.getStr("item_name"); String itemKouWei = itemRecord.getStr("kouwei"); String sku = itemRecord.getStr("sku"); //批量插入品项更新记录 for (String referenceCode : referenceCodes) { //根据单号/箱码/托码 获取sku String beforeSku = referenceCodeAndSku.get(referenceCode); if(StrKit.isBlank(beforeSku)){ logger.error("单号/箱码/托码:{}未获取到sku", referenceCode); continue; } //根据 beforeSku 获取 beforeItemId Record beforeItemRecord = itemSkuMap.get(beforeSku); if(beforeItemRecord == null){ logger.error("SKU:{}未获取到品项ID", referenceCode); continue; } //插入品相信息修改记录 Record record = new Record(); record.set("modify_type", modifyType); record.set("reference_code", referenceCode); record.set("factory_id", itemModifyRecordDto.getFactoryId()); record.set("workshop_id", itemModifyRecordDto.getWorkshopId()); record.set("line_id", itemModifyRecordDto.getLineId()); record.set("before_item_id", WxUtil.getInt("id", beforeItemRecord)); record.set("after_item_id", itemModifyRecordDto.getAfterItemId()); record.set("modify_user", loginUser.getUsername()); Db.save("t_item_modify_record", record); } if (modifyType.compareTo(1) == 0) { Db.update("update jinzai_upload_master_copy set upload_time = null,pinxiang = ?,kouwei = ?,sku = ? where task_no = ?", itemName, itemKouWei,sku, referenceCodes.get(0)); } else if (modifyType.compareTo(2) == 0) { Db.update("update jinzai_upload_master_copy set upload_time = null,pinxiang = ?,kouwei = ?,sku = ? where id in(" + addReferenceCode + ")", itemName, itemKouWei,sku); } else if (modifyType.compareTo(3) == 0) { Db.update("update jinzai_upload_master_copy set upload_time = null,pinxiang = ?,kouwei = ?,sku = ? where duo_code in(" + addReferenceCode + ")", itemName, itemKouWei,sku); } return true; } catch (Exception e) { logger.error("品相信息更改异常:", e); return false; } }); if (!tx) { return ApiResponse.error("品相信息更改失败"); } return ApiResponse.success(); } @Clear public void refreshWhitelist() { try { WhitelistValidator.reloadWhitelist(); renderJson((ApiResponse.success())); } catch (Exception e) { logger.error("刷新白名单失败: {}", e.getMessage(), e); renderJson(ApiResponse.error("刷新白名单失败")); } } private ProdTaskUploadRecordDto convertRecordToDto(Record record) { ProdTaskUploadRecordDto dto = new ProdTaskUploadRecordDto(); dto.setFactoryName(record.getStr("factory_name")); dto.setLineName(record.getStr("line_name")); dto.setProductName(record.getStr("pinxiang")); dto.setBatchNo(record.getStr("task_no")); dto.setCreateTime(DateUtil.format(record.getDate("create_time"), "yyyy-MM-dd HH:mm:ss")); if(record.getDate("upload_time") != null){ dto.setUploadTime(DateUtil.format(record.getDate("upload_time"), "yyyy-MM-dd HH:mm:ss")); dto.setIsUpload("1"); dto.setWmsStatus("1"); } dto.setTransferredToDataCenter(1); return dto; } private DeviceMonitorRecordDto convertRecordToDeviceMonitorRecordDto(Record record) { DeviceMonitorRecordDto deviceMonitorRecordDto = new DeviceMonitorRecordDto(); deviceMonitorRecordDto.setDeviceName(record.getStr("device_name")); deviceMonitorRecordDto.setCupUsage(record.getBigDecimal("cpu_usage").toString()); deviceMonitorRecordDto.setMemoryUsage(record.getBigDecimal("memory_usage").toString()); deviceMonitorRecordDto.setDiskSurplus(record.getStr("disk_free")); deviceMonitorRecordDto.setProductionTaskNum(record.getInt("current_task_quantity").toString()); deviceMonitorRecordDto.setFactory(record.getStr("factory_name")); deviceMonitorRecordDto.setWorkshop(record.getStr("workshop_name")); deviceMonitorRecordDto.setLine(record.getStr("device_name")); deviceMonitorRecordDto.setProduct(record.getStr("product_name")); deviceMonitorRecordDto.setProductionNum(record.getInt("current_quantity").toString()); deviceMonitorRecordDto.setTotalNum(record.getInt("total_quantity").toString()); deviceMonitorRecordDto.setPlatformNum(record.getInt("uploaded_quantity").toString()); deviceMonitorRecordDto.setDeviceId(WxUtil.getInt("deviceId", record)); Long delay = record.getLong("network_delay"); if(delay == null){ deviceMonitorRecordDto.setNetworkDelay("0"); }else{ //是毫秒,得转成秒,小数也要显示,默认支持三位小数 deviceMonitorRecordDto.setNetworkDelay(delay+""); } ChannelHandlerContext deviceNo = DeviceSessionManager.getInstance().getDeviceSession(record.getStr("deviceNo")); if(deviceNo != null){ deviceMonitorRecordDto.setOnline(1); } return deviceMonitorRecordDto; } }