Junjie
2024-09-27 69e085fd101062814ac8d5413dacb87cc9a737e8
#库存冻结
13个文件已修改
2个文件已添加
464 ■■■■■ 已修改文件
zy-asrs-admin/src/components/locDetl/selectLocDetl/index.vue 11 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
zy-asrs-admin/src/components/locDetl/show.vue 7 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
zy-asrs-admin/src/views/loc/locDetl/index.vue 10 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
zy-asrs-admin/src/views/loc/locFreeze/index.vue 305 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
zy-asrs-admin/src/views/system/role/index.vue 7 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
zy-asrs-wms/src/main/java/com/zy/asrs/wms/asrs/controller/LocDetlController.java 10 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
zy-asrs-wms/src/main/java/com/zy/asrs/wms/asrs/entity/LocDetl.java 18 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
zy-asrs-wms/src/main/java/com/zy/asrs/wms/asrs/entity/ViewLocDetl.java 18 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
zy-asrs-wms/src/main/java/com/zy/asrs/wms/asrs/entity/param/LocDetlFreezeParam.java 14 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
zy-asrs-wms/src/main/java/com/zy/asrs/wms/asrs/manage/OutManage.java 4 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
zy-asrs-wms/src/main/java/com/zy/asrs/wms/asrs/mapper/ViewLocDetlMapper.java 2 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
zy-asrs-wms/src/main/java/com/zy/asrs/wms/asrs/service/LocDetlService.java 3 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
zy-asrs-wms/src/main/java/com/zy/asrs/wms/asrs/service/impl/CacheSiteServiceImpl.java 2 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
zy-asrs-wms/src/main/java/com/zy/asrs/wms/asrs/service/impl/LocDetlServiceImpl.java 32 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
zy-asrs-wms/src/main/resources/mapper/asrs/ViewLocDetlMapper.xml 21 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
zy-asrs-admin/src/components/locDetl/selectLocDetl/index.vue
@@ -85,6 +85,13 @@
        ...getColumnSearchProps('anfme'),
    },
    {
        title: formatMessage('db.man_loc_detl.freeze', '是否冻结'),
        dataIndex: 'freeze$',
        width: 140,
        ellipsis: true,
        ...getColumnSearchProps('freeze$'),
    },
    {
        title: formatMessage('db.man_loc_detl.status', '状态'),
        dataIndex: 'status$',
        width: 140,
@@ -224,8 +231,8 @@
    getPage()
}
watch(reload,(newVal,oldVal) => {
    if(reload.value) {
watch(reload, (newVal, oldVal) => {
    if (reload.value) {
        reloadPage()
    }
})
zy-asrs-admin/src/components/locDetl/show.vue
@@ -72,6 +72,13 @@
        ...getColumnSearchProps('anfme'),
    },
    {
        title: formatMessage('db.man_loc_detl.freeze', '是否冻结'),
        dataIndex: 'freeze$',
        width: 140,
        ellipsis: true,
        ...getColumnSearchProps('freeze$'),
    },
    {
        title: formatMessage('db.man_loc_detl.status', '状态'),
        dataIndex: 'status$',
        width: 140,
zy-asrs-admin/src/views/loc/locDetl/index.vue
@@ -104,6 +104,13 @@
    ...getColumnSearchProps('anfme'),
  },
  {
    title: formatMessage('db.man_loc_detl.freeze', '是否冻结'),
    dataIndex: 'freeze$',
    width: 140,
    ellipsis: true,
    ...getColumnSearchProps('freeze$'),
  },
  {
    title: formatMessage('db.man_loc_detl.status', '状态'),
    dataIndex: 'status$',
    width: 140,
@@ -279,7 +286,8 @@
          style="width: 140px;margin-right: 10px;" />
        <a-input v-model:value="searchParam.matnr" :placeholder="formatMessage('page.locDetl.matnr.input', '请输入商品编号')"
          style="width: 140px;margin-right: 10px;" />
        <a-input v-model:value="searchParam.orderNo" :placeholder="formatMessage('page.locDetl.orderNo.input', '请输入订单号')"
        <a-input v-model:value="searchParam.orderNo"
          :placeholder="formatMessage('page.locDetl.orderNo.input', '请输入订单号')"
          style="width: 140px;margin-right: 10px;" />
        <a-input v-model:value="searchParam.batch" :placeholder="formatMessage('page.locDetl.batch.input', '请输入批号')"
          style="width: 140px;margin-right: 10px;" />
zy-asrs-admin/src/views/loc/locFreeze/index.vue
New file
@@ -0,0 +1,305 @@
<script setup>
import { ref, reactive } from 'vue';
import { useRouter } from "vue-router";
import { get, post, postForm } from '@/utils/request.js'
import { message, Modal } from 'ant-design-vue';
import { logout } from '@/config.js';
import { formatMessage } from '@/utils/localeUtils.js';
import useTableSearch from '@/utils/tableUtils.jsx';
import SelectLocDetlView from '@/components/locDetl/selectLocDetl/index.vue'
const router = useRouter();
const TABLE_KEY = 'table-locDetl';
const selectLocDetlChild = ref(null)
const selectLocDetlViewShow = ref(false)
let tableData = ref([]);
getColumns();
const {
    getColumnSearchProps,
    handleResizeColumn,
} = useTableSearch();
const state = reactive({
    selectedRowKeys: [],
    loading: false,
    columns: [],
});
const onSelectChange = selectedRowKeys => {
    // console.log('selectedRowKeys changed: ', selectedRowKeys);
    state.selectedRowKeys = selectedRowKeys;
};
state.columns = [
    {
        title: formatMessage('db.man_loc_detl.anfme', '库存数量'),
        dataIndex: 'anfme',
        width: 140,
        ellipsis: true,
    },
    {
        title: formatMessage('db.man_loc_detl.loc_id', '库位'),
        dataIndex: 'locId$',
        width: 140,
        ellipsis: true,
        ...getColumnSearchProps('locId$'),
    },
    {
        title: formatMessage('db.man_loc_detl.loc_no', '库位号'),
        dataIndex: 'locNo',
        width: 140,
        ellipsis: true,
        ...getColumnSearchProps('locNo'),
    },
    {
        title: formatMessage('db.man_loc_detl.mat_id', '商品'),
        dataIndex: 'matId$',
        width: 140,
        ellipsis: true,
        ...getColumnSearchProps('matId$'),
    },
    {
        title: formatMessage('db.man_loc_detl.matnr', '商品编号'),
        dataIndex: 'matnr',
        width: 140,
        ellipsis: true,
        ...getColumnSearchProps('matnr'),
    },
    {
        title: formatMessage('db.man_loc_detl.order_no', '订单号'),
        dataIndex: 'orderNo',
        width: 140,
        ellipsis: true,
        ...getColumnSearchProps('orderNo'),
    },
    {
        title: formatMessage('db.man_loc_detl.batch', '批号'),
        dataIndex: 'batch',
        width: 140,
        ellipsis: true,
        ...getColumnSearchProps('batch'),
    },
    {
        title: formatMessage('db.man_loc_detl.anfme', '数量'),
        dataIndex: 'anfme',
        width: 140,
        ellipsis: true,
        ...getColumnSearchProps('anfme'),
    },
    {
        title: formatMessage('db.man_loc_detl.freeze', '是否冻结'),
        dataIndex: 'freeze$',
        width: 140,
        ellipsis: true,
        ...getColumnSearchProps('freeze$'),
    },
    {
        title: formatMessage('db.man_loc_detl.status', '状态'),
        dataIndex: 'status$',
        width: 140,
        ellipsis: true,
        ...getColumnSearchProps('status$'),
    },
    // {
    //   title: formatMessage('db.man_loc_detl.create_time', '添加时间'),
    //   dataIndex: 'createTime$',
    //   width: 140,
    //   ellipsis: true,
    //   ...getColumnSearchProps('createTime$'),
    // },
    // {
    //   title: formatMessage('db.man_loc_detl.create_by', '添加人员'),
    //   dataIndex: 'createBy$',
    //   width: 140,
    //   ellipsis: true,
    //   ...getColumnSearchProps('createBy$'),
    // },
    {
        title: formatMessage('db.man_loc_detl.update_time', '修改时间'),
        dataIndex: 'updateTime$',
        width: 140,
        ellipsis: true,
        ...getColumnSearchProps('updateTime$'),
    },
    {
        title: formatMessage('db.man_loc_detl.update_by', '修改人员'),
        dataIndex: 'updateBy$',
        width: 140,
        ellipsis: true,
        ...getColumnSearchProps('updateBy$'),
    },
    {
        title: formatMessage('db.man_loc_detl.memo', '备注'),
        dataIndex: 'memo',
        width: 140,
        ellipsis: true,
        ...getColumnSearchProps('memo'),
    },
];
//加载扩展字段
async function getColumns() {
    let fieldResp = await post('/api/matField/list', {
        unique: 1,
        fieldType: 1
    })
    let fieldResult = fieldResp.data;
    let tmp = state.columns;
    if (fieldResult.code == 200) {
        let data = fieldResult.data;
        data.forEach((item) => {
            tmp.push({
                title: formatMessage(item.language, item.describe),
                name: item.name,
                dataIndex: item.name,
                key: item.name,
                width: 140,
            })
        })
        tmp.push({
            title: formatMessage('common.operation', '操作'),
            name: 'oper',
            dataIndex: 'oper',
            key: 'oper',
            width: 140,
            fixed: 'right',
        })
        state.columns = tmp;
    } else if (result.code === 401) {
        message.error(result.msg);
        logout()
    } else {
        message.error(result.msg);
    }
}
const openSelect = () => {
    selectLocDetlChild.value.open = true;
}
const handleSelectLocDetlOk = (result) => {
    let tmp = [];
    if (tableData.value != undefined) {
        tmp = [...tableData.value]
    }
    for (let i = 0; i < result.length; i++) {
        let item = result[i]
        let flag = false;
        for (let j = 0; j < tmp.length; j++) {
            let tmpItem = tmp[j]
            if (item.id == tmpItem.id) {
                flag = true;
                break
            }
        }
        if (flag) {
            continue
        }
        tmp.push(item)
    }
    tableData.value = tmp;
}
const handleDel = (record) => {
    let data = tableData.value;
    let tmp = []
    for (let i = 0; i < data.length; i++) {
        let item = data[i]
        if (item.id == record.id) {
            continue
        }
        tmp.push(item)
    }
    tableData.value = tmp
}
const startFreeze = () => {
    if(state.selectedRowKeys.length == 0) {
        message.error(formatMessage("page.locFreeze.select.error", "请选择至少一条库存"));
        return;
    }
    post('/api/locDetl/freeze', {
        detlIds: state.selectedRowKeys,
        freeze: 1
    }).then(resp => {
        let result = resp.data;
        if (result.code == 200) {
            message.success(formatMessage('page.locFreeze.success', '冻结成功'));
            tableData.value = [];
            selectLocDetlChild.value.reload = true;
        } else {
            message.error(result.msg);
        }
    })
}
const stopFreeze = () => {
    if(state.selectedRowKeys.length == 0) {
        message.error(formatMessage("page.locFreeze.select.error", "请选择至少一条库存"));
        return;
    }
    post('/api/locDetl/freeze', {
        detlIds: state.selectedRowKeys,
        freeze: 0
    }).then(resp => {
        let result = resp.data;
        if (result.code == 200) {
            message.success(formatMessage('page.locFreeze.success', '解冻成功'));
            tableData.value = [];
            selectLocDetlChild.value.reload = true;
        } else {
            message.error(result.msg);
        }
    })
}
</script>
<script>
export default {
    name: '库存冻结'
}
</script>
<template>
    <div>
        <div class="table-header">
            <div>
                <a-button type="primary" @click="openSelect">提取库存</a-button>
                <a-button type="primary" style="margin-left: 5px;" @click="startFreeze">冻结</a-button>
                <a-button style="margin-left: 5px;" @click="stopFreeze">解冻</a-button>
            </div>
        </div>
        <a-table :row-selection="{ selectedRowKeys: state.selectedRowKeys, onChange: onSelectChange }"
            :data-source="tableData" :defaultExpandAllRows="false" :key="TABLE_KEY" rowKey="id"
            :scroll="{ y: 768, scrollToFirstRowOnChange: true }" :columns="state.columns"
            @resizeColumn="handleResizeColumn">
            <template #bodyCell="{ column, text, record }">
                <template v-if="column.dataIndex === 'oper'">
                    <div style="display: flex;justify-content: space-evenly;">
                        <a-button type="link" danger @click="handleDel(record)">{{ formatMessage('page.delete', '删除')
                            }}</a-button>
                    </div>
                </template>
            </template>
        </a-table>
        <SelectLocDetlView ref="selectLocDetlChild" @handle-ok="handleSelectLocDetlOk" />
    </div>
</template>
<style></style>
zy-asrs-admin/src/views/system/role/index.vue
@@ -209,11 +209,17 @@
}
const treeLoading = ref(false)
const loadMenuTree = (param) => {
  treeLoading.value = true;
  treeData.value = [];
  checkedKeys.value = [];
  post('/api/menu/tree', {}).then(resp => {
    let result = resp.data;
    let data = result.data;
    treeData.value = data;
    treeLoading.value = false;
  })
  get('/api/role/scope/list', {
@@ -267,6 +273,7 @@
    <a-drawer :width="500" :title="formatMessage('page.assign.role', '分配权限') + ' - ' + currentDrawerData?.name"
      placement="right" :open="openDrawer" @close="onCloseDrawer">
      <a-spin v-if="treeLoading" />
      <template #extra>
        <a-button style="margin-right: 8px" @click="onCloseDrawer">{{ formatMessage('common.cancel', '取消') }}</a-button>
        <a-button type="primary" @click="onSubmitDrawer">{{ formatMessage('common.submit', '提交') }}</a-button>
zy-asrs-wms/src/main/java/com/zy/asrs/wms/asrs/controller/LocDetlController.java
@@ -7,8 +7,10 @@
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.zy.asrs.framework.common.Cools;
import com.zy.asrs.framework.common.R;
import com.zy.asrs.framework.exception.CoolException;
import com.zy.asrs.wms.asrs.entity.*;
import com.zy.asrs.wms.asrs.entity.enums.LocStsType;
import com.zy.asrs.wms.asrs.entity.param.LocDetlFreezeParam;
import com.zy.asrs.wms.asrs.service.LocDetlFieldService;
import com.zy.asrs.wms.asrs.service.LocService;
import com.zy.asrs.wms.asrs.service.MatFieldService;
@@ -202,4 +204,12 @@
        }
    }
    @PreAuthorize("hasAuthority('asrs:locDetl:update')")
    @OperationLog("库存冻结")
    @PostMapping("/locDetl/freeze")
    public R freeze(@RequestBody LocDetlFreezeParam param) {
        locDetlService.locDetlFreeze(param);
        return R.ok();
    }
}
zy-asrs-wms/src/main/java/com/zy/asrs/wms/asrs/entity/LocDetl.java
@@ -132,6 +132,12 @@
    @ApiModelProperty(value= "备注")
    private String memo;
    /**
     * 库存冻结 1: 冻结  0: 正常
     */
    @ApiModelProperty(value= "库存冻结 1: 冻结  0: 正常")
    private Integer freeze;
    public LocDetl() {}
    public LocDetl(Long locId,String locNo,Long matId,String matnr,String orderNo,String batch,Double anfme,Long hostId,Integer status,Integer deleted,Date createTime,Long createBy,Date updateTime,Long updateBy,String memo) {
@@ -198,6 +204,18 @@
        return null;
    }
    public String getFreeze$(){
        if (null == this.freeze){ return null; }
        switch (this.freeze){
            case 1:
                return "冻结";
            case 0:
                return "正常";
            default:
                return String.valueOf(this.freeze);
        }
    }
    public String getStatus$(){
        if (null == this.status){ return null; }
        switch (this.status){
zy-asrs-wms/src/main/java/com/zy/asrs/wms/asrs/entity/ViewLocDetl.java
@@ -129,6 +129,12 @@
    @ApiModelProperty(value= "备注")
    private String memo;
    /**
     * 库存冻结 1: 冻结  0: 正常
     */
    @ApiModelProperty(value= "库存冻结 1: 冻结  0: 正常")
    private Integer freeze;
    public ViewLocDetl() {}
    public ViewLocDetl(Long locId, String locNo, Long matId, String matnr, String orderNo, String batch, Double anfme, Long hostId, Integer status, Integer deleted, Date createTime, Long createBy, Date updateTime, Long updateBy, String memo) {
@@ -195,6 +201,18 @@
        return null;
    }
    public String getFreeze$(){
        if (null == this.freeze){ return null; }
        switch (this.freeze){
            case 1:
                return "冻结";
            case 0:
                return "正常";
            default:
                return String.valueOf(this.freeze);
        }
    }
    public String getStatus$(){
        if (null == this.status){ return null; }
        switch (this.status){
zy-asrs-wms/src/main/java/com/zy/asrs/wms/asrs/entity/param/LocDetlFreezeParam.java
New file
@@ -0,0 +1,14 @@
package com.zy.asrs.wms.asrs.entity.param;
import lombok.Data;
import java.util.List;
@Data
public class LocDetlFreezeParam {
    private List<Long> detlIds;
    private Integer freeze;
}
zy-asrs-wms/src/main/java/com/zy/asrs/wms/asrs/manage/OutManage.java
@@ -857,6 +857,10 @@
            map.put(orderOutMergeDto.getLocId(), list);
        }
        if (map.isEmpty()) {
            throw new CoolException("库存不足");
        }
        for (Map.Entry<Long, List<OrderOutMergeDto>> entry : map.entrySet()) {
            Long locId = entry.getKey();
            List<OrderOutMergeDto> list = entry.getValue();
zy-asrs-wms/src/main/java/com/zy/asrs/wms/asrs/mapper/ViewLocDetlMapper.java
@@ -15,6 +15,8 @@
@Repository
public interface ViewLocDetlMapper extends BaseMapper<ViewLocDetl> {
    List<Map<String, Object>> queryStock(String matnr, String batch, List<FieldParam> param, @Param("sortParam") List<FieldSortParam> sortParam);
    List<Map<String, Object>> getList(String matnr, String batch, List<FieldParam> param, @Param("sortParam") List<FieldSortParam> sortParam);
    List<Map<String,Object>> getListLike(String matnr, String batch, List<FieldParam> param);
zy-asrs-wms/src/main/java/com/zy/asrs/wms/asrs/service/LocDetlService.java
@@ -6,6 +6,7 @@
import com.zy.asrs.wms.asrs.entity.ViewLocDetl;
import com.zy.asrs.wms.asrs.entity.param.FieldParam;
import com.zy.asrs.wms.asrs.entity.param.FieldSortParam;
import com.zy.asrs.wms.asrs.entity.param.LocDetlFreezeParam;
import com.zy.asrs.wms.common.domain.BaseParam;
import com.zy.asrs.wms.common.domain.PageParam;
@@ -24,4 +25,6 @@
    List<LocDetl> queryStock(String matnr, String batch, List<FieldParam> param, List<FieldSortParam> sortParam);
    void locDetlFreeze(LocDetlFreezeParam param);
}
zy-asrs-wms/src/main/java/com/zy/asrs/wms/asrs/service/impl/CacheSiteServiceImpl.java
@@ -80,7 +80,7 @@
        List<OrderDetl> orderDetls = orderDetlService.getOrderDetlByOrderId(orderId);
        boolean check = true;
        for (OrderDetl orderDetl : orderDetls) {
            Double anfme = Optional.of(orderDetl.getAnfme() - orderDetl.getWorkQty() - orderDetl.getQty()).orElse(0.0D);
            Double anfme = Optional.of(orderDetl.getAnfme() - orderDetl.getQty()).orElse(0.0D);
            Double workQty = stockMap.get(orderDetl.getId());
            if (!anfme.equals(workQty)) {
                check = false;
zy-asrs-wms/src/main/java/com/zy/asrs/wms/asrs/service/impl/LocDetlServiceImpl.java
@@ -10,6 +10,7 @@
import com.zy.asrs.wms.asrs.entity.enums.LocStsType;
import com.zy.asrs.wms.asrs.entity.param.FieldParam;
import com.zy.asrs.wms.asrs.entity.param.FieldSortParam;
import com.zy.asrs.wms.asrs.entity.param.LocDetlFreezeParam;
import com.zy.asrs.wms.asrs.mapper.LocDetlMapper;
import com.zy.asrs.wms.asrs.mapper.ViewLocDetlMapper;
import com.zy.asrs.wms.asrs.service.LanewayRuleService;
@@ -20,6 +21,7 @@
import com.zy.asrs.wms.common.domain.PageParam;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
import java.util.*;
@@ -99,7 +101,7 @@
    @Override
    public List<LocDetl> queryStock(String matnr, String batch, List<FieldParam> param, List<FieldSortParam> sortParam) {
        List<Map<String, Object>> list = viewLocDetlMapper.getList(matnr, batch, param, sortParam);
        List<Map<String, Object>> list = viewLocDetlMapper.queryStock(matnr, batch, param, sortParam);
        List<LocDetl> locDetlsSort = resortDetls(list);
        return locDetlsSort;
    }
@@ -180,4 +182,32 @@
        return sortDirctDetls;
    }
    @Override
    @Transactional
    public void locDetlFreeze(LocDetlFreezeParam param) {
        if (param == null) {
            throw new CoolException("参数不能为空");
        }
        if (param.getDetlIds() == null) {
            throw new CoolException("库存明细参数不能为空");
        }
        if (param.getFreeze() == null) {
            throw new CoolException("冻结参数不能为空");
        }
        List<LocDetl> locDetls = this.listByIds(param.getDetlIds());
        if(locDetls.isEmpty()){
            throw new CoolException("库存不存在");
        }
        for (LocDetl locDetl : locDetls) {
            locDetl.setFreeze(param.getFreeze());
            locDetl.setUpdateTime(new Date());
            if (!this.updateById(locDetl)) {
                throw new CoolException("更新失败");
            }
        }
    }
}
zy-asrs-wms/src/main/resources/mapper/asrs/ViewLocDetlMapper.xml
@@ -2,6 +2,27 @@
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="com.zy.asrs.wms.asrs.mapper.ViewLocDetlMapper">
    <select id="queryStock" resultType="map">
        select * from view_man_loc_detl ld
        where matnr = #{matnr}
        and freeze = 0
        <if test="batch!=null">
            and batch = #{batch}
        </if>
        <if test="param!=null and param.size()>0">
            <foreach item="item" collection="param" index="index">
                <if test="item.value!=null">
                    and ${item.name} = #{item.value}
                </if>
            </foreach>
        </if>
        <if test="sortParam!=null and sortParam.size()>0">
            <foreach collection="sortParam" item="item" open="order by " separator="," close="  ">
                ${item.name} ${item.value}
            </foreach>
        </if>
    </select>
    <select id="getList" resultType="map">
        select * from view_man_loc_detl ld
        where matnr = #{matnr}