出库模块开发

This commit is contained in:
2025-06-10 09:37:37 +08:00
parent 4d6d670bf4
commit 52ff615f29
18 changed files with 857 additions and 163 deletions

View File

@@ -131,8 +131,8 @@ public class RkInfoController extends BaseController
*/
@PreAuthorize("@ss.hasPermi('wisdom:outbound:add')")
@Log(title = "库存单据主", businessType = BusinessType.UPDATE)
@PostMapping("/updateOutStock")
public AjaxResult updateOutStock(@RequestBody StockOutDTO dto) {
return toAjax(rkInfoService.updateOutStock(dto));
@PutMapping("/outStock")
public AjaxResult doOutStock(@RequestBody StockOutDTO dto) {
return toAjax(rkInfoService.batchOutStock(dto));
}
}

View File

@@ -57,6 +57,36 @@ public class RkBill extends BaseEntity
// @Excel(name = "理货员")
private String lihuoY;
/** 出库类型 */
private String ckType;
/** 出库类型名称(展示用) */
@Excel(name = "出库类型名称")
private String ckTypeName;
/** 出库时间 */
@JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
@Excel(name = "出库时间", width = 30, dateFormat = "yyyy-MM-dd HH:mm:ss")
private Date ckTime;
/** 出库理货员 */
private String ckLihuoY;
/** 出库理货员名称(展示用) */
@Excel(name = "出库理货员名称")
private String ckLihuoYName;
/** 出库备注 */
@Excel(name = "出库备注")
private String ckRemark;
/** 施工队编码 */
private String teamCode;
/** 施工队名称(展示用) */
@Excel(name = "施工队名称")
private String teamName;
/** 单据号 */
@Excel(name = "单据号")
private String billNo;
@@ -125,6 +155,70 @@ public class RkBill extends BaseEntity
this.lihuoY = lihuoY;
}
public String getCkType() {
return ckType;
}
public void setCkType(String ckType) {
this.ckType = ckType;
}
public String getCkTypeName() {
return ckTypeName;
}
public void setCkTypeName(String ckTypeName) {
this.ckTypeName = ckTypeName;
}
public Date getCkTime() {
return ckTime;
}
public void setCkTime(Date ckTime) {
this.ckTime = ckTime;
}
public String getCkLihuoY() {
return ckLihuoY;
}
public void setCkLihuoY(String ckLihuoY) {
this.ckLihuoY = ckLihuoY;
}
public String getCkLihuoYName() {
return ckLihuoYName;
}
public void setCkLihuoYName(String ckLihuoYName) {
this.ckLihuoYName = ckLihuoYName;
}
public String getCkRemark() {
return ckRemark;
}
public void setCkRemark(String ckRemark) {
this.ckRemark = ckRemark;
}
public String getTeamCode() {
return teamCode;
}
public void setTeamCode(String teamCode) {
this.teamCode = teamCode;
}
public String getTeamName() {
return teamName;
}
public void setTeamName(String teamName) {
this.teamName = teamName;
}
public String getBillNo() {
return billNo;
}
@@ -158,6 +252,14 @@ public class RkBill extends BaseEntity
.append("cangku", getCangku())
.append("rkTime", getRkTime())
.append("lihuoY", getLihuoY())
.append("ckType", getCkType())
.append("ckTypeName", getCkTypeName())
.append("ckTime", getCkTime())
.append("ckLihuoY", getCkLihuoY())
.append("ckLihuoYName", getCkLihuoYName())
.append("ckRemark", getCkRemark())
.append("teamCode", getTeamCode())
.append("teamName", getTeamName())
.append("billNo", getBillNo())
.append("isChuku", getIsChuku())
.append("isDelete", getIsDelete())

View File

@@ -67,6 +67,10 @@ public class RkInfo extends BaseEntity
@Excel(name = "单据号")
private String billNo;
/** 出库单据号 */
@Excel(name = "出库单据号")
private String billNoCk;
/** 县局 */
@Excel(name = "县局")
private String xj;
@@ -279,6 +283,14 @@ public class RkInfo extends BaseEntity
return billNo;
}
public String getBillNoCk() {
return billNoCk;
}
public void setBillNoCk(String billNoCk) {
this.billNoCk = billNoCk;
}
public void setBillNo(String billNo) {
this.billNo = billNo;
}
@@ -548,6 +560,7 @@ public class RkInfo extends BaseEntity
.append("lihuoY", getLihuoY())
.append("isChuku", getIsChuku())
.append("billNo", getBillNo())
.append("billNoCk", getBillNoCk())
.append("remark", getRemark())
.append("xj", getXj())
.append("xmNo", getXmNo())

View File

