#
Junjie
2024-01-08 807fada3651530d15fe244d812e7b18bf40bdd78
#
3个文件已添加
5个文件已修改
334 ■■■■■ 已修改文件
zy-asrs-common/src/main/java/com/zy/asrs/common/domain/dto/ReportStockDto.java 17 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
zy-asrs-common/src/main/java/com/zy/asrs/common/wms/mapper/LocDetlMapper.java 3 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
zy-asrs-common/src/main/java/com/zy/asrs/common/wms/service/LocDetlService.java 3 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
zy-asrs-common/src/main/java/com/zy/asrs/common/wms/service/impl/LocDetlServiceImpl.java 6 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
zy-asrs-common/src/main/resources/mapper/wms/LocDetlMapper.xml 6 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
zy-asrs-openapi/src/main/java/com/zy/asrs/openapi/task/ReportApiScheduler.java 28 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
zy-asrs-openapi/src/main/webapp/views/md/reportStock.md 48 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
zy-asrs-openapi/src/main/webapp/views/reportStock.html 223 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
zy-asrs-common/src/main/java/com/zy/asrs/common/domain/dto/ReportStockDto.java
New file
@@ -0,0 +1,17 @@
package com.zy.asrs.common.domain.dto;
import lombok.Data;
@Data
public class ReportStockDto {
    //物料号
    private String matnr;
    //批号
    private String batch;
    //总量
    private Double anfme;
}
zy-asrs-common/src/main/java/com/zy/asrs/common/wms/mapper/LocDetlMapper.java
@@ -2,6 +2,7 @@
import com.baomidou.mybatisplus.core.metadata.IPage;
import com.zy.asrs.common.domain.dto.QueryStockPreDo;
import com.zy.asrs.common.domain.dto.ReportStockDto;
import com.zy.asrs.common.wms.entity.LocDetl;
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import org.apache.ibatis.annotations.Mapper;
@@ -36,4 +37,6 @@
    IPage<LocDetl> getStockOutPage(IPage<LocDetl> page, Map<String, Object> map);
    List<ReportStockDto> getReportStockDto(Long hostId);
}
zy-asrs-common/src/main/java/com/zy/asrs/common/wms/service/LocDetlService.java
@@ -2,6 +2,7 @@
import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.extension.service.IService;
import com.zy.asrs.common.domain.dto.ReportStockDto;
import com.zy.asrs.common.wms.entity.LocDetl;
import java.util.List;
@@ -27,4 +28,6 @@
    IPage<LocDetl> getStockOut(Integer curr, Integer limit, Map<String, Object> param);
    List<ReportStockDto> getReportStockDto(Long hostId);
}
zy-asrs-common/src/main/java/com/zy/asrs/common/wms/service/impl/LocDetlServiceImpl.java
@@ -3,6 +3,7 @@
import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.zy.asrs.common.domain.dto.QueryStockPreDo;
import com.zy.asrs.common.domain.dto.ReportStockDto;
import com.zy.asrs.common.wms.mapper.LocDetlMapper;
import com.zy.asrs.common.wms.entity.LocDetl;
import com.zy.asrs.common.wms.service.LocDetlService;
@@ -67,4 +68,9 @@
        Page<LocDetl> page = new Page<>(curr, limit);
        return this.baseMapper.getStockOutPage(page, param);
    }
    @Override
    public List<ReportStockDto> getReportStockDto(Long hostId) {
        return this.baseMapper.getReportStockDto(hostId);
    }
}
zy-asrs-common/src/main/resources/mapper/wms/LocDetlMapper.xml
@@ -173,4 +173,10 @@
        <include refid="stockOutCondition"></include>
    </select>
    <select id="getReportStockDto" resultType="com.zy.asrs.common.domain.dto.ReportStockDto">
        select matnr,batch,sum(anfme) anfme from wms_loc_detl
        where host_id = #{hostId}
        group by matnr,batch
    </select>
