zy-asrs-common/src/main/java/com/zy/asrs/common/domain/dto/ReportStockDto.java | ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史 | |
zy-asrs-common/src/main/java/com/zy/asrs/common/wms/mapper/LocDetlMapper.java | ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史 | |
zy-asrs-common/src/main/java/com/zy/asrs/common/wms/service/LocDetlService.java | ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史 | |
zy-asrs-common/src/main/java/com/zy/asrs/common/wms/service/impl/LocDetlServiceImpl.java | ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史 | |
zy-asrs-common/src/main/resources/mapper/wms/LocDetlMapper.xml | ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史 | |
zy-asrs-openapi/src/main/java/com/zy/asrs/openapi/task/ReportApiScheduler.java | ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史 | |
zy-asrs-openapi/src/main/webapp/views/md/reportStock.md | ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史 | |
zy-asrs-openapi/src/main/webapp/views/reportStock.html | ●●●●● 补丁 | 查看 | 原始文档 | 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 | 示例: ``` { "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>