新增原料入场记录功能,包含免密接口和数据同步,更新相关控制器、实体和服务,支持条码/批次号生成及管理,优化用户体验和系统实时数据处理能力。

This commit is contained in:
geht
2026-05-09 15:55:11 +08:00
parent 64e978a618
commit 16bb22a113
38 changed files with 2398 additions and 10 deletions

View File

@@ -14,10 +14,12 @@ import org.jeecg.common.system.query.QueryGenerator;
import org.jeecg.common.util.oConvertUtils;
import org.jeecg.modules.xslmes.constant.MesXslCustomerBizStatus;
import org.jeecg.modules.xslmes.entity.MesXslCustomer;
import org.jeecg.modules.xslmes.entity.MesXslRawMaterialEntry;
import org.jeecg.modules.xslmes.entity.MesXslSupplier;
import org.jeecg.modules.xslmes.entity.MesXslVehicle;
import org.jeecg.modules.xslmes.entity.MesXslWeightRecord;
import org.jeecg.modules.xslmes.service.IMesXslCustomerService;
import org.jeecg.modules.xslmes.service.IMesXslRawMaterialEntryService;
import org.jeecg.modules.xslmes.service.IMesXslSupplierService;
import org.jeecg.modules.xslmes.service.IMesXslVehicleService;
import org.jeecg.modules.xslmes.service.IMesXslWeightRecordService;
@@ -26,6 +28,7 @@ import org.springframework.web.bind.annotation.*;
import java.util.Arrays;
import java.util.Objects;
import org.apache.commons.lang3.StringUtils;
/**
* 桌面端免密接口 — 统一入口
@@ -45,6 +48,7 @@ public class MesXslDesktopAnonController {
private final IMesXslCustomerService customerService;
private final IMesXslSupplierService supplierService;
private final IMesXslWeightRecordService weightRecordService;
private final IMesXslRawMaterialEntryService rawMaterialEntryService;
private final MesXslStompNotifyService stompNotify;
// ═══════════════════════════ 车辆管理 ═══════════════════════════
@@ -422,6 +426,82 @@ public class MesXslDesktopAnonController {
return Result.OK("批量删除成功!");
}
// ═══════════════════════════ 原料入场记录 ═══════════════════════════
@Operation(summary = "原料入场记录-免密分页列表查询")
@GetMapping("/xslmes/mesXslRawMaterialEntry/anon/list")
public Result<IPage<MesXslRawMaterialEntry>> rawMaterialEntryAnonList(
MesXslRawMaterialEntry entity,
@RequestParam(name = "pageNo", defaultValue = "1") Integer pageNo,
@RequestParam(name = "pageSize", defaultValue = "10") Integer pageSize,
HttpServletRequest req) {
QueryWrapper<MesXslRawMaterialEntry> qw = QueryGenerator.initQueryWrapper(entity, req.getParameterMap());
qw.orderByDesc("create_time");
IPage<MesXslRawMaterialEntry> page = rawMaterialEntryService.page(new Page<>(pageNo, pageSize), qw);
return Result.OK(page);
}
@Operation(summary = "原料入场记录-免密通过id查询")
@GetMapping("/xslmes/mesXslRawMaterialEntry/anon/queryById")
public Result<MesXslRawMaterialEntry> rawMaterialEntryAnonQueryById(@RequestParam(name = "id") String id) {
MesXslRawMaterialEntry entity = rawMaterialEntryService.getById(id);
return entity != null ? Result.OK(entity) : Result.error("未找到对应数据");
}
@Operation(summary = "原料入场记录-免密生成条码/批次号")
@GetMapping("/xslmes/mesXslRawMaterialEntry/anon/generateBarcode")
public Result<String> rawMaterialEntryAnonGenerateBarcode(
@RequestParam(name = "materialCode", defaultValue = "") String materialCode) {
return Result.OK(rawMaterialEntryService.generateBarcode(materialCode));
}
@Operation(summary = "原料入场记录-免密添加")
@PostMapping("/xslmes/mesXslRawMaterialEntry/anon/add")
public Result<String> rawMaterialEntryAnonAdd(@RequestBody MesXslRawMaterialEntry entity) {
// 条码/批次号为空时服务端自动生成
if (StringUtils.isBlank(entity.getBarcode())) {
String code = rawMaterialEntryService.generateBarcode(
StringUtils.defaultString(entity.getMaterialCode(), ""));
entity.setBarcode(code);
}
if (StringUtils.isBlank(entity.getBatchNo())) {
entity.setBatchNo(entity.getBarcode());
}
rawMaterialEntryService.save(entity);
stompNotify.publishRawMaterialEntryChanged("add", entity.getId());
return Result.OK("添加成功!");
}
@Operation(summary = "原料入场记录-免密编辑")
@RequestMapping(value = "/xslmes/mesXslRawMaterialEntry/anon/edit", method = {RequestMethod.PUT, RequestMethod.POST})
public Result<String> rawMaterialEntryAnonEdit(@RequestBody MesXslRawMaterialEntry entity) {
if (oConvertUtils.isEmpty(entity.getId())) {
return Result.error("主键不能为空");
}
boolean ok = rawMaterialEntryService.updateById(entity);
if (!ok) {
return Result.error("数据已被他人修改,请刷新后重试");
}
stompNotify.publishRawMaterialEntryChanged("edit", entity.getId());
return Result.OK("编辑成功!");
}
@Operation(summary = "原料入场记录-免密删除")
@DeleteMapping("/xslmes/mesXslRawMaterialEntry/anon/delete")
public Result<String> rawMaterialEntryAnonDelete(@RequestParam(name = "id") String id) {
rawMaterialEntryService.removeById(id);
stompNotify.publishRawMaterialEntryChanged("delete", id);
return Result.OK("删除成功!");
}
@Operation(summary = "原料入场记录-免密批量删除")
@DeleteMapping("/xslmes/mesXslRawMaterialEntry/anon/deleteBatch")
public Result<String> rawMaterialEntryAnonDeleteBatch(@RequestParam(name = "ids") String ids) {
rawMaterialEntryService.removeByIds(Arrays.asList(ids.split(",")));
stompNotify.publishRawMaterialEntryChanged("batchDelete", ids);
return Result.OK("批量删除成功!");
}
// ─────────────────────────── 车辆私有辅助 ────────────────────────────
private void applyWeightBillType(MesXslWeightRecord record) {

View File

@@ -7,6 +7,7 @@ import org.jeecg.common.api.vo.Result;
import org.jeecg.common.system.query.QueryGenerator;
import org.jeecg.modules.xslmes.entity.MesXslRawMaterialEntry;
import org.jeecg.modules.xslmes.service.IMesXslRawMaterialEntryService;
import org.jeecg.modules.xslmes.service.MesXslStompNotifyService;
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.baomidou.mybatisplus.core.metadata.IPage;
@@ -36,6 +37,8 @@ public class MesXslRawMaterialEntryController extends JeecgController<MesXslRawM
@Autowired
private IMesXslRawMaterialEntryService mesXslRawMaterialEntryService;
@Autowired
private MesXslStompNotifyService stompNotify;
@Operation(summary = "原料入场记录-分页列表查询")
@GetMapping(value = "/list")
@@ -55,6 +58,7 @@ public class MesXslRawMaterialEntryController extends JeecgController<MesXslRawM
@PostMapping(value = "/add")
public Result<String> add(@RequestBody MesXslRawMaterialEntry mesXslRawMaterialEntry) {
mesXslRawMaterialEntryService.save(mesXslRawMaterialEntry);
stompNotify.publishRawMaterialEntryChanged("add", mesXslRawMaterialEntry.getId());
return Result.OK("添加成功!");
}
@@ -64,6 +68,7 @@ public class MesXslRawMaterialEntryController extends JeecgController<MesXslRawM
@RequestMapping(value = "/edit", method = {RequestMethod.PUT, RequestMethod.POST})
public Result<String> edit(@RequestBody MesXslRawMaterialEntry mesXslRawMaterialEntry) {
mesXslRawMaterialEntryService.updateById(mesXslRawMaterialEntry);
stompNotify.publishRawMaterialEntryChanged("edit", mesXslRawMaterialEntry.getId());
return Result.OK("编辑成功!");
}
@@ -73,6 +78,7 @@ public class MesXslRawMaterialEntryController extends JeecgController<MesXslRawM
@DeleteMapping(value = "/delete")
public Result<String> delete(@RequestParam(name = "id", required = true) String id) {
mesXslRawMaterialEntryService.removeById(id);
stompNotify.publishRawMaterialEntryChanged("delete", id);
return Result.OK("删除成功!");
}
@@ -82,6 +88,7 @@ public class MesXslRawMaterialEntryController extends JeecgController<MesXslRawM
@DeleteMapping(value = "/deleteBatch")
public Result<String> deleteBatch(@RequestParam(name = "ids", required = true) String ids) {
this.mesXslRawMaterialEntryService.removeByIds(Arrays.asList(ids.split(",")));
stompNotify.publishRawMaterialEntryChanged("batchDelete", ids);
return Result.OK("批量删除成功!");
}

View File

@@ -57,6 +57,10 @@ public class MesXslRawMaterialEntry implements Serializable {
@Schema(description = "物料ID")
private String materialId;
@Excel(name = "物料编码", width = 20)
@Schema(description = "物料编码(用于生成条码/批次号)")
private String materialCode;
@Excel(name = "物料名称", width = 20)
@Schema(description = "物料名称")
private String materialName;

View File

@@ -0,0 +1,31 @@
package org.jeecg.modules.xslmes.rule;
import com.alibaba.fastjson.JSONObject;
import lombok.extern.slf4j.Slf4j;
import org.apache.commons.lang3.StringUtils;
import org.jeecg.common.handler.IFillRuleHandler;
import org.jeecg.common.util.SpringContextUtils;
import org.jeecg.modules.xslmes.service.IMesXslRawMaterialEntryService;
/**
* 填值规则:原料入场记录 条码/批次号生成
* 格式QH + 物料编码 + 日期(yyMMdd) + 当日序号(001起)
* rule_code: mes_raw_material_barcode_rule
*/
@Slf4j
public class RawMaterialBarcodeRule implements IFillRuleHandler {
@Override
public Object execute(JSONObject params, JSONObject formData) {
String materialCode = "";
if (formData != null && StringUtils.isNotBlank(formData.getString("materialCode"))) {
materialCode = formData.getString("materialCode").trim();
} else if (params != null && StringUtils.isNotBlank(params.getString("materialCode"))) {
materialCode = params.getString("materialCode").trim();
}
log.info("原料入场条码生成规则 materialCode={}", materialCode);
IMesXslRawMaterialEntryService service =
SpringContextUtils.getBean(IMesXslRawMaterialEntryService.class);
return service.generateBarcode(materialCode);
}
}

