change - 添加原材料出库记录明细页面关联销售订单

master
yinq 6 days ago
parent a43e03bd58
commit b8fb790ee3

@ -7,6 +7,7 @@ import javax.servlet.http.HttpServletResponse;
import com.hw.common.core.constant.WmsConstants;
import com.hw.wms.domain.WmsBaseWarehouse;
import com.hw.wms.domain.WmsStockTotal;
import com.hw.wms.domain.dto.OutstockRequestDTO;
import com.hw.wms.domain.vo.WmsRawOutstockAuditVo;
import com.hw.wms.service.IWmsBaseWarehouseService;
import com.hw.wms.service.IWmsStockTotalService;
@ -190,4 +191,16 @@ public class WmsRawOutstockController extends BaseController
public AjaxResult applyRawOutstock(@Validated @RequestBody WmsRawOutstock wmsRawOutstock) {
return toAjax(wmsRawOutstockService.applyRawOutstock(wmsRawOutstock));
}
/**
*
* @param outstockRequestDTO
* @return
*/
@RequiresPermissions("wms:rawOutstockDetail:relation")
@Log(title = "原材料出库记录", businessType = BusinessType.UPDATE)
@PostMapping("/relateSaleOrder")
public AjaxResult associatedSalesOrders(@RequestBody OutstockRequestDTO outstockRequestDTO) {
return toAjax(wmsRawOutstockService.associatedSalesOrders(outstockRequestDTO));
}
}

@ -0,0 +1,50 @@
package com.hw.wms.domain.dto;
import java.io.Serializable;
import java.math.BigDecimal;
import java.util.List;
/**
* DTO
*
* @author Yinq
* @date 2025-06-19
*/
public class OutstockRequestDTO implements Serializable {
private static final long serialVersionUID = 1L;
private Long rawOutstockDetailId;
private BigDecimal outstockAmount;
private List<SaleOrderDTO> saleOrders;
public BigDecimal getOutstockAmount() {
return outstockAmount;
}
public void setOutstockAmount(BigDecimal outstockAmount) {
this.outstockAmount = outstockAmount;
}
public Long getRawOutstockDetailId() {
return rawOutstockDetailId;
}
public void setRawOutstockDetailId(Long rawOutstockDetailId) {
this.rawOutstockDetailId = rawOutstockDetailId;
}
public List<SaleOrderDTO> getSaleOrders() {
return saleOrders;
}
public void setSaleOrders(List<SaleOrderDTO> saleOrders) {
this.saleOrders = saleOrders;
}
@Override
public String toString() {
return "OutstockRequestDTO{" +
"rawOutstockDetailId=" + rawOutstockDetailId +
", saleOrders=" + saleOrders +
'}';
}
}

@ -0,0 +1,72 @@
package com.hw.wms.domain.dto;
import java.io.Serializable;
import java.math.BigDecimal;
/**
*
*
* @author Yinq
* @date 2025-06-19
*/
public class SaleOrderDTO implements Serializable {
private static final long serialVersionUID = 1L;
private String saleorderCode;
private BigDecimal outstockAmount;
private Long saleOrderId;
private String materialCode;
private String materialName;
public String getSaleorderCode() {
return saleorderCode;
}
public void setSaleorderCode(String saleorderCode) {
this.saleorderCode = saleorderCode;
}
public BigDecimal getOutstockAmount() {
return outstockAmount;
}
public void setOutstockAmount(BigDecimal outstockAmount) {
this.outstockAmount = outstockAmount;
}
public Long getSaleOrderId() {
return saleOrderId;
}
public void setSaleOrderId(Long saleOrderId) {
this.saleOrderId = saleOrderId;
}
public String getMaterialCode() {
return materialCode;
}
public void setMaterialCode(String materialCode) {
this.materialCode = materialCode;
}
public String getMaterialName() {
return materialName;
}
public void setMaterialName(String materialName) {
this.materialName = materialName;
}
@Override
public String toString() {
return "SaleOrderDTO{" +
"saleorderCode='" + saleorderCode + '\'' +
", outstockAmount=" + outstockAmount +
", saleOrderId=" + saleOrderId +
", materialCode='" + materialCode + '\'' +
", materialName='" + materialName + '\'' +
'}';
}
}