</mapper>
zy-asrs-openapi/src/main/java/com/zy/asrs/openapi/task/ReportApiScheduler.java
@@ -2,7 +2,10 @@
import com.alibaba.fastjson.JSON;
import com.alibaba.fastjson.JSONObject;
import com.alibaba.fastjson.serializer.SerializerFeature;
import com.alibaba.fastjson.support.config.FastJsonConfig;
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.zy.asrs.common.domain.dto.ReportStockDto;
import com.zy.asrs.common.domain.enums.ApiType;
import com.zy.asrs.common.domain.enums.OrderSettleType;
import com.zy.asrs.common.openapi.entity.ApiList;
@@ -12,6 +15,7 @@
import com.zy.asrs.common.utils.HttpHandler;
import com.zy.asrs.common.wms.entity.Order;
import com.zy.asrs.common.wms.entity.OrderDetl;
import com.zy.asrs.common.wms.service.LocDetlService;
import com.zy.asrs.common.wms.service.OrderDetlService;
import com.zy.asrs.common.wms.service.OrderService;
import org.apache.commons.codec.digest.DigestUtils;
@@ -35,6 +39,8 @@
    private OrderDetlService orderDetlService;
    @Autowired
    private HostKeyService hostKeyService;
    @Autowired
    private LocDetlService locDetlService;
    @Scheduled(cron = "0/3 * * * * ? ")
    public void orderComplete() {
@@ -138,7 +144,29 @@
                .eq(ApiList::getType, ApiType.REPORT_STOCK.type)
                .eq(ApiList::getStatus, 1));
        for (ApiList apiList : list) {
            List<ReportStockDto> reportStockDto = locDetlService.getReportStockDto(apiList.getHostId());
            //封装数据
            HashMap<String, Object> data = new HashMap<>();
            data.put("stock", reportStockDto);
            getSign(data, apiList.getHostId());//获取签名
            //保留null值
            FastJsonConfig fastJsonConfig = new FastJsonConfig();
            fastJsonConfig.setSerializerFeatures(SerializerFeature.WriteMapNullValue, SerializerFeature.WriteNullListAsEmpty, SerializerFeature.WriteNullStringAsEmpty);
            String paramData = JSON.toJSONString(data, fastJsonConfig.getSerializeConfig(), fastJsonConfig.getSerializerFeatures());
            try {
                String response = new HttpHandler.Builder()
                        .setUri(apiList.getUrl())
                        .setJson(JSON.toJSONString(paramData))
                        .build()
                        .doPost();
                JSONObject result = JSON.parseObject(response);
                if (result.getOrDefault("code", 0).equals(200)) {
                }
            } catch (Exception e) {
                e.printStackTrace();
            }
        }
    }
zy-asrs-openapi/src/main/webapp/views/md/reportStock.md
New file
@@ -0,0 +1,48 @@
## 库存上报
- **接口说明:** 库存上报
上报示例:
```
{
    "sign": "cb727b1cfaac0c1b15d6f20408678b24",
    "stock": [
        {
            "anfme": 5,
            "batch": "",
            "matnr": "LSH90152025"
        },
        {
            "anfme": 10,
            "batch": "",
            "matnr": "LSH90152050"
        }
    ]
}
```
#### 返回结果
系统上报后,请求方必须马上返回以下结果集,否则视为上报失败。
参数名称                        |类型        |出现要求    |描述
:----                        |:---        |:------    |:---
code                        |int        |R            |响应码,代码定义请见“附录A 响应吗说明”
msg                            |string        |R            |&nbsp;
示例:
```
{
    "code":200,
    "msg":"success",
}
```
## 附录A 响应码说明
响应码    |说明
:----    |:---
200        |处理成功
500        |系统内部错误
zy-asrs-openapi/src/main/webapp/views/reportStock.html
New file
@@ -0,0 +1,223 @@
<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>API开放平台</title>
    <link rel="stylesheet" href="../static/css/element.css">
    <link rel="stylesheet" href="../static/css/common.css">
    <script type="text/javascript" src="../static/js/jquery/jquery-3.3.1.min.js"></script>
    <script type="text/javascript" src="../static/js/vue.min.js"></script>
    <script type="text/javascript" src="../static/js/showdown.min.js"></script>
    <script type="text/javascript" src="../static/js/common.js"></script>
    <script type="text/javascript" src="../static/js/element.js"></script>
