出库模块开发
This commit is contained in:
@@ -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));
|
||||
}
|
||||
}
|
||||
|
||||
@@ -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())
|
||||
|
||||
@@ -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())
|
||||
|
||||
@@ -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;
|
||||
}
|
||||
|
||||
@@ -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;
|
||||
}
|
||||
@@ -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);
|
||||
|
||||
}
|
||||
|
||||
@@ -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);
|
||||
}
|
||||
|
||||
@@ -91,9 +91,9 @@ public interface IRkInfoService
|
||||
List<RkInfo> selectTopOverdueStock(int i);
|
||||
|
||||
/**
|
||||
* 出库操作
|
||||
* 批量出库
|
||||
* @param dto
|
||||
* @return
|
||||
*/
|
||||
int updateOutStock(StockOutDTO dto);
|
||||
int batchOutStock(StockOutDTO dto);
|
||||
}
|
||||
|
||||
@@ -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();
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
@@ -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;
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user