@ -6,6 +6,7 @@ import java.util.List;
import com.alibaba.fastjson2.JSONObject;
import com.hw.wms.domain.WmsRawOutstock;
import com.hw.wms.domain.WmsRawOutstockDetail;
import com.hw.wms.domain.dto.OutstockRequestDTO;
import com.hw.wms.domain.vo.*;
import org.springframework.transaction.annotation.Transactional;
@ -169,5 +170,13 @@ public interface IWmsRawOutstockService
* @return
*/
public List<WmsRawOutstock> selectWmsRawOutstockJoinMaterialList(WmsRawOutstock wmsRawOutstock);
/**
*
* @param outstockRequestDTO
* @return
*/
public int associatedSalesOrders(OutstockRequestDTO outstockRequestDTO);
}

@ -18,6 +18,8 @@ import com.hw.mes.api.domain.vo.MesBaseMaterialInfoVo;
import com.hw.mes.api.domain.vo.MesPdaProductPlanVo;
import com.hw.wms.config.WmsConfig;
import com.hw.wms.domain.*;
import com.hw.wms.domain.dto.OutstockRequestDTO;
import com.hw.wms.domain.dto.SaleOrderDTO;
import com.hw.wms.domain.vo.*;
import com.hw.wms.mapper.*;
import com.hw.wms.service.IWmsRawOutstockService;
@ -1446,4 +1448,68 @@ public class WmsRawOutstockServiceImpl implements IWmsRawOutstockService {
public List<WmsRawOutstock> selectWmsRawOutstockJoinMaterialList(WmsRawOutstock wmsRawOutstock){
return wmsRawOutstockMapper.selectWmsRawOutstockJoinMaterialList(wmsRawOutstock);
}
/**
*
* @param outstockRequestDTO
* @return
*/
@Override
@Transactional(rollbackFor = Exception.class)
public int associatedSalesOrders(OutstockRequestDTO outstockRequestDTO) {
Long rawOutstockDetailId = outstockRequestDTO.getRawOutstockDetailId();
List<SaleOrderDTO> saleOrders = outstockRequestDTO.getSaleOrders();
Date currentDate = new Date();
String userName = SecurityUtils.getLoginUser() == null ? SecurityUtils.getUsername() : SecurityUtils.getLoginUser().getNickname();
if (saleOrders.isEmpty()) {
throw new ServiceException("请关联销售订单!");
}
WmsRawOutstockDetail wmsRawOutstockDetail = wmsRawOutstockDetailMapper.selectWmsRawOutstockDetailByRawOutstockDetailId(rawOutstockDetailId);
WmsRawOutstock wmsRawOutstock = wmsRawOutstockMapper.selectWmsRawOutstockByRawOutstockId(wmsRawOutstockDetail.getRawOutstockId());
String taskCode = wmsRawOutstock.getTaskCode();
BigDecimal sumAmount = saleOrders.stream().map(SaleOrderDTO::getOutstockAmount).reduce(BigDecimal.ZERO, BigDecimal::add);
if (outstockRequestDTO.getOutstockAmount().compareTo(sumAmount) > 0) {
BigDecimal amount = outstockRequestDTO.getOutstockAmount().subtract(sumAmount);
SaleOrderDTO orderDTO = new SaleOrderDTO();
orderDTO.setSaleOrderId(wmsRawOutstock.getSaleOrderId());
orderDTO.setOutstockAmount(amount);
saleOrders.add(0, orderDTO);
}
for (int i = 0; i < saleOrders.size(); i++) {
SaleOrderDTO saleOrderDTO = saleOrders.get(i);
Long saleOrderId = saleOrderDTO.getSaleOrderId();
BigDecimal outstockAmount = saleOrderDTO.getOutstockAmount();
wmsRawOutstock.setSaleOrderId(saleOrderId);
wmsRawOutstock.setOutstockAmount(outstockAmount);
wmsRawOutstock.setRealOutstockAmount(outstockAmount);
wmsRawOutstock.setUpdateBy(userName);
wmsRawOutstock.setUpdateDate(currentDate);
Long rawOutstockId = wmsRawOutstockDetail.getRawOutstockId();
if (i == 0){
wmsRawOutstockMapper.updateWmsRawOutstock(wmsRawOutstock);
} else {
wmsRawOutstock.setTaskCode(taskCode + "-" + i);
wmsRawOutstockMapper.insertWmsRawOutstock(wmsRawOutstock);
rawOutstockId = wmsRawOutstock.getRawOutstockId();
}
wmsRawOutstockDetail.setRawOutstockId(rawOutstockId);
wmsRawOutstockDetail.setPlanAmount(outstockAmount);
wmsRawOutstockDetail.setOutstockAmount(outstockAmount);
wmsRawOutstockDetail.setUpdateBy(userName);
wmsRawOutstockDetail.setUpdateDate(currentDate);
if (i == 0){
wmsRawOutstockDetailMapper.updateWmsRawOutstockDetail(wmsRawOutstockDetail);
} else {
wmsRawOutstockDetailMapper.insertWmsRawOutstockDetail(wmsRawOutstockDetail);
}
}
return 1;
}
}

