2026.3.19 晚

缓存出库确认后台
This commit is contained in:
1009473166@qq.com
2026-04-27 15:58:34 +08:00
parent 3729d0df5f
commit 52ce9135da
20 changed files with 320 additions and 162 deletions

View File

@@ -659,7 +659,7 @@ public class ToErpServiceImpl implements IToErpService {
callBackErp.setCcompany(inStockin.getCompanyShortName()); // 公司简称
callBackErp.setCcode(inStockin.getStockinId()); // wms 单据号
callBackErp.setDdate(inStockin.getFinishDate()); // 操作日期
callBackErp.setCintype("1"); // 业务类型
callBackErp.setCintype(inStockin.getInType()); // 业务类型
callBackErp.setCvencode(inStockin.getSupplierNo()); // 供应商编码
callBackErp.setCvenname(inStockin.getSupplierNo()); // 供应商名称
callBackErp.setCoptname(inStockin.getCreateManId()); // 操作人
@@ -720,7 +720,7 @@ public class ToErpServiceImpl implements IToErpService {
String sendMsg = JSONUtil.toJsonStr(callBackErp);
try {
//todo 发送给erp 成功失败改状态
RequestLog requestLog = requestLogService.getRequestLog("http://192.168.188.235/app1/api?type=1&key=1", JSONUtil.toJsonStr(callBackErp), "入库回传", "wms", "erp");
RequestLog requestLog = requestLogService.getRequestLog("http://192.168.188.235/app1/api?type=1&key=1", JSONUtil.toJsonStr(callBackErp), "入库回传", "wms", "erp", inStockin.getInType(), inStockin.getAccountSetNo());
if ("1".equals(requestLog.getIsSuccessful())) {
inStockin.setSendStatus("1");
inStockin.setSendTime(new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").format(new Date()));
@@ -728,6 +728,8 @@ public class ToErpServiceImpl implements IToErpService {
inStockinDetailParam.setSendStatus("1");
inStockinDetailParam.setSendTime(new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").format(new Date()));
inStockinDetailParam.setMsg("成功");
inStockinDetailBackService.insertInStockInDetailBackFinish(inStockinDetails);
inStockinDetailBackService.deleteInStockInDetailList(inStockinDetails);
} else {
inStockin.setSendStatus("2");
inStockin.setSendTime(new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").format(new Date()));
@@ -739,6 +741,7 @@ public class ToErpServiceImpl implements IToErpService {
inStockinBackService.updateInStockinBack(inStockin);
inStockinDetailBackService.updateInStockinDetailBack(inStockinDetailParam);
} catch (Exception e) {
inStockin.setSendStatus("2");
inStockin.setSendTime(new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").format(new Date()));
@@ -752,6 +755,11 @@ public class ToErpServiceImpl implements IToErpService {
}
public static void main(String[] args) {
System.out.println(new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").format(new Date()));
}
@Override
public void callbackDeliveryOutNoticeNew() {
OutStockoutBack outStockoutBack = outStockoutBackService.selelctTopOutStockout();

View File

@@ -44,7 +44,7 @@ public class ToWcsServiceImpl implements IToWcsService {
@Override
eduled(fixedDelay=1500)
@Scheduled(fixedDelay=1500)
public void pushOutMydoJob() {
//查询所有未推送的料箱出库作业
MydoJob mydoJobParam = new MydoJob();

View File

@@ -4,6 +4,7 @@ import java.util.List;
import com.ruoyi.in.stockin.domain.InStockin;
import com.ruoyi.in.stockindeatilback.domain.InStockinDetailBack;
import org.apache.ibatis.annotations.Param;
/**
* 入库单据子信息Mapper接口
@@ -11,8 +12,7 @@ import com.ruoyi.in.stockindeatilback.domain.InStockinDetailBack;
* @author ruoyi
* @date 2026-01-27
*/
public interface InStockinDetailBackMapper
{
public interface InStockinDetailBackMapper {
/**
* 查询入库单据子信息
*
@@ -36,6 +36,7 @@ public interface InStockinDetailBackMapper
* @return 结果
*/
public int insertInStockinDetailBack(InStockinDetailBack inStockinDetailBack);
public int insertInStockinDetailBackById(InStockin inStockin);
/**
@@ -61,4 +62,8 @@ public interface InStockinDetailBackMapper
* @return 结果
*/
public int deleteInStockinDetailBackByStockinDetailIds(String[] stockinDetailIds);
void insertInStockInDetailBackFinish(@Param("list") List<InStockinDetailBack> inStockinDetailParam);
void deleteInStockInDetailList(@Param("idList") List<InStockinDetailBack> inStockinDetails);
}

View File

@@ -58,4 +58,8 @@ public interface IInStockinDetailBackService
* @return 结果
*/
public int deleteInStockinDetailBackByStockinDetailId(String stockinDetailId);
void insertInStockInDetailBackFinish(List<InStockinDetailBack> inStockinDetailParam);
void deleteInStockInDetailList(List<InStockinDetailBack> inStockinDetails);
}

View File

@@ -90,4 +90,14 @@ public class InStockinDetailBackServiceImpl implements IInStockinDetailBackServi
{
return inStockinDetailBackMapper.deleteInStockinDetailBackByStockinDetailId(stockinDetailId);
}
@Override
public void insertInStockInDetailBackFinish(List<InStockinDetailBack> inStockinDetailParam) {
inStockinDetailBackMapper.insertInStockInDetailBackFinish(inStockinDetailParam);
}
@Override
public void deleteInStockInDetailList(List<InStockinDetailBack> inStockinDetails) {
inStockinDetailBackMapper.deleteInStockInDetailList(inStockinDetails);
}
}

View File

@@ -1,6 +1,7 @@
package com.ruoyi.in.stockindetail.mapper;
import com.ruoyi.in.stockin.domain.InStockin;
import com.ruoyi.in.stockindeatilback.domain.InStockinDetailBack;
import com.ruoyi.in.stockindetail.domain.InStockinDetail;
import org.apache.ibatis.annotations.Param;
@@ -69,4 +70,5 @@ public interface InStockinDetailMapper
void deleteInStockinDetailByStockinGuid(String stockinGuid);
InStockinDetail selectStockinByDetailById(InStockinDetail inStockinDetail);
}

View File

@@ -2,6 +2,7 @@ package com.ruoyi.in.stockindetail.service;
import com.ruoyi.common.core.domain.AjaxResult;
import com.ruoyi.in.stockin.domain.InStockin;
import com.ruoyi.in.stockindeatilback.domain.InStockinDetailBack;
import com.ruoyi.in.stockindetail.domain.InStockinDetail;
import java.util.List;
@@ -81,4 +82,6 @@ public interface IInStockinDetailService
public InStockinDetail selectStockinByDetailById(InStockinDetail inStockinDetail);
}

View File

@@ -3,6 +3,7 @@ package com.ruoyi.in.stockindetail.service.impl;
import com.ruoyi.common.annotation.DataScope;
import com.ruoyi.common.core.domain.AjaxResult;
import com.ruoyi.in.stockin.domain.InStockin;
import com.ruoyi.in.stockindeatilback.domain.InStockinDetailBack;
import com.ruoyi.in.stockindetail.domain.InStockinDetail;
import com.ruoyi.in.stockindetail.mapper.InStockinDetailMapper;
import com.ruoyi.in.stockindetail.service.IInStockinDetailService;
@@ -127,4 +128,6 @@ public class InStockinDetailServiceImpl implements IInStockinDetailService
return inStockinDetailMapper.selectStockinByDetailById(inStockinDetail);
}
}

View File

@@ -69,6 +69,9 @@ public interface IRequestLogService
* @return
*/
public RequestLog getRequestLog(String url, String param, String remark,String source,String target);
public RequestLog getRequestLog(String url, String param, String remark,String source,String target,String billType,String ciccid);
/**
* 接收接口记录
*

View File

@@ -3,6 +3,7 @@ package com.ruoyi.log.service.impl;
import cn.hutool.core.convert.Convert;
import cn.hutool.core.date.DateUnit;
import cn.hutool.core.date.DateUtil;
import cn.hutool.http.HttpRequest;
import cn.hutool.http.HttpUtil;
import cn.hutool.json.JSONUtil;
import com.ruoyi.common.core.domain.AjaxResult;
@@ -24,8 +25,7 @@ import java.util.List;
*/
@Service
@Slf4j
public class RequestLogServiceImpl implements IRequestLogService
{
public class RequestLogServiceImpl implements IRequestLogService {
@Autowired
private RequestLogMapper requestLogMapper;
@@ -36,8 +36,7 @@ public class RequestLogServiceImpl implements IRequestLogService
* @return 接口记录
*/
@Override
public RequestLog selectRequestLogByRequestId(Long requestId)
{
public RequestLog selectRequestLogByRequestId(Long requestId) {
return requestLogMapper.selectRequestLogByRequestId(requestId);
}
@@ -48,8 +47,7 @@ public class RequestLogServiceImpl implements IRequestLogService
* @return 接口记录
*/
@Override
public List<RequestLog> selectRequestLogList(RequestLog requestLog)
{
public List<RequestLog> selectRequestLogList(RequestLog requestLog) {
return requestLogMapper.selectRequestLogList(requestLog);
}
@@ -60,8 +58,7 @@ public class RequestLogServiceImpl implements IRequestLogService
* @return 结果
*/
@Override
public int insertRequestLog(RequestLog requestLog)
{
public int insertRequestLog(RequestLog requestLog) {
return requestLogMapper.insertRequestLog(requestLog);
@@ -74,8 +71,7 @@ public class RequestLogServiceImpl implements IRequestLogService
* @return 结果
*/
@Override
public int updateRequestLog(RequestLog requestLog)
{
public int updateRequestLog(RequestLog requestLog) {
return requestLogMapper.updateRequestLog(requestLog);
}
@@ -86,8 +82,7 @@ public class RequestLogServiceImpl implements IRequestLogService
* @return 结果
*/
@Override
public int deleteRequestLogByRequestIds(Long[] requestIds)
{
public int deleteRequestLogByRequestIds(Long[] requestIds) {
return requestLogMapper.deleteRequestLogByRequestIds(requestIds);
}
@@ -98,8 +93,7 @@ public class RequestLogServiceImpl implements IRequestLogService
* @return 结果
*/
@Override
public int deleteRequestLogByRequestId(Long requestId)
{
public int deleteRequestLogByRequestId(Long requestId) {
return requestLogMapper.deleteRequestLogByRequestId(requestId);
}
@@ -122,7 +116,9 @@ public class RequestLogServiceImpl implements IRequestLogService
requestLog.setRequestBody(param);
requestLog.setRequestUrl(url);
try {
String resStr = HttpUtil.post(url, param);
String resStr = HttpRequest.post(url).form("datajson", param).form("ibilltype", "").form("cacc_id", "").contentType("application/x-www-from-urlencoded").
timeout(2000).execute().body();
// String resStr = HttpUtil.post(url, param);
requestLog.setResponseBody(resStr);
// 判断resStr的状态码,如果不是200抛出异常让catch捕获
if (!JSONUtil.isJsonObj(resStr)) {
@@ -147,6 +143,47 @@ public class RequestLogServiceImpl implements IRequestLogService
return requestLog;
}
@Override
public RequestLog getRequestLog(String url, String param, String remark, String source, String target, String billType, String ciccid) {
RequestLog requestLog = new RequestLog();
requestLog.setRequestTime(DateUtil.formatDateTime(new Date()));
requestLog.setSourceSystem(source);
requestLog.setTargetSystem(target);
requestLog.setEndpoint(remark);
requestLog.setRequestMethod("post");
requestLog.setRequestHeaders(null);
requestLog.setRequestBody("datajson:" + param + ",ibilltype:" + billType + ",cacc_id:" + ciccid);
requestLog.setRequestUrl(url);
try {
String resStr = HttpRequest.post(url).form("datajson", param).form("ibilltype", billType).form("cacc_id", ciccid).contentType("application/x-www-from-urlencoded").
timeout(2000).execute().body();
// String resStr = HttpUtil.post(url, param);
requestLog.setResponseBody(resStr);
// 判断resStr的状态码,如果不是200抛出异常让catch捕获
if (!JSONUtil.isJsonObj(resStr)) {
throw new RuntimeException("返回结果不是有效的JSON对象");
}
cn.hutool.json.JSONObject jsonObject = JSONUtil.parseObj(resStr);
Object codeObj = jsonObject.get("code");
if (codeObj == null || !codeObj.toString().equals("200")) {
throw new RuntimeException("请求失败,状态码: " + (codeObj != null ? codeObj.toString() : "null"));
}
requestLog.setResponseTime(DateUtil.formatDateTime(new Date()));
requestLog.setResponseStatus("1");
requestLog.setDuration(Convert.toStr(DateUtil.between(Convert.toDate(requestLog.getRequestTime()), Convert.toDate(requestLog.getResponseTime()), DateUnit.MS)));
requestLog.setIsSuccessful("1");
} catch (Exception e) {
requestLog.setErrorDetails(e.getMessage());
requestLog.setIsSuccessful("0");
requestLog.setResponseStatus("0");
} finally {
insertRequestLog(requestLog);
}
return requestLog;
}
/**
* 插入请求日志
*

View File

@@ -6,9 +6,9 @@ spring:
druid:
# 主库数据源
master:
url: jdbc:sqlserver://192.168.188.236:1433;databaseName=FT546-wms;encrypt=true;trustServerCertificate=true;
url: jdbc:sqlserver://127.0.0.1:1433;databaseName=FT546-wms;encrypt=true;trustServerCertificate=true;
username: sa
password: Flrd0914.
password: 123456
# 从库数据源
slave:
# 从数据源开关/默认关闭

View File

@@ -71,7 +71,7 @@ spring:
# redis 配置
redis:
# 地址
host: 192.168.188.236
host: 127.0.0.1
# 端口,默认为6379
port: 6379
# 数据库索引

View File

@@ -27,6 +27,8 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
<result property="sendStatus" column="send_status"/>
<result property="sendTime" column="send_time"/>
<result property="msg" column="msg"/>
<result property="msg" column="msg"/>
<result property="msg" column="msg"/>
</resultMap>
<sql id="selectInStockinBackVo">

View File

@@ -274,10 +274,30 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
delete from in_stockin_detail_back where stockin_detail_id = #{stockinDetailId}
</delete>
<insert id="insertInStockInDetailBackFinish" parameterType="java.util.List">
INSERT INTO in_stockin_detail_back_finish
<foreach collection="list" item="item" separator="UNION ALL">
SELECT * FROM in_stockin_detail_back
WHERE stockin_detail_id = #{item.stockinDetailId}
</foreach>
</insert>
<delete id="deleteInStockinDetailBackByStockinDetailIds" parameterType="String">
delete from in_stockin_detail_back where stockin_detail_id in
<foreach item="stockinDetailId" collection="array" open="(" separator="," close=")">
#{stockinDetailId}
</foreach>
</delete>
<delete id="deleteInStockInDetailList">
DELETE FROM in_stockin_detail
WHERE stockin_detail_id IN
<foreach collection="idList" item="id" open="(" separator="," close=")">
#{id}
</foreach>
</delete>
</mapper>

View File

@@ -343,4 +343,9 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
</where>
order by ist.create_date desc
</select>
</mapper>

View File

@@ -62,7 +62,7 @@ export function getOutStockoutDetail(query) {
export function autoAllot(data) {
return request({
url: '/out/outStockout/autoAllot',
method: 'get',
method: 'post',
params: data
})
}

View File

@@ -73,14 +73,14 @@
/>
</el-form-item>
<!-- <el-form-item label="批次号" prop="lotNo">&lt;!&ndash;品名&ndash;&gt;-->
<!-- <el-input-->
<!-- v-model="queryParams.lotNo"-->
<!-- placeholder="请输入批次号"-->
<!-- clearable-->
<!-- @keyup.enter.native="handleQuery"-->
<!-- />-->
<!-- </el-form-item>-->
<el-form-item label="组件号" prop="cargoNo"><!--品名-->
<el-input
v-model="queryParams.cargoNo"
placeholder="请输入组件号"
clearable
@keyup.enter.native="handleQuery"
/>
</el-form-item>
<el-form-item :label="'单据时间'" prop="dateRange">
<el-date-picker
@@ -233,10 +233,11 @@
<el-table-column label="计划数量" align="left" prop="quantity"/><!--计划数量-->
<el-table-column label="扫码数量" align="left" prop="scanNum"/><!--扫码数量-->
<el-table-column label="实际数量" align="left" prop="assignNum"/><!--实际数量-->
<el-table-column label="货位号" align="left" prop="assignNum" /><!--实际数量-->
<el-table-column label="托盘号" align="left" prop="assignNum" /><!--实际数量-->
<el-table-column label="条码号" align="left" prop="assignNum" /><!--实际数量-->
<el-table-column label="采购订单" align="left" prop="assignNum" /><!--实际数量-->
<el-table-column label="货位号" align="left" prop="spare9"/><!--实际数量-->
<el-table-column label="托盘号" align="left" prop="spare8"/><!--实际数量-->
<el-table-column label="条码号" align="left" prop="barCode"/><!--实际数量-->
<el-table-column label="组件号" align="left" prop="cargoNo"/><!--组件号-->
<el-table-column label="项目号" align="left" prop="spare4"/><!--项目号-->
</el-table>
<pagination
@@ -341,7 +342,8 @@ export default {
spare2: null,
spare4: null,
spare3: null,
spare5: null
spare5: null,
cargoNo: null
},
queryDetailParams: {
pageNum: 1,

View File

@@ -25,9 +25,9 @@
@keyup.enter.native="handleQuery"
/>
</el-form-item>
<el-form-item :label="'erp单据号'" prop="erpStockOutId"> <!-- 出库单编号 -->
<el-form-item :label="'erp单据号'" prop="erpStockoutId"> <!-- 出库单编号 -->
<el-input
v-model="queryParams.erpStockOutId"
v-model="queryParams.erpStockoutId"
:placeholder="'请输入出库单编号'"
clearable
@keyup.enter.native="handleQuery"
@@ -43,6 +43,19 @@
/>
</el-select>
</el-form-item>
<el-form-item :label="'出库方向'" prop="spare8"> <!-- 出库方向 -->
<el-select v-model="queryParams.spare8" :placeholder="'请选择出库方向'" clearable>
<el-option
v-for="dict in dict.type.out_location"
:key="dict.value"
:label="dict.label"
:value="dict.value"
/>
</el-select>
</el-form-item>
<el-form-item :label="'单据状态'" prop="status"> <!-- 单据状态 -->
<el-select v-model="queryParams.status" :placeholder="'请选择单据状态'" clearable>
<el-option
@@ -153,7 +166,7 @@
<el-table v-loading="loading" :data="outStockoutList" @selection-change="handleSelectionChange" @row-click="handleRowClick" max-height="400">
<el-table-column type="selection" width="55" align="center" />
<el-table-column :label="'出库单编号'" align="left" prop="stockoutId" />
<el-table-column :label="'erp单据号'" align="left" prop="erpStockOutId" />
<el-table-column :label="'erp单据号'" align="left" prop="erpStockoutId" />
<el-table-column :label="'出库类型'" align="left" prop="outType">
<template slot-scope="scope">
<dict-tag :options="dict.type.out_bill_type" :value="scope.row.outType"/>
@@ -184,10 +197,16 @@
<!-- <el-table-column :label="'销售订单号'" align="left" prop="spare2" />-->
<el-table-column :label="'审核时间'" align="left" prop="spare3" />
<el-table-column :label="'审核人'" align="left" prop="spare4" />
<el-table-column :label="'出库方向'" align="left" prop="spare8" >
<template slot-scope="scope">
<dict-tag :options="dict.type.out_location" :value="scope.row.spare8"/>
</template>
</el-table-column>
<el-table-column :label="'创建时间'" align="left" prop="createDate" width="160" sortable/>
<el-table-column :label="'开始时间'" align="left" prop="startDate" width="160" sortable/>
<el-table-column :label="'确认时间'" align="left" prop="finishDate" width="160" sortable/>
<el-table-column :label="'备注'" align="left" prop="spare5" />
</el-table>
<pagination
@@ -356,7 +375,7 @@ import {listWarehouse} from "@/api/bas/warehouse";
export default {
name: "OutStockWithDetail",
dicts: ['out_bill_type', 'out_bill_status', 'out_method', 'bill_resource'],
dicts: ['out_bill_type', 'out_bill_status', 'out_method', 'bill_resource','out_location'],
data() {
return {
// 遮罩层
@@ -413,14 +432,15 @@ export default {
pageNum: 1,
pageSize: 10,
stockoutId: null,
erpStockOutId:null,
erpStockoutId:null,
outType: null,
customerNo: null,
customerName: null,
productName: null,
startDate: null,
finishDate: null,
status: null
status: null,
spare8:null
},
// 子表分页参数
detailQueryParams: {
@@ -605,8 +625,14 @@ export default {
this.$modal.msgError('请先审核出库单')
return
}
if (this.queryParams.spare8==''||this.queryParams.spare8==null){
this.$modal.msgError('请选择出库方向后,再次点击分配!')
return
}
let data = {
stockoutId: stockoutIds[0]
stockoutId: stockoutIds[0],
spare8:this.queryParams.spare8
}
autoAllot(data).then(response => {
if (response.code !== 200){

View File

@@ -63,6 +63,28 @@
/>
</el-form-item>
<el-form-item label="托盘类型" prop="ktpType"> <!-- 作业类型 -->
<el-select v-model="queryParams.ktpType" placeholder="请选择托盘类型" clearable>
<el-option
v-for="item in ktpType"
:key="item.value"
:label="item.label"
:value="item.value"
/>
</el-select>
</el-form-item>
<el-form-item label="物料类型" prop="model"> <!-- 作业类型 -->
<el-select v-model="queryParams.model" placeholder="请选择物料类型" clearable>
<el-option
v-for="item in productType"
:key="item.value"
:label="item.label"
:value="item.value"
/>
</el-select>
</el-form-item>
<el-form-item>
<el-button type="primary" icon="el-icon-search" size="mini" @click="handleQuery">搜索</el-button><!-- 搜索 -->
@@ -352,6 +374,7 @@ import { listManagement, getManagement, delManagement, addManagement, updateMana
import {listWarehouse} from "@/api/bas/warehouse"
import {listBasProduct} from "@/api/bas/BasProduct"
import {listCargoSpace} from "@/api/bas/cargoSpace"
export default {
name: "Management",
dicts: ['product_status', 'stock_status', 'cargo_space_status', 'cargo_space_lock_status'],
@@ -373,6 +396,8 @@ export default {
managementList: [],
// 仓库选项
warehouseOptions: [],
productType: [{label: '半托', value: '0'}, {label: '满托', value: '1'}],
ktpType: [{label: '空托盘', value: '1'}, {label: '物料', value: '2'}],
// 弹出层标题
title: "",
// 是否显示弹出层
@@ -405,7 +430,9 @@ export default {
spare3: null,
spare4: null,
spare5: null,
spare6: null
spare6: null,
ktpType: null,
model: null
},
queryWarehouse: {
pageNum: 1,
@@ -483,8 +510,6 @@ export default {
inDate: null,
backDate: null,
productGuid: null,
productId: null,
productName: null,
quantity: null,
jobId: null,
trayCode: null,
@@ -500,7 +525,9 @@ export default {
spare3: null,
spare4: null,
spare5: null,
spare6: null
spare6: null,
ktpType: null,
productType: null
}
this.resetForm("form")
},
@@ -566,7 +593,8 @@ export default {
}).then(() => {
this.getList()
this.$modal.msgSuccess("删除成功") // 删除成功
}).catch(() => {})
}).catch(() => {
})
},
/** 导出按钮操作 */
handleExport() {

View File

@@ -9,7 +9,7 @@ const CompressionPlugin = require('compression-webpack-plugin')
const name = process.env.VUE_APP_TITLE || '若依管理系统' // 网页标题
const baseUrl = 'http://127.0.0.1:8080' // 后端接口
const baseUrl = 'http://192.168.188.236:8080' // 后端接口
const port = process.env.port || process.env.npm_config_port || 80 // 端口