@@ -1,82 +1,29 @@
package com.zg.project.wisdom.domain.dto;
import com.zg.project.wisdom.domain.dto.StockOutItemDTO;
import lombok.Data;
import java.util.Date;
import java.util.List;
import com.fasterxml.jackson.annotation.JsonFormat;
/**
* 出库请求 DTO:用于批量出库操作
* 对应操作 rk_info 表中多个记录出库
* 出库请求 DTO
*/
@Data
public class StockOutDTO {
/** 出库的 rk_info 主键 ID 集合 */
private List<Long> ids;
/** 领用时间 */
@JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
/** 领用时间(出库时间) */
private Date lyTime;
/** 出库类型编码 */
private String ckType;
/** 施工队编码 */
private String teamCode;
/** 出库理货员姓名 */
/** 出库类型 */
private String ckType;
/** 出库理货员 */
private String ckLihuoY;
// ==== Getter & Setter ====
public List<Long> getIds() {
return ids;
}
public void setIds(List<Long> ids) {
this.ids = ids;
}
public Date getLyTime() {
return lyTime;
}
public void setLyTime(Date lyTime) {
this.lyTime = lyTime;
}
public String getCkType() {
return ckType;
}
public void setCkType(String ckType) {
this.ckType = ckType;
}
public String getTeamCode() {
return teamCode;
}
public void setTeamCode(String teamCode) {
this.teamCode = teamCode;
}
public String getCkLihuoY() {
return ckLihuoY;
}
public void setCkLihuoY(String ckLihuoY) {
this.ckLihuoY = ckLihuoY;
}
@Override
public String toString() {
return "StockOutDTO{" +
"ids=" + ids +
", lyTime=" + lyTime +
", ckType='" + ckType + '\'' +
", teamCode='" + teamCode + '\'' +
", ckLihuoY='" + ckLihuoY + '\'' +
'}';
}
/** 出库列表 */
private List<StockOutItemDTO> ckList;
}

View File

@@ -0,0 +1,16 @@
package com.zg.project.wisdom.domain.dto;
import lombok.Data;
/**
* 出库明细 DTO
*/
@Data
public class StockOutItemDTO {
/** 出库记录 ID库存 ID */
private Long id;
/** 出库备注 */
private String ckRemark;
}

View File

@@ -1,8 +1,10 @@
package com.zg.project.wisdom.mapper;
import com.zg.project.wisdom.domain.RkBill;
import com.zg.project.wisdom.domain.dto.StockOutItemDTO;
import org.apache.ibatis.annotations.Param;
import java.util.ArrayList;
import java.util.List;
public interface RkBillMapper {
@@ -28,9 +30,5 @@ public interface RkBillMapper {
int logicDeleteRkBillByIds(@Param("ids") Long[] ids);
/**
* 批量更新出库状态
* @param ids
*/
void updateOutStock(List<Long> ids);
}

View File

@@ -101,9 +101,8 @@ public interface RkInfoMapper
List<RkInfo> selectTopOverdueStock(@Param("limit") int limit);
/**
* 批量更新出库信息
* @param list
* @return
* 出库操作
* @param update
*/
int batchUpdateOutStock(List<RkInfo> list);
void updateById(RkInfo update);
}

View File

@@ -91,9 +91,9 @@ public interface IRkInfoService
List<RkInfo> selectTopOverdueStock(int i);
/**
* 出库操作
* 批量出库
* @param dto
* @return
*/
int updateOutStock(StockOutDTO dto);
int batchOutStock(StockOutDTO dto);
}

View File