</head>
<body>
    <div id="app">
        <div id="content"></div>
        <div class="slider">
            <div><el-button type="text" @click="switchPage('index.html')">规范说明</el-button></div>
            <el-divider></el-divider>
            <div><el-button type="text" @click="switchPage('reportCompleted.html')">订单完成上报</el-button></div>
            <div><el-button type="text" @click="switchPage('reportCancel.html')">订单取消上报</el-button></div>
            <div><el-button type="text" @click="switchPage('reportStock.html')">库存上报</el-button></div>
            <div><el-button type="text" @click="switchPage('reportApiManage.html')">上报API管理</el-button></div>
            <el-divider></el-divider>
            <div><el-button type="text" @click="switchPage('getOrderType.html')">获取订单类型</el-button></div>
            <div><el-button type="text" @click="switchPage('getOrderStatus.html')">获取订单状态列表</el-button></div>
            <div><el-button type="text" @click="switchPage('getOrderList.html')">获取订单列表</el-button></div>
            <div><el-button type="text" @click="switchPage('generateOrderPakIn.html')">生成入库订单</el-button></div>
            <div><el-button type="text" @click="switchPage('generateOrderPakOut.html')">生成出库订单</el-button></div>
            <div><el-button type="text" @click="switchPage('createMat.html')">添加物料信息</el-button></div>
            <el-divider></el-divider>
            <div><el-button type="text" @click="keyList()">密钥管理</el-button></div>
        </div>
        <el-dialog title="密钥管理" :visible.sync="keyTableVisible">
            <el-table :data="keyTableData" v-loading="loading">
                <el-table-column property="hostId$" label="仓库"></el-table-column>
                <el-table-column property="signKey" label="签名密钥" width="150"></el-table-column>
                <el-table-column property="appKey" label="接口请求密钥" width="250"></el-table-column>
                <el-table-column property="createTime$" label="时间" width="200"></el-table-column>
                <el-table-column label="操作" width="400">
                    <template slot-scope="scope">
                        <el-button size="mini" @click="generateSignKey(scope.row.hostId)">签名密钥</el-button>
                        <el-button size="mini" @click="generateAppKey(scope.row.hostId)">接口密钥</el-button>
                        <el-switch
                                v-model="scope.row.signStatus"
                                @change="switchChange(scope.row.hostId,scope.row.signStatus)"
                                active-text="开启签名"
                                inactive-text="关闭签名">
                        </el-switch>
                    </template>
                </el-table-column>
            </el-table>
        </el-dialog>
    </div>
    <script>
        showdown.setOption('tables', true);
        var converter = new showdown.Converter()
        var app = new Vue({
            el: '#app',
            data: {
                keyTableVisible: false,
                keyTableData: [],
                loading: true
            },
            created() {
                this.init()
            },
            methods: {
                init() {
                    this.introduceClick()
                },
                introduceClick() {
                    $.ajax({
                        url: "md/reportStock.md",
                        headers: {'token': localStorage.getItem('token')},
                        method: 'GET',
                        success: function (res) {
                            // $("#content").html(marked.parse(res))
                            // console.log(converter.makeHtml(res))
                            $("#content").html(converter.makeHtml(res))
                        }
                    });
                },
                keyList() {
                    let that = this
                    this.keyTableVisible = true
                    $.ajax({
                        url: baseUrl + "/hostKey/list/auth",
                        headers: {'token': localStorage.getItem('token')},
                        data: {},
                        dataType:'json',
                        contentType:'application/json;charset=UTF-8',
                        method: 'POST',
                        success: function (res) {
                            let tmp = []
                            res.data.forEach((item, index) => {
                                item.signStatus = item.signStatus == 1 ? true : false;
                                tmp.push(item)
                            });
                            that.keyTableData = tmp
                            that.loading = false
                        }
                    });
                },
                generateSignKey(hostId) {
                    let that = this
                    this.$confirm('此操作将覆盖原签名密钥, 是否继续?', '提示', {
                        confirmButtonText: '确定',
                        cancelButtonText: '取消',
                        type: 'warning'
                    }).then(() => {
                        $.ajax({
                            url: baseUrl + "/hostKey/generateSignKey/auth",
                            headers: {'token': localStorage.getItem('token')},
                            data: {
                                hostId: hostId
                            },
                            dataType: 'json',
                            contentType: 'application/json;charset=UTF-8',
                            method: 'GET',
                            success: function (res) {
                                if (res.code === 200) {
                                    that.$message({
                                        type: 'success',
                                        message: '生成成功'
                                    });
                                    that.keyTableData.forEach((item, index) => {
                                        if (item.hostId == hostId) {
                                            item.signKey = res.data.signKey
                                        }
                                    });
                                } else {
                                    that.$message({
                                        type: 'error',
                                        message: res.msg
                                    });
                                }
                            }
                        });
                    }).catch(() => {
                        //取消
                    });
                },
                generateAppKey(hostId) {
                    let that = this
                    this.$confirm('此操作将覆盖原接口密钥, 是否继续?', '提示', {
                        confirmButtonText: '确定',
                        cancelButtonText: '取消',
                        type: 'warning'
                    }).then(() => {
                        $.ajax({
                            url: baseUrl + "/hostKey/generateAppKey/auth",
                            headers: {'token': localStorage.getItem('token')},
                            data: {
                                hostId: hostId
                            },
                            dataType: 'json',
                            contentType: 'application/json;charset=UTF-8',
                            method: 'GET',
                            success: function (res) {
                                if (res.code === 200) {
                                    that.$message({
                                        type: 'success',
                                        message: '生成成功'
                                    });
                                    that.keyTableData.forEach((item, index) => {
                                        if (item.hostId == hostId) {
                                            item.appKey = res.data.appKey
                                        }
                                    });
                                } else {
                                    that.$message({
                                        type: 'error',
                                        message: res.msg
                                    });
                                }
                            }
                        });
                    }).catch(() => {
                        //取消
                    });
                },
                switchChange(hostId, signStatus) {
                    let that = this
                    //签名校验开关
                    $.ajax({
                        url: baseUrl + "/hostKey/switchSign/auth",
                        headers: {'token': localStorage.getItem('token')},
                        data: {
                            hostId: hostId,
                            signStatus: signStatus ? 1 : 0,
                        },
                        dataType: 'json',
                        contentType: 'application/json;charset=UTF-8',
                        method: 'GET',
                        success: function (res) {
                            if (res.code === 200) {
                                that.$message({
                                    type: 'success',
                                    message: '切换成功'
                                });
                            } else {
                                that.$message({
                                    type: 'error',
                                    message: res.msg
                                });
                            }
                        }
                    });
                },
                switchPage(url) {
                    location.href = url
                }
            }
        })
    </script>
</body>
</html>