新增密炼物料皮重策略功能,包括相关实体、服务、控制器及接口,支持桌面端免密CRUD操作,优化打印记录与原料入场记录的衍生字段填充逻辑,提升用户体验。

This commit is contained in:
geht
2026-06-02 16:28:51 +08:00
parent 37239e1b0a
commit fef7d25e3c
75 changed files with 4407 additions and 170 deletions

View File

@@ -211,6 +211,10 @@ public class ShiroConfig {
filterChainDefinitionMap.put("/xslmes/mesXslWarehouse/anon/**", "anon");
// MES库区管理免密接口供桌面端调用
filterChainDefinitionMap.put("/xslmes/mesXslWarehouseArea/anon/**", "anon");
// MES密炼物料皮重策略免密接口供桌面端调用
filterChainDefinitionMap.put("/xslmes/mesXslMixerMaterialTareStrategy/anon/**", "anon");
// MES单位只读免密接口供桌面端单位下拉调用
filterChainDefinitionMap.put("/xslmes/mesXslUnit/anon/**", "anon");
// MES密炼物料管理免密接口供桌面端调用
filterChainDefinitionMap.put("/mes/material/mixerMaterial/anon/**", "anon");
// 打印模板免密接口(供桌面端调用)

View File

@@ -521,3 +521,68 @@ jeecg-boot/jeecg-boot-module/jeecg-module-xslmes/src/main/java/org/jeecg/modules
-- author:GHT---date:20260529--for: 【QH-MES审批流设计】审批IM消息升级为可跳转业务卡片(biz_record):点击可定位到对应单据,无法定位功能页时退回纯文本 ---
jeecg-boot/jeecg-boot-module/jeecg-module-xslmes/src/main/java/org/jeecg/modules/xslmes/approval/controller/MesXslApprovalLaunchController.java
-- author:cursor---date:20250602--for: 【密炼物料皮重策略】桌面端同步 ---
jeecg-boot/jeecg-boot-module/jeecg-module-xslmes/src/main/java/org/jeecg/modules/xslmes/service/MesXslStompNotifyService.java
jeecg-boot/jeecg-boot-module/jeecg-module-xslmes/src/main/java/org/jeecg/modules/xslmes/controller/MesXslDesktopAnonController.java
jeecg-boot/jeecg-boot-module/jeecg-module-xslmes/src/main/java/org/jeecg/modules/xslmes/controller/MesXslMixerMaterialTareStrategyController.java
jeecg-boot/jeecg-boot-base-core/src/main/java/org/jeecg/config/shiro/ShiroConfig.java
-- author:cursor---date:20250602--for: 【密炼物料皮重策略】新增物料规格/托盘重量,皮重改名为包装物重量 ---
jeecg-module-system/jeecg-system-start/src/main/resources/flyway/sql/mysql/V3.9.2_118__mes_xsl_mixer_material_tare_strategy_fields.sql
jeecg-boot-module/jeecg-module-xslmes/src/main/java/org/jeecg/modules/xslmes/entity/MesXslMixerMaterialTareStrategy.java
jeecg-boot-module/jeecg-module-xslmes/src/main/java/org/jeecg/modules/xslmes/service/impl/MesXslMixerMaterialTareStrategyServiceImpl.java
yy-admin-master/YY.Admin.Core/Entity/MesXslMixerMaterialTareStrategy.cs
yy-admin-master/YY.Admin.Services/Service/MixerMaterialTareStrategy/MixerMaterialTareStrategyService.cs
yy-admin-master/YY.Admin/Views/MixerMaterialTareStrategy/MixerMaterialTareStrategyListView.xaml
yy-admin-master/YY.Admin/Views/MixerMaterialTareStrategy/MixerMaterialTareStrategyEditDialogView.xaml
yy-admin-master/YY.Admin/ViewModels/MixerMaterialTareStrategy/MixerMaterialTareStrategyEditDialogViewModel.cs
yy-admin-master/YY.Admin/ViewModels/MixerMaterialTareStrategy/MixerMaterialTareStrategyListViewModel.cs
jeecgboot-vue3/src/views/xslmes/mesXslMixerMaterialTareStrategy/MesXslMixerMaterialTareStrategy.data.ts
jeecgboot-vue3/src/views/xslmes/mesXslMixerMaterialTareStrategy/components/MesXslMixerMaterialTareStrategyModal.vue
-- author:cursor---date:20250602--for: 【原料入场/原材料卡片】皮重字段落库 ---
jeecg-module-system/jeecg-system-start/src/main/resources/flyway/sql/mysql/V3.9.2_119__mes_xsl_raw_material_entry_tare_fields.sql
jeecg-module-system/jeecg-system-start/src/main/resources/flyway/sql/mysql/V3.9.2_120__mes_xsl_raw_material_card_tare_fields.sql
jeecg-boot-module/jeecg-module-xslmes/src/main/java/org/jeecg/modules/xslmes/entity/MesXslRawMaterialEntry.java
jeecg-boot-module/jeecg-module-xslmes/src/main/java/org/jeecg/modules/xslmes/entity/MesXslRawMaterialCard.java
yy-admin-master/YY.Admin.Core/Entity/MesXslRawMaterialEntry.cs
yy-admin-master/YY.Admin.Core/Entity/MesXslRawMaterialCard.cs
yy-admin-master/YY.Admin.Services/Service/RawMaterialEntry/RawMaterialEntryService.cs
yy-admin-master/YY.Admin.Services/Service/RawMaterialCard/RawMaterialCardService.cs
yy-admin-master/YY.Admin/ViewModels/RawMaterialEntry/RawMaterialEntryEditDialogViewModel.cs
yy-admin-master/YY.Admin/ViewModels/RawMaterialEntry/RawMaterialEntryOperationViewModel.cs
yy-admin-master/YY.Admin/ViewModels/RawMaterialCard/RawMaterialCardEditDialogViewModel.cs
-- author:cursor---date:20250602--for: 【原料入场/原材料卡片】列表展示皮重相关字段 ---
yy-admin-master/YY.Admin/Views/RawMaterialEntry/RawMaterialEntryListView.xaml
yy-admin-master/YY.Admin/Views/RawMaterialCard/RawMaterialCardListView.xaml
jeecgboot-vue3/src/views/xslmes/mesXslRawMaterialEntry/MesXslRawMaterialEntry.data.ts
jeecgboot-vue3/src/views/xslmes/mesXslRawMaterialCard/MesXslRawMaterialCard.data.ts
-- author:cursor---date:20250602--for: 【原料入场/原材料卡片】后端列表与详情展示皮重字段 ---
jeecg-boot-module/jeecg-module-xslmes/src/main/java/org/jeecg/modules/xslmes/entity/MesXslRawMaterialWorkshopRemain.java
jeecgboot-vue3/src/views/xslmes/mesXslRawMaterialEntry/MesXslRawMaterialEntry.data.ts
jeecgboot-vue3/src/views/xslmes/mesXslRawMaterialCard/MesXslRawMaterialCard.data.ts
jeecgboot-vue3/src/views/xslmes/mesXslRawMaterialWorkshopRemain/MesXslRawMaterialWorkshopRemain.data.ts
-- author:cursor---date:20250602--for: 【磅单记录】列表展示货物皮重(关联入场记录托盘及皮重合计,不落库) ---
jeecg-boot-module/jeecg-module-xslmes/src/main/java/org/jeecg/modules/xslmes/entity/MesXslWeightRecord.java
jeecg-boot-module/jeecg-module-xslmes/src/main/java/org/jeecg/modules/xslmes/service/IMesXslRawMaterialEntryService.java
jeecg-boot-module/jeecg-module-xslmes/src/main/java/org/jeecg/modules/xslmes/service/impl/MesXslRawMaterialEntryServiceImpl.java
jeecg-boot-module/jeecg-module-xslmes/src/main/java/org/jeecg/modules/xslmes/controller/MesXslWeightRecordController.java
jeecg-boot-module/jeecg-module-xslmes/src/main/java/org/jeecg/modules/xslmes/controller/MesXslDesktopAnonController.java
jeecgboot-vue3/src/views/xslmes/mesXslWeightRecord/MesXslWeightRecord.data.ts
yy-admin-master/YY.Admin.Core/Entity/MesXslWeightRecord.cs
yy-admin-master/YY.Admin.Core/Util/CargoTareWeightCalculator.cs
yy-admin-master/YY.Admin.Services/Service/WeightRecord/WeightRecordService.cs
yy-admin-master/YY.Admin/Views/WeightRecord/WeightRecordListView.xaml
yy-admin-master/YY.Admin/Views/RawMaterialEntry/WeightRecordPickerDialogView.xaml
-- author:cursor---date:20250602--for: 【磅单记录】列表展示原料重量(净重-货物皮重,不落库) ---
jeecg-boot-module/jeecg-module-xslmes/src/main/java/org/jeecg/modules/xslmes/entity/MesXslWeightRecord.java
jeecg-boot-module/jeecg-module-xslmes/src/main/java/org/jeecg/modules/xslmes/service/impl/MesXslRawMaterialEntryServiceImpl.java
jeecgboot-vue3/src/views/xslmes/mesXslWeightRecord/MesXslWeightRecord.data.ts
yy-admin-master/YY.Admin.Core/Entity/MesXslWeightRecord.cs
yy-admin-master/YY.Admin.Services/Service/WeightRecord/WeightRecordService.cs
yy-admin-master/YY.Admin/Views/WeightRecord/WeightRecordListView.xaml

View File

@@ -27,6 +27,8 @@ import org.jeecg.modules.xslmes.entity.MesXslCustomer;
import org.jeecg.modules.xslmes.entity.MesXslRawMaterialCard;
import org.jeecg.modules.xslmes.entity.MesXslRawMaterialEntry;
import org.jeecg.modules.xslmes.entity.MesXslSupplier;
import org.jeecg.modules.xslmes.entity.MesXslMixerMaterialTareStrategy;
import org.jeecg.modules.xslmes.entity.MesXslUnit;
import org.jeecg.modules.xslmes.entity.MesXslVehicle;
import org.jeecg.modules.xslmes.entity.MesXslWarehouse;
import org.jeecg.modules.xslmes.entity.MesXslWarehouseArea;
@@ -35,6 +37,8 @@ import org.jeecg.modules.xslmes.service.IMesXslCustomerService;
import org.jeecg.modules.xslmes.service.IMesXslRawMaterialCardService;
import org.jeecg.modules.xslmes.service.IMesXslRawMaterialEntryService;
import org.jeecg.modules.xslmes.service.IMesXslSupplierService;
import org.jeecg.modules.xslmes.service.IMesXslMixerMaterialTareStrategyService;
import org.jeecg.modules.xslmes.service.IMesXslUnitService;
import org.jeecg.modules.xslmes.service.IMesXslVehicleService;
import org.jeecg.modules.xslmes.service.IMesXslWarehouseAreaService;
import org.jeecg.modules.xslmes.service.IMesXslWarehouseService;
@@ -60,6 +64,8 @@ import org.apache.commons.lang3.StringUtils;
* ShiroConfig 白名单:
* /xslmes/mesXslVehicle/anon/**
* /xslmes/mesXslCustomer/anon/**
* /xslmes/mesXslMixerMaterialTareStrategy/anon/**
* /xslmes/mesXslUnit/anon/**
*/
@Tag(name = "桌面端免密接口")
@RestController
@@ -75,6 +81,8 @@ public class MesXslDesktopAnonController {
private final IMesXslRawMaterialCardService rawMaterialCardService;
private final IMesXslWarehouseService warehouseService;
private final IMesXslWarehouseAreaService warehouseAreaService;
private final IMesXslMixerMaterialTareStrategyService tareStrategyService;
private final IMesXslUnitService unitService;
private final MesXslStompNotifyService stompNotify;
private final IPrintBizTemplateBindService printBizTemplateBindService;
private final IPrintTemplateService printTemplateService;
@@ -390,6 +398,7 @@ public class MesXslDesktopAnonController {
QueryWrapper<MesXslWeightRecord> qw = QueryGenerator.initQueryWrapper(mesXslWeightRecord, req.getParameterMap());
qw.orderByDesc("create_time");
IPage<MesXslWeightRecord> page = weightRecordService.page(new Page<>(pageNo, pageSize), qw);
rawMaterialEntryService.fillWeightRecordDerivedFields(page.getRecords());
return Result.OK(page);
}
@@ -397,7 +406,11 @@ public class MesXslDesktopAnonController {
@GetMapping("/xslmes/mesXslWeightRecord/anon/queryById")
public Result<MesXslWeightRecord> weightRecordAnonQueryById(@RequestParam(name = "id") String id) {
MesXslWeightRecord entity = weightRecordService.getById(id);
return entity != null ? Result.OK(entity) : Result.error("未找到对应数据");
if (entity == null) {
return Result.error("未找到对应数据");
}
rawMaterialEntryService.fillWeightRecordDerivedFields(Collections.singletonList(entity));
return Result.OK(entity);
}
@Operation(summary = "磅单-免密添加")
@@ -828,6 +841,90 @@ public class MesXslDesktopAnonController {
return Result.OK("该值可用!");
}
// ═══════════════════════════ 密炼物料皮重策略 ═══════════════════════════
//update-begin---author:cursor ---date:20250602 for【密炼物料皮重策略】桌面端免密CRUD-----------
@Operation(summary = "密炼物料皮重策略-免密分页列表查询")
@GetMapping("/xslmes/mesXslMixerMaterialTareStrategy/anon/list")
public Result<IPage<MesXslMixerMaterialTareStrategy>> tareStrategyAnonList(
MesXslMixerMaterialTareStrategy model,
@RequestParam(name = "pageNo", defaultValue = "1") Integer pageNo,
@RequestParam(name = "pageSize", defaultValue = "10") Integer pageSize,
HttpServletRequest req) {
QueryWrapper<MesXslMixerMaterialTareStrategy> qw = QueryGenerator.initQueryWrapper(model, req.getParameterMap());
qw.orderByDesc("effective_start_date", "create_time");
IPage<MesXslMixerMaterialTareStrategy> page = tareStrategyService.page(new Page<>(pageNo, pageSize), qw);
return Result.OK(page);
}
@Operation(summary = "密炼物料皮重策略-免密通过id查询")
@GetMapping("/xslmes/mesXslMixerMaterialTareStrategy/anon/queryById")
public Result<MesXslMixerMaterialTareStrategy> tareStrategyAnonQueryById(@RequestParam(name = "id") String id) {
MesXslMixerMaterialTareStrategy entity = tareStrategyService.getById(id);
return entity != null ? Result.OK(entity) : Result.error("未找到对应数据");
}
@Operation(summary = "密炼物料皮重策略-免密添加")
@PostMapping("/xslmes/mesXslMixerMaterialTareStrategy/anon/add")
public Result<String> tareStrategyAnonAdd(@RequestBody MesXslMixerMaterialTareStrategy model) {
String err = tareStrategyService.validateBeforeSave(model, false);
if (err != null) {
return Result.error(err);
}
tareStrategyService.save(model);
stompNotify.publishMixerMaterialTareStrategyChanged("add", model.getId());
return Result.OK("添加成功!");
}
@Operation(summary = "密炼物料皮重策略-免密编辑")
@RequestMapping(value = "/xslmes/mesXslMixerMaterialTareStrategy/anon/edit", method = {RequestMethod.PUT, RequestMethod.POST})
public Result<String> tareStrategyAnonEdit(@RequestBody MesXslMixerMaterialTareStrategy model) {
if (oConvertUtils.isEmpty(model.getId())) {
return Result.error("主键不能为空");
}
String err = tareStrategyService.validateBeforeSave(model, true);
if (err != null) {
return Result.error(err);
}
boolean ok = tareStrategyService.updateById(model);
if (!ok) {
return Result.error("数据已被他人修改,请刷新后重试");
}
stompNotify.publishMixerMaterialTareStrategyChanged("edit", model.getId());
return Result.OK("编辑成功!");
}
@Operation(summary = "密炼物料皮重策略-免密删除")
@DeleteMapping("/xslmes/mesXslMixerMaterialTareStrategy/anon/delete")
public Result<String> tareStrategyAnonDelete(@RequestParam(name = "id") String id) {
tareStrategyService.removeById(id);
stompNotify.publishMixerMaterialTareStrategyChanged("delete", id);
return Result.OK("删除成功!");
}
@Operation(summary = "密炼物料皮重策略-免密批量删除")
@DeleteMapping("/xslmes/mesXslMixerMaterialTareStrategy/anon/deleteBatch")
public Result<String> tareStrategyAnonDeleteBatch(@RequestParam(name = "ids") String ids) {
tareStrategyService.removeByIds(Arrays.asList(ids.split(",")));
stompNotify.publishMixerMaterialTareStrategyChanged("batchDelete", ids);
return Result.OK("批量删除成功!");
}
//update-end---author:cursor ---date:20250602 for【密炼物料皮重策略】桌面端免密CRUD-----------
//update-begin---author:cursor ---date:20250602 for【密炼物料皮重策略】桌面端单位下拉只读-----------
@Operation(summary = "单位-免密分页列表查询(供桌面端单位下拉)")
@GetMapping("/xslmes/mesXslUnit/anon/list")
public Result<IPage<MesXslUnit>> unitAnonList(
MesXslUnit mesXslUnit,
@RequestParam(name = "pageNo", defaultValue = "1") Integer pageNo,
@RequestParam(name = "pageSize", defaultValue = "1000") Integer pageSize,
HttpServletRequest req) {
QueryWrapper<MesXslUnit> qw = QueryGenerator.initQueryWrapper(mesXslUnit, req.getParameterMap());
IPage<MesXslUnit> page = unitService.page(new Page<>(pageNo, pageSize), qw);
return Result.OK(page);
}
//update-end---author:cursor ---date:20250602 for【密炼物料皮重策略】桌面端单位下拉只读-----------
// ─────────────────────────── 车辆私有辅助 ────────────────────────────
private void applyWeightNetAndBillType(MesXslWeightRecord record) {

View File

@@ -0,0 +1,151 @@
package org.jeecg.modules.xslmes.controller;
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import io.swagger.v3.oas.annotations.Operation;
import io.swagger.v3.oas.annotations.tags.Tag;
import jakarta.servlet.http.HttpServletRequest;
import jakarta.servlet.http.HttpServletResponse;
import java.util.Arrays;
import lombok.extern.slf4j.Slf4j;
import org.apache.shiro.SecurityUtils;
import org.apache.shiro.authz.annotation.RequiresPermissions;
import org.jeecg.common.api.vo.Result;
import org.jeecg.common.aspect.annotation.AutoLog;
import org.jeecg.common.system.base.controller.JeecgController;
import org.jeecg.common.system.query.QueryGenerator;
import org.jeecg.common.system.vo.LoginUser;
import org.jeecg.common.util.oConvertUtils;
import org.jeecg.modules.xslmes.entity.MesXslMixerMaterialTareStrategy;
import org.jeecg.modules.xslmes.service.IMesXslMixerMaterialTareStrategyService;
import org.jeecg.modules.xslmes.service.MesXslStompNotifyService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.*;
import org.springframework.web.servlet.ModelAndView;
/**
* MES 密炼物料皮重策略
*/
@Tag(name = "MES密炼物料皮重策略")
@RestController
@RequestMapping("/xslmes/mesXslMixerMaterialTareStrategy")
@Slf4j
public class MesXslMixerMaterialTareStrategyController
extends JeecgController<MesXslMixerMaterialTareStrategy, IMesXslMixerMaterialTareStrategyService> {
@Autowired
private IMesXslMixerMaterialTareStrategyService mesXslMixerMaterialTareStrategyService;
@Autowired
private MesXslStompNotifyService stompNotify;
@Operation(summary = "MES密炼物料皮重策略-分页列表查询")
@GetMapping(value = "/list")
public Result<IPage<MesXslMixerMaterialTareStrategy>> queryPageList(
MesXslMixerMaterialTareStrategy model,
@RequestParam(name = "pageNo", defaultValue = "1") Integer pageNo,
@RequestParam(name = "pageSize", defaultValue = "10") Integer pageSize,
HttpServletRequest req) {
QueryWrapper<MesXslMixerMaterialTareStrategy> queryWrapper =
QueryGenerator.initQueryWrapper(model, req.getParameterMap());
queryWrapper.orderByDesc("effective_start_date", "create_time");
Page<MesXslMixerMaterialTareStrategy> page = new Page<>(pageNo, pageSize);
IPage<MesXslMixerMaterialTareStrategy> pageList = mesXslMixerMaterialTareStrategyService.page(page, queryWrapper);
return Result.OK(pageList);
}
@AutoLog(value = "MES密炼物料皮重策略-添加")
@Operation(summary = "MES密炼物料皮重策略-添加")
@RequiresPermissions("xslmes:mes_xsl_mixer_material_tare_strategy:add")
@PostMapping(value = "/add")
public Result<String> add(@RequestBody MesXslMixerMaterialTareStrategy model) {
fillMaintainBy(model);
String err = mesXslMixerMaterialTareStrategyService.validateBeforeSave(model, false);
if (err != null) {
return Result.error(err);
}
mesXslMixerMaterialTareStrategyService.save(model);
//update-begin---author:cursor ---date:20250602 for【密炼物料皮重策略】桌面端同步-----------
stompNotify.publishMixerMaterialTareStrategyChanged("add", model.getId());
//update-end---author:cursor ---date:20250602 for【密炼物料皮重策略】桌面端同步-----------
return Result.OK("添加成功!");
}
@AutoLog(value = "MES密炼物料皮重策略-编辑")
@Operation(summary = "MES密炼物料皮重策略-编辑")
@RequiresPermissions("xslmes:mes_xsl_mixer_material_tare_strategy:edit")
@RequestMapping(value = "/edit", method = {RequestMethod.PUT, RequestMethod.POST})
public Result<String> edit(@RequestBody MesXslMixerMaterialTareStrategy model) {
fillMaintainBy(model);
String err = mesXslMixerMaterialTareStrategyService.validateBeforeSave(model, true);
if (err != null) {
return Result.error(err);
}
mesXslMixerMaterialTareStrategyService.updateById(model);
//update-begin---author:cursor ---date:20250602 for【密炼物料皮重策略】桌面端同步-----------
stompNotify.publishMixerMaterialTareStrategyChanged("edit", model.getId());
//update-end---author:cursor ---date:20250602 for【密炼物料皮重策略】桌面端同步-----------
return Result.OK("编辑成功!");
}
@AutoLog(value = "MES密炼物料皮重策略-删除")
@Operation(summary = "MES密炼物料皮重策略-通过id删除")
@RequiresPermissions("xslmes:mes_xsl_mixer_material_tare_strategy:delete")
@DeleteMapping(value = "/delete")
public Result<String> delete(@RequestParam(name = "id", required = true) String id) {
mesXslMixerMaterialTareStrategyService.removeById(id);
//update-begin---author:cursor ---date:20250602 for【密炼物料皮重策略】桌面端同步-----------
stompNotify.publishMixerMaterialTareStrategyChanged("delete", id);
//update-end---author:cursor ---date:20250602 for【密炼物料皮重策略】桌面端同步-----------
return Result.OK("删除成功!");
}
@AutoLog(value = "MES密炼物料皮重策略-批量删除")
@Operation(summary = "MES密炼物料皮重策略-批量删除")
@RequiresPermissions("xslmes:mes_xsl_mixer_material_tare_strategy:deleteBatch")
@DeleteMapping(value = "/deleteBatch")
public Result<String> deleteBatch(@RequestParam(name = "ids", required = true) String ids) {
mesXslMixerMaterialTareStrategyService.removeByIds(Arrays.asList(ids.split(",")));
//update-begin---author:cursor ---date:20250602 for【密炼物料皮重策略】桌面端同步-----------
stompNotify.publishMixerMaterialTareStrategyChanged("batchDelete", ids);
//update-end---author:cursor ---date:20250602 for【密炼物料皮重策略】桌面端同步-----------
return Result.OK("批量删除成功!");
}
@Operation(summary = "MES密炼物料皮重策略-通过id查询")
@GetMapping(value = "/queryById")
public Result<MesXslMixerMaterialTareStrategy> queryById(@RequestParam(name = "id", required = true) String id) {
MesXslMixerMaterialTareStrategy entity = mesXslMixerMaterialTareStrategyService.getById(id);
if (entity == null) {
return Result.error("未找到对应数据");
}
return Result.OK(entity);
}
@RequiresPermissions("xslmes:mes_xsl_mixer_material_tare_strategy:exportXls")
@RequestMapping(value = "/exportXls")
public ModelAndView exportXls(HttpServletRequest request, MesXslMixerMaterialTareStrategy model) {
return super.exportXls(request, model, MesXslMixerMaterialTareStrategy.class, "密炼物料皮重策略");
}
@RequiresPermissions("xslmes:mes_xsl_mixer_material_tare_strategy:importExcel")
@RequestMapping(value = "/importExcel", method = RequestMethod.POST)
public Result<?> importExcel(HttpServletRequest request, HttpServletResponse response) {
return super.importExcel(request, response, MesXslMixerMaterialTareStrategy.class);
}
//update-begin---author:cursor ---date:20250602 for【密炼物料皮重策略】维护人自动回填当前登录用户-----------
private void fillMaintainBy(MesXslMixerMaterialTareStrategy model) {
LoginUser loginUser = null;
try {
loginUser = (LoginUser) SecurityUtils.getSubject().getPrincipal();
} catch (Exception e) {
log.debug("获取登录用户失败", e);
}
if (loginUser != null && oConvertUtils.isNotEmpty(loginUser.getUsername())) {
model.setMaintainBy(loginUser.getUsername());
}
}
//update-end---author:cursor ---date:20250602 for【密炼物料皮重策略】维护人自动回填当前登录用户-----------
}

View File

@@ -27,9 +27,7 @@ import java.util.Arrays;
import java.util.Collections;
import java.util.Date;
import java.util.List;
import java.util.Map;
import java.util.Random;
import java.util.stream.Collectors;
/**
* 地磅数据记录
@@ -57,7 +55,7 @@ public class MesXslWeightRecordController extends JeecgController<MesXslWeightRe
queryWrapper.orderByDesc("create_time");
Page<MesXslWeightRecord> page = new Page<>(pageNo, pageSize);
IPage<MesXslWeightRecord> pageList = mesXslWeightRecordService.page(page, queryWrapper);
fillEnteredWeight(pageList.getRecords());
rawMaterialEntryService.fillWeightRecordDerivedFields(pageList.getRecords());
return Result.OK(pageList);
}
@@ -120,7 +118,7 @@ public class MesXslWeightRecordController extends JeecgController<MesXslWeightRe
if (record == null) {
return Result.error("未找到对应数据");
}
fillEnteredWeight(Collections.singletonList(record));
fillWeightRecordDerivedFields(Collections.singletonList(record));
return Result.OK(record);
}
@@ -187,27 +185,7 @@ public class MesXslWeightRecordController extends JeecgController<MesXslWeightRe
}
}
/**
* 给一批磅单记录批量填充「已入场重量」transient 字段,不入库)。
* 数据来源所有引用本榜单bill_no 匹配)的原料入场记录的拆码明细的 (份数×每份重量) 累计。
* 实现上为避免 N+1先收集所有 billNo再一次 IN 查询累计。
*/
private void fillEnteredWeight(List<MesXslWeightRecord> records) {
if (records == null || records.isEmpty()) {
return;
}
List<String> billNos = records.stream()
.map(MesXslWeightRecord::getBillNo)
.filter(s -> s != null && !s.isBlank())
.distinct()
.collect(Collectors.toList());
if (billNos.isEmpty()) {
return;
}
Map<String, BigDecimal> sumMap = rawMaterialEntryService.sumEnteredWeightByBillNos(billNos);
for (MesXslWeightRecord r : records) {
BigDecimal v = (r.getBillNo() == null) ? null : sumMap.get(r.getBillNo());
r.setEnteredWeight(v != null ? v : BigDecimal.ZERO);
}
private void fillWeightRecordDerivedFields(List<MesXslWeightRecord> records) {
rawMaterialEntryService.fillWeightRecordDerivedFields(records);
}
}

View File

@@ -0,0 +1,107 @@
package org.jeecg.modules.xslmes.entity;
import com.baomidou.mybatisplus.annotation.IdType;
import com.baomidou.mybatisplus.annotation.TableId;
import com.baomidou.mybatisplus.annotation.TableName;
import com.fasterxml.jackson.annotation.JsonFormat;
import io.swagger.v3.oas.annotations.media.Schema;
import java.io.Serializable;
import java.math.BigDecimal;
import java.util.Date;
import lombok.Data;
import lombok.EqualsAndHashCode;
import lombok.experimental.Accessors;
import org.jeecg.common.aspect.annotation.Dict;
import org.jeecgframework.poi.excel.annotation.Excel;
import org.springframework.format.annotation.DateTimeFormat;
/**
* MES 密炼物料皮重策略
*/
@Data
@TableName("mes_xsl_mixer_material_tare_strategy")
@Accessors(chain = true)
@EqualsAndHashCode(callSuper = false)
@Schema(description = "MES密炼物料皮重策略")
public class MesXslMixerMaterialTareStrategy implements Serializable {
private static final long serialVersionUID = 1L;
@TableId(type = IdType.ASSIGN_ID)
private String id;
@Schema(description = "租户ID")
private Integer tenantId;
@Excel(name = "密炼物料", width = 18, dictTable = "mes_mixer_material", dicText = "material_name", dicCode = "id")
@Dict(dictTable = "mes_mixer_material", dicText = "material_name", dicCode = "id")
@Schema(description = "密炼物料ID关联 mes_mixer_material.id")
private String mixerMaterialId;
@Excel(name = "密炼物料名称", width = 20)
@Schema(description = "密炼物料名称冗余")
private String mixerMaterialName;
@Excel(name = "供应商", width = 18, dictTable = "mes_xsl_supplier", dicText = "supplier_name", dicCode = "id")
@Dict(dictTable = "mes_xsl_supplier", dicText = "supplier_name", dicCode = "id")
@Schema(description = "供应商ID关联 mes_xsl_supplier.id")
private String supplierId;
@Excel(name = "供应商名称", width = 20)
@Schema(description = "供应商名称冗余")
private String supplierName;
@Excel(name = "物料规格", width = 16)
@Schema(description = "物料规格(与密炼物料、供应商、生效日期共同参与唯一性校验,不同规格可分别维护)")
private String materialSpec;
@Excel(name = "包装物重量", width = 12)
@Schema(description = "包装物重量")
private BigDecimal tareWeight;
@Excel(name = "托盘重量", width = 12)
@Schema(description = "托盘重量")
private BigDecimal palletWeight;
@Schema(description = "单位ID关联 mes_xsl_unit.id")
private String unitId;
@Excel(name = "单位", width = 10)
@Schema(description = "单位名称冗余")
private String unitName;
@Excel(name = "生效开始日期", width = 14, format = "yyyy-MM-dd")
@JsonFormat(timezone = "GMT+8", pattern = "yyyy-MM-dd")
@DateTimeFormat(pattern = "yyyy-MM-dd")
@Schema(description = "生效开始日期")
private Date effectiveStartDate;
@Excel(name = "生效截止日期", width = 14, format = "yyyy-MM-dd")
@JsonFormat(timezone = "GMT+8", pattern = "yyyy-MM-dd")
@DateTimeFormat(pattern = "yyyy-MM-dd")
@Schema(description = "生效截止日期")
private Date effectiveEndDate;
@Excel(name = "维护人", width = 12, dictTable = "sys_user", dicText = "realname", dicCode = "username")
@Dict(dictTable = "sys_user", dicText = "realname", dicCode = "username")
@Schema(description = "维护人(登录账号)")
private String maintainBy;
@Excel(name = "创建人", width = 12)
private String createBy;
@Excel(name = "创建时间", width = 20, format = "yyyy-MM-dd HH:mm:ss")
@JsonFormat(timezone = "GMT+8", pattern = "yyyy-MM-dd HH:mm:ss")
@DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss")
private Date createTime;
@Excel(name = "修改人", width = 12)
private String updateBy;
@JsonFormat(timezone = "GMT+8", pattern = "yyyy-MM-dd HH:mm:ss")
@DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss")
private Date updateTime;
private String sysOrgCode;
private Integer delFlag;
}

View File

@@ -86,6 +86,14 @@ public class MesXslRawMaterialCard implements Serializable {
@Schema(description = "总重")
private BigDecimal totalWeight;
@Excel(name = "包装物皮重", width = 12)
@Schema(description = "包装物皮重(KG)")
private BigDecimal packagingTare;
@Excel(name = "托盘重量", width = 12)
@Schema(description = "托盘重量(KG)")
private BigDecimal palletWeight;
@Excel(name = "剩余重量", width = 12)
@Schema(description = "剩余重量")
private BigDecimal remainingWeight;

View File

@@ -89,6 +89,10 @@ public class MesXslRawMaterialEntry implements Serializable {
@Schema(description = "总重(KG)")
private BigDecimal totalWeight;
@Excel(name = "托盘及皮重合计", width = 14)
@Schema(description = "托盘及皮重(合计)")
private BigDecimal palletTareTotal;
// 总份数 / 每份总重 / 每份包数:从 数值类型 升级为 字符串类型,
// 支持桌面端「拆码明细」多行拼接保存(如 20/1/ 与 100/200/)。
@Excel(name = "总份数", width = 12)
@@ -99,6 +103,17 @@ public class MesXslRawMaterialEntry implements Serializable {
@Schema(description = "每份总重(KG)(支持多行拆码明细拼接,如 100/200/")
private String portionWeight;
@Excel(name = "包装物皮重", width = 14)
@Schema(description = "拆码明细包装物皮重拼接(以 / 分隔,末尾带 /")
private String portionPackagingTare;
@Excel(name = "托盘重量", width = 14)
@Schema(description = "拆码明细托盘重量拼接(以 / 分隔,末尾带 /")
private String portionPalletWeight;
@Schema(description = "拆码明细皮重策略ID拼接以 / 分隔,末尾带 /")
private String portionTareStrategyIds;
@Excel(name = "每份包数", width = 12)
@Schema(description = "每份包数(支持多行拆码明细拼接)")
private String portionPackages;

View File

@@ -56,6 +56,14 @@ public class MesXslRawMaterialWorkshopRemain extends JeecgEntity {
@Schema(description = "总重")
private BigDecimal totalWeight;
@Excel(name = "包装物皮重", width = 12)
@Schema(description = "包装物皮重(KG)")
private BigDecimal packagingTare;
@Excel(name = "托盘重量", width = 12)
@Schema(description = "托盘重量(KG)")
private BigDecimal palletWeight;
@Excel(name = "剩余重量", width = 12)
@Schema(description = "剩余重量")
private BigDecimal remainingWeight;

View File

@@ -43,7 +43,10 @@ import java.util.Date;
"driverName",
"driverPhone",
"billType",
"tenantId"
"tenantId",
"enteredWeight",
"cargoTareWeight",
"rawMaterialWeight"
})
public class MesXslWeightRecord extends JeecgEntity implements Serializable {
@@ -129,4 +132,20 @@ public class MesXslWeightRecord extends JeecgEntity implements Serializable {
@TableField(exist = false)
@Schema(description = "已入场重量(KG),由原料入场记录的拆码明细实时累计")
private BigDecimal enteredWeight;
/**
* 货物皮重KG—— 实时计算,不落库。
* 数据来源所有引用本榜单bill_no 匹配)的原料入场记录的 pallet_tare_total托盘及皮重合计累加。
*/
@TableField(exist = false)
@Schema(description = "货物皮重(KG),关联原料入场记录的托盘及皮重合计累计")
private BigDecimal cargoTareWeight;
/**
* 原料重量KG—— 实时计算,不落库。
* 公式:净重(KG) - 货物皮重(KG)。
*/
@TableField(exist = false)
@Schema(description = "原料重量(KG)=净重-货物皮重")
private BigDecimal rawMaterialWeight;
}

View File

@@ -0,0 +1,11 @@
package org.jeecg.modules.xslmes.mapper;
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import org.apache.ibatis.annotations.Mapper;
import org.jeecg.modules.xslmes.entity.MesXslMixerMaterialTareStrategy;
/**
* MES 密炼物料皮重策略 Mapper
*/
@Mapper
public interface MesXslMixerMaterialTareStrategyMapper extends BaseMapper<MesXslMixerMaterialTareStrategy> {}

View File

@@ -0,0 +1,22 @@
package org.jeecg.modules.xslmes.service;
import com.baomidou.mybatisplus.extension.service.IService;
import org.jeecg.modules.xslmes.entity.MesXslMixerMaterialTareStrategy;
/**
* MES 密炼物料皮重策略
*/
public interface IMesXslMixerMaterialTareStrategyService extends IService<MesXslMixerMaterialTareStrategy> {
//update-begin---author:cursor ---date:20250602 for【密炼物料皮重策略】保存前校验生效日期重叠含物料规格-----------
/**
* 校验同一租户、同一供应商、同一密炼物料、同一物料规格在生效日期内是否已存在记录。
* 同一密炼物料不同规格可分别维护;仅规格相同且生效日期重叠时不允许重复。
*
* @param entity 待保存实体
* @param isUpdate 是否编辑
* @return 错误信息null 表示通过
*/
String validateBeforeSave(MesXslMixerMaterialTareStrategy entity, boolean isUpdate);
//update-end---author:cursor ---date:20250602 for【密炼物料皮重策略】保存前校验生效日期重叠含物料规格-----------
}

View File

@@ -5,6 +5,7 @@ import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.baomidou.mybatisplus.extension.service.IService;
import org.jeecg.modules.xslmes.entity.MesXslRawMaterialEntry;
import org.jeecg.modules.xslmes.entity.MesXslWeightRecord;
import org.jeecg.modules.xslmes.vo.MesXslRawMaterialCardBriefVO;
import org.jeecg.modules.xslmes.vo.MesXslRawMaterialEntryDeleteLogVO;
@@ -62,6 +63,19 @@ public interface IMesXslRawMaterialEntryService extends IService<MesXslRawMateri
*/
Map<String, BigDecimal> sumEnteredWeightByBillNos(Collection<String> billNos);
/**
* 按榜单号批量统计「货物皮重」(托盘及皮重合计累加)。
*
* @param billNos 榜单号集合
* @return billNo -&gt; 累计货物皮重;查不到的 billNo 不会出现在 map 中
*/
Map<String, BigDecimal> sumCargoTareByBillNos(Collection<String> billNos);
/**
* 给磅单列表/详情填充由原料入场记录衍生的 transient 字段(已入场重量、货物皮重)。
*/
void fillWeightRecordDerivedFields(List<MesXslWeightRecord> records);
/**
* 结存入库并汇总原材料库存。
* <p>

View File

@@ -75,6 +75,14 @@ public class MesXslStompNotifyService {
publish("/topic/sync/print-templates", "PRINT_TEMPLATE_CHANGED", "templateId", templateId, action);
}
//update-begin---author:cursor ---date:20250602 for【密炼物料皮重策略】桌面端同步-----------
/** 广播密炼物料皮重策略变更事件到 /topic/sync/mes-mixer-material-tare-strategies */
public void publishMixerMaterialTareStrategyChanged(String action, String tareStrategyId) {
publish("/topic/sync/mes-mixer-material-tare-strategies", "MES_MIXER_MATERIAL_TARE_STRATEGY_CHANGED",
"tareStrategyId", tareStrategyId, action);
}
//update-end---author:cursor ---date:20250602 for【密炼物料皮重策略】桌面端同步-----------
// ─────────────────────────── 私有辅助 ────────────────────────────
private void publish(String topic, String cmd, String idKey, String idValue, String action) {

View File

@@ -0,0 +1,107 @@
package org.jeecg.modules.xslmes.service.impl;
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import java.util.Date;
import org.jeecg.common.util.oConvertUtils;
import org.jeecg.modules.mes.material.entity.MesMixerMaterial;
import org.jeecg.modules.mes.material.service.IMesMixerMaterialService;
import org.jeecg.modules.xslmes.entity.MesXslMixerMaterialTareStrategy;
import org.jeecg.modules.xslmes.entity.MesXslSupplier;
import org.jeecg.modules.xslmes.entity.MesXslUnit;
import org.jeecg.modules.xslmes.mapper.MesXslMixerMaterialTareStrategyMapper;
import org.jeecg.modules.xslmes.service.IMesXslMixerMaterialTareStrategyService;
import org.jeecg.modules.xslmes.service.IMesXslSupplierService;
import org.jeecg.modules.xslmes.service.IMesXslUnitService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
/**
* MES 密炼物料皮重策略
*/
@Service
public class MesXslMixerMaterialTareStrategyServiceImpl
extends ServiceImpl<MesXslMixerMaterialTareStrategyMapper, MesXslMixerMaterialTareStrategy>
implements IMesXslMixerMaterialTareStrategyService {
@Autowired
private IMesMixerMaterialService mesMixerMaterialService;
@Autowired
private IMesXslSupplierService mesXslSupplierService;
@Autowired
private IMesXslUnitService mesXslUnitService;
//update-begin---author:cursor ---date:20250602 for【密炼物料皮重策略】保存前校验与冗余回填-----------
@Override
public String validateBeforeSave(MesXslMixerMaterialTareStrategy entity, boolean isUpdate) {
if (oConvertUtils.isEmpty(entity.getMixerMaterialId())) {
return "请选择密炼物料";
}
if (oConvertUtils.isEmpty(entity.getSupplierId())) {
return "请选择供应商";
}
if (entity.getTareWeight() == null) {
return "请填写包装物重量";
}
if (entity.getPalletWeight() != null && entity.getPalletWeight().signum() < 0) {
return "托盘重量不能为负数";
}
if (oConvertUtils.isEmpty(entity.getUnitId())) {
return "请选择单位";
}
Date startDate = entity.getEffectiveStartDate();
Date endDate = entity.getEffectiveEndDate();
if (startDate == null || endDate == null) {
return "请填写完整的生效日期";
}
if (startDate.after(endDate)) {
return "生效开始日期不能晚于截止日期";
}
MesMixerMaterial mixerMaterial = mesMixerMaterialService.getById(entity.getMixerMaterialId());
if (mixerMaterial == null) {
return "所选密炼物料不存在,请重新选择";
}
MesXslSupplier supplier = mesXslSupplierService.getById(entity.getSupplierId());
if (supplier == null) {
return "所选供应商不存在,请重新选择";
}
MesXslUnit unit = mesXslUnitService.getById(entity.getUnitId());
if (unit == null) {
return "所选单位不存在,请重新选择";
}
entity.setMixerMaterialName(mixerMaterial.getMaterialName());
entity.setSupplierName(supplier.getSupplierName());
entity.setUnitName(unit.getUnitName());
//update-begin---author:cursor ---date:20250602 for【密炼物料皮重策略】重叠校验增加物料规格维度-----------
if (entity.getMaterialSpec() != null) {
entity.setMaterialSpec(entity.getMaterialSpec().trim());
}
if (oConvertUtils.isEmpty(entity.getMaterialSpec())) {
entity.setMaterialSpec(null);
}
String normalizedSpec = oConvertUtils.isEmpty(entity.getMaterialSpec()) ? "" : entity.getMaterialSpec();
LambdaQueryWrapper<MesXslMixerMaterialTareStrategy> overlapQw = new LambdaQueryWrapper<>();
overlapQw.eq(MesXslMixerMaterialTareStrategy::getMixerMaterialId, entity.getMixerMaterialId())
.eq(MesXslMixerMaterialTareStrategy::getSupplierId, entity.getSupplierId())
.le(MesXslMixerMaterialTareStrategy::getEffectiveStartDate, endDate)
.ge(MesXslMixerMaterialTareStrategy::getEffectiveEndDate, startDate)
.apply("IFNULL(TRIM(material_spec), '') = {0}", normalizedSpec);
//update-end---author:cursor ---date:20250602 for【密炼物料皮重策略】重叠校验增加物料规格维度-----------
if (entity.getTenantId() != null) {
overlapQw.eq(MesXslMixerMaterialTareStrategy::getTenantId, entity.getTenantId());
}
if (isUpdate && oConvertUtils.isNotEmpty(entity.getId())) {
overlapQw.ne(MesXslMixerMaterialTareStrategy::getId, entity.getId());
}
if (count(overlapQw) > 0) {
return "同一租户、同一供应商、同一密炼物料且物料规格相同的时间段内,已存在策略,请勿重复维护";
}
return null;
}
//update-end---author:cursor ---date:20250602 for【密炼物料皮重策略】保存前校验与冗余回填-----------
}

View File

@@ -10,6 +10,7 @@ import org.jeecg.modules.xslmes.entity.MesXslRawMaterialCard;
import org.jeecg.modules.xslmes.entity.MesXslRawMaterialInventory;
import org.jeecg.modules.xslmes.entity.MesXslRawMaterialEntry;
import org.jeecg.modules.xslmes.entity.MesXslWarehouseArea;
import org.jeecg.modules.xslmes.entity.MesXslWeightRecord;
import org.jeecg.modules.xslmes.mapper.MesXslRawMaterialEntryMapper;
import org.jeecg.modules.xslmes.service.IMesXslRawMaterialCardService;
import org.jeecg.modules.xslmes.service.IMesXslRawMaterialInventoryService;
@@ -217,6 +218,75 @@ public class MesXslRawMaterialEntryServiceImpl
return result;
}
@Override
public Map<String, BigDecimal> sumCargoTareByBillNos(Collection<String> billNos) {
if (billNos == null || billNos.isEmpty()) {
return Collections.emptyMap();
}
Set<String> distinct = billNos.stream()
.filter(s -> s != null && !s.isBlank())
.collect(Collectors.toCollection(HashSet::new));
if (distinct.isEmpty()) {
return Collections.emptyMap();
}
LambdaQueryWrapper<MesXslRawMaterialEntry> qw = new LambdaQueryWrapper<>();
qw.in(MesXslRawMaterialEntry::getBillNo, distinct)
.select(MesXslRawMaterialEntry::getBillNo, MesXslRawMaterialEntry::getPalletTareTotal);
List<MesXslRawMaterialEntry> rows = this.list(qw);
Map<String, BigDecimal> result = new HashMap<>();
for (MesXslRawMaterialEntry row : rows) {
if (row.getBillNo() == null || row.getPalletTareTotal() == null) {
continue;
}
result.merge(row.getBillNo(), row.getPalletTareTotal(), BigDecimal::add);
}
return result;
}
@Override
public void fillWeightRecordDerivedFields(List<MesXslWeightRecord> records) {
if (records == null || records.isEmpty()) {
return;
}
List<String> billNos = records.stream()
.map(MesXslWeightRecord::getBillNo)
.filter(s -> s != null && !s.isBlank())
.distinct()
.collect(Collectors.toList());
if (billNos.isEmpty()) {
for (MesXslWeightRecord r : records) {
r.setEnteredWeight(BigDecimal.ZERO);
r.setCargoTareWeight(BigDecimal.ZERO);
applyRawMaterialWeight(r);
}
return;
}
Map<String, BigDecimal> enteredMap = sumEnteredWeightByBillNos(billNos);
Map<String, BigDecimal> cargoTareMap = sumCargoTareByBillNos(billNos);
for (MesXslWeightRecord r : records) {
String billNo = r.getBillNo();
if (billNo == null || billNo.isBlank()) {
r.setEnteredWeight(BigDecimal.ZERO);
r.setCargoTareWeight(BigDecimal.ZERO);
} else {
r.setEnteredWeight(enteredMap.getOrDefault(billNo, BigDecimal.ZERO));
r.setCargoTareWeight(cargoTareMap.getOrDefault(billNo, BigDecimal.ZERO));
}
applyRawMaterialWeight(r);
}
}
/** 原料重量 = 净重 - 货物皮重(不落库) */
private static void applyRawMaterialWeight(MesXslWeightRecord record) {
BigDecimal net = record.getNetWeight();
if (net == null) {
record.setRawMaterialWeight(null);
return;
}
BigDecimal cargo = record.getCargoTareWeight() != null ? record.getCargoTareWeight() : BigDecimal.ZERO;
record.setRawMaterialWeight(net.subtract(cargo));
}
@Override
@Transactional(rollbackFor = Exception.class)
public void batchStockInAndSyncInventory(Collection<String> ids) {

View File

@@ -540,3 +540,34 @@ jeecgboot-vue3/src/views/xslmes/mesXslRubberQuickTestRecord/MesXslRubberQuickTes
jeecgboot-vue3/src/views/xslmes/mesXslRubberQuickTestRecord/MesXslRubberQuickTestRecord.data.ts
jeecgboot-vue3/src/views/xslmes/mesXslRubberQuickTestRecord/components/MesXslRubberQuickTestRecordModal.vue
jeecgboot-vue3/src/views/mes/material/MesMaterialList.vue
-- author:cursor---date:20250602--for: 【密炼物料皮重策略】建表、CRUD、生效日期重叠校验、菜单授权 ---
jeecg-boot/jeecg-module-system/jeecg-system-start/src/main/resources/flyway/sql/mysql/V3.9.2_117__mes_xsl_mixer_material_tare_strategy.sql
jeecg-boot/jeecg-boot-module/jeecg-module-xslmes/src/main/java/org/jeecg/modules/xslmes/entity/MesXslMixerMaterialTareStrategy.java
jeecg-boot/jeecg-boot-module/jeecg-module-xslmes/src/main/java/org/jeecg/modules/xslmes/mapper/MesXslMixerMaterialTareStrategyMapper.java
jeecg-boot/jeecg-boot-module/jeecg-module-xslmes/src/main/java/org/jeecg/modules/xslmes/service/IMesXslMixerMaterialTareStrategyService.java
jeecg-boot/jeecg-boot-module/jeecg-module-xslmes/src/main/java/org/jeecg/modules/xslmes/service/impl/MesXslMixerMaterialTareStrategyServiceImpl.java
jeecg-boot/jeecg-boot-module/jeecg-module-xslmes/src/main/java/org/jeecg/modules/xslmes/controller/MesXslMixerMaterialTareStrategyController.java
jeecgboot-vue3/src/views/xslmes/mesXslMixerMaterialTareStrategy/MesXslMixerMaterialTareStrategyList.vue
jeecgboot-vue3/src/views/xslmes/mesXslMixerMaterialTareStrategy/MesXslMixerMaterialTareStrategy.data.ts
jeecgboot-vue3/src/views/xslmes/mesXslMixerMaterialTareStrategy/MesXslMixerMaterialTareStrategy.api.ts
jeecgboot-vue3/src/views/xslmes/mesXslMixerMaterialTareStrategy/components/MesXslMixerMaterialTareStrategyModal.vue
-- author:cursor---date:20250602--for: 【密炼物料皮重策略】新增物料规格/托盘重量,皮重改名为包装物重量 ---
jeecg-boot/jeecg-module-system/jeecg-system-start/src/main/resources/flyway/sql/mysql/V3.9.2_118__mes_xsl_mixer_material_tare_strategy_fields.sql
jeecg-boot/jeecg-boot-module/jeecg-module-xslmes/src/main/java/org/jeecg/modules/xslmes/entity/MesXslMixerMaterialTareStrategy.java
jeecg-boot/jeecg-boot-module/jeecg-module-xslmes/src/main/java/org/jeecg/modules/xslmes/service/impl/MesXslMixerMaterialTareStrategyServiceImpl.java
yy-admin-master/YY.Admin.Core/Entity/MesXslMixerMaterialTareStrategy.cs
yy-admin-master/YY.Admin.Services/Service/MixerMaterialTareStrategy/MixerMaterialTareStrategyService.cs
yy-admin-master/YY.Admin/Views/MixerMaterialTareStrategy/MixerMaterialTareStrategyListView.xaml
yy-admin-master/YY.Admin/Views/MixerMaterialTareStrategy/MixerMaterialTareStrategyEditDialogView.xaml
yy-admin-master/YY.Admin/ViewModels/MixerMaterialTareStrategy/MixerMaterialTareStrategyEditDialogViewModel.cs
jeecgboot-vue3/src/views/xslmes/mesXslMixerMaterialTareStrategy/MesXslMixerMaterialTareStrategy.data.ts
jeecgboot-vue3/src/views/xslmes/mesXslMixerMaterialTareStrategy/components/MesXslMixerMaterialTareStrategyModal.vue
-- author:cursor---date:20250602--for: 【密炼物料皮重策略】重叠校验明确纳入物料规格维度 ---
jeecg-boot/jeecg-boot-module/jeecg-module-xslmes/src/main/java/org/jeecg/modules/xslmes/service/IMesXslMixerMaterialTareStrategyService.java
jeecg-boot/jeecg-boot-module/jeecg-module-xslmes/src/main/java/org/jeecg/modules/xslmes/service/impl/MesXslMixerMaterialTareStrategyServiceImpl.java
jeecg-boot/jeecg-boot-module/jeecg-module-xslmes/src/main/java/org/jeecg/modules/xslmes/entity/MesXslMixerMaterialTareStrategy.java
jeecgboot-vue3/src/views/xslmes/mesXslMixerMaterialTareStrategy/MesXslMixerMaterialTareStrategy.data.ts
yy-admin-master/YY.Admin/Views/MixerMaterialTareStrategy/MixerMaterialTareStrategyEditDialogView.xaml

View File

@@ -0,0 +1,121 @@
-- 密炼物料皮重策略建表 + 菜单 MES基础资料+ admin 授权
SET NAMES utf8mb4;
CREATE TABLE IF NOT EXISTS `mes_xsl_mixer_material_tare_strategy` (
`id` varchar(32) NOT NULL COMMENT '主键',
`tenant_id` int DEFAULT NULL COMMENT '租户ID',
`mixer_material_id` varchar(32) NOT NULL COMMENT '密炼物料ID关联 mes_mixer_material.id',
`mixer_material_name` varchar(200) DEFAULT NULL COMMENT '密炼物料名称冗余',
`supplier_id` varchar(36) NOT NULL COMMENT '供应商ID关联 mes_xsl_supplier.id',
`supplier_name` varchar(100) DEFAULT NULL COMMENT '供应商名称冗余',
`tare_weight` decimal(12,3) NOT NULL COMMENT '皮重',
`unit_id` varchar(36) DEFAULT NULL COMMENT '单位ID关联 mes_xsl_unit.id',
`unit_name` varchar(64) DEFAULT NULL COMMENT '单位名称冗余',
`effective_start_date` date NOT NULL COMMENT '生效开始日期',
`effective_end_date` date NOT NULL COMMENT '生效截止日期',
`maintain_by` varchar(50) DEFAULT NULL COMMENT '维护人登录账号',
`sys_org_code` varchar(64) DEFAULT NULL COMMENT '所属部门',
`create_by` varchar(50) DEFAULT NULL COMMENT '创建人',
`create_time` datetime DEFAULT NULL COMMENT '创建时间',
`update_by` varchar(50) DEFAULT NULL COMMENT '修改人',
`update_time` datetime DEFAULT NULL COMMENT '修改时间',
`del_flag` int NOT NULL DEFAULT 0 COMMENT '逻辑删除0正常 1已删除',
PRIMARY KEY (`id`),
KEY `idx_mxmts_tenant_supplier_material` (`tenant_id`, `supplier_id`, `mixer_material_id`),
KEY `idx_mxmts_effective_dates` (`effective_start_date`, `effective_end_date`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='MES密炼物料皮重策略';
SET @mes_tenant_id = 1002;
SET @mes_base_pid = (
SELECT MIN(`id`) FROM `sys_permission`
WHERE `del_flag` = 0 AND `menu_type` = 0 AND `name` IN ('MES基础资料', 'MES资料')
);
SET @mes_base_pid = IFNULL(@mes_base_pid, '1860000000000000001');
UPDATE `sys_permission`
SET `is_leaf` = 0, `update_time` = NOW()
WHERE `id` = @mes_base_pid AND `is_leaf` = 1;
INSERT INTO `sys_permission` (
`id`, `parent_id`, `name`, `url`, `component`, `is_route`, `component_name`, `redirect`,
`menu_type`, `perms`, `perms_type`, `sort_no`, `always_show`, `icon`, `is_leaf`, `keep_alive`,
`hidden`, `hide_tab`, `description`, `create_by`, `create_time`, `update_by`, `update_time`,
`del_flag`, `rule_flag`, `status`, `internal_or_external`
)
SELECT
'177925970995580', @mes_base_pid, '密炼物料皮重策略', '/xslmes/mesXslMixerMaterialTareStrategy',
'xslmes/mesXslMixerMaterialTareStrategy/MesXslMixerMaterialTareStrategyList', 1, 'MesXslMixerMaterialTareStrategyList', NULL,
1, NULL, '0', 18.00, 0, 'ant-design:database-outlined', 0, 1,
0, 0, 'MES密炼物料皮重策略', 'admin', NOW(), 'admin', NOW(),
0, 0, '1', 0
FROM DUAL
WHERE NOT EXISTS (
SELECT 1 FROM `sys_permission`
WHERE `id` = '177925970995580'
OR (`del_flag` = 0 AND `menu_type` = 1 AND `name` = '密炼物料皮重策略' AND `parent_id` = @mes_base_pid)
);
INSERT INTO `sys_permission` (`id`, `parent_id`, `name`, `menu_type`, `perms`, `perms_type`, `sort_no`, `is_route`, `is_leaf`, `hidden`, `status`, `del_flag`, `create_by`, `create_time`)
SELECT '177925970995581', '177925970995580', '新增', 2, 'xslmes:mes_xsl_mixer_material_tare_strategy:add', '1', 1.00, 0, 1, 0, '1', 0, 'admin', NOW()
FROM DUAL WHERE NOT EXISTS (SELECT 1 FROM `sys_permission` WHERE `id` = '177925970995581');
INSERT INTO `sys_permission` (`id`, `parent_id`, `name`, `menu_type`, `perms`, `perms_type`, `sort_no`, `is_route`, `is_leaf`, `hidden`, `status`, `del_flag`, `create_by`, `create_time`)
SELECT '177925970995582', '177925970995580', '编辑', 2, 'xslmes:mes_xsl_mixer_material_tare_strategy:edit', '1', 2.00, 0, 1, 0, '1', 0, 'admin', NOW()
FROM DUAL WHERE NOT EXISTS (SELECT 1 FROM `sys_permission` WHERE `id` = '177925970995582');
INSERT INTO `sys_permission` (`id`, `parent_id`, `name`, `menu_type`, `perms`, `perms_type`, `sort_no`, `is_route`, `is_leaf`, `hidden`, `status`, `del_flag`, `create_by`, `create_time`)
SELECT '177925970995583', '177925970995580', '删除', 2, 'xslmes:mes_xsl_mixer_material_tare_strategy:delete', '1', 3.00, 0, 1, 0, '1', 0, 'admin', NOW()
FROM DUAL WHERE NOT EXISTS (SELECT 1 FROM `sys_permission` WHERE `id` = '177925970995583');
INSERT INTO `sys_permission` (`id`, `parent_id`, `name`, `menu_type`, `perms`, `perms_type`, `sort_no`, `is_route`, `is_leaf`, `hidden`, `status`, `del_flag`, `create_by`, `create_time`)
SELECT '177925970995584', '177925970995580', '批量删除', 2, 'xslmes:mes_xsl_mixer_material_tare_strategy:deleteBatch', '1', 4.00, 0, 1, 0, '1', 0, 'admin', NOW()
FROM DUAL WHERE NOT EXISTS (SELECT 1 FROM `sys_permission` WHERE `id` = '177925970995584');
INSERT INTO `sys_permission` (`id`, `parent_id`, `name`, `menu_type`, `perms`, `perms_type`, `sort_no`, `is_route`, `is_leaf`, `hidden`, `status`, `del_flag`, `create_by`, `create_time`)
SELECT '177925970995585', '177925970995580', '导出', 2, 'xslmes:mes_xsl_mixer_material_tare_strategy:exportXls', '1', 5.00, 0, 1, 0, '1', 0, 'admin', NOW()
FROM DUAL WHERE NOT EXISTS (SELECT 1 FROM `sys_permission` WHERE `id` = '177925970995585');
INSERT INTO `sys_permission` (`id`, `parent_id`, `name`, `menu_type`, `perms`, `perms_type`, `sort_no`, `is_route`, `is_leaf`, `hidden`, `status`, `del_flag`, `create_by`, `create_time`)
SELECT '177925970995586', '177925970995580', '导入', 2, 'xslmes:mes_xsl_mixer_material_tare_strategy:importExcel', '1', 6.00, 0, 1, 0, '1', 0, 'admin', NOW()
FROM DUAL WHERE NOT EXISTS (SELECT 1 FROM `sys_permission` WHERE `id` = '177925970995586');
INSERT INTO `sys_role_permission` (`id`, `role_id`, `permission_id`, `data_rule_ids`, `operate_date`, `operate_ip`)
SELECT REPLACE(UUID(), '-', ''), r.id, p.id, NULL, NOW(), '127.0.0.1'
FROM `sys_role` r
CROSS JOIN `sys_permission` p
WHERE r.`tenant_id` = @mes_tenant_id
AND r.`role_code` = 'admin'
AND p.`id` IN (
'177925970995580',
'177925970995581',
'177925970995582',
'177925970995583',
'177925970995584',
'177925970995585',
'177925970995586'
)
AND NOT EXISTS (
SELECT 1 FROM `sys_role_permission` rp
WHERE rp.`role_id` = r.id AND rp.`permission_id` = p.id
);
INSERT INTO `sys_role_permission` (`id`, `role_id`, `permission_id`, `data_rule_ids`, `operate_date`, `operate_ip`)
SELECT REPLACE(UUID(), '-', ''), r.id, p.id, NULL, NOW(), '127.0.0.1'
FROM `sys_role` r
CROSS JOIN `sys_permission` p
WHERE r.`role_code` = 'admin'
AND r.`tenant_id` IS NULL
AND p.`id` IN (
'177925970995580',
'177925970995581',
'177925970995582',
'177925970995583',
'177925970995584',
'177925970995585',
'177925970995586'
)
AND NOT EXISTS (
SELECT 1 FROM `sys_role_permission` rp
WHERE rp.`role_id` = r.id AND rp.`permission_id` = p.id
);

View File

@@ -0,0 +1,9 @@
-- 密炼物料皮重策略新增物料规格托盘重量皮重字段注释改为包装物重量
SET NAMES utf8mb4;
ALTER TABLE `mes_xsl_mixer_material_tare_strategy`
ADD COLUMN `material_spec` varchar(200) DEFAULT NULL COMMENT '物料规格' AFTER `supplier_name`,
ADD COLUMN `pallet_weight` decimal(12,3) DEFAULT NULL COMMENT '托盘重量' AFTER `tare_weight`;
ALTER TABLE `mes_xsl_mixer_material_tare_strategy`
MODIFY COLUMN `tare_weight` decimal(12,3) NOT NULL COMMENT '包装物重量';

View File

@@ -0,0 +1,8 @@
-- 原料入场记录托盘及皮重合计 + 拆码明细皮重策略相关字段
SET NAMES utf8mb4;
ALTER TABLE `mes_xsl_raw_material_entry`
ADD COLUMN `pallet_tare_total` decimal(12,3) DEFAULT NULL COMMENT '托盘及皮重合计' AFTER `total_weight`,
ADD COLUMN `portion_packaging_tare` varchar(500) DEFAULT NULL COMMENT '拆码明细包装物皮重拼接/分隔末尾带/' AFTER `portion_weight`,
ADD COLUMN `portion_pallet_weight` varchar(500) DEFAULT NULL COMMENT '拆码明细托盘重量拼接/分隔末尾带/' AFTER `portion_packaging_tare`,
ADD COLUMN `portion_tare_strategy_ids` varchar(1000) DEFAULT NULL COMMENT '拆码明细皮重策略ID拼接/分隔末尾带/' AFTER `portion_pallet_weight`;

View File

@@ -0,0 +1,6 @@
-- 原材料卡片包装物皮重托盘重量
SET NAMES utf8mb4;
ALTER TABLE `mes_xsl_raw_material_card`
ADD COLUMN `packaging_tare` decimal(12,3) DEFAULT NULL COMMENT '包装物皮重(KG)' AFTER `total_weight`,
ADD COLUMN `pallet_weight` decimal(12,3) DEFAULT NULL COMMENT '托盘重量(KG)' AFTER `packaging_tare`;