@ -141,6 +141,7 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
<if test="updateBy != null">update_by,</if>
<if test="updateDate != null">update_date,</if>
<if test="stackAmount != null">stack_amount,</if>
<if test="tips != null">tips,</if>
</trim>
<trim prefix="values (" suffix=")" suffixOverrides=",">
<if test="rawOutstockId != null">#{rawOutstockId},</if>
@ -163,6 +164,7 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
<if test="updateBy != null">#{updateBy},</if>
<if test="updateDate != null">#{updateDate},</if>
<if test="stackAmount != null">#{stackAmount},</if>
<if test="tips != null">#{tips},</if>
</trim>
</insert>

@ -42,3 +42,12 @@ export function delRawOutstockDetail(rawOutstockDetailId) {
method: 'delete'
})
}
// 关联销售订单
export function relateSaleOrder(data) {
return request({
url: '/wms/rawoutstock/relateSaleOrder',
method: 'post',
data: data
})
}

@ -129,11 +129,13 @@
<el-table v-loading="loading" :data="rawOutstockDetailList" @selection-change="handleSelectionChange">
<el-table-column type="selection" width="55" align="center"/>
<el-table-column label="原材料出库记录明细ID" align="center" prop="rawOutstockDetailId" width="160" v-if="columns[0].visible"/>
<el-table-column label="原材料出库记录明细ID" align="center" prop="rawOutstockDetailId" width="160"
v-if="columns[0].visible"/>
<el-table-column label="原材料出库ID" align="center" prop="rawOutstockId" width="140" v-if="columns[1].visible"/>
<el-table-column label="任务编号" align="center" prop="taskCode" width="140" v-if="columns[25].visible"/>
<el-table-column label="计划编号" align="center" prop="planCode" width="140" v-if="columns[26].visible"/>
<el-table-column label="计划明细编号" align="center" prop="planDetailCode" width="140" v-if="columns[27].visible"/>
<el-table-column label="计划明细编号" align="center" prop="planDetailCode" width="140"
v-if="columns[27].visible"/>
<el-table-column label="销售订单编号" align="center" prop="saleorderCode" width="140" v-if="columns[28].visible"/>
<el-table-column label="仓库ID" align="center" prop="warehouseId" width="120" v-if="columns[3].visible"/>
<el-table-column label="库位编码" align="center" prop="locationCode" width="120" v-if="columns[4].visible"/>
@ -158,7 +160,7 @@
</template>
</el-table-column>
<el-table-column label="同步ERP状态" align="center" prop="erpStatus"
v-if="columns[12].visible" width="100" >
v-if="columns[12].visible" width="100">
<template slot-scope="scope">
<dict-tag :options="dict.type.wms_erp_status" :value="scope.row.erpStatus"/>
</template>
@ -198,23 +200,32 @@
</el-table-column>
<el-table-column label="每托数量" align="center" prop="stackAmount" width="100" v-if="columns[23].visible"/>
<el-table-column label="备注" align="center" prop="tips" width="120" v-if="columns[24].visible"/>
<el-table-column label="操作" align="center" class-name="small-padding fixed-width">
<el-table-column label="操作" align="center" class-name="small-padding fixed-width" width="100" fixed="right">
<template slot-scope="scope">
<!-- <el-button-->
<!-- size="mini"-->
<!-- type="text"-->
<!-- icon="el-icon-edit"-->
<!-- @click="handleUpdate(scope.row)"-->
<!-- v-hasPermi="['wms:rawOutstockDetail:edit']"-->
<!-- >修改-->
<!-- </el-button>-->
<!-- <el-button-->
<!-- size="mini"-->
<!-- type="text"-->
<!-- icon="el-icon-delete"-->
<!-- @click="handleDelete(scope.row)"-->
<!-- v-hasPermi="['wms:rawOutstockDetail:remove']"-->
<!-- >删除-->
<!-- </el-button>-->
<el-button
size="mini"
type="text"
icon="el-icon-edit"
@click="handleUpdate(scope.row)"
v-hasPermi="['wms:rawOutstockDetail:edit']"
>修改
</el-button>
<el-button
size="mini"
type="text"
icon="el-icon-delete"
@click="handleDelete(scope.row)"
v-hasPermi="['wms:rawOutstockDetail:remove']"
>删除
icon="el-icon-link"
v-if="scope.row.executeStatus == '2' && scope.row.erpStatus !== '1'"
@click="handleRelateSaleOrder(scope.row)"
>
关联销售订单
</el-button>
</template>
</el-table-column>
@ -349,6 +360,103 @@
</div>
</el-dialog>
<!-- 关联销售订单对话框 -->
<el-dialog
title="关联销售订单"
:visible.sync="relateSaleOrderDialogVisible"
width="900px"
append-to-body
>
<!-- 优化顶部明细信息卡片 -->
<el-card shadow="never" style="margin-bottom: 18px; background: #f8f8f8; border-radius: 6px;">
<el-row :gutter="16">
<el-col :span="8"><b>任务编号</b><span style="color:#333">{{ relateSaleOrderForm.taskCode || getCurrentDetail('taskCode') }}</span></el-col>
<el-col :span="8"><b>计划编号</b><span style="color:#333">{{ relateSaleOrderForm.planCode || getCurrentDetail('planCode') }}</span></el-col>
<el-col :span="8"><b>物料编号</b><span style="color:#333">{{ relateSaleOrderForm.materialCode || getCurrentDetail('materialCode') }}</span></el-col>
</el-row>
<el-row :gutter="16" style="margin-top: 8px;">
<el-col :span="8"><b>物料名称</b><span style="color:#333">{{ relateSaleOrderForm.materialName || getCurrentDetail('materialName') }}</span></el-col>
<el-col :span="8"><b>计划数量</b><span style="color:#333">{{ relateSaleOrderForm.planAmount || getCurrentDetail('planAmount') }}</span></el-col>
<el-col :span="8"><b>出库数量</b><span style="color:#333">{{ relateSaleOrderForm.outstockAmount || getCurrentDetail('outstockAmount') }}</span></el-col>
</el-row>
</el-card>
<!-- 优化每条销售订单卡片分隔 -->
<el-form :model="relateSaleOrderForm" label-width="0px" style="margin-bottom: 0;">
<div v-for="(item, index) in relateSaleOrderForm.saleOrders" :key="index" style="margin-bottom: 14px;">
<el-card shadow="never" style="background: #fcfcfc; border-radius: 6px; padding: 12px 12px 0 12px;">
<el-row :gutter="12" align="middle">
<el-col :span="7">
<el-form-item style="margin-bottom: 10px;">
<el-input
v-model="item.saleorderCode"
placeholder="请选择销售订单"
style="width: 100%; height: 36px;"
readonly
>
<el-button slot="append" icon="el-icon-search" @click="openSaleOrderSelect(index)"></el-button>
</el-input>
</el-form-item>
</el-col>
<el-col :span="5">
<el-form-item style="margin-bottom: 10px;">
<el-input
v-model="item.materialCode"
placeholder="物料编码"
style="width: 100%; height: 36px;"
readonly
/>
</el-form-item>
</el-col>
<el-col :span="5">
<el-form-item style="margin-bottom: 10px;">
<el-input
v-model="item.materialName"
placeholder="物料名称"
style="width: 100%; height: 36px;"
readonly
/>
</el-form-item>
</el-col>
<el-col :span="5">
<el-form-item style="margin-bottom: 10px;">
<el-input-number
v-model="item.outstockAmount"
:min="0.0001"
placeholder="出库数量"
style="width: 100%; height: 36px;"
/>
</el-form-item>
</el-col>
<el-col :span="2" style="text-align: right;">
<el-button
type="danger"
icon="el-icon-delete"
@click="removeSaleOrder(index)"
v-if="relateSaleOrderForm.saleOrders.length > 1"
style="margin-top: 2px;"
/>
</el-col>
</el-row>
</el-card>
</div>
<el-form-item style="margin-top: 0;">
<el-button type="primary" icon="el-icon-plus" @click="addSaleOrder"></el-button>
</el-form-item>
</el-form>
<div slot="footer" class="dialog-footer">
<el-button type="primary" @click="submitRelateSaleOrder"> </el-button>
<el-button @click="relateSaleOrderDialogVisible = false"> </el-button>
</div>
</el-dialog>
<!-- 选择销售订单弹窗 -->
<el-dialog title="选择销售订单" :visible.sync="saleOrderSelectDialogVisible" append-to-body>
<add-SaleOrder @selection="handleSaleOrderSelected" ref="saleOrderRef"></add-SaleOrder>
<div slot="footer" class="dialog-footer">
<el-button type="primary" @click="submitSaleOrderSelect"> </el-button>
<el-button @click="saleOrderSelectDialogVisible = false"> </el-button>
</div>
</el-dialog>
</div>
</template>
@ -359,12 +467,17 @@ import {
getRawOutstockDetail,
delRawOutstockDetail,
addRawOutstockDetail,
updateRawOutstockDetail
updateRawOutstockDetail,
relateSaleOrder
} from "@/api/wms/rawOutstockDetail";
import addSaleOrder from '@/views/mes/productOrder/addSaleOrder.vue';
export default {
name: "RawOutstockDetail",
dicts: ['wms_product_outstock_manualflag', 'qms_check_status', 'wms_erp_status', 'wms_execute_status', 'wms_audit_status', 'wms_raw_outstock_task_type'],
components: {
'add-SaleOrder': addSaleOrder,
},
data() {
return {
//
@ -455,6 +568,15 @@ export default {
{key: 29, label: `物料编号`, visible: true},
{key: 30, label: `物料名称`, visible: true},
],
relateSaleOrderDialogVisible: false,
relateSaleOrderForm: {
rawOutstockDetailId: null,
saleOrders: [
// { saleorderCode: '', outstockAmount: 0 }
]
},
saleOrderSelectDialogVisible: false,
saleOrderSelectIndex: 0, // saleOrders
};
},
created() {
@ -544,7 +666,77 @@ export default {
this.download('wms/rawOutstockDetail/export', {
...this.queryParams
}, `rawOutstockDetail_${new Date().getTime()}.xlsx`)
}
},
handleRelateSaleOrder(row) {
this.relateSaleOrderForm = {
rawOutstockDetailId: row.rawOutstockDetailId,
outstockAmount: row.outstockAmount,
saleOrders: [
{saleorderCode: '', outstockAmount: row.outstockAmount}
]
};
this.relateSaleOrderDialogVisible = true;
},
addSaleOrder() {
//
const newIndex = this.relateSaleOrderForm.saleOrders.length;
this.relateSaleOrderForm.saleOrders.push({saleorderCode: '', outstockAmount: 1});
this.saleOrderSelectIndex = newIndex;
this.saleOrderSelectDialogVisible = true;
},
removeSaleOrder(index) {
this.relateSaleOrderForm.saleOrders.splice(index, 1);
},
submitRelateSaleOrder() {
//
const total = this.relateSaleOrderForm.saleOrders.reduce((sum, item) => sum + Number(item.outstockAmount), 0);
// 0
const hasInvalidAmount = this.relateSaleOrderForm.saleOrders.some(item => item.outstockAmount == null);
if (hasInvalidAmount) {
this.$message.error('出库数量不能为空!');
return;
}
// saleOrdersoutstockAmount
const originAmount = this.rawOutstockDetailList.find(
item => item.rawOutstockDetailId === this.relateSaleOrderForm.rawOutstockDetailId
)?.outstockAmount || 0;
if (total > originAmount) {
this.$message.error('出库数量总和不能大于原出库数量');
return;
}
//
relateSaleOrder(this.relateSaleOrderForm).then(res => {
this.$message.success('关联成功');
this.relateSaleOrderDialogVisible = false;
this.getList();
});
},
openSaleOrderSelect(index) {
this.saleOrderSelectIndex = index;
this.saleOrderSelectDialogVisible = true;
},
submitSaleOrderSelect() {
let selectedRow = this.$refs.saleOrderRef.selectedRow;
if (!selectedRow) {
this.$message.error('请选择销售订单');
return;
}
// saleOrders
this.$set(this.relateSaleOrderForm.saleOrders, this.saleOrderSelectIndex, {
...this.relateSaleOrderForm.saleOrders[this.saleOrderSelectIndex],
saleOrderId: selectedRow.saleOrderId,
saleorderCode: selectedRow.saleorderCode,
materialCode: selectedRow.materialCode,
materialName: selectedRow.materialName,
});
this.saleOrderSelectDialogVisible = false;
},
getCurrentDetail(field) {
// rawOutstockDetailId
const detail = this.rawOutstockDetailList.find(item => item.rawOutstockDetailId === this.relateSaleOrderForm.rawOutstockDetailId) || {};
return detail[field] || '';
},
}
}
;

Loading…
Cancel
Save