文章

修改

项目编写流程

  1. 创建实体类,来产生对象和对应属性
  2. 编写Service层,包括Service接口和ServiceImpl实现,编写具体的实现逻辑调用
  3. 编写Controller层,装载Service接口,使用注解进行路径映射,在方法中调用Service接口方法来实现调用逻辑实现业务
  4. 根据具体的Controller和ServiceImpl来编写与数据交互的DAO层的Mapper接口和XML中编写SQL语句

东软ruoyi修改 - 工厂建模

首先看需求需要在修改中有明细和物料档案的显示和选择
需要引入物料档案的组件
建模明细包括设备信息的查询

改前须知
工厂建模页面需要四张表,mes_factory_modelmes_factory_model_detailwms_material_infomes_equipment
修改前搞清楚四张表的关联关系

数据库关联关系

mes_factory_model中有三个属性material_idproduct_line_nameremark

其中mes_factory_model中的id对应着mes_factory_model_detail中的product_line_id

material_id属性对应wms_material_info中的id属性。

mes_factory_model_detail中的equipment_id对应,mes_equipment中的id

1728559041713.jpg

代码生成

用工厂建模数据表导入后,修改路径配置
生成解压到路径

后端修改 物料档案编号-->物料名称

MesFactoryModel对应的实体类中需要添加物料名称属性,private String materialName;并且生成get/set方法


先将需要用到的模块装配Service到Controller中
这个Service有查询物料名称的方法

    @Autowired
    private IWmsMaterialInfoService materialInfoService;

具体做法就是在原本的public TableDataInfo list(MesFactoryModel mesFactoryModel)方法中将拿到的MesFactoryModel list中的对应id,放到materialInfoService中。
调用selectWmsMaterialInfoById方法,model.getMaterialId()使用id查询名称,遍历时将名称使用实体类中的set方法写入属性值。


public TableDataInfo list(MesFactoryModel mesFactoryModel)
{
    startPage();
    List<MesFactoryModel> list = mesFactoryModelService.selectMesFactoryModelList(mesFactoryModel);
    list.stream().forEach(model->{
    materialInfoService.selectWmsMaterialInfoById(model.getMaterialId());
    if(material!=null) {
        model.setMaterialName(material.getName());
        }
    });
    return getDataTable(list);
}

后端修改批量新增/删除工厂建模明细和单独删除的方法


在Mapper中新增一条方法`public int batchMesFactoryModeldetail(List mesFactoryModelDetailList)` Mapper XML中添加一条sql语句用于执行数据库操作
<insert id ="batchMesFactoryModeldetail">
    insert into mes_factory_model_detail(product_line_id,equipment_id) values
        <foreach item="item" index="index" collection="list" separator=",">
            (#{item.productLineId},#{item.equipmentId})
        </foreach>
</insert>

Mapper中新增public int deleteMesFactoryModelDetailByProductLineId(Long id);用来批量删除
XML中添加

<delete id="deleteMesFactoryModelDetailByProductLineIds" parameterType="String">
    delete from mes_factory_model_detail where product_line_id in 
        <foreach item="productLineId" collection="array" open="(" separator="," close=")">
            #{productLineId}
        </foreach>
</delete>

Mapper新增public int deleteMesFactoryModelDetailByProductLineId(Long id);
XML中添加

<delete id="deleteMesFactoryModelDetailByProductLineId" parameterType="Long">
     delete from mes_factory_model_detail where product_line_id = #{productLineId}
</delete>

在serviceImp中添加方法

/**
 * 新增工厂建模明细信息
 *
 * @param mesFactoryModel 工厂建模对象
 */
public void insertMesFactoryModelDetail(MesFactoryModel mesFactoryModel)
{
    List<MesFactoryModelDetail> mesFactoryModelDetailList = mesFactoryModel.getMesFactoryModelDetailList();
    Long id = mesFactoryModel.getId();
    if (StringUtils.isNotNull(mesFactoryModelDetailList))
    {
        List<MesFactoryModelDetail> list = new ArrayList<MesFactoryModelDetail>();
        for (MesFactoryModelDetail mesFactoryModelDetail : mesFactoryModelDetailList)
        {
            mesFactoryModelDetail.setProductLineId(id);
            list.add(mesFactoryModelDetail);
        }
        if (list.size() > 0)
        {
            
            mesFactoryModelMapper.batchMesFactoryModelDetail(list);
        }
    }
}

在新增工厂建模方法中添加调用添加工厂建模明细的方法

insertMesFactoryModelDetail(mesFactoryModel);

修改工厂建模的时候需要先将原明细数据删除,先调用删除明细的方法

/**
 * 修改工厂建模
 *
 * @param mesFactoryModel 工厂建模
 * @return 结果
 */
@Transactional
@Override
public int updateMesFactoryModel(MesFactoryModel mesFactoryModel)
{
    mesFactoryModelMapper.deleteMesFactoryModelDetailByProductLineId(mesFactoryModel.getId());
    insertMesFactoryModelDetail(mesFactoryModel);
    return mesFactoryModelMapper.updateMesFactoryModel(mesFactoryModel);
}

删除建模时也需要删除明细,在删除建模的方法中添加删除明细的方法

/**
 * 删除工厂建模信息
 *
 * @param id 工厂建模ID
 * @return 结果
 */
@Transactional
@Override
public int deleteMesFactoryModelById(Long id)
{
    mesFactoryModelMapper.deleteMesFactoryModelDetailByProductLineId(id);
    return mesFactoryModelMapper.deleteMesFactoryModelById(id);
}

前端修改

首先需要修改的就是数据表格的展示
在先前的表格中生成的是物料编号的展示,在后端修改,已经把产品名称MaterialName放入list中返回到前端中存放数据的factoryModelList
将table中的label和绑定的prop修改为需要的MaterialName

<el-table-column label="产品名称" align="center" prop="materialName" />

修改-添加和修改的对话框-上半
将下面的form修改为需要的字段和数据绑定
并引入import Editor from '@/components/MyEditor';在components中注册
接下来引入MaterialSelect组件

<el-form-item label="生产线名称" prop="productLineName">
  <el-input v-model="form.productLineName" placeholder="请输入生产线名称" />
</el-form-item>
<el-form-item label="产品名称" prop="materialName">
  <el-input v-model="form.materialName" placeholder="请选择产品">
    <el-button  v-no-more-click slot="append" @click="handleSelectMaterial">选择</el-button>
  </el-input>
</el-form-item>
<el-form-item label="产品规格" prop="productSpecification">
  <el-input disabled v-model="form.productSpecification" placeholder="请输入产品规格" />
</el-form-item>
<el-form-item label="产品型号" prop="productModel">
  <el-input disabled v-model="form.productModel" placeholder="请输入生产线名称" />
</el-form-item>
<el-form-item label="描述" prop="remark">
  <editor v-model="form.remark" :min-height="192" />
</el-form-item>

具体写什么

  1. 修改数据绑定
  2. 根据需求把需求中的选择按钮加在文本框中
    使用slot="append"将按钮加在文本框最右边
  3. 不可编辑需求加入到代码中
    附上disabled属性不可编辑
  4. 编写具体的方法和加入属性

一个属性,控制显示,两个方法点击取消和选择数据回显方法

<MaterialSelect :open="materialSelectOpen" @onCancel="handleMaterialCancel" @onSelected="handleMaterialSelected"/>

记得在属性中添加materialSelectOpen属性来控制开关
在方法中添加handleMaterialCancel``handleMaterialSelected

// 处理选择物料档案
handleSelectMaterial() {
  this.materialSelectOpen = true;
},
handleMaterialSelected(list) {
  if (list && list.length > 0) {
    this.material = list[0];
    this.form.materialId = this.material.id;
    this.form.materialName = this.material.name;
    this.form.productModel = this.material.model;
    this.form.productSpecification = this.material.specification;
  }
  this.materialSelectOpen = false;
},
handleMaterialCancel() {
  this.materialSelectOpen = false;
},

点击修改的数据回显在方法handleUpdate

修改-添加和修改的对话框-下半
如果使用代码生成中的主子表会自带这个线和按钮,如果使用单表生成就需要自己添加对应内容和方法

<el-divider content-position="center">工厂建模明细信息</el-divider>
<el-row :gutter="10" class="mb8">
  <el-col :span="1.5">
    <el-button type="primary" icon="el-icon-plus" size="mini"
      @click="handleAddMesFactoryModelDetail">添加</el-button>
  </el-col>
  <el-col :span="1.5">
    <el-button type="danger" icon="el-icon-delete" size="mini"
      @click="handleDeleteMesFactoryModelDetail">删除</el-button>
  </el-col>
</el-row

在下半表格中修改数据展示
修改建模明细信息

修改下方表格,绑定数据,加入插槽添加下拉选择菜单

<el-table :data="mesFactoryModelDetailList" :row-class-name="rowMesFactoryModelDetailIndex"
  @selection-change="handleMesFactoryModelDetailSelectionChange" ref="mesFactoryModelDetail" style="width:100%">
  <el-table-column type="selection" align="center" width="50" />
  <el-table-column label="序号" align="center" prop="index" width="50" />
  <el-table-column label="设备编号" prop="equipmentId" width="150">
    <template slot-scope="scope">
      <el-form-item :prop="'mesFactoryModelDetailList.' + scope.$index + '.equipmentId'"
        :rules="rules.equipmentId">
        <el-select v-model="scope.row.equipmentId" placeholder="请选择设备" clearable
          @change="handleEquipChange(scope.row.equipmentId, scope.$index)">
          <el-option v-for="dict in equipmentIdOptions" :key="dict.dictValue" :label="dict.dictLabel"
            :value="parseInt(dict.dictValue)"></el-option>
        </el-select>
      </el-form-item>
    </template>
  </el-table-column>
  <el-table-column label="编码" align="center" prop="code" />
  <el-table-column label="型号" align="center" prop="model" />
  <el-table-column label="生产日期" align="center" prop="productDate">
    <template slot-scope="scope">
      <span>{{ parseTime(scope.row.productDate, '{y}-{m}-{d}') }}</span>
    </template>
  </el-table-column>
  <el-table-column label="生产批号" align="center" prop="batchNo" />
  <el-table-column label="制造商" align="center" prop="manufacturer" />
</el-table>

加入校验规则,在属性的rules中加入

equipmentId: [
  { required: true, message: "设备不能为空", trigger: "change" }
],

在方法中定义工厂建模明细添加按钮操作方法

handleAddMesFactoryModelDetail() {
  let obj = {};
  obj.equipmentId = "";
  obj.code = "";
  obj.model = "";
  obj.manufacturer = "";
  obj.productDate = "";
  obj.batchNo = "";
  this.mesFactoryModelDetailList.push(obj);
},

定义删除按钮方法
先定义checkedMesFactoryModelDetail[]来存放勾选数据(应该代码生成有)

handleDeleteMesFactoryModelDetail() {
  //先判断是否为空,提醒勾选
  if (this.checkedMesFactoryModelDetail.length == 0) {
    this.$alert("请先选择要删除的工厂建模明细数据", "提示", { confirmButtonText: "确认", });
  //不为空传入勾选数据删除数组元素清除选择和切换行的选中状态
  } else {
    this.mesFactoryModelDetailList.splice(this.checkedMesFactoryModelDetail[0].index - 1, 1);
  }
},

接下来定义勾选方法定义

/** 工厂建模明细序号 */
//
rowMesFactoryModelDetailIndex({ row, rowIndex }) {
  row.index = rowIndex + 1;
},

这里用到了两个elementui的方法clearSelectiontoggleRowSelection方法清除选择和切换行的选中状态

handleMesFactoryModelDetailSelectionChange(selection) {
  if (selection.length > 1) {
    this.$refs.mesFactoryModelDetail.clearSelection();
    this.$refs.mesFactoryModelDetail.toggleRowSelection(selection.pop());
  } else {
    this.checkedMesFactoryModelDetail = selection;
  }
},

先查询设备明细,引入api import { getEquipmentInfo } from "@/api/baseInfo/equipmentInfo";

getEquipmentDetail(eqId, row) {
  if(!eqId){
    return;
  }
  getEquipmentInfo(eqId).then(res => {
        Object.assign(row, res.data);
  });
},

编写改变设备明细逻辑

handleEquipChange(val, index) {
  if (val) {
    let row = this.mesFactoryModelDetailList[index];
    this.getEquipmentDetail(val, row);
  }
},

修改列表中修改按钮绑定的点击方法

/** 修改按钮操作 */
handleUpdate(row) {
  this.reset();
  const id = row.id || this.ids
  console.log(row);
  getModel(id).then(response => {
    this.form = response.data;
    this.mesFactoryModelDetailList = response.data.mesFactoryModelDetailList;
    console.log(this.mesFactoryModelDetailList);
    this.mesFactoryModelDetailList.forEach(eq => {
      let obj = {
        code: '',
        manufacturer: '',
        productDate: '',
        batchNo: '',
        model: '',
      }
      this.mesFactoryModelDetailList.push(Object.assign(obj, eq));
    });
    this.mesFactoryModelDetailList.forEach(eq => {
      this.getEquipmentDetail(eq.equipmentId, eq);
    });
    this.open = true;
    this.title = "修改工厂建模";
  });
},

物料档案

代码生成好物料档案的代码导入
修改前端使用布局分开左右两边

工艺建模

代码生成对应代码路径改为.mes,模块名mesModel,业务名processModel,导入对应的前端后端

工艺建模--后端修改

和工厂建模相同思路
com.neu.carbon.mes.domain实体类中添加属性materialName并生成getset方法
在对应的Controller中载入物料档案的Service

@Autowired
private IWmsMaterialInfoService WmsMaterialInfoService;

在查询方法中进行遍历

public TableDataInfo list(MesProcessModel mesProcessModel)
{
    startPage();
    List<MesProcessModel> list = mesProcessModelService.selectMesProcessModelList(mesProcessModel);
    //遍历到对象model,将model获取id在物料档案中循环
    list.forEach(model->{
        WmsMaterialInfo wmsMaterialInfo = WmsMaterialInfoService.selectWmsMaterialInfoById(model.getMaterialId());
        if (wmsMaterialInfo != null){
            model.setMaterailName(wmsMaterialInfo.getName());
        }
    });
    return getDataTable(list);
}

还要做获取工艺建模详细信息

public AjaxResult getInfo(@PathVariable("id") Long id)
{
    MesProcessModel mesProcessModel = mesProcessModelService.selectMesProcessModelById(id);
    WmsMaterialInfo wmsMaterialInfo = WmsMaterialInfoService.selectWmsMaterialInfoById(mesProcessModel.getMaterialId());
    if (wmsMaterialInfo != null){
        mesProcessModel.setMaterialName(wmsMaterialInfo.getName());
    }
    return AjaxResult.success(mesProcessModel);
}

License:  CC BY 4.0