View File

@@ -10,4 +10,13 @@ import com.baomidou.mybatisplus.extension.service.IService;
* @Version: V1.0
*/
public interface IMesXslRawMaterialEntryService extends IService<MesXslRawMaterialEntry> {
/**
* 生成条码/批次号
* 格式QH + 物料编码 + 日期(yyMMdd) + 当日序号(001起)
*
* @param materialCode 物料编码
* @return 生成的条码字符串
*/
String generateBarcode(String materialCode);
}

View File

@@ -40,6 +40,11 @@ public class MesXslStompNotifyService {
publish("/topic/sync/mes-weight-records", "MES_WEIGHT_RECORD_CHANGED", "weightRecordId", weightRecordId, action);
}
/** 广播原料入场记录变更事件到 /topic/sync/mes-raw-material-entries */
public void publishRawMaterialEntryChanged(String action, String entryId) {
publish("/topic/sync/mes-raw-material-entries", "MES_RAW_MATERIAL_ENTRY_CHANGED", "entryId", entryId, action);
}
/** 广播密炼物料数据变更事件到 /topic/sync/mes-mixer-materials */
public void publishMixerMaterialChanged(String action, String mixerMaterialId) {
publish("/topic/sync/mes-mixer-materials", "MIXER_MATERIAL_CHANGED", "mixerMaterialId", mixerMaterialId, action);

View File

@@ -1,10 +1,14 @@
package org.jeecg.modules.xslmes.service.impl;
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import org.jeecg.modules.xslmes.entity.MesXslRawMaterialEntry;
import org.jeecg.modules.xslmes.mapper.MesXslRawMaterialEntryMapper;
import org.jeecg.modules.xslmes.service.IMesXslRawMaterialEntryService;
import org.springframework.stereotype.Service;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import java.text.SimpleDateFormat;
import java.util.Date;
/**
* @Description: 原料入场记录
@@ -13,5 +17,20 @@ import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
* @Version: V1.0
*/
@Service
public class MesXslRawMaterialEntryServiceImpl extends ServiceImpl<MesXslRawMaterialEntryMapper, MesXslRawMaterialEntry> implements IMesXslRawMaterialEntryService {
public class MesXslRawMaterialEntryServiceImpl
extends ServiceImpl<MesXslRawMaterialEntryMapper, MesXslRawMaterialEntry>
implements IMesXslRawMaterialEntryService {
@Override
public String generateBarcode(String materialCode) {
if (materialCode == null) materialCode = "";
String dateStr = new SimpleDateFormat("yyMMdd").format(new Date());
String prefix = "QH" + materialCode.trim() + dateStr;
LambdaQueryWrapper<MesXslRawMaterialEntry> qw = new LambdaQueryWrapper<>();
qw.likeRight(MesXslRawMaterialEntry::getBarcode, prefix);
long count = this.count(qw);
return prefix + String.format("%03d", count + 1);
}
}