@@ -3,10 +3,9 @@ package com.zg.project.wisdom.service.impl;
import java.time.LocalDate;
import java.time.ZoneId;
import java.time.temporal.ChronoUnit;
import java.util.ArrayList;
import java.util.Date;
import java.util.List;
import java.util.*;
import com.baomidou.mybatisplus.core.toolkit.CollectionUtils;
import com.zg.common.exception.ServiceException;
import com.zg.common.utils.DateUtils;
import com.zg.common.utils.SecurityUtils;
@@ -131,22 +130,22 @@ public class RkInfoServiceImpl implements IRkInfoService
throw new ServiceException("rkList 入库明细列表不能为空");
}
// ✅ 生成统一单据号
String billNo = BillNoUtil.generateTodayBillNo();
// ✅ 插入单据主表
RkBill bill = new RkBill();
bill.setBillNo(billNo);
bill.setRkType(dto.getRkType());
bill.setWlType(dto.getWlType());
bill.setCangku(dto.getCangku());
bill.setRkTime(now);
bill.setLihuoY(dto.getLihuoY());
bill.setIsChuku("0");
bill.setIsDelete("0");
bill.setCreateBy(username);
bill.setCreateTime(now);
rkBillMapper.insertRkBill(bill);
// // ✅ 生成统一单据号
// String billNo = BillNoUtil.generateTodayBillNo("RK");
//
// // ✅ 插入单据主表
// RkBill bill = new RkBill();
// bill.setBillNo(billNo);
// bill.setRkType(dto.getRkType());
// bill.setWlType(dto.getWlType());
// bill.setCangku(dto.getCangku());
// bill.setRkTime(now);
// bill.setLihuoY(dto.getLihuoY());
// bill.setIsChuku("0");
// bill.setIsDelete("0");
// bill.setCreateBy(username);
// bill.setCreateTime(now);
// rkBillMapper.insertRkBill(bill);
// ✅ 构建明细列表
for (PcRkInfoItemDTO item : dto.getRkList()) {
@@ -157,7 +156,7 @@ public class RkInfoServiceImpl implements IRkInfoService
entity.setCangku(dto.getCangku());
entity.setLihuoY(dto.getLihuoY());
entity.setBillNo(billNo);
// entity.setBillNo(billNo);
entity.setXj(item.getXj());
entity.setXmNo(item.getXmNo());
@@ -220,7 +219,7 @@ public class RkInfoServiceImpl implements IRkInfoService
}
// ✅ 生成统一的单据号
String billNo = BillNoUtil.generateTodayBillNo();
String billNo = BillNoUtil.generateTodayBillNo("CK");
RkBill bill = new RkBill();
bill.setBillNo(billNo);
@@ -337,31 +336,53 @@ public class RkInfoServiceImpl implements IRkInfoService
}
@Override
public int updateOutStock(StockOutDTO dto) {
if (dto == null || dto.getIds() == null || dto.getIds().isEmpty()) {
throw new ServiceException("出库记录ID列表不能为空");
@Transactional(rollbackFor = Exception.class)
public int batchOutStock(StockOutDTO dto) {
if (dto.getCkList() == null || dto.getCkList().isEmpty()) {
throw new ServiceException("出库数据不能为空");
}
Date now = dto.getLyTime() != null ? dto.getLyTime() : DateUtils.getNowDate();
String username = SecurityUtils.getUsername();
Date now = DateUtils.getNowDate();
List<RkInfo> list = new ArrayList<>();
for (Long id : dto.getIds()) {
RkInfo entity = new RkInfo();
entity.setId(id);
entity.setIsChuku("1");
entity.setLyTime(now);
entity.setCkType(dto.getCkType());
entity.setTeamCode(dto.getTeamCode());
entity.setCkLihuoY(dto.getCkLihuoY());
entity.setUpdateBy(username);
entity.setUpdateTime(now);
list.add(entity);
// Step 1: 提前生成出库单据号(如 CK202406100001
String billNo = BillNoUtil.generateTodayBillNo("CK");
// Step 2: 构造出库主单 rk_bill
RkBill bill = new RkBill();
bill.setBillNo(billNo);
bill.setCkType(dto.getCkType());
bill.setCkTime(dto.getLyTime());
bill.setCkLihuoY(dto.getCkLihuoY());
bill.setTeamCode(dto.getTeamCode());
bill.setIsChuku("1");
bill.setIsDelete("0");
bill.setCreateBy(username);
bill.setCreateTime(now);
bill.setUpdateBy(username);
bill.setUpdateTime(now);
rkBillMapper.insertRkBill(bill);
// Step 3: 批量更新 rk_info出库状态 + 单号 + 单据ID
for (StockOutItemDTO item : dto.getCkList()) {
RkInfo update = new RkInfo();
update.setId(item.getId());
update.setBillNoCk(bill.getBillNo());
update.setBillNoCk(billNo);
update.setIsChuku("1");
update.setCkType(dto.getCkType());
update.setLyTime(dto.getLyTime());
update.setCkLihuoY(dto.getCkLihuoY());
update.setTeamCode(dto.getTeamCode());
update.setCkRemark(item.getCkRemark());
update.setUpdateBy(username);
update.setUpdateTime(now);
rkInfoMapper.updateById(update);
}
rkBillMapper.updateOutStock(dto.getIds());
return rkInfoMapper.batchUpdateOutStock(list);
return dto.getCkList().size();
}
}

View File

@@ -4,8 +4,15 @@ import java.text.SimpleDateFormat;
import java.util.Date;
public class BillNoUtil {
public static String generateTodayBillNo() {
String prefix = "RK";
/**
* 生成当天单据号:支持传入前缀(如 "RK" 或 "CK"
* 示例结果RK20240610153015999
*/
public static String generateTodayBillNo(String prefix) {
if (prefix == null || prefix.trim().isEmpty()) {
prefix = "RK"; // 默认用 RK
}
String time = new SimpleDateFormat("yyyyMMddHHmmssSSS").format(new Date());
return prefix + time;
}