场景
SpringBoot+My BatisPlus+DataTables实现企业车间退货管理(学习企业级开发思想):
在上面实现退货管理的基础上,详解编辑时的逻辑控制和编辑时的回显checkbox选中。
效果
实现
实体类的扩展类新增IsSelected属性,标识不良品货位是否被选中。
package com.ws.bus.sys.vo.BusGoodsLocationVO;
import com.ws.bus.sys.entity.BusGoodsLocation;
import lombok.Data;
import java.util.Date;
@Data
public class BusGoodsLocationVO extends BusGoodsLocation {
private String locationTypeName;
private String shelveName;
private String materielStatus;
private String materielStatusName;
private Integer materielNum;
//是否是编辑操作
private Integer editFlag;
//选中要查询的车间仓库
private String selected;
private Integer tdNum;
private Integer trNum;
//当前不良品货位是否被选中
private Integer isSelected = 0;
private Date productDate;
private String trayNumber;
private Integer maxTrayAmount;
private Integer refundOrderFlag;
}
分析编辑时的mapper.xml文件
<select id="getPageRejectsLocations" resultMap="busGoodsLocationVOMap"
parameterType="com.ws.bus.sys.vo.BusGoodsLocationVO.BusGoodsLocationVO">
SELECT location.id,location.goods_location_number, code.code_name location_type_name,shelve.shelves_name
shelve_name,tm.materiel_name save_material_type_name ,sc.code_name materiel_status_name,lt.refund_order_flag
FROM bus_location_tray lt
LEFT JOIN bus_goods_location location on location.id = lt.location_id
LEFT JOIN sys_code code on code.code_type = 'location_type' and code.code_value = location.goods_location_type
LEFT JOIN bus_goods_shelves shelve on shelve.id = location.wh_shelves_id
LEFT JOIN sys_code sc on sc.code_type = 'materielCheckStatus' and sc.code_value = lt.materiel_check_status
LEFT JOIN (
SELECT DISTINCT tray_id,materiel_name
FROM bus_tray_materiel
WHERE deleted_flag = '0') tm on tm.tray_id = lt.tray_id
WHERE lt.materiel_check_status = 3 and lt.deleted_flag = 0
<if test="locationVO != null and locationVO.editFlag == 0">
and lt.refund_order_flag = 0
</if>
<if test="locationVO != null and locationVO.selected != null">
and location.goods_location_number like CONCAT(#{locationVO.selected},'%')
</if>
</select>
注:
1.层级关系为:
仓库--库区--货架--货位--托盘--物料
2.bus_goods_location
货位表 的id等于 bus_location_tray 的location_id 关联码表 货位表类型分为正常货位和不良品货位
3.bus_location_tray
货位-托盘绑定关系表
4.bus_goods_shelves
货架表
货架表的Id 等于 货位表的 wh_shelves_id 归属货架字段
关联码表 货位表的物料检验状态 为1正常 2不良品暂估 3不良品4待检
查询物料检验状态为3即不良品的
5.关联
bus_tray_materiel
托盘-物料绑定关系表,去重查一条
托盘的id 等于货位表的tray_id
6.条件
货位表的编号是不是以传递过来的A B C D 开头
如果是新增则 货位-托盘绑定关系表 的 refund_order_flag 是否已生成退货单(1-是 0 -否) 为0
新增与编辑判断逻辑
1.新增时要查询相应仓库的下的所有不良品货位,且没有生成出库单的。
所以在mapper中
<if test="locationVO != null and locationVO.editFlag == 0">
and lt.refund_order_flag = 0
</if>
来控制实现。
2.编辑时需要查询相应仓库的所有不良品货位下的,当前退货单对应的不良品以及 当前仓库下对应的不良品货位。目的是
为了实现修改退货单的不良品货位。
后台判断逻辑实现
//当编辑操作id存在时,表明是编辑操作
if (vo.getEditActionId() != null && vo.getEditActionId() != 0) {
page = locationService.pageRejectsLocations(refundOrderPage, vo, 1,wareNum);
//查询出当前退货单下的所有明细
QueryWrapper<WmsRefundOrderDetails> refundOrderDetailsQueryWrapper = new QueryWrapper<>();
refundOrderDetailsQueryWrapper.eq("refund_id", vo.getEditActionId()).eq("deleted_flag", "0");
List<WmsRefundOrderDetails> refundOrderDetails = refundOrderDetailsService.list(refundOrderDetailsQueryWrapper);
for (BusGoodsLocationVO locationVO : page.getRecords()) {
for (WmsRefundOrderDetails details : refundOrderDetails) {
if (details.getGoodsLocationId().equals(locationVO.getId())) {
locationVO.setIsSelected(1);
break;
}
}
}
//删除非此退货单对应的货位
Iterator<BusGoodsLocationVO> iterator = page.getRecords().iterator();
while(iterator.hasNext()){
BusGoodsLocationVO locationVO = iterator.next();
if (locationVO.getRefundOrderFlag() == 1 && locationVO.getIsSelected() == 0) {
iterator.remove();
}
}
} else {
page = locationService.pageRejectsLocations(refundOrderPage, vo, 0,wareNum);
}
注:
1.在编辑时根据选中的退货单的id,查询到当前退货单对应的不良品货位,然后将其IsSelected属性设置为1。
2.然后通过上面的mapper语句在编辑时查询出所有的退货单的不良品,然后通过下面的迭代器删除已经生成出库单且isSelected属性为0的(即其它退货单对应的不良品货位删除掉),这样就能保证将当前退货单对应的选中的不良品以及当前仓库下的不良品在编辑时都能查询出来。
JS中控制DataTables选中回显
columns: [
{ data: 'id' ,
"orderable" : false},
{ data: 'goodsLocationNumber' },
{ data: 'locationTypeName' ,
"orderable" : false},
{ data: 'saveMaterialTypeName' ,
"orderable" : false},
{ data: 'materielStatusName',
"orderable" : false},
{ data: 'shelveName' ,
"orderable" : false},
{ data: 'remark',
"orderable" : false }
],columnDefs: [{
// 指定第1列,从0开始,0表示第一列,1表示第二列……
"targets": 0,
"bSortable": false,
"render": function(data, type, row, meta) {
if (row.isSelected == 1){
return '<input type="checkbox" class="checkchild" onclick="childClick(this)" checked="checked" value="' + row.id + '" />'
}
return '<input type="checkbox" class="checkchild" onclick="childClick(this)" value="' + row.id + '" />'